lilypond-user
[Top][All Lists]
Advanced

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

Re: Function which return the chords of the degrees of a mode


From: Thomas Morley
Subject: Re: Function which return the chords of the degrees of a mode
Date: Tue, 16 May 2017 22:08:27 +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 \locrian


There's still wide room to do it more straight forward, though.


HTH,
  Harm


reply via email to

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