module Synthesizer.Dimensional.RateAmplitude.File (
write,
writeTimeVoltage,
writeTimeVoltageMonoDouble,
writeTimeVoltageStereoDouble,
renderTimeVoltageMonoDouble,
renderTimeVoltageStereoDouble,
) where
import qualified Sox.File
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.Frame.Stereo as Stereo
import qualified Synthesizer.Storable.Signal as SigSt
import qualified Synthesizer.State.Signal as Sig
import qualified Algebra.Module as Module
import qualified Algebra.RealField as RealField
import qualified Algebra.Field as Field
import qualified Algebra.DimensionTerm as Dim
import qualified Number.DimensionTerm as DN
import System.Exit(ExitCode)
import NumericPrelude
import PreludeBase
write ::
(RealField.C t, BinSmp.C yv,
Dim.C u, Field.C t,
Dim.C v, Module.C y yv, Field.C y) =>
DN.T (Dim.Recip u) t ->
DN.T v y ->
FilePath ->
SigP.T u t (SigA.S v y) yv ->
IO ExitCode
write freqUnit amp name sig =
Sox.File.write name
(DN.divToScalar (SigP.sampleRate sig) freqUnit)
(Sig.toList (SigA.vectorSamples (flip DN.divToScalar amp) sig))
writeTimeVoltage ::
(RealField.C t, BinSmp.C yv,
Field.C t,
Module.C y yv, Field.C y) =>
FilePath ->
SigP.T Dim.Time t (SigA.S Dim.Voltage y) yv ->
IO ExitCode
writeTimeVoltage =
write (DN.frequency one) (DN.voltage one)
writeTimeVoltageMonoDouble ::
FilePath ->
SigP.T Dim.Time Double (SigA.S Dim.Voltage Double) Double ->
IO ()
writeTimeVoltageMonoDouble name sig =
let rate = DN.toNumberWithDimension Dim.frequency (SigP.sampleRate sig)
in do SigSt.writeFile (name ++ ".sw")
(SigP.signal (SigRA.toStorableInt16Mono sig))
Sox.File.rawToAIFF name [] rate 1
return ()
writeTimeVoltageStereoDouble ::
FilePath ->
SigP.T Dim.Time Double (SigA.S Dim.Voltage Double) (Stereo.T Double) ->
IO ()
writeTimeVoltageStereoDouble name sig =
let rate = DN.toNumberWithDimension Dim.frequency (SigP.sampleRate sig)
in do SigSt.writeFile (name ++ ".sw")
(SigP.signal (SigRA.toStorableInt16Stereo sig))
Sox.File.rawToAIFF name [] rate 2
return ()
renderTimeVoltageMonoDouble ::
DN.T Dim.Frequency Double ->
FilePath ->
(forall s. Proc.T s Dim.Time Double (SigA.R s Dim.Voltage Double Double)) ->
IO ()
renderTimeVoltageMonoDouble rate name sig =
writeTimeVoltageMonoDouble name (SigP.runProcess rate sig)
renderTimeVoltageStereoDouble ::
DN.T Dim.Frequency Double ->
FilePath ->
(forall s. Proc.T s Dim.Time Double (SigA.R s Dim.Voltage Double (Stereo.T Double))) ->
IO ()
renderTimeVoltageStereoDouble rate name sig =
writeTimeVoltageStereoDouble name (SigP.runProcess rate sig)