diff --git a/src/main_perkons.cc b/src/main_perkons.cc index 27ad23a..decbf06 100644 --- a/src/main_perkons.cc +++ b/src/main_perkons.cc @@ -293,7 +293,7 @@ namespace Heck { switch (msg.type) { case ld::MidiMessageType::NoteOn: { if (msg.channel >= 0 && msg.channel < Constants::TRACK_COUNT) { - tracks[msg.channel].instrument->trigger(); + tracks[msg.channel].trigger(); } } break; case ld::MidiMessageType::ControlChange: { @@ -312,7 +312,7 @@ namespace Heck { tracks[cc.channel].instrument->ctl(2, val_normalized); break; case Constants::MIDI_Mapping::TRACK_PARAM2: - tracks[cc.channel].instrument->ctl(3, val_normalized); + tracks[cc.channel].decay(val_normalized); break; case Constants::MIDI_Mapping::TRACK_FILTER: tracks[cc.channel].filter(val_normalized); diff --git a/src/track.hh b/src/track.hh index 50b090e..720001d 100644 --- a/src/track.hh +++ b/src/track.hh @@ -11,26 +11,52 @@ namespace Heck { public: void init(Instrument::AbstractInstrument& instr) { + // Instr instrument.reset(&instr); + + // Env + decay_.Init(Constants::SAMPLERATE); + decay_.SetTime(dsp::ADENV_SEG_ATTACK, .0001); + decay_.SetTime(dsp::ADENV_SEG_DECAY, 0.1); + decay_.SetMax(1); + decay_.SetMin(0); + decay_.SetCurve(-18); + + // Vol ctl_volume_ = 0.; + // Filter ladder_.Init(Constants::SAMPLERATE); ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::LP24); ladder_.SetRes(0.7); ladder_.SetInputDrive(1.3); + // Drive od_.Init(); } float nextsample() { float sig = instrument->nextsample(); + float vol_env_sig = decay_.Process(); + sig *= vol_env_sig; sig = ladder_.Process(sig); sig = od_.Process(sig); sig = vca_(sig, ctl_volume_); return sig; } + void trigger() + { + decay_.Trigger(); + instrument->trigger(); + } + + void decay(float val) + { + decay_.SetTime(dsp::ADENV_SEG_DECAY, 0.01 + val * 8.); + } + void volume(float vol) { ctl_volume_ = vol; @@ -69,6 +95,7 @@ namespace Heck { std::shared_ptr instrument{}; private: + dsp::AdEnv decay_{}; dsp::LinearVCA vca_{}; dsp::LadderFilter ladder_{}; dsp::Overdrive od_{};