module Synthesizer.Plain.Effect where
import qualified Synthesizer.Plain.Noise as Noise
import qualified Synthesizer.Plain.Filter.Recursive as Filter
import qualified Synthesizer.Plain.Filter.Recursive.FirstOrder as Filt1
import qualified Synthesizer.Plain.Filter.Recursive.Moog as Moog
import qualified Synthesizer.Plain.Filter.Recursive.Comb as Comb
import qualified Synthesizer.Plain.Filter.Recursive.Butterworth as Butter
import qualified Synthesizer.Plain.Filter.Recursive.Chebyshev as Cheby
import Synthesizer.Plain.Control(exponential2)
import Synthesizer.Plain.Instrument
import Synthesizer.Plain.Effect.Glass(glass)
import qualified Synthesizer.Plain.File as File
import qualified Control.Monad.Exception.Synchronous as Exc
import System.Process (rawSystem, )
import System.Exit (ExitCode, )
main :: IO ExitCode
main =
let rate = 44100
in Exc.toExitCodeT $
do
Exc.fromExitCodeT $ File.renderMonoToInt16 "test.aiff" rate soundE
Exc.fromExitCodeT $ rawSystem "play" ["test.aiff"]
soundE, soundB, soundA,
sound9, sound8, sound7,
sound6, sound5, sound4,
sound3, sound2, sound1,
sound0, soundm0 :: Double -> [Double]
soundE = glass
cFreq :: Double
cFreq = 521.3417849066773
soundB sampleRate =
let baseFreq = cFreq/2
chord = zipWith3 (\x y z -> (x+y+z)/5)
(choir sampleRate (baseFreq*1/1))
(choir sampleRate (baseFreq*5/4))
(choir sampleRate (baseFreq*3/2))
filterFreqs = map (3000/sampleRate*)
(map sin (iterate (pi/(6*sampleRate)+) 0))
in Butter.lowpassPole 8 (repeat (0.3::Double)) filterFreqs (chord::[Double])
soundA sampleRate =
choir sampleRate cFreq
sound9 sampleRate =
map (*0.1) (accumulatedSaws sampleRate cFreq !! 20)
sound8 sampleRate =
let filterFreqs = exponential2 (-0.5*sampleRate) (100/sampleRate)
in Cheby.lowpassBPole 8 (repeat (0.3::Double)) filterFreqs (Noise.white::[Double])
sound7 sampleRate =
let filterFreqs = exponential2 (-0.5*sampleRate) (100/sampleRate)
in Butter.lowpassPole 8 (repeat (0.3::Double)) filterFreqs (Noise.white::[Double])
sound6 sampleRate =
let order = 10
control0 :: [Moog.Parameter Double]
control0 = repeat (Moog.parameter order (Filter.Pole 10 (400/sampleRate)))
in Moog.lowpass order control0
(map (0.5*) (fatSawChord sampleRate 220))
sound5 sampleRate =
Comb.runMulti
(map (\t -> round (t*sampleRate)) [0.08,0.13,0.21])
(0.3::Double) (bell sampleRate 441)
sound4 sampleRate =
Comb.runProc
(round (0.3*sampleRate))
(Filt1.lowpass
(repeat (Filt1.parameter (441/sampleRate::Double))))
(bell sampleRate 441)
sound3 sampleRate = allpassPlain sampleRate 0.3 1 441
sound2 sampleRate = allpassDown sampleRate 10 0.5 1000 441
sound1 sampleRate = map (0.1*) (moogDown sampleRate 6 0.4 5000 441)
sound0 sampleRate = map (0.3*) (moogReso sampleRate 6 0.1 2000 441)
soundm0 sampleRate = fatSawChordFilter sampleRate 110