hsc3-graphs-0.11: src/karplus-strong.hs
-- karplus strong (alex mclean)
-- http://doc.gold.ac.uk/~ma503am/alex/vocable-source-released/
import Sound.OpenSoundControl
import Sound.SC3.ID
karplus_strong :: UGen
karplus_strong =
let 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)
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)
n = whiteNoise 'a' AR
d = dust 'a' KR 4
n0 = (n * 0.5) + 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) * 0.5
a5 = probSwitch a4 y
a6 = vf (toggleFF d * 15) a5
a7 = a6 * 1.5
in mrg [localOut (a5 * 0.99),out 0 (mce2 a7 a7)]
act :: Transport t => t -> IO ()
act fd = do
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
send fd (c_setn [(0,cs aA),(15,cs aU)])
play fd karplus_strong
main :: IO ()
main = withSC3 act