Whether two OUTPUT endpoints address the same legs — each role present in either maps to the
same port, so a mono {L:x} differs from {R:x} and from {L:x, R:y}. Iterates
CHANNEL_ROLE_ORDER, never two fixed fields: a hand-written a.L === b.L && a.R === b.R
stops seeing the difference the day a surround role is added, and it had grown FOUR copies
(the engine, both patch doors, the row) before this one.
Whether two OUTPUT endpoints address the same legs — each role present in either maps to the same port, so a mono
{L:x}differs from{R:x}and from{L:x, R:y}. Iterates CHANNEL_ROLE_ORDER, never two fixed fields: a hand-writtena.L === b.L && a.R === b.Rstops seeing the difference the day a surround role is added, and it had grown FOUR copies (the engine, both patch doors, the row) before this one.