Vai al contenuto

Midi Controller con quattro potenziometri stabilizzati e UsbMidi

Scritto da:

carlopeluso

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.

Articolo precedente

Un filtro audio passa-basso controllato con il fiato (Breath Controller)

Articolo successivo

Preload di immagini in poche righe di CSS.

Unisciti alla discussione

  1. 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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *