Krotos Modules 3
Loading...
Searching...
No Matches
KwidgetProcessor_Adsr.cpp
Go to the documentation of this file.
1namespace krotos
2{
4 {
5 using P = Parameters;
6
7 addParameterAttachments({{P::Attack, [this](float x) { setAttack(x); }, 0},
8 {P::Decay, [this](float x) { setDecay(x); }, 0},
9 {P::Sustain, [this](float x) { setSustain(x); }, 2},
10 {P::Release, [this](float x) { setRelease(x); }, 0}});
11
12 addModulator(true);
13 }
14
15 void KwidgetProcessor_Adsr::prepare(double sampleRate, int samplesPerBlock)
16 {
17 m_adsr.setSampleRate(sampleRate);
19
20 m_buffer.setSize(1, samplesPerBlock);
21 getModulator(0)->setValues(m_buffer.getReadPointer(0), samplesPerBlock);
22 }
23
24 //==============================================================================
29 void KwidgetProcessor_Adsr::process(AudioBuffer<float>& buffer)
30 {
31 auto numSamples = buffer.getNumSamples();
32 auto numChannels = buffer.getNumChannels();
33 auto bufferPtr = buffer.getArrayOfWritePointers();
34
35 auto modulatorBufferPtr = m_buffer.getWritePointer(0);
36
37 nextBlock(numSamples);
38
39 for (int sampleIndex = 0; sampleIndex < numSamples; sampleIndex++)
40 {
41 nextSample();
42
43 auto amp = m_adsr.getNextSample();
44
45 // Output the modulation signal
46 modulatorBufferPtr[sampleIndex] = amp;
47
48 // Modulate the audio data using the
49 for (int channelIndex = 0; channelIndex < numChannels; channelIndex++)
50 bufferPtr[channelIndex][sampleIndex] *= amp;
51 }
52
53 if (!m_adsr.isActive() && !m_hasBeenReset) // If the ADSR has finished
54 {
55 reset();
56 m_hasBeenReset = true;
57 }
58 }
59
60 void KwidgetProcessor_Adsr::noteOn(int midiNoteNumber, float /*velocity*/, int)
61 {
62 m_isDrone = (midiNoteNumber & MIDI_NOTE_FLAG_DRONE) != 0; // Keep a record of the type of event
63
64 if (!m_adsr.isActive()) // If we are not already active
65 {
66 if (m_isDrone && ((midiNoteNumber & MIDI_NOTE_FLAG_DRONE_NOTEUP) != 0))
67 {
68 // Its a drone note-up event
69 m_noteIsOn = false;
70 m_adsr.noteOff();
71 }
72 else
73 {
74 // Its a note on event
75 m_noteIsOn = true;
76 m_adsr.noteOn();
77 m_hasBeenReset = false;
78 }
79 }
80 }
81
83 {
84 // If we were started as a drone, stop note can never switch us off, only startNote with stop flag
85 if (!m_isDrone &&
86 m_noteIsOn) // Checking m_noteIsOn prevents re-triggering of any already in-progress release - fix KST-1218
87 {
88 m_noteIsOn = false;
89 m_adsr.noteOff();
90 }
91 }
92
93 bool KwidgetProcessor_Adsr::isActive() { return m_adsr.isActive(); }
94
96
98 {
99 m_noteIsOn = false;
100 m_adsr.reset();
101 }
102
104 {
105 m_parameters.attack = attack;
106 updateParams();
107 }
109 {
110 m_parameters.decay = decay;
111 updateParams();
112 }
114 {
115 m_parameters.sustain = sustain;
116 updateParams();
117 }
119 {
120 m_parameters.release = release;
121 updateParams();
122 }
123
125
126} // namespace krotos
Definition Kwidget.h:8
Kwidget_Adsr::Parameters Parameters
Definition KwidgetProcessor_Adsr.h:6
bool m_hasBeenReset
Definition KwidgetProcessor_Adsr.h:25
KwidgetProcessor_Adsr(Kwidget &owner)
Definition KwidgetProcessor_Adsr.cpp:3
void setSustain(float sustain)
Definition KwidgetProcessor_Adsr.cpp:113
bool isActive() override
Definition KwidgetProcessor_Adsr.cpp:93
juce::ADSR::Parameters m_parameters
Definition KwidgetProcessor_Adsr.h:33
void reset() override
Definition KwidgetProcessor_Adsr.cpp:97
void noteOff(float velocity) override
Definition KwidgetProcessor_Adsr.cpp:82
void setAttack(float attack)
Definition KwidgetProcessor_Adsr.cpp:103
void process(AudioBuffer< float > &buffer) override
Definition KwidgetProcessor_Adsr.cpp:29
void updateParams()
Definition KwidgetProcessor_Adsr.cpp:124
void noteCleared() override
Definition KwidgetProcessor_Adsr.cpp:95
bool m_noteIsOn
Definition KwidgetProcessor_Adsr.h:26
void prepare(double sampleRate, int samplesPerBlock) override
Definition KwidgetProcessor_Adsr.cpp:15
void noteOn(int midiNoteNumber, float velocity, int) override
Definition KwidgetProcessor_Adsr.cpp:60
juce::ADSR m_adsr
Definition KwidgetProcessor_Adsr.h:32
void setRelease(float release)
Definition KwidgetProcessor_Adsr.cpp:118
bool m_isDrone
Definition KwidgetProcessor_Adsr.h:36
void setDecay(float decay)
Definition KwidgetProcessor_Adsr.cpp:108
AudioBuffer< float > m_buffer
Definition KwidgetProcessor_Adsr.h:35
An interface for an audio processor designed for modular use.
Definition KwidgetProcessor.h:8
Modulator * getModulator(int index)
Definition KwidgetProcessor.cpp:34
void nextBlock(int numSamples)
Definition KwidgetProcessor.cpp:50
void addParameterAttachments(std::vector< AttachmentInfo >)
Definition KwidgetProcessor.cpp:65
void nextSample()
Definition KwidgetProcessor.cpp:59
void addModulator(bool useAudioRate)
Definition KwidgetProcessor.h:139
void setValues(const float *values, int numValues)
Definition ModulationSource.h:34
Definition AirAbsorptionFilter.cpp:2
static const int MIDI_NOTE_FLAG_DRONE_NOTEUP
Definition OscillatorUtils.h:23
static const int MIDI_NOTE_FLAG_DRONE
Definition OscillatorUtils.h:22