> {-# 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 [])