Sommario:

EAL - Controller MIDI Arduino: 7 passaggi
EAL - Controller MIDI Arduino: 7 passaggi

Video: EAL - Controller MIDI Arduino: 7 passaggi

Video: EAL - Controller MIDI Arduino: 7 passaggi
Video: Arduino midi controller (все просто 🎛️) 2024, Dicembre
Anonim
EAL - Controller MIDI Arduino
EAL - Controller MIDI Arduino

Prodotto da Søren Østergaard Petersen, OEAAM16EDA

Questa istruzione descrive un controller MIDI basato su arduino. Questo è un progetto scolastico. Usando la tua mano puoi suonare semplici melodie tramite la connessione MIDI e uno strumento MIDI collegato (o come in questo caso un notebook con un software softsynth). Puoi suonare note da una scala di do maggiore, do-re-mi-fa-sol-la-si-do. Per poter collegare il controller MIDI a un notebook, avrai bisogno di un'interfaccia da MIDI a USB come m-audio Uno.

Passaggio 1: video dimostrativo

Image
Image

Alza il volume e divertiti!

Come funziona:

Il controller MIDI utilizza una scheda Arduino MEGA 2560. Due sensori di luce (LDR) integrati in un tubo elettrico da 16 mm formano un sistema a doppio sensore e vengono utilizzati per creare un trigger stabile senza falsi doppi trigger. Una torcia sta creando un raggio di luce, quando il raggio viene interrotto dalla mano che suona il controller, il sensore di luce inferiore rileva il raggio mancante e un sensore a ultrasuoni HC-SR04 misura la distanza dal sensore alla mano.

La distanza misurata viene utilizzata nel programma Arduino per calcolare e impostare il valore del numero di nota appropriato da inserire in un messaggio MIDI Note On e trasmetterlo sull'interfaccia MIDI. L'interfaccia di uscita MIDI utilizza un inverter esadecimale 74HC14 ed è praticamente un circuito standard. La comunicazione MIDI utilizza serial1, la porta seriale standard viene utilizzata per il debug.

Quando la mano viene spostata verso l'alto e lontano dal raggio di luce, il sensore di luce superiore rileva nuovamente il raggio di luce e un messaggio MIDI Note Off viene impacchettato e trasmesso all'uscita MIDI.

L'area di gioco tra i sensori è di circa 63 cm e la lunghezza totale del controller MIDI è di circa 75 cm.

Passaggio 2: dettagli dei sensori di luce

Dettagli dei sensori di luce
Dettagli dei sensori di luce
Dettagli dei sensori di luce
Dettagli dei sensori di luce

I due sensori di luce sono montati uno sopra l'altro per formare un doppio sistema di sensori. Previene falsi trigger se usato correttamente nel software. Ciascun sensore di luce è costituito da un modulo fotoresistore integrato in un tubo elettrico standard da 16 mm. In ogni tubo viene praticata una fessura con un seghetto e il PCB della fotoresistenza può essere premuto nella fessura. I sensori sono fissati insieme con nastro adesivo e fissati a un'estremità di un pezzo di legno. Nessuna luce deve essere in grado di raggiungere i sensori da dietro. I sensori di luce sono dotati di resistori pull-up da 10k.

Passaggio 3: dettagli del sensore a ultrasuoni HC-SR04

Dettagli del sensore a ultrasuoni HC-SR04
Dettagli del sensore a ultrasuoni HC-SR04

Il sensore a ultrasuoni HC-SR04 è fissato all'altra estremità del controller MIDI. Anche qui viene posizionata una torcia luminosa, che crea il raggio di luce necessario.

Fase 4: Il circuito Aduino

Il Circuito Aduino
Il Circuito Aduino
Il Circuito Aduino
Il Circuito Aduino

Il circuito di uscita MIDI è fondamentalmente un inverter esadecimale 74HC14 standard e alcuni resistori più un connettore femmina DIN a 5 pin. Il circuito 74HC14 pilota l'uscita MIDI e allo stesso tempo fornisce alcuni mezzi di protezione per la scheda Arduino contro il "mondo reale" collegato all'uscita MIDI. Una caratteristica extra pratica è il LED di attività MIDI che segnala quando i dati vengono inviati.

Ho usato un vero e proprio prototipo di PCB per il mio hardware perché ho avuto molti problemi con cattive connessioni sulla mia breadboard. Lo schema è realizzato a Fritzing, una copia in pdf ad alta risoluzione può essere scaricata premendo il link sottostante. Preferisco usare un programma di schemi appropriato come Kicad, penso che Fritzing sia limitato a tutto tranne che agli esperimenti più semplici.

Materiali usati:

1 pz Arduino MEGA 2560

2 pz Fotoresistenza (LDR) con resistenza di pull-up incorporata (dal kit di 37 sensori)

Sensore a ultrasuoni HC-SR04 da 1 pz

1 pz 74HC14 esadecimale invertente grilletto Schmitt

2 resistenze 220 Ohm 0.25W

1 pz resistenza 1k Ohm 0.25W

1 pz LED a bassa corrente 2mA

1 pz condensatore ceramico 100nF (per il disaccoppiamento dell'alimentazione, direttamente sui pin di alimentazione del 74HC14)

Breadboard o PCB prototipo

2 tubi elettrici da 16 mm, lunghezza 65 mm

1 pezzo di legno, lunghezza 75 cm

Nastro adesivo

fili

Passaggio 5: elenco I/O

Elenco I/O
Elenco I/O

Passaggio 6: il codice Aduino

Lo sketch test_Midi6 utilizza la libreria NewPing che devi includere nel tuo ambiente di programmazione Arduino, per utilizzare il sensore a ultrasuoni HC-SC04. Lo sketch è commentato in danese, mi dispiace. Per mantenere lo sketch ben strutturato, vengono create funzioni separate per le diverse parti logiche dello sketch e le variabili globali sono per lo più evitate. Il flusso del programma è visualizzato nel pdf del diagramma di flusso del controller MIDI.

// 15-05-2017 versione: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dette program udgør en semplice controller MIDI in modo che possa essere modificato in un MIDI integrato, f.eks e softsynt su PC. // Controller MIDI può inviare toneanslag (nota sul comando) hhv. (nota fuori kommando) per en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorrne er monteret. MIDI kommandoerne triggers af en dobbelt LDR sensor, da der skal laves en sikker // detektering af både når hånden lander på brættet (nota su), samt når hånden fjernes igen (nota fuori). // MIDI kommandoerne "note on" o "note off" migliore su 3 byte di invio per porta seriale 1 // vha det i hardware opbyggede interfaccia MIDI. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin til trigger pin på sensore ultrasonico #define ECHO_PIN 2 // Arduino pin til echo pin på sensore ultrasonico # define MAX_DISTANCE 100 // Massimo afstand per Ping #define Median 5 // Antal målinger der beregnes gennemsnit af for at få en sikker afstandsbestemmelse NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Creazione dell'oggetto NewPing. int Senspin1 = 53; // Sotto LDR1 føler int Senspin2 = 52; //Øverste LDR2 per byte MIDIByte2; //Dichiarazione variabile per MIDIByte2 bool klar_note_on = 1; //Variabel deklaration for klar_note_on, styrer afsendelse af note on kommando. Første kommando er en note on kommando bool klar_note_off = 0; //Variabel deklaration for klar_note_off, styrer afsendelse af note off kommando void setup() { pinMode(Senspin1, INPUT); // sæt input del sensore pinMode(Senspin2, INPUT); // sæt ingresso sensore Serial1.begin(31250); // Serial1 collega alla comunicazione MIDI: 31250 bit/sekundt Serial.begin(9600); // monitor seriale, fino al test } void loop() { bool Sensor1 = digitalRead(Senspin1); //Læs LDR1 - underte LDR bool Sensor2 = digitalRead(Senspin2); //læs LDR2 - øverste LDR if (Sensor1 && klar_note_on) //hvis LDR1 attivo og klar til note on { byte Note_Byte = Hent_tonehojde(); //Hent tone højde tramite sensore ultralyds MIDIByte2 = Hent_MidiByte2(Note_Byte); // Hent MidByte2, numero nota MIDI, værdien 0xFF er fuori dall'intervallo Send_Note_On(MIDIByte2); // kald Send_Note_On funzione klar_note_on = 0; // der skal kun invia una nota su kommando klar_note_off = 1; // næste kommando er note off } if (Sensor2 && !Sensor1 && klar_note_off) // Hvis der skal invia note off kommando gøres det her.. { Send_Note_Off(MIDIByte2); // invia una nota fuori kommando klar_note_off = 0; // der skal kun sendes en note off kommando } if (!Sensor1 && !Sensor2) // her gøres klar til ny note on kommando, hånd er væk fra brædt { klar_note_on = 1; } } byte Hent_MidiByte2(byte NoteByte) { // Denne funktion returnerer Numero nota MIDI, valgt ud fra NoteByte byte MIDIB2; switch (NoteByte) // her defineres hvilken værdi MIDIByte2 skal have ud fra værdien af Note_Byte { case 0: { MIDIB2 = 0x3C; // tono 'C' } break; caso 1: { MIDIB2 = 0x3E; // tono 'D' } break; caso 2: { MIDIB2 = 0x40; // tono 'E' } break; caso 3: { MIDIB2 = 0x41; // tono 'F' } pausa; caso 4: { MIDIB2 = 0x43; // tono 'G' } pausa; caso 5: { MIDIB2 = 0x45; // tono 'A' } pausa; caso 6: { MIDIB2 = 0x47; // tono 'B' } pausa; caso 7: { MIDIB2 = 0x48; // tono 'C' } break; predefinito: { MIDIB2 = 0xFF; // fuori intervallo } } return MIDIB2; //returner numero nota MIDI } byte Hent_tonehojde() { //Denne funktion heenter resultatet af ultralydsmålingen unsigned int Tid_uS; // målt tid i uS byte Afstand; // beregnet afstand i cm byte risultato; // inddeling af spille område const float Omregningsfaktor = 58.3; // 2*(1/343 m/s)/100 = 58, 3uS/cm, der ganges med 2 da tiden er summen af tiden frem og tilbage. Tid_uS = sonar.ping_median(Mediana); // Send ping, få tid retur i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = fuori dall'intervallo di distanza) resultat = Afstand / 8; //Beregn risultato restituisce risultato; //Returner resultat } void Send_Note_On(byte tonenr) { //Denne funktion sender en note on kommando på interfaccia MIDI const byte kommando = 0x90; //Nota sul comando på canale MIDI 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write(kommando); //invia nota su kommando Serial1.write(tonenr); //invia il numero di tono Serial1.write(volumen); //send volumen (velocity) } void Send_Note_Off(byte tonenr) {//Denne funktion sender note off kommando på interfaccia MIDI const byte kommando = 0x80; //Note off kommando på canale MIDI 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write(kommando); //invia una nota a kommando Serial1.write(tonenr); //invia il numero di tono Serial1.write(volumen); //invia volumen (velocità) }

Passaggio 7: le basi della comunicazione MIDI

MIDI (Musical Instrument Digital Interface) è un protocollo di comunicazione seriale universale per l'interfacciamento di strumenti musicali elettronici e altri dispositivi. Viene utilizzata la comunicazione seriale (31250 bit/s, il mezzo di trasmissione è un loop di corrente, optoisolato all'estremità del ricevitore. Vengono utilizzati connettori DIN a 5 pin. Sono possibili 16 canali di comunicazione logici in una connessione MIDI fisica. Molti comandi sono definiti nel MIDI standard, io uso due comandi in questo progetto, questi comandi sono composti da 3 byte:

a) Nota sul comando:

1. byte send = 0x90 che significa nota su comando sul canale MIDI 1

2. byte send = 0xZZ ZZ è il numero della nota, io uso l'intervallo da 0x3C a 0x48

3. byte di invio =0xFF FF = 255 che significa volume massimo, intervallo da 0x00 a 0xFF

b) Comando Nota Off:1. byte send = 0x80 significa comando note off sul canale MIDI 1

2. byte send = 0xZZ ZZ è il numero della nota, io uso l'intervallo da 0x3C a 0x48

3. byte di invio =0xFF FF = 255 che significa volume massimo, intervallo da 0x00 a 0xFF

Consigliato: