packages feed

hsc3-graphs-0.12: gr/vlc-distrtn.hs

-- vlc-distrtn (rd)
-- caution - audio feedback graph

import Sound.OSC {- hosc -}
import Sound.SC3.Monad {- hsc3 -}
import qualified Sound.SC3.Lang.Random.IO as L {- hsc3-lang -}

prep :: (Double,Double) -> [Double]
prep (ampl,phase) = [dbAmp ampl,phase]

partial :: UId m => UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> m UGen
partial b i freq detune fall n = do
  n0 <- lfNoise1 KR 1
  n1 <- rand 0.75 1.25
  let m = n * 2
      ampl = bufRdN 1 KR b m NoLoop
      f = freq * (n + 1) * (n0 * detune + 1)
  return (ringz i f (fall * n1) * ampl)

plyr :: UId m => UGen -> UGen -> m UGen
plyr i n = do
  let ctl = control KR
      buf = ctl "buf" 0
      iamp = ctl "iamp" 0.1
      ampl = ctl "ampl" 0.1
      freq = ctl "freq" 129.897
      fall = ctl "fall" 0.5
      loc = ctl "loc" 0.0
      detune = ctl "detune" 0.001
  s <- mapM (partial buf (i * iamp) freq detune fall) [0 .. n-1]
  return (out 0 (clip2 (pan2 (sum s) loc ampl) 0.1))

degree_to_key :: Int -> [Int] -> Int -> Int
degree_to_key degree scale steps =
    let scale_n = length scale
    in (steps * (degree `div` scale_n)) + (scale !! (degree `mod` scale_n))

getCps :: (Transport m,UnaryOp b) => [b] -> m b
getCps b = do
  b_ <- L.choose b
  d <- L.choose [0 .. 8]
  let k = degree_to_key d [0,2,3,5,7,8,10] 12
  return (midiCPS (b_ + realToFrac k))

pattern :: Transport m => m ()
pattern = do
  f <- getCps [24,36,48,55,60]
  ia <- L.rrand 0.05 0.75
  l <- L.rrand (-1) 1
  a <- L.rrand 0.05 0.1
  d <- L.rrand 0.001 0.005
  fl <- L.rrand 1 7
  send (n_set 1002 [("freq",f)
                   ,("iamp",ia)
                   ,("buf",0)
                   ,("loc",l)
                   ,("ampl",a)
                   ,("detune",d)
                   ,("fall",fl)])
  pauseThread =<< L.choose [0.25,0.5,0.75,1.5]

run :: (Transport m,UId m) => m ()
run = do
  _ <- async (b_alloc 0 (length vlc * 2) 1)
  send (b_setn1 0 0 (concatMap prep vlc))
  let i = soundIn 4
  _ <- async . d_recv . synthdef "plyr48" =<< plyr i 48
  send (s_new "plyr48" 1002 AddToTail 1 [])
  sequence_ (replicate 32 pattern)

main :: IO ()
main = withSC3 run

vlc :: [(Double,Double)]
vlc = [(0.00000,1.85550)
      ,(-9.92383,-0.65147)
      ,(-8.74205,-0.74728)
      ,(-3.70464,-1.39796)
      ,(-9.43435,-1.14812)
      ,(-25.84790,-1.03375)
      ,(-16.99500,-2.41724)
      ,(-29.17040,2.67419)
      ,(-26.82750,-1.61810)
      ,(-18.59870,1.34568)
      ,(-19.72160,-2.85972)
      ,(-29.43650,0.54603)
      ,(-23.63120,-1.47813)
      ,(-28.20100,-1.98501)
      ,(-41.20700,-1.11808)
      ,(-33.14310,-2.19369)
      ,(-31.54010,1.43134)
      ,(-47.62740,1.28571)
      ,(-28.79740,-1.03754)
      ,(-34.97950,0.37740)
      ,(-39.05770,-0.57557)
      ,(-38.84060,2.34836)
      ,(-40.18090,-0.96978)
      ,(-47.32150,2.14768)
      ,(-45.49290,2.52100)
      ,(-40.57100,-1.39905)
      ,(-47.19530,-2.23994)
      ,(-50.80920,2.97853)
      ,(-48.13640,0.46815)
      ,(-58.56890,-1.01821)
      ,(-57.81200,-3.08971)
      ,(-47.96870,-0.48657)
      ,(-43.96100,-0.10311)
      ,(-50.49810,-2.80977)
      ,(-50.61640,-0.17212)
      ,(-60.64640,-1.02433)
      ,(-58.03410,1.06921)
      ,(-55.46390,-2.04501)
      ,(-54.31000,-1.53512)
      ,(-52.78670,-1.49875)
      ,(-57.99380,0.17697)
      ,(-56.76990,2.28241)
      ,(-54.17450,-1.85553)
      ,(-62.58220,-2.40971)
      ,(-59.86460,1.04782)
      ,(-61.58570,1.56183)
      ,(-52.62080,1.68360)
      ,(-49.82940,-1.11019)
      ,(-56.18160,-0.78538)
      ,(-57.73320,-2.23918)
      ,(-49.87560,3.09604)
      ,(-51.00100,-0.53762)
      ,(-59.71530,0.99017)
      ,(-65.73280,2.43855)
      ,(-73.01270,-0.90664)
      ,(-61.81450,-0.53346)
      ,(-65.58980,1.51174)
      ,(-75.94320,-3.06072)
      ,(-65.22210,-1.49937)
      ,(-70.79970,-2.96199)
      ,(-64.72450,1.78172)
      ,(-73.24130,0.26939)
      ,(-66.17110,-0.23305)
      ,(-61.32910,-3.12592)
      ,(-66.98180,0.64700)
      ,(-65.23060,-2.94395)
      ,(-70.13430,1.29805)
      ,(-68.43470,-1.35906)
      ,(-71.33000,-2.71582)
      ,(-86.90080,2.11646)
      ,(-74.97450,2.76118)
      ,(-68.02520,0.94979)
      ,(-67.32960,3.05994)
      ,(-67.32140,-2.79905)
      ,(-68.22010,-2.33831)]