Alesis MIDI piano + Led Neopixel

Ciao a tutti!
Sono Chiara, una studentessa che si sta per laureare all'Accademia delle Belle Arti.

La mia tesi di laurea è sull'Arte e la Sinestesia, per il mio corso di laurea oltre a fare una tesi scritta devo anche realizzare un progetto pratico. Come progetto avevo intenzione di costruire un "pianoforte luminoso", cioè un pianoforte (in questo caso una pianola midi) che ha dei led posizionati davanti ad esso, ad ogni nota schiacciata si dovrebbe accendere la luce corrispondente alla nota. Vorrei realizzare questo con l'aiuto di Arduino, la mia pianola Midi Alesis 49 e delle strip led Neopixel.

La verità è che sono ancora una principiante, durante gli anni di università ho studiato i codici html e css, non di certo codici di programmazione Arduino, però devo essere sincera, il fatto di avere già un po di dimestichezza con altri codici mi ha aiutato ad avere un approccio più tranquillo con la programmazione Arduino. Infatti sono riuscita a fare già qualcosa, non tanto collegata al mio progetto, per esempio:
Accendere strip led e impostare colori diversi per ogni led, far muovere la luce del led in diverse maniere (come far correre la luce led in tutta la strip mentre cambia colore, accendere le luci e spegnerle con un determinato tempo ecc).

Ora espongo il problema principale:
Come ho già detto sono una principiante, quindi mi scuso già da subito perché sicuramente risulterò irritante e piena di domande ovvie. Ora elenco gli strumenti che posseggo:

  1. Arduino UNO;
  2. Piano Midi Keyboard Alesis v49;
  3. Led Neopixel WS2812;

Ho fatto un sacco di ricerche, ho visto tutti i video possibili e immaginabili che ho trovato su youtube e google, ma sono serviti a poco. Poiché trovo difficoltà nei soliti punti.

Le mie domande sono:

Che codice specifico bisogna usare per collegare la mia alesis 49 al Arduino?
Come faccio a collegare la tastiera midi alle luci led?
Conoscete qualcuno che ha già realizzato un progetto simile?
Dovrei prima impostare i codici dei led e poi quelli della midi?

Ora vi posto un codice che ho utilizzato per accendere la mia strip led, un codice molto semplice solo per farle lampeggiare ognuna con un colore diverso:

#include <Adafruit_NeoPixel.h>


 #ifdef __AVR__
   #include <avr/power.h>
   #endif

   #define EL 13
   #define PIN 6

   Adafruit_NeoPixel pixels = Adafruit_NeoPixel(EL, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
 pixels.begin();
 pixels.setPixelColor(0, pixels.Color(0,150,150));
 pixels.show();
 delay(1000);
}

void loop() {

  for (int i =0; i < EL; i++){
    pixels.setPixelColor(i, pixels.Color(255,255,255));
  }
   for (int i =1; i < EL; i++){
    pixels.setPixelColor(i, pixels.Color(255,0,0));
}
for (int i =2; i < EL; i++){
    pixels.setPixelColor(i, pixels.Color(250,50,0));
}
for (int i =3; i < EL; i++){
    pixels.setPixelColor(i, pixels.Color(200,100,0));
}
for (int i =4; i < EL; i++){
    pixels.setPixelColor(i, pixels.Color(100,200,0));
}
for (int i =5; i < EL; i++){
    pixels.setPixelColor(i, pixels.Color(50,250,0));
}
for (int i =6; i < EL; i++){
    pixels.setPixelColor(i, pixels.Color(0,200,50));
}
for (int i =7; i < EL; i++){
    pixels.setPixelColor(i, pixels.Color(0,0,250));
}

pixels.show();
delay(1000);
for(int i=0; i <EL; i++){
  pixels.setPixelColor(i, pixels.Color(0,0,0));
  }
  pixels.show();
  delay(1000);

}

In realtà qualsiasi informazione e ben accetta, quindi chiunque possa aiutarmi, vi prego di farlo.

Ringrazio chiunque legga il topic per l'attenzione :slight_smile:
AIUTATEMI VI PREGO :cry:

Buonasera, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Allora, per ora non è possibile ancora entrare nel dettaglio dell'implementazione su Arduino ma vorrei per prima cosa darti qualche risposta, anche considerando che sono un tastierista (anche se amatoriale, ho 4 tastiere MIDI e le suono in una band Genesis...).

Che codice specifico bisogna usare per collegare la mia alesis 49 al Arduino?

Non è tanto un problema di codice ma "hardware". Quella tastiera (non è una pianola...;)) ha solo l'uscita USB ossia è una USB-MIDI, il che significa che non ha le consuete porte MIDI quindi l'unico modo di interfacciarti con quella tastiera è via USB. Purtroppo Arduino nonha una porta nativa USB Host (come quella del computer per intenderci, alla quale colleghi periferiche USB come questa, o il mouse o la tastiera). Farlo non è affatto banale, soprattutto con Arduino, ed io personalmente non l'ho mai fatto quindi non so darti una mano se volessi fare questo.

L'unica soluzione con quella tastiera sarebbe quella di passare tramite un PC, al quale collegare la tastiera via USB, quindi Arduino su un'altra USB e dirottare su questa seriale tutti i messaggi MIDI ricevuti dalla Alesis (si può fare con un programmino che ho visto spesso, di cui per ora mi sfugge il nome, anche se non l'ho mai usato).

Posso solo dirti però che se tu avessi un'altra tastiera MIDI che sia (anche) MIDI ossia abbia il classico connettore MIDI (quello rotondo con 5 contatti) come ad esempio la Alesis Q49 allora sarebbe tutta un'altra cosa perché, in quel caso, sì che sarebbe possibile! Ovviamente dovrai studiare un pochino almeno il funzionamento dell'interfaccia MIDI (niente di difficilissimo, è una seriale ed i dati hanno un determinato formato per i quali comunque ci sono delle librerie per Arduino che possono aiutarti parecchio).

Come faccio a collegare la tastiera midi alle luci led?

Non ho capito bene il tuo dubbio: ma la colleghi tramite Arduino, no?...

Conoscete qualcuno che ha già realizzato un progetto simile?

No, ma se provi a cercare sul sito instructables (cerca con Google "instructables arduino midi keyboard lights") puoi trovare vari progetti, anche abbastanza simili da cui prendere spunto, come QUESTO ad esempio, ma in generale a mio avviso tu DEVI cambiare tastiera prendendone una con uscita MIDI "fisica".

Dovrei prima impostare i codici dei led e poi quelli della midi?

Questa è proprio l'ultima cosa a cui devi pensare, per ora. Prima risolvi i problemi di cui sopra, inizia ad avere in mente come vorresti realizzare la cosa, poi si pensa ai codici.

In realtà ho considerato già che Alesis V49 non ha interfaccia midi , ma solo USB, per questo l'ho collegata al pc utilizzando poi un software per inviare i dati ad Arduino (hairless-midi). Il sistema funziona, infatti suonando la tastiera V49 usb si attivano i.led tx-rx su arduino, ma i led w2812 no.
Quindi il problema è sul codice inviato ad Arduino che metto qua sotto:

#include <MIDI.h>
#include <FastLED.h>

#define numLED      13
#define pinLED      7
#define typeLED     WS2812B
#define colourOrder GRB
#define brightness  128

CRGB leds[numLED];

MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
 
  LEDS.addLeds<typeLED, pinLED, colourOrder>(leds, numLED);
  FastLED.setBrightness(brightness);
  MIDI.begin(MIDI_CHANNEL_OMNI);
  MIDI.setHandleNoteOn(handleNoteOn);
  MIDI.setHandleNoteOff(handleNoteOff);

}

void loop() {
  MIDI.read();
 }

void handleNoteOn(byte channel, byte pitch, byte velocity) {
if (pitch >= 30 && pitch <= 101)
{
  int R = -2*pitch + 203;  //turning the pitch value into the corresponding LED to turn off
  leds[R].setRGB( 0, 0, 0);
  FastLED.show();
}
}

void handleNoteOff(byte channel, byte pitch, byte velocity) {
for (byte i=30; i<=101; i++){
  if (pitch==i){
    int R = (-2)*i + 203;  //turning the pitch value into the corresponding LED to turn off
    leds[R].setRGB( 0, 0, 0);
    FastLED.show();
  }
}
}

Chiedo pertanto di dare uno sguardo al codice inviato in allegato per una verifica.

Ps: eventualmente ho ha disposizione anche una UMX49 con interfacie usb -midi , che consentirebbe il collegamento midi diretto con Arduino evitando l'uso del PC.

void handleNoteOn(byte channel, byte pitch, byte velocity) {
    if (pitch >= 30 && pitch <= 101)
    {
       int R = -2*pitch + 203;  //turning the pitch value into the corresponding LED to turn off
       leds[R].setRGB( 0, 0, 0);
       FastLED.show();
    }
}

Questa funzione si attiva quando una nota viene suonata per fare accendere il led[R], però setRGB(0 ,0, 0)
imposta un colore zero per ogni componente R(Rosso), G(Green) e B(Blue), quindi dovrebbe bastare modificare gli zero in un numero da 0÷255, dove ovviamente 255 è la massima luminosità.

Poi non credo questo define sia un errore, comunque controlla

#define colourOrder GRB

Solitamente l'ordine è RGB ma forse GRB è consentito del resto se non lo fosse dovrebbe dare errore.

L'altra funzione invece viene chiamata quando la nota viene rilasciata (off) e se si vuole spegnere il led illuminato è corretto 0,0,0.

Ciao.

chia96:
Il sistema funziona, infatti suonando la tastiera V49 usb si attivano i.led tx-rx su arduino, ma i led w2812 no.

Ok, anche se generalmente io preferisco sempre la soluzione più "diretta". Quindi se hai una UMX49 userei quella senza passare per un PC ed il programmino, anche perché con una connessione MIDI su SoftwareSerial, ossia separata dalla seriale virtuale via USB, hai la possibilità di usare la seriale verso il PC come debug ossia vedere cosa sta ricevendo o facendo.
Ma per ora ok, proseguiamo con quello che hai attualmente.

Quindi il problema è sul codice inviato ad Arduino che metto qua sotto:
Chiedo pertanto di dare uno sguardo al codice inviato in allegato per una verifica.

Allora, intanto come dico spesso, bisogna abituarsi ad indentare bene il codice perché serve sia a te per poterlo leggere meglio (soprattutto se e quando dovessi fare programmi più lunghi), sia a noi per poterti dare una mano in modo più comodo. Per farlo, premi Ctrl-T all'interno dell'IDE di Arduino e te lo riformatta lui automaticamente (fallo sempre prima di postare il tuo codice qui nel forum magari).

Per quanto riguarda il codice, anche qui una cosa che dico sempre è di provare le cose una per volta, tanto più se non puoi usare la seriale per il debug. Prova ora a seguire questi passi uno per volta, in sequenza.

Lascia stare per ora la striscia LED, diciamo che fai accendere il LED onboard (quello con la "L", identificato dal simbolo LED_BUILTIN, ossia D13) quando ricevi un NoteOn e lo spegni quando ricevi NoteOff, e verifica cosa succede:

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  MIDI.begin(MIDI_CHANNEL_OMNI);
  MIDI.setHandleNoteOn(handleNoteOn);
  MIDI.setHandleNoteOff(handleNoteOff);
}

void loop() {
  MIDI.read();
}

void handleNoteOn(byte channel, byte pitch, byte velocity) {
  digitalWrite(LED_BUILTIN, HIGH);
}

void handleNoteOff(byte channel, byte pitch, byte velocity) {
  digitalWrite(LED_BUILTIN, LOW);
}

Se il LED si accende quando premi e tieni premuto un tasto, e si spegne quando lo rilasci, il problema è nella gestione della striscia LED. Se invece non si accende o si accende ma non si spegne mai, allora il problema è nella catena MIDI.

Se quindi il programma funziona, per verificare aggiungi una if() nelle due funzioni il riconoscimento solo di un certo canale (es. 1) e ad esempio di una sola nota (es. C3 ossia 48) e vedi se il led si accende correttamente solo quando premi quel tasto.

Verificato che tutto funzioni come atteso lato MIDI, e credo che dovrebbe funzionare, aggiungi il codice per accendere la striscia LED, e quindi verifica bene il tuo codice (ad esempio sicura di aver ben controllato come accendi i LED? :wink: ...).