Hello Werner, Thanks for your reply. Does the (bug?) report I sent get a ticket in https://gitlab.com/lilypond/lilypond/-/issues ?
I ran your suggested - "branch regression test": [@master, test-baseline, bytecode, @MyBranch, bytecode, check] Indeed lots of regtests failures. Another fix attempt is attached. If I knew how to debug Scheme code, I might have come with a finer solution. But with the (C++) suggested fix, the 'make check' produced much smaller (attached) build/out/test-results/index.html. To my surprise, also (attached) build/input/regression/midi/out/midi.diff Could it be that I missed something in the "branch regression test" ? regards -- yotam On Mon, Jul 15, 2024 at 10:10 AM Werner LEMBERG <w...@gnu.org> wrote: > > > programming error: Improbable offset for stencil: -inf staff space > > [...] > > Also attached is a log and a suggested fix. > > Thanks for the report. Your suggested fix essentially undoes commit > 6ac913499ad6 (from 2013) and unfortunately it makes many regtests > results worse. > > You might run `make bytecode` followed by `make test-baseline` on > 'master', then applying your change, then running `make bytecode` > followed by `make check` to create `out/test-restuls/index.html`, > which you can visit in your browser and which shows you all regtest > differences. > > > Werner >
click to filter rows by type: [1]ly / [2]midi / [3]log / [4]gittxt / [5]reset to all __________________________________________________________________ 4282 unchanged distance before after 3.741657 [6]input/regression/scheme-engraver.log @@ -13,9 +13,9 @@ #<Mom 0> : (process-acknowledged) #<Mom 0> : (stop-translation-timestep) #<Mom 1/8> : (start-translation-timestep) -#<Mom 1/8> : detected breathing event in #:once listener: #<Prob: Stream_e vent C++: Stream_event((music-cause . #<Prob: Music C++: Music((length . #<Mom 0 >) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engrave r.ly:67:3>))((display-methods #<procedure method (a)>) (name . BreathingEvent) ( types event breathing-event) (midi-length . #<procedure breathe::midi-length (a b)>)) > +#<Mom 1/8> : detected breathing event in #:once listener: #<Prob: Stream_e vent C++: Stream_event((music-cause . #<Prob: Music C++: Music((length . #<Mom 0 >) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engrave r.ly:67:3>))((display-methods #<procedure method (event)>) (name . BreathingEven t) (types event breathing-event) (midi-length . #<procedure breathe::midi-length (len context)>)) > ))((class breathing-event music-event StreamEvent) (length . #<Mom 0>) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engraver.ly:67:3>) ) > -#<Mom 1/8> : detected this rest event: #<Prob: Stream_event C++: Stream_ev ent((music-cause . #<Prob: Music C++: Music((length . #<Mom 1/8>) (duration . #< Duration 8 >) (origin . #<location /home/yotam/pub/lilypond/input/regression/sch eme-engraver.ly:68:3>))((display-methods #<procedure method (a)>) (name . RestEv ent) (iterator-ctor . #<procedure ly:rhythmic-music-iterator::constructor ()>) ( types event rhythmic-event general-rest-event rest-event)) > +#<Mom 1/8> : detected this rest event: #<Prob: Stream_event C++: Stream_ev ent((music-cause . #<Prob: Music C++: Music((length . #<Mom 1/8>) (duration . #< Duration 8 >) (origin . #<location /home/yotam/pub/lilypond/input/regression/sch eme-engraver.ly:68:3>))((display-methods #<procedure method (rest)>) (name . Res tEvent) (iterator-ctor . #<procedure ly:rhythmic-music-iterator::constructor ()> ) (types event rhythmic-event general-rest-event rest-event)) > ) (length . #<Mom 1/8>))((class rest-event general-rest-event rhythmic-event mu sic-event StreamEvent) (length . #<Mom 1/8>) (duration . #<Duration 8 >) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engraver.ly:68:3> )) > #<Mom 1/8> : created this grob: #<Grob TextScript > @@ -28,7 +28,7 @@ #<Mom 1/8> : (process-acknowledged) #<Mom 1/8> : (stop-translation-timestep) #<Mom 1/4> : (start-translation-timestep) -#<Mom 1/4> : detected breathing event in #:once listener: #<Prob: Stream_e vent C++: Stream_event((music-cause . #<Prob: Music C++: Music((length . #<Mom 0 >) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engrave r.ly:70:3>))((display-methods #<procedure method (a)>) (name . BreathingEvent) ( types event breathing-event) (midi-length . #<procedure breathe::midi-length (a b)>)) > +#<Mom 1/4> : detected breathing event in #:once listener: #<Prob: Stream_e vent C++: Stream_event((music-cause . #<Prob: Music C++: Music((length . #<Mom 0 >) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engrave r.ly:70:3>))((display-methods #<procedure method (event)>) (name . BreathingEven t) (types event breathing-event) (midi-length . #<procedure breathe::midi-length (len context)>)) > ))((class breathing-event music-event StreamEvent) (length . #<Mom 0>) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engraver.ly:70:3>) ) > #<Mom 1/4> : (pre-process-music) #<Mom 1/4> : (process-music) @@ -41,15 +41,14 @@ #<Mom 1/4> : (process-acknowledged) #<Mom 1/4> : (stop-translation-timestep) #<Mom 3/8> : (start-translation-timestep) -#<Mom 3/8> : detected breathing event in #:once listener: #<Prob: Stream_e vent C++: Stream_event((music-cause . #<Prob: Music C++: Music((length . #<Mom 0 >) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engrave r.ly:73:3>))((display-methods #<procedure method (a)>) (name . BreathingEvent) ( types event breathing-event) (midi-length . #<procedure breathe::midi-length (a b)>)) > +#<Mom 3/8> : detected breathing event in #:once listener: #<Prob: Stream_e vent C++: Stream_event((music-cause . #<Prob: Music C++: Music((length . #<Mom 0 >) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engrave r.ly:73:3>))((display-methods #<procedure method (event)>) (name . BreathingEven t) (types event breathing-event) (midi-length . #<procedure breathe::midi-length (len context)>)) > ))((class breathing-event music-event StreamEvent) (length . #<Mom 0>) (origin . #<location /home/yotam/pub/lilypond/input/regression/scheme-engraver.ly:73:3>) ) > #<Mom 3/8> : (pre-process-music) #<Mom 3/8> : (process-music) #<Mom 3/8> : (process-acknowledged) #<Mom 3/8> : (process-acknowledged) #<Mom 3/8> : (process-acknowledged) -#<Mom 3/8> : (process-acknowledged) -#<Mom 3/8> : (stop-tran +#<Mom 3/8> : (process-ack Preprocessing graphical objects... Calculating line breaks... Drawing systems... @@ -58,5 +57,6 @@ Layout output to `scheme-engraver-1.eps'... Writing scheme-engraver-systems.texi... Writing scheme-engraver-systems.tex... -Writing scheme-engraver-systems.count...slation-timestep) +Writing scheme-engraver-systems.count...nowledged) +#<Mom 3/8> : (stop-translation-timestep) #<Mom 3/8> : (finalize) [7] input/regression/scheme-engraver.log 0.300030 BRANCH: master HEAD: 5828262395bedbbe72cabae29b951160d2cd4d70 MERGE_BASE: 5828262395bedbbe72cabae29b951160d2cd4d70 HISTORY ======= HASH: 5828262395bedbbe72cabae29b951160d2cd4d70 SUBJECT: 61f-Lyrics-GracedNotes.xml: Remove erratic ties Fri Jul 19 06:19:39 PM IDT 2024 [8] input/regression/tree.gittxt BRANCH: yotam/translate-minus-infty-to-zero HEAD: 773afabd1752786be6073b755057b73798a25bc9 MERGE_BASE: 5828262395bedbbe72cabae29b951160d2cd4d70 HISTORY ======= HASH: 773afabd1752786be6073b755057b73798a25bc9 SUBJECT: Stencil::translate modify -inf to zero HASH: 5828262395bedbbe72cabae29b951160d2cd4d70 SUBJECT: 61f-Lyrics-GracedNotes.xml: Remove erratic ties Fri Jul 19 06:27:36 PM IDT 2024 [9] input/regression/tree.gittxt References 1. file:///tmp/tmp4lX9LZ.html 2. file:///tmp/tmp4lX9LZ.html 3. file:///tmp/tmp4lX9LZ.html 4. file:///tmp/tmp4lX9LZ.html 5. file:///tmp/tmp4lX9LZ.html 6. file:///tmp/input/regression/out-test-baseline/scheme-engraver.log 7. file:///tmp/input/regression/out-test/scheme-engraver.log 8. file:///tmp/input/regression/out-test-baseline/tree.gittxt 9. file:///tmp/input/regression/out-test/tree.gittxt
commit 773afabd1752786be6073b755057b73798a25bc9 Author: Yotam Medini <yotam.med...@gmail.com> Date: Fri Jul 19 18:12:35 2024 +0300 Stencil::translate modify -inf to zero diff --git a/lily/stencil.cc b/lily/stencil.cc index 156b48bf14..1c7bfa7c1e 100644 --- a/lily/stencil.cc +++ b/lily/stencil.cc @@ -150,7 +150,11 @@ Stencil::translate (Offset o) { for (const auto a : {X_AXIS, Y_AXIS}) { - if (std::isinf (o[a]) + if ((o[a] < 0.0) && (std::isinf (o[a]))) + { + o[a] = 0.0; + } + else if (std::isinf (o[a]) || std::isnan (o[a]) // ugh, hardcoded.
--- /home/yotam/pub/lilypond/input/regression/midi/articulate-repeat.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/articulate-repeat-midi.ly 2024-07-19 18:27:39.958361727 +0300 @@ -1,23 +1,72 @@ -\version "2.25.0" +% Lily was here -- automatically converted by midi2ly.py from out-test/articulate-repeat.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/articulate-repeat.header \header { - texidoc = "@code{\\articulate} correctly handles repeats +texidoc="@code{\articulate} correctly handles repeats with alternatives. They are played in the same order as their visual rendition suggests." +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*4 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 1*4 +} + +trackBchannelB = \relative c { + ais'8*7 r8 + | % 2 + b8*7 r8 + | % 3 + ais8*7 r8 + | % 4 + c8*7 } -\include "articulate.ly" +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + \score { - \articulate { - \repeat volta 2 { - bes1 - \alternative { - \volta 1 b! - \volta 2 bis - } - } - } - \midi { } - \layout { } + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/articulate-trill.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/articulate-trill-midi.ly 2024-07-19 18:27:40.314359632 +0300 @@ -1,17 +1,72 @@ -\version "2.23.9" +% Lily was here -- automatically converted by midi2ly.py from out-test/articulate-trill.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/articulate-trill.header \header { - texidoc = "@code{\\articulate} correctly handles trill spans ending on multi-measure rests." +texidoc="" +options="" } +% end -\include "articulate.ly" -\score { -\unfoldRepeats \articulate { - b1 \startTrillSpan | - R1 \stopTrillSpan | - b2 r | - b1 +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*4 } -\midi {} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 1*4 } +trackBchannelB = \relative c { + c'64 b c b c b c b c b c b c b c b c b c b c b c b c b c b c + b c b c b c b c b c b c b c b c b c b c b c b c b c b c b c b + c b c b + | % 2 + r1 + | % 3 + b16*7 r16*9 + | % 4 + b8*7 +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +\score { + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} +} --- /home/yotam/pub/lilypond/input/regression/midi/crescendo-gap-compatible-target.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/crescendo-gap-compatible-target-midi.ly 2024-07-19 18:27:40.646357676 +0300 @@ -1,18 +1,64 @@ -\version "2.19.45" +% Lily was here -- automatically converted by midi2ly.py from out-test/crescendo-gap-compatible-target.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/crescendo-gap-compatible-target.header \header { - texidoc="When there is a gap between the end of a crescendo and a - subsequent explicit dynamic, the dynamic performer uses the explicit - dynamic as the target of the crescendo." - - %% Note: Choosing this behavior simplified the implementation. In - %% the developer's opinion, it is difficult to argue that choosing a - %% target dynamic that under- or overshoots the explicit dynamic is - %% more correct. +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2. +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 2. +} + +trackBchannelB = \relative c { + c4 c c } +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c\mf\< c\! c\f } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/crescendo-return-crescendo.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/crescendo-return-crescendo-midi.ly 2024-07-19 18:27:40.982355697 +0300 @@ -1,12 +1,70 @@ -\version "2.19.44" +% Lily was here -- automatically converted by midi2ly.py from out-test/crescendo-return-crescendo.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/crescendo-return-crescendo.header \header { - texidoc="The dynamic performer chooses a reasonable peak dynamic and - returns to the original dynamic. The latter, extreme crescendo does - not affect the former." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1 + | % 2 + } +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 1 + | % 2 + +} + +trackBchannelB = \relative c { + c4 c c c + | % 2 + +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c\mf\< c\> c\< c\sf } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/crescendo-return-louder-target.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/crescendo-return-louder-target-midi.ly 2024-07-19 18:27:41.314353742 +0300 @@ -1,11 +1,64 @@ -\version "2.19.45" +% Lily was here -- automatically converted by midi2ly.py from out-test/crescendo-return-louder-target.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/crescendo-return-louder-target.header \header { - texidoc="The dynamic performer chooses a reasonable peak dynamic and - returns to the specified dynamic." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2. } +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 2. +} + +trackBchannelB = \relative c { + c4 c c +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c\mf\< c\> c\f } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/crescendo-return-softer-target.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/crescendo-return-softer-target-midi.ly 2024-07-19 18:27:41.646351787 +0300 @@ -1,11 +1,64 @@ -\version "2.19.45" +% Lily was here -- automatically converted by midi2ly.py from out-test/crescendo-return-softer-target.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/crescendo-return-softer-target.header \header { - texidoc="The dynamic performer chooses a reasonable peak dynamic and - returns to the specified dynamic." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2. } +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 2. +} + +trackBchannelB = \relative c { + c4 c c +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c\mf\< c\> c\p } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/crescendo-return-unspecified-target.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/crescendo-return-unspecified-target-midi.ly 2024-07-19 18:27:41.982349809 +0300 @@ -1,11 +1,64 @@ -\version "2.19.44" +% Lily was here -- automatically converted by midi2ly.py from out-test/crescendo-return-unspecified-target.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/crescendo-return-unspecified-target.header \header { - texidoc="The dynamic performer chooses a reasonable peak dynamic and - returns to the original dynamic." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2. } +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 2. +} + +trackBchannelB = \relative c { + c4 c c +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c\mf\< c\> c\! } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/crescendo-single-compatible-target.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/crescendo-single-compatible-target-midi.ly 2024-07-19 18:27:42.310347878 +0300 @@ -1,11 +1,64 @@ -\version "2.19.44" +% Lily was here -- automatically converted by midi2ly.py from out-test/crescendo-single-compatible-target.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/crescendo-single-compatible-target.header \header { - texidoc="The velocity of notes during a crescendo is linearly - interpolated between the starting and target dynamics." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2. } +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 2. +} + +trackBchannelB = \relative c { + c4 c c +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c\mf\< c c\f } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/crescendo-single-unspecified-target.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/crescendo-single-unspecified-target-midi.ly 2024-07-19 18:27:42.646345901 +0300 @@ -1,11 +1,64 @@ -\version "2.19.44" +% Lily was here -- automatically converted by midi2ly.py from out-test/crescendo-single-unspecified-target.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/crescendo-single-unspecified-target.header \header { - texidoc="If no explicit dynamic follows a crescendo, the dynamic - performer chooses a reasonable target dynamic." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2 } +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 2 +} + +trackBchannelB = \relative c { + c4 c +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c\mf\< c\! } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/decrescendo-multiple-compatible-target.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/decrescendo-multiple-compatible-target-midi.ly 2024-07-19 18:27:42.978343945 +0300 @@ -1,12 +1,68 @@ -\version "2.19.45" +% Lily was here -- automatically converted by midi2ly.py from out-test/decrescendo-multiple-compatible-target.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/decrescendo-multiple-compatible-target.header \header { - texidoc="The dynamic performer apportions changes to consecutive - decrescendi in proportion to their duration. In this case, 1/3 of - the change occurs over the first decrescendo." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*2 } +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 1*2 +} + +trackBchannelB = \relative c { + c4 c c2 + | % 2 + c1 + | % 3 + +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c\f\> c\! c2\> | c1\p } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/decrescendo-single-contrary-target.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/decrescendo-single-contrary-target-midi.ly 2024-07-19 18:27:43.310341992 +0300 @@ -1,15 +1,64 @@ -\version "2.19.45" +% Lily was here -- automatically converted by midi2ly.py from out-test/decrescendo-single-contrary-target.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/decrescendo-single-contrary-target.header \header { - texidoc="When a decrescendo is followed by an explicit dynamic that - is louder than the starting dynamic, the dynamic performer chooses a - reasonable target dynamic. The velocity of notes during the - decrescendo is linearly interpolated between the starting and target - dynamics, with the explicit dynamic taking effect at the last - moment." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2. } +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 2. +} + +trackBchannelB = \relative c { + c4 c c +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c\mf\> c c\f } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/dynamic-initial.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/dynamic-initial-midi.ly 2024-07-19 18:27:43.642340036 +0300 @@ -1,15 +1,64 @@ -\version "2.19.44" +% Lily was here -- automatically converted by midi2ly.py from out-test/dynamic-initial.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/dynamic-initial.header \header { - texidoc="The MIDI performer uses a default initial dynamic" +texidoc="" +options="" } +% end -\score { - { c\< c\f } - \midi {} +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 2 +} + +trackBchannelB = \relative c { + c4 c } +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - { c c\< c\f } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/dynamic-voices-sequential.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/dynamic-voices-sequential-midi.ly 2024-07-19 18:27:43.978338059 +0300 @@ -1,15 +1,70 @@ -\version "2.19.47" +% Lily was here -- automatically converted by midi2ly.py from out-test/dynamic-voices-sequential.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/dynamic-voices-sequential.header \header { - texidoc="The MIDI performer operates in Voice context by default, - so dynamics in different voices are independent." +texidoc="" +options="" } +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1 + | % 2 + +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> -\score { - \new Staff { - \new Voice = "A" c'2\p - \new Voice = "A" c'2 % default dynamic expected - } +trackBchannelA = { + + \set Staff.instrumentName = ":A" + \skip 1 + | % 2 + +} + +trackBchannelB = \relative c { + c'2 c + | % 2 + +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +\score { + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/dynamic-voices-simultaneous.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/dynamic-voices-simultaneous-midi.ly 2024-07-19 18:27:44.310336105 +0300 @@ -1,15 +1,61 @@ -\version "2.19.47" +% Lily was here -- automatically converted by midi2ly.py from out-test/dynamic-voices-simultaneous.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/dynamic-voices-simultaneous.header \header { - texidoc="The MIDI performer operates in Voice context by default, - so dynamics in different voices are independent." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2 } +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = ":A" + \skip 2 +} + +trackBchannelB = \relative c { + <e' c >2 +} + +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - \new Staff << - \new Voice = "A" e'2\p - \new Voice = "A" c'2 % default dynamic expected + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB >> - + \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/key-initial.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/key-initial-midi.ly 2024-07-19 18:27:44.810333163 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out/initial-key.midi -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/key-initial.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -29,16 +23,14 @@ trackAchannelA = { \key d \minor - % [SEQUENCE_TRACK_NAME] control track - % [TEXT_EVENT] creator: - % [TEXT_EVENT] GNU LilyPond 2.13.54 + % [TEXT_EVENT] LilyPond 2.25.18 \time 4/4 \tempo 4 = 60 - + \skip 1*2 } trackA = << @@ -46,32 +38,33 @@ trackA = << >> -trackBchannelA = \relative { +trackBchannelA = { \set Staff.instrumentName = "trackB:voiceA" - d'4 e f g - | % 2 - a bes cis d - | % 3 - + \skip 1*2 } -trackB = << - \context Voice = voiceA \trackBchannelA ->> - - -trackCchannelA = { +trackBchannelB = { \set Staff.instrumentName = "trackB:" \key d \minor + \skip 1*2 +} + +trackBchannelC = \relative c { + d'4 e f g + | % 2 + a bes cis d + | % 3 } -trackC = << - \context Voice = voiceA \trackCchannelA +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB + \context Voice = voiceC \trackBchannelC >> --- /home/yotam/pub/lilypond/input/regression/midi/key-option-all-staves.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/key-option-all-staves-midi.ly 2024-07-19 18:27:45.266330479 +0300 @@ -1,23 +1,84 @@ -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/key-option-all-staves.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/key-option-all-staves.header \header { texidoc="Midi2ly --key works on all staves, this is G major (--key=1)" options="--key=1" } +% end + +trackAchannelA = { + + + \key g \major + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 4 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "treble:one" + \skip 4 +} + +trackBchannelB = \relative c { + fis''4 +} + +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +trackCchannelA = { + + \set Staff.instrumentName = "bass:two" + \skip 4 +} + +trackCchannelB = \relative c { + fis +} + +trackC = << + + \clef bass + + \context Voice = voiceA \trackCchannelA + \context Voice = voiceB \trackCchannelB +>> + \score { << - \context Staff = "treble" << - \context Voice="one" \relative { - fis'' - } - >> - \context Staff = "bass" << - \context Voice="two" \relative { - \clef bass - fis - } - >> + \context Staff=trackB \trackA + \context Staff=trackB \trackB + \context Staff=trackC \trackA + \context Staff=trackC \trackC >> \layout {} \midi {} --- /home/yotam/pub/lilypond/input/regression/midi/key-option.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/key-option-midi.ly 2024-07-19 18:27:45.766327536 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/option-key.midi -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/key-option.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -27,16 +21,16 @@ options="--key=-1" trackAchannelA = { - % [SEQUENCE_TRACK_NAME] control track - + \key f \major + % [TEXT_EVENT] creator: - % [TEXT_EVENT] GNU LilyPond 2.13.54 + % [TEXT_EVENT] LilyPond 2.25.18 \time 4/4 \tempo 4 = 60 - + \skip 1*2 } trackA = << @@ -44,9 +38,13 @@ trackA = << >> -trackBchannelA = \relative { +trackBchannelA = { \set Staff.instrumentName = "trackB:voiceA" + \skip 1*2 +} + +trackBchannelB = \relative c { f'4 g a bes | % 2 c d e f @@ -56,18 +54,7 @@ trackBchannelA = \relative { trackB = << \context Voice = voiceA \trackBchannelA ->> - - -trackCchannelA = { - - \set Staff.instrumentName = "trackB:" - - -} - -trackC = << - \context Voice = voiceA \trackCchannelA + \context Voice = voiceB \trackBchannelB >> --- /home/yotam/pub/lilypond/input/regression/midi/lyric-combine-switch-voice.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/lyric-combine-switch-voice-midi.ly 2024-07-19 18:27:46.246324712 +0300 @@ -1,29 +1,72 @@ -\version "2.21.6" +% Lily was here -- automatically converted by midi2ly.py from out-test/lyric-combine-switch-voice.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/lyric-combine-switch-voice.header \header { - texidoc = "It is possible to switch the voice that @code{\\lyricsto} +texidoc="It is possible to switch the voice that @code{\lyricsto} follows." +options="" } +% end -\layout { - indent = 0 - ragged-right = ##t +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2 } -music = \fixed c' << - \new Staff << - \new Voice = Va \with \voiceOne { f4 s } - \new Voice = Vb \with \voiceTwo { s4 e' } - >> +trackA = << + \context Voice = voiceA \trackAchannelA +>> - \new Lyrics \lyricsto Va { - \set Lyrics.associatedVoice = Vb - Hoo hah. - } + +trackBchannelA = { + + \set Staff.instrumentName = ":Va" + \skip 2 +} + +trackBchannelB = \relative c { + f'4 e' +} + +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +trackCchannelA = \lyricmode { + "Hoo" "hah." +} + +trackC = << + \context Lyrics = voiceA \trackCchannelA >> + \score { - \music + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + \context Lyrics=trackC \trackC + >> \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/lyric-repeat-count.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/lyric-repeat-count-midi.ly 2024-07-19 18:27:46.606322593 +0300 @@ -1,33 +1,89 @@ -\version "2.23.7" +% Lily was here -- automatically converted by midi2ly.py from out-test/lyric-repeat-count.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/lyric-repeat-count.header \header { - texidoc = "This exercises @code{GregorianTranscriptionStaff} and -@code{GregorianTranscription} with MIDI output enabled." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*7 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + \skip 1*7 } -#(ly:set-option 'warning-as-error #t) +trackBchannelB = \relative c { + f'2 g + | % 2 + a g + | % 3 + f e + | % 4 + f1 + | % 5 + g1*2 f1 + | % 8 + +} -music = \fixed c' { - \repeat volta 2 { f2 g } - \repeat volta 3 { a g } - \repeat volta 4 { f e } - \repeat volta 1 f1 - g\breve f1 -} - -words = \lyricmode { - \repeat volta 2 { Lo2 -- rem. } - \repeat volta 3 { Ip -- sum. } - \repeat volta 4 { Do -- lor. } - \repeat volta 1 Sit.1 - A\breve -- met.1 +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +trackCchannelA = \lyricmode { + "Lo"2 "rem." + | % 2 + "Ip" "sum." + | % 3 + "Do" "lor." + | % 4 + "Sit."1 + | % 5 + "A"1*2 "met."4 " "2. + | % 8 + } +trackC = << + \context Lyrics = voiceA \trackCchannelA +>> + + \score { << - \new GregorianTranscriptionStaff \music - \new GregorianTranscriptionLyrics \words + \context Staff=trackB \trackA + \context Staff=trackB \trackB + \context Lyrics=trackC \trackC >> - + \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/lyric-tie.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/lyric-tie-midi.ly 2024-07-19 18:27:46.942320615 +0300 @@ -1,12 +1,82 @@ -\version "2.23.13" +% Lily was here -- automatically converted by midi2ly.py from out-test/lyric-tie.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/lyric-tie.header \header { - texidoc = "In MIDI, lyric ties are rendered as Unicode undertie characters -(U+203F)." +texidoc="" +options="" } +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*2 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = ":uniqueContext0" + \skip 1*2 +} + +trackBchannelB = \relative c { + c'1 + | % 2 + c + | % 3 + +} + +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +trackCchannelA = \lyricmode { + "a~~~a" + | % 2 + "a~~~a~~~a"4 " "2. + | % 3 + +} + +trackC = << + \context Lyrics = voiceA \trackCchannelA +>> + \score { - { c'1 1 } - \addlyrics { a~a a~a~a } - \midi { } + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + \context Lyrics=trackC \trackC + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/lyrics-addlyrics.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/lyrics-addlyrics-midi.ly 2024-07-19 18:27:47.466317532 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out/initial-key.midi -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/lyrics-addlyrics.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -17,23 +11,79 @@ } } -% included from ./out/initial-key.header +% included from ./out-test/lyrics-addlyrics.header \header { texidoc="Lyrics are preserved" options="" } % end +trackAchannelA = { + + + \key g \major + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 6/8 + + \tempo 4 = 60 + \skip 8*11 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = ":uniqueContext0" + \skip 8*11 +} + +trackBchannelB = \relative c { + d''4 b8 c4 a8 + | % 2 + d4 b8 g4 +} + +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +trackCchannelA = { + + + \key g \major + \skip 8*11 +} + +trackC = << + \context Voice = voiceA \trackCchannelA +>> + + +trackDchannelA = \lyricmode { + "Girls" "and"8 "boys"4 "come"8 + | % 2 + "out"4 "to"8 "play,"4 +} + +trackD = << + \context Lyrics = voiceA \trackDchannelA +>> + + \score { << - \relative { - \key g \major - \time 6/8 - d''4 b8 c4 a8 | d4 b8 g4 - } - \addlyrics { - Girls and \markup \bold boys come | out to play, - } + \context Staff=trackB \trackA + \context Staff=trackB \trackB + \context Lyrics=trackD \trackD >> \layout {} \midi {} --- /home/yotam/pub/lilypond/input/regression/midi/midi-overlapping-notes.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/midi-overlapping-notes-midi.ly 2024-07-19 18:27:47.802315553 +0300 @@ -1,22 +1,66 @@ +% Lily was here -- automatically converted by midi2ly.py from out-test/midi-overlapping-notes.midi +\version "2.14.0" + +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/midi-overlapping-notes.header \header { +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*3 +} - texidoc = "Notes with equal pitch overlapping in time on the same -MIDI channel should produce multiple MIDI note-on events, but no -isolated note-off events before the last of these notes ends." +trackA = << + \context Voice = voiceA \trackAchannelA +>> + +trackBchannelA = { + + % [INSTRUMENT_NAME] church organ + \skip 1*3 +} + +trackBchannelB = \relative c { + c'4 c c1. g1 + | % 4 + } -\version "2.19.45" +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + \score { - \new Staff \with { midiInstrument = "church organ" } - \new Voice \relative c' << - % This combination of music expressions should not produce audible - % pauses between notes in the MIDI output, in particular, before the - % 'g1' note in the first expression. - { c1 s1 g1 } - { s4 c4 } - { s2 c2~ c1 s1 } + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB >> - \midi { } + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/midi-polymeter.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/midi-polymeter-midi.ly 2024-07-19 18:27:48.146313530 +0300 @@ -1,16 +1,90 @@ -\version "2.23.7" +% Lily was here -- automatically converted by midi2ly.py from out-test/midi-polymeter.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/midi-polymeter.header \header { - texidoc = "@code{\enablePolymeter} can also be used with MIDI output. -This test should not produce bar check errors." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*3 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + \skip 1*3 +} + +trackBchannelB = \relative c { + c'2. c4 + | % 2 + c2 c + | % 3 + c4 c c c + | % 4 + } +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +trackCchannelA = { + \skip 1*3 +} + +trackCchannelB = \relative c { + c'1 + | % 2 + d + | % 3 + f + | % 4 + +} + +trackC = << + \context Voice = voiceA \trackCchannelA + \context Voice = voiceB \trackCchannelB +>> + + \score { - \midi { - \enablePolymeter - } << - \new Staff { \time 3/4 c'2. | 4 2 | 2 4 | 4 4 4 } - \new Staff { \time 4/4 c'1 | d' | f' } + \context Staff=trackB \trackA + \context Staff=trackB \trackB + \context Staff=trackC \trackA + \context Staff=trackC \trackC >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/music-after-fine-warning.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/music-after-fine-warning-midi.ly 2024-07-19 18:27:48.478311576 +0300 @@ -1,13 +1,64 @@ -\version "2.23.12" +% Lily was here -- automatically converted by midi2ly.py from out-test/music-after-fine-warning.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/music-after-fine-warning.header \header { - texidoc="A warning is expected when music follows @code{\\fine}." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 2 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 2 +} + +trackBchannelB = \relative c { + c4 d } -#(ly:set-option 'warning-as-error #t) -#(ly:expect-warning (G_ "found music after \\fine")) +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + \score { - { c4 \fine d4 } - \midi {} + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/pan-position.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/pan-position-midi.ly 2024-07-19 18:27:48.818309577 +0300 @@ -1,44 +1,104 @@ -\version "2.24.1" +% Lily was here -- automatically converted by midi2ly.py from out-test/pan-position.midi +\version "2.14.0" -#(ly:set-option 'warning-as-error #t) +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} +% included from ./out-test/pan-position.header \header { - texidoc = "This tests @code{Staff.midiPanPosition}. The sound -should begin with an oboe at left and a bassoon at right. They should -switch positions in three steps at intervals of two seconds." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 30 + \skip 1 + | % 2 + +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + +} + +trackB = << + \context Voice = voiceA \trackBchannelA +>> + + +trackCchannelA = { + + % [INSTRUMENT_NAME] oboe + \skip 1 + | % 2 + +} + +trackCchannelB = \relative c { + a''1 + | % 2 + +} + +trackC = << + \context Voice = voiceA \trackCchannelA + \context Voice = voiceB \trackCchannelB +>> + + +trackDchannelA = { + + % [INSTRUMENT_NAME] bassoon + \skip 1 + | % 2 + +} + +trackDchannelB = \relative c { + f, + | % 2 + } +trackD = << + + \clef bass + + \context Voice = voiceA \trackDchannelA + \context Voice = voiceB \trackDchannelB +>> + + \score { - \midi {} << - \tempo 4 = 30 - \new Staff \with { - midiInstrument = "oboe" % something sustained for audio verification - midiPanPosition = -1.0 - } << - a'1 - { - \skip 4 - \set Staff.midiPanPosition = -0.33 - \skip 4 - \set Staff.midiPanPosition = 0.33 - \skip 4 - \set Staff.midiPanPosition = 1.0 - } - >> - \new Staff \with { - midiInstrument = "bassoon" % something sustained for audio verification - midiPanPosition = 1.0 - } << - f,1 - { - \skip 4 - \set Staff.midiPanPosition = 0.33 - \skip 4 - \set Staff.midiPanPosition = -0.33 - \skip 4 - \set Staff.midiPanPosition = -1.0 - } - >> + \context Staff \trackA + \context Staff=trackC \trackA + \context Staff=trackC \trackC + \context Staff=trackD \trackA + \context Staff=trackD \trackD >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/partcombine.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/partcombine-midi.ly 2024-07-19 18:27:49.358306400 +0300 @@ -1,18 +1,13 @@ -\version "2.21.0" +% Lily was here -- automatically converted by midi2ly.py from out-test/partcombine.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -16,30 +11,100 @@ } } +% included from ./out-test/partcombine.header \header { texidoc="PartCombined music is preserved" options="--skip" } +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*5 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "staff:one" + \skip 1*5 +} + +trackBchannelB = { + + \set Staff.instrumentName = "staff:solo" + \skip 1*5 +} -instrumentOne = \relative { - c'4 d e f - R1 - d'4 c b a - b4 g2 f4 - e1 +trackBchannelC = { + + \set Staff.instrumentName = "staff:shared" + \skip 1*5 } -instrumentTwo = \relative { - R1 - g'4 a b c - d c b a - g f( e) d - e1 +trackBchannelD = { + + \set Staff.instrumentName = "staff:two" + \skip 1*5 } +trackBchannelE = \relative c { + \voiceThree + s4*13 g''2 +} + +trackBchannelF = \relative c { + \voiceTwo + s4*13 f'4 e +} + +trackBchannelG = \relative c { + \voiceOne + s1*2 d''4 c b a + | % 4 + <b g > s2 <f d >4 + | % 5 + e1 + | % 6 + +} + +trackBchannelH = \relative c { + \voiceFour + c'4 d e f + | % 2 + g a b c + | % 3 + +} + +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB + \context Voice = voiceC \trackBchannelC + \context Voice = voiceD \trackBchannelD + \context Voice = voiceE \trackBchannelE + \context Voice = voiceF \trackBchannelF + \context Voice = voiceG \trackBchannelG + \context Voice = voiceH \trackBchannelH +>> + + \score { -<< - \new Staff = "staff" \partCombine \instrumentOne \instrumentTwo + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB >> \layout {} \midi {} --- /home/yotam/pub/lilypond/input/regression/midi/performance-name-utf8.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/performance-name-utf8-midi.ly 2024-07-19 18:27:49.698304400 +0300 @@ -1,17 +1,66 @@ -\version "2.23.11" +% Lily was here -- automatically converted by midi2ly.py from out-test/performance-name-utf8.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/performance-name-utf8.header \header { - texidoc = "The performance name of the MIDI file can contain -Unicode characters. They are encoded in UTF8. +texidoc="" +options="" +} +% end + +trackAchannelA = { + + \set Staff.instrumentName = "~~~~~~~~~~~~~~~~" + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 4 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> -Note: due to the way the regression test infrastructure currently -works, any breakage in this test will not be noticed automatically." + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 4 +} + +trackBchannelB = \relative c { + c'4 } +trackB = << + + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - \header { - title = "Łïłîρøñđ" - } - { c' } - \midi { } + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/quantize-duration-2.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/quantize-duration-2-midi.ly 2024-07-19 18:27:50.210301389 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by out/bin/midi2ly from /home/janneke/testmidi.mid -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/quantize-duration-2.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -17,25 +11,26 @@ } } +% included from ./out-test/quantize-duration-2.header \header { texidoc="@code{midi2ly}'s option @option{--duration-quant} preserves first note length (16)." options="--duration-quant=16" } +% end trackAchannelA = { \key a \major - % [TEXT_EVENT] Nokia Tune + % [TEXT_EVENT] creator: - \tempo 4 = 120 - - - \key a \major + % [TEXT_EVENT] LilyPond 2.25.18 \time 3/8 + \tempo 4 = 120 + \skip 4*1138/384 } trackA = << @@ -43,15 +38,33 @@ trackA = << >> -trackBchannelB = \relative { - e'''4*41/192 r4*7/192 d4*41/192 r4*7/192 fis,4*89/192 r4*7/192 gis4*89/192 - r4*7/192 +trackBchannelA = { + + \set Staff.instrumentName = "trackB:voiceA" + \skip 4*1138/384 +} + +trackBchannelB = { + + \set Staff.instrumentName = "trackB:" + + + \key a \major + \skip 4*1138/384 +} + +trackBchannelC = \relative c { + e'''16 d fis,8 gis | % 2 - cis4*41/192 r4*7/192 b4*41/192 r4*7/192 d,4*89/192 r4*7/192 e4*89/192 + cis16 b d,8 e + | % 3 + } trackB = << - \context Voice = voiceA \trackBchannelB + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB + \context Voice = voiceC \trackBchannelC >> --- /home/yotam/pub/lilypond/input/regression/midi/quantize-duration.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/quantize-duration-midi.ly 2024-07-19 18:27:50.682298613 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/voice-2.midi -\version "2.16.0" +% Lily was here -- automatically converted by midi2ly.py from out-test/quantize-duration.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -26,16 +20,14 @@ options="--duration-quant=4" trackAchannelA = { - % [SEQUENCE_TRACK_NAME] control track - % [TEXT_EVENT] creator: - % [TEXT_EVENT] GNU LilyPond 2.13.54 + % [TEXT_EVENT] LilyPond 2.25.18 \time 4/4 \tempo 4 = 60 - + \skip 2 } trackA = << @@ -43,18 +35,35 @@ trackA = << >> -trackBchannelA = \relative c { - r4*1/8 c4*7/8 - c4*7/8 r4*1/8 +trackBchannelA = { + + \set Staff.instrumentName = "trackB:voiceA" + \skip 2 +} + +trackBchannelB = \relative c { + \voiceOne + r32 c4 +} + +trackBchannelBvoiceB = \relative c { + \voiceTwo + r4 c } trackB = << + + \clef bass + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB + \context Voice = voiceC \trackBchannelBvoiceB >> \score { << + \context Staff=trackB \trackA \context Staff=trackB \trackB >> \layout {} --- /home/yotam/pub/lilypond/input/regression/midi/quantize-start.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/quantize-start-midi.ly 2024-07-19 18:27:51.138295931 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/voice-2.midi -\version "2.16.0" +% Lily was here -- automatically converted by midi2ly.py from out-test/quantize-start.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -26,16 +20,14 @@ options="--start-quant=4" trackAchannelA = { - % [SEQUENCE_TRACK_NAME] control track - % [TEXT_EVENT] creator: - % [TEXT_EVENT] GNU LilyPond 2.13.54 + % [TEXT_EVENT] LilyPond 2.25.18 \time 4/4 \tempo 4 = 60 - + \skip 2 } trackA = << @@ -43,18 +35,28 @@ trackA = << >> -trackBchannelA = \relative c { - r4*1/8 c4*7/8 - c4*7/8 r4*1/8 +trackBchannelA = { + + \set Staff.instrumentName = "trackB:voiceA" + \skip 2 +} + +trackBchannelB = \relative c { + c4 c } trackB = << + + \clef bass + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB >> \score { << + \context Staff=trackB \trackA \context Staff=trackB \trackB >> \layout {} --- /home/yotam/pub/lilypond/input/regression/midi/rehearsal-mark.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/rehearsal-mark-midi.ly 2024-07-19 18:27:51.470293979 +0300 @@ -1,12 +1,83 @@ -\version "2.23.6" +% Lily was here -- automatically converted by midi2ly.py from out-test/rehearsal-mark.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/rehearsal-mark.header \header { - texidoc="Rehearsal marks create MIDI Marker events." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1 + | % 2 + + % [MARKER] A + \skip 1 + | % 3 + + % [MARKER] B + \skip 1 + | % 4 + + % [MARKER] X + \skip 1 + | % 5 + +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 1*4 +} + +trackBchannelB = \relative c { + c'1 + | % 2 + d + | % 3 + e + | % 4 + f + | % 5 + } +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - \fixed c' { - c1 \mark \default d1 \mark \default e1 \mark 23 f1 - } + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/repeat-segno.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/repeat-segno-midi.ly 2024-07-19 18:27:51.810291980 +0300 @@ -1,22 +1,105 @@ -\version "2.23.6" +% Lily was here -- automatically converted by midi2ly.py from out-test/repeat-segno.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/repeat-segno.header \header { - texidoc="Segni and coda signs create MIDI Marker events." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1 + | % 2 + + % [MARKER] ~~~~ + \skip 1 + | % 3 + + % [MARKER] ~~~~ + \skip 1*3 + % [MARKER] ~~~~~~~~ + \skip 1 + | % 7 + + % [MARKER] ~~~~~~~~ + \skip 1*3 + % [MARKER] ~~~~~~~3~~~~~~~ + \skip 1 + | % 11 + + % [MARKER] ~~~~~~~3~~~~~~~ + \skip 1*2 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 1*12 +} + +trackBchannelB = \relative c { + c'1 + | % 2 + d + | % 3 + e + | % 4 + f + | % 5 + c + | % 6 + d + | % 7 + e + | % 8 + f + | % 9 + c + | % 10 + d + | % 11 + e + | % 12 + f + | % 13 + } +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - \fixed c' { - \repeat unfold 3 { - c1 - \repeat segno 2 { - d1 - \alternative { - e1 - <> - } - } - f1 - } - } + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/rest-dynamic.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/rest-dynamic-midi.ly 2024-07-19 18:27:52.282289205 +0300 @@ -1,13 +1,63 @@ -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/rest-dynamic.midi +\version "2.14.0" + +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/rest-dynamic.header \header { texidoc="LilyPond respects rests, also when there are dynamics" options="" } +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 2/4 + + \tempo 4 = 60 + \skip 1 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + \skip 1 +} + +trackBchannelB = \relative c { + e'4 e + | % 2 + r4 e + | % 3 + +} + +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + \score { - \new Staff \relative { - \time 2/4 e'4 e r4 e\f | - } + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/rest.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/rest-midi.ly 2024-07-19 18:27:52.770286335 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/rest.midi -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/rest.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -26,15 +20,15 @@ options="" trackAchannelA = { - % [SEQUENCE_TRACK_NAME] control track - % [TEXT_EVENT] creator: - % [TEXT_EVENT] GNU LilyPond 2.13.54 + % [TEXT_EVENT] LilyPond 2.25.18 \time 4/4 \tempo 4 = 60 + \skip 1 + | % 2 } @@ -43,10 +37,16 @@ trackA = << >> -trackBchannelA = \relative { - r4 +trackBchannelA = { + \set Staff.instrumentName = "trackB:voiceA" - a, r4 a + \skip 1 + | % 2 + +} + +trackBchannelB = \relative c { + r4 a r4 a | % 2 } @@ -56,6 +56,7 @@ trackB = << \clef bass \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB >> --- /home/yotam/pub/lilypond/input/regression/midi/section-label.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/section-label-midi.ly 2024-07-19 18:27:53.102284384 +0300 @@ -1,13 +1,73 @@ -\version "2.23.6" +% Lily was here -- automatically converted by midi2ly.py from out-test/section-label.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/section-label.header \header { - texidoc="Section labels create MIDI Marker events." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + % [MARKER] Intro + + \tempo 4 = 60 + \skip 1 + | % 2 + + % [MARKER] Coda + \skip 1 + | % 3 + +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 1*2 +} + +trackBchannelB = \relative c { + c'1 + | % 2 + d + | % 3 + } +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - \fixed c' { - \sectionLabel \markup \smallCaps "Intro" c1 - \sectionLabel "Coda" d1 - } + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/sequence-name-scoping.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/sequence-name-scoping-midi.ly 2024-07-19 18:27:54.146278246 +0300 @@ -1,7 +1,19 @@ -\version "2.19.25" +% Lily was here -- automatically converted by midi2ly.py from out-test/sequence-name-scoping.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/sequence-name-scoping.header \header { - texidoc="If a score has a @code{\header} block which defines a title, +texidoc="If a score has a @code{\header} block which defines a title, this title should override any title defined in a @code{\header} block of the score's enclosing @code{\bookpart} or @code{\book} (or a title defined in a top-level @code{\header} block) when naming the MIDI @@ -10,73 +22,57 @@ using the title defined in the @code{\header} block of the nearest enclosing @code{\bookpart}, @code{\book}, or top-level scope that contains a title definition." - title = "Top-level title" +options="" } +% end -music = \new Staff { c1 } +trackAchannelA = { + + \set Staff.instrumentName = "Book" + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1 + | % 2 + +} -% Book with a title defined in a \header block, and book parts -\book { - \header { title = "Book" } +trackA = << + \context Voice = voiceA \trackAchannelA +>> - % score without a \header block outside of any book part -- the MIDI - % sequence should get the title of the book as its name - \score { - \music - \layout { } - \midi { } - } - % score with a \header and a title outside of any book part -- the MIDI - % sequence should be named with the title from this \header block - \score { - \music - \header { title = "Score in a \book" } - \layout { } - \midi { } - } - - % Book part with a \header block and a title - \bookpart { - \header { title = "Book part" } - - % score without a \header block -- the MIDI sequence should get its name - % from the title of the enclosing book part - \score { - \music - \layout { } - \midi { } - } - - % score with a \header (and a title) of its own -- the MIDI sequence - % should get its name from the title in this \header block - \score { - \music - \header { title = "Score in a book part (w/ a title) of a book" } - \layout { } - \midi { } - } - } +trackBchannelA = { + \skip 1 + | % 2 + +} - % Book part without a \header block - \bookpart { +trackBchannelB = \relative c { + c1 + | % 2 + +} - % score without a \header block -- the MIDI sequence should be named - % using the title from the enclosing book - \score { - \music - \layout { } - \midi { } - } - - % score with a \header block and title -- the MIDI sequence should get - % its name from the title in this \header block - \score { - \music - \header { title = "Score in a book part (w/o a title) of a book" } - \layout { } - \midi { } - } - } +trackB = << + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +\score { + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/sequence-name.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/sequence-name-midi.ly 2024-07-19 18:27:53.598281468 +0300 @@ -1,7 +1,19 @@ -\version "2.19.25" +% Lily was here -- automatically converted by midi2ly.py from out-test/sequence-name.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/sequence-name.header \header { - texidoc="The MIDI sequence generated from a score should get its name +texidoc="The MIDI sequence generated from a score should get its name from the title defined in the score's @code{\header} block (if any). The title used for layout can be overridden for MIDI output by specifying a separate @code{midititle} in the @code{\header} block. @@ -9,55 +21,57 @@ @code{\bookpart}, @code{\book}, or top-level scope with a @code{\header} block that defines a title, either, the MIDI sequence should get the default name." +options="" } +% end -music = \new Staff { c1 } +trackAchannelA = { + + \set Staff.instrumentName = "Title shared between layout and MIDI" + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1 + | % 2 + +} -% Book without a \header block -\book { +trackA = << + \context Voice = voiceA \trackAchannelA +>> - % score with a \header block including a title -- the MIDI sequence - % should get its name from this \header block - \score { - \music - \header { title = "Title shared between layout and MIDI" } - \layout { } - \midi { } - } - % score with no title, but a midititle defined in a \header block -- - % the MIDI sequence should be named using the midititle in this \header - % block - \score { - \music - \header { midititle = "No title for layout, but a title for MIDI" } - \layout { } - \midi { } - } - - % score with a title and a midititle defined in a \header block -- the - % MIDI sequence should get the midititle in this \header block as its - % name - \score { - \music - \header { - title = "Title for layout" - midititle = "Title for MIDI" - } - \layout { } - \midi { } - } +trackBchannelA = { + \skip 1 + | % 2 + +} - % Book part with no \header block - \bookpart { +trackBchannelB = \relative c { + c1 + | % 2 + +} - % score without a \header -- the MIDI sequence should get the default - % name - \score { - \music - \layout { } - \midi { } - } - } +trackB = << + \clef bass + + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + +\score { + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} + \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/spacer-no-notes.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/spacer-no-notes-midi.ly 2024-07-19 18:27:54.478276295 +0300 @@ -1,16 +1,61 @@ -\version "2.21.7" +% Lily was here -- automatically converted by midi2ly.py from out-test/spacer-no-notes.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/spacer-no-notes.header \header { - texidoc = "This test should produce a two-measure MIDI file in the -key of G minor, but with no notes." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + + \key g \minor + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*2 } -#(ly:set-option 'warning-as-error #t) +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + + + \key g \minor + \skip 1*2 +} + +trackB = << + \context Voice = voiceA \trackBchannelA +>> + \score { - { - \key g \minor - s1*2 - } + << + \context Staff \trackA + >> + \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/staff-map-instrument.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/staff-map-instrument-midi.ly 2024-07-19 18:27:55.038273003 +0300 @@ -1,44 +1,130 @@ -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/staff-map-instrument.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/staff-map-instrument.header \header { texidoc="Midi2ly remaps voices correctly to staves in MIDI-files that use instrument<->channel mapping when combined with voice<->track mapping. TODO: pianostaff" options="" } +% end + +trackAchannelA = { + + + \key c \minor + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*2 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "treble:one" + \skip 1*2 +} + +trackBchannelB = { + + \set Staff.instrumentName = "treble:" + + + \key c \minor + \skip 1*2 +} + +trackBchannelC = { + + \set Staff.instrumentName = "treble:two" + \skip 1*2 +} + +trackBchannelD = \relative c { + \voiceOne + f''8 ees16 d c bes aes g f8 aes' g f + | % 2 + f,16 g aes4 g16 f e2 + | % 3 + +} + +trackBchannelE = \relative c { + \voiceTwo + c''4 r4. f8 ees d + | % 2 + <b, d > r8 <b d > r8 <g c >2 + | % 3 + +} + +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB + \context Voice = voiceC \trackBchannelC + \context Voice = voiceD \trackBchannelD + \context Voice = voiceE \trackBchannelE +>> + + +trackCchannelA = { + + \set Staff.instrumentName = "bass:three" + \skip 1*2 +} + +trackCchannelB = { + + \set Staff.instrumentName = "bass:" + + + \key c \minor + \skip 1*2 +} + +trackCchannelC = \relative c { + r8 c'16 b c8 g aes c16 b c8 d + | % 2 + <c,, c' >1 + | % 3 + +} + +trackC = << + + \clef bass + + \context Voice = voiceA \trackCchannelA + \context Voice = voiceB \trackCchannelB + \context Voice = voiceC \trackCchannelC +>> + \score { -%% TODO:PIANOSTAFF \context PianoStaff << << - \context Staff = "treble" << - \set Score.midiChannelMapping = #'instrument - \context Voice="one" \relative { - \time 4/4 - \key c \minor - \voiceOne -%comes -%7 - f''8 es16 d c16 bes ! as g f8 as' g f -%8 es8 d es f b, c d b | - f,16 g as4 g16 f e2 | - } - \context Voice="two" \relative { - \voiceTwo -%dux -%7 - c''4 r4 r8 f es d | -%8 r8 as g f g f16 es f8 d | - <b, d>8 r <b d> r <g c>2 | - } - >> - \context Staff = "bass" << - \context Voice="three" \relative { - \key c \minor - \clef bass -%7 - r8 c'16 b c8 g as c16 b c8 d | -%8 g8 c16 b c8 d f,16 g as4 g16 f | - <c,, c'>1 - } - >> + \context Staff=trackB \trackA + \context Staff=trackB \trackB + \context Staff=trackC \trackA + \context Staff=trackC \trackC >> \layout {} \midi {} --- /home/yotam/pub/lilypond/input/regression/midi/staff-map-voice.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/staff-map-voice-midi.ly 2024-07-19 18:27:55.590269759 +0300 @@ -1,44 +1,109 @@ -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/staff-map-voice.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/staff-map-voice.header \header { texidoc="Midi2ly remaps voices correctly to staves in MIDI-files that use voice<->channel mapping when combined with staff<->track mapping. TODO: pianostaff" options="" } +% end + +trackAchannelA = { + + + \key c \minor + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1*2 +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "treble:one" + + + \key c \minor + \skip 1*2 +} + +trackBchannelB = \relative c { + \voiceOne + f''8 ees16 d c bes aes g f8 aes' g f + | % 2 + f,16 g aes4 g16 f e2 + | % 3 + +} + +trackBchannelC = \relative c { + \voiceTwo + c''4 r4. f8 ees d + | % 2 + <b, d > r8 <b d > r8 <g c >2 + | % 3 + +} + +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB + \context Voice = voiceC \trackBchannelC +>> + + +trackCchannelA = { + + \set Staff.instrumentName = "bass:three" + + + \key c \minor + \skip 1*2 +} + +trackCchannelB = \relative c { + r8 c'16 b c8 g aes c16 b c8 d + | % 2 + <c,, c' >1 + | % 3 + +} + +trackC = << + + \clef bass + + \context Voice = voiceA \trackCchannelA + \context Voice = voiceB \trackCchannelB +>> + \score { -%% TODO:PIANOSTAFF \context PianoStaff << << - \context Staff = "treble" << - \set Score.midiChannelMapping = #'voice - \context Voice="one" \relative { - \time 4/4 - \key c \minor - \voiceOne -%comes -%7 - f''8 es16 d c16 bes ! as g f8 as' g f -%8 es8 d es f b, c d b | - f,16 g as4 g16 f e2 | - } - \context Voice="two" \relative { - \voiceTwo -%dux -%7 - c''4 r4 r8 f es d | -%8 r8 as g f g f16 es f8 d | - <b, d>8 r <b d> r <g c>2 | - } - >> - \context Staff = "bass" << - \context Voice="three" \relative { - \key c \minor - \clef bass -%7 - r8 c'16 b c8 g as c16 b c8 d | -%8 g8 c16 b c8 d f,16 g as4 g16 f | - <c,, c'>1 - } - >> + \context Staff=trackB \trackA + \context Staff=trackB \trackB + \context Staff=trackC \trackA + \context Staff=trackC \trackC >> \layout {} \midi {} --- /home/yotam/pub/lilypond/input/regression/midi/varcoda.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/varcoda-midi.ly 2024-07-19 18:27:55.926267785 +0300 @@ -1,15 +1,71 @@ -\version "2.23.6" +% Lily was here -- automatically converted by midi2ly.py from out-test/varcoda.midi +\version "2.14.0" +\layout { + \context { + \Voice + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver + } +} + +% included from ./out-test/varcoda.header \header { - texidoc="Variant coda signs create MIDI Marker events." +texidoc="" +options="" +} +% end + +trackAchannelA = { + + % [TEXT_EVENT] creator: + + % [TEXT_EVENT] LilyPond 2.25.18 + + \time 4/4 + + \tempo 4 = 60 + \skip 1 + | % 2 + + % [MARKER] ~~~~ + \skip 1 + | % 3 + +} + +trackA = << + \context Voice = voiceA \trackAchannelA +>> + + +trackBchannelA = { + + \set Staff.instrumentName = "\new:" + \skip 1*2 +} + +trackBchannelB = \relative c { + c'1 + | % 2 + d + | % 3 + } +trackB = << + \context Voice = voiceA \trackBchannelA + \context Voice = voiceB \trackBchannelB +>> + + \score { - \fixed c' { - \set Score.codaMarkFormatter = #format-varcoda-mark - c1 - \codaMark \default - d1 - } + << + \context Staff=trackB \trackA + \context Staff=trackB \trackB + >> + \layout {} \midi {} } --- /home/yotam/pub/lilypond/input/regression/midi/voice-2.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/voice-2-midi.ly 2024-07-19 18:27:56.418264893 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/voice-2.midi -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/voice-2.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -26,15 +20,15 @@ options="" trackAchannelA = { - % [SEQUENCE_TRACK_NAME] control track - % [TEXT_EVENT] creator: - % [TEXT_EVENT] GNU LilyPond 2.13.54 + % [TEXT_EVENT] LilyPond 2.25.18 \time 4/4 \tempo 4 = 60 + \skip 1 + | % 2 } @@ -43,16 +37,30 @@ trackA = << >> -trackBchannelA = \relative { - \voiceOne +trackBchannelA = { + + \set Staff.instrumentName = "trackB:voiceA" + \skip 1 + | % 2 - \set Staff.instrumentName = ":1" +} + +trackBchannelB = { + + \set Staff.instrumentName = "trackB:voiceB" + \skip 1 + | % 2 + +} + +trackBchannelC = \relative c { + \voiceOne e''4 e e e | % 2 } -trackBchannelB = \relative { +trackBchannelD = \relative c { \voiceTwo f' f f f | % 2 @@ -62,6 +70,8 @@ trackBchannelB = \relative { trackB = << \context Voice = voiceA \trackBchannelA \context Voice = voiceB \trackBchannelB + \context Voice = voiceC \trackBchannelC + \context Voice = voiceD \trackBchannelD >> --- /home/yotam/pub/lilypond/input/regression/midi/voice-4.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/voice-4-midi.ly 2024-07-19 18:27:56.926261908 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/voice-4.midi -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/voice-4.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -26,15 +20,15 @@ options="" trackAchannelA = { - % [SEQUENCE_TRACK_NAME] control track - % [TEXT_EVENT] creator: - % [TEXT_EVENT] GNU LilyPond 2.13.54 + % [TEXT_EVENT] LilyPond 2.25.18 \time 4/4 \tempo 4 = 60 + \skip 1 + | % 2 } @@ -43,30 +37,60 @@ trackA = << >> -trackBchannelA = \relative { - \voiceOne +trackBchannelA = { + + \set Staff.instrumentName = "trackB:voiceA" + \skip 1 + | % 2 + +} + +trackBchannelB = { + + \set Staff.instrumentName = "trackB:voiceD" + \skip 1 + | % 2 - \set Staff.instrumentName = ":1" +} + +trackBchannelC = { + + \set Staff.instrumentName = "trackB:voiceC" + \skip 1 + | % 2 + +} + +trackBchannelD = { + + \set Staff.instrumentName = "trackB:voiceB" + \skip 1 + | % 2 + +} + +trackBchannelE = \relative c { + \voiceOne <c''' a >2 b | % 2 } -trackBchannelB = \relative { +trackBchannelF = \relative c { \voiceThree c''4. d8 e4 f | % 2 } -trackBchannelC = \relative { +trackBchannelG = \relative c { \voiceFour d'1 | % 2 } -trackBchannelD = \relative { +trackBchannelH = \relative c { \voiceTwo c'4 c2 c4 | % 2 @@ -78,6 +102,10 @@ trackB = << \context Voice = voiceB \trackBchannelB \context Voice = voiceC \trackBchannelC \context Voice = voiceD \trackBchannelD + \context Voice = voiceE \trackBchannelE + \context Voice = voiceF \trackBchannelF + \context Voice = voiceG \trackBchannelG + \context Voice = voiceH \trackBchannelH >> --- /home/yotam/pub/lilypond/input/regression/midi/voice-5.ly 2023-10-18 21:06:35.366721450 +0300 +++ out-test/recovered/voice-5-midi.ly 2024-07-19 18:27:57.454258805 +0300 @@ -1,19 +1,13 @@ -% Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/voice-4.midi -\version "2.19.21" +% Lily was here -- automatically converted by midi2ly.py from out-test/voice-5.midi +\version "2.14.0" \layout { \context { \Voice - \remove "Note_heads_engraver" - \consists "Completion_heads_engraver" - \remove "Rest_engraver" - \consists "Completion_rest_engraver" - } -} -\midi { - \context { - \Score - midiChannelMapping = #'instrument + \remove Note_heads_engraver + \consists Completion_heads_engraver + \remove Rest_engraver + \consists Completion_rest_engraver } } @@ -26,16 +20,14 @@ options="" trackAchannelA = { - % [SEQUENCE_TRACK_NAME] control track - % [TEXT_EVENT] creator: - % [TEXT_EVENT] GNU LilyPond 2.13.54 + % [TEXT_EVENT] LilyPond 2.25.18 \time 4/4 \tempo 4 = 60 - + \skip 1*2 } trackA = << @@ -43,39 +35,69 @@ trackA = << >> -trackBchannelA = \relative { - \voiceOne +trackBchannelA = { - \set Staff.instrumentName = ":1" + \set Staff.instrumentName = "trackB:voiceA" + \skip 1*2 +} + +trackBchannelB = { + + \set Staff.instrumentName = "trackB:voiceE" + \skip 1*2 +} + +trackBchannelC = { + + \set Staff.instrumentName = "trackB:voiceD" + \skip 1*2 +} + +trackBchannelD = { + + \set Staff.instrumentName = "trackB:voiceC" + \skip 1*2 +} + +trackBchannelE = { + + \set Staff.instrumentName = "trackB:voiceB" + \skip 1*2 +} + +trackBchannelF = \relative c { + \voiceOne <c''' a >2 b | % 2 } -trackBchannelB = \relative { +trackBchannelG = \relative c { \voiceThree c''4. d8 e4 f | % 2 } -trackBchannelC = \relative { +trackBchannelH = \relative c { \voiceFour d'1 | % 2 } -trackBchannelD = \relative { +trackBchannelI = \relative c { \voiceTwo c'4 c2 c4 | % 2 } -trackBchannelE = \relative { - s1 d1 +trackBchannelJ = \relative c { + r1 | % 2 + d + | % 3 } @@ -85,6 +107,11 @@ trackB = << \context Voice = voiceC \trackBchannelC \context Voice = voiceD \trackBchannelD \context Voice = voiceE \trackBchannelE + \context Voice = voiceF \trackBchannelF + \context Voice = voiceG \trackBchannelG + \context Voice = voiceH \trackBchannelH + \context Voice = voiceI \trackBchannelI + \context Voice = voiceJ \trackBchannelJ >>