Analizziamo il protocollo MIDI con Arduino, vediamo come funziona e come programmarlo attraverso il software.
MIDI, l’interfaccia digitale per strumenti musicali, è un protocollo utile per controllare sintetizzatori, sequencer e altri dispositivi musicali. I dispositivi MIDI sono generalmente raggruppati in due grandi classi: controller (cioè dispositivi che generano segnali MIDI basati su azioni umane) e sintetizzatori (inclusi campionatori, sequencer e così via). Questi ultimi prendono i dati MIDI e producono suoni, luci o altri effetti.
La forza del MIDI sta nell’essere completamente specificato e adatto allo scopo per cui è stato concepito e la maggior parte dei produttori lo ha adottato con quello spirito risultando in uno standard mondiale che è ancora in uso da oltre 20 anni dalla sua introduzione. L’enorme numero di strumenti MIDI realizzati assicura che il MIDI non scomparirà o cambierà.
Come funziona
Il MIDI è un protocollo seriale che opera a 31.250 bit al secondo. La porta seriale integrata della scheda (anche sul Mega) può inviare dati a quella velocità.
I byte MIDI sono divisi in due tipi: byte di comando e byte di dati. I byte di comando hanno un valore sempre superiore a 127, quindi da 0x80 a 0xFF in esadecimale. I byte di dati sono sempre inferiori a 127 o da 0x00 a 0x7F in esadecimale. I comandi includono operazioni come note on, note off, pitch bend e così via. I byte di dati includono valori come l’altezza della nota da suonare, la velocità (o durata dell’impulso), il volume della nota, la quantità di pitch bend e così via. Per maggiori dettagli, vedere le specifiche MIDI o una delle numerose guide ai protocolli MIDI sul Web.
I dati MIDI sono generalmente annotati in esadecimale, perché i banchi e gli strumenti MIDI sono raggruppati in gruppi di 16.
Un esempio: controller MIDI
In questo articolo mostreremo come creare un controllore di eventi MIDI utilizzando Arduino. Ci serviranno i seguenti componenti:
- Scheda Arduino UNO o equivalente
- Un jack MIDI femmina
- Due resistori da 220 ohm
- Cavi di collegamento
- Un sistema MIDI per il testing dei valori trasmessi.
Tutti i connettori MIDI sono femmine, per definizione delle specifiche MIDI. Ecco come collegare il connettore alla scheda:
- Pin 5 del jack MIDI collegato al pin 1 digitale tramite un resistore da 220 ohm
- Pin 2 del jack MIDI collegato a terra
- Pin 4 del jack MIDI collegato a +5V tramite un resistore da 220 ohm
Il programma: MIDI.ino
Di seguito mostriamo un programma di esempio, che utilizza la nostra scheda Arduino come controller MIDI programmabile:
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 38 39 40 41 42 43 44 45 46 |
/* MIDI note player This sketch shows how to use the serial transmit pin (pin 1) to send MIDI note data. If this circuit is connected to a MIDI synth, it will play the notes F#-0 (0x1E) to F#-5 (0x5A) in sequence. The circuit: - digital in 1 connected to MIDI jack pin 5 - MIDI jack pin 2 connected to ground - MIDI jack pin 4 connected to +5V through 220 ohm resistor - Attach a MIDI cable to the jack, then to a MIDI synth, and play music. created 13 Jun 2006 modified 13 Aug 2012 by Tom Igoe This example code is in the public domain. https://www.arduino.cc/en/Tutorial/BuiltInExamples/Midi */ void setup() { // Set MIDI baud rate: Serial.begin(31250); } void loop() { // play notes from F#-0 (0x1E) to F#-5 (0x5A): for (int note = 0x1E; note < 0x5A; note ++) { //Note on channel 1 (0x90), some note value (note), middle velocity (0x45): noteOn(0x90, note, 0x45); delay(100); //Note on channel 1 (0x90), some note value (note), silent velocity (0x00): noteOn(0x90, note, 0x00); delay(100); } } // plays a MIDI note. Doesn't check to see that cmd is greater than 127, or that // data values are less than 127: void noteOn(int cmd, int pitch, int velocity) { Serial.write(cmd); Serial.write(pitch); Serial.write(velocity); } |
Questo programma mostra come utilizzare il pin di trasmissione seriale (pin 1) per inviare dati di note MIDI. Se questo circuito è collegato a un sintetizzatore MIDI, suonerà le note da F#-0 (0x1E) a F#-5 (0x5A) in sequenza.
Nel Setup() definiamo la velocità di trasmissione della seriale allineandoci alle specifiche MIDI (31250Hz). È anche possibile utilizzare la software serial per non occupare il canale di trasmissione hardware.
Il Loop() invece esegue un ciclo for() definito in esadecimale tra 0x1E e 0x5A (ovvero, rispettivamente tra i valori decimali 30 e 90, o le note FA#0 – FA#5). Ciascuna nota viene inviata attraverso il canale MIDI 1 (0x90) attraverso la funzione noteOn.
La funzione noteOn() richiede tre parametri: il canale (o comando), il valore della nota in standard MIDI e la velocity, ovvero una codifica che restituisce la dinamica del suono. La funzione non fa altro che scrivere sulla seriale questi tre parametri, che saranno inviati attraverso il jack MIDI opportunamente collegato ad un ingresso MIDI esterno.
Il Loop() provvederà quindi ad attendere 100 millisecondi, e ad inviare un nuovo comando per silenziare la nota precedente (comando velocity posto a 0x00). Ulteriori 100 millisecondi di attesa prima di leggere una nuova nota.
Attraverso questo semplice programma opportunamente collegato ad un MIDI box o ad un software, possiamo quindi definire le note di una melodia ed inviarle al controller per farle eseguire come un sequencer programmabile. Inoltre possiamo modificare le caratteristiche della nota attraverso i byte di comando.
Estensioni
Abbiamo semplicemente intaccato la superficie di questo tema, complesso e interessante. Possiamo infatti modificare il tipo di strumento suonato, l’espressione, il volume, inviare note su 16 canali contemporaneamente… ma la superficie di questo schermo è troppo ridotta per parlarne ora.
Se l’argomento vi interessa, se vorreste saperne di più su come utilizzare il protocollo MIDI con Arduino per fare musica, scriveteci!