packages feed

hsc3-graphs-0.11: src/fm-kltr.hs

-- fm-kltr (rd)

import Sound.OpenSoundControl
import Sound.SC3.Monadic
import System.Random

fm_kltr :: UId m => m UGen
fm_kltr = do
  r1 <- rand 0.975 1.025
  r2 <- rand 0.5 1.5
  r3 <- rand 0.975 1.025
  r4 <- rand 0.75 1.25
  let o = control IR "out" 0
      a = control KR "amp" 0.1
      d = control KR "dur" 0.1
      f = control KR "freq" 400.0
      i = control KR "index" 40.0
      p = control KR "pan" 0.0
      f2 = control KR "freq2" 600
      ep = envPerc 0.01 d
      e = envGen AR 1 a 0 1 RemoveSynth ep
      so = sinOsc AR (xLine KR f (f * r1) d DoNothing) 0
      xl = xLine KR f2 (f2 * r3) d DoNothing
      m = so * line KR i (f * r2) d DoNothing + xl
      l = line KR p (p * r4) d DoNothing
  return (out o (pan2 (sinOsc AR m 0) l e))

rrand :: Random a => a -> a -> IO a
rrand l r = getStdRandom (randomR (l, r))

type R = Double

fm :: Transport t => t -> R -> R -> R -> R -> R -> IO ()
fm fd f ff a d i = do
  r1 <- rrand (-1) 1
  r2 <- rrand (-1) 1
  let p = [("freq", midiCPS f)
          ,("freq2", midiCPS ff + r1)
          ,("amp", a)
          ,("dur", d)
          ,("index", i)
          ,("pan", r2)]
  send fd (s_new "fm_kltr" (-1) AddToTail 1 p)

nd :: Transport t => t -> IO ()
nd fd = do
  ff <- rrand 48 96
  a <- rrand 0.1 0.4
  d <- rrand 1.2 7.2
  i <- rrand 240 1480
  t <- rrand 0.15 1.25
  fm fd 53 ff a d i
  pauseThread t

run :: Transport t => t -> IO ()
run fd = do
  u <- fm_kltr
  _ <- async fd (d_recv (synthdef "fm_kltr" u))
  sequence_ (replicate 32 (nd fd))

main :: IO ()
main = withSC3 run