| [ << Changing defaults ] | [Top][Contents][Index] | [ Notation manual tables >> ] |
| [ < Order of precedence ] | [ Up : Interpretation contexts ] | [ > ] |
5.1.6 Defining new contexts
| [ << Changing defaults ] | [Top][Contents][Index] | [ Notation manual tables >> ] |
| [ < Defining new contexts ] | [ Up : Defining new contexts ] | [ > ] |
Context definition overview
Specific contexts, like Staff and Voice, are made from
simple building blocks. It is possible to create new types of
contexts with different combinations of engraver plug-ins.
The next example shows how to build a different type of
Voice context from scratch. It will be similar to
Voice, but only prints centered slash note heads. It can be used
to indicate improvisation in jazz pieces,
These settings are defined within a \context block inside a
\layout block,
\layout {
\context {
…
}
}
In the following discussion, the example input shown should go in place of the … in the previous fragment.
First it is necessary to define a name for the new context:
\name ImproVoice
Since it is similar to the Voice context, we want commands that
work in (existing) Voice contexts to continue working. This is
achieved by giving the new context an alias of Voice,
\alias Voice
The context will print notes and instructive texts, so we need to add the engravers which provide this functionality, plus the engraver which groups notes, stems and rests which occur at the same musical moment into columns,
\consists Note_heads_engraver \consists Text_engraver \consists Rhythmic_column_engraver
The note heads should all be placed on the center line,
\consists Pitch_squash_engraver squashedPosition = #0
The Pitch_squash_engraver modifies note heads (created
by the Note_heads_engraver) and sets their vertical
position to the value of squashedPosition, in this
case 0, the center line.
The notes look like a slash, and have no stem,
\override NoteHead.style = #'slash \hide Stem
All these plug-ins have to communicate under the control of the
context. The mechanisms with which contexts communicate are
established by declaring the context \type. Within a
\layout block, most contexts will be of type
Engraver_group. Some special contexts use other context
types. Copying and modifying an existing context definition will
also fill in the type. Since this example creates a definition
from scratch, it needs to be specified explicitly.
\type Engraver_group
Put together, we get
\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
}
Contexts form hierarchies. We want to place the ImproVoice
context within the Staff context, just like normal Voice
contexts. Therefore, we modify the Staff definition with the
\accepts command,
\context {
\Staff
\accepts ImproVoice
}
Often when reusing an existing context definition, the resulting context can be used anywhere where the original context would have been useful.
\layout {
…
\inherit-acceptability to from
}
will arrange to have contexts of type to accepted by all contexts also accepting from. For example, using
\layout {
…
\inherit-acceptability ImproVoice Voice
}
will add an \accepts for ImproVoice to both
Staff and RhythmicStaff definitions.
The opposite of \accepts is \denies,
which is sometimes needed when reusing existing context definitions.
Arranging the required pieces into a \layout block leaves
us with
\layout {
\context {
\name ImproVoice
…
}
\inherit-acceptability ImproVoice Voice
}
Then the output at the start of this subsection can be entered as
\relative {
a'4 d8 bes8
\new ImproVoice {
c4^"ad lib" c
c4 c^"undress"
c c_"while playing :)"
}
a1
}
See also
Internals Reference: Contexts, Engravers and Performers.
| [ << Changing defaults ] | [Top][Contents][Index] | [ Notation manual tables >> ] |
| [ < ] | [ Up : Defining new contexts ] | [ > ] |
New contexts in MIDI
In MIDI output, the syntax for defining new context types is the
same, except that the \context block should be placed
inside a \midi block, and the \type should normally
be Performer_group rather than Engraver_group. The
term “engraver” refers to a context plug-in that creates visual
output. A “performer”, on the other hand, is relevant in MIDI
output only. When plug-ins have “translator” in their name
rather than “engraver” or “performer”, they are relevant for
both graphical and audio output. Thus, when adapting a context
definition for the \midi block, you need to
-
copy it in a
\midiblock, -
change
Engraver_grouptoPerformer_group, -
remove
\consistsfor engravers (they are not relevant), and possibly add\consistsfor performers.
Please note that, in order to maintain consistent interpretation
between graphical and MIDI output, it is recommended to copy any
custom context definition in a \midi block. It should at
the minimum include those commands that specify the context
hierarchy, such as \accepts, \defaultchild and
\inherit-acceptability. Copying aliases is advised as well.
Thus, to complete the example above, the following can be added:
\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
}
}
This makes the ImproVoice context also work in MIDI output.
| [ << Changing defaults ] | [Top][Contents][Index] | [ Notation manual tables >> ] |
| [ < ] | [ Up : Defining new contexts ] | [ Context layout order > ] |
Replacing the Score context
In order to write a context MyScore that acts as the
topmost context, as the Score context usually does, use
\inherit-acceptability MyScore Score. The following
example defines a ProportionalScore context where
proportional notation is enabled (see Proportional notation).
\layout { \context { \Score \name ProportionalScore \alias Score proportionalNotationDuration = #(ly:make-moment 1/4) } \inherit-acceptability ProportionalScore Score } \new ProportionalScore { c'1 2 4 8 16 32 64 64 }
Since the topmost context needs to contain a number of fundamental
engravers, inheriting settings with \Score is easiest in
most cases. If you nevertheless define a score-level context from
scratch without inheriting the Score definition, the
argument to \type should be Score_engraver (or
Score_performer in \midi) rather than
Engraver_group. Furthermore, giving the topmost context
the Score alias is strongly recommended given that a number
of engravers need to access the topmost context using its alias.
| [ << Changing defaults ] | [Top][Contents][Index] | [ Notation manual tables >> ] |
| [ < ] | [ Up : Defining new contexts ] | [ Context layout order > ] |
![[image of music]](../82/lily-27c159d3.png)
![[image of music]](../b7/lily-316cc3e3.png)