The Sonic is duophonic and you can have gliss on only one oscillator giving a really nice fat sound, almost like the Toto Oberheim brass thing in a lead sound. Having that be poly could be pretty weird.
This gives me an idea: @brad: could you expand this a bit with a “Unison mode”? This means: as long as only one note is played, the same note is sent to ALL selected output channels; when multiple notes come into play, notes get divided up; maybe with “top to bottom” or “bottom to top” priority.
This would be a blast for more realistic brass sections and “single note unison” - somewhat like what NIs Session Horns is doing internally…
The only complexity about this mode would be that if you hold one mono note for a brass section (all four instruments playing unisono) and then stack another one, you’d need to steal one from the currently held notes, send a note-off and a new note on for that instrument. Once you add another one, you’d need to (depending on priority) re-shuffle the active notes again, so the trombone doesn’t cross above the trumpet.
Not unsurmountable, but a bit more complex than just a round-robbin polyphony algorithm…
@Torsten EXACTLY! Brass, strings, woodwinds … Although one can do a lot with split keyboards, I was thinking of a mixed WW quartet. Bassoon, Clarinet, Oboe, Flute. Or a better version of Cello, Viola, V2, V1, or Bari, Tenor, Alto saxes, etc.
I had a record producer tell me he loved the “As Tears Go By” string sounds. Can mostly simulate it with splits, but with THIS!!!
Would it need special logic to handle playing a single note at a time, but where there’s a small overlap where two consecutive notes are held because you just happen to be playing legato. In that case wouldn’t you wane all target channels to play that one note. I guess there’d need to be some time threshold - which makes it more difficult since the MIDI filter mechanism can’t currently generate events at arbitrary times - only in response to an incoming event.
The current algorithm isn’t round-robin, it’s: least recently used inactive channel and if all are active steal from the least recently used active channel. (ie: it’s already doing the note stealing and sending the required note off events). Not sure I fully understand how the top-to-bottom/bottom-to-top logic should work.
“so the trombone doesn’t cross above the trumpet”. Does this mean it needs special knowledge about each channels and/or the assignment logic varies channel by channel?
Hmmm, interesting! But difficult to implement without latency, methinks. How should Cantabile know at the moment of Note-on - you’d have to buffer and wait for the “legato window” to end. Not sure if this is worth the pain…
My idea would be: in any “multitimbral” situation (when it arises due to an additional note-on or a joint note-on (chord)), notes are distributed across the available MIDI channels sorted by note number (channel 1 gets lowest, channel 4 gets highest - for my 4-piece brass section). Top-to-bottom for unison means that in case of only two notes played, the higher note gets played by channels 2-4, the lower note by channel 1. Bottom-to-top would mean that for two notes, channels 1-3 get the lower note, channel 4 the higher note.
When adding another note on top of the two notes, this means re-shuffling the notes in bottom-to-top mode, because now channel 4 plays the new higher note, channel 3 gets the note previously held by channel 4, and the other two channels stay as they are. In top-to-bottom-mode, channels 1 and 2 take over the new note, channel 3 stays on the previous higher (now middle) note, channel 4 stays on the lowest note.
Overall, this means that channel 4 always has the highest, channel 1 always has the lowest note (so the trumpet never crosses below the trombone), but the assignment of the notes in between and the necessity of notes being stopped and retriggered on a new channel changes.
So no need for individual channel assignment logic, just allocation of voices to MIDI channels along their key number (and the need to re-allocate / re-trigger voices when new notes get added to a chord).
P.S.: we could also discuss a third mode “equal distribution” - the algorithm tries to distribute the notes evenly, so for four voices and two notes, both upper and lower note get two channels. Same with three notes and five / six instruments (for five: two for highest, two for lowest, one in between?), and so on… Easy to go completely wild with divisi assignment
I had the exact same dream when I saw @Brad’s post about this new filter.
Smart splitting chord voices into different midi channels to feed monophonic section instruments (Strings or brass) (did I say Swam?)
But yes, it needs f…ing tricky algorithms!
Sorting notes by pitch, retriggering and redistributing channels when adding voices, etc… you spotted this.
I don’t think a unique algorithm could face any playing situation. (chords playing,legato, etc…)
The player should choose among different options and adapt his paying to a particular technique.
Polyphonic legato is rocket science!
And yes, latency.
We have to measure time here. (Are those keys pressed “almost” simultaneously to be treated as a chord?.. what is the threshold of “almost”?.. Legato detection is also a time measurement)
Since KSP coders manage to do some of those things in Kontakt, can the dream come true in Cantabile?
OK, so I think the biggest barrier to implementing this as a MIDI filter is the time based aspect of overlapping notes and I don’t think it’s worth adding this to Cantabile’s filter framework for this one case - probably better implemented as a MIDI plugin.