MIDI polychain / round robin

Hello,

I’ breaking my brain trying to find a way to implement MIDI ‘polychain’ on the BomeBox.

In the most basic form, this would consist of a piano-style MIDI controller, and 4 monophonic synths, set to receive on MIDI channels 1, 2, 3 and 4.

I would like to play 4 note chords on the MIDI keyboard, and have the 4 mono synths play this chord ‘polyphonically’.

Can anybody point me in the right direction to get started?

Thanks!

Hi and welcome back!

Do you have a strategy on which synth is to play which note of a given chord?
I.E

Lowest Note - Synth1
Next to Lowest Note - Synth 2
Next to Highest Note - Synth 3
Highest Note - Synth 4

Of course, there would need to be a slight delay to determine if it is chord or a single note. Players often hit chords without precise synchronization. Once the chord is evaluated then we could channel to a destination depending on the strategy.

Then the synths would need to output to a mixer to for the final mix of sounds that you want.

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz If it is not a chord, what do you want to do with the note? If it is a partial chord (ie 2 or 3 notes), what do you want done?

For my purposes, it doesn’t really matter which synth plays which note.
I’m trying to play my Nord Drum 3P as a polysynth. It has 6 voices, on MIDI channel 1-6.
I guess what I’m after is for each consecutive note i play, to cycle through MIDI channels 1 through 6.

This is not 100% tested but should get you started.

On note-on we allocate a given note number to a MIDI channel. We store the note number and MIDI channel for the note on in g0-g5 so that later we can look it up and determine what channel to send the note-off message for a given note. We rotate the output to MIDI CH 1-5 and send the note on. This is done in translator 1.0.

// outgoing channel in ga and will rotate
// Put outgoing channel in upper byte
rr=ga<<8
if ga==0 then g0=pp
if ga==1 then g1=pp|rr
if ga==2 then g2=pp|rr
if ga==3 then g3=pp|rr
if ga==4 then g4=pp|rr
if ga==5 then g5=pp|rr
// Capture note and channel for display
ss=pp|rr

Log "Log Note-On MIDI Channel %ga%=0x%02x ss%"

oo=ga
// Next MIDI Channel
ga=ga+1
// Only up to MIDI CH 6
if ga>5 then ga=0

Then in translator 1.1 we look for a note-off. We look up the MIDI channel that the note-on was sent and send the note off on that MIDI channel.

// Look up note channel in g0-g5
rr=0
uu=-1
Label "LookUp"
if rr==0 then tt=g0
if rr==1 then tt=g1
if rr==2 then tt=g2
if rr==3 then tt=g3
if rr==4 then tt=g4
if rr==5 then tt=g5
// MIDI channel in tt
uu=tt>>8
// Note in vv
vv=tt&255

if pp==vv then oo=uu
// We found it so break out of the loop
if pp==vv then skip next 2 rules
rr=rr+1
if rr<6 then Goto "Lookup"

// oo should now how the proper note-of channel

Log "Log Midi Channel for note %pp% is %uu%"


Here is the project file. Again, not fully tested. I imagine if you for some reason send the same note for multiple MIDI channels there may be some problems as we do not check if the note is already allocated for a given MIDI channel.

Polychain-Rotate-2024-04-04.bmtp (3.0 KB)

Steve Caldwell
Bome Customer Care


Also available for paid consulting services: bome@sniz.biz

Amazing, it worked first try! :smiley:
Thanks so much, Steve

1 Like