In those situations, you can bind your own input events.
Here is an example similar to the one in the last post except that only the notes C, E, and G are transposed
require "micromidi"
@input = UniMIDI::Input.use(:first)
@output = UniMIDI::Output.use(:first)
MIDI.using(@input, @output) do
thru_except :note
receive :note do |message|
message.octave += 1 if %w{C E G}.include?(message.note_name)
output message
end
join
end
For the sake of expressiveness, there are many permutations of each of these methods. I recommend reading the rdoc for the MicroMIDI Instructions classes to get a handle on what's possible.
http://github.com/arirusso/micromidi
Next: Shorthand with MicroMIDI