@Adam Jones.
Polychaining is not implemented with a “play one note out of n and forward the rest” the way you describe it. It’s the kind of things that are easier to explain with pseudo-code than with words, but I’ll give it a try anyway…
The first unit in the chain (let’s say a chain of 6) has a 6-voices polyphonic voice allocator. It’s really the same gizmo as in a polysynth. It stores a linked list of 6 voices. Each voice has a numeric id ; an active/inactive status ; and the MIDI number of the note currently played. The voices in the list are sorted by least recently use. When you trigger a note, it searches for the least recently inactive voice ; and if not available, steals the least recently active voice. The active/inactive status is updated, and the list is reordered. If the id of the voice that was picked is 0, the note is triggered locally, otherwise, the MIDI note on message goes through.
When you release a key, the master searches for the id of the voice playing this note ; marks the voice as inactive, and moves it at the tail of the list. If the id of the voice that played the note is 0, it also triggers the release phase of the envelopes and marks the voice as inactive. If it is not 0, the MIDI note off message is forwarded.
The second unit in the chain works with the same data structure, but with 5 voices…
The last unit in the chain directly obeys to any note on/note off it receives. It doesn’t even go through the note stack (in normal monophonic mode, there’s a note stack so if you hold C, play E, then release E, it goes back to C).
There’s one more complicated bit: the algorithm tries to reallocate a retriggered note to the same unit that played it previously - so it behaves more like a piano or marimba than a cello (where the same note can be played on different strings). There are heated debates about this voice allocation strategy, let’s not enter into that. People smart enough to rant about those kinds of details will surely know which 6 lines of code to comment to remove this behavior.
So basically, it’s really the same algorithm as in a polysynth, but recursive (if stuff should happen on voice 0, do it locally, if not, forward it to a n-1 voices polysynth). Still, because the first unit in the chain knows the state of the world for the 6 voices, it doesn’t look like a “distributed” thing. Indeed, if you think about it, the voices linked lists are really the same for each unit, with one voice removed at each step in the chain.