{-# LANGUAGE FlexibleContexts #-}
module Synthesizer.Generic.Tutorial
{-# DEPRECATED "do not import that module, it is only intended for demonstration" #-}
where
import qualified Synthesizer.Plain.Tutorial as Tutorial
import qualified Sound.Sox.Play as Play
import qualified Sound.Sox.Write as Write
import qualified Sound.Sox.Option.Format as SoxOpt
import qualified Synthesizer.Basic.Binary as BinSmp
import qualified Synthesizer.Storable.Signal as SigSt
import qualified Synthesizer.Generic.Signal as SigG
import qualified Synthesizer.State.Signal as Sig
import qualified Synthesizer.Causal.Process as Causal
import Control.Arrow ((&&&), (^<<), (<<^), (<<<), )
import qualified Synthesizer.Generic.Oscillator as Osci
import qualified Synthesizer.Generic.Piece as Piece
import qualified Synthesizer.Generic.Filter.NonRecursive as Filt
import qualified Synthesizer.Plain.Filter.Recursive as FiltRec
import qualified Synthesizer.Plain.Filter.Recursive.Universal as UniFilter
import qualified Synthesizer.Basic.Wave as Wave
import Synthesizer.Piecewise ((#|-), (-|#), (#|), (|#), )
import qualified Synthesizer.State.Control as CtrlS
import qualified Synthesizer.State.Oscillator as OsciS
import System.Exit (ExitCode, )
import NumericPrelude.Numeric
import NumericPrelude.Base
import Prelude ()
play :: SigSt.T Double -> IO ExitCode
play :: Vector Double -> IO ExitCode
play =
forall y (sig :: * -> *).
C y =>
(Handle -> sig y -> IO ()) -> T -> Int -> sig y -> IO ExitCode
Play.simple forall a. Storable a => Handle -> Vector a -> IO ()
SigSt.hPut T
SoxOpt.none Int
44100 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall x y.
(Storable x, Storable y) =>
(x -> y) -> Vector x -> Vector y
SigSt.map Double -> Int16
BinSmp.int16FromDouble
oscillator :: IO ExitCode
oscillator :: IO ExitCode
oscillator =
Vector Double -> IO ExitCode
play (forall a (sig :: * -> *) b.
(C a, Write sig b) =>
LazySize -> T a b -> T a -> a -> sig b
Osci.static LazySize
SigG.defaultLazySize forall a. C a => T a a
Wave.sine forall a. C a => a
zero (Double
0.01::Double))
write :: FilePath -> SigSt.T Double -> IO ExitCode
write :: FilePath -> Vector Double -> IO ExitCode
write FilePath
name =
forall y (sig :: * -> *).
C y =>
(Handle -> sig y -> IO ())
-> T -> FilePath -> Int -> sig y -> IO ExitCode
Write.simple forall a. Storable a => Handle -> Vector a -> IO ()
SigSt.hPut T
SoxOpt.none FilePath
name Int
44100 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall x y.
(Storable x, Storable y) =>
(x -> y) -> Vector x -> Vector y
SigSt.map Double -> Int16
BinSmp.int16FromDouble
brass :: IO ExitCode
brass :: IO ExitCode
brass =
Vector Double -> IO ExitCode
play forall a b. (a -> b) -> a -> b
$
forall a (sig :: * -> *).
(C a, Transform sig a) =>
sig a -> sig a -> sig a
Filt.envelope
(forall a (sig :: * -> *).
(C a, Transform (sig a)) =>
LazySize -> T a a (LazySize -> a -> sig a) -> sig a
Piece.run LazySize
SigG.defaultLazySize forall a b. (a -> b) -> a -> b
$
Double
0 forall y t sig. y -> (PieceDist t y sig, T t y sig) -> T t y sig
|# ( Double
3000, forall a (sig :: * -> *). (C a, Write sig a) => a -> a -> T sig a
Piece.cubic Double
0.002 Double
0) forall t y sig.
(t, Piece t y sig)
-> (PieceRightSingle y, T t y sig)
-> (PieceDist t y sig, T t y sig)
#|-
Double
0.7 forall y t sig.
y
-> (PieceDist t y sig, T t y sig)
-> (PieceRightSingle y, T t y sig)
-|# (Double
50000, forall (sig :: * -> *) a. Write sig a => T sig a
Piece.step) forall t y sig.
(t, Piece t y sig)
-> (PieceRightSingle y, T t y sig)
-> (PieceDist t y sig, T t y sig)
#|-
Double
0.7 forall y t sig.
y
-> (PieceDist t y sig, T t y sig)
-> (PieceRightSingle y, T t y sig)
-|# (Double
10000, forall a (sig :: * -> *). (C a, Write sig a) => a -> T sig a
Piece.exponential Double
0) forall t y sig.
(t, Piece t y sig) -> y -> (PieceDist t y sig, T t y sig)
#| (Double
0.01::Double)) forall a b. (a -> b) -> a -> b
$
forall (sig :: * -> *) y. Write sig y => LazySize -> T y -> sig y
SigG.fromState LazySize
SigG.defaultLazySize forall a b. (a -> b) -> a -> b
$
forall a (sig :: * -> *).
(C a, Transform sig a) =>
a -> sig a -> sig a
Filt.amplify Double
0.5 forall a b. (a -> b) -> a -> b
$
forall y (sig :: * -> *).
(C y, Transform sig y) =>
sig y -> sig y -> sig y
SigG.mix
(forall a b. C a => T a b -> T a -> a -> T b
OsciS.static forall a. C a => T a a
Wave.saw forall a. C a => a
zero (Double
0.00499::Double))
(forall a b. C a => T a b -> T a -> a -> T b
OsciS.static forall a. C a => T a a
Wave.saw forall a. C a => a
zero (Double
0.00501::Double))
filterSawSig ::
(SigG.Write sig Double,
SigG.Transform sig (UniFilter.Result Double),
SigG.Transform sig (UniFilter.Parameter Double)) =>
sig Double
filterSawSig :: forall (sig :: * -> *).
(Write sig Double, Transform sig (Result Double),
Transform sig (Parameter Double)) =>
sig Double
filterSawSig =
forall (sig :: * -> *) y0 y1.
(Transform0 sig, Storage (sig y0), Storage (sig y1)) =>
(y0 -> y1) -> sig y0 -> sig y1
SigG.map forall a. Result a -> a
UniFilter.lowpass forall a b. (a -> b) -> a -> b
$ forall (sig :: * -> *) a b ctrl s.
(Transform sig a, Transform sig b, Read sig ctrl) =>
Simple s ctrl a b -> sig ctrl -> sig a -> sig b
SigG.modifyModulated forall a v.
(C a, C a v) =>
Simple (State v) (Parameter a) v (Result v)
UniFilter.modifier (forall (sig :: * -> *) y0 y1.
(Transform0 sig, Storage (sig y0), Storage (sig y1)) =>
(y0 -> y1) -> sig y0 -> sig y1
SigG.map (\Double
f -> forall a. C a => Pole a -> Parameter a
UniFilter.parameter forall a b. (a -> b) -> a -> b
$ forall a. a -> a -> Pole a
FiltRec.Pole Double
10 (Double
0.04forall a. C a => a -> a -> a
+Double
0.02forall a. C a => a -> a -> a
*Double
f)) forall a b. (a -> b) -> a -> b
$ forall a (sig :: * -> *) b.
(C a, Write sig b) =>
LazySize -> T a b -> T a -> a -> sig b
Osci.static LazySize
SigG.defaultLazySize forall a. C a => T a a
Wave.sine forall a. C a => a
zero (Double
0.00001::Double)) forall a b. (a -> b) -> a -> b
$ forall a (sig :: * -> *) b.
(C a, Write sig b) =>
LazySize -> T a b -> T a -> a -> sig b
Osci.static LazySize
SigG.defaultLazySize forall a. C a => T a a
Wave.saw forall a. C a => a
zero (Double
0.002::Double)
filterSaw :: IO ExitCode
filterSaw :: IO ExitCode
filterSaw =
Vector Double -> IO ExitCode
play forall (sig :: * -> *).
(Write sig Double, Transform sig (Result Double),
Transform sig (Parameter Double)) =>
sig Double
filterSawSig
playState :: Sig.T Double -> IO ExitCode
playState :: T Double -> IO ExitCode
playState =
forall y (sig :: * -> *).
C y =>
(Handle -> sig y -> IO ()) -> T -> Int -> sig y -> IO ExitCode
Play.simple forall a. Storable a => Handle -> Vector a -> IO ()
SigSt.hPut T
SoxOpt.none Int
44100 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall (sig :: * -> *) y. Write sig y => LazySize -> T y -> sig y
SigG.fromState LazySize
SigG.defaultLazySize forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a b. (a -> b) -> T a -> T b
Sig.map Double -> Int16
BinSmp.int16FromDouble
filterSawState :: IO ExitCode
filterSawState :: IO ExitCode
filterSawState =
T Double -> IO ExitCode
playState forall (sig :: * -> *).
(Write sig Double, Transform sig (Result Double),
Transform sig (Parameter Double)) =>
sig Double
filterSawSig
filterPingStateProc :: Sig.T Double -> Sig.T Double
filterPingStateProc :: T Double -> T Double
filterPingStateProc T Double
env =
forall a (sig :: * -> *).
(C a, Transform sig a) =>
sig a -> sig a -> sig a
Filt.envelope T Double
env forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> T a -> T b
Sig.map forall a. Result a -> a
UniFilter.lowpass forall a b. (a -> b) -> a -> b
$ forall s ctrl a b. Simple s ctrl a b -> T ctrl -> T a -> T b
Sig.modifyModulated forall a v.
(C a, C a v) =>
Simple (State v) (Parameter a) v (Result v)
UniFilter.modifier (forall a b. (a -> b) -> T a -> T b
Sig.map (\Double
f -> forall a. C a => Pole a -> Parameter a
UniFilter.parameter forall a b. (a -> b) -> a -> b
$ forall a. a -> a -> Pole a
FiltRec.Pole Double
10 (Double
0.03forall a. C a => a -> a -> a
*Double
f)) forall a b. (a -> b) -> a -> b
$ T Double
env) forall a b. (a -> b) -> a -> b
$ forall a b. C a => T a b -> T a -> a -> T b
OsciS.static forall a. C a => T a a
Wave.saw forall a. C a => a
zero (Double
0.002::Double)
filterPingState :: IO ExitCode
filterPingState :: IO ExitCode
filterPingState =
T Double -> IO ExitCode
playState forall a b. (a -> b) -> a -> b
$
T Double -> T Double
filterPingStateProc forall a b. (a -> b) -> a -> b
$
forall a. C a => a -> a -> T a
CtrlS.exponential2 Double
50000 Double
1
filterPingShare :: IO ExitCode
filterPingShare :: IO ExitCode
filterPingShare =
T Double -> IO ExitCode
playState forall a b. (a -> b) -> a -> b
$
T Double -> T Double
filterPingStateProc forall a b. (a -> b) -> a -> b
$
forall y. [y] -> T y
Sig.fromList forall a b. (a -> b) -> a -> b
$ forall y. T y -> [y]
Sig.toList forall a b. (a -> b) -> a -> b
$ forall a. C a => a -> a -> T a
CtrlS.exponential2 Double
50000 Double
1
filterPingCausal :: IO ExitCode
filterPingCausal :: IO ExitCode
filterPingCausal =
T Double -> IO ExitCode
playState forall a b. (a -> b) -> a -> b
$
let proc :: T Double Double
proc =
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. C a => a -> a -> a
(*) forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
((forall a. Result a -> a
UniFilter.lowpass forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<<
forall a v. (C a, C a v) => T (Parameter a, v) (Result v)
UniFilter.causal forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
<<<
forall (sig :: * -> *) a b. Read sig a => sig a -> T b (b, a)
Causal.feedSnd (forall a b. C a => T a b -> T a -> a -> T b
OsciS.static forall a. C a => T a a
Wave.saw forall a. C a => a
zero (Double
0.002::Double)) forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^
(\Double
f -> forall a. C a => Pole a -> Parameter a
UniFilter.parameter forall a b. (a -> b) -> a -> b
$ forall a. a -> a -> Pole a
FiltRec.Pole Double
10 (Double
0.03forall a. C a => a -> a -> a
*Double
f)))
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&&
forall a. T a a
Causal.id)
in forall (sig :: * -> *) a b.
(Transform sig a, Transform sig b) =>
T a b -> sig a -> sig b
Causal.apply T Double Double
proc forall a b. (a -> b) -> a -> b
$ forall a. C a => a -> a -> T a
CtrlS.exponential2 Double
50000 Double
1