packages feed

hsc3-0.5: Help/Graphs/overlap-add.lhs

overlap-add (jmcc, rd)

> import Control.Concurrent
> import Sound.OpenSoundControl
> import Sound.SC3

> let { at t f 
>       = let at' t' f' = do { n <- f' t'
>                            ; pauseThreadUntil (t' + n)
>                            ; at' (t' + n) f' }
>         in do { pauseThreadUntil t
>               ; at' t f
>               ; return () }
>     ; mk_env a s 
>       = let c = EnvNum 4
>         in envGen KR 1 1 0 1 RemoveSynth (envLinen a s a 1 [c,c,c])
>     ; with_env g a s 
>       = out 0 (g * (mk_env a s))
>     ; overlap_add fd n o a s g 
>       = do { t <- utcr
>            ; let { g' = with_env g (constant a) (constant s)
>                  ; dt = (a + s + a) / o 
>                  ; f _ = do { send fd (s_new n (-1) AddToTail 1 [])
>                             ; return dt } }
>              in do { async fd (d_recv (synthdef n g'))
>                    ; at t f } }
>     ; oSine fd 
>       = do { r0 <- expRand 500 1400
>            ; r1 <- rand (-1) 1
>            ; let g = pan2 (sinOsc AR r0 0) r1 0.01
>              in overlap_add fd "random-sines" 4 2 4 g }
>     ; oNoise fd 
>       = do { n0 <- whiteNoise AR
>            ; r0 <- expRand 800 8400
>            ; r1 <- rand (-1) 1
>            ; let g = pan2 (resonz (n0 * 0.1) r0 0.05) r1 0.25
>              in overlap_add fd "random-noise" 4 2 4 g } }
> in do { forkIO (withSC3 (\fd -> oSine fd))
>       ; forkIO (withSC3 (\fd -> oNoise fd)) }