[ << Incisione musicale ] | [Top][Contents][Index] | [ Bibliografia >> ] |
[ < Costruzione del software ] | [ Up : Costruzione del software ] | [ Quali simboli incidere? > ] |
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).
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
Possiamo costruire note simultanee racchiudendole tra
<<
e >>
:
<<c4 d4 e4>>
Possiamo mettere in sequenza queste due espressioni racchiudendole tra
parentesi graffe { … }
:
{ f4 <<c4 d4 e4>> }
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>> } >>
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:
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:
Purtroppo, la struttura è ordinata perché si basa su alcuni presupposti troppo restrittivi, il che diventa evidente considerando un esempio musicale più complesso:
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.
[ << Incisione musicale ] | [Top][Contents][Index] | [ Bibliografia >> ] |
[ < Costruzione del software ] | [ Up : Costruzione del software ] | [ Quali simboli incidere? > ] |