> {-#  LANGUAGE Arrows  #-}
> module HSoM.Examples.Additive where
> import Euterpea
> import FRP.UISF.AuxFunctions
> tab1 = tableSinesN 4096 [1]
> bell1  :: Instr (Mono AudRate)
>        -- Dur -> AbsPitch -> Volume -> AudSF () Double
> bell1 dur ap vol [] = 
>   let  f    = apToHz ap
>        v    = fromIntegral vol / 100
>        d    = fromRational dur
>        sfs  = map  (\p-> constA (f*p) >>> osc tab1 0) 
>                    [4.07, 3.76, 3, 2.74, 2, 1.71, 1.19, 0.92, 0.56]
>   in proc () -> do
>        aenv  <- envExponSeg [0,1,0.001] [0.003,d-0.003] -< ()
>        a1    <- foldSF (+) 0 sfs -< ()
>        outA -< a1*aenv*v/9
> tab1' = tableSines3N 4096 [(4.07,1,0), (3.76,1,0), (3,1,0),
>   (2.74,1,0), (2,1,0), (1.71,1,0), (1.19,1,0), (0.92,1,0), (0.56,1,0)]
> bell'1  :: Instr (Mono AudRate)
> bell'1 dur ap vol [] = 
>   let  f    = apToHz ap
>        v    = fromIntegral vol / 100
>        d    = fromRational dur
>   in proc () -> do
>        aenv  <- envExponSeg [0,1,0.001] [0.003,d-0.003] -< ()
>        a1    <- osc tab1' 0 -< f
>        outA -< a1*aenv*v
> bellTest1 = outFile "bell1.wav" 6 (bell1 6 (absPitch (C,5)) 100 []) 
> mySF f d p = proc () -> do
>                s     <- osc tab1 0 <<< constA (f*p) -< ()
>                aenv  <- envExponSeg [0,1,0.001] [0.003,d/p-0.003] -< ()
>                outA  -< s*aenv
> bell2  :: Instr (Mono AudRate)
>        -- Dur -> AbsPitch -> Volume -> AudSF () Double
> bell2 dur ap vol [] = 
>   let  f    = apToHz ap
>        v    = fromIntegral vol / 100
>        d    = fromRational dur
>        sfs  = map  (mySF f d)
>                    [4.07, 3.76, 3, 2.74, 2, 1.71, 1.19, 0.92, 0.56]
>   in proc () -> do
>        a1    <- foldSF (+) 0 sfs -< ()
>        outA  -< a1*v/9
> bellTest1' = outFile "bell'1.wav" 6 (bell'1 6 (absPitch (C,5)) 100 [])
> bellTest2 = outFile "bell2.wav" 6 (bell2 6 (absPitch (C,5)) 100 []) 
> sineTable :: Table
> sineTable = tableSinesN 4096 [1]
> env1 :: AudSF () Double
> env1 = envExpon 20 10 10000
> good = outFile "good.wav" 10 
>        (osc sineTable 0 <<< envExpon 20 10 10000 :: AudSF () Double)
> bad  = outFile "bad.wav" 10 
>        (osc sineTable 0 <<< envLine  20 10 10000 :: AudSF () Double)
> sfTest1 :: AudSF (Double,Double) Double -> Instr (Mono AudRate)
>         -- AudSF (Double,Double) Double -> 
>         -- Dur -> AbsPitch -> Volume -> [Double] -> AudSF () Double
> sfTest1 sf dur ap vol [] =
>   let f = apToHz ap
>       v = fromIntegral vol / 100
>   in proc () -> do
>        a1 <- osc sineTable 0 <<< env1 -< () 
>        a2 <- sf -< (a1,f)
>        outA -< a2*v
> tLow    =  outFile "low.wav" 10 $
>            sfTest1 filterLowPass 10 (absPitch (C,5)) 80 []
> tHi     =  outFile "hi.wav" 10 $
>            sfTest1 filterHighPass 10 (absPitch (C,5)) 80 []
> tLowBW  =  outFile "lowBW.wav" 10 $
>            sfTest1 filterLowPassBW 10 (absPitch (C,5)) 80 []
> tHiBW   =  outFile "hiBW.wav" 10 $
>            sfTest1 filterHighPassBW 10 (absPitch (C,5)) 80 []
> addBandWidth ::  AudSF (Double,Double,Double) Double ->
>                  AudSF (Double,Double) Double
> addBandWidth filter =
>   proc (a,f) -> do filter -< (a,f,200)
> tBP    =  outFile "bp.wav" 10 $
>           sfTest1 (addBandWidth (filterBandPass 1)) 10 (absPitch (C,6)) 80 []
> tBS    =  outFile "bs.wav" 10 $
>           sfTest1 (addBandWidth (filterBandStop 1)) 10 (absPitch (C,6)) 80 []
> tBPBW  =  outFile "bpBW.wav" 10 $
>           sfTest1 (addBandWidth filterBandPassBW) 10 (absPitch (C,6)) 80 []
> tBSBW  =  outFile "bsBW.wav" 10 $
>           sfTest1 (addBandWidth filterBandStopBW) 10 (absPitch (C,6)) 80 []
> noise1  :: Instr (Mono AudRate)
>         -- Dur -> AbsPitch -> Volume -> [Double] -> AudSF () Double
> noise1 dur ap vol [] = 
>   let  v = fromIntegral vol / 100
>   in proc () -> do
>        a1    <- noiseWhite 42 -< ()
>        outA  -< a1*v
> test1 = outFile "noise1.wav" 6 (noise1 6 (absPitch (C,5)) 100 []) 
> env2 :: AudSF () Double
> env2 = envExpon 1 10 2000
> sfTest2  :: AudSF (Double,Double,Double) Double -> Instr (Mono AudRate)
>          -- AudSF (Double,Double,Double) Double -> 
>          -- Dur -> AbsPitch -> Volume -> [Double] -> AudSF () Double
> sfTest2 sf dur ap vol [] =
>   let  f = apToHz ap
>        v = fromIntegral vol / 100
>   in proc () -> do
>        a1 <- noiseWhite 42 -< ()
>        bw <- env2 -< ()
>        a2 <- sf -< (a1,f,bw)
>        outA -< a2
> tBP'    =  outFile "bp'.wav" 10 $
>            sfTest2 (filterBandPass 1) 10 (absPitch (C,5)) 80 []
> tBS'    =  outFile "bs'.wav" 10 $
>            sfTest2 (filterBandStop 1) 10 (absPitch (C,5)) 80 []
> tBPBW'  =  outFile "bpBW'.wav" 10 $
>            sfTest2 filterBandPassBW 10 (absPitch (C,5)) 80 []
> tBSBW'  =  outFile "bsBW'.wav" 10 $
>            sfTest2 filterBandStopBW 10 (absPitch (C,5)) 80 []
> noise2  :: Instr (Mono AudRate)
> noise2 dur ap vol [] = 
>   let  f = apToHz ap
>        v = fromIntegral vol / 100
>   in proc () -> do
>        a1    <- noiseBLI 42 -< f
>        outA  -< a1*v
> test2 = outFile "noise2.wav" 6 (noise2 6 (absPitch (C,5)) 100 []) 
> ss1  :: Instr (Mono AudRate)
> ss1 dur ap vol [] = 
>   let  v    = fromIntegral vol / 100
>   in proc () -> do
>        a1    <- noiseWhite 42 -< ()
>        a2    <- filterBandPass 2 -< (a1, 1000, 200)
>        outA  -< a2*v/5
> test3 = outFile "ss1.wav" 6 (ss1 6 (absPitch (C,5)) 100 []) 
> wind :: Instr (Mono AudRate)
> wind dur ap vol [] = 
>   let  f = apToHz ap
>        v = fromIntegral vol / 100
>   in proc () -> do
>        a1    <- noiseWhite 42 -< ()
>        lfo1  <- osc sineTable 0 -< 0.9
>        lfo2  <- osc sineTable 0 -< 1.3
>        a2    <- filterBandPass 2 -< (a1, f + 100*(lfo1+lfo2), 200)
>        outA  -< a2*v/5
> test4 = outFile "wind.wav" 6 (wind 6 (absPitch (C,7)) 100 []) 
> buzzy  :: Instr (Mono AudRate)
> buzzy dur ap vol [] = 
>   let  f    = apToHz ap
>        v    = fromIntegral vol / 100
>   in proc () -> do
>        a1 <- oscPartials sineTable 0 -< (f,20)
>        outA -< a1*v
> test5 = outFile "buzzy.wav" 6 (buzzy 6 (absPitch (C,5)) 100 []) 
> buzzy2 :: Instr (Mono AudRate)
> buzzy2 dur ap vol [] = 
>   let  f    = apToHz ap
>        v    = fromIntegral vol / 100
>        d    = fromRational dur
>   in proc () -> do
>        a1   <- oscPartials sineTable 0 -< (f,20)
>        env  <- envExponSeg [0, 1, 0.001] [0.003, d - 0.003] -< ()
>        a2   <- filterLowPass -< (a1,20000*env)
>        outA -< a2*v*env
> test6 = outFile "buzzy2.wav" 6 (buzzy2 6 (absPitch (C,5)) 100 []) 
> scifi1 :: Instr (Mono AudRate)
> scifi1 dur ap vol [] = 
>   let  v    = fromIntegral vol / 100
>   in proc () -> do
>        a1 <- noiseBLH 42 -< 8
>        a2 <- osc sineTable 0 -< 600 + 200*a1
>        outA -< a2*v
> test7 = outFile "scifi1.wav" 10 (scifi1 10 (absPitch (C,5)) 100 []) 
> scifi2 :: Instr (Mono AudRate)
> scifi2 dur ap vol [] = 
>   let  v    = fromIntegral vol / 100
>   in proc () -> do
>        a1 <- noiseBLI 44 -< 8
>        a2 <- osc sineTable 0 -< 600 + 200*a1
>        outA -< a2*v
> test8 = outFile "scifi2.wav" 10 (scifi2 10 (absPitch (C,5)) 100 [])