To do multidimensional expansion, for instance, instr1-voice2-yada, make an "instr" abstraction and call it with "instr1". inside the abstraction, call a "voice" abstraction with $1-voice2" as argument. inside the voice abstraction, use "$1-yada" which will then expand to "instr1-voice2-yada". Continue to any depth desired...
Thanks, Miller. This will work if I code the literal "voice2" into the instr abstraction, I think? I wonder if there's a way to make the original plan work, which was to have an abstraction take two args and put them together into one word, "s $1-$2". Otherwise I have to make a "channel1" abstraction, a "channel2",... or maybe I'm missing the point.