// minimoog vezérlő #include // ha 31250 baud, mehet a MIDI csatlakozóra. #include // debughoz LiquidCrystal_I2C lcd(0x3F, 16, 2); // LCD address 0x27, 20 chars and 4 line display #define muxPinA 2 // MUX címző kimenetek #define muxPinB 3 #define muxPinC 4 #define muxPinD 5 // az engedélyezés fix L szinten #define An0 A0 // MCU Analóg bemenetek #define An1 A1 #define An2 A2 #define An3 A3 // Az I2C dedikált kimarad #define An4 A6 #define LED 13 #define VocFilt 6 // A Vocal Filter gombja, nem felhasznált #define Arpeggiator 7 // Az arpeggiator gombja, nem felhasznált #define MIDI_send 8 // A forszírozott MIDI küldés gombja #define VocFiltLED 11 // A Vocal Filter LED-je, nem felhasznált #define ArpeggiatorLED 12 // Az arpeggiator LED-je, nem felhasznált int potVal[85] = {0}; // a potik értéke byte i; // ciklusváltozó int potValDiff[85] = {0}; // különbségek, lehet negatív is! int lastPotVal[85] = {0}; // az előbbi értékek int diff = 16; // difference amount 4 volt, az AD erdeti 12 bites felbontásában nézi. int muxValue; void setup() { lcd.init(); // Inicializálás Serial.begin(115200); // 31250 ? pinMode(LED, OUTPUT); digitalWrite(LED, LOW); pinMode(muxPinA, OUTPUT); pinMode(muxPinB, OUTPUT); pinMode(muxPinC, OUTPUT); pinMode(muxPinD, OUTPUT); pinMode(VocFilt, INPUT_PULLUP); pinMode(Arpeggiator, INPUT_PULLUP); pinMode(MIDI_send, INPUT_PULLUP); } //-------------------------------------- void loop() { for ( i = 0; i < 80; i++) { // 0-80 { potVal[i] = readMux(i); // Multiplexerek beolvasása, 12 bitesről lekonvertál, ha kell: readMux(i)>>4; } Calculate(); ForceMIDIsend(); } //================== RUTINOK ====================== int readMux(int channel) // beolvasó rutin { digitalWrite(muxPinA, bitRead(channel, 0)); // An MUX csatorna vezérlés digitalWrite(muxPinB, bitRead(channel, 1)); // csak az alsó négy bitet nézi digitalWrite(muxPinC, bitRead(channel, 2)); digitalWrite(muxPinD, bitRead(channel, 3)); if (i < 16) muxValue = analogRead(An0); // 0-15 if (i > 15 && i < 32) muxValue = analogRead(An1); // 16-31 volt: 33,49,65,81 if (i > 31 && i < 48) muxValue = analogRead(An2); if (i > 47 && i < 64) muxValue = analogRead(An3); // I2C lábak kimaradnak! if (i > 63 && i < 80) muxValue = analogRead(An4); // Ez az A6! return muxValue; } void Calculate() { for ( i = 0; i < 80; i++) { // a 0 is egy foglalt cím! potValDiff[i] = potVal[i] - lastPotVal[i]; if (abs(potValDiff[i]) > diff) // végrehajtás csak akkor, ha a különbség elég nagy { digitalWrite(LED, HIGH); // LED: MIDI üzenet jelzése! if (i==31) { MIDImessage(177, 81, map(potVal[i], 0, 4096, 0, 127)); // foglalt cím: 32 esetén 81 lesz! goto vege; } if (i==63) { MIDImessage(177, 82, map(potVal[i], 0, 4096, 0, 127)); // foglalt cím: 64 esetén 82! goto vege; } MIDImessage(177, i + 1, map(potVal[i], 0, 4096, 0, 127)); // 0-127 es tartományba kényszerítés, és kiírás vege: // foglalt cím esetén kikerüli... lastPotVal[i] = potVal[i]; // a régi érték felülírása az új értékkel digitalWrite(LED, LOW); } } } void MIDImessage(byte status, byte data1, byte data2) { Serial.write(status); Serial.write(data1); Serial.write(data2); } void ForceMIDIsend(){ if (digitalRead(MIDI_send)==LOW) { // Ha a gombot megnyomtuk digitalWrite(LED, HIGH); // LED: MIDI üzenet jelzése! for ( i = 0; i < 80; i++) { if (i==31) goto vege2; // A 32 és a 64 kihagyása a ciklusból if (i==63) goto vege2; MIDImessage(177, i + 1, map(potVal[i], 0, 4096, 0, 127)); // channel 2, sorszám, adat: 0-127 es tartományba kényszerítés, és kiírás vege2:; } MIDImessage(177, 81, map(potVal[31], 0, 4096, 0, 127)); // a 32 és a 64 értékek pótlása a 80 feletti címekkel MIDImessage(177, 82, map(potVal[63], 0, 4096, 0, 127)); digitalWrite(LED, LOW); } } void Ser() { // poti értékek kiírása ellenőrzési célból for ( i = 0; i < 80; i += 4) { // 81-82 !! Serial.print(i); // kiírás négy oszlopban Serial.print("\t"); // TAB Serial.print(potVal[i]); Serial.print("\t"); // TAB Serial.print(i + 1); Serial.print("\t"); // TAB Serial.print(potVal[i + 1]); Serial.print("\t"); // TAB Serial.print(i + 2); Serial.print("\t"); // TAB Serial.print(potVal[i + 2]); Serial.print("\t"); // TAB Serial.print(i + 3); Serial.print("\t"); // TAB Serial.println(potVal[i + 3]); } }