aboutsummaryrefslogtreecommitdiff
path: root/controctopus
diff options
context:
space:
mode:
Diffstat (limited to 'controctopus')
-rw-r--r--controctopus/cc-learner.pd146
-rw-r--r--controctopus/constrain-help.pd34
-rw-r--r--controctopus/controctopus-help.pd72
-rw-r--r--controctopus/controctopus-multi-help.pd17
-rw-r--r--controctopus/midi-tentacle-multi.pd254
-rw-r--r--controctopus/midi-tentacle.pd272
-rw-r--r--controctopus/note-learner.pd222
-rw-r--r--controctopus/octomother-help.pd15
-rw-r--r--controctopus/octomother-multi.pd86
-rw-r--r--controctopus/octomother.pd86
-rw-r--r--controctopus/rchannel-multi.pd33
-rw-r--r--controctopus/rchannel.pd24
-rw-r--r--controctopus/tentacle-pager.pd131
13 files changed, 1392 insertions, 0 deletions
diff --git a/controctopus/cc-learner.pd b/controctopus/cc-learner.pd
new file mode 100644
index 0000000..7e692d4
--- /dev/null
+++ b/controctopus/cc-learner.pd
@@ -0,0 +1,146 @@
+#N canvas 730 32 629 668 10;
+#X obj 60 46 nbx 3 14 0 127 0 1 \$0-ccNumber \$0-ccNumberLearn CC 42
+8 0 11 -194624 -1 -1 1 256;
+#X obj 63 64 bng 13 250 50 0 \$0-learnOn \$0nullR empty 0 -6 0 8 -259541
+-1 -1;
+#X obj 353 200 r \$0-ccNumber;
+#X obj 81 67 bng 8 250 50 0 empty \$0lite1 empty 0 -6 0 8 -1 -262085
+-1;
+#X obj 92 67 bng 8 250 50 0 empty \$0lite2 empty 0 -6 0 8 -1 -262085
+-1;
+#X obj 103 67 bng 8 250 50 0 empty \$0lite3 empty 0 -6 0 8 -1 -262085
+-1;
+#X obj 300 -1 ctlin;
+#X obj 60 81 nbx 2 14 1 64 0 0 \$0devNo \$1/devNo Dev 32 8 0 11 -110565
+-1 -1 1 256;
+#X obj 315 181 spigot;
+#X obj 300 257 spigot;
+#X obj 268 181 / 127;
+#N canvas 0 22 458 308 midiLearn 0;
+#X obj 217 143 inlet;
+#X obj 162 38 r \$0-learnOn;
+#X obj 217 177 spigot;
+#X obj 74 188 metro 250;
+#X obj 58 221 count 3;
+#X obj 29 126 t b b;
+#X msg 29 189 reset;
+#X obj 217 199 s \$0-ccNumberLearn;
+#X obj 162 75 pipe 1000;
+#X msg 255 74 1;
+#X msg 274 118 0;
+#X msg 74 150 0;
+#X msg 106 150 1;
+#X obj 58 251 sel 0 1 2;
+#X obj 58 281 s \$0lite1;
+#X obj 138 281 s \$0lite2;
+#X obj 218 281 s \$0lite3;
+#X connect 0 0 2 0;
+#X connect 1 0 8 0;
+#X connect 1 0 9 0;
+#X connect 1 0 12 0;
+#X connect 2 0 7 0;
+#X connect 3 0 4 0;
+#X connect 4 0 13 0;
+#X connect 5 0 6 0;
+#X connect 5 1 11 0;
+#X connect 6 0 4 0;
+#X connect 8 0 5 0;
+#X connect 8 0 10 0;
+#X connect 9 0 2 1;
+#X connect 10 0 2 1;
+#X connect 11 0 3 0;
+#X connect 12 0 3 0;
+#X connect 13 0 14 0;
+#X connect 13 1 15 0;
+#X connect 13 2 16 0;
+#X restore 178 180 pd midiLearn;
+#X obj 337 229 ==;
+#X obj 352 101 div 16;
+#X obj 352 161 ==;
+#X obj 368 139 r \$0devNo;
+#X obj 443 115 mod 16;
+#X obj 413 85 t f f;
+#X obj 349 566 list append;
+#X obj 333 611 s;
+#X obj 443 135 s \$0channel;
+#X msg 224 287 set \$1;
+#X obj 300 365 s \$0data;
+#X obj 210 467 r \$0data;
+#X obj 333 431 r \$0data;
+#X obj 493 17 loadbang;
+#X msg 493 39 1;
+#X obj 391 544 t b f;
+#X obj 391 522 r \$0channel;
+#X obj 352 120 + 1;
+#X obj 349 500 list append \$2;
+#X obj 10 570 r \$1/getControls;
+#X obj 10 620 s \$1/controlsList;
+#X obj 10 594 list append \$2;
+#X obj 224 307 s \$1\$2/GUIR;
+#X obj 210 567 s \$1\$2;
+#X obj 224 338 r \$1\$2/GUI;
+#X msg 349 587 symbol \$1\$2/Ch\$3;
+#X obj 349 478 list append \$1;
+#X text 208 594 Omni;
+#X obj 10 492 r \$1/setChannel;
+#X obj 10 517 s \$0channel;
+#X obj 51 31 cnv 12 75 12 empty empty \$2 2 7 0 11 -83692 -262144 0
+;
+#X obj 32 129 sft.commun \$2-cc \$0;
+#X obj 32 151 sft.commun \$2-device \$0;
+#X obj 315 98 t a;
+#X obj 268 98 t a;
+#X obj 352 69 t a;
+#X obj 198 1 r sft.ctlin;
+#X obj 198 28 unpack f f f;
+#X obj 493 65 s \$0channel;
+#X obj 222 493 outlet;
+#X obj 39 327 sft.originator \$1 \$0;
+#X obj 51 98 cnv 10 75 10 empty empty \$1 1 6 0 8 -66577 -171136 0
+;
+#X connect 0 0 43 0;
+#X connect 2 0 12 1;
+#X connect 6 0 46 0;
+#X connect 6 1 45 0;
+#X connect 6 2 47 0;
+#X connect 7 0 44 0;
+#X connect 8 0 12 0;
+#X connect 9 0 21 0;
+#X connect 9 0 22 0;
+#X connect 10 0 9 0;
+#X connect 12 0 9 1;
+#X connect 13 0 29 0;
+#X connect 14 0 8 1;
+#X connect 15 0 14 1;
+#X connect 16 0 20 0;
+#X connect 17 0 13 0;
+#X connect 17 1 16 0;
+#X connect 18 0 37 0;
+#X connect 21 0 34 0;
+#X connect 23 0 35 0;
+#X connect 23 0 51 0;
+#X connect 24 0 19 0;
+#X connect 25 0 26 0;
+#X connect 26 0 50 0;
+#X connect 27 0 38 0;
+#X connect 27 1 18 1;
+#X connect 28 0 27 0;
+#X connect 29 0 14 0;
+#X connect 30 0 18 0;
+#X connect 31 0 33 0;
+#X connect 33 0 32 0;
+#X connect 36 0 22 0;
+#X connect 37 0 19 1;
+#X connect 38 0 30 0;
+#X connect 40 0 41 0;
+#X connect 43 0 0 0;
+#X connect 44 0 7 0;
+#X connect 45 0 11 0;
+#X connect 45 0 8 0;
+#X connect 46 0 10 0;
+#X connect 47 0 17 0;
+#X connect 48 0 49 0;
+#X connect 49 0 46 0;
+#X connect 49 1 45 0;
+#X connect 49 2 47 0;
+#X coords 0 -1 1 1 77 79 2 50 30;
diff --git a/controctopus/constrain-help.pd b/controctopus/constrain-help.pd
new file mode 100644
index 0000000..ed0f0ae
--- /dev/null
+++ b/controctopus/constrain-help.pd
@@ -0,0 +1,34 @@
+#N canvas 392 32 609 332 10;
+#X obj 183 92 sft.fxs.zxh /main /zxhA;
+#X obj 28 103 s PDOSC;
+#X msg 28 78 /main/zhzxh \$1;
+#X obj 31 33 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X obj 28 253 s PDOSC;
+#X obj 31 183 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 0 1;
+#X msg 28 228 /main/zhzxh-normalized \$1;
+#X obj 268 173 s PDOSC;
+#X obj 271 63 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 2100 1;
+#X obj 268 126 hotpack f f;
+#X obj 271 93 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 7100 1;
+#X obj 267 206 r PDOSC;
+#X obj 267 275 prepent set;
+#X msg 267 296 413.386 1397.64;
+#X text 36 54 Deprecated;
+#X text 37 206 For 0-1 control;
+#X msg 268 148 /main/zxhA-zhzxhness-constrain \$1 \$2;
+#X obj 267 245 deeprouteOSC /main/zxhA-zhzxhness-constrained-to;
+#X connect 2 0 1 0;
+#X connect 3 0 2 0;
+#X connect 5 0 6 0;
+#X connect 6 0 4 0;
+#X connect 8 0 9 0;
+#X connect 9 0 16 0;
+#X connect 10 0 9 1;
+#X connect 11 0 17 0;
+#X connect 12 0 13 0;
+#X connect 16 0 7 0;
+#X connect 17 0 12 0;
diff --git a/controctopus/controctopus-help.pd b/controctopus/controctopus-help.pd
new file mode 100644
index 0000000..83a61fb
--- /dev/null
+++ b/controctopus/controctopus-help.pd
@@ -0,0 +1,72 @@
+#N canvas 154 46 1116 743 10;
+#X obj 66 220 midi-tentacle /uc33 /Knob1 /modular;
+#X obj 67 12 cnv 15 340 170 empty empty Virtual_UC-33 20 12 0 14 -233017
+-66577 0;
+#X floatatom 310 148 5 0 0 0 - - -;
+#X obj 284 33 vsl 15 128 0 1 0 0 /uc33/Slider1/GUI /uc33/Slider1/GUIR
+Slider1 0 -9 0 10 -1 -159808 -1 0 1;
+#X obj 85 80 knob 32 32 0 1 0 0 /uc33/Knob1/GUI /uc33/Knob1/GUIR Knob1
+0 -8 193 11 -262144 -159808 -1 0 1;
+#X floatatom 128 148 5 0 0 0 - - -;
+#X obj 72 365 cnv 15 320 300 empty empty littlesynth-A 20 12 0 14 -232576
+-66577 0;
+#X obj 157 456 hsl 128 20 0 5000 0 0 \$0release \$0releaseR release
+-2 -8 0 10 -203904 -1 -1 0 1;
+#X obj 195 502 r \$0release;
+#X obj 108 502 r \$0filterCut;
+#X obj 157 416 hsl 128 20 0 20000 0 0 \$0filterCut \$0filterCutR filter-cutoff
+-2 -8 0 10 -261234 -1 -1 0 1;
+#N canvas 0 22 450 300 littlesynthA 0;
+#X obj 49 37 inlet;
+#X obj 191 39 inlet;
+#X restore 108 556 pd littlesynthA;
+#X text 412 82 "Dev" is the device number \, as defined in the Pd MIDI
+preferences;
+#X text 443 231 "Omni" means the midi-tentacle will receive all channels
+and transmit to only one OSC address. "Ch.#" means the midi-tentacle
+will receive each channel and transmit it to an independently assigned
+OSC address. You can think of the radiobuttons as "pages"[1] - flip
+through them with the tentacle-pager:;
+#X text 435 358 [1] Though "Omni" is a special page that necessarily
+blocks all other channels (but they'll still remember their settings!)
+;
+#X obj 540 307 tentacle-pager /uc33;
+#X obj 245 220 midi-tentacle /uc33 /Slider1 /modular;
+#X obj 535 433 polaroid /uc33 \$0A;
+#X obj 518 505 sft.originator /uc33 \$0A;
+#X obj 76 622 sft.commun.sc.ez \$0B /littlesynthA filterCut 0 20000
+;
+#X obj 76 642 sft.commun.sc.ez \$0B /littlesynthA release 0 5000;
+#X obj 76 602 sft.originator /modular \$0B;
+#X text 668 495 [2];
+#X obj -303 -19 cnv 15 300 30 empty empty Controctopus_Basic_Overview
+20 12 0 14 -1721 -262144 0;
+#X text 431 661 [2] please disregard the \$0A and \$0B \, they're just
+to allow me to show everything in one patch;
+#X obj 261 557 polaroid /modular \$0B;
+#X text -298 44 1);
+#X text -298 208 2);
+#X text -296 361 3);
+#X text -297 385 That should do it.;
+#X text 439 529 Use [polaroid] to save controller maps separately from
+patch presets \, or [careGUI] to save everything together.;
+#X text -298 230 First \, click any of the yellow "get" buttons to
+populate the midi-tentacle's popup with all controllable parameters
+under the parent you specified (here \, it's /modular);
+#X obj 128 57 cc-learner /uc33 /Knob1;
+#X obj 310 57 cc-learner /uc33 /Slider1;
+#X text -295 11 2008 Luke Iannini \, proyekto.net tag sndrft;
+#X text -298 64 Set CC number of the MIDI controller you'd like cc-learner
+to represent \, or click the red button to "Learn" the controller (click
+\, then move the physical control);
+#X text 64 304 called [midi-tentacle /uc33 /Knob1 /modular];
+#X text 69 183 called [cc-learner /uc33 /Knob1];
+#X text 413 129 The pdgui knobs and sliders work like virtual versions
+of your hardware (helpful for testing). Look at their properties to
+see how they interface with cc-learner.;
+#X text 64 324 "/modular" is the group (as defined by sft.originator)
+that I want to address;
+#X connect 8 0 11 1;
+#X connect 9 0 11 0;
+#X connect 32 0 5 0;
+#X connect 33 0 2 0;
diff --git a/controctopus/controctopus-multi-help.pd b/controctopus/controctopus-multi-help.pd
new file mode 100644
index 0000000..a14ba7b
--- /dev/null
+++ b/controctopus/controctopus-multi-help.pd
@@ -0,0 +1,17 @@
+#N canvas 137 140 680 506 10;
+#X obj 112 93 hradio 15 1 0 8 empty empty empty 0 -8 0 10 -262144 -1
+-1 0;
+#X obj 112 112 + 1;
+#X obj 112 133 s /uc33/demux;
+#X obj 101 205 midi-tentacle-multi /uc33 /Knob1 /drummr;
+#X obj 32 385 sft.originator /drummr1 \$0A;
+#X obj 32 405 sft.commun.sc.ez \$0A /noiseA filterCut 0 20000;
+#X obj 32 425 sft.commun.sc.ez \$0A /noiseA release 0 5000;
+#X obj 329 385 sft.originator /drummr2 \$0B;
+#X obj 329 405 sft.commun.sc.ez \$0B /noiseA filterCut 0 20000;
+#X obj 329 425 sft.commun.sc.ez \$0B /noiseA release 0 5000;
+#X text 289 200 midi-tentacle-multi allows you to address multiple
+identical sequentially-named groups \, like /synthsystem1 \, /synthsystem2
+\, ... /synthsystemn.;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
diff --git a/controctopus/midi-tentacle-multi.pd b/controctopus/midi-tentacle-multi.pd
new file mode 100644
index 0000000..b2214ab
--- /dev/null
+++ b/controctopus/midi-tentacle-multi.pd
@@ -0,0 +1,254 @@
+#N canvas 568 138 575 657 10;
+#X obj 141 91 cnv 15 158 78 empty empty \$1\$2->\$3 4 14 0 10 -86277
+-260097 0;
+#X obj 145 118 popup 150 25 #ee0000 $#++#$~~~~~> /littlesynthA-filterCut
+/littlesynthA-release /littlesynthA-filterCut /littlesynthA-release
+/littlesynthA-filterCut /littlesynthA-release /littlesynthA-filterCut
+/littlesynthA-release /littlesynthA-filterCut /littlesynthA-release
+/littlesynthA-filterCut /littlesynthA-release /littlesynthA-filterCut
+/littlesynthA-release /littlesynthA-filterCut /littlesynthA-release
+/littlesynthA-filterCut /littlesynthA-release;
+#X obj 145 2 r sft.paramList;
+#X obj 65 56 r \$0popup;
+#X obj 203 508 s PDOSC;
+#X obj 203 480 prepent;
+#X obj 152 146 hradio 10 1 0 8 \$0chRow1 \$0chRow1R empty 0 -8 0 10
+-118016 -62784 -166441 0;
+#X obj 152 156 hradio 10 1 0 8 \$0chRow2 \$0chRow2R empty 0 -8 0 10
+-118016 -118016 -166441 0;
+#N canvas 674 341 593 450 2RowRadio 0;
+#X obj 27 287 r \$0chRow1;
+#X obj 277 287 r \$0chRow2;
+#X obj 27 377 s \$0chRow1R;
+#X obj 277 378 s \$0chRow2R;
+#X obj 297 73 r \$0chRow1;
+#X obj 397 73 r \$0chRow2;
+#X obj 349 179 s \$0channel;
+#X obj 25 1 r \$0channelR;
+#X obj 25 57 moses 9;
+#X obj 69 80 - 9;
+#X obj 25 124 s \$0chRow1R;
+#X obj 69 102 s \$0chRow2R;
+#X obj 25 89 - 1;
+#X obj 25 30 clip 1 16;
+#X obj 397 107 + 8;
+#X obj 297 106 + 0;
+#X obj 349 207 r \$0channel;
+#X msg 349 250 label Ch.\$1;
+#X obj 349 272 s \$0channelDisp;
+#X obj 349 228 + 1;
+#X obj 452 189 s \$0channelSet;
+#X obj 349 150 t a a;
+#X obj 452 166 + 1;
+#X msg 27 315 color -7.39328e+06 18 1;
+#X msg 27 348 color -7.39328e+06 -7.39328e+06 1;
+#X msg 277 315 color -7.39328e+06 18 1;
+#X msg 277 348 color -7.39328e+06 -7.39328e+06 1;
+#X connect 0 0 23 0;
+#X connect 0 0 24 0;
+#X connect 1 0 25 0;
+#X connect 1 0 26 0;
+#X connect 4 0 15 0;
+#X connect 5 0 14 0;
+#X connect 7 0 13 0;
+#X connect 8 0 12 0;
+#X connect 8 1 9 0;
+#X connect 9 0 11 0;
+#X connect 12 0 10 0;
+#X connect 13 0 8 0;
+#X connect 14 0 21 0;
+#X connect 15 0 21 0;
+#X connect 16 0 19 0;
+#X connect 17 0 18 0;
+#X connect 19 0 17 0;
+#X connect 21 0 6 0;
+#X connect 21 1 22 0;
+#X connect 22 0 20 0;
+#X connect 23 0 2 0;
+#X connect 24 0 3 0;
+#X connect 25 0 3 0;
+#X connect 26 0 2 0;
+#X restore 31 383 pd 2RowRadio;
+#X obj 235 149 cnv 15 37 15 empty \$0channelDisp Ch.1 2 7 0 10 -49933
+-204544 0;
+#N canvas 259 247 494 344 init 0;
+#X obj 41 141 s \$0assgnList;
+#X msg 41 119 a b c d e f g h i j k l m n o p;
+#X msg 288 122 1;
+#X obj 288 143 s \$0channelR;
+#X msg 160 243 options;
+#X obj 160 265 s \$0popup;
+#X obj 41 97 initbang;
+#X obj 288 101 initbang;
+#X obj 160 187 initbang;
+#X msg 160 209 bgcolour #ee0000;
+#X msg 160 226 name $#++#$~~~~~>;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 4 0 5 0;
+#X connect 6 0 1 0;
+#X connect 7 0 2 0;
+#X connect 8 0 10 0;
+#X connect 8 0 4 0;
+#X connect 8 0 9 0;
+#X connect 9 0 5 0;
+#X connect 10 0 5 0;
+#X restore 31 361 pd init;
+#X obj 288 187 s \$0popOut;
+#X obj 288 64 r \$0setPopup;
+#N canvas 667 135 255 293 memento 0;
+#X obj 14 10 sft.originator \$1 \$0;
+#X obj 14 55 r \$0assgnList;
+#X obj 14 109 s \$0assgnList;
+#X obj 15 175 r \$0params;
+#X obj 15 259 s \$0popup;
+#X obj 14 82 sft.commun \$2-assignments \$0;
+#X obj 15 207 sft.commun \$2-parameters \$0;
+#X obj 15 231 list trim;
+#X connect 1 0 5 0;
+#X connect 3 0 6 0;
+#X connect 5 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 4 0;
+#X restore 31 339 pd memento;
+#X obj 156 69 s \$0params;
+#N canvas 55 208 632 552 listops 0;
+#X obj 35 207 list-idx;
+#X obj 35 119 r \$0channel;
+#X obj 35 182 list;
+#X obj 35 143 t b f;
+#X obj 402 256 list-delete;
+#X obj 330 355 list-insert;
+#X obj 474 230 r \$0channel;
+#X obj 366 301 r \$0channel;
+#X obj 402 209 list;
+#X obj 425 186 r \$0assgnList;
+#X obj 330 193 t a b;
+#X obj 330 381 s \$0assgnList;
+#X obj 88 166 r \$0assgnList;
+#X obj 330 161 r \$0popOut;
+#X text 43 239 don't set the placeholders (see init);
+#X obj 35 284 route a b c d;
+#X obj 35 323 route e f g h;
+#X obj 35 363 route i j k l;
+#X obj 35 403 route m n o p;
+#X obj 35 256 list trim;
+#X obj 35 483 s \$0setPopup;
+#X obj 35 443 list;
+#X obj 142 379 s \$0popup;
+#X msg 142 357 name $#++#$;
+#X connect 0 0 19 0;
+#X connect 1 0 3 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X connect 3 1 0 1;
+#X connect 4 0 5 2;
+#X connect 5 0 11 0;
+#X connect 6 0 4 1;
+#X connect 7 0 5 1;
+#X connect 8 0 4 0;
+#X connect 9 0 8 1;
+#X connect 10 0 5 0;
+#X connect 10 1 8 0;
+#X connect 12 0 2 1;
+#X connect 13 0 10 0;
+#X connect 15 0 23 0;
+#X connect 15 1 23 0;
+#X connect 15 2 23 0;
+#X connect 15 3 23 0;
+#X connect 15 4 16 0;
+#X connect 16 0 23 0;
+#X connect 16 1 23 0;
+#X connect 16 2 23 0;
+#X connect 16 3 23 0;
+#X connect 16 4 17 0;
+#X connect 17 0 23 0;
+#X connect 17 1 23 0;
+#X connect 17 2 23 0;
+#X connect 17 3 23 0;
+#X connect 17 4 18 0;
+#X connect 18 0 23 0;
+#X connect 18 1 23 0;
+#X connect 18 2 23 0;
+#X connect 18 3 23 0;
+#X connect 18 4 21 0;
+#X connect 19 0 15 0;
+#X connect 21 0 20 0;
+#X connect 23 0 22 0;
+#X restore 31 315 pd listops;
+#X obj 145 187 route bang;
+#N canvas 713 160 242 368 16channelOuts 0;
+#X obj 18 23 rchannel-multi \$0 \$1 \$2 \$3 \$4 1;
+#X obj 18 43 rchannel-multi \$0 \$1 \$2 \$3 \$4 2;
+#X obj 18 63 rchannel-multi \$0 \$1 \$2 \$3 \$4 3;
+#X obj 18 83 rchannel-multi \$0 \$1 \$2 \$3 \$4 4;
+#X obj 18 103 rchannel-multi \$0 \$1 \$2 \$3 \$4 5;
+#X obj 18 123 rchannel-multi \$0 \$1 \$2 \$3 \$4 6;
+#X obj 18 143 rchannel-multi \$0 \$1 \$2 \$3 \$4 7;
+#X obj 18 163 rchannel-multi \$0 \$1 \$2 \$3 \$4 8;
+#X obj 18 183 rchannel-multi \$0 \$1 \$2 \$3 \$4 9;
+#X obj 18 203 rchannel-multi \$0 \$1 \$2 \$3 \$4 10;
+#X obj 18 223 rchannel-multi \$0 \$1 \$2 \$3 \$4 11;
+#X obj 18 263 rchannel-multi \$0 \$1 \$2 \$3 \$4 13;
+#X obj 18 283 rchannel-multi \$0 \$1 \$2 \$3 \$4 14;
+#X obj 18 303 rchannel-multi \$0 \$1 \$2 \$3 \$4 15;
+#X obj 18 323 rchannel-multi \$0 \$1 \$2 \$3 \$4 16;
+#X obj 18 243 rchannel-multi \$0 \$1 \$2 \$3 \$4 12;
+#X restore 31 293 pd 16channelOuts;
+#X obj 11 433 r \$1/gotoChannel;
+#X obj 11 458 s \$0channelR;
+#X obj 145 24 list-extend;
+#X obj 145 45 prepent options;
+#X obj 281 151 bng 8 250 50 0 \$0getParams \$0getParamsR get 0 12 1
+7 -249808 -1 -262144;
+#X obj 11 507 r \$0getParams;
+#X obj 203 433 r \$1\$2;
+#X obj 26 550 loadbang;
+#X obj 26 573 list append \$3 1;
+#X obj 341 364 t b a;
+#X obj 287 395 symbol /none;
+#X obj 341 343 r \$1/demux;
+#X obj 287 418 list prepend 1;
+#X obj 287 439 list prepend \$3;
+#X msg 287 463 \$1\$2\$3;
+#X obj 287 283 r \$0popOut;
+#X obj 387 439 s \$0demuxDisplay;
+#X obj 280 96 cnv 15 15 15 empty \$0demuxDisplay 1 1 9 0 11 -261234
+-33289 0;
+#X obj 387 395 list-l2s;
+#X obj 387 418 prepent label;
+#X obj 11 620 s;
+#X msg 26 597 symbol \$1\$2/getParams;
+#X obj 11 530 t b b;
+#X obj 231 23 r \$1/clearParams;
+#X obj 49 530 s \$1/clearParams;
+#X connect 1 0 16 0;
+#X connect 1 1 11 0;
+#X connect 2 0 20 0;
+#X connect 3 0 1 0;
+#X connect 5 0 4 0;
+#X connect 12 0 1 1;
+#X connect 18 0 19 0;
+#X connect 20 0 21 0;
+#X connect 21 0 1 0;
+#X connect 21 0 14 0;
+#X connect 23 0 40 0;
+#X connect 24 0 5 0;
+#X connect 25 0 26 0;
+#X connect 26 0 39 0;
+#X connect 27 0 28 0;
+#X connect 27 1 30 1;
+#X connect 27 1 36 0;
+#X connect 28 0 30 0;
+#X connect 29 0 27 0;
+#X connect 30 0 31 0;
+#X connect 31 0 32 0;
+#X connect 32 0 5 1;
+#X connect 33 0 28 0;
+#X connect 36 0 37 0;
+#X connect 37 0 34 0;
+#X connect 39 0 38 1;
+#X connect 40 0 38 0;
+#X connect 40 1 42 0;
+#X connect 41 0 20 1;
+#X coords 0 -1 1 1 160 80 2 140 90;
diff --git a/controctopus/midi-tentacle.pd b/controctopus/midi-tentacle.pd
new file mode 100644
index 0000000..60244ba
--- /dev/null
+++ b/controctopus/midi-tentacle.pd
@@ -0,0 +1,272 @@
+#N canvas 228 148 514 657 10;
+#X obj 141 91 cnv 15 158 78 empty empty \$1\$2->\$3 4 14 0 10 -86277
+-260097 0;
+#X obj 145 118 popup 150 25 #ee0000 No-Destination;
+#X obj 65 56 r \$0popup;
+#X obj 203 508 s PDOSC;
+#X obj 203 480 prepent;
+#X obj 157 146 hradio 10 1 0 8 \$0chRow1 \$0chRow1R empty 0 -8 0 10
+-118016 -62784 -166441 1;
+#X obj 157 156 hradio 10 1 0 8 \$0chRow2 \$0chRow2R empty 0 -8 0 10
+-118016 -118016 -166441 7;
+#X obj 240 149 cnv 15 37 15 empty \$0channelDisp Ch.2 2 7 0 10 -66577
+-225280 0;
+#N canvas 259 247 494 344 init 0;
+#X obj 41 141 s \$0assgnList;
+#X obj 288 143 s \$0channelR;
+#X msg 160 243 options;
+#X obj 160 265 s \$0popup;
+#X obj 41 97 initbang;
+#X obj 288 101 initbang;
+#X obj 160 187 initbang;
+#X msg 160 209 bgcolour #ee0000;
+#X msg 160 226 name $#++#$~~~~~>;
+#X msg 41 119 a b c d e f g h i j k l m n o p q;
+#X msg 288 122 0;
+#X connect 2 0 3 0;
+#X connect 4 0 9 0;
+#X connect 5 0 10 0;
+#X connect 6 0 8 0;
+#X connect 6 0 2 0;
+#X connect 6 0 7 0;
+#X connect 7 0 3 0;
+#X connect 8 0 3 0;
+#X connect 9 0 0 0;
+#X connect 10 0 1 0;
+#X restore 31 361 pd init;
+#X obj 338 283 r \$0popOut;
+#X obj 288 187 s \$0popOut;
+#X obj 288 64 r \$0setPopup;
+#N canvas 667 135 255 293 memento 0;
+#X obj 14 55 r \$0assgnList;
+#X obj 14 109 s \$0assgnList;
+#X obj 15 175 r \$0params;
+#X obj 15 259 s \$0popup;
+#X obj 14 82 sft.commun \$2-assignments \$0;
+#X obj 15 207 sft.commun \$2-parameters \$0;
+#X obj 15 231 list trim;
+#X obj 14 10 sft.originator \$1 \$0;
+#X connect 0 0 4 0;
+#X connect 2 0 5 0;
+#X connect 4 0 1 0;
+#X connect 5 0 6 0;
+#X connect 6 0 3 0;
+#X restore 31 339 pd memento;
+#X obj 156 69 s \$0params;
+#N canvas 738 69 632 552 listops 0;
+#X obj 35 207 list-idx;
+#X obj 35 119 r \$0channel;
+#X obj 35 182 list;
+#X obj 35 143 t b f;
+#X obj 393 257 list-delete;
+#X obj 330 355 list-insert;
+#X obj 424 231 r \$0channel;
+#X obj 361 301 r \$0channel;
+#X obj 393 210 list;
+#X obj 414 187 r \$0assgnList;
+#X obj 330 193 t a b;
+#X obj 330 381 s \$0assgnList;
+#X obj 88 165 r \$0assgnList;
+#X obj 330 161 r \$0popOut;
+#X text 43 239 don't set the placeholders (see init);
+#X obj 35 284 route a b c d;
+#X obj 35 323 route e f g h;
+#X obj 35 363 route i j k l;
+#X obj 35 403 route m n o p;
+#X obj 35 256 list trim;
+#X obj 35 504 s \$0setPopup;
+#X obj 35 464 list;
+#X obj 142 379 s \$0popup;
+#X obj 35 437 route q;
+#X msg 142 357 name No-Destination;
+#X connect 0 0 19 0;
+#X connect 1 0 3 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X connect 3 1 0 1;
+#X connect 4 0 5 2;
+#X connect 5 0 11 0;
+#X connect 6 0 4 1;
+#X connect 7 0 5 1;
+#X connect 8 0 4 0;
+#X connect 9 0 8 1;
+#X connect 10 0 5 0;
+#X connect 10 1 8 0;
+#X connect 12 0 2 1;
+#X connect 13 0 10 0;
+#X connect 15 0 24 0;
+#X connect 15 1 24 0;
+#X connect 15 2 24 0;
+#X connect 15 3 24 0;
+#X connect 15 4 16 0;
+#X connect 16 0 24 0;
+#X connect 16 1 24 0;
+#X connect 16 2 24 0;
+#X connect 16 3 24 0;
+#X connect 16 4 17 0;
+#X connect 17 0 24 0;
+#X connect 17 1 24 0;
+#X connect 17 2 24 0;
+#X connect 17 3 24 0;
+#X connect 17 4 18 0;
+#X connect 18 0 24 0;
+#X connect 18 1 24 0;
+#X connect 18 2 24 0;
+#X connect 18 3 24 0;
+#X connect 18 4 23 0;
+#X connect 19 0 15 0;
+#X connect 21 0 20 0;
+#X connect 23 0 24 0;
+#X connect 23 1 21 0;
+#X connect 24 0 22 0;
+#X restore 31 315 pd listops;
+#X obj 145 187 route bang;
+#X obj 31 478 s \$0channelR;
+#X obj 145 24 list-extend;
+#X obj 145 45 prepent options;
+#X obj 283 151 bng 8 250 50 0 \$0getParams \$0getParamsR get 0 12 1
+7 -249808 -1 -262144;
+#X obj 31 527 r \$0getParams;
+#X obj 203 353 r \$1\$2;
+#X obj 338 439 list prepend \$3;
+#X msg 338 463 \$1\$2;
+#N canvas 713 160 242 368 16channelOuts 0;
+#X obj 18 23 rchannel \$0 \$1 \$2 \$3 \$4 1;
+#X obj 18 43 rchannel \$0 \$1 \$2 \$3 \$4 2;
+#X obj 18 63 rchannel \$0 \$1 \$2 \$3 \$4 3;
+#X obj 18 83 rchannel \$0 \$1 \$2 \$3 \$4 4;
+#X obj 18 103 rchannel \$0 \$1 \$2 \$3 \$4 5;
+#X obj 18 123 rchannel \$0 \$1 \$2 \$3 \$4 6;
+#X obj 18 143 rchannel \$0 \$1 \$2 \$3 \$4 7;
+#X obj 18 163 rchannel \$0 \$1 \$2 \$3 \$4 8;
+#X obj 18 183 rchannel \$0 \$1 \$2 \$3 \$4 9;
+#X obj 18 203 rchannel \$0 \$1 \$2 \$3 \$4 10;
+#X obj 18 223 rchannel \$0 \$1 \$2 \$3 \$4 11;
+#X obj 18 263 rchannel \$0 \$1 \$2 \$3 \$4 13;
+#X obj 18 283 rchannel \$0 \$1 \$2 \$3 \$4 14;
+#X obj 18 303 rchannel \$0 \$1 \$2 \$3 \$4 15;
+#X obj 18 323 rchannel \$0 \$1 \$2 \$3 \$4 16;
+#X obj 18 243 rchannel \$0 \$1 \$2 \$3 \$4 12;
+#X restore 31 293 pd 16channelOuts;
+#X obj 31 620 s \$3/getParams;
+#X obj 31 573 t b b;
+#X obj 220 24 r \$1/clearParams;
+#X obj 73 573 s \$1/clearParams;
+#X obj 145 150 hradio 12 1 0 1 \$0chRow0 \$0chRow0R empty 0 -8 0 10
+-166441 -166441 -166441 0;
+#X obj 203 442 spigot 0;
+#N canvas 0 65 921 562 3RowRadio 0;
+#X obj 258 324 r \$0chRow1;
+#X obj 508 334 r \$0chRow2;
+#X obj 258 454 s \$0chRow1R;
+#X obj 508 455 s \$0chRow2R;
+#X obj 297 53 r \$0chRow1;
+#X obj 397 53 r \$0chRow2;
+#X obj 368 189 s \$0channel;
+#X obj 25 1 r \$0channelR;
+#X obj 64 77 moses 9;
+#X obj 108 100 - 9;
+#X obj 64 144 s \$0chRow1R;
+#X obj 108 122 s \$0chRow2R;
+#X obj 64 109 - 1;
+#X obj 397 87 + 8;
+#X obj 297 86 + 0;
+#X obj 379 235 r \$0channel;
+#X msg 452 280 label Ch.\$1;
+#X obj 379 302 s \$0channelDisp;
+#X obj 433 167 s \$0channelSet;
+#X msg 258 372 color -7.39328e+06 18 1;
+#X msg 268 395 color -7.39328e+06 -7.39328e+06 1;
+#X msg 508 372 color -7.39328e+06 18 1;
+#X msg 518 395 color -7.39328e+06 -7.39328e+06 1;
+#X obj 349 128 + 1;
+#X obj 379 258 sel 0;
+#X msg 379 280 label Omni;
+#X obj 217 53 r \$0chRow0;
+#X obj 28 334 r \$0chRow0;
+#X obj 25 54 moses 1;
+#X obj 25 166 s \$0chRow0R;
+#X obj 28 454 s \$0chRow0R;
+#X msg 284 419 color 1 1 1;
+#X msg 38 395 color 1 1 1;
+#X msg 534 419 color 1 1 1;
+#X obj 288 167 == 0;
+#X obj 288 189 s \$0omni;
+#X obj 349 150 t a a a;
+#X obj 559 199 r \$0omni;
+#X obj 559 222 sel 0 1;
+#X obj 559 282 s \$0channelDisp;
+#X msg 559 250 color 2 7;
+#X msg 623 250 color 2 14;
+#X msg 28 372 color 14 18 1;
+#X connect 0 0 19 0;
+#X connect 0 0 20 0;
+#X connect 0 0 31 0;
+#X connect 1 0 21 0;
+#X connect 1 0 22 0;
+#X connect 1 0 33 0;
+#X connect 4 0 14 0;
+#X connect 5 0 13 0;
+#X connect 7 0 28 0;
+#X connect 8 0 12 0;
+#X connect 8 1 9 0;
+#X connect 9 0 11 0;
+#X connect 12 0 10 0;
+#X connect 13 0 23 0;
+#X connect 14 0 23 0;
+#X connect 15 0 24 0;
+#X connect 16 0 17 0;
+#X connect 19 0 2 0;
+#X connect 20 0 3 0;
+#X connect 21 0 3 0;
+#X connect 22 0 2 0;
+#X connect 23 0 36 0;
+#X connect 24 0 25 0;
+#X connect 24 1 16 0;
+#X connect 25 0 17 0;
+#X connect 26 0 36 0;
+#X connect 27 0 42 0;
+#X connect 27 0 32 0;
+#X connect 28 0 29 0;
+#X connect 28 1 8 0;
+#X connect 31 0 30 0;
+#X connect 32 0 2 0;
+#X connect 32 0 3 0;
+#X connect 33 0 30 0;
+#X connect 34 0 35 0;
+#X connect 36 0 34 0;
+#X connect 36 1 6 0;
+#X connect 36 2 18 0;
+#X connect 37 0 38 0;
+#X connect 38 0 40 0;
+#X connect 38 1 41 0;
+#X connect 40 0 39 0;
+#X connect 41 0 39 0;
+#X connect 42 0 30 0;
+#X restore 31 383 pd 3RowRadio;
+#X obj 248 403 r \$0omni;
+#X obj 31 433 r \$1/showChannel;
+#X obj 145 2 r \$3/paramsList;
+#X obj 31 456 clip 0 16;
+#X connect 1 0 15 0;
+#X connect 1 1 10 0;
+#X connect 2 0 1 0;
+#X connect 4 0 3 0;
+#X connect 9 0 22 0;
+#X connect 11 0 1 1;
+#X connect 17 0 18 0;
+#X connect 18 0 1 0;
+#X connect 18 0 13 0;
+#X connect 20 0 26 0;
+#X connect 21 0 30 0;
+#X connect 22 0 23 0;
+#X connect 23 0 4 1;
+#X connect 26 0 25 0;
+#X connect 26 1 28 0;
+#X connect 27 0 17 1;
+#X connect 30 0 4 0;
+#X connect 32 0 30 1;
+#X connect 33 0 35 0;
+#X connect 34 0 17 0;
+#X connect 35 0 16 0;
+#X coords 0 -1 1 1 160 80 2 140 90;
diff --git a/controctopus/note-learner.pd b/controctopus/note-learner.pd
new file mode 100644
index 0000000..0509556
--- /dev/null
+++ b/controctopus/note-learner.pd
@@ -0,0 +1,222 @@
+#N canvas 198 173 1083 643 10;
+#X obj 358 266 select;
+#X obj 388 327 f;
+#X msg 358 327 1;
+#X obj 358 359 pack;
+#X obj 358 297 t b b;
+#X msg 238 311 set \$1;
+#X obj 102 293 nbx 2 14 1 128 0 0 \$0-padNumber \$0-padNumberR Pad
+32 7 0 11 -154432 -1 -1 1 256;
+#X obj 102 276 nbx 2 14 0 127 0 0 \$0-noteNumber \$0-noteNumberLearn
+Note 32 7 0 11 -260624 -1 -1 0 256;
+#X obj 442 375 outlet;
+#X obj 137 263 bng 13 250 50 0 \$0-learnOn empty empty 0 -6 0 8 -259541
+-1 -1;
+#X obj 103 265 bng 8 250 50 0 empty empty empty 0 -6 0 8 -1 -262085
+-1;
+#X obj 114 265 bng 8 250 50 0 empty empty empty 0 -6 0 8 -1 -262085
+-1;
+#X obj 125 265 bng 8 250 50 0 empty empty empty 0 -6 0 8 -1 -262085
+-1;
+#X obj 412 250 r \$0-noteNumber;
+#X obj 238 286 r \$0-padNumber;
+#X obj 358 229 spigot;
+#X obj 152 263 nbx 2 13 1 64 0 0 \$0devNo \$1/devNo empty 0 -6 0 10
+-110565 -1 -1 1 256;
+#X msg 733 461 1;
+#X obj 733 493 pack;
+#X msg 792 445 set \$1;
+#X obj 804 337 r \$0-noteNumber;
+#X obj 792 421 r \$0-padNumber;
+#X obj 758 314 spigot;
+#X obj 722 62 polytouchin;
+#X obj 722 383 spigot;
+#X obj 733 435 t b f;
+#X obj 41 470 sft.originator \$1 \$0;
+#X obj 405 457 list;
+#X obj 398 386 t b l;
+#X obj 405 480 list trim;
+#X obj 405 432 r \$1/bangr;
+#X obj 398 410 s \$1/bang;
+#X obj 227 434 s lastPad;
+#X obj 41 411 sft.instance lnote;
+#X obj 41 436 s \$0-padNumberR;
+#X obj 722 284 / 127;
+#X obj 404 302 / 127;
+#X obj 227 407 spigot;
+#X obj 264 382 r lastPadTgl;
+#N canvas 73 463 470 331 midiLearn 0;
+#X text 288 89 Route Number;
+#X obj 24 18 r \$0-learnOn;
+#X obj 230 119 spigot;
+#X obj 267 95 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 24 170 metro 250;
+#X obj 24 198 count 3;
+#X obj 24 227 route 0 1 2;
+#X obj 73 80 t b b;
+#X obj 24 145 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X msg 73 141 reset;
+#X text 337 62 Learn Time-Window;
+#X obj 230 141 s \$0-noteNumberLearn;
+#X obj 267 62 pipe 1000;
+#X obj 24 300 outlet;
+#X obj 48 280 outlet;
+#X obj 72 260 outlet;
+#X obj 230 14 inlet;
+#X connect 1 0 3 0;
+#X connect 1 0 8 0;
+#X connect 1 0 12 0;
+#X connect 2 0 11 0;
+#X connect 3 0 2 1;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 6 0 13 0;
+#X connect 6 1 14 0;
+#X connect 6 2 15 0;
+#X connect 7 0 9 0;
+#X connect 7 1 8 0;
+#X connect 8 0 4 0;
+#X connect 9 0 5 0;
+#X connect 12 0 3 0;
+#X connect 12 0 7 0;
+#X connect 16 0 2 0;
+#X restore 75 164 pd midiLearn;
+#X obj 336 106 t a;
+#X obj 365 106 t a;
+#X obj 395 106 t a;
+#X obj 347 55 notein;
+#X text 351 17 Intercepts for looping back MIDI (e.g. from sft.schoen)
+;
+#X obj 758 353 ==;
+#X obj 358 592 s;
+#X msg 374 570 symbol /sfs\$1/note/in;
+#X obj 374 547 r \$0-padNumber;
+#X obj 738 547 r \$0-padNumber;
+#X obj 722 590 s;
+#X msg 738 568 symbol /sfs\$1/polytouch/in;
+#X obj 395 138 div 16;
+#X obj 395 198 ==;
+#X obj 411 176 r \$0devNo;
+#X obj 486 152 mod 16;
+#X obj 456 122 t f f;
+#X obj 486 172 s \$0channel;
+#X obj 579 134 loadbang;
+#X msg 579 156 1;
+#X obj 395 157 + 1;
+#X obj 795 224 div 16;
+#X obj 795 284 ==;
+#X obj 811 262 r \$0devNo;
+#X obj 886 238 mod 16;
+#X obj 856 208 t f f;
+#X obj 886 258 s \$0channel;
+#X obj 979 220 loadbang;
+#X msg 979 242 1;
+#X obj 795 243 + 1;
+#X obj 405 504 s \$1\$2/note;
+#X obj 733 522 s \$1\$2/tch;
+#X obj 42 316 sft.commun \$2-channel \$0;
+#X obj 42 334 sft.commun \$2-note \$0;
+#X obj 42 352 sft.commun \$2-pad \$0;
+#X obj 722 166 t a;
+#X obj 758 166 t a;
+#X obj 794 166 t a;
+#X obj 722 408 t a;
+#X obj 418 327 sel 0;
+#X obj 459 327 s \$0polyRelay;
+#X obj 625 383 r \$0polyRelay;
+#X text 532 345 Relay initial velocity;
+#X text 532 361 to polytouch to remove;
+#X text 532 377 delay;
+#X obj 230 56 nr sft.notein 3;
+#X obj 814 62 nr sft.polytouchin 3;
+#X connect 0 0 4 0;
+#X connect 1 0 3 1;
+#X connect 1 0 79 0;
+#X connect 2 0 3 0;
+#X connect 2 0 37 0;
+#X connect 3 0 8 0;
+#X connect 3 0 28 0;
+#X connect 3 0 46 0;
+#X connect 4 0 2 0;
+#X connect 4 1 1 0;
+#X connect 5 0 2 0;
+#X connect 6 0 74 0;
+#X connect 7 0 73 0;
+#X connect 13 0 0 1;
+#X connect 14 0 5 0;
+#X connect 15 0 0 0;
+#X connect 16 0 72 0;
+#X connect 17 0 18 0;
+#X connect 18 0 71 0;
+#X connect 19 0 17 0;
+#X connect 20 0 45 1;
+#X connect 21 0 19 0;
+#X connect 22 0 45 0;
+#X connect 23 0 75 0;
+#X connect 23 1 76 0;
+#X connect 23 2 77 0;
+#X connect 24 0 78 0;
+#X connect 25 0 17 0;
+#X connect 25 1 18 1;
+#X connect 27 0 29 0;
+#X connect 28 0 31 0;
+#X connect 28 1 27 1;
+#X connect 29 0 70 0;
+#X connect 30 0 27 0;
+#X connect 33 0 34 0;
+#X connect 35 0 24 0;
+#X connect 36 0 1 1;
+#X connect 37 0 32 0;
+#X connect 38 0 37 1;
+#X connect 39 0 10 0;
+#X connect 39 1 11 0;
+#X connect 39 2 12 0;
+#X connect 40 0 15 0;
+#X connect 40 0 39 0;
+#X connect 41 0 36 0;
+#X connect 42 0 56 0;
+#X connect 43 0 40 0;
+#X connect 43 1 41 0;
+#X connect 43 2 42 0;
+#X connect 45 0 24 1;
+#X connect 47 0 46 1;
+#X connect 48 0 47 0;
+#X connect 49 0 51 0;
+#X connect 51 0 50 1;
+#X connect 52 0 60 0;
+#X connect 53 0 15 1;
+#X connect 54 0 53 1;
+#X connect 55 0 57 0;
+#X connect 56 0 52 0;
+#X connect 56 1 55 0;
+#X connect 58 0 59 0;
+#X connect 59 0 57 0;
+#X connect 60 0 53 0;
+#X connect 61 0 69 0;
+#X connect 62 0 22 1;
+#X connect 63 0 62 1;
+#X connect 64 0 66 0;
+#X connect 65 0 61 0;
+#X connect 65 1 64 0;
+#X connect 67 0 68 0;
+#X connect 68 0 66 0;
+#X connect 69 0 62 0;
+#X connect 72 0 16 0;
+#X connect 73 0 7 0;
+#X connect 74 0 6 0;
+#X connect 75 0 35 0;
+#X connect 76 0 22 0;
+#X connect 77 0 65 0;
+#X connect 78 0 25 0;
+#X connect 78 0 50 0;
+#X connect 79 1 80 0;
+#X connect 81 0 78 0;
+#X connect 85 0 40 0;
+#X connect 85 1 41 0;
+#X connect 85 2 42 0;
+#X connect 86 0 75 0;
+#X connect 86 1 76 0;
+#X connect 86 2 77 0;
+#X coords 0 -1 1 1 81 60 1 100 250;
diff --git a/controctopus/octomother-help.pd b/controctopus/octomother-help.pd
new file mode 100644
index 0000000..e36c00c
--- /dev/null
+++ b/controctopus/octomother-help.pd
@@ -0,0 +1,15 @@
+#N canvas 334 339 595 363 10;
+#X obj 20 178 octomother /uc33 /modular;
+#X obj 184 61 cc-learner /uc33 /Knob1;
+#X obj 275 60 cc-learner /uc33 /Knob2;
+#X obj 362 60 cc-learner /uc33 /Knob3;
+#X text 19 249 call like [octomother /uc33 /modular];
+#X text 8 8 Octomother generates a set of midi-tentacles automatically
+from a set of already-defined cc-learners.;
+#X obj 332 339 pddplink http://proyekto.net;
+#X text 272 326 2008 Luke Iannini \, tag sndrft;
+#X obj 450 60 cc-learner /uc33 /Knob4;
+#X obj 184 146 cc-learner /uc33 /Slider1;
+#X obj 274 146 cc-learner /uc33 /Slider2;
+#X obj 362 146 cc-learner /uc33 /Slider3;
+#X obj 450 146 cc-learner /uc33 /Slider4;
diff --git a/controctopus/octomother-multi.pd b/controctopus/octomother-multi.pd
new file mode 100644
index 0000000..409aaf9
--- /dev/null
+++ b/controctopus/octomother-multi.pd
@@ -0,0 +1,86 @@
+#N canvas 719 217 501 444 10;
+#X msg 35 269 obj \$1 \$2 midi-tentacle-multi \$3 \$4;
+#X obj 35 84 r \$1/controlsList;
+#X obj 35 110 list prepend \$1;
+#X obj 35 243 list prepend;
+#X obj 114 218 r \$0x;
+#X obj 35 195 list prepend;
+#X obj 114 171 r \$0y;
+#X obj 35 136 t a b;
+#X obj 251 71 f 0;
+#X obj 251 146 s \$0y;
+#X obj 283 71 + 1;
+#X obj 251 274 f 0;
+#X obj 283 274 + 1;
+#X obj 251 329 s \$0x;
+#X obj 79 136 s \$0count;
+#X obj 251 42 r \$0count;
+#X obj 251 243 r \$0count;
+#X obj 251 96 div 8;
+#X obj 315 274 mod 8;
+#N canvas 50 247 1320 500 \$0controls 0;
+#X restore 148 10 pd \$0controls;
+#X obj 339 311 loadbang;
+#X msg 339 338 clear;
+#X obj 339 362 s pd-\$0controls;
+#X obj 251 303 * 160;
+#X obj 251 120 * 80;
+#X msg 359 211 vis 1;
+#X obj 359 236 s pd-\$0controls;
+#X obj 182 219 s \$1/getControls;
+#X obj 359 189 r \$0show;
+#X obj 182 187 r \$0getControls;
+#X obj 35 295 list append \$2;
+#X obj 35 317 list trim;
+#X obj 35 340 s pd-\$0controls;
+#X obj 301 101 cnv 15 15 15 empty empty O 2 7 0 14 -231960 -66577 0
+;
+#X obj 312 101 cnv 15 15 15 empty empty C 2 7 0 14 -181753 -66577 0
+;
+#X obj 323 101 cnv 15 15 15 empty empty T 2 7 0 14 -232778 -66577 0
+;
+#X obj 334 101 cnv 15 15 15 empty empty O 2 7 0 14 -36361 -66577 0
+;
+#X obj 345 101 cnv 15 15 15 empty empty M 2 7 0 14 -32312 -66577 0
+;
+#X obj 356 101 cnv 15 15 15 empty empty O 2 7 0 14 -230614 -66577 0
+;
+#X obj 367 101 cnv 15 15 15 empty empty M 2 7 0 14 -230961 -66577 0
+;
+#X obj 378 101 cnv 14 14 15 empty empty empty 2 7 0 14 -221241 -66577
+0;
+#X obj 301 114 cnv 15 91 45 empty empty \$1 2 7 0 11 -20537 -150464
+0;
+#X obj 303 143 bng 15 250 50 0 \$0show \$0showR Show 17 7 0 11 -174336
+-1 -183899;
+#X obj 303 126 bng 15 250 50 0 \$0getControls \$0getControlsR Generate
+17 7 0 11 -49136 -1 -239456;
+#X connect 0 0 30 0;
+#X connect 1 0 2 0;
+#X connect 2 0 7 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 1;
+#X connect 5 0 3 0;
+#X connect 6 0 5 1;
+#X connect 7 0 5 0;
+#X connect 7 1 14 0;
+#X connect 8 0 10 0;
+#X connect 8 0 17 0;
+#X connect 10 0 8 1;
+#X connect 11 0 12 0;
+#X connect 11 0 23 0;
+#X connect 12 0 18 0;
+#X connect 15 0 8 0;
+#X connect 16 0 11 0;
+#X connect 17 0 24 0;
+#X connect 18 0 11 1;
+#X connect 20 0 21 0;
+#X connect 21 0 22 0;
+#X connect 23 0 13 0;
+#X connect 24 0 9 0;
+#X connect 25 0 26 0;
+#X connect 28 0 25 0;
+#X connect 29 0 27 0;
+#X connect 30 0 31 0;
+#X connect 31 0 32 0;
+#X coords 0 -1 1 1 93 60 2 300 100;
diff --git a/controctopus/octomother.pd b/controctopus/octomother.pd
new file mode 100644
index 0000000..d69c2b7
--- /dev/null
+++ b/controctopus/octomother.pd
@@ -0,0 +1,86 @@
+#N canvas 719 217 501 444 10;
+#X obj 35 84 r \$1/controlsList;
+#X obj 35 110 list prepend \$1;
+#X obj 35 243 list prepend;
+#X obj 114 218 r \$0x;
+#X obj 35 195 list prepend;
+#X obj 114 171 r \$0y;
+#X obj 35 136 t a b;
+#X obj 251 71 f 0;
+#X obj 251 146 s \$0y;
+#X obj 283 71 + 1;
+#X obj 251 274 f 0;
+#X obj 283 274 + 1;
+#X obj 251 329 s \$0x;
+#X obj 79 136 s \$0count;
+#X obj 251 42 r \$0count;
+#X obj 251 243 r \$0count;
+#X obj 251 96 div 8;
+#X obj 315 274 mod 8;
+#N canvas 50 247 1320 500 \$0controls 0;
+#X restore 148 10 pd \$0controls;
+#X obj 35 340 s pd-\$0controls;
+#X obj 339 311 loadbang;
+#X msg 339 338 clear;
+#X obj 339 362 s pd-\$0controls;
+#X obj 251 303 * 160;
+#X obj 251 120 * 80;
+#X msg 359 211 vis 1;
+#X obj 359 236 s pd-\$0controls;
+#X obj 182 219 s \$1/getControls;
+#X obj 301 101 cnv 15 15 15 empty empty O 2 7 0 14 -231960 -66577 0
+;
+#X obj 312 101 cnv 15 15 15 empty empty C 2 7 0 14 -181753 -66577 0
+;
+#X obj 323 101 cnv 15 15 15 empty empty T 2 7 0 14 -232778 -66577 0
+;
+#X obj 334 101 cnv 15 15 15 empty empty O 2 7 0 14 -36361 -66577 0
+;
+#X obj 345 101 cnv 15 15 15 empty empty M 2 7 0 14 -32312 -66577 0
+;
+#X obj 356 101 cnv 15 15 15 empty empty O 2 7 0 14 -230614 -66577 0
+;
+#X obj 367 101 cnv 15 15 15 empty empty M 2 7 0 14 -230961 -66577 0
+;
+#X obj 378 101 cnv 14 14 15 empty empty empty 2 7 0 14 -221241 -66577
+0;
+#X obj 301 114 cnv 15 91 45 empty empty \$1 2 7 0 11 -20537 -150464
+0;
+#X obj 303 143 bng 15 250 50 0 \$0show \$0showR Show 17 7 0 11 -174336
+-1 -183899;
+#X obj 303 126 bng 15 250 50 0 \$0getControls \$0getControlsR Generate
+17 7 0 11 -49136 -1 -239456;
+#X obj 359 189 r \$0show;
+#X obj 182 187 r \$0getControls;
+#X msg 35 269 obj \$1 \$2 midi-tentacle \$3 \$4;
+#X obj 35 295 list append \$2;
+#X obj 35 317 list trim;
+#X connect 0 0 1 0;
+#X connect 1 0 6 0;
+#X connect 2 0 41 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 0;
+#X connect 5 0 4 1;
+#X connect 6 0 4 0;
+#X connect 6 1 13 0;
+#X connect 7 0 9 0;
+#X connect 7 0 16 0;
+#X connect 9 0 7 1;
+#X connect 10 0 11 0;
+#X connect 10 0 23 0;
+#X connect 11 0 17 0;
+#X connect 14 0 7 0;
+#X connect 15 0 10 0;
+#X connect 16 0 24 0;
+#X connect 17 0 10 1;
+#X connect 20 0 21 0;
+#X connect 21 0 22 0;
+#X connect 23 0 12 0;
+#X connect 24 0 8 0;
+#X connect 25 0 26 0;
+#X connect 39 0 25 0;
+#X connect 40 0 27 0;
+#X connect 41 0 42 0;
+#X connect 42 0 43 0;
+#X connect 43 0 19 0;
+#X coords 0 -1 1 1 93 60 2 300 100;
diff --git a/controctopus/rchannel-multi.pd b/controctopus/rchannel-multi.pd
new file mode 100644
index 0000000..bf114e2
--- /dev/null
+++ b/controctopus/rchannel-multi.pd
@@ -0,0 +1,33 @@
+#N canvas 587 243 295 434 10;
+#X obj 66 355 prepent;
+#X obj 66 387 s PDOSC;
+#X obj 135 81 r \$1popOut;
+#X obj 180 112 r \$1channelSet;
+#X obj 189 222 t b a;
+#X obj 135 253 symbol /none;
+#X obj 135 276 list prepend 1;
+#X msg 135 321 \$1\$2\$3;
+#X obj 180 134 == \$5;
+#X obj 66 48 r \$2\$3/Ch\$5;
+#X obj 135 297 list prepend \$4;
+#X obj 189 201 r \$2/demux;
+#X obj 135 176 spigot 0;
+#X obj 66 176 spigot 1;
+#X obj 80 112 r \$1omni;
+#X obj 80 134 == 0;
+#X connect 0 0 1 0;
+#X connect 2 0 12 0;
+#X connect 3 0 8 0;
+#X connect 4 0 5 0;
+#X connect 4 1 6 1;
+#X connect 5 0 6 0;
+#X connect 6 0 10 0;
+#X connect 7 0 0 1;
+#X connect 8 0 12 1;
+#X connect 9 0 13 0;
+#X connect 10 0 7 0;
+#X connect 11 0 4 0;
+#X connect 12 0 5 0;
+#X connect 13 0 0 0;
+#X connect 14 0 15 0;
+#X connect 15 0 13 1;
diff --git a/controctopus/rchannel.pd b/controctopus/rchannel.pd
new file mode 100644
index 0000000..0e545db
--- /dev/null
+++ b/controctopus/rchannel.pd
@@ -0,0 +1,24 @@
+#N canvas 233 249 288 411 10;
+#X obj 66 325 prepent;
+#X obj 66 357 s PDOSC;
+#X obj 135 81 r \$1popOut;
+#X obj 180 112 r \$1channelSet;
+#X obj 180 134 == \$5;
+#X obj 66 48 r \$2\$3/Ch\$5;
+#X msg 135 295 \$1\$2;
+#X obj 135 271 list prepend \$4;
+#X obj 135 176 spigot 0;
+#X obj 66 176 spigot 1;
+#X obj 79 112 r \$1omni;
+#X obj 79 134 == 0;
+#X connect 0 0 1 0;
+#X connect 2 0 8 0;
+#X connect 3 0 4 0;
+#X connect 4 0 8 1;
+#X connect 5 0 9 0;
+#X connect 6 0 0 1;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
+#X connect 9 0 0 0;
+#X connect 10 0 11 0;
+#X connect 11 0 9 1;
diff --git a/controctopus/tentacle-pager.pd b/controctopus/tentacle-pager.pd
new file mode 100644
index 0000000..ef1f107
--- /dev/null
+++ b/controctopus/tentacle-pager.pd
@@ -0,0 +1,131 @@
+#N canvas 605 66 239 173 10;
+#N canvas 895 383 458 308 logic 0;
+#X obj 309 120 r \$0channel;
+#X obj 202 38 r \$0next;
+#X obj 100 38 r \$0prev;
+#X obj 115 70 r \$0channel;
+#X obj 100 99 f 1;
+#X obj 202 99 f 1;
+#X obj 202 126 + 1;
+#X obj 100 126 - 1;
+#X obj 152 252 s \$0channelR;
+#X obj 217 70 r \$0channel;
+#X obj 152 225 + 1;
+#X obj 309 143 s \$1/showChannel;
+#X obj 152 178 - 1;
+#X obj 152 200 mod 16;
+#X connect 0 0 11 0;
+#X connect 1 0 5 0;
+#X connect 2 0 4 0;
+#X connect 3 0 4 1;
+#X connect 4 0 7 0;
+#X connect 5 0 6 0;
+#X connect 6 0 12 0;
+#X connect 7 0 12 0;
+#X connect 9 0 5 1;
+#X connect 10 0 8 0;
+#X connect 12 0 13 0;
+#X connect 13 0 10 0;
+#X restore 138 146 pd logic;
+#X obj 35 44 hradio 10 1 0 8 \$0chRow1 \$0chRow1R empty 0 -8 0 10 -118016
+-62784 -166441 1;
+#X obj 35 54 hradio 10 1 0 8 \$0chRow2 \$0chRow2R empty 0 -8 0 10 -118016
+-118016 -166441 7;
+#N canvas 340 243 921 562 3RowRadio 0;
+#X obj 258 324 r \$0chRow1;
+#X obj 508 334 r \$0chRow2;
+#X obj 258 454 s \$0chRow1R;
+#X obj 508 455 s \$0chRow2R;
+#X obj 297 53 r \$0chRow1;
+#X obj 397 53 r \$0chRow2;
+#X obj 368 189 s \$0channel;
+#X obj 25 1 r \$0channelR;
+#X obj 64 77 moses 9;
+#X obj 103 100 - 9;
+#X obj 64 144 s \$0chRow1R;
+#X obj 103 122 s \$0chRow2R;
+#X obj 64 109 - 1;
+#X obj 572 116 r \$0channel;
+#X msg 645 159 label Ch.\$1;
+#X obj 572 181 s \$0channelDisp;
+#X obj 433 167 s \$0channelSet;
+#X msg 258 372 color -7.39328e+06 18 1;
+#X msg 268 395 color -7.39328e+06 -7.39328e+06 1;
+#X msg 508 372 color -7.39328e+06 18 1;
+#X msg 518 395 color -7.39328e+06 -7.39328e+06 1;
+#X obj 349 128 + 1;
+#X obj 572 137 sel 0;
+#X msg 572 159 label Omni;
+#X obj 217 53 r \$0chRow0;
+#X obj 28 334 r \$0chRow0;
+#X obj 25 54 moses 1;
+#X obj 25 166 s \$0chRow0R;
+#X obj 28 454 s \$0chRow0R;
+#X msg 284 419 color 1 1 1;
+#X msg 38 395 color 1 1 1;
+#X msg 534 419 color 1 1 1;
+#X obj 288 167 == 0;
+#X obj 288 189 s \$0omni;
+#X obj 349 150 t a a a;
+#X obj 752 98 r \$0omni;
+#X obj 752 121 sel 0 1;
+#X obj 752 181 s \$0channelDisp;
+#X msg 752 149 color 2 7;
+#X msg 816 149 color 2 14;
+#X msg 28 372 color 14 18 1;
+#X obj 297 86 + 0;
+#X obj 397 87 + 8;
+#X connect 0 0 17 0;
+#X connect 0 0 18 0;
+#X connect 0 0 29 0;
+#X connect 1 0 19 0;
+#X connect 1 0 20 0;
+#X connect 1 0 31 0;
+#X connect 4 0 41 0;
+#X connect 5 0 42 0;
+#X connect 7 0 26 0;
+#X connect 8 0 12 0;
+#X connect 8 1 9 0;
+#X connect 9 0 11 0;
+#X connect 12 0 10 0;
+#X connect 13 0 22 0;
+#X connect 14 0 15 0;
+#X connect 17 0 2 0;
+#X connect 18 0 3 0;
+#X connect 19 0 3 0;
+#X connect 20 0 2 0;
+#X connect 21 0 34 0;
+#X connect 22 0 23 0;
+#X connect 22 1 14 0;
+#X connect 23 0 15 0;
+#X connect 24 0 34 0;
+#X connect 25 0 40 0;
+#X connect 25 0 30 0;
+#X connect 26 0 27 0;
+#X connect 26 1 8 0;
+#X connect 29 0 28 0;
+#X connect 30 0 2 0;
+#X connect 30 0 3 0;
+#X connect 31 0 28 0;
+#X connect 32 0 33 0;
+#X connect 34 0 32 0;
+#X connect 34 1 6 0;
+#X connect 34 2 16 0;
+#X connect 35 0 36 0;
+#X connect 36 0 38 0;
+#X connect 36 1 39 0;
+#X connect 38 0 37 0;
+#X connect 39 0 37 0;
+#X connect 40 0 28 0;
+#X connect 41 0 21 0;
+#X connect 42 0 21 0;
+#X restore 138 123 pd 3RowRadio;
+#X obj 23 48 hradio 12 1 0 1 \$0chRow0 \$0chRow0R empty 0 -8 0 10 -166441
+-166441 -166441 0;
+#X obj 22 24 cnv 12 40 12 empty empty \$1 1 6 0 8 -262144 -66577 0
+;
+#X obj 78 23 bng 15 250 50 0 \$0next \$0nextR > 5 8 1 11 -261441 -1
+-1;
+#X obj 57 23 bng 15 250 50 0 \$0prev \$0prevR < 5 8 1 11 -261441 -1
+-1;
+#X coords 0 -1 1 1 98 47 2 20 20;