Informazioni capacità tecniche arduino

Buonasera a tutti,
sto pensando di realizzare un progetto un po particolare:
La tastiera di un finto pianoforte (non realmente suonabile) con dei led all'interno dei tasti che si illuminano a tempo con una melodia che viene riprodotta nello stesso momento.

La melodia sarà al pianoforte e i tasti naturalmente sarebbero le note reali che vengono suonate.
La mia domanda è:

È possibile realizzare tutto questo usando uno o più arduino o è necessario utilizzare anche un altro tipo di strumentazione(software/hardware)?

Premetto che la melodia e le luci contavo di gestirle sempre con arduino e con codice scritto, cioè di farle partire insieme.

Grazie infinite per l'attenzione

Non è molto chiaro quello che hai spiegato!
Ma se tu vorresti far riconoscere delle note suonate da uno strumento ad arduino credo che forse non sia possibile. Comunque riconoscere una nota non è una cosa semplice come percepire un qualunque suono, bisogna capire come questo suono sia fatto.

Hai ragione scusami, cerco di spiegarmi meglio.

Quello che vorrei fare è che, alla partenza della melodia, parta anche una sequenza di accensione e spegnimento che sia a tempo con essa. I led all'interno dei tasti non si accendono quando riconoscono la nota, bensì quando qualcuno/qualcosa gli dice di accendersi e questo qualcuno/qualcosa lo fa a tempo con la melodia.

In questo caso, quando nel brano registrato viene suonata una nota del piano forte, viene detto ad un led di accendersi fintanto quel tasto rimarrebbe premuto nella realtà per poi spegnersi.

Non è un qualcosa collegato ad una specie di console con 88 tasti come un piano reale dove ognuno di questi attiva un led, bensì una specie di spettacolo di luci temporizzato, sincronizzato con la riproduzione di una melodia sottostante.

La finta tastiera è solo un fattore scenico, serve per dare l'illusione per chi guarda che quello che vede sia un piano che suona.

Si riesce a capire meglio così?

Un po' come fanno le tastiere luminose della Casio?

Si può fare, tutto dipende però da quanti tasti vuoi avere, per una tastiera full piano da 88 tasti ti servono 88 LED indirizzabili tutti singolarmente.
A meno che a te, come credo, bastino un paio di ottave (comunque 24 LED) ti basta sicuramente una Mega (oppure una Uno ma con 3 chip 74hc595).

Per semplicità forse hai una traccia monofonica (ossia una sola nota per volta), oppure sono melodie a più note? La base è un MIDI?

Contemporaneamente gestire la melodia con Arduino...
Cioè? Con un buzzer che emetta le frequenze dei tasti?
O con qualcosa di più "musicale" ?

Intanto grazie mille per le risposte,

@docdoc

Allora la melodia è abbastanza semplice ma non è composta da note singole, ci sono anche accordi ( di cui ho spartiti e tutto per essere certo di sapere dove cadono e di quante note si tratta). La base non è MIDI, ma (@steve-cr) è una registrazione del brano suonato in mp3.

Contavo di gestire tutto con arduino per avere la certezza che musica e luci fossero sincrone, ma se non è possibile posso appoggiarmi a qualche software in particolare? o trovare un escamotage per farle partire insieme in altro modo?

Per la gestione dei LED (addressable) nel caso di arduino, avete qualche consiglio su come procedere?

grazie ancora infinite

E' un effetto scenico, il tutto deve dare l'impressione che i led seguano la melodia, in realtà non c'è nessun motivo effettivo per cui arduino deve effettivamente seguire la melodia.

Mi spiego! Se io potessi conoscere la durata delle singole note della melodia, potrei inserire in arduino una sequenza che accende i corrispettivi led, un po come creare una "musichetta" con arduino, solo che li invece di produrre un suono accendo e spengo led.

Allora ho la melodia da una parte e la melodia luminosa dall'altra su arduino, mi basta farli partire allo stesso momento con un segnale di start.

Arduino non segue la melodia "non riconosce", ma produce la stessa melodia in modo luminoso, partendo allo stesso momento il tutto è sincronizzato

Quindi potresti partire da esempi di "melodia con arduino" e modificarli dove produco una nota sostituisco e accendo un led.

Sì caricando un array di tempi

Potresti farcela

Ma come mantengo il sincronismo?

E come misuri i tempi per scriverli in arrsy?

Sì caricando un array di tempi

Dovendo suonare più note contemporaneamente e non essendo il problema complicato a livello di programmazione, il codice lo penserei sono come una sequenza di digitalWrite() e delay(), se ci pensi uno spartito musicale non è altro che un segnale di accensione e durata :slight_smile:

Ma come mantengo il sincronismo?

Se partono allo stesso momento e "suonano" la stessa melodia il tutto rimane sincronizzato senza bisogno di altri interventi. Immagina due video su due computer diversi, se io riuscissi a farli partire tutti e due allo stesso instante sarebbero sempre sincronizzati.

Io credo che per i tempi si possa fare in modo approssimato, non credo che qualcuno possa percepire piccole differenze di tempo tra accensione e spegnimento di un led, ma che il tutto si sovrapponga alla nota. In pratica ho la nota e si accende il led, se ci sono piccole ritardi ma la luce si sovrappone al suono, non si noterà la cosa.

Con le precisioni del clock di Arduino non ci scommetterei, ma vale la pena tentare

In effetti con solo arduino i calcolo dei tempi presenta errori :frowning:
Per mia esperienza mi sono fatto l'idea che usando delay() o millis() per calcolo dei tempi, arduino rimanga sempre indietro. Ossia sbaglia ma rimane solo indietro, allora si potrebbero mettere dei deley() più piccoli in modo da compensare questo ritardo.

Esempio devo fare 100 pause da 1 secondo, arduino ritarda, per cuoi posso mettere per esempio delay(800) invece di delay(1000) per compensare questo ritardo.

Merambolin:
Contavo di gestire tutto con arduino per avere la certezza che musica e luci fossero sincrone, ma se non è possibile posso appoggiarmi a qualche software in particolare? o trovare un escamotage per farle partire insieme in altro modo?

Ma allora non ho quindi capito bene cosa tu voglia fare, compreso il "cosa" dovrebbe riprodurre l'mp3, se Arduino o un qualcosa di esterno.

Se devono solo "partire" insieme ma poi le luci possono anche non essere sincronizzate, di fatto è quasi solo un effetto pseudo-strobo, e quello lo puoi fare anche come fanno certi impianti (un microfono "ascolta" la musica, ne fa qualche rapida elaborazione ed in base a queste accende o spegne le luci). Ma dato che hai parlato di una "tastiera" non credo sia questo, anche se di fatto sarebbe una soluzione "generica" ossia non legata ad uno specifico brano.

Se invece le vuoi comunque in sincrono, e vuoi farlo su una base mp3 per me la soluzione è una, usare un MIDI dello STESSO brano, da riprodurre con la STESSA velocità che hai con l'mp3 (che potresti far partire in riproduzione usando uno dei tanti circuitini di mp3+SD per Arduino). Ma comunque la sincronizzazione diventa molto critica e di fatto legata ad un solo specifico brano.

Se invece si togliessse di mezzo del tutto l'mp3 (non so se sia necessario che sia un mp3) potresti usare un brano in formato MIDI, dato ma che la riproduzione di un brano MIDI da Arduino è ovviamente una "ciofeca" essendoci solo un beeper, dovresti suonare la base esternamente (con un PC o, meglio, con un expander) e mandare anche ad Arduino gli eventi MIDI tramite MIDI THRU.

Insomma, spiega meglio i tuoi requisiti.

Buongiorno a tutti,

Come ha detto @Torn24, si tratta di un effetto scenico.

La "tastiera" di cui parlavo è una riproduzione che creerò io con del cartone ed altro materiale, della tastiera di un pianoforte. I tasti saranno ricoperti da un materiale opaco che permetterà però il passaggio della luce, facendo così capire se un led è acceso oppure è spento, un po come i video di Synthesia che si possono trovare su youtube.

Ma allora non ho quindi capito bene cosa tu voglia fare, compreso il "cosa" dovrebbe riprodurre l'mp3, se Arduino o un qualcosa di esterno.

L'idea di partenza era quella di far gestire sia la sequenza luminosa, sia la riproduzione del brano in mp3 da arduino stesso, utilizzando appunto quei circuiti SD+MP3 che @docdoc ha citato, avendo così la certezza che luci e musica fossero in sincronia.
Non sapendo però se arduino è in grado di gestire il tutto e, in caso di risposta affermativa, fino a che punto, chiedevo il vostro parere a riguardo:

È sufficiente usare solo arduino con opportuni circuiti (come la scheda SD ad esempio) o è meglio appoggiarsi anche ad un software di gestione di luci e musica esterno come Vixen Lights o xLights?

vi chiedo scusa se sono stato poco chiaro :frowning:

@Torn24

Io credo che per i tempi si possa fare in modo approssimato, non credo che qualcuno possa percepire piccole differenze di tempo tra accensione e spegnimento di un led, ma che il tutto si sovrapponga alla nota. In pratica ho la nota e si accende il led, se ci sono piccole ritardi ma la luce si sovrappone al suono, non si noterà la cosa.

Sono della stessa idea.
Differenze di pochi millisecondi sono appena percettibili, al limite possono dare la sensazione che il tutto sia meno realistico ma conto di lavorarci sopra e rendere il tutto il più preciso possibile (in vista della realizzazione di più progetti che coinvolgono azioni che richiedono tempi precisi e/o molto lunghi ho ordinato un RTC, sperando che arrivi presto e che mi aiuti nella cosa).

Se devono solo "partire" insieme ma poi le luci possono anche non essere sincronizzate, di fatto è quasi solo un effetto pseudo-strobo, e quello lo puoi fare anche come fanno certi impianti (un microfono "ascolta" la musica, ne fa qualche rapida elaborazione ed in base a queste accende o spegne le luci). Ma dato che hai parlato di una "tastiera" non credo sia questo, anche se di fatto sarebbe una soluzione "generica" ossia non legata ad uno specifico brano.

Se invece si togliessse di mezzo del tutto l'mp3 (non so se sia necessario che sia un mp3) potresti usare un brano in formato MIDI, dato ma che la riproduzione di un brano MIDI da Arduino è ovviamente una "ciofeca" essendoci solo un beeper, dovresti suonare la base esternamente (con un PC o, meglio, con un expander) e mandare anche ad Arduino gli eventi MIDI tramite MIDI THRU.

Mi sembra una figata pazzesca! :slight_smile:

Magari non per questo progetto, in quanto il brano è suonato con un tempo, diciamo, "proprio" ma per progetti futuri, sono molto interessato a queste possibilità ;D

intanto vi ringrazio di nuovo perché non avrei saputo bene dove mettere le mani :sweat_smile:

P.S
Il brano è questo fino al minuto 1:15 circa. È molto semplice

Merambolin:
L'idea di partenza era quella di far gestire sia la sequenza luminosa, sia la riproduzione del brano in mp3 da arduino stesso, utilizzando appunto quei circuiti SD+MP3 che @docdoc ha citato, avendo così la certezza che luci e musica fossero in sincronia.
Il brano è questo fino al minuto 1:15 circa. È molto semplice

Beh io direi che sarebbe anche possibile, seppure non banalissimo.

Sulla SD del modulino audio potresti mettere l'mp3 da mandare in riproduzione sul modulino stesso, e contemporaneamente usare QUESTO file Midi per acquisire le note, ossia lo apri con una libreria di file Midi per Arduino ed invece di riprodurre le note usi le informazioni della traccia di pianoforte per accendere i LED corrispondenti ad ogni nota, per il tempo specificato nel MIDI stesso. Qui la difficoltà sarebbe riuscire ad interpretare tutte le note (visto che parli di più note contemporaneamente), ma in linea di massima si dovrebbe poter fare visto che in fondo tu devi solo intercettare gli eventi NoteON (accendi il LED corrispondente) e NoteOFF (lo spegni), ignorando tutti gli altri eventi e la velocity (sperando che il brano non abbia cambi di tempo).

In alternativa potresti lavorare esternamente su PC per estrarre dal file MIDI solo gli eventi NoteON e NoteOFF che ti interessano, e con questi creare direttamente la sequenza di note e relative pause che metterai poi in un array di byte nel codice. Ad es. codificando le pause col bit alto: un byte 0x10 significa la nota (ossia il led) numero 16, mentre 0xFF sarebbe una pausa di 127 ms (per pause più lunghe ti basta mettere in sequenza più byte, esempio per 129 ms sarà 0xFF seguito da 0x82).

Insomma, si, si potrebbe fare ma non è una cosa semplicissima perché in genere su Arduino le librerie per leggere file Midi sono pensate per il beeperino interno, quindi dovresti sbatterti tu a fare qualche prova e trovare l'"incastro" giusto".

Posso cercare qualche programma per pc che mi permetta di creare un file MIDI dal brano originale così da essere sicuro di beccare il tempo giusto ( spero che sia facile come lo faccio sembrare),

mentre per quanto riguarda gli array di byte non ho la più pallida idea di cosa siano :sweat_smile:

o meglio, so cos'è un array, anche se ne ho visti di molto semplici, e so cosa sono bit e byte, ma usare quest'ultimi per codificare pause e led è materia nuova per me :grinning:

Quindi meglio mettersi a studiare :sweat_smile:

Merambolin:
Posso cercare qualche programma per pc che mi permetta di creare un file MIDI dal brano originale così da essere sicuro di beccare il tempo giusto ( spero che sia facile come lo faccio sembrare),

Convertire da MP3 a MIDI non è facile, ci sono programmini che possono farlo ma non li ho mai trovato affidabili, in genere funzionano benino solo con poche note contemporanee e di un singolo strumento. Se vuoi provarci, cerca con Google qualche convertitore MP3 to MIDI, ad esempio puoi provare QUESTO che non conosco ma è il primo della ricerca.

Per me fai prima a prendere quel MIDI che ti ho linkato, e verificare se la sua velocità sia corrispondente, altrimenti cerchi un qualsiasi MIDI editor (che pratica hai di Cubasse, o Cakewalk o altro?) e modifichi solo il tempo di riproduzione per farlo coincidere il meglio possibile col brano.

mentre per quanto riguarda gli array di byte non ho la più pallida idea di cosa siano :sweat_smile: o meglio, so cos'è un array, anche se ne ho visti di molto semplici, e so cosa sono bit e byte, ma usare quest'ultimi per codificare pause e led è materia nuova per me :grinning:

Più o meno te l'ho spiegato, un array di byte è una sequenza di byte i quali codificano note e pause, ed aggiungo tra le note devi distinguere tra note On e Note Off.
Quindi il bit alto indica una nota (0) o una pausa (1), se è una nota allora il secondo bit indica note on (1) o note off (0) su i restatnti bit che codificano massimo 64 note (che dovrebbero bastarti se parli di un paio di ottave siamo su 24 note/led).

Comunque consideralo una "imbeccata" ovviamente studiare è sempre la cosa migliore, poi ripassa quando hai altre domande o dubbi, noi siamo qui!

Se la sequenza deve solo partire in contemporanea e non ci sono sincronizzazioni successive puoi anche usare i led indirizzabili WS2812b o altri dove ti basta un solo piedino.