33.6 Definir contextos nuevos
Panorámica de la definición de contextos
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 deberían parecer barras inclinadas sin 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. Si hacemos
\layout {
  …
  \inherit-acceptability hacia desde
}
conseguimos tener 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
}
Véase también
Referencia de funcionamiento interno: Contexts, Engravers and Performers.
Nuevos contextos en el MIDI
En la salida MIDI, la sintaxis para definir nuevos tipos de
contexto es la misma, excepto que el bloque \context se
debe situar dentro de un bloque \midi, y el \type
tendría que ser normalmente Performer_group en lugar de
Engraver_group.  El término engraver (grabador) se
refiere a un plug-in o complemento de contexto que crea una cierta
salida visual. En cambio, un performer o intérprete es de
relevancia solamente en la salida MIDI.  Cuando los plug-ins o
complementos llevan “translator” como parte del nombre en lugar
de “engraver” o “performer”, son relevantes tanto para la
salida gráfica como para la interpretación MIDI.  Así, cuando
estamos adaptando una definición de contexto para el bloque
\midi, tenemos que
-  copiarlo en un bloque 
\midi, -  sustituir 
Engraver_groupporPerformer_group, -  eliminar 
\consistspara los engravers o grabadores (ya que no son relevantes), y posiblemente añadir\consistspara los performers o intérpretes. 
Tenga muy en cuenta que, para mantener una interpretación
coherente entre las salidas gráfica y de MIDI, se recomienda
copiar cualquier definición de contexto personalizada dentro de un
bloque \midi.  Como mínimo, tendría que incluir las
instrucciones que especifican la jerarquía de contextos, como
\accepts, \defaultchild y
\inherit-acceptability.  Se recomienda también copiar los
alias.
De manera que, para completar el ejemplo anterior, se puede añadir lo siguiente:
\midi {
  \context {
    \name ImproVoice
    \type Performer_group
    \alias Voice
    \consists Note_performer
    \consists Beam_performer
    \consists Dynamic_performer
    \consists Tie_performer
    \consists Slur_performer
  }
  \context {
    \Staff
    \accepts ImproVoice
  }
}
Esto hace que el contexto ImproVoice funcione también en la
salida MIDI.
Replacing the Score context
Para escribir un contexto MyScore que funcione como el
contexto de nivel más alto igual que lo hace normalmente el
contexto Score, use \inherit-acceptability MyScore
Score.  El ejemplo siguiente define un contexto
ProportionalScore en el que está activada la notación
proporcional (see Notación proporcional).
\layout { \context { \Score \name ProportionalScore \alias Score proportionalNotationDuration = #1/8 } \inherit-acceptability ProportionalScore Score } music = { c'1 2 4 8 16 16 } \new Score \music \new ProportionalScore \music![]()
Dado que el contexto del nivel superior debe poder contener un
cierto número de grabadores fundamentales,, la herencia de los
ajustes con \Score es lo más sencillo en casi todos los
casos.  Si, de todas formas, definimos un contexto en el nivel de
Score partiendo de cero y sin heredar la definición de
Score, el argumento de \type debe ser
Score_engraver (o Score_performer dentro de
\midi) en lugar de Engraver_group.  Además está
muy recomendado dar al contexto de nivel superior el alias
Score, porque varios grabadores necesitan poder acceder al
contexto superior usando su alias.
![[image of music]](../e8/lily-894f034e.png)
![[image of music]](../a3/lily-3fa7da09.png)