[Top][Contents] |
MIDI test suite
[ << Top ] | [Top][Contents] | [ >> ] |
[ < Top ] | [ Up : Top ] | [ > ] |
Introduction
This document presents regression tests for LilyPond development that are related to MIDI output and thus do not contain visually significant output in most cases; it mainly exists for completeness and to make the test documentation better available.
In the web version of this document, you can click on the figure for each example to see the corresponding input file.
[ << ] | [Top][Contents] | [ >> ] |
[ < ] | [ Up : Top ] | [ ambitus-after-midi.ly > ] |
Regression test cases
[ << ] | [Top][Contents] | [ >> ] |
[ < ambitus-after-midi.ly ] | [ Up : ] | [ articulate-repeat-midi.ly > ] |
articulate-accel-midi.ly
![[image of music]](02/lily-000be4de.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < articulate-accel-midi.ly ] | [ Up : ] | [ articulate-trill-midi.ly > ] |
articulate-repeat-midi.ly
\articulate
correctly handles repeats
with alternatives. They are played in the same order as their
visual rendition suggests.
![[image of music]](36/lily-e2dee615.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < articulate-repeat-midi.ly ] | [ Up : ] | [ crescendo-gap-compatible-target-midi.ly > ] |
articulate-trill-midi.ly
![[image of music]](72/lily-e54fc0dd.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < articulate-trill-midi.ly ] | [ Up : ] | [ crescendo-return-crescendo-midi.ly > ] |
crescendo-gap-compatible-target-midi.ly
![[image of music]](6a/lily-ace3d3b2.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < crescendo-gap-compatible-target-midi.ly ] | [ Up : ] | [ crescendo-return-louder-target-midi.ly > ] |
crescendo-return-crescendo-midi.ly
![[image of music]](c7/lily-9261f63f.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < crescendo-return-crescendo-midi.ly ] | [ Up : ] | [ crescendo-return-softer-target-midi.ly > ] |
crescendo-return-louder-target-midi.ly
![[image of music]](4c/lily-d2be6c83.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < crescendo-return-louder-target-midi.ly ] | [ Up : ] | [ crescendo-return-unspecified-target-midi.ly > ] |
crescendo-return-softer-target-midi.ly
![[image of music]](b9/lily-d32dfcf4.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < crescendo-return-softer-target-midi.ly ] | [ Up : ] | [ crescendo-single-compatible-target-midi.ly > ] |
crescendo-return-unspecified-target-midi.ly
![[image of music]](0a/lily-cec1d145.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < crescendo-return-unspecified-target-midi.ly ] | [ Up : ] | [ crescendo-single-unspecified-target-midi.ly > ] |
crescendo-single-compatible-target-midi.ly
![[image of music]](ee/lily-a2d323bb.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < crescendo-single-compatible-target-midi.ly ] | [ Up : ] | [ decrescendo-multiple-compatible-target-midi.ly > ] |
crescendo-single-unspecified-target-midi.ly
![[image of music]](e3/lily-f7a64654.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < crescendo-single-unspecified-target-midi.ly ] | [ Up : ] | [ decrescendo-single-contrary-target-midi.ly > ] |
decrescendo-multiple-compatible-target-midi.ly
![[image of music]](86/lily-6c60a03e.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < decrescendo-multiple-compatible-target-midi.ly ] | [ Up : ] | [ dynamic-initial-midi.ly > ] |
decrescendo-single-contrary-target-midi.ly
![[image of music]](1a/lily-572462cc.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < decrescendo-single-contrary-target-midi.ly ] | [ Up : ] | [ dynamic-voices-sequential-midi.ly > ] |
dynamic-initial-midi.ly
![[image of music]](f4/lily-19cf0f31.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < dynamic-initial-midi.ly ] | [ Up : ] | [ dynamic-voices-simultaneous-midi.ly > ] |
dynamic-voices-sequential-midi.ly
![[image of music]](e4/lily-5bbdc46b.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < dynamic-voices-sequential-midi.ly ] | [ Up : ] | [ key-initial-midi.ly > ] |
dynamic-voices-simultaneous-midi.ly
![[image of music]](a7/lily-c21b972a.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < dynamic-voices-simultaneous-midi.ly ] | [ Up : ] | [ key-option-all-staves-midi.ly > ] |
key-initial-midi.ly
keys work in MIDI, this is d-minor
![[image of music]](1a/lily-fda6217a.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < key-initial-midi.ly ] | [ Up : ] | [ key-option-midi.ly > ] |
key-option-all-staves-midi.ly
Midi2ly –key works on all staves, this is G major (–key=1)
![[image of music]](4e/lily-8bee8caa.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < key-option-all-staves-midi.ly ] | [ Up : ] | [ lyric-combine-switch-voice-midi.ly > ] |
key-option-midi.ly
midi2ly
’s option --key works, this is F major.
![[image of music]](76/lily-bff19509.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < key-option-midi.ly ] | [ Up : ] | [ lyric-repeat-count-midi.ly > ] |
lyric-combine-switch-voice-midi.ly
It is possible to switch the voice that \lyricsto
follows.
![[image of music]](4d/lily-4d091b6e.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < lyric-combine-switch-voice-midi.ly ] | [ Up : ] | [ lyric-tie-midi.ly > ] |
lyric-repeat-count-midi.ly
![[image of music]](7e/lily-11e2c803.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < lyric-repeat-count-midi.ly ] | [ Up : ] | [ lyrics-addlyrics-midi.ly > ] |
lyric-tie-midi.ly
![[image of music]](58/lily-6fe1e609.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < lyric-tie-midi.ly ] | [ Up : ] | [ midi-overlapping-notes-midi.ly > ] |
lyrics-addlyrics-midi.ly
Lyrics are preserved
![[image of music]](9d/lily-d8514766.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < lyrics-addlyrics-midi.ly ] | [ Up : ] | [ midi-polymeter-midi.ly > ] |
midi-overlapping-notes-midi.ly
![[image of music]](ea/lily-38304d69.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < midi-overlapping-notes-midi.ly ] | [ Up : ] | [ music-after-fine-warning-midi.ly > ] |
midi-polymeter-midi.ly
![[image of music]](bd/lily-4556b320.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < midi-polymeter-midi.ly ] | [ Up : ] | [ pan-position-midi.ly > ] |
music-after-fine-warning-midi.ly
![[image of music]](54/lily-74e334e8.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < music-after-fine-warning-midi.ly ] | [ Up : ] | [ partcombine-midi.ly > ] |
pan-position-midi.ly
![[image of music]](d0/lily-ba3f0823.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < pan-position-midi.ly ] | [ Up : ] | [ performance-name-utf8-midi.ly > ] |
partcombine-midi.ly
PartCombined music is preserved
![[image of music]](48/lily-f46e76e0.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < partcombine-midi.ly ] | [ Up : ] | [ quantize-duration-2-midi.ly > ] |
performance-name-utf8-midi.ly
![[image of music]](b5/lily-98d7a5ef.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < performance-name-utf8-midi.ly ] | [ Up : ] | [ quantize-duration-midi.ly > ] |
quantize-duration-2-midi.ly
midi2ly
’s option --duration-quant preserves first note length (16).
![[image of music]](a3/lily-47f99b7a.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < quantize-duration-2-midi.ly ] | [ Up : ] | [ quantize-start-midi.ly > ] |
quantize-duration-midi.ly
midi2ly
’s option --duration-quant quantizes durations of notes.
![[image of music]](de/lily-88d7a881.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < quantize-duration-midi.ly ] | [ Up : ] | [ rehearsal-mark-midi.ly > ] |
quantize-start-midi.ly
midi2ly
’s option --start-quant quantizes start of notes.
![[image of music]](b3/lily-e26b2997.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < quantize-start-midi.ly ] | [ Up : ] | [ repeat-segno-midi.ly > ] |
rehearsal-mark-midi.ly
![[image of music]](48/lily-d66043ae.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < rehearsal-mark-midi.ly ] | [ Up : ] | [ rest-dynamic-midi.ly > ] |
repeat-segno-midi.ly
![[image of music]](22/lily-c25bd7b1.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < repeat-segno-midi.ly ] | [ Up : ] | [ rest-midi.ly > ] |
rest-dynamic-midi.ly
LilyPond respects rests, also when there are dynamics
![[image of music]](ef/lily-ac164080.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < rest-dynamic-midi.ly ] | [ Up : ] | [ section-label-midi.ly > ] |
rest-midi.ly
midi2ly identifies rests
![[image of music]](2b/lily-173ccf33.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < rest-midi.ly ] | [ Up : ] | [ sequence-name-midi.ly > ] |
section-label-midi.ly
![[image of music]](73/lily-73e0eec2.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < section-label-midi.ly ] | [ Up : ] | [ sequence-name-scoping-midi.ly > ] |
sequence-name-midi.ly
The MIDI sequence generated from a score should get its name
from the title defined in the score’s \header
block (if any).
The title used for layout can be overridden for MIDI output by
specifying a separate midititle
in the \header
block.
If the score does not define a title of its own, and has no enclosing
\bookpart
, \book
, or top-level scope with a \header
block that defines a title, either, the MIDI sequence should get the
default name.
![[image of music]](ea/lily-6a46a343.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < sequence-name-midi.ly ] | [ Up : ] | [ spacer-no-notes-midi.ly > ] |
sequence-name-scoping-midi.ly
If a score has a \header
block which defines a title,
this title should override any title defined in a \header
block
of the score’s enclosing \bookpart
or \book
(or a title
defined in a top-level \header
block) when naming the MIDI
sequence generated from the score. Otherwise, if the score has no title
defined, the MIDI sequence generated from the score should get named
using the title defined in the \header
block of the nearest
enclosing \bookpart
, \book
, or top-level scope that
contains a title definition.
![[image of music]](82/lily-d31fd3cd.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < sequence-name-scoping-midi.ly ] | [ Up : ] | [ staff-map-instrument-midi.ly > ] |
spacer-no-notes-midi.ly
![[image of music]](26/lily-2c9ac6ae.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < spacer-no-notes-midi.ly ] | [ Up : ] | [ staff-map-voice-midi.ly > ] |
staff-map-instrument-midi.ly
Midi2ly remaps voices correctly to staves in MIDI-files that use instrument<->channel mapping when combined with voice<->track mapping. TODO: pianostaff
![[image of music]](bf/lily-c43f1676.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < staff-map-instrument-midi.ly ] | [ Up : ] | [ tempo-midi.ly > ] |
staff-map-voice-midi.ly
Midi2ly remaps voices correctly to staves in MIDI-files that use voice<->channel mapping when combined with staff<->track mapping. TODO: pianostaff
![[image of music]](4e/lily-15b24c2e.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < staff-map-voice-midi.ly ] | [ Up : ] | [ varcoda-midi.ly > ] |
tempo-midi.ly
![[image of music]](27/lily-0cb87494.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < varcoda-midi.ly ] | [ Up : ] | [ voice-4-midi.ly > ] |
voice-2-midi.ly
midi2ly maps two voices nicely on one staff as \voiceOne, \voiceTwo
![[image of music]](ac/lily-61ad77fd.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < voice-2-midi.ly ] | [ Up : ] | [ voice-5-midi.ly > ] |
voice-4-midi.ly
midi2ly maps four voices nicely on one staff as \voiceOne, \voiceTwo, \voiceThree, \voiceFour
![[image of music]](09/lily-a55bd64f.png)
[ << ] | [Top][Contents] | [ >> ] |
[ < voice-4-midi.ly ] | [ Up : ] | [ > ] |
voice-5-midi.ly
midi2ly still produces output for a staff with five voices. However, in such cases, most probably the the correct \voiceOne, \voiceX... mapping is lost.
![[image of music]](53/lily-0baa77bb.png)