Well, I have described only the trade-offs … I only wonder it might have been a mistake to use the same structure for two things:
- node ordering
- message dispatching
But anyway, this is where we are with scsynth, and the only solid alternative is to do the work on the sclang side. So yes, node bookkeeping is the only way, even at a performance cost (for dense grain clouds it doubles).

So I think you’re left with:
- Enforce a minimum wait time for successive cut triggers. (5 cut groups freeing within 8 ms shouldn’t be too bad.)
- Or use a group matrix.
- Or track node IDs belonging to cut groups.
- Or uses buses as scztt suggests.
Thanks, this is a good overview.
- spreading out the message timing is something I tried, it can become a little tedious, too. But it is an option, using a PriorityQueue.
- a full group matrix would be too large
- tracking nodeIDs is a performance penalty, but works
- buses will make the problem less probable, but essentially shifts it only a bit. Still, no control can have two values per block. Audio rate buses would be safer, but still you could have rare cases of hanging notes.
unless someone comes with a smart trick – ugen commands maybe?