In Thinking Like a Designer I outlined the plan for creating a new music program. But I forgot to do something that a good designer should always do: determine whether it’s a problem that needs to be solved. And in this case, it has been solved many times before. Each solution has its ups and downs (Overture has MIDI heartburn, Finale makes the Easy Things Hard, Denemo is open source but very unstable). But all of them (ab)use MIDI. So to make a musical Wiki system, my real goal, it seems that MIDI is the way to go, because then each author could use the program that he is most comfortable with.
However, each program mangles any MIDI it edits into the kind of MIDI that it likes. Some programs specify dynamics by Controller 7 (volume) (Overture), others by velocity (Finale). Some programs mark time signature, others don’t. Some programs insert tempo changes all over the place to indicate “inflection”. So we can’t just give them the MIDI to edit and but it back verbatim. We have to make all these programs play nicely together.
You do this by separating out each thing that varies and putting them in layers of the same file. Every program uses notes pretty well (some of them quantize, which is a pain). That will be the first layer. Another layer would be pedal, another layer tempo, etc. Then when someone goes to edit the file, they checkbox which layers they want to be put together for editing, and then when they upload, they checkbox which layers they changed. A backend pulls these apart and puts them together, hopefully keeping things that were logically unchanged (even if the program mangled them) unchanged. To handle the volume/velocity problem, we just normalize to one or the other.