Programmieren in Haskell Modellierung von Musik

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