1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
<title>Haskore Tutorial: Fractal Music</title>
<body bgcolor="#ffffff"><i>The Haskore Tutorial</i><br><a href="index.html">top</a> <a href="ChildSong6.html">back</a> <a href="GeneralMidi.html">next</a><hr>
section D
<a name="self-similar"></a><a name="sect13"></a>
<h2>13<tt> </tt>Example of Simple Self-Similar (Fractal) Music</h2>
<p>
<tt> <br>
<br>
> module SelfSim where<br>
><br>
> import Haskore<br>
> import TestHaskore<br>
<br>
An example of self-similar, or fractal, music.<br>
<br>
> data Cluster = Cl SNote [Cluster] -- this is called a Rose tree<br>
> type Pat = [SNote]<br>
> type SNote = [(AbsPitch,Dur)] -- i.e. a chord<br>
> <br>
> sim :: Pat -> [Cluster]<br>
> sim pat = map mkCluster pat<br>
> where mkCluster notes = Cl notes (map (mkCluster . addmult notes) pat)<br>
> <br>
> addmult pds iss = zipWith addmult' pds iss<br>
> where addmult' (p,d) (i,s) = (p+i,d*s)<br>
><br>
> simFringe n pat = fringe n (Cl [(0,0)] (sim pat))<br>
> <br>
> fringe 0 (Cl note cls) = [note]<br>
> fringe n (Cl note cls) = concat (map (fringe (n-1)) cls)<br>
> <br>
> -- this just converts the result to Haskore:<br>
> simToHask s = let mkNote (p,d) = Note (pitch p) d []<br>
> in line (map (chord . map mkNote) s)<br>
><br>
> -- and here are some examples of it being applied:<br>
><br>
> sim1 n = Instr "bass" <br>
> (Trans 36 <br>
> (Tempo 4 1 (simToHask (simFringe n pat1))))<br>
> t6 = test (sim1 4)<br>
><br>
> sim2 n = Instr "piano" <br>
> (Trans 53<br>
> (Tempo 4 1 (simToHask (simFringe n pat2))))<br>
> t7 = test (sim2 4)<br>
><br>
> sim12 n = sim1 n :=: sim2 n<br>
> t8 = test (sim12 4)<br>
><br>
> sim3 n = Instr "vibes" <br>
> (Trans 48 <br>
> (Tempo 4 1 (simToHask (simFringe n pat3))))<br>
> t9 = test (sim3 3)<br>
><br>
> sim4 n = (Trans 60<br>
> (Tempo 2 1 (simToHask (simFringe n pat4'))))<br>
> <br>
> sim4s n = let s = sim4 n <br>
> l1 = Instr "flute" s<br>
> l2 = Instr "bass" (Trans (-36) (revM s))<br>
> in l1 :=: l2<br>
><br>
> ss = sim4s 3<br>
> durss = dur ss<br>
><br>
> t10 = test ss<br>
><br>
> pat1,pat2,pat3,pat4,pat4' :: [SNote]<br>
> pat1 = [[(0,1.0)],[(4,0.5)],[(7,1.0)],[(5,0.5)]]<br>
> pat2 = [[(0,0.5)],[(4,1.0)],[(7,0.5)],[(5,1.0)]]<br>
> pat3 = [[(2,0.6)],[(5,1.3)],[(0,1.0)],[(7,0.9)]]<br>
> pat4' = [[(3,0.5)],[(4,0.25)],[(0,0.25)],[(6,1.0)]]<br>
> pat4 = [[(3,0.5),(8,0.5),(22,0.5)],[(4,0.25),(7,0.25),(21,0.25)],<br>
> [(0,0.25),(5,0.25),(15,0.25)],[(6,1.0),(9,1.0),(19,1.0)]]<br>
<br>
<hr><body bgcolor="#ffffff"><i>The Haskore Tutorial</i><br><a href="index.html">top</a> <a href="ChildSong6.html">back</a> <a href="GeneralMidi.html">next</a>
</tt>
|