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:

[image of music]

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.


Guida alla Notazione di LilyPond v2.25.22 (development-branch).