// Arduino PCF8575C 16-bit I2C I/O expander // (Memory: 18836 - 65%, Variable global: 1950 bit - 76%) with debug // (Memory: 14882 - 51%, Variable global: 689 bit - 26%) without debug #include #include "MIDIUSB.h" // midi channel #define mch 2 // analog attach value #define analogAttach 1 // intA #define pcf1_address 0x20 #define pcf2_address 0x21 static boolean intA_flag = false; // intB #define pcf3_address 0x22 #define pcf4_address 0x23 static boolean intB_flag = false; //global pcf value uint8_t lo_data; uint8_t hi_data; // analog module uint8_t ka[16], kb[16], kc[16], kd[16]; uint8_t kaL[16], kbL[16], kcL[16], kdL[16]; // button module uint8_t btnM1[8], btnM2[8], btnM3[8], btnM4[8], btnM5[8]; uint8_t btnM1L[8], btnM2L[8], btnM3L[8], btnM4L[8], btnM5L[8]; // encoder module uint8_t encM1[8], encM2[8]; uint8_t encM1L[8], encM2L[8]; uint8_t counter_enc1 = 0; uint8_t counter_enc2 = 0; uint8_t counter_enc3 = 0; uint8_t counter_enc4 = 0; uint8_t counter_enc5 = 0; uint8_t counter_enc6 = 0; uint8_t counter_enc7 = 0; uint8_t counter_enc8 = 0; // master module uint8_t mas[8]; uint8_t masL[8]; uint8_t counter_mas1 = 0; uint8_t counter_mas2 = 0; // debug function boolean debug_code = false; boolean debug = false; uint8_t counter_code = 0; uint32_t interval = 10000; uint32_t timer = 0; uint32_t timerL = 0; void noteOn(byte pitch, byte velocity) { midiEventPacket_t noteOn = {0x09, 0x90 | mch - 1, pitch, velocity}; MidiUSB.sendMIDI(noteOn); } void noteOff(byte pitch, byte velocity) { midiEventPacket_t noteOff = {0x08, 0x80 | mch - 1, pitch, velocity}; MidiUSB.sendMIDI(noteOff); } void controlChange(byte control, byte value) { midiEventPacket_t event = {0x0B, 0xB0 | mch - 1, control, value}; MidiUSB.sendMIDI(event); } void setup() { pinMode(1, INPUT_PULLUP); // input intA - int3 pinMode(0, INPUT_PULLUP); // input intB - int2 pinMode(7, INPUT_PULLUP); // input intC - int4 pinMode(4, INPUT_PULLUP); // input debug pinMode(5, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(13, OUTPUT); // Initialize Wire.begin(); Wire.beginTransmission(pcf1_address); Wire.endTransmission(); Wire.write(lowByte(0b00000000)); Wire.write(highByte(0b00000000)); Wire.beginTransmission(pcf2_address); Wire.endTransmission(); Wire.write(lowByte(0b00000000)); Wire.write(highByte(0b00000000)); Wire.beginTransmission(pcf3_address); Wire.endTransmission(); Wire.write(lowByte(0b00000000)); Wire.write(highByte(0b00000000)); Wire.beginTransmission(pcf4_address); Wire.endTransmission(); Wire.write(lowByte(0b00000000)); Wire.write(highByte(0b00000000)); attachInterrupt(digitalPinToInterrupt(1), intA, FALLING); attachInterrupt(digitalPinToInterrupt(0), intB, FALLING); // Setup all value to 1 for (uint8_t i = 0; i < 8; i++) { btnM1L[i] = 1; } for (uint8_t i = 0; i < 8; i++) { btnM2L[i] = 1; } for (uint8_t i = 0; i < 8; i++) { btnM3L[i] = 1; } for (uint8_t i = 0; i < 8; i++) { btnM4L[i] = 1; } for (uint8_t i = 0; i < 8; i++) { btnM5L[i] = 1; } masL[4] = 1; masL[7] = 1; Serial.begin(115200); } void loop() { // select 4067 channel Y0 (pin 9) digitalWrite(13, LOW); // S0 - 4067 pin 10 digitalWrite(5, LOW); // S1 - 4067 pin 11 digitalWrite(9, LOW); // S2 - 4067 pin 14 digitalWrite(10, LOW); // S3 - 4067 pin 13 delayMicroseconds(2); // delay for signals to stabilize ka[0] = analogRead(0) / 8; if (abs(ka[0] - kaL[0]) > analogAttach) { controlChange(16, ka[0]); if (debug) { Serial.print("16 ka0 - "); Serial.println(ka[0]); } kaL[0] = ka[0]; } kb[0] = analogRead(1) / 8; if (abs(kb[0] - kbL[0]) > analogAttach) { controlChange(32, kb[0]); if (debug) { Serial.print("32 kb0 - "); Serial.println(kb[0]); } kbL[0] = kb[0]; } kc[0] = analogRead(2) / 8; if (abs(kc[0] - kcL[0]) > analogAttach) { controlChange(48, kc[0]); if (debug) { Serial.print("48 kc0 - "); Serial.println(kc[0]); } kcL[0] = kc[0]; } kd[0] = analogRead(3) / 8; if (abs(kd[0] - kdL[0]) > analogAttach) { controlChange(55, kd[0]); if (debug) { Serial.print("55 kd0 - "); Serial.println(kd[0]); } kdL[0] = kd[0]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y1 (pin 8) digitalWrite(13, HIGH); digitalWrite(5, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); delayMicroseconds(2); ka[1] = analogRead(0) / 8; if (abs(ka[1] - kaL[1]) > analogAttach) { controlChange(15, ka[1]); if (debug) { Serial.print("15 ka1 - "); Serial.println(ka[1]); } kaL[1] = ka[1]; } kb[1] = analogRead(1) / 8; if (abs(kb[1] - kbL[1]) > analogAttach) { controlChange(31, kb[1]); if (debug) { Serial.print("31 kb1 - "); Serial.println(kb[1]); } kbL[1] = kb[1]; } kc[1] = analogRead(2) / 8; if (abs(kc[1] - kcL[1]) > analogAttach) { controlChange(47, kc[1]); if (debug) { Serial.print("47 kc1 - "); Serial.println(kc[1]); } kcL[1] = kc[1]; } kd[1] = analogRead(3) / 8; if (abs(kd[1] - kdL[1]) > analogAttach) { controlChange(53, kd[1]); kdL[1] = kd[1]; if (debug) { Serial.print("53 kd1 - "); Serial.println(kd[1]); } } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y2 (pin 7) digitalWrite(13, LOW); digitalWrite(5, HIGH); digitalWrite(9, LOW); digitalWrite(10, LOW); delayMicroseconds(2); ka[2] = analogRead(0) / 8; if (abs(ka[2] - kaL[2]) > analogAttach) { controlChange(14, ka[2]); if (debug) { Serial.print("14 ka2 - "); Serial.println(ka[2]); } kaL[2] = ka[2]; } kb[2] = analogRead(1) / 8; if (abs(kb[2] - kbL[2]) > analogAttach) { controlChange(30, kb[2]); if (debug) { Serial.print("30 kb2 - "); Serial.println(kb[2]); } kbL[2] = kb[2]; } kc[2] = analogRead(2) / 8; if (abs(kc[2] - kcL[2]) > analogAttach) { controlChange(46, kc[2]); if (debug) { Serial.print("46 kc2 - "); Serial.println(kc[2]); } kcL[2] = kc[2]; } kd[2] = analogRead(3) / 8; if (abs(kd[2] - kdL[2]) > analogAttach) { controlChange(51, kd[2]); if (debug) { Serial.print("51 kd2 - "); Serial.println(kd[2]); } kdL[2] = kd[2]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y3 (pin 6) digitalWrite(13, HIGH); digitalWrite(5, HIGH); digitalWrite(9, LOW); digitalWrite(10, LOW); delayMicroseconds(2); ka[3] = analogRead(0) / 8; if (abs(ka[3] - kaL[3]) > analogAttach) { controlChange(13, ka[3]); if (debug) { Serial.print("13 ka3 - "); Serial.println(ka[3]); } kaL[3] = ka[3]; } kb[3] = analogRead(1) / 8; if (abs(kb[3] - kbL[3]) > analogAttach) { controlChange(29, kb[3]); if (debug) { Serial.print("29 kb3 - "); Serial.println(kb[3]); } kbL[3] = kb[3]; } kc[3] = analogRead(2) / 8; if (abs(kc[3] - kcL[3]) > analogAttach) { controlChange(45, kc[3]); if (debug) { Serial.print("45 kc3 - "); Serial.println(kc[3]); } kcL[3] = kc[3]; } kd[3] = analogRead(3) / 8; if (abs(kd[3] - kdL[3]) > analogAttach) { controlChange(49, kd[3]); if (debug) { Serial.print("49 kd3 - "); Serial.println(kd[3]); } kdL[3] = kd[3]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y4 (pin 5) digitalWrite(13, LOW); digitalWrite(5, LOW); digitalWrite(9, HIGH); digitalWrite(10, LOW); delayMicroseconds(2); ka[4] = analogRead(0) / 8; if (abs(ka[4] - kaL[4]) > analogAttach) { controlChange(5, ka[4]); if (debug) { Serial.print("5 ka4 - "); Serial.println(ka[4]); } kaL[4] = ka[4]; } kb[4] = analogRead(1) / 8; if (abs(kb[4] - kbL[4]) > analogAttach) { controlChange(21, kb[4]); if (debug) { Serial.print("21 kb4 - "); Serial.println(kb[4]); } kbL[4] = kb[4]; } kc[4] = analogRead(2) / 8; if (abs(kc[4] - kcL[4]) > analogAttach) { controlChange(37, kc[4]); if (debug) { Serial.print("37 kc4 - "); Serial.println(kc[4]); } kcL[4] = kc[4]; } kd[4] = analogRead(3) / 8; if (abs(kd[4] - kdL[4]) > analogAttach) { controlChange(50, kd[4]); if (debug) { Serial.print("50 kd4 - "); Serial.println(kd[4]); } kdL[4] = kd[4]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y5 (pin 4) digitalWrite(13, HIGH); digitalWrite(5, LOW); digitalWrite(9, HIGH); digitalWrite(10, LOW); delayMicroseconds(2); ka[5] = analogRead(0) / 8; if (abs(ka[5] - kaL[5]) > analogAttach) { controlChange(6, ka[5]); if (debug) { Serial.print("6 ka5 - "); Serial.println(ka[5]); } kaL[5] = ka[5]; } kb[5] = analogRead(1) / 8; if (abs(kb[5] - kbL[5]) > analogAttach) { controlChange(22, kb[5]); if (debug) { Serial.print("22 kb5 - "); Serial.println(kb[5]); } kbL[5] = kb[5]; } kc[5] = analogRead(2) / 8; if (abs(kc[5] - kcL[5]) > analogAttach) { controlChange(38, kc[5]); if (debug) { Serial.print("38 kc5 - "); Serial.println(kc[5]); } kcL[5] = kc[5]; } kd[5] = analogRead(3) / 8; if (abs(kd[5] - kdL[5]) > analogAttach) { controlChange(52, kd[5]); if (debug) { Serial.print("52 kd5 - "); Serial.println(kd[5]); } kdL[5] = kd[5]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y6 (pin 3) digitalWrite(13, LOW); digitalWrite(5, HIGH); digitalWrite(9, HIGH); digitalWrite(10, LOW); delayMicroseconds(2); ka[6] = analogRead(0) / 8; if (abs(ka[6] - kaL[6]) > analogAttach) { controlChange(7, ka[6]); if (debug) { Serial.print("7 ka6 - "); Serial.println(ka[6]); } kaL[6] = ka[6]; } kb[6] = analogRead(1) / 8; if (abs(kb[6] - kbL[6]) > analogAttach) { controlChange(23, kb[6]); if (debug) { Serial.print("23 kb6 - "); Serial.println(kb[6]); } kbL[6] = kb[6]; } kc[6] = analogRead(2) / 8; if (abs(kc[6] - kcL[6]) > analogAttach) { controlChange(39, kc[6]); if (debug) { Serial.print("39 kc6 - "); Serial.println(kc[6]); } kcL[6] = kc[6]; } kd[6] = analogRead(3) / 8; if (abs(kd[6] - kdL[6]) > analogAttach) { controlChange(54, kd[6]); if (debug) { Serial.print("54 kd6 - "); Serial.println(kd[6]); } kdL[6] = kd[6]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y7 (pin 2) digitalWrite(13, HIGH); digitalWrite(5, HIGH); digitalWrite(9, HIGH); digitalWrite(10, LOW); delayMicroseconds(2); ka[7] = analogRead(0) / 8; if (abs(ka[7] - kaL[7]) > analogAttach) { controlChange(8, ka[7]); if (debug) { Serial.print("8 ka7 - "); Serial.println(ka[7]); } kaL[7] = ka[7]; } kb[7] = analogRead(1) / 8; if (abs(kb[7] - kbL[7]) > analogAttach) { controlChange(24, kb[7]); if (debug) { Serial.print("24 kb7 - "); Serial.println(kb[7]); } kbL[7] = kb[7]; } kc[7] = analogRead(2) / 8; if (abs(kc[7] - kcL[7]) > analogAttach) { controlChange(40, kc[7]); if (debug) { Serial.print("40 kc7 - "); Serial.println(kc[7]); } kcL[7] = kc[7]; } kd[7] = analogRead(3) / 8; if (abs(kd[7] - kdL[7]) > analogAttach) { controlChange(56, kd[7]); if (debug) { Serial.print("56 kd7 - "); Serial.println(kd[7]); } kdL[7] = kd[7]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y8 (pin 23) digitalWrite(13, LOW); digitalWrite(5, LOW); digitalWrite(9, LOW); digitalWrite(10, HIGH); delayMicroseconds(2); ka[8] = analogRead(0) / 8; if (abs(ka[8] - kaL[8]) > analogAttach) { controlChange(1, ka[8]); if (debug) { Serial.print("1 ka8 - "); Serial.println(ka[8]); } kaL[8] = ka[8]; } kb[8] = analogRead(1) / 8; if (abs(kb[8] - kbL[8]) > analogAttach) { controlChange(17, kb[8]); if (debug) { Serial.print("17 kb8 - "); Serial.println(kb[8]); } kbL[8] = kb[8]; } kc[8] = analogRead(2) / 8; if (abs(kc[8] - kcL[8]) > analogAttach) { controlChange(33, kc[8]); if (debug) { Serial.print("33 kc8 - "); Serial.println(kc[8]); } kcL[8] = kc[8]; } /* not used kd[8] = analogRead(3) / 8; if (abs(kd[8] - kdL[8]) > analogAttach) { controlChange(62, kd[8]); if (debug) { Serial.print("62 k - "); Serial.println(kd[8]); } kdL[8] = kd[8]; } */ // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y9 (pin 22) digitalWrite(13, HIGH); digitalWrite(5, LOW); digitalWrite(9, LOW); digitalWrite(10, HIGH); delayMicroseconds(2); ka[9] = analogRead(0) / 8; if (abs(ka[9] - kaL[9]) > analogAttach) { controlChange(2, ka[9]); if (debug) { Serial.print("2 ka9 - "); Serial.println(ka[9]); } kaL[9] = ka[9]; } kb[9] = analogRead(1) / 8; if (abs(kb[9] - kbL[9]) > analogAttach) { controlChange(18, kb[9]); if (debug) { Serial.print("18 kb9 - "); Serial.println(kb[9]); } kbL[9] = kb[9]; } kc[9] = analogRead(2) / 8; if (abs(kc[9] - kcL[9]) > analogAttach) { controlChange(34, kc[9]); if (debug) { Serial.print("34 kc9 - "); Serial.println(kc[9]); } kcL[9] = kc[9]; } /* not used kd[9] = analogRead(3) / 8; if (abs(kd[9] - kdL[9]) > analogAttach) { controlChange(63, kd[9]); if (debug) { Serial.print("63 kd9 - "); Serial.println(kd[9]); } kdL[9] = kd[9]; } */ // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y10 (pin 21) digitalWrite(13, LOW); digitalWrite(5, HIGH); digitalWrite(9, LOW); digitalWrite(10, HIGH); delayMicroseconds(2); ka[10] = analogRead(0) / 8; if (abs(ka[10] - kaL[10]) > analogAttach) { controlChange(3, ka[10]); if (debug) { Serial.print("3 ka10 - "); Serial.println(ka[10]); } kaL[10] = ka[10]; } kb[10] = analogRead(1) / 8; if (abs(kb[10] - kbL[10]) > analogAttach) { controlChange(19, kb[10]); if (debug) { Serial.print("19 kb10 - "); Serial.println(kb[10]); } kbL[10] = kb[10]; } kc[10] = analogRead(2) / 8; if (abs(kc[10] - kcL[10]) > analogAttach) { controlChange(35, kc[10]); if (debug) { Serial.print("35 kc10 - "); Serial.println(kc[10]); } kcL[10] = kc[10]; } /* not used kd[10] = analogRead(3) / 8; if (abs(kd[10] - kdL[10]) > analogAttach) { controlChange(64, kd[10]); if (debug) { Serial.print("64 kd10 - "); Serial.println(kd[10]); } kdL[10] = kd[10]; } */ // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y11 (pin 20) digitalWrite(13, HIGH); digitalWrite(5, HIGH); digitalWrite(9, LOW); digitalWrite(10, HIGH); delayMicroseconds(2); ka[11] = analogRead(0) / 8; if (abs(ka[11] - kaL[11]) > analogAttach) { controlChange(4, ka[11]); if (debug) { Serial.print("4 ka11 - "); Serial.println(ka[11]); } kaL[11] = ka[11]; } kb[11] = analogRead(1) / 8; if (abs(kb[11] - kbL[11]) > analogAttach) { controlChange(20, kb[11]); if (debug) { Serial.print("20 kb11 - "); Serial.println(kb[11]); } kbL[11] = kb[11]; } kc[11] = analogRead(2) / 8; if (abs(kc[11] - kcL[11]) > analogAttach) { controlChange(36, kc[11]); if (debug) { Serial.print("36 kc11 - "); Serial.println(kc[11]); } kcL[11] = kc[11]; } kd[11] = analogRead(3) / 8; if (abs(kd[11] - kdL[11]) > analogAttach) { controlChange(60, kd[11]); if (debug) { Serial.print("60 kd11 - "); Serial.println(kd[11]); } kdL[11] = kd[11]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y12 (pin 19) digitalWrite(13, LOW); digitalWrite(5, LOW); digitalWrite(9, HIGH); digitalWrite(10, HIGH); delayMicroseconds(2); ka[12] = analogRead(0) / 8; if (abs(ka[12] - kaL[12]) > analogAttach) { controlChange(12, ka[12]); if (debug) { Serial.print("12 ka12 - "); Serial.println(ka[12]); } kaL[12] = ka[12]; } kb[12] = analogRead(1) / 8; if (abs(kb[12] - kbL[12]) > analogAttach) { controlChange(28, kb[12]); if (debug) { Serial.print("28 kb12 - "); Serial.println(kb[12]); } kbL[12] = kb[12]; } kc[12] = analogRead(2) / 8; if (abs(kc[12] - kcL[12]) > analogAttach) { controlChange(44, kc[12]); if (debug) { Serial.print("44 kc12 - "); Serial.println(kc[12]); } kcL[12] = kc[12]; } kd[12] = analogRead(3) / 8; if (abs(kd[12] - kdL[12]) > analogAttach) { controlChange(61, kd[12]); if (debug) { Serial.print("61 kd12 - "); Serial.println(kd[12]); } kdL[12] = kd[12]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y13 (pin 18) digitalWrite(13, HIGH); digitalWrite(5, LOW); digitalWrite(9, HIGH); digitalWrite(10, HIGH); delayMicroseconds(2); ka[13] = analogRead(0) / 8; if (abs(ka[13] - kaL[13]) > analogAttach) { controlChange(11, ka[13]); if (debug) { Serial.print("11 ka13 - "); Serial.println(ka[13]); } kaL[13] = ka[13]; } kb[13] = analogRead(1) / 8; if (abs(kb[13] - kbL[13]) > analogAttach) { controlChange(27, kb[13]); if (debug) { Serial.print("27 kb13 - "); Serial.println(kb[13]); } kbL[13] = kb[13]; } kc[13] = analogRead(2) / 8; if (abs(kc[13] - kcL[13]) > analogAttach) { controlChange(43, kc[13]); if (debug) { Serial.print("43 kc13 - "); Serial.println(kc[13]); } kcL[13] = kc[13]; } kd[13] = analogRead(3) / 8; if (abs(kd[13] - kdL[13]) > analogAttach) { controlChange(57, kd[13]); if (debug) { Serial.print("57 kd13 - "); Serial.println(kd[13]); } kdL[13] = kd[13]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y14 (pin 17) digitalWrite(13, LOW); digitalWrite(5, HIGH); digitalWrite(9, HIGH); digitalWrite(10, HIGH); delayMicroseconds(2); ka[14] = analogRead(0) / 8; if (abs(ka[14] - kaL[14]) > analogAttach) { controlChange(10, ka[14]); if (debug) { Serial.print("10 ka14 - "); Serial.println(ka[14]); } kaL[14] = ka[14]; } kb[14] = analogRead(1) / 8; if (abs(kb[14] - kbL[14]) > analogAttach) { controlChange(26, kb[14]); if (debug) { Serial.print("26 kb14 - "); Serial.println(kb[14]); } kbL[14] = kb[14]; } kc[14] = analogRead(2) / 8; if (abs(kc[14] - kcL[14]) > analogAttach) { controlChange(42, kc[14]); if (debug) { Serial.print("42 kc14 - "); Serial.println(kc[14]); } kcL[14] = kc[14]; } kd[14] = analogRead(3) / 8; if (abs(kd[14] - kdL[14]) > analogAttach) { controlChange(58, kd[14]); if (debug) { Serial.print("58 kd14 - "); Serial.println(kd[14]); } kdL[14] = kd[14]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } // select 4067 channel Y15 (pin 16) digitalWrite(13, HIGH); digitalWrite(5, HIGH); digitalWrite(9, HIGH); digitalWrite(10, HIGH); delayMicroseconds(2); ka[15] = analogRead(0) / 8; if (abs(ka[15] - kaL[15]) > analogAttach) { controlChange(9, ka[15]); if (debug) { Serial.print("9 ka15 - "); Serial.println(ka[15]); } kaL[15] = ka[15]; } kb[15] = analogRead(1) / 8; if (abs(kb[15] - kbL[15]) > analogAttach) { controlChange(25, kb[15]); if (debug) { Serial.print("25 kb15 - "); Serial.println(kb[15]); } kbL[15] = kb[15]; } kc[15] = analogRead(2) / 8; if (abs(kc[15] - kcL[15]) > analogAttach) { controlChange(41, kc[15]); if (debug) { Serial.print("41 kc15 - "); Serial.println(kc[15]); } kcL[15] = kc[15]; } kd[15] = analogRead(3) / 8; if (abs(kd[15] - kdL[15]) > analogAttach) { controlChange(59, kd[15]); if (debug) { Serial.print("59 kd15 - "); Serial.println(kd[15]); } kdL[15] = kd[15]; } // digital function flag if (intA_flag) { intA_read(); } if (intB_flag) { intB_read(); } MidiUSB.flush(); // debug response code if (debug_code) { counter_code++; timer = millis(); if ((timer - timerL) >= interval) { Serial.print("counter_code - "); Serial.println(counter_code); counter_code = 0; timerL = millis(); } } } // Attachinterrupt function void intA() { intA_flag = true; if (debug) { Serial.println(" "); Serial.print("intA_flag - "); Serial.println(intA_flag); } } void intB() { intB_flag = true; if (debug) { Serial.println(" "); Serial.print("intB_flag - "); Serial.println(intB_flag); } } // int A function pcf1 + pcf2 void intA_read() { detachInterrupt(3); // pcf1 Wire.beginTransmission(pcf1_address); Wire.endTransmission(); Wire.requestFrom(pcf1_address, 2); if (Wire.available()) { lo_data = Wire.read(); hi_data = Wire.read(); } if (debug) { Serial.print("pcf1_lo "); Serial.println(lo_data, BIN); Serial.print("pcf1_hi "); Serial.println(hi_data, BIN); } // encoders encM1 for (uint8_t i = 0; i < 8; i++) { encM1[i] = (bitRead(lo_data, i )); } // encoders encM2 for (uint8_t i = 0; i < 8; i++) { encM2[i] = (bitRead(hi_data, i )); } // encoder 6 // count encoder pulse if (encM1[7] != encM1L[7] || encM1[0] != encM1L[0]) { counter_enc6++; if (debug) { Serial.print("counter_enc6 - "); Serial.println(counter_enc6); } } if (counter_enc6 == 3) { if (encM1[0] == 0 && encM1[7] == 1) { controlChange(70, 127); if (debug) { Serial.println("enc 6 - 70 <<"); } } if (encM1[7] == 0 && encM1[0] == 1) { controlChange(70, 1); if (debug) { Serial.println("enc 6 - 70 >>"); } } counter_enc6 = 0; } // reset rotation pulse if rotate other encoder if (encM1[7] == 1 && encM1[0] == 1) { counter_enc6 = 0; } // encoder 5 if (encM1[6] != encM1L[6] || encM1[1] != encM1L[1]) { counter_enc5++; if (debug) { Serial.print("counter_enc5 - "); Serial.println(counter_enc5); } } if (counter_enc5 == 3) { if (encM1[1] == 0 && encM1[6] == 1) { controlChange(69, 127); if (debug) { Serial.println("enc 5 - 69 <<"); } } if (encM1[6] == 0 && encM1[1] == 1) { controlChange(69, 1); if (debug) { Serial.println("enc 5 - 69 >>"); } } counter_enc5 = 0; } if (encM1[6] == 1 && encM1[1] == 1) { counter_enc5 = 0; } // encoder 8 if (encM1[5] != encM1L[5] || encM1[2] != encM1L[2]) { counter_enc8++; if (debug) { Serial.print("counter_enc8 - "); Serial.println(counter_enc8); } } if (counter_enc8 == 3) { if (encM1[2] == 0 && encM1[5] == 1) { controlChange(72, 127); if (debug) { Serial.println("enc 8 - 72 <<"); } } if (encM1[5] == 0 && encM1[2] == 1) { controlChange(72, 1); if (debug) { Serial.println("enc 8 - 72 >>"); } } counter_enc8 = 0; } if (encM1[5] == 1 && encM1[2] == 1) { counter_enc8 = 0; } // encoder 7 if (encM1[4] != encM1L[4] || encM1[3] != encM1L[3]) { counter_enc7++; if (debug) { Serial.print("counter_enc7 - "); Serial.println(counter_enc7); } } if (counter_enc7 == 3) { if (encM1[3] == 0 && encM1[4] == 1) { controlChange(71, 127); if (debug) { Serial.println("enc 7 - 71 <<"); } } if (encM1[4] == 0 && encM1[3] == 1) { controlChange(71, 1); if (debug) { Serial.println("enc 7 - 71 >>"); } } counter_enc7 = 0; } if (encM1[4] == 1 && encM1[3] == 1) { counter_enc7 = 0; } // encoders encM2 // encoder 2 if (encM2[7] != encM2L[7] || encM2[0] != encM2L[0]) { counter_enc2++; if (debug) { Serial.print("counter_enc2 - "); Serial.println(counter_enc2); } } if (counter_enc2 == 3) { if (encM2[0] == 0 && encM2[7] == 1) { controlChange(66, 127); if (debug) { Serial.println("enc 2 - 66 <<"); } } if (encM2[7] == 0 && encM2[0] == 1) { controlChange(66, 1); if (debug) { Serial.println("enc 2 - 66 >>"); } } counter_enc2 = 0; } if (encM2[7] == 1 && encM2[0] == 1) { counter_enc2 = 0; } // encoder 1 if (encM2[6] != encM2L[6] || encM2[1] != encM2L[1]) { counter_enc1++; if (debug) { Serial.print("counter_enc1 - "); Serial.println(counter_enc1); } } if (counter_enc1 == 3) { if (encM2[1] == 0 && encM2[6] == 1) { controlChange(65, 127); if (debug) { Serial.println("enc 1 - 65 <<"); } } if (encM2[6] == 0 && encM2[1] == 1) { controlChange(65, 1); if (debug) { Serial.println("enc 1 - 65 >>"); } } counter_enc1 = 0; } if (encM2[6] == 1 && encM2[1] == 1) { counter_enc1 = 0; } // encoder 4 if (encM2[5] != encM2L[5] || encM2[2] != encM2L[2]) { counter_enc4++; if (debug) { Serial.print("counter_enc4 - "); Serial.println(counter_enc4); } } if (counter_enc4 == 3) { if (encM2[2] == 0 && encM2[5] == 1) { controlChange(68, 127); if (debug) { Serial.println("enc 4 - 68 <<"); } } if (encM2[5] == 0 && encM2[2] == 1) { controlChange(68, 1); if (debug) { Serial.println("enc 4 - 68 >>"); } } counter_enc4 = 0; } if (encM2[5] == 1 && encM2[2] == 1) { counter_enc4 = 0; } // encoder 3 if (encM2[4] != encM2L[4] || encM2[3] != encM2L[3]) { counter_enc3++; if (debug) { Serial.print("counter_enc3 - "); Serial.println(counter_enc3); } } if (counter_enc3 == 3) { if (encM2[3] == 0 && encM2[4] == 1) { controlChange(67, 127); if (debug) { Serial.println("enc 3 - 67 <<"); } } if (encM2[4] == 0 && encM2[3] == 1) { controlChange(67, 1); if (debug) { Serial.println("enc 3 - 67 >>"); } } counter_enc3 = 0; } if (encM2[4] == 1 && encM2[3] == 1) { counter_enc3 = 0; } // encM1 old value = new for (uint8_t i = 0; i < 8; i++) { encM1L[i] = encM1[i]; } // encM2 old value = new for (uint8_t i = 0; i < 8; i++) { encM2L[i] = encM2[i]; } // pcf2 Wire.beginTransmission(pcf2_address); Wire.endTransmission(); Wire.requestFrom(pcf2_address, 2); if (Wire.available()) { lo_data = Wire.read(); hi_data = Wire.read(); if (debug) { Serial.print("pcf2_lo "); Serial.println(lo_data, BIN); Serial.print("pcf2_hi "); Serial.println(hi_data, BIN); } // buttons btnM1 for (uint8_t i = 0; i < 8; i++) { btnM1[i] = (bitRead(lo_data, i )); if (btnM1[i] != btnM1L[i]) { if (btnM1[i] == 0) { noteOn(i + 24, 127); // 24 - C1 > start midi note (31 - G1 > end) if (debug) { pressed(1, i, i + 24); } } if (btnM1[i] == 1) { noteOff(i + 24, 0); if (debug) { released(1, i, i + 24); } } btnM1L[i] = btnM1[i]; } } // buttons btnM2 for (uint8_t i = 0; i < 8; i++) { btnM2[i] = (bitRead(hi_data, i )); if (btnM2[i] != btnM2L[i]) { if (btnM2[i] == 0) { noteOn(i + 32, 127); if (debug) { pressed(2, i, i + 32); } } if (btnM2[i] == 1) { noteOff(i + 32, 0); if (debug) { released(2, i, i + 32); } } btnM2L[i] = btnM2[i]; } } } intA_flag = false; attachInterrupt(digitalPinToInterrupt(1), intA, FALLING); } // int B function pcf3 + pcf4 void intB_read() { detachInterrupt(2); //pcf3 Wire.beginTransmission(pcf3_address); Wire.endTransmission(); Wire.requestFrom(pcf3_address, 2); if (Wire.available()) { lo_data = Wire.read(); hi_data = Wire.read(); if (debug) { Serial.print("pcf3-lo "); Serial.println(lo_data, BIN); Serial.print("pcf3-hi "); Serial.println(hi_data, BIN); } // buttons btnM3 for (uint8_t i = 0; i < 8; i++) { btnM3[i] = (bitRead(lo_data, i )); if (btnM3[i] != btnM3L[i]) { if (btnM3[i] == 0) { noteOn(i + 40, 127); if (debug) { pressed(3, i, i + 40); } } if (btnM3[i] == 1) { noteOff(i + 40, 0); if (debug) { released(3, i, i + 40); } } btnM3L[i] = btnM3[i]; } } // buttons btnM4 for (uint8_t i = 0; i < 8; i++) { btnM4[i] = (bitRead(hi_data, i )); if (btnM4[i] != btnM4L[i]) { if (btnM4[i] == 0) { noteOn(i + 48, 127); if (debug) { pressed(4, i, i + 48); } } if (btnM4[i] == 1) { noteOff(i + 48, 0); if (debug) { released(4, i, i + 48); } } btnM4L[i] = btnM4[i]; } } } //pcf4 Wire.beginTransmission(pcf4_address); Wire.endTransmission(); Wire.requestFrom(pcf4_address, 2); if (Wire.available()) { lo_data = Wire.read(); hi_data = Wire.read(); } if (debug) { Serial.print("pcf4-lo "); Serial.println(lo_data, BIN); Serial.print("pcf4-hi "); Serial.println(hi_data, BIN); } // buttons btnM5 for (uint8_t i = 0; i < 8; i++) { btnM5[i] = (bitRead(lo_data, i )); if (btnM5[i] != btnM5L[i]) { if (btnM5[i] == 0) { noteOn(i + 59, 127); if (debug) { pressed(5, i, i + 59); } } if (btnM5[i] == 1) { noteOff(i + 59, 0); if (debug) { released(5, i, i + 59); } } btnM5L[i] = btnM5[i]; } } for (uint8_t i = 0; i < 8; i++) { mas[i] = (bitRead(hi_data, i )); } // master encoders buttons if (mas[7] != masL[7]) { if (mas[7] == 0) { noteOn(57, 127); if (debug) { Serial.println("mas1 7 pressed 57"); } } if (mas[7] == 1) { noteOff(57, 0); if (debug) { Serial.println("mas1 7 released 57"); } } masL[7] = mas[7]; } if (mas[4] != masL[4]) { if (mas[4] == 0) { noteOn(58, 127); if (debug) { Serial.println("mas2 4 pressed 58"); } } if (mas[4] == 1) { noteOff(58, 0); if (debug) { Serial.println("mas2 4 released 58"); } } masL[4] = mas[4]; } // master encoder 1 if (mas[0] != masL[0] || mas[1] != masL[1]) { counter_mas1++; if (debug) { Serial.print("counter_mas1 - "); Serial.println(counter_mas1); } } if (counter_mas1 == 3) { if (mas[0] == 0 && mas[1] == 1) { controlChange(73, 127); if (debug) { Serial.println("mas 1 - 73 >>"); } } if (mas[1] == 0 && mas[0] == 1) { controlChange(73, 1); if (debug) { Serial.println("mas 1 - 73 <<"); } } counter_mas1 = 0; } if (mas[0] == 1 && mas[1] == 1) { counter_mas1 = 0; } // master encoder 2 if (mas[2] != masL[2] || mas[3] != masL[3]) { counter_mas2++; if (debug) { Serial.print("counter_mas2 - "); Serial.println(counter_mas2); } } if (counter_mas2 == 3) { if (mas[2] == 0 && mas[3] == 1) { controlChange(74, 127); if (debug) { Serial.println("mas 2 - 74 >>"); } } if (mas[3] == 0 && mas[2] == 1) { controlChange(74, 1); if (debug) { Serial.println("mas 2 - 74 <<"); } } counter_mas2 = 0; } if (mas[2] == 1 && mas[3] == 1) { counter_mas2 = 0; } // mas old value = new masL[0] = mas[0]; masL[1] = mas[1]; masL[2] = mas[2]; masL[3] = mas[3]; intB_flag = false; attachInterrupt(digitalPinToInterrupt(0), intB, FALLING); } // debug functions void pressed(byte module, byte btn, byte val) { Serial.print("M"); Serial.print(module); Serial.print(" "); Serial.print(btn); Serial.print(" pressed " ); Serial.println(val); } void released(byte module, byte btn, byte val) { Serial.print("M"); Serial.print(module); Serial.print(" "); Serial.print(btn); Serial.print(" released "); Serial.println(val); }