Électronisation d’un saxophone

Objectif : partir d’un saxophone fonctionnel et rajouter un genre de MIDI real-time, pour pouvoir en jouer en silence et le brancher sur des synthétiseurs.

Pour la première itération de preuve de concept, j’ai voulu explorer l’utilisation d’un capteur de pression (BMP085, c’est celui que j’avais sous la main) placé sur le trou de la clé d’octave. Je trouvais que c’était la méthode la moins invasive, avant de jouer dans le bec. Voici de quoi avait l’air le montage :

J’ai utilisé la librairie adafruit BMP085 ainsi que le traceur série d’arduino pour aficher les données, à la fréquence maximale.

#include <Adafruit_BMP085.h>

/*************************************************** 
  This is an example for the BMP085 Barometric Pressure & Temp Sensor

  Designed specifically to work with the Adafruit BMP085 Breakout 
  ----> https://www.adafruit.com/products/391

  These pressure and temperature sensors use I2C to communicate, 2 pins
  are required to interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5
// Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4
// EOC is not used, it signifies an end of conversion
// XCLR is a reset pin, also not used here

Adafruit_BMP085 bmp;
  
void setup() {
  Serial.begin(9600);
  if (!bmp.begin()) {
	Serial.println("Could not find a valid BMP085 sensor, check wiring!");
	while (1) {}
  }
}
  
void loop() {
    //Serial.print("Temperature = ");
    //Serial.print(bmp.readTemperature());
    //Serial.println(" *C");
    
    //Serial.print("Pressure = ");
    Serial.println(bmp.readPressure());
    //Serial.println(" Pa");
    
    // Calculate altitude assuming 'standard' barometric
    // pressure of 1013.25 millibar = 101325 Pascal
    //Serial.print("Altitude = ");
    //Serial.print(bmp.readAltitude());
    //Serial.println(" meters");

    //Serial.print("Pressure at sealevel (calculated) = ");
    //Serial.print(bmp.readSealevelPressure());
    //Serial.println(" Pa");

  // you can get a more precise measurement of altitude
  // if you know the current sea level pressure which will
  // vary with weather and such. If it is 1015 millibars
  // that is equal to 101500 Pascals.
    //Serial.print("Real altitude = ");
    //Serial.print(bmp.readAltitude(101500));
    //Serial.println(" meters");
    
    //Serial.println();
    //delay(500);
}

Le bruit est d’environ 2-3 Pa et le signal autour de 5-10 Pa, lorsque je souffle assez fort, mais sans faire vibrer l’anche du bec. On peut donc détecter le souffle de cette manière, mais ça manque de fiabilité. Je pensais que le changement de pression serait plus important, mais il semble que la vitesse du flux d’air est beaucoup plus significative.

À essayer :

  • Les nouveaux capteurs de pression ont un bruit beaucoup plus faible (~0,02 Pa selon les datasheet). À acheter parce que je n’en ai pas.
  • Mettre un micro MEMS pour comparer la sensibilité au signal
  • Essayer avec un micro normal juste pour voir
  • Adapter un design de spiromètre dans le bec

Piano midi avec fluidsynth

J’ai installé Ubuntu Studio sur une tour pour faire un piano midi qui s’ouvre automatiquement.

Voici le script bash que j’ai adapté d’ici : https://superuser.com/questions/1291367/bash-condition-not-met-when-executed-by-crontab

#!/bin/bash
sleep 60
echo "Starting"
/usr/bin/fluidsynth -is -a jack -j -m alsa_seq /home/fred/Nice-Keys-Ultimate-V2.3.sf2 &
echo "Fluidsynth started"
while true; do /usr/bin/aconnect -o; if [[ $(/usr/bin/aconnect -o ) = FLUID ]]; then break; fi; sleep 2; done
/usr/bin/aconnect 20:0 128:0
echo "Connected"

J’ai rajouté un sleep 60 pour attendre que l’os ait fini de démarrer comme du monde, sinon il y avait des erreurs bizarres (probablement qu’il faut que la carte de son soit chargée avant d’exécuter le script.

Ensuite, j’ai ajouté ceci dans la crontab :

@reboot bash /home/fred/pianolauncher.sh >> /home/fred/out.log 2>&1

où pianolauncher est mon script ci-haut. Ça fonctionnait lorsque mon écran était connecté, mais sans écran, il y avait un bug. Il faut ajouter la ligne suivante au fichier /etc/environment :

JACK_NO_AUDIO_RESERVATION=1

Eh voilà! Un piano avec une latence très faible grâce au kernel préemptoire d’Ubuntu Studio, qui s’ouvre automatiquement sans besoin d’avoir d’écran, avec une librairie de sons vraiment géniale!