module Synthesizer.SampleRateContext.Play where

import qualified BinarySample as BinSmp

import qualified Synthesizer.SampleRateContext.Signal as SigC
import qualified Synthesizer.SampleRateContext.Rate   as Rate
import qualified Synthesizer.Physical.Signal         as SigP
import qualified Synthesizer.Physical.Play           as PlayP

import qualified Algebra.OccasionallyScalar as OccScalar
import qualified Algebra.VectorSpace        as VectorSpace
import qualified Algebra.RealField          as RealField
import qualified Algebra.Field              as Field


auto :: (RealField.C t, BinSmp.C yv,
         Field.C t', OccScalar.C t t',
         Field.C y', OccScalar.C y y',
         VectorSpace.C y yv) =>
   t' -> y' -> t' -> (Rate.T t t' -> SigC.T y y' yv) -> IO ()
auto freqUnit amp sampleRate proc =
   PlayP.auto freqUnit amp (SigP.runPlain sampleRate proc)