New Resolutions by Jean-Luc Ponty, Scott O'Neil, and John Garvin > module HSoM.Examples.NewResolutions where > import Euterpea > import HSoM > nrContext = Context {cTime = 0, > cPlayer = fancyPlayer, > cInst = Marimba, > cDur = 1.0, > cPch = 0, > cKey = (C,Major), > cVol = 100} > > root, minThird, fifth, octave :: Pitch -> Dur -> Music Pitch > root p dur = Prim $ Note dur p > minThird p dur = Prim $ Note dur (trans 3 p) > majThird p dur = Prim $ Note dur (trans 4 p) > fifth p dur = Prim $ Note dur (trans 7 p) > majSixth p dur = Prim $ Note dur (trans 9 p) > minSeventh p dur = Prim $ Note dur (trans 10 p) > octave p dur = Prim $ Note dur (trans 12 p) > oMinThird p dur = Prim $ Note dur (trans 15 p) > oFifth p dur = Prim $ Note dur (trans 19 p) > minArpegUp, minArpegDown :: Pitch -> Dur -> Music Pitch > minArpegUp p d = root p d > :+: minThird p d > :+: fifth p d > :+: octave p d > minArpegDown p d = octave p d > :+: fifth p d > :+: minThird p d > :+: root p d > majArpegDown p d = octave p d > :+: fifth p d > :+: majThird p d > :+: root p d > six3ArpegDown p d = octave p d > :+: majSixth p d > :+: majThird p d > :+: root p d > pattern = minArpegUp (D,5) sn > :+: minArpegDown (C,5) sn > :+: minArpegUp (A,4) sn > :+: minArpegDown (G,4) sn > :+: minArpegUp (F,4) sn > :+: d 5 sn :+: a 4 sn :+: f 4 sn :+: a 4 sn > melPattern = d 6 en :+: c 6 en :+: d 6 en > :+: snr > :+: a 5 en :+: g 5 en :+: a 5 en > melody1 = melPattern :+: enr :+: d 5 sn > :+: f 5 sn :+: g 5 en :+: f 5 sn :+: d 5 en :+: c 5 en > :+: d 5 en :+: melPattern :+: d 5 sn > :+: f 5 sn :+: f 5 sn :+: g 5 sn :+: f 5 sn > :+: d 5 sn :+: c 5 en :+: d 5 den > :+: melPattern :+: d 5 sn > :+: f 5 sn :+: g 5 sn :+: f 5 sn :+: d 5 en > :+: c 5 sn :+: d 5 en > :+: d 6 en :+: c 6 en :+: d 6 den :+: c 6 en > :+: a 5 en :+: c 6 en :+: a 5 sn :+: g 5 en > :+: f 5 en :+: af 5 en > :+: g 5 sn :+: f 5 sn :+: d 5 sn :+: c 5 sn > -- last note removed to make fit with pattern > bellPart = d 7 en :+: f 7 en :+: c 7 en :+: d 7 en > :+: a 6 en :+: c 7 en :+: g 6 en :+: a 6 en > :+: f 6 en :+: g 6 en > :+: d 6 sn :+: f 6 sn :+: a 6 sn :+: c 7 sn > vibesLine = d 5 qn :+: c 5 qn :+: a 4 qn > :+: g 4 qn :+: f 4 qn :+: d 4 qn > vibesPart = vibesLine :=: Modify (Transpose 12) vibesLine > cMajorScale = [(C,0), (D,0), (E,0), (F,0), (G,0), (A,0), (B,0)] > gMajorScale = [(G,0), (A,0), (B,0), (C,1), (D,1), (E,1), (Fs,1)] > dPentMinScale = [(D,0), (F,0), (G,0), (A,0), (C,1)] > prevNote [] _ = error ("Scale empty") > prevNote [x] _ = error ("Note not found in scale") > prevNote ((y,n):ys) (p,oct) | y == p = let (x,m) = last ys > in (x, oct + m - n - 1) > prevNote ((x,m):(y,n):xys) (p,oct) | y == p = (x, oct + m - n) > | otherwise = prevNote ((y,n):xys) (p,oct) > nextNote scale note = nextNote' (head scale) scale note > nextNote' _ [] _ = error ("Scale empty") > nextNote' (fstP,fstO) [(x,m)] (p,oct) > | x == p = (fstP, oct - m + fstO + 1) > | otherwise = error ("Note not found in scale") > nextNote' fst ((x,m):(y,n):xys) (p,oct) > | x == p = (y, oct - m + n) > | otherwise = nextNote' fst ((y,n):xys) (p,oct) > back2Note s = prevNote s . prevNote s > nextNR = nextNote dPentMinScale > prevNR = prevNote dPentMinScale > back2NR = back2Note dPentMinScale > diddle p = snr :+: Prim (Note sn p) > :+: Prim (Note sn (prevNR p)) :+: Prim (Note sn p) > melody2 = d 6 sn :+: d 6 en :+: c 6 en :+: d 6 sn :+: c 6 en > :+: a 5 en :+: g 5 sn :+: f 5 sn > :+: g 5 sn :+: f 5 sn :+: d 5 sn :+: f 5 sn > :+: diddle (D,5) :+: diddle (C,5) > :+: diddle (D,6) :+: diddle (C,6) :+: diddle (A,5) > :+: diddle (G,5) :+: diddle (F,5) :+: diddle (D,5) > :+: snr :+: d 6 en :+: c 6 en :+: d 6 den > :+: c 6 en :+: a 5 en :+: g 5 den > :+: f 5 en :+: g 5 en :+: f 5 sn > :+: g 5 sn :+: f 5 sn :+: d 5 sn :+: c 5 sn > :+: d 5 den :+: d 6 en :+: c 6 den :+: a 5 en :+: g 5 den > :+: f 5 en :+: d 5 den :+: c 5 en :+: d 5 qn > part1 = Modify (Instrument Marimba) (Modify (Phrase [Dyn (Loudness 70)]) pattern) > :+: > Modify (Instrument Xylophone) (Modify (Phrase [Dyn (Loudness 120)]) melody1) > :=: Modify (Instrument Marimba) (Modify (Phrase [Dyn (Loudness 70)]) (times 4 pattern)) > bridge = Modify (Instrument Xylophone) (d 5 hn) -- (d 5 hn [Volume 120]) > :=: (times 2 $ > Modify (Instrument Marimba) (Modify (Phrase [Dyn (Loudness 60)]) (Modify (Transpose (-12)) bellPart)) > :=: Modify (Instrument Vibraphone) (Modify (Phrase [Dyn (Loudness 40)]) vibesPart) > :=: Modify (Instrument Glockenspiel) (Modify (Phrase [Dyn (Loudness 80)]) bellPart)) > part2 = Modify (Instrument Xylophone) (Modify (Phrase [Dyn (Loudness 120)]) melody2) > :=: Modify (Instrument Marimba) (Modify (Phrase [Dyn (Loudness 70)]) (times 3 pattern > :+: minArpegUp (D,5) sn > :+: minArpegDown (C,5) sn > :+: minArpegUp (A,4) sn > :+: minArpegDown (G,4) sn > :+: minArpegUp (F,4) sn > :+: d 5 sn)) > :=: times 4 (Modify (Instrument Vibraphone) (Modify (Phrase [Dyn (Loudness 40)]) vibesPart)) > run1 p d = root p d :+: minThird p d :+: fifth p d > :+: minSeventh p d :+: octave p d :+: oMinThird p d > :+: oFifth p d :+: oMinThird p d :+: octave p d > :+: minSeventh p d :+: fifth p d :+: minThird p d > part3Pattern el = el (D,4) sn :+: el (C,4) sn :+: el (D,4) sn :+: el (F,4) sn > run2 p d = times 2 $ > fifth p d :+: minSeventh p d :+: octave p d > :+: oMinThird p d :+: octave p d :+: minSeventh p d > run3 p d = times 3 $ > oMinThird p d :+: octave p d :+: minSeventh p d :+: fifth p d > vibeLine3 = let el = \p -> octave p den :+: fifth p den > :+: minSeventh p den :+: octave p den > in el (D,4) :+: el (C,4) :+: el (D,4) > :+: f 5 den :+: c 5 den > :+: ef 5 en :+: f 5 en :+: af 5 en > vibePart3 = vibeLine3 :=: Modify (Transpose 12) vibeLine3 > melody3 = a 5 (11/16) :+: f 6 sn > :+: ef 6 en :+: d 6 en :+: c 6 en :+: g 5 dqn > :+: times 3 (a 5 sn :+: f 6 en) :+: a 5 en > :+: f 6 en :+: af 5 en :+: f 6 en :+: af 5 en > :+: minArpegDown (F,5) sn :+: snr > :+: majArpegDown (F,5) sn :+: snr > :+: six3ArpegDown (F,5) sn :+: snr :+: f 6 sn :+: d 6 sn > :+: ef 6 sn :+: d 6 sn :+: c 6 sn :+: g 5 sn :+: snr > :+: majArpegDown (Ef,5) sn :+: snr :+: ef 6 sn :+: c 6 sn > :+: majArpegDown (F,5) sn :+: snr > :+: six3ArpegDown (F,5) sn :+: snr :+: f 6 sn :+: d 6 sn > :+: minArpegDown (F,5) sn :+: snr > :+: minArpegDown (F,5) sn :+: af 5 sn :+: c 6 sn :+: f 6 sn > :+: line (map (times 2) [f 6 sn, d 6 sn, c 6 sn, > a 5 sn, g 5 sn, f 5 sn]) > :+: ef 5 sn :+: f 5 sn :+: g 5 sn :+: bf 5 sn > :+: c 6 sn :+: d 6 sn :+: ef 6 sn :+: d 6 sn > :+: c 6 sn :+: bf 5 sn :+: a 5 sn :+: g 5 sn > :+: times 4 (a 5 sn :+: a 5 sn :+: g 5 sn) > :+: times 2 (af 5 sn :+: af 5 sn :+: g 5 sn) > :+: times 2 (af 5 sn :+: g 5 sn :+: f 5 sn) > :+: a 5 dqn > :+: f 6 sn :+: d 6 sn :+: c 6 sn > :+: a 5 sn :+: g 5 sn :+: f 5 sn > :+: g 5 sn :+: bf 5 sn :+: ef 6 dqn > :+: bf 6 den :+: bf 6 sn > :+: a 6 en :+: a 6 sn :+: g 6 en :+: g 6 sn > :+: f 6 den :+: a 5 sn :+: c 6 sn :+: d 6 sn > :+: f 6 den :+: f 6 sn :+: d 6 sn :+: c 6 sn > :+: af 5 sn :+: af 5 sn :+: g 5 sn > :+: f 5 sn :+: d 5 sn :+: c 5 sn > harmony3 = Modify (Phrase [Dyn (Loudness 60)]) (part3Pattern run1 > :=: part3Pattern run2 > :=: Modify (Transpose 12) (part3Pattern run3)) > :=: Modify (Phrase [Dyn (Loudness 50)]) (Modify (Instrument Vibraphone) vibePart3) > part3 = Modify (Phrase [Dyn (Loudness 60)]) (part3Pattern run1) > :+: (Modify (Phrase [Dyn (Loudness 60)]) (part3Pattern run1) > :=: Modify (Phrase [Dyn (Loudness 90)]) (part3Pattern run2)) > :+: (Modify (Phrase [Dyn (Loudness 60)]) ((part3Pattern run1) > :=: (part3Pattern run2)) > :=: Modify (Phrase [Dyn (Loudness 100)]) (Modify (Transpose 12) (part3Pattern run3))) > :+: Modify (Phrase [Dyn (Loudness 60)]) (part3Pattern run1 > :=: part3Pattern run2 > :=: Modify (Transpose 12) (part3Pattern run3)) > :=: Modify (Phrase [Dyn (Loudness 70)]) (Modify (Instrument Vibraphone) vibePart3) > :+: (times 4 harmony3 :=: Modify (Phrase [Dyn (Loudness 100)]) (Modify (Instrument Xylophone) melody3) > :=: (Modify (Instrument Marimba) melody3)) > all3Insts m = Modify (Instrument Marimba) m > :=: Modify (Instrument Xylophone) m > :=: Modify (Instrument Vibraphone) m > endEl n = Prim (Note sn n) :+: Prim (Note sn (back2NR n)) > :+: Prim (Note sn (prevNR n)) :+: Prim (Note sn n) > endRun = line $ map endEl $ take 10 $ iterate nextNR (D,5) > ending = all3Insts $ > Prim (Note qn (D,5)) > :+: Modify (Phrase [Dyn (Loudness 120)]) (endRun :+: d 7 sn) > newResolutions = part1 :+: bridge :+: part2 :+: part3 :+: ending > nr = play newResolutions