diff --git a/pot6/lib/HystFilter/HystFilter.cpp b/pot6/lib/HystFilter/HystFilter.cpp new file mode 100644 index 0000000..ab21422 --- /dev/null +++ b/pot6/lib/HystFilter/HystFilter.cpp @@ -0,0 +1,34 @@ + +#include "HystFilter.h" + + +HystFilter::HystFilter( uint16_t inputValues, uint16_t outputValues, uint16_t margin ) : + _inputValues( inputValues ), + _outputValues( outputValues ), + _margin( margin ), + _currentOutputLevel( 0 ) +{ +} + +uint16_t HystFilter::getOutputLevel( uint16_t inputLevel ) { + + // get lower and upper bounds for currentOutputLevel + uint16_t lb = (float) ( (float) _inputValues / _outputValues ) * _currentOutputLevel; + + if ( _currentOutputLevel > 0 ) + lb -= _margin; // subtract margin + + uint16_t ub = ( ( (float) ( (float) _inputValues / _outputValues ) * ( _currentOutputLevel + 1 ) ) - 1 ); + + if ( _currentOutputLevel < _outputValues ) + ub += _margin; // add margin + + // now test if input is outside the outer margins for current output value + // If so, caclulate new output level. + if ( inputLevel < lb || inputLevel > ub ) { + + // determine new output level + _currentOutputLevel = ( ( (float) inputLevel * (float) _outputValues ) / _inputValues ); + } + return _currentOutputLevel; +} diff --git a/pot6/lib/HystFilter/HystFilter.h b/pot6/lib/HystFilter/HystFilter.h new file mode 100644 index 0000000..2979cdf --- /dev/null +++ b/pot6/lib/HystFilter/HystFilter.h @@ -0,0 +1,50 @@ + +/* + * Class: HystFilter [Hysteresis filter]. + * Apply hysteresis to an input value and deliver a lower resolution, stabilised output value. + * + */ + + +#ifndef HystFilter_h +#define HystFilter_h + +#include + + +class HystFilter +{ + public: + + HystFilter( uint16_t inputValues, uint16_t outputValues, uint16_t margin ) ; + + // constructor + + // inputValues: the total number of discrete values delivered by the input. + // For example, a 10 bit ADC delivers 1024 values. + // 8 bit ADC = 256, 9 bit ADC = 512, 10 bit ADC = 1024, 11 bit ADC = 2048, 12 bit ADC = 4096 etc. + + // outputValues: the number of discrete output values delivered. This governs the resolution of the function. + // For example a 6 bit resolution yields 64 values. This should ideally be no higher that the input resolution + // minus 3 bits. For example if the input resolution is 10 bits (1024), this should not exceed 7 bits (128) + + // margin: margin sets the 'stickyness' of the hysteresis or the reluctance to leave the current state. + // It is measured in units of the the input level. As a general rule, this should be about 10% to 25% of the + // range of input values that map to 1 output value. For example, if the inputValues is 1024 and the outputValues + // is 128, then 8 input values map to 1 output value so the margin should be 2 (25% of 8 ). + // Probably a value of 2 is OK. For low resolutions or noisy environments, it can be higher. Don't make it too high + // or ranges overlap and some output values become unreachable. + + + uint16_t getOutputLevel( uint16_t inputLevel ) ; + + // converts an input level (eg in the range 0 to 1023 to an aoutput value of 1 to 127 with hyteresis. + + private: + uint16_t _inputValues ; + uint16_t _outputValues ; + uint16_t _margin ; + uint16_t _currentOutputLevel ; +} ; + +#endif diff --git a/pot6/lib/HystFilter/README b/pot6/lib/HystFilter/README new file mode 100644 index 0000000..72550df --- /dev/null +++ b/pot6/lib/HystFilter/README @@ -0,0 +1,3 @@ +# got this from arduino forum ==> contribution of user '6v6gt' + +## https://forum.arduino.cc/index.php?topic=526806.15 diff --git a/pot6/lib/HystFilter/example/example.cpp b/pot6/lib/HystFilter/example/example.cpp new file mode 100644 index 0000000..29f1e0a --- /dev/null +++ b/pot6/lib/HystFilter/example/example.cpp @@ -0,0 +1,52 @@ + +/* + + HystFilter class [Hysteresis] + + This code example shows obtaining values 0-64 from one potentiometer wired + as a voltage divider and 0-10 from another. + + These values remain stable even if the potentiometer + is set on a border point between two values. + + The same principle could be used to set the brightness of a display + dependent on the ambient light, but free from flicker or switching a heater + on based on a thermostat etc. + + 6v6gt 17.apr.2018 + + ver 0.01 03.02.2018 Original verson with table to represent range end points + ver 0.02 13.04.2018 Original verson with calculation to determine range end points. + ver 0.04 17.03.2018 Class implementation for multiple potentiometers (or other analog sources) + + */ + + + + +#include "HystFilter.h" + +HystFilter potA( 1024, 64, 3 ); // 10 bit ADC = 1024, 64 discrete output values required, margin = 3 units (of 1024) +HystFilter potB( 1024, 10, 5 ); // 10 bit ADC = 1024, 10 discrete output values required, margin = 5 units (of 1024) + + +void setup() { + Serial.begin( 9600 ); +} + +void loop() { + + Serial.print("potA: " ); + Serial.print( potA.getOutputLevel( analogRead(A0) ) ); + Serial.print(" " ); + Serial.println( analogRead(A0) ); + + Serial.print("potB: " ); + Serial.print( potB.getOutputLevel( analogRead(A1) ) ); + Serial.print(" " ); + Serial.println( analogRead(A1) ); + Serial.println(" " ); + + + delay ( 500 ); +} diff --git a/pot6/platformio.ini b/pot6/platformio.ini new file mode 100644 index 0000000..489ab79 --- /dev/null +++ b/pot6/platformio.ini @@ -0,0 +1,18 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +default_envs = teensy32 + +[env:teensy32] +platform = teensy@3.6.0 +board = teensy32 +framework = arduino +lib_deps = diff --git a/pot6/src/main.cpp b/pot6/src/main.cpp new file mode 100644 index 0000000..a68739a --- /dev/null +++ b/pot6/src/main.cpp @@ -0,0 +1,19 @@ +// +// a controller w/ 6 knobs (or pots) +// + +// +// Forest all/around @ MMCA, Seoul +// + +// +// 2020 10 14 +// + +void setup() { + +} + +void loop() { + +} diff --git a/puredata/piano_access_mesh.pd b/puredata/piano_access_mesh.pd index 0300aec..1bfad61 100644 --- a/puredata/piano_access_mesh.pd +++ b/puredata/piano_access_mesh.pd @@ -1,4 +1,4 @@ -#N canvas 89 89 1285 589 10; +#N canvas 1 89 1285 589 10; #X obj 20 126 unpackOSC; #X obj 107 18 loadbang; #X msg 147 91 devices; @@ -14,15 +14,15 @@ #X floatatom 193 189 5 0 0 0 - - -; #X obj 451 140 o.io.slipserial; #X msg 480 89 devices; -#X msg 557 94 close; +#X msg 567 94 close; #X obj 1057 228 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; -#X text 865 18 NOTE! -->; -#X obj 928 10 cnv 15 100 60 empty empty empty 20 12 0 14 -261234 -66577 +#X text 958 32 NOTE! -->; +#X obj 1021 24 cnv 15 100 60 empty empty empty 20 12 0 14 -261234 -66577 0; -#X msg 935 33 /note 60 100 1; -#X text 934 13 well.. if we do like..; -#X text 934 53 w/o bundling.. why not?; +#X msg 1028 47 /note 60 100 1; +#X text 1027 27 well.. if we do like..; +#X text 1027 67 w/o bundling.. why not?; #X obj 1010 251 t a b; #X msg 1037 272 [; #X obj 451 63 packOSC; @@ -62,27 +62,16 @@ #X connect 7 0 8 0; #X connect 9 0 6 0; #X restore 156 222 pd midi-in; -#X obj 941 115 r NOTE; +#X obj 976 104 r NOTE; #X msg 1010 297 /note/onoff \$1; #X floatatom 975 272 5 0 0 0 - - -; #X obj 1090 119 loadbang; #X msg 1090 144 127; -#X text 1147 167 vol. override; #X obj 979 246 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X msg 1172 321 0; -#X msg 1172 300 10; -#X msg 1172 279 25; -#X msg 1172 258 50; -#X msg 1172 217 255; -#X msg 1172 197 500; -#X msg 1172 237 127; -#X text 1197 197 BIG; -#X text 1198 321 SMALL; -#X msg 1175 146 180; -#X obj 1107 72 s NOTE; -#X msg 1107 46 68 100 1; -#X obj 941 163 print NOTE; +#X obj 957 471 s NOTE; +#X msg 957 445 68 100 1; +#X obj 976 154 print NOTE; #X obj 733 252 t a b; #X msg 760 273 [; #X msg 664 273 ]; @@ -93,16 +82,15 @@ #X msg 691 370 /note/pitch \$1; #X msg 733 298 /note/onoff \$1; #X floatatom 698 273 5 0 0 0 - - -; -#X obj 664 163 print CTRL; -#X obj 664 105 r CTRL; +#X obj 510 267 print CTRL; +#X obj 510 209 r CTRL; #X obj 664 203 r CTRL; -#N canvas 423 23 875 805 crickets 1; +#N canvas 423 89 875 805 crickets 1; #X obj 89 492 pack f f; #X obj 134 466 tgl 15 0 empty \$0-c-tgl r:0-c-tgl 17 7 0 10 -262144 -1 -1 0 1; #X obj 92 420 hsl 128 15 50 300 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1; -#X obj 89 553 s CTRL; #X floatatom 99 440 5 0 0 0 - - -; #X msg 89 521 120 \$1 \$2; #X obj 239 492 pack f f; @@ -110,7 +98,6 @@ -1 -1 0 1; #X obj 242 420 hsl 128 15 50 300 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1; -#X obj 239 553 s CTRL; #X floatatom 249 440 5 0 0 0 - - -; #X msg 239 521 121 \$1 \$2; #X obj 747 58 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 @@ -122,15 +109,13 @@ -1 -1 0 1; #X obj 392 420 hsl 128 15 50 300 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1; -#X obj 389 553 s CTRL; #X floatatom 399 440 5 0 0 0 - - -; #X msg 389 521 122 \$1 \$2; #X obj 539 492 pack f f; #X obj 584 466 tgl 15 0 empty \$0-c-tgl r:0-c-tgl 17 7 0 10 -262144 --1 -1 1 1; +-1 -1 0 1; #X obj 542 420 hsl 128 15 50 300 0 0 empty empty empty -2 -8 0 10 -262144 --1 -1 1050 1; -#X obj 539 553 s CTRL; +-1 -1 0 1; #X floatatom 549 440 5 0 0 0 - - -; #X msg 539 521 123 \$1 \$2; #X obj 539 702 pack f f; @@ -150,7 +135,7 @@ #X obj 689 553 s CTRL; #X floatatom 699 440 5 0 0 0 - - -; #X obj 271 709 metro 1000; -#X obj 271 687 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 +#X obj 271 687 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X text 270 657 auto play; #X msg 134 711 100 100 1; @@ -245,136 +230,143 @@ #X obj 605 248 pipe 500; #X msg 719 521 105 100 1; #X obj 605 186 * 0; -#X connect 0 0 5 0; +#X text 22 585 manually send 'play stop' messages; +#X text 349 340 resample always send messages!! --> plz fix / or change +; +#X obj 89 553 s CTRL; +#X obj 239 553 s CTRL; +#X obj 389 553 s CTRL; +#X obj 539 553 s CTRL; +#X text 52 537 disconnected for TESTING; +#X text 212 537 disconnected for TESTING; +#X text 372 537 disconnected for TESTING; +#X text 532 537 disconnected for TESTING; +#X text 554 262 disconnected for TESTING; +#X connect 0 0 4 0; #X connect 1 0 0 1; #X connect 2 0 0 0; -#X connect 2 0 4 0; -#X connect 5 0 3 0; -#X connect 6 0 11 0; -#X connect 7 0 6 1; -#X connect 8 0 6 0; -#X connect 8 0 10 0; -#X connect 11 0 9 0; -#X connect 12 0 13 0; -#X connect 13 0 69 0; -#X connect 13 1 63 0; -#X connect 14 0 12 0; -#X connect 15 0 20 0; -#X connect 16 0 15 1; -#X connect 17 0 15 0; -#X connect 17 0 19 0; +#X connect 2 0 3 0; +#X connect 5 0 9 0; +#X connect 6 0 5 1; +#X connect 7 0 5 0; +#X connect 7 0 8 0; +#X connect 10 0 11 0; +#X connect 11 0 65 0; +#X connect 11 1 59 0; +#X connect 12 0 10 0; +#X connect 13 0 17 0; +#X connect 14 0 13 1; +#X connect 15 0 13 0; +#X connect 15 0 16 0; +#X connect 18 0 22 0; +#X connect 19 0 18 1; #X connect 20 0 18 0; -#X connect 21 0 26 0; -#X connect 22 0 21 1; -#X connect 23 0 21 0; -#X connect 23 0 25 0; -#X connect 26 0 24 0; -#X connect 27 0 32 0; -#X connect 28 0 27 1; -#X connect 29 0 27 0; -#X connect 29 0 31 0; +#X connect 20 0 21 0; +#X connect 23 0 28 0; +#X connect 24 0 23 1; +#X connect 25 0 23 0; +#X connect 25 0 27 0; +#X connect 28 0 26 0; +#X connect 31 0 30 1; #X connect 32 0 30 0; -#X connect 35 0 34 1; -#X connect 36 0 34 0; -#X connect 36 0 38 0; -#X connect 39 0 55 0; -#X connect 40 0 39 0; -#X connect 42 0 60 0; -#X connect 43 0 60 0; -#X connect 46 0 39 0; -#X connect 47 0 39 1; -#X connect 48 0 54 0; -#X connect 49 0 48 0; -#X connect 50 0 48 1; -#X connect 52 0 48 0; -#X connect 53 0 48 1; -#X connect 54 0 61 0; -#X connect 55 0 60 0; -#X connect 56 0 39 1; -#X connect 57 0 39 1; -#X connect 58 0 39 1; -#X connect 59 0 39 1; -#X connect 64 0 23 0; -#X connect 65 0 17 0; -#X connect 66 0 8 0; -#X connect 67 0 2 0; -#X connect 68 0 36 0; -#X connect 70 0 29 0; -#X connect 71 0 75 0; -#X connect 72 0 71 0; -#X connect 73 0 71 0; -#X connect 74 0 71 0; -#X connect 75 0 76 0; -#X connect 76 0 77 0; -#X connect 76 1 78 0; -#X connect 76 2 79 0; -#X connect 76 3 80 0; -#X connect 76 4 81 0; -#X connect 76 5 82 0; -#X connect 77 0 85 0; -#X connect 78 0 88 0; -#X connect 79 0 91 0; -#X connect 81 0 97 0; -#X connect 82 0 100 0; -#X connect 83 0 84 0; -#X connect 84 0 124 0; -#X connect 85 0 83 0; -#X connect 86 0 87 0; -#X connect 87 0 126 0; -#X connect 88 0 86 0; -#X connect 89 0 90 0; -#X connect 90 0 125 0; -#X connect 91 0 89 0; -#X connect 92 0 93 0; -#X connect 93 0 107 0; -#X connect 94 0 92 0; -#X connect 95 0 96 0; -#X connect 96 0 130 0; -#X connect 97 0 95 0; -#X connect 98 0 99 0; -#X connect 99 0 108 0; -#X connect 100 0 98 0; -#X connect 101 0 2 0; -#X connect 102 0 120 0; -#X connect 103 0 121 0; -#X connect 105 0 128 0; -#X connect 106 0 123 0; -#X connect 107 0 117 0; -#X connect 108 0 118 0; -#X connect 114 0 101 0; -#X connect 115 0 102 0; -#X connect 116 0 103 0; -#X connect 117 0 104 0; -#X connect 118 0 106 0; -#X connect 119 0 105 0; -#X connect 120 0 8 0; -#X connect 121 0 17 0; -#X connect 123 0 23 0; -#X connect 124 0 114 0; -#X connect 125 0 116 0; +#X connect 32 0 34 0; +#X connect 35 0 51 0; +#X connect 36 0 35 0; +#X connect 38 0 56 0; +#X connect 39 0 56 0; +#X connect 42 0 35 0; +#X connect 43 0 35 1; +#X connect 44 0 50 0; +#X connect 45 0 44 0; +#X connect 46 0 44 1; +#X connect 48 0 44 0; +#X connect 49 0 44 1; +#X connect 50 0 57 0; +#X connect 51 0 56 0; +#X connect 52 0 35 1; +#X connect 53 0 35 1; +#X connect 54 0 35 1; +#X connect 55 0 35 1; +#X connect 60 0 20 0; +#X connect 61 0 15 0; +#X connect 62 0 7 0; +#X connect 63 0 2 0; +#X connect 64 0 32 0; +#X connect 66 0 25 0; +#X connect 67 0 71 0; +#X connect 68 0 67 0; +#X connect 69 0 67 0; +#X connect 70 0 67 0; +#X connect 71 0 72 0; +#X connect 72 0 73 0; +#X connect 72 1 74 0; +#X connect 72 2 75 0; +#X connect 72 3 76 0; +#X connect 72 4 77 0; +#X connect 72 5 78 0; +#X connect 73 0 81 0; +#X connect 74 0 84 0; +#X connect 75 0 87 0; +#X connect 77 0 93 0; +#X connect 78 0 96 0; +#X connect 79 0 80 0; +#X connect 80 0 120 0; +#X connect 81 0 79 0; +#X connect 82 0 83 0; +#X connect 83 0 122 0; +#X connect 84 0 82 0; +#X connect 85 0 86 0; +#X connect 86 0 121 0; +#X connect 87 0 85 0; +#X connect 88 0 89 0; +#X connect 89 0 103 0; +#X connect 90 0 88 0; +#X connect 91 0 92 0; +#X connect 92 0 126 0; +#X connect 93 0 91 0; +#X connect 94 0 95 0; +#X connect 95 0 104 0; +#X connect 96 0 94 0; +#X connect 97 0 2 0; +#X connect 98 0 116 0; +#X connect 99 0 117 0; +#X connect 101 0 124 0; +#X connect 102 0 119 0; +#X connect 103 0 113 0; +#X connect 104 0 114 0; +#X connect 110 0 97 0; +#X connect 111 0 98 0; +#X connect 112 0 99 0; +#X connect 113 0 100 0; +#X connect 114 0 102 0; +#X connect 115 0 101 0; +#X connect 116 0 7 0; +#X connect 117 0 15 0; +#X connect 119 0 20 0; +#X connect 120 0 110 0; +#X connect 121 0 112 0; +#X connect 122 0 111 0; +#X connect 125 0 33 0; #X connect 126 0 115 0; -#X connect 128 0 127 0; -#X connect 129 0 37 0; -#X connect 130 0 119 0; -#X restore 402 321 pd crickets ctrl; -#X obj 352 146 print OSC; +#X restore 446 344 pd crickets ctrl; +#X obj 896 154 print OSC; #X obj 698 295 int; -#X obj 1167 72 s NOTE; -#X msg 1167 46 62 100 1; +#X obj 1207 92 s NOTE; +#X msg 1207 66 62 100 1; #X msg 20 52 devicename /dev/tty.HC-06-DevB-1 \, baud 57600 \, pollintervall 1 \, verbose 1; -#X obj 664 126 spigot; -#X obj 733 111 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 +#X obj 510 230 spigot; +#X obj 559 215 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; -#X obj 352 119 spigot; -#X obj 421 104 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 +#X obj 896 127 spigot; +#X obj 945 112 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; -#X msg 538 52 devicename /dev/tty.usbmodem48710501 \, baud 57600 \, +#X msg 558 52 devicename /dev/tty.usbmodem48710501 \, baud 57600 \, pollintervall 1 \, verbose 1; -#X obj 941 136 spigot; -#X obj 1010 121 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 -0 1; -#X floatatom 1113 355 5 0 0 0 r:0-vol #0-vol -; +#X obj 976 127 spigot; +#X obj 1025 112 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 +1 1; +#X floatatom 1135 232 5 0 0 0 r:0-vol #0-vol -; #X obj 238 516 o.io.slipserial; #X msg 267 465 devices; #X msg 344 470 close; @@ -383,6 +375,31 @@ pollintervall 1 \, verbose 1; pollintervall 1 \, verbose 1; #X obj 238 414 r OSC2; #X obj 625 309 s OSC2; +#X msg 538 12 devicename /dev/portD \, baud 57600 \, pollintervall +1 \, verbose 1; +#X text 1180 167 vol. override; +#X msg 1208 321 0; +#X msg 1208 300 10; +#X msg 1208 279 25; +#X msg 1208 258 50; +#X msg 1208 217 255; +#X msg 1208 197 500; +#X msg 1208 237 127; +#X text 1233 197 BIG; +#X text 1234 321 SMALL; +#X msg 1208 146 180; +#X floatatom 1168 343 5 0 0 0 s:0-vol - #0-vol; +#X text 902 382 vol. control knob for keyboard is needed. / instead +of doing this messy approach.; +#X obj 430 230 spigot; +#X obj 479 215 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 +1; +#X obj 430 209 r OSC2; +#X obj 430 267 print OSC2; +#X obj 896 104 r OSC; +#X msg 1135 254 set \$1; +#X obj 1027 471 s NOTE; +#X msg 1027 445 68 100 0; #X connect 0 0 3 0; #X connect 2 0 7 1; #X connect 3 0 11 0; @@ -409,56 +426,62 @@ pollintervall 1 \, verbose 1; #X connect 26 1 31 0; #X connect 27 0 28 0; #X connect 28 0 26 0; -#X connect 28 1 42 0; +#X connect 28 1 41 0; #X connect 28 2 22 0; #X connect 30 0 32 0; #X connect 31 0 32 0; #X connect 33 0 24 0; -#X connect 33 0 77 0; #X connect 35 0 34 0; -#X connect 36 0 80 0; +#X connect 36 0 69 0; #X connect 37 0 32 0; #X connect 38 0 30 0; #X connect 39 0 40 0; #X connect 40 0 38 0; -#X connect 42 0 38 0; -#X connect 43 0 38 0; -#X connect 44 0 38 0; -#X connect 45 0 38 0; -#X connect 46 0 38 0; -#X connect 47 0 38 0; -#X connect 48 0 38 0; -#X connect 49 0 38 0; -#X connect 52 0 38 0; -#X connect 54 0 53 0; +#X connect 41 0 38 0; +#X connect 43 0 42 0; +#X connect 45 0 53 0; +#X connect 45 1 46 0; +#X connect 46 0 78 0; +#X connect 47 0 78 0; +#X connect 48 0 47 0; +#X connect 48 1 52 0; +#X connect 49 0 48 0; +#X connect 49 1 54 0; +#X connect 49 2 45 0; +#X connect 51 0 78 0; +#X connect 52 0 78 0; +#X connect 53 0 78 0; +#X connect 54 0 60 0; #X connect 56 0 64 0; -#X connect 56 1 57 0; -#X connect 57 0 89 0; -#X connect 58 0 89 0; -#X connect 59 0 58 0; -#X connect 59 1 63 0; -#X connect 60 0 59 0; -#X connect 60 1 65 0; -#X connect 60 2 56 0; -#X connect 62 0 89 0; -#X connect 63 0 89 0; -#X connect 64 0 89 0; -#X connect 65 0 71 0; -#X connect 67 0 75 0; -#X connect 68 0 60 0; -#X connect 71 0 62 0; -#X connect 73 0 72 0; -#X connect 74 0 7 1; -#X connect 75 0 66 0; -#X connect 76 0 75 1; -#X connect 77 0 70 0; -#X connect 78 0 77 1; +#X connect 57 0 49 0; +#X connect 60 0 51 0; +#X connect 62 0 61 0; +#X connect 63 0 7 1; +#X connect 64 0 55 0; +#X connect 65 0 64 1; +#X connect 66 0 59 0; +#X connect 67 0 66 1; +#X connect 68 0 13 1; +#X connect 69 0 44 0; +#X connect 70 0 69 1; +#X connect 71 0 98 0; +#X connect 73 0 72 1; +#X connect 74 0 72 1; +#X connect 75 0 72 0; +#X connect 76 0 72 1; +#X connect 77 0 75 0; #X connect 79 0 13 1; -#X connect 80 0 55 0; -#X connect 81 0 80 1; -#X connect 82 0 38 0; -#X connect 84 0 83 1; -#X connect 85 0 83 1; -#X connect 86 0 83 0; -#X connect 87 0 83 1; -#X connect 88 0 86 0; +#X connect 81 0 91 0; +#X connect 82 0 91 0; +#X connect 83 0 91 0; +#X connect 84 0 91 0; +#X connect 85 0 91 0; +#X connect 86 0 91 0; +#X connect 87 0 91 0; +#X connect 90 0 91 0; +#X connect 93 0 96 0; +#X connect 94 0 93 1; +#X connect 95 0 93 0; +#X connect 97 0 66 0; +#X connect 98 0 38 0; +#X connect 100 0 99 0;