Programmieren in Haskell

Werbung
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
Herunterladen