-@node context list FIXME
-@subsection context list FIXME
-
->> > > - list of contexts: my *danger unmaintainable*
->> > > alarm just went off. I'm
-
-I knew it would... And leaving out some of them is perfectly fine
-with me.
-I do think that a list like this, with the main contexts and a
-brief
-description of what they do (perhaps also with a note about what
-default
-behaviour is associated with each of them, but this may be
-unmanageable),
-should be there, and then we could simply list the remaining ones
-without
-further explanation and with links to the IR.
-
-
-The Master Of All Contexts
-==========================
-
- * Score
- This is the top level notation context. No other context
-can
- contain a Score context. This context handles the
- administration of time signatures. It also makes sure that
- items such as clefs, time signatures, and key-signatures
-are
- aligned across staves.
- You cannot explicitly instantiate a Score context (since
-it is
- not contained in any other context). It is instantiated
- automatically when an output definition (a \score or
-\layout
- block) is processed.
- (it should also be made clear somewhere what the
-difference is between
- \score and \Score).
-
-Top-level contexts: Staff containers
-====================================
- * StaffGroup
- Groups staves while adding a bracket on the left side,
- grouping the staves together. The bar lines of the
-contained
- staves are connected vertically. StaffGroup only consists
-of a
- collection of staves, with a bracket in front and spanning
-bar
- lines.
- * ChoirStaff
- Identical to StaffGroup except that the contained staves
-are
- not connected vertically.
- * GrandStaff
- A group of staves, with a brace on the left side, grouping
-the
- staves together. The bar lines of the contained staves are
- connected vertically.
- * PianoStaff
- Just like GrandStaff but with a forced distance between
-the
- staves, so cross staff beaming and slurring can be used.
- * DrumStaff
- Handles typesetting for percussion. Can contain DrumVoice
- * InnerStaffGroup
- * InnerChoirStaff
-
-Staff-level contexts
-====================
- * Staff
- Handles clefs, bar lines, keys, accidentals. It can
-contain
- Voice contexts.
- * RhythmicStaff
- Like Staff but for printing rhythms. Pitches are
- ignored; the notes are printed on one line.
- * TabStaff
- Context for generating tablature. By default lays the
-music
- expression out as a guitar tablature, printed on six
-lines.
- * VaticanaStaff
- Same as Staff, except that it is accommodated for
- typesetting a piece in gregorian style.
- * MensuralStaff
- Same as Staff, except that it is accommodated for
- typesetting a piece in mensural style.
-
-Voice-level (bottom) contexts
-=============================
-What is generated by default here? The voice-level contexts
-initiate
-certain properties and start engravers.
-
- * Voice
- Corresponds to a voice on a staff. This context handles
-the
- conversion of dynamic signs, stems, beams, super- and
- subscripts, slurs, ties, and rests.
- You have to instantiate this explicitly if you want to
-have
- multiple voices on the same staff.
- Bottom context.
- * VaticanaVoice
- Same as Voice, except that it is accommodated for
- typesetting a piece in gregorian style.
- * MensuralVoice
- Same as Voice, except that it is accommodated for
- typesetting a piece in mensural style.
- * Lyrics
- Corresponds to a voice with lyrics. Handles the printing
-of a
- single line of lyrics.
- Bottom context.
- * DrumVoice
- A voice on a percussion staff.
- * FiguredBass
-
- * ChordNames
- Typesets chord names. This context is a `bottom' context;
-it
- cannot contain other contexts.
-
-------------------------------
-Then the following, which I don't know what to do with:
-
- * TabVoice
- * GregorianTranscriptionVoice
- * GregorianTranscriptionStaff
-
- * FretBoards
- Engraves fretboards from chords. Not easy... Not
-documented.
- * NoteNames
-
- * CueVoice Not documented
- * Global
- Hard coded entry point for LilyPond. Cannot be tuned.
- * Devnull
- Silently discards all musical information given to this
-context.
-
-
-@node another thing FIXME
-@subsection another thing FIXME
-
-Another thing that is needed, is an overview of the various naming
-conventions:
-
- scheme functions: lowercase-with-hyphens (incl. one-word
-names)
- scheme functions: ly:plus-scheme-style
- music events, music classes and music properties:
-as-scheme-functions
- Grob interfaces: scheme-style
- backend properties: scheme-style (but X and Y!)
- contexts (and MusicExpressions and grobs): Capitalized or
-CamelCase
- context properties: lowercaseFollowedByCamelCase
- engravers:
-Capitalized_followed_by_lowercase_and_with_underscores
-
-Which of these are conventions and which are rules?
-Which are rules of the underlying language, and which are
-LP-specific?
-
-
-@node Input modes FIXME
-@subsection Input modes FIXME
-
-\notemode
-
-\notemode turns the front end of LilyPond into note mode
-(which is the default parsing mode).
-It's certainly useful in certain situations, for example if you
-are in \lyricmode or \chordmode or ... and want to insert
-something that only can be done with \notemode syntax.
-
-See for example
-http://lists.gnu.org/archive/html/lilypond-user/2007-03/msg00418.html
-http://lists.gnu.org/archive/html/lilypond-user/2007-03/msg00218.html
-http://lists.gnu.org/archive/html/lilypond-user/2006-12/msg00236.html
-http://lists.gnu.org/archive/html/lilypond-user/2006-11/msg00061.html
-
-
-\chords
-\drums
-\fretmode ?
+
+@node MIDI output
+@section MIDI output
+
+@cindex Sound
+@cindex MIDI
+
+MIDI (Musical Instrument Digital Interface) is a standard for
+connecting and controlling digital instruments. A MIDI file is a
+series of notes in a number of tracks. It is not an actual
+sound file; you need special software to translate between the
+series of notes and actual sounds.
+
+Pieces of music can be converted to MIDI files, so you can listen to
+what was entered. This is convenient for checking the music; octaves
+that are off or accidentals that were mistyped stand out very much
+when listening to the MIDI output.
+
+@c TODO Check this
+The midi output allocates a channel for each staff, and one for global
+settings. Therefore the midi file should not have more than 15 staves
+(or 14 if you do not use drums). Other staves will remain silent.
+
+@menu
+* Creating MIDI files::
+* MIDI block::
+* What goes into the MIDI output?::
+* Repeats in MIDI::
+* Controlling MIDI dynamics::
+@end menu
+
+@node Creating MIDI files
+@subsection Creating MIDI files
+
+To create a MIDI output file from a LilyPond input file, add a
+@code{\midi} block to a score, for example,
+
+@example
+\score @{
+ @var{...music...}
+ \midi @{ @}
+@}
+@end example
+
+If there is a @code{\midi} block in a @code{\score} with no
+@code{\layout} block, only MIDI output will be produced. When
+notation is needed too, a @code{\layout} block must be also be
+present.
+
+@example
+\score @{
+ @var{...music...}
+ \midi @{ @}
+ \layout @{ @}
+@}
+@end example
+
+Pitches, rhythms, ties, dynamics, and tempo changes are interpreted
+and translated correctly to the MIDI output. Dynamic marks,
+crescendi and decrescendi translate into MIDI volume levels.
+Dynamic marks translate to a fixed fraction of the available MIDI
+volume range. Crescendi and decrescendi make the volume vary
+linearly between their two extremes. The effect of dynamic markings
+on the MIDI output can be removed completely, see @ref{MIDI block}.
+
+The initial tempo and later tempo changes can be specified
+with the @code{\tempo} command within the music notation. These
+are reflected in tempo changes in the MIDI output. This command
+will normally result in the metronome mark being printed, but this
+can be suppressed, see @ref{Metronome marks}. An alternative way
+of specifying the inital or overall MIDI tempo is described below,
+see @ref{MIDI block}.
+
+@unnumberedsubsubsec Instrument names
+
+@cindex instrument names
+@funindex Staff.midiInstrument
+
+The MIDI instrument to be used is specified by setting the
+@code{Staff.midiInstrument} property to the instrument name.
+The name should be chosen from the list in @ref{MIDI instruments}.
+
+@example
+\new Staff @{
+ \set Staff.midiInstrument = "glockenspiel"
+ @var{...notes...}
+@}
+@end example
+
+@example
+\new Staff \with @{midiInstrument = "cello"@} @{
+ @var{...notes...}
+@}
+@end example
+
+If the selected instrument does not exactly match an instrument from
+the list of MIDI instruments, the Grand Piano (@code{"acoustic grand"})
+instrument is used.
+
+
+@snippets
+
+@lilypondfile[verbatim,lilyquote,ragged-right,texidoc,doctitle]
+{changing-midi-output-to-one-channel-per-voice.ly}
+
+@knownissues
+
+@c In 2.11 the following no longer seems to be a problem -td
+@ignore
+Unterminated (de)crescendos will not render properly in the midi file,
+resulting in silent passages of music. The workaround is to explicitly
+terminate the (de)crescendo. For example,
+
+@example
+@{ a\< b c d\f @}
+@end example
+
+@noindent
+will not work properly but
+
+@example
+@{ a\< b c d\!\f @}
+@end example
+
+@noindent
+will.
+@end ignore
+
+Changes in the MIDI volume take place only on starting a note, so
+crescendi and decrescendi cannot affect the volume of a
+single note.
+
+Not all midi players correctly handle tempo changes in the midi
+output. Players that are known to work include MS Windows Media
+Player and @uref{http://@/timidity@/.sourceforge@/.net/,timidity}.
+
+@node MIDI block
+@subsection MIDI block
+@cindex MIDI block
+
+A @code{\midi} block must appear within a score block if MIDI output
+is required. It is analogous to the layout block, but somewhat
+simpler. Often, the @code{\midi} block is left empty, but it
+can contain context rearrangements, new context definitions or code
+to set the values of properties. For example, the following will
+set the initial tempo exported to a MIDI file without causing a tempo
+indication to be printed:
+
+@example
+\score @{
+ @var{...music...}
+ \midi @{
+ \context @{
+ \Score
+ tempoWholesPerMinute = #(ly:make-moment 72 4)
+ @}
+ @}
+@}
+@end example
+
+In this example the tempo is set to 72 quarter note
+beats per minute. This kind of tempo specification cannot take
+a dotted note length as an argument. If one is required, break
+the dotted note into smaller units. For example, a tempo of 90
+dotted quarter notes per minute can be specified as 270 eighth
+notes per minute:
+
+@example
+tempoWholesPerMinute = #(ly:make-moment 270 8)
+@end example
+
+@cindex MIDI context definitions
+
+Context definitions follow precisely the same syntax as those
+within a @code{\layout} block. Translation modules for sound are
+called performers. The contexts for MIDI output are defined in
+@file{../ly/@/performer@/-init@/.ly},
+see @rlearning{Other sources of information}.
+For example, to remove the effect of dynamics
+from the MIDI output, insert the following lines in the
+@code{\midi@{ @}} block.
+
+@example
+\midi @{
+ ...
+ \context @{
+ \Voice
+ \remove "Dynamic_performer"
+ @}
+@}
+@end example
+
+MIDI output is created only when a @code{\midi} block is included
+within a score block defined with a @code{\score} command. If it
+is placed within an explicitly instantiated score context (i.e.
+within a @code{\new Score} block) the file will fail. To solve
+this, enclose the @code{\new Score} and the @code{\midi} commands
+in a @code{\score} block.
+
+@example
+\score @{
+ \new Score @{ @dots{}notes@dots{} @}
+ \midi @{ @}
+@}
+@end example
+
+@node What goes into the MIDI output?
+@subsection What goes into the MIDI output?
+
+@c TODO Check grace notes - timing is suspect?
+
+@unnumberedsubsubsec Supported in MIDI
+
+@cindex Pitches in MIDI
+@cindex MIDI, Pitches
+@cindex Quarter tones in MIDI
+@cindex MIDI, quarter tones
+@cindex Microtones in MIDI
+@cindex MIDI, microtones
+@cindex Chord names in MIDI
+@cindex MIDI, chord names
+@cindex Rhythms in MIDI
+@cindex MIDI, Rhythms
+@c TODO etc
+
+The following items of notation are reflected in the MIDI output:
+
+@itemize
+@item Pitches
+@item Quarter tones (See @ref{Accidentals}. Rendering needs a
+player that supports pitch bend.)
+@item Chords entered as chord names
+@item Rhythms entered as note durations, including tuplets
+@item Tremolos entered without @q{@code{:}[@var{number}]}
+@item Ties
+@item Dynamic marks
+@item Crescendi, decrescendi over multiple notes
+@item Tempo changes entered with a tempo marking
+@end itemize
+
+@unnumberedsubsubsec Unsupported in MIDI
+
+@c TODO index as above
+
+The following items of notation have no effect on the MIDI output:
+
+@itemize
+@item Rhythms entered as annotations, e.g. swing
+@item Tempo changes entered as annotations with no tempo marking
+@item Staccato and other articulations and ornamentations
+@item Slurs and Phrasing slurs
+@item Crescendi, decrescendi over a single note
+@item Tremolos entered with @q{@code{:}[@var{number}]}
+@item Figured bass
+@c TODO Check Lyrics
+@item Lyrics
+@end itemize
+
+
+@node Repeats in MIDI
+@subsection Repeats in MIDI
+
+@cindex repeats in MIDI
+@funindex \unfoldRepeats
+
+With a few minor additions, all types of repeats can be represented
+in the MIDI output. This is achieved by applying the
+@code{\unfoldRepeats} music function. This function changes all
+repeats to unfold repeats.
+
+@lilypond[quote,verbatim]
+\unfoldRepeats {
+ \repeat tremolo 8 {c'32 e' }
+ \repeat percent 2 { c''8 d'' }
+ \repeat volta 2 {c'4 d' e' f'}
+ \alternative {
+ { g' a' a' g' }
+ {f' e' d' c' }
+ }
+}
+\bar "|."
+@end lilypond
+
+When creating a score file using @code{\unfoldRepeats} for MIDI,
+it is necessary to make two @code{\score} blocks: one for MIDI
+(with unfolded repeats) and one for notation (with volta, tremolo,
+and percent repeats). For example,
+
+@example
+\score @{
+ @var{..music..}
+ \layout @{ .. @}
+@}
+\score @{
+ \unfoldRepeats @var{..music..}
+ \midi @{ .. @}
+@}
+@end example
+
+@node Controlling MIDI dynamics
+@subsection Controlling MIDI dynamics
+
+MIDI dynamics are implemented by the Dynamic_performer which lives
+by default in the Voice context. It is possible to control the
+overall MIDI volume, the relative volume of dynamic markings and
+the relative volume of different instruments.
+
+@unnumberedsubsubsec Dynamic marks
+
+Dynamic marks are translated to a fixed fraction of the available
+MIDI volume range. The default fractions range from 0.25 for
+@notation{ppppp} to 0.95 for @notation{fffff}. The set of dynamic
+marks and the associated fractions can be seen in
+@file{../scm/midi.scm}, see @rlearning{Other sources of information}.
+This set of fractions may be changed or extended by providing a
+function which takes a dynamic mark as its argument and returns the
+required fraction, and setting
+@code{Score.dynamicAbsoluteVolumeFunction} to this function.
+
+For example, if a @notation{rinforzando} dynamic marking,
+@code{\rfz}, is required, this will not by default
+have any effect on the MIDI volume, as this dynamic marking is not
+included in the default set. Similarly, if a new dynamic marking
+has been defined with @code{make-dynamic-script} that too will not
+be included in the default set. The following example shows how the
+MIDI volume for such dynamic markings might be added. The Scheme
+function sets the fraction to 0.9 if a dynamic mark of rfz is
+found, or calls the default function otherwise.
+
+@lilypond[verbatim,quote]
+#(define (myDynamics dynamic)
+ (if (equal? dynamic "rfz")
+ 0.9
+ (default-dynamic-absolute-volume dynamic)))
+
+\score {
+ \new Staff {
+ \set Staff.midiInstrument = "cello"
+ \set Score.dynamicAbsoluteVolumeFunction = #myDynamics
+ \new Voice {
+ \relative c'' {
+ a\pp b c-\rfz
+ }
+ }
+ }
+ \layout {}
+ \midi {}
+}
+@end lilypond
+
+Alternatively, if the whole table of fractions needs to be
+redefined, it would be better to use the
+@notation{default-dynamic-absolute-volume} procedure in
+@file{../scm/midi.scm} and the associated table as a model.
+The final example in this section shows how this might be done.
+
+@unnumberedsubsubsec Overall MIDI volume
+
+The minimum and maximum overall volume of MIDI dynamic markings is
+controlled by setting the properties @code{midiMinimumVolume} and
+@code{midiMaximumVolume} at the @code{Score} level. These
+properties have an effect only on dynamic marks, so if they
+are to apply from the start of the score a dynamic mark must be
+placed there. The fraction corresponding to each dynamic mark is
+modified with this formula
+
+@example
+midiMinimumVolume + (midiMaximumVolume - midiMinimumVolume) * fraction
+@end example
+
+In the following example the dynamic range of the overall MIDI
+volume is limited to the range 0.2 - 0.5.
+
+@lilypond[verbatim,quote]
+\score {
+ <<
+ \new Staff {
+ \key g \major
+ \time 2/2
+ \set Staff.midiInstrument = #"flute"
+ \new Voice \relative c''' {
+ r2 g\mp g fis ~
+ fis4 g8 fis e2 ~
+ e4 d8 cis d2
+ }
+ }
+ \new Staff {
+ \key g \major
+ \set Staff.midiInstrument = #"clarinet"
+ \new Voice \relative c'' {
+ b1\p a2. b8 a
+ g2. fis8 e
+ fis2 r
+ }
+ }
+ >>
+ \layout { }
+ \midi {
+ \context {
+ \Score
+ tempoWholesPerMinute = #(ly:make-moment 72 2)
+ midiMinimumVolume = #0.2
+ midiMaximumVolume = #0.5
+ }
+ }
+}
+@end lilypond
+
+@unnumberedsubsubsec Equalizing different instruments (i)
+
+If the minimum and maximum MIDI volume properties are set in
+the @code{Staff} context the relative volumes of the MIDI
+instruments can be controlled. This gives a basic instrument
+equalizer, which can enhance the quality of the MIDI output
+remarkably.
+
+In this example the volume of the clarinet is reduced relative
+to the volume of the flute. There must be a dynamic
+mark on the first note of each instrument for this to work
+correctly.
+
+@lilypond[verbatim,quote]
+\score {
+ <<
+ \new Staff {
+ \key g \major
+ \time 2/2
+ \set Staff.midiInstrument = #"flute"
+ \set Staff.midiMinimumVolume = #0.7
+ \set Staff.midiMaximumVolume = #0.9
+ \new Voice \relative c''' {
+ r2 g\mp g fis ~
+ fis4 g8 fis e2 ~
+ e4 d8 cis d2
+ }
+ }
+ \new Staff {
+ \key g \major
+ \set Staff.midiInstrument = #"clarinet"
+ \set Staff.midiMinimumVolume = #0.3
+ \set Staff.midiMaximumVolume = #0.6
+ \new Voice \relative c'' {
+ b1\p a2. b8 a
+ g2. fis8 e
+ fis2 r
+ }
+ }
+ >>
+ \layout { }
+ \midi {
+ \context {
+ \Score
+ tempoWholesPerMinute = #(ly:make-moment 72 2)
+ }
+ }
+}
+@end lilypond
+
+@unnumberedsubsubsec Equalizing different instruments (ii)
+
+If the MIDI minimum and maximum volume properties are not set
+LilyPond will, by default, apply a small degree of equalization
+to a few instruments. The instruments and the equalization
+applied are shown in the table @notation{instrument-equalizer-alist}
+in @file{../scm/midi.scm}.
+
+This basic default equalizer can be replaced by setting
+@code{instrumentEqualizer} in the @code{Score} context to a new
+Scheme procedure which accepts a MIDI instrument name as its only
+argument and returns a pair of fractions giving the minimum and
+maximum volumes to be applied to that instrument. This replacement
+is done in the same way as shown for resetting the
+@code{dynamicAbsoluteVolumeFunction} at the start of this section.
+The default equalizer, @notation{default-instrument-equalizer}, in
+@file{../scm/midi.scm} shows how such a procedure might be written.
+
+The following example sets the relative flute and clarinet volumes
+to the same values as the previous example.
+
+@lilypond[verbatim,quote]
+#(define my-instrument-equalizer-alist '())
+
+#(set! my-instrument-equalizer-alist
+ (append
+ '(
+ ("flute" . (0.7 . 0.9))
+ ("clarinet" . (0.3 . 0.6)))
+ my-instrument-equalizer-alist))
+
+#(define (my-instrument-equalizer s)
+ (let ((entry (assoc s my-instrument-equalizer-alist)))
+ (if entry
+ (cdr entry))))
+
+\score {
+ <<
+ \new Staff {
+ \key g \major
+ \time 2/2
+ \set Score.instrumentEqualizer = #my-instrument-equalizer
+ \set Staff.midiInstrument = #"flute"
+ \new Voice \relative c''' {
+ r2 g\mp g fis ~
+ fis4 g8 fis e2 ~
+ e4 d8 cis d2
+ }
+ }
+ \new Staff {
+ \key g \major
+ \set Staff.midiInstrument = #"clarinet"
+ \new Voice \relative c'' {
+ b1\p a2. b8 a
+ g2. fis8 e
+ fis2 r
+ }
+ }
+ >>
+ \layout { }
+ \midi {
+ \context {
+ \Score
+ tempoWholesPerMinute = #(ly:make-moment 72 2)
+ }
+ }
+}
+@end lilypond
+
+@ignore
+@c Delete when satisfied this is adequately covered elsewhere -td
+
+@node Microtones in MIDI
+@subsection Microtones in MIDI
+
+@cindex microtones in MIDI
+
+Microtones consisting of half sharps and half flats are exported
+to the MIDI file and render correctly in MIDI players which support
+pitch bending. See @ref{Note names in other languages}. Here is
+an example showing all the half sharps and half flats. It can be
+copied out and compiled to test microtones in your MIDI player.
+
+@lilypond[verbatim,quote]
+\score {
+ \relative c' {
+ c cih cis cisih
+ d dih ees eeh
+ e eih f fih
+ fis fisih g gih
+ gis gisih a aih
+ bes beh b bih
+ }
+ \layout {}
+ \midi {}
+}
+@end lilypond
+@end ignore
+