diff --git a/plugin/chassis.cpp b/plugin/chassis.cpp index 09695d1..1636f08 100644 --- a/plugin/chassis.cpp +++ b/plugin/chassis.cpp @@ -33,7 +33,8 @@ void Chassis::initParameter(uint32_t index, Parameter ¶meter) { parameter.symbol = "saw"; parameter.ranges.min = 0.0f; parameter.ranges.max = 127.0f; - parameter.ranges.def = 0.0f; + parameter.ranges.def = 127.0f; + parameter.midiCC = 17; break; case k_sqr: @@ -43,15 +44,57 @@ void Chassis::initParameter(uint32_t index, Parameter ¶meter) { parameter.ranges.min = 0.0f; parameter.ranges.max = 127.0f; parameter.ranges.def = 0.0f; + parameter.midiCC = 16; break; case k_sub: - parameter.hints = kParameterIsAutomatable | kParameterIsBoolean; + parameter.hints = kParameterIsAutomatable; parameter.name = "Sub Osc"; parameter.symbol = "sub"; parameter.ranges.min = 0.0f; parameter.ranges.max = 127.0f; parameter.ranges.def = 0.0f; + parameter.midiCC = 18; + break; + + case k_attack: + parameter.hints = kParameterIsAutomatable; + parameter.name = "Attack"; + parameter.symbol = "attack"; + parameter.ranges.min = 0.0f; + parameter.ranges.max = 127.0f; + parameter.ranges.def = 0.0f; + parameter.midiCC = 73; + break; + + case k_decay: + parameter.hints = kParameterIsAutomatable; + parameter.name = "Decay"; + parameter.symbol = "decay"; + parameter.ranges.min = 0.0f; + parameter.ranges.max = 127.0f; + parameter.ranges.def = 0.0f; + parameter.midiCC = 75; + break; + + case k_sustain: + parameter.hints = kParameterIsAutomatable; + parameter.name = "Sustain"; + parameter.symbol = "sustain"; + parameter.ranges.min = 0.0f; + parameter.ranges.max = 127.0f; + parameter.ranges.def = 0.0f; + parameter.midiCC = 27; + break; + + case k_release: + parameter.hints = kParameterIsAutomatable; + parameter.name = "Release"; + parameter.symbol = "release"; + parameter.ranges.min = 0.0f; + parameter.ranges.max = 127.0f; + parameter.ranges.def = 0.0f; + parameter.midiCC = 72; break; } } @@ -67,6 +110,18 @@ void Chassis::setParameterValue(uint32_t index, float value) { case k_sub: s.patch.sub = value / 127.0f; break; + case k_attack: + s.patch.attack = attack_table[(int)value]; + break; + case k_decay: + s.patch.decay = decay_table[(int)value]; + break; + case k_sustain: + s.patch.sustain = (int)value << 7; + break; + case k_release: + s.patch.release = decay_table[(int)value]; + break; } } @@ -107,6 +162,7 @@ void Chassis::deactivate() { void Chassis::noteOn(uint8_t note) { uint32_t i; + //printf("noteon %d %d\n", note, vPtr); for (i = 0; i < NUM_VOICES; i++) { vPtr++; if (vPtr == NUM_VOICES) vPtr = 0; @@ -127,6 +183,7 @@ void Chassis::noteOn(uint8_t note) { } void Chassis::noteOff(uint8_t note) { + // printf("noteoff %d\n", note); for (uint32_t i = 0; i < NUM_VOICES; i++) { if (s.voice[i].note == note && !s.voice[i].isFree()) { s.voice[i].off(); @@ -151,6 +208,7 @@ void Chassis::doMidi(const MidiEvent *ev, uint32_t count, uint32_t timeLimit) { case 0x80: noteOff(ev[i].data[1]); break; +#if 0 case 0xb0: //printf("cc %02x %02x\n", ev[i].data[1], ev[i].data[2]); val = ev[i].data[2]; // get control value @@ -178,6 +236,7 @@ void Chassis::doMidi(const MidiEvent *ev, uint32_t count, uint32_t timeLimit) { s.patch.sustain = val << 7; } break; +#endif } } lastEvent = i; diff --git a/plugin/chassis.hpp b/plugin/chassis.hpp index 97c4e16..5a9696e 100644 --- a/plugin/chassis.hpp +++ b/plugin/chassis.hpp @@ -26,8 +26,8 @@ START_NAMESPACE_DISTRHO -//uint16_t attack_table[128]; -//uint16_t decay_table[128]; +// uint16_t attack_table[128]; +// uint16_t decay_table[128]; class Chassis : public Plugin { public: @@ -35,6 +35,10 @@ class Chassis : public Plugin { k_saw, k_sqr, k_sub, + k_attack, + k_decay, + k_sustain, + k_release, kParameterCount }; @@ -69,9 +73,9 @@ class Chassis : public Plugin { void noteOff(uint8_t note); private: - void doMidi(const MidiEvent *ev, uint32_t count, uint32_t timelimit ) ; - double sampleRate; - uint32_t lastEvent; + void doMidi(const MidiEvent *ev, uint32_t count, uint32_t timelimit); + double sampleRate; + uint32_t lastEvent; // Voice voice[NUM_VOICES]; uint8_t vPtr; @@ -80,7 +84,6 @@ class Chassis : public Plugin { DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Chassis); }; - uint16_t attack_table[128] = { 0x4000, 0x2000, 0x1000, 0x0aaa, 0x0800, 0x0666, 0x0555, 0x0492, 0x0400, 0x038e, 0x0333, 0x02e9, 0x02ab, 0x0276, 0x0249, 0x0222, 0x0200, 0x01e2, @@ -115,11 +118,6 @@ uint16_t decay_table[128] = { 0xffd8, 0xffdc, 0xffe0, 0xffe4, 0xffe8, 0xffec, 0xfff0, 0xfff1, 0xfff2, 0xfff3, 0xfff4}; - - END_NAMESPACE_DISTRHO - - - #endif // _CHASSIS_HPP diff --git a/plugin/voice.hpp b/plugin/voice.hpp index 8b2c16f..0947cb7 100644 --- a/plugin/voice.hpp +++ b/plugin/voice.hpp @@ -27,7 +27,7 @@ class Synth; class Patch { public: float saw=1, sqr, sub; - uint16_t attack=0x1ff, decay=0x1ff, sustain=0x1000, release=0x1ff; + uint16_t attack, decay, sustain, release; }; class Voice { @@ -55,12 +55,12 @@ class Voice { K_ON, K_SUSTAIN } keyState = K_OFF; - bool ff00; // reset bit - bool ff07; // status bit - bool ff08; // set to indicate attack phase complete - bool ff10; // note on bit - bool ff11; // sustain flag - bool ff33; // releasing flag + bool ff00=0; // reset bit + bool ff07=0; // status bit + bool ff08=0; // set to indicate attack phase complete + bool ff10=0; // note on bit + bool ff11=0; // sustain flag + bool ff33=0; // releasing flag uint16_t env;