5.1.6 Definizione di nuovi contesti
Contesti specifici, come Staff
e Voice
, sono creati a partire
da semplici mattoncini. È possibile creare nuovi tipi di contesto con
diverse combinazioni di incisori.
Il prossimo esempio mostra come costruire un diverso tipo di contesto
Voice
da zero. Sarà simile a Voice
, ma stamperà soltanto
teste di nota a forma di barra posizionate al centro. Può essere usato
per indicare l’improvvisazione nei brani jazz:
Queste impostazioni sono definite in un blocco \context
compreso in
un blocco \layout
:
\layout { \context { … } }
L’input di esempio che segue sostituisce i … del frammento precedente.
Per prima cosa occorre definire un nome per il nuovo contesto:
\name ImproVoice
Essendo simile al contesto Voice
, ci servono comandi che funzionano
in contesti Voice
esistenti per far sì che continuino a funzionare. Per
farlo si assegna al nuovo contesto un alias di Voice
,
\alias Voice
Il contesto stamperà note e testi di spiegazione, dunque dobbiamo aggiungere gli incisori che forniscono queste funzionalità, più l’incisore che raggruppa in colonne le note, i gambi e le pause che si trovano nello stesso momento musicale:
\consists Note_heads_engraver \consists Text_engraver \consists Rhythmic_column_engraver
Le teste di nota devono essere poste tutte sulla linea centrale:
\consists Pitch_squash_engraver squashedPosition = #0
L’incisore Pitch_squash_engraver
modifica le teste di nota (create
dall’incisore Note_heads_engraver
) e imposta la loro posizione
verticale sul valore di squashedPosition
, in questo
caso 0
, la linea centrale.
Le note appaiono come una barra e non hanno gambi:
\override NoteHead.style = #'slash \hide Stem
Tutti questi componenti aggiuntivi devono comunicare sotto il controllo
del contesto. I meccanismi con cui i contesti comunicano sono stabiliti
dichiarando il tipo di contesto con \type
. In un blocco
\layout
, la maggior parte dei contesti sarà del tipo
Engraver_group
. Alcuni contesti speciali e i contesti nei
blocchi \midi
usano altri tipi di contesto. Copiare e modificare
una definizione di contesto esistente comprenderà anche la definizione
del tipo. Poiché questo esempio crea una definizione da zero, deve essere
specificato in modo esplicito.
\type Engraver_group
Mettendo tutte queste parti insieme otteniamo:
\context { \name ImproVoice \type Engraver_group \consists Note_heads_engraver \consists Text_engraver \consists Rhythmic_column_engraver \consists Pitch_squash_engraver squashedPosition = #0 \override NoteHead.style = #'slash \hide Stem \alias Voice }
I contesti formano gerarchie. Vogliamo posizionare il contesto ImproVoice
all’interno del contesto Staff
, proprio come i normali contesti
Voice
. Cambiamo quindi la definizione di Staff
col comando
\accepts
,
\context { \Staff \accepts ImproVoice }
Spesso quando si riutilizza una definizione di contesto esistente, il contesto risultante può essere usato in qualsiasi situazione in cui il contesto originale sarebbe stato utile.
\layout { … \inherit-acceptability a da }
farà sì che i contesti del tipo a siano accettati da tutti i contesti che accettano anche da. Per esempio, usando
\layout { … \inherit-acceptability "ImproVoice" "Voice" }
verrà aggiunto un \accepts
per ImproVoice
a entrambe le
definizioni di Staff
e RhythmicStaff
.
L’opposto di \accepts
è \denies
,
che è talvolta necessario se si riusano definizioni di contesto esistenti.
Sistemando i pezzi necessari in un blocco \layout
ci porta a:
\layout { \context { \name ImproVoice … } \inherit-acceptability "ImproVoice" "Voice" }
Quindi l’output all’inizio di questa parte può essere inserito così:
\relative { a'4 d8 bes8 \new ImproVoice { c4^"ad lib" c c4 c^"undress" c c_"while playing :)" } a1 }
Per completare questo esempio, le modifiche che alterano la gerarchia dei
contesti devono essere ripetute in un blocco \midi
per far sì che
l’output Midi dipenda dalle stesse relazioni di contesto.
Vedi anche
Guida al funzionamento interno: Note_heads_engraver, Text_engraver, Rhythmic_column_engraver, Pitch_squash_engraver.