lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: transposition des noms d'accords et principe de la moindre altératio


From: Jean Abou Samra
Subject: Re: transposition des noms d'accords et principe de la moindre altération
Date: Sat, 22 Jan 2022 18:42:35 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0

Le 22/01/2022 à 17:11, Vincent Gay a écrit :
Bonsoir à toutes et à tous

soit la suite d'accords
G♯m7 C♯7 F♯Δ

si je la transpose pour un instrument en mi♭ (\transpose c a) j'obtiens :
E#m7 A#7 D♯Δ

c'est pas très intuitif pour un musicien moyen. J'aurais évidemment préféré (principe de la moindre altération) :
Fm7 b♭7 E♭Δ

j'ai bien essayé \transpose gis bes, ça fonctionne sur la séquence mais je ne vous raconte pas le résultat sur les accords ordinaires du reste de la pièce.

j'aurai pu remplacer la séquence originelle par
A♭m7 G♭7 G♭Δ
mais allez savoir pourquoi le guitariste et le pianiste ne sont pas d'accord...

existe-t-il une solution plus élégante que de dupliquer ma variable contenant les noms d'accords ?

[...]



Oui, avec la propriété chordRootNamer, qui définit la
manière dont s'affiche la note principale. Par défaut,
c'est note-name->markup. On peut la changer pour
qu'elle change la note en une enharmonique plus naturelle
avant de la passer à note-name->markup.


\version "2.22.1"

#(use-modules (ice-9 match))

#(define enharmonization
   #((0 . 0) ; C♮
     (0 . 1/2) ; D♭ → C ♯
     (1 . 0) ; D♮
     (2 . -1/2) ; D♯ → E♭
     (2 . 0) ; E♮
     (3 . 0) ; F♮
     (3 . -1/2) ; G♭ → F♯
     (4 . 0) ; G♮
     #f ; G♯/A♭
     (5 . 0) ; A♮
     (6 . -1/2) ; A♯ → B♭
     (6 . 0) ; B♮
     ))

#(define (enharmonize pitch)
   (let* ((semitones (ly:pitch-semitones pitch))
          (normalized-semitones (modulo semitones 12))
          (eventual-octave (* 1/12 (- semitones normalized-semitones))))
     (match (vector-ref enharmonization normalized-semitones)
      ((best-name . best-alteration)
         (ly:make-pitch eventual-octave best-name best-alteration))
      (#f
         ;; G♯/A♭
         (if (positive? (ly:pitch-alteration pitch))
             (ly:make-pitch eventual-octave 4 1/2)
             (ly:make-pitch eventual-octave 5 -1/2))))))

%% Tests
#(for-each
  (match-lambda
   ((input output)
     (let ((processed (enharmonize input)))
       (if (not (equal? output (enharmonize input)))
           (ly:error "~s -> ~s: bad output, expected ~s" input processed output)))))
  `((,#{ c #} ,#{ c #})
    (,#{ cis #} ,#{ cis #})
    (,#{ des #} ,#{ cis #})
    (,#{ des'' #} ,#{ cis'' #})
    (,#{ bisis #} ,#{ cis' #})
    (,#{ eeses #} ,#{ d #})
    (,#{ gis,, #} ,#{ gis,, #})
    (,#{ aes,, #} ,#{ aes,, #})
    (,#{ fisis,, #} ,#{ g,, #})))


\layout {
  \context {
    \ChordNames
    chordRootNamer =
      #(lambda (pitch lowercase)
         (note-name->markup (enharmonize pitch)
                            lowercase))
  }
}

theNotes = { \repeat unfold 6 { R1 } }
theChords = \chordmode { gis1:m7 cis:7 fis:7+ g:m7 c:7 f:7+}

\score {
  <<
    \new ChordNames \theChords
    \new Staff \theNotes
  >>
}

\score {
  <<
    \new ChordNames \transpose c a \theChords
    \new Staff \theNotes
  >>
}


Bien cordialement,
Jean




reply via email to

[Prev in Thread] Current Thread [Next in Thread]