You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.9 KiB
113 lines
2.9 KiB
#ifndef HECK_PERKONS_TRACK_HH
|
|
#define HECK_PERKONS_TRACK_HH
|
|
|
|
#include "daisysp.h"
|
|
#include "instr_abstract.hh"
|
|
#include "utils.hh"
|
|
#include "globals.hh"
|
|
namespace dsp = daisysp;
|
|
|
|
namespace Heck {
|
|
struct Track {
|
|
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(-50);
|
|
|
|
// Vol
|
|
ctl_volume_ = 0.;
|
|
|
|
// Filter
|
|
ladder_.Init(Constants::SAMPLERATE);
|
|
ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::LP24);
|
|
ladder_.SetRes(0.4);
|
|
ladder_.SetInputDrive(1.3);
|
|
|
|
// Drive
|
|
od_.Init();
|
|
od_.SetDrive(0.425);
|
|
}
|
|
|
|
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 * 12.);
|
|
}
|
|
|
|
void volume(float vol)
|
|
{
|
|
ctl_volume_ = vol;
|
|
}
|
|
|
|
void filter(float val)
|
|
{
|
|
float ladder_freq = 80 + (val * 9000);
|
|
ladder_.SetFreq(val * ladder_freq);
|
|
}
|
|
|
|
void drive(float amt)
|
|
{
|
|
od_.SetDrive(scalen_min_max(amt, 0.35, 0.5));
|
|
}
|
|
|
|
// range: 0-1
|
|
void filtermode(float val)
|
|
{
|
|
ctl_filtermode_ = val;
|
|
|
|
// MID
|
|
if (ctl_filtermode_ < 0.33) {
|
|
hw.PrintLine("Track: Filter BP");
|
|
ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::BP24);
|
|
}
|
|
// HIGH
|
|
if (ctl_filtermode_ >= 0.33 && ctl_filtermode_ < 0.66) {
|
|
hw.PrintLine("Track: Filter HP");
|
|
ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::HP24);
|
|
}
|
|
// LOW
|
|
if (ctl_filtermode_ >= 0.66) {
|
|
hw.PrintLine("Track: Filter LP");
|
|
ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::LP24);
|
|
}
|
|
}
|
|
|
|
std::shared_ptr<Instrument::AbstractInstrument> instrument{};
|
|
|
|
private:
|
|
dsp::AdEnv decay_{};
|
|
dsp::LinearVCA vca_{};
|
|
dsp::LadderFilter ladder_{};
|
|
dsp::Overdrive od_{};
|
|
|
|
float ctl_volume_{};
|
|
float ctl_filtermode_{};
|
|
};
|
|
|
|
} // namespace Heck
|
|
#endif
|