Compare commits

..

14 Commits

Author SHA1 Message Date
Gordon JC Pearce 9f69ef4e6a chorus buttons work 2025-03-15 01:18:40 +00:00
Gordon JC Pearce 04446708c3 sqr/saw leds work 2025-03-15 01:11:02 +00:00
Gordon JC Pearce 1e1add37bb orange buttons 2025-03-15 01:04:58 +00:00
Gordon JC Pearce c33fd60c5c fixed LEDs 2025-03-15 00:47:35 +00:00
Gordon JC Pearce 11df5c186f updated sliders 2025-03-15 00:43:17 +00:00
Gordon JC Pearce 80987f0875 new background, knobs a bit wonky 2025-03-15 00:29:13 +00:00
Gordon JC Pearce 7607c71dad moved slider enum 2025-02-16 13:43:50 +00:00
Gordon JC Pearce b095ff1a0f note that the HPF slider needs 'fixed' 2025-02-15 20:16:09 +00:00
Gordon JC Pearce 23e9e5f079 sliders set by function 2025-02-15 20:15:28 +00:00
Gordon JC Pearce d7fcc9c0b0 buttons switch LEDs 2025-02-11 23:14:29 +00:00
Gordon JC Pearce 9dc95dc07f orangebutton is not actually orange 2025-02-11 22:35:13 +00:00
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 2d678b4437 slider position tweaks 2025-02-05 23:16:18 +00:00
10 changed files with 17026 additions and 15236 deletions

View File

@ -30,4 +30,38 @@
#define DISTRHO_PLUGIN_WANT_PROGRAMS 1 #define DISTRHO_PLUGIN_WANT_PROGRAMS 1
#define DISTRHO_PLUGIN_HAS_UI 1 #define DISTRHO_PLUGIN_HAS_UI 1
enum Parameters {
pLFORate,
pLFODelay,
pVCORange,
pLFODepth,
pPWMDepth,
pSqr,
pSaw,
pSubLevel,
pNoiseLevel,
pHPF,
pCutoff,
pRes,
pEnv,
pLfo,
pKyb,
pVCALevel,
pAtk,
pDcy,
pStn,
pRls,
pChorus,
parameterCount,
btn16, btn8, btn4, btnPls, btnSaw, btnCh0, btnCh1, btnCh2
};
#endif #endif

View File

@ -15,6 +15,8 @@ FILES_DSP = \
FILES_UI = \ FILES_UI = \
orangebutton.cpp \
panel.cpp \
slider.cpp \ slider.cpp \
peacock.cpp \ peacock.cpp \
ui.cpp ui.cpp

View File

@ -27,32 +27,6 @@ START_NAMESPACE_DISTRHO
class Chassis : public Plugin { class Chassis : public Plugin {
public: public:
enum Parameters {
pLFORate,
pLFODelay,
pLFODepth,
pPWMDepth,
pSubLevel,
pNoiseLevel,
pHPF,
pCutoff,
pRes,
pEnv,
pLfo,
pKyb,
pVCALevel,
pAtk,
pDcy,
pStn,
pRls,
parameterCount
};
Chassis(); Chassis();
protected: protected:

367
plugin/orangebutton.cpp Normal file
View File

@ -0,0 +1,367 @@
#include "peacock.hpp"
static const char tempOrngUp[] = {
"jF#\377\213].\377\230e\062\377\223b\061\377\230e\062\377\224c\061\377\226d\061"
"\377\222a\060\377\230e\062\377\225c\061\377\232f\063\377\224c\061\377\223b\060"
"\377\227e\062\377\227d\062\377\233g\063\377\223b\060\377\225c\061\377\222a\060"
"\377\224b\061\377\227e\062\377\227d\062\377\226d\062\377\226d\062\377\224c\061"
"\377\223b\060\377\231f\062\377\223b\061\377\222a\060\377\226d\062\377\227e\062"
"\377\223b\060\377\220`\060\377\224b\061\377\233g\063\377\232f\063\377\226d\062"
"\377\223b\060\377\217_/\377\004\003\001\000\004\003\001\000\243l\066\377\331\263\215\377\321"
"\242s\377\321\243u\377\320\241q\377\321\243u\377\321\243u\377\320\240o\377"
"\320\241r\377\320\241r\377\321\243u\377\320\241r\377\320\241r\377\322\244"
"u\377\322\245w\377\321\242s\377\320\240q\377\321\242r\377\321\243u\377\317"
"\237n\377\320\241r\377\321\242s\377\321\242r\377\322\244v\377\321\242s\377"
"\317\237o\377\321\242s\377\320\240o\377\321\242s\377\320\241r\377\320\241"
"q\377\321\242s\377\321\242s\377\321\242s\377\320\237o\377\321\243t\377\321"
"\242s\377\271{=\377\253r\070\377\217_/\062\004\003\001\000\237i\064\377\322\245x\377"
"\305\212O\377\304\207K\377\305\212P\377\304\207K\377\306\214R\377\305\212"
"O\377\303\207J\377\305\211N\377\307\215T\377\303\206J\377\305\211N\377\305"
"\212O\377\304\207K\377\303\206J\377\305\212P\377\302\204G\377\304\211M\377"
"\304\207K\377\304\211M\377\303\206I\377\306\213Q\377\305\212N\377\304\207"
"K\377\303\206H\377\305\212O\377\305\211N\377\305\212P\377\305\212P\377\304"
"\207K\377\303\206H\377\304\207K\377\305\212P\377\306\214R\377\304\207K\377"
"\304\211M\377\300\201A\377\262v;\377rK$\377>(\024\226\237j\064\377\320\240"
"p\377\301\201B\377\270z=\377\270z=\377\300\200A\377\265y<\377\266y<\377\301"
"\202C\377\265x<\377\271{=\377\271{=\377\267y<\377\275~>\377\300\200@\377"
"\273}>\377\267z<\377\273}>\377\266y<\377\300\200@\377\272{=\377\265y<\377"
"\272|=\377\264x;\377\300\200@\377\300\201A\377\276\177?\377\261v:\377\301"
"\202C\377\267z<\377\275~>\377\267z<\377\267z<\377\275~>\377\267z<\377\267"
"z<\377\301\201B\377\275}>\377\237j\064\377hD\040\377>(\024n\234h\063\377\317"
"\237n\377\267y<\377\276~?\377\261u:\377\267y<\377\271{=\377\273|>\377\276"
"~?\377\275~>\377\266y<\377\274}>\377\275~>\377\265y<\377\275~>\377\262v;"
"\377\270{=\377\267z<\377\267y<\377\276~?\377\265y<\377\273}>\377\300\200"
"@\377\276\177?\377\263w;\377\270z=\377\275~>\377\265y<\377\270z=\377\272"
"|=\377\266y<\377\275~>\377\272|=\377\272|=\377\270z=\377\264x;\377\273|>"
"\377\276~?\377\232f\063\377eB\037\377\065\"\020\303\235i\064\377\321\242s\377"
"\301\203D\377\274}>\377\267y<\377\300\200A\377\271{=\377\273|>\377\277\177"
"?\377\264x<\377\266y<\377\272{=\377\275~>\377\260u:\377\267y<\377\300\200"
"@\377\300\200A\377\275}>\377\267y<\377\270z=\377\264x;\377\276~?\377\265"
"x<\377\275~>\377\272|=\377\276~?\377\300\200@\377\271{=\377\272{=\377\270"
"{=\377\263w;\377\276~?\377\272{=\377\262v;\377\263w;\377\300\200A\377\267"
"y<\377\274}>\377\234h\064\377b@\037\377\065\"\020\370\237j\064\377\320\240p\377"
"\301\202C\377\273|>\377\262v;\377\267y<\377\301\201B\377\274}>\377\274}>"
"\377\277\177?\377\300\201A\377\270z=\377\267y<\377\301\201B\377\275~>\377"
"\272|=\377\274}>\377\266y<\377\271{=\377\271{=\377\274}>\377\300\200@\377"
"\277\177?\377\275}>\377\273|>\377\273|>\377\275~>\377\276~?\377\271{=\377"
"\301\201B\377\271{=\377\271{=\377\277\177?\377\301\201B\377\274}>\377\261"
"u:\377\301\202C\377\301\201B\377\231f\063\377cA\037\377\065\"\020\370\237j\064"
"\377\321\241r\377\303\206I\377\271{=\377\265x<\377\272|=\377\275~>\377\273"
"}>\377\301\202C\377\277\177?\377\272|=\377\265x<\377\266y<\377\264x;\377"
"\273|>\377\274}>\377\272{=\377\274}>\377\266y<\377\267z<\377\271{=\377\266"
"y<\377\271{=\377\267z<\377\264x;\377\275}>\377\266y<\377\274}>\377\301\201"
"B\377\277\177?\377\272|=\377\262v;\377\301\201B\377\300\201A\377\273|>\377"
"\276~?\377\301\201B\377\264x<\377\243m\066\377b@\037\377\065\"\020\370\237i\064"
"\377\320\240p\377\302\204F\377\267z<\377\263w;\377\265x<\377\267z<\377\262"
"v;\377\265y<\377\300\200A\377\277\177?\377\274}>\377\277\177?\377\270z=\377"
"\262v;\377\300\200@\377\272|>\377\261v:\377\267y<\377\266y<\377\301\201B"
"\377\272|=\377\267z<\377\272{=\377\271{=\377\270z=\377\272|=\377\274}>\377"
"\266y<\377\300\200@\377\270{=\377\267y<\377\274}>\377\275}>\377\274}>\377"
"\271{=\377\275}>\377\274}>\377\236i\064\377gD\040\377\065\"\020\370\240j\065\377"
"\320\240p\377\300\200@\377\301\201B\377\277\177?\377\276~?\377\266y<\377"
"\275}>\377\271{=\377\267y<\377\273|>\377\264x;\377\274}>\377\276~?\377\271"
"{=\377\267y<\377\274}>\377\267y<\377\265x<\377\275}>\377\267y<\377\300\201"
"A\377\276~?\377\267y<\377\264x;\377\276~?\377\301\202C\377\271{=\377\270"
"z=\377\272|=\377\275~>\377\266y<\377\272|>\377\271{=\377\300\200@\377\300"
"\200@\377\267z<\377\274}>\377\237j\064\377dB\037\377\065\"\020\370\237j\064\377"
"\321\242s\377\274}>\377\261u:\377\267y<\377\267y<\377\272{=\377\276~?\377"
"\271{=\377\266y<\377\271{=\377\272|>\377\300\200A\377\271{=\377\273|>\377"
"\265y<\377\264x<\377\300\200@\377\271{=\377\262v;\377\262w;\377\264x<\377"
"\301\201B\377\274}>\377\272|=\377\265x<\377\300\200@\377\271{=\377\301\203"
"D\377\265x<\377\277\177?\377\301\202C\377\274}>\377\276~?\377\264x;\377\271"
"{=\377\271{=\377\272|=\377\235i\064\377eB\037\377\065\"\020\370\237i\064\377\320"
"\240p\377\267z<\377\271{=\377\300\200@\377\267z<\377\271{=\377\262v;\377"
"\276~?\377\263w;\377\265x<\377\266y<\377\272|=\377\300\177?\377\274}>\377"
"\266y<\377\300\200@\377\267y<\377\275~>\377\275}>\377\276~?\377\266y<\377"
"\275}>\377\300\177?\377\263w;\377\266y<\377\270z=\377\263w;\377\264x<\377"
"\274}>\377\277\177?\377\271{=\377\300\200@\377\277\177?\377\271{=\377\300"
"\201A\377\273|>\377\266y<\377\250p\067\377dB\037\377\065\"\020\370\235i\064\377"
"\320\237o\377\277\177?\377\300\200@\377\275}>\377\270z=\377\267y<\377\275"
"~>\377\271{=\377\266y<\377\271{=\377\274}>\377\271{=\377\263w;\377\260u:"
"\377\277\177?\377\262w;\377\275}>\377\273|>\377\301\201B\377\262v;\377\267"
"y<\377\272|>\377\267y<\377\274}>\377\273|>\377\300\200A\377\267z<\377\265"
"y<\377\275}>\377\266y<\377\271{=\377\262v;\377\273|>\377\271{=\377\300\200"
"@\377\274}>\377\274}>\377\243l\066\377jE!\377\065\"\020\370\232g\063\377\316"
"\234k\377\267z<\377\267z<\377\266y<\377\264x;\377\266y<\377\266y<\377\300"
"\200A\377\272|>\377\271{=\377\272|=\377\273}>\377\274}>\377\273|>\377\272"
"|=\377\301\201B\377\276~?\377\265y<\377\265x<\377\270z=\377\266y<\377\262"
"v;\377\267z<\377\264x;\377\301\202C\377\274}>\377\266y<\377\265x<\377\301"
"\202C\377\265y<\377\267y<\377\274}>\377\263w;\377\270{=\377\263w;\377\266"
"y<\377\275~>\377\242l\066\377gC\040\377\065\"\020\370\234h\063\377\317\236n\377"
"\271{=\377\267y<\377\267y<\377\274}>\377\274}>\377\266y<\377\274}>\377\273"
"|>\377\276~?\377\277\177?\377\266y<\377\301\202C\377\274}>\377\274}>\377"
"\261v:\377\275~>\377\267z<\377\273|>\377\265x<\377\264x<\377\274}>\377\271"
"{=\377\274}>\377\274}>\377\266y<\377\274}>\377\274}>\377\300\201A\377\301"
"\202C\377\276~?\377\275~>\377\273|>\377\276~?\377\261v;\377\266y<\377\276"
"~?\377\232f\063\377fC\040\377\065\"\020\370\233g\063\377\317\235l\377\277\177"
"?\377\263w;\377\272|=\377\267y<\377\270z=\377\266y<\377\300\200@\377\267"
"z<\377\277\177?\377\300\200@\377\276~?\377\274}>\377\272|=\377\275~>\377"
"\275}>\377\273|>\377\270z=\377\277\177?\377\266y<\377\265x<\377\264x;\377"
"\267z<\377\267y<\377\267z=\377\274}>\377\275}>\377\272|=\377\271{=\377\275"
"}>\377\270z=\377\265x<\377\275}>\377\267y<\377\266y<\377\274}>\377\274}>"
"\377\240j\065\377b@\037\377\065\"\020\370\234h\063\377\316\233i\377\300\201A\377"
"\300\200@\377\265x<\377\276~?\377\267z<\377\274}>\377\271{=\377\267y<\377"
"\265x<\377\274}>\377\276~?\377\272|=\377\276~?\377\274}>\377\263w;\377\266"
"y<\377\274}>\377\267z=\377\266y<\377\272|=\377\275}>\377\274}>\377\272|>"
"\377\265x<\377\273|>\377\275}>\377\267z<\377\300\201A\377\271{=\377\266y"
"<\377\275~>\377\274}>\377\300\200@\377\270{=\377\301\201B\377\266y<\377\243"
"l\066\377eB\040\377\065\"\020\370\232g\063\377\320\237o\377\270z=\377\263w;\377"
"\275}>\377\267y<\377\277\177?\377\277\177?\377\267z<\377\274}>\377\277\177"
"?\377\267y<\377\274}>\377\300\200A\377\273|>\377\276~?\377\274}>\377\272"
"|=\377\277\177?\377\272|=\377\272|=\377\264w;\377\300\200@\377\274}>\377"
"\271{=\377\266y<\377\271{=\377\273|>\377\273|>\377\271{=\377\272|=\377\275"
"~>\377\270z=\377\270z=\377\266y<\377\300\200@\377\273|>\377\266y<\377\242"
"l\065\377gC\040\377\065\"\020\370\232g\063\377\317\236l\377\275~?\377\271{=\377"
"\275}>\377\271{=\377\260u:\377\271{=\377\274}>\377\274}>\377\267z<\377\262"
"w;\377\300\200@\377\274}>\377\266y<\377\274}>\377\277\177?\377\275~>\377"
"\300\177?\377\272|=\377\266y<\377\273|>\377\274}>\377\271{=\377\266y<\377"
"\275~>\377\274}>\377\300\200@\377\272|=\377\275}>\377\267y<\377\274}>\377"
"\272{=\377\277\177?\377\270z=\377\277\177?\377\265x<\377\277\177?\377\244"
"m\066\377fC\040\377\065\"\020\370\233g\063\377\321\242r\377\301\201B\377\272|"
"=\377\300\177?\377\265x<\377\267z<\377\271{=\377\271{=\377\271{=\377\274"
"}>\377\267z<\377\275~>\377\300\201A\377\271{=\377\265y<\377\272|>\377\263"
"w;\377\300\200A\377\271{=\377\275~>\377\274}>\377\271{=\377\300\200A\377"
"\264x;\377\266y<\377\274}>\377\267z<\377\272|=\377\267z<\377\273|>\377\272"
"|=\377\271{=\377\267y<\377\271{=\377\273|>\377\274}>\377\276\177?\377\242"
"l\065\377gD\040\377\065\"\020\370\235i\064\377\320\240p\377\265x<\377\266y<\377"
"\272|=\377\262v;\377\273}>\377\271{=\377\301\203D\377\271{=\377\300\201A"
"\377\270z=\377\273|>\377\267y<\377\267z<\377\266y<\377\301\201B\377\272|"
"=\377\270z=\377\265y<\377\272|=\377\263w;\377\266y<\377\274}>\377\275~>\377"
"\275}>\377\272|>\377\261u:\377\271{=\377\275~>\377\275~>\377\266y<\377\271"
"{=\377\263w;\377\300\200@\377\266y<\377\277\177?\377\276~?\377\235h\064\377"
"fC\040\377\065\"\020\370\233g\063\377\317\236n\377\275~?\377\270{=\377\277\177"
"?\377\263w;\377\300\200@\377\274}>\377\267y<\377\301\202C\377\267z<\377\271"
"{=\377\276~?\377\266y<\377\274}>\377\262v;\377\300\200A\377\266y<\377\270"
"z=\377\267z<\377\272|=\377\270z=\377\277\177?\377\266y<\377\301\202C\377"
"\266y<\377\272{=\377\274}>\377\276~?\377\274}>\377\270z=\377\267z<\377\264"
"x<\377\266y<\377\265y<\377\262v;\377\271{=\377\301\202D\377\237j\064\377d"
"A\037\377\065\"\020\370\234h\063\377\317\235l\377\301\202C\377\274}>\377\274"
"}>\377\276~?\377\271{=\377\271{=\377\276~?\377\301\201B\377\300\200@\377"
"\277\177?\377\273|>\377\273|>\377\271{=\377\265y<\377\274}>\377\276~?\377"
"\273|>\377\275~>\377\300\200?\377\277\177?\377\300\200@\377\262v;\377\301"
"\202C\377\263w;\377\275~>\377\266y<\377\263w;\377\266y<\377\266y<\377\277"
"\177?\377\261v:\377\267z<\377\275}>\377\274}>\377\267z<\377\300\200@\377"
"\237j\064\377eB\037\377\065\"\020\370\237j\064\377\317\236n\377\271{=\377\302"
"\203E\377\274}>\377\275~>\377\266y<\377\264x;\377\274}>\377\264x;\377\274"
"}>\377\300\177?\377\266y<\377\270z=\377\266y<\377\271{=\377\300\200?\377"
"\277\177?\377\262v;\377\275~>\377\263w;\377\271{=\377\275}>\377\276~?\377"
"\274}>\377\267z<\377\272|>\377\274}>\377\302\203E\377\271{=\377\271{=\377"
"\277\177?\377\272|=\377\261v:\377\275~>\377\264x;\377\267y<\377\301\201B"
"\377\235i\064\377eB\037\377\065\"\020\370\233g\063\377\317\235l\377\303\205H\377"
"\266y<\377\274}>\377\274}>\377\270z=\377\273|>\377\270{=\377\276~?\377\273"
"}>\377\266y<\377\275~>\377\302\203E\377\274}>\377\276~?\377\276~?\377\276"
"\177?\377\266y<\377\267z<\377\271{=\377\274}>\377\300\200A\377\274}>\377"
"\276~?\377\271{=\377\264x;\377\266y<\377\276\177?\377\300\200@\377\276~?"
"\377\276~?\377\302\203E\377\275~>\377\265y<\377\266y<\377\275~>\377\276\177"
"?\377\240j\065\377dB\037\377\065\"\020\370\264x;\377\331\263\215\377\302\204"
"F\377\263w;\377\300\201A\377\300\200@\377\274}>\377\271{=\377\273}>\377\300"
"\201A\377\266y<\377\267y<\377\272|=\377\300\201A\377\301\202B\377\273}>\377"
"\300\200@\377\300\200@\377\273|>\377\276~?\377\300\200@\377\276~?\377\272"
"|=\377\270{=\377\300\201A\377\277\177?\377\274}>\377\266y<\377\301\201B\377"
"\273}>\377\270z=\377\274}>\377\274}>\377\275~>\377\300\200@\377\301\202C"
"\377\301\202B\377\264x;\377\241k\065\377eB\040\377\065\"\020\370kG#\377\210["
"-\377\233g\063\377\215^.\377\214].\377\215^/\377\216^/\377\207Z-\377\206Y"
",\377\201V+\377\214].\377\207Z-\377\204X,\377\210Z-\377\216_/\377\233g\063"
"\377\223b\061\377\222a\060\377\226d\062\377\214].\377\210[-\377\210Z-\377\215"
"^/\377\224c\061\377\225c\061\377\230e\062\377\224b\061\377\227e\062\377\225c\061"
"\377\231f\062\377\227d\062\377\230e\062\377\223b\061\377\224b\061\377\223b\061"
"\377\232g\063\377\231f\062\377\216_/\377\211[-\377fC\040\377\065\"\020\370\304"
"\206I\025[\071\034\377P\063\031\377cA\037\377gC!\377eA\040\377cA\040\377eB\040\377"
"cA\037\377b@\037\377c@\037\377cA\037\377c@\037\377c@\037\377c@\037\377b@\037\377"
"b@\037\377c@\037\377c@\037\377_>\036\377a?\037\377a?\037\377c@\037\377b?\037\377"
"a?\037\377`>\036\377^>\036\377^>\036\377_>\036\377^>\036\377`>\036\377`>\036\377"
"`>\036\377`>\036\377`>\036\377a?\037\377`>\036\377c@\037\377Y:\034\377L\061\027\377"
"\065\"\020\370\004\003\001\000a@\040\377D,\025\377C+\025\377S\066\032\377V\070\033\377U\066"
"\032\377S\066\032\377U\067\032\377S\066\032\377S\066\032\377S\066\032\377S\066\032\377"
"S\066\032\377S\066\032\377S\066\032\377S\066\032\377S\066\032\377S\066\032\377S\066\032"
"\377Q\064\031\377R\065\032\377R\065\032\377S\066\032\377S\065\032\377R\065\032\377Q\064"
"\031\377P\064\031\377P\064\031\377Q\064\031\377P\064\031\377Q\064\031\377Q\064\031\377"
"Q\064\031\377Q\064\031\377Q\064\031\377R\065\032\377Q\064\031\377O\063\030\377='\022\377"
"\065\"\020\373\004\003\001\000J\061\031\334A*\024\377L\061\030\377N\063\030\377V\070\033\377"
"U\066\032\377S\066\032\377U\067\032\377S\066\032\377S\066\032\377S\066\032\377S\066\032"
"\377S\066\032\377S\066\032\377S\066\032\377S\066\032\377S\066\032\377S\066\032\377S\066"
"\032\377Q\064\031\377R\065\032\377R\065\032\377S\066\032\377S\065\032\377R\065\032\377"
"Q\064\031\377P\064\031\377P\064\031\377Q\064\031\377P\064\031\377Q\064\031\377Q\064\031"
"\377Q\064\031\377Q\064\031\377Q\064\031\377R\065\032\377Q\064\031\377S\066\032\377I/"
"\027\377\065\"\020\376",
};
static const char tempOrngDn[] = {
"\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000"
"\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000"
"\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000"
"\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000"
"\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000\004\003\001\000>(\024&>(\024\331>(\024\235"
">(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235"
">(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235"
">(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235"
">(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235>(\024\235"
">(\024\235>(\024\235>(\024\235\004\003\001\000\004\003\001\000\004\003\001\000eC!\377_@\036\377\217_"
"/\377\212\\.\377\217_/\377\213].\377\215^.\377\211[-\377\217_/\377\214]."
"\377\221`\060\377\213].\377\212\\-\377\216_/\377\216^/\377\222a\060\377\212"
"\\-\377\214].\377\211[-\377\213\\.\377\216_/\377\216^/\377\215^/\377\215"
"^/\377\213].\377\212\\-\377\220`/\377\212\\.\377\211[-\377\215^/\377\216"
"_/\377\212\\-\377\210Z-\377\213\\.\377\222a\060\377\221`\060\377\215^/\377"
"\212\\-\377\217_/\360\004\003\001\000\004\003\001\000a?\037\377K\066\"\377uX;\377}^A\377|]"
">\377}^A\377}^A\377|]=\377|]?\377|]?\377}^A\377|]?\377|]?\377}_A\377}_B\377"
"}^@\377|]>\377}^?\377}^A\377|\\=\377|]?\377}^@\377}^?\377}_A\377}^@\377|"
"\\=\377}^@\377|]=\377}^@\377|]?\377|]>\377}^@\377}^@\377}^@\377|\\=\377}"
"^@\377}^@\377pJ$\375jF!\313>(\024+\004\003\001\000_>\036\377vY=\377\264~G\377\265|"
"E\377\266\177I\377\265|E\377\267\201K\377\266\177H\377\264|D\377\266~G\377"
"\270\202M\377\264{D\377\266~G\377\266\177H\377\265|E\377\264{D\377\266\177"
"I\377\263zA\377\265~G\377\265|E\377\265~G\377\264{C\377\267\200J\377\266"
"\177G\377\265|E\377\264{B\377\266\177H\377\266~G\377\266\177I\377\266\177"
"I\377\265|E\377\264{B\377\265|E\377\266\177I\377\267\201K\377\265|E\377\265"
"~G\377\261w<\377\245m\066\360>(\024\036\004\003\001\000_>\036\377\204cC\377\301\201B"
"\377\270z=\377\270z=\377\300\200A\377\265y<\377\266y<\377\301\202C\377\265"
"x<\377\271{=\377\271{=\377\267y<\377\275~>\377\300\200@\377\273}>\377\267"
"z<\377\273}>\377\266y<\377\300\200@\377\272{=\377\265y<\377\272|=\377\264"
"x;\377\300\200@\377\300\201A\377\276\177?\377\261v:\377\301\202C\377\267"
"z<\377\275~>\377\267z<\377\267z<\377\275~>\377\267z<\377\267z<\377\301\201"
"B\377\275}>\377\237j\064\377\065\"\020\262\004\003\001\000^>\036\377\204cB\377\267y<"
"\377\276~?\377\261u:\377\267y<\377\271{=\377\273|>\377\276~?\377\275~>\377"
"\266y<\377\274}>\377\275~>\377\265y<\377\275~>\377\262v;\377\270{=\377\267"
"z<\377\267y<\377\276~?\377\265y<\377\273}>\377\300\200@\377\276\177?\377"
"\263w;\377\270z=\377\275~>\377\265y<\377\270z=\377\272|=\377\266y<\377\275"
"~>\377\272|=\377\272|=\377\270z=\377\264x;\377\273|>\377\276~?\377\232f\063"
"\377\065\"\020\262\004\003\001\000^>\036\377\205eE\377\301\203D\377\274}>\377\267y<"
"\377\300\200A\377\271{=\377\273|>\377\277\177?\377\264x<\377\266y<\377\272"
"{=\377\275~>\377\260u:\377\267y<\377\300\200@\377\300\200A\377\275}>\377"
"\267y<\377\270z=\377\264x;\377\276~?\377\265x<\377\275~>\377\272|=\377\276"
"~?\377\300\200@\377\271{=\377\272{=\377\270{=\377\263w;\377\276~?\377\272"
"{=\377\262v;\377\263w;\377\300\200A\377\267y<\377\274}>\377\234h\064\377\065"
"\"\020\262\004\003\001\000_>\036\377\204cC\377\301\202C\377\273|>\377\262v;\377\267"
"y<\377\301\201B\377\274}>\377\274}>\377\277\177?\377\300\201A\377\270z=\377"
"\267y<\377\301\201B\377\275~>\377\272|=\377\274}>\377\266y<\377\271{=\377"
"\271{=\377\274}>\377\300\200@\377\277\177?\377\275}>\377\273|>\377\273|>"
"\377\275~>\377\276~?\377\271{=\377\301\201B\377\271{=\377\271{=\377\277\177"
"?\377\301\201B\377\274}>\377\261u:\377\301\202C\377\301\201B\377\231f\063"
"\377\065\"\020\262\004\003\001\000_>\036\377\205dD\377\303\206I\377\271{=\377\265x<"
"\377\272|=\377\275~>\377\273}>\377\301\202C\377\277\177?\377\272|=\377\265"
"x<\377\266y<\377\264x;\377\273|>\377\274}>\377\272{=\377\274}>\377\266y<"
"\377\267z<\377\271{=\377\266y<\377\271{=\377\267z<\377\264x;\377\275}>\377"
"\266y<\377\274}>\377\301\201B\377\277\177?\377\272|=\377\262v;\377\301\201"
"B\377\300\201A\377\273|>\377\276~?\377\301\201B\377\264x<\377\243m\066\377"
"\065\"\020\262\004\003\001\000_>\036\377\204cC\377\302\204F\377\267z<\377\263w;\377"
"\265x<\377\267z<\377\262v;\377\265y<\377\300\200A\377\277\177?\377\274}>"
"\377\277\177?\377\270z=\377\262v;\377\300\200@\377\272|>\377\261v:\377\267"
"y<\377\266y<\377\301\201B\377\272|=\377\267z<\377\272{=\377\271{=\377\270"
"z=\377\272|=\377\274}>\377\266y<\377\300\200@\377\270{=\377\267y<\377\274"
"}>\377\275}>\377\274}>\377\271{=\377\275}>\377\274}>\377\236i\064\377\065\""
"\020\262\004\003\001\000_>\037\377\204cC\377\300\200@\377\301\201B\377\277\177?\377"
"\276~?\377\266y<\377\275}>\377\271{=\377\267y<\377\273|>\377\264x;\377\274"
"}>\377\276~?\377\271{=\377\267y<\377\274}>\377\267y<\377\265x<\377\275}>"
"\377\267y<\377\300\201A\377\276~?\377\267y<\377\264x;\377\276~?\377\301\202"
"C\377\271{=\377\270z=\377\272|=\377\275~>\377\266y<\377\272|>\377\271{=\377"
"\300\200@\377\300\200@\377\267z<\377\274}>\377\237j\064\377\065\"\020\262\004"
"\003\001\000_>\036\377\205eE\377\274}>\377\261u:\377\267y<\377\267y<\377\272{=\377"
"\276~?\377\271{=\377\266y<\377\271{=\377\272|>\377\300\200A\377\271{=\377"
"\273|>\377\265y<\377\264x<\377\300\200@\377\271{=\377\262v;\377\262w;\377"
"\264x<\377\301\201B\377\274}>\377\272|=\377\265x<\377\300\200@\377\271{="
"\377\301\203D\377\265x<\377\277\177?\377\301\202C\377\274}>\377\276~?\377"
"\264x;\377\271{=\377\271{=\377\272|=\377\235i\064\377\065\"\020\262\004\003\001\000"
"_>\036\377\204cC\377\267z<\377\271{=\377\300\200@\377\267z<\377\271{=\377"
"\262v;\377\276~?\377\263w;\377\265x<\377\266y<\377\272|=\377\300\177?\377"
"\274}>\377\266y<\377\300\200@\377\267y<\377\275~>\377\275}>\377\276~?\377"
"\266y<\377\275}>\377\300\177?\377\263w;\377\266y<\377\270z=\377\263w;\377"
"\264x<\377\274}>\377\277\177?\377\271{=\377\300\200@\377\277\177?\377\271"
"{=\377\300\201A\377\273|>\377\266y<\377\250p\067\377\065\"\020\262\004\003\001\000^"
">\036\377\204cB\377\277\177?\377\300\200@\377\275}>\377\270z=\377\267y<\377"
"\275~>\377\271{=\377\266y<\377\271{=\377\274}>\377\271{=\377\263w;\377\260"
"u:\377\277\177?\377\262w;\377\275}>\377\273|>\377\301\201B\377\262v;\377"
"\267y<\377\272|>\377\267y<\377\274}>\377\273|>\377\300\200A\377\267z<\377"
"\265y<\377\275}>\377\266y<\377\271{=\377\262v;\377\273|>\377\271{=\377\300"
"\200@\377\274}>\377\274}>\377\243l\066\377\065\"\020\262\004\003\001\000]>\036\377\203"
"a@\377\267z<\377\267z<\377\266y<\377\264x;\377\266y<\377\266y<\377\300\200"
"A\377\272|>\377\271{=\377\272|=\377\273}>\377\274}>\377\273|>\377\272|=\377"
"\301\201B\377\276~?\377\265y<\377\265x<\377\270z=\377\266y<\377\262v;\377"
"\267z<\377\264x;\377\301\202C\377\274}>\377\266y<\377\265x<\377\301\202C"
"\377\265y<\377\267y<\377\274}>\377\263w;\377\270{=\377\263w;\377\266y<\377"
"\275~>\377\242l\066\377\065\"\020\262\004\003\001\000^>\036\377\204bB\377\271{=\377\267"
"y<\377\267y<\377\274}>\377\274}>\377\266y<\377\274}>\377\273|>\377\276~?"
"\377\277\177?\377\266y<\377\301\202C\377\274}>\377\274}>\377\261v:\377\275"
"~>\377\267z<\377\273|>\377\265x<\377\264x<\377\274}>\377\271{=\377\274}>"
"\377\274}>\377\266y<\377\274}>\377\274}>\377\300\201A\377\301\202C\377\276"
"~?\377\275~>\377\273|>\377\276~?\377\261v;\377\266y<\377\276~?\377\232f\063"
"\377\065\"\020\262\004\003\001\000^>\036\377\204b@\377\277\177?\377\263w;\377\272|="
"\377\267y<\377\270z=\377\266y<\377\300\200@\377\267z<\377\277\177?\377\300"
"\200@\377\276~?\377\274}>\377\272|=\377\275~>\377\275}>\377\273|>\377\270"
"z=\377\277\177?\377\266y<\377\265x<\377\264x;\377\267z<\377\267y<\377\267"
"z=\377\274}>\377\275}>\377\272|=\377\271{=\377\275}>\377\270z=\377\265x<"
"\377\275}>\377\267y<\377\266y<\377\274}>\377\274}>\377\240j\065\377\065\"\020"
"\262\004\003\001\000^>\036\377\203`>\377\300\201A\377\300\200@\377\265x<\377\276~"
"?\377\267z<\377\274}>\377\271{=\377\267y<\377\265x<\377\274}>\377\276~?\377"
"\272|=\377\276~?\377\274}>\377\263w;\377\266y<\377\274}>\377\267z=\377\266"
"y<\377\272|=\377\275}>\377\274}>\377\272|>\377\265x<\377\273|>\377\275}>"
"\377\267z<\377\300\201A\377\271{=\377\266y<\377\275~>\377\274}>\377\300\200"
"@\377\270{=\377\301\201B\377\266y<\377\243l\066\377\065\"\020\262\004\003\001\000]>"
"\036\377\204cB\377\270z=\377\263w;\377\275}>\377\267y<\377\277\177?\377\277"
"\177?\377\267z<\377\274}>\377\277\177?\377\267y<\377\274}>\377\300\200A\377"
"\273|>\377\276~?\377\274}>\377\272|=\377\277\177?\377\272|=\377\272|=\377"
"\264w;\377\300\200@\377\274}>\377\271{=\377\266y<\377\271{=\377\273|>\377"
"\273|>\377\271{=\377\272|=\377\275~>\377\270z=\377\270z=\377\266y<\377\300"
"\200@\377\273|>\377\266y<\377\242l\065\377\065\"\020\262\004\003\001\000]>\036\377\204"
"b@\377\275~?\377\271{=\377\275}>\377\271{=\377\260u:\377\271{=\377\274}>"
"\377\274}>\377\267z<\377\262w;\377\300\200@\377\274}>\377\266y<\377\274}"
">\377\277\177?\377\275~>\377\300\177?\377\272|=\377\266y<\377\273|>\377\274"
"}>\377\271{=\377\266y<\377\275~>\377\274}>\377\300\200@\377\272|=\377\275"
"}>\377\267y<\377\274}>\377\272{=\377\277\177?\377\270z=\377\277\177?\377"
"\265x<\377\277\177?\377\244m\066\377\065\"\020\262\004\003\001\000^>\036\377\205eD\377"
"\301\201B\377\272|=\377\300\177?\377\265x<\377\267z<\377\271{=\377\271{="
"\377\271{=\377\274}>\377\267z<\377\275~>\377\300\201A\377\271{=\377\265y"
"<\377\272|>\377\263w;\377\300\200A\377\271{=\377\275~>\377\274}>\377\271"
"{=\377\300\200A\377\264x;\377\266y<\377\274}>\377\267z<\377\272|=\377\267"
"z<\377\273|>\377\272|=\377\271{=\377\267y<\377\271{=\377\273|>\377\274}>"
"\377\276\177?\377\242l\065\377\065\"\020\262\004\003\001\000^>\036\377\204cC\377\265"
"x<\377\266y<\377\272|=\377\262v;\377\273}>\377\271{=\377\301\203D\377\271"
"{=\377\300\201A\377\270z=\377\273|>\377\267y<\377\267z<\377\266y<\377\301"
"\201B\377\272|=\377\270z=\377\265y<\377\272|=\377\263w;\377\266y<\377\274"
"}>\377\275~>\377\275}>\377\272|>\377\261u:\377\271{=\377\275~>\377\275~>"
"\377\266y<\377\271{=\377\263w;\377\300\200@\377\266y<\377\277\177?\377\276"
"~?\377\235h\064\377\065\"\020\262\004\003\001\000^>\036\377\204bB\377\275~?\377\270{"
"=\377\277\177?\377\263w;\377\300\200@\377\274}>\377\267y<\377\301\202C\377"
"\267z<\377\271{=\377\276~?\377\266y<\377\274}>\377\262v;\377\300\200A\377"
"\266y<\377\270z=\377\267z<\377\272|=\377\270z=\377\277\177?\377\266y<\377"
"\301\202C\377\266y<\377\272{=\377\274}>\377\276~?\377\274}>\377\270z=\377"
"\267z<\377\264x<\377\266y<\377\265y<\377\262v;\377\271{=\377\301\202D\377"
"\237j\064\377\065\"\020\262\004\003\001\000^>\036\377\204b@\377\301\202C\377\274}>\377"
"\274}>\377\276~?\377\271{=\377\271{=\377\276~?\377\301\201B\377\300\200@"
"\377\277\177?\377\273|>\377\273|>\377\271{=\377\265y<\377\274}>\377\276~"
"?\377\273|>\377\275~>\377\300\200?\377\277\177?\377\300\200@\377\262v;\377"
"\301\202C\377\263w;\377\275~>\377\266y<\377\263w;\377\266y<\377\266y<\377"
"\277\177?\377\261v:\377\267z<\377\275}>\377\274}>\377\267z<\377\300\200@"
"\377\237j\064\377\065\"\020\262\004\003\001\000_>\036\377\204bB\377\271{=\377\302\203"
"E\377\274}>\377\275~>\377\266y<\377\264x;\377\274}>\377\264x;\377\274}>\377"
"\300\177?\377\266y<\377\270z=\377\266y<\377\271{=\377\300\200?\377\277\177"
"?\377\262v;\377\275~>\377\263w;\377\271{=\377\275}>\377\276~?\377\274}>\377"
"\267z<\377\272|>\377\274}>\377\302\203E\377\271{=\377\271{=\377\277\177?"
"\377\272|=\377\261v:\377\275~>\377\264x;\377\267y<\377\301\201B\377\235i"
"\064\377\065\"\020\262\004\003\001\000^>\036\377nQ\064\377\303\205H\377\266y<\377\274"
"}>\377\274}>\377\270z=\377\273|>\377\270{=\377\276~?\377\273}>\377\266y<"
"\377\275~>\377\302\203E\377\274}>\377\276~?\377\276~?\377\276\177?\377\266"
"y<\377\267z<\377\271{=\377\274}>\377\300\200A\377\274}>\377\276~?\377\271"
"{=\377\264x;\377\266y<\377\276\177?\377\300\200@\377\276~?\377\276~?\377"
"\302\203E\377\275~>\377\265y<\377\266y<\377\275~>\377\276\177?\377\240j\065"
"\377\065\"\020\262\004\003\001\000L\062\030\377>(\024\377\302\204F\377\263w;\377\300\201"
"A\377\300\200@\377\274}>\377\271{=\377\273}>\377\300\201A\377\266y<\377\267"
"y<\377\272|=\377\300\201A\377\301\202B\377\273}>\377\300\200@\377\300\200"
"@\377\273|>\377\276~?\377\300\200@\377\276~?\377\272|=\377\270{=\377\300"
"\201A\377\277\177?\377\274}>\377\266y<\377\301\201B\377\273}>\377\270z=\377"
"\274}>\377\274}>\377\275~>\377\300\200@\377\301\202C\377\301\202B\377\264"
"x;\377\241k\065\377\065\"\020\262\004\003\001\000fC!\377cA\040\377\233g\063\377\215^."
"\377\214].\377\215^/\377\216^/\377\207Z-\377\206Y,\377\201V+\377\214].\377"
"\207Z-\377\204X,\377\210Z-\377\216_/\377\233g\063\377\223b\061\377\222a\060"
"\377\226d\062\377\214].\377\210[-\377\210Z-\377\215^/\377\224c\061\377\225"
"c\061\377\230e\062\377\224b\061\377\227e\062\377\225c\061\377\231f\062\377\227"
"d\062\377\230e\062\377\223b\061\377\224b\061\377\223b\061\377\232g\063\377\231"
"f\062\377\216_/\377\211[-\377\065\"\020\262\004\003\001\000V\071\035\177F-\026\377P\063"
"\031\377cA\037\377gC!\377eA\040\377cA\040\377eB\040\377cA\037\377b@\037\377c@\037"
"\377cA\037\377c@\037\377c@\037\377c@\037\377b@\037\377b@\037\377c@\037\377c@\037"
"\377_>\036\377a?\037\377a?\037\377c@\037\377b?\037\377a?\037\377`>\036\377^>\036"
"\377^>\036\377_>\036\377^>\036\377`>\036\377`>\036\377`>\036\377`>\036\377`>\036"
"\377a?\037\377`>\036\377c@\037\377Y:\034\377\065\"\020\324",
};
const char* Artwork::orngBtnUp = (const char*)tempOrngUp;
const char* Artwork::orngBtnDn = (const char*)tempOrngDn;

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;

499
plugin/parameters.cpp Normal file
View File

@ -0,0 +1,499 @@
/*
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) {
parameter.ranges.min = 0.0f;
parameter.ranges.max = 127.0f;
parameter.hints = kParameterIsAutomatable;
parameter.ranges.def = 0.0f;
switch (index) {
case pLFORate:
parameter.name = "LFO Rate";
parameter.symbol = "ch_lforate";
parameter.midiCC = 3;
break;
case pLFODelay:
parameter.hints = kParameterIsAutomatable;
parameter.name = "LFO Delay";
parameter.symbol = "ch_lfodelay";
parameter.midiCC = 9;
break;
case pVCORange:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.name = "Range";
parameter.symbol = "ch_vcorange";
parameter.ranges.max = 2.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.midiCC = 13;
break;
case pPWMDepth:
parameter.hints = kParameterIsAutomatable;
parameter.name = "PWM";
parameter.symbol = "ch_pwm";
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.max = 1.0f;
parameter.midiCC = 17;
break;
case pSqr:
parameter.hints = kParameterIsAutomatable | kParameterIsBoolean;
parameter.name = "Square";
parameter.symbol = "ch_sqr";
parameter.ranges.max = 1.0f;
parameter.midiCC = 16;
break;
case pSubLevel:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Sub Osc";
parameter.symbol = "ch_sub";
parameter.midiCC = 18;
break;
case pNoiseLevel:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Noise";
parameter.symbol = "ch_noise";
parameter.midiCC = 19;
break;
case pHPF:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.name = "HPF";
parameter.symbol = "ch_hpf";
parameter.ranges.max = 4.0f;
parameter.midiCC = 20;
break;
case pCutoff:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Freq";
parameter.symbol = "ch_freq";
parameter.midiCC = 74;
break;
case pRes:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Res";
parameter.symbol = "ch_reso";
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.midiCC = 22;
break;
case pLfo:
parameter.hints = kParameterIsAutomatable;
parameter.name = "LFO";
parameter.symbol = "ch_vcflfo";
parameter.midiCC = 23;
break;
case pKyb:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Kybd";
parameter.symbol = "ch_vcfkey";
parameter.midiCC = 24;
break;
case pAtk:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Attack";
parameter.symbol = "ch_attack";
parameter.midiCC = 73;
break;
case pDcy:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Decay";
parameter.symbol = "ch_decay";
parameter.midiCC = 75;
break;
case pStn:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Sustain";
parameter.symbol = "ch_sustain";
parameter.midiCC = 27;
break;
case pRls:
parameter.hints = kParameterIsAutomatable;
parameter.name = "Release";
parameter.symbol = "ch_release";
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.midiCC = 26;
break;
case pChorus:
parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.name = "Chorus Mode";
parameter.symbol = "ch_chorus";
parameter.ranges.max = 2.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;
}

File diff suppressed because it is too large Load Diff

View File

@ -2,18 +2,29 @@
namespace Artwork { namespace Artwork {
extern const char *orngBtnUp;
extern const char *orngBtnDn;
const unsigned int orngBtnSize = 41 * 30 * 4;
const unsigned int orngBtnWidth = 41;
const unsigned int orngBtnHeight = 30;
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 *orangeData;
extern const char *greenData; extern const char *greenData;
extern const char *blueData; extern const char *blueData;
extern const char *whiteData; 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 sliderWidth = 41;
const unsigned int sliderHeight = 26; const unsigned int sliderHeight = 26;
extern const char *backgroundData; 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 backgroundWidth = 700;
const unsigned int backgroundHeight = 400; const unsigned int backgroundHeight = 400;
} // namespace Artwork } // namespace Artwork

View File

@ -7,8 +7,17 @@ START_NAMESPACE_DISTRHO
namespace Art = Artwork; namespace Art = Artwork;
void prepSlider(ImageSlider* s, uint id, int x, int y) {
s->setId(id);
s->setStartPos(x, y);
s->setEndPos(x, y + 79); // 80px high
s->setInverted(true);
s->setRange(0, 127.0f);
}
DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundHeight, true), 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); Image orangeSlider(Art::orangeData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA);
@ -17,125 +26,119 @@ DistrhoUIchassis::DistrhoUIchassis() : UI(Art::backgroundWidth, Art::backgroundH
Image whiteSlider(Art::whiteData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA); Image whiteSlider(Art::whiteData, Art::sliderWidth, Art::sliderHeight, kImageFormatRGBA);
xSliderLFORate = new ImageSlider(this, orangeSlider); xSliderLFORate = new ImageSlider(this, orangeSlider);
xSliderLFORate->setId(Chassis::pLFORate); prepSlider(xSliderLFORate, pLFORate, 46, 72);
xSliderLFORate->setStartPos(50, 72);
xSliderLFORate->setEndPos(50, 151);
xSliderLFORate->setRange(0, 127.0f);
xSliderLFORate->setCallback(this); xSliderLFORate->setCallback(this);
xSliderLFODelay = new ImageSlider(this, orangeSlider); xSliderLFODelay = new ImageSlider(this, orangeSlider);
xSliderLFODelay->setId(Chassis::pLFODelay); prepSlider(xSliderLFODelay, pLFODelay, 84, 72);
xSliderLFODelay->setStartPos(92, 72);
xSliderLFODelay->setEndPos(92, 151);
xSliderLFODelay->setRange(0, 127.0f);
xSliderLFODelay->setCallback(this); xSliderLFODelay->setCallback(this);
xSliderLFODepth = new ImageSlider(this, greenSlider); xSliderLFODepth = new ImageSlider(this, greenSlider);
xSliderLFODepth->setId(Chassis::pLFODepth); prepSlider(xSliderLFODepth, pLFODepth, 290, 72);
xSliderLFODepth->setStartPos(292, 72);
xSliderLFODepth->setEndPos(292, 151);
xSliderLFODepth->setRange(0, 127.0f);
xSliderLFODepth->setCallback(this); xSliderLFODepth->setCallback(this);
xSliderPWMDepth = new ImageSlider(this, greenSlider); xSliderPWMDepth = new ImageSlider(this, greenSlider);
xSliderPWMDepth->setId(Chassis::pPWMDepth); prepSlider(xSliderPWMDepth, pPWMDepth, 329, 72);
xSliderPWMDepth->setStartPos(331, 72);
xSliderPWMDepth->setEndPos(331, 151);
xSliderPWMDepth->setRange(0, 127.0f);
xSliderPWMDepth->setCallback(this); xSliderPWMDepth->setCallback(this);
xSliderSubLevel = new ImageSlider(this, greenSlider); xSliderSubLevel = new ImageSlider(this, greenSlider);
xSliderSubLevel->setId(Chassis::pSubLevel); prepSlider(xSliderSubLevel, pSubLevel, 510, 72);
xSliderSubLevel->setStartPos(518, 72);
xSliderSubLevel->setEndPos(518, 151);
xSliderSubLevel->setRange(0, 127.0f);
xSliderSubLevel->setCallback(this); xSliderSubLevel->setCallback(this);
xSliderNoiseLevel = new ImageSlider(this, greenSlider); xSliderNoiseLevel = new ImageSlider(this, greenSlider);
xSliderNoiseLevel->setId(Chassis::pNoiseLevel); prepSlider(xSliderNoiseLevel, pNoiseLevel, 551, 72);
xSliderNoiseLevel->setStartPos(560, 72);
xSliderNoiseLevel->setEndPos(560, 151);
xSliderNoiseLevel->setRange(0, 127.0f);
xSliderNoiseLevel->setCallback(this); xSliderNoiseLevel->setCallback(this);
xSliderHPF = new ImageSlider(this, blueSlider); xSliderHPF = new ImageSlider(this, blueSlider);
xSliderHPF->setId(Chassis::pHPF); prepSlider(xSliderHPF, pHPF, 618, 72);
xSliderHPF->setStartPos(619, 72);
xSliderHPF->setEndPos(619, 151);
xSliderHPF->setRange(0, 3.0f);
xSliderHPF->setStep(1); xSliderHPF->setStep(1);
xSliderHPF->setRange(0, 3);
xSliderHPF->setCallback(this); xSliderHPF->setCallback(this);
xSliderCutoff = new ImageSlider(this, blueSlider); xSliderCutoff = new ImageSlider(this, blueSlider);
xSliderCutoff->setId(Chassis::pCutoff); prepSlider(xSliderCutoff, pCutoff, 26, 261);
xSliderCutoff->setStartPos(21, 261);
xSliderCutoff->setEndPos(21, 340);
xSliderCutoff->setRange(0, 127.0f);
xSliderCutoff->setCallback(this); xSliderCutoff->setCallback(this);
xSliderRes = new ImageSlider(this, blueSlider); xSliderRes = new ImageSlider(this, blueSlider);
xSliderRes->setId(Chassis::pRes); prepSlider(xSliderRes, pRes, 65, 261);
xSliderRes->setStartPos(60, 261);
xSliderRes->setEndPos(60, 340);
xSliderRes->setRange(0, 127.0f);
xSliderRes->setCallback(this); xSliderRes->setCallback(this);
xSliderEnv = new ImageSlider(this, blueSlider); xSliderEnv = new ImageSlider(this, blueSlider);
xSliderEnv->setId(Chassis::pEnv); prepSlider(xSliderEnv, pEnv, 149, 261);
xSliderEnv->setStartPos(144, 261);
xSliderEnv->setEndPos(144, 340);
xSliderEnv->setRange(0, 127.0f);
xSliderEnv->setCallback(this); xSliderEnv->setCallback(this);
xSliderLfo = new ImageSlider(this, blueSlider); xSliderLfo = new ImageSlider(this, blueSlider);
xSliderLfo->setId(Chassis::pLfo); prepSlider(xSliderLfo, pLfo, 189, 261);
xSliderLfo->setStartPos(183, 261);
xSliderLfo->setEndPos(183, 340);
xSliderLfo->setRange(0, 127.0f);
xSliderLfo->setCallback(this); xSliderLfo->setCallback(this);
xSliderKyb = new ImageSlider(this, blueSlider); xSliderKyb = new ImageSlider(this, blueSlider);
xSliderKyb->setId(Chassis::pKyb); prepSlider(xSliderKyb, pKyb, 228, 261);
xSliderKyb->setStartPos(222, 261);
xSliderKyb->setEndPos(222, 340);
xSliderKyb->setRange(0, 127.0f);
xSliderKyb->setCallback(this); xSliderKyb->setCallback(this);
xSliderVCALevel = new ImageSlider(this, whiteSlider); xSliderVCALevel = new ImageSlider(this, whiteSlider);
xSliderVCALevel->setId(Chassis::pVCALevel); prepSlider(xSliderVCALevel, pVCALevel, 319, 261);
xSliderVCALevel->setStartPos(314, 261);
xSliderVCALevel->setEndPos(314, 340);
xSliderVCALevel->setRange(0, 127.0f);
xSliderVCALevel->setCallback(this); xSliderVCALevel->setCallback(this);
xSliderAtk = new ImageSlider(this, whiteSlider); xSliderAtk = new ImageSlider(this, whiteSlider);
xSliderAtk->setId(Chassis::pAtk); prepSlider(xSliderAtk, pVCALevel, 385, 261);
xSliderAtk->setStartPos(375, 261);
xSliderAtk->setEndPos(375, 340);
xSliderAtk->setRange(0, 127.0f);
xSliderAtk->setCallback(this); xSliderAtk->setCallback(this);
xSliderDcy = new ImageSlider(this, whiteSlider); xSliderDcy = new ImageSlider(this, whiteSlider);
xSliderDcy->setId(Chassis::pDcy); prepSlider(xSliderDcy, pDcy, 425, 261);
xSliderDcy->setStartPos(414, 261);
xSliderDcy->setEndPos(414, 340);
xSliderDcy->setRange(0, 127.0f);
xSliderDcy->setCallback(this); xSliderDcy->setCallback(this);
xSliderStn = new ImageSlider(this, whiteSlider); xSliderStn = new ImageSlider(this, whiteSlider);
xSliderStn->setId(Chassis::pStn); prepSlider(xSliderStn, pStn, 465, 261);
xSliderStn->setStartPos(454, 261);
xSliderStn->setEndPos(454, 340);
xSliderStn->setRange(0, 127.0f);
xSliderStn->setCallback(this); xSliderStn->setCallback(this);
xSliderRls = new ImageSlider(this, whiteSlider); xSliderRls = new ImageSlider(this, whiteSlider);
xSliderRls->setId(Chassis::pRls); prepSlider(xSliderRls, pRls, 505, 261);
xSliderRls->setStartPos(493, 261);
xSliderRls->setEndPos(493, 340);
xSliderRls->setRange(0, 127.0f);
xSliderRls->setCallback(this); xSliderRls->setCallback(this);
xBtn16ft = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA));
xBtn16ft->setAbsolutePos(149, 104);
xBtn16ft->setId(btn16);
xBtn16ft->setCallback(this);
xBtn8ft = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA));
xBtn8ft->setAbsolutePos(190, 104);
xBtn8ft->setId(btn8);
xBtn8ft->setCallback(this);
xBtn4ft = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA));
xBtn4ft->setAbsolutePos(231, 104);
xBtn4ft->setId(btn4);
xBtn4ft->setCallback(this);
// waveform
xBtnPls = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA));
xBtnPls->setAbsolutePos(414, 104);
xBtnPls->setId(btnPls);
xBtnPls->setCallback(this);
xBtnSaw = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA));
xBtnSaw->setAbsolutePos(455, 104);
xBtnSaw->setId(btnSaw);
xBtnSaw->setCallback(this);
// Chorus
xBtnCh0 = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA));
xBtnCh0->setAbsolutePos(562, 293);
xBtnCh0->setId(btnCh0);
xBtnCh0->setCallback(this);
xBtnCh1 = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA));
xBtnCh1->setAbsolutePos(603, 293);
xBtnCh1->setId(btnCh1);
xBtnCh1->setCallback(this);
xBtnCh2 = new ImageButton(this, Image(Art::orngBtnUp, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA),
Image(Art::orngBtnDn, Art::orngBtnWidth, Art::orngBtnHeight, kImageFormatRGBA));
xBtnCh2->setAbsolutePos(644, 293);
xBtnCh2->setId(btnCh2);
xBtnCh2->setCallback(this);
programLoaded(0); programLoaded(0);
} }
@ -144,42 +147,95 @@ DistrhoUIchassis::~DistrhoUIchassis() {
} }
void DistrhoUIchassis::programLoaded(uint32_t index) { void DistrhoUIchassis::programLoaded(uint32_t index) {
printf("in programLoaded %d\n", index);
switch (index) { switch (index) {
case Chassis::pLFORate: case pLFORate:
xSliderLFORate->setValue(0.5); xSliderLFORate->setValue(0.5);
printf("set lforate\n");
break; break;
case Chassis::pLFODelay: case pLFODelay:
xSliderLFODelay->setValue(0.5); xSliderLFODelay->setValue(0.5);
printf("set lfoDelay\n");
break; break;
} }
} }
void DistrhoUIchassis::parameterChanged(uint32_t index, float value) { void DistrhoUIchassis::parameterChanged(uint32_t index, float value) {
printf("in parameterchanged %d %f\n", index, value); switch (index) {
case pLFORate:
switch(index) { xSliderLFORate->setValue(value);
case Chassis::pLFORate: xSliderLFORate->setValue(value); break; break;
case Chassis::pLFODelay: xSliderLFODelay->setValue(value); break; case pLFODelay:
case Chassis::pLFODepth: xSliderLFODepth->setValue(value); break; xSliderLFODelay->setValue(value);
case Chassis::pPWMDepth: xSliderPWMDepth->setValue(value); break; break;
case Chassis::pSubLevel: xSliderSubLevel->setValue(value); break; case pLFODepth:
case Chassis::pNoiseLevel: xSliderNoiseLevel->setValue(value); break; xSliderLFODepth->setValue(value);
case Chassis::pHPF: xSliderHPF->setValue(value); break; break;
case Chassis::pCutoff: xSliderCutoff->setValue(value); break; case pPWMDepth:
case Chassis::pRes: xSliderRes->setValue(value); break; xSliderPWMDepth->setValue(value);
case Chassis::pEnv: xSliderEnv->setValue(value); break; break;
case Chassis::pLfo: xSliderLfo->setValue(value); break; case pSubLevel:
case Chassis::pKyb: xSliderKyb->setValue(value); break; xSliderSubLevel->setValue(value);
case Chassis::pAtk: xSliderAtk->setValue(value); break; break;
case Chassis::pDcy: xSliderDcy->setValue(value); break; case pNoiseLevel:
case Chassis::pStn: xSliderStn->setValue(value); break; xSliderNoiseLevel->setValue(value);
case Chassis::pRls: xSliderRls->setValue(value); break; break;
case pHPF:
xSliderHPF->setValue(value);
break;
case pCutoff:
xSliderCutoff->setValue(value);
break;
case pRes:
xSliderRes->setValue(value);
break;
case pEnv:
xSliderEnv->setValue(value);
break;
case pLfo:
xSliderLfo->setValue(value);
break;
case pKyb:
xSliderKyb->setValue(value);
break;
case pAtk:
xSliderAtk->setValue(value);
break;
case pDcy:
xSliderDcy->setValue(value);
break;
case pStn:
xSliderStn->setValue(value);
break;
case pRls:
xSliderRls->setValue(value);
break;
// now the switches
case pVCORange:
sw1 &= 0xf8; // mask
if (value > 2) value = 2;
sw1 |= (1 << (int)value);
break;
case pSqr:
sw1 &= 0xf7;
sw1 |= ((value >= 0.5)) << 3;
break;
case pSaw:
sw1 &= 0xef;
sw1 |= (value > 0.5) << 4;
break;
case pChorus:
sw1 &= 0x9f;
// 60, 40, 00
switch ((int)value) {
case 0:
sw1 |= 0x60;
break;
case 1:
sw1 |= 0x40;
break;
case 2:
sw1 |= 0x00;
break;
}
} }
} }
void DistrhoUIchassis::imageSliderDragStarted(ImageSlider* slider) { void DistrhoUIchassis::imageSliderDragStarted(ImageSlider* slider) {
@ -191,13 +247,58 @@ void DistrhoUIchassis::imageSliderDragFinished(ImageSlider* slider) {
} }
void DistrhoUIchassis::imageSliderValueChanged(ImageSlider* slider, float value) { void DistrhoUIchassis::imageSliderValueChanged(ImageSlider* slider, float value) {
printf("%f\n", value);
setParameterValue(slider->getId(), value); setParameterValue(slider->getId(), value);
} }
void DistrhoUIchassis::imageButtonClicked(ImageButton* imgBtn, int) {
int id = imgBtn->getId();
// printf("imagebutton %d\n", id);
switch (id) {
case btn16:
sw1 &= 0xf8;
sw1 |= 0x01;
break;
case btn8:
sw1 &= 0xf8;
sw1 |= 0x02;
break;
case btn4:
sw1 &= 0xf8;
sw1 |= 0x04;
break;
case btnPls:
sw1 ^= 0x08;
break;
case btnSaw:
sw1 ^= 0x10;
break;
case btnCh0:
sw1 = (sw1 & 0x1f) | 0x20;
break;
case btnCh1:
sw1 = (sw1 & 0x1f) | 0x40;
break;
case btnCh2:
sw1 = (sw1 & 0x1f);
break;
default:
break;
}
}
void DistrhoUIchassis::onDisplay() { void DistrhoUIchassis::onDisplay() {
const GraphicsContext& context(getGraphicsContext()); const GraphicsContext& context(getGraphicsContext());
fImgBackground.draw(context); 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, 424, 77); // pulse
if (sw1 & 0x10) fImgLedOn.drawAt(context, 464, 77); // saw
if ((sw1 & 0x60) == 0x40) fImgLedOn.drawAt(context, 612, 267); // chorus 1
if ((sw1 & 0x60) == 0x00) fImgLedOn.drawAt(context, 652, 267); // chorus 2
}; };
UI* createUI() { UI* createUI() {

View File

@ -8,7 +8,8 @@
START_NAMESPACE_DISTRHO START_NAMESPACE_DISTRHO
class DistrhoUIchassis : public UI, class DistrhoUIchassis : public UI,
public ImageSlider::Callback { public ImageSlider::Callback,
public ImageButton::Callback {
public: public:
DistrhoUIchassis(); DistrhoUIchassis();
~DistrhoUIchassis() override; ~DistrhoUIchassis() override;
@ -22,13 +23,19 @@ class DistrhoUIchassis : public UI,
void imageSliderDragFinished(ImageSlider* slider) override; void imageSliderDragFinished(ImageSlider* slider) override;
void imageSliderValueChanged(ImageSlider* slider, float value) override; void imageSliderValueChanged(ImageSlider* slider, float value) override;
void imageButtonClicked(ImageButton *imageButton, int button) override;
private: private:
Image fImgBackground; Image fImgBackground;
Image fImgLedOn;
ScopedPointer<ImageSlider> ScopedPointer<ImageSlider>
xSliderLFORate, xSliderLFODelay, xSliderLFORate, xSliderLFODelay,
xSliderLFODepth, xSliderPWMDepth, xSliderSubLevel, xSliderNoiseLevel, xSliderLFODepth, xSliderPWMDepth, xSliderSubLevel, xSliderNoiseLevel,
xSliderHPF, xSliderCutoff, xSliderRes, xSliderEnv, xSliderLfo, xSliderKyb, xSliderHPF, xSliderCutoff, xSliderRes, xSliderEnv, xSliderLfo, xSliderKyb,
xSliderVCALevel, xSliderAtk, xSliderDcy, xSliderStn, xSliderRls; xSliderVCALevel, xSliderAtk, xSliderDcy, xSliderStn, xSliderRls;
ScopedPointer<ImageButton> xBtn16ft, xBtn8ft, xBtn4ft, xBtnPls, xBtnSaw, xBtnCh0, xBtnCh1, xBtnCh2;
uint8_t sw1 = 0, sw2 = 0;
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUIchassis) DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistrhoUIchassis)
// ImageAboutWindow fAboutWindow; // ImageAboutWindow fAboutWindow;
}; };