From 2476bab44fd0778687cc849647ae7af924dc8027 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 1 Oct 2024 19:16:40 +0200 Subject: [PATCH] add glide --- synth/tx_voice.h | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/synth/tx_voice.h b/synth/tx_voice.h index 58b057d..f05a54a 100644 --- a/synth/tx_voice.h +++ b/synth/tx_voice.h @@ -21,6 +21,7 @@ public: , feedback_amt {0.f} , bit_resolution(12.f) { + set_glide_time(0.f); } bool gate = false; @@ -41,6 +42,8 @@ public: tx_operator op2; 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 { this->gate = true; @@ -56,12 +59,15 @@ public: 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++) { + // 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 pitched_freq = frequency + pitch_env_signal; + float pitched_freq = current_frequency + pitch_env_signal; 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(); } - void set_samplerate(double samplerate) override + void set_samplerate(double _samplerate) override { - pitch_env.set_samplerate(samplerate); - feedback_osc.set_samplerate(samplerate); - op1.set_samplerate(samplerate); - op2.set_samplerate(samplerate); - op3.set_samplerate(samplerate); + samplerate = _samplerate; + pitch_env.set_samplerate(_samplerate); + feedback_osc.set_samplerate(_samplerate); + op1.set_samplerate(_samplerate); + op2.set_samplerate(_samplerate); + op3.set_samplerate(_samplerate); } void set_phase_reset(bool phase_reset) @@ -98,9 +105,14 @@ public: } private: + double samplerate; const float MOD_INDEX_COEFF = 4.f; 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 fb_freq = frequency * op3.ratio;