Six potentiomètres
15 jours pour comprendre les contrôleurs MIDI - Jour 6
Cette fois j’utilise six potentiomètres pour faire varier six paramètres du son en même temps. Il suffira d’adapter un peu le code.
Les potentiomètres
Vous pouvez utiliser n’importe quels potentiomètres linéaires (les logarithmiques ne répondront pas comme il faut pour cet usage). Ici j’ai des 10k, 50k, 100k et 1M.
Le code
Je commence par inclure la bibliothèque MIDI et définir quelques constantes. Le nombre de potentiomètres, le canal MIDI sur lequel seront envoyés les messages, et plusieurs numèros de contrôleurs qui correspondent aux composantes du son que je veux modifier avec les potards.
#include <MIDI.h>
const int total_pots = 6;
const int channel = 2;
const int filter_reso = 71;
const int filter_cutoff = 74;
const int amp_attack = 81;
const int amp_release = 84;
const int filter_attack = 85;
const int filter_release = 88;
Viennent ensuite quelques tableaux, pour les valeurs nécessaires
des six potards. last
et penultimate
pour conserver les dernières et
avant-dernières mesures. pin
, pour associer chaque potard à une broche de
l’arduino. Et CC
, pour savoir quel potard s’occupe de quel contrôle.
int last[] = {0, 0, 0, 0, 0, 0};
int penultimate[] = {0, 0, 0, 0, 0, 0};
int pin[] = {A0, A1, A2, A3, A4, A5};
int CC[] = {filter_reso,
filter_cutoff,
filter_attack,
filter_release,
amp_attack,
amp_release};
Puis on trouve la fonction update()
qui fait exactement la même chose que
dans le code précédent, mais en utilisant les tableaux. Je l’ai extraite
de loop()
pour un peu plus de clarté.
MIDI_CREATE_DEFAULT_INSTANCE();
void update(int index) {
int current = analogRead(pin[index]) >> 3;
if (last[index] != current) {
if (penultimate[index] + last[index] != last[index] + current) {
MIDI.sendControlChange(CC[index], current, channel);
penultimate[index] = last[index];
last[index] = current;
}
}
}
Le classique setup()
:
void setup() {
MIDI.begin(MIDI_CHANNEL_OFF);
}
Et finalement la boucle qui lit les 6 potards encore et encore :
void loop() {
for (int i = 0; i < total_pots; i++) {
update(i);
delay(10);
}
}
Références
Cet article fait partie d’une série :
Commentaires
Pas encore trouvé de solution simple et non-invasive pour avoir des commentaires sur le blog. En attendant vous pouvez laisser votre Commentaire sur mastodon@lkdjiin