I have an idea to make this compatible with ANY soundpack:
Have the first parameter be a sound datablock list (like the playSound event) which acts as the "base" for the scale. The numbers would then be an offset from that point. I believe the script-activated %brick.playSound() function can take a number as well as a string but I'm not sure. This would allow someone to pick the instrument they want to use as the "piano" by simply selecting the first sound in the set. This is just a theory but if you could make it work, that would be awesome.
Also, I think you should just adopt a prefix system instead of having specific delays for the - character:
• f# - decreases delay (song gets faster) by # milliseconds with a total lower bound of 100ms/note
• s# - increases delay (song gets slower) by # milliseconds with a total upper bound of 30000ms/note
• r# - tempo-based rest, does not play a note for # multiples of current delay
• -# - absolute rest, does not play a note for # milliseconds
Overall, I think this is a pretty neat idea which, with some work, could be very useful for cutting down on events for things like custom music sequences.