diff --git a/examples/gain.pd b/examples/gain.pd index ab6906d..8d3b097 100644 --- a/examples/gain.pd +++ b/examples/gain.pd @@ -1,106 +1,108 @@ -#N canvas 2220 331 805 580 12; -#X obj 112 43 adc~ 1 2 3 4 5 6, f 47; -#X obj 113 281 dac~ 1 2 3 4 5 6, f 47; -#X obj 112 127 *~ 1; -#X obj 137 94 r K1; -#X obj 178 126 *~ 1; -#X obj 242 128 *~ 1; -#X obj 308 127 *~ 1; -#X obj 372 127 *~ 1; -#X obj 438 126 *~ 1; -#X obj 203 93 r K2; -#X obj 267 93 r K3; -#X obj 333 94 r K4; -#X obj 397 93 r K5; -#X obj 463 93 r K6; -#X obj 290 502 print toVCV; -#X msg 267 315 L3 \$1 0 0; -#X msg 333 347 L4 \$1 0 0; -#X msg 463 348 L6 \$1 0 0; -#X msg 136 314 L1 \$1 0 0; -#X msg 203 346 L2 \$1 0 0; -#X msg 397 317 L5 \$1 0 0; -#X obj 112 230 *~ 1; -#X obj 178 229 *~ 1; -#X obj 242 231 *~ 1; -#X obj 308 230 *~ 1; -#X obj 372 230 *~ 1; -#X obj 438 229 *~ 1; -#X obj 147 158 r S1; -#X obj 213 157 r S2; -#X obj 277 157 r S3; -#X obj 343 158 r S4; -#X obj 407 157 r S5; -#X obj 473 158 r S6; -#X obj 473 197 - 1; -#X obj 407 196 - 1; -#X obj 343 194 - 1; -#X obj 277 195 - 1; -#X obj 213 196 - 1; -#X obj 147 195 - 1; -#X msg 146 404 S1 \$1 0 0; -#X msg 213 436 S2 \$1 0 0; -#X msg 277 405 S3 \$1 0 0; -#X msg 343 438 S4 \$1 0 0; -#X msg 407 407 S5 \$1 0 0; -#X msg 473 437 S6 \$1 0 0; +#N canvas 1187 297 729 742 12; +#X obj 153 257 adc~ 1 2 3 4 5 6, f 47; +#X obj 153 427 dac~ 1 2 3 4 5 6, f 47; +#X obj 154 297 *~ 1; +#X obj 218 296 *~ 1; +#X obj 282 298 *~ 1; +#X obj 348 297 *~ 1; +#X obj 412 297 *~ 1; +#X obj 478 296 *~ 1; +#X obj 330 663 print toVCV; +#X msg 307 476 L3 \$1 0 0; +#X msg 373 508 L4 \$1 0 0; +#X msg 503 509 L6 \$1 0 0; +#X msg 176 475 L1 \$1 0 0; +#X msg 243 507 L2 \$1 0 0; +#X msg 437 478 L5 \$1 0 0; +#X obj 154 376 *~ 1; +#X obj 218 375 *~ 1; +#X obj 282 377 *~ 1; +#X obj 348 376 *~ 1; +#X obj 412 376 *~ 1; +#X obj 478 375 *~ 1; +#X msg 186 565 S1 \$1 0 0; +#X msg 253 597 S2 \$1 0 0; +#X msg 317 566 S3 \$1 0 0; +#X msg 383 599 S4 \$1 0 0; +#X msg 447 568 S5 \$1 0 0; +#X msg 513 598 S6 \$1 0 0; +#X obj 179 104 r fromVCV; +#X obj 179 143 route K1 K2 K3 K4 K5 K6, f 56; +#X obj 188 198 route S1 S2 S3 S4 S5 S6, f 56; +#X obj 187 341 == 0; +#X obj 253 342 == 0; +#X obj 317 341 == 0; +#X obj 383 340 == 0; +#X obj 447 342 == 0; +#X obj 513 343 == 0; +#X msg 89 622 display \$1 \$2; +#X obj 80 582 pack f f; +#X obj 107 526 t b f; #X connect 0 0 2 0; -#X connect 0 1 4 0; -#X connect 0 2 5 0; -#X connect 0 3 6 0; -#X connect 0 4 7 0; -#X connect 0 5 8 0; -#X connect 2 0 21 0; -#X connect 3 0 2 1; -#X connect 3 0 18 0; -#X connect 4 0 22 0; -#X connect 5 0 23 0; -#X connect 6 0 24 0; -#X connect 7 0 25 0; -#X connect 8 0 26 0; -#X connect 9 0 4 1; -#X connect 9 0 19 0; -#X connect 10 0 5 1; -#X connect 10 0 15 0; -#X connect 11 0 6 1; -#X connect 11 0 16 0; -#X connect 12 0 7 1; -#X connect 12 0 20 0; -#X connect 13 0 8 1; -#X connect 13 0 17 0; -#X connect 15 0 14 0; -#X connect 16 0 14 0; -#X connect 17 0 14 0; -#X connect 18 0 14 0; -#X connect 19 0 14 0; -#X connect 20 0 14 0; -#X connect 21 0 1 0; -#X connect 22 0 1 1; -#X connect 23 0 1 2; -#X connect 24 0 1 3; -#X connect 25 0 1 4; -#X connect 26 0 1 5; -#X connect 27 0 38 0; -#X connect 27 0 39 0; +#X connect 0 1 3 0; +#X connect 0 2 4 0; +#X connect 0 3 5 0; +#X connect 0 4 6 0; +#X connect 0 5 7 0; +#X connect 2 0 15 0; +#X connect 3 0 16 0; +#X connect 4 0 17 0; +#X connect 5 0 18 0; +#X connect 6 0 19 0; +#X connect 7 0 20 0; +#X connect 9 0 8 0; +#X connect 10 0 8 0; +#X connect 11 0 8 0; +#X connect 12 0 8 0; +#X connect 13 0 8 0; +#X connect 14 0 8 0; +#X connect 15 0 1 0; +#X connect 16 0 1 1; +#X connect 17 0 1 2; +#X connect 18 0 1 3; +#X connect 19 0 1 4; +#X connect 20 0 1 5; +#X connect 21 0 8 0; +#X connect 22 0 8 0; +#X connect 23 0 8 0; +#X connect 24 0 8 0; +#X connect 25 0 8 0; +#X connect 26 0 8 0; +#X connect 27 0 28 0; +#X connect 28 0 2 1; +#X connect 28 0 12 0; #X connect 28 0 37 0; -#X connect 28 0 40 0; -#X connect 29 0 36 0; -#X connect 29 0 41 0; -#X connect 30 0 35 0; -#X connect 30 0 42 0; -#X connect 31 0 34 0; -#X connect 31 0 43 0; -#X connect 32 0 33 0; -#X connect 32 0 44 0; -#X connect 33 0 26 1; -#X connect 34 0 25 1; -#X connect 35 0 24 1; -#X connect 36 0 23 1; -#X connect 37 0 22 1; -#X connect 38 0 21 1; -#X connect 39 0 14 0; -#X connect 40 0 14 0; -#X connect 41 0 14 0; -#X connect 42 0 14 0; -#X connect 43 0 14 0; -#X connect 44 0 14 0; +#X connect 28 1 3 1; +#X connect 28 1 13 0; +#X connect 28 1 38 0; +#X connect 28 2 4 1; +#X connect 28 2 9 0; +#X connect 28 3 5 1; +#X connect 28 3 10 0; +#X connect 28 4 6 1; +#X connect 28 4 14 0; +#X connect 28 5 7 1; +#X connect 28 5 11 0; +#X connect 28 6 29 0; +#X connect 29 0 30 0; +#X connect 29 0 21 0; +#X connect 29 1 31 0; +#X connect 29 1 22 0; +#X connect 29 2 32 0; +#X connect 29 2 23 0; +#X connect 29 3 33 0; +#X connect 29 3 24 0; +#X connect 29 4 34 0; +#X connect 29 4 25 0; +#X connect 29 5 35 0; +#X connect 29 5 26 0; +#X connect 30 0 15 1; +#X connect 31 0 16 1; +#X connect 32 0 17 1; +#X connect 33 0 18 1; +#X connect 34 0 19 1; +#X connect 35 0 20 1; +#X connect 36 0 8 0; +#X connect 37 0 36 0; +#X connect 38 0 37 0; +#X connect 38 1 37 1; diff --git a/src/LibPDEngine.cpp b/src/LibPDEngine.cpp index ec06e9b..4f98972 100644 --- a/src/LibPDEngine.cpp +++ b/src/LibPDEngine.cpp @@ -11,6 +11,8 @@ using namespace rack; float g_lights[NUM_ROWS][3] = {}; float g_switchLights[NUM_ROWS][3] = {}; +std::string g_utility[2] = {}; +bool g_display_is_valid = false; std::vector split (const std::string &s, char delim) { std::vector result; @@ -52,6 +54,7 @@ struct LibPDEngine : ScriptEngine { float _input[BUFFERSIZE] = {};// = (float*)malloc(1024*2*sizeof(float)); const static std::map _light_map; const static std::map _switchLight_map; + const static std::map _utility_map; std::string getEngineName() override { return "Pure Data"; @@ -131,6 +134,11 @@ struct LibPDEngine : ScriptEngine { sendSwitch(i, block->switches[i]); } } + + // display + if(g_display_is_valid){ + display(g_utility[1]); + } // process samples in libpd _ticks = 1; libpd_process_float(_ticks, _input, _output); @@ -158,7 +166,7 @@ void LibPDEngine::receiveLights(const char *s) { std::vector atoms = split (str, ' '); if(atoms[0]=="toVCV:"){ - // light list + // parse lights list bool light_is_valid = true; int light_idx = -1; try { @@ -177,7 +185,7 @@ void LibPDEngine::receiveLights(const char *s) { else { // error } - + // parse switch lights list bool switchLight_is_valid = true; int switchLight_idx = -1; try { @@ -196,9 +204,34 @@ void LibPDEngine::receiveLights(const char *s) { else { // error } + + // parse switch lights list + bool utility_is_valid = true; + int utility_idx = -1; + try { + utility_idx = _utility_map.at(atoms[1]); // map::at throws an out-of-range + } + catch (const std::out_of_range& oor) { + utility_is_valid = false; + //g_display_is_valid = true; + //display("Warning:"+atoms[1]+" not found!"); + } + //std::cout << v[1] << ", " << g_led_map[v[1]] << std::endl; + if(utility_is_valid && atoms.size()>=3){ + g_utility[0] = atoms[1]; // display + g_utility[1] = {""}; + for(int i=0; i LibPDEngine::_switchLight_map{ { "S6", 5 } }; +const std::map LibPDEngine::_utility_map{ + { "display", 0 } +}; + + void LibPDEngine::sendKnob(const int idx, const float value){ std::string knob = "K"+std::to_string(idx+1); - libpd_float(knob.c_str(), value); + libpd_start_message(1); + libpd_add_float(value); + libpd_finish_message("fromVCV", knob.c_str()); } void LibPDEngine::sendSwitch(const int idx, const bool value){ std::string sw = "S"+std::to_string(idx+1); - libpd_float(sw.c_str(), value); + libpd_start_message(1); + libpd_add_float(value); + libpd_finish_message("fromVCV", sw.c_str()); } void LibPDEngine::sendInitialStates(const ProcessBlock* block){