Programmieren in Haskell Modellierung von Musik Peter Steffen Universität Bielefeld Technische Fakultät 27.10.2010 1 Programmieren in Haskell Töne Die sieben Ganztöne: c d e f g a h Die Halbtöne über den Tönen: cis dis eis fis gis ais his Die Halbtöne unter den Tönen: ces des es fes ges as b 2 Programmieren in Haskell Halbtöne ce de eh ef ge ah ha 3 = = = = = = = 0; 2; 4; 5; 7; 9; 11; cis dis eis fis gis ais his = = = = = = = 1; 3; 5; 6; 8; 10; 12 des es fes ges as be = = = = = = 1 3 4 6 8 10 Programmieren in Haskell Formeltypen infixr 7 :*: infixr 6 :+: type Ton = Int type Dauer = Rational - - Bruchzahl data Instrument = Oboe | HonkyTonkPiano | Cello | VoiceAahs deriving Show data Musik = Note Ton Dauer | Pause Dauer | Musik :*: Musik | - - hintereinander Musik :+: Musik | - - gleichzeitig Instr Instrument Musik | Tempo Int Musik - - Schläge pro Minute deriving Show 4 Programmieren in Haskell Formeln, die Musik bedeuten Note 0 (1/4) Note 24 (1/1) Pause (1/16) Note 24 (1/4) :*: Note 26 -- Viertelnote tiefes C -- ganze Note c’ -- Sechzehntelpause (1/4) :*: Note 28 (1/4) -- Anfang der C-Dur Tonleiter (c,d,e) Note 24 (1/4) :+: Note 28 (1/4) :+: Note 31 (1/4) -- C-Dur Akkord (c,e,g) Tempo 70 m -- Musik m als Adagio Tempo 180 m -- Musik m als Presto Instr Oboe m -- Musik m von Oboe gespielt Instr VoiceAahs m -- Musik m gesummt 5 Programmieren in Haskell Abkürzungen gP hP vP aP sP = = = = = Pause Pause Pause Pause Pause (1/1) (1/2) (1/4) (1/8) (1/16) adagio = 70; andante = 90; allegro = 140; presto = 180 6 Programmieren in Haskell Abkürzungen c’ e’ g’ h’ 7 u u u u = = = = Note Note Note Note (ce+24) (eh+24) (ge+24) (ha+24) u; u; u; u; d’ f’ a’ c’’ u u u u = = = = Note Note Note Note (de+24) (ef+24) (ah+24) (ce+36) Programmieren in Haskell u u u u C-Dur Tonleiter / Dur-Dreiklang cDurTonika = c’ (1/1) :+: e’ (1/1) :+: g’ (1/1) cDurSkala = Tempo allegro( c’ (3/8) :*: d’ (1/8) :*: e’ (3/8) :*: f’ (4/8) :*: g’ (1/8) :*: a’ (1/4) :*: h’ (1/8) :*: c’’ (1/2)) durDreiklang t = Note t (1/1) :+: Note (t+4) (1/1) :+: Note (t+7) (1/1) mollDreiklang t = Note t (1/1) :+: Note (t+3) (1/1) :+: Note (t+4) (1/1) 8 Programmieren in Haskell Transponierung transponiere transponiere transponiere transponiere transponiere transponiere i i i i i i (Pause d) (Note t d) (m1 :*: m2) (m1 :+: m2) (Instr y m) (Tempo n m) = = = = = = Pause d Note (t+i) d (transponiere i m1) :*: (transponiere i m1) :+: Instr y (transponiere i Tempo n (transponiere n gDurTonika = transponiere 7 cDurTonika 9 Programmieren in Haskell (transponiere i m2) (transponiere i m2) m) m) Verschiedenes wdh m = m :*: m ad_infinitum m = m :*: ad_infinitum m einsatz 10 d m = (Pause d) :*: m Programmieren in Haskell Bruder Jakob phrase1 = c’ (1/4) :*: d’ (1/4) :*: e’ (1/4) :*: c’ (1/4) phrase2 = e’ (1/4) :*: f’ (1/4) :*: g’ (1/2) phrase3 = g’ (1/8) :*: a’ (1/8) :*: g’ (1/8) :*: f’ (1/8) :*: e’ (1/4) :*: c’ (1/4) phrase4 = c’ (1/4) :*: (transponiere (-12) (g’ (1/4))) :*: c’’ (1/2) strophe = wdh phrase1 :*: wdh phrase2 :*: wdh phrase3 :*: wdh phrase4 endlos = ad_infinitum strophe bruderJakob = Tempo andante (Instr VoiceAahs (einsatz (0/1) endlos :+: (einsatz (2/1) (transponiere 12 endlos)) :+: (einsatz (4/1) endlos) :+: (einsatz (6/1) endlos ))) 11 Programmieren in Haskell Bruder Jakob: Text Bruder Jakob, Bruder Jakob Schläfst du noch? Schläfst du noch? |: Hörst du nicht die Glocken? :| Ding dang dong, ding dang dong. 12 Programmieren in Haskell Ihre Aufgabe für diese Woche Beispiele ausprobieren Musik in Haskell aufschreiben Eigene Musik komponieren? 13 Programmieren in Haskell