|
From: | daviau ewen |
Subject: | Re: Function which return the chords of the degrees of a mode |
Date: | Tue, 16 May 2017 22:21:03 +0200 |
2017-05-15 19:56 GMT+02:00 zaord <address@hidden>:Hi Here,
I'am trying to make a function which is returning a list of 7 chords
corresponding of each degree of a mode.
Exemple :
In X Major, we knows that the chords are :
degree 1 : Maj
degree 2 : min
degree 3 : min
degree 4 : Maj
degree 5 : Maj
degree 6 : min
degree 7 : dim
So in C Maj scale, the function will return a list of <c e g > <d f a> <e g
b > <f a c> < g b d > *.
In A minor the function will return a list of < * c e g > <d f a> <e g b >
<f a c> < g b d >.
Do you have any idea to make this function simple to code ?
Best,
And thanks
How about:
\version "2.19.60"
%% STEPS:
%% - Construct the requested scale, for use with 'modalTranspose' it needs to be
%% sequential music.
%% - Construct the tonic-chord.
%% - Transpose the tonic-chord with 'modalTranspose',
%% using 'multipleModalTransposes'
multipleModalTransposes =
#(define-music-function (parser location m scale music)
(ly:music? ly:music? ly:music?)
(music-clone m
'elements
(map (lambda (pitch)
(ly:music-property #{ \modalTranspose c $pitch $scale $music #} 'element))
(event-chord-pitches m))))
#(define (c-based-scale scale-def)
(map (lambda (el) (ly:make-pitch 0 (car el) (cdr el))) scale-def))
#(define (c-based-chord scale-def)
(let ((scale (c-based-scale scale-def)))
(list (car scale) (third scale) (fifth scale))))
#(define (c-based-pitches->sequential-music scale-def pitches duration)
(make-sequential-music
(map
(lambda (p)
(make-music
'NoteEvent
'duration duration
'pitch p))
pitches)))
#(define (make-tonic-triad scale-def duration)
(let ((seq-music ;; sequential music containing an event-chord
(c-based-pitches->sequential-music
scale-def
(c-based-chord scale-def)
duration)))
(make-event-chord
(extract-typed-music
#{
\multipleModalTransposes
\absolute $seq-music
\absolute $seq-music
\absolute c
#}
'note-event))))
chords-of-scale =
#(define-music-function (tonic scale-def)(ly:music? list?)
(let ((tonic-pitch (ly:music-property tonic 'pitch))
(dur (ly:music-property tonic 'duration))
;; sequential music containing a scale,
;; the duration is pretty arbitrary
(seq-music
(c-based-pitches->sequential-music
scale-def
(c-based-scale scale-def)
#{ 1 #})))
#{
\transpose c $tonic-pitch
\multipleModalTransposes
$seq-music
$seq-music
\transpose c c, $(make-tonic-triad scale-def dur)
#}))
\markup \rounded-box \fill-line \bold { MINOR }
\chords-of-scale c2 \minor
\chords-of-scale cis2 \minor
\chords-of-scale d4 \minor
\chords-of-scale ees8 \minor
\chords-of-scale e8 \minor
\chords-of-scale f1 \minor
\chords-of-scale fis1 \minor
\chords-of-scale g2 \minor
\chords-of-scale gis2 \minor
\chords-of-scale a2 \minor
\chords-of-scale aes2 \minor
\chords-of-scale bes \minor
\chords-of-scale b \minor
\markup \rounded-box \fill-line \bold { MAJOR }
\chords-of-scale c2 \major
\chords-of-scale d4 \major
\chords-of-scale e8 \major
\chords-of-scale f1 \major
\chords-of-scale g2 \major
\chords-of-scale a2 \major
%% The 'chords-of-scale'-music-function can't read the KeySignature
{ \key b \major \chords-of-scale b \major }
\markup \rounded-box \fill-line \bold { "OTHER SCALES" }
\chords-of-scale f2 \ionian
\chords-of-scale c\breve \dorian
\chords-of-scale b,16 \phrygian
\chords-of-scale g2 \lydian
\chords-of-scale b2 \mixolydian
\chords-of-scale d'2 \aeolian
\chords-of-scale e,2 \locrianThere's still wide room to do it more straight forward, though.HTH,Harm
[Prev in Thread] | Current Thread | [Next in Thread] |