[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