The basic design of the product is simple. There is a power section which will take a supply voltage and convert it to the necessary voltages. The BC needs a negative voltage and the microcontroller needs a 5V supply. There is an opamp to convert the output of the BC voltage to logic level voltages so it needs voltages for the rails to handle the negative voltage input from the BC as well as to output the levels between 0-5V which is the constraints of the ADC on the microcontroller.
I used a cheap wall wart to supply the circuit with 5V and then used a DC-DC converter to generate the additional voltages required; a negative voltage for the BC as well as the rails for the opamp.
The rest is quite simple. The opamp is simple inverting amp that converts the BC return voltage to levels between 0-5V for the microcontroller. The microcontroller takes the analog input voltage and converts it to MIDI continuous controller messages for breath.
The microcontroller is capable of driving a traditional MIDI (5 pin DIN, not USB) OUT connection so I did not use a hex driver chip as you see in many MIDI circuits on the internet. I had to use an external oscillator because the internal RC clock was not accurate enough to generate the 31.25 kbaud rate MIDI signal. Make sure to burn the fuses for the microcontroller to match the external clock you use. The standard serial Arduino library does not work with the microcontroller so I used the SoftwareSerial library. One note is that SoftwareSerial library does not support simultaneous MIDI transmit/receive so if you want to do that, you’ll have to use the AltSoftwareSerial library.
The logic for the microcontroller is quite simple. Just setup the serial interface library object and then continuously loop looking at the analog input voltage and convert that to the MIDI breath controller messages. Since the analog value is a 10 bit value, it has to be converted into an 8 bit value for MIDI. Here just divide by 4 (or right shift 2 bits). One word of caution, this will send out a flood of MIDI messages, so you’ll need to consider how to thin out the messages. But putting in a simple delay will create an unresponsive breath controller. I dealt with this by only sending breath controllers MIDI messages when there were significant changes to the BC input values.