content: {-# 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)
  