Diseñando software de notación musical: como no hacerlo

Sería agradable si al software de notación musical no se le tuviera que tomar la mano para que produzca un resultado aceptable. Nuestra meta con LilyPond fué la de escribir tal sistema: un programa que produzca bella música ("grabado") de forma automática.

A primera vista, la notación musical sigue un patrón jerárquico bastante directo. Considere el ejemplo que aparece abajo, con dos sistemas conteniendo dos compases.

¿No es la escritura de software el encontrar las jerarquías y modelar el mundo real en términos de árboles? Desde el punto de vista de un programador ingenuo, el fragmento de arriba, se podría abstraer fácilmente a una serie de cajas anidadas.

Es fácil seguir este modelo cuando se está escribiendo software. Es bastante obvia la manera en que se podría guardar esta información en memoria, y cuán sencillo el guardarla en un archivo en el disco duro. En un archivo de tipo XML, podría escribir algo como:
  <score>
    <staff>
      <measure id="1">
         <chord length="1/2">
	   <pitch name="c">
         </chord>
         <chord>
	 
	 ....
      </measure>
    </staff>
  </score>

De forma muy simple, este modelo es obvio, simple y nítido. Este es el formato que mucho software sigue. Desafortunadamente, es erróneo. La repsresentación jerárquica funciona para música sencilla, pero fracasará con un uso más avanzado. Considere el ejemplo siguiente:

En este ejemplo, varios supuestos del modelo anterior se violan: los sistemas inician y acaban a voluntad, las voces brincan entre sistemas y a veces abarcan los dos sistemas.

La notación musical es completamente diferente de la música en sí. La notación es un lenguaje intrincado de diagramas simbólicos para visualizar un concepto mucho más simple. Por lo tanto, el software debería reflejar tal separación.

Siguiente: Dividir y conquistar, un esquema para la notación automatizada