hsc3-0.3: Help/Graphs/lin-sosc.lhs
lin-sosc (rd)
> 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
> ; tblC b c = playBuf 1 b (in' 1 KR c * bufRateScale KR b) 0 0 Loop
> ; 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 = liftM (l !!) (rrand (0, length l - 1))
> ; pauseThread n = when (n > 1e-3) (threadDelay (floor (n * 1e6)))
> ; 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
> ; rng l r e = l + (e * (l - r))
> ; 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))) }