
2 changed files with 99 additions and 0 deletions
@ -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
|
@ -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 |
Loading…
Reference in new issue