Midiplex

a joystick MIDI message generator

History

As my live MIDI setup became more elaborate, I developed a greater hunger for knobs and buttons.  So I looked around at various devices that I can buy that would allow me to send continuous controller messages to my synths, and didn't find what I was looking for.  Most of the MIDI control surfaces were either too big or too expensive.

Then it dawned on me: why not use a joystick?  A joystick has buttons and a continuous control interface, and is small and inexpensive.  Unfortunately my search for joystick-to-MIDI utilities didn't turn up a lot either.  The utilities I found were either unstable or limited.  So I gave up my search decided to write Midiplex.

What does it do?

What does it not do?

Requirements

Downloads

Links

Examples

Here's a copy of the sample midiplex.xml configuration file that ships with Midiplex 1.0, and some sample output.

<?xml version="1.0" encoding="ISO-8859-1"?>

<midiplex>
<midiOutDefaults portName="MIDI Yoke NT: 1" channel="5"/>

<joystickButton name="button1" number="1" sendDown="true" sendUp="false"/>
<joystickButton name="button2" number="2" sendDown="true" sendUp="true"/>

<midiEvent name="test1">
<controller number="20" value="20"/>
<controller number="20" value="67"/>
</midiEvent>

<midiEvent name="test2" portName="MIDI Yoke NT: 2">
<controller number="15" channel="3" value="12"/>
</midiEvent>

<eventMap>
<event source="button1" destination="test1"/>
<event source="button1" destination="test2"/>
<event source="button2" destination="test2"/>
</eventMap>
</midiplex>

c:/home/Midiplex $ midiplex.exe 
Detected MIDI Ports:
* Microsoft GS Wavetable SW Synth
* MIDI Yoke NT: 1
* MIDI Yoke NT: 2
* MIDI Yoke NT: 3
* MIDI Yoke NT: 4
* MIDI Yoke NT: 5
* MIDI Yoke NT: 6
* MIDI Yoke NT: 7
* MIDI Yoke NT: 8
Midiplex starting up.

Reading configuration from midiplex.xml.
Found 2 joystickButton elements.
Found 2 midiEvent elements.
Found 2 controllers for event test1
Found 1 controllers for event test2
[MidiOutDefaults port=1, channel=5]
Mapping: [JoystickButton name='button1', number=1, sendDown=True, sendUp=False]->[MidiEvent name='test1', port=1, channel=5, controllers=[Controller port=1, channel=5, number=20, value=20], [Controller port=1, channel=5, number=20, value=67]], [MidiEvent name='test2', port=2, channel=5, controllers=[Controller port=2, channel=3, number=15, value=12]]
Mapping: [JoystickButton name='button2', number=2, sendDown=True, sendUp=True]->[MidiEvent name='test2', port=2, channel=5, controllers=[Controller port=2, channel=3, number=15, value=12]]
Triggering [Controller port=1, channel=5, number=20, value=20].
Triggering [Controller port=2, channel=3, number=15, value=12].
Triggering [Controller port=2, channel=3, number=15, value=12].
Triggering [Controller port=2, channel=3, number=15, value=12].


I'd be happy to hear success stories, bug reports, gripes and feature requests from Midiplex users.

Have fun,

Boris
boris@burtin.net