boolisActiveStep[5][8]={{1,0,0,0,1},{0,1,0,0,0,1},{0,0,1,0,0,0,1},{0,0,0,1,0,0,0,1}};// tableau à deux dimensions 5x8 : la case [X,Y] est true si le canal X est actif sur le step Y, sinon false
unsignedinttempoBpm{120};// tempo en BPM
unsignedlongtempoMicro{0};// temps entre deux steps en microsecondes
unsignedlongtemps{0};// le compteur de temps, utilisé pour vérifier quand activer le prochain step
bytechannelSelected{0};// le channel sélectionné par l’utilisateur et dont la séquence est affichée
bytecurrentStep{0};// temps/step actif, actuel
boolmemoireStepBtn[8]={};// memoire de l’état de chacun des 8 boutons d’activition des steps
booletatBtn;// etat de n’importe quel bouton que l’on utilisera en le comparant à sa mémoire
boolmemoireBtnChannel={};// memoire du bouton de sélection du channel
// fonction qui affiche la séquence (en rouge) du channel sélectionné
// on appellera cette fonction à chaque changement de channel ou de la séquence du channel sélectionné
voiddisplayActiveSteps()
{
for(bytei=0;i<8;i++)// boucle de 0 à 7
{
if(isActiveStep[channelSelected][i])// on vérifie si le channel sélectionné est actif sur le step i+1
{
digitalWrite(ledActiveStep[i],LOW);// si oui, on allume la led correspondante (LOW = allumé, pour les LEDs)
}
else
{
digitalWrite(ledActiveStep[i],HIGH);// sinon on l’éteint
}
}
}
voidsetup(){
// put your setup code here, to run once:
for(bytei=0;i<5;i++)// boucle pour les tableaux outTrigChannel et ledTrigChannel de taille 5
{
pinMode(outTrigChannel[i],OUTPUT);// mise en mode output des pin de triggering des channels
digitalWrite(outTrigChannel[i],LOW);// tous éteints
pinMode(ledTrigChannel[i],OUTPUT);// mise en mode output des leds
digitalWrite(ledTrigChannel[i],HIGH);// on les éteint
}
for(bytei=0;i<8;i++)// boucle pour les tableaux de taille 8
{
pinMode(ledStep[i],OUTPUT);
digitalWrite(ledStep[i],HIGH);
pinMode(ledActiveStep[i],OUTPUT);
digitalWrite(ledActiveStep[i],HIGH);
pinMode(btnStep[i],INPUT_PULLUP);// les boutonts sont des inputs
}
pinMode(btnChannelSelect,INPUT_PULLUP);// bouton donc input
digitalWrite(ledStep[0],LOW);// on allume la led du step 1
digitalWrite(ledTrigChannel[0],LOW);// on allume la led du channel 1, car c’est celui sélectionné par défaut
tempoMicro=60000000/tempoBpm;// on calcule le temps entre chaque step à partir du tempo
temps=micros();// on initialise le temps
}
voidloop(){
// put your main code here, to run repeatedly:
if(micros()-temps>=tempoMicro)// on vérifie s’il faut activer le prochain step
{
temps=micros();// on réinitialise immédiatement le temps
// changement de la led
digitalWrite(ledStep[currentStep],HIGH);// on éteint la led du step actuel
if(currentStep==7)// on définit le nouveau step
{
currentStep=0;
}
else
{
currentStep++;
}
digitalWrite(ledStep[currentStep],LOW);// on allume la led correspondante
// triggering des channels
for(bytei=0;i<5;i++)// on parcourt le tableau isActiveStep le long de la colonne currentStep
{
if(isActiveStep[i][currentStep])// on vérifie si le channel i+1 est actif sur ce step
{
digitalWrite(outTrigChannel[i],HIGH);// si oui on active le trigger du channel (que l’on désactivera dans précisément 10 ms)
digitalWrite(ledTrigChannel[i],LOW);// et on allume sa led
}
}
delay(10);// on attend 10 ms
for(bytei=0;i<5;i++)
{
digitalWrite(outTrigChannel[i],LOW);// on éteint tous les triggers
if(i!=channelSelected){digitalWrite(ledTrigChannel[i],HIGH);}// on éteint toutes les leds, sauf celle du channel sélectionné
}
}
for(bytei=0;i<8;i++)// boucle pour i allant de 0 à 7
{
etatBtn=digitalRead(btnStep[i]);// on attribue à etatBtn la valeur du bouton du step i+1
if(memoireStepBtn[i]!=etatBtn)// on vérifie si son état à changé par rapport à sa mémoire
{
if(etatBtn==LOW)// si oui, on vérifie ensuite si son état est maintenant appuyé
{
isActiveStep[channelSelected][i]=!isActiveStep[channelSelected][i];// si oui, on inverse l’état (activé/désactivé) du channel sur ce step
displayActiveSteps();// on appelle la fonction pour afficher la nouvelle séquence
}
memoireStepBtn[i]=etatBtn;// on actualise la mémoire du bouton
}
}
etatBtn=digitalRead(btnChannelSelect);// etatBtn a maintenant la valeur du bouton de sélection du channel
if(etatBtn!=memoireBtnChannel)// on vérifie si l’état de btnChannel a changé
{
if(etatBtn==LOW)// si oui, on vérifie s’il est appuyé
{
digitalWrite(ledTrigChannel[channelSelected],HIGH);// si oui, on éteint la led du channel actuellement sélectionné
if(channelSelected==4)// on définit le nouveau channel sélectionné
{
channelSelected=0;
}
else
{
channelSelected++;
}
digitalWrite(ledTrigChannel[channelSelected],LOW);// on allume la led du nouveau channel sélectionné
displayActiveSteps();// on affiche la séquence de ce channel
memoireBtnChannel=etatBtn;// on actualise la mémoire du bouton de sélection du channel