Programmieren in Haskell Musikantenstadl Programmieren in Haskell 1 Was wir heute machen • Eine Formelsprache für Musik • Datentypen • Funktionen • Typen als Hilfsmittel der Modellierung • Abstraktion in der Modellierung • Aufgabe für’s Wochenende Programmieren in Haskell 2 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 40 m -Tempo 100 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 :+: Note 31 (1/4) C-Dur Akkord Musik m als Adagio Musik m als Presto Musik m von Oboe gespielt Musik m gesummt 3 Formeltypen infixr 7 :*: infixr 6 :+: type GanzeZahl type Bruch type Ton type Dauer data Instrument data Musik Programmieren in Haskell = = = = = Int -- Ganze Zahlen und Brueche setzen wir Rational -- als gegeben voraus. GanzeZahl Bruch Oboe | HonkyTonkPiano | Cello | VoiceAahs deriving Show = Note Ton Dauer | Pause Dauer | Musik :*: Musik | Musik :+: Musik | Instr Instrument Musik | Tempo GanzeZahl Musik deriving Show 4 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 5 Halbtöne ce de eh ef ge ah ha = = = = = = = 0; 2; 4; 5; 7; 9; 11; c’ e’ g’ h’ u u u u = = = = cis dis eis fis gis ais his Note Note Note Note Programmieren in Haskell = = = = = = = 1; 3; 5; 6; 8; 10; 12 (ce+24) (eh+24) (ge+24) (ha+24) des es fes ges as be u; u; u; u; = = = = = = 1 3 4 6 8 10 d’ f’ a’ c’’ u u u u = = = = Note Note Note Note (de+24) (ef+24) (ah+24) (ce+36) u u u u 6 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 7 Umkehrung / Transponierung umk ((Note t d) :+: n2 :+: n3) = n2 :+: n3 :+: (Note (t+12) d) 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 8 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) 9 Verschiedenes wdh m = m :*: m ad_infinitum m = m :*: ad_infinitum m einsatz Programmieren in Haskell d m = (Pause d) :*: m 10 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 11 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 12 Typen als Hilfsmittel der Modellierung Programmieren in Haskell 13 Fehlerhafte Formeln Note 3/4 ce Pause Cello Tempo Oboe 100 Programmieren in Haskell Pause (1/2 :*: 1/4) Instr (Cello :+: Oboe) cDurTonika c’ :+: e’ :+: g’ 14 Einige Typen ce, cis, des, de, dis, es, eh, eis, fes, ef, fis :: Ton ges, ge, gis, as, ah, ais, be, ha, his :: Ton gP, hP, vP, aP, sP :: Musik cDurTonika :: Musik adagio, andante, allegro, presto :: GanzeZahl Programmieren in Haskell 15 Funktionstypen c’, d’, e’, f’, g’, a’, h’, c’’ :: Dauer -> Musik umk, wdh, ad_infinitum :: Musik -> Musik transponiere :: GanzeZahl -> Musik -> Musik transponiere 7 :: Musik -> Musik Programmieren in Haskell 16 Die Rolle der Abstraktion in der Modellierung Programmieren in Haskell 17 Abstrakte Noten tritonus_f_1 = Note ef (1/1) :+: Note ha (1/1) tritonus t d = Note t d :+: Note (t+6) d tritonus_f_1 :: Musik tritonus :: Ton -> Dauer -> Musik c’ u = Note (ce+24) u c’ :: Dauer -> Musik data Musik = Note Ton Dauer | ... Note :: Ton -> Dauer -> Musik Programmieren in Haskell 18 Ihre Aufgabe für’s Wochenende • Gesetz Transponierung/Dur-Dreiklang beweisen • Musik in Haskell aufschreiben (z.B. von Hansi Hinterseer) • Eigene Musik komponieren? (lieber nicht) Programmieren in Haskell 19