As 2024 winds down, Happy New Year to the Midihub community!
Here’s the scenario: I want to play keyboard A on midi channel 1, but during the performance, I want “active” or “held” notes on keyboard B to select any corresponding “note on” events within the keyboard A performance to be rechannelized to midi channel 2, and only those notes, while all other “note on” events in the keyboard A performance will remain on channel 1.
This way, chords held on keyboard B (but not heard), could then cause corresponding notes from the keyboard A performance to be redirected into radically different timbres. This would open up some exciting and unpredictable interactive musical possibilities.
I wonder if this kind of behavior could be programed into Midihub?
Referring to any given note number x, the desired rule set would be:
(1) On keyboard B, if x is currently being held ----then—> when x is played on keyboard A, assign the keyboard A “note on” event with its velocity unchanged to midi channel 2 for output.
(2) All notes only played on keyboard A remain unchanged (i.e., these notes are output, velocity unchanged, on midi channel 1).
(3) Always send all “note off” events from the keyboard A performance to both midi channel 1 and midi channel 2, so there can never be a stuck note.
(4) All pitch bend and mod wheel midi CC events are always transmitted on both midi channel 1 and to midi channel 2.
Finally, for clarification, “note on” and “note off” events from the keyboard B “performance” would never be sent to any output, since the only purpose of notes held in the keyboard B “performance” would be to selectively rechannelize the keyboard A performance.
If anyone can see a way to achieve this behavior with Midihub, I would be eternally grateful!
For creating the program, assume that keyboard A is connected to DIN midi in A, and keyboard B is connected to DIN midi in B, and that both keyboards are transmitting on channel 1. Lastly, it would be desirable for the resultant output to be assigned to the USB output port in order to play softsynths.
Thank you for any and all help in solving this puzzle!
(From your precise –and pretty exhaustive – details of the design it looks like you’ve already anticipated the possible Note Off pitfalls/complications, etc)
If it’s the former, I think I would
start with a MIDI B → Dispatcher → … → Virtual H pipeline.
This line would use Transforms to set single-note ranges for a bunch of “Note Selection” Transforms in some MIDI A IN pipeline(s) elsewhere in the patch.
It would also create two (Ch1&2) Note Offs to be sent to USB A OUT
Thus, this type of solution would make extensive use of Virtual Mappings. (It could also take advantage of Transform’s new ability to set a CC# from Dispatcher’s output channel#, using just one Transform to create a distinct CC for each chord note)
a couple of extra constraints would be useful to know:
is there a maximum number of held “B-keys”?
is there an end of the keyboard that remains unused? (being able to use note #0 or #127, for example, would help tell the “Note Selection” Transforms to “do nothing” when all “B-keys” are up)
Hey resonotter, thanks so much for all your amazing help with this!
You have my eternal gratitude. I truly appreciate your knowledge for solving this problem. You’re super awesome!
I will be able to start testing this over the next week and I will post back.
All the best to you in 2025!
…I’ve just been testing with a GM piano on Ch1 & cheesy Tremolo Strings on ch2 (with an UpDown arp just for visual clarity ) and it still sounds interesting!
Nice idea.
I’ll post it up on PatchStorage later as good VM example.
(Watch this space)
This preset uses the notes held on one (silent) input and uses them to change the channel of the same note numbers when they are played on the main input:
This is version I would choose as I might be using Virtual H elsewhere as part of a more complex patch. (I find keeping mappings in a bunch on one channel helps me not trip up later down the line)
It would be possible to have more, actually!
PS. I tested with the most boring input possible to make the graphics easy to follow. Would be interesting to hear sounds from more creative input from @MIDIman or anyone else…
Hi resonotter,
Awesome work! You’ve really developed the concept a lot. I look forward to diving in, but it’s getting late for me to do so tonight.
However, I have one observation. In your latest post you wrote:
This didn’t make sense to me, because the keyboard B player is not the player who is in command of timing. The keyboard B player is the “throw the mix for a loop” player who might just be randomly mashing on the keys.
So, in how I envision this working, the note off commands from the keyboard B “performance” should never be allowed to affect the length of notes in the output. The note off commands from keyboard B should only serve to cancel the duration of silent notes held which define rechannelization of the keyboard A performance.
To reflect this desired usage, for my testing I will change the third pipeline to begin with input A instead. That way, note off commands from midi A will be sent to both channels to prevent hanging notes.