#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define ARDUINO_MEGA #elif defined(__AVR_AT90USB646__) #define TEENSY_PLUS_PLUS #elif defined(__AVR_ATmega32U4__) #define TEENSY_2 #elif defined(__AVR_AT90USB1286__) #define TEENSY_PLUS_PLUS_2 #else #define ARDUINO #endif byte bp_1, bp_2, bp_3, bp_4, bp_5, bp_6, bp_7, bp_8, bp_9; byte bp2_1, bp2_2, bp2_3, bp2_4, bp2_5, bp2_6, bp2_7, bp2_8, bp2_9, bp2_10, bp2_11, bp2_12, bp2_13, bp2_14, bp2_15, bp2_16; #include Encoder lfo2FO(5, 6); Encoder lfo1FO(13, 12); Encoder ampEnv2M2(9, 8); Encoder lfo1M1(36, 38); Encoder lfo1M2(10, 11); Encoder lfo2M1(17, 16); Encoder lfo2M2(14, 15); Encoder arpMode(24, 26); Encoder arpWave(19, 22); Encoder arpVelo(28, 30); Encoder arpOctave(32, 34); Encoder modM1S1(27, 25); //u mirin brah ? Encoder modM1M1(31, 29); Encoder modM1M2(18, 33); Encoder modM1S2(52, 35); Encoder modM1M3(50, 48); Encoder modM1M4(44, 46); Encoder modM2M1(49, 51); Encoder modM2M2(41, 43); Encoder modM2S2(37, 39); Encoder modM2M3(47, 45); Encoder modM2M4(21, 20); Encoder modM2S1(53, 23); Encoder poly(40, 42); // Variables utilisées par les encoders // lfo2FO byte oldPosition = 1; byte midipos = 0; long newPosition; // lfo1FO byte oldPosition2 = 1; byte midipos2 = 0; long newPosition2; // ampEnv2M2 byte oldPosition3 = 1; byte midipos3 = 0; long newPosition3; // lfo1M1 byte oldPosition4 = 1; byte midipos4 = 0; long newPosition4; // lfo1M2 byte oldPosition5 = 1; byte midipos5 = 0; long newPosition5; // lfo2M1 byte oldPosition6 = 1; byte midipos6 = 0; long newPosition6; // lfo2M2 byte oldPosition7 = 1; byte midipos7 = 0; long newPosition7; // arpMode byte oldPosition8 = 1; byte midipos8 = 0; long newPosition8; // arpWave byte oldPosition9 = 1; byte midipos9 = 0; long newPosition9; // arpVelo byte oldPosition10 = 1; byte midipos10 = 0; long newPosition10; // arpOctave byte oldPosition11 = 1; byte midipos11 = 0; long newPosition11; // modM1S1 byte oldPosition12 = 1; byte midipos12 = 0; long newPosition12; // modM1M1 byte oldPosition13 = 1; byte midipos13 = 0; long newPosition13; // modM1M2 byte oldPosition14 = 1; byte midipos14 = 0; long newPosition14; // modM1S2 byte oldPosition15 = 1; byte midipos15 = 0; long newPosition15; // modM1M3 byte oldPosition16 = 1; byte midipos16 = 0; long newPosition16; // modM1M4 byte oldPosition17 = 1; byte midipos17 = 0; long newPosition17; // modM2S1 byte oldPosition18 = 1; byte midipos18 = 0; long newPosition18; // modM2M1 byte oldPosition20 = 1; byte midipos20 = 0; long newPosition20; // modM2M2 byte oldPosition21 = 1; byte midipos21 = 0; long newPosition21; // modM2S2 byte oldPosition22 = 1; byte midipos22 = 0; long newPosition22; // modM2M3 byte oldPosition23 = 1; byte midipos23 = 0; long newPosition23; // modM2M4 byte oldPosition24 = 1; byte midipos24 = 0; long newPosition24; // poly byte oldPosition19 = 1; byte midipos19 = 0; long newPosition19; // Uncomment this line to send debug messages to the serial monitor //#define DEBUG // Uncomment this line to enable outputs corresponding to the MIDI Fighter so MF mappings can be used in Traktor. //#define MIDI_FIGHTER #define FASTADC // defines for setting and clearing register bits #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif // MIDI mapping taken from http://www.nortonmusic.com/midi_cc.html #define MIDI_CC_MODULATION 0x01 #define MIDI_CC_BREATH 0x02 #define MIDI_CC_VOLUME 0x07 #define MIDI_CC_BALANCE 0x08 #define MIDI_CC_PAN 0x0A #define MIDI_CC_EXPRESSION 0x0B #define MIDI_CC_EFFECT1 0x0C #define MIDI_CC_EFFECT2 0x0D #define MIDI_CC_GENERAL1 0x0E #define MIDI_CC_GENERAL2 0x0F #define MIDI_CC_GENERAL3 0x10 #define MIDI_CC_GENERAL4 0x11 #define MIDI_CC_GENERAL5 0x12 #define MIDI_CC_GENERAL6 0x13 #define MIDI_CC_GENERAL7 0x14 #define MIDI_CC_GENERAL8 0x15 #define MIDI_CC_GENERAL9 0x16 #define MIDI_CC_GENERAL10 0x17 #define MIDI_CC_GENERAL11 0x18 #define MIDI_CC_GENERAL12 0x19 #define MIDI_CC_GENERAL13 0x1A #define MIDI_CC_GENERAL14 0x1B #define MIDI_CC_GENERAL15 0x1C #define MIDI_CC_GENERAL16 0x1D #define MIDI_CC_GENERAL17 0x1E #define MIDI_CC_GENERAL18 0x1F #define MIDI_CC_GENERAL1_FINE 0x2E #define MIDI_CC_GENERAL2_FINE 0x2F #define MIDI_CC_GENERAL3_FINE 0x30 #define MIDI_CC_GENERAL4_FINE 0x31 #define MIDI_CC_GENERAL5_FINE 0x32 #define MIDI_CC_GENERAL6_FINE 0x33 #define MIDI_CC_GENERAL7_FINE 0x34 #define MIDI_CC_GENERAL8_FINE 0x35 #define MIDI_CC_GENERAL9_FINE 0x36 #define MIDI_CC_GENERAL10_FINE 0x37 #define MIDI_CC_GENERAL11_FINE 0x38 #define MIDI_CC_GENERAL12_FINE 0x39 #define MIDI_CC_GENERAL13_FINE 0x3A #define MIDI_CC_GENERAL14_FINE 0x3B #define MIDI_CC_GENERAL15_FINE 0x3C #define MIDI_CC_GENERAL16_FINE 0x3D #define MIDI_CC_GENERAL17_FINE 0x3E #define MIDI_CC_GENERAL18_FINE 0x3F #define MIDI_CC_SUSTAIN 0x40 #define MIDI_CC_REVERB 0x5B #define MIDI_CC_CHORUS 0x5D #define MIDI_CC_CONTROL_OFF 0x79 #define MIDI_CC_NOTES_OFF 0x78 #define NOTE_C0 0x00 // 0 #define NOTE_C1 0x12 // 18 #define NOTE_C2 0x24 // 36 #define NUM_DI 1 #define NUM_AI 120 #define NUM_ROT 25 #if defined(MIDI_FIGHTER) && defined(ARDUINO) #define MIDI_CHANNEL 1 // First note, starting from lower left button #define NOTE NOTE_C2 // When mapping to a MIDI Fighter we need to skip a row of buttons. Set this from 0-3 to define which row to skip. // Rows are ordered from bottom to top (same as the MIDI Fighter's button layout). #define SKIP_ROW 2 // This pin order corresponds to the bottom left button being zero, increasing by one as we move from left to right, bottom to top // 8 9 10 11 // 4 5 6 7 // 0 1 2 3 // This array size must match NUM_DI above. #define DIGITAL_PIN_ORDER 10, 11, 12, 13, 6, 7, 8, 9, 2, 3, 4, 5 #else #define MIDI_CHANNEL 1 // First note, starting from upper left button #define NOTE NOTE_C0 // This pin order corresponds to the top left button being zero, increasing by one as we move from left to right, top to bottom // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // This array size must match NUM_DI above. #if defined(ARDUINO_MEGA) #define DIGITAL_PIN_ORDER 2 #elif defined(TEENSY_PLUS_PLUS) #define DIGITAL_PIN_ORDER 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 #elif defined(TEENSY_2) #define DIGITAL_PIN_ORDER 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 #elif defined(TEENSY_PLUS_PLUS_2) #define DIGITAL_PIN_ORDER 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 #else #define DIGITAL_PIN_ORDER 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 #endif #endif #if defined(ARDUINO_MEGA) #define ANALOGUE_PIN_ORDER A0, A1, A2, A3, A4, A6, A7, A8 #elif defined(TEENSY_PLUS_PLUS) #define ANALOGUE_PIN_ORDER 0, 1, 2, 3, 4, 5, 6, 7 #elif defined(TEENSY_2) #define ANALOGUE_PIN_ORDER 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 #elif defined(TEENSY_PLUS_PLUS_2) #define ANALOGUE_PIN_ORDER 0, 1, 2, 3, 4, 5, 6, 7 #else #define ANALOGUE_PIN_ORDER A0 #endif #if defined(TEENSY_PLUS_PLUS) || defined(TEENSY_2) || defined(TEENSY_PLUS_PLUS_2) #define LED_PIN PIN_D6 #else #define LED_PIN 13 #endif #define MIDI_CC MIDI_CC_GENERAL1 // Comment this line out to disable button debounce logic. // See http://arduino.cc/en/Tutorial/Debounce on what debouncing is used for. #define DEBOUNCE // Debounce time length in milliseconds #define DEBOUNCE_LENGTH 2 // Comment this line out to disable analogue filtering #define ANALOGUE_FILTER // A knob or slider movement must initially exceed this value to be recognised as an input. Note that it is // for a 7-bit (0-127) MIDI value. #ifdef FASTADC #define FILTER_AMOUNT 2 #else #define FILTER_AMOUNT 2 #endif // Timeout is in microseconds #define ANALOGUE_INPUT_CHANGE_TIMEOUT 250000 #define entreeAnalogique A0 #define entreeAnalogique1 A1 #define entreeAnalogique2 A2 #define entreeAnalogique3 A3 #define entreeAnalogique4 A4 #define entreeAnalogique5 A6 #define entreeAnalogique6 A7 #define entreeAnalogique7 A8 #define entreeAnalogique8 A9 #define entreeAnalogique9 A10 #define entreeAnalogique10 A11 #define entreeAnalogique11 A12 #define entreeAnalogique12 A13 #define entreeAnalogique13 A14 #define entreeAnalogique14 A15 #define pinmuxS2 2 #define pinmuxS1 3 #define pinmuxS0 4 byte MUXVAL[NUM_AI]; byte MUXVALND[NUM_AI]; byte ROTVAL[NUM_ROT]; byte rotInputs[NUM_ROT]; boolean rotInputChanging[NUM_ROT]; unsigned long rotInputTimer[NUM_ROT]; byte tempRotInput; // Array containing a mapping of digital pins to channel index. byte digitalInputMapping[NUM_DI] = {DIGITAL_PIN_ORDER}; // Contains the current state of the digital inputs. byte digitalInputs[NUM_DI]; // Contains the current value of the analogue inputs. byte analogueInputs[NUM_AI]; // Variable to hold temporary digital reads, used for debounce logic. byte tempDigitalInput; // Variable to hold temporary analogue values, used for analogue filtering logic. byte tempAnalogueInput; // Preallocate the for loop index so we don't keep reallocating it for every program iteration. byte i = 0; byte digitalOffset = 0; // Variable to hold difference between current and new analogue input values. byte analogueDiff = 0; // This is used as a flag to indicate that an analogue input is changing. boolean analogueInputChanging[NUM_AI]; // Time the analogue input was last moved unsigned long analogueInputTimer[NUM_AI]; #ifdef DEBUG unsigned long loopTime = 0; unsigned long serialSendTime = 0; #endif void setup() { // Taken from http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1208715493/11 #ifdef FASTADC // set prescale to 16 sbi(ADCSRA, ADPS2) ; cbi(ADCSRA, ADPS1) ; cbi(ADCSRA, ADPS0) ; #endif // Only enable serial on the Arduino or when debugging. The Teensy board should be set as a usb-midi device so serial is not needed. #if defined(ARDUINO) || defined(ARDUINO_MEGA) || defined(DEBUG) // Enable serial I/O at 115200 kbps. This is faster than the standard MIDI rate of 31250 kbps. // The PC application which we connect to will automatically take the higher sample rate and send MIDI // messages out at the correct rate. We only send things faster in case there is any latency. Serial.begin(31250); #endif // Initialise each digital input channel. for (i = 0; i < NUM_DI; i++) { // Set the pin direction to input. pinMode(digitalInputMapping[i], INPUT); if (digitalInputMapping[i] != LED_PIN) { // Enable the pull-up resistor. This call must come after the above pinMode call. digitalWrite(digitalInputMapping[i], HIGH); } // Initialise the digital state with a read to the input pin. digitalInputs[i] = digitalRead(digitalInputMapping[i]); } // Initialise each analogue input channel. pinMode(pinmuxS2, OUTPUT); pinMode(pinmuxS1, OUTPUT); pinMode(pinmuxS0, OUTPUT); for (i = 0; i < NUM_AI; i++) { analogueInputChanging[i] = true; analogueInputTimer[i] = 0; } #ifdef DEBUG serialSendTime = millis(); #endif delay(1000); // LOOOOOOL } void loop() { #ifdef DEBUG loopTime = micros(); #endif /* for (i = 0; i < NUM_DI; i++) { #ifdef MIDI_FIGHTER if (i >= SKIP_ROW * 4) { digitalOffset = i + 4; } else { #endif digitalOffset = i; #ifdef MIDI_FIGHTER } #endif // Read the current state of the digital input and store it temporarily. tempDigitalInput = digitalRead(digitalInputMapping[i]); // Check if the last state is different to the current state. if (digitalInputs[i] != tempDigitalInput) { #ifdef DEBOUNCE // Wait for a short period of time, and then take a second reading from the input pin. delay(DEBOUNCE_LENGTH); // If the second reading is the same as the initial reading, assume it must be true. if (tempDigitalInput == digitalRead(digitalInputMapping[i])) { #endif // Record the new digital input state. digitalInputs[i] = tempDigitalInput; // Moved from HIGH to LOW (button pressed) if (digitalInputs[i] == 0) { // All the digital inputs use pullup resistors, except LED_PIN so the logic is inverted if (digitalInputMapping[i] != LED_PIN) { noteOn(MIDI_CHANNEL, NOTE + digitalOffset, 0x7F); // Channel 1, middle C, maximum velocity } else { noteOff(MIDI_CHANNEL, NOTE + digitalOffset); // Channel 1, middle C } } // Moved from LOW to HIGH (button released) else { // All the digital inputs use pullup resistors, except LED_PIN so the logic is inverted if (digitalInputMapping[i] != LED_PIN) { noteOff(MIDI_CHANNEL, NOTE + digitalOffset); // Channel 1, middle C } else { noteOn(MIDI_CHANNEL, NOTE + digitalOffset, 0x7F); // Channel 1, middle C, maximum velocity } } #ifdef DEBOUNCE } #endif } } */ /* * Analogue input logic: * The Arduino uses a 10-bit (0-1023) analogue to digital converter (ADC) on each of its analogue inputs. * The ADC isn't very high resolution, so if a pot is in a position such that the output voltage is 'between' * what it can detect (say 2.505V or about 512.5 on a scale of 0-1023) then the value read will constantly * fluctuate between two integers (in this case 512 and 513). * * If we're simply looking for a change in the analogue input value like in the digital case above, then * there will be cases where the value is always changing, even though the physical input isn't being moved. * This will in turn send out a constant stream of MIDI messages to the connected software which may be problematic. * * To combat this, we require that the analogue input value must change by a certain threshold amount before * we register that it is actually changing. This is good in avoiding a constantly fluctuating value, but has * the negative effect of a reduced input resolution. For example if the threshold amount was 2 and we slowly moved * a slider through it's full range, we would only detect every second value as a change, in effect reducing the * already small 7-bit MIDI value to a 6-bit MIDI value. * * To get around this problem but still use the threshold logic, a timer is used. Initially the analogue input * must exceed the threshold to be detected as an input. Once this occurs, we then read every value coming from the * analogue input (not just those exceeding a threshold) giving us full 7-bit resolution. At the same time the * timer is started. This timer is used to keep track of whether an input hasn't been moved for a certain time * period. If it has been moved, the timer is restarted. If no movement occurs the timer is just left to run. When * the timer expires the analogue input is assumed to be no longer moving. Subsequent movements must exceed the * threshold amount. */ // Mux n*1 digitalWrite(pinmuxS2, LOW); digitalWrite(pinmuxS1, LOW); digitalWrite(pinmuxS0, LOW); delayMicroseconds(1); MUXVAL[0] = (analogRead(entreeAnalogique) / 8); MUXVAL[8] = (analogRead(entreeAnalogique1) / 8); MUXVAL[16] = (analogRead(entreeAnalogique2) / 8); MUXVAL[24] = (analogRead(entreeAnalogique3) / 8); MUXVAL[32] = (analogRead(entreeAnalogique4) / 8); MUXVAL[40] = (analogRead(entreeAnalogique5) / 8); MUXVAL[48] = (analogRead(entreeAnalogique6) / 8); MUXVAL[56] = (analogRead(entreeAnalogique7) / 8); MUXVAL[64] = (analogRead(entreeAnalogique8) / 8); MUXVAL[72] = (analogRead(entreeAnalogique9) / 8); MUXVAL[80] = (analogRead(entreeAnalogique10) / 8); MUXVAL[88] = (analogRead(entreeAnalogique11) / 8); MUXVAL[96] = (analogRead(entreeAnalogique12) / 8); MUXVAL[104] = (analogRead(entreeAnalogique13) / 8); MUXVAL[112] = (analogRead(entreeAnalogique14) / 8); // lecture du capteur relié a l'entrée Y1 du CD4051 digitalWrite(pinmuxS2, LOW); digitalWrite(pinmuxS1, LOW); digitalWrite(pinmuxS0, HIGH); delayMicroseconds(1); MUXVAL[1] = (analogRead(entreeAnalogique) / 8); MUXVAL[9] = (analogRead(entreeAnalogique1) / 8); MUXVAL[17] = (analogRead(entreeAnalogique2) / 8); MUXVAL[25] = (analogRead(entreeAnalogique3) / 8); MUXVAL[33] = (analogRead(entreeAnalogique4) / 8); MUXVAL[41] = (analogRead(entreeAnalogique5) / 8); MUXVAL[49] = (analogRead(entreeAnalogique6) / 8); MUXVAL[57] = (analogRead(entreeAnalogique7) / 8); MUXVAL[65] = (analogRead(entreeAnalogique8) / 8); MUXVAL[73] = (analogRead(entreeAnalogique9) / 8); MUXVAL[81] = (analogRead(entreeAnalogique10) / 8); MUXVAL[89] = (analogRead(entreeAnalogique11) / 8); MUXVAL[97] = (analogRead(entreeAnalogique12) / 8); MUXVAL[105] = (analogRead(entreeAnalogique13) / 8); MUXVAL[113] = (analogRead(entreeAnalogique14) / 8); // lecture du capteur relié a l'entrée Y2 du CD4051 digitalWrite(pinmuxS2, LOW); digitalWrite(pinmuxS1, HIGH); digitalWrite(pinmuxS0, LOW); delayMicroseconds(1); MUXVAL[2] = (analogRead(entreeAnalogique) / 8); MUXVAL[10] = (analogRead(entreeAnalogique1) / 8); MUXVAL[18] = (analogRead(entreeAnalogique2) / 8); MUXVAL[26] = (analogRead(entreeAnalogique3) / 8); MUXVAL[34] = (analogRead(entreeAnalogique4) / 8); MUXVAL[42] = (analogRead(entreeAnalogique5) / 8); MUXVAL[50] = (analogRead(entreeAnalogique6) / 8); MUXVAL[58] = (analogRead(entreeAnalogique7) / 8); MUXVAL[66] = (analogRead(entreeAnalogique8) / 8); MUXVAL[74] = (analogRead(entreeAnalogique9) / 8); MUXVAL[82] = (analogRead(entreeAnalogique10) / 8); MUXVAL[90] = (analogRead(entreeAnalogique11) / 8); MUXVAL[98] = (analogRead(entreeAnalogique12) / 8); MUXVAL[106] = (analogRead(entreeAnalogique13) / 8); MUXVAL[114] = (analogRead(entreeAnalogique14) / 8); // lecture du capteur relié a l'entrée Y3 du CD4051 digitalWrite(pinmuxS2, LOW); digitalWrite(pinmuxS1, HIGH); digitalWrite(pinmuxS0, HIGH); delayMicroseconds(1); MUXVAL[3] = (analogRead(entreeAnalogique) / 8); MUXVAL[11] = (analogRead(entreeAnalogique1) / 8); MUXVAL[19] = (analogRead(entreeAnalogique2) / 8); MUXVAL[27] = (analogRead(entreeAnalogique3) / 8); MUXVAL[35] = (analogRead(entreeAnalogique4) / 8); MUXVAL[43] = (analogRead(entreeAnalogique5) / 8); MUXVAL[51] = (analogRead(entreeAnalogique6) / 8); MUXVAL[59] = (analogRead(entreeAnalogique7) / 8); MUXVAL[67] = (analogRead(entreeAnalogique8) / 8); MUXVAL[75] = (analogRead(entreeAnalogique9) / 8); MUXVAL[83] = (analogRead(entreeAnalogique10) / 8); MUXVAL[91] = (analogRead(entreeAnalogique11) / 8); MUXVAL[99] = (analogRead(entreeAnalogique12) / 8); MUXVAL[107] = (analogRead(entreeAnalogique13) / 8); MUXVAL[115] = (analogRead(entreeAnalogique14) / 8); // lecture du capteur relié a l'entrée Y4 du CD4051 digitalWrite(pinmuxS2, HIGH); digitalWrite(pinmuxS1, LOW); digitalWrite(pinmuxS0, LOW); delayMicroseconds(1); MUXVAL[4] = (analogRead(entreeAnalogique) / 8); MUXVAL[12] = (analogRead(entreeAnalogique1) / 8); MUXVAL[20] = (analogRead(entreeAnalogique2) / 8); MUXVAL[29] = (analogRead(entreeAnalogique3) / 8); MUXVAL[36] = (analogRead(entreeAnalogique4) / 8); MUXVAL[44] = (analogRead(entreeAnalogique5) / 8); MUXVAL[52] = (analogRead(entreeAnalogique6) / 8); MUXVAL[60] = (analogRead(entreeAnalogique7) / 8); MUXVAL[68] = (analogRead(entreeAnalogique8) / 8); MUXVAL[76] = (analogRead(entreeAnalogique9) / 8); MUXVAL[84] = (analogRead(entreeAnalogique10) / 8); MUXVAL[92] = (analogRead(entreeAnalogique11) / 8); MUXVAL[100] = (analogRead(entreeAnalogique12) / 8); MUXVAL[108] = (analogRead(entreeAnalogique13) / 8); MUXVAL[116] = (analogRead(entreeAnalogique14) / 8); // lecture du capteur relié a l'entrée Y5 du CD4051 digitalWrite(pinmuxS2, HIGH); digitalWrite(pinmuxS1, LOW); digitalWrite(pinmuxS0, HIGH); delayMicroseconds(1); MUXVAL[5] = (analogRead(entreeAnalogique) / 8); MUXVAL[13] = (analogRead(entreeAnalogique1) / 8); MUXVAL[21] = (analogRead(entreeAnalogique2) / 8); MUXVAL[30] = (analogRead(entreeAnalogique3) / 8); MUXVAL[37] = (analogRead(entreeAnalogique4) / 8); MUXVAL[45] = (analogRead(entreeAnalogique5) / 8); MUXVAL[53] = (analogRead(entreeAnalogique6) / 8); MUXVAL[61] = (analogRead(entreeAnalogique7) / 8); MUXVAL[69] = (analogRead(entreeAnalogique8) / 8); MUXVAL[77] = (analogRead(entreeAnalogique9) / 8); MUXVAL[85] = (analogRead(entreeAnalogique10) / 8); MUXVAL[93] = (analogRead(entreeAnalogique11) / 8); MUXVAL[101] = (analogRead(entreeAnalogique12) / 8); MUXVAL[109] = (analogRead(entreeAnalogique13) / 8); MUXVAL[117] = (analogRead(entreeAnalogique14) / 8); // lecture du capteur relié a l'entrée Y6 du CD4051 digitalWrite(pinmuxS2, HIGH); digitalWrite(pinmuxS1, HIGH); digitalWrite(pinmuxS0, LOW); delayMicroseconds(1); MUXVAL[6] = (analogRead(entreeAnalogique) / 8); MUXVAL[14] = (analogRead(entreeAnalogique1) / 8); MUXVAL[22] = (analogRead(entreeAnalogique2) / 8); MUXVAL[31] = (analogRead(entreeAnalogique3) / 8); MUXVAL[38] = (analogRead(entreeAnalogique4) / 8); MUXVAL[46] = (analogRead(entreeAnalogique5) / 8); MUXVAL[54] = (analogRead(entreeAnalogique6) / 8); MUXVAL[62] = (analogRead(entreeAnalogique7) / 8); MUXVAL[70] = (analogRead(entreeAnalogique8) / 8); MUXVAL[78] = (analogRead(entreeAnalogique9) / 8); MUXVAL[86] = (analogRead(entreeAnalogique10) / 8); MUXVAL[94] = (analogRead(entreeAnalogique11) / 8); MUXVAL[102] = (analogRead(entreeAnalogique12) / 8); MUXVAL[110] = (analogRead(entreeAnalogique13) / 8); MUXVAL[118] = (analogRead(entreeAnalogique14) / 8); // lecture du capteur relié a l'entrée Y7 du CD4051 digitalWrite(pinmuxS2, HIGH); digitalWrite(pinmuxS1, HIGH); digitalWrite(pinmuxS0, HIGH); delayMicroseconds(1); MUXVAL[7] = (analogRead(entreeAnalogique) / 8); MUXVAL[15] = (analogRead(entreeAnalogique1) / 8); MUXVAL[23] = (analogRead(entreeAnalogique2) / 8); MUXVAL[24] = (analogRead(entreeAnalogique3) / 8); MUXVAL[39] = (analogRead(entreeAnalogique4) / 8); MUXVAL[46] = (analogRead(entreeAnalogique5) / 8); MUXVAL[54] = (analogRead(entreeAnalogique6) / 8); MUXVAL[62] = (analogRead(entreeAnalogique7) / 8); MUXVAL[71] = (analogRead(entreeAnalogique8) / 8); MUXVAL[79] = (analogRead(entreeAnalogique9) / 8); MUXVAL[87] = (analogRead(entreeAnalogique10) / 8); MUXVAL[95] = (analogRead(entreeAnalogique11) / 8); MUXVAL[103] = (analogRead(entreeAnalogique12) / 8); MUXVAL[110] = (analogRead(entreeAnalogique13) / 8); MUXVAL[119] = (analogRead(entreeAnalogique14) / 8); for (i = 0; i < NUM_AI; i++) { // Read the analogue input pin, dividing it by 8 so the 10-bit ADC value (0-1023) is converted to a 7-bit MIDI value (0-127). tempAnalogueInput = MUXVAL[i]; #ifdef ANALOGUE_FILTER // Take the absolute value of the difference between the curent and new values analogueDiff = abs(tempAnalogueInput - MUXVALND[i]); // Only continue if the threshold was exceeded, or the input was already changing if ((analogueDiff > 0 && analogueInputChanging[i] == true) || analogueDiff >= FILTER_AMOUNT) { // Only restart the timer if we're sure the input isn't 'between' a value // ie. It's moved more than FILTER_AMOUNT if (analogueInputChanging[i] == false || analogueDiff >= FILTER_AMOUNT) { // Reset the last time the input was moved analogueInputTimer[i] = micros(); // The analogue input is moving analogueInputChanging[i] = true; } else if (micros() - analogueInputTimer[i] > ANALOGUE_INPUT_CHANGE_TIMEOUT) { analogueInputChanging[i] = false; } // Only send data if we know the analogue input is moving if (analogueInputChanging[i] == true) { // Record the new analogue value MUXVALND[i] = tempAnalogueInput; // Send the analogue value out on the general MIDI CC (see definitions at beginning of this file) controlChange(MIDI_CHANNEL, MIDI_CC + i, MUXVALND[i]); } } #else if (analogueInputs[i] != tempAnalogueInput) { // Record the new analogue value analogueInputs[i] = tempAnalogueInput; // Send the analogue value out on the general MIDI CC (see definitions at beginning of this file) controlChange(MIDI_CHANNEL, MIDI_CC + i, analogueInputs[i]); } #endif } #ifdef DEBUG loopTime = micros() - loopTime; // Print the loop execution time once per second if (millis() - serialSendTime > 1000) { Serial.print("Loop execution time (us): "); Serial.println(loopTime); serialSendTime = millis(); } #endif // ROT PART // lfo2FO newPosition = (lfo2FO.read() / 4) + 4; if ((newPosition != oldPosition)) { if (newPosition < 0) { lfo2FO.write(-16); } if (newPosition > 10) { lfo2FO.write(24); } oldPosition = newPosition; if (-1 < newPosition && newPosition < 11) { midipos = (newPosition * 12); } } // lfo1FO newPosition2 = (lfo1FO.read() / 4) + 4; if ((newPosition2 != oldPosition2)) { if (newPosition2 < 0) { lfo1FO.write(-16); } if (newPosition2 > 10) { lfo1FO.write(24); } oldPosition2 = newPosition2; if (-1 < newPosition2 && newPosition2 < 11) { midipos2 = (newPosition2 * 12); } } // ampEnv2M2 newPosition3 = (ampEnv2M2.read() / 4) + 4; if ((newPosition3 != oldPosition3)) { if (newPosition3 < 0) { ampEnv2M2.write(-16); } if (newPosition3 > 28) { ampEnv2M2.write(96); } oldPosition3 = newPosition3; if (-1 < newPosition3 && newPosition3 < 29) { if (newPosition3 == 0) midipos3 = 0; if (newPosition3 == 1) midipos3 = 5; if (newPosition3 == 2) midipos3 = 10; if (newPosition3 == 3) midipos3 = 14; if (newPosition3 == 4) midipos3 = 17; if (newPosition3 == 5) midipos3 = 21; if (newPosition3 == 6) midipos3 = 25; if (newPosition3 == 7) midipos3 = 29; if (newPosition3 == 8) midipos3 = 33; if (newPosition3 == 9) midipos3 = 36; if (newPosition3 == 10) midipos3 = 40; if (newPosition3 == 11) midipos3 = 45; if (newPosition3 == 12) midipos3 = 48; if (newPosition3 == 13) midipos3 = 51; if (newPosition3 == 14) midipos3 = 55; if (newPosition3 == 15) midipos3 = 60; if (newPosition3 == 16) midipos3 = 63; if (newPosition3 == 17) midipos3 = 68; if (newPosition3 == 18) midipos3 = 71; if (newPosition3 == 19) midipos3 = 74; if (newPosition3 == 20) midipos3 = 79; if (newPosition3 == 21) midipos3 = 82; if (newPosition3 == 22) midipos3 = 85; if (newPosition3 == 23) midipos3 = 90; if (newPosition3 == 24) midipos3 = 95; if (newPosition3 == 25) midipos3 = 98; if (newPosition3 == 26) midipos3 = 102; if (newPosition3 == 27) midipos3 = 115; } } // lfo1M1 newPosition4 = (lfo1M1.read() / 4) + 4; if ((newPosition4 != oldPosition4)) { if (newPosition4 < 0) { lfo1M1.write(-16); } if (newPosition4 > 28) { lfo1M1.write(96); } oldPosition4 = newPosition4; if (-1 < newPosition4 && newPosition4 < 29) { if (newPosition4 == 0) midipos4 = 0; if (newPosition4 == 1) midipos4 = 5; if (newPosition4 == 2) midipos4 = 10; if (newPosition4 == 3) midipos4 = 14; if (newPosition4 == 4) midipos4 = 17; if (newPosition4 == 5) midipos4 = 21; if (newPosition4 == 6) midipos4 = 25; if (newPosition4 == 7) midipos4 = 29; if (newPosition4 == 8) midipos4 = 33; if (newPosition4 == 9) midipos4 = 36; if (newPosition4 == 10) midipos4 = 40; if (newPosition4 == 11) midipos4 = 45; if (newPosition4 == 12) midipos4 = 48; if (newPosition4 == 13) midipos4 = 51; if (newPosition4 == 14) midipos4 = 55; if (newPosition4 == 15) midipos4 = 60; if (newPosition4 == 16) midipos4 = 63; if (newPosition4 == 17) midipos4 = 68; if (newPosition4 == 18) midipos4 = 71; if (newPosition4 == 19) midipos4 = 74; if (newPosition4 == 20) midipos4 = 79; if (newPosition4 == 21) midipos4 = 82; if (newPosition4 == 22) midipos4 = 85; if (newPosition4 == 23) midipos4 = 90; if (newPosition4 == 24) midipos4 = 95; if (newPosition4 == 25) midipos4 = 98; if (newPosition4 == 26) midipos4 = 102; if (newPosition4 == 27) midipos4 = 115; } } // lfo1M2 newPosition5 = (lfo1M2.read() / 4) + 4; if ((newPosition5 != oldPosition5)) { if (newPosition5 < 0) { lfo1M2.write(-16); } if (newPosition5 > 28) { lfo1M2.write(96); } oldPosition5 = newPosition5; if (-1 < newPosition5 && newPosition5 < 29) { if (newPosition5 == 0) midipos5 = 0; if (newPosition5 == 1) midipos5 = 5; if (newPosition5 == 2) midipos5 = 10; if (newPosition5 == 3) midipos5 = 14; if (newPosition5 == 4) midipos5 = 17; if (newPosition5 == 5) midipos5 = 21; if (newPosition5 == 6) midipos5 = 25; if (newPosition5 == 7) midipos5 = 29; if (newPosition5 == 8) midipos5 = 33; if (newPosition5 == 9) midipos5 = 36; if (newPosition5 == 10) midipos5 = 40; if (newPosition5 == 11) midipos5 = 45; if (newPosition5 == 12) midipos5 = 48; if (newPosition5 == 13) midipos5 = 51; if (newPosition5 == 14) midipos5 = 55; if (newPosition5 == 15) midipos5 = 60; if (newPosition5 == 16) midipos5 = 63; if (newPosition5 == 17) midipos5 = 68; if (newPosition5 == 18) midipos5 = 71; if (newPosition5 == 19) midipos5 = 74; if (newPosition5 == 20) midipos5 = 79; if (newPosition5 == 21) midipos5 = 82; if (newPosition5 == 22) midipos5 = 85; if (newPosition5 == 23) midipos5 = 90; if (newPosition5 == 24) midipos5 = 95; if (newPosition5 == 25) midipos5 = 98; if (newPosition5 == 26) midipos5 = 102; if (newPosition5 == 27) midipos5 = 115; } } // lfo2M1 newPosition6 = (lfo2M1.read() / 4) + 4; if ((newPosition6 != oldPosition6)) { if (newPosition6 < 0) { lfo2M1.write(-16); } if (newPosition6 > 28) { lfo2M1.write(96); } oldPosition6 = newPosition6; if (-1 < newPosition6 && newPosition6 < 29) { if (newPosition6 == 0) midipos6 = 0; if (newPosition6 == 1) midipos6 = 5; if (newPosition6 == 2) midipos6 = 10; if (newPosition6 == 3) midipos6 = 14; if (newPosition6 == 4) midipos6 = 17; if (newPosition6 == 5) midipos6 = 21; if (newPosition6 == 6) midipos6 = 25; if (newPosition6 == 7) midipos6 = 29; if (newPosition6 == 8) midipos6 = 33; if (newPosition6 == 9) midipos6 = 36; if (newPosition6 == 10) midipos6 = 40; if (newPosition6 == 11) midipos6 = 45; if (newPosition6 == 12) midipos6 = 48; if (newPosition6 == 13) midipos6 = 51; if (newPosition6 == 14) midipos6 = 55; if (newPosition6 == 15) midipos6 = 60; if (newPosition6 == 16) midipos6 = 63; if (newPosition6 == 17) midipos6 = 68; if (newPosition6 == 18) midipos6 = 71; if (newPosition6 == 19) midipos6 = 74; if (newPosition6 == 20) midipos6 = 79; if (newPosition6 == 21) midipos6 = 82; if (newPosition6 == 22) midipos6 = 85; if (newPosition6 == 23) midipos6 = 90; if (newPosition6 == 24) midipos6 = 95; if (newPosition6 == 25) midipos6 = 98; if (newPosition6 == 26) midipos6 = 102; if (newPosition6 == 27) midipos6 = 115; } } // lfo2M2 newPosition7 = (lfo2M2.read() / 4) + 4; if ((newPosition7 != oldPosition7)) { if (newPosition7 < 0) { lfo2M2.write(-16); } if (newPosition7 > 28) { lfo2M2.write(96); } oldPosition7 = newPosition7; if (-1 < newPosition7 && newPosition7 < 29) { if (newPosition7 == 0) midipos7 = 0; if (newPosition7 == 1) midipos7 = 5; if (newPosition7 == 2) midipos7 = 10; if (newPosition7 == 3) midipos7 = 14; if (newPosition7 == 4) midipos7 = 17; if (newPosition7 == 5) midipos7 = 21; if (newPosition7 == 6) midipos7 = 25; if (newPosition7 == 7) midipos7 = 29; if (newPosition7 == 8) midipos7 = 33; if (newPosition7 == 9) midipos7 = 36; if (newPosition7 == 10) midipos7 = 40; if (newPosition7 == 11) midipos7 = 45; if (newPosition7 == 12) midipos7 = 48; if (newPosition7 == 13) midipos7 = 51; if (newPosition7 == 14) midipos7 = 55; if (newPosition7 == 15) midipos7 = 60; if (newPosition7 == 16) midipos7 = 63; if (newPosition7 == 17) midipos7 = 68; if (newPosition7 == 18) midipos7 = 71; if (newPosition7 == 19) midipos7 = 74; if (newPosition7 == 20) midipos7 = 79; if (newPosition7 == 21) midipos7 = 82; if (newPosition7 == 22) midipos7 = 85; if (newPosition7 == 23) midipos7 = 90; if (newPosition7 == 24) midipos7 = 95; if (newPosition7 == 25) midipos7 = 98; if (newPosition7 == 26) midipos7 = 102; if (newPosition7 == 27) midipos7 = 115; } } // arpMode newPosition8 = (arpMode.read() / 4) + 4; if ((newPosition8 != oldPosition8)) { if (newPosition8 < 0) { arpMode.write(-16); } if (newPosition8 > 9) { arpMode.write(20); } oldPosition8 = newPosition8; if (-1 < newPosition8 && newPosition8 < 10) { midipos8 = (newPosition8 * 13); } } // arpWave newPosition9 = (arpWave.read() / 4) + 4; if ((newPosition9 != oldPosition9)) { if (newPosition9 < 0) { arpWave.write(-16); } if (newPosition9 > 16) { arpWave.write(52); } oldPosition9 = newPosition9; if (-1 < newPosition9 && newPosition9 < 17) { midipos9 = (newPosition9 * 7.5) + 5; } } // arpVelo newPosition10 = (arpVelo.read() / 4) + 4; if ((newPosition10 != oldPosition10)) { if (newPosition10 < 0) { arpVelo.write(-16); } if (newPosition10 > 4) { arpVelo.write(0); } oldPosition10 = newPosition10; if (-1 < newPosition10 && newPosition10 < 5) { midipos10 = (newPosition10 * 30) + 5; } } // arpOctave newPosition11 = (arpOctave.read() / 4) + 4; if ((newPosition11 != oldPosition11)) { if (newPosition11 < 0) { arpOctave.write(-16); } if (newPosition11 > 3) { arpOctave.write(-4); } oldPosition11 = newPosition11; if (-1 < newPosition11 && newPosition11 < 4) { midipos11 = (newPosition11 * 40) + 5; } } // modM1S1 newPosition12 = (modM1S1.read() / 4) + 4; if ((newPosition12 != oldPosition12)) { if (newPosition12 < 0) { modM1S1.write(-16); } if (newPosition12 > 11) { modM1S1.write(28); } oldPosition12 = newPosition12; if (-1 < newPosition12 && newPosition12 < 12) { midipos12 = (newPosition12 * 11) + 3; } } // modM1M1 newPosition13 = (modM1M1.read() / 4) + 4; if ((newPosition13 != oldPosition13)) { if (newPosition13 < 0) { modM1M1.write(-16); } if (newPosition13 > 28) { modM1M1.write(96); } oldPosition13 = newPosition13; if (-1 < newPosition13 && newPosition13 < 29) { if (newPosition13 == 0) midipos13 = 0; if (newPosition13 == 1) midipos13 = 5; if (newPosition13 == 2) midipos13 = 10; if (newPosition13 == 3) midipos13 = 14; if (newPosition13 == 4) midipos13 = 17; if (newPosition13 == 5) midipos13 = 21; if (newPosition13 == 6) midipos13 = 25; if (newPosition13 == 7) midipos13 = 29; if (newPosition13 == 8) midipos13 = 33; if (newPosition13 == 9) midipos13 = 36; if (newPosition13 == 10) midipos13 = 40; if (newPosition13 == 11) midipos13 = 45; if (newPosition13 == 12) midipos13 = 48; if (newPosition13 == 13) midipos13 = 51; if (newPosition13 == 14) midipos13 = 55; if (newPosition13 == 15) midipos13 = 60; if (newPosition13 == 16) midipos13 = 63; if (newPosition13 == 17) midipos13 = 68; if (newPosition13 == 18) midipos13 = 71; if (newPosition13 == 19) midipos13 = 74; if (newPosition13 == 20) midipos13 = 79; if (newPosition13 == 21) midipos13 = 82; if (newPosition13 == 22) midipos13 = 85; if (newPosition13 == 23) midipos13 = 90; if (newPosition13 == 24) midipos13 = 95; if (newPosition13 == 25) midipos13 = 98; if (newPosition13 == 26) midipos13 = 102; if (newPosition13 == 27) midipos13 = 115; } } // modM1M2 newPosition14 = (modM1M2.read() / 4) + 4; if ((newPosition14 != oldPosition14)) { if (newPosition14 < 0) { modM1M2.write(-16); } if (newPosition14 > 28) { modM1M2.write(96); } oldPosition14 = newPosition14; if (-1 < newPosition14 && newPosition14 < 29) { if (newPosition14 == 0) midipos14 = 0; if (newPosition14 == 1) midipos14 = 5; if (newPosition14 == 2) midipos14 = 10; if (newPosition14 == 3) midipos14 = 14; if (newPosition14 == 4) midipos14 = 17; if (newPosition14 == 5) midipos14 = 21; if (newPosition14 == 6) midipos14 = 25; if (newPosition14 == 7) midipos14 = 29; if (newPosition14 == 8) midipos14 = 33; if (newPosition14 == 9) midipos14 = 36; if (newPosition14 == 10) midipos14 = 40; if (newPosition14 == 11) midipos14 = 45; if (newPosition14 == 12) midipos14 = 48; if (newPosition14 == 13) midipos14 = 51; if (newPosition14 == 14) midipos14 = 55; if (newPosition14 == 15) midipos14 = 60; if (newPosition14 == 16) midipos14 = 63; if (newPosition14 == 17) midipos14 = 68; if (newPosition14 == 18) midipos14 = 71; if (newPosition14 == 19) midipos14 = 74; if (newPosition14 == 20) midipos14 = 79; if (newPosition14 == 21) midipos14 = 82; if (newPosition14 == 22) midipos14 = 85; if (newPosition14 == 23) midipos14 = 90; if (newPosition14 == 24) midipos14 = 95; if (newPosition14 == 25) midipos14 = 98; if (newPosition14 == 26) midipos14 = 102; if (newPosition14 == 27) midipos14 = 115; } } // modM1S2 newPosition15 = (modM1S2.read() / 4) + 4; if ((newPosition15 != oldPosition15)) { if (newPosition15 < 0) { modM1S2.write(-16); } if (newPosition15 > 11) { modM1S2.write(28); } oldPosition15 = newPosition15; if (-1 < newPosition15 && newPosition15 < 12) { midipos15 = (newPosition15 * 11) + 3; } } // modM1M3 newPosition16 = (modM1M3.read() / 4) + 4; if ((newPosition16 != oldPosition16)) { if (newPosition16 < 0) { modM1M3.write(-16); } if (newPosition16 > 28) { modM1M3.write(96); } oldPosition16 = newPosition16; if (-1 < newPosition16 && newPosition16 < 29) { if (newPosition16 == 0) midipos16 = 0; if (newPosition16 == 1) midipos16 = 5; if (newPosition16 == 2) midipos16 = 10; if (newPosition16 == 3) midipos16 = 14; if (newPosition16 == 4) midipos16 = 17; if (newPosition16 == 5) midipos16 = 21; if (newPosition16 == 6) midipos16 = 25; if (newPosition16 == 7) midipos16 = 29; if (newPosition16 == 8) midipos16 = 33; if (newPosition16 == 9) midipos16 = 36; if (newPosition16 == 10) midipos16 = 40; if (newPosition16 == 11) midipos16 = 45; if (newPosition16 == 12) midipos16 = 48; if (newPosition16 == 13) midipos16 = 51; if (newPosition16 == 14) midipos16 = 55; if (newPosition16 == 15) midipos16 = 60; if (newPosition16 == 16) midipos16 = 63; if (newPosition16 == 17) midipos16 = 68; if (newPosition16 == 18) midipos16 = 71; if (newPosition16 == 19) midipos16 = 74; if (newPosition16 == 20) midipos16 = 79; if (newPosition16 == 21) midipos16 = 82; if (newPosition16 == 22) midipos16 = 85; if (newPosition16 == 23) midipos16 = 90; if (newPosition16 == 24) midipos16 = 95; if (newPosition16 == 25) midipos16 = 98; if (newPosition16 == 26) midipos16 = 102; if (newPosition16 == 27) midipos16 = 115; } } // modM1M4 newPosition17 = (modM1M4.read() / 4) + 4; if ((newPosition17 != oldPosition17)) { if (newPosition17 < 0) { modM1M4.write(-16); } if (newPosition17 > 28) { modM1M4.write(96); } oldPosition17 = newPosition17; if (-1 < newPosition17 && newPosition17 < 29) { if (newPosition17 == 0) midipos17 = 0; if (newPosition17 == 1) midipos17 = 5; if (newPosition17 == 2) midipos17 = 10; if (newPosition17 == 3) midipos17 = 14; if (newPosition17 == 4) midipos17 = 17; if (newPosition17 == 5) midipos17 = 21; if (newPosition17 == 6) midipos17 = 25; if (newPosition17 == 7) midipos17 = 29; if (newPosition17 == 8) midipos17 = 33; if (newPosition17 == 9) midipos17 = 36; if (newPosition17 == 10) midipos17 = 40; if (newPosition17 == 11) midipos17 = 45; if (newPosition17 == 12) midipos17 = 48; if (newPosition17 == 13) midipos17 = 51; if (newPosition17 == 14) midipos17 = 55; if (newPosition17 == 15) midipos17 = 60; if (newPosition17 == 16) midipos17 = 63; if (newPosition17 == 17) midipos17 = 68; if (newPosition17 == 18) midipos17 = 71; if (newPosition17 == 19) midipos17 = 74; if (newPosition17 == 20) midipos17 = 79; if (newPosition17 == 21) midipos17 = 82; if (newPosition17 == 22) midipos17 = 85; if (newPosition17 == 23) midipos17 = 90; if (newPosition17 == 24) midipos17 = 95; if (newPosition17 == 25) midipos17 = 98; if (newPosition17 == 26) midipos17 = 102; if (newPosition17 == 27) midipos17 = 115; } } // modM2S1 newPosition18 = (modM2S1.read() / 4) + 4; if ((newPosition18 != oldPosition18)) { if (newPosition18 < 0) { modM2S1.write(-16); } if (newPosition18 > 11) { modM2S1.write(28); } oldPosition18 = newPosition18; if (-1 < newPosition18 && newPosition18 < 12) { midipos18 = (newPosition18 * 11) + 3; } } // modM2M1 newPosition20 = (modM2M1.read() / 4) + 4; if ((newPosition20 != oldPosition20)) { if (newPosition20 < 0) { modM2M1.write(-16); } if (newPosition20 > 28) { modM2M1.write(96); } oldPosition20 = newPosition20; if (-1 < newPosition20 && newPosition20 < 29) { if (newPosition20 == 0) midipos20 = 0; if (newPosition20 == 1) midipos20 = 5; if (newPosition20 == 2) midipos20 = 10; if (newPosition20 == 3) midipos20 = 14; if (newPosition20 == 4) midipos20 = 17; if (newPosition20 == 5) midipos20 = 21; if (newPosition20 == 6) midipos20 = 25; if (newPosition20 == 7) midipos20 = 29; if (newPosition20 == 8) midipos20 = 33; if (newPosition20 == 9) midipos20 = 36; if (newPosition20 == 10) midipos20 = 40; if (newPosition20 == 11) midipos20 = 45; if (newPosition20 == 12) midipos20 = 48; if (newPosition20 == 13) midipos20 = 51; if (newPosition20 == 14) midipos20 = 55; if (newPosition20 == 15) midipos20 = 60; if (newPosition20 == 16) midipos20 = 63; if (newPosition20 == 17) midipos20 = 68; if (newPosition20 == 18) midipos20 = 71; if (newPosition20 == 19) midipos20 = 74; if (newPosition20 == 20) midipos20 = 79; if (newPosition20 == 21) midipos20 = 82; if (newPosition20 == 22) midipos20 = 85; if (newPosition20 == 23) midipos20 = 90; if (newPosition20 == 24) midipos20 = 95; if (newPosition20 == 25) midipos20 = 98; if (newPosition20 == 26) midipos20 = 102; if (newPosition20 == 27) midipos20 = 115; } } // modM2M2 newPosition21 = (modM2M2.read() / 4) + 4; if ((newPosition21 != oldPosition21)) { if (newPosition21 < 0) { modM2M2.write(-16); } if (newPosition21 > 28) { modM2M2.write(96); } oldPosition21 = newPosition21; if (-1 < newPosition21 && newPosition21 < 29) { if (newPosition21 == 0) midipos21 = 0; if (newPosition21 == 1) midipos21 = 5; if (newPosition21 == 2) midipos21 = 10; if (newPosition21 == 3) midipos21 = 14; if (newPosition21 == 4) midipos21 = 17; if (newPosition21 == 5) midipos21 = 21; if (newPosition21 == 6) midipos21 = 25; if (newPosition21 == 7) midipos21 = 29; if (newPosition21 == 8) midipos21 = 33; if (newPosition21 == 9) midipos21 = 36; if (newPosition21 == 10) midipos21 = 40; if (newPosition21 == 11) midipos21 = 45; if (newPosition21 == 12) midipos21 = 48; if (newPosition21 == 13) midipos21 = 51; if (newPosition21 == 14) midipos21 = 55; if (newPosition21 == 15) midipos21 = 60; if (newPosition21 == 16) midipos21 = 63; if (newPosition21 == 17) midipos21 = 68; if (newPosition21 == 18) midipos21 = 71; if (newPosition21 == 19) midipos21 = 74; if (newPosition21 == 20) midipos21 = 79; if (newPosition21 == 21) midipos21 = 82; if (newPosition21 == 22) midipos21 = 85; if (newPosition21 == 23) midipos21 = 90; if (newPosition21 == 24) midipos21 = 95; if (newPosition21 == 25) midipos21 = 98; if (newPosition21 == 26) midipos21 = 102; if (newPosition21 == 27) midipos21 = 115; } } // modM2S2 newPosition22 = (modM2S2.read() / 4) + 4; if ((newPosition22 != oldPosition22)) { if (newPosition22 < 0) { modM2S2.write(-16); } if (newPosition22 > 11) { modM2S2.write(28); } oldPosition22 = newPosition22; if (-1 < newPosition22 && newPosition22 < 12) { midipos22 = (newPosition22 * 11) + 3; } } // modM2M3 newPosition23 = (modM2M3.read() / 4) + 4; if ((newPosition23 != oldPosition23)) { if (newPosition23 < 0) { modM2M3.write(-16); } if (newPosition23 > 28) { modM2M3.write(96); } oldPosition23 = newPosition23; if (-1 < newPosition23 && newPosition23 < 29) { if (newPosition23 == 0) midipos23 = 0; if (newPosition23 == 1) midipos23 = 5; if (newPosition23 == 2) midipos23 = 10; if (newPosition23 == 3) midipos23 = 14; if (newPosition23 == 4) midipos23 = 17; if (newPosition23 == 5) midipos23 = 21; if (newPosition23 == 6) midipos23 = 25; if (newPosition23 == 7) midipos23 = 29; if (newPosition23 == 8) midipos23 = 33; if (newPosition23 == 9) midipos23 = 36; if (newPosition23 == 10) midipos23 = 40; if (newPosition23 == 11) midipos23 = 45; if (newPosition23 == 12) midipos23 = 48; if (newPosition23 == 13) midipos23 = 51; if (newPosition23 == 14) midipos23 = 55; if (newPosition23 == 15) midipos23 = 60; if (newPosition23 == 16) midipos23 = 63; if (newPosition23 == 17) midipos23 = 68; if (newPosition23 == 18) midipos23 = 71; if (newPosition23 == 19) midipos23 = 74; if (newPosition23 == 20) midipos23 = 79; if (newPosition23 == 21) midipos23 = 82; if (newPosition23 == 22) midipos23 = 85; if (newPosition23 == 23) midipos23 = 90; if (newPosition23 == 24) midipos23 = 95; if (newPosition23 == 25) midipos23 = 98; if (newPosition23 == 26) midipos23 = 102; if (newPosition23 == 27) midipos23 = 115; } } // modM2M4 newPosition24 = (modM2M4.read() / 4) + 4; if ((newPosition24 != oldPosition24)) { if (newPosition24 < 0) { modM2M4.write(-16); } if (newPosition24 > 28) { modM2M4.write(96); } oldPosition24 = newPosition24; if (-1 < newPosition24 && newPosition24 < 29) { if (newPosition24 == 0) midipos24 = 0; if (newPosition24 == 1) midipos24 = 5; if (newPosition24 == 2) midipos24 = 10; if (newPosition24 == 3) midipos24 = 14; if (newPosition24 == 4) midipos24 = 17; if (newPosition24 == 5) midipos24 = 21; if (newPosition24 == 6) midipos24 = 25; if (newPosition24 == 7) midipos24 = 29; if (newPosition24 == 8) midipos24 = 33; if (newPosition24 == 9) midipos24 = 36; if (newPosition24 == 10) midipos24 = 40; if (newPosition24 == 11) midipos24 = 45; if (newPosition24 == 12) midipos24 = 48; if (newPosition24 == 13) midipos24 = 51; if (newPosition24 == 14) midipos24 = 55; if (newPosition24 == 15) midipos24 = 60; if (newPosition24 == 16) midipos24 = 63; if (newPosition24 == 17) midipos24 = 68; if (newPosition24 == 18) midipos24 = 71; if (newPosition24 == 19) midipos24 = 74; if (newPosition24 == 20) midipos24 = 79; if (newPosition24 == 21) midipos24 = 82; if (newPosition24 == 22) midipos24 = 85; if (newPosition24 == 23) midipos24 = 90; if (newPosition24 == 24) midipos24 = 95; if (newPosition24 == 25) midipos24 = 98; if (newPosition24 == 26) midipos24 = 102; if (newPosition24 == 27) midipos24 = 115; } } // poly newPosition19 = (poly.read() / 4) + 4; if ((newPosition19 != oldPosition19)) { if (newPosition19 < 0) { poly.write(-16); } if (newPosition19 > 16) { poly.write(52); } oldPosition19 = newPosition19; if (-1 < newPosition19 && newPosition19 < 17) { midipos19 = (newPosition19 * 7.5) + 5; } } ROTVAL[0] = midipos; // midipos = LFO 2 Forme Onde ROTVAL[1] = midipos2; // midipos2 = LFO 1 Forme Onde ROTVAL[2] = midipos3; // midipos3 = Amp Enveloppe 2 Mod 2 ROTVAL[3] = midipos4; // midipo4 = LFO 1 Mod 1 ROTVAL[4] = midipos5; // midipos5 = LFO 1 Mod 2 ROTVAL[5] = midipos6; // midipos6 = LFO 2 Mod 1 ROTVAL[6] = midipos7; // midipos7 = LFO 2 Mod 2 ROTVAL[7] = midipos8; // midipos8 = Arp Mode ROTVAL[8] = midipos9; // midipos9 = Arp Wave ROTVAL[10] = midipos10; // midipos10 = Arp Velo ROTVAL[11] = midipos11; // midipos11 = Arp Octave ROTVAL[12] = midipos12; // midipos12 = Mod matrix 1 : Source 1 ROTVAL[13] = midipos13; // midipos13 = Mod matrix 1 : Mod 1 ROTVAL[14] = midipos14; // midipos13 = Mod matrix 1 : Mod 2 ROTVAL[15] = midipos15; // midipos15 = Mod matrix 1 : Source 2 ROTVAL[16] = midipos16; // midipos16 = Mod matrix 1 : Mod 3 ROTVAL[17] = midipos17; // midipos17 = Mod matrix 1 : Mod 4 ROTVAL[18] = midipos18; // midipos17 = Mod matrix 2 : Source 1 ROTVAL[19] = midipos19; // midipos19 = Poly ROTVAL[20] = midipos20; // midipos20 = Mod matrix 2 : Mod 1 ROTVAL[21] = midipos21; // midipos21 = Mod matrix 2 : Mod 2 ROTVAL[22] = midipos22; // midipos22 = Mod matrix 2 : Source 2 ROTVAL[23] = midipos23; // midipos23 = Mod matrix 2 : Mod 3 ROTVAL[24] = midipos24; // midipos24 = Mod matrix 2 : Mod 4 for (i = 0; i < NUM_ROT; i++) { // Read the analogue input pin, dividing it by 8 so the 10-bit ADC value (0-1023) is converted to a 7-bit MIDI value (0-127). tempRotInput = ROTVAL[i]; if (rotInputs[i] != tempRotInput) { // Record the new analogue value rotInputs[i] = tempRotInput; // Send the analogue value out on the general MIDI CC (see definitions at beginning of this file) controlChange((MIDI_CHANNEL + 3), MIDI_CC + i, rotInputs[i]); } } } // Send a MIDI note on message void noteOn(byte channel, byte pitch, byte velocity) { // 0x90 is the first of 16 note on channels. Subtract one to go from MIDI's 1-16 channels to 0-15 channel += 0x90 - 1; // Ensure we're between channels 1 and 16 for a note on message if (channel >= 0x90 && channel <= 0x9F) { #ifdef DEBUG Serial.print("Button pressed: "); Serial.println(pitch); #elif defined(TEENSY_PLUS_PLUS) || defined(TEENSY_2) || defined(TEENSY_PLUS_PLUS_2) usbMIDI.sendNoteOn(pitch, velocity, channel); #else Serial.write(channel); Serial.write(pitch); Serial.write(velocity); #endif } } // Send a MIDI note off message void noteOff(byte channel, byte pitch) { // 0x80 is the first of 16 note off channels. Subtract one to go from MIDI's 1-16 channels to 0-15 channel += 0x80 - 1; // Ensure we're between channels 1 and 16 for a note off message if (channel >= 0x80 && channel <= 0x8F) { #ifdef DEBUG Serial.print("Button released: "); Serial.println(pitch); #elif defined(TEENSY_PLUS_PLUS) || defined(TEENSY_2) || defined(TEENSY_PLUS_PLUS_2) usbMIDI.sendNoteOff(pitch, 0x00, channel); #else Serial.write(channel); Serial.write(pitch); Serial.write((byte)0x00); #endif } } // Send a MIDI control change message void controlChange(byte channel, byte control, byte value) { // 0xB0 is the first of 16 control change channels. Subtract one to go from MIDI's 1-16 channels to 0-15 channel += 0xB0 - 1; // Ensure we're between channels 1 and 16 for a CC message if (channel >= 0xB0 && channel <= 0xBF) { #ifdef DEBUG Serial.print(control - MIDI_CC); Serial.print(": "); Serial.println(value); #elif defined(TEENSY_PLUS_PLUS) || defined(TEENSY_2) || defined(TEENSY_PLUS_PLUS_2) usbMIDI.sendControlChange(control, value, channel); #else if (control < 41) { Serial.write(channel); Serial.write(control); } else if (40 < control && control < 81) { Serial.write((channel + 1)); Serial.write((control - 40)); } else if (81 <= control) { Serial.write((channel + 2)); Serial.write((control - 80)); } Serial.write(value); #endif // delayMicroseconds(208); // ? } }