MIDI to HTTP Bridge
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
James Coleman 24f09575ac First commit 8 months ago
.gitignore First commit 8 months ago
LICENSE First commit 8 months ago
README.md First commit 8 months ago
config.go First commit 8 months ago
flags.go First commit 8 months ago
go.mod First commit 8 months ago
go.sum First commit 8 months ago
http.go First commit 8 months ago
main.go First commit 8 months ago
midiRouter.go First commit 8 months ago

README.md

midi-request-trigger

A service that triggers HTTP requests when MIDI messages are recieved and triggers MIDI messages when HTTP requests are received.

Install

You can install by building.

Building

Building should be as simple as running:

go build

Running as a service

You are likely going to want to run the tool as a service to ensure it runs at boot and restarts in case of failures. Below is an example service config file you can place in /etc/systemd/system/midi-request-trigger.service on a linux system to run as a service if you install the binary in /usr/local/bin/.

[Unit]
Description=MIDI Request Trigger
After=network.target
StartLimitIntervalSec=500
StartLimitBurst=5

[Service]
ExecStart=/usr/local/bin/midi-request-trigger
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Once the service file is installed, you can run the following to start it:

systemctl daemon-reload
systemctl start midi-request-trigger.service

On MacOS, you can setup a Launch Agent in ~/Library/LaunchAgents/com.mrgeckosmedia.midi-request-trigger.plist as follows:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.mrgeckosmedia.midi-request-trigger</string>
	<key>ProgramArguments</key>
	<array>
		<string>/path/to/bin/midi-request-trigger</string>
        <string>-c</string>
        <string>/path/to/config.yaml</string>
	</array>
	<key>KeepAlive</key>
	<dict>
		<key>Crashed</key>
		<true/>
		<key>SuccessfulExit</key>
		<false/>
	</dict>
	<key>RunAtLoad</key>
	<true/>
    <key>OnDemand</key>
    <false/>
</dict>
</plist>

Start with:

launchctl load ~/Library/LaunchAgents/com.mrgeckosmedia.midi-request-trigger.plist

Check status with:

launchctl list com.mrgeckosmedia.midi-request-trigger

Stop with:

launchctl unload ~/Library/LaunchAgents/com.mrgeckosmedia.midi-request-trigger.plist

Config

The default configuration paths are:

  • ./config.yaml - A file in the current working directory.
  • ~/.config/midi-request-trigger/config.yaml - A file in your home directory's config path.
  • /etc/midi-request-trigger/config.yaml - A file in the etc config folder.

To verify listener works

You can find the device name by running the following:

midi-request-trigger -l

On MacOS, there is an IAC Driver that can be enabled in Audio MIDI Setup.

---
midi_routers:
  - name: service_notifications
    device: IAC Driver Bus 1
    debug_listener: true

Example note trigger configuration

---
midi_routers:
  - name: service_notifications
    device: IAC Driver Bus 1
    debug_listener: true
    note_triggers:
      - channel: 0
        note: 0
        match_all_velocities: true
        url: http://example.com
        midi_info_in_request: true

Example request trigger configuration

---
midi_routers:
  - name: service_notifications
    device: IAC Driver Bus 1
    debug_listener: true
    request_triggers:
      - channel: 0
        note: 0
        velocity: 1
        midi_info_in_request: true
        uri: /send_note

Example multi part request

---
midi_routers:
  - name: service_notifications
    device: IAC Driver Bus 1
    debug_listener: true
    note_triggers:
      - channel: 0
        note: 0
        match_all_velocities: true
        url: http://example.com
        method: POST
        body: |
          -----------------------------888832887744
          Content-Disposition: form-data; name="message"

          example variable
          -----------------------------888832887744
          Content-Disposition: form-data; name="file"; filename="example.txt"
          Content-Type: text/plain

          Content of file.

          -----------------------------888832887744--          
        headers:
          Content-Type:
            - multipart/form-data; boundary=---------------------------888832887744
        debug_request: true