I am wondering if there is a simple way to schedule a cloned-message output clause BEFORE the original event, such that the original event is passed through, but always AFTER the output clause event has first passed through. I am hoping to do this with as little delay as possible between the output-clause event and the original event.
Yes, you need to clone the original event too, to change the order, but there is a little bit more to it than that.
For example you want to send a CC before a note on when you play a note:
9X = B0 40 40 +C 9X = XX +C
but this will send the note on twice. To solve this there are two options:
1) easier - block the original note - this only works on an OUTPUT (on right) port because a cloned note is routed directly to the output.
9X = B0 40 40 +C # clone note on to CC 9X = XX +C # clone note on 9X = XX +B # block original note on
2) harder - block the original note via temporary remap - this works on input and output ports but you have to hijack part of the MIDI namespace to do it (I am going to hijack channel 16 in this example) and you need to be more specific with your input clauses:
90 = XF # remap all notes on channel 1 temporarily to channel 16 9F = B0 40 40 +C # clone remapped note on to CC 9F = 90 +C # clone remapped note on to note on 9F = XX +B # block remapped note on
That's the gist of it. If you want to post your real use-case I can probably formulate something a bit more specific for you.
Nic, Thanks for your quick response. I can't say enough how much I LOVE MidiBridge!
Specifically, what I am trying to do is have any given note I play on a MIDI keyboard controller specify its own RPN 14-bit fine-tuning value before the note is sounded. Since I would like to do this with 14-bit precision, I need a way to map the note event onto 2 specific values, one for Data Entry CC #6 (MSB) and another for Data Entry CC #38 (LSB), so I am assuming I might need to have another cloned event to map the note-on event to output clauses for both MSB and LSB values. Is this correct?
I will have my GM sound generator module already prepped for reception of RPN fine tuning commands by sending CC 101 = 0 and CC 100 = 1 in advance, so that I don't have to repeat this infomation with every 14-bit fine-tuning clause(es).
If you have any ideas about the most elegant way to code this in Stream Byter, I would be most appreciative.
As always thanks for creating extremely useful software.
Unfortunately you are going to need to map every note with it's 14 bit tuning value. This is a bit painful. Assuming your controller is on channel 1 (and never sends on channel 16) then this is how you could do it:
# remap channel 1 note on to channel 16 # temporarily so we can order events 91 = 9F
# select nRPN with any note on 9F = B0 64 00 +C 9F = B0 65 00 +C
# .. need 126 more pairs of rules! # with numbers in bold being your MSB/LSB values
# send original note on now 9F = 90 +C
# block remapped note on 9F = XX +B
This is really a tuning table. The H-pi Microtuner module might actually do what you need. If you're adept at editing text files and can use iFunBox to copy files onto your iDevice this might be an option. It uses pitchbend on multiple channels to do it. If you want to explore this, let me know.