Wednesday, April 6, 2011

3D Trombone Improvements

Over the last few days I've made a couple of improvements to the 3D Trombone firmware that improve its playability and get me a little closer to having a playable instrument to demo. My goal is to have something to take to Maker Faire Bay Area in May.

Improvement 1: Flip-Flopping the Overtone Selector

If you recall, the 3D Trombone has a controller operated with the right hand that selects the "overtone" played by the instrument. All that really means is that, depending on which buttons are pressed, a different note is played when the player blows into the instrument, and the series of notes are the same as you would hear if an acoustic trombone player was playing the overtone series.

In musical notation, that's:


Since I don't have a way of enulating the "overblowing" behavior that I can get on an acoustic trombone, I built a controller that lets the player press buttons to select the "overtone" played. It looks like this:



In my original firmware, I'd mapped the overtones as follows:

All switches open: Fundamental
Switch 4 pressed: overtone 1
Switches 3 and 4 pressed: overtone 2
Switches 2, 3 and 4 pressed: overtone 3
Switches 1, 2, 3 and 4 pressed: overtone 4
Switches 1, 2 and 3 pressed: overtone 5
Switches 1 and 2 pressed: overtone 6
Switch 1 pressed: overtone 7

I found this incredibly difficult to play. I often would unintentionally play a lower note when I intended to play a higher note, or vice-versa. At first I attributed this to being completely unfamiliar with the concept of using my fingers to select pitches, as opposed to using my embouchure.

But after playing "3d air trombone" for a while today, I wondered if some of my difficulties were due to the particular way I'd mapped the keys. So tonight I rewrote the firmware and turned the finger assignments completely upside down. And, lo and behold, it works a lot better. For some reason, it feels much more like the concepts of "up" and "down" make sense now.

To experience this, hold your right hand sideways in front of you, with your palm facing you. If you curl your fingers toward your palm, starting first with your pinky and ending with your index finger, that's the new motion I implemented, and it feels like "up" to me. I had it backwards before!

Improvement 2: Enabling Scene Selection in Ableton Live

Since I want to be able to take this setup and perform live at Maker Faire, I've been trying to build a live performance setup (by the way, I won't have a set location - I'm just hoping to find an electrical outlet somewhere and have an impromptu concert). Although I have mostly been using Apple Logic, I did get a Lite version of Ableton Live with one of the MIDI interfaces I bought, and I was able to upgrade to the Lite version of Live 8 for free.

I've always had a bit of a hard time getting my head around how Live works, but I think I'm starting to get it, and after spending some more time with the tutorials, I can see using it for my performances. Live has a concept of "scenes" that typically map to some musical structure. For example, the scenes might the intro, verse, chorus, break, and outro (for a traditional song form). For a dj, the scenes might be a collection of samples and beats that s/he selects in some sequence.

People who use Live seriously often have a dedicated hardware controller with big, lighted buttons that are easy to see in a dark environment and are easy to hit reliably in a performance. I really don't want to have to haul something like that around. So I decided to build in the ability to do scene selection with the 3d Trombone.

To accomplish that, I added an additional button, operated by the thumb. In the photo, it's labeled "Meta":



To select a scene in Live, you:

Stop playing any notes (that is, stop blowing)
Press button 1, 2, 3, or 4 to select a scene
Press and release the Meta button

When the firmware detects that the meta button was released, it reads the values of the other 4 buttons and sends a MIDI Note On event on an alternate MIDI channel. You can then use Live's MIDI mapping mode to assign that to one of the scene selection buttons in your Live set.

Being the geek I am, I was unhappy with only being able to select one of 4 scenes, so I wrote the firmware so that it reads the 4 switches as a 4-bit binary number and sends that as the MIDI note on. So, if you are able to do binary in your head, you can select up to 16 scenes (if you don't want to do that, you can still just use the 4 notes produced by pressing the 4 switches individually).

Next

Now that I seem to have something that's somewhat playable, the next step is to put together a few Live sets that have some backing material that I can use to show off the 3D Trombone. Unfortunately, it doesn't appear that the Apple Logic Softsynths are available from within Live, so I'll probably need to find an AU or VST synth plugin that is flexible enough to be controlled by my instrument. Most of the really high-end softsynths (things from Native Instruments, Omnisphere, etc) all have very sophisticated MIDI controller routing capabilities, so one of those is probably in my future. If anyone has suggestions for a specific synth they have gotten working well with a wind controller (e.g. a Yamaha WX series, or an Akai EWI), let me know.

Thanks for reading...

-Gordon

Saturday, March 5, 2011

Analog Multiplexing

The Arduino has 6 analog I/O pins. For one project I'm considering, I actually will need 7 analog I/O pins, so I went looking for an analog multiplexer chip that would allow me to have more analog I/O. I found the CD74HC4067, a 16-channel analog multiplexer that will fill the bill.

You can think of the chip like a 16-position switch. There are 4 input pins that select which one of the 16 pins to connect to the common pin. If you write a binary 0000 to the input pins, the common pin is connected to input/output pin 0. If you write a binary 0001, the common pin is connected to input/output pin 1. And so on.

To try this chip out, I built the circuit shown below. Two 10 k potentiometers are wired up as a voltage divider to provide a voltage from 0-5 volts that I can measure. The common pin of the multiplexer chip goes to the Arduino's analog input, and the wipers of the pots go to input/output pins 0 and 1 of the multiplexer chip.




To be sure I was programming the chip correctly, I also hooked the wipers of the pots to Arduino analog pins 1 and 2. If I've got things working properly, then I should see that same value coming from the mux chip as I see on the Arduino analog input.

Finally, I wrote a little sketch that selects one of the mux inputs, and then prints the values from analogRead() on pin 0 (connected to the MUX) and pins 1 and 2 (connected to the potentiometers). Running the sketch, when I turn the potentiometer selected by the mux, I see it value change, and it matches the value directly read by the Arduino. Unit testing hardware FTW!


/**
74HC4067 Test

The 74HC4067 chip is an analog multiplexer. It has 4 control pins where you write
a value (0-15) that selects which of the 16 analog inputs/outputs to/from the chip
are hooked up to the common input/outout. This is useful if you need to read or
write an analog voltage to more than the 6 pins available on the Arduino.

*/

int mpin = 1;

void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
}

/*
Choose the input pin selected by the 74HC4067 chip
*/
void selectInputPin(int pin) {
if (0 == pin) {
digitalWrite(2, 0);
} else if (1 == pin) {
digitalWrite(2, 1);
}
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 0);
}


void loop() {
Serial.print("Loop begin: select multiplexer pin ");
selectInputPin(mpin);
Serial.print(mpin);
Serial.println();
Serial.print("0: ");
Serial.print(analogRead(0));
Serial.print(" 1: ");
Serial.print(analogRead(1));
Serial.print(" 2: ");
Serial.print(analogRead(2));
Serial.println();
delay(1000);
}

Tuesday, February 22, 2011

3-D Trombone Photos and Ideas

I've finally gotten back to working on my 3-D Trombone concept. It's been a while - work has gotten pretty crazy lately, but I've just gotta get back to this to exercise my creative outlets.

Here are a few photos of the electronics:



The large black unit in the center is the 3-position joystick I liberated from a Gametrak controller. You can see the joystick in the upper right. The circuit board in the upper left is just a wiring junction I built to make the electrical connections more secure. All the potentiometer connections and the power supply line come in/out on the ribbon cable you see (IDC connecors FTW!).

Here's another view where you can see some of the mechanics of the Game Trak controller. It's pretty simple, really - a gear system drives a potentiometer. The large enclosure houses a large coil spring that provides the return force for the z-axis.




There is also a breath sensor based on the same Freescale chip I used in my previous controller, built into a small project box and attached to the gametrak controller box:



I also have a controller that the player holds in the right hand. It consists of 5 monentary pushbutton switches used to select the overtone played. Here's a view of it:




The right hand controller and gametrak box connects to the same Arduino + MIDI Shield box I built for my other instrument (the new box is plug-compatible with the old one). Here's a view from the outside:



The controller electronics attach via the DB-25 connector. The switch on the top is used to select "load" mode, where the Arduino is able to download code from the IDE, and "run" mode where the serial pins are connected to the MIDI shield, which you can see in this photo of the inside:



Visible at the upper-left is the MIDI out port.

Ideas

I had an email conversation with Onyx Ashanti about the cool work he's doing on his Tron Beatjazz Controller. Onyx has some big goals for his work, and some of them could benefit my design, especially the hand-controllers he's working on - they'll have keys for each finger to operate, as well as an accelerometer. I think he's also incorporating some ThingM MaxM LEDs, which is very cool. ThingM's founder, Mike Kuniavsky, is a friend of mine and a former coworker at the University of Michigan.

The night after I had the email conversation, I had a dream that I was playing live at some sort of a club. I had an instrument sort of like my 3-D Trombone, but instead of the overtone controller, in my right hand I held a microphone, and to control the overtones, I moved my right hand up and down in the vertical axis. In my dream, I found it very natural, and was able to play melodies about as easily as on my trombone. I'm still not sure why I was holding a microphone in my dream.

I suspect this idea had been hanging around in my brain for a while, and my conversation with Onyx brought it to the front.

Naive Implementation

I took that idea and modified my 3-D Trombone Arduino sketch to read the Y-axis position of the gametrak controller and map the value, in a linear fashion, to an overtone.

In a nutshell, the result was unplayable. The problem is that, in order to maintain the "slide" position, the amount of "string" deployed out the gametrak controller has to be constant. So, in order to move up and down the harmonic series without changing slide position, you need to move your arm in an constant-radius arc, which is already pretty hard. But to make matters worse, the radius of the arc depends on which position you're in. So if you're in seventh position, the arc is several feet long, but if you're in first position, the arc is only one or two inches long. It produced some fun random effects flying up and down the harmonic series will glissando-ing in and out, but that would get old quick. Here's a picture of what I mean:



I have another idea about how to make this idea (vertical motion selects overtones, horizontal motion selects pitch) - a simple mapping of overtone to vertical position, pitch to horizontal position. Basically, a grid like this:




The X axis is the slide position - a trombone has seven of them, and the Y axis is the overtone. A good trombone player can play about 10 overtones, which corresponds to a range of about 3 octaves plus a few extra notes. So where a person playing an acoustic trombone would keep the slide in first position and move up and down the harmonic series with his/her embouchure, the player of the 3-D trombone would trade in the embouchure for up and down motion.

For those of you who may play trombone, here's how a B-flat major scale would look:



Implementation:

It turns out that it will be very hard to implement this "grid" idea using my current setup. The reason is that, due to the arrangement of the gametrak controller and the player (s/he holds it near the face), and the travel limits of the gametrak unit's joystick axes (about 90 degrees), it's not possible to cover the whole range of motion that might be interesting to a trombone player. So... back to the drawing board.

A more promising arrangement would be to use the Gametrak as it was intended to be used; base unit sitting on the floor. I'll investigate that and post on it in the future.