Thank you everyone for the info. Lilypond sounds totally awesome.
Just a little more background because there may be folks here with insight on these things (PM if not appropriate for the forum): One of my major goals is to generate musical material with an object-oriented representation of musical concepts allowing textures or whole compositions to be generated algorithmically. I wanted to create my own object-oriented music world instead of learning an existing library or software (partly because I want it to be "mine" and partly because I want to get more into software development). I realized I would need a way to convert that world into interoperable formats, the main options that seemed apparent to me were MIDI and MusicXML.
I chose to go with MusicXML and decided to implement my own strong binding of MusicXML. That was about a year ago and I've implemented about 70% of the MusicXML specification, but it is extremely slow going and difficult. XSD is hard enough to learn when we're talking about simple database schemas, and the complexity of the MusicXML specification absolutely blows my mind. (Note I don't think auto-generated strong-binding really works here because the specification is so difficult that the output of the auto-schema-strong-binding would be as difficult to use as the XSD is to read. I could be wrong about this...)
I'm starting to wonder if I should just skip it and learn Lilypond instead, thus my object-oriented world could output Lilypond code instead of MusicXML.
Alas I have to make a score or two the old fashioned way before I allow myself to indulge further on this larger goal.