{-# LANGUAGE EmptyDataDecls, FlexibleInstances #-}



module Euterpea.IO.Audio.Types where



import Control.Arrow.ArrowP

import Control.SF.SF





class Clock p where

    rate :: p -> Double  -- sampling rate



data AudRate

data CtrRate



instance Clock AudRate where

    rate _ = 44100



instance Clock CtrRate where

    rate _ = 4410



type AudSF a b  = SigFun AudRate a b

type CtrSF a b  = SigFun CtrRate a b



type Signal clk a b    = ArrowP SF clk a b

type SigFun clk a b    = ArrowP SF clk a b



-- Arbitrary number of channels (say, 5.1) can be supported by just adding more

-- instances of the AudioSample type class.



class AudioSample a where

    zero :: a

    mix :: a -> a -> a

    collapse :: a -> [Double]

    numChans :: a -> Int   

      -- allows us to reify the number of channels from the type.



instance AudioSample Double where

    zero = 0

    mix = (+)

    collapse a = [a]

    numChans _ = 1



instance AudioSample (Double,Double) where

    zero = (0,0)

    mix (a,b) (c,d) = (a+c,b+d)

    collapse (a,b) = [a,b]

    numChans _ = 2



-- Some useful type synonyms:

type Mono p = Signal p () Double

type Stereo p = Signal p () (Double,Double)