Posted May 21, 2018
![avatar](http://images.gog.com/b13211519e73aa06f8273a50b02964660502da1a057e7466ad747d57469678b9_avm.jpg)
With that said, I think a good first filter would be something like a simple transposition; just add or subtract a number from all the note values. (For example, if I subtract 2, whatever notes I play would sound a whole step lower, just like on a (Bb) clarinet or trumpet.)
![avatar](http://images.gog.com/9eebfb6d8953e038caf6c565d058005989c120e47e0a312acfae08f7a5c95e11_avm.jpg)
* It is possible to create virtual MIDI ports. These ports can be accessed by other programs on the system (I haven't checked to see if they need to be running as the same user). Hence, if a DAW can take input from a MIDI device, it can take input from a virtual MIDI device created by my program.
* It is possible, using aconnect, to connect MIDI ports to each other. This isn't necessarily a 1:1 mapping, so I can connect the keyboard to both timidity (a software synth) and another program that records it at the same time. I could also choose to connect the keyboard to my program's input, and my program's output to timidity.
So, I can easily connect devices and programs together without too much trouble. This does really feel a lot like UNIX pipes, which allow connecting the standard output of one program to the standard input of another, and given that UNIX pipes are very useful, this whole MIDI routing should also be similarly useful.
(Also, there's nothing preventing me from making a program to send MIDI messages over the network.)