Subject: \autochange

From: Philhar <[email-masked]>
Date: Thu, 21 Oct 2010 22:54:22 -0700 (PDT)

Bonjour à toutes et à tous,

Dans le code ci-dessous, la commande \autochange me donne un résultat qui ne
me satisfait pas.

\version "2.13.9" 

up = {
	\relative c'' {
	\clef treble
	\key c \minor
	\time 2/4
	\autochange \relative c'' { \stemUp ees,,32 c' ees c ees, des' ees des ees,
c' ees c ees, c' ees c }
	}
}
down = {
	\relative c {
	\clef bass
	\key c \minor
	\time 2/4
	\stemDown aes8 bes aes ees 
	}
}

\score {
	\new PianoStaff <<
		\new Staff = "up" \up
		\new Staff = "down" \down
}

Je voudrais que le 1er do  se trouve au-dessous de la portée du haut (comme
le 2ème), et non au-dessus de la portée du bas.
Dans un autre passage du même genre, un si doit rester lié à la portée
supérieure. La commande le met logiquement sur la portée inférieure, puisque
la note pivot est le do. Est-il possible d'imposer une autre  note pivot à
la commande ?

Merci pour votre aide,
Michel

-- 
View this message in context: http://lilypond-french-users.1298960.n2.nabble.com/autochange-tp5661407p5661407.html
Sent from the LilyPond French Users mailing list archive at Nabble.com.

---

From: Valentin Villenave <[email-masked]>
Date: Fri, 22 Oct 2010 12:08:26 +0200

> la note pivot est le do. Est-il possible d'imposer une autre  note pivot à

En trafiquant un peu, oui.

#(define (sign x)
  (if (= x 0)
      0
      (if (< x 0) -1 1)))

#(define-public (make-autochange-music parser music . split-pitch)
  (define (generate-split-list change-moment event-list acc split-delta)
    (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)
				(equal? (ly:event-property  x 'class) 'note-event))
			      evs))
	       (pitch (if (pair? notes)
			  (ly:event-property (car notes) 'pitch)
			  #f)))
	  ;; optional: do we have a different split-pitch?
	  (if (and pitch split-delta)
	      (set! pitch (ly:pitch-transpose pitch split-delta)))
	  ;; tail recursive.
	  (if (and pitch (not (= (ly:pitch-steps pitch) 0)))
	      (generate-split-list #f
				   (cdr event-list)
				   (cons (cons

					  (if change-moment
					      change-moment
					      now)
					  (sign (ly:pitch-steps pitch))) acc)
				   split-delta)
	      (generate-split-list
	       (if pitch #f now)
	       (cdr event-list) acc split-delta)))))

  (let* ((m (make-music 'AutoChangeMusic))
	 (m1 (make-non-relative-music (context-spec-music music 'Voice "one")))
	 (context-list (recording-group-emulate music
						(ly:parser-lookup parser 'partCombineListener)))
	 (evs (car context-list))
         (rev (reverse! (cdar context-list)))
	 (split-delta (if (ly:pitch? (car split-pitch))
			  (ly:pitch-negate (car split-pitch))
			  #f))
	 (split (reverse! (generate-split-list
			   #f
			   rev
			   '()
			   split-delta)
			  '())))
    (set! (ly:music-property m 'element) music)
    (set! (ly:music-property m 'split-list) split)
    m))

autochangeWithPitch =
#(define-music-function (parser location ref music) (ly:music? ly:music?)
       (let* ((note (car (ly:music-property ref 'elements)))
              (ref-pitch (ly:music-property note 'pitch)))
   (make-autochange-music parser music
     (if (ly:pitch? ref-pitch) ref-pitch #f))))

\context PianoStaff <<
  \context Staff = "up" {
    \autochangeWithPitch a \new Voice << \relative c' {
        g4 c e d c r4 a g } >>
  }
  \context Staff = "down" {
    \clef bass
    s1*2
  }

Je vais proposer un patch à ce sujet.

Cordialement,
V. Villenave.

---

From: Philhar <[email-masked]>
Date: Sat, 23 Oct 2010 22:37:39 -0700 (PDT)

Merci Valentin, ça marche.
J'ai encore quelques comportements étranges sur certains passages, mais en
adaptant la note pivot par sections, j'obtiens le bon résultat.

Cordialement,
Michel

-- 
View this message in context: http://lilypond-french-users.1298960.n2.nabble.com/autochange-tp5661407p5667057.html
Sent from the LilyPond French Users mailing list archive at Nabble.com.