MULTI-VOICE MIDI GUITAR

I have been playing classical/fingerstyle guitar since 1970 and got interested in electronic music synthesizers around 1972. Being a bit of an electronics tinkerer, I started lusting after the idea of building a multi-voiced guitar synthesizer. I am not referring to being able to play chords - but (minimally) being able to play a bass line as one synthesizer voice and a melody line as another. Nowadays this is referred to as multitmbral. At first glance this would seem easy - just use a hex pickup (one coil for each string) and drive 6 pitch-to-voltage converters. Another approach is to use the original string signals and process them through waveshapers (or phase-locked loops). These two approaches work for analog synthesizers. The third approach is to use pitch-to-midi converters. These can drive midi devices directly or go through midi-to-voltage converters to drive analog stuff.

All three methods give you one voice per string. Unfortunately, it is rare for a piece of music to have voicing split out by string only. Also, the split points often change throughout the piece. The problem is one of signal routing - there needs to be some way of routing the note to a voice based on the string number and fret number, and a way to change this routing algorithm quickly (like between 2 notes) during a performance. The pitch-to-midi approach is the easiest - routing data is easier than routing voltages or audio.

I am currently using a Roland GK-2a pickup to drive a Blue Chip Axon Ax100 (see diagram at right). The output of the Axon goes through a laptop computer via a midisport 4x4. On the laptop I modify the midi messages using a free software utility called KeyKit. Very powerful! It uses a scripting language that allows the user to interpret and modify the incoming midi message stream and output the resulting midi stream. This allows me to change the midi channel numbers of the notes to route them to different voices. By setting my Axon to output each string on a diferent midi channel, I can write a script to change the destination (channel number) based on input channel number (string) and note number (fret).

Here is an example of a KeyKit script that sends all notes on the 5th and 6th strings as well as the first 2 frets on the 4th string to channel 1, the f on the 4th string (3rd fret) to channel 3, all notes on the 1st and 2nd strings and above the f on the 4th string to channel 2:

#
# strings 1,2,3     -> chan 2
# string 4 above f  -> chan 2
# string 4 at f     -> chan 3
# strings 4,5,6     -> chan 1
#
function task_axon1() 
{
   Midiin[$] = f = open()
   onexit(closemidi,$)

   while ( (n=get(f)) != Eof ) 
   {
      print("chan ",n.chan," pitch ",n.pitch)
      if ( n.chan <= 3 ) {
         n.chan = 2
      }
      else if ( n.chan == 4 && n.pitch > 53) {
         n.chan = 2
      }
      else if ( n.chan == 4 && n.pitch == 53) {
         n.chan = 3
      }
      else {
         n.chan = 1
      }
      realtime(n,0)
   }
}

It's a simple matter to have it automatically change the routing at a certain point in a piece of music by counting notes or upon seeing a particular note (it can even be a note that is not to be output, like a note that doesn't occur in the music - it's only played to trigger a change in the script). A midi footswitch could also be used to do this. The possibilities are endless.

Return to home page