module Synthesizer.Plain.Tutorial
{-# DEPRECATED "do not import that module, it is only intended for demonstration" #-}
where
import qualified Synthesizer.Plain.Play as Play
import qualified Synthesizer.Plain.File as File
import qualified Synthesizer.Plain.Signal as Sig
import qualified Synthesizer.Plain.Control as Ctrl
import qualified Synthesizer.Plain.Oscillator as Osci
import qualified Synthesizer.Plain.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 qualified Algebra.Module as Module
import System.Exit (ExitCode, )
import NumericPrelude.Numeric
import NumericPrelude.Base
import Prelude ()
sine :: IO ExitCode
sine :: IO ExitCode
sine =
Double -> [Double] -> IO ExitCode
forall a. C a => a -> [a] -> IO ExitCode
Play.monoToInt16 (Double
44100::Double) ((Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map Double -> Double
forall a. C a => a -> a
sin [Double
0::Double,Double
0.1..])
sineStereo :: IO ExitCode
sineStereo :: IO ExitCode
sineStereo =
Double -> [(Double, Double)] -> IO ExitCode
forall a. C a => a -> [(a, a)] -> IO ExitCode
Play.stereoToInt16 (Double
44100::Double) ([(Double, Double)] -> IO ExitCode)
-> [(Double, Double)] -> IO ExitCode
forall a b. (a -> b) -> a -> b
$ [Double] -> [Double] -> [(Double, Double)]
forall a b. [a] -> [b] -> [(a, b)]
zip ((Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map Double -> Double
forall a. C a => a -> a
sin [Double
0::Double,Double
0.0998..]) ((Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map Double -> Double
forall a. C a => a -> a
sin [Double
0::Double,Double
0.1002..])
writeSine :: IO ExitCode
writeSine :: IO ExitCode
writeSine =
FilePath -> Double -> [Double] -> IO ExitCode
forall a v. (C a, C v) => FilePath -> a -> [v] -> IO ExitCode
File.writeToInt16 FilePath
"sine.aiff" (Double
44100::Double) (Int -> [Double] -> [Double]
forall a. Int -> [a] -> [a]
take Int
50000 ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ (Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map Double -> Double
forall a. C a => a -> a
sin [Double
0::Double,Double
0.1..])
play :: Sig.T Double -> IO ExitCode
play :: [Double] -> IO ExitCode
play = Double -> [Double] -> IO ExitCode
forall a. C a => a -> [a] -> IO ExitCode
Play.monoToInt16 (Double
44100::Double)
oscillator :: IO ExitCode
oscillator :: IO ExitCode
oscillator =
[Double] -> IO ExitCode
play (T Double Double -> Double -> Double -> [Double]
forall a b. C a => T a b -> a -> a -> T b
Osci.static T Double Double
forall a. C a => T a a
Wave.sine Double
0 (Double
0.01::Double))
saw :: IO ExitCode
saw :: IO ExitCode
saw =
[Double] -> IO ExitCode
play (T Double Double -> Double -> Double -> [Double]
forall a b. C a => T a b -> a -> a -> T b
Osci.static (Double -> T Double Double
forall a. (Ord a, C a) => a -> T a a
Wave.triangleAsymmetric Double
0.9) Double
0 (Double
0.01::Double))
cubic :: IO ExitCode
cubic :: IO ExitCode
cubic =
[Double] -> IO ExitCode
play (T Double Double -> Double -> Double -> [Double]
forall a b. C a => T a b -> a -> a -> T b
Osci.static ((Double -> Double) -> T Double Double -> T Double Double
forall y z t. (y -> z) -> T t y -> T t z
Wave.distort (Double -> Integer -> Double
forall a. C a => a -> Integer -> a
^Integer
3) T Double Double
forall a. C a => T a a
Wave.saw) Double
0 (Double
0.01::Double))
sawMorph :: IO ExitCode
sawMorph :: IO ExitCode
sawMorph =
[Double] -> IO ExitCode
play ((Double -> T Double Double)
-> Double -> Double -> [Double] -> [Double]
forall a c b. C a => (c -> T a b) -> a -> a -> T c -> T b
Osci.shapeMod Double -> T Double Double
forall a. (Ord a, C a) => a -> T a a
Wave.triangleAsymmetric Double
0 (Double
0.01::Double) (T Double Double -> Double -> Double -> [Double]
forall a b. C a => T a b -> a -> a -> T b
Osci.static T Double Double
forall a. C a => T a a
Wave.sine Double
0 (Double
0.00001::Double)))
laser :: IO ExitCode
laser :: IO ExitCode
laser =
[Double] -> IO ExitCode
play (T Double Double -> Double -> [Double] -> [Double]
forall a b. C a => T a b -> a -> T a -> T b
Osci.freqMod T Double Double
forall a. C a => T a a
Wave.saw Double
0 ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ (Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (\Double
f -> Double
0.02Double -> Double -> Double
forall a. C a => a -> a -> a
+Double
0.01Double -> Double -> Double
forall a. C a => a -> a -> a
*Double
f) ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ T Double Double -> Double -> Double -> [Double]
forall a b. C a => T a b -> a -> a -> T b
Osci.static T Double Double
forall a. C a => T a a
Wave.saw Double
0 (Double
0.0001::Double))
pingSig :: Sig.T Double
pingSig :: [Double]
pingSig =
[Double] -> [Double] -> [Double]
forall a. C a => T a -> T a -> T a
Filt.envelope (Double -> Double -> [Double]
forall y. C y => y -> y -> T y
Ctrl.exponential Double
50000 Double
1) (T Double Double -> Double -> Double -> [Double]
forall a b. C a => T a b -> a -> a -> T b
Osci.static T Double Double
forall a. C a => T a a
Wave.sine Double
0 (Double
0.01::Double))
ping :: IO ExitCode
ping :: IO ExitCode
ping =
[Double] -> IO ExitCode
play [Double]
pingSig
fmPing :: IO ExitCode
fmPing :: IO ExitCode
fmPing =
[Double] -> IO ExitCode
play (T Double Double -> Double -> [Double] -> [Double]
forall a b. C a => T a b -> a -> T a -> T b
Osci.phaseMod T Double Double
forall a. C a => T a a
Wave.sine (Double
0.01::Double) ([Double] -> [Double]) -> [Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ (Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double
2Double -> Double -> Double
forall a. C a => a -> a -> a
*) [Double]
pingSig)
filterSaw :: IO ExitCode
filterSaw :: IO ExitCode
filterSaw =
[Double] -> IO ExitCode
play ((Result Double -> Double) -> [Result Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map Result Double -> Double
forall a. Result a -> a
UniFilter.lowpass ([Result Double] -> [Double]) -> [Result Double] -> [Double]
forall a b. (a -> b) -> a -> b
$ T (Parameter Double) -> [Double] -> [Result Double]
forall a v. (C a, C a v) => T (Parameter a) -> T v -> T (Result v)
UniFilter.run ((Double -> Parameter Double) -> [Double] -> T (Parameter Double)
forall a b. (a -> b) -> [a] -> [b]
map (\Double
f -> Pole Double -> Parameter Double
forall a. C a => Pole a -> Parameter a
UniFilter.parameter (Pole Double -> Parameter Double)
-> Pole Double -> Parameter Double
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Pole Double
forall a. a -> a -> Pole a
FiltRec.Pole Double
10 (Double
0.04Double -> Double -> Double
forall a. C a => a -> a -> a
+Double
0.02Double -> Double -> Double
forall a. C a => a -> a -> a
*Double
f)) ([Double] -> T (Parameter Double))
-> [Double] -> T (Parameter Double)
forall a b. (a -> b) -> a -> b
$ T Double Double -> Double -> Double -> [Double]
forall a b. C a => T a b -> a -> a -> T b
Osci.static T Double Double
forall a. C a => T a a
Wave.sine Double
0 (Double
0.00001::Double)) ([Double] -> [Result Double]) -> [Double] -> [Result Double]
forall a b. (a -> b) -> a -> b
$ T Double Double -> Double -> Double -> [Double]
forall a b. C a => T a b -> a -> a -> T b
Osci.static T Double Double
forall a. C a => T a a
Wave.saw Double
0 (Double
0.002::Double))