Referencia de la notación de GNU LilyPond: 5.1.6 Definir contextos nuevos

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

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.

#### LilyPond — Referencia de la notación v2.24.4 (rama estable).