17#include "DistrhoPluginKars.hpp"
18#include "DistrhoPluginUtils.hpp"
24DistrhoPluginKars::DistrhoPluginKars()
25 :
Plugin(paramCount, 0, 0),
32 for (
int i=kMaxNotes; --
i >= 0;)
35 fNotes[
i].setSampleRate(fSampleRate);
42void DistrhoPluginKars::initParameter(
uint32_t index, Parameter& parameter)
47 parameter.hints = kParameterIsAutomatable|kParameterIsBoolean;
48 parameter.name =
"Sustain";
49 parameter.symbol =
"sustain";
50 parameter.ranges.def = 0.0f;
51 parameter.ranges.min = 0.0f;
52 parameter.ranges.max = 1.0f;
55 parameter.hints = kParameterIsAutomatable;
56 parameter.name =
"Release";
57 parameter.symbol =
"release";
59 parameter.ranges.def = 0.01f;
60 parameter.ranges.min = 0.0f;
61 parameter.ranges.max = 5.0f;
64 parameter.hints = kParameterIsAutomatable;
65 parameter.name =
"Volume";
66 parameter.symbol =
"volume";
68 parameter.ranges.def = 75.0f;
69 parameter.ranges.min = 0.0f;
70 parameter.ranges.max = 100.0f;
78float DistrhoPluginKars::getParameterValue(
uint32_t index)
const
82 case paramSustain:
return fSustain ? 1.0f : 0.0f;
83 case paramRelease:
return fRelease;
84 case paramVolume:
return fVolume;
90void DistrhoPluginKars::setParameterValue(
uint32_t index,
float value)
95 fSustain =
value > 0.5f;
109void DistrhoPluginKars::activate()
113 for (
int i=kMaxNotes; --
i >= 0;)
115 fNotes[
i].on = kNoteNull;
116 fNotes[
i].off = kNoteNull;
117 fNotes[
i].velocity = 0;
121void DistrhoPluginKars::run(
const float**,
float** outputs,
uint32_t frames,
const MidiEvent* midiEvents,
uint32_t midiEventCount)
124 std::memset(outputs[0], 0,
sizeof(
float)*frames);
126 for (AudioMidiSyncHelper amsh(outputs, frames, midiEvents, midiEventCount); amsh.nextEvent();)
130 if (amsh.midiEvents[
i].size > MidiEvent::kDataSize)
144 fNotes[note].on = fBlockStart;
145 fNotes[note].off = kNoteNull;
146 fNotes[note].velocity = velo;
153 fNotes[note].off = fBlockStart;
158 float*
const out = amsh.outputs[0];
160 for (
int i=kMaxNotes; --
i >= 0;)
162 if (fNotes[
i].on != kNoteNull)
163 addSamples(
out,
i, amsh.frames);
166 fBlockStart += amsh.frames;
170void DistrhoPluginKars::addSamples(
float*
out,
int voice,
uint32_t frames)
174 Note& note(fNotes[voice]);
179 if (
start == note.on)
181 for (
int i=note.sizei; --
i >= 0;)
182 note.wavetable[
i] = (float(rand()) / float(RAND_MAX)) * 2.0f - 1.0f;
185 const float vgain = float(note.velocity) / 127.0f;
195 if ((! fSustain) && note.off != kNoteNull && note.off <
i+
start)
199 index = 1 +
uint32_t(fRelease * fSampleRate);
208 gain = gain * float(index -
size) / float(index);
215 sample = note.wavetable[index];
222 sample += note.wavetable[index-1];
224 note.wavetable[index] =
sample/2;
235 return new DistrhoPluginKars();
#define END_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:191
#define START_NAMESPACE_DISTRHO
Definition DistrhoDefines.h:190
#define DISTRHO_SAFE_ASSERT_BREAK(cond)
Definition DistrhoDefines.h:110
Plugin * createPlugin()
Definition DistrhoPluginKars.cpp:233
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
static PuglViewHint int value
Definition pugl.h:1708
virtual ASIOError start()=0
virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate)=0
JSAMPIMAGE data
Definition jpeglib.h:945
float out
Definition lilv_test.c:1461
unsigned int uint32_t
Definition mid.cpp:100
unsigned char uint8_t
Definition mid.cpp:98
#define false
Definition ordinals.h:83
signed int sample
Definition tap_dynamics_m.c:41