Rappresentazione della musica

Idealmente, il formato di input per qualsiasi sistema di formattazione ad alto livello consiste in una descrizione astratta del contenuto da formattare, che nel nostro caso è la musica stessa. La questione solleva un problema formidabile: in che modo possiamo definire che cos’è davvero la musica? Anziché tentare di trovare una risposta, abbiamo rovesciato la domanda. Scriviamo un programma in grado di produrre spartiti e rendiamone il formato il più snello possibile: quando non potremo ridurlo ulteriormente, ci ritroveremo per definizione con il contenuto in sé. Il nostro programma, dunque, serve a definire la forma di un contenuto musicale.

Anche la sintassi è un aspetto dell’interfaccia utente di LilyPond, quindi è semplice da scrivere:

{
  c'4 d'8
}

crea un do centrale da un quarto (C1) e un re da un’ottavo immediatamente sopra il do centrale (D1).

[image of music]

A scala microscopica, una sintassi simile si adopera facilmente. A una scala più larga, però, anche la sintassi ha bisogno di una struttura. In quale altro modo, altrimenti, sarebbe possibile scrivere brani complessi come sinfonie e opere liriche? La struttura è formata dal concetto di espressioni musicali: combinando minuscoli frammenti di musica in frammenti più consistenti, possiamo esprimere musica più complessa. Per esempio

f'4

[image of music]

Possiamo costruire note simultanee racchiudendole tra << e >>:

<<c4 d4 e4>>

[image of music]

Possiamo mettere in sequenza queste due espressioni racchiudendole tra parentesi graffe { … }:

{ f4 <<c4 d4 e4>> }

[image of music]

Anche quella qui sopra è un’espressione, perciò può essere ulteriormente combinata con un’altra espressione simultanea (una minima, in questo caso): <<, \\, e >>:

<< g2 \\ { f4 <<c4 d4 e4>> } >>

[image of music]

Strutture ricorsive come quelle appena esaminate possono essere specificate in modo pulito e formale in una grammatica indipendente dal contesto, la quale genera anche il codice di analisi. In altre parole, la sintassi di LilyPond è definita in modo chiaro e privo di ambiguità

Interfacce utente e sintassi sono gli elementi immediatamente visibili agli utenti e quelli con cui essi hanno più a che fare. Un po’ sono una questione di gusto, un po’ l’argomento di molte discussioni: non troppo produttive, però, nonostante qualche pregio ce l’abbiano. Nel quadro più ampio di LilyPond, la sintassi di input non è molto importante: inventare una sintassi pulita è facile; molto più difficile, invece, è scrivere un codice di formattazione decente. Contiamo le righe di codice destinate ai due componenti e troveremo la conferma di quanto abbiamo appena affermato: analisi e rappresentazione occupano meno del 10% del codice sorgente.

Nel progettare le strutture usate in LilyPond, abbiamo preso decisioni diverse da quelle che appaiono in altri programmi. Considerate la natura gerarchica della notazione musicale:

[image of music]

In questo caso, abbiamo altezze raggruppate in accordi che appartengono alle misure, le quali appartengono ai righi. La cosa assomiglia a una struttura ordinata di scatole annidate:

nestedboxes

Purtroppo, la struttura è ordinata perché si basa su alcuni presupposti troppo restrittivi, il che diventa evidente considerando un esempio musicale più complesso:

[image of music]

In quest’esempio, i righi si interrompono arbitrariamente, le voci saltano dall’uno all’altro e su ciascun pentagramma c’è un’indicazione di tempo diversa. Molti programmi avrebbero del filo da torcere per riprodurlo, proprio perché costruiti con una struttura a scatole annidate. Con LilyPond, d’altronde, abbiamo cercato di mantenere formato di input e struttura il più possibile flessibili.


Saggio sull’incisione musicale automatizzata v2.25.21 (ramo di sviluppo).