module Synthesizer.LLVM.Server.CausalPacked.Run where import qualified Synthesizer.LLVM.Server.CausalPacked.Arrange as Arrange import Synthesizer.LLVM.Server.CausalPacked.Arrange (StereoVector, controllerExponentialDim, (&+&), ) import qualified Sound.MIDI.Controller as Ctrl import qualified Synthesizer.LLVM.Server.CausalPacked.Speech as Speech import qualified Synthesizer.LLVM.Server.Option as Option import Synthesizer.LLVM.Server.ALSA (playChunk, startMessage, ) import Synthesizer.LLVM.Server.Common import qualified Sound.ALSA.Sequencer.Event as Event import qualified Synthesizer.MIDI.CausalIO.ControllerSet as MCS import qualified Synthesizer.MIDI.CausalIO.Process as MIO import qualified Synthesizer.ALSA.CausalIO.Process as PAlsa import qualified Synthesizer.CausalIO.Process as PIO import qualified Synthesizer.LLVM.CausalParameterized.Process as CausalP import qualified Synthesizer.LLVM.Storable.Signal as SigStL import qualified Synthesizer.LLVM.Frame.StereoInterleaved as StereoInt import qualified Data.StorableVector as SV import qualified Synthesizer.Zip as Zip import qualified Sound.ALSA.PCM as PCM import qualified Sound.MIDI.Message.Channel.Voice as VoiceMsg import qualified Sound.MIDI.Message.Channel as ChannelMsg import Control.Arrow (Arrow, (<<<), (^<<), arr, ) import Control.Category (id, ) import qualified Number.DimensionTerm as DN import qualified Algebra.Additive as Additive {- import qualified Numeric.NonNegative.Class as NonNeg import qualified Numeric.NonNegative.Wrapper as NonNegW import qualified Numeric.NonNegative.Chunky as NonNegChunky -} import Prelude hiding (Real, id, ) playFromEvents :: (PCM.SampleFmt a, Additive.C a) => Option.T -> (SampleRate Real -> PIO.T (MIO.Events Event.T) (SV.Vector a)) -> IO () playFromEvents opt process = do putStrLn startMessage PAlsa.playFromEventsWithParams (playChunk opt) (Option.clientName opt) (\(_size,rate) -> process (SampleRate $ fromIntegral rate)) keyboard :: IO () keyboard = do opt <- Option.get proc <- Arrange.keyboard playFromEvents opt $ \ sampleRate -> arr SigStL.unpackStrict <<< proc (Option.channel opt) sampleRate keyboardFM :: IO () keyboardFM = do opt <- Option.get proc <- Arrange.keyboardFM (CausalP.mapSimple StereoInt.interleave) (Option.channel opt) playFromEvents opt $ \ sampleRate -> SigStL.unpackStereoStrict ^<< proc sampleRate keyboardDetuneFMCore :: Option.T -> IO (ChannelMsg.Channel -> VoiceMsg.Program -> SampleRate Real -> PIO.T (MIO.Events Event.T) (SV.Vector StereoVector)) keyboardDetuneFMCore opt = Arrange.keyboardDetuneFMCore (CausalP.mapSimple StereoInt.interleave) (Option.sampleDirectory opt) keyboardDetuneFM :: IO () keyboardDetuneFM = do opt <- Option.get proc <- keyboardDetuneFMCore opt playFromEvents opt $ \ sampleRate -> arr SigStL.unpackStereoStrict <<< proc (Option.channel opt) (VoiceMsg.toProgram 0) sampleRate keyboardMultiChannel :: IO () keyboardMultiChannel = do opt <- Option.get proc <- keyboardDetuneFMCore opt mix <- CausalP.processIO CausalP.mix playFromEvents opt $ \ sampleRate -> arr SigStL.unpackStereoStrict <<< foldl1 (\x y -> mix () <<< Zip.arrowFanout x y) (map (\chan -> proc (ChannelMsg.toChannel chan) (VoiceMsg.toProgram 0) sampleRate) [0 .. 3]) voder :: IO () voder = do opt <- Option.get proc <- Arrange.voder (CausalP.mapSimple StereoInt.interleave) (Option.sampleDirectory opt) playFromEvents opt $ \ sampleRate -> arr SigStL.unpackStereoStrict <<< proc (Option.channel opt) (VoiceMsg.toProgram 4) sampleRate formant :: IO () formant = do opt <- Option.get proc <- Arrange.keyboardDetuneFMCore id (Option.sampleDirectory opt) form <- Speech.filterFormant mix <- CausalP.processIO CausalP.mix interleave <- CausalP.processIO (CausalP.mapSimple StereoInt.interleave) playFromEvents opt $ \ sampleRate -> arr SigStL.unpackStereoStrict <<< interleave () <<< foldl1 (\x y -> mix () <<< Zip.arrowFanout x y) (zipWith (\n (freq, amp, reson) -> form sampleRate <<< Zip.arrowFirst (MCS.controllerExponential (Ctrl.fromInt $ 16+n) (0.01,1) amp &+& (MCS.controllerExponential (Ctrl.fromInt $ 26+n) (1,100) reson &+& controllerExponentialDim (Ctrl.fromInt $ 21+n) (DN.frequency 100, DN.frequency 10000) (DN.frequency freq)))) [0..] [( 650, 1.00, 30), (1080, 0.25, 30), (2650, 0.20, 30), (2900, 0.16, 30), (3250, 0.01, 30) ]) <<< MCS.fromChannel (Option.channel opt) &+& proc (Option.channel opt) (VoiceMsg.toProgram 4) sampleRate