Salve a tutti
sto lavorando a un progetto di costruzione di un controller MIDI con Arduino (per quanto riguarda proprio la parte fisica della tastiera, senza knob e CC send vari)
e ho incontrato una grossa difficoltà una volta steso il codice per Arduino Uno.
Per quanto riguarda l'hardware ho utilizzato due semplici Switch (che simulano i tasti) insieme alla consueta porta MIDI.
Premetto che ho usato gli interrupt per gestire gli eventi Nota On e Nota Off sfruttando la possibilità di usare istruzioni MIDI con la nuova versione della scheda.
Allego il codice:
La mia domanda è netta e precisa: è possibile evitare di usare un'altro pulsante per far spegnere la nota? Ovvero far eseguire l'evento Nota On per quanto necessario senza dover premere un secondo pulsante per fermare l'evento? Anche perchè in questa maniera risparmierei ingressi per gli interrupt.
Pensavo a un ciclo nell'evento nota ON che venisse comandato con un flag ma non saprei proprio come fare.
E possibile inoltre incrementare il numero di ingressi di interrupt di Arduino?
grazie per la tua risposta
Guarda ho gia usato un delay, ma il problema è che il tempo di pressione della nota deve essere effettivamente reale, e non prestabilita,
e poi resterebbe in attesa 1 secondo inutilmente...ci avevo pensato anche io, l'istruzione migliore
sarebbe "esegui l'istruzione finche il tasto è premuto" cosa che si risolverebbe con un do while,
ma stiamo parlando di interrupt e il flusso del programma non è lineare e ci ho provato (sicuramente sbagliando logica),
ma nulla.
P.S. MIDI è un protocollo di comunicazione per strumenti musicali (in questo caso tastiere / sintetizzatori) e il suo scopo principale
è quello di permettere la comunicazione tra dispositivi musicali anche di diverse fabbriche.
Il suo codice è semplicemente Nota On (canale , nota, velocità) che impartisce le istruzioni al microprocessore
della tastiera per eseguire note, cambi di valori ecc ecc (ce ne sarebbe da dire...)
Perchè non usare un interupt in modalità CHANGE + un flag per memorizzare se la nota è già ON o meno, e ogni volta che l'interrupt viene richiamato invertire lo stato della stessa?
Non si possono richiamare funzioni basate su interrupt all'interno di altri interrupt. Quindi un delay all'interno di una ISR (Interrupt Service Routine) non funziona.
Attenzione anche con Tone: sfrutta il timer 2, sempre tramite chiamate ad ISR. Il codice che hai postato all'inizio ti funziona?
dancol90:
Perchè non usare un interupt in modalità CHANGE + un flag per memorizzare se la nota è già ON o meno, e ogni volta che l'interrupt viene richiamato invertire lo stato della stessa?
Non male come idea, dovrei provare
leo72:
Non si possono richiamare funzioni basate su interrupt all'interno di altri interrupt. Quindi un delay all'interno di una ISR (Interrupt Service Routine) non funziona.
Attenzione anche con Tone: sfrutta il timer 2, sempre tramite chiamate ad ISR. Il codice che hai postato all'inizio ti funziona?
Si funziona tutto senza problemi! Peccato che Arduino abbia solo 2 ingressi per gli interrupt