Instead of changing the recursion inside my "next" abstraction, I changed the fact that its output of the requested scalar was what triggered the search for the next one... an external [until] object now triggers it to find each scalar. A bang message is sent to the "next" object first, to avoid an empty pointer error, and then until sends the "next" message. The bang from the pointer at the end of the list turns it off. The recursion inside the "next" abstraction is only ever as deep as the number of scalars before the next requested scalar, which apparently isn't enough to cause an error for most things.
But I don't understand why the attached patch doesn't work. Using my recursive patch, I get no "empty pointer" errors, no matter what I do in the program, from the abstraction. However, this [until] version freezes my system, and the only way that would seem to be possible is if a "next" message were sent without a "bang" message having been sent first.
Actually, playback works fine; it is when the patch steps through the score all at once, to transpose all notes, that I run into overflow errors. I'll try deleting all the beat lines and see if it works that way, and if so then your solution might work.
-Chuckk