Voici mon projet.
L'akai headrush est une pédale qui permet de sampler 12 secondes (environ) en temps réel et de pouvoir rejouer dessus autant que l'on désire. Il existes quelques autres pédales de ce types mais pour la plupart ce sont un peu des usines à gaz et peu d'entre elles sont équipées en midi. La headrush n'est pas midi. La headrush est très simple il ya deux boutons "rec" et "play". On enregistre une boucle en appuyant sur "rec" et on la valide en appuyant sur "play", si on rappuie sur "play" ça s'éteind, si on appuie de nouveau, c'est reparti. L'idée serait donc de piloter grâce à une arduino la commandes play de manière à ce qu'elle soit synchronisée avec le tempo midi.
J'ai (eu du mal à) réussi(r) à écrire un code qui marche (assez bien) pour repérer les mouvements des boutons (selon si "rec" est activé ou pas, "play" réagit différemment), j'ai aussi un code récupéré sur internet pour recevoir les commandes midi par contre, ce qui me manque ce serait une sorte de chronomètre qui mesurerait le temps entre le moment ou on presse "rec" et le moment ou on presse "play" pour pouvoir convertir ça en mesures qui suivraient d'autres éléments midi.
Voici le code des boutons :
- Code: Tout sélectionner
int playPin = 5;
int playLed = 12;
int recPin = 6;
int recLed = 11;
int playState = LOW;
int playReading;
int playPrevious = HIGH;
int recState = LOW;
int recReading;
int recPrevious = HIGH;
int play;
int rec;
int playpause = 0;
int playstart = 0;
long playTime = 0;
long playDebounce = 300;
long recTime = 0;
long recDebounce = 200;
void setup()
{
pinMode(playPin, INPUT);
digitalWrite(playPin, HIGH);
pinMode(playLed, OUTPUT);
pinMode(recPin, INPUT);
digitalWrite(recPin, HIGH);
pinMode(recLed, OUTPUT);
Serial.begin(300);
}
void loop()
{
playReading = digitalRead(playPin);
if (playstart > 0){
if (playReading == HIGH && playPrevious == LOW && millis() - playTime > playDebounce) {
play += 1;
playTime = millis();
}
}
recReading = digitalRead(recPin);
if (recReading == HIGH && recPrevious == LOW && millis() - recTime > recDebounce) {
rec += 1;
recTime = millis();
}
if (rec != 0){
recState = 1;
}else{
recState = 0;
}
if (rec != 0){
playstart = 1;
}
if (play != 0){
playState = 1;
}else{
playState = 0;
}
if (playpause == 0){
if (rec > 0 && play > 0){
rec = 0;
play = 1;
playpause = 1;
}
}
if (playpause == 1){
if (rec > 0 && play > 1){
play = 1;
rec = 0;
}
if (rec == 0 && play > 1){
play = 0;
rec = 0;
}
if (rec == 0 && play == 0){
playpause = 2;
}
}
if (playpause == 2){
if (rec > 0 && play > 0){
rec = 0;
play = 1;
playpause = 1;
}
if (rec == 0 && play == 2){
rec = 0;
play = 0;
}
}
digitalWrite(playLed, playState);
digitalWrite(recLed, recState);
playPrevious = playReading;
recPrevious = recReading;
Serial.print(rec);
Serial.print(play);
Serial.println(playpause);
}
et le code pour recevoir le signal midi, récupérer a cette adresse : http://little-scale.blogspot.com/2008/05/how-to-deal-with-midi-clock-signals-in.html
- Code: Tout sélectionner
byte midi_start = 0xfa;
byte midi_stop = 0xfc;
byte midi_clock = 0xf8;
byte midi_continue = 0xfb;
int play_flag = 0;
byte data;
void setup() {
Serial.begin(31250);
}
void loop() {
if(Serial.available() > 0) {
data = Serial.read();
if(data == midi_start) {
play_flag = 1;
}
else if(data == midi_continue) {
play_flag = 1;
}
else if(data == midi_stop) {
play_flag = 0;
}
else if((data == midi_clock) && (play_flag == 1)) {
Sync();
}
}
}
void Sync() {
// do something for every MIDI Clock pulse when the sequencer is running
}
Si vous avez des idées ou besoin de précisions vu que je n'ai pas commenté le code, je suis prêt.