2017-05-15 19:56 GMT+02:00 zaord <ewen.dav...@gmail.com>: > 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 \locrian There's still wide room to do it more straight forward, though. HTH, Harm
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user