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

  1. Le code de cet article est sur github

Cet article fait partie d’une série :

  1. Envoyer une note par le cable MIDI
  2. Lire un potentiomètre
  3. Lire un potentiomètre II
  4. Régler le problème de fluctuation
  5. Envoyer le message Control Change
  6. Six potentiomètres