module SilverLake.Bass where

import Instrument
import Midi
import Pitch
import List
import Prelude ( Int, (*), (-), (.), ($) )


bassTrack :: Time -> [[Pitch]] -> [Event (Channel Message)] ;
bassTrack dur set =
    channel 2 $ emphasize 10 $
        program electricBassFinger ++
        concat (
            zipWith
                ( applyBass dur )
                bassLoop
                ( concat $
                  map ( replicate ( length bassPatternBody ) ) $
                  cycle set )
        ) ;

bassNote :: Time -> Int -> Time -> [Pitch.Pitch] -> [Event Message] ;
bassNote relDur i baseDur set =
    note (relDur*baseDur) (set!!i) ;

bassRest :: Time -> Time -> t -> [Event a] ;
bassRest relDur baseDur _set =
    rest (relDur*baseDur) ;

applyBass :: time -> (time -> set -> a) -> set -> a ;
applyBass baseDur consBass set =
    consBass baseDur set ;

bassPatternBody, bassPatternUser, bassPatternMute, bassLoop ::
    [Time -> [Pitch.Pitch] -> [Event Message]] ;

bassLoop =
    bassPatternBody ++ bassLoop ;

bassPatternBody =
    bassPatternUser ;

bassPatternMute = [ bassRest 8 ] ;

--------------------------------
bassPatternUser =
    [ bassNote 1 0, bassRest 6, bassNote 1 1 ] ;
