packages feed

hsc3-graphs-0.8: src/lin-sosc.lhs

lin-sosc (rd)

> import Control.Concurrent
> import Control.Monad
> import Sound.OpenSoundControl
> import Sound.SC3
> import System.Random

> main =
>   let { n = 1024
>       ; x = mouseX KR 0.001 1.0 Linear 0.1
>       ; tblM b = playBuf 1 b (x * bufRateScale KR b) 0 0 Loop DoNothing
>       ; tblC b c = playBuf 1 b (in' 1 KR c * bufRateScale KR b) 0 0 Loop DoNothing
>       ; o = sinOsc AR (tblM 0) 0 * tblM 1 
>       ; co = clip2 (pan2 o (tblC 1 0) 0.025) 0.25
>       ; rrand (a, b) = getStdRandom (randomR (a,b))
>       ; choose l = fmap (l !!) (rrand (0, length l - 1))
>       ; iota 0 _ _ = []
>       ; iota n l s = l : iota (n - 1) (l + s) s
>       ; geom 0 _ _ = []
>       ; geom n i f = i : geom (n - 1) (i * f) f
>       ; lineTo n l r = iota n l ((r - l) / n)
>       ; xlineTo n l r = geom n l ((r / l) ** (1.0 / n))
>       ; twoPi = pi * 2.0
>       ; srng l r e = let m = (l - r ) / 2
>                      in m + l + (e * m) 
>       ; freq = [ lineTo n 440.0 444.0
>                , lineTo n 40.0 16000.0
>                , xlineTo n 40.0 16000.0
>                , map (srng 20 21000 . sin) (lineTo n 0.0 twoPi)
>                , map (srng 20 12000 . cos) (lineTo n 0.0 twoPi)
>                , map (srng 20 22000 . tan) (lineTo n 0.0 twoPi)
>                , map (srng 20 90 . tan) (lineTo n 0.0 twoPi) ]
>       ; ampl = [ lineTo n 0.1 1.0
>                , lineTo n 1.0 0.1
>                , lineTo n 0.5 0.01
>                , lineTo n 0.01 0.5
>                , xlineTo n 1.0 0.1
>                , xlineTo n 0.1 1.0
>                , map sin (lineTo n 0.0 twoPi)
>                , map cos (lineTo n 0.0 twoPi)
>                , map (* 0.001) (map tan (lineTo n 0 twoPi)) ]
>       ; sloc = [ 0.005, 0.0075, 0.01, 0.025, 0.05, 0.075
>                , 0.1, 0.25, 0.5, 0.75
>                , 0.8, 0.85, 1.0, 1.005 ]
>       ; paus = [0.01, 0.05, 0.1, 0.15, 0.25, 0.5, 0.75]
>       ; update fd = do { f <- choose freq
>                        ; a <- choose ampl
>                        ; s <- choose sloc
>                        ; p <- choose paus
>                        ; send fd (b_setn 0 [(0, f)])
>                        ; send fd (b_setn 1 [(0, a)])
>                        ; send fd (c_set [(0, s)])
>                        ; pauseThread p } }
>   in do { withSC3 (\fd -> do { async fd (b_alloc 0 (floor n) 1)
>                              ; async fd (b_alloc 1 (floor n) 1)
>                              ; play fd (out 0 co) })
>         ; forkIO (withSC3 (\fd -> replicateM_ 128 (update fd))) }