Sunday, May 11, 2014

Computing Education - Encoding Basic Melody and Harmony

Computing Education - Encoding Basic Melody and Harmony


(These notes were used in a block teaching 8th Graders computer science techniques. Here we used the Overtone/Clojure package to create encodings of musical melodies and harmonies.)

Using pitch and duration representation

We can sound a note on a piano as follows
(use 'overtone.inst.piano)
(piano)

Notes can be played with numbers (midi codes 0-127):
(piano 60)
(piano 61)
(piano 62)
To humanize expressions, each is encoded with usual name:
(note :c4)
60
note :c#4)
61
(note :db4)
61
(note :d4)
62


Chords

This brings us to our first use of Clojure's vector data structure useful for structuring music. Here we represent a chord using a vector of three notes:
(def c4-minor [(note :c4) (note :eb4) (note :g4)])
And we can play these notes as a chord
(doseq [note c4-minor] (piano note))
Or played as a simple arpeggio:
(doseq [note c4-minor] (piano note) (Thread/sleep 200))

Overtone has a built-in chord function that takes a root and type and returns a set of midi codes.


To play the sound of a chord we first define a function that will sound a set of notes as a chord using synth piano or a sampled piano.

 (defn play-chord [a-chord]
  (doseq [note a-chord] (piano note)))

(use 'overtone.inst.sampled-piano)
(defn play-chord [a-chord]

  (doseq [note a-chord] (sampled-piano note)))

Here's a  function to play chord changes that uses three arguments i) the chord ii) the number of repetitions, and iii) the duration. We encode all in a vector like so:

[(chord :E3 :minor) 4 1]


(defn play-changes [chords]
  (doseq [ [chd reps dur] chords]
(loop [cnt reps]
 (when (> cnt 0)
   (doseq [] (play-chord chd) (Thread/sleep (* 500 dur))
   (recur (dec cnt)))))))



Two Example Songs:


This Land Is Your Land (IV I V I)

(def thisland [ [(chord :G3 :major) 4 1]
                [(chord :D3 :major ) 4 1] 
                [(chord :A2 :dom7) 4 1]
                [(chord :D3 :major) 4 1]])


All My Loving    ( II V7 I VI  IV II VII V)      

                    Em            A7                    D           Bm 
Close your eyes and I´ll kiss you, tomorrow i´ll miss you,
         G           Em             C                A7 
remember I´ll always be true.    
                  Em         A7                    D         Bm 
And then while I´m away I´ll write home everyday         
              G                 A                 D 
and I´ll send all my loving to you.       



(def allmyloving
[ [(chord :E3 :minor) 4 1]
[(chord :A2 :dom7) 4 1]
[(chord :D3 :major) 4 1]
[(chord :B3 :minor) 4 1]

[(chord :G3 :major) 4 1]
[(chord :E3 :minor) 4 1]
[(chord :C3 :major) 4 1]
[(chord :A3 :dom7) 4 1]

[(chord :E3 :minor) 4 1]
[(chord :A3 :dom7) 4 1]
[(chord :D4 :major) 4 1]
[(chord :B3 :minor) 4 1]

[(chord :G3 :major) 4 1]
[(chord :A3 :major) 4 1]
[(chord :D3 :major) 5 1]
])