* Modal Cycle ** Processing *** DONE Keys Data #+tblname: keys-table | c | d | e | f | g | a | b | | g | a | b | c | d | e | fis | | d | e | fis | g | a | b | cis | | a | b | cis | d | e | fis | gis | | e | fis | gis | a | b | cis | dis | | b | cis | dis | e | fis | gis | ais | | ges | aes | bes | ces | des | ees | f | | des | ees | f | ges | aes | bes | c | | aes | bes | c | des | ees | f | g | | ees | f | g | aes | bes | c | d | | bes | c | d | ees | f | g | a | | f | g | a | bes | c | d | e | *** DONE Generate Triad #+name: gen-triad(key="c",root="c") #+begin_src ruby :var keys=keys-table :var key_of=keys-table[*,0] :results silent @key_id = key_of.index(key) @key = keys[ @key_id ] @root_id = @key.index(root) def triad(key,root,value,interval) " < \ #{@key.fetch(( value -1) % 7)} \ #{@key.fetch(( value +1) % 7)} \ #{@key.fetch(( value +3) % 7)} > \ #{interval} " end "\\relative a' {" + "\n" + triad(key, root, 4, 4) + triad(key, root, 4, 4) + triad(key, root, 4, 4) + triad(key, root, 4, 4) + "|\n" + triad(key, root, 5, 4) + triad(key, root, 5, 4) + triad(key, root, 5, 4) + triad(key, root, 5, 4) + "|\n" + triad(key, root, 4, 4) + triad(key, root, 4, 4) + triad(key, root, 4, 4) + triad(key, root, 4, 4) + "|\n" + triad(key, root, 5, 4) + triad(key, root, 5, 4) + triad(key, root, 5, 4) + triad(key, root, 5, 4) + "|\n" + "}" #+end_src *** DONE Generate arpeggio #+name: gen_arpeggio(key="c", root="c") #+begin_src ruby :var keys=keys-table :var key_of=keys-table[*,0] :results silent key_id = key_of.index(key) @key = keys[ key_id ] @root_id = @key.index(root) def arpeggio (key, root, ascending) if ascending == 1 x,y = 0, 1 else x,y = 7, -1 end notes = "" 8.times do notes += @key.fetch((@root_id + x) % 7) + "16 " x = x + y end notes + "r2" end "\\relative c {" + arpeggio(key , root, 1 ) + " } | r1 | \ \\relative c'' {" + arpeggio(key , root , 0) + " } | r1 | \n" #+end_src *** DONE Generate Bass Line #+name: generate_bassline(key="c",root="c") #+begin_src ruby :var keys=keys-table :var key_of=keys-table[*,0] :results silent key_id = key_of.index(key) key = keys[ key_id ] root_id = key.index(root) #third = key.fetch( root_id + 2) #seventh = key.fetch(root_id + 6) one_bar = " #{root}8 #{root}, #{root}' #{root} " + "#{root} #{root} #{root} #{root}'16 #{root},16 " "\\relative g, { " + "\n" + one_bar + "|\n" + one_bar + "|\n" + one_bar + "|\n" + one_bar + "|\n} " #+end_src ** Version #+begin_src lilypond \version "2.12.3" #+end_src ** Arpeggios #+begin_src lilypond Arps = { <<gen_arpeggio(key="c",root="c")>> <<gen_arpeggio(key="f",root="c")>> <<gen_arpeggio(key="bes",root="c")>> <<gen_arpeggio(key="ees",root="c")>> <<gen_arpeggio(key="aes",root="c")>> <<gen_arpeggio(key="des",root="c")>> <<gen_arpeggio(key="ges",root="ces")>> <<gen_arpeggio(key="b",root="b")>> <<gen_arpeggio(key="e",root="b")>> <<gen_arpeggio(key="a",root="b")>> <<gen_arpeggio(key="d",root="b")>> <<gen_arpeggio(key="g",root="b")>> <<gen_arpeggio(key="c",root="b")>> <<gen_arpeggio(key="f",root="bes")>> <<gen_arpeggio(key="bes",root="bes")>> <<gen_arpeggio(key="ees",root="bes")>> <<gen_arpeggio(key="aes",root="bes")>> <<gen_arpeggio(key="des",root="bes")>> <<gen_arpeggio(key="ges",root="bes")>> <<gen_arpeggio(key="b",root="ais")>> <<gen_arpeggio(key="e",root="a")>> <<gen_arpeggio(key="a",root="a")>> <<gen_arpeggio(key="d",root="a")>> <<gen_arpeggio(key="g",root="a")>> <<gen_arpeggio(key="c",root="a")>> <<gen_arpeggio(key="f",root="a")>> <<gen_arpeggio(key="bes",root="a")>> <<gen_arpeggio(key="ees",root="aes")>> <<gen_arpeggio(key="aes",root="aes")>> <<gen_arpeggio(key="des",root="aes")>> <<gen_arpeggio(key="ges",root="aes")>> <<gen_arpeggio(key="b",root="gis")>> <<gen_arpeggio(key="e",root="gis")>> <<gen_arpeggio(key="a",root="gis")>> <<gen_arpeggio(key="d",root="g")>> <<gen_arpeggio(key="g",root="g")>> <<gen_arpeggio(key="c",root="g")>> <<gen_arpeggio(key="f",root="g")>> <<gen_arpeggio(key="bes",root="g")>> <<gen_arpeggio(key="ees",root="g")>> <<gen_arpeggio(key="aes",root="g")>> <<gen_arpeggio(key="des",root="ges")>> <<gen_arpeggio(key="ges",root="ges")>> <<gen_arpeggio(key="b",root="fis")>> <<gen_arpeggio(key="e",root="fis")>> <<gen_arpeggio(key="a",root="fis")>> <<gen_arpeggio(key="d",root="fis")>> <<gen_arpeggio(key="g",root="fis")>> <<gen_arpeggio(key="c",root="f")>> <<gen_arpeggio(key="f",root="f")>> <<gen_arpeggio(key="bes",root="f")>> <<gen_arpeggio(key="ees",root="f")>> <<gen_arpeggio(key="aes",root="f")>> <<gen_arpeggio(key="des",root="f")>> <<gen_arpeggio(key="ges",root="f")>> <<gen_arpeggio(key="b",root="e")>> <<gen_arpeggio(key="e",root="e")>> <<gen_arpeggio(key="a",root="e")>> <<gen_arpeggio(key="d",root="e")>> <<gen_arpeggio(key="g",root="e")>> <<gen_arpeggio(key="c",root="e")>> <<gen_arpeggio(key="f",root="e")>> <<gen_arpeggio(key="bes",root="ees")>> <<gen_arpeggio(key="ees",root="ees")>> <<gen_arpeggio(key="aes",root="ees")>> <<gen_arpeggio(key="des",root="ees")>> <<gen_arpeggio(key="ges",root="ees")>> <<gen_arpeggio(key="b",root="dis")>> <<gen_arpeggio(key="e",root="dis")>> <<gen_arpeggio(key="a",root="d")>> <<gen_arpeggio(key="d",root="d")>> <<gen_arpeggio(key="g",root="d")>> <<gen_arpeggio(key="c",root="d")>> <<gen_arpeggio(key="f",root="d")>> <<gen_arpeggio(key="bes",root="d")>> <<gen_arpeggio(key="ees",root="d")>> <<gen_arpeggio(key="aes",root="des")>> <<gen_arpeggio(key="des",root="des")>> <<gen_arpeggio(key="ges",root="des")>> <<gen_arpeggio(key="b",root="cis")>> <<gen_arpeggio(key="e",root="cis")>> <<gen_arpeggio(key="a",root="cis")>> <<gen_arpeggio(key="d",root="cis")>> <<gen_arpeggio(key="g",root="c")>> <<gen_arpeggio(key="c",root="c")>> < c, g, c' e g b > 1 } #+end_src ** Triads #+begin_src lilypond Triads = { <<gen-triad(key="c",root="c")>> <<gen-triad(key="f",root="c")>> <<gen-triad(key="bes",root="c")>> <<gen-triad(key="ees",root="c")>> <<gen-triad(key="aes",root="c")>> <<gen-triad(key="des",root="c")>> <<gen-triad(key="ges",root="ces")>> <<gen-triad(key="b",root="b")>> <<gen-triad(key="e",root="b")>> <<gen-triad(key="a",root="b")>> <<gen-triad(key="d",root="b")>> <<gen-triad(key="g",root="b")>> <<gen-triad(key="c",root="b")>> <<gen-triad(key="f",root="bes")>> <<gen-triad(key="bes",root="bes")>> <<gen-triad(key="ees",root="bes")>> <<gen-triad(key="aes",root="bes")>> <<gen-triad(key="des",root="bes")>> <<gen-triad(key="ges",root="bes")>> <<gen-triad(key="b",root="ais")>> <<gen-triad(key="e",root="a")>> <<gen-triad(key="a",root="a")>> <<gen-triad(key="d",root="a")>> <<gen-triad(key="g",root="a")>> <<gen-triad(key="c",root="a")>> <<gen-triad(key="f",root="a")>> <<gen-triad(key="bes",root="a")>> <<gen-triad(key="ees",root="aes")>> <<gen-triad(key="aes",root="aes")>> <<gen-triad(key="des",root="aes")>> <<gen-triad(key="ges",root="aes")>> <<gen-triad(key="b",root="gis")>> <<gen-triad(key="e",root="gis")>> <<gen-triad(key="a",root="gis")>> <<gen-triad(key="d",root="g")>> <<gen-triad(key="g",root="g")>> <<gen-triad(key="c",root="g")>> <<gen-triad(key="f",root="g")>> <<gen-triad(key="bes",root="g")>> <<gen-triad(key="ees",root="g")>> <<gen-triad(key="aes",root="g")>> <<gen-triad(key="des",root="ges")>> <<gen-triad(key="ges",root="ges")>> <<gen-triad(key="b",root="fis")>> <<gen-triad(key="e",root="fis")>> <<gen-triad(key="a",root="fis")>> <<gen-triad(key="d",root="fis")>> <<gen-triad(key="g",root="fis")>> <<gen-triad(key="c",root="f")>> <<gen-triad(key="f",root="f")>> <<gen-triad(key="bes",root="f")>> <<gen-triad(key="ees",root="f")>> <<gen-triad(key="aes",root="f")>> <<gen-triad(key="des",root="f")>> <<gen-triad(key="ges",root="f")>> <<gen-triad(key="b",root="e")>> <<gen-triad(key="e",root="e")>> <<gen-triad(key="a",root="e")>> <<gen-triad(key="d",root="e")>> <<gen-triad(key="g",root="e")>> <<gen-triad(key="c",root="e")>> <<gen-triad(key="f",root="e")>> <<gen-triad(key="bes",root="ees")>> <<gen-triad(key="ees",root="ees")>> <<gen-triad(key="aes",root="ees")>> <<gen-triad(key="des",root="ees")>> <<gen-triad(key="ges",root="ees")>> <<gen-triad(key="b",root="dis")>> <<gen-triad(key="e",root="dis")>> <<gen-triad(key="a",root="d")>> <<gen-triad(key="d",root="d")>> <<gen-triad(key="g",root="d")>> <<gen-triad(key="c",root="d")>> <<gen-triad(key="f",root="d")>> <<gen-triad(key="bes",root="d")>> <<gen-triad(key="ees",root="d")>> <<gen-triad(key="aes",root="des")>> <<gen-triad(key="des",root="des")>> <<gen-triad(key="ges",root="des")>> <<gen-triad(key="b",root="cis")>> <<gen-triad(key="e",root="cis")>> <<gen-triad(key="a",root="cis")>> <<gen-triad(key="d",root="cis")>> <<gen-triad(key="g",root="c")>> <<gen-triad(key="c",root="c")>> } #+end_src ** Drums (four bars) #+begin_src lilypond DrumsFourBars = { \drummode { bd16 hh16 hh16 hh16 sn16 hh16 hh16 hh16 bd16 hh16 hh16 hh16 sn16 hh16 hh16 hh16 | bd16 hh16 hh16 hh16 sn16 hh16 hh16 hh16 bd16 hh16 hh16 hh16 sn16 hh16 hh16 bd16 | bd16 hh16 hh16 hh16 sn16 hh16 hh16 hh16 bd16 hh16 hh16 hh16 sn16 hh16 hh16 hh16 | bd16 hh16 hh16 hh16 sn16 hh16 hh16 hh16 bd16 hh16 hh16 hh16 sn16 hh16 sn16 bd16 | } } DrumsSixteenBars = { \DrumsFourBars \DrumsFourBars \DrumsFourBars \DrumsFourBars } #+end_src #+begin_src lilypond Drums = { \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsSixteenBars \DrumsFourBars } #+end_src ** Bass #+begin_src lilypond Bass = { <<generate_bassline(key="c",root="c")>> <<generate_bassline(key="f",root="c")>> <<generate_bassline(key="bes",root="c")>> <<generate_bassline(key="ees",root="c")>> <<generate_bassline(key="aes",root="c")>> <<generate_bassline(key="des",root="c")>> <<generate_bassline(key="ges",root="b")>> <<generate_bassline(key="b",root="b")>> <<generate_bassline(key="e",root="b")>> <<generate_bassline(key="a",root="b")>> <<generate_bassline(key="d",root="b")>> <<generate_bassline(key="g",root="b")>> <<generate_bassline(key="c",root="b")>> <<generate_bassline(key="f",root="bes")>> <<generate_bassline(key="bes",root="bes")>> <<generate_bassline(key="ees",root="bes")>> <<generate_bassline(key="aes",root="bes")>> <<generate_bassline(key="des",root="bes")>> <<generate_bassline(key="ges",root="bes")>> <<generate_bassline(key="b",root="bes")>> <<generate_bassline(key="e",root="a")>> <<generate_bassline(key="a",root="a")>> <<generate_bassline(key="d",root="a")>> <<generate_bassline(key="g",root="a")>> <<generate_bassline(key="c",root="a")>> <<generate_bassline(key="f",root="a")>> <<generate_bassline(key="bes",root="a")>> <<generate_bassline(key="ees",root="aes")>> <<generate_bassline(key="aes",root="aes")>> <<generate_bassline(key="des",root="aes")>> <<generate_bassline(key="ges",root="aes")>> <<generate_bassline(key="b",root="aes")>> <<generate_bassline(key="e",root="aes")>> <<generate_bassline(key="a",root="aes")>> <<generate_bassline(key="d",root="g")>> <<generate_bassline(key="g",root="g")>> <<generate_bassline(key="c",root="g")>> <<generate_bassline(key="f",root="g")>> <<generate_bassline(key="bes",root="g")>> <<generate_bassline(key="ees",root="g")>> <<generate_bassline(key="aes",root="g")>> <<generate_bassline(key="des",root="ges")>> <<generate_bassline(key="ges",root="ges")>> <<generate_bassline(key="b",root="ges")>> <<generate_bassline(key="e",root="ges")>> <<generate_bassline(key="a",root="ges")>> <<generate_bassline(key="d",root="ges")>> <<generate_bassline(key="g",root="ges")>> <<generate_bassline(key="c",root="f")>> <<generate_bassline(key="f",root="f")>> <<generate_bassline(key="bes",root="f")>> <<generate_bassline(key="ees",root="f")>> <<generate_bassline(key="aes",root="f")>> <<generate_bassline(key="des",root="f")>> <<generate_bassline(key="ges",root="f")>> <<generate_bassline(key="b",root="e")>> <<generate_bassline(key="e",root="e")>> <<generate_bassline(key="a",root="e")>> <<generate_bassline(key="d",root="e")>> <<generate_bassline(key="g",root="e")>> <<generate_bassline(key="c",root="e")>> <<generate_bassline(key="f",root="e")>> <<generate_bassline(key="bes",root="ees")>> <<generate_bassline(key="ees",root="ees")>> <<generate_bassline(key="aes",root="ees")>> <<generate_bassline(key="des",root="ees")>> <<generate_bassline(key="ges",root="ees")>> <<generate_bassline(key="b",root="ees")>> <<generate_bassline(key="e",root="ees")>> <<generate_bassline(key="a",root="d")>> <<generate_bassline(key="d",root="d")>> <<generate_bassline(key="g",root="d")>> <<generate_bassline(key="c",root="d")>> <<generate_bassline(key="f",root="d")>> <<generate_bassline(key="bes",root="d")>> <<generate_bassline(key="ees",root="d")>> <<generate_bassline(key="aes",root="des")>> <<generate_bassline(key="des",root="des")>> <<generate_bassline(key="ges",root="des")>> <<generate_bassline(key="b",root="cis")>> <<generate_bassline(key="e",root="cis")>> <<generate_bassline(key="a",root="cis")>> <<generate_bassline(key="d",root="cis")>> <<generate_bassline(key="g",root="c")>> <<generate_bassline(key="c",root="c")>> } #+end_src ** Number of bars to compile (showLastLength) #+begin_src lilypond % showLastLength = R1*17 #+end_src ** Score #+begin_src lilypond \score { << \new Staff { \key c \major \set Staff.midiInstrument = #"acoustic grand" \Arps } \new Staff { \key c \major \set Staff.midiInstrument = #"acoustic grand" \Triads } \new Staff { \clef bass \key c \major \set Staff.midiInstrument = #"slap bass 2" \Bass } \new DrumStaff { \Drums } >> \layout { } \midi { \context { \Score tempoWholesPerMinute = #(ly:make-moment 120 4) } } } #+end_src ** Paper #+begin_src lilypond \paper { #(define dump-extents #t) indent = 0\mm line-width = 200\mm - 2.0 * 0.4\in ragged-right = #"" force-assignment = #"" line-width = #(- line-width (* mm 3.000000)) } #+end_src ** Header #+begin_src lilypond \header { title = \markup \center-column {"Modal Cycle"} composer = \markup \center-column { "Music by" \small "Martyn Jago" } poet = \markup \center-column { "ob-lilypond" \small "example 3" } } #+end_src