Skip to content
Snippets Groups Projects
Commit 31da61a0 authored by Arthur Bougeard's avatar Arthur Bougeard
Browse files

Upload New File

parents
No related branches found
No related tags found
No related merge requests found
// pins (nombre constant) de chaque élément
const byte outTrigChannel1 { 2 }; // pin d’alimentation du channel X
const byte outTrigChannel2 { 3 };
const byte outTrigChannel3 { 4 };
const byte outTrigChannel4 { 5 };
const byte outTrigChannel5 { 0 };
const byte ledTrigChannel1 { 0 }; // led indiquant que le channel X est alimenté/activé
const byte ledTrigChannel2 { 0 };
const byte ledTrigChannel3 { 0 };
const byte ledTrigChannel4 { 0 };
const byte ledTrigChannel5 { 0 };
const byte ledStep1 { 0 }; // led bleue indiquant que le temps X est le step/temps actif
const byte ledStep2 { 0 };
const byte ledStep3 { 0 };
const byte ledStep4 { 0 };
const byte ledStep5 { 0 };
const byte ledStep6 { 0 };
const byte ledStep7 { 0 };
const byte ledStep8 { 0 };
const byte ledActiveStep1 { 0 }; // led rouge indiquant si le channel actif est alimenté sur le step X
const byte ledActiveStep2 { 0 };
const byte ledActiveStep3 { 0 };
const byte ledActiveStep4 { 0 };
const byte ledActiveStep5 { 0 };
const byte ledActiveStep6 { 0 };
const byte ledActiveStep7 { 0 };
const byte ledActiveStep8 { 0 };
const byte btnStep1 { }; // bouton pour activer/désactiver le canal sur le step X
const byte btnStep2 { };
const byte btnStep3 { };
const byte btnStep4 { };
const byte btnStep5 { };
const byte btnStep6 { };
const byte btnStep7 { };
const byte btnStep8 { };
const byte btnChannelSelect { }; // bouton de changement de channel
// on regroupe toutes les constantes précédentes dans des tableaux pour pouvoir s’en servir facilement dans le code
// avec des boucles
const byte outTrigChannel [5] = { outTrigChannel1, outTrigChannel2, outTrigChannel3, outTrigChannel4, outTrigChannel5 };
const byte ledTrigChannel [5] = { ledTrigChannel1, ledTrigChannel2, ledTrigChannel3, ledTrigChannel4, ledTrigChannel5 };
const byte ledStep [8] = { ledStep1, ledStep2, ledStep3, ledStep4, ledStep5, ledStep6, ledStep7, ledStep8 };
const byte ledActiveStep [8] = { ledActiveStep1, ledActiveStep2, ledActiveStep3, ledActiveStep4, ledActiveStep5, ledActiveStep6, ledActiveStep7, ledActiveStep8 };
const byte btnStep [8] = { btnStep1, btnStep2, btnStep3, btnStep4, btnStep5, btnStep6, btnStep7, btnStep8 };
bool isActiveStep [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
unsigned int tempoBpm { 120 }; // tempo en BPM
unsigned long tempoMicro { 0 }; // temps entre deux steps en microsecondes
unsigned long temps { 0 }; // le compteur de temps, utilisé pour vérifier quand activer le prochain step
byte channelSelected { 0 }; // le channel sélectionné par l’utilisateur et dont la séquence est affichée
byte currentStep { 0 }; // temps/step actif, actuel
bool memoireStepBtn[8] = {}; // memoire de l’état de chacun des 8 boutons d’activition des steps
bool etatBtn; // etat de n’importe quel bouton que l’on utilisera en le comparant à sa mémoire
bool memoireBtnChannel = {}; // 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é
void displayActiveSteps()
{
for (byte i = 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
}
}
}
void setup() {
// put your setup code here, to run once:
for (byte i = 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 (byte i=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
}
void loop() {
// 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 (byte i = 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 (byte i = 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 (byte i = 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
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment