Controller midi per il LOOPER di ABLETON LIVE

Salve a tutti, é da un po di giorni che ho iniziato questo progetto e adesso non riesco ad andare avanti. Come da manuale ho connesso la porta midi della mia scheda audio all'arduino. Ho inoltre connesso un tasto a una porta in modo che, quando il tasto viene premuto il controllore legga 0. Il circuito (scusate):

5V o-------------pulsante--------o--------------pin 8 | | | resistenza da 10kOHM | | o gnd

(Ci siamo capiti) questo tasto mi servirà a controllare il multi-purpose Transport button del looper di ableton live, per ottenere il comportamento di una loop station. Il codice :

int statorec ; int numeropinrec = 8;

void setup() { Serial.begin(31250); pinMode(numeropinrec, INPUT);}

void loop() { int rec = digitalRead(numeropinrec); if (rec == LOW && statorec == LOW) { schiaccia(0x90,0x70,0x7F); statorec=HIGH; delay(200) ; }

else { statorec=LOW; } }

void schiaccia(byte cmd, byte data1,byte data2) { Serial.print(cmd, BYTE); Serial.print(data1, BYTE); Serial.print(data1, BYTE);}

la nota inviata è a caso e la variazione è massima (anche questa a caso). Una volta mappato via midi sembra che tutto funzioni,apparentemente senza alcun problema. L'unico problema è che dopo aver iniziato la registrazione e dopo aver schiacciato un'altra volta il tasto per mettere in loop la registrazione, dopo due secondi il tasto undo visualizzato sul monitor viene premuto automaticamente senza che io lo abbia toccato, ne con la freccetta del mouse, ne controllato via midi e ne pensato. Questo è quello che accade se viene registrato il primo loop. Nel caso in cui invece voglio aggiungere loop alla sequenza, succede una cosa ancor peggiore: il tasto undo viene premuto ancora prima la fine della registrazione. Il risultato in questo caso è che mi fa registrare solamente un pezzo del loop. Poco male se subito, premo redo nel primo caso, peggio se voglio aggiungere un loop e me ne registra solo un pezzo. Da notare che se io volessi sentire anche solo quel piccolo pezzo di loop dovrei comunque schiacciare redo. Tutti questi problemi naturalmente non ci sono, se controllo il looper direttamente con la freccetta del mouse. Ho scritto nella speranza che qualcuno potesse aiutarmi a risolvere questo fastidioso errore (magari qualcuno che è interessato al progetto e vuole assillarsi come me o qualcuno che è già inciampato su questo problema e lo ha risolto), di cui non conosco la causa, se è il programma da me compilato o se è l' ableton(anche se ne dubito).

grazie

come hai collegato il tasto il controllore legge HIGH (1) quando schiacci il pulsante senó LOW o 0. inverti gnd e 5V

gnd o-------------pulsante---------o--------------pin 8 | | | resistenza da 10kOHM | | o +5V Ciao Uwe

Ciao, in realtà il circuito esatto (quello che ho usato io ) è proprio quello che hai disegnato tu. Anche perchè altrimenti il tasto resterebbe continuamente premuto e non avrei detto che funzionava. Chiedo scusa, non me ne ero proprio accorto. Comunque il problema resta sempre quello che ho descritto in precedenza e cioè il fatto che non è che non funziona completamente, ma che non funziona bene.
Un’altra domanda: non è che forse qualcuno, che conosce questo genere di programmi,. sa consigliarmene uno per il mac che possiede all’interno un plug-in che funziona come loop station, come il looper dell’ableton? Grazie

ciao fraffo

2 cose che mi vengono in mente: Il baudrate é molto strano ( Serial.begin(31250);) non é uno di quelli standard; non puoi usare uno standard? (28800, 38400, oppure 57600). La seconda cosa é che devi fare il debounce (i tasti quando si chiudono o si aprono saltano alcune volte e fanno che possa essere visto dall'eletronica come un premere piú volte). puoi usare la libreria http://www.arduino.cc/playground/Code/Bounce oppure fare come mostrato nel esempio IDE - File- Examples-2.Digital - Debounce

Ciao Uwe

ciao Tutte le porte midi funzionano a quella velocità, è quello che so dopo aver letto quel minimo di documentazione che si trova su internet. E' scritto anche qui http://arduino.cc/en/Tutorial/Midi

Comunque penso che non mi sono fatto capire bene: Io ho questo tasto fisico che controlla un pulsante REC del software che quando lo premo, non fa bounce. Mi spiego, il comportamento normale di questo tasto(REC) è premi la prima volta, registra, premi la seconda, finisci di registrare e metti in loop. A me funziona così, solo che dopo aver registrato e messo in loop, viene schiacciato anche un'altro tasto: il tasto UNDO(NON il tasto che io controllo). Questo ultimo tasto del software non è controllato via midi da me, ed è separato dal tasto REC, sono due cose diverse. Se ci fosse stato bounce per il tasto da me creato(quello che controlla REC) io avrei potuto registrare non più di pochi millisecondi corrispondenti a due possibili uni del rumore, visto che tra di loro ci sono pochi millisecondi. E poi ti faccio notare quel delay di 200 ms, che da tutto il tempo al segnale di stabilizzarsi. Inoltre negli esempi su internet come questo:

http://itp.nyu.edu/physcomp/Tutorials/MusicalArduino

che è molto simile a quello che ho fatto io(anche se mi sembra sbagliato) non c'è il debounce( anche se i tasti qui vengono usati come pulsanti e non come switch) Comunque ho provato a fare il debounce e il programma modificato è questo(dovrebbe essere giusto se ho capito come funziona la funzione millis() ), correggimi se sbaglio .Se il Debouncedelay è maggiore di 2 il tasto non funziona nemmeno e comunque anche con 2 il problema persiste.

int statorec=LOW; int numeropinrec = 8; int buttonState; int lastButtonState = LOW; long lastDebounceTime = 0; long debounceDelay = 2;

void setup() { // Set MIDI baud rate: Serial.begin(31250); pinMode(numeropinrec, INPUT);

}

void loop() {

int rec = digitalRead(numeropinrec); if (rec == LOW && statorec == LOW) { lastDebounceTime = millis(); if ((millis() - lastDebounceTime) > debounceDelay) {schiaccia(0x90,0x70,0x7F); statorec=HIGH; delay(1000) ;} }

else { statorec=LOW; }

} void schiaccia(byte cmd, byte data1, byte data2) { Serial.print(cmd, BYTE); Serial.print(data1, BYTE); Serial.print(data2, BYTE);

}

Magari ho scritto cose a cacchio. Ma sta funzione millis ti dice quanto tempo è trascorso dall'inizio del programma? Cioè se sono passati 10 ms dall'inzio e scrivi ad esempio:

long quanti; quanti = millis();

allora quanti è uguale a 10 ms?? grazie