You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.3 KiB
61 lines
1.3 KiB
#pragma once
|
|
#ifndef DSY_SAMPLEHOLD_H
|
|
#define DSY_SAMPLEHOLD_H
|
|
|
|
#include <stdint.h>
|
|
#ifdef __cplusplus
|
|
|
|
namespace daisysp
|
|
{
|
|
/** Dual track and hold / Sample and hold module. \n
|
|
Ported from soundpipe by Ben Sergentanis, June 2020.
|
|
@author Paul Batchelor
|
|
@date 2015
|
|
*/
|
|
class SampleHold
|
|
{
|
|
public:
|
|
SampleHold() {}
|
|
~SampleHold() {}
|
|
|
|
enum Mode
|
|
{
|
|
MODE_SAMPLE_HOLD,
|
|
MODE_TRACK_HOLD,
|
|
MODE_LAST,
|
|
};
|
|
|
|
/** Process the next sample. Both sample and track and hold are run in parallel
|
|
\param trigger Trigger the sample/track and hold
|
|
\param input Signal to be sampled/tracked and held
|
|
\param mode Whether to output the tracked or sampled values.
|
|
*/
|
|
inline float
|
|
Process(bool trigger, float input, Mode mode = MODE_SAMPLE_HOLD)
|
|
{
|
|
Update(trigger, input);
|
|
return mode == MODE_SAMPLE_HOLD ? sample_ : track_;
|
|
}
|
|
|
|
private:
|
|
float track_ = 0;
|
|
float sample_ = 0;
|
|
bool previous_ = false;
|
|
|
|
|
|
inline void Update(bool trigger, float input)
|
|
{
|
|
if(trigger)
|
|
{
|
|
if(!previous_)
|
|
{
|
|
sample_ = input;
|
|
}
|
|
track_ = input;
|
|
}
|
|
previous_ = trigger;
|
|
}
|
|
};
|
|
} // namespace daisysp
|
|
#endif
|
|
#endif
|
|
|