VERY MUCH A BETA!
I built MidiMapper to be a one stop shop for controlling various devices using USB MIDI keyboards or pads. I'm running this as a daemon on a Raspberry PI 4 to provide a stand alone solution.
At it's most basic is a USB MIDI host to convert between USB keyboards and traditional 5-Pin MIDI. A 'thru' mode allows MIDI to pass directly from one device to another with minimal latency.
On a more advanced level MidiMapper allows keymaps to be created allowing note on commands to be converted to any of the following types:
- MIDI NOTE_ON (with channel)
- Program Change
- OSC command
- MQTT
MidiMapper also contains a builtin web interface for monitoring and setup.
Still To Do :
- loop connection attempts
- keymap needs to track channel and message_type
- keymap edit same note on two devices
- host management (reboot and shutdown)
- Rotating logs
- GUI for log management
- Edit keymap via web interface
- Edit settings via web interface
- Change midi mode via web interface
- Match mapping device control
- remove lag from mode change
- encrypt passwords in settings file
Known Issues to fix :
- keymaps in activesettings getting corrupted (rework how gui gets the keymap)
- keymaps don't reload on update
- knowndevices error if file not exist
- rescan midi I/O results in corrupt data upon next note (for now midi will be restarted)
- remove mqtt publish all midi
- i\o list not reloading on rescan\restart (settings not pushing???)
- match device check on apply_settings
- apply settings not right
- keymap edit only works when output selected
- quit dialog box triggers on cancel
- settings['match_device'] getting set 'on' not true somewhere
- web PC not sending in mapped mode
- ValueError: 'dummy message' is not in list
- match device not working
- keymap gui not working
Future features to implement :
- gui for wifi connection
- note to GPIO
- Channel Routing
- Device to Device mapping
- OSC to MIDI
- Logs
Built using :
- python-rtmidi
- python-socketio==5.5.0
- Flask==2.0.2
- python-osc==1.8.0
- Flask-SocketIO==5.1.1
- python-dotenv==0.19.2
- requests==2.22.0
- simple-websocket==0.5.0
- websocket-client==1.2.3
OSC input examples:
- /MIDI/note_on/1/55/127
- /MIDI/program_change/2/17
- /OSC/host_machine.local/8000/Qlab/go