Channel Rotation with "Play all voices" option?

kev

2020-06-03 20:44:12

Hi! I'm trying to modify the channel rotation example shown here:

https://www.bomeloft.com/support/kb/channel-rotation

I'm mainly interested in the note on and off, but basically instead of a single channel per note, I'd like to have all channels play at all times with voice stealing and distribution spread across how many notes are held down simultaneously. I got the idea from a eurorack midi to cv converter, the expert sleepers FH-2. In the manual, the Unison mode is describes like this:

"All voices are always used. For example, in a 4 voice polyphonic converter, playing one note will play that note on all 4 voices. Playing 2 notes will play those notes on 2 voices each."

Would you be able to point me in the right direction to modify the channel rotation preset to function in this way? I figure there needs to be rules set up for channel allocation as well as voice stealing. Or would it just be easier to create a new preset from scratch?

Thanks!

Kevin

Steve-Bome Forum Moderator

2020-06-03 21:56:12

Hi Kevin,

If you are talking about broadcasting 4 different MIDI Channels, this is quite possible, in fact I can probably do it with a single translator.   As far as "voices", I suppose you are assuming that each channel carries a separate voice which is not always required. MT Pro can handle various MIDI channels but if there is more than 1 voice per channel, that is more of a function of how the synth or DAW processes that MIDI channel.

I'm not sure how you would want to implement "voice stealing", we could certainly turn on or off a different number of channels depending on how many notes are held down (which is a bit more difficult but possible).  I'm just not sure how "stealing" would work and to what MIDI channel and priority you would want to allocate the switching or distribution of channels.

Would you want something like

1 Note played - Send to MIDI CH 1 only

2 Notes played - Send to MIDI CH 1 and 2

3 Notes played - Send to MIDI CH 1, 2, and 3

4 Notes played - Send to MIDI CH 1-4

 

Also, say you are playing 1 note (going to MIDI CH 1) and then you push down the second note.  What do you want done with the first note?  Do you want it to replay on MIDI CH 2 (much more complex) or just have the first note on MIDI CH 1 and the second note on MIDI CH 1 and 2? If you want the first note played also to play on MIDI CH2, what velocity would you assign it on MIDI CH2.  If we were to do that, we would have to remember all notes played so that we could replay them every time we turn on another MIDI Channel.

The way I would recommend you do this is to create a bitmap of all notes and keep them in local variables.  Say on an 88 key device you would need 88/32  or 3 global variables (32 bits per variable).  On each note on you would set a bit to a 1 and for each note off, you set it to a zero.  As you turn on a second note, you would need to iterate through the current bits that are on and output those as notes again in addition to playing the new note.

Does this all make sense?

 

Steve Caldwell
Bome Q and A Moderator and
Independent Bome Consultant/Specialist
bome@sniz.biz

 

kev

2020-06-03 22:47:10

Thanks Steve! I think the functionality that I\'d want to have is simpler than what you describe. The incoming polyphonic midi would be on a single channel, but the outgoing midi would be spread across multiple channels with just single notes outputted per channel.

For example, with midi coming in on channel 1 with 4 channel/voice maximum:

1 note played - Send note 1 to Midi ch 1, 2, 3, 4

2 notes played - Send note 1 to Midi ch 1 and ch 2, send note 2 to Midi channel 3 and ch 4. (or maybe 1 and 3, 2 and 4)

3 notes played - Send note 1 to Midi ch 1, Send note 2 to midi channel 2, Send note 3 to ch 3 and ch 4. (the odd division of notes vs channels might be trickier)

4 notes played - Send note 1 to ch 1, note 2 to ch 2, note 3 to ch 3, note 4 to ch 4.

Each channel would only receive one midi note, and voices would be stolen as more simultaneous notes are introduced and evenly distributed across all available channels. And if there are more notes than channels, voices would be stolen from the beginning of the line.

As a bonus, it would be great that if I\'m playing 4 notes spread across 4 midi channels, that if I release 3 of them, that the the remaining note would then play across all 4 channels again. But if that complicates things then I\'m happy to have it so that if channels are stolen from a note, that it doesn\'t get it back.

Does this clarification change how you think I should approach this? There might not be any need to be storing note information? Thanks Steve!

 

Kevin

Steve-Bome Forum Moderator

2020-06-04 02:09:38

Well I'm not sure if this is perfect, but it should be pretty close.  I elected to save time and use multiple translators.

Basically we count the number of currently pressed notes with the first 2 translators.  We increment the count at note-on and decrement the count at note off. We do not allow more than 4 notes.

Then we have 4 translators to handle note routing depending on current number of notes pressed. I use raw MIDI to multiple channels to save having to do more translators.

Finally a translator to handle note-off.  I also set any non playing notes to 0 so a note-off with a currently non playing note will actually send note-off note 0.

I use the global variables g1-g4 for currently playing note number (0 if not playing). I use h1-h4 for their velocities.  I use the global variable ga to maintain the note count.

 

Enjoy!

 

Steve Caldwell
Bome Q and A Moderator and
Independent Bome Consultant/Specialist
bome@sniz.biz


Attachments:

Channel Spread.bmtp

kev

2020-06-04 17:03:59

Thanks so much for this Steve! This is so cool!

I want to try to make a tweak to ensure note off messages are being sent properly if you can give me some guidance. I'm experiencing stuck notes, but as far as I can see, the translators are there. Are you experiencing any stuck notes? I'm wondering if it's just on my end. Thanks so much for your help as always!

 

Kevin

Steve-Bome Forum Moderator

2020-06-04 17:10:40

Yes, I really didn't spend much time on resolving note-off messages for stuck notes.  Somehow you need to ensure that you track any note-on messages (and on which channels) and make sure at the appropriate time (which I'm not sure what that is), you send a corresponding note off on the correct channel.

I think you will just need to experiment until you get what you want unless you want to pay me for fee based services.  For fee based services, I would need to know the conditions you want to send note-off messages on the various channels.  If worst comes to worst, then I suppose you could just send note-off messages on all available channels as you receive a given note-off message.

 

 

Steve Caldwell
Bome Q and A Moderator and
Independent Bome Consultant/Specialist
bome@sniz.biz