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.
<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].
Boris
boris@burtin.net