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

Reply via email to