From 4c8affcdb574334502a6f9691c7918a8ba3b540f Mon Sep 17 00:00:00 2001 From: heck Date: Fri, 13 Sep 2024 20:00:59 +0200 Subject: [PATCH] add instrument 'grainlet' --- src/instr_grainlet.cc | 67 +++++++++++++++++++++++++++++++++++++++++++ src/instr_grainlet.hh | 32 +++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/instr_grainlet.cc create mode 100644 src/instr_grainlet.hh diff --git a/src/instr_grainlet.cc b/src/instr_grainlet.cc new file mode 100644 index 0000000..22d4390 --- /dev/null +++ b/src/instr_grainlet.cc @@ -0,0 +1,67 @@ +#include "instr_Grainlet.hh" +#include "daisysp.h" +#include "utils.hh" + +namespace Heck { + namespace Instrument { + + Grainlet::Grainlet() + { + init(); + grainlet.Init(samplerate); + } + + void Grainlet::init() + { + volEnv.Init(samplerate); + volEnv.SetTime(dsp::ADENV_SEG_ATTACK, .0001); + volEnv.SetTime(dsp::ADENV_SEG_DECAY, 0.1); + volEnv.SetMax(1); + volEnv.SetMin(0); + volEnv.SetCurve(-18); + } + + void Grainlet::trigger() + { + volEnv.Trigger(); + } + + void Grainlet::ctl(unsigned int ctl_nr, float val) + { + switch (ctl_nr) { + case 0: { + grainlet.SetFreq(scalen_min_max(val, 40, 400)); + } break; + case 1: { + volEnv.SetTime(dsp::ADENV_SEG_DECAY, 0.01 + val * 8.); + } break; + case 2: { + grainlet.SetFormantFreq(scalen_min_max(val, 400, 2000)); + } break; + case 3: { + grainlet.SetShape(scalen_min_max(val, 0, 1)); + } break; + } + } + + void Grainlet::switch_mode1(unsigned int pos) + { + mode1 = pos; + } + + void Grainlet::switch_mode2(unsigned int pos) + { + mode2 = pos; + } + + float Grainlet::nextsample() + { + float out{}; + out = grainlet.Process(); + float volEnv_sig = volEnv.Process(); + out *= volEnv_sig; + return out; + } + + } // namespace Instrument +} // namespace Heck \ No newline at end of file diff --git a/src/instr_grainlet.hh b/src/instr_grainlet.hh new file mode 100644 index 0000000..24f4e4b --- /dev/null +++ b/src/instr_grainlet.hh @@ -0,0 +1,32 @@ +#ifndef HECK_DAISY_INSTR_GRAINLET_HH +#define HECK_DAISY_INSTR_GRAINLET_HH + +#include "instr_abstract.hh" +#include "daisy_seed.h" +#include "daisysp.h" + +namespace ld = daisy; +namespace dsp = daisysp; + +namespace Heck { + namespace Instrument { + + class Grainlet : public AbstractInstrument { + public: + Grainlet(); + void init(); + void trigger() override; + void ctl(unsigned int ctl_nr, float val) override; + void switch_mode1(unsigned int pos) override; + void switch_mode2(unsigned int pos) override; + float nextsample() override; + private: + dsp::GrainletOscillator grainlet{}; + dsp::AdEnv volEnv{}; + float mode1{}; + float mode2{}; + }; + + } // namespace Instrument +} // namespace Heck +#endif \ No newline at end of file