Programmieren in Haskell Musik Programmieren in Haskell 1 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 Programmieren in Haskell 2 ce de eh ef ge ah ha = = = = = = = 0; 2; 4; 5; 7; 9; 11; Programmieren in Haskell 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 Halbtöne 3 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 gespielt Musik :+: Musik | - - gleichzeitig gespielt Instr Instrument Musik | Tempo Int Musik - - Schläge pro Minute deriving Show Programmieren in Haskell 4 Formeln, die Musik bedeuten Note 0 (1/4) -Note 24 (1/1) -Pause (1/16) -Note 24 (1/4) :*: Note 26 (1/4) -Note 24 (1/4) :+: Note 28 (1/4) -Tempo 70 m -Tempo 180 m -Instr Oboe m -Instr VoiceAahs m -- Programmieren in Haskell Viertelnote tiefes C ganze Note c’ Sechzehntelpause :*: Note 28 (1/4) Anfang der C-Dur Tonleiter (c,d,e) :+: Note 31 (1/4) C-Dur Akkord (c,d,eis) Musik m als Adagio Musik m als Presto Musik m von Oboe gespielt Musik m gesummt 5 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 Programmieren in Haskell 6 Abkürzungen c’ e’ g’ h’ u u u u = = = = Note Note Note Note Programmieren in Haskell (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) u u u u 7 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) Programmieren in Haskell 8 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 (transponiere i m2) (transponiere i m2) m) m) gDurTonika = transponiere 7 cDurTonika Programmieren in Haskell 9 Gesetz Transponierung / Dur-Dreiklang transponiere i (durDreiklang t) = durDreiklang(t+i) Zur Überprüfung rechnen wir beide Seiten mittels der Definition von transponiere und durDreiklang aus und erhalten beide Male Note (t+i) (1/1) Programmieren in Haskell :+: Note (t+4+i) (1/1) :+: Note (t+7+i) (1/1) 10 Verschiedenes wdh m = m :*: m ad_infinitum m = m :*: ad_infinitum m einsatz Programmieren in Haskell d m = (Pause d) :*: m 11 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 ))) Programmieren in Haskell 12 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. Programmieren in Haskell 13 Ihre Aufgabe für diese Woche • Beispiele ausprobieren • Musik in Haskell aufschreiben • Eigene Musik komponieren? Programmieren in Haskell 14