Compare commits

...

4 Commits

Author SHA1 Message Date
Gordon JC Pearce e7212cd5d5 Merge branch 'fromjpeg' 2025-02-11 00:33:45 +00:00
Gordon JC Pearce eda618bb04 UI has working LEDs 2025-02-11 00:32:54 +00:00
Gordon JC Pearce d35f880430 envelope params too 2025-02-05 23:50:45 +00:00
Gordon JC Pearce ca653441f9 uses patches a bit 2025-02-05 23:48:58 +00:00
10 changed files with 16032 additions and 15415 deletions

View File

@ -10,10 +10,12 @@
NAME = chassis
FILES_DSP = \
parameters.cpp \
chassis.cpp
FILES_UI = \
panel.cpp \
slider.cpp \
peacock.cpp \
ui.cpp

View File

@ -1,6 +1,8 @@
#include "chassis.hpp"
#include "patches.hpp"
START_NAMESPACE_DISTRHO
Chassis::Chassis() : Plugin(parameterCount, 128, 0), sampleRate(getSampleRate()) {
@ -18,11 +20,13 @@ void Chassis::initAudioPort(bool input, uint32_t index, AudioPort &port) {
}
void Chassis::initProgramName(uint32_t index, String &programName) {
return;
programName = patchName[index & 0x7f].c_str();
//printf("prog = %s\n", patchName[index]);
}
void Chassis::loadProgram(uint32_t index) {
return;
index &= 0x7f;
memmove(&patchRam, (uint8_t *)patchData + (index * 18), 18);
}
// Processing functions

View File

@ -30,9 +30,12 @@ class Chassis : public Plugin {
enum Parameters {
pLFORate,
pLFODelay,
pVCORange,
pLFODepth,
pPWMDepth,
pSqr,
pSaw,
pSubLevel,
pNoiseLevel,
@ -50,6 +53,8 @@ class Chassis : public Plugin {
pStn,
pRls,
pChorus,
parameterCount
};
@ -67,10 +72,10 @@ class Chassis : public Plugin {
// Initialisation
void initAudioPort(bool input, uint32_t index, AudioPort &port) override;
// void initParameter(uint32_t index, Parameter &parameter) override;
void initParameter(uint32_t index, Parameter &parameter) override;
// void setParameterValue(uint32_t index, float value) override;
// float getParameterValue(uint32_t index) const override;
void setParameterValue(uint32_t index, float value) override;
float getParameterValue(uint32_t index) const override;
void initProgramName(uint32_t index, String &programName) override;
void loadProgram(uint32_t index) override;
@ -82,6 +87,26 @@ class Chassis : public Plugin {
private:
double sampleRate;
struct {
uint8_t lfoRate = 0x30; // lookup value defaults to 0x0200
uint8_t lfoDelay = 0x00;
uint8_t vcoLfo = 0x0a;
uint8_t pwmLfo = 0x30;
uint8_t noise = 0x00;
uint8_t vcfFreq = 0x3c; // 0x3f80
uint8_t vcfReso = 0x00;
uint8_t vcfEnv = 0x2e;
uint8_t vcfLfo = 0;
uint8_t vcfKey = 0x47;
uint8_t vca = 0x28;
uint8_t env_a = 0x1b;
uint8_t env_d = 0x39;
uint8_t env_s = 0x39; // 0x3f80
uint8_t env_r = 0x30;
uint8_t sub = 0x00;
uint8_t switch1 = 0x1a;
uint8_t switch2 = 0x18;
} patchRam;
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Chassis);
};

89
plugin/panel.cpp Normal file
View File

@ -0,0 +1,89 @@
#include "peacock.hpp"
static const char tempLedOn[] = {
"\025\036(\000\025\035&\000\025\033#\000\025\025\"\000\242\000\000\001\203\000\000\002r\000\000\004g\000\000\006n"
"\000\000\010p\000\000\012\210\000\000\013\231\000\000\013\235\000\000\013\250\000\000\013\261\000\000\011\261"
"\000\000\007\304\000\000\005\357\000\000\003\377\000\000\001\025$\063\000\025%\065\000\025'\071\000\025)=\000\025"
"*@\000\025\035&\000\025\035&\000\025\036&\000\062\000\000\001\062\000\000\004E\000\000\006j\000\000\011{\000\000\013"
"\227\000\000\015\255\000\000\017\300\000\000\021\323\000\000\022\330\000\000\022\336\000\000\022\336\000"
"\000\020\325\000\000\016\323\000\000\013\306\000\000\010\313\000\000\005\327\000\000\002\344\000\000\001\025*"
"?\000\025';\000\025&\071\000\025\037&\000\025!&\000\066\000\000\001L\000\000\004p\000\000\007\203\000\000\012\244"
"\000\000\015\271\000\000\021\315!!\025\340\034\034\027\361\030\030\030\364\024\024\031\372\000"
"\000\031\374\000\000\030\374\000\000\030\374\000\000\025\372\000\000\021\370\000\000\016\366\000\000\011\353"
"\000\000\006\377\000\000\003\377\000\000\001\024\037\063\000\024\035/\000\025/,\000+\000\000\001<\000\000\004a\000\000"
"\007\231\000\000\012\261\000\000\017\317##\024\334\030\030\027\351\017\021\033\366\007\011\036\377"
"\004\005\040\377\002\004!\377\002\004!\377\002\002!\377\000\000\037\377\000\000\033\377\000\000\030\377\000"
"\000\024\377\000\000\017\377\000\000\012\377\000\000\006\377\000\000\003\377\000\000\001\014\015\026\000\064\000"
"\000\001\034\000\000\003\203\000\000\007\246\021\021\013\306::\017\321#%\024\342\022\024\031\363\005"
"\007\037\377\000\000#\377\000\000'\375\000\000*\377\000\000*\377\000\000*\377\000\000)\377\000\000&\377"
"\000\000#\377\000\000\037\377\000\000\032\377\000\000\025\377\000\000\017\377\000\000\012\377\000\000\005\377"
"\000\000\002\013\012\020\000I\000\000\002:\000\000\006\227\000\000\012\265\000\000\016\323%%\024\351\022\022"
"\032\376\004\004\040\377\000\000&\377\000\000,\370\001\000\063\340\002\002Q\346\002\002B\355\001\001>\374"
"\000\000\064\377\000\000/\377\000\000+\377\000\000&\377\000\000!\377\000\000\033\377\000\000\024\377\000\000"
"\016\377\000\000\010\377\000\000\004\377\000\000\001P\000\000\004w\000\000\010\267\002\002\015\332))\023\361"
"\024\026\031\377\004\005\040\377\000\000'\371\000\001\060\337\002\003G\316\003\003]\244\004\003\331\264"
"\004\003\307\313\003\003\256\330\003\004d\337\002\004L\366\001\002\070\377\000\000-\377\000\000(\377\000"
"\000!\377\000\000\032\377\000\000\022\377\000\000\014\377\000\000\006\377\000\000\002V\000\000\005\250\000\000\012"
"\327\000\000\017\361\036\036\026\377\011\013\035\377\000\000&\373\000\000/\320\003\004U\216\004\004"
"\346e\002\002\370M\001\001\376P\001\001\376S\001\001\375\\\001\002\373\230\003\004\356\327\003\023\204"
"\366\001\002\071\377\000\000-\377\000\000&\377\000\000\037\377\000\000\027\377\000\000\017\377\000\000\011"
"\377\000\000\003\201\000\000\006\310\013\013\013\357--\022\377\022\024\031\377\000\000\"\377\000\000"
"*\344\002\002B\225\004\005\315m\002\003\375\202\002\002\377\235\002\002\377\212\001\001\377\252\001"
"\002\377\223\001\001\377\215\001\001\377\304\003\005\357\321\003\006\\\372\000\001\064\377\000\000+"
"\377\000\000#\377\000\000\033\377\000\000\022\377\000\000\013\377\000\000\005\250\000\000\010\334\004\004\015"
"\372))\023\377\015\017\033\377\000\000%\373\000\000\060\322\003\004Vm\003\003\364\215\003\005\377"
"\323@F\377\325@F\377\270\001\001\377\272\001\001\377\323\001\002\377\326\001\003\377\247"
"\001\002\377\305\004\011\340\342\002\005H\377\000\000.\377\000\000&\377\000\000\035\377\000\000\024\377"
"\000\000\015\377\000\000\006\300\000\000\010\364\000\000\016\377##\024\377\013\013\035\377\000\000&\347"
"\002\002<\227\003\005\272l\002\003\373\272\015\017\377\372\356\360\377\377\376\376\377"
"\313\024\"\377\374\000\001\377\367\001\001\377\360\001\002\377\331\001\002\377\300\003\006\362"
"\337\002\004M\377\000\000/\377\000\000'\377\000\000\036\377\000\000\026\377\000\000\016\377\000\000\007\340"
"\000\000\011\377\000\000\016\377!!\025\377\011\013\035\377\000\000'\363\001\001\067\302\003\004\221"
"k\002\003\372\254\002\004\377\316\022\026\377\307\026,\377\347\003\010\377\377\000\013\377"
"\367\001\005\377\364\001\002\377\362\001\002\377\316\003\006\364\337\002\004M\377\000\000\060\377"
"\000\000(\377\000\000\037\377\000\000\026\377\000\000\016\377\000\000\010\357\000\000\010\377\000\000\016\377"
"!!\025\377\013\015\034\377\000\000&\370\001\001\063\331\002\004\201r\002\002\372\262\001\002\377\323"
"\000\001\377\373\000\017\377\377\000\022\377\374\000\034\377\373\000\030\377\363\001\011\377"
"\361\001\011\377\330\003\007\365\337\002\005M\377\000\000\060\377\000\000'\377\000\000\036\377\000\000"
"\026\377\000\000\016\377\000\000\010\347\000\000\007\377\000\000\015\377\000\000\024\377\015\015\034\377"
"\000\000%\375\000\000/\335\002\004L\301\003\006\352\307\002\003\376\353\000\001\377\374\000\022\377"
"\377\000\034\377\371\000\032\377\370\001\021\377\357\001\013\377\366\001\006\377\327\003\005"
"\366\336\002\004K\377\000\000/\377\000\000'\377\000\000\035\377\000\000\024\377\000\000\015\377\000\000"
"\007\355\000\000\006\377\000\000\014\377\000\000\023\377\021\022\032\377\002\002!\377\000\000*\372\000\001"
"\064\321\003\006^\316\003\010\352\306\000\001\377\330\000\000\377\376\000\034\377\370\001\026\377"
"\364\001\006\377\360\001\003\377\347\002\004\377\261\005\010\357\334\002\004I\377\000\000+\377\000"
"\000$\377\000\000\033\377\000\000\022\377\000\000\013\377\000\000\005\363\000\000\004\377\000\000\012\377\000"
"\000\020\377\000\000\026\377\011\011\035\377\000\000%\377\000\000?\373\000\000Y\324\003\010^\311\004"
"\015\346\342\002\005\371\317\000\000\377\351\000\003\377\346\002\003\377\314\003\006\377\244\005"
"\011\375\215\006\010\330\333\002\003B\377\000\000'\377\000\000\037\377\000\000\027\377\000\000\020\377"
"\000\000\011\377\000\000\004\363\000\000\003\377\000\000\007\377\000\000\015\377\000\000\023\377\022\022\032"
"\377\004\005\040\377\000\000'\377\000\000-\372\000\001\065\342\007\014L\321\031\035c\271\006\017\256"
"\252\005\013\346\231\006\011\353\216\006\011\352\216\006\011\331\307\004\005T\370\000\001+\377"
"\000\000\"\377\000\000\033\377\000\000\023\377\000\000\015\377\000\000\007\377\000\000\002\377\000\000\001\377"
"\000\000\004\377\000\000\011\377\000\000\017\377\000\000\024\377\000\000\033\377\002\002!\377\000\000&\377"
"\000\000+\377\000\000\060\373\007\010\065\353\002\006@\336\002\005I\334\002\004I\331\003\004F\331\011\012"
"B\371\002\002+\377\000\000\"\377\000\000\034\377\000\000\025\377\000\000\017\377\000\000\011\377\000\000"
"\005\377\000\000\001\025*&\000\377\000\000\002\377\000\000\006\377\000\000\012\377\000\000\020\377\000\000\026"
"\377\000\000\033\377\000\000\040\377\000\000%\377\000\000(\377\000\000+\377\000\000,\377\000\000,\377\000"
"\000+\377\000\000)\377\000\000%\377\000\000!\377\000\000\033\377\000\000\025\377\000\000\020\377\000\000\012"
"\377\000\000\006\377\000\000\002\013\033\032\000\025-)\000\377\000\000\001\377\000\000\003\377\000\000\006\377"
"\000\000\013\377\000\000\020\377\000\000\025\377\000\000\031\377\000\000\035\377\000\000\040\377\000\000\""
"\377\000\000#\377\000\000#\377\000\000#\377\000\000!\377\000\000\036\377\000\000\031\377\000\000\025\377"
"\000\000\020\377\000\000\013\377\000\000\007\377\000\000\003\377\000\000\001\013\034\033\000\025-)\000\025,(\000"
"\377\000\000\001\377\000\000\003\377\000\000\006\377\000\000\012\377\000\000\016\377\000\000\022\377\000\000\026"
"\377\000\000\031\377\000\000\032\377\000\000\033\377\000\000\033\377\000\000\032\377\000\000\030\377\000"
"\000\026\377\000\000\022\377\000\000\016\377\000\000\012\377\000\000\006\377\000\000\003\377\000\000\001\013\024"
"\033\000\013\024\032\000\025/+\000\025)%\000\025\065\062\000\377\000\000\001\377\000\000\002\377\000\000\005\377"
"\000\000\010\377\000\000\013\377\000\000\015\377\000\000\020\377\000\000\021\377\000\000\022\377\000\000\022"
"\377\000\000\022\377\000\000\020\377\000\000\016\377\000\000\013\377\000\000\011\377\000\000\005\377\000\000"
"\003\377\000\000\001\013\024!\000\013\015\031\000\013\014\027\000\304\301\273\000\304\301\273\000\025"
"-)\000\025$\040\000\025$\040\000\377\000\000\001\377\000\000\002\377\000\000\004\377\000\000\006\377\000\000\010"
"\377\000\000\012\377\000\000\013\377\000\000\012\377\000\000\012\377\000\000\011\377\000\000\007\377\000\000"
"\005\377\000\000\003\377\000\000\001\025\030D\000\025\027\063\000\025\030:\000\025\027\064\000\025\030\070\000"
"\025-)\000\025'#\000\307\304\276\000\312\307\301\000\025>/\000\025\065\026\000\025\071\027\000\377"
"\000\000\001\377\000\000\002\377\000\000\003\377\000\000\004\377\000\000\004\377\000\000\005\377\000\000\004\377\000"
"\000\003\377\000\000\002\377\000\000\001\025\032C\000\025\031>\000\025\027\063\000\025\026\061\000\025\030<\000"
"\025\031>\000\025\033I\000",
};
const char* Artwork::ledOnData = (const char*)tempLedOn;

553
plugin/parameters.cpp Normal file
View File

@ -0,0 +1,553 @@
/*
Chassis polysynth framework
Copyright 2024 Gordon JC Pearce <gordonjcp@gjcp.net>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "chassis.hpp"
void Chassis::initParameter(uint32_t index, Parameter& parameter) {
switch (index) {
case pLFORate:
parameter.hints = kParameterIsAutomatable;
parameter.name = "LFO Rate";
parameter.symbol = "ch_lforate";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 48.0f;
parameter.midiCC = 3;
break;
case pLFODelay:
parameter.hints = kParameterIsAutomatable;
parameter.name = "LFO Delay";
parameter.symbol = "ch_lfodelay";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 0.0f;
parameter.midiCC = 9;
break;
case pVCORange:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.name = "Range";
parameter.symbol = "ch_vcorange";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 2.0f;
parameter.ranges.def = 1.0f;
parameter.midiCC = 12;
parameter.enumValues.count = 3;
parameter.enumValues.restrictedMode = true;
{
ParameterEnumerationValue* const enumValues = new ParameterEnumerationValue[3];
enumValues[0].value = 0.0f;
enumValues[0].label = "16'";
enumValues[1].value = 1.0f;
enumValues[1].label = "8'";
enumValues[2].value = 2.0f;
enumValues[2].label = "4'";
parameter.enumValues.values = enumValues;
}
break;
case pLFODepth:
parameter.hints = kParameterIsAutomatable;
parameter.name = "LFO";
parameter.symbol = "ch_lfo";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 10.0f;
parameter.midiCC = 13;
break;
case pPWMDepth:
parameter.hints = kParameterIsAutomatable;
parameter.name = "PWM";
parameter.symbol = "ch_pwm";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 48.0f;
parameter.midiCC = 14;
break;
/*
case paramPWMMode:
parameter.hints = kParameterIsAutomatable | kParameterIsBoolean;
parameter.name = "PWM Mode";
parameter.symbol = "ch_pwmmode";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 1.0f;
parameter.ranges.def = 1.0f;
parameter.midiCC = 15;
parameter.enumValues.count = 2;
parameter.enumValues.restrictedMode = true;
{
ParameterEnumerationValue* const enumValues = new ParameterEnumerationValue[2];
enumValues[0].value = 0.0f;
enumValues[0].label = "LFO";
enumValues[1].value = 1.0f;
enumValues[1].label = "MAN";
parameter.enumValues.values = enumValues;
}
break;
*/
case pSaw:
parameter.hints = kParameterIsAutomatable | kParameterIsBoolean;
parameter.name = "Saw";
parameter.symbol = "ch_saw";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 1.0f;
parameter.ranges.def = 0.0f;
parameter.midiCC = 17;
break;
case pSqr:
parameter.hints = kParameterIsAutomatable | kParameterIsBoolean;
parameter.name = "Square";
parameter.symbol = "ch_sqr";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 1.0f;
parameter.ranges.def = 0.0f;
parameter.midiCC = 16;
break;
case pSubLevel:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Sub Osc";
parameter.symbol = "ch_sub";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 0.0f;
parameter.midiCC = 18;
break;
case pNoiseLevel:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Noise";
parameter.symbol = "ch_noise";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 0.0f;
parameter.midiCC = 19;
break;
case pHPF:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.name = "HPF";
parameter.symbol = "ch_hpf";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 3.9f;
parameter.ranges.def = 0.0f;
parameter.midiCC = 20;
break;
case pCutoff:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Freq";
parameter.symbol = "ch_freq";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 60.0f;
parameter.midiCC = 74;
break;
case pRes:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Res";
parameter.symbol = "ch_reso";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 0.0f;
parameter.midiCC = 71;
break;
/*
case paramVCFMode:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.name = "Polarity";
parameter.symbol = "ch_vcfmode";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 1.0f;
parameter.ranges.def = 1.0f;
parameter.midiCC = 21;
parameter.enumValues.count = 2;
parameter.enumValues.restrictedMode = true;
{
ParameterEnumerationValue* const enumValues = new ParameterEnumerationValue[2];
enumValues[0].value = 0.0f;
enumValues[0].label = "POS";
enumValues[1].value = 1.0f;
enumValues[1].label = "INV";
parameter.enumValues.values = enumValues;
}
*/
break;
case pEnv:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Env";
parameter.symbol = "ch_vcfenv";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 46.0f;
parameter.midiCC = 22;
break;
case pLfo:
parameter.hints = kParameterIsAutomatable;
parameter.name = "LFO";
parameter.symbol = "ch_vcflfo";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 0.0f;
parameter.midiCC = 23;
break;
case pKyb:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Kybd";
parameter.symbol = "ch_vcfkey";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 71.0f;
parameter.midiCC = 24;
break;
case pAtk:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Attack";
parameter.symbol = "ch_attack";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 27.0f;
parameter.midiCC = 73;
break;
case pDcy:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Decay";
parameter.symbol = "ch_decay";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 57.0f;
parameter.midiCC = 75;
break;
case pStn:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Sustain";
parameter.symbol = "ch_sustain";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 57.0f;
parameter.midiCC = 27;
break;
case pRls:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Release";
parameter.symbol = "ch_release";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 48.0f;
parameter.midiCC = 72;
break;
/*
case paramEnvGate:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger; // | kParameterIsBoolean;
parameter.name = "Env-Gate";
parameter.symbol = "ch_envgate";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 1.0f;
parameter.ranges.def = 1.0f;
parameter.midiCC = 25;
parameter.enumValues.count = 2;
parameter.enumValues.restrictedMode = true;
{
ParameterEnumerationValue* const enumValues = new ParameterEnumerationValue[2];
enumValues[0].value = 0.0f;
enumValues[0].label = "ENV";
enumValues[1].value = 1.0f;
enumValues[1].label = "GATE";
parameter.enumValues.values = enumValues;
}
break;
*/
case pVCALevel:
parameter.hints = kParameterIsAutomatable;
parameter.name = "VCA Level";
parameter.symbol = "ch_vcalevel";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 40.0f;
parameter.midiCC = 26;
break;
case pChorus:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.name = "Chorus Mode";
parameter.symbol = "ch_chorus";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 2.0f;
parameter.ranges.def = 1.0f;
parameter.midiCC = 12;
parameter.enumValues.count = 3;
parameter.enumValues.restrictedMode = true;
{
ParameterEnumerationValue* const enumValues = new ParameterEnumerationValue[3];
enumValues[0].value = 0.0f;
enumValues[0].label = "Off";
enumValues[1].value = 1.0f;
enumValues[1].label = "Slow";
enumValues[2].value = 2.0f;
enumValues[2].label = "Fast";
parameter.enumValues.values = enumValues;
}
break;
/*
case paramModWheel:
parameter.hints = kParameterIsAutomatable | kParameterIsHidden;
parameter.name = "Mod wheel";
parameter.symbol = "ch_modwheel";
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.ranges.def = 0.0f;
parameter.midiCC = 1;
break;
*/
}
// chorus, porta, bend range, key mode still to do
}
void Chassis::setParameterValue(uint32_t index, float value) {
// should be trapped by host, but let's be safe
if (value < 0.0f) value = 0.0f;
if (value > 127.0f) value = 127.0f;
switch (index) {
case pLFORate:
patchRam.lfoRate = value;
break;
case pLFODelay:
patchRam.lfoDelay = value;
break;
case pLFODepth:
patchRam.vcoLfo = value;
break;
case pPWMDepth:
patchRam.pwmLfo = value / 1.27;
break;
case pSubLevel:
patchRam.sub = value;
break;
case pNoiseLevel:
patchRam.noise = value;
break;
case pCutoff:
patchRam.vcfFreq = value;
break;
case pRes:
patchRam.vcfReso = value;
break;
case pEnv:
patchRam.vcfEnv = value;
break;
case pLfo:
patchRam.vcfLfo = value;
break;
case pKyb:
patchRam.vcfKey = value;
break;
case pVCALevel:
patchRam.vca = value;
break;
case pAtk:
patchRam.env_a = value;
break;
case pDcy:
patchRam.env_d = value;
break;
case pStn:
patchRam.env_s = value;
break;
case pRls:
patchRam.env_r = value;
break;
// switch 1 params
case pVCORange: // bits 0-2 of switch 1
// doesn't look great in Carla because of odd behaviour with small integer knobs
patchRam.switch1 &= 0xf8;
patchRam.switch1 |= (1 << (int)(value - 1));
break;
case pSqr: // bit 3 of switch 1
patchRam.switch1 &= 0xf7;
patchRam.switch1 |= (value >= 0.5) << 3;
break;
case pSaw: // bit 4 of switch 1
patchRam.switch1 &= 0xef;
patchRam.switch1 |= (value >= 0.5) << 4;
break;
case pChorus:
patchRam.switch1 &= 0x9f;
// 60, 40, 00
switch ((int)value) {
case 0:
patchRam.switch1 |= 0x60;
break;
case 1:
patchRam.switch1 |= 0x40;
break;
case 2:
patchRam.switch1 |= 0x00;
break;
}
break;
/*
// switch 2 params
case paramPWMMode: // bit 0 of switch 2
patchRam.switch2 &= 0xfe;
patchRam.switch2 |= (value >= 0.5);
break;
case paramVCFMode: // bit 1 of switch 2
patchRam.switch2 &= 0xfd;
patchRam.switch2 |= (value >= 0.5) << 1;
break;
case paramEnvGate:
patchRam.switch2 &= 0xfb;
patchRam.switch2 |= (value >= 0.5) << 2;
break;
*/
case pHPF: // bits 3-4 of switch 2
// doesn't look great in Carla because of odd behaviour with small integer knobs
if (value > 3) value = 3;
patchRam.switch2 &= 0xe7;
patchRam.switch2 |= (3 - (int)value) << 3;
break;
/*
case paramModWheel:
s.ff64 = (int)value << 1;
break;
*/
}
}
float Chassis::getParameterValue(uint32_t index) const {
switch (index) {
case pLFORate:
return patchRam.lfoRate;
break;
case pLFODelay:
return patchRam.lfoDelay;
break;
case pVCORange:
// FIXME this needs to be better generally
switch (patchRam.switch1 & 0x07) {
case 1:
return 0;
break;
case 4:
return 2;
break;
default:
return 1;
}
break;
case pLFODepth:
return patchRam.vcoLfo;
break;
case pPWMDepth:
return patchRam.pwmLfo * 1.27f;
break;
/*
case paramPWMMode:
return (patchRam.switch2 & 0x01) != 0;
break;
*/
case pSaw:
return (patchRam.switch1 & 0x10) != 0;
break;
case pSqr:
return (patchRam.switch1 & 0x08) != 0;
case pSubLevel:
return patchRam.sub;
break;
case pNoiseLevel:
return patchRam.noise;
break;
case pHPF:
return 3 - ((patchRam.switch2 & 0x18) >> 3);
break;
case pCutoff:
return patchRam.vcfFreq;
break;
case pRes:
return patchRam.vcfReso;
break;
case pEnv:
return patchRam.vcfEnv;
break;
case pLfo:
return patchRam.vcfLfo;
break;
case pKyb:
return patchRam.vcfKey;
break;
/*
case paramVCFMode:
return (patchRam.switch2 & 0x02) != 0;
break;
*/
case pAtk:
return patchRam.env_a;
break;
case pDcy:
return patchRam.env_d;
break;
case pStn:
return patchRam.env_s;
break;
case pRls:
return patchRam.env_r;
break;
/*
case paramEnvGate:
return (patchRam.switch2 & 0x04) != 0;
*/
case pVCALevel:
return patchRam.vca;
break;
case pChorus:
// FIXME this needs to be better generally
switch (patchRam.switch1 & 0x60) {
case 0x40:
return 1;
case 0x00:
return 2;
default:
return 0;
}
break;
}
return 0;
}

View File

@ -3,9 +3,6 @@
#include <stdint.h>
#include <string>
#include "DistrhoPlugin.hpp"
const std::string patchName[] = {
"Brass Set 1", "Brass Swell", "Trumpet", "Flutes", "Moving Strings", "Brass & Strings", "Choir", "Piano I",
"Organ I", "Organ II", "Combo Organ", "Calliope", "Donald Pluck", "Celeste* (1 oct.up)", "Elect. Piano I",

File diff suppressed because it is too large Load Diff

View File

@ -2,18 +2,22 @@
namespace Artwork {
extern const char *ledOnData;
const unsigned int ledDataSize = 24 * 24 * 4;
const unsigned int ledWidth = 24;
const unsigned int ledHeight = 24;
extern const char *orangeData;
extern const char *greenData;
extern const char *blueData;
extern const char *whiteData;
const unsigned int sliderDataSize = 38*17*3;
const unsigned int sliderDataSize = 38 * 17 * 3;
const unsigned int sliderWidth = 41;
const unsigned int sliderHeight = 26;
extern const char *backgroundData;
const unsigned int backgroundDataSize = 700*400*3;
const unsigned int backgroundDataSize = 700 * 400 * 3;
const unsigned int backgroundWidth = 700;
const unsigned int backgroundHeight = 400;
} // namespace Artwork

View File

@ -8,7 +8,8 @@ START_NAMESPACE_DISTRHO
namespace Art = Artwork;
DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundHeight, true),
fImgBackground(Art::backgroundData, Art::backgroundWidth, Art::backgroundHeight, kImageFormatRGB)
fImgBackground(Art::backgroundData, Art::backgroundWidth, Art::backgroundHeight, kImageFormatRGB),
fImgLedOn(Art::ledOnData, Art::ledWidth, Art::ledHeight, kImageFormatRGBA)
{
Image orangeSlider(Art::orangeData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA);
@ -21,6 +22,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderLFORate->setStartPos(50, 72);
xSliderLFORate->setEndPos(50, 151);
xSliderLFORate->setRange(0, 127.0f);
xSliderLFORate->setInverted(true);
xSliderLFORate->setCallback(this);
xSliderLFODelay = new ImageSlider(this, orangeSlider);
@ -28,6 +30,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderLFODelay->setStartPos(90, 72);
xSliderLFODelay->setEndPos(90, 151);
xSliderLFODelay->setRange(0, 127.0f);
xSliderLFODelay->setInverted(true);
xSliderLFODelay->setCallback(this);
xSliderLFODepth = new ImageSlider(this, greenSlider);
@ -35,6 +38,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderLFODepth->setStartPos(292, 72);
xSliderLFODepth->setEndPos(292, 151);
xSliderLFODepth->setRange(0, 127.0f);
xSliderLFODepth->setInverted(true);
xSliderLFODepth->setCallback(this);
xSliderPWMDepth = new ImageSlider(this, greenSlider);
@ -42,6 +46,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderPWMDepth->setStartPos(331, 72);
xSliderPWMDepth->setEndPos(331, 151);
xSliderPWMDepth->setRange(0, 127.0f);
xSliderPWMDepth->setInverted(true);
xSliderPWMDepth->setCallback(this);
xSliderSubLevel = new ImageSlider(this, greenSlider);
@ -49,6 +54,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderSubLevel->setStartPos(517, 72);
xSliderSubLevel->setEndPos(517, 151);
xSliderSubLevel->setRange(0, 127.0f);
xSliderSubLevel->setInverted(true);
xSliderSubLevel->setCallback(this);
xSliderNoiseLevel = new ImageSlider(this, greenSlider);
@ -56,6 +62,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderNoiseLevel->setStartPos(558, 72);
xSliderNoiseLevel->setEndPos(558, 151);
xSliderNoiseLevel->setRange(0, 127.0f);
xSliderNoiseLevel->setInverted(true);
xSliderNoiseLevel->setCallback(this);
xSliderHPF = new ImageSlider(this, blueSlider);
@ -64,6 +71,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderHPF->setEndPos(618, 151);
xSliderHPF->setRange(0, 3.0f);
xSliderHPF->setStep(1);
xSliderHPF->setInverted(true);
xSliderHPF->setCallback(this);
xSliderCutoff = new ImageSlider(this, blueSlider);
@ -71,6 +79,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderCutoff->setStartPos(21, 261);
xSliderCutoff->setEndPos(21, 340);
xSliderCutoff->setRange(0, 127.0f);
xSliderCutoff->setInverted(true);
xSliderCutoff->setCallback(this);
xSliderRes = new ImageSlider(this, blueSlider);
@ -78,6 +87,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderRes->setStartPos(60, 261);
xSliderRes->setEndPos(60, 340);
xSliderRes->setRange(0, 127.0f);
xSliderRes->setInverted(true);
xSliderRes->setCallback(this);
xSliderEnv = new ImageSlider(this, blueSlider);
@ -85,6 +95,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderEnv->setStartPos(144, 261);
xSliderEnv->setEndPos(144, 340);
xSliderEnv->setRange(0, 127.0f);
xSliderEnv->setInverted(true);
xSliderEnv->setCallback(this);
xSliderLfo = new ImageSlider(this, blueSlider);
@ -92,6 +103,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderLfo->setStartPos(183, 261);
xSliderLfo->setEndPos(183, 340);
xSliderLfo->setRange(0, 127.0f);
xSliderLfo->setInverted(true);
xSliderLfo->setCallback(this);
xSliderKyb = new ImageSlider(this, blueSlider);
@ -99,6 +111,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderKyb->setStartPos(222, 261);
xSliderKyb->setEndPos(222, 340);
xSliderKyb->setRange(0, 127.0f);
xSliderKyb->setInverted(true);
xSliderKyb->setCallback(this);
xSliderVCALevel = new ImageSlider(this, whiteSlider);
@ -106,6 +119,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderVCALevel->setStartPos(314, 261);
xSliderVCALevel->setEndPos(314, 340);
xSliderVCALevel->setRange(0, 127.0f);
xSliderVCALevel->setInverted(true);
xSliderVCALevel->setCallback(this);
xSliderAtk = new ImageSlider(this, whiteSlider);
@ -113,6 +127,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderAtk->setStartPos(375, 261);
xSliderAtk->setEndPos(375, 340);
xSliderAtk->setRange(0, 127.0f);
xSliderAtk->setInverted(true);
xSliderAtk->setCallback(this);
xSliderDcy = new ImageSlider(this, whiteSlider);
@ -120,6 +135,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderDcy->setStartPos(414, 261);
xSliderDcy->setEndPos(414, 340);
xSliderDcy->setRange(0, 127.0f);
xSliderDcy->setInverted(true);
xSliderDcy->setCallback(this);
xSliderStn = new ImageSlider(this, whiteSlider);
@ -127,6 +143,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderStn->setStartPos(454, 261);
xSliderStn->setEndPos(454, 340);
xSliderStn->setRange(0, 127.0f);
xSliderStn->setInverted(true);
xSliderStn->setCallback(this);
xSliderRls = new ImageSlider(this, whiteSlider);
@ -134,6 +151,7 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
xSliderRls->setStartPos(493, 261);
xSliderRls->setEndPos(493, 340);
xSliderRls->setRange(0, 127.0f);
xSliderRls->setInverted(true);
xSliderRls->setCallback(this);
programLoaded(0);
@ -144,27 +162,88 @@ DistrhoUIchassis::~DistrhoUIchassis() {
}
void DistrhoUIchassis::programLoaded(uint32_t index) {
// printf("in programLoaded %d\n", i
switch (index) {
case Chassis::pLFORate:
xSliderLFORate->setValue(0.5);
printf("set lforate\n");
break;
case Chassis::pLFODelay:
xSliderLFODelay->setValue(0.5);
printf("set lfoDelay\n");
break;
}
}
void DistrhoUIchassis::parameterChanged(uint32_t index, float value) {
// printf("in parameterchanged %d %f\n", index, value);
if (index == Chassis::pLFORate) {
xSliderLFORate->setValue(value);
printf("changed lforate\n");
}
if (index == Chassis::pLFODelay) {
xSliderLFODelay->setValue(value);
printf("changed lfoDelay\n");
switch (index) {
case Chassis::pLFORate:
xSliderLFORate->setValue(value);
break;
case Chassis::pLFODelay:
xSliderLFODelay->setValue(value);
break;
case Chassis::pLFODepth:
xSliderLFODepth->setValue(value);
break;
case Chassis::pPWMDepth:
xSliderPWMDepth->setValue(value);
break;
case Chassis::pSubLevel:
xSliderSubLevel->setValue(value);
break;
case Chassis::pNoiseLevel:
xSliderNoiseLevel->setValue(value);
break;
case Chassis::pHPF:
xSliderHPF->setValue(value);
break;
case Chassis::pCutoff:
xSliderCutoff->setValue(value);
break;
case Chassis::pRes:
xSliderRes->setValue(value);
break;
case Chassis::pEnv:
xSliderEnv->setValue(value);
break;
case Chassis::pLfo:
xSliderLfo->setValue(value);
break;
case Chassis::pKyb:
xSliderKyb->setValue(value);
break;
case Chassis::pAtk:
xSliderAtk->setValue(value);
break;
case Chassis::pDcy:
xSliderDcy->setValue(value);
break;
case Chassis::pStn:
xSliderStn->setValue(value);
break;
case Chassis::pRls:
xSliderRls->setValue(value);
break;
// now the switches
case Chassis::pVCORange:
sw1 &= 0xf8; // mask
if (value > 2) value = 2;
sw1 |= (1 << (int)value);
break;
case Chassis::pSqr:
sw1 &= 0xf7;
sw1 |= ((value >= 0.5)) << 3;
break;
case Chassis::pSaw:
sw1 &= 0xef;
sw1 |= (value > 0.5) << 4;
break;
case Chassis::pChorus:
sw1 &= 0x9f;
//60, 40, 00
switch((int)value) {
case 0: sw1 |= 0x60; break;
case 1: sw1 |= 0x40; break;
case 2: sw1 |= 0x00; break;
}
}
}
@ -177,13 +256,21 @@ void DistrhoUIchassis::imageSliderDragFinished(ImageSlider* slider) {
}
void DistrhoUIchassis::imageSliderValueChanged(ImageSlider* slider, float value) {
printf("%f\n", value);
setParameterValue(slider->getId(), value);
}
void DistrhoUIchassis::onDisplay() {
const GraphicsContext& context(getGraphicsContext());
fImgBackground.draw(context);
// switch 1 LEDs
if (sw1 & 0x01) fImgLedOn.drawAt(context, 160, 77); // 16'
if (sw1 & 0x02) fImgLedOn.drawAt(context, 198, 77); // 8'
if (sw1 & 0x04) fImgLedOn.drawAt(context, 238, 77); // 4'
if (sw1 & 0x08) fImgLedOn.drawAt(context, 427, 77); // pulse
if (sw1 & 0x10) fImgLedOn.drawAt(context, 465, 77); // saw
if ((sw1 & 0x60) == 0x40) fImgLedOn.drawAt(context, 604, 269); // chorus 1
if ((sw1 & 0x60) == 0x00) fImgLedOn.drawAt(context, 644, 269); // chorus 2
};
UI* createUI() {

View File

@ -24,11 +24,13 @@ class DistrhoUIchassis : public UI,
private:
Image fImgBackground;
ScopedPointer<ImageSlider>
Image fImgLedOn;
ScopedPointer<ImageSlider>
xSliderLFORate, xSliderLFODelay,
xSliderLFODepth, xSliderPWMDepth, xSliderSubLevel, xSliderNoiseLevel,
xSliderHPF, xSliderCutoff, xSliderRes, xSliderEnv, xSliderLfo, xSliderKyb,
xSliderVCALevel, xSliderAtk, xSliderDcy, xSliderStn, xSliderRls;
uint8_t sw1 = 0, sw2 = 0;
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUIchassis)
// ImageAboutWindow fAboutWindow;
};