> module HSoM.Examples.SelfSimilar where
> import Euterpea
> data Cluster  = Cluster SNote [Cluster]
> type SNote    = (Dur,AbsPitch)
> selfSim      :: [SNote] -> Cluster
> selfSim pat  = Cluster (0,0) (map mkCluster pat)
>     where mkCluster note =
>             Cluster note (map (mkCluster . addMult note) pat)
> addMult                  :: SNote -> SNote -> SNote
> addMult (d0,p0) (d1,p1)  = (d0*d1,p0+p1)
> fringe                       :: Int -> Cluster -> [SNote]
> fringe 0 (Cluster note cls)  = [note]
> fringe n (Cluster note cls)  = concatMap (fringe (n-1)) cls
> simToMusic     :: [SNote] -> Music Pitch
> simToMusic     = line . map mkNote
> mkNote         :: (Dur,AbsPitch) -> Music Pitch
> mkNote (d,ap)  = note d (pitch ap)
> ss pat n tr te = 
>    transpose tr $ tempo te $ simToMusic $ fringe n $ selfSim pat
> m0   :: [SNote]
> m0   = [(1,2),(1,0),(1,5),(1,7)]
> tm0  = instrument Vibraphone (ss m0 4 50 20)
> ttm0 = tm0 :=: transpose (12) (retro tm0)
> m1   :: [SNote]
> m1   = [(1,0),(0.5,0),(0.5,0)]
> tm1  = instrument Percussion (ss m1 4 43 2)
> m2   :: [SNote]
> m2   = [(dqn,0),(qn,4)]
> tm2  = ss m2 6 50 (1/50)
> m3    :: [SNote]
> m3    = [(hn,3),(qn,4),(qn,0),(hn,6)]
> tm3   = ss m3 4 50 (1/4)
> ttm3  =  let  l1 =  instrument Flute tm3
>               l2 =  instrument AcousticBass $
>                       transpose (-9) (retro tm3)
>          in l1 :=: l2
> m4    :: [SNote]
> m4    = [  (hn,3),(hn,8),(hn,22),(qn,4),(qn,7),(qn,21),
>            (qn,0),(qn,5),(qn,15),(wn,6),(wn,9),(wn,19) ]
> tm4   = ss m4 3 50 8
> fringe'                        :: Int -> Cluster -> [[SNote]]
> fringe' 0  (Cluster note cls)  = [[note]]
> fringe' n  (Cluster note cls)  = map (fringe (n-1)) cls
> simToMusic'  :: [[SNote]] -> Music Pitch
> simToMusic'  = chord . map (line . map mkNote)
> ss' pat n tr te = 
>    transpose tr $ tempo te $ simToMusic' $ fringe' n $ selfSim pat
> ss1  = ss' m2 4 50 (1/8)
> ss2  = ss' m3 4 50 (1/2)
> ss3  = ss' m4 3 50 2
> m5   = [(en,4),(sn,7),(en,0)]
> ss5  = ss  m5 4 45 (1/500)
> ss6  = ss' m5 4 45 (1/1000)