Collegare 2 arduino allo stesso MIDI

Ciao a tutti,

avrei bisogno di collegare due arduino ai medesimi MIDI IN e OUT in modo che entrambi ricevano gli stessi segnali da un’unica uscita MIDI e possano inviarli al medesimo ingresso MIDI.

Per il collegamento dei classici connettori DIN ai TX e RX dell’arduino non ho problemi, funziona tutto correttamente utilizzando gli schemi delle immagini allegate . Non riesco però a trovare il modo di collegarne due in contemporanea. Duplicare i cavi RX e TX non funziona.

Qualcuno riesce ad illuminarmi?
Grazie!

FAV6Y9LH337KSBC.LARGE.jpg

Non mi è ben chiaro lo scopo di questa cosa che vuoi fare, ma per l’OUT dallo strumento ti basta realizzare sul primo Arduino una porta MIDI THRU (vedi immagine allgata).

Quindi l’OUT dello strumento all’IN del primo Arduino, e da qui il suo THRU all’IN del secondo Arduino. Oppure, che è equivalente, un circuito MIDI splitter, ossia con un MIDI IN e due (o più) MIDI OUT, chiamati anche “MIDI THRU box” che come vedi sono di fatto in parallelo all’IN:

Ma il problema è per l’altro verso, ossia per mandare insieme gli OUT dei due Arduino all’unico IN dello strumento, e questo credo che non si possa fare perché essendo un protocollo seriale, non possono esserci due “master” o DTE: detta in poche parole, puoi avere uno che “parla” e tanti che “ascoltano” ma non poi mettere due che “parlano” contemporaneamente sulla stessa linea perché si “pesterebbero i piedi” tra loro. E forse anche dallo schema della connessione puoi capire perché:

Quindi attualmente l’unica possibilità che vedo è quella di provare a connettere OUT dello strumento verso IN del primo arduino che farà da “master”, e IN dello strumento all’OUT di arduino, quindi il suo THRU verso l’IN del secondo arduino, nel quale collegare il suo OUT (quindi via seriale ad un pin Softwareserial) ad un pin del primo, diciamo un pin “di comunicazione” tra i due, quindi il “master” rilancerà sulla sua OUT ciò che riceve da questo pin.
Per capirci meglio, ho fatto questo schemino:


Ovviamente devi fare qualche esperimento prima, per verificare che il master sia in grado di ritrasmettere sul suo OUT tutto ciò che riceve dal pin di comunicazione, e trovare un modo per evitare eccessivi delay o “mix” di informazioni.

Lo scopo di avere due arduino collegati via MIDI è che ho una consolle d'organo che comunica via MIDI con un software di organo digitale sul pc. Su tale consolle, oltre alle tastiere e pedaliera, ho tutta un'altra serie di elementi che comunicano via MIDI (led, pulsanti, LCD, etc.). Attualmente è tutto collegato tramite un unico arduino mega. Il sistema funziona, ma spesso, quando la quantità di messaggi MIDI inviati e ricevuti sono parecchi, il sistema si perde dei pezzi e mi genera degli errori (accensione led sbagliati, testi no-sense sul display, etc.).
L'idea di avere due arduino era per provare a vedere se smezzando il lavoro tra due unità il sistema generasse meno errori. La cosa mi era parsa banale duplicando i cavi sui due arduino, ma come hai giustamente evidenziato al cosa non ha molto senso, soprattutto sull'input.

Premesso questo, partendo dal tuo schema stavo pensando che una soluzione potrebbe essere quella di collegare a catena il tutto: scheda audio -> arduino 1 -> arduino 2 -> scheda audio. Questa cosa, che mi pare molto logica ha però un problema, che tutto ciò che parte dalla scheda audio, torna alla scheda audio, creando quindi un sistema circolare pericoloso. Dovrei trovare il modo di filtrare i messaggi in modo che tutto quello che parte dalla scheda audio arriva fino all'ultimo arduino, mentre tutto quello che parte dal primo arduino arriva fino alla scheda audio.

Devo fare un po' di prove, intanto grazie per i suggerimenti

Hm, anche io sono tastierista (amatoriale, anche se suono Genesis che mi impegnano abbastanza) ed ho una infarinatura di MIDI e di PC, però per farmi capire meglio magari prova a fare uno schemino di com'è l'attuale configurazione, disegnando Arduino Mega, il PC con un software (quale?), e la consolle d'organo (quale?). E magari anche una o due foto.

Te lo dico perché il MIDI lavora a 31250 baud ossia circa 3k byte al secondo, e tranne cose "strane" di specifici sysex, ci sono 3 byte per evento (1 di status e 1 o 2 di dati) quindi come capacità di trasmissione siamo sui 1000 eventi al secondo, che sarebbero 500 note on e off (e neanche Keith Emerson poteva sonare 500 note al secondo ;)). I vari controller che hai sulla consolle immagino non mandino continuamente pacchetti di dati ma solo alle variazioni, stessa cosa per i messaggi da mostrare sui display.

Per cui i problemi di strane latenze o altro potrebbero derivare da problemi del programma che carichi su Arduino, oppure da qualche altro aspetto che hai trascurato, come l'interfaccia MIDI che hai sul PC (sarà una classica MIDI-USB esatto?) o cavi non schermati, o troppo lunghi, o altro...

Sicuramente non è la quantità di note che suono a essere il problema!! :grinning:
In allegato ho messo lo schema dell’attuale configurazione, in cui vedi tutti gli elementi che ci sono oltre all’arduino.
Il software sul pc è Hauptwerk.
Come vedi dallo schema le tastiere, la pedaliera e i pulsanti dei registri (per selezionare i “suoni”) sono collegati a una scheda HWCE2 collegata direttamente alla scheda audio, quindi al PC. Questa scheda è prodotta da MidiBoutique, e funziona perfettamente.
L’arduino, invece, riceve gli input dalla scheda audio, e manda gli output all’HWCE che li rigira alla scheda audio (la sua uscita MIDI è anche THRU).

L’arduino gestisce le seguenti cose:

  • accensione led registri: sono 50 led che si accendono quanto attivo il relativo registro tramiti un input midi che arriva dal software. Potrei anche dover accenderli tutti e 50 in contemporanea.
  • accensione led memorie: sono 10 led che funziona col medesimo sistema
  • gestione pulsanti memorie: sono 13 pulsanti che quando premo mandano un segnale midi al software per attivare il relativo comando
  • tastierino: mi serve per digitare il numero del “banco memoria” che voglio attivare, manda sempre segnali midi al software (avrà anche altre funzioni in seguito, ma sempre con la stessa modalità di funzionamento)
  • display 7seg4digits: visualizza il numero del banco memoria (per ora funziona solamente sulla base di quanto digitato sul tastierino)
  • display LCD - visualizza dei testi che vengono inviati dal software.

Questo è quello che attualmente fa il sistema. Tutte le funzioni sopra citate funzionano con messaggi di tipo NoteOn/Off (alcuni vorrei trasformarli in ProgramChange, ma sarebbe la stessa sostanza), tranne il display LCD, che i testi che riceve sono messaggi SysEx.

Il problema sta nella fase di avvio, quando si accumulano vari messaggi SysEx e NoteOn insieme, che sembrerebbe qualcuno venga troncato/saltato, generandomi quindi degli errori iniziali che poi mi sballano tutto il funzionamento successivo.
Non escludo a priori che la stessa scheda audio non sia dotata di un apparato MIDI efficiente (utilizzavo inizialmente un semplice adattatore MIDI-USB e mi troncava tutti i SysEx dandomi problemi).

L’accensione e spegnimento dei led l’ho realizzato utilizzando 5 shift register in serie, inviando quindi 5 byte ogni volta che debba essere acceso/spento un led. Forse anche questa procedura non è così efficiente…ma non ho idea di come gestirla diversamente.

Allego anche una foto della consolle per dare un’idea del sistema.
Grazie

2020-04-19 15.23.10.jpg

2020-04-19 15.24.14.jpg

Schema collegamenti.pdf (171 KB)

Beh diciamo che la cosa era un filino più complessa di come l'avevi descritta all'inizio... :wink: Ho visto anche le foto, complimenti bel progettino.

Comunque sia, credo che il "traffico" maggiore sia tra HWCE ed il PC (di Behringer mi fido, mai avuto problemi con nessun loro apparecchio, invece i convertitori MIDI/USB che trovi in giro sono praticamente tutti uguali e confermo, hanno problemi coi SysEx), la parte di Arduino non mi pare possa essere molto critica, per cui io verificherei meglio i cablaggi dei cavi MIDI accorciandoli se possibile e verificando bene le masse dei cavetti (schermati, vero?...).

Dato che immagino che il Mega debba fare "tante cose" possa essere un problema di efficienza dello sketch attuale, nel quale forse ci sono alcune latenze che danno problemi, e rischi di far accavallare i segnali (il MIDI non ha handshake quindi i messaggi vanno "colti al volo" :wink: ). Per cui ti proporrei di postare il tuo codice se vuoi/puoi, tanto non credo che nessuno possa "copiarti" il progetto visto che è così legato alla struttura e periferiche che usi.. 8)

Al limite per cercare di ottimizzare la parte Arduino posso provare darti solo un'idea, ossia partendo dal mio schemino con "master" e "slave" elimina la connessione da OUT dello "slave" al pin del "master". In sostanza potrebbe bastarti dividere i compiti tra loro: di fatto il "master" si deve occupare solo di tutti gli input (tastierino e pulsanti) che manderà sul suo OUT, mentre lo "slave" si deve poter occupare solo degli output (gestione display e pulsanti) in base a ciò che riceve via MIDI (o eventualmente per info addizionali comunque con un paio di pin in seriale) e quindi non ha bisogno di alcun OUT.

Grazie, e ammetto che sto provando più gusto a costruirlo/riprogrammarlo che neanche a suonarlo, ma vabbè :grinning:

Cmq nessun problema a postare il codice, anche se non mi aspetto che qualcuno abbia voglia di mettersi ad analizzarlo per cercare di capirlo (anche perchè non sono stato particolarmente ricco di commenti). E se qualcuno volesse copiare qualcosa ben venga, io per primo ho attinto da varie parti, tanto meglio se posso dare anche io un contributo.

[posto il codice in un txt allegato perchè non ci sto nei limiti dei caratteri per un messaggio :o ]

Questo è il codice che attualmente gira sull’arduino Mega con l’attuale configurazione.

L’aggiornamento che voglio fare prevede, oltre che alla correzione dei problemi, anche l’aggiunta di altre funzioni e alcune modifiche hardware. In particolare il display LCD sarà dotato di un vero e proprio Menu dal quale accedo ad altre funzioni del software, comandato dal tastierino numerico, che sarà dotato anche delle lettere A-B-C-D (se può essere utile ho già scritto il codice per questa funzione). Per questo motivo ho bisogno che l’arduino a cui collego display e tastierino deve essere collegato sia IN che OUT al MIDI. Inoltre il display sarà collegato all’arduino con interfaccia I2C (non cambia la sostanza, ma mi risparmio un po’ di pin).
Inoltre il display a 7segmenti saranno due, il primo di un digit e il secondo di 3, colori diversi e funzioni diverse.

Fatta questa precisazione, mi aspetto che le modifiche che voglio apportare non abbiano nessun tipo di implicazione sui problemi che ho ora.

Smanettando nella documentazione della libreria MIDI che sto usando ho anche notato che posso attivare la funzione thru “filtrata”, ovvero dicendo all’arduino di mandare sull’output tutti i segnali MIDI in ingresso che non sono nei canali che definisco in input…questo potrebbe aiutarmi a risolvere il problema della catena che mi si crea a collegare tutto insieme…provare per credere

Mille grazie in anticipo per altri eventuali pareri!!

Organo_Alpha1.5.txt (17.7 KB)

samsos90:
Grazie, e ammetto che sto provando più gusto a costruirlo/riprogrammarlo che neanche a suonarlo, ma vabbè :grinning:

A volte capita così... :wink:

Cmq nessun problema a postare il codice, anche se non mi aspetto che qualcuno abbia voglia di mettersi ad analizzarlo per cercare di capirlo (anche perchè non sono stato particolarmente ricco di commenti)

Beh invece a me pare uno dei migliori codici mai postati qui nel forum... :wink: Di commenti ce ne sono, e la struttura di tutto lo sketch è comprensibile e ben indentata, complimenti anche per questo!
Ovviamente è la logica del flusso generale è difficile da comprendere non avendo la tua stessa configurazione e non avendo usato gran parte delle librerie che usi, quindi non trovo spunti per poter affermare che ci possano essere problemi di efficienza, tranne pochi e marginali ritocchi. Ad esempio io avrei fatto un array di "ledState" invece di 7 variabili, evitando tra l'altro di ripetere i 7 "regLedOn" ad ogni noteByte, richiamando una funzioncina con una for() ma come detto, sono ritocchi "stilistici", non influenzano direttamente il problema da te lamentato. Al posto tuo cercherei di tracciare in qualche modo quei messaggi "anomali" o spuri, per capire quando accade, e se possa dipendere dalla libreria Midi insieme a qualche altra cosa (es. cose che usano lo stesso interrupt magari?), oppure se sia un problema hardware come ti avevo consigliato di verificare.

Per ora non mi viene in mente altro, mi spiace!

. E se qualcuno volesse copiare qualcosa ben venga, io per primo ho attinto da varie parti, tanto meglio se posso dare anche io un contributo.

[posto il codice in un txt allegato perchè non ci sto nei limiti dei caratteri per un messaggio :o ]

Questo è il codice che attualmente gira sull'arduino Mega con l'attuale configurazione.

L'aggiornamento che voglio fare prevede, oltre che alla correzione dei problemi, anche l'aggiunta di altre funzioni e alcune modifiche hardware. In particolare il display LCD sarà dotato di un vero e proprio Menu dal quale accedo ad altre funzioni del software, comandato dal tastierino numerico, che sarà dotato anche delle lettere A-B-C-D (se può essere utile ho già scritto il codice per questa funzione). Per questo motivo ho bisogno che l'arduino a cui collego display e tastierino deve essere collegato sia IN che OUT al MIDI. Inoltre il display sarà collegato all'arduino con interfaccia I2C (non cambia la sostanza, ma mi risparmio un po' di pin).
Inoltre il display a 7segmenti saranno due, il primo di un digit e il secondo di 3, colori diversi e funzioni diverse.

Fatta questa precisazione, mi aspetto che le modifiche che voglio apportare non abbiano nessun tipo di implicazione sui problemi che ho ora.

Smanettando nella documentazione della libreria MIDI che sto usando ho anche notato che posso attivare la funzione thru "filtrata", ovvero dicendo all'arduino di mandare sull'output tutti i segnali MIDI in ingresso che non sono nei canali che definisco in input...questo potrebbe aiutarmi a risolvere il problema della catena che mi si crea a collegare tutto insieme...provare per credere

Mille grazie in anticipo per altri eventuali pareri!!