module SilverLake.Drum where

import List
import Midi
import Drum
import Prelude ( (*), (-), (.), ($) )

drumTrack :: Time -> [Event (Channel Message)] ;
drumTrack dur =
    drumChannel $
        program 0 ++
        mergeMany [
            concat $ map (applyDrum dur lowBongo)   lowBongoLoop,
            concat $ map (applyDrum dur hiBongo)    hiBongoLoop,
            concat $ map (applyDrum dur tambourine) hihatLoop
        ] ;


x, o :: Drum -> Time -> [Event Message] ;
x drm dur =
    drum drm dur ;

o _drm dur =
    rest dur ;

applyDrum :: time -> drum -> (drum -> time -> a) -> a ;
applyDrum dur drm f =
    f drm dur ;


lowBongoPattern, lowBongoLoop,
    hiBongoPattern, hiBongoLoop,
    hihatPattern, hihatLoop :: [Drum -> Time -> [Event Message]] ;

--------------------------------
lowBongoPattern =
    [ x, o, o, o, o, o, x, o, x, o, o, o, o, o, x, o ] ;

hiBongoPattern =
    [ x, o, o, o, x, o, o, o, o, o, o, o, x, o, o, o ] ;

hihatPattern =
    [ x, o, x, o, x, o, x, o ] ;


lowBongoLoop = lowBongoPattern ++ lowBongoLoop ;

hiBongoLoop = hiBongoPattern ++ hiBongoLoop ;

hihatLoop = hihatPattern ++ hihatLoop ;
