There also a solution without the custom DIY OpenDeck board.
You can use instead an Arduino Leonardo, cheaper.
Here is the sketch for a 6 pots controller for ip1 (8192), ip2 (8193), USB (8220), FX1 (8252), FX2 (8253) and BT (8222) fader level control.
It work the same with the USB HUB hooked to the IPAD running midimittr.
Ask here questions for more explanation on the code and how to set it up for your need.
#include <USB-MIDI.h> // Inclure la bibliothèque de transport USB MIDI
// Initialisez l’objet MIDI pour le transport USB natif
USBMIDI_CREATE_DEFAULT_INSTANCE(); // Crée une instance nommée “MIDI”
// — Configuration des Potentiomètres —
const byte numPots = 6;
const byte potPins[numPots] = {A0, A1, A2, A3, A7, A8};
// Valeurs pour le filtrage et la détection de changement
int currentPotValue[numPots] = {0, 0, 0, 0, 0, 0};
int lastPotValue[numPots] = {0, 0, 0, 0, 0, 0};
const int tolerance = 2; // Tolérance pour éviter d’envoyer trop de messages dus au bruit (jitter)
// Numéros de paramètres NRPN personnalisés (ajustez selon votre besoin)
const unsigned int nrpnParameters[numPots] = {8193, 8253, 8192, 8220, 8252, 8222};
// Le canal MIDI Ă utiliser
const byte midiChannel = 1;
void setup() {
// Pas besoin de spécifier de baud rate pour le MIDI USB natif
MIDI.begin(midiChannel);
// Optionnel: Serial.begin(9600); pour le moniteur série de débogage si nécessaire.
}
void loop() {
// Boucle à travers tous les potentiomètres
for (byte i = 0; i < numPots; i++) {
currentPotValue[i] = analogRead(potPins[i]);
if (abs(currentPotValue[i] - lastPotValue[i]) > tolerance) {
unsigned int mappedValue = map(currentPotValue[i], 0, 1023, 0, 16383);
sendNRPNValue(midiChannel, nrpnParameters[i], mappedValue);
lastPotValue[i] = currentPotValue[i];
}
}
delay(10);
// Important pour le MIDI USB: appeler MIDI.read() pour permettre le traitement des messages
// et assurer que les messages sortants sont effectivement envoyés
MIDI.read();
}
// Fonction utilitaire pour envoyer un message NRPN complet
void sendNRPNValue(byte channel, unsigned int parameterNumber, unsigned int value) {
MIDI.beginNrpn(parameterNumber, channel);
MIDI.sendNrpnValue(value, channel);
// Pour le MIDIUSB, il faut parfois “flusher” le buffer pour s’assurer que le message parte immédiatement
// La bibliothèque USB-MIDI le gère souvent automatiquement, mais si vous rencontrez des retards, essayez:
// MidiUSB.flush();
}