Kapitel 3: Musik

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