Vai al contenuto

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

Scritto da:

carlopeluso

In questi giorni ho voluto testare le capacità di Teensy 4.0, una scheda arduino-like programmabile e altamente performante (600mh) molto indicata per realizzare sistemi audio.

Obiettivo

Realizzare un Filtro passa-basso (low pass filter, o semplicemente LPF) che sia controllato dalla variazione di un breath controller, ovvero un tubo in silicone riempito d’aria con il soffio. Può essere uno strumento molto creativo per musicisti, dal momento che il circuito puo normalmente inserirsi nella catena di effetti audio, in serie. Quindi applicabile a strumenti come chitarre, bassi, tastiere e voci come un normale dispositivo per la tua pedaliera da concerto.

Circuito

Il progetto prevede i seguenti componenti:

  • Teensy 4.0
  • Audio adaptor shield for Teensy 4.0
  • MPX5010GP pressure sensor
  • Tubo di silicone
  • potenziometro lineare 10k ohm
  • un anello di led (ho usato il NeoPixel Led Ring da 12 led)
  • un casebox
  • (opzionale, non disegnato nello schema) un plug TS per jack 1,4″ per usare un input esterno, da saldare nei poli di audio input dell’audio adaptor shield.

teensy breath controller

Teensy 4.0 + Audio adaptor shield

Audio adaptor shield

Codice

Per generare il flusso di setup ho utilizzato il comodissimo strumento GUI messo a disposizione direttamente dal produttore di Teensy, che puoi trovare a questo link.

  • i2s1 è l’input audio presente sulla scheda
  • filter1 è il filtro cutoff
  • 12s2 è l’output

#include <avr/Audio.h>
#include <avr/Wire.h>
#include <avr/SPI.h>
#include <avr/SD.h>
#include <avr/SerialFlash.h>
#include <avr/Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/avr/power.h>
#endif 


// GUItool: begin automatically generated code
AudioInputI2S i2s1;               //xy=429,350
AudioFilterStateVariable filter1; //xy=677,374
AudioOutputI2S i2s2;              //xy=988,390
AudioConnection patchCord1(i2s1, 0, filter1, 0);
AudioConnection patchCord2(filter1, 0, i2s2, 0);
AudioConnection patchCord3(filter1, 0, i2s2, 1);
AudioControlSGTL5000 sgtl5000_1; //xy=825,587
// GUItool: end automatically generated code

#define PIN 6
#define NUMPIXELS 12
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  AudioMemory(256);
  pixels.begin();
  Serial.begin(115200);
  sgtl5000_1.enable();
  sgtl5000_1.volume(0.8);
  delay(50);
}

unsigned long safeMap(int data, int min, int max, int out1, int out2)
{
  if (data < min) { data = min; } if (data > max)
  {
    data = max;
  }

  return map(data, min, max, out1, out2);
}

void loop()
{

  unsigned long resonanceKnob = analogRead(A3);

  //filter is working
  if (resonanceKnob > 20)
  {
    unsigned long pressure = analogRead(A1);
    int min = 90;
    int max = 700;

    unsigned long fre = safeMap(pressure, min, max, 1000, 20000);

    int res = map(resonanceKnob, 0, 1024, 1, 5);

    filter1.frequency(fre);
    filter1.resonance(res);

    int led = map(fre, 0, 20000, 0, NUMPIXELS);

    for (int i = 1; i < NUMPIXELS; i++)
    {
      if (i < led)
      {
        pixels.setPixelColor(i, pixels.Color(0, 255, 25));
      }
      else
      {
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
      }
    }
    pixels.setPixelColor(0, pixels.Color(0, 25, 255));
    pixels.show();
  }
  else
  {
    filter1.frequency(20000);
    filter1.resonance(5);

    for (int i = 1; i < NUMPIXELS; i++)
    {
      pixels.setPixelColor(i, pixels.Color(0, 0, 0));
    }

    pixels.setPixelColor(0, pixels.Color(255, 0, 0));
    pixels.show();
    delay(150);
    pixels.setPixelColor(0, pixels.Color(0, 0, 0));
    pixels.show();
    delay(150);
  }

  delay(8);
}

Il codice si puo trovare a questo link.

Hardware

Non è stato semplice trovare i componenti hardware appositi per la realizzazione del progetto. Il sensore si pressione MPX5010GP non è molto reperibile in Italia a prezzi bassi, cosi come non è semplice trovare dei case-box adeguati e facilmente bucabili.

Ho acquistato questa scatola da amazon e devo dire che mi sono trovato benissimo, ma il prezzo non è basso. Mi sonon avvalso di un trapano per bucare il materiale , e il risultato è accettabile ma non buono.

Il posizionamento del circuito nella scatola è stato insidioso. Speriamo che sia affidabile, dal momento che la scatola verrà utilizzata in contesti di palchi e concerti, dove è essenziale la durabilità.

Il dispositivo senza potenziometro e senza tubo di silicone.

Il led ring risponde alla quantità di soffio, aumentando il raggio in senso orario dei led in funzione di quanta aria arriva al sensore di pressione collegato al tubo di silicone.

Risultato

Il dispositivo è correttamente funzionante, l’ho collegato alla mia Nord Stage 3, unito ad un riverbero + delay.

Risulta uno strumento molto valido, non vedo l’ora di provarlo al mio prossimo concerto su un palco.

Problemi riscontrati

Al momento l’unico problema riscontrato è una sorta di ‘transmission burst’, un fruscio intermittente ogni 2-3 minuti udibile solo a volumi alti. Sembra dovuto ad una scorretta gestione della corrente/massa, probabilmente il NeoPixel Led Ring assorbe piu ampere di quanti ne riesca a fornire Teensy, indagherò meglio nelle prossime release. Proverò a risaldare il tutto, magari in un box piu largo per evitare problemi di messa a terra.

 

Articolo precedente

Un editor minimalissimo per il tuo blog.

Articolo successivo

Midi Controller con quattro potenziometri stabilizzati e UsbMidi