Compare commits
4 Commits
2d678b4437
...
e7212cd5d5
Author | SHA1 | Date |
---|---|---|
|
e7212cd5d5 | |
|
eda618bb04 | |
|
d35f880430 | |
|
ca653441f9 |
|
@ -10,10 +10,12 @@
|
|||
NAME = chassis
|
||||
|
||||
FILES_DSP = \
|
||||
parameters.cpp \
|
||||
chassis.cpp
|
||||
|
||||
|
||||
FILES_UI = \
|
||||
panel.cpp \
|
||||
slider.cpp \
|
||||
peacock.cpp \
|
||||
ui.cpp
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ¶meter) override;
|
||||
void initParameter(uint32_t index, Parameter ¶meter) 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);
|
||||
};
|
||||
|
|
|
@ -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;
|
|
@ -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;
|
||||
}
|
|
@ -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",
|
30632
plugin/peacock.cpp
30632
plugin/peacock.cpp
File diff suppressed because it is too large
Load Diff
|
@ -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
|
113
plugin/ui.cpp
113
plugin/ui.cpp
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue