add glide

This commit is contained in:
2024-10-01 19:16:40 +02:00
parent 023b8192a5
commit 2476bab44f

View File

@@ -21,6 +21,7 @@ public:
, feedback_amt {0.f} , feedback_amt {0.f}
, bit_resolution(12.f) , bit_resolution(12.f)
{ {
set_glide_time(0.f);
} }
bool gate = false; bool gate = false;
@@ -41,6 +42,8 @@ public:
tx_operator op2; tx_operator op2;
tx_operator op3; tx_operator op3;
void set_glide_time(float time_ms) { glide = 1 - exp(-1.0 / (time_ms * samplerate / 1000.f)); }
void note_on(int _note, float _velocity) override void note_on(int _note, float _velocity) override
{ {
this->gate = true; this->gate = true;
@@ -56,12 +59,15 @@ public:
void process_samples(t_sample** _outputs, int _start_index, int _block_size) override void process_samples(t_sample** _outputs, int _start_index, int _block_size) override
{ {
float frequency = midi_to_frequency(midi_note + pitch_mod + additional_pitch_mod); target_frequency = midi_to_frequency(midi_note + pitch_mod + additional_pitch_mod);
for (int s = _start_index; s < _start_index + _block_size; s++) { for (int s = _start_index; s < _start_index + _block_size; s++) {
// calculate moving average for portamento
current_frequency = (1 - glide) * current_frequency + glide * target_frequency;
float pitch_env_signal = pitch_env.process_sample(gate, trigger) * pitch_env_amt; float pitch_env_signal = pitch_env.process_sample(gate, trigger) * pitch_env_amt;
float pitched_freq = frequency + pitch_env_signal; float pitched_freq = current_frequency + pitch_env_signal;
float signal = process_operators(pitched_freq); float signal = process_operators(pitched_freq);
@@ -80,13 +86,14 @@ public:
return gate || op1.envelope.is_busy() || op2.envelope.is_busy() || op3.envelope.is_busy(); return gate || op1.envelope.is_busy() || op2.envelope.is_busy() || op3.envelope.is_busy();
} }
void set_samplerate(double samplerate) override void set_samplerate(double _samplerate) override
{ {
pitch_env.set_samplerate(samplerate); samplerate = _samplerate;
feedback_osc.set_samplerate(samplerate); pitch_env.set_samplerate(_samplerate);
op1.set_samplerate(samplerate); feedback_osc.set_samplerate(_samplerate);
op2.set_samplerate(samplerate); op1.set_samplerate(_samplerate);
op3.set_samplerate(samplerate); op2.set_samplerate(_samplerate);
op3.set_samplerate(_samplerate);
} }
void set_phase_reset(bool phase_reset) void set_phase_reset(bool phase_reset)
@@ -98,9 +105,14 @@ public:
} }
private: private:
double samplerate;
const float MOD_INDEX_COEFF = 4.f; const float MOD_INDEX_COEFF = 4.f;
float pitch_mod = 0.f; // modulates pitch in semi-tones float pitch_mod = 0.f; // modulates pitch in semi-tones
float current_frequency;
float target_frequency;
float glide;
float process_op3(const float frequency) float process_op3(const float frequency)
{ {
float fb_freq = frequency * op3.ratio; float fb_freq = frequency * op3.ratio;