Development update (January 27)
Just merged the branch for a "command cleanup" sprint. This was mostly an internal cleanup with just a few user visible changes.
Now some sequences of commands are merged into a single command.
Every time you make a change to the project, a command is issues for it and (in broad terms) this command is appened to the "undo list". Turning a dial could produce dozens if not hundreds of separate commands, and an 'undo' would undo each of those one at a time.
Now new commands might get merged into the previous command, so a sequence of many control value changes is collapsed into a single change. And 'undo' will undo all those changes in one step.
It is also possible again to set the pitch for the note events produced by a beat track. That got lost in some previous refactoring.
The major part of the sprint was to cleanup the commands, which are internally used by the UI to
modify the opened project. Initially I used very fine grained commands, e.g. a dedicated command
SetClef to change the clef of a measure. The whole thing grew quite organically and I never
developed a consistend scheme.
Now I changed that to a basic CRUD
scheme, i.e. most commands are
DeleteFoo (ok, it's really
CUD, but whatever). And instead of
separate commands to change the various properties of an object (like the
above), there is now just a single
UpdateFoo command, and which property should be changed is
determined by the presence of specific fields in that command (which are just protocol buffer
While doing those changes I also got tired of typing names like
PipelineGraphNode. Given the
central role, which the graph and the nodes therein should now play, I renamed those to the much
And some minor cleanups: simplify the API of the
Command class, add factory functions for all
command protos (for some more type safety).