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.
78 lines
2.1 KiB
78 lines
2.1 KiB
4 years ago
|
#pragma once
|
||
|
#ifndef DSY_ADSR_H
|
||
|
#define DSY_ADSR_H
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#ifdef __cplusplus
|
||
|
|
||
|
namespace daisysp
|
||
|
{
|
||
|
/** Distinct stages that the phase of the envelope can be located in.
|
||
|
- IDLE = located at phase location 0, and not currently running
|
||
|
- ATTACK = First segment of envelope where phase moves from 0 to 1
|
||
|
- DECAY = Second segment of envelope where phase moves from 1 to SUSTAIN value
|
||
|
- SUSTAIN = Third segment of envelope, stays at SUSTAIN level until GATE is released
|
||
|
- RELEASE = Fourth segment of envelop where phase moves from SUSTAIN to 0
|
||
|
- LAST = Last segment, aka release
|
||
|
*/
|
||
|
enum
|
||
|
{
|
||
|
ADSR_SEG_IDLE,
|
||
|
ADSR_SEG_ATTACK,
|
||
|
ADSR_SEG_DECAY,
|
||
|
ADSR_SEG_SUSTAIN,
|
||
|
ADSR_SEG_RELEASE,
|
||
|
ADSR_SEG_LAST,
|
||
|
};
|
||
|
|
||
|
|
||
|
/** adsr envelope module
|
||
|
|
||
|
Original author(s) : Paul Batchelor
|
||
|
|
||
|
Ported from Soundpipe by Ben Sergentanis, May 2020
|
||
|
*/
|
||
|
class Adsr
|
||
|
{
|
||
|
public:
|
||
|
Adsr() {}
|
||
|
~Adsr() {}
|
||
|
/** Initializes the Adsr module.
|
||
|
\param sample_rate - The sample rate of the audio engine being run.
|
||
|
*/
|
||
|
void Init(float sample_rate);
|
||
|
|
||
|
|
||
|
/** Processes one sample through the filter and returns one sample.
|
||
|
\param gate - trigger the envelope, hold it to sustain
|
||
|
*/
|
||
|
float Process(bool gate);
|
||
|
|
||
|
/** Sets time
|
||
|
Set time per segment in seconds
|
||
|
*/
|
||
|
inline void SetTime(int seg, float time) { seg_time_[seg] = time; }
|
||
|
/** Sustain level
|
||
|
\param sus_level - sets sustain level
|
||
|
*/
|
||
|
inline void SetSustainLevel(float sus_level) { sus_ = sus_level; }
|
||
|
/** get the current envelope segment
|
||
|
\return the segment of the envelope that the phase is currently located in.
|
||
|
*/
|
||
|
inline uint8_t GetCurrentSegment() { return mode_; }
|
||
|
/** Tells whether envelope is active
|
||
|
\return true if the envelope is currently in any stage apart from idle.
|
||
|
*/
|
||
|
inline bool IsRunning() const { return mode_ != ADSR_SEG_IDLE; }
|
||
|
|
||
|
private:
|
||
|
float sus_, seg_time_[ADSR_SEG_LAST], a_, b_, y_, x_, prev_, atk_time_;
|
||
|
int sample_rate_;
|
||
|
uint8_t mode_;
|
||
|
float Tau2Pole(float tau);
|
||
|
float AdsrFilter();
|
||
|
};
|
||
|
} // namespace daisysp
|
||
|
#endif
|
||
|
#endif
|