├── DCO Schematic.pdf ├── Pictures ├── image10.jpeg ├── image5.jpeg ├── image6.jpeg ├── image7.jpeg ├── image8.jpeg └── image9.jpeg ├── README.md ├── Triple_DCO_1.2.ino └── Triple_DCO_1.3.ino /DCO Schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luislutz/Arduino-VDCO/0ef432c14481ae4e6d9b1dfbadac9b577541a42d/DCO Schematic.pdf -------------------------------------------------------------------------------- /Pictures/image10.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luislutz/Arduino-VDCO/0ef432c14481ae4e6d9b1dfbadac9b577541a42d/Pictures/image10.jpeg -------------------------------------------------------------------------------- /Pictures/image5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luislutz/Arduino-VDCO/0ef432c14481ae4e6d9b1dfbadac9b577541a42d/Pictures/image5.jpeg -------------------------------------------------------------------------------- /Pictures/image6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luislutz/Arduino-VDCO/0ef432c14481ae4e6d9b1dfbadac9b577541a42d/Pictures/image6.jpeg -------------------------------------------------------------------------------- /Pictures/image7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luislutz/Arduino-VDCO/0ef432c14481ae4e6d9b1dfbadac9b577541a42d/Pictures/image7.jpeg -------------------------------------------------------------------------------- /Pictures/image8.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luislutz/Arduino-VDCO/0ef432c14481ae4e6d9b1dfbadac9b577541a42d/Pictures/image8.jpeg -------------------------------------------------------------------------------- /Pictures/image9.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luislutz/Arduino-VDCO/0ef432c14481ae4e6d9b1dfbadac9b577541a42d/Pictures/image9.jpeg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Arduino-VDCO 2 | Voltage Controlled Digital Core Multimode Oscillator using Mozzi library on Arduino 3 | 4 | Its a digital Oscillator/Voice for the Eurorack Standart, its based on three different modules from HAGIWO Modular, merged into one small 4HP Module, with added CV input too choose the Synthesis Mode. The Modes are FM Synthesis, Additive Synthesis and a Chord generator with lots of waveforms! Ive alse implemented a simple digital VCA with a Gain CV input which is normalled to 5 Volts, so it can be used as VCO+VCA. little Bonus: It gets in the digital clipping range when the voltage on the gain input exceeds 5 Volts! 5 | It has V/Oct pitch tracking and CV inputs for all Parameters. The Sketch uses about 95% of the Memory on an Arduino Nano :) 6 | 7 | V1.3 is an improved Version with slightly changed Wavetables icluding a real triangle Wave! Now you can choose the Waveform in every synth mode with the Parameter 2 knob, when Parameter1 knob is all the way up. It only changes the Waveform is Parameter2 Knob is turned a bit! All modes have the standard waveforms availiable (Sine,Triangle,Saw,Square), but FM synthesis and Chord Generator Modes have 4 More too choose from (HalfSinus, SigmoidSaw, Chebychev_3rd, TriangleHermes). 8 | 9 | No hardware changes needed for V1.3 10 | 11 | -------------------------------------------------------------------------------- /Triple_DCO_1.2.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include // oscillator template 3 | #include 4 | 5 | 6 | #include // sine table for oscillator 7 | 8 | #include // table for Oscils to play 9 | 10 | #include // saw table for oscillator 11 | #include // saw table for oscillator 12 | #include // saw table for oscillator 13 | #include // sine table for oscillator 14 | #include // sine table for oscillator 15 | #include // sine table for oscillator 16 | #include // sine table for oscillator 17 | 18 | 19 | 20 | 21 | 22 | 23 | Oscil aSin1(SIN2048_DATA); 24 | Oscil aSin2(SIN2048_DATA); 25 | Oscil aSin3(SIN2048_DATA); 26 | Oscil aSin4(SIN2048_DATA); 27 | Oscil aSin5(SIN2048_DATA); 28 | Oscil aSin6(SIN2048_DATA); 29 | Oscil aSin7(SIN2048_DATA); 30 | Oscil aSin8(SIN2048_DATA); 31 | 32 | 33 | 34 | 35 | 36 | Oscil aCarrier(COS2048_DATA); 37 | Oscil aModulator(COS2048_DATA); 38 | Oscil kModIndex(COS2048_DATA); 39 | 40 | 41 | 42 | 43 | 44 | Oscil aSaw1(SAW2048_DATA); 45 | Oscil aSaw2(SAW2048_DATA); 46 | Oscil aSaw3(SAW2048_DATA); 47 | Oscil aSaw4(SAW2048_DATA); 48 | Oscil aSaw5(SAW2048_DATA); 49 | 50 | Oscil aSqu1(SQUARE_NO_ALIAS512_DATA); 51 | Oscil aSqu2(SQUARE_NO_ALIAS512_DATA); 52 | Oscil aSqu3(SQUARE_NO_ALIAS512_DATA); 53 | Oscil aSqu4(SQUARE_NO_ALIAS512_DATA); 54 | Oscil aSqu5(SQUARE_NO_ALIAS512_DATA); 55 | 56 | Oscil aTri1(TRIANGLE_HERMES_2048_DATA); 57 | Oscil aTri2(TRIANGLE_HERMES_2048_DATA); 58 | Oscil aTri3(TRIANGLE_HERMES_2048_DATA); 59 | Oscil aTri4(TRIANGLE_HERMES_2048_DATA); 60 | Oscil aTri5(TRIANGLE_HERMES_2048_DATA); 61 | 62 | Oscil aChb1(CHEBYSHEV_3RD_256_DATA); 63 | Oscil aChb2(CHEBYSHEV_3RD_256_DATA); 64 | Oscil aChb3(CHEBYSHEV_3RD_256_DATA); 65 | Oscil aChb4(CHEBYSHEV_3RD_256_DATA); 66 | Oscil aChb5(CHEBYSHEV_3RD_256_DATA); 67 | 68 | Oscil ahSin1(HALFSIN256_DATA); 69 | Oscil ahSin2(HALFSIN256_DATA); 70 | Oscil ahSin3(HALFSIN256_DATA); 71 | Oscil ahSin4(HALFSIN256_DATA); 72 | Oscil ahSin5(HALFSIN256_DATA); 73 | 74 | Oscil aSig1(WAVESHAPE_SIGMOID_DATA); 75 | Oscil aSig2(WAVESHAPE_SIGMOID_DATA); 76 | Oscil aSig3(WAVESHAPE_SIGMOID_DATA); 77 | Oscil aSig4(WAVESHAPE_SIGMOID_DATA); 78 | Oscil aSig5(WAVESHAPE_SIGMOID_DATA); 79 | 80 | Oscil aPha1(PHASOR256_DATA); 81 | Oscil aPha2(PHASOR256_DATA); 82 | Oscil aPha3(PHASOR256_DATA); 83 | Oscil aPha4(PHASOR256_DATA); 84 | Oscil aPha5(PHASOR256_DATA); 85 | 86 | 87 | 88 | 89 | 90 | #define CONTROL_RATE 128 // Hz, powers of 2 are most reliable 91 | 92 | int freq1 = 110;//base freq of OSC1 93 | int voct = 1000;//external V/OCT LSB 94 | int voct2 = 1000; 95 | 96 | 97 | int AnalogRead0 = 0; 98 | int AnalogRead1 = 0; 99 | int AnalogRead3 = 0; 100 | int AnalogRead4 = 0; 101 | int AnalogRead5 = 0; 102 | int AnalogRead7 = 0; 103 | 104 | 105 | //int freqv1 = 440;//apply voct 106 | 107 | 108 | int freqv1 = 440;//apply voct 109 | int freqv2 = 440; 110 | int freqv3 = 440; 111 | int freqv4 = 440; 112 | int freqv5 = 440; 113 | 114 | 115 | byte note1 = 0;//Root 116 | byte note2 = 0;//2nd 117 | byte note3 = 0;//3rd 118 | byte note4 = 0;//4th 119 | byte note5 = 0;//Root 120 | 121 | byte inv_aply1 = 0; //0 = no inv , 1 = inv , Root 122 | byte inv_aply2 = 0; //2nd 123 | byte inv_aply3 = 0; //3rd 124 | byte inv_aply4 = 0; //4th 125 | bool inv_aply5 = 0; //0 = no output root sound , 1 = output root sound 126 | 127 | int inv = 0; 128 | int inv_knob = 0; 129 | int chord = 0; 130 | byte wave = 0;//0=saw,1=squ,2=tri,3=sin,etc... 131 | 132 | 133 | 134 | int harm_knob = 0;//AD wave knob 135 | byte gain = 127; 136 | 137 | int Switch = 0; 138 | int Mode = 0; 139 | int Mode_CV = 0; 140 | int Gain_CV_0 = 0; 141 | int Gain_CV_1 = 0; 142 | int Gain_CV_2 = 0; 143 | 144 | 145 | 146 | const static byte chord_table[8][4]PROGMEM = { 147 | { 0, 68, 119, 205, },//Maj 148 | { 0, 68, 119, 187, },//Maj7 149 | { 0, 68, 119, 239, },//Majadd9 150 | { 0, 34, 119, 205, },//sus2 151 | { 0, 51, 119, 239, },//minadd9 152 | { 0, 51, 119, 170, },//min7 153 | { 0, 51, 119, 205, },//min 154 | { 0, 0, 0, 0, }//root 155 | }; 156 | 157 | 158 | const static float voctpow[1024] PROGMEM = { 159 | 0, 0.004882, 0.009765, 0.014648, 0.019531, 0.024414, 0.029296, 0.034179, 0.039062, 0.043945, 0.048828, 0.05371, 0.058593, 0.063476, 0.068359, 0.073242, 0.078125, 0.083007, 0.08789, 0.092773, 0.097656, 0.102539, 0.107421, 0.112304, 0.117187, 0.12207, 0.126953, 0.131835, 0.136718, 0.141601, 0.146484, 0.151367, 0.15625, 0.161132, 0.166015, 0.170898, 0.175781, 0.180664, 0.185546, 0.190429, 0.195312, 0.200195, 0.205078, 0.20996, 0.214843, 0.219726, 0.224609, 0.229492, 0.234375, 0.239257, 0.24414, 0.249023, 0.253906, 0.258789, 0.263671, 0.268554, 0.273437, 0.27832, 0.283203, 0.288085, 0.292968, 0.297851, 0.302734, 0.307617, 0.3125, 0.317382, 0.322265, 0.327148, 0.332031, 0.336914, 0.341796, 0.346679, 0.351562, 0.356445, 0.361328, 0.36621, 0.371093, 0.375976, 0.380859, 0.385742, 0.390625, 0.395507, 0.40039, 0.405273, 0.410156, 0.415039, 0.419921, 0.424804, 0.429687, 0.43457, 0.439453, 0.444335, 0.449218, 0.454101, 0.458984, 0.463867, 0.46875, 0.473632, 0.478515, 0.483398, 0.488281, 0.493164, 0.498046, 0.502929, 0.507812, 0.512695, 0.517578, 0.52246, 0.527343, 0.532226, 0.537109, 0.541992, 0.546875, 0.551757, 0.55664, 0.561523, 0.566406, 0.571289, 0.576171, 0.581054, 0.585937, 0.59082, 0.595703, 0.600585, 0.605468, 0.610351, 0.615234, 0.620117, 0.625, 0.629882, 0.634765, 0.639648, 0.644531, 0.649414, 0.654296, 0.659179, 0.664062, 0.668945, 0.673828, 0.67871, 0.683593, 0.688476, 0.693359, 0.698242, 0.703125, 0.708007, 0.71289, 0.717773, 0.722656, 0.727539, 0.732421, 0.737304, 0.742187, 0.74707, 0.751953, 0.756835, 0.761718, 0.766601, 0.771484, 0.776367, 0.78125, 0.786132, 0.791015, 0.795898, 0.800781, 0.805664, 0.810546, 0.815429, 0.820312, 0.825195, 0.830078, 0.83496, 0.839843, 0.844726, 0.849609, 0.854492, 0.859375, 0.864257, 0.86914, 0.874023, 0.878906, 0.883789, 0.888671, 0.893554, 0.898437, 0.90332, 0.908203, 0.913085, 0.917968, 0.922851, 0.927734, 0.932617, 0.9375, 0.942382, 0.947265, 0.952148, 0.957031, 0.961914, 0.966796, 0.971679, 0.976562, 0.981445, 0.986328, 0.99121, 0.996093, 1.000976, 1.005859, 1.010742, 1.015625, 1.020507, 1.02539, 1.030273, 1.035156, 1.040039, 1.044921, 1.049804, 1.054687, 1.05957, 1.064453, 1.069335, 1.074218, 1.079101, 1.083984, 1.088867, 1.09375, 1.098632, 1.103515, 1.108398, 1.113281, 1.118164, 1.123046, 1.127929, 1.132812, 1.137695, 1.142578, 1.14746, 1.152343, 1.157226, 1.162109, 1.166992, 1.171875, 1.176757, 1.18164, 1.186523, 1.191406, 1.196289, 1.201171, 1.206054, 1.210937, 1.21582, 1.220703, 1.225585, 1.230468, 1.235351, 1.240234, 1.245117, 1.25, 1.254882, 1.259765, 1.264648, 1.269531, 1.274414, 1.279296, 1.284179, 1.289062, 1.293945, 1.298828, 1.30371, 1.308593, 1.313476, 1.318359, 1.323242, 1.328125, 1.333007, 1.33789, 1.342773, 1.347656, 1.352539, 1.357421, 1.362304, 1.367187, 1.37207, 1.376953, 1.381835, 1.386718, 1.391601, 1.396484, 1.401367, 1.40625, 1.411132, 1.416015, 1.420898, 1.425781, 1.430664, 1.435546, 1.440429, 1.445312, 1.450195, 1.455078, 1.45996, 1.464843, 1.469726, 1.474609, 1.479492, 1.484375, 1.489257, 1.49414, 1.499023, 1.503906, 1.508789, 1.513671, 1.518554, 1.523437, 1.52832, 1.533203, 1.538085, 1.542968, 1.547851, 1.552734, 1.557617, 1.5625, 1.567382, 1.572265, 1.577148, 1.582031, 1.586914, 1.591796, 1.596679, 1.601562, 1.606445, 1.611328, 1.61621, 1.621093, 1.625976, 1.630859, 1.635742, 1.640625, 1.645507, 1.65039, 1.655273, 1.660156, 1.665039, 1.669921, 1.674804, 1.679687, 1.68457, 1.689453, 1.694335, 1.699218, 1.704101, 1.708984, 1.713867, 1.71875, 1.723632, 1.728515, 1.733398, 1.738281, 1.743164, 1.748046, 1.752929, 1.757812, 1.762695, 1.767578, 1.77246, 1.777343, 1.782226, 1.787109, 1.791992, 1.796875, 1.801757, 1.80664, 1.811523, 1.816406, 1.821289, 1.826171, 1.831054, 1.835937, 1.84082, 1.845703, 1.850585, 1.855468, 1.860351, 1.865234, 1.870117, 1.875, 1.879882, 1.884765, 1.889648, 1.894531, 1.899414, 1.904296, 1.909179, 1.914062, 1.918945, 1.923828, 1.92871, 1.933593, 1.938476, 1.943359, 1.948242, 1.953125, 1.958007, 1.96289, 1.967773, 1.972656, 1.977539, 1.982421, 1.987304, 1.992187, 1.99707, 2.001953, 2.006835, 2.011718, 2.016601, 2.021484, 2.026367, 2.03125, 2.036132, 2.041015, 2.045898, 2.050781, 2.055664, 2.060546, 2.065429, 2.070312, 2.075195, 2.080078, 2.08496, 2.089843, 2.094726, 2.099609, 2.104492, 2.109375, 2.114257, 2.11914, 2.124023, 2.128906, 2.133789, 2.138671, 2.143554, 2.148437, 2.15332, 2.158203, 2.163085, 2.167968, 2.172851, 2.177734, 2.182617, 2.1875, 2.192382, 2.197265, 2.202148, 2.207031, 2.211914, 2.216796, 2.221679, 2.226562, 2.231445, 2.236328, 2.24121, 2.246093, 2.250976, 2.255859, 2.260742, 2.265625, 2.270507, 2.27539, 2.280273, 2.285156, 2.290039, 2.294921, 2.299804, 2.304687, 2.30957, 2.314453, 2.319335, 2.324218, 2.329101, 2.333984, 2.338867, 2.34375, 2.348632, 2.353515, 2.358398, 2.363281, 2.368164, 2.373046, 2.377929, 2.382812, 2.387695, 2.392578, 2.39746, 2.402343, 2.407226, 2.412109, 2.416992, 2.421875, 2.426757, 2.43164, 2.436523, 2.441406, 2.446289, 2.451171, 2.456054, 2.460937, 2.46582, 2.470703, 2.475585, 2.480468, 2.485351, 2.490234, 2.495117, 2.5, 2.504882, 2.509765, 2.514648, 2.519531, 2.524414, 2.529296, 2.534179, 2.539062, 2.543945, 2.548828, 2.55371, 2.558593, 2.563476, 2.568359, 2.573242, 2.578125, 2.583007, 2.58789, 2.592773, 2.597656, 2.602539, 2.607421, 2.612304, 2.617187, 2.62207, 2.626953, 2.631835, 2.636718, 2.641601, 2.646484, 2.651367, 2.65625, 2.661132, 2.666015, 2.670898, 2.675781, 2.680664, 2.685546, 2.690429, 2.695312, 2.700195, 2.705078, 2.70996, 2.714843, 2.719726, 2.724609, 2.729492, 2.734375, 2.739257, 2.74414, 2.749023, 2.753906, 2.758789, 2.763671, 2.768554, 2.773437, 2.77832, 2.783203, 2.788085, 2.792968, 2.797851, 2.802734, 2.807617, 2.8125, 2.817382, 2.822265, 2.827148, 2.832031, 2.836914, 2.841796, 2.846679, 2.851562, 2.856445, 2.861328, 2.86621, 2.871093, 2.875976, 2.880859, 2.885742, 2.890625, 2.895507, 2.90039, 2.905273, 2.910156, 2.915039, 2.919921, 2.924804, 2.929687, 2.93457, 2.939453, 2.944335, 2.949218, 2.954101, 2.958984, 2.963867, 2.96875, 2.973632, 2.978515, 2.983398, 2.988281, 2.993164, 2.998046, 3.002929, 3.007812, 3.012695, 3.017578, 3.02246, 3.027343, 3.032226, 3.037109, 3.041992, 3.046875, 3.051757, 3.05664, 3.061523, 3.066406, 3.071289, 3.076171, 3.081054, 3.085937, 3.09082, 3.095703, 3.100585, 3.105468, 3.110351, 3.115234, 3.120117, 3.125, 3.129882, 3.134765, 3.139648, 3.144531, 3.149414, 3.154296, 3.159179, 3.164062, 3.168945, 3.173828, 3.17871, 3.183593, 3.188476, 3.193359, 3.198242, 3.203125, 3.208007, 3.21289, 3.217773, 3.222656, 3.227539, 3.232421, 3.237304, 3.242187, 3.24707, 3.251953, 3.256835, 3.261718, 3.266601, 3.271484, 3.276367, 3.28125, 3.286132, 3.291015, 3.295898, 3.300781, 3.305664, 3.310546, 3.315429, 3.320312, 3.325195, 3.330078, 3.33496, 3.339843, 3.344726, 3.349609, 3.354492, 3.359375, 3.364257, 3.36914, 3.374023, 3.378906, 3.383789, 3.388671, 3.393554, 3.398437, 3.40332, 3.408203, 3.413085, 3.417968, 3.422851, 3.427734, 3.432617, 3.4375, 3.442382, 3.447265, 3.452148, 3.457031, 3.461914, 3.466796, 3.471679, 3.476562, 3.481445, 3.486328, 3.49121, 3.496093, 3.500976, 3.505859, 3.510742, 3.515625, 3.520507, 3.52539, 3.530273, 3.535156, 3.540039, 3.544921, 3.549804, 3.554687, 3.55957, 3.564453, 3.569335, 3.574218, 3.579101, 3.583984, 3.588867, 3.59375, 3.598632, 3.603515, 3.608398, 3.613281, 3.618164, 3.623046, 3.627929, 3.632812, 3.637695, 3.642578, 3.64746, 3.652343, 3.657226, 3.662109, 3.666992, 3.671875, 3.676757, 3.68164, 3.686523, 3.691406, 3.696289, 3.701171, 3.706054, 3.710937, 3.71582, 3.720703, 3.725585, 3.730468, 3.735351, 3.740234, 3.745117, 3.75, 3.754882, 3.759765, 3.764648, 3.769531, 3.774414, 3.779296, 3.784179, 3.789062, 3.793945, 3.798828, 3.80371, 3.808593, 3.813476, 3.818359, 3.823242, 3.828125, 3.833007, 3.83789, 3.842773, 3.847656, 3.852539, 3.857421, 3.862304, 3.867187, 3.87207, 3.876953, 3.881835, 3.886718, 3.891601, 3.896484, 3.901367, 3.90625, 3.911132, 3.916015, 3.920898, 3.925781, 3.930664, 3.935546, 3.940429, 3.945312, 3.950195, 3.955078, 3.95996, 3.964843, 3.969726, 3.974609, 3.979492, 3.984375, 3.989257, 3.99414, 3.999023, 4.003906, 4.008789, 4.013671, 4.018554, 4.023437, 4.02832, 4.033203, 4.038085, 4.042968, 4.047851, 4.052734, 4.057617, 4.0625, 4.067382, 4.072265, 4.077148, 4.082031, 4.086914, 4.091796, 4.096679, 4.101562, 4.106445, 4.111328, 4.11621, 4.121093, 4.125976, 4.130859, 4.135742, 4.140625, 4.145507, 4.15039, 4.155273, 4.160156, 4.165039, 4.169921, 4.174804, 4.179687, 4.18457, 4.189453, 4.194335, 4.199218, 4.204101, 4.208984, 4.213867, 4.21875, 4.223632, 4.228515, 4.233398, 4.238281, 4.243164, 4.248046, 4.252929, 4.257812, 4.262695, 4.267578, 4.27246, 4.277343, 4.282226, 4.287109, 4.291992, 4.296875, 4.301757, 4.30664, 4.311523, 4.316406, 4.321289, 4.326171, 4.331054, 4.335937, 4.34082, 4.345703, 4.350585, 4.355468, 4.360351, 4.365234, 4.370117, 4.375, 4.379882, 4.384765, 4.389648, 4.394531, 4.399414, 4.404296, 4.409179, 4.414062, 4.418945, 4.423828, 4.42871, 4.433593, 4.438476, 4.443359, 4.448242, 4.453125, 4.458007, 4.46289, 4.467773, 4.472656, 4.477539, 4.482421, 4.487304, 4.492187, 4.49707, 4.501953, 4.506835, 4.511718, 4.516601, 4.521484, 4.526367, 4.53125, 4.536132, 4.541015, 4.545898, 4.550781, 4.555664, 4.560546, 4.565429, 4.570312, 4.575195, 4.580078, 4.58496, 4.589843, 4.594726, 4.599609, 4.604492, 4.609375, 4.614257, 4.61914, 4.624023, 4.628906, 4.633789, 4.638671, 4.643554, 4.648437, 4.65332, 4.658203, 4.663085, 4.667968, 4.672851, 4.677734, 4.682617, 4.6875, 4.692382, 4.697265, 4.702148, 4.707031, 4.711914, 4.716796, 4.721679, 4.726562, 4.731445, 4.736328, 4.74121, 4.746093, 4.750976, 4.755859, 4.760742, 4.765625, 4.770507, 4.77539, 4.780273, 4.785156, 4.790039, 4.794921, 4.799804, 4.804687, 4.80957, 4.814453, 4.819335, 4.824218, 4.829101, 4.833984, 4.838867, 4.84375, 4.848632, 4.853515, 4.858398, 4.863281, 4.868164, 4.873046, 4.877929, 4.882812, 4.887695, 4.892578, 4.89746, 4.902343, 4.907226, 4.912109, 4.916992, 4.921875, 4.926757, 4.93164, 4.936523, 4.941406, 4.946289, 4.951171, 4.956054, 4.960937, 4.96582, 4.970703, 4.975585, 4.980468, 4.985351, 4.990234, 4.995117 160 | }; 161 | 162 | 163 | const static byte gain_table[8][256]PROGMEM = { 164 | { 255, 255, 254, 253, 251, 249, 247, 244, 242, 238, 235, 231, 227, 223, 218, 213, 208, 203, 197, 192, 186, 180, 173, 167, 161, 154, 148, 141, 134, 128, 121, 114, 108, 101, 94, 88, 82, 76, 70, 64, 58, 52, 47, 42, 37, 32, 28, 24, 20, 17, 14, 11, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0, 1, 2, 4, 6, 8, 10, 13, 17, 20, 24, 28, 32, 37, 42, 47, 52, 58, 63, 69, 75, 81, 88, 94, 101, 107, 114, 120, 127, 134, 141, 147, 154, 160, 167, 173, 179, 185, 191, 197, 202, 208, 213, 218, 222, 227, 231, 235, 238, 241, 244, 247, 249, 251, 253, 254, 255, 255, 255, 255, 255, 254, 253, 251, 249, 247, 245, 242, 239, 235, 231, 227, 223, 218, 213, 208, 203, 198, 192, 186, 180, 174, 168, 161, 155, 148, 141, 135, 128, 121, 115, 108, 101, 95, 88, 82, 76, 70, 64, 58, 53, 47, 42, 37, 33, 28, 24, 20, 17, 14, 11, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0, 1, 2, 4, 6, 8, 10, 13, 16, 20, 24, 28, 32, 37, 41, 46, 52, 57, 63, 69, 75, 81, 87, 94, 100, 107, 113, 120, 127, 133, 140, 147, 153, 160, 166, 173, 179, 185, 191, 197, 202, 207, 213, 217, 222, 226, 231, 234, 238, 241, 244, 247, 249, 251, 253, 254, 255, 255, 255, 255, 255, 254, 253, 251, 249, 247, 245, 242, 239, 235, 232, 228, 223, 219, 214 }, 165 | { 221, 214, 207, 199, 191, 182, 173, 163, 153, 142, 132, 121, 111, 100, 90, 80, 70, 60, 51, 43, 35, 28, 22, 16, 11, 7, 4, 1, 0, 0, 0, 1, 4, 7, 11, 16, 21, 28, 35, 43, 51, 60, 69, 79, 89, 100, 110, 121, 131, 142, 152, 162, 172, 182, 191, 199, 207, 214, 221, 226, 231, 235, 238, 241, 242, 243, 242, 241, 239, 236, 231, 227, 221, 215, 207, 200, 191, 182, 173, 163, 153, 143, 132, 122, 111, 100, 90, 80, 70, 61, 52, 43, 35, 28, 22, 16, 11, 7, 4, 1, 0, 0, 0, 1, 3, 7, 11, 15, 21, 28, 35, 42, 51, 60, 69, 79, 89, 99, 110, 120, 131, 142, 152, 162, 172, 181, 190, 199, 207, 214, 220, 226, 231, 235, 238, 241, 242, 243, 242, 241, 239, 236, 232, 227, 221, 215, 208, 200, 192, 183, 173, 163, 153, 143, 133, 122, 111, 101, 90, 80, 71, 61, 52, 44, 36, 29, 22, 16, 11, 7, 4, 2, 0, 0, 0, 1, 3, 6, 10, 15, 21, 27, 34, 42, 51, 59, 69, 79, 89, 99, 109, 120, 131, 141, 152, 162, 171, 181, 190, 198, 206, 214, 220, 226, 231, 235, 238, 241, 242, 243, 242, 241, 239, 236, 232, 227, 221, 215, 208, 200, 192, 183, 174, 164, 154, 143, 133, 122, 112, 101, 91, 81, 71, 61, 52, 44, 36, 29, 22, 16, 11, 7, 4, 2, 0, 0, 0, 1, 3, 6, 10, 15, 21, 27, 34, 42 }, 166 | { 165, 158, 150, 143, 135, 127, 119, 111, 103, 95, 87, 79, 72, 64, 57, 50, 44, 38, 32, 27, 22, 17, 13, 10, 7, 4, 2, 1, 0, 0, 0, 1, 2, 4, 6, 9, 13, 17, 21, 26, 32, 37, 44, 50, 57, 64, 71, 79, 87, 94, 102, 110, 118, 126, 134, 142, 150, 158, 165, 172, 179, 185, 192, 197, 203, 208, 212, 216, 220, 223, 225, 227, 229, 230, 230, 230, 229, 227, 226, 223, 220, 217, 213, 208, 203, 198, 192, 186, 179, 173, 166, 158, 151, 143, 135, 127, 119, 111, 103, 95, 87, 80, 72, 65, 58, 51, 44, 38, 32, 27, 22, 17, 13, 10, 7, 4, 2, 1, 0, 0, 0, 1, 2, 4, 6, 9, 13, 17, 21, 26, 31, 37, 43, 50, 57, 64, 71, 79, 86, 94, 102, 110, 118, 126, 134, 142, 150, 157, 165, 172, 179, 185, 191, 197, 203, 207, 212, 216, 220, 223, 225, 227, 229, 230, 230, 230, 229, 228, 226, 223, 220, 217, 213, 208, 203, 198, 192, 186, 180, 173, 166, 159, 151, 143, 136, 128, 120, 112, 103, 96, 88, 80, 72, 65, 58, 51, 44, 38, 32, 27, 22, 17, 13, 10, 7, 4, 2, 1, 0, 0, 0, 0, 2, 4, 6, 9, 13, 17, 21, 26, 31, 37, 43, 49, 56, 63, 71, 78, 86, 94, 102, 110, 118, 126, 134, 142, 149, 157, 164, 171, 178, 185, 191, 197, 202, 207, 212, 216, 219, 223, 225, 227, 229, 230, 230, 230 }, 167 | { 97, 86, 75, 64, 54, 44, 36, 28, 20, 14, 9, 5, 2, 0, 0, 0, 2, 5, 9, 14, 20, 27, 35, 44, 54, 64, 74, 85, 97, 108, 119, 131, 142, 152, 162, 172, 181, 189, 196, 202, 208, 212, 215, 216, 217, 217, 215, 212, 208, 203, 197, 189, 181, 173, 163, 153, 142, 131, 120, 109, 97, 86, 75, 64, 54, 45, 36, 28, 21, 14, 9, 5, 2, 0, 0, 0, 2, 5, 9, 14, 20, 27, 35, 44, 53, 64, 74, 85, 96, 108, 119, 130, 141, 152, 162, 172, 181, 189, 196, 202, 207, 212, 215, 216, 217, 217, 215, 212, 208, 203, 197, 190, 182, 173, 163, 153, 143, 132, 120, 109, 98, 86, 75, 65, 55, 45, 36, 28, 21, 14, 9, 5, 2, 0, 0, 0, 2, 5, 9, 14, 20, 27, 35, 44, 53, 63, 74, 85, 96, 107, 119, 130, 141, 152, 162, 171, 180, 188, 196, 202, 207, 211, 215, 216, 217, 217, 215, 212, 208, 203, 197, 190, 182, 173, 164, 154, 143, 132, 121, 109, 98, 87, 76, 65, 55, 45, 36, 28, 21, 15, 9, 5, 2, 0, 0, 0, 2, 4, 8, 13, 20, 27, 35, 43, 53, 63, 73, 84, 96, 107, 118, 130, 141, 151, 162, 171, 180, 188, 196, 202, 207, 211, 214, 216, 217, 217, 215, 212, 208, 203, 197, 190, 182, 173, 164, 154, 143, 132, 121, 110, 98, 87, 76, 65, 55, 46, 37, 28, 21, 15, 10, 5, 2, 0, 0, 0 }, 168 | { 46, 42, 38, 33, 30, 26, 22, 19, 16, 13, 11, 8, 6, 5, 3, 2, 1, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 8, 11, 13, 16, 19, 22, 26, 29, 33, 37, 42, 46, 51, 55, 60, 65, 70, 75, 80, 86, 91, 96, 102, 107, 112, 118, 123, 128, 133, 138, 143, 148, 153, 157, 162, 166, 170, 174, 178, 181, 185, 188, 190, 193, 195, 197, 199, 201, 202, 203, 204, 204, 204, 204, 204, 203, 202, 201, 199, 198, 196, 193, 191, 188, 185, 182, 178, 175, 171, 167, 162, 158, 153, 149, 144, 139, 134, 129, 124, 118, 113, 108, 102, 97, 92, 86, 81, 76, 71, 66, 61, 56, 51, 46, 42, 38, 34, 30, 26, 23, 19, 16, 13, 11, 9, 6, 5, 3, 2, 1, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 8, 10, 13, 16, 19, 22, 25, 29, 33, 37, 41, 46, 50, 55, 60, 65, 70, 75, 80, 85, 91, 96, 101, 107, 112, 117, 123, 128, 133, 138, 143, 148, 153, 157, 162, 166, 170, 174, 178, 181, 184, 187, 190, 193, 195, 197, 199, 201, 202, 203, 204, 204, 204, 204, 204, 203, 202, 201, 199, 198, 196, 193, 191, 188, 185, 182, 178, 175, 171, 167, 163, 158, 154, 149, 144, 139, 134, 129, 124, 119, 113, 108, 103, 97, 92, 87, 81, 76, 71, 66, 61, 56, 51, 47, 42, 38, 34, 30, 26, 23, 20, 16, 14, 11, 9, 7, 5, 3, 2 }, 169 | { 9, 5, 3, 1, 0, 0, 0, 1, 3, 5, 8, 12, 17, 22, 27, 34, 40, 47, 55, 62, 70, 79, 87, 95, 104, 112, 120, 128, 136, 143, 150, 157, 163, 169, 174, 178, 182, 186, 188, 190, 191, 191, 191, 190, 188, 186, 183, 179, 174, 169, 164, 157, 151, 144, 136, 129, 121, 113, 104, 96, 88, 79, 71, 63, 55, 48, 41, 34, 28, 22, 17, 13, 9, 5, 3, 1, 0, 0, 0, 1, 3, 5, 8, 12, 17, 22, 27, 33, 40, 47, 54, 62, 70, 78, 87, 95, 103, 112, 120, 128, 136, 143, 150, 157, 163, 169, 174, 178, 182, 186, 188, 190, 191, 191, 191, 190, 188, 186, 183, 179, 175, 169, 164, 158, 151, 144, 137, 129, 121, 113, 105, 96, 88, 80, 71, 63, 56, 48, 41, 34, 28, 22, 17, 13, 9, 6, 3, 1, 0, 0, 0, 1, 3, 5, 8, 12, 16, 21, 27, 33, 40, 47, 54, 62, 70, 78, 86, 95, 103, 111, 120, 128, 135, 143, 150, 157, 163, 168, 174, 178, 182, 185, 188, 190, 191, 191, 191, 190, 188, 186, 183, 179, 175, 170, 164, 158, 151, 144, 137, 129, 121, 113, 105, 96, 88, 80, 72, 64, 56, 48, 41, 35, 28, 23, 17, 13, 9, 6, 3, 1, 0, 0, 0, 1, 2, 5, 8, 12, 16, 21, 27, 33, 40, 47, 54, 62, 70, 78, 86, 94, 103, 111, 119, 127, 135, 142, 150, 156, 163, 168, 173, 178, 182, 185, 188, 190 }, 170 | { 0, 0, 1, 3, 5, 7, 10, 13, 17, 20, 25, 29, 34, 39, 44, 50, 55, 61, 67, 73, 80, 86, 92, 98, 104, 111, 117, 122, 128, 134, 139, 144, 149, 153, 158, 161, 165, 168, 171, 173, 175, 177, 178, 178, 179, 179, 178, 177, 175, 173, 171, 168, 165, 162, 158, 154, 149, 145, 139, 134, 129, 123, 117, 111, 105, 99, 93, 86, 80, 74, 68, 62, 56, 50, 45, 39, 34, 29, 25, 21, 17, 13, 10, 7, 5, 3, 2, 0, 0, 0, 0, 0, 1, 3, 5, 7, 10, 13, 16, 20, 24, 29, 34, 39, 44, 49, 55, 61, 67, 73, 79, 85, 92, 98, 104, 110, 116, 122, 128, 133, 139, 144, 149, 153, 157, 161, 165, 168, 171, 173, 175, 177, 178, 178, 179, 179, 178, 177, 175, 173, 171, 168, 165, 162, 158, 154, 150, 145, 140, 134, 129, 123, 117, 111, 105, 99, 93, 87, 80, 74, 68, 62, 56, 50, 45, 40, 34, 30, 25, 21, 17, 13, 10, 8, 5, 3, 2, 0, 0, 0, 0, 0, 1, 3, 5, 7, 10, 13, 16, 20, 24, 29, 33, 38, 44, 49, 55, 61, 67, 73, 79, 85, 91, 98, 104, 110, 116, 122, 128, 133, 139, 144, 148, 153, 157, 161, 165, 168, 171, 173, 175, 177, 178, 178, 179, 179, 178, 177, 175, 174, 171, 169, 166, 162, 158, 154, 150, 145, 140, 135, 129, 124, 118, 112, 106, 99, 93, 87, 81, 74, 68, 62, 56, 51, 45, 40 }, 171 | { 15, 21, 27, 34, 41, 49, 57, 65, 74, 83, 91, 100, 108, 116, 124, 131, 138, 144, 150, 155, 159, 162, 164, 165, 166, 165, 164, 162, 159, 155, 150, 145, 139, 132, 125, 117, 109, 100, 92, 83, 74, 66, 57, 49, 41, 34, 27, 21, 16, 11, 7, 4, 1, 0, 0, 0, 1, 3, 7, 10, 15, 21, 27, 33, 41, 48, 57, 65, 74, 82, 91, 100, 108, 116, 124, 131, 138, 144, 150, 154, 158, 162, 164, 165, 166, 165, 164, 162, 159, 155, 150, 145, 139, 132, 125, 117, 109, 101, 92, 83, 75, 66, 58, 49, 42, 34, 27, 21, 16, 11, 7, 4, 1, 0, 0, 0, 1, 3, 6, 10, 15, 20, 27, 33, 40, 48, 56, 65, 73, 82, 91, 99, 108, 116, 124, 131, 138, 144, 150, 154, 158, 162, 164, 165, 166, 166, 164, 162, 159, 155, 150, 145, 139, 132, 125, 117, 109, 101, 92, 84, 75, 66, 58, 50, 42, 35, 28, 21, 16, 11, 7, 4, 2, 0, 0, 0, 1, 3, 6, 10, 15, 20, 26, 33, 40, 48, 56, 64, 73, 82, 90, 99, 107, 116, 123, 131, 138, 144, 149, 154, 158, 161, 164, 165, 166, 166, 164, 162, 159, 155, 151, 145, 139, 132, 125, 118, 109, 101, 93, 84, 75, 67, 58, 50, 42, 35, 28, 22, 16, 11, 7, 4, 2, 0, 0, 0, 1, 3, 6, 10, 15, 20, 26, 33, 40, 48, 56, 64, 73, 81, 90, 99, 107, 115, 123, 131 } 172 | }; 173 | 174 | const static byte harm_table[8][256]PROGMEM = { 175 | { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4 }, 176 | { 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, 177 | { 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, 178 | { 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, 179 | { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 6, 6, 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 7, 6, 5, 5, 4, 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 6, 6, 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 7, 6, 5, 5, 4, 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 4 }, 180 | { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 12, 12, 12, 12, 14, 14, 14 }, 181 | { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 10, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 14, 12, 12, 10, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 10, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 12, 12, 12, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 10, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 12, 12, 12, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 3 }, 182 | { 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 10, 10, 10, 12, 12, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 12, 12, 12, 10, 10, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 10, 10, 10, 12, 12, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 14, 14, 14, 12, 12, 12, 10, 10, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 6 } 183 | }; 184 | 185 | 186 | 187 | Q16n16 deviation; 188 | Q16n16 carrier_freq, mod_freq, knob_freq; 189 | 190 | 191 | void setup() 192 | { 193 | startMozzi(CONTROL_RATE); 194 | 195 | pinMode(6, OUTPUT); 196 | pinMode(7, OUTPUT); 197 | pinMode(8, OUTPUT); 198 | pinMode(5,INPUT_PULLUP); 199 | pinMode(4,INPUT_PULLUP); 200 | 201 | } 202 | 203 | 204 | void setFreqs(Q16n16 freq) { 205 | carrier_freq = freq ; // V/oct apply 206 | mod_freq = ((carrier_freq >> 8) * (mozziAnalogRead(1) / 2 +mozziAnalogRead(4) / 2)); 207 | deviation = ((mod_freq >> 16) * (1 + mozziAnalogRead(3)+mozziAnalogRead(5))); // (Q16n16>>16) Q8n8 = Q24n8, beware of overflow 208 | aCarrier.setFreq_Q16n16(carrier_freq); 209 | aModulator.setFreq_Q16n16(mod_freq); 210 | } 211 | 212 | 213 | void updateControl() { 214 | 215 | Mode_CV = map(mozziAnalogRead(2),0,1023,0,2); 216 | Gain_CV_0 = map(mozziAnalogRead(6),0,1023,0,1023); 217 | Gain_CV_1 = map(Gain_CV_0,0,1023,0,511); 218 | Gain_CV_2 = map(Gain_CV_0,0,1023,0,255); 219 | 220 | AnalogRead0 = mozziAnalogRead(0); 221 | AnalogRead1 = mozziAnalogRead(1); 222 | AnalogRead3 = mozziAnalogRead(3); 223 | AnalogRead4 = mozziAnalogRead(4); 224 | AnalogRead5 = mozziAnalogRead(5); 225 | AnalogRead7 = mozziAnalogRead(7); 226 | 227 | if(digitalRead(5) == false) { 228 | Switch = 0; 229 | } 230 | else if ((digitalRead(4) == false)) { 231 | Switch = 2; 232 | } 233 | else if ((digitalRead(5) == true) && (digitalRead(4) == true)) { 234 | Switch = 1; 235 | } 236 | 237 | 238 | if (Switch == 0) { 239 | switch (Mode_CV) { 240 | case 0: 241 | Mode = 0; 242 | break; 243 | case 1: 244 | Mode = 1; 245 | break; 246 | case 2: 247 | Mode = 2; 248 | break; 249 | } 250 | 251 | 252 | } 253 | 254 | else if (Switch == 1) { 255 | switch (Mode_CV) { 256 | case 0: 257 | Mode = 1; 258 | break; 259 | case 1: 260 | Mode = 2; 261 | break; 262 | case 2: 263 | Mode = 0; 264 | break; 265 | 266 | } 267 | } 268 | 269 | else if (Switch == 2) { 270 | switch (Mode_CV) { 271 | case 0: 272 | Mode = 2; 273 | break; 274 | case 1: 275 | Mode = 1; 276 | break; 277 | case 2: 278 | Mode = 0; 279 | break; 280 | 281 | } 282 | } 283 | 284 | 285 | 286 | 287 | 288 | 289 | if (Mode == 2) { 290 | 291 | 292 | 293 | voct = AnalogRead7 ; 294 | //harmonics 295 | harm_knob = (AnalogRead3 / 4) + (AnalogRead5 / 4); 296 | harm_knob = constrain(harm_knob, 0, 255); 297 | 298 | //harmonics_gain 299 | gain = (AnalogRead1 / 4) + (AnalogRead4 / 4); 300 | gain = constrain(gain, 0, 255); 301 | 302 | //OSC frequency knob 303 | freq1 = AnalogRead0 / 8 ; 304 | 305 | //frequency setting 306 | 307 | freqv1 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct])))); // V/oct apply 308 | 309 | aSin1.setFreq(freqv1); // set the frequency 310 | aSin2.setFreq(freqv1 * (pgm_read_byte(&(harm_table[0][harm_knob])))); 311 | aSin3.setFreq(freqv1 * (pgm_read_byte(&(harm_table[1][harm_knob])))); 312 | aSin4.setFreq(freqv1 * (pgm_read_byte(&(harm_table[2][harm_knob])))); 313 | aSin5.setFreq(freqv1 * (pgm_read_byte(&(harm_table[3][harm_knob])))); 314 | aSin6.setFreq(freqv1 * (pgm_read_byte(&(harm_table[4][harm_knob])))); 315 | aSin7.setFreq(freqv1 * (pgm_read_byte(&(harm_table[5][harm_knob])))); 316 | aSin8.setFreq(freqv1 * (pgm_read_byte(&(harm_table[6][harm_knob])))); 317 | 318 | digitalWrite(8,HIGH); 319 | digitalWrite(7,LOW); 320 | digitalWrite(6,LOW); 321 | 322 | } 323 | 324 | else if (Mode == 0) { 325 | 326 | 327 | digitalWrite(7,HIGH); 328 | digitalWrite(8,LOW); 329 | digitalWrite(6,LOW); 330 | 331 | voct = AnalogRead7; 332 | knob_freq = AnalogRead0; 333 | setFreqs((2270658 + knob_freq * 5000) * pow(2, (pgm_read_float(&(voctpow[voct]))))) ; 334 | 335 | } 336 | 337 | else { 338 | 339 | digitalWrite(6,HIGH); 340 | digitalWrite(7,LOW); 341 | digitalWrite(8,LOW); 342 | 343 | //chord setting 344 | chord = (AnalogRead3 / 128) + (AnalogRead5 / 128); 345 | chord = constrain(chord, 0, 7); 346 | 347 | //inversion setting 348 | inv_knob = AnalogRead1; 349 | inv = (inv_knob / 64)+ (AnalogRead4 / 64); 350 | inv = constrain(inv, 0, 15); 351 | 352 | if (inv_knob < 1020) { //when selecting wave , not apply 353 | switch (inv) { 354 | case 0: 355 | inv_aply1 = 0; 356 | inv_aply2 = 0; 357 | inv_aply3 = 0; 358 | inv_aply4 = 0; 359 | inv_aply5 = 0; 360 | break; 361 | 362 | case 1: 363 | inv_aply1 = 1; 364 | inv_aply2 = 0; 365 | inv_aply3 = 0; 366 | inv_aply4 = 0; 367 | inv_aply5 = 0; 368 | break; 369 | 370 | case 2: 371 | inv_aply1 = 1; 372 | inv_aply2 = 1; 373 | inv_aply3 = 0; 374 | inv_aply4 = 0; 375 | inv_aply5 = 0; 376 | break; 377 | 378 | case 3: 379 | inv_aply1 = 1; 380 | inv_aply2 = 1; 381 | inv_aply3 = 1; 382 | inv_aply4 = 0; 383 | inv_aply5 = 0; 384 | break; 385 | 386 | case 4: 387 | inv_aply1 = 1; 388 | inv_aply2 = 1; 389 | inv_aply3 = 1; 390 | inv_aply4 = 1; 391 | inv_aply5 = 0; 392 | break; 393 | 394 | case 5: 395 | inv_aply1 = 2; 396 | inv_aply2 = 1; 397 | inv_aply3 = 1; 398 | inv_aply4 = 1; 399 | inv_aply5 = 0; 400 | break; 401 | 402 | case 6: 403 | inv_aply1 = 2; 404 | inv_aply2 = 2; 405 | inv_aply3 = 1; 406 | inv_aply4 = 1; 407 | inv_aply5 = 0; 408 | break; 409 | 410 | case 7: 411 | inv_aply1 = 2; 412 | inv_aply2 = 2; 413 | inv_aply3 = 2; 414 | inv_aply4 = 1; 415 | inv_aply5 = 0; 416 | break; 417 | 418 | case 8: 419 | inv_aply1 = 2; 420 | inv_aply2 = 2; 421 | inv_aply3 = 2; 422 | inv_aply4 = 1; 423 | inv_aply5 = 1; 424 | break; 425 | 426 | case 9: 427 | inv_aply1 = 2; 428 | inv_aply2 = 2; 429 | inv_aply3 = 1; 430 | inv_aply4 = 1; 431 | inv_aply5 = 1; 432 | break; 433 | 434 | case 10: 435 | inv_aply1 = 2; 436 | inv_aply2 = 1; 437 | inv_aply3 = 1; 438 | inv_aply4 = 1; 439 | inv_aply5 = 1; 440 | break; 441 | 442 | case 11: 443 | inv_aply1 = 1; 444 | inv_aply2 = 1; 445 | inv_aply3 = 1; 446 | inv_aply4 = 1; 447 | inv_aply5 = 1; 448 | break; 449 | 450 | case 12: 451 | inv_aply1 = 1; 452 | inv_aply2 = 1; 453 | inv_aply3 = 1; 454 | inv_aply4 = 0; 455 | inv_aply5 = 1; 456 | break; 457 | 458 | case 13: 459 | inv_aply1 = 1; 460 | inv_aply2 = 1; 461 | inv_aply3 = 0; 462 | inv_aply4 = 0; 463 | inv_aply5 = 1; 464 | break; 465 | 466 | case 14: 467 | inv_aply1 = 1; 468 | inv_aply2 = 0; 469 | inv_aply3 = 0; 470 | inv_aply4 = 0; 471 | inv_aply5 = 1; 472 | break; 473 | 474 | case 15: 475 | inv_aply1 = 0; 476 | inv_aply2 = 0; 477 | inv_aply3 = 0; 478 | inv_aply4 = 0; 479 | inv_aply5 = 1; 480 | break; 481 | } 482 | } 483 | //setting chord note 484 | if (inv_knob < 1020) { //when selecting wave , not apply 485 | note1 = (pgm_read_byte(&(chord_table[chord][0]))); 486 | note2 = (pgm_read_byte(&(chord_table[chord][1]))); 487 | note3 = (pgm_read_byte(&(chord_table[chord][2]))); 488 | note4 = (pgm_read_byte(&(chord_table[chord][3]))); 489 | note5 = (pgm_read_byte(&(chord_table[chord][0]))); 490 | } 491 | 492 | //OSC frequency knob 493 | freq1 = AnalogRead0 / 4 ; 494 | 495 | //set wave 496 | if (inv_knob >= 1020) { //inv knob max 497 | wave = (AnalogRead3 / 128); 498 | } 499 | 500 | //frequency setting 501 | voct2 = AnalogRead7 ; 502 | freqv1 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct2 + 205 * inv_aply1 + note1])))); //ROOT 503 | freqv2 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct2 + 205 * inv_aply2 + note2])))); //2nd 504 | freqv3 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct2 + 205 * inv_aply3 + note3])))); //3rd 505 | freqv4 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct2 + 205 * inv_aply4 + note4])))); //4th 506 | freqv5 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct2 + note5])))); //ROOT 507 | 508 | switch (wave) { 509 | case 0://saw 510 | aSaw1.setFreq(freqv1); // set the frequency 511 | aSaw2.setFreq(freqv2); 512 | aSaw3.setFreq(freqv3); 513 | aSaw4.setFreq(freqv4); 514 | aSaw5.setFreq(freqv5); 515 | break; 516 | 517 | case 1://squ 518 | aSqu1.setFreq(freqv1); // set the frequency 519 | aSqu2.setFreq(freqv2); 520 | aSqu3.setFreq(freqv3); 521 | aSqu4.setFreq(freqv4); 522 | aSqu5.setFreq(freqv5); 523 | break; 524 | 525 | case 2://tri 526 | aTri1.setFreq(freqv1); // set the frequency 527 | aTri2.setFreq(freqv2); 528 | aTri3.setFreq(freqv3); 529 | aTri4.setFreq(freqv4); 530 | aTri5.setFreq(freqv5); 531 | break; 532 | 533 | case 3://sin 534 | aSin1.setFreq(freqv1); // set the frequency 535 | aSin2.setFreq(freqv2); 536 | aSin3.setFreq(freqv3); 537 | aSin4.setFreq(freqv4); 538 | aSin5.setFreq(freqv5); 539 | break; 540 | 541 | case 4:// 542 | aChb1.setFreq(freqv1); // set the frequency 543 | aChb2.setFreq(freqv2); 544 | aChb3.setFreq(freqv3); 545 | aChb4.setFreq(freqv4); 546 | aChb5.setFreq(freqv5); 547 | break; 548 | 549 | case 5:// 550 | ahSin1.setFreq(freqv1); // set the frequency 551 | ahSin2.setFreq(freqv2); 552 | ahSin3.setFreq(freqv3); 553 | ahSin4.setFreq(freqv4); 554 | ahSin5.setFreq(freqv5); 555 | break; 556 | 557 | case 6:// 558 | aSig1.setFreq(freqv1); // set the frequency 559 | aSig2.setFreq(freqv2); 560 | aSig3.setFreq(freqv3); 561 | aSig4.setFreq(freqv4); 562 | aSig5.setFreq(freqv5); 563 | break; 564 | 565 | case 7:// 566 | aPha1.setFreq(freqv1); // set the frequency 567 | aPha2.setFreq(freqv2); 568 | aPha3.setFreq(freqv3); 569 | aPha4.setFreq(freqv4); 570 | aPha5.setFreq(freqv5); 571 | break; 572 | } 573 | 574 | 575 | 576 | 577 | } 578 | 579 | 580 | 581 | } 582 | 583 | 584 | 585 | int updateAudio() { 586 | 587 | 588 | if (Mode == 2) { 589 | 590 | return MonoOutput::from8Bit((aSin1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 1024 + aSin2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 1024 + aSin3.next() * (pgm_read_byte(&(gain_table[2][gain]))) / 1024 + aSin4.next() * (pgm_read_byte(&(gain_table[3][gain]))) / 1024 + aSin5.next() * (pgm_read_byte(&(gain_table[4][gain]))) / 1024 + aSin6.next() * (pgm_read_byte(&(gain_table[5][gain]))) / 1024 + aSin7.next() * (pgm_read_byte(&(gain_table[6][gain]))) / 1024 + aSin8.next() * (pgm_read_byte(&(gain_table[7][gain]))) / 1024)*Gain_CV_2/128); 591 | 592 | } 593 | 594 | 595 | else if (Mode == 0) { 596 | 597 | Q15n16 modulation = deviation * aModulator.next() >> 8; 598 | return MonoOutput::from8Bit(aCarrier.phMod(modulation)*Gain_CV_1/256); // Internally still only 8 bits, will be shifted up to 14 bits in HIFI mode 599 | 600 | 601 | } 602 | 603 | else { 604 | 605 | switch (wave) { 606 | 607 | case 0: 608 | return MonoOutput::from8Bit((aSaw1.next() / 8 + aSaw2.next() / 8 + aSaw3.next() / 8 + aSaw4.next() / 8 + aSaw5.next() / 8 * inv_aply5)*Gain_CV_0/256); 609 | break; 610 | 611 | case 1: 612 | return MonoOutput::from8Bit((aSqu1.next() / 8 + aSqu2.next() / 8 + aSqu3.next() / 8 + aSqu4.next() / 8 + aSqu5.next() / 8 * inv_aply5)*Gain_CV_0/256); 613 | break; 614 | 615 | case 2: 616 | return MonoOutput::from8Bit((aTri1.next() / 8 + aTri2.next() / 8 + aTri3.next() / 8 + aTri4.next() / 8 + aTri5.next() / 8 * inv_aply5)*Gain_CV_0/256); 617 | break; 618 | 619 | case 3: 620 | return MonoOutput::from8Bit((aSin1.next() / 8 + aSin2.next() / 8 + aSin3.next() / 8 + aSin4.next() / 8 + aSin5.next() / 8 * inv_aply5)*Gain_CV_0/256); 621 | break; 622 | 623 | case 4: 624 | return MonoOutput::from8Bit((aChb1.next() / 8 + aChb2.next() / 8 + aChb3.next() / 8 + aChb4.next() / 8 + aChb5.next() / 8 * inv_aply5)*Gain_CV_0/256); 625 | break; 626 | 627 | case 5: 628 | return MonoOutput::from8Bit((ahSin1.next() / 8 + ahSin2.next() / 8 + ahSin3.next() / 8 + ahSin4.next() / 8 + ahSin5.next() / 8 * inv_aply5)*Gain_CV_0/256); 629 | break; 630 | 631 | case 6: 632 | return MonoOutput::from8Bit((aSig1.next() / 8 + aSig2.next() / 8 + aSig3.next() / 8 + aSig4.next() / 8 + aSig5.next() / 8 * inv_aply5)*Gain_CV_0/256); 633 | break; 634 | 635 | case 7: 636 | return MonoOutput::from8Bit((aPha1.next() / 8 + aPha2.next() / 8 + aPha3.next() / 8 + aPha4.next() / 8 + aPha5.next() / 8 * inv_aply5)*Gain_CV_0/256); 637 | break; 638 | 639 | } 640 | 641 | } 642 | 643 | 644 | 645 | 646 | } 647 | 648 | void loop() { 649 | audioHook(); // required here 650 | 651 | 652 | } 653 | -------------------------------------------------------------------------------- /Triple_DCO_1.3.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | 6 | #include //Wavetables for Oscillators 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | 16 | 17 | 18 | 19 | Oscil kModIndex(SIN2048_DATA); 20 | 21 | 22 | Oscil aSin1(SIN2048_DATA); 23 | Oscil aSin2(SIN2048_DATA); 24 | Oscil aSin3(SIN2048_DATA); 25 | Oscil aSin4(SIN2048_DATA); 26 | Oscil aSin5(SIN2048_DATA); 27 | Oscil aSin6(SIN2048_DATA); 28 | Oscil aSin7(SIN2048_DATA); 29 | 30 | 31 | Oscil aSaw1(SAW2048_DATA); 32 | Oscil aSaw2(SAW2048_DATA); 33 | Oscil aSaw3(SAW2048_DATA); 34 | Oscil aSaw4(SAW2048_DATA); 35 | Oscil aSaw5(SAW2048_DATA); 36 | Oscil aSaw6(SAW2048_DATA); 37 | Oscil aSaw7(SAW2048_DATA); 38 | 39 | Oscil aSqu1(SQUARE_NO_ALIAS512_DATA); 40 | Oscil aSqu2(SQUARE_NO_ALIAS512_DATA); 41 | Oscil aSqu3(SQUARE_NO_ALIAS512_DATA); 42 | Oscil aSqu4(SQUARE_NO_ALIAS512_DATA); 43 | Oscil aSqu5(SQUARE_NO_ALIAS512_DATA); 44 | Oscil aSqu6(SQUARE_NO_ALIAS512_DATA); 45 | Oscil aSqu7(SQUARE_NO_ALIAS512_DATA); 46 | 47 | Oscil aTri1(TRIANGLE512_DATA); 48 | Oscil aTri2(TRIANGLE512_DATA); 49 | Oscil aTri3(TRIANGLE512_DATA); 50 | Oscil aTri4(TRIANGLE512_DATA); 51 | Oscil aTri5(TRIANGLE512_DATA); 52 | Oscil aTri6(TRIANGLE512_DATA); 53 | Oscil aTri7(TRIANGLE512_DATA); 54 | 55 | Oscil aChb1(CHEBYSHEV_3RD_256_DATA); 56 | Oscil aChb2(CHEBYSHEV_3RD_256_DATA); 57 | Oscil aChb3(CHEBYSHEV_3RD_256_DATA); 58 | Oscil aChb4(CHEBYSHEV_3RD_256_DATA); 59 | Oscil aChb5(CHEBYSHEV_3RD_256_DATA); 60 | 61 | 62 | Oscil ahSin1(HALFSIN256_DATA); 63 | Oscil ahSin2(HALFSIN256_DATA); 64 | Oscil ahSin3(HALFSIN256_DATA); 65 | Oscil ahSin4(HALFSIN256_DATA); 66 | Oscil ahSin5(HALFSIN256_DATA); 67 | 68 | 69 | Oscil aSig1(WAVESHAPE_SIGMOID_DATA); 70 | Oscil aSig2(WAVESHAPE_SIGMOID_DATA); 71 | Oscil aSig3(WAVESHAPE_SIGMOID_DATA); 72 | Oscil aSig4(WAVESHAPE_SIGMOID_DATA); 73 | Oscil aSig5(WAVESHAPE_SIGMOID_DATA); 74 | 75 | 76 | Oscil aPha1(TRIANGLE_HERMES_2048_DATA); 77 | Oscil aPha2(TRIANGLE_HERMES_2048_DATA); 78 | Oscil aPha3(TRIANGLE_HERMES_2048_DATA); 79 | Oscil aPha4(TRIANGLE_HERMES_2048_DATA); 80 | Oscil aPha5(TRIANGLE_HERMES_2048_DATA); 81 | 82 | 83 | 84 | 85 | 86 | 87 | #define CONTROL_RATE 128 // Hz, owers of 2 are most reliable 88 | 89 | int freq1 = 110;//base freq of OSC1 90 | int voct = 1000;//external V/OCT LSB 91 | 92 | 93 | int AnalogRead0 = 0; 94 | int AnalogRead1 = 0; 95 | int AnalogRead3 = 0; 96 | int AnalogRead4 = 0; 97 | int AnalogRead5 = 0; 98 | int AnalogRead7 = 0; 99 | 100 | int AnalogSave1 = 0; 101 | int AnalogSave2 = 0; 102 | 103 | 104 | 105 | 106 | int freqv1 = 440; 107 | int freqv2 = 440; 108 | int freqv3 = 440; 109 | int freqv4 = 440; 110 | int freqv5 = 440; 111 | 112 | 113 | byte note1 = 0; //Root 114 | byte note2 = 0; //2nd 115 | byte note3 = 0; //3rd 116 | byte note4 = 0; //4th 117 | byte note5 = 0; //Root 118 | 119 | byte inv_aply1 = 0; //0 = no inv , 1 = inv , Root 120 | byte inv_aply2 = 0; //2nd 121 | byte inv_aply3 = 0; //3rd 122 | byte inv_aply4 = 0; //4th 123 | bool inv_aply5 = 0; //0 = no output root sound , 1 = output root sound 124 | 125 | int inv = 0; 126 | int inv_knob = 0; 127 | int chord = 0; 128 | 129 | 130 | 131 | byte wave0 = 0; //wave select 132 | byte wave1 = 0; 133 | byte wave2 = 0; 134 | 135 | 136 | 137 | int harm_knob = 0; //AD wave knob 138 | byte gain = 127; 139 | 140 | int Switch = 0; 141 | int Mode = 0; 142 | int Mode_CV = 0; 143 | 144 | 145 | int Gain_CV_0 = 0; 146 | int Gain_CV_1 = 0; 147 | int Gain_CV_2 = 0; 148 | 149 | 150 | 151 | const static byte chord_table[8][4]PROGMEM = { 152 | { 0, 68, 119, 205, },//Maj 153 | { 0, 68, 119, 187, },//Maj7 154 | { 0, 68, 119, 239, },//Majadd9 155 | { 0, 34, 119, 205, },//sus2 156 | { 0, 51, 119, 239, },//minadd9 157 | { 0, 51, 119, 170, },//min7 158 | { 0, 51, 119, 205, },//min 159 | { 0, 0, 0, 0, }//root 160 | }; 161 | 162 | 163 | const static float voctpow[1024] PROGMEM = { 164 | 0, 0.004882, 0.009765, 0.014648, 0.019531, 0.024414, 0.029296, 0.034179, 0.039062, 0.043945, 0.048828, 0.05371, 0.058593, 0.063476, 0.068359, 0.073242, 0.078125, 0.083007, 0.08789, 0.092773, 0.097656, 0.102539, 0.107421, 0.112304, 0.117187, 0.12207, 0.126953, 0.131835, 0.136718, 0.141601, 0.146484, 0.151367, 0.15625, 0.161132, 0.166015, 0.170898, 0.175781, 0.180664, 0.185546, 0.190429, 0.195312, 0.200195, 0.205078, 0.20996, 0.214843, 0.219726, 0.224609, 0.229492, 0.234375, 0.239257, 0.24414, 0.249023, 0.253906, 0.258789, 0.263671, 0.268554, 0.273437, 0.27832, 0.283203, 0.288085, 0.292968, 0.297851, 0.302734, 0.307617, 0.3125, 0.317382, 0.322265, 0.327148, 0.332031, 0.336914, 0.341796, 0.346679, 0.351562, 0.356445, 0.361328, 0.36621, 0.371093, 0.375976, 0.380859, 0.385742, 0.390625, 0.395507, 0.40039, 0.405273, 0.410156, 0.415039, 0.419921, 0.424804, 0.429687, 0.43457, 0.439453, 0.444335, 0.449218, 0.454101, 0.458984, 0.463867, 0.46875, 0.473632, 0.478515, 0.483398, 0.488281, 0.493164, 0.498046, 0.502929, 0.507812, 0.512695, 0.517578, 0.52246, 0.527343, 0.532226, 0.537109, 0.541992, 0.546875, 0.551757, 0.55664, 0.561523, 0.566406, 0.571289, 0.576171, 0.581054, 0.585937, 0.59082, 0.595703, 0.600585, 0.605468, 0.610351, 0.615234, 0.620117, 0.625, 0.629882, 0.634765, 0.639648, 0.644531, 0.649414, 0.654296, 0.659179, 0.664062, 0.668945, 0.673828, 0.67871, 0.683593, 0.688476, 0.693359, 0.698242, 0.703125, 0.708007, 0.71289, 0.717773, 0.722656, 0.727539, 0.732421, 0.737304, 0.742187, 0.74707, 0.751953, 0.756835, 0.761718, 0.766601, 0.771484, 0.776367, 0.78125, 0.786132, 0.791015, 0.795898, 0.800781, 0.805664, 0.810546, 0.815429, 0.820312, 0.825195, 0.830078, 0.83496, 0.839843, 0.844726, 0.849609, 0.854492, 0.859375, 0.864257, 0.86914, 0.874023, 0.878906, 0.883789, 0.888671, 0.893554, 0.898437, 0.90332, 0.908203, 0.913085, 0.917968, 0.922851, 0.927734, 0.932617, 0.9375, 0.942382, 0.947265, 0.952148, 0.957031, 0.961914, 0.966796, 0.971679, 0.976562, 0.981445, 0.986328, 0.99121, 0.996093, 1.000976, 1.005859, 1.010742, 1.015625, 1.020507, 1.02539, 1.030273, 1.035156, 1.040039, 1.044921, 1.049804, 1.054687, 1.05957, 1.064453, 1.069335, 1.074218, 1.079101, 1.083984, 1.088867, 1.09375, 1.098632, 1.103515, 1.108398, 1.113281, 1.118164, 1.123046, 1.127929, 1.132812, 1.137695, 1.142578, 1.14746, 1.152343, 1.157226, 1.162109, 1.166992, 1.171875, 1.176757, 1.18164, 1.186523, 1.191406, 1.196289, 1.201171, 1.206054, 1.210937, 1.21582, 1.220703, 1.225585, 1.230468, 1.235351, 1.240234, 1.245117, 1.25, 1.254882, 1.259765, 1.264648, 1.269531, 1.274414, 1.279296, 1.284179, 1.289062, 1.293945, 1.298828, 1.30371, 1.308593, 1.313476, 1.318359, 1.323242, 1.328125, 1.333007, 1.33789, 1.342773, 1.347656, 1.352539, 1.357421, 1.362304, 1.367187, 1.37207, 1.376953, 1.381835, 1.386718, 1.391601, 1.396484, 1.401367, 1.40625, 1.411132, 1.416015, 1.420898, 1.425781, 1.430664, 1.435546, 1.440429, 1.445312, 1.450195, 1.455078, 1.45996, 1.464843, 1.469726, 1.474609, 1.479492, 1.484375, 1.489257, 1.49414, 1.499023, 1.503906, 1.508789, 1.513671, 1.518554, 1.523437, 1.52832, 1.533203, 1.538085, 1.542968, 1.547851, 1.552734, 1.557617, 1.5625, 1.567382, 1.572265, 1.577148, 1.582031, 1.586914, 1.591796, 1.596679, 1.601562, 1.606445, 1.611328, 1.61621, 1.621093, 1.625976, 1.630859, 1.635742, 1.640625, 1.645507, 1.65039, 1.655273, 1.660156, 1.665039, 1.669921, 1.674804, 1.679687, 1.68457, 1.689453, 1.694335, 1.699218, 1.704101, 1.708984, 1.713867, 1.71875, 1.723632, 1.728515, 1.733398, 1.738281, 1.743164, 1.748046, 1.752929, 1.757812, 1.762695, 1.767578, 1.77246, 1.777343, 1.782226, 1.787109, 1.791992, 1.796875, 1.801757, 1.80664, 1.811523, 1.816406, 1.821289, 1.826171, 1.831054, 1.835937, 1.84082, 1.845703, 1.850585, 1.855468, 1.860351, 1.865234, 1.870117, 1.875, 1.879882, 1.884765, 1.889648, 1.894531, 1.899414, 1.904296, 1.909179, 1.914062, 1.918945, 1.923828, 1.92871, 1.933593, 1.938476, 1.943359, 1.948242, 1.953125, 1.958007, 1.96289, 1.967773, 1.972656, 1.977539, 1.982421, 1.987304, 1.992187, 1.99707, 2.001953, 2.006835, 2.011718, 2.016601, 2.021484, 2.026367, 2.03125, 2.036132, 2.041015, 2.045898, 2.050781, 2.055664, 2.060546, 2.065429, 2.070312, 2.075195, 2.080078, 2.08496, 2.089843, 2.094726, 2.099609, 2.104492, 2.109375, 2.114257, 2.11914, 2.124023, 2.128906, 2.133789, 2.138671, 2.143554, 2.148437, 2.15332, 2.158203, 2.163085, 2.167968, 2.172851, 2.177734, 2.182617, 2.1875, 2.192382, 2.197265, 2.202148, 2.207031, 2.211914, 2.216796, 2.221679, 2.226562, 2.231445, 2.236328, 2.24121, 2.246093, 2.250976, 2.255859, 2.260742, 2.265625, 2.270507, 2.27539, 2.280273, 2.285156, 2.290039, 2.294921, 2.299804, 2.304687, 2.30957, 2.314453, 2.319335, 2.324218, 2.329101, 2.333984, 2.338867, 2.34375, 2.348632, 2.353515, 2.358398, 2.363281, 2.368164, 2.373046, 2.377929, 2.382812, 2.387695, 2.392578, 2.39746, 2.402343, 2.407226, 2.412109, 2.416992, 2.421875, 2.426757, 2.43164, 2.436523, 2.441406, 2.446289, 2.451171, 2.456054, 2.460937, 2.46582, 2.470703, 2.475585, 2.480468, 2.485351, 2.490234, 2.495117, 2.5, 2.504882, 2.509765, 2.514648, 2.519531, 2.524414, 2.529296, 2.534179, 2.539062, 2.543945, 2.548828, 2.55371, 2.558593, 2.563476, 2.568359, 2.573242, 2.578125, 2.583007, 2.58789, 2.592773, 2.597656, 2.602539, 2.607421, 2.612304, 2.617187, 2.62207, 2.626953, 2.631835, 2.636718, 2.641601, 2.646484, 2.651367, 2.65625, 2.661132, 2.666015, 2.670898, 2.675781, 2.680664, 2.685546, 2.690429, 2.695312, 2.700195, 2.705078, 2.70996, 2.714843, 2.719726, 2.724609, 2.729492, 2.734375, 2.739257, 2.74414, 2.749023, 2.753906, 2.758789, 2.763671, 2.768554, 2.773437, 2.77832, 2.783203, 2.788085, 2.792968, 2.797851, 2.802734, 2.807617, 2.8125, 2.817382, 2.822265, 2.827148, 2.832031, 2.836914, 2.841796, 2.846679, 2.851562, 2.856445, 2.861328, 2.86621, 2.871093, 2.875976, 2.880859, 2.885742, 2.890625, 2.895507, 2.90039, 2.905273, 2.910156, 2.915039, 2.919921, 2.924804, 2.929687, 2.93457, 2.939453, 2.944335, 2.949218, 2.954101, 2.958984, 2.963867, 2.96875, 2.973632, 2.978515, 2.983398, 2.988281, 2.993164, 2.998046, 3.002929, 3.007812, 3.012695, 3.017578, 3.02246, 3.027343, 3.032226, 3.037109, 3.041992, 3.046875, 3.051757, 3.05664, 3.061523, 3.066406, 3.071289, 3.076171, 3.081054, 3.085937, 3.09082, 3.095703, 3.100585, 3.105468, 3.110351, 3.115234, 3.120117, 3.125, 3.129882, 3.134765, 3.139648, 3.144531, 3.149414, 3.154296, 3.159179, 3.164062, 3.168945, 3.173828, 3.17871, 3.183593, 3.188476, 3.193359, 3.198242, 3.203125, 3.208007, 3.21289, 3.217773, 3.222656, 3.227539, 3.232421, 3.237304, 3.242187, 3.24707, 3.251953, 3.256835, 3.261718, 3.266601, 3.271484, 3.276367, 3.28125, 3.286132, 3.291015, 3.295898, 3.300781, 3.305664, 3.310546, 3.315429, 3.320312, 3.325195, 3.330078, 3.33496, 3.339843, 3.344726, 3.349609, 3.354492, 3.359375, 3.364257, 3.36914, 3.374023, 3.378906, 3.383789, 3.388671, 3.393554, 3.398437, 3.40332, 3.408203, 3.413085, 3.417968, 3.422851, 3.427734, 3.432617, 3.4375, 3.442382, 3.447265, 3.452148, 3.457031, 3.461914, 3.466796, 3.471679, 3.476562, 3.481445, 3.486328, 3.49121, 3.496093, 3.500976, 3.505859, 3.510742, 3.515625, 3.520507, 3.52539, 3.530273, 3.535156, 3.540039, 3.544921, 3.549804, 3.554687, 3.55957, 3.564453, 3.569335, 3.574218, 3.579101, 3.583984, 3.588867, 3.59375, 3.598632, 3.603515, 3.608398, 3.613281, 3.618164, 3.623046, 3.627929, 3.632812, 3.637695, 3.642578, 3.64746, 3.652343, 3.657226, 3.662109, 3.666992, 3.671875, 3.676757, 3.68164, 3.686523, 3.691406, 3.696289, 3.701171, 3.706054, 3.710937, 3.71582, 3.720703, 3.725585, 3.730468, 3.735351, 3.740234, 3.745117, 3.75, 3.754882, 3.759765, 3.764648, 3.769531, 3.774414, 3.779296, 3.784179, 3.789062, 3.793945, 3.798828, 3.80371, 3.808593, 3.813476, 3.818359, 3.823242, 3.828125, 3.833007, 3.83789, 3.842773, 3.847656, 3.852539, 3.857421, 3.862304, 3.867187, 3.87207, 3.876953, 3.881835, 3.886718, 3.891601, 3.896484, 3.901367, 3.90625, 3.911132, 3.916015, 3.920898, 3.925781, 3.930664, 3.935546, 3.940429, 3.945312, 3.950195, 3.955078, 3.95996, 3.964843, 3.969726, 3.974609, 3.979492, 3.984375, 3.989257, 3.99414, 3.999023, 4.003906, 4.008789, 4.013671, 4.018554, 4.023437, 4.02832, 4.033203, 4.038085, 4.042968, 4.047851, 4.052734, 4.057617, 4.0625, 4.067382, 4.072265, 4.077148, 4.082031, 4.086914, 4.091796, 4.096679, 4.101562, 4.106445, 4.111328, 4.11621, 4.121093, 4.125976, 4.130859, 4.135742, 4.140625, 4.145507, 4.15039, 4.155273, 4.160156, 4.165039, 4.169921, 4.174804, 4.179687, 4.18457, 4.189453, 4.194335, 4.199218, 4.204101, 4.208984, 4.213867, 4.21875, 4.223632, 4.228515, 4.233398, 4.238281, 4.243164, 4.248046, 4.252929, 4.257812, 4.262695, 4.267578, 4.27246, 4.277343, 4.282226, 4.287109, 4.291992, 4.296875, 4.301757, 4.30664, 4.311523, 4.316406, 4.321289, 4.326171, 4.331054, 4.335937, 4.34082, 4.345703, 4.350585, 4.355468, 4.360351, 4.365234, 4.370117, 4.375, 4.379882, 4.384765, 4.389648, 4.394531, 4.399414, 4.404296, 4.409179, 4.414062, 4.418945, 4.423828, 4.42871, 4.433593, 4.438476, 4.443359, 4.448242, 4.453125, 4.458007, 4.46289, 4.467773, 4.472656, 4.477539, 4.482421, 4.487304, 4.492187, 4.49707, 4.501953, 4.506835, 4.511718, 4.516601, 4.521484, 4.526367, 4.53125, 4.536132, 4.541015, 4.545898, 4.550781, 4.555664, 4.560546, 4.565429, 4.570312, 4.575195, 4.580078, 4.58496, 4.589843, 4.594726, 4.599609, 4.604492, 4.609375, 4.614257, 4.61914, 4.624023, 4.628906, 4.633789, 4.638671, 4.643554, 4.648437, 4.65332, 4.658203, 4.663085, 4.667968, 4.672851, 4.677734, 4.682617, 4.6875, 4.692382, 4.697265, 4.702148, 4.707031, 4.711914, 4.716796, 4.721679, 4.726562, 4.731445, 4.736328, 4.74121, 4.746093, 4.750976, 4.755859, 4.760742, 4.765625, 4.770507, 4.77539, 4.780273, 4.785156, 4.790039, 4.794921, 4.799804, 4.804687, 4.80957, 4.814453, 4.819335, 4.824218, 4.829101, 4.833984, 4.838867, 4.84375, 4.848632, 4.853515, 4.858398, 4.863281, 4.868164, 4.873046, 4.877929, 4.882812, 4.887695, 4.892578, 4.89746, 4.902343, 4.907226, 4.912109, 4.916992, 4.921875, 4.926757, 4.93164, 4.936523, 4.941406, 4.946289, 4.951171, 4.956054, 4.960937, 4.96582, 4.970703, 4.975585, 4.980468, 4.985351, 4.990234, 4.995117 165 | }; 166 | 167 | 168 | const static byte gain_table[7][256]PROGMEM = { 169 | { 255, 255, 254, 253, 251, 249, 247, 244, 242, 238, 235, 231, 227, 223, 218, 213, 208, 203, 197, 192, 186, 180, 173, 167, 161, 154, 148, 141, 134, 128, 121, 114, 108, 101, 94, 88, 82, 76, 70, 64, 58, 52, 47, 42, 37, 32, 28, 24, 20, 17, 14, 11, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0, 1, 2, 4, 6, 8, 10, 13, 17, 20, 24, 28, 32, 37, 42, 47, 52, 58, 63, 69, 75, 81, 88, 94, 101, 107, 114, 120, 127, 134, 141, 147, 154, 160, 167, 173, 179, 185, 191, 197, 202, 208, 213, 218, 222, 227, 231, 235, 238, 241, 244, 247, 249, 251, 253, 254, 255, 255, 255, 255, 255, 254, 253, 251, 249, 247, 245, 242, 239, 235, 231, 227, 223, 218, 213, 208, 203, 198, 192, 186, 180, 174, 168, 161, 155, 148, 141, 135, 128, 121, 115, 108, 101, 95, 88, 82, 76, 70, 64, 58, 53, 47, 42, 37, 33, 28, 24, 20, 17, 14, 11, 8, 6, 4, 2, 1, 0, 0, 0, 0, 0, 1, 2, 4, 6, 8, 10, 13, 16, 20, 24, 28, 32, 37, 41, 46, 52, 57, 63, 69, 75, 81, 87, 94, 100, 107, 113, 120, 127, 133, 140, 147, 153, 160, 166, 173, 179, 185, 191, 197, 202, 207, 213, 217, 222, 226, 231, 234, 238, 241, 244, 247, 249, 251, 253, 254, 255, 255, 255, 255, 255, 254, 253, 251, 249, 247, 245, 242, 239, 235, 232, 228, 223, 219, 214 }, 170 | { 221, 214, 207, 199, 191, 182, 173, 163, 153, 142, 132, 121, 111, 100, 90, 80, 70, 60, 51, 43, 35, 28, 22, 16, 11, 7, 4, 1, 0, 0, 0, 1, 4, 7, 11, 16, 21, 28, 35, 43, 51, 60, 69, 79, 89, 100, 110, 121, 131, 142, 152, 162, 172, 182, 191, 199, 207, 214, 221, 226, 231, 235, 238, 241, 242, 243, 242, 241, 239, 236, 231, 227, 221, 215, 207, 200, 191, 182, 173, 163, 153, 143, 132, 122, 111, 100, 90, 80, 70, 61, 52, 43, 35, 28, 22, 16, 11, 7, 4, 1, 0, 0, 0, 1, 3, 7, 11, 15, 21, 28, 35, 42, 51, 60, 69, 79, 89, 99, 110, 120, 131, 142, 152, 162, 172, 181, 190, 199, 207, 214, 220, 226, 231, 235, 238, 241, 242, 243, 242, 241, 239, 236, 232, 227, 221, 215, 208, 200, 192, 183, 173, 163, 153, 143, 133, 122, 111, 101, 90, 80, 71, 61, 52, 44, 36, 29, 22, 16, 11, 7, 4, 2, 0, 0, 0, 1, 3, 6, 10, 15, 21, 27, 34, 42, 51, 59, 69, 79, 89, 99, 109, 120, 131, 141, 152, 162, 171, 181, 190, 198, 206, 214, 220, 226, 231, 235, 238, 241, 242, 243, 242, 241, 239, 236, 232, 227, 221, 215, 208, 200, 192, 183, 174, 164, 154, 143, 133, 122, 112, 101, 91, 81, 71, 61, 52, 44, 36, 29, 22, 16, 11, 7, 4, 2, 0, 0, 0, 1, 3, 6, 10, 15, 21, 27, 34, 42 }, 171 | { 165, 158, 150, 143, 135, 127, 119, 111, 103, 95, 87, 79, 72, 64, 57, 50, 44, 38, 32, 27, 22, 17, 13, 10, 7, 4, 2, 1, 0, 0, 0, 1, 2, 4, 6, 9, 13, 17, 21, 26, 32, 37, 44, 50, 57, 64, 71, 79, 87, 94, 102, 110, 118, 126, 134, 142, 150, 158, 165, 172, 179, 185, 192, 197, 203, 208, 212, 216, 220, 223, 225, 227, 229, 230, 230, 230, 229, 227, 226, 223, 220, 217, 213, 208, 203, 198, 192, 186, 179, 173, 166, 158, 151, 143, 135, 127, 119, 111, 103, 95, 87, 80, 72, 65, 58, 51, 44, 38, 32, 27, 22, 17, 13, 10, 7, 4, 2, 1, 0, 0, 0, 1, 2, 4, 6, 9, 13, 17, 21, 26, 31, 37, 43, 50, 57, 64, 71, 79, 86, 94, 102, 110, 118, 126, 134, 142, 150, 157, 165, 172, 179, 185, 191, 197, 203, 207, 212, 216, 220, 223, 225, 227, 229, 230, 230, 230, 229, 228, 226, 223, 220, 217, 213, 208, 203, 198, 192, 186, 180, 173, 166, 159, 151, 143, 136, 128, 120, 112, 103, 96, 88, 80, 72, 65, 58, 51, 44, 38, 32, 27, 22, 17, 13, 10, 7, 4, 2, 1, 0, 0, 0, 0, 2, 4, 6, 9, 13, 17, 21, 26, 31, 37, 43, 49, 56, 63, 71, 78, 86, 94, 102, 110, 118, 126, 134, 142, 149, 157, 164, 171, 178, 185, 191, 197, 202, 207, 212, 216, 219, 223, 225, 227, 229, 230, 230, 230 }, 172 | { 97, 86, 75, 64, 54, 44, 36, 28, 20, 14, 9, 5, 2, 0, 0, 0, 2, 5, 9, 14, 20, 27, 35, 44, 54, 64, 74, 85, 97, 108, 119, 131, 142, 152, 162, 172, 181, 189, 196, 202, 208, 212, 215, 216, 217, 217, 215, 212, 208, 203, 197, 189, 181, 173, 163, 153, 142, 131, 120, 109, 97, 86, 75, 64, 54, 45, 36, 28, 21, 14, 9, 5, 2, 0, 0, 0, 2, 5, 9, 14, 20, 27, 35, 44, 53, 64, 74, 85, 96, 108, 119, 130, 141, 152, 162, 172, 181, 189, 196, 202, 207, 212, 215, 216, 217, 217, 215, 212, 208, 203, 197, 190, 182, 173, 163, 153, 143, 132, 120, 109, 98, 86, 75, 65, 55, 45, 36, 28, 21, 14, 9, 5, 2, 0, 0, 0, 2, 5, 9, 14, 20, 27, 35, 44, 53, 63, 74, 85, 96, 107, 119, 130, 141, 152, 162, 171, 180, 188, 196, 202, 207, 211, 215, 216, 217, 217, 215, 212, 208, 203, 197, 190, 182, 173, 164, 154, 143, 132, 121, 109, 98, 87, 76, 65, 55, 45, 36, 28, 21, 15, 9, 5, 2, 0, 0, 0, 2, 4, 8, 13, 20, 27, 35, 43, 53, 63, 73, 84, 96, 107, 118, 130, 141, 151, 162, 171, 180, 188, 196, 202, 207, 211, 214, 216, 217, 217, 215, 212, 208, 203, 197, 190, 182, 173, 164, 154, 143, 132, 121, 110, 98, 87, 76, 65, 55, 46, 37, 28, 21, 15, 10, 5, 2, 0, 0, 0 }, 173 | { 46, 42, 38, 33, 30, 26, 22, 19, 16, 13, 11, 8, 6, 5, 3, 2, 1, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 8, 11, 13, 16, 19, 22, 26, 29, 33, 37, 42, 46, 51, 55, 60, 65, 70, 75, 80, 86, 91, 96, 102, 107, 112, 118, 123, 128, 133, 138, 143, 148, 153, 157, 162, 166, 170, 174, 178, 181, 185, 188, 190, 193, 195, 197, 199, 201, 202, 203, 204, 204, 204, 204, 204, 203, 202, 201, 199, 198, 196, 193, 191, 188, 185, 182, 178, 175, 171, 167, 162, 158, 153, 149, 144, 139, 134, 129, 124, 118, 113, 108, 102, 97, 92, 86, 81, 76, 71, 66, 61, 56, 51, 46, 42, 38, 34, 30, 26, 23, 19, 16, 13, 11, 9, 6, 5, 3, 2, 1, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 8, 10, 13, 16, 19, 22, 25, 29, 33, 37, 41, 46, 50, 55, 60, 65, 70, 75, 80, 85, 91, 96, 101, 107, 112, 117, 123, 128, 133, 138, 143, 148, 153, 157, 162, 166, 170, 174, 178, 181, 184, 187, 190, 193, 195, 197, 199, 201, 202, 203, 204, 204, 204, 204, 204, 203, 202, 201, 199, 198, 196, 193, 191, 188, 185, 182, 178, 175, 171, 167, 163, 158, 154, 149, 144, 139, 134, 129, 124, 119, 113, 108, 103, 97, 92, 87, 81, 76, 71, 66, 61, 56, 51, 47, 42, 38, 34, 30, 26, 23, 20, 16, 14, 11, 9, 7, 5, 3, 2 }, 174 | { 9, 5, 3, 1, 0, 0, 0, 1, 3, 5, 8, 12, 17, 22, 27, 34, 40, 47, 55, 62, 70, 79, 87, 95, 104, 112, 120, 128, 136, 143, 150, 157, 163, 169, 174, 178, 182, 186, 188, 190, 191, 191, 191, 190, 188, 186, 183, 179, 174, 169, 164, 157, 151, 144, 136, 129, 121, 113, 104, 96, 88, 79, 71, 63, 55, 48, 41, 34, 28, 22, 17, 13, 9, 5, 3, 1, 0, 0, 0, 1, 3, 5, 8, 12, 17, 22, 27, 33, 40, 47, 54, 62, 70, 78, 87, 95, 103, 112, 120, 128, 136, 143, 150, 157, 163, 169, 174, 178, 182, 186, 188, 190, 191, 191, 191, 190, 188, 186, 183, 179, 175, 169, 164, 158, 151, 144, 137, 129, 121, 113, 105, 96, 88, 80, 71, 63, 56, 48, 41, 34, 28, 22, 17, 13, 9, 6, 3, 1, 0, 0, 0, 1, 3, 5, 8, 12, 16, 21, 27, 33, 40, 47, 54, 62, 70, 78, 86, 95, 103, 111, 120, 128, 135, 143, 150, 157, 163, 168, 174, 178, 182, 185, 188, 190, 191, 191, 191, 190, 188, 186, 183, 179, 175, 170, 164, 158, 151, 144, 137, 129, 121, 113, 105, 96, 88, 80, 72, 64, 56, 48, 41, 35, 28, 23, 17, 13, 9, 6, 3, 1, 0, 0, 0, 1, 2, 5, 8, 12, 16, 21, 27, 33, 40, 47, 54, 62, 70, 78, 86, 94, 103, 111, 119, 127, 135, 142, 150, 156, 163, 168, 173, 178, 182, 185, 188, 190 }, 175 | { 0, 0, 1, 3, 5, 7, 10, 13, 17, 20, 25, 29, 34, 39, 44, 50, 55, 61, 67, 73, 80, 86, 92, 98, 104, 111, 117, 122, 128, 134, 139, 144, 149, 153, 158, 161, 165, 168, 171, 173, 175, 177, 178, 178, 179, 179, 178, 177, 175, 173, 171, 168, 165, 162, 158, 154, 149, 145, 139, 134, 129, 123, 117, 111, 105, 99, 93, 86, 80, 74, 68, 62, 56, 50, 45, 39, 34, 29, 25, 21, 17, 13, 10, 7, 5, 3, 2, 0, 0, 0, 0, 0, 1, 3, 5, 7, 10, 13, 16, 20, 24, 29, 34, 39, 44, 49, 55, 61, 67, 73, 79, 85, 92, 98, 104, 110, 116, 122, 128, 133, 139, 144, 149, 153, 157, 161, 165, 168, 171, 173, 175, 177, 178, 178, 179, 179, 178, 177, 175, 173, 171, 168, 165, 162, 158, 154, 150, 145, 140, 134, 129, 123, 117, 111, 105, 99, 93, 87, 80, 74, 68, 62, 56, 50, 45, 40, 34, 30, 25, 21, 17, 13, 10, 8, 5, 3, 2, 0, 0, 0, 0, 0, 1, 3, 5, 7, 10, 13, 16, 20, 24, 29, 33, 38, 44, 49, 55, 61, 67, 73, 79, 85, 91, 98, 104, 110, 116, 122, 128, 133, 139, 144, 148, 153, 157, 161, 165, 168, 171, 173, 175, 177, 178, 178, 179, 179, 178, 177, 175, 174, 171, 169, 166, 162, 158, 154, 150, 145, 140, 135, 129, 124, 118, 112, 106, 99, 93, 87, 81, 74, 68, 62, 56, 51, 45, 40 }, 176 | }; 177 | 178 | const static byte harm_table[6][256]PROGMEM = { 179 | { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4 }, 180 | { 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, 181 | { 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, 182 | { 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, 183 | { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 6, 6, 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 7, 6, 5, 5, 4, 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 6, 6, 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 7, 6, 5, 5, 4, 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 4 }, 184 | { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 10, 10, 12, 12, 12, 12, 14, 14, 14 }, 185 | }; 186 | 187 | 188 | 189 | Q16n16 deviation; 190 | Q15n16 modulation; 191 | Q16n16 carrier_freq, mod_freq, knob_freq; 192 | 193 | 194 | void setup() 195 | { 196 | startMozzi(CONTROL_RATE); 197 | 198 | pinMode(6, OUTPUT); 199 | pinMode(7, OUTPUT); 200 | pinMode(8, OUTPUT); 201 | pinMode(5,INPUT_PULLUP); 202 | pinMode(4,INPUT_PULLUP); 203 | 204 | } 205 | 206 | 207 | void setFreqs(Q16n16 freq) { 208 | carrier_freq = freq ; 209 | mod_freq = ((carrier_freq >> 8) * (AnalogRead1 / 2 +AnalogRead4 / 2)); 210 | 211 | if ((AnalogRead1 < 1020) && (abs(AnalogRead3 - AnalogSave1) > 3)) { 212 | 213 | AnalogSave2 = AnalogRead3; 214 | 215 | deviation = ((mod_freq >> 16) * (1 + AnalogRead3 + AnalogRead5)); 216 | 217 | } 218 | 219 | 220 | switch (wave0) { 221 | 222 | case 0: 223 | aSin1.setFreq_Q16n16(carrier_freq); 224 | aSin2.setFreq_Q16n16(mod_freq); 225 | break; 226 | case 1: 227 | aTri1.setFreq_Q16n16(carrier_freq); 228 | aTri2.setFreq_Q16n16(mod_freq); 229 | break; 230 | case 2: 231 | aSaw1.setFreq_Q16n16(carrier_freq); 232 | aSaw2.setFreq_Q16n16(mod_freq); 233 | break; 234 | case 3: 235 | aSqu1.setFreq_Q16n16(carrier_freq); 236 | aSqu2.setFreq_Q16n16(mod_freq); 237 | break; 238 | case 4: 239 | aChb1.setFreq_Q16n16(carrier_freq); 240 | aChb2.setFreq_Q16n16(mod_freq); 241 | break; 242 | case 5: 243 | ahSin1.setFreq_Q16n16(carrier_freq); 244 | ahSin2.setFreq_Q16n16(mod_freq); 245 | break; 246 | case 6: 247 | aSig1.setFreq_Q16n16(carrier_freq); 248 | aSig2.setFreq_Q16n16(mod_freq); 249 | break; 250 | case 7: 251 | aPha1.setFreq_Q16n16(carrier_freq); 252 | aPha2.setFreq_Q16n16(mod_freq); 253 | break; 254 | 255 | 256 | } 257 | 258 | 259 | } 260 | 261 | 262 | void updateControl() { 263 | 264 | Mode_CV = map(mozziAnalogRead(2),0,1023,0,2); 265 | Gain_CV_0 = map(mozziAnalogRead(6),0,1023,0,1023); 266 | Gain_CV_1 = map(Gain_CV_0,0,1023,0,511); 267 | Gain_CV_2 = map(Gain_CV_0,0,1023,0,255); 268 | 269 | AnalogRead0 = mozziAnalogRead(0); 270 | AnalogRead1 = mozziAnalogRead(1); 271 | AnalogRead3 = mozziAnalogRead(3); 272 | AnalogRead4 = mozziAnalogRead(4); 273 | AnalogRead5 = mozziAnalogRead(5); 274 | AnalogRead7 = mozziAnalogRead(7); 275 | 276 | if(digitalRead(5) == false) { 277 | Switch = 0; 278 | } 279 | else if ((digitalRead(4) == false)) { 280 | Switch = 2; 281 | } 282 | else if ((digitalRead(5) == true) && (digitalRead(4) == true)) { 283 | Switch = 1; 284 | } 285 | 286 | 287 | switch (Switch) { 288 | 289 | case 0: 290 | switch (Mode_CV) { 291 | case 0: 292 | Mode = 0; 293 | break; 294 | case 1: 295 | Mode = 1; 296 | break; 297 | case 2: 298 | Mode = 2; 299 | break; 300 | } 301 | break; 302 | 303 | case 1: 304 | switch (Mode_CV) { 305 | case 0: 306 | Mode = 1; 307 | break; 308 | case 1: 309 | Mode = 2; 310 | break; 311 | case 2: 312 | Mode = 0; 313 | break; 314 | } 315 | break; 316 | 317 | case 2: 318 | switch (Mode_CV) { 319 | case 0: 320 | Mode = 2; 321 | break; 322 | case 1: 323 | Mode = 1; 324 | break; 325 | case 2: 326 | Mode = 0; 327 | break; 328 | 329 | } 330 | break; 331 | } 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | if (Mode == 2) { 342 | 343 | if ((AnalogRead1 >= 1020) && (abs(AnalogRead3 - AnalogSave2) > 3)) { 344 | wave2 = (AnalogRead3 / 256); 345 | AnalogSave1 = AnalogRead3; 346 | } 347 | 348 | voct = AnalogRead7; 349 | 350 | if ((AnalogRead1 <1020) && (abs(AnalogRead3 - AnalogSave1) > 3)) { 351 | //harmonics 352 | harm_knob = (AnalogRead3 / 4) + (AnalogRead5 / 4); 353 | harm_knob = constrain(harm_knob, 0, 255); 354 | AnalogSave2 = AnalogRead3; 355 | } 356 | 357 | 358 | //harmonics_gain 359 | gain = (AnalogRead1 / 4) + (AnalogRead4 / 4); 360 | gain = constrain(gain, 0, 255); 361 | 362 | //OSC frequency knob 363 | freq1 = AnalogRead0 / 8; 364 | 365 | //frequency setting 366 | 367 | freqv1 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct])))); // V/oct apply 368 | 369 | switch (wave2) { 370 | 371 | case 0: 372 | aSin1.setFreq(freqv1); // set the frequency 373 | aSin2.setFreq(freqv1 * (pgm_read_byte(&(harm_table[0][harm_knob])))); 374 | aSin3.setFreq(freqv1 * (pgm_read_byte(&(harm_table[1][harm_knob])))); 375 | aSin4.setFreq(freqv1 * (pgm_read_byte(&(harm_table[2][harm_knob])))); 376 | aSin5.setFreq(freqv1 * (pgm_read_byte(&(harm_table[3][harm_knob])))); 377 | aSin6.setFreq(freqv1 * (pgm_read_byte(&(harm_table[4][harm_knob])))); 378 | aSin7.setFreq(freqv1 * (pgm_read_byte(&(harm_table[5][harm_knob])))); 379 | break; 380 | case 1: 381 | aTri1.setFreq(freqv1); // set the frequency 382 | aTri2.setFreq(freqv1 * (pgm_read_byte(&(harm_table[0][harm_knob])))); 383 | aTri3.setFreq(freqv1 * (pgm_read_byte(&(harm_table[1][harm_knob])))); 384 | aTri4.setFreq(freqv1 * (pgm_read_byte(&(harm_table[2][harm_knob])))); 385 | aTri5.setFreq(freqv1 * (pgm_read_byte(&(harm_table[3][harm_knob])))); 386 | aTri6.setFreq(freqv1 * (pgm_read_byte(&(harm_table[4][harm_knob])))); 387 | aTri7.setFreq(freqv1 * (pgm_read_byte(&(harm_table[5][harm_knob])))); 388 | break; 389 | case 2: 390 | aSqu1.setFreq(freqv1); // set the frequency 391 | aSqu2.setFreq(freqv1 * (pgm_read_byte(&(harm_table[0][harm_knob])))); 392 | aSqu3.setFreq(freqv1 * (pgm_read_byte(&(harm_table[1][harm_knob])))); 393 | aSqu4.setFreq(freqv1 * (pgm_read_byte(&(harm_table[2][harm_knob])))); 394 | aSqu5.setFreq(freqv1 * (pgm_read_byte(&(harm_table[3][harm_knob])))); 395 | aSqu6.setFreq(freqv1 * (pgm_read_byte(&(harm_table[4][harm_knob])))); 396 | aSqu7.setFreq(freqv1 * (pgm_read_byte(&(harm_table[5][harm_knob])))); 397 | break; 398 | case 3: 399 | 400 | aSaw1.setFreq(freqv1); // set the frequency 401 | aSaw2.setFreq(freqv1 * (pgm_read_byte(&(harm_table[0][harm_knob])))); 402 | aSaw3.setFreq(freqv1 * (pgm_read_byte(&(harm_table[1][harm_knob])))); 403 | aSaw4.setFreq(freqv1 * (pgm_read_byte(&(harm_table[2][harm_knob])))); 404 | aSaw5.setFreq(freqv1 * (pgm_read_byte(&(harm_table[3][harm_knob])))); 405 | aSaw6.setFreq(freqv1 * (pgm_read_byte(&(harm_table[4][harm_knob])))); 406 | aSaw7.setFreq(freqv1 * (pgm_read_byte(&(harm_table[5][harm_knob])))); 407 | break; 408 | 409 | 410 | } 411 | 412 | 413 | 414 | digitalWrite(8,HIGH); 415 | digitalWrite(7,LOW); 416 | digitalWrite(6,LOW); 417 | 418 | } 419 | 420 | else if (Mode == 0) { 421 | 422 | 423 | digitalWrite(7,HIGH); 424 | digitalWrite(8,LOW); 425 | digitalWrite(6,LOW); 426 | 427 | voct = AnalogRead7; 428 | 429 | if ((AnalogRead1 >= 1020) && (abs(AnalogRead3 - AnalogSave2) > 3)) { 430 | wave0 = (AnalogRead3 / 128); 431 | AnalogSave1 = AnalogRead3; 432 | } 433 | 434 | 435 | knob_freq = AnalogRead0; 436 | setFreqs((2270658 + knob_freq * 5000) * pow(2, (pgm_read_float(&(voctpow[voct]))))) ; 437 | 438 | } 439 | 440 | else { 441 | 442 | digitalWrite(6,HIGH); 443 | digitalWrite(7,LOW); 444 | digitalWrite(8,LOW); 445 | 446 | //chord setting 447 | chord = (AnalogRead3 / 128) + (AnalogRead5 / 128); 448 | chord = constrain(chord, 0, 7); 449 | 450 | //inversion setting 451 | inv_knob = AnalogRead1; 452 | inv = (inv_knob / 64)+ (AnalogRead4 / 64); 453 | inv = constrain(inv, 0, 15); 454 | 455 | if ((inv_knob < 1020) && (abs(AnalogRead3 - AnalogSave1) > 3)) { //when selecting wave , not apply 456 | AnalogSave2 = AnalogRead3; 457 | switch (inv) { 458 | case 0: 459 | inv_aply1 = 0; 460 | inv_aply2 = 0; 461 | inv_aply3 = 0; 462 | inv_aply4 = 0; 463 | inv_aply5 = 0; 464 | break; 465 | 466 | case 1: 467 | inv_aply1 = 1; 468 | inv_aply2 = 0; 469 | inv_aply3 = 0; 470 | inv_aply4 = 0; 471 | inv_aply5 = 0; 472 | break; 473 | 474 | case 2: 475 | inv_aply1 = 1; 476 | inv_aply2 = 1; 477 | inv_aply3 = 0; 478 | inv_aply4 = 0; 479 | inv_aply5 = 0; 480 | break; 481 | 482 | case 3: 483 | inv_aply1 = 1; 484 | inv_aply2 = 1; 485 | inv_aply3 = 1; 486 | inv_aply4 = 0; 487 | inv_aply5 = 0; 488 | break; 489 | 490 | case 4: 491 | inv_aply1 = 1; 492 | inv_aply2 = 1; 493 | inv_aply3 = 1; 494 | inv_aply4 = 1; 495 | inv_aply5 = 0; 496 | break; 497 | 498 | case 5: 499 | inv_aply1 = 2; 500 | inv_aply2 = 1; 501 | inv_aply3 = 1; 502 | inv_aply4 = 1; 503 | inv_aply5 = 0; 504 | break; 505 | 506 | case 6: 507 | inv_aply1 = 2; 508 | inv_aply2 = 2; 509 | inv_aply3 = 1; 510 | inv_aply4 = 1; 511 | inv_aply5 = 0; 512 | break; 513 | 514 | case 7: 515 | inv_aply1 = 2; 516 | inv_aply2 = 2; 517 | inv_aply3 = 2; 518 | inv_aply4 = 1; 519 | inv_aply5 = 0; 520 | break; 521 | 522 | case 8: 523 | inv_aply1 = 2; 524 | inv_aply2 = 2; 525 | inv_aply3 = 2; 526 | inv_aply4 = 1; 527 | inv_aply5 = 1; 528 | break; 529 | 530 | case 9: 531 | inv_aply1 = 2; 532 | inv_aply2 = 2; 533 | inv_aply3 = 1; 534 | inv_aply4 = 1; 535 | inv_aply5 = 1; 536 | break; 537 | 538 | case 10: 539 | inv_aply1 = 2; 540 | inv_aply2 = 1; 541 | inv_aply3 = 1; 542 | inv_aply4 = 1; 543 | inv_aply5 = 1; 544 | break; 545 | 546 | case 11: 547 | inv_aply1 = 1; 548 | inv_aply2 = 1; 549 | inv_aply3 = 1; 550 | inv_aply4 = 1; 551 | inv_aply5 = 1; 552 | break; 553 | 554 | case 12: 555 | inv_aply1 = 1; 556 | inv_aply2 = 1; 557 | inv_aply3 = 1; 558 | inv_aply4 = 0; 559 | inv_aply5 = 1; 560 | break; 561 | 562 | case 13: 563 | inv_aply1 = 1; 564 | inv_aply2 = 1; 565 | inv_aply3 = 0; 566 | inv_aply4 = 0; 567 | inv_aply5 = 1; 568 | break; 569 | 570 | case 14: 571 | inv_aply1 = 1; 572 | inv_aply2 = 0; 573 | inv_aply3 = 0; 574 | inv_aply4 = 0; 575 | inv_aply5 = 1; 576 | break; 577 | 578 | case 15: 579 | inv_aply1 = 0; 580 | inv_aply2 = 0; 581 | inv_aply3 = 0; 582 | inv_aply4 = 0; 583 | inv_aply5 = 1; 584 | break; 585 | } 586 | } 587 | //setting chord note 588 | if (inv_knob < 1020) { 589 | note1 = (pgm_read_byte(&(chord_table[chord][0]))); 590 | note2 = (pgm_read_byte(&(chord_table[chord][1]))); 591 | note3 = (pgm_read_byte(&(chord_table[chord][2]))); 592 | note4 = (pgm_read_byte(&(chord_table[chord][3]))); 593 | note5 = (pgm_read_byte(&(chord_table[chord][0]))); 594 | } 595 | 596 | //OSC frequency knob 597 | freq1 = AnalogRead0 / 4 ; 598 | 599 | //set wave 600 | if ((inv_knob >= 1020) && (abs(AnalogRead3 - AnalogSave2) > 3)) { 601 | wave1 = (AnalogRead3 / 128); 602 | AnalogSave1= AnalogRead3; 603 | } 604 | 605 | //frequency setting 606 | voct = AnalogRead7 ; 607 | freqv1 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct + 205 * inv_aply1 + note1])))); //ROOT 608 | freqv2 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct + 205 * inv_aply2 + note2])))); //2nd 609 | freqv3 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct + 205 * inv_aply3 + note3])))); //3rd 610 | freqv4 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct + 205 * inv_aply4 + note4])))); //4th 611 | freqv5 = freq1 * pow(2, (pgm_read_float(&(voctpow[voct + note5])))); //ROOT 612 | 613 | switch (wave1) { 614 | case 0://saw 615 | aSaw1.setFreq(freqv1); 616 | aSaw2.setFreq(freqv2); 617 | aSaw3.setFreq(freqv3); 618 | aSaw4.setFreq(freqv4); 619 | aSaw5.setFreq(freqv5); 620 | break; 621 | 622 | case 1://squ 623 | aSqu1.setFreq(freqv1); 624 | aSqu2.setFreq(freqv2); 625 | aSqu3.setFreq(freqv3); 626 | aSqu4.setFreq(freqv4); 627 | aSqu5.setFreq(freqv5); 628 | break; 629 | 630 | case 2://tri 631 | aTri1.setFreq(freqv1); 632 | aTri2.setFreq(freqv2); 633 | aTri3.setFreq(freqv3); 634 | aTri4.setFreq(freqv4); 635 | aTri5.setFreq(freqv5); 636 | break; 637 | 638 | case 3://sin 639 | aSin1.setFreq(freqv1); 640 | aSin2.setFreq(freqv2); 641 | aSin3.setFreq(freqv3); 642 | aSin4.setFreq(freqv4); 643 | aSin5.setFreq(freqv5); 644 | break; 645 | 646 | case 4:// 647 | aChb1.setFreq(freqv1); 648 | aChb2.setFreq(freqv2); 649 | aChb3.setFreq(freqv3); 650 | aChb4.setFreq(freqv4); 651 | aChb5.setFreq(freqv5); 652 | break; 653 | 654 | case 5:// 655 | ahSin1.setFreq(freqv1); 656 | ahSin2.setFreq(freqv2); 657 | ahSin3.setFreq(freqv3); 658 | ahSin4.setFreq(freqv4); 659 | ahSin5.setFreq(freqv5); 660 | break; 661 | 662 | case 6:// 663 | aSig1.setFreq(freqv1); 664 | aSig2.setFreq(freqv2); 665 | aSig3.setFreq(freqv3); 666 | aSig4.setFreq(freqv4); 667 | aSig5.setFreq(freqv5); 668 | break; 669 | 670 | case 7:// 671 | aPha1.setFreq(freqv1); 672 | aPha2.setFreq(freqv2); 673 | aPha3.setFreq(freqv3); 674 | aPha4.setFreq(freqv4); 675 | aPha5.setFreq(freqv5); 676 | break; 677 | } 678 | 679 | 680 | 681 | 682 | } 683 | 684 | 685 | 686 | } 687 | 688 | 689 | 690 | int updateAudio() { 691 | 692 | 693 | if (Mode == 2) { 694 | 695 | switch (wave2) { 696 | case 0: 697 | return MonoOutput::from8Bit((aSin1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 512 + aSin2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 512 + aSin3.next() * (pgm_read_byte(&(gain_table[2][gain]))) / 512 + aSin4.next() * (pgm_read_byte(&(gain_table[3][gain]))) / 512 + aSin5.next() * (pgm_read_byte(&(gain_table[4][gain]))) / 512 + aSin6.next() * (pgm_read_byte(&(gain_table[5][gain]))) / 512 + aSin7.next() * (pgm_read_byte(&(gain_table[6][gain]))) / 512 )*Gain_CV_2/128); 698 | break; 699 | case 1: 700 | return MonoOutput::from8Bit((aTri1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 512 + aTri2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 512 + aTri3.next() * (pgm_read_byte(&(gain_table[2][gain]))) / 512 + aTri4.next() * (pgm_read_byte(&(gain_table[3][gain]))) / 512 + aTri5.next() * (pgm_read_byte(&(gain_table[4][gain]))) / 512 + aTri6.next() * (pgm_read_byte(&(gain_table[5][gain]))) / 512 + aTri7.next() * (pgm_read_byte(&(gain_table[6][gain]))) / 512 )*Gain_CV_2/128); 701 | break; 702 | case 2: 703 | return MonoOutput::from8Bit((aSqu1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 512 + aSqu2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 512 + aSqu3.next() * (pgm_read_byte(&(gain_table[2][gain]))) / 512 + aSqu4.next() * (pgm_read_byte(&(gain_table[3][gain]))) / 512 + aSqu5.next() * (pgm_read_byte(&(gain_table[4][gain]))) / 512 + aSqu6.next() * (pgm_read_byte(&(gain_table[5][gain]))) / 512 + aSqu7.next() * (pgm_read_byte(&(gain_table[6][gain]))) / 512 )*Gain_CV_2/128); 704 | break; 705 | case 3: 706 | return MonoOutput::from8Bit((aSaw1.next() * (pgm_read_byte(&(gain_table[0][gain]))) / 512 + aSaw2.next() * (pgm_read_byte(&(gain_table[1][gain]))) / 512 + aSaw3.next() * (pgm_read_byte(&(gain_table[2][gain]))) / 512 + aSaw4.next() * (pgm_read_byte(&(gain_table[3][gain]))) / 512 + aSaw5.next() * (pgm_read_byte(&(gain_table[4][gain]))) / 512 + aSaw6.next() * (pgm_read_byte(&(gain_table[5][gain]))) / 512 + aSaw7.next() * (pgm_read_byte(&(gain_table[6][gain]))) / 512 )*Gain_CV_2/128); 707 | break; 708 | 709 | } 710 | 711 | } 712 | 713 | 714 | else if (Mode == 0) { 715 | switch (wave0) { 716 | case 0: 717 | modulation = deviation * aSin2.next() >> 8; 718 | return MonoOutput::from8Bit(aSin1.phMod(modulation)*Gain_CV_1/256); 719 | break; 720 | case 1: 721 | modulation = deviation * aTri2.next() >> 8; 722 | return MonoOutput::from8Bit(aTri1.phMod(modulation)*Gain_CV_1/256); 723 | break; 724 | case 2: 725 | modulation = deviation * aSaw2.next() >> 8; 726 | return MonoOutput::from8Bit(aSaw1.phMod(modulation)*Gain_CV_1/256); 727 | break; 728 | case 3: 729 | modulation = deviation * aSqu2.next() >> 8; 730 | return MonoOutput::from8Bit(aSqu1.phMod(modulation)*Gain_CV_1/256); 731 | break; 732 | case 4: 733 | modulation = deviation * aChb2.next() >> 8; 734 | return MonoOutput::from8Bit(aChb1.phMod(modulation)*Gain_CV_1/256); 735 | break; 736 | case 5: 737 | modulation = deviation * ahSin2.next() >> 8; 738 | return MonoOutput::from8Bit(ahSin1.phMod(modulation)*Gain_CV_1/256); 739 | break; 740 | case 6: 741 | modulation = deviation * aSig2.next() >> 8; 742 | return MonoOutput::from8Bit(aSig1.phMod(modulation)*Gain_CV_1/256); 743 | break; 744 | case 7: 745 | modulation = deviation * aPha2.next() >> 8; 746 | return MonoOutput::from8Bit(aPha1.phMod(modulation)*Gain_CV_1/256); 747 | break; 748 | } 749 | 750 | } 751 | 752 | else { 753 | 754 | switch (wave1) { 755 | 756 | case 0: 757 | return MonoOutput::from8Bit((aSaw1.next() / 8 + aSaw2.next() / 8 + aSaw3.next() / 8 + aSaw4.next() / 8 + aSaw5.next() / 8 * inv_aply5)*Gain_CV_0/256); 758 | break; 759 | 760 | case 1: 761 | return MonoOutput::from8Bit((aSqu1.next() / 8 + aSqu2.next() / 8 + aSqu3.next() / 8 + aSqu4.next() / 8 + aSqu5.next() / 8 * inv_aply5)*Gain_CV_0/256); 762 | break; 763 | 764 | case 2: 765 | return MonoOutput::from8Bit((aTri1.next() / 8 + aTri2.next() / 8 + aTri3.next() / 8 + aTri4.next() / 8 + aTri5.next() / 8 * inv_aply5)*Gain_CV_0/256); 766 | break; 767 | 768 | case 3: 769 | return MonoOutput::from8Bit((aSin1.next() / 8 + aSin2.next() / 8 + aSin3.next() / 8 + aSin4.next() / 8 + aSin5.next() / 8 * inv_aply5)*Gain_CV_0/256); 770 | break; 771 | 772 | case 4: 773 | return MonoOutput::from8Bit((aChb1.next() / 8 + aChb2.next() / 8 + aChb3.next() / 8 + aChb4.next() / 8 + aChb5.next() / 8 * inv_aply5)*Gain_CV_0/256); 774 | break; 775 | 776 | case 5: 777 | return MonoOutput::from8Bit((ahSin1.next() / 8 + ahSin2.next() / 8 + ahSin3.next() / 8 + ahSin4.next() / 8 + ahSin5.next() / 8 * inv_aply5)*Gain_CV_0/256); 778 | break; 779 | 780 | case 6: 781 | return MonoOutput::from8Bit((aSig1.next() / 8 + aSig2.next() / 8 + aSig3.next() / 8 + aSig4.next() / 8 + aSig5.next() / 8 * inv_aply5)*Gain_CV_0/256); 782 | break; 783 | 784 | case 7: 785 | return MonoOutput::from8Bit((aPha1.next() / 8 + aPha2.next() / 8 + aPha3.next() / 8 + aPha4.next() / 8 + aPha5.next() / 8 * inv_aply5)*Gain_CV_0/256); 786 | break; 787 | 788 | } 789 | 790 | } 791 | 792 | 793 | 794 | 795 | } 796 | 797 | void loop() { 798 | audioHook(); 799 | 800 | 801 | } 802 | --------------------------------------------------------------------------------