module Weihnachten where
import System (system)
import Haskore

-- Alle Jahre wieder
ajw :: Music
ajw = let o = 4 in 
       (g o dqn [] :+: a o en [] :+: g o qn [] :+: f o qn []) 
       :+:
       (e o hn [] :+: d o hn []) :+:
       (c o qn [] :+: d o en [] :+: e o en [] :+: f o qn [] 
       :+: e o qn []) :+:
       d o dhn [] :+: qnr  :+:
       e o qn [] :+: g o qn [] :+: a o qn [] :+: g o qn [] :+:
       c (o+1) hn [] :+: b o qn [] :+: a o qn [] :+:
       g o qn [] :+: f o en [] :+: e o en [] :+: f o qn [] 
       :+: g o qn [] :+:
       e o dhn [] :+: qnr  

ajw2 :: Music
ajw2 = let o = 4 in 
       (e o dqn [] :+: f o en [] :+: e o qn [] :+: d o qn []) :+:
       (c o hn [] :+: b (o-1) hn []) :+:
       (c o qn [] :+: b (o-1) en []  :+: c o en [] :+: d o qn [] 
       :+: c o qn []) :+:
       b (o-1) dhn [] :+: qnr :+:
       e o hn [] :+: f o qn [] :+: e o qn [] :+:
       a o hn [] :+: g o qn [] :+: f o qn [] :+:
       e o qn [] :+: d o en [] :+: c o en [] :+: d o qn [] 
       :+: b (o-1) qn [] :+:
       c o dhn [] :+: qnr 




test1 =   Tempo 2 $ Instr "flute" ajw 
test1b = Tempo 2 $ Instr "Violin" ajw :=: Instr "Flute" ajw2
--  
test2 =  Tempo 2 $ Trans 5 (Instr "Glockenspiel"  $ ajw  
         :=: Instr "Helicopter" ajw2)

fMaj = [ n 4 qn [] | n <- [f,a] ] ++ [c 5 qn []]  
gMaj = [ n 4 qn [] | n <- [g,b] ] ++ [d 5 qn []]
dMaj = [ n 4 qn [] | n <- [d,fs,a] ]
bMaj = [ n 4 qn [] | n <- [f,bf] ] ++ [d 5 qn []]

ajw3 :: [Music]
ajw3 = let o = 4 in 
         [n (o-1) f [], chord fMaj, n (o-1) c [], chord cMaj,
          n (o-1) f [], chord fMaj, n (o-1) c [], chord cMaj,
          chord fMaj, qnr, n (o-1) e [], n (o-1) f [], 
          n (o-1) c [], chord cMaj, chord cMaj, chord cMaj,
          n (o-1) f [], chord fMaj, qnr,  chord fMaj,
          n (o-1) bs [], chord bMaj, chord bMaj, chord bMaj,
          n (o-1) f [], chord fMaj, n (o-1) c [], chord cMaj,
          n (o-1) f [], n (o+1) c [], chord fMaj, qnr]
          where n o p = p o qn 

test3 =  Tempo 2 ((Trans 5  (Instr "Flute" $  ajw  
         :=: Instr "String Ensemble 1" ajw2))
         :=: Instr "Hammond Organ" (line ajw3))
           
-- mehrere Strophen
repeatNM 	:: Int -> Music -> Music	
repeatNM 0 m = Rest 0
repeatNM n m = m :+: repeatNM (n-1) m	

test4 = repeatNM 3 test3 

-- rückwärts
-- revM :: Music  -> Music

test5 = revM test3

-- Begleitung
begleit = let p1 = perc LowTom qn []			   
              p2 = perc AcousticSnare en []		
          in Tempo 2 (Instr "percussion" (cut 8 (repeatM
             		    ((p1 :+: qnr :+: p2 :+: qnr :+: p2 :+:
             		    		       p1 :+: p1 :+: qnr :+: p2 :+: enr)
        		    :=: roll en (perc ClosedHiHat 2  []) ) )))

test6 = test3 :=: begleit



myplay music = test music >> system "wmplayer test.mid"

-- Weitere Beispiele

-- Wende n mal f iterativ auf Musik und g auf akkumulierte Sequenzen an
rep		:: (Music -> Music) -> (Music -> Music) ->
      	 Int -> Music -> Music
rep f g 0 m	= Rest 0 
rep f g n m	= m :=: g (rep f g (n-1) (f m))

run		    = rep (Trans 5) (delay tn) 8 (c 4 tn [])
cascade		= rep (Trans 4) (delay en) 8 run
cascades	= rep  id (delay sn) 2 cascade
waterfall	= cascades :+: revM cascades


-- stars and stripes
ssfMelody = line (m1 ++ m2 ++ m3 ++ m4)

m1 = [	trilln 2 5 (bf 6 en []),
 	Phrase [Art staccato] (line [ef 7 en [], ef 6 en [], ef 7 en []])]

m2 = [Phrase [Art legato] 
   	(line [bf 6 sn [], c  7 sn [], bf 6 sn [], g  6 sn []]),
	Phrase [Art staccato]    (line [ef 6 en [], bf 5 en []])]

m3 = [Phrase [Art legato]       
 	(line [ef 6 sn [], f  6 sn [], g  6 sn [], af 6 sn []]),
	Phrase [Art staccato]    (line [bf 6 en [], ef 7 en []])]

m4 = [	trill 2 tn (bf 6 qn []),	bf 6 sn [], denr]
ssf = Instr "flute" (Tempo 2 (ssfMelody))