2015-08-18 22:32 GMT+02:00 Thomas Morley <thomasmorle...@gmail.com>: > 2015-08-18 11:57 GMT+02:00 David Kastrup <d...@gnu.org>: >> Nik Repka <nikre...@gmail.com> writes: >> >>> I am attempting to make a scales sheet for piano. I need to use autochange >>> simultaneously in two voices. >>> >>> I am using the syntax from this snippet page: >>> http://www.lilypond.org/doc/v2.15/Documentation/snippets-big-page#keyboards-using-autochange-with-more-than-one-voice. >>> >>> The issue I am having is that autochange only works on the top voice, and it >>> drags the lower voice up into the top staff. Here is the code: >>> >>> \version "2.18.2" >>> >>> scaleRH = \relative c' {c d e f g a b c c b a g f e d c >>> g a b c d e fis g g fis e d c b a g} >>> >>> scaleLH = \relative c {c d e f g a b c c b a g f e d c >>> g a b c d e fis g g fis e d c b a g} >>> >>> >>> \score { >>> \new PianoStaff >>> >>> << \new Staff = "up" >>> << >>> \new Voice { >>> \voiceOne >>> \autochange >>> >>> \scaleRH >>> >>> } >>> >>> \new Voice { >>> \voiceTwo \autochange >>> >>> \scaleLH >>> } >>> >> >>> >>> \new Staff = "down" { >>> \clef bass >>> } >>> >> >>> } >> >> Ok, disregard my previous reply. It turns out that the whole >> catastrophe happens _exclusively_ when the first note of the first voice >> is c' (or probably one of cis' cisis' ces' ceses'). > > This not entirely true. > > It happens when the first note is the same as the turning point. > Because 2.19.25 allows for different turning points, we can test easily: > > \version "2.19.25" > > scaleRH = \relative c' { d c d e } > > scaleLH = \relative c { d c d e } > > > \new PianoStaff > << \new Staff = "up" > << > \new Voice { > \voiceOne > \autochange d' > \scaleRH > } > > \new Voice { > \voiceTwo > \autochange d' > \scaleLH > } > >> > \new Staff = "down" { > \clef bass > } > >> > > > returns badly as well. > > Investgating further ... > > > Cheers, > Harm
I tried to patch autochange.scm with: (define-public (make-autochange-music ref-pitch music) (define (generate-split-list change-moment prev-dir event-list acc) (if (null? event-list) acc (let* ((now-tun (caar event-list)) (evs (map car (cdar event-list))) (now (car now-tun)) (notes (filter (lambda (x) (ly:in-event-class? x 'note-event)) evs)) (pitch (if (pair? notes) (ly:event-property (car notes) 'pitch) #f)) ;; changed: (dir (cond ((and pitch (= (ly:pitch-steps ref-pitch) (ly:pitch-steps (ly:music-property (car (extract-named-music music 'NoteEvent)) 'pitch)))) 1) (pitch (sign (- (ly:pitch-steps pitch) (ly:pitch-steps ref-pitch)))) (else 0)))) ;; tail recursive. (if (and (not (= dir 0)) (not (= dir prev-dir))) (generate-split-list #f dir (cdr event-list) (cons (cons (if change-moment change-moment now) (if (< dir 0) 'down 'up)) acc)) (generate-split-list (if pitch #f (if change-moment change-moment now)) dir (cdr event-list) acc))))) (let* ((m (make-music 'AutoChangeMusic)) (m1 (context-spec-music (make-non-relative-music music) 'Voice "")) (context-list (recording-group-emulate m1 (ly:parser-lookup 'partCombineListener))) (rev (reverse! (cdar context-list))) (split (reverse! (generate-split-list #f 0 rev '()) '()))) (set! (ly:music-property m 'element) m1) (set! (ly:music-property m 'context-change-list) split) m)) If I didn't overlook something, the autochange related regtests look ok. But I didn't do make check so far (it's late and it lasts too long on my not so powerful laptop) Though, I have the feeling it cures the symptom not the underlaying problem. Therefore I didn't upload a patch yet. If you think it's appropiate I'll create a tracker and do the upload. For testing you may use the code above or the patch attached. Cheers, Harm
From 196e7954c5302810ef927db49a62dfa13ec18e2b Mon Sep 17 00:00:00 2001 From: Thomas Morley <thomasmorle...@gmail.com> Date: Tue, 18 Aug 2015 23:11:12 +0200 Subject: [PATCH] fix autochange.scm when starting pitch and ref-pitch are the same --- scm/autochange.scm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/scm/autochange.scm b/scm/autochange.scm index 5810f32..26199f6 100644 --- a/scm/autochange.scm +++ b/scm/autochange.scm @@ -32,10 +32,19 @@ (pitch (if (pair? notes) (ly:event-property (car notes) 'pitch) #f)) - (dir (if pitch - (sign - (- (ly:pitch-steps pitch) (ly:pitch-steps ref-pitch))) - 0))) + (dir (cond ((and pitch + (= (ly:pitch-steps ref-pitch) + (ly:pitch-steps + (ly:music-property + (car + (extract-named-music music 'NoteEvent)) + 'pitch)))) + 1) + (pitch + (sign + (- (ly:pitch-steps pitch) + (ly:pitch-steps ref-pitch)))) + (else 0)))) ;; tail recursive. (if (and (not (= dir 0)) (not (= dir prev-dir))) -- 1.9.1
_______________________________________________ bug-lilypond mailing list bug-lilypond@gnu.org https://lists.gnu.org/mailman/listinfo/bug-lilypond