Step by Step con clock (lento) esterno e arduino!

Ciao ragazzi :slight_smile:
sto realizzando un dispositivo che manda avanti una sequenza midi, quindi musicale…
per regolare la velocità di esecuzione, in BPM, ho acquistato un microcontrollore programmato apposta per prelevare in ingresso un tempo con un TAP (premuta a tempo di un pulsante) e in uscita da il tempo diviso in 16esimi, quindi vorrei far si che il mio arduino esegua un determinato ciclo di esecuzione ogni volta che riceve un impulso in ingresso, in modo da avere il clock regolato dall’esterno…
come posso fare?

Idee?

Grazie :slight_smile:

devi calcolare il tempo tra un tap e l'altro, se inferiore ad un certo valore "tappo" allora usa questo valore come "tempo" di una battuta. Poi, conoscendo la durata di una battuta è facile calcolare la durata delle note da suonare.

Non capisco perchè vuoi usare un coso estreno per fare il tap, per collegarlo dipende da come parla (sempre che parli con l'esterno)

Ne userei uno esterno per non bloccare tutto il programma del sequencer midi, che (non essendoci un codice di controllo) perde facilmente dei dati! allora ho trovato questo: http://www.pedalsync.com/pedalsync/documentation/PedalSync_MV-52B_Tap-Pulse_Converter_Datasheet.pdf
è un PIC programmato per avere in ingresso un pulsante, per il tap, e in uscita un impulso di clock, quindi mi sembra di aver notato che questo chip comunica semplicemente con un impulso.

se non riesci a leggere un tap, figuriamoci leggere un generatore di impulsi esterno, visto che il seganle che ti manda è lo stesso ma continuo.
Bello, ma inutile;
esso ti manda al massimo il tempo 4 volte più veloce; se ti basi su di esso per modificare la nota, al massimo avrai 4 note per battuta; se lo usi per prendere il tempo allora ti basta misurare il primo clock, per poi generarti da solo i tempi di delay in base alla durata delle note che devi outputtare, ma prendere il primo clock (e verificare quando varia) è esattamente come misurare il tap dell’utente :stuck_out_tongue:

Ma quindi dici che se mi genero io il tempo in BPM, da cui poi trovo i vari delay fra ogni step del sequencer, ha un effetto buono? Io credo di si, ma siccome il TAP può essere fatto anche durante l'esecuzione della sequenza midi, non vorrei che poi mi si impalli il controller, e non vorrei dover usare un interrupt.

ad ogni modo so più o meno come misurare un impulso di clock e trovare la frequenza, tramite arduino, è una cosa logica... ma non saprei dove metterla, senza usare l'interrupt!

dove metterla cosa? la frequenza?

il dato grezzo che ti serve non è la frequenza, ma la durata (che poi puoi ricavare dalla frequenza o in mille altri modi poco importa), durata che dividerai per il numero di "cambi tono" nella battura, a questo punto il tuo loop sarà simile a

loop{ controlla cambio tempo, e calcola durata cambio tono (durata battatuta/toni a battuta) leggi prossima nota (valore midi e durata nota in toni) suona la nota aspetta durata cambio tono * durata nota }

No, allora, so come misurare la frequenza, e so come da questa ricavarne il periodo, ma quello che sto cercando di capire è dove calcolarla (dal tap in ingresso) senza ostacolare o bloccare l’esecuzione della sequenza midi.
in ogni caso, non si tratta di note, ma di control change e program change, in pratica il programma va in questo modo:

for(i=0;i<16;i++){
     MIDI.sendControlChange(13,cc[i],1);
     MIDI.sendProgramChange(pc[i],1);
     delay(periodo/4);
}

cc[16] e pc[16] sono gli array contententi i 16 valori che devono asumere il control change e il program change.

Il tutto è testato e funziona alla grande, quello che voglio fare io è fare in modo che facendo un tap su un pulsante, a tempo, si imposti il valore da assegnare a “periodo”, e tutto questo mentre il ciclo for va, questo è il mio dubbio… per questo avrei usato con piacere quel convertitore tap pulse, in modo da mandare avanti il ciclo for solo quando vede un impulso sul pin collegato all’altro integrato!

usi un interrupt esterno, che rileva il cambio stato, e metta il mircros() attuale in una variabile, poi prende la lettura precedente (se c'è), fa microsAttuali - microsOld e ottieni la nuova durata, se non discista troppo da un valore reale la usi, se no la scarti.

A questo punto che collegato tu abbia un generatore di frequenze o un pulsante non ti cambia nulla, se non che il coso esterno potrebbe "aggiustare" la frequenza in base a tap consecitivi calcolandone la media.

Molto interessante, grazie mille! mi hai chiarito le idee :) :)