5.1.6 Definir contextos nuevos

Los contextos específicos, como Staff y Voice, están construidos a partir de bloques sencillos. Es posible crear nuevos tipos de contextos con combinaciones distintas de añadidos grabadores.

El siguiente ejemplo muestra cómo construir un tipo diferente de contexto de Voice partiendo de cero. Será parecido a Voice, pero imprime solamente cabezas centradas en forma de barra inclinada. Se puede usar para indicar improvisación en piezas de jazz,

[image of music]

Estos ajustes se definen dentro de un bloque \context que a su vez está dentro de un bloque \layout,

\layout {
  \context {
    …
  }
}

En el siguiente análisis, la entrada de ejemplo que se muestra debe ir en el lugar de los puntos suspensivos … del fragmento anterior.

En primer lugar es necesario definir un nombre para el nuevo contexto:

\name ImproVoice

Debido a que es parecido al contexto Voice, queremos órdenes que funcionen dentro de los contextos Voice (existentes) para que siga funcionando. Esto se consigue dando al contexto nuevo un alias de Voice,

\alias Voice

El contexto imprimirá notas y textos explicativos, por ello tenemos que añadir los grabadores que aportan esta funcionalidad, y además el grabador que agrupa las notas, plicas y silencios que están en el mismo momento musical en forma de columnas,

\consists Note_heads_engraver
\consists Text_engraver
\consists Rhythmic_column_engraver

Las cabezas de todas las notas se deben situar sobre la línea central,

\consists Pitch_squash_engraver
squashedPosition = #0

El grabador Pitch_squash_engraver modifica las cabezas de nota (creadas por el grabador Note_heads_engraver) y establece sus posiciones verticales al valor de squashedPosition, en este caso 0, la línea central.

Las notas parecen barras inclinadas y no tienen plica:

\override NoteHead.style = #'slash
\hide Stem

Todos estos complementos o plug-ins tienen que comunicarse bajo el control del contexto. Los mecanismos con el que se comunican los contextos se establecen mediante la declaración del \type (tipo) del contexto. Dentro de un bloque \layout, casi todos los contextos serán del tipo Engraver_group. Algunos contextos especiales y los contextos de los bloques \midi usan otros tipos. La copia y la modificación de una definición de contexto existente también cumplimentan el tipo. Como este ejemplo crea una definición partiendo de cero, tiene que ser especificada explícitamente.

\type Engraver_group

Al juntarlo todo, obtenemos

\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
}

Los contextos dan lugar a jerarquías. Queremos poner el contexto ImproVoice dentro del contexto Staff, igual que los contextos de voz normales. Por tanto, modificamos la definición de Staff con la instrucción \accepts (acepta),

\context {
  \Staff
  \accepts ImproVoice
}

Con frecuencia, al reutilizar una definición de contexto existente, el contexto resultante se puede usar en cualquier lugar donde el contexto original hubiera podido hacerlo.

\layout {
  …
  \inherit-acceptability to from
}

consigue que tengamos contextos del tipo to aceptados por todos los contextos que asimismo aceptan from. Por ejemplo, usar

\layout {
  …
  \inherit-acceptability "ImproVoice" "Voice"
}

añade un \accepts para ImproVoice tanto a la definición de Staff como a la de RhythmicStaff.

Lo opuesto a \accepts (acepta) es \denies (deniega), lo que a veces se necesita cuando se están reutilizando definiciones de contexto existentes.

Organizar las piezas requeridas dentro de un bloque \layout nos deja con

\layout {
  \context {
    \name ImproVoice
    …
  }
  \inherit-acceptability "ImproVoice" "Voice"
}

Así pues, la salida que aparece al comienzo de esta sub-sección se puede escribir como

\relative {
  a'4 d8 bes8
  \new ImproVoice {
    c4^"ad lib" c
    c4 c^"desvístete"
    c c_"mientras tocas :)"
  }
  a1
}

Para completar el ejemplo, los cambios que afectan a la jerarquía de contextos se deben repetir dentro de un bloque \midi de manera que la salida MIDI dependa de las mismas relaciones de contexto.

Véase también

Referencia de funcionamiento interno: Note_heads_engraver, Text_engraver, Rhythmic_column_engraver, Pitch_squash_engraver.


Referencia de la notación de GNU LilyPond v2.25.22 (development-branch).