14Bit MIDI Breath Controller

Der kleine Controller sendet 14Bit Mididaten, reagiert auf anblasen und ansaugen wie eine Mundharmonika.

Als Mikrocontroller kommt ein Tennsy 3.2 zum Einsatz. Blassensor ist der MPXV7007GC6U. Als Mundstück verwende ich ein rechteckiges Kunsstoffprofil – dieses fühlt sich jedoch nicht optimal ergonomisch im Mund an. Für die nächste Version werde ich denke ich ein Stück dünnen Plasteschlauch nutzen und möglicherweise auf einen Sensor ohne Unterdruck wechseln, damit entfällt die Ansaugfunktion zugunsten einer besseren Auflösung. Den MPXV7007GC6U hatte ich von einem anderen Projekt noch da, sonst wäre ein 3Volt-Typ natürlich besser geeignet gewesen, das hätte auch den Spannungsteiler gespart.

  • R1 2k
  • R2 4k

Programmiert wurde in der Arduino-Umgebung:

#define BREATH_MIN 120.0
#define BREATH_MAX 2880

#define MAXVALUE 16383
#define ADC_Resolution 14

float breath0;
unsigned int oldBreath, oldSuck;

elapsedMillis msec = 0;

void setup() {
 analogReadResolution(ADC_Resolution);
 breath0 = analogRead(A3);
}

void loop() {
 float tmp; 
 unsigned int tmpUnsigned;
 int i, brthTmp;

if (msec >= 4) {

msec = 0;

brthTmp = analogRead(A3);
 tmp = max (((float)(brthTmp-BREATH_MIN) - breath0), 0);
 tmp = (min(tmp, BREATH_MAX)) / BREATH_MAX;
 tmpUnsigned = (unsigned int)(tmp * 16383.);

if(tmpUnsigned!=oldBreath) {
 usbMIDI.sendControlChange(3, tmpUnsigned >> 7, 1);
 usbMIDI.sendControlChange(35, (tmpUnsigned << 9) >> 9, 1);
 oldBreath = tmpUnsigned;
 }

tmp = abs( min (((float)(brthTmp+BREATH_MIN) - breath0), 0) );
 tmp = (min(tmp, BREATH_MAX)) / BREATH_MAX;
 tmpUnsigned = (unsigned int)(tmp * 16383.);

if(tmpUnsigned!=oldSuck) {
 usbMIDI.sendControlChange(4, tmpUnsigned >> 7, 1);
 usbMIDI.sendControlChange(36, (tmpUnsigned << 9) >> 9, 1);
 oldSuck = tmpUnsigned;
 }
 
 } 
 while (usbMIDI.read()) { }
}