Browse Source

add instrument 'grainlet'

main
heck 7 months ago
parent
commit
4c8affcdb5
  1. 67
      src/instr_grainlet.cc
  2. 32
      src/instr_grainlet.hh

67
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

32
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
Loading…
Cancel
Save