Browse Source

Trigger the track env (which trigger the instrument)

pros:
* same env on each track
* instrument can be drone, but can also react to trig

cons:
* instrument can only shorten the decay, its limited by the track env
main
heck 7 months ago
parent
commit
97654d7898
  1. 4
      src/main_perkons.cc
  2. 27
      src/track.hh

4
src/main_perkons.cc

@ -293,7 +293,7 @@ namespace Heck {
switch (msg.type) { switch (msg.type) {
case ld::MidiMessageType::NoteOn: { case ld::MidiMessageType::NoteOn: {
if (msg.channel >= 0 && msg.channel < Constants::TRACK_COUNT) { if (msg.channel >= 0 && msg.channel < Constants::TRACK_COUNT) {
tracks[msg.channel].instrument->trigger(); tracks[msg.channel].trigger();
} }
} break; } break;
case ld::MidiMessageType::ControlChange: { case ld::MidiMessageType::ControlChange: {
@ -312,7 +312,7 @@ namespace Heck {
tracks[cc.channel].instrument->ctl(2, val_normalized); tracks[cc.channel].instrument->ctl(2, val_normalized);
break; break;
case Constants::MIDI_Mapping::TRACK_PARAM2: case Constants::MIDI_Mapping::TRACK_PARAM2:
tracks[cc.channel].instrument->ctl(3, val_normalized); tracks[cc.channel].decay(val_normalized);
break; break;
case Constants::MIDI_Mapping::TRACK_FILTER: case Constants::MIDI_Mapping::TRACK_FILTER:
tracks[cc.channel].filter(val_normalized); tracks[cc.channel].filter(val_normalized);

27
src/track.hh

@ -11,26 +11,52 @@ namespace Heck {
public: public:
void init(Instrument::AbstractInstrument& instr) void init(Instrument::AbstractInstrument& instr)
{ {
// Instr
instrument.reset(&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.; ctl_volume_ = 0.;
// Filter
ladder_.Init(Constants::SAMPLERATE); ladder_.Init(Constants::SAMPLERATE);
ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::LP24); ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::LP24);
ladder_.SetRes(0.7); ladder_.SetRes(0.7);
ladder_.SetInputDrive(1.3); ladder_.SetInputDrive(1.3);
// Drive
od_.Init(); od_.Init();
} }
float nextsample() float nextsample()
{ {
float sig = instrument->nextsample(); float sig = instrument->nextsample();
float vol_env_sig = decay_.Process();
sig *= vol_env_sig;
sig = ladder_.Process(sig); sig = ladder_.Process(sig);
sig = od_.Process(sig); sig = od_.Process(sig);
sig = vca_(sig, ctl_volume_); sig = vca_(sig, ctl_volume_);
return sig; 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) void volume(float vol)
{ {
ctl_volume_ = vol; ctl_volume_ = vol;
@ -69,6 +95,7 @@ namespace Heck {
std::shared_ptr<Instrument::AbstractInstrument> instrument{}; std::shared_ptr<Instrument::AbstractInstrument> instrument{};
private: private:
dsp::AdEnv decay_{};
dsp::LinearVCA vca_{}; dsp::LinearVCA vca_{};
dsp::LadderFilter ladder_{}; dsp::LadderFilter ladder_{};
dsp::Overdrive od_{}; dsp::Overdrive od_{};

Loading…
Cancel
Save