Midi Controller con quattro potenziometri stabilizzati e UsbMidi
Avevo da tempo il desiderio di costruire un Controller Midi per espandere il mio setup di tastiere e sintetizzatori musicali. Oggi voglio mostrarvi un piccolo (e decisamente brutto) controller a 4 potenziometri, per inviare qualsiasi tipo di Control Change (CC), messaggio standard nel protocollo MIDI. Una soluzione DIY per mandare input ai tuoi synth preferiti (dotati di UsbHost), come ho fatto io con il bellissimo progetto AidaDSP di Massimo Pennazio.
Circuito
Per realizzare questo progetto è strettamente necessario utilizzare un arduino con Usb Midi capability: nel mio caso ho utilizzato un Arduino Micro Pro, che ha ottimamente fatto il suo dovere (essendo anche decisamente ecomonico è veramente una scelta obbligata!).
Se non possiedi questa versione, scegli una tipologia che abbia il chip ATmega32U4, l’unico che permette di far riconoscere il nostro controllore come periferica midi tramite libreria “Midi Usb”. Anche Arduino Leonardo può essere un’alternativa valida (ma Arduino Uno, no!).
Il circuito è abbastanza semplice e prevede 4 potenziometri lineari 10k, collegati ai rispettivi pin A0, A1, A2, A3, e poi ciascuno ai 5volt e alla GND.
Schema del circuito.
Stabilizzazione dei valori dei potenziometri
Il codice è composto da una funzione di lettura dei potenziometri che permette di stabilizzare l’output. Mi sono accorto che nei precedenti progetti uno dei problemi riscontrati riguardava proprio la lettura del valore di un potenziometro, spesso non stabile e piena di valori “anomali” (fenomeno forse dettato qualità del potenziometro o dalla sua sensibilità alla variazione di corrente).La funzione averageCalc(), ispirata da questo video permette di stabilizzare diversi valori analogici attraverso un semplice calcolo del valore medio tra N letture consecutive (nel mio caso numReadings = 10).
Il passo successivo è usare la funzione map() per mappare il range tra 0 e 1024, con un range MIDI tra 0 e 127. I comandi CC inviati dal controller sono 10,11,12,13, scelti arbitrariamente.
#include <Arduino.h>
#include <MIDIUSB.h>
int old_a = 0;
int old_b = 0;
int old_c = 0;
int old_d = 0;
const int numReadings = 10;
const int knobs = 4;
int readings[knobs][numReadings];
int readIndex[knobs];
int total[knobs];
int average[knobs];
int averageCalc(int knob, int inputPin)
{
total[knob] = total[knob] - readings[knob][readIndex[knob]];
readings[knob][readIndex[knob]] = analogRead(inputPin);
total[knob] = total[knob] + readings[knob][readIndex[knob]];
readIndex[knob] = readIndex[knob] + 1;
if (readIndex[knob] >= numReadings)
{
readIndex[knob] = 0;
}
average[knob] = total[knob] / numReadings;
return average[knob];
}
void controlChange(byte channel, byte control, byte value)
{
midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
MidiUSB.sendMIDI(event);
MidiUSB.flush();
}
void setup()
{
Serial.begin(9600);
for (int knob = 0; knob < knobs; knob++)
{
for (int thisReading = 0; thisReading < numReadings; thisReading++)
{
readings[knob][thisReading] = 0;
}
}
}
void loop()
{
int a = averageCalc(0, 0);
int b = averageCalc(1, 1);
int c = averageCalc(2, 2);
int d = averageCalc(3, 3);
a = map(a, 0, 1024, 127, 0);
b = map(b, 0, 1024, 0, 127);
c = map(c, 0, 1024, 127, 0);
d = map(d, 0, 1024, 0, 127);
if (a != old_a)
{
Serial.println(a);
old_a = a;
controlChange(0, 10, a);
}
if (b != old_b)
{
Serial.println(b);
old_b = b;
controlChange(0, 11, b);
}
if (c != old_c)
{
Serial.println(c);
old_c = c;
controlChange(0, 12, c);
}
if (d != old_d)
{
Serial.println(d);
old_d = d;
controlChange(0, 13, d);
}
delay(5);
}
L’hardware
Il box case è stato ottenuto da una scatolina di chewing gum con un compensato tagliato sulla parte superiore. Il tutto nastrato. Weird stuff! 😜
Ecco alcune immagini del risultato:
Conclusioni
Il dispositivo è veramente stabile e funzionante alla perfezione. Lo proverò prossimamente accoppiandolo a vari synth e al computer per comandare alcuni plugin VSTi.
Prova ad usare potenziometri di qualità superiore ed a stabilizzare la tensione all’ingresso del potenziometro con una capacità da 470 uF e sul cursore con 100 nF. Saluti
Commenti disabilitati.