{-# OPTIONS -fno-implicit-prelude #-}
module Synthesizer.Plain.Filter.Recursive.Test where

import qualified Synthesizer.Plain.Oscillator as Osci
import qualified Synthesizer.Plain.Filter.Recursive.SecondOrder as Filt2
import qualified Synthesizer.Plain.Filter.Recursive.Butterworth as Butter
import qualified Synthesizer.Plain.Filter.Recursive.Chebyshev   as Cheby
import Number.Complex((+:))

import qualified Algebra.Ring                as Ring

import PreludeBase
import NumericPrelude


sampleRate :: Ring.C a => a
--sampleRate = 44100
sampleRate = 22050
--sampleRate = 11025


chirp :: Double -> [Double]
chirp len = Osci.freqModSine 0 (iterate (+0.5/len) 0)


filter2ndOrderTest :: [Double]
filter2ndOrderTest =
   take 10
      (Filt2.run
          (repeat (Filt2.Parameter 1 0 0 0 (1::Double)))
          (1 : repeat 0))


butterworthLowpassTest0 :: [Double]
butterworthLowpassTest0 =
   take 30 (Butter.lowpass 2 0.2 (repeat (0.1::Double)) (repeat 1))

butterworthLowpassTest1 :: Double
butterworthLowpassTest1 =
   maximum (take 300 (drop 500
         (Butter.lowpass 6 0.1 (repeat (0.05::Double))
               (map sin (iterate (+2*pi*0.05) 0)))))

butterworthLowpassTest2 :: [Double]
butterworthLowpassTest2 =
   let len = 1*sampleRate
   in  take (round len) (Butter.lowpass 20 0.1 (repeat (0.1::Double)) (chirp len))


chebyshevALowpassTest0 :: Filt2.Parameter Double
chebyshevALowpassTest0 =
   let beta = (asinh 1) / 4
   in  Cheby.parameterA 1 (12/13 * cosh beta +: (-5/13 * sinh beta)) 0.1

chebyshevBLowpassTest0 :: Filt2.Parameter Double
chebyshevBLowpassTest0 =
   let beta = (asinh 1) / 4
   in  Cheby.parameterB (12/13) (12/13 * cosh beta +: (-5/13 * sinh beta)) 0.1

chebyshevLowpassTest1 :: [Double]
chebyshevLowpassTest1 =
   let len = 1*sampleRate
   in  take (round len) (Filt2.run (repeat chebyshevALowpassTest0) (chirp len))

chebyshevLowpassTest2 :: [Double]
chebyshevLowpassTest2 =
   let len = 1*sampleRate
   in  take (round len) (Cheby.lowpassA 10 0.25 (repeat (0.1::Double)) (chirp len))