packages feed

hsc3-graphs-0.11: src/adso.hs

-- adso (rd)

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

getb :: Real a => UGen -> a -> UGen
getb b j =
    let k = mce [0 .. constant j - 1]
    in bufRdN 1 KR b k NoLoop

adso :: Real a => a -> UGen
adso n =
    let m = sinOsc KR (getb 3 n) 0
        f = midiCPS (getb 0 n) * (m * getb 4 n + 1)
        l = getb 2 n
        g = getb 1 n
    in mix (pan2 (sinOsc AR f 0) l g)

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

rrand_l :: Random a => Int -> a -> a -> IO [a]
rrand_l j l r = sequence (replicate j (rrand l r))

pattern :: Transport t => t -> Int -> Double -> IO ()
pattern fd n t = do
  z <- do l <- rrand 22 48
          r <- rrand 54 122
          sequence (replicate n (rrand l r))
  send fd (b_setn1 0 0 z)
  let rn i l r = do d <- rrand_l n l r
                    send fd (b_setn1 i 0 d)
  rn 1 0 0.1
  rn 2 (-1) 1
  rn 3 2 12
  rn 4 0.001 0.0075
  rn 5 1 24
  rn 6 0.05 2.4
  pauseThread t

run :: Transport t => Int -> t -> IO ()
run n fd = do
  mapM_ (\i -> async fd (b_alloc i n 1)) [0..6]
  _ <- play fd (out 0 (adso n))
  mapM_ (pattern fd n) =<< rrand_l 32 0.025 0.75
  reset fd

main :: IO ()
main = withSC3 (run 24)