Guida alla Notazione di LilyPond: 5.1.6 Definizione di nuovi contesti

### 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.

#### LilyPond — Guida alla Notazione v2.22.2 (ramo stabile).