synthesizer-0.0.3: src/Synthesizer/Dimensional/RateAmplitude/Play.hs
{-# OPTIONS -fno-implicit-prelude -fglasgow-exts #-}
-- glasgow-exts for all quantifier
module Synthesizer.Dimensional.RateAmplitude.Play (
timeVoltageMonoDouble,
timeVoltageStereoDouble,
timeVoltageMonoDoubleR,
timeVoltageStereoDoubleR,
) where
import qualified Sox
-- import qualified Sox.File
import qualified Sox.Play
-- import qualified BinarySample as BinSmp
import qualified Synthesizer.Dimensional.Process as Proc
import qualified Synthesizer.Dimensional.Amplitude.Signal as SigA
import qualified Synthesizer.Dimensional.RateAmplitude.Signal as SigRA
import qualified Synthesizer.Dimensional.RateWrapper as SigP
import qualified Synthesizer.Storable.Signal as SigSt
-- import qualified Synthesizer.Dimensional.Straight.Signal as SigS
-- import qualified Synthesizer.State.Signal as Sig
-- import qualified Algebra.Transcendental as Trans
-- import qualified Algebra.Module as Module
import qualified Algebra.RealField as RealField
-- import qualified Algebra.Field as Field
-- import qualified Algebra.Ring as Ring
import qualified Algebra.DimensionTerm as Dim
import qualified Number.DimensionTerm as DN
import qualified Synthesizer.Frame.Stereo as Stereo
-- import System.Exit(ExitCode)
import Control.Exception(bracket)
import Foreign.Storable (Storable)
import qualified System.IO as IO
import qualified System.Process as Proc
import NumericPrelude
import PreludeBase
raw :: (RealField.C a, Storable y) =>
[String] -> a -> Int -> SigSt.T y -> IO ()
raw args sampleRate numChannels stream =
bracket
(Proc.runInteractiveProcess "play"
(args ++
Sox.sampleRateOption sampleRate ++
Sox.channelOption numChannels ++
["-t","sw","-"])
Nothing Nothing)
(\(input,output,err,proc) -> do
mapM IO.hClose [input, output, err]
-- wait for end of replay
Proc.waitForProcess proc)
(\(input,_,_,_) ->
Sox.Play.catchCtrlC >>
SigSt.hPut input stream)
{-# INLINE timeVoltageMonoDouble #-}
timeVoltageMonoDouble ::
SigP.T Dim.Time Double (SigA.S Dim.Voltage Double) Double ->
IO ()
timeVoltageMonoDouble sig =
let rate = DN.toNumberWithDimension Dim.frequency (SigP.sampleRate sig)
in raw [] rate 1
(SigP.signal (SigRA.toStorableInt16Mono sig))
{-# INLINE timeVoltageStereoDouble #-}
timeVoltageStereoDouble ::
SigP.T Dim.Time Double (SigA.S Dim.Voltage Double) (Stereo.T Double) ->
-- SigP.T Dim.Time t (SigA.T Dim.Voltage y (SigS.T Sig.T)) yv ->
IO ()
timeVoltageStereoDouble sig =
let rate = DN.toNumberWithDimension Dim.frequency (SigP.sampleRate sig)
in raw [] rate 2
(SigP.signal (SigRA.toStorableInt16Stereo sig))
{-# INLINE timeVoltageMonoDoubleR #-}
timeVoltageMonoDoubleR ::
DN.T Dim.Frequency Double ->
(forall s. Proc.T s Dim.Time Double (SigA.R s Dim.Voltage Double Double)) ->
IO ()
timeVoltageMonoDoubleR rate sig =
timeVoltageMonoDouble (SigP.runProcess rate sig)
{-# INLINE timeVoltageStereoDoubleR #-}
timeVoltageStereoDoubleR ::
DN.T Dim.Frequency Double ->
(forall s. Proc.T s Dim.Time Double (SigA.R s Dim.Voltage Double (Stereo.T Double))) ->
IO ()
timeVoltageStereoDoubleR rate sig =
timeVoltageStereoDouble (SigP.runProcess rate sig)