packages feed

hsc3-0.5: Help/Graphs/karplus-strong.lhs

karplus strong (alex mclean)

> import Sound.SC3

> let { aA = ( "aA" 
>            , [800, 1150, 2800, 3500, 4950]
>            , [0, -4  , -20, -36 , -60]
>            , [80, 90,  120, 130, 140] )
>     ; aU = ( "aU" 
>            , [325, 700, 2530, 3500, 4950]
>            , [0, -12 , -30, -40, -64]
>            , [50, 60,  170, 180, 200] )
>     ; cs (_, c1, c2, c3) = c1 ++ c2 ++ c3
>     ; vf i s = let { f = in' 5 kr i
>                    ; a = in' 5 kr (i + 5)
>                    ; b = in' 5 kr (i + 10) }
>                in mix (resonz s f (b / f) * dbAmp a)
>     ; ks n d = let { x = mouseX kr 0 0.01 Linear 0.1 {- delay -}
>                    ; y = mouseY kr 0.85 1 Linear 0.1 {- blend / gain -}
>                    ; ugenIf a b c = (a * b) + ((1 - a) * c)
>                    ; n0 = (n / 2) + 0.5
>                    ; probSwitch i prob = ugenIf (n0 >* prob) i (negate i)
>                    ; laggedDelay = lag x 0.01
>                    ; o = sinOsc ar 200 0
>                    ; a0 = decay d 0.025 * o
>                    ; a1 = localIn 1 ar + (a0 * (y - 0.25))
>                    ; a2 = delayN a1 0.01 laggedDelay
>                    ; a3 = delay1 a2
>                    ; a4 = (a2 + a3) / 2.0
>                    ; a5 = probSwitch a4 y
>                    ; a6 = vf (toggleFF d * 15) a5
>                    ; a7 = a6 * 1.5 }
>               in mrg [localOut (a5 * 0.99), out 0 (mce [a7, a7])] }
> in withSC3 (\fd -> do { send fd (c_setn [(0,cs aA), (15, cs aU)])
>                       ; n <- whiteNoise ar
>                       ; d <- dust kr 4
>                       ; play fd (ks n d) })

Variant on http://doc.gold.ac.uk/~ma503am/alex/vocable-source-released/