MIDI tunneling through BGP, for times when you want to broadcast your music instead of your IP packets.
The GoBGP library we use does not support customizing peer TCP port. Thus, you are stuck with port 179 and would (in most cases) need root privilege to listen on that port.
Instrument (MIDI sender) side:
sudo bgpiano-send --bgp-port=179 --bgp-peer-ip=<peer-ip>
Synthesizer (MIDI receiver) side:
sudo bgpiano-recv --bgp-port=179 --bgp-peer-ip=<peer-ip>
Reflector side: gobgp
or equivalent software required. Any RFC-compliant BGP daemon configured as an RR or RS can be
used.
sudo gobgpd --log-plain --config-file=contrib/rr-gobgp/gobgpd.toml
Instrument (MIDI sender) side:
bgpiano-send --bgp-peer-ip=<reflector-ip>
Synthesizer (MIDI receiver) side:
bgpiano-recv --bgp-peer-ip=<reflector-ip>
There are some utility programs for debugging your BGP and MIDI sessions. These can run independently and helped a lot during the development process.
bgpcat
: Connects to a BGP daemon and prints a stream of received routes.midils
: Lists all the MIDI input and output ports (devices) on your computer.miditail
: Connects to a MIDI input port and prints a stream of received messaged, both in HEX and decoded form.midipipe
: Receives MIDI messages from multiple input ports and sends them to multiple output ports.
Go 1.18 or higher is required.
Requirements:
$GOPATH
environment variable is set$GOBIN
is in$PATH
- GCC is installed (for CGO)
- Dependencies:
libasound2-dev
go install github.com/goreleaser/goreleaser@latest
goreleaser build --single-target --snapshot --rm-dist -f contrib/goreleaser/goreleaser.linux.yaml
Notes:
- Check PIE:
checksec --dir=dist
(should be all green)
GoBGP does not support Windows officially. But don't worry! We understand music production is hard under Linux and you might have connected all your instruments to your Windows computer. This project equally supports Windows. (Actually, most of the development work is done under Windows.)
The only thing you need is a little hack on the GoBGP library:
cd ..
git clone https://github.com/osrg/gobgp.git
cd gobgp
git apply ..\bgpiano\contrib\windows\gobgp-windows.patch
cd ..\bgpiano
cp contrib\windows\_go.work go.work
go install github.com/goreleaser/goreleaser@latest
goreleaser build --snapshot --rm-dist --single-target -f .\contrib\goreleaser\goreleaser.windows.yaml
There is a trend that Chinese BGP players1 misuse 广播 (lit. broadcasting) in the meaning of 宣告 (lit. announcement). As a terminology fundamentalist and one of the earliest BGP players, I hate this incorrect usage of word to the bone. However, this wrong terminology is now widespread, so I decided to fix it the other way around, by literally broadcasting a piece of music across the Internet, through the BGP RIB.
The MIDI message is encoded in either extended community or large community. See protocol.md for details.
Yes, but unless you programmatically play something violent like 最終鬼畜妹フランドール・S, a modern router should handle it pretty easily.
For BGP propagation latency across the globe, The speed of BGP network propagation by Ben Cox already provided an excellent overview.
On the topic of latency deviation, due to how BGP routes are received and updated, there are no guarantee that any individual note will arrive on time. Why not have some Jazz instead?
Footnotes
-
slang for public ASN owners who use the ASN only for education, research and zhuangbility. ↩