diff --git a/Makefile b/Makefile
new file mode 100644
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,34 @@
+mk-html:
+	mkdir -p html
+	cp -f css/emacs.css html/hscolour.css
+	(cd gr ; sh ../sh/mk-html.sh)
+
+mk-pdf:
+	mkdir -p pdf
+	(cd dot.gz ; sh ../sh/mk-pdf.sh)
+
+mk-svg:
+	mkdir -p svg
+	sh sh/mk-svg.sh
+
+mk-ix:
+	mkdir -p md
+	(cd hs; runhaskell mk-ix.hs sw/hsc3-graphs)
+
+mk-lib:
+	mkdir -p Sound/SC3/Graph
+	(cd hs; runhaskell mk-lib.hs)
+
+# mk-pdf fails at sp.org
+all: mk-html mk-svg mk-ix
+
+clean:
+	(cd gr; make clean)
+	cabal clean
+	rm -f pdf/*.pdf
+	rm -f svg/*.svg
+	rm -R Sound
+	rm -f hs/hsc3-graphs.hs
+
+remote-update:
+	ssh rd@slavepianos.org "(cd sw/hsc3-graphs; make all)"
diff --git a/README b/README
--- a/README
+++ b/README
@@ -17,10 +17,21 @@
 - Nick Collins ([nc][nc], 3)
 - Nathaniel Virgo ([nv][nv], 3)
 - Alex McLean ([am][am], 1)
+- Andrea Valle ([av][av], 1)
+- Jacob Joaquin ([jj][jj], 1)
+- Josh Parmenter ([jp][jp], 1)
+- Juan A. Romero ([jar][jar], 1)
+- Lance J. Putnam ([ljp][ljp], 1)
+- Ryan Brown ([rb][rb], 1)
+- Sam Pluta ([sp][sp], 1)
+- Thor Magnusson ([tm][tm], 1)
 
 In most cases the `sclang` variants have been re-written prior to
 transliteration to haskell.
 
+The graphs can be compiled into a library by typing `make mk-lib` and
+built by typing `cabal install`.
+
 There is a `Makefile` at `gr`, type `make dep; make all`.
 
 [hs]: http://haskell.org/
@@ -31,13 +42,21 @@
 
 [adc]: http://medienhaus.udk-berlin.de/pages/Dr._Alberto_De_Campo
 [am]: http://yaxu.org/
+[av]: http://www.fonurgia.unito.it/
 [f0]: http://fredrikolofsson.com/
+[jar]: http://rukano.de/
+[jj]: http://codehop.com/
 [jl]: http://kymatica.com/
+[jp]: http://www.realizedsound.net/josh/
 [jrhb]: http://musikundmedien.net/index.php?id=454&L=1
+[ljp]: http://www.mat.ucsb.edu/l.putnam/
 [nc]: http://www.sussex.ac.uk/Users/nc81/
 [nv]: http://nathanielvirgo.com/
+[rb]: http://www.wabdo.com/
+[sp]: http://www.sampluta.com/
+[tm]: http://www.sussex.ac.uk/Users/thm21/
 
-© [rohan drape][rd] and others, 2006-2012, [gpl]
+© [rohan drape][rd] and others, 2006-2013, [gpl]
 
 [rd]: http://rd.slavepianos.org/
 [gpl]: http://gnu.org/copyleft/
diff --git a/Sound/SC3/Graph/ADC_bit_reduction.hs b/Sound/SC3/Graph/ADC_bit_reduction.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/ADC_bit_reduction.hs
@@ -0,0 +1,27 @@
+-- bit reduction (adc)
+module Sound.SC3.Graph.ADC_bit_reduction where
+
+import Sound.SC3.ID {- hsc3 -}
+
+sample_rate_decrease :: UGen
+sample_rate_decrease =
+  let f = lfNoise2 'α' KR 8
+      nh = lfNoise2 'β' KR 3
+      src = blip AR (f * 200 + 300) (nh * 10 + 20)
+      sr = mouseX KR 1000 (sampleRate * 0.1) Exponential 0.2
+  in latch src (impulse AR sr 0)
+
+bit_rate_decrease :: UGen
+bit_rate_decrease =
+  let f = lfNoise2 'γ' KR 8
+      nh = lfNoise2 'δ' KR 3
+      src = blip AR (f * 200 + 300) (nh * 10 + 20)
+      sr = mouseX KR 1000 (sampleRate * 0.1) Exponential 0.2
+      bit_sz = mouseY KR 1 24 Exponential 0.2
+      down_sample = latch src (impulse AR sr 0)
+      bit_redux = roundTo down_sample (0.5 ** bit_sz)
+  in mce2 down_sample bit_redux
+
+-- > Sound.SC3.UGen.Dot.draw (sample_rate_decrease + bit_rate_decrease)
+main :: IO ()
+main = audition (out 0 (sample_rate_decrease + bit_rate_decrease))
diff --git a/Sound/SC3/Graph/ADC_kabelscahden.hs b/Sound/SC3/Graph/ADC_kabelscahden.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/ADC_kabelscahden.hs
@@ -0,0 +1,25 @@
+-- march 2003 (adc) / (jrhb)
+module Sound.SC3.Graph.ADC_kabelscahden where
+
+import Sound.SC3.ID {- hsc3 -}
+
+kabelScahden :: UGen
+kabelScahden =
+    let freq = 50
+        sustain = 1
+        amp = 0.5
+        hum = let t = dust 'α' KR (7 ** lfNoise1 'β' KR 0.3)
+                  h = toggleFF (coinGate 'γ' 0.4 t) * rlpf (lfPulse AR freq 0 0.5 + (lfNoise1 'δ' KR 2 * 0.5 - 0.5)) 6000 0.15
+                  n = trig t (tRand 'ε' 0 0.01 (coinGate 'ζ' 0.4 t)) * whiteNoise 'η' AR
+                  m = trig t (tRand 'θ' 0 0.01 (coinGate 'ι' 0.4 t)) * brownNoise 'κ' AR
+                  k = trig t (lfNoise1 'λ' KR (mce2 4 4.2) * 0.1 + 0.11) * lfClipNoise 'μ' AR (lfNoise0 'ν' KR 7 * 30 + 40)
+              in distort (leakDC ((h + n + m + k) * 10) 0.995)
+        e = envGen KR 1 1 0 1 RemoveSynth (Envelope [amp,amp,0] [sustain,0] [] Nothing Nothing)
+    in out 0 (clip2 hum 1 * e * 0.25)
+
+main :: IO ()
+main = audition kabelScahden
+
+-- Local Variables:
+-- truncate-lines:t
+-- End:
diff --git a/Sound/SC3/Graph/ADC_shepard_tones.hs b/Sound/SC3/Graph/ADC_shepard_tones.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/ADC_shepard_tones.hs
@@ -0,0 +1,40 @@
+-- shepard tones, alberto de campo (adc)
+module Sound.SC3.Graph.ADC_shepard_tones where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+
+interp :: (Fractional t,Enum t) => t -> t -> t -> [t]
+interp n l r =
+    let i = (r - l) / n
+    in [l,l + i .. r - i]
+
+hanningWindow :: (Floating b,Enum b) => b -> [b]
+hanningWindow n =
+    let lp = pi * (-0.5)
+        rp = lp + 2 * pi
+        hf i = sin i * 0.5 + 0.5
+    in map hf (interp n lp rp)
+
+shepard_tones :: UGen
+shepard_tones =
+    let ratescale = 1024 / 44100 / 10
+        rate = 0.1
+        ph = phasor AR 0 (rate * ratescale) 0 1024 0
+        phases = mce (map (\n -> n * 0.1 * 1024 + ph) [0..9])
+        freqs = bufRdC 1 AR 1 phases Loop
+        amps = bufRdC 1 AR 2 phases Loop
+    in mix (sinOsc AR freqs 0 * amps) * 0.1
+
+run :: Transport m => m ()
+run = do
+  let square x = x * x
+      ampTable = map square (hanningWindow 1024)
+      amp_f i = (0.5 ** i) * 20000
+      freqTable = map amp_f (interp 1024 0 10)
+  _ <- async (b_alloc_setn1 1 0 freqTable)
+  _ <- async (b_alloc_setn1 2 0 ampTable)
+  play (out 0 shepard_tones)
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/AM_karplus_strong.hs b/Sound/SC3/Graph/AM_karplus_strong.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/AM_karplus_strong.hs
@@ -0,0 +1,48 @@
+-- http://doc.gold.ac.uk/~ma503am/alex/vocable-source-released/ (am)
+module Sound.SC3.Graph.AM_karplus_strong where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+
+-- x = delay, y = blend / gain
+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
+        y = mouseY KR 0.85 1 Linear 0.1
+        ugenIf a b c = (a * b) + ((1 - a) * c)
+        n = whiteNoise 'α' AR
+        d = dust 'β' 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 m => m ()
+act = 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 (c_setn [(0,cs aA),(15,cs aU)])
+  play karplus_strong
+
+main :: IO ()
+main = withSC3 act
diff --git a/Sound/SC3/Graph/AV_rm_octaver.hs b/Sound/SC3/Graph/AV_rm_octaver.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/AV_rm_octaver.hs
@@ -0,0 +1,16 @@
+-- rm-octaver (av), courtesy miller puckette
+module Sound.SC3.Graph.AV_rm_octaver where
+
+import Sound.SC3 {- hsc3 -}
+
+defaultPitch :: UGen -> UGen
+defaultPitch x = pitch x 440 60 4000 100 16 1 0.01 0.5 1
+
+rm_octaver :: UGen -> UGen
+rm_octaver i =
+    let p = defaultPitch i
+        f = mceChannel 0 p
+    in sinOsc AR (f * 0.5) 0 * i + i
+
+main :: IO ()
+main = audition (out 0 (rm_octaver (soundIn 4)))
diff --git a/Sound/SC3/Graph/F0_1_4Q6.hs b/Sound/SC3/Graph/F0_1_4Q6.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_1_4Q6.hs
@@ -0,0 +1,46 @@
+-- http://sccode.org/1-4Q6 (f0)
+module Sound.SC3.Graph.F0_1_4Q6 where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+-- > audition risset
+--
+-- let set p = withSC3 (\fd -> send fd (n_set (-1) p))
+-- set [("trig",1)]
+-- set [("freq",midiCPS 100),("sustain",3),("trig",1)]
+-- set [("freq",midiCPS 60),("sustain",9),("trig",1)]
+-- set [("freq",midiCPS 40),("sustain",15),("trig",1)]
+risset :: Synthdef
+risset =
+    let k = control KR
+        pan = k "pan" 0
+        f = k "freq" 400
+        ampl = k "amp" 0.1
+        d = k "sustain" 2
+        tr = tr_control "trig" 1
+        amps = [1,0.67,1,1.8,2.67,1.67,1.46,1.33,1.33,1,1.33]
+        durs = [1,0.9,0.65,0.55,0.325,0.35,0.25,0.2,0.15,0.1,0.075]
+        frqs = [0.56,0.56,0.92,0.92,1.19,1.7,2,2.74,3,3.76,4.07]
+        dets = [0,1,0,1.7,0,0,0,0,0,0,0]
+        fn i =
+            let shp = let c = EnvNum (-4.5)
+                      in envPerc' 0.005 (d * durs!!i) (amps!!i) (c,c)
+                env = envGen AR tr 1 0 1 DoNothing shp
+            in sinOsc AR (f * frqs!!i + dets!!i) 0 * ampl * env
+        src = mixFill 11 fn
+    in synthdef "risset" (out 0 (pan2 src pan 1))
+
+pattern :: P_Bind
+pattern =
+  [(K_instr,pinstr' (Instr_Def risset False))
+  ,(K_id,1000)
+  ,(K_note,prand 'α' [0,2,5,7,11] inf)
+  ,(K_octave,prand 'β' [4,5,6,7,9] inf)
+  ,(K_legato,1)
+  ,(K_dur,prand 'γ' [2,3,5,7] inf)
+  ,(K_amp,pwhite 'δ' 0.025 0.15 inf)
+  ,(K_param "trig",1)]
+
+main :: IO ()
+main = audition (pmono pattern)
diff --git a/Sound/SC3/Graph/F0_buffer_display.hs b/Sound/SC3/Graph/F0_buffer_display.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_buffer_display.hs
@@ -0,0 +1,134 @@
+-- http://sccode.org/1-1HR (f0)
+module Sound.SC3.Graph.F0_buffer_display where
+
+import Control.Concurrent {- base -}
+import qualified Graphics.Rendering.Cairo as C {- cairo -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Cairo.Scope.Shell {- hsc3-cairo -}
+
+-- * Type
+
+type R = Double
+data BD_Type = BD_Line | BD_Warp | BD_Flower
+data BD = BD {gain :: R
+             ,theta :: R
+             ,theta_incr :: R
+             ,trails :: R
+             ,version :: BD_Type}
+
+bd_default :: BD
+bd_default = BD 0.5 0 0 1 BD_Line
+
+-- * Render
+
+rotate_about :: R -> R -> R -> C.Render ()
+rotate_about a x y = do
+  C.translate x y
+  C.rotate a
+  C.translate (-x) (-y)
+
+render_line :: R -> R -> [R] -> C.Render ()
+render_line n a d = do
+  C.translate 0 (n/2)
+  let f (x,y) = let y' = (y * n * a)
+                in if x == 0 then C.moveTo x y' else C.lineTo x y'
+  mapM_ f (zip [0..] d)
+  C.stroke
+
+pt_rotate :: Floating a => a -> (a,a) -> (a,a)
+pt_rotate a (x,y) =
+    let s = sin a
+        c = cos a
+    in (x * c - y * s,y * c + x * s)
+
+render_warp :: R -> R -> [R] -> C.Render ()
+render_warp n a d = do
+  C.translate (n/2) (n/2)
+  let f (x,y) = let (x',y') = pt_rotate (y * 2 * pi) (x * a,y * a)
+                in if x == 0 then C.moveTo x' y' else C.lineTo x' y'
+  mapM_ f (zip [0..] d)
+  C.stroke
+
+render_flower :: R -> R -> [R] -> C.Render ()
+render_flower n t d = do
+  let d0 = d !! 0
+  C.translate (n/2) (n/2)
+  C.moveTo (d0 * d0) 0
+  let f (x,y) = let a = ((x `modE` n) / n) * 2 * pi + t
+                    (x',y') = pt_rotate a (y * y,x * y)
+                in C.lineTo x' y'
+  mapM_ f (zip [0..] d)
+  C.stroke
+
+bd_render :: Render_F BD
+bd_render sh bd = do
+  let n = fromIntegral (sh_nf sh)
+      a = gain bd
+      t = theta bd
+      v = version bd
+      r = case v of
+            BD_Flower -> return ()
+            _ -> rotate_about t (n/2) (n/2)
+  C.rectangle 0 0 n n
+  C.setSourceRGBA 0 0 0 (trails bd)
+  C.fill
+  C.setSourceRGBA 0 1 0 1
+  let f d = case version bd of
+              BD_Line -> render_line n a d
+              BD_Warp -> render_warp n a d
+              BD_Flower -> render_flower n t d
+      g d = C.save >> r >> f d >> C.restore
+  mapM_ g (sh_data sh)
+  return (bd {theta = t + theta_incr bd})
+
+-- * Key
+
+bd_key :: Key_F BD
+bd_key k bd =
+    case k of
+      'T' -> bd {trails = trails bd + 0.025}
+      't' -> bd {trails = trails bd - 0.025}
+      'S' -> bd {theta_incr = theta_incr bd + 0.025}
+      's' -> bd {theta_incr = theta_incr bd - 0.025}
+      'w' -> bd {version = BD_Warp}
+      'l' -> bd {version = BD_Line}
+      'f' -> bd {version = BD_Flower}
+      'z' -> bd {theta = 0}
+      _ -> bd
+
+-- * Audio...
+
+instr :: UGen
+instr =
+    let x = mouseX KR 1 1000 Linear 0.2
+        y = mouseY KR 50 5000 Linear 0.2
+        v = varSaw AR x 0 0.5
+        f = bpf v y 0.5
+        s = sinOsc AR 0 f
+        n = brownNoise 'α' AR * 0.1
+    in out 0 (mce2 s n)
+
+bd_shell :: Int -> Shell BD
+bd_shell nc = sh_default nc bd_render bd_key
+
+main :: IO ()
+main = do
+  audition instr
+  _ <- forkIO (shell (bd_shell 2) bd_default)
+  return ()
+
+{-
+
+import Sound.SC3.ID
+
+let s = saw AR (mouseX KR 20 800 Exponential 0.2)
+in audition (out 0 s)
+
+let {v = varSaw AR (mouseX KR 1 1000 Linear 0.2) 0 0.5
+    ;f = bpf v (mouseY KR 50 5000 Linear 0.2) 0.5
+    ;s = sinOsc AR 0 f}
+in audition (out 0 s)
+
+Control.Concurrent.forkIO (shell (bd_shell 1) bd_default)
+
+-}
diff --git a/Sound/SC3/Graph/F0_f0_2012_04_19.hs b/Sound/SC3/Graph/F0_f0_2012_04_19.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_2012_04_19.hs
@@ -0,0 +1,15 @@
+-- https://www.listarc.bham.ac.uk/lists/sc-users/msg17536.html (f0)
+module Sound.SC3.Graph.F0_f0_2012_04_19 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0 :: UGen
+f0 = let s0 = lfSaw AR 10 0 * 0.01
+         t0 = lfTri AR (mce2 5 6 * 0.1) 0
+         t1 = lfTri KR 0.1 0 * 0.05 + 0.05
+         s1 = limiter (brf s0 t0 1) 1 0.01
+         o = combN s1 0.1 (roundTo t1 0.01) 1
+     in out 0 (o * 0.1)
+
+main :: IO ()
+main = audition f0
diff --git a/Sound/SC3/Graph/F0_f0_tw0011.hs b/Sound/SC3/Graph/F0_f0_tw0011.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0011.hs
@@ -0,0 +1,14 @@
+-- instance of unworkable graph given current Eq implementation (f0)
+module Sound.SC3.Graph.F0_f0_tw0011 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_0011 :: UGen
+f0_0011 =
+    let ifE a b c = (a * b) + ((1 - a) * c)
+        s o i = sinOsc AR (mce [i,i + 1e-4] ** 2 * f o (i - 1)) (f o (i - 1) * 1e-4) * f o (i - 1)
+        f o i = ifE (i >* 0) (s o i) o
+    in out 0 (f 60 6 / 60)
+
+main :: IO ()
+main = audition f0_0011
diff --git a/Sound/SC3/Graph/F0_f0_tw0014.hs b/Sound/SC3/Graph/F0_f0_tw0014.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0014.hs
@@ -0,0 +1,21 @@
+-- http://fredrikolofsson.com/f0blog/?q=node/478 (f0)
+module Sound.SC3.Graph.F0_f0_tw0014 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0014 :: UGen
+f0_tw0014 =
+    let a = sinOscFB AR
+        k = 1/9
+        f i = let a0 = a (i+1) k * 999
+                  a1 = a k 1 * k
+                  a2 = a a0 k * a1
+                  a3 = a 0.1 3
+                  a4 = a a2 a3 * ((i+2) * 999)
+                  a5 = a k k
+              in a a4 a5 * k
+        s = sum (map f [0..9])
+    in out 0 (mce2 s s)
+
+main :: IO ()
+main = audition f0_tw0014
diff --git a/Sound/SC3/Graph/F0_f0_tw0020.hs b/Sound/SC3/Graph/F0_f0_tw0020.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0020.hs
@@ -0,0 +1,21 @@
+-- http://fredrikolofsson.com/f0blog/?q=node/478 (f0)
+module Sound.SC3.Graph.F0_f0_tw0020 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0020 :: UGen
+f0_tw0020 =
+    let a n = lfPulse AR n 0 0.5
+        b = mce [1..4]
+        a1 = (a (b/32) + 1) / 8
+        a2 = (a a1 + 1) * b
+        a3 = a (b/64)
+        a4 = a (a (b/8)) * 2 + b
+        a5 = a (4/b)
+        a6 = a a2
+        a7 = a ((a6 + ((mix a3 + a5) * a4)) * 100)
+        s = mix a7 / 8
+    in out 0 (mce2 s s)
+
+main :: IO ()
+main = audition f0_tw0020
diff --git a/Sound/SC3/Graph/F0_f0_tw0028.hs b/Sound/SC3/Graph/F0_f0_tw0028.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0028.hs
@@ -0,0 +1,23 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
+module Sound.SC3.Graph.F0_f0_tw0028 where
+
+import Sound.SC3.ID {- hsc3 -}
+
+fib :: Integral i => [i]
+fib = 0 : scanl (+) 1 fib
+
+-- sc3_fib 16 == [1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987]
+sc3_fib :: Integral a => Int -> [a]
+sc3_fib n = take n (tail fib)
+
+f0_0028 :: UGen
+f0_0028 =
+    let n = map ((* 99) . (`mod` 8)) (sc3_fib 16)
+        p = dseq 'α' dinf (dshuf 'β' 8 (mce (map fromInteger n)))
+        q = combN (duty AR (1/8) 0 DoNothing p) 4 4 16
+        o = lfTri AR q 0 / 4
+        f = lfTri KR (1/16) 0 * 2e3 + 3e3
+    in out 0 (pan2 (moogFF o f 2 0) 0 1)
+
+main :: IO ()
+main = audition f0_0028
diff --git a/Sound/SC3/Graph/F0_f0_tw0030.hs b/Sound/SC3/Graph/F0_f0_tw0030.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0030.hs
@@ -0,0 +1,15 @@
+-- www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
+module Sound.SC3.Graph.F0_f0_tw0030 where
+
+import Sound.SC3.ID {- hsc3 -}
+
+f0_0030 :: UGen
+f0_0030 =
+    let a i j k l = lfPar AR i j * k + l
+        f = a 1 0 5 (a (mce2 0.05 0.04) 0 50 160 `roundTo` 50)
+        w = a 0.2 0 0.5 (a 3 0 0.2 0.5)
+        o = varSaw AR f 0 w / 8
+    in out 0 (gVerb o 80 3 0.5 0.5 15 1 0.7 0.5 300)
+
+main :: IO ()
+main = audition f0_0030
diff --git a/Sound/SC3/Graph/F0_f0_tw0033.hs b/Sound/SC3/Graph/F0_f0_tw0033.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0033.hs
@@ -0,0 +1,17 @@
+-- www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
+module Sound.SC3.Graph.F0_f0_tw0033 where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+
+f0_0033 :: UGen
+f0_0033 =
+    let f = roundE (lfPar AR (1/14) 0) * 20 + 80
+        a = pulse AR (mce [1..4]) 0.35
+        n = uclone 'α' 4 (brownNoise 'α' AR) * a
+        z i = mce2 (i + 1 * f) (i * f + (i + 1 / 3))
+        o = lfPar AR (mce (map z [0..3])) 0
+    in out 0 (splay ((o >* n) / 3) 1 1 0 True)
+
+main :: IO ()
+main = audition f0_0033
diff --git a/Sound/SC3/Graph/F0_f0_tw0045.hs b/Sound/SC3/Graph/F0_f0_tw0045.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0045.hs
@@ -0,0 +1,15 @@
+-- www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
+module Sound.SC3.Graph.F0_f0_tw0045 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_0045 :: UGen
+f0_0045 =
+    let a i j k l = sinOsc AR i j * k + l
+        f = a (a 0.11 0 1 0) 0 1 0
+        p_f = a (95 * a 0.01 0 1 1) 0 (a 5e-3 0 50 0) 100
+        p = a p_f (a (mce2 98 97) 0 1 0) (pi + a 5e-4 0 1 0) 0
+    in out 0 (tanh (a f p 1 0))
+
+main :: IO ()
+main = audition f0_0045
diff --git a/Sound/SC3/Graph/F0_f0_tw0049.hs b/Sound/SC3/Graph/F0_f0_tw0049.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0049.hs
@@ -0,0 +1,17 @@
+-- https://www.listarc.bham.ac.uk/lists/sc-users/msg18379.html (f0)
+module Sound.SC3.Graph.F0_f0_tw0049 where
+
+import Data.Bits {- base -}
+import Sound.SC3 {- hsc3 -}
+
+f0_0049 :: UGen
+f0_0049 =
+    let t = t2A 0 0
+        o0 = lfSaw AR 3 0 * 9 + 99
+        s0 = sweep t (mce [3..9]) `modE` o0
+        s1 = sweep t (mce [33,32..3]) `modE` 128 .&. s0
+        o1 = sinOsc AR (midiCPS (s1+33)) 0 * pi
+    in out 0 (splay (sinOsc AR 9 o1) 1 1 0 True / 3)
+
+main :: IO ()
+main = audition f0_0049
diff --git a/Sound/SC3/Graph/F0_f0_tw0051.hs b/Sound/SC3/Graph/F0_f0_tw0051.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0051.hs
@@ -0,0 +1,21 @@
+-- http://sccode.org/1-4Qy (f0)
+module Sound.SC3.Graph.F0_f0_tw0051 where
+
+import Sound.SC3 {- hsc3 -}
+
+-- > ascii "sunday" == mce (map constant [115,117,110,100,97,121])
+ascii :: String -> UGen
+ascii = mce . map (constant.fromEnum)
+
+-- > Sound.SC3.UGen.Dot.draw (out 0 f0_tw0051)
+f0_tw0051 :: UGen
+f0_tw0051 =
+    let i = a (ascii "sunday")
+        f = a (9 / ascii "slow") * 400 + 500
+        w = a (7 / ascii "coding") + 1.1
+        a = saw AR
+        l = splay (bBandPass i f w / 5) 1 1 0 True
+    in gVerb l 10 3 0.5 0.5 15 1 0.7 0.5 300
+
+main :: IO ()
+main = audition (out 0 f0_tw0051)
diff --git a/Sound/SC3/Graph/F0_f0_tw0077.hs b/Sound/SC3/Graph/F0_f0_tw0077.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0077.hs
@@ -0,0 +1,16 @@
+-- http://sccode.org/1-4Qy (f0)
+module Sound.SC3.Graph.F0_f0_tw0077 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0077 :: UGen
+f0_tw0077 =
+    let a = sinOsc AR
+        f = a (1 / mce2 5 6) 0 + mce2 798 912
+        p = (a (1 / 16) 0 * 19 + 99) * a (mce2 9 8) 0
+        m = a (a 6 0 * a 0.009 0) 0
+        b = a f p * m
+    in tanh (a (mce2 201 301) b)
+
+main :: IO ()
+main = audition (out 0 f0_tw0077)
diff --git a/Sound/SC3/Graph/F0_f0_tw0084.hs b/Sound/SC3/Graph/F0_f0_tw0084.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0084.hs
@@ -0,0 +1,15 @@
+-- http://sccode.org/1-4Qy (f0)
+module Sound.SC3.Graph.F0_f0_tw0084 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0084 :: UGen
+f0_tw0084 =
+    let a = saw AR
+        f = a (mce [5,7..15] * 19) * 99 + 199
+        g = a (mce [1,3..13] * 29) * 199 + 299
+        w = a (mce [3,5..11] * (a 3 * 2 + 3)) * 299 + 399
+    in splay (formant AR f g w) 1 1 0 True / 3
+
+main :: IO ()
+main = audition (out 0 f0_tw0084)
diff --git a/Sound/SC3/Graph/F0_hansm.hs b/Sound/SC3/Graph/F0_hansm.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_hansm.hs
@@ -0,0 +1,106 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/457 (f0)
+-- http://obiwannabe.co.uk/tutorials/html/tutorial_birds.html
+module Sound.SC3.Graph.F0_hansm where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+
+type T3 a = (a,a,a)
+type Bird_Call_Param a = (T3 a,T3 a,T3 a,T3 a,T3 a)
+
+bird_call :: Transport m => Bird_Call_Param UGen -> m ()
+bird_call ((freq,atk,dcy)
+          ,(fmod1,atkf1,dcyf1)
+          ,(fmod2,atkf2,dcyf2)
+          ,(amod1,atka1,dcya1)
+          ,(amod2,atka2,dcya2)) =
+    let mk_env a aT dT g lS md =
+            let x = EnvNum (-4)
+                c = Envelope [0,a,0] [aT,dT] [x,x] Nothing Nothing
+            in envGen AR g lS 0 1 md c
+        e = mk_env 0.5 atk dcy 1 1 RemoveSynth
+        freq1 = mk_env fmod1 atkf1 dcyf1 1 3000 DoNothing
+        freq2 = mk_env fmod2 atkf2 dcyf2 1 3000 DoNothing
+        amp1 = mk_env amod1 atka1 dcya1 1 1 DoNothing
+        amp2 = mk_env amod2 atka2 dcya2 1 1 DoNothing
+        fmodc = sinOsc AR freq1 0 * amp1 + 1
+        amod = 1 - sinOsc AR freq2 0 * amp2
+        z = sinOsc AR ((freq * 7000 + 300) * fmodc) 0 * amod
+    in play (out 0 (pan2 z 0 e))
+
+triple_tailed_tree_troubler :: (Fractional a) => Bird_Call_Param a
+triple_tailed_tree_troubler =
+    ((0.387755, 0.0204082, 0.204082)
+    ,(0.367347, 0.571429, 0.734694)
+    ,(0.918367, 1, 0.77551)
+    ,(0.571429, 0.367347, 0.22449)
+    ,(0.0204082, 0.183673, 0.44898))
+
+speckled_throated_spew :: (Fractional a) => Bird_Call_Param a
+speckled_throated_spew =
+    ((0.183673, 0.591837, 0.387755)
+    ,(0.0104082, 0.530612, 0.346939)
+    ,(0.244898, 0.55102, 0.122449)
+    ,(0.387755, 1, 0.612245)
+    ,(0.346939, 0.816327, 0.653061))
+
+lesser_spotted_grinchwarbler :: (Fractional a) => Bird_Call_Param a
+lesser_spotted_grinchwarbler =
+    ((0.55102, 0.591837, 0.387755)
+    ,(0.0716327, 0.0204082, 0.346939)
+    ,(0.0204082, 0.55102, 0.122449)
+    ,(0.632653, 1, 0.612245)
+    ,(0.346939, 0.816327, 0.653061))
+
+long_toed_mudhopper :: (Fractional a) => Bird_Call_Param a
+long_toed_mudhopper =
+    ((0.163265, 0.22449, 0.183673)
+    ,(0.00306122, 0.122449, 1)
+    ,(0.0612245, 1, 0.77551)
+    ,(0.979592, 0.204082, 0.734694)
+    ,(1, 0.142857, 0.612245))
+
+yellow_yiffled_yaffle :: (Fractional a) => Bird_Call_Param a
+yellow_yiffled_yaffle =
+    ((0.0204082, 0.367347, 0.183673)
+    ,(0.0612245, 0, 1)
+    ,(0.285714, 0.22449, 0.489796)
+    ,(0.367347, 0.387755, 0.734694)
+    ,(0.204082, 0.428571, 0.142857))
+
+pointy_beaked_beetlefiend :: (Fractional a) => Bird_Call_Param a
+pointy_beaked_beetlefiend =
+    ((0.428571, 0.204082, 0.489796)
+    ,(0.0204082, 0.795918, 0.591837)
+    ,(0.285714, 0.22449, 0.489796)
+    ,(0.204082, 0.836735, 0.734694)
+    ,(0.77551, 0.428571, 0.142857))
+
+african_boojuboolubala :: (Fractional a) => Bird_Call_Param a
+african_boojuboolubala =
+    ((0.306122, 0.959184, 0.0408163)
+    ,(1, 0, 0.591837)
+    ,(0.285714, 0.22449, 0.489796)
+    ,(0.204082, 0.836735, 0.734694)
+    ,(0.77551, 0.428571, 0.142857))
+
+common_muckoink :: (Fractional a) => Bird_Call_Param a
+common_muckoink =
+    ((0.0204082, 0.8, 0.0816327)
+    ,(0.0204082, 0.001, 0.99)
+    ,(0.0204082, 0.01, 1)
+    ,(1, 0.142857, 0.734694)
+    ,(1, 0.0612245, 0.530612))
+
+main :: IO ()
+main = do
+  let xs = [triple_tailed_tree_troubler
+           ,speckled_throated_spew
+           ,lesser_spotted_grinchwarbler
+           ,long_toed_mudhopper
+           ,yellow_yiffled_yaffle
+           ,pointy_beaked_beetlefiend
+           ,african_boojuboolubala
+           ,common_muckoink]
+      fn x = bird_call x >> wait 1.25
+  withSC3 (mapM_ fn xs)
diff --git a/Sound/SC3/Graph/F0_pkt_26.hs b/Sound/SC3/Graph/F0_pkt_26.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_pkt_26.hs
@@ -0,0 +1,22 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/490 (f0)
+module Sound.SC3.Graph.F0_pkt_26 where
+
+import Sound.SC3 {- hsc3 -}
+
+grid :: UGen -> UGen -> UGen
+grid n i =
+    let t = i / n
+        a = abs (varSaw AR 0.02 t 0.5 * 7.5)
+        b = varSaw AR 0.16 t (2/3) * a + 300
+        c = varSaw AR 0.064 t 0.5 * 25 + 50
+        d = varSaw AR 0.012 t 0.75 * c + 200
+        e = varSaw AR 0.024 t 0.25 * 0.475 + 0.5
+        f = varSaw AR (100 + i) t e
+        g = varSaw AR 0.048 0 0.5 * 25 + 150
+        h = varSaw AR ((i + 1) * g) t (1/3) * 150
+        o = sinOsc AR h (f * pi) * d + b
+        z = leakDC (varSaw AR o t 0.5) 0.995
+    in pan2 z (varSaw AR 0.02 t 0.5) (1 / n)
+
+main :: IO ()
+main = audition (out 0 (mixFill 8 (grid 8)))
diff --git a/Sound/SC3/Graph/F0_pkt_28.hs b/Sound/SC3/Graph/F0_pkt_28.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_pkt_28.hs
@@ -0,0 +1,25 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/490 (f0)
+module Sound.SC3.Graph.F0_pkt_28 where
+
+import Sound.SC3 {- hsc3 -}
+
+rnd :: UGen -> UGen -> UGen
+rnd n i =
+    let a = lfSaw AR ((i + 1) * 5) 0 * 0.5 * pi
+        b = sinOsc AR ((i + 1) * 0.001) 0 * 0.5
+        c = max (lfSaw AR (0.2 + b) (i / n) * 0.4) 0
+        d = sinOsc AR 0.03 (i + 1) * 0.5 + 1
+        e = sinOsc AR (200 + i) 0 * d
+        f = sinOsc AR 0.04 (i + 2) * 0.5 + 1
+        g = sinOsc AR (400 + i) 0 * f
+        h = sinOsc AR 0.05 (i + 3) * 0.5 + 1
+        j = sinOsc AR (800 + i) 0 * h
+        k = linExp i 0 (n - 1) 70 1500
+        z = sinOsc AR k a * c * e * g * j
+        l = linLin i 0 (n - 1) (-0.925) 0.925
+    in pan2 z l (1 / n)
+
+main :: IO ()
+main =
+    let y = limiter (leakDC (mixFill 28 (rnd 28)) 0.995) 1 1e-2
+    in audition (out 0 (gVerb y 3 5 0.2 0.8 20 0.1 0.7 0.5 300))
diff --git a/Sound/SC3/Graph/F0_red_frik_m.hs b/Sound/SC3/Graph/F0_red_frik_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_red_frik_m.hs
@@ -0,0 +1,25 @@
+-- red_frik (f0)
+module Sound.SC3.Graph.F0_red_frik_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+red :: UId m => UGen -> UGen -> m UGen
+red tr n = do
+  r1 <- tRand 0.3 3 tr
+  r2 <- tRand 0.3 5 tr
+  r3 <- tRand 0 0.5 tr
+  r4 <- tRand 0.49 0.56 tr
+  r5 <- tRand 0.3 0.6 tr
+  r6 <- tRand 0.3 0.5 tr
+  let o1 = fSinOsc KR r2 0 * r3 + r4
+      o2 = fSinOsc KR o1 r5 * r6
+  return (rhpf n r1 o2)
+
+red_frik :: UId m => m UGen
+red_frik = do
+  n <- clone 2 (brownNoise AR)
+  let tr = impulse KR 0.1 0
+  red tr n
+
+main :: IO ()
+main = audition . out 0 =<< red_frik
diff --git a/Sound/SC3/Graph/F0_sinusdeklinationen.hs b/Sound/SC3/Graph/F0_sinusdeklinationen.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_sinusdeklinationen.hs
@@ -0,0 +1,47 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/488 (f0)
+module Sound.SC3.Graph.F0_sinusdeklinationen where
+
+import Data.List.Split {- split -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+sinuscell :: UGen
+sinuscell =
+    let ctl = control KR
+        b = ctl "out" 0
+        p = ctl "pan" 0
+        a = ctl "amp" 0.5
+        fre = ctl "fre" 400
+        atk = ctl "atk" 1
+        sus = ctl "sus" 0.2
+        rel = ctl "rel" 1
+        e_d = envLinen atk sus rel a
+        e = envGen KR 1 0.1 0 1 RemoveSynth e_d
+        s = sinOsc AR fre 0
+    in out b (pan2 s p e)
+
+pattern :: Enum e => (Field,[e]) -> P_Bind
+pattern (c,z) =
+    case z of
+      [z0,z1,z2,z3] ->
+          let a = pwhite z0 0 1 inf
+              s = 0.2
+              r = pwhite z1 0 1 inf
+              i = psynth (synthdef "sinuscell" sinuscell)
+          in [(K_instr,i)
+             ,(K_dur,a+s+r)
+             ,(K_amp,pwhite z3 0 1 inf)
+             ,(K_param "fre",pwhite z2 0 1100 inf)
+             ,(K_param "atk",a)
+             ,(K_param "sus",s)
+             ,(K_param "rel",r)
+             ,(K_param "pan",prepeat c)]
+      _ -> undefined
+
+cells :: Fractional n => [n]
+cells = [-1,-0.6,-0.5,0,0.2,0.5,0.4,1]
+
+main :: IO ()
+main =
+    let c = zip cells (chunksOf 4 ['α'..])
+    in audition (ppar (map (pbind . pattern) c))
diff --git a/Sound/SC3/Graph/JJ_bohlen_pierce_140.hs b/Sound/SC3/Graph/JJ_bohlen_pierce_140.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JJ_bohlen_pierce_140.hs
@@ -0,0 +1,20 @@
+-- http://sccode.org/1-W (jj)
+module Sound.SC3.Graph.JJ_bohlen_pierce_140 where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+bp140u :: UGen
+bp140u =
+    let f z n = n * (3 ** (rand z 0 17 / 13))
+        e = envGen AR 1 0.3 0 1 RemoveSynth (envPerc 0.01 1)
+        o = pmOsc AR (f 'α' (mce2 438 442)) (f 'β' 880) (f 'γ' e) 0
+    in o * e
+
+bp140 :: Synthdef
+bp140 = synthdef "bp140" (out 0 bp140u)
+
+main :: IO ()
+main = do
+  let p = pbind [(K_instr,psynth bp140),(K_dur,prand 'δ' [1/6,1/3] inf)]
+  audition p
diff --git a/Sound/SC3/Graph/JL_bitwise.hs b/Sound/SC3/Graph/JL_bitwise.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JL_bitwise.hs
@@ -0,0 +1,20 @@
+-- a0f253ff89f6b244ea29a1e431dd9e5df5571a8b (jl)
+module Sound.SC3.Graph.JL_bitwise where
+
+import Data.Bits
+import Sound.SC3 {- hsc3 -}
+
+(.%.) :: UGen -> UGen -> UGen
+(.%.) = modE
+
+bitwise_operators :: UGen
+bitwise_operators =
+    let t = pulseCount (impulse AR 8e3 0) 0
+        s = ((((t * 15) .&. (t .>>. 5)) .|.
+              ((t *  5) .&. (t .>>. (mce2 3 4))) .|.
+              ((t *  2) .&. (t .>>. 9)) .|.
+              ((t *  8) .&. (t .>>. 11))) - 3) .%. 256
+    in tanh (hpf (((s / 127) - 1) * 3) 20)
+
+main :: IO ()
+main = audition (out 0 bitwise_operators)
diff --git a/Sound/SC3/Graph/JL_dark_sea_horns.hs b/Sound/SC3/Graph/JL_dark_sea_horns.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JL_dark_sea_horns.hs
@@ -0,0 +1,18 @@
+-- http://sccode.org/1-j#c51 (jl)
+module Sound.SC3.Graph.JL_dark_sea_horns where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+
+dark_sea_horns :: UGen
+dark_sea_horns =
+    let n = lfNoise1
+        x = localIn 2 AR
+        a = tanh (sinOsc AR 65 (x * n 'α' AR 0.1 * 3) * n 'β' AR 3 * 6)
+        f i = allpassN i 0.3 (randN 2 'γ' 0.1 0.3) 5
+        o = tanh (useq 'δ' 9 f a)
+    in mrg2 o (localOut o)
+
+main :: IO ()
+main = audition (out 0 dark_sea_horns)
diff --git a/Sound/SC3/Graph/JL_dark_sea_horns_hp.hs b/Sound/SC3/Graph/JL_dark_sea_horns_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JL_dark_sea_horns_hp.hs
@@ -0,0 +1,18 @@
+-- http://sccode.org/1-j#c51 (jl)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JL_dark_sea_horns_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.UGen.External.RDU.Monad {- sc3-rdu -}
+
+dark_sea_horns :: UId m => m UGen
+dark_sea_horns = do
+  let n = lfNoise1
+  let x = localIn 2 AR
+  let a = tanh (sinOsc AR 65 (x * #(n AR 0.1) * 3) * #(n AR 3) * 6)
+  let f i = do return (allpassN i 0.3 #(randN 2 0.1 0.3) 5)
+  let o = tanh #(chainM 9 f a)
+  return (mrg2 o (localOut o))
+
+main :: IO ()
+main = audition . out 0 =<< dark_sea_horns
diff --git a/Sound/SC3/Graph/JL_jl_1_Z.hs b/Sound/SC3/Graph/JL_jl_1_Z.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JL_jl_1_Z.hs
@@ -0,0 +1,17 @@
+-- http://sccode.org/1-Z (jl)
+module Sound.SC3.Graph.JL_jl_1_Z where
+
+import Sound.SC3 {- hsc3 -}
+
+jl_z_1 :: UGen
+jl_z_1 =
+    let a = lag (impulse KR 8 0) 0.1
+        b = crackle AR (lag (abs (lfSaw KR 3 0)) 0.1 * 1.8)
+        c = a * b
+        d = lag (impulse KR 2 0 + impulse KR 4 0.5) 0.1
+        e = blip AR 4.9 7 * 0.4
+        f = d * e
+    in tanh (c + gVerb f 1 1 0.5 0.5 15 1 0.7 0.5 300 * 5) * 2
+
+main :: IO ()
+main = audition (out 0 jl_z_1)
diff --git a/Sound/SC3/Graph/JL_pwm_crossfade.hs b/Sound/SC3/Graph/JL_pwm_crossfade.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JL_pwm_crossfade.hs
@@ -0,0 +1,18 @@
+-- http://sccode.org/1-L (jl)
+module Sound.SC3.Graph.JL_pwm_crossfade where
+
+import Sound.SC3.ID {- hsc3 -}
+
+urangeM :: UGen -> UGen -> UGen
+urangeM u = let [u0,u1] = mceChannels u in urange u0 u1
+
+pwm_crossfade :: UGen
+pwm_crossfade =
+    let n = mce [400,500,450,376,600]
+        d = 1/20
+        f = demand (impulse KR d (mce2 0 0.5)) 0 (dseq 'α' dinf n)
+        f_ = urangeM f (lfPulse KR 8 0 (range 0 1 (lfTri KR d 1)))
+    in lpf (saw AR (max 376 f_ * mce2 1 0.99) * 0.5) 8000
+
+main :: IO ()
+main = audition (out 0 pwm_crossfade)
diff --git a/Sound/SC3/Graph/JL_rain_thunder.hs b/Sound/SC3/Graph/JL_rain_thunder.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JL_rain_thunder.hs
@@ -0,0 +1,20 @@
+-- http://sccode.org/1-e (jl)
+module Sound.SC3.Graph.JL_rain_thunder where
+
+import Sound.SC3.ID {- hsc3 -}
+
+rain_thunder :: UGen
+rain_thunder =
+    let n0 = pinkNoise 'α' AR * (0.08 + lfNoise1 'β' KR 0.3 * 0.02)
+        d0 = lpf (dust2 'γ' AR (range 40 50 (lfNoise1 'δ' KR 0.2))) 7000
+        e0 = line KR 0 1 10 DoNothing
+        p0 = tanh (3 * gVerb (hpf (n0+d0) 400) 250 100 0.25 0.5 15 0.3 0.7 0.5 300 * e0)
+        lfNoise1C e r f = clip (lfNoise1 e r f) 0 1
+        n1 = pinkNoise 'ε' AR * ((lfNoise1C 'ζ' KR 3 * lfNoise1C 'η' KR 2) ** 1.8)
+        f1 = linExp (lfNoise1 'θ' KR 1) (-1) 1 100 2500
+        e1 = line KR 0 0.7 30 DoNothing
+        p1 = gVerb (tanh (lpf (10 * hpf n1 20) f1)) 270 30 0.7 0.5 15 0.5 0.7 0.5 300 * e1
+    in limiter (p0 + p1) 1 0.01
+
+main :: IO ()
+main = audition (out 0 rain_thunder)
diff --git a/Sound/SC3/Graph/JMCC_aleatoric_quartet_m.hs b/Sound/SC3/Graph/JMCC_aleatoric_quartet_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_aleatoric_quartet_m.hs
@@ -0,0 +1,32 @@
+-- aleatoric quartet (jmcc)
+module Sound.SC3.Graph.JMCC_aleatoric_quartet_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+aleatoric_quartet :: UId m => m UGen
+aleatoric_quartet = do
+  let base_mn = control KR "note" 66
+      amp = control KR "ampl" 0.07
+      density = mouseX KR 0.01 1 Linear 0.1
+      dmul = recip density * 0.5 * amp
+      dadd = amp - dmul
+      rapf i = do r <- clone 2 (rand 0 0.05)
+                  return (allpassN i 0.05 r 1)
+      mk_f = do i0 <- iRand 0 2
+                let r0 = select i0 (mce [1, 0.5, 0.25])
+                r1 <- rand (-30) 30
+                n0 <- lfNoise0 KR r0
+                let m = n0 * 7 + base_mn + r1
+                    m' = lag (roundTo m 1) 0.2
+                return (midiCPS m')
+      mk_s = do f <- fmap recip mk_f
+                r <- rand (-1) 1
+                x <- do n0 <- pinkNoise AR
+                        n1 <- lfNoise1 KR 8
+                        return (n0 * max 0 (n1 * dmul + dadd))
+                return (pan2 (combL x 0.02 f 3) r 1)
+  g <- chainM 5 rapf =<< fmap sum (sequence (replicate 4 mk_s))
+  return (leakDC g 0.995)
+
+main :: IO ()
+main = audition . out 0 =<< aleatoric_quartet
diff --git a/Sound/SC3/Graph/JMCC_alien_froggies.hs b/Sound/SC3/Graph/JMCC_alien_froggies.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_alien_froggies.hs
@@ -0,0 +1,14 @@
+-- alien froggies (jmcc)
+module Sound.SC3.Graph.JMCC_alien_froggies where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+alien_froggies :: UGen -> (UGen,UGen)
+alien_froggies r =
+    let r' = fold (r * exp (linRand 'α' (-0.2) 0.2 0)) 1 30
+        o = formant AR r' (expRand 'β' 200 3000) (rand 'γ' 0 9 * r' + r')
+    in (o * 0.05,r')
+
+main :: IO ()
+main = overlapTextureS (0.25,0.5,5,maxBound) alien_froggies 11
diff --git a/Sound/SC3/Graph/JMCC_alien_meadow.hs b/Sound/SC3/Graph/JMCC_alien_meadow.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_alien_meadow.hs
@@ -0,0 +1,17 @@
+-- alien meadow (jmcc)
+module Sound.SC3.Graph.JMCC_alien_meadow where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+alien_meadow :: UGen
+alien_meadow =
+    let a = rand 'α' 0 20
+        b = rand 'α' 0 5000
+        c = rand 'α' 0 20
+        p = rand 'α' (-1) 1
+        f = sinOsc AR a 0 * b * 0.1 + b
+    in pan2 (sinOsc AR f 0) p (sinOsc AR c 0 * 0.05 + 0.05)
+
+main :: IO ()
+main = overlapTextureU (2,6,6,maxBound) alien_meadow
diff --git a/Sound/SC3/Graph/JMCC_analog_bubbles.hs b/Sound/SC3/Graph/JMCC_analog_bubbles.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_analog_bubbles.hs
@@ -0,0 +1,14 @@
+-- analog bubbles (jmcc)
+module Sound.SC3.Graph.JMCC_analog_bubbles where
+
+import Sound.SC3 {- hsc3 -}
+
+analog_bubbles :: UGen
+analog_bubbles =
+  let o = lfSaw KR (mce2 8 7.23) 0 * 3 + 80
+      f = lfSaw KR 0.4 0 * 24 + o
+      s = sinOsc AR (midiCPS f) 0 * 0.04
+  in combN s 0.2 0.2 4
+
+main :: IO ()
+main = audition (out 0 analog_bubbles)
diff --git a/Sound/SC3/Graph/JMCC_babbling_brook_m.hs b/Sound/SC3/Graph/JMCC_babbling_brook_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_babbling_brook_m.hs
@@ -0,0 +1,19 @@
+-- babbling brook (jmcc)
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
+module Sound.SC3.Graph.JMCC_babbling_brook_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+babbling_brook :: UId m => m UGen
+babbling_brook = do
+  let b f m a g = do n1 <- brownNoise AR
+                     n2 <- brownNoise AR
+                     let n3 = lpf n2 f * m + a
+                         n4 = onePole n1 0.99
+                     return (rhpf n4 n3 0.03 * g)
+  x <- clone 2 (b 14 400 500 0.006)
+  y <- clone 2 (b 20 800 1000 0.010)
+  return (x + y)
+
+main :: IO ()
+main = audition . out 0 =<< babbling_brook
diff --git a/Sound/SC3/Graph/JMCC_birds_hp.hs b/Sound/SC3/Graph/JMCC_birds_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_birds_hp.hs
@@ -0,0 +1,23 @@
+-- birds (jmcc)
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_birds_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+node :: UId m => m UGen
+node = do
+  let f = lag (lfSaw AR (7 + #(rand (-1.5) 1.5)) #(rand 0 1) * #(rand 11 15)) 0.1 + #(rand 94 102)
+  let a = lfPulse KR (1 / #(rand 12 15.6)) #(rand 0 1) 0.16 * 0.05
+  let b = sinOsc AR (midiCPS f) #(rand 0 1) * a
+  return (rotate2 b (silent 1) #(rand (-1) 1))
+
+birds :: UId m => m UGen
+birds = do
+  d <- return . sum =<< sequence (replicate 6 node)
+  let apf i = do return (allpassL i 0.07 #(rand 0 0.06) #(rand 0.7 2.0))
+  w <- chainM 12 apf d
+  return (d * 0.7 + w * 0.3)
+
+main :: IO ()
+main = audition . out 0 =<< birds
diff --git a/Sound/SC3/Graph/JMCC_birds_m.hs b/Sound/SC3/Graph/JMCC_birds_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_birds_m.hs
@@ -0,0 +1,29 @@
+-- birds (jmcc)
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
+module Sound.SC3.Graph.JMCC_birds_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+birds :: UId m => m UGen
+birds = do
+  let node = do r1 <- rand 94.0 102.0
+                r2 <- rand (-1.5) 1.5
+                r3 <- rand 0.0 1.0
+                r4 <- rand 11.0 15.0
+                r5 <- rand 0.0 1.0
+                r6 <- rand 12.0 15.6
+                r7 <- rand 0.0 1.0
+                r8 <- rand (-1.0) 1.0
+                let f = r1 + lag (lfSaw AR (7 + r2) r3 * r4) 0.1
+                    a = lfPulse KR (1.0 / r6) r7 0.16 * 0.05
+                    b = sinOsc AR (midiCPS f) r5 * a
+                return (rotate2 b (silent 1) r8)
+      apf i = do r1 <- rand 0.0 0.06
+                 r2 <- rand 0.7 2.0
+                 return (allpassL i 0.07 r1 r2)
+  d <- return . sum =<< sequence (replicate 6 node)
+  w <- chainM 12 apf d
+  return (d * 0.7 + w * 0.3)
+
+main :: IO ()
+main = audition . out 0 =<< birds
diff --git a/Sound/SC3/Graph/JMCC_bowed_string_m.hs b/Sound/SC3/Graph/JMCC_bowed_string_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_bowed_string_m.hs
@@ -0,0 +1,26 @@
+-- bowed string (jmcc)
+module Sound.SC3.Graph.JMCC_bowed_string_m where
+
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+bowed_string :: UId m => m UGen
+bowed_string = do
+  let root = 5
+      scale = map (+ root) [0,2,4,5,7,9,11]
+      oct = [24,36,48,60,72,84]
+  n0 <- clone 2 (brownNoise AR)
+  r0 <- expRand 0.125 0.5
+  r1 <- rand 0.7 0.9
+  r2 <- sequence (replicate 12 (rand 1.0 3.0))
+  f <- midiCPS `fmap` (lchoose scale .+. lchoose oct)
+  n1 <- lfNoise1 KR r0
+  let x = n0 * 0.007 * max 0 (n1 * 0.6 + 0.4)
+      geom n i z = take n (iterate (* z) i)
+      iota n i z = take n (iterate (+ z) i)
+      d = klankSpec (iota 12 f f) (geom 12 1 r1) r2
+      k = klank x 1 0 1 d
+  return (softClip (k * 0.1))
+
+main :: IO ()
+main = overlapTextureU (5,2,12,maxBound) =<< bowed_string
diff --git a/Sound/SC3/Graph/JMCC_choip.hs b/Sound/SC3/Graph/JMCC_choip.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_choip.hs
@@ -0,0 +1,30 @@
+-- choip (jmcc)
+module Sound.SC3.Graph.JMCC_choip where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+xl :: ID a => a -> a -> UGen -> UGen -> UGen -> UGen
+xl e0 e1 l r t = xLine KR (expRand e0 l r) (expRand e1 l r) t DoNothing
+
+r2 :: ID a => a -> UGen -> UGen
+r2 e n = rand e (-n) n
+
+choip :: UGen
+choip =
+    let t = 12
+        i = impulse AR (xl 'α' 'β' 1 30 t) 0
+        f = xl 'γ' 'δ' 600 8000 t
+        a = sinOsc AR (decay2 i 0.05 0.5 * (-0.9 * f) + f) 0
+        l = line KR (r2 'ε' 1) (r2 'ζ' 1) t DoNothing
+    in pan2 (decay2 (i * xl 'η' 'θ' 0.01 0.5 t) 0.01 0.2 * a) l 1
+
+choip_pp :: UGen -> UGen
+choip_pp =
+    let f x = allpassN x 0.1 (randN 2 'ι' 0 0.05) 4
+    in useq 'κ' 4 f
+
+main :: IO ()
+main = overlapTextureU_pp (1,10,8,maxBound) choip 2 choip_pp
diff --git a/Sound/SC3/Graph/JMCC_clustered_sines.hs b/Sound/SC3/Graph/JMCC_clustered_sines.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_clustered_sines.hs
@@ -0,0 +1,19 @@
+-- clustered sines (jmcc)
+module Sound.SC3.Graph.JMCC_clustered_sines where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+-- > synthstat cs
+cs :: UGen
+cs =
+    let n = 80
+        f1 = rand 'α' 100 1100
+        f2 = 4 * f1
+        sp = let y = uclone' 'α' n (f1 + rand 'α' 0 f2)
+             in klangSpec y (map (f1 /) y) (replicate n 0)
+    in uclone 'α' 2 (klang AR 1 0 sp * (0.3 / fromIntegral n))
+
+main :: IO ()
+main = xfadeTextureU (4,4,maxBound) cs
diff --git a/Sound/SC3/Graph/JMCC_clustered_sines_m.hs b/Sound/SC3/Graph/JMCC_clustered_sines_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_clustered_sines_m.hs
@@ -0,0 +1,19 @@
+-- clustered sines (jmcc)
+module Sound.SC3.Graph.JMCC_clustered_sines_m where
+
+import Control.Monad {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+-- > fmap synthstat (clone 2 cs)
+cs :: UId m => m UGen
+cs = do
+  let n = 80
+  f1 <- rand 100 1100
+  let f2 = 4 * f1
+  y <- replicateM n (f1 +. rand 0 f2)
+  let sp = klangSpec y (map (f1 /) y) (replicate n 0)
+  return (klang AR 1 0 sp * (0.3 / fromIntegral n))
+
+main :: IO ()
+main = xfadeTextureU (4,4,maxBound) =<< clone 2 cs
diff --git a/Sound/SC3/Graph/JMCC_comb_delay_sweeps.hs b/Sound/SC3/Graph/JMCC_comb_delay_sweeps.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_comb_delay_sweeps.hs
@@ -0,0 +1,30 @@
+-- comb delay sweeps (jmcc)
+module Sound.SC3.Graph.JMCC_comb_delay_sweeps where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import System.Random {- random -}
+
+type ST = (Double,Double,StdGen)
+
+wander :: ST -> ST
+wander (s,e,g) =
+    let (s',g') = randomR (-7,8) g
+        (e',g'') = randomR (-7,8) g'
+    in (foldToRange 50 120 (s + s')
+       ,foldToRange 50 120 (e + e')
+       ,g'')
+
+-- > Sound.SC3.UGen.Dot.draw (fst (cds (60,61,mkStdGen 3567824)))
+cds :: ST -> (UGen,ST)
+cds st =
+    let (s,e,g) = wander st
+        l = line KR (constant s) (constant e) 4 DoNothing
+        w = whiteNoise 'α' AR * 0.005
+        d = 1 / midiCPS l
+        c = 1 / midiCPS (constant s)
+        o = combC w 0.01 d (c * 1000)
+    in (pan2 o (rand 'α' (-1) 1) 1,(s,e,g))
+
+main :: IO ()
+main = overlapTextureS (4/3,4/3,9,maxBound) cds (60,61,mkStdGen 3567824)
diff --git a/Sound/SC3/Graph/JMCC_contamination_zone.hs b/Sound/SC3/Graph/JMCC_contamination_zone.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_contamination_zone.hs
@@ -0,0 +1,34 @@
+-- contamination zone (jmcc)
+module Sound.SC3.Graph.JMCC_contamination_zone where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+cz :: UGen
+cz =
+    let f = expRand 'α' 800 8000
+        p = let e = lfNoise1 'β' KR (rand 'γ' 0 3) * 0.0008 + 0.0022
+            in pinkNoise 'δ' AR * e
+        s = sinOsc KR (linRand 'ε' 0 1 0) 0 * (0.7 * f) + f
+        k = let sp = klankSpec_mce (randN 4 'ζ' 50 2000)
+                                   (mce [1,1,1,1])
+                                   (randN 4 'η' 0.2 4)
+            in abs (klank p 1 0 1 sp) * choose 'θ' (mce2 (-1) 1)
+        r = rlpf k s 0.1
+        a = lfPulse KR (linRand 'ι' 0 150 0) 0 (rand 'κ' 0.2 0.4)
+    in pan2 r (lfNoise1 'λ' KR (rand 'μ' 0 1)) a
+
+cz_pp :: UGen -> UGen
+cz_pp =
+    let f x = allpassN x 0.04 (randN 2 'ν' 0 0.04) 16
+    in useq 'ξ' 6 f
+
+main :: IO ()
+main = overlapTextureU_pp (3,8,4,maxBound) cz 2 cz_pp
+
+{-
+audition (out 0 cz)
+audition (out 0 (cz_pp cz))
+-}
diff --git a/Sound/SC3/Graph/JMCC_coolant.hs b/Sound/SC3/Graph/JMCC_coolant.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_coolant.hs
@@ -0,0 +1,18 @@
+-- coolant (jmcc)
+module Sound.SC3.Graph.JMCC_coolant where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+coolant :: UGen
+coolant =
+    let p = 20
+        s = onePole (uclone 'α' p (brownNoise 'β' AR) * 0.0015) 0.95
+        n = replicate p 1
+        sp = mce [klankSpec (uclone' 'γ' p (rand 'δ' 40 2400)) n n
+                 ,klankSpec (uclone' 'ε' p (rand 'ζ' 40 2400)) n n]
+    in klank s 1 0 1 (mceTranspose sp)
+
+main :: IO ()
+main = xfadeTextureU (4,4,maxBound) coolant
diff --git a/Sound/SC3/Graph/JMCC_cymbalism_accelerando.hs b/Sound/SC3/Graph/JMCC_cymbalism_accelerando.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_cymbalism_accelerando.hs
@@ -0,0 +1,25 @@
+-- cymbalism accellerando (jmcc)
+module Sound.SC3.Graph.JMCC_cymbalism_accelerando where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+enumFromN :: Enum a => a -> Int -> [Int]
+enumFromN e i = let j = fromEnum e in [j .. j + i]
+
+cymbalism_accellerando :: UGen
+cymbalism_accellerando =
+  let y n = let f1 = rand n 500 2500
+                f2 = rand n 0 8000
+                f = map (\e -> rand e f1 (f1 + f2)) (enumFromN n 15)
+                rt = map (\e -> rand e 1 5) (enumFromN n 15)
+          in klankSpec f (replicate 15 1) rt
+      z = mce2 (y 'α') (y 'β')
+      w = whiteNoise 'γ' AR * 0.02
+      tf = xLine KR (linRand 'δ' 0.5 4.5 0) (rand 'ε' 0.5 35.5) 12 DoNothing
+      t = impulse AR tf 0
+      s = decay t 0.004 * w
+  in klank s 1 0 1 (mceTranspose z)
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) cymbalism_accellerando
diff --git a/Sound/SC3/Graph/JMCC_cymbalism_m.hs b/Sound/SC3/Graph/JMCC_cymbalism_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_cymbalism_m.hs
@@ -0,0 +1,27 @@
+-- cymbalism (jmcc)
+module Sound.SC3.Graph.JMCC_cymbalism_m where
+
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+cymbalism :: (Functor m,UId m) => m UGen
+cymbalism = do
+  let p = replicate 15
+  f1 <- rand 500 2500
+  f2 <- rand 0 8000
+  let y = do f <- sequence (p (rand f1 (f1 + f2)))
+             rt <- sequence (p (rand 1 5))
+             return (klankSpec f (p 1) rt)
+  z <- clone 2 y
+  n <- fmap (* 0.03) (whiteNoise AR)
+  tf <- rand 0.5 3.5
+  let t = impulse AR tf 0
+      s = decay t 0.004 * n
+  return (klank s 1 0 1 (mceTranspose z))
+
+main :: IO ()
+main = overlapTextureU (3,6,6,maxBound) =<< cymbalism
+
+{-
+main = audition . out 0 =<< cymbalism
+-}
diff --git a/Sound/SC3/Graph/JMCC_data_space.hs b/Sound/SC3/Graph/JMCC_data_space.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_data_space.hs
@@ -0,0 +1,23 @@
+-- data space (jmcc)
+module Sound.SC3.Graph.JMCC_data_space where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+data_space :: UGen
+data_space =
+    let r e = rand e 0
+        p0 = lfPulse KR (r 'α' 200) 0 (r 'β' 1)
+        p1 = lfPulse KR (r 'γ' 40) 0 (r 'δ' 1) * r 'ε' 8000 + r 'ζ' 2000
+        p2 = lfPulse KR (r 'η' 20) 0 (r 'θ' 1)
+        p3 = lfPulse KR (r 'ι' 4) 0 (r 'κ' 1) * r 'λ' 8000 + r 'μ'  2000
+        p4 = lfPulse KR (r 'ν' 20) 0 (r 'ξ' 1)
+        p5 = lfPulse KR (r 'ο' 4) 0 (r 'π' 1) * r 'ρ' 8000 + r 'σ'  2000
+        f = p0 * p1 + p2 * p3 + p4 * p5
+        dt = rand 'τ' 0.15 0.35
+        o = lfPulse AR f 0 0.5 * 0.04
+        l = lfNoise0 'υ' KR (r 'φ' 3) * 0.8
+    in combL (pan2 o l 1) dt dt 3
+
+main :: IO ()
+main = overlapTextureU (1,6,4,maxBound) data_space
diff --git a/Sound/SC3/Graph/JMCC_data_space_hp.hs b/Sound/SC3/Graph/JMCC_data_space_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_data_space_hp.hs
@@ -0,0 +1,24 @@
+-- data space (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_data_space_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+data_space :: UId m => m UGen
+data_space = do
+    let r = rand 0
+    let p0 = lfPulse KR #(r 200) 0 #(r 1)
+    p1 <- lfPulse KR #(r 40) 0 #(r 1) *. r 8000 .+. r 2000
+    let p2 = lfPulse KR #(r 20) 0 #(r 1)
+    p3 <- lfPulse KR #(r 4) 0 #(r 1) *. r 8000 .+. r 2000
+    let p4 = lfPulse KR #(r 20) 0 #(r 1)
+    p5 <- lfPulse KR #(r 4) 0 #(r 1) *. r 8000 .+. r 2000
+    let f = p0 * p1 + p2 * p3 + p4 * p5
+    dt <- rand 0.15 0.35
+    let o = lfPulse AR f 0 0.5 * 0.04
+    l <- lfNoise0 KR #(r 3) .* 0.8
+    return (combL (pan2 o l 1) dt dt 3)
+
+main :: IO ()
+main = overlapTextureU (1,6,4,maxBound) =<< data_space
diff --git a/Sound/SC3/Graph/JMCC_deep_trip.hs b/Sound/SC3/Graph/JMCC_deep_trip.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_deep_trip.hs
@@ -0,0 +1,21 @@
+-- deep trip (jmcc)
+module Sound.SC3.Graph.JMCC_deep_trip where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.External.RDU.ID  {- sc3-rdu -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+deep_trip :: UGen
+deep_trip =
+    let f = midiCPS (lfNoise1 'α' KR (rand 'β' 0 0.3) * 60 + 70)
+        a'' = sinOsc KR (rand 'γ' 0 40) 0 * 0.1
+        a' = max 0 (lfNoise1 'δ' KR (rand 'ε' 0 8) * a'')
+        a = lfNoise2 'ζ' AR (f * rand 'η' 0 0.5) * a'
+        z = sinOsc AR f 0 * a
+        s = pan2 z (lfNoise1 'θ' KR (rand 'ι' 0 5)) 1
+        c0 = combN s 0.5 (randN 2 'κ' 0.3 0.5) 20
+        c1 = combN s 0.5 (randN 2 'λ' 0.3 0.5) 20
+        in s + c0 + c1
+
+main :: IO ()
+main = overlapTextureU (4,12,4,maxBound) deep_trip
diff --git a/Sound/SC3/Graph/JMCC_default.hs b/Sound/SC3/Graph/JMCC_default.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_default.hs
@@ -0,0 +1,18 @@
+-- default (jmcc)
+module Sound.SC3.Graph.JMCC_default where
+
+import Data.Default {- data-default -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+pattern :: P_Bind
+pattern =
+    [(K_instr,psynth def)
+    ,(K_note,pxrand 'α' [0,1,5,7,9] inf)
+    ,(K_octave,prand 'β' [3,4,5,6] inf)
+    ,(K_dur,pwrand 'γ' [0.1,0.2,0.4] [0.5,0.4,0.1] inf)
+    ,(K_amp,pbrown 'δ' 0.01 0.2 0.01 inf)
+    ,(K_param "pan",pbrown 'ε' (-1) 1 0.25 inf)]
+
+main :: IO ()
+main = audition (pbind pattern)
diff --git a/Sound/SC3/Graph/JMCC_demanding_studies.hs b/Sound/SC3/Graph/JMCC_demanding_studies.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_demanding_studies.hs
@@ -0,0 +1,20 @@
+-- demanding studies (jmcc)
+module Sound.SC3.Graph.JMCC_demanding_studies where
+
+import Sound.SC3.ID {- hsc3 -}
+
+demanding_studies :: UGen
+demanding_studies =
+  let s1 = drand 'α' dinf (mce [72, 75, 79, 82])
+      s2 = drand 'β' 1 (mce [82, 84, 86])
+      s3 = dseq 'γ' dinf (mce [72, 75, 79, s2])
+      x = mouseX KR 5 13 Linear 0.2
+      tr = impulse KR x 0
+      f = demand tr 0 (mce [midiCPS (s1 - 12), midiCPS s3])
+      o1 = sinOsc AR (f + mce2 0 0.7) 0
+      o2 = saw AR (f + mce2 0 0.7) * 0.3
+      o3 = cubed (distort (log (distort (o1 + o2))))
+  in o3 * 0.1
+
+main :: IO ()
+main = audition (out 0 demanding_studies)
diff --git a/Sound/SC3/Graph/JMCC_doppler.hs b/Sound/SC3/Graph/JMCC_doppler.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_doppler.hs
@@ -0,0 +1,31 @@
+-- doppler (jmcc)/(rd)
+module Sound.SC3.Graph.JMCC_doppler where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+
+-- observer at origin, signal 's' at coordinates ('x','y')
+doppler :: (UGen,UGen) -> UGen -> UGen
+doppler (x,y) s =
+    let d = hypot x y
+        a = 40 / squared d
+        maxd = 110
+    in delayL s (maxd / 344) (d / 344) * a
+
+-- straight line at x axis from (-y,y) over dt seconds
+line_x :: UGen -> UGen -> UGen -> (UGen,UGen)
+line_x x y dt = (x,line KR (-y) y dt RemoveSynth)
+
+-- ellipse centered at origin and interecting x at +-a and y at +-b.
+-- traversal is over dt seconds
+ellipse :: UGen -> UGen -> UGen -> (UGen,UGen)
+ellipse a b dt =
+    let t = line KR (-pi/2) (pi * 3/2) dt RemoveSynth
+    in (a * cos t,b * sin t)
+
+main :: IO ()
+main = do
+  let s = rlpf (fSinOsc AR 200 0 * lfPulse AR 31.3 0 0.4) 400 0.3
+  withSC3 (do play (out 0 (doppler (line_x 10 100 6) s))
+              wait 8
+              play (out 0 (doppler (ellipse 10 75 12) s)))
diff --git a/Sound/SC3/Graph/JMCC_early_space_music_lp_side_two.hs b/Sound/SC3/Graph/JMCC_early_space_music_lp_side_two.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_early_space_music_lp_side_two.hs
@@ -0,0 +1,80 @@
+-- early space music LP, side 2 (jmcc)
+module Sound.SC3.Graph.JMCC_early_space_music_lp_side_two where
+
+import Sound.SC3.ID {- hsc3 -}
+import qualified Sound.SC3.Lang.Random.Gen as R {- hsc3-lang -}
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import qualified System.Random as R {- random -}
+
+m1 :: UGen
+m1 =
+    let a = rand 'α' 0 20
+        b = rand 'β' 0 5000
+        c = rand 'γ' 0 20
+        p = rand 'δ' (-1) 1
+    in pan2 (sinOsc AR (sinOsc AR a 0 * 0.1 * b + b) 0 * sinOsc KR c 0 * 0.08 + 0.08) p 1
+
+m2 :: UGen
+m2 =
+    let a0 = rand 'ε' 40 240
+        a1 = a0 + rand 'ζ' (-1) 1
+        a = mce2 a0 a1
+        b = expRand 'η' 50 2400
+        c = mce2 (a0 + rand 'θ' (-1) 1) (a1 + rand 'ι' (-1) 1)
+    in sinOsc AR (sinOsc AR a 0 * rand 'κ' 0 1 * b + b) 0 * sinOsc KR c 0 * 0.025 + 0.025
+
+m3 :: UGen
+m3 =
+    let f = midiCPS (rand 'λ' 60 100)
+    in fSinOsc AR (mce2 f (f + 0.2)) 0 * lfNoise2 'μ' KR (f * mce2 0.15 0.16) * 0.1
+
+-- audition (out 0 m4)
+m4 :: UGen
+m4 =
+    let a = lfPulse KR (expRand 'ν' 0.2 1.2) 0 (rand 'ξ' 0.1 0.2)
+        o i = let r = let (p,q) = mce2c (expRandN 2 i 0.1 20)
+                      in xLine KR p q 25.6 DoNothing
+                  f = midiCPS (rand i 24 96)
+                  e = max 0 (sinOsc KR (r * rand i 0.9 1.1) (rand i 0 (2 * pi)) * 0.1 - 0.05)
+                  s = fSinOsc AR (f * i + f) 0 * e * (1 / (i + 1))
+              in pan2 s (rand i (-1) 1) 1
+    in sum (map o [0..11]) * a
+
+-- audition (out 0 (m6 * 0.5))
+m6 :: UGen
+m6 =
+    let f = midiCPS (lfNoise1 'ο' KR (rand 'π' 0 0.3) * 60 + 70)
+        a0 = lfNoise2 'ρ' AR (f * rand 'σ' 0 0.5)
+        a1 = max 0 (lfNoise1 'τ' KR (rand 'υ' 0 8) * sinOsc KR (rand 'φ' 0 40) 0 * 0.1)
+        z = sinOsc AR f 0 * a0 * a1
+    in pan2 z (lfNoise1 'χ' KR (rand 'ψ' 0 5)) 1
+
+enumFromN :: Enum a => a -> Int -> [Int]
+enumFromN e i = let j = fromEnum e in [j .. j + i]
+
+-- audition (out 0 m7)
+m7 :: UGen
+m7 =
+    let p = 15
+        k = let y z = let fr = mceChannels (expRandN p z 100 6000)
+                          rt = mceChannels (randN p z 2 6)
+                      in klankSpec fr (replicate p 1) rt
+            in mce2 (y 'ω') (y 'Α')
+        f = xLine KR (expRand 'Β' 40 300) (expRand 'Γ' 40 300) 12 DoNothing
+        t = lfPulse AR f 0 (rand 'Δ' 0.1 0.9) * 0.002 * max 0 (lfNoise2 'Ε' KR (rand 'Ζ' 0 8))
+    in distort (klank t 1 0 1 (mceTranspose k)) * 0.3
+
+esmlp2 :: R.RandomGen g => g -> (UGen, g)
+esmlp2 = R.choose (map (* 0.3) [m1,m2,m3,m4,m6,m7])
+
+-- Sound.SC3.UGen.Dot.draw (esmlp2_pp (sinOsc AR 440 0))
+esmlp2_pp :: UGen -> UGen
+esmlp2_pp i =
+    let c z = combN i 0.3 (mce2 (rand z 0.1 0.3) (rand z 0.12 0.32)) 8
+    in sum (map c ['Η'..'Θ']) * 0.3
+
+main :: IO ()
+main = do
+  let g = R.mkStdGen 0
+  overlapTextureS_pp (4,2,6,maxBound) esmlp2 g 2 esmlp2_pp
diff --git a/Sound/SC3/Graph/JMCC_harmonic_swimming.hs b/Sound/SC3/Graph/JMCC_harmonic_swimming.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_harmonic_swimming.hs
@@ -0,0 +1,20 @@
+-- harmonic swimming (jmcc)
+module Sound.SC3.Graph.JMCC_harmonic_swimming where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+
+harmonic_swimming :: UGen
+harmonic_swimming =
+  let a = 0.02
+      f = 50
+      p = 20::Int
+      l = line KR 0 (- a) 60 DoNothing
+      o h = let r = randN 2 h 2 8
+                n = lfNoise1 h KR r
+                e = max 0 (n * a + l)
+            in fSinOsc AR (f * (fromIntegral h + 1)) 0 * e
+  in sum (map o [0..p])
+
+main :: IO ()
+main = audition (out 0 harmonic_swimming)
diff --git a/Sound/SC3/Graph/JMCC_harmonic_swimming_m.hs b/Sound/SC3/Graph/JMCC_harmonic_swimming_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_harmonic_swimming_m.hs
@@ -0,0 +1,19 @@
+-- harmonic swimming (jmcc)
+module Sound.SC3.Graph.JMCC_harmonic_swimming_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+harmonic_swimming :: UId m => m UGen
+harmonic_swimming =
+    let a = 0.02
+        f = 50
+        p = 20
+        l = line KR 0 (- a) 60 DoNothing
+        o h = do r <- clone 2 (rand 2 8)
+                 n <- lfNoise1 KR r
+                 let e = max 0 (n * a + l)
+                 return (fSinOsc AR (f * (h + 1)) 0 * e)
+    in fmap sum (mapM o [0..p])
+
+main :: IO ()
+main = audition . out 0 =<< harmonic_swimming
diff --git a/Sound/SC3/Graph/JMCC_harmonic_tumbling_m.hs b/Sound/SC3/Graph/JMCC_harmonic_tumbling_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_harmonic_tumbling_m.hs
@@ -0,0 +1,18 @@
+-- harmonic tumbling (jmcc)
+module Sound.SC3.Graph.JMCC_harmonic_tumbling_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+harmonic_tumbling :: UId m => m UGen
+harmonic_tumbling = do
+  let f = 80
+      p = 10
+      t = xLine KR (mce2 10 11) 0.1 60 DoNothing
+      o h = do n <- dust KR t
+               r <- rand 0 0.5
+               let e = decay2 (n * 0.02) 0.005 r
+               return (fSinOsc AR (f * (h + 1)) 0 * e)
+  fmap sum (mapM o [0..p])
+
+main :: IO ()
+main = audition . out 0 =<< harmonic_tumbling
diff --git a/Sound/SC3/Graph/JMCC_hell_is_busy.hs b/Sound/SC3/Graph/JMCC_hell_is_busy.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_hell_is_busy.hs
@@ -0,0 +1,14 @@
+-- hell is busy (jmcc)
+module Sound.SC3.Graph.JMCC_hell_is_busy where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+hib :: UGen
+hib =
+    let o = fSinOsc AR (400 + rand 'α' 0 2000) 0
+        a = lfPulse KR (1 + rand 'β' 0 10.0) (rand 'γ' 0 0.7) 0.04
+    in pan2 (o * a) (rand 'δ' (-1) 1) 1
+
+main :: IO ()
+main = overlapTextureU (4,4,8,maxBound) hib
diff --git a/Sound/SC3/Graph/JMCC_lfo_modulation.hs b/Sound/SC3/Graph/JMCC_lfo_modulation.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_lfo_modulation.hs
@@ -0,0 +1,11 @@
+-- lfo modulation (jmcc)
+module Sound.SC3.Graph.JMCC_lfo_modulation where
+
+import Sound.SC3 {- hsc3 -}
+
+main :: IO ()
+main =
+  let o = fSinOsc KR 0.05 0 * 80 + 160
+      p = fSinOsc KR (mce2 0.6 0.7) 0 * 3600 + 4000
+      s = rlpf (lfPulse AR o 0 0.4 * 0.05) p 0.2
+  in audition (out 0 (combL s 0.3 (mce2 0.2 0.25) 2))
diff --git a/Sound/SC3/Graph/JMCC_modal_space.hs b/Sound/SC3/Graph/JMCC_modal_space.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_modal_space.hs
@@ -0,0 +1,31 @@
+-- modal space (jmcc)
+module Sound.SC3.Graph.JMCC_modal_space where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+
+ms :: UGen -> UGen -> UGen
+ms n r =
+    let x = mouseX KR 0 15 Linear 0.1
+        k = degreeToKey 0 x 12
+        o = sinOsc AR (midiCPS (r + k + n * 0.04)) 0 * 0.1
+        t = lfPulse AR (midiCPS (mce2 48 55)) 0.15 0.5
+        f = midiCPS (sinOsc KR 0.1 0 * 10 + r)
+        d = rlpf t f 0.1 * 0.1
+        m = o + d
+    in combN m 0.31 0.31 2 + m
+
+modal_space :: UGen
+modal_space =
+    let n = uclone 'α' 2 (lfNoise1 'β' KR 3)
+    in (ms n 48 + ms n 72) * 0.25
+
+run :: Transport m => m ()
+run = do
+  let p = [0,2,3.2,5,7,9,10]
+  _ <- async (b_alloc_setn1 0 0 p)
+  play (out 0 modal_space)
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/JMCC_moto_rev.hs b/Sound/SC3/Graph/JMCC_moto_rev.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_moto_rev.hs
@@ -0,0 +1,13 @@
+-- moto rev (jmcc)
+module Sound.SC3.Graph.JMCC_moto_rev where
+
+import Sound.SC3 {- hsc3 -}
+
+moto_rev :: UGen
+moto_rev =
+  let f = sinOsc KR 0.2 0 * 10 + 21
+      s = lfPulse AR f (mce2 0 0.1) 0.1
+  in clip2 (rlpf s 100 0.1) 0.4
+
+main :: IO ()
+main = audition (out 0 moto_rev)
diff --git a/Sound/SC3/Graph/JMCC_mridangam.hs b/Sound/SC3/Graph/JMCC_mridangam.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_mridangam.hs
@@ -0,0 +1,62 @@
+-- mridangam (jmcc)
+module Sound.SC3.Graph.JMCC_mridangam where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+spe3_mridangam :: Synthdef
+spe3_mridangam =
+    let t_amp = tr_control "t_amp" 1
+        n = whiteNoise 'α' AR * 70
+        e = decay2 t_amp 0.002 0.1
+        o = distort (resonz (n * e) (midiCPS 60) 0.02 * 4) * 0.4
+    in synthdef "mridangam" (out 0 o)
+
+spe3_drone :: Synthdef
+spe3_drone =
+    let s1 = saw AR (midiCPS (mce2 60 60.04))
+        s2 = saw AR (midiCPS (mce2 67 67.04))
+        o = lpf (s1 + s2) (midiCPS 108) * 0.007
+    in synthdef "drone" (out 0 o)
+
+p :: Fractional n => [P n]
+p =
+    [pseq [0.0] 10
+    -- intro
+    ,pseq [0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] 2
+    ,pseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.0] 2
+    ,pseq [0.9,0.0,0.0,0.2,0.0,0.2,0.0,0.2,0.0,0.0] 2
+    ,pseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.2] 2
+    -- solo
+    ,prand 'β' [pseq [0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0] 1
+               ,pseq [0.9,0.2,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0] 1
+               ,pseq [0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.2] 1
+               ,pseq [0.9,0.0,0.0,0.7,0.2,0.2,0.0,0.7,0.0,0.0] 1
+               ,pseq [0.9,0.0,0.0,0.7,0.0,0.2,0.2,0.7,0.2,0.0] 1
+               ,pseq [0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.2,0.2] 1
+               ,pseq [0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.0,0.0] 1
+               ,pseq [0.9,0.0,0.0,0.7,0.2,0.2,0.2,0.7,0.0,0.0] 1
+               ,pseq [0.9,0.0,0.4,0.0,0.4,0.0,0.4,0.0,0.4,0.0] 1
+               ,pseq [0.9,0.0,0.0,0.4,0.0,0.0,0.4,0.2,0.4,0.2] 1
+               ,pseq [0.9,0.0,0.2,0.7,0.0,0.2,0.0,0.7,0.0,0.0] 1
+               ,pseq [0.9,0.0,0.0,0.7,0.0,0.0,0.0,0.7,0.0,0.0] 1
+               ,pseq [0.9,0.7,0.7,0.0,0.0,0.2,0.2,0.2,0.0,0.0] 1
+               ,pseq [0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] 1] 30
+    -- tehai
+    ,pseq [2.0,0.0,0.2,0.5,0.0,0.2,0.9
+          ,1.5,0.0,0.2,0.5,0.0,0.2,0.9
+          ,1.5,0.0,0.2,0.5,0.0,0.2] 3
+    -- sam
+    ,pseq [5] 1]
+
+act :: Transport m => m ()
+act = do
+  play spe3_drone
+  _ <- async (d_recv spe3_mridangam)
+  let i = Instr_Def spe3_mridangam False
+  play (pmono [(K_instr,pinstr' i),(K_id,100)
+              ,(K_param "t_amp",pseq p 1),(K_dur,1/8)])
+
+main :: IO ()
+main = withSC3 act
diff --git a/Sound/SC3/Graph/JMCC_noise_burst_sweep.hs b/Sound/SC3/Graph/JMCC_noise_burst_sweep.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_noise_burst_sweep.hs
@@ -0,0 +1,22 @@
+-- noise burst sweep (jmcc)
+module Sound.SC3.Graph.JMCC_noise_burst_sweep where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+nbs :: ID a => a -> UGen
+nbs e =
+  let n = uclone e 2 (whiteNoise e AR)
+      lfoRate = rand e (-1) 1 + mouseX KR 10 60 Exponential 0.2
+      amp = max 0 (lfSaw KR lfoRate (-1))
+      cfreq = mouseY KR 400 8000 Exponential 0.2
+      freq = sinOsc KR 0.2 0 * cfreq + (1.05 * cfreq)
+  in resonz (n * amp) freq 0.1
+
+main :: IO ()
+main = overlapTextureU (4,2,4,maxBound) (nbs 'α')
+
+{-
+audition (out 0 (nbs 'α'))
+-}
diff --git a/Sound/SC3/Graph/JMCC_noise_modulated_sines.hs b/Sound/SC3/Graph/JMCC_noise_modulated_sines.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_noise_modulated_sines.hs
@@ -0,0 +1,18 @@
+-- noise modulated sines (jmcc)
+module Sound.SC3.Graph.JMCC_noise_modulated_sines where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+nms :: UGen
+nms =
+    let f = midiCPS (rand 'α' 60 100)
+        o = fSinOsc AR (mce2 f (f + 0.2)) 0
+        a = lfNoise2 'β' KR (f * mce2 0.15 0.16) * 0.1
+    in o * a
+
+nms_pp :: (UGen -> UGen)
+nms_pp i = combN i 0.3 0.3 4 + mceReverse i
+
+main :: IO ()
+main = overlapTextureU_pp (4,4,4,maxBound) nms 2 nms_pp
diff --git a/Sound/SC3/Graph/JMCC_overlap_add.hs b/Sound/SC3/Graph/JMCC_overlap_add.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_overlap_add.hs
@@ -0,0 +1,22 @@
+-- overlap-add (jmcc)
+module Sound.SC3.Graph.JMCC_overlap_add where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+sine :: UGen
+sine =
+    let r0 = expRand 'α' 500 1400
+        r1 = rand 'β' (-1) 1
+    in pan2 (sinOsc AR r0 0) r1 0.01
+
+noise :: UGen
+noise =
+    let n0 = whiteNoise 'γ' AR
+        r0 = expRand 'δ' 800 8400
+        r1 = rand 'ε' (-1) 1
+    in pan2 (resonz (n0 * 0.1) r0 0.05) r1 0.25
+
+main :: IO ()
+main = audition (ppar [overlapTextureP (4,4,6,maxBound) sine
+                      ,overlapTextureP (4,4,6,maxBound) noise])
diff --git a/Sound/SC3/Graph/JMCC_plucked_strings_m.hs b/Sound/SC3/Graph/JMCC_plucked_strings_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_plucked_strings_m.hs
@@ -0,0 +1,28 @@
+-- plucked strings (jmcc)
+module Sound.SC3.Graph.JMCC_plucked_strings_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+plucked_strings :: UId m => m UGen
+plucked_strings = do
+  let dt = do r0 <- rand 60 90
+              return (1 / midiCPS (floorE r0))
+      i = do r0 <- rand 2 2.2
+             n0 <- dust AR 0.5
+             r1 <- rand 0.05 0.15
+             r2 <- rand 0 (pi * 2)
+             r3 <- iRand 0 2
+             let s0 = impulse AR r0 0.3
+                 s1 = n0 * 0.3
+                 s2 = impulse AR (sinOsc KR r1 r2 * 5 + 5.2) 0.3
+             return (select r3 (mce [s0,s1,s2]))
+      s = do n0 <- pinkNoise AR
+             r1 <- rand (-1) 1
+             im <- i
+             dt' <- dt
+             let t = decay im 0.1 * n0 * 0.1
+             return (pan2 (combL t dt' dt' 4) r1 1)
+  fmap sum (sequence (replicate 5 s))
+
+main :: IO ()
+main = audition . out 0 =<< plucked_strings
diff --git a/Sound/SC3/Graph/JMCC_police_state.hs b/Sound/SC3/Graph/JMCC_police_state.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_police_state.hs
@@ -0,0 +1,25 @@
+-- police state (jmcc)
+module Sound.SC3.Graph.JMCC_police_state where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect {- hsc3 -}
+
+nd :: UGen
+nd =
+    let n = lfNoise2 'α' AR (rand 'β' 80 120)
+        f = sinOsc KR (rand 'γ' 0.02 0.12) (rand 'δ' 0 (pi * 2)) *
+            rand 'ε' 0 600 +
+            rand 'ζ' 700 1300
+    in pan2 (sinOsc AR f 0 * n * 0.1) (rand 'η' (-1) 1) 1
+
+police_state :: UGen
+police_state =
+  let ns = uclone 'θ' 4 nd
+      n0 = uclone 'ι' 2 (lfNoise2 'κ' KR 0.4)
+      n1 = lfNoise2 'λ' AR (n0 * 90 + 620)
+      n2 = lfNoise2 'μ' KR (mce2 0.3 0.301)
+      e = n1 * (n2 * 0.15 + 0.18)
+  in combL (mix ns + e) 0.3 0.3 3
+
+main :: IO ()
+main = audition (out 0 police_state)
diff --git a/Sound/SC3/Graph/JMCC_police_state_m.hs b/Sound/SC3/Graph/JMCC_police_state_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_police_state_m.hs
@@ -0,0 +1,25 @@
+-- police state (jmcc)
+module Sound.SC3.Graph.JMCC_police_state_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+police_state :: UId m => m UGen
+police_state = do
+  let nd = do r0 <- rand 0.02 0.12
+              r1 <- rand 0 (pi * 2)
+              r2 <- rand 0 600
+              r3 <- rand 700 1300
+              r4 <- rand (-1) 1
+              r5 <- rand 80 120
+              n0 <- lfNoise2 AR r5
+              let f = sinOsc KR r0 r1 * r2 + r3
+              return (pan2 (sinOsc AR f 0 * n0 * 0.1) r4 1)
+  ns <- clone 4 nd
+  n0 <- clone 2 (lfNoise2 KR 0.4)
+  n1 <- lfNoise2 AR (n0 * 90 + 620)
+  n2 <- lfNoise2 KR (mce2 0.3 0.301)
+  let e = n1 * (n2 * 0.15 + 0.18)
+  return (combL (mix ns + e) 0.3 0.3 3)
+
+main :: IO ()
+main = audition . out 0 =<< police_state
diff --git a/Sound/SC3/Graph/JMCC_pond_life.hs b/Sound/SC3/Graph/JMCC_pond_life.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_pond_life.hs
@@ -0,0 +1,15 @@
+-- pond life (jmcc)
+module Sound.SC3.Graph.JMCC_pond_life where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+pond_life :: UGen
+pond_life =
+    let f0 = 20 + rand 'α' 0 30
+        f1 = fSinOsc KR f0 0 * rand 'β' 100 400 + linRand 'γ' 500 2500 0
+        a = lfPulse KR (3 / rand 'δ' 1 9) (rand 'ε' 0.2 0.5) 0.04
+    in pan2 (sinOsc AR f1 0 * a) (rand 'ζ' (-1) 1) 0.5
+
+main :: IO ()
+main = overlapTextureU (8,8,4,maxBound) pond_life
diff --git a/Sound/SC3/Graph/JMCC_pond_life_hp.hs b/Sound/SC3/Graph/JMCC_pond_life_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_pond_life_hp.hs
@@ -0,0 +1,17 @@
+-- pond life (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_pond_life_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+pond_life :: UId m => m UGen
+pond_life = do
+  let f = fSinOsc KR (20 + #(rand 0 30)) 0
+          * #(rand 100 400)
+          + #(linRand 500 2500 0)
+  let a = lfPulse KR (3 / #(rand 1 9)) #(rand 0.2 0.5) 0.04
+  return (pan2 (sinOsc AR f 0 * a) #(rand (-1) 1) 0.5)
+
+main :: IO ()
+main = overlapTextureU (8,8,4,maxBound) =<< pond_life
diff --git a/Sound/SC3/Graph/JMCC_pulsing_bottles.hs b/Sound/SC3/Graph/JMCC_pulsing_bottles.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_pulsing_bottles.hs
@@ -0,0 +1,25 @@
+-- pulsing bottles (jmcc)
+module Sound.SC3.Graph.JMCC_pulsing_bottles where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+pulsing_bottles :: UGen
+pulsing_bottles =
+    let r = let n = whiteNoise 'α' AR
+                r0 = rand 'α' 4 14
+                r1 = rand 'α' 0 0.7
+                r2 = rand 'α' 400 7400
+            in resonz (n * lfPulse KR r0 0 0.25 * r1) r2 0.01
+        s = let f = rand 'β' 0.1 0.5
+                p = rand 'β' 0 (pi * 2)
+             in sinOsc KR f p
+    in sum (zipWith3 pan2 (uclone' 'α' 6 r) (uclone' 'β' 6 s) (repeat 1))
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) pulsing_bottles
+
+{-
+audition (out 0 pulsing_bottles)
+-}
diff --git a/Sound/SC3/Graph/JMCC_pulsing_bottles_m.hs b/Sound/SC3/Graph/JMCC_pulsing_bottles_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_pulsing_bottles_m.hs
@@ -0,0 +1,22 @@
+-- pulsing bottles (jmcc)
+module Sound.SC3.Graph.JMCC_pulsing_bottles_m where
+
+import Control.Monad {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+pulsing_bottles :: UId m => m UGen
+pulsing_bottles = do
+  let r = do n <- whiteNoise AR
+             r0 <- rand 4 14
+             r1 <- rand 0 0.7
+             r2 <- rand 400 7400
+             return (resonz (n * lfPulse KR r0 0 0.25 * r1) r2 0.01)
+      s = do f <- rand 0.1 0.5
+             p <- rand 0 (pi * 2)
+             return (sinOsc KR f p)
+      u = liftM2 (\x y -> pan2 x y 1) r s
+  fmap sum (sequence (replicate 6 u))
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) =<< pulsing_bottles
diff --git a/Sound/SC3/Graph/JMCC_rails.hs b/Sound/SC3/Graph/JMCC_rails.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_rails.hs
@@ -0,0 +1,24 @@
+-- rails (jmcc)
+module Sound.SC3.Graph.JMCC_rails where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (-n) n
+
+rails :: UGen
+rails =
+    let n = 20 -- resonant modes
+        e = dust 'α' AR 100 * 0.04 -- excitation
+        f = xLine KR 3000 300 8 DoNothing -- sweep filter down
+        l = line KR (rand2 'β' 1) (rand2 'γ' 1) 8 DoNothing -- sweep pan
+        r = uclone' 'δ' n (200 + linRand 'ε' 0 3000 0) -- resonant frequencies
+        a = replicate n 1
+        t = uclone' 'ζ' n (0.2 + rand 'η' 0 1) -- ring times
+        k = klank (resonz e f 0.2) 1 0 1 (klankSpec r a t)
+    in pan2 k l 1
+
+main :: IO ()
+main = overlapTextureU (3,2,4,maxBound) rails
diff --git a/Sound/SC3/Graph/JMCC_random_panning_sines.hs b/Sound/SC3/Graph/JMCC_random_panning_sines.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_random_panning_sines.hs
@@ -0,0 +1,17 @@
+-- random panning sines (jmcc)
+module Sound.SC3.Graph.JMCC_random_panning_sines where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rps :: UGen
+rps =
+    let nd = let o = fSinOsc AR (linRand 'α' 80 2000 0) 0
+                 l = lfNoise1 'β' KR (rand 'γ' 0.8 1.2)
+                 a = lfNoise1 'δ' KR (rand 'ε' 0.82 0.98)
+             in pan2 o l a
+    in mix (uclone 'ζ' 8 nd) * (0.4 / 8)
+
+main :: IO ()
+main = overlapTextureU (8,8,2,maxBound) rps
diff --git a/Sound/SC3/Graph/JMCC_random_panning_sines_m.hs b/Sound/SC3/Graph/JMCC_random_panning_sines_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_random_panning_sines_m.hs
@@ -0,0 +1,18 @@
+-- random panning sines (jmcc)
+module Sound.SC3.Graph.JMCC_random_panning_sines_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rps :: UId m => m UGen
+rps = do
+  let nd = do r0 <- linRand 80 2000 0
+              let o = fSinOsc AR r0 0
+              l <- lfNoise1 KR =<< rand 0.8 1.2
+              a <- lfNoise1 KR =<< rand 0.82 0.98
+              return (pan2 o l a)
+  r <- clone 8 nd
+  return (mix r * (0.4 / 8))
+
+main :: IO ()
+main = overlapTextureU (8,8,2,maxBound) =<< rps
diff --git a/Sound/SC3/Graph/JMCC_random_pulsations.hs b/Sound/SC3/Graph/JMCC_random_pulsations.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_random_pulsations.hs
@@ -0,0 +1,15 @@
+-- random pulsations (jmcc)
+module Sound.SC3.Graph.JMCC_random_pulsations where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rp :: UGen
+rp =
+    let o1 = fSinOsc AR (rand 'α' 0 2000) 0 * 0.02
+        o2 = sinOsc AR (linRand 'α' 8 88 0) 0
+        o3 = sinOsc KR (rand 'α' 0.3 0.8) (rand 'α' 0 (2 * pi)) * 0.7
+    in pan2 (o1 `amClip` o2) o3 1
+
+main :: IO ()
+main = overlapTextureU (5,2,8,maxBound) rp
diff --git a/Sound/SC3/Graph/JMCC_random_sine_waves.hs b/Sound/SC3/Graph/JMCC_random_sine_waves.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_random_sine_waves.hs
@@ -0,0 +1,14 @@
+-- random sine waves (jmcc)
+module Sound.SC3.Graph.JMCC_random_sine_waves where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rsw :: UGen
+rsw =
+    let f = rand 'α' 0 2000
+        o = fSinOsc AR f 0 * 0.02
+    in pan2 o (rand 'β' (-1) 1) 1
+
+main :: IO ()
+main = overlapTextureU (2,5,12,maxBound) rsw
diff --git a/Sound/SC3/Graph/JMCC_random_sine_waves_hp.hs b/Sound/SC3/Graph/JMCC_random_sine_waves_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_random_sine_waves_hp.hs
@@ -0,0 +1,11 @@
+-- random sine waves (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_random_sine_waves_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+main :: IO ()
+main = do
+  let rsw = pan2 (fSinOsc AR #(rand 0 2000) 0 * 0.02) #(rand (-1) 1) 1
+  overlapTextureU (2,5,12,maxBound) rsw
diff --git a/Sound/SC3/Graph/JMCC_random_sine_waves_she.hs b/Sound/SC3/Graph/JMCC_random_sine_waves_she.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_random_sine_waves_she.hs
@@ -0,0 +1,12 @@
+-- random sine waves (jmcc)
+{-# OPTIONS_GHC -F -pgmF she #-}
+module Sound.SC3.Graph.JMCC_random_sine_waves_she where
+
+import Control.Applicative {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+main :: IO ()
+main = do
+  s <- (|pan2 ((|fSinOsc ~AR (rand 0 2000) ~0|) .* 0.02) (rand (-1) 1) ~1|)
+  overlapTextureU (2,5,12,maxBound) s
diff --git a/Sound/SC3/Graph/JMCC_resonant_dust.hs b/Sound/SC3/Graph/JMCC_resonant_dust.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_resonant_dust.hs
@@ -0,0 +1,16 @@
+-- resonant dust (jmcc)
+module Sound.SC3.Graph.JMCC_resonant_dust where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+resonant_dust :: UGen
+resonant_dust =
+    let rf = let st = rand 'α' 80 2080
+                 en = st + (rand 'β' (-0.5) 0.5 * st)
+             in xLine KR st en 9 DoNothing
+        d = dust 'γ' AR (rand 'δ' 50 850) * 0.3
+    in pan2 (resonz d rf 0.1) (rand 'ε' (-1) 1) 1
+
+main :: IO ()
+main = overlapTextureU (5,2,9,maxBound) resonant_dust
diff --git a/Sound/SC3/Graph/JMCC_resonant_dust_hp.hs b/Sound/SC3/Graph/JMCC_resonant_dust_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_resonant_dust_hp.hs
@@ -0,0 +1,16 @@
+-- resonant dust (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_resonant_dust_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+resonant_dust :: UId m => m UGen
+resonant_dust = do
+  st <- rand 80 2080
+  let en = st + (st * #(rand (-0.5) 0.5))
+      rf = xLine KR st en 9 DoNothing
+  return (pan2 (resonz (#(dust AR #(rand 50 850)) * 0.3) rf 0.1) #(rand (-1) 1) 1)
+
+main :: IO ()
+main = overlapTextureU (5,2,9,maxBound) =<< resonant_dust
diff --git a/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_hp.hs b/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_hp.hs
@@ -0,0 +1,21 @@
+-- reverberated sine percussion (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_reverberated_sine_percussion_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+reverberated_sine_percussion :: (Functor m,UId m) => m UGen
+reverberated_sine_percussion = do
+  let d = 6
+      c = 5
+      a = 4
+      s_ = do return (resonz (#(dust AR (2 / constant d)) * 50) (200 + #(rand 0 3000)) 0.003)
+      x_ i = do return (allpassN i 0.05 #(clone 2 (rand 0 0.05)) 1)
+  s <- fmap sum (sequence (replicate d s_))
+  y <- do let z = delayN s 0.048 0.48
+          return (mix (combL z 0.1 (#(lfNoise1 KR #(clone c (rand 0 0.1))) * 0.04 + 0.05) 15))
+  x <- chainM a x_ y
+  return (s + x * 0.2)
+
+main :: IO ()
+main = audition . out 0 =<< reverberated_sine_percussion
diff --git a/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_m.hs b/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_m.hs
@@ -0,0 +1,25 @@
+-- reverberated sine percussion (jmcc)
+module Sound.SC3.Graph.JMCC_reverberated_sine_percussion_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+reverberated_sine_percussion :: (Functor m,UId m) => m UGen
+reverberated_sine_percussion = do
+  let d = 6
+      c = 5
+      a = 4
+      s_ = do n <- dust AR (2 / constant d)
+              r <- rand 0 3000
+              return (resonz (n * 50) (200 + r) 0.003)
+      x_ i = do r <- clone 2 (rand 0 0.05)
+                return (allpassN i 0.05 r 1)
+  s <- fmap sum (sequence (replicate d s_))
+  y <- do let z = delayN s 0.048 0.48
+          r <- clone c (rand 0 0.1)
+          n <- lfNoise1 KR r
+          return (mix (combL z 0.1 (n * 0.04 + 0.05) 15))
+  x <- chainM a x_ y
+  return (s + x * 0.2)
+
+main :: IO ()
+main = audition . out 0 =<< reverberated_sine_percussion
diff --git a/Sound/SC3/Graph/JMCC_ring_modulated_klank.hs b/Sound/SC3/Graph/JMCC_ring_modulated_klank.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_ring_modulated_klank.hs
@@ -0,0 +1,23 @@
+-- ring modulated klank (jmcc)
+module Sound.SC3.Graph.JMCC_ring_modulated_klank where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rmk :: UGen
+rmk =
+    let p = 8
+        k = let sp = klankSpec_mce (randN p 'α' 100 10000)
+                                   (mce (replicate p 1))
+                                   (randN p 'α' 0.2 1)
+            in klank (dust 'α' AR 20 * 0.02) 1 0 1 sp
+        f = lfNoise2 'α' KR (rand 'α' 0.1 0.4) * 200 + rand 'α' 350 400
+    in pan2 (sinOsc AR f 0 * k) (rand 'α' (-1) 1) 1
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) rmk
+
+{-
+audition (out 0 rmk)
+-}
diff --git a/Sound/SC3/Graph/JMCC_sample_and_hold_liquidities.hs b/Sound/SC3/Graph/JMCC_sample_and_hold_liquidities.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_sample_and_hold_liquidities.hs
@@ -0,0 +1,18 @@
+-- sample and hold liquidities (jmcc)
+module Sound.SC3.Graph.JMCC_sample_and_hold_liquidities where
+
+import Sound.SC3.ID {- hsc3 -}
+
+shl :: UGen
+shl =
+    let r = mouseX KR 1 200 Exponential 0.1
+        t = recip r
+        c = impulse KR r 0.4
+        cf = mouseY KR 100 8000 Exponential 0.1
+        f = latch (whiteNoise 'α' KR * cf * 0.5 + cf) c
+        p = latch (whiteNoise 'β' KR) c
+        i = pan2 (sinOsc AR f 0 * decay2 c (t * 0.1) (t * 0.9)) p 1
+    in combN i 0.3 0.3 2
+
+main :: IO ()
+main = audition (out 0 shl)
diff --git a/Sound/SC3/Graph/JMCC_saucer_base.hs b/Sound/SC3/Graph/JMCC_saucer_base.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_saucer_base.hs
@@ -0,0 +1,18 @@
+-- saucer base (jmcc)
+module Sound.SC3.Graph.JMCC_saucer_base where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+saucer_base :: UGen
+saucer_base =
+    let a = rand 'α' 0 20
+        b = rand 'β' 0 1000
+        c = rand 'γ' 0 5000
+        p = rand 'δ' (-1) 1
+        o = sinOsc AR a 0 * b + (1.1 * b)
+        o' = sinOsc AR o 0 * c + (1.1 * c)
+    in pan2 (sinOsc AR o' 0 * 0.1) p 1
+
+main :: IO ()
+main = overlapTextureU (2,6,4,maxBound) saucer_base
diff --git a/Sound/SC3/Graph/JMCC_sawed_cymbals.hs b/Sound/SC3/Graph/JMCC_sawed_cymbals.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_sawed_cymbals.hs
@@ -0,0 +1,20 @@
+-- sawed cymbals (jmcc)
+module Sound.SC3.Graph.JMCC_sawed_cymbals where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+sawed_cymbals :: UGen
+sawed_cymbals =
+    let y = let f1 = rand 'α' 500 2500
+                f2 = rand 'α' 0 8000
+                f = uclone' 'α' 15 (rand 'α' f1 (f1 + f2))
+                rt = uclone' 'α' 15 (rand 'α' 2 6)
+          in klankSpec f (replicate 15 1) rt
+        z = uclone 'α' 2 y
+        fS = xLine KR (rand 'α' 0 600) (rand 'β' 0 600) 12 DoNothing
+    in klank (lfSaw AR fS 0 * 0.0005) 1 0 1 (mceTranspose z)
+
+main :: IO ()
+main = overlapTextureU (4,4,6,maxBound) sawed_cymbals
diff --git a/Sound/SC3/Graph/JMCC_scratchy.hs b/Sound/SC3/Graph/JMCC_scratchy.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_scratchy.hs
@@ -0,0 +1,13 @@
+-- scratchy (jmcc)
+module Sound.SC3.Graph.JMCC_scratchy where
+
+import Sound.SC3.ID {- hsc3 -}
+
+scratchy :: UGen
+scratchy =
+  let f m = brownNoise m AR * 0.5 - 0.49
+      n = mce2 (f 'α') (f 'β')
+  in rhpf (max n 0 * 20) 5000 1
+
+main :: IO ()
+main = audition (out 0 scratchy)
diff --git a/Sound/SC3/Graph/JMCC_scratchy_m.hs b/Sound/SC3/Graph/JMCC_scratchy_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_scratchy_m.hs
@@ -0,0 +1,13 @@
+-- scratchy-m (jmcc)
+module Sound.SC3.Graph.JMCC_scratchy_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+scratchy :: UId m => m UGen
+scratchy = do
+  n <- clone 2 (brownNoise AR)
+  let f = max (n * 0.5 - 0.49) 0 * 20
+  return (rhpf f 5000 1)
+
+main :: IO ()
+main = audition . out 0 =<< scratchy
diff --git a/Sound/SC3/Graph/JMCC_sidereal_time.hs b/Sound/SC3/Graph/JMCC_sidereal_time.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_sidereal_time.hs
@@ -0,0 +1,26 @@
+-- sidereal time (jmcc)
+module Sound.SC3.Graph.JMCC_sidereal_time where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+sidereal_time :: UGen
+sidereal_time =
+  let p = 15
+      z = let y = let fr = uclone' 'α' p (expRand 'β' 100 6000)
+                      rt = uclone' 'γ' p (rand 'δ' 2 6)
+                  in klankSpec fr (replicate p 1) rt
+          in uclone 'ε' 2 y
+      f = xLine KR (expRand 'ζ' 40 300) (expRand 'η' 40 300) 12 DoNothing
+      t = let e = lfNoise2 'θ' KR (rand 'ι' 0 8)
+          in lfPulse AR f 0 (rand 'κ' 0.1 0.9) * 0.002 * max 0 e
+      o = distort (klank t 1 0 1 (mceTranspose z)) * 0.1
+  in combN o 0.6 (rand 'λ' 0.1 0.6) 8 + mceReverse o
+
+main :: IO ()
+main = overlapTextureU (4,4,6,maxBound) sidereal_time
+
+{-
+audition (out 0 sidereal_time)
+-}
diff --git a/Sound/SC3/Graph/JMCC_sidereal_time_hp.hs b/Sound/SC3/Graph/JMCC_sidereal_time_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_sidereal_time_hp.hs
@@ -0,0 +1,29 @@
+-- sidereal time (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_sidereal_time_hp where
+
+import Control.Monad {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+sidereal_time :: UId m => m UGen
+sidereal_time = do
+  let p = 15
+  z <- let y = do
+             fr <- replicateM p (expRand 100 6000)
+             rt <- replicateM p (rand 2 6)
+             return (klankSpec fr (replicate p 1) rt)
+       in clone 2 y
+  let f = xLine KR #(expRand 40 300) #(expRand 40 300) 12 DoNothing
+  let t = lfPulse AR f 0 #(rand 0.1 0.9)
+          * max 0 #(lfNoise2 KR #(rand 0 8))
+          * 0.002
+      o = distort (klank t 1 0 1 (mceTranspose z)) * 0.1
+  return (combN o 0.6 #(rand 0.1 0.6) 8 + mceReverse o)
+
+main :: IO ()
+main = overlapTextureU (4,4,6,maxBound) =<< sidereal_time
+
+{-
+audition (out 0 sidereal_time)
+-}
diff --git a/Sound/SC3/Graph/JMCC_slow_beating_harmonic_sines.hs b/Sound/SC3/Graph/JMCC_slow_beating_harmonic_sines.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_slow_beating_harmonic_sines.hs
@@ -0,0 +1,45 @@
+-- slow beating harmonic sines (jmcc)
+module Sound.SC3.Graph.JMCC_slow_beating_harmonic_sines where
+
+import Control.Monad {- base -}
+import Control.Monad.Random {- MonadRandom -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Lang.Random.Monad
+
+r_freq :: (RandomGen g) => Int -> Int -> Rand g [Double]
+r_freq k i = do
+  n <- nchoose i [0,2,4,5,7,9]
+  o <- nrand i 7
+  let f n' o' = midiCPS' (n' + (o' * 12) + fromIntegral k)
+  return (zipWith f n o)
+
+r_harmonics :: (RandomGen g) => Double -> Int -> Double -> Rand g [Double]
+r_harmonics d m f = do
+  d' <- nrand2 m d
+  return (zipWith (+) (map (* f) [1,2,4,5,6]) d')
+
+r_phase :: (RandomGen g) => Int -> Rand g [Double]
+r_phase m = nrrand m 0 (2 * pi)
+
+sbhs :: (RandomGen g) => Int -> Double -> Int -> Rand g UGen
+sbhs n d m = do
+  k' <- rand 12
+  let k = 24 + k'
+  f <- r_freq k n
+  p_fr <- mapM (r_harmonics d m) f
+  q_fr <- mapM (r_harmonics d m) f
+  p_ph <- replicateM n (r_phase m)
+  q_ph <- replicateM n (r_phase m)
+  let a = replicate n (replicate m 1)
+      p_sp = zipWith3 klangSpec' p_fr a p_ph
+      q_sp = zipWith3 klangSpec' q_fr a q_ph
+      mk_u s = klang AR 1 0 s * (0.1 / fromIntegral n)
+      p_u = sum (map mk_u p_sp)
+      q_u = sum (map mk_u q_sp)
+  return (mce2 p_u q_u)
+
+main :: IO ()
+main = do
+  g <- getStdGen
+  overlapTextureS (3,6,3,maxBound) (runRand (sbhs 8 0.4 5)) g
diff --git a/Sound/SC3/Graph/JMCC_slow_beating_sines.hs b/Sound/SC3/Graph/JMCC_slow_beating_sines.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_slow_beating_sines.hs
@@ -0,0 +1,42 @@
+-- slow beating sines (jmcc)
+module Sound.SC3.Graph.JMCC_slow_beating_sines where
+
+import Control.Monad {- base -}
+import Control.Monad.Random {- MonadRandom -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Lang.Random.Monad
+
+r_freq :: (RandomGen g) => Int -> Rand g [Double]
+r_freq i = do
+  n <- nrrand i 24 84
+  return (map midiCPS' n)
+
+r_harmonics :: (RandomGen g) => Double -> Int -> Double -> Rand g [Double]
+r_harmonics d m f = fmap (map (+ f)) (nrand2 m d)
+
+r_harmonics' :: (RandomGen g) => Double -> Int -> Double -> Rand g [Double]
+r_harmonics' d m f = fmap ((f :)  . map (+ f)) (nrand2 (m - 1) d)
+
+r_phase :: (RandomGen g) => Int -> Rand g [Double]
+r_phase m = nrrand m 0 (2 * pi)
+
+sbs :: (RandomGen g) => Int -> Double -> Int -> Rand g UGen
+sbs n d m = do
+  f <- r_freq n
+  p_fr <- mapM (r_harmonics' d m) f
+  q_fr <- mapM (r_harmonics d m) f
+  p_ph <- replicateM n (r_phase m)
+  q_ph <- replicateM n (r_phase m)
+  let a = replicate n (replicate m 1)
+      p_sp = zipWith3 klangSpec' p_fr a p_ph
+      q_sp = zipWith3 klangSpec' q_fr a q_ph
+      mk_u s = klang AR 1 0 s * (0.1 / fromIntegral n)
+      p_u = sum (map mk_u p_sp)
+      q_u = sum (map mk_u q_sp)
+  return (mce2 p_u q_u)
+
+main :: IO ()
+main = do
+  g <- getStdGen
+  overlapTextureS (4,4,3,maxBound) (runRand (sbs 20 0.4 3)) g
diff --git a/Sound/SC3/Graph/JMCC_snare_909.hs b/Sound/SC3/Graph/JMCC_snare_909.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_snare_909.hs
@@ -0,0 +1,32 @@
+-- snare-909 (jmcc)
+module Sound.SC3.Graph.JMCC_snare_909 where
+
+import Sound.SC3.ID {- hsc3 -}
+
+snare_909 :: UGen -> UGen
+snare_909 tr =
+  let n = whiteNoise 'α' AR
+      v = tRand 'β' 0.25 1.0 tr
+      e a b = envGen AR tr 1 0 1 DoNothing (envPerc a b)
+      e1 = e 0.0005 0.055
+      e2 = e 0.0005 0.075
+      e3 = e 0.0005 0.4
+      e4 = e 0.0005 0.283
+      t1 = lfTri AR 330 0
+      t2 = lfTri AR 185 0
+      x1 = lpf n 7040 * 0.1 + v
+      x2 = hpf x1 523
+      m1 = t1 * e1 * 0.25 + t2 * e2 * 0.25
+      m2 = x1 * e3 * 0.20 + x2 * e4 * 0.20
+  in m1 + m2
+
+snare_909_a :: UGen
+snare_909_a =
+    let x = mouseX KR 1 4 Linear 0.2
+        y = mouseY KR 0.25 0.75 Exponential 0.2
+        t = impulse KR (3 * x) 0
+    in pan2 (snare_909 t) 0 y
+
+main :: IO ()
+main = audition (out 0 snare_909_a)
+
diff --git a/Sound/SC3/Graph/JMCC_spe_m.hs b/Sound/SC3/Graph/JMCC_spe_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_spe_m.hs
@@ -0,0 +1,25 @@
+-- spe (jmcc)
+-- variant of graph in streams & patterns tutorial
+module Sound.SC3.Graph.JMCC_spe_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+spe :: UId m => m UGen
+spe = do
+  let rapf i = do r <- clone 2 (rand 0 0.05)
+                  return (allpassN i 0.05 r 4)
+      src = do let t = impulse KR 9 0
+                   e = envGen KR t 0.1 0 1 DoNothing (envPerc 0.1 1)
+                   s = mce [00,03,02,07
+                           ,08,32,16,18
+                           ,00,12,24,32]
+               n <- lfNoise1 KR 1
+               m <- dseq dinf s
+               let f = midiCPS (demand t 0 m + 32)
+                   o = lfSaw AR f 0 * e
+                   rq = midiCPS (n * 36 + 110)
+               return (rlpf o rq 0.1)
+  chainM 4 rapf =<< src
+
+main :: IO ()
+main = audition . out 0 =<< spe
diff --git a/Sound/SC3/Graph/JMCC_spe_p.hs b/Sound/SC3/Graph/JMCC_spe_p.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_spe_p.hs
@@ -0,0 +1,29 @@
+-- spe-p (jmcc)
+module Sound.SC3.Graph.JMCC_spe_p where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+spe3_allpass6 :: UId m => m Synthdef
+spe3_allpass6 = do
+  n <- lfNoise1 KR 1
+  let fr = control KR "freq" 440
+      rapf i = do r <- clone 2 (rand 0 0.05)
+                  return (allpassN i 0.05 r 4)
+      e = envGen KR 1 0.1 0 1 RemoveSynth (envPerc 0.1 1)
+      rq = midiCPS (n * 36 + 110)
+      o = rlpf (lfSaw AR fr 0 * e) rq 0.1
+  u <- fmap (out 0) (chainM 4 rapf o)
+  return (synthdef "spe" u)
+
+notes :: Num n => P n
+notes =
+    let n = [prand' 'α' [pempty,toP [24,31,36,43,48,55]] inf
+            ,pflop [60,prand 'β' [63,65] inf,67,prand 'γ' [70,72,74] inf]
+            ,psplitPlaces (pwhite 'δ' 3 9 inf) (toP [74,75,77,79,81])]
+    in pjoin (pseq1 n inf)
+
+main :: IO ()
+main = do
+  i <- spe3_allpass6
+  audition (pbind [(K_instr,psynth i),(K_midinote,notes),(K_dur,0.13)])
diff --git a/Sound/SC3/Graph/JMCC_sprinkler.hs b/Sound/SC3/Graph/JMCC_sprinkler.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_sprinkler.hs
@@ -0,0 +1,14 @@
+-- sprinkler (jmcc)
+module Sound.SC3.Graph.JMCC_sprinkler where
+
+import Sound.SC3.ID {- hsc3 -}
+
+sprinkler :: UGen
+sprinkler =
+  let n = whiteNoise 'α' AR
+      f = lfPulse KR 0.09 0 0.16 * 10 + 7
+      t = lfPulse KR f 0 0.25 * 0.1
+  in bpz2 (n * t)
+
+main :: IO ()
+main = audition (out 0 sprinkler)
diff --git a/Sound/SC3/Graph/JMCC_sprinkler_m.hs b/Sound/SC3/Graph/JMCC_sprinkler_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_sprinkler_m.hs
@@ -0,0 +1,14 @@
+-- sprinkler-m (jmcc)
+module Sound.SC3.Graph.JMCC_sprinkler_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+sprinkler_m :: UId m => m UGen
+sprinkler_m = do
+  n <- whiteNoise AR
+  let f = lfPulse KR 0.09 0 0.16 * 10 + 7
+      t = lfPulse KR f 0 0.25 * 0.1
+  return (bpz2 (n * t))
+
+main :: IO ()
+main = audition . out 0 =<< sprinkler_m
diff --git a/Sound/SC3/Graph/JMCC_string_wander_cluster.hs b/Sound/SC3/Graph/JMCC_string_wander_cluster.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_string_wander_cluster.hs
@@ -0,0 +1,24 @@
+-- string wander-cluster (jmcc)
+module Sound.SC3.Graph.JMCC_string_wander_cluster where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import System.Random {- random -}
+
+type ST = (Double,StdGen)
+
+wander :: ST -> ST
+wander (n,g) =
+    let (n',g') = randomR (-7,8) g
+    in (foldToRange 50 120 (n + n'),g')
+
+swc :: ST -> (UGen,ST)
+swc st =
+    let (n,g) = wander st
+        d = 1 / midiCPS (constant n)
+        w = whiteNoise 'c' AR * 0.008
+        o = combC w 0.01 d (d * 1000)
+    in (pan2 o (rand 'd' (-1) 1) 1,(n,g))
+
+main :: IO ()
+main = overlapTextureS (4/3,4/3,6,maxBound) swc (60,mkStdGen 0)
diff --git a/Sound/SC3/Graph/JMCC_strummable_guitar.hs b/Sound/SC3/Graph/JMCC_strummable_guitar.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_strummable_guitar.hs
@@ -0,0 +1,20 @@
+-- strummable guitar (jmcc)
+module Sound.SC3.Graph.JMCC_strummable_guitar where
+
+import Sound.SC3.ID {- hsc3 -}
+
+strummable_guitar :: UGen
+strummable_guitar =
+    let scale = [52,57,62,67,71,76]
+        str i = let x = mouseX KR 0 1 Linear 0.2
+                    t = abs (hpz1 (x >* (0.25 + constant i * 0.1)))
+                    e = decay t 0.05
+                    n = pinkNoise i AR * e
+                    dt = 1 / midiCPS (scale !! i)
+                    s = combL n dt dt 4
+                in pan2 s (constant i * 0.2 - 0.5) 1
+        strs = mixFill (length scale) str
+  in leakDC (lpf strs 12000) 0.995
+
+main :: IO ()
+main = audition (out 0 strummable_guitar)
diff --git a/Sound/SC3/Graph/JMCC_sweepy_noise.hs b/Sound/SC3/Graph/JMCC_sweepy_noise.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_sweepy_noise.hs
@@ -0,0 +1,17 @@
+-- sweepy noise (jmcc)
+module Sound.SC3.Graph.JMCC_sweepy_noise where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+
+sweepy_noise :: UGen
+sweepy_noise =
+    let n = uclone 'α' 2 (whiteNoise 'α' AR)
+        lfoDepth = mouseY KR 200 8000 Exponential 0.1
+        lfoRate = mouseX KR 4 60 Exponential 0.1
+        freq = lfSaw KR lfoRate 0 * lfoDepth + (lfoDepth * 1.2)
+        filtered = rlpf (n * 0.03) freq 0.1
+    in combN filtered 0.3 0.3 2 + filtered
+
+main :: IO ()
+main = audition (out 0 sweepy_noise)
diff --git a/Sound/SC3/Graph/JMCC_synthetic_piano_m.hs b/Sound/SC3/Graph/JMCC_synthetic_piano_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_synthetic_piano_m.hs
@@ -0,0 +1,27 @@
+-- synthetic piano (jmcc)
+module Sound.SC3.Graph.JMCC_synthetic_piano_m where
+
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+synthetic_piano :: UId m => m UGen
+synthetic_piano = do
+  n <- iRand 36 90
+  f <- rand 0.1 0.5
+  ph <- rand 0 (pi * 2)
+  let s = impulse AR f ph * 0.1
+      e = decay2 s 0.008 0.04
+      c i = do n0 <- lfNoise2 AR 3000
+               let o = [-0.05,0,0.04] !! i
+                   dt = 1 / midiCPS (n + o)
+               return (combL (n0 * e) dt dt 6)
+      l = ((n - 36) / 27) - 1
+  c_ <- mixFillM 3 c
+  return (pan2 c_ l 1)
+
+main :: IO ()
+main = overlapTextureU (6,0,6,maxBound) =<< synthetic_piano
+
+{-
+audition . out 0 =<< mixFillM 6 (const synthetic_piano)
+-}
diff --git a/Sound/SC3/Graph/JMCC_tank.hs b/Sound/SC3/Graph/JMCC_tank.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_tank.hs
@@ -0,0 +1,50 @@
+-- tank (jmcc)
+-- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html
+module Sound.SC3.Graph.JMCC_tank where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+
+pling :: ID a => a -> UGen
+pling e =
+    let d = dust e AR 0.2
+        f = expRand e 300 2200
+        p = rand e (-1) 1
+        s1 = cubed (fSinOsc AR f 0)
+        s2 = decay2 d 0.1 0.5 * 0.1 * s1
+    in pan2 s2 p 1
+
+bang :: ID a => a -> UGen
+bang e =
+    let d = dust e AR 0.01
+        n = brownNoise e AR
+    in pan2 (decay2 d 0.04 0.3 * n) 0 1
+
+r_allpass :: ID z => z -> UGen -> UGen
+r_allpass e i =
+    let r = randN 2 e 0.005 0.02
+    in allpassN i 0.03 r 1
+
+tank_f :: ID z => z -> UGen -> UGen
+tank_f e i =
+    let r1 = randN 2 e 0.01 0.05
+        r2 = randN 2 e 0.03 0.15
+        l0 = localIn 2 AR * 0.98
+        l1 = onePole l0 0.33
+        (l1l,l1r) = mce2c l1
+        l2 = rotate2 l1l l1r 0.23
+        l3 = allpassN l2 0.05 r1 2
+        l4 = delayN l3 0.3 (mce2 0.17 0.23)
+        l5 = allpassN l4 0.05 r2 2
+        l6 = leakDC l5 0.995
+        l7 = l6 + i
+    in mrg [l7,localOut l7]
+
+tank :: UGen
+tank =
+  let s = bang 'α' + mix (uclone 'β' 8 (pling 'γ'))
+  in tank_f 'δ' (useq 'ε' 4 (r_allpass 'ζ') s)
+
+main :: IO ()
+main = audition (out 0 tank)
diff --git a/Sound/SC3/Graph/JMCC_tank_hp.hs b/Sound/SC3/Graph/JMCC_tank_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_tank_hp.hs
@@ -0,0 +1,37 @@
+-- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_tank_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+pling :: UId m => m UGen
+pling = do
+  let s = decay2 #(dust AR 0.2) 0.1 0.5
+          * cubed (fSinOsc AR #(expRand 300 2200) 0)
+          * 0.1
+  return (pan2 s #(rand (-1) 1) 1)
+
+bang :: UId m => m UGen
+bang = do return (pan2 (decay2 #(dust AR 0.01) 0.04 0.3 * #(brownNoise AR)) 0 1)
+
+r_allpass :: UId m => UGen -> m UGen
+r_allpass i = do return (allpassN i 0.03 #(clone 2 (rand 0.005 0.02)) 1)
+
+tank_f :: UId m => UGen -> m UGen
+tank_f i = do
+  let [l,r] = mceChannels (onePole (localIn 2 AR * 0.98) 0.33)
+  let a = allpassN (rotate2 l r 0.23) 0.05 #(clone 2 (rand 0.01 0.05)) 2
+      b = delayN a 0.3 (mce [0.17,0.23])
+  let c = leakDC (allpassN b 0.05 #(clone 2 (rand 0.03 0.15)) 2) 0.995 + i
+  return (mrg [c,localOut c])
+
+tank :: UId m => m UGen
+tank = do
+  s <- bang .+. mixFillM 8 (const pling :: UId m => Int -> m UGen)
+  s' <- chainM 4 r_allpass s
+  tank_f s'
+
+main :: IO ()
+main = do
+  t <- tank
+  audition (out 0 t)
diff --git a/Sound/SC3/Graph/JMCC_tank_m.hs b/Sound/SC3/Graph/JMCC_tank_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_tank_m.hs
@@ -0,0 +1,46 @@
+-- tank (jmcc)
+-- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html
+module Sound.SC3.Graph.JMCC_tank_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+pling :: UId m => m UGen
+pling = do
+  d <- dust AR 0.2
+  f <- expRand 300 2200
+  p <- rand (-1) 1
+  let s1 = cubed (fSinOsc AR f 0)
+      s2 = decay2 d 0.1 0.5 * 0.1 * s1
+  return (pan2 s2 p 1)
+
+bang :: UId m => m UGen
+bang = do
+  d <- dust AR 0.01
+  n <- brownNoise AR
+  return (pan2 (decay2 d 0.04 0.3 * n) 0 1)
+
+r_allpass :: UId m => UGen -> m UGen
+r_allpass i = do
+  r <- clone 2 (rand 0.005 0.02)
+  return (allpassN i 0.03 r 1)
+
+tank_f :: UId m => UGen -> m UGen
+tank_f i = do
+  r1 <- clone 2 (rand 0.01 0.05)
+  r2 <- clone 2 (rand 0.03 0.15)
+  let l0 = localIn 2 AR * 0.98
+      l1 = onePole l0 0.33
+      [l1l,l1r] = mceChannels l1
+      l2 = rotate2 l1l l1r 0.23
+      l3 = allpassN l2 0.05 r1 2
+      l4 = delayN l3 0.3 (mce [0.17,0.23])
+      l5 = allpassN l4 0.05 r2 2
+      l6 = leakDC l5 0.995
+      l7 = l6 + i
+  return (mrg [l7,localOut l7])
+
+tank :: UId m => m UGen
+tank = tank_f =<< chainM 4 r_allpass =<< bang .+. mixFillM 8 (const pling)
+
+main :: IO ()
+main = audition . out 0 =<< tank
diff --git a/Sound/SC3/Graph/JMCC_theremin.hs b/Sound/SC3/Graph/JMCC_theremin.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_theremin.hs
@@ -0,0 +1,19 @@
+-- theremin (jmcc)
+module Sound.SC3.Graph.JMCC_theremin where
+
+import Sound.SC3 {- hsc3 -}
+
+theremin :: UGen
+theremin =
+  let m = 7
+      detune = 0
+      x = mouseX KR 0 0.6 Linear 0.2
+      y = mouseY KR 4000 200 Exponential 0.8
+      f = y + detune
+      f' = f + f * sinOsc AR m 0 * 0.02
+      a = sinOsc AR f' 0 * x
+  in pan2 a 0 1
+
+main :: IO ()
+main = audition (out 0 theremin)
+
diff --git a/Sound/SC3/Graph/JMCC_tremulate.hs b/Sound/SC3/Graph/JMCC_tremulate.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_tremulate.hs
@@ -0,0 +1,21 @@
+-- tremulate (jmcc)
+module Sound.SC3.Graph.JMCC_tremulate where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+
+tremulate :: UGen
+tremulate =
+    let f = rand 'α' 500 900
+        o = fSinOsc AR (f * mce [1,1.2,1.5,1.8]) 0
+        r = randN 4 'β' 30 90
+        a = max 0 (lfNoise2 'γ' KR r) * 0.1
+        l = randN 4 'δ' (-1) 1
+    in mix (pan2 o l a)
+
+tremulate_pp :: UGen -> UGen
+tremulate_pp i = combN i 0.1 0.1 1
+
+main :: IO ()
+main = xfadeTextureU_pp (0.5,2,maxBound) tremulate 2 tremulate_pp
diff --git a/Sound/SC3/Graph/JMCC_tremulate_hp.hs b/Sound/SC3/Graph/JMCC_tremulate_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_tremulate_hp.hs
@@ -0,0 +1,18 @@
+-- tremulate (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_tremulate_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+tremulate :: UId m => m UGen
+tremulate = do
+  let o = fSinOsc AR (#(rand 500 900) * mce [1,1.2,1.5,1.8]) 0
+  n <- clone 4 (lfNoise2 KR #(rand 30 90))
+  return (mix (pan2 o #(clone 4 (rand (-1) 1)) (max 0 (n * 0.1))))
+
+tremulate_pp :: UGen -> UGen
+tremulate_pp i = combN i 0.1 0.1 1
+
+main :: IO ()
+main = do xfadeTextureU_pp (0.5,2,maxBound) #(tremulate) 2 tremulate_pp
diff --git a/Sound/SC3/Graph/JMCC_tremulate_m.hs b/Sound/SC3/Graph/JMCC_tremulate_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_tremulate_m.hs
@@ -0,0 +1,23 @@
+-- tremulate (jmcc)
+module Sound.SC3.Graph.JMCC_tremulate_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+tremulate :: UId m => m UGen
+tremulate = do
+  f <- rand 500 900
+  let o = fSinOsc AR (f * mce [1,1.2,1.5,1.8]) 0
+  r <- rand 30 90
+  n <- clone 4 (lfNoise2 KR r)
+  let a = max 0 (n * 0.1)
+  l <- clone 4 (rand (-1) 1)
+  return (mix (pan2 o l a))
+
+tremulate_pp :: UGen -> UGen
+tremulate_pp i = combN i 0.1 0.1 1
+
+main :: IO ()
+main = do
+  t <- tremulate
+  xfadeTextureU_pp (0.5,2,maxBound) t 2 tremulate_pp
diff --git a/Sound/SC3/Graph/JMCC_tsort.hs b/Sound/SC3/Graph/JMCC_tsort.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_tsort.hs
@@ -0,0 +1,27 @@
+-- http://create.ucsb.edu/pipermail/sc-users/2003-March/002807.html (jmcc)
+module Sound.SC3.Graph.JMCC_tsort where
+
+{-
+This simple graph tests the topological sort of the unit generator
+graph, it ought only to use a minimal number of interconnect buffers.
+
+The below 369 node graph works with 'scsynth -u 57110 -w 2'.
+
+(Note that graphs loaded from disk during startup will grow the number
+of interconnect buffers, so to test this we must delete all graphs that
+would otherwise be loaded.)
+-}
+
+import Sound.SC3 {- hsc3 -}
+
+tsort :: UGen
+tsort =
+  let n = 122
+      c = envCoord [(0,0), (0.15, 1), (6, 0)] 1 1 EnvLin
+      e = envGen KR 1 1 0 1 RemoveSynth c
+      f o = sinOsc AR (440 + constant o) 0 * 0.001
+      s = mixFill n f
+  in s * e
+
+main :: IO ()
+main = audition (out 0 tsort)
diff --git a/Sound/SC3/Graph/JMCC_uplink.hs b/Sound/SC3/Graph/JMCC_uplink.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_uplink.hs
@@ -0,0 +1,20 @@
+-- uplink (jmcc)
+module Sound.SC3.Graph.JMCC_uplink where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+randz :: ID a => a -> UGen -> UGen
+randz e = rand e 0
+
+uplink :: UGen
+uplink =
+    let r = randz
+        p0 = lfPulse KR (r 'α' 20) 0 (r 'β' 1)
+        p1 = lfPulse KR (r 'γ' 4) 0 (r 'δ' 1) * r 'ε' 8000 + r 'ζ' 2000
+        f = mix (uclone 'η' 2 (p0 * p1))
+    in pan2 (lfPulse AR f 0 0.5 * 0.04) (rand 'θ' (-0.8) 0.8) 1
+
+main :: IO ()
+main = overlapTextureU (4,1,5,maxBound) uplink
diff --git a/Sound/SC3/Graph/JMCC_uplink_hp.hs b/Sound/SC3/Graph/JMCC_uplink_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_uplink_hp.hs
@@ -0,0 +1,18 @@
+-- uplink (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_uplink_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+uplink :: UId m => m UGen
+uplink = do
+  let p0 = do return (lfPulse KR #(rand 0 20) 0 #(rand 0 1))
+  let p1 = do return (lfPulse KR #(rand 0 4) 0 #(rand 0 1)
+                      * #(rand 0 8000)
+                      + #(rand 0 2000))
+  f <- fmap mix (clone 2 (p0 .*. p1))
+  return (pan2 (lfPulse AR f 0 0.5 * 0.04) #(rand (-0.8) 0.8) 1)
+
+main :: IO ()
+main = overlapTextureU (4,1,5,maxBound) =<< uplink
diff --git a/Sound/SC3/Graph/JMCC_what_was_i_thinking_m.hs b/Sound/SC3/Graph/JMCC_what_was_i_thinking_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_what_was_i_thinking_m.hs
@@ -0,0 +1,25 @@
+-- what was i thinking? (jmcc)
+module Sound.SC3.Graph.JMCC_what_was_i_thinking_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+what_was_i_thinking :: UId m => m UGen
+what_was_i_thinking = do
+  n0 <- lfNoise1 KR 0.2
+  n1 <- lfNoise1 KR 0.157
+  let p = pulse AR f (n1 * 0.4 + 0.5) * 0.04
+      i = lfPulse AR 0.1 0 0.05 * impulse AR 8 0 * 500
+      d = decay i 2
+      f = max (sinOsc KR 4 0 + 80) d
+      z = rlpf p (n0 * 2000 + 2400) 0.2
+      c x = do r <- rand 0 0.3
+               n <- lfNoise1 KR r
+               return (combL x 0.06 (n * 0.025 + 0.035) 1)
+      y = z * 0.6
+  z0 <- clone 2 (c y)
+  z1 <- clone 2 (c y)
+  return (z + mce [mix z0,mix z1])
+
+main :: IO ()
+main = audition . out 0 =<< what_was_i_thinking
+
diff --git a/Sound/SC3/Graph/JMCC_why_supercollider.hs b/Sound/SC3/Graph/JMCC_why_supercollider.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_why_supercollider.hs
@@ -0,0 +1,20 @@
+-- why supercollider (jmcc)
+module Sound.SC3.Graph.JMCC_why_supercollider where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+
+why_supercollider :: UGen
+why_supercollider =
+    let r = resonz (dust 'α' AR 0.2 * 50) (rand 'β' 200 3200) 0.003
+        s = mix (uclone 'γ' 10 r)
+        z = delayN s 0.048 0.048
+        c = combL z 0.1 (lfNoise1 'δ' KR (rand 'ε' 0 0.1) * 0.04 + 0.05) 15
+        y = mix (uclone 'ζ' 7 c)
+        f i = allpassN i 0.050 (randN 2 'η' 0 0.05) 1
+        x = useq 'θ' 4 f y
+    in out 0 (s + 0.2 * x)
+
+main :: IO ()
+main = audition why_supercollider
diff --git a/Sound/SC3/Graph/JMCC_wind_metals_m.hs b/Sound/SC3/Graph/JMCC_wind_metals_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_wind_metals_m.hs
@@ -0,0 +1,24 @@
+-- wind metals (jmcc)
+module Sound.SC3.Graph.JMCC_wind_metals_m where
+
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+-- > audition . out 0 =<< wind_metals
+wind_metals :: UId m => m UGen
+wind_metals = do
+  let n = 6
+  base <- expRand 60 4000
+  rng <- rand 500 8000
+  n0 <- clone 2 (brownNoise AR)
+  r0 <- expRand 0.125 0.5
+  n1 <- lfNoise1 KR r0
+  f <- sequence (replicate n (rand base (base + rng)))
+  dt <- sequence (replicate n (rand 0.1 2))
+  let exc = n0 * 0.007 * max 0 (n1 * 0.75 + 0.25)
+      k = klankSpec f (replicate n 1) dt
+      s = klank exc 1 0 1 k
+  return (softClip (s * 0.1))
+
+main :: IO ()
+main = overlapTextureU (5,2,12,maxBound) =<< wind_metals
diff --git a/Sound/SC3/Graph/JP_record_scratcher.hs b/Sound/SC3/Graph/JP_record_scratcher.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JP_record_scratcher.hs
@@ -0,0 +1,26 @@
+-- record scratcher (jp)
+module Sound.SC3.Graph.JP_record_scratcher where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+
+record_scratcher :: UGen
+record_scratcher =
+  let dup a = mce2 a a
+      d = Envelope [0, 1, 0] [0.1, 0.1] [EnvSin] (Just 1) (Just 0)
+      e = envGen KR 1 0.5 0 1 RemoveSynth d
+      x = mouseX KR (-10) 10 Linear 0.2
+      dx = x - delayN x 0.1 0.1
+      bdx = mouseButton KR 1 0 0.3 + dx
+      bdxr = bdx * bufRateScale KR 0
+      scr = playBuf 1 AR 0 bdxr 0 0 Loop DoNothing
+  in dup (scr * e)
+
+run :: Transport m => m ()
+run = do
+  let fn = "/home/rohan/data/audio/pf-c5.snd"
+  _ <- async (b_allocRead 0 fn 0 0)
+  play (out 0 record_scratcher)
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/JRHB_black_atlantic_currents.hs b/Sound/SC3/Graph/JRHB_black_atlantic_currents.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JRHB_black_atlantic_currents.hs
@@ -0,0 +1,109 @@
+-- http://www.listarc.bham.ac.uk/lists/sc-users/msg08240.html (jrhb)
+module Sound.SC3.Graph.JRHB_black_atlantic_currents where
+
+import Data.Numbers.Primes {- primes -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect {- hsc3 -}
+import System.Random {- random -}
+import System.Random.Shuffle {- random-shuffle -}
+
+nth_prime :: Integral a => Int -> a
+nth_prime j = primes !! j
+
+chain :: Int -> (t -> t) -> t -> t
+chain j f x = if j == 0 then x else chain (j - 1) f (f x)
+
+xn,yn,zn :: Num a => a
+xn = 64
+yn = 65
+zn = 66
+
+type NF t a = a -> Rate -> t -> UGen
+
+n :: NF t a -> t -> [a] -> UGen
+n g f = mce . map (\k -> g k KR f)
+
+n' :: NF t a -> [t] -> [a] -> UGen
+n' g f = mce . map (\(f',k) -> g k KR f') . zip f
+
+i :: UGen -> UGen
+i = inFeedback 2
+
+c :: Int -> UGen
+c = constant
+
+bac :: UGen
+bac =
+  let x = let ph = i yn * uclone 'α' 2 (lfdNoise3 'β' KR 1)
+          in out xn (mceReverse (sinOsc AR (60 * 2) ph))
+      y = let ph = i xn * uclone 'γ' 2 (lfdNoise3 'δ' KR 0.3) * 4
+          in out yn (sinOsc AR (50 * 2) ph)
+  in mrg [inFeedback 2 xn,y,x]
+
+main :: IO ()
+main = audition (out 0 bac)
+
+bac' :: UGen
+bac' =
+  let x = let f = c (nth_prime 23)
+              ph = i yn * uclone 'ε' 2 (lfdNoise3 'ζ' KR (sqrt 2))
+          in out xn (mceReverse (sinOsc AR f ph))
+      y = let f = c (chain 3 nth_prime 1)
+              ph = i xn * uclone 'η' 2 (lfdNoise3 'θ' KR (sqrt pi)) * pi
+          in out yn (tanh (sinOsc AR f ph))
+  in mrg [inFeedback 2 xn,y,x]
+
+bac'' :: UGen
+bac'' =
+  let x = let f = c (nth_prime 23)
+              ph = i yn * n' lfdNoise3 (map sqrt [1,2]) "ab"
+          in out xn (mceReverse (sinOsc AR f ph))
+      y = let f = c (chain 3 nth_prime 1)
+              ph = i xn * n lfdNoise1 (sqrt pi) "cd" * pi
+          in out yn (tanh (sinOsc AR f ph))
+      z = let f = c (chain 3 nth_prime 2)
+              ph = i yn * n lfdNoise0 (sqrt (sqrt pi)) "ef" * 42 * pi
+          in out zn (tanh (sinOsc AR f ph) * exp (-0.5 * pi))
+  in mrg [inFeedback 2 xn,y,x,z]
+
+bac''' :: UGen
+bac''' =
+  let x = let j = range 1 30 (lfNoise0 'ι' KR (log 2 / 2))
+              f = select j (mce (map (c . nth_prime) [1..30]))
+              ph = i zn * n' lfdNoise3 (map sqrt [1,2]) "ab"
+          in out xn (mceReverse (sinOsc AR f ph))
+      y = let f = c (chain 3 nth_prime 1)
+              ph = i xn * n lfdNoise1 (sqrt pi) "cd" * pi
+          in out yn (tanh (sinOsc AR f ph) * exp 1)
+      z = let f = c (chain 3 nth_prime 2)
+              ph = i yn * n lfdNoise0 (sqrt (sqrt pi)) "ef" * 42 * pi
+          in out zn (tanh (sinOsc AR f ph) * exp (-0.5 * pi))
+  in mrg [inFeedback 2 xn,y,x,z]
+
+scramble :: Enum a => a -> [t] -> [t]
+scramble j k =
+    let g = mkStdGen (fromEnum j)
+    in shuffle' k (length k) g
+
+bac'''' :: UGen
+bac'''' =
+  let x = let j = range 1 30 (lfNoise2 'κ' KR (log 2 / 2))
+              ph = i zn * n' lfdNoise3 (map sqrt [1,2]) "ab"
+              f' = map (c . nth_prime) (scramble 'λ' [1,3..61])
+              o = map (\f -> mceReverse (sinOsc AR f ph)) f'
+          in out xn (mceChannel 1 (selectX j (mce o)))
+      y = let f = c (chain 3 nth_prime 1)
+              ph = i xn * n lfdNoise1 (sqrt pi) "cd" * pi
+          in out yn (tanh (sinOsc AR f ph) * exp 1)
+      z = let f = c (chain 3 nth_prime 2)
+              ph = i yn * n lfdNoise0 (sqrt (sqrt pi)) "ef" * 42 * pi
+          in out zn (tanh (sinOsc AR f ph) * exp (-0.5 * pi))
+  in mrg [inFeedback 2 xn,y,x,z]
+
+{-
+audition (out 0 bac)
+audition (out 0 bac')
+audition (out 0 bac'')
+audition (out 0 bac''')
+audition (out 0 bac'''')
+-}
diff --git a/Sound/SC3/Graph/JRHB_chain_saw_m.hs b/Sound/SC3/Graph/JRHB_chain_saw_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JRHB_chain_saw_m.hs
@@ -0,0 +1,47 @@
+-- chain saw (jrhb)
+module Sound.SC3.Graph.JRHB_chain_saw_m where
+
+-- this graph generates long chains of unit generators and may require
+-- increasing the stack limit of the haskell run time system
+
+import qualified Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+coinIf :: Double -> a -> a -> IO a
+coinIf n a b = do
+  r <- R.coin n
+  return (if r then a else b)
+
+exprange :: UGen -> UGen -> UGen -> UGen
+exprange s = linExp s (-1) 1
+
+mceProduct :: UGen -> UGen
+mceProduct = mceEdit (\l -> [product l])
+
+clipu :: BinaryOp a => a -> a
+clipu s = clip2 s 1
+
+dup :: UGen -> UGen
+dup a = mce2 a a
+
+chain_saw :: IO UGen
+chain_saw = do
+  let f s1 = do xr <- fmap dup (expRand 0.1 2)
+                n1 <- lfNoise1 KR xr
+                n2 <- lfNoise1 KR xr
+                n3 <- lfNoise1 KR xr
+                f1 <- coinIf 0.6 (exprange n1 0.01 10) (exprange n2 10 50)
+                s2 <- coinIf 0.5 (1 - s1) (mceReverse s1)
+                let f2 = linExp s1 (-1) 1 f1 (f1 * exprange n3 2 10)
+                    u1 = lfSaw KR f2 0
+                    u2 = lfSaw KR (f1 * 0.1) 0 * 0.1 + 1
+                return . clipu =<< coinIf 0.5 (u1 * s2) (u1 * u2)
+      inp = lfSaw KR (0.2 * mce2 1 1.1) 0
+      b_freq = mce [70, 800, 9000, 5242]
+  ff <- chainM 8 f inp
+  let c_saw = mceProduct (saw AR (exprange ff 6 11000))
+      b_saw = dup (mix (bpf c_saw b_freq 0.2))
+  return (b_saw * 0.3)
+
+main :: IO ()
+main = audition . out 0 =<< chain_saw
diff --git a/Sound/SC3/Graph/JRHB_deep_sea.hs b/Sound/SC3/Graph/JRHB_deep_sea.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JRHB_deep_sea.hs
@@ -0,0 +1,34 @@
+-- deep sea (jrhb)
+module Sound.SC3.Graph.JRHB_deep_sea where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+rng :: UGen -> UGen -> UGen -> UGen
+rng s l r =
+    let m = (r - l) * 0.5
+    in mulAdd s m (m + l)
+
+deep_sea :: UGen
+deep_sea =
+    let amp = 1
+        pan = 0
+        variation = 0.9
+        n = rand 'α' 7 46
+        dt1 = 25.0 + rand 'β' (-1.7) 1.7
+        dt2 = (dt1 + lfNoise2 'γ' KR 2) * variation * 0.001
+        f = 901 + rand 'δ' 0 65
+        t = impulse AR (recip dt2) 0 * 100
+        count = pulseCount t 0
+        mul = count <* n
+        u1 = bpf (mul * t) f 1 * 0.1
+        f2 = f * ((count `modE` rng (lfNoise1 'ε' KR 1) 2 20) + 1)
+        u2 = bpf u1 f2 1 * 0.2
+    in mrg [pan2 u2 pan (amp * 10)
+           ,detectSilence u2 0.0001 0.2 RemoveSynth]
+
+main :: IO ()
+main = do
+  let s = synthdef "deep-sea" (out 0 deep_sea)
+      p = pbind [(K_instr,psynth s),(K_dur,pxrand 'ζ' [0.25,0.5,1,2] inf)]
+  audition p
diff --git a/Sound/SC3/Graph/JRHB_dial_history_m.hs b/Sound/SC3/Graph/JRHB_dial_history_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JRHB_dial_history_m.hs
@@ -0,0 +1,36 @@
+-- dial history (jrhb)
+module Sound.SC3.Graph.JRHB_dial_history_m where
+
+import Data.List {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+
+rng :: UGen -> UGen -> UGen -> UGen
+rng s = linLin s 0 1
+
+dial_history :: UId m => m UGen
+dial_history = do
+  let mfv = [[697,770,852,941],[1209,1336,1477,1633]]
+      numbers = [3,1] : [[a,b] | a <- [0..2],b <- [0..2]]
+      mce_r = mce . map mce
+  n <- dwhite dinf 7 12
+  w <- dwhite 1 2 7
+  b <- dbrown n 0.1 0.2 0.01
+  rate <- dseq dinf (mce2 w b)
+  q <- dseq dinf (mce [1..10])
+  g1 <- grayNoise AR
+  g2 <- grayNoise AR
+  d <- lfdNoise3 KR 0.5
+  let tr = trig (tDuty KR rate 0 DoNothing q 1) 0.09
+      pat = latch tr tr
+      x = mouseX KR 0 1 Linear 0.2
+      h = hasher (pat * x)
+      which = trunc (rng h 0 (constant (length numbers))) 1
+      both = select which (mce_r numbers)
+      dial = select both (mce_r (transpose mfv))
+      sig = sinOsc AR dial 0 * 0.05 * tr
+      dsig = delayN sig 0.2 (rng d 0 0.01)
+      hiss = g1 * 0.01 + hpf (g2 * 0.02) 3000
+  return (dsig + hiss)
+
+main :: IO ()
+main = audition . out 0 =<< dial_history
diff --git a/Sound/SC3/Graph/JRHB_half_life.hs b/Sound/SC3/Graph/JRHB_half_life.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JRHB_half_life.hs
@@ -0,0 +1,15 @@
+-- half-life (jrhb)
+module Sound.SC3.Graph.JRHB_half_life where
+
+import Sound.SC3.ID {- hsc3 -}
+
+half_life :: UGen
+half_life =
+  let t_half = 1/3.92
+      n_atoms = 1e+5
+      n = max 0 (n_atoms - pulseCount (localIn 2 AR) 0)
+      activity = dust 'α' AR (n * log 2 * t_half)
+  in mrg [activity,localOut activity]
+
+main :: IO ()
+main = audition (out 0 half_life)
diff --git a/Sound/SC3/Graph/JRHB_sam_i_am.hs b/Sound/SC3/Graph/JRHB_sam_i_am.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JRHB_sam_i_am.hs
@@ -0,0 +1,55 @@
+-- http://www.listarc.bham.ac.uk/lists/sc-users/msg00280.html (jrhb)
+module Sound.SC3.Graph.JRHB_sam_i_am where
+
+import Control.Monad.Random {- MonadRandom -}
+import Data.List {- base -}
+import Data.Maybe {- base -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Random.Monad {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+text :: [String]
+text =
+    ["I could not would not in a house"
+    ,"I would not could not with a mouse"
+    ,"I would not eat them with a fox"
+    ,"I would not eat them in a box"
+    ,"I would not eat them here or there"
+    ,"I would not eat them anywhere"
+    ,"I would not eat green eggs and ham"
+    ,"I do not like them Sam-I-am"]
+
+x :: [[String]]
+x = map words text
+
+a :: [String]
+a = nub (concat x)
+
+sam :: Synthdef
+sam =
+    let f1 = control KR "freq1" 440
+        f2 = control KR "freq2" 440
+        f3 = control KR "freq3" 440
+        e = xLine KR 0.1 0.001 0.5 RemoveSynth
+        o = sinOsc AR f1 0 * pulse AR f2 0.5 * saw AR f3 * e
+    in synthdef "sam" (out 0 o)
+
+b :: (RandomGen g,Floating n,Random n) => g -> [(String,[(Key,n)])]
+b g =
+    let mk w = do
+          f1 <- exprand 200 9000
+          f2 <- exprand 20 9000
+          f3 <- exprand 20 9000
+          let d = 0.1 * fromIntegral (length w)
+          return (w,[(K_param "freq1",f1)
+                    ,(K_param "freq2",f2)
+                    ,(K_param "freq3",f3)
+                    ,(K_dur,d)])
+    in evalRand (mapM mk a) g
+
+main :: IO ()
+main = do
+  g <- getStdGen
+  let t = b g
+      ae = mapMaybe (\w -> fmap e_from_list (lookup w t)) (concat x)
+  audition (p_with (K_instr,psynth sam) (pseq (map return ae) 1))
diff --git a/Sound/SC3/Graph/LJP_one_line.hs b/Sound/SC3/Graph/LJP_one_line.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/LJP_one_line.hs
@@ -0,0 +1,15 @@
+-- one-line (ljp)
+module Sound.SC3.Graph.LJP_one_line where
+
+import Sound.SC3 {- hsc3 -}
+
+one_line :: UGen
+one_line =
+  let lfs = lfSaw AR (mce2 1 0.99) (mce2 0 0.6) * 2000 + 2000
+      lfs_t = trunc lfs (mce2 400 600) * mce2 1 (-1)
+      f = onePole (mix lfs_t) 0.98
+  in pan2 (sinOsc AR f 0) 0 0.1
+
+main :: IO ()
+main = audition (out 0 one_line)
+
diff --git a/Sound/SC3/Graph/MN_k2ws.hs b/Sound/SC3/Graph/MN_k2ws.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/MN_k2ws.hs
@@ -0,0 +1,22 @@
+-- https://www.listarc.bham.ac.uk/lists/sc-users/msg21341.html (mn)
+module Sound.SC3.Graph.MN_k2ws where
+
+import Sound.SC3.ID {- hsc3 -}
+
+rng :: (UGen,UGen) -> UGen -> UGen
+rng (i,j) = range i j
+
+k2ws :: UGen
+k2ws =
+    let fc = 400 + rng (100,200) (lfNoise2 'α' AR (mce2 1 2))
+        fm = rng (100,200) (lfNoise0 'β' AR 5)
+        i = rng (1,20) (lfNoise1 'γ' AR 10)
+        x = sinOsc AR (fc + (sinOsc AR fm 0 * i * fm)) 0 * 0.5
+        rf = rng (1000,2000) (sinOsc AR (rng (0.1,1) (lfNoise1 'δ' AR 1)) 0)
+        rq = rng (0.5,10) (lfNoise1 'ε' AR 1)
+        a = rlpf x rf rq
+        ph = a * rng (1.0,4.0) (lfNoise1 'ζ' AR 0.1) * 4 * pi
+    in sinOsc AR 0.2 ph * 0.5
+
+main :: IO ()
+main = audition (out 0 k2ws)
diff --git a/Sound/SC3/Graph/MN_k2ws_hp.hs b/Sound/SC3/Graph/MN_k2ws_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/MN_k2ws_hp.hs
@@ -0,0 +1,19 @@
+-- https://www.listarc.bham.ac.uk/lists/sc-users/msg21341.html (mn)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.MN_k2ws_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+k2ws :: UId m => m UGen
+k2ws = do
+  let fc = 400 + range 100 200 #(lfNoise2 AR (mce2 1 2))
+  let fm = range 100 200 #(lfNoise0 AR 5)
+  let i = range 1 20 #(lfNoise1 AR 10)
+  let x = sinOsc AR (fc + (sinOsc AR fm 0 * i * fm)) 0 * 0.5
+  let rf = range 1000 2000 (sinOsc AR (range 0.1 1 #(lfNoise1 AR 1)) 0)
+  let rq = range 0.5 10 #(lfNoise1 AR 1)
+  let ph = rlpf x rf rq * range 1.0 4.0 #(lfNoise1 AR 0.1) * 4 * pi
+  return (sinOsc AR 0.2 ph * 0.5)
+
+main :: IO ()
+main = audition . out 0 =<< k2ws
diff --git a/Sound/SC3/Graph/NC_after_goeyvaerts.hs b/Sound/SC3/Graph/NC_after_goeyvaerts.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NC_after_goeyvaerts.hs
@@ -0,0 +1,367 @@
+-- after goeyvaerts, nick collins (nc), 2007
+module Sound.SC3.Graph.NC_after_goeyvaerts where
+
+import Control.Concurrent.MVar {- base -}
+import Data.List
+import Data.List.Split {- split -}
+import qualified Data.Map as M {- containers -}
+import Sound.OSC.FD {- hosc -}
+import Sound.SC3.ID.FD {- hsc3 -}
+import qualified Sound.SC3.Lang.Collection as C {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.Gen as R
+import System.Random {- random -}
+
+-- * SCHEMA
+
+-- | infinite monadic recursion
+mrec :: Monad m => (a -> m a) -> a -> m a
+mrec f i = f i >>= mrec f
+
+-- | monadic recursion with counter
+mrec_n :: Monad m => Int -> (a -> m a) -> a -> m a
+mrec_n n f i =
+    if n == 0
+    then return i
+    else f i >>= mrec_n (n - 1) f
+
+-- | recursion function useful for random processes (g = random state)
+r_chain :: (g -> (a,g)) -> g -> [a]
+r_chain f g =
+    let (r,g') = f g
+    in r : r_chain f g'
+
+r_chain_fb :: ((a,g) -> (a,g)) -> a -> g -> [a]
+r_chain_fb f r_ g_ =
+    let go (r,g) = let (r',g') = f (r,g) in r' : go (r',g')
+    in r_ : go (r_,g_)
+
+-- | an action that steps through a stored sequence
+l_step :: MVar [a] -> IO a
+l_step r =
+    let f [] = undefined
+        f (x:xs) = (xs,x)
+    in modifyMVar r (return . f)
+
+-- | generate a stepper action from a list
+l_stepper :: [a] -> IO (IO a)
+l_stepper l = do
+  r <- newMVar (cycle l)
+  return (l_step r)
+
+l_stepper_scramble :: [a] -> IO (IO a)
+l_stepper_scramble l = scrambleIO l >>= l_stepper
+
+{-
+a <- l_stepper [1..5]
+sequence (replicate 10 a)
+-}
+
+type SEL a b g = (a,g) -> (b,g)
+
+-- | a recursion schema where s chooses between a and b at each step
+sel_seq :: RandomGen g => SEL a Bool g->SEL a a g->SEL a a g->a->g->[a]
+sel_seq s a b j =
+    let step (i,g) =
+            let (r,g') = s (i,g)
+            in if r then a (i,g') else b (i,g')
+    in r_chain_fb step j
+
+-- | variant where s is a (coin' c) and a is (rrand'c r)
+sel_seq_c_rng :: (RandomGen g,Random a) => R -> (a,a) -> a -> g -> [a]
+sel_seq_c_rng c r i g =
+    let s = coin c . snd
+        a = rrandc r . snd
+    in sel_seq s a id i g
+
+-- | monadic if
+ifM :: Monad m => m Bool -> m b -> m b -> m b
+ifM i j k = do
+  i' <- i
+  if i' then j else k
+
+-- | coin at R
+coin :: (RandomGen g) => R -> g -> (Bool,g)
+coin = R.coin
+
+-- | 'coin' at R
+coinIO :: R -> IO Bool
+coinIO = getStdRandom . coin
+
+-- | 'R.wchoose'.
+wchoose :: RandomGen g => [a] -> [R] -> g -> (a,g)
+wchoose = R.wchoose
+
+-- | wchoose at R
+wchooseIO :: [a] -> [R] -> IO a
+wchooseIO l= getStdRandom . wchoose l
+
+-- | rrand with duple range
+rrandc :: (RandomGen g,Random n) => (n,n) -> g -> (n,g)
+rrandc = uncurry R.rrand
+
+scrambleIO :: [t] -> IO [t]
+scrambleIO = getStdRandom . R.scramble
+
+-- | set precision
+set_prec :: Int -> Double -> Double
+set_prec n x =
+    let n' = 10 ^ n
+        x' = round (x * n') :: Integer
+    in fromIntegral x' / n'
+
+-- * AFTER GOEYVAERTS
+
+nd :: UGen
+nd =
+    let freq = control KR "freq" 440
+        amp = control KR "amp" 0.1
+        sustain = control KR "sustain" 0.1
+        pan = control KR "pan" 0
+        s = let p = mix (lfPar AR (freq * mce [0.999,1.001]) 0 * amp)
+                l = [10000,2000,4000,1000]
+                t = [0.005,rand 'α' 0.009 0.05,0.005]
+                d = Envelope l t (replicate 3 EnvLin) Nothing Nothing
+            in lpf (distort p) (envGen KR 1 1 0 1 DoNothing d)
+        e = let l = [0,1,0.4,0.7,0]
+                t = [rand 'β' 0.001 0.005,0.005,0.005,sustain]
+                d = Envelope l t (replicate 4 EnvLin) Nothing Nothing
+            in envGen KR 1 1 0 1 RemoveSynth d
+    in out 0 (pan2 (s * e) pan 1)
+
+fx :: UGen
+fx = replaceOut 0 (freeVerb (in' 2 AR 0) 0.33 1.5 0.5)
+
+ag_init :: Transport t => t -> IO ()
+ag_init fd = do
+  _ <- async fd (d_recv (synthdef "nd" nd))
+  _ <- async fd (d_recv (synthdef "fx" fx))
+  send fd (s_new "fx" (-1) AddToHead 1 [])
+  return ()
+
+nd_msg :: Double -> Double -> Double -> Double -> Message
+nd_msg f a s p =
+    let nd_arg = [("freq",f),("amp",a),("sustain",s),("pan",p)]
+    in s_new "nd" (-1) AddToHead 1 nd_arg
+
+type R = Double
+type P = M.Map Int R
+type S = M.Map Int Int
+data AG = AG {note_row :: [Int]
+             ,amp_row :: IO R
+             ,sus_row :: IO R
+             ,pan_row :: IO R
+             ,ioi_row :: IO R
+             ,ioi_mult_seq :: IO R
+             ,base_note_seq :: IO Int
+             ,octaves_seq :: IO Int
+             ,selections :: S
+             ,probabilities :: P}
+
+selections' :: S
+selections' = M.fromList (map (\i -> (i,0)) [0..11])
+
+selections_incr :: Int -> S -> S
+selections_incr = M.adjust (+ 1)
+
+selections_step' :: RandomGen g => S -> g -> (S,g)
+selections_step' s g =
+    let (r,g') = coin 0.03 g
+    in (if r then selections' else s,g')
+
+selections_step :: S -> IO S
+selections_step s = ifM (coinIO 0.03) (return selections') (return s)
+
+note_set :: [Int]
+note_set = [0 .. 11]
+
+note_step' :: RandomGen g => [Int] -> P -> g -> (Int,g)
+note_step' n p = R.wchoose n (C.normalizeSum (M.elems p))
+
+note_step :: [Int] -> P -> IO Int
+note_step n = getStdRandom . note_step' n
+
+chord_n' :: RandomGen g => g -> [Int]
+chord_n' = r_chain (wchoose [1,2,3,4,5] [0.5,0.35,0.1,0.025,0.025])
+
+chord_n :: IO [Int]
+chord_n = fmap chord_n' newStdGen
+
+chord' :: RandomGen g => P -> S -> Int -> [Int] -> g -> (([P],[S],[Int]),g)
+chord' p_ s_ =
+    let go (pl,sl,zl) p s n nr g =
+            if n == 0
+            then ((reverse pl,reverse sl,reverse zl),g)
+            else let (z,g') = note_step' nr p g
+                     p' = probabilities_decr z p
+                     s' = selections_incr z s
+                 in go (p':pl,s':sl,z:zl) p' s' (n - 1) nr g'
+    in go ([p_],[s_],[]) p_ s_
+
+chord :: P -> S -> Int -> [Int] -> IO ([P],[S],[Int])
+chord p s n = getStdRandom . chord' p s n
+
+amp_set :: [R]
+amp_set = map (dbAmp . negate) [1,3 .. 36]
+
+sus_set :: [R]
+sus_set = map ((/ exp 1) . exp . (/ 37)) [1 .. 37]
+
+pan_set :: [R]
+pan_set = map ((+ (-1)) . (* 2) . (/ 31)) [1 .. 31]
+
+ioi_set :: [R]
+ioi_set = map ((12 **) . (/ 12)) [1..12]
+
+ioi_mult_set :: [R]
+ioi_mult_set = [0.01,0.025,0.05,0.1,0.2]
+
+ioi_mult_seq' :: RandomGen g => R -> g -> [R]
+ioi_mult_seq' i g =
+    let s = uncurry coin
+        a = R.choose ioi_mult_set . snd
+    in sel_seq s a id i g
+
+--ioi_mult_seq_ = getStdRandom . ioi_mult_seq
+
+octaves_rng :: (Int,Int)
+octaves_rng = (2,5)
+
+octaves_seq' :: RandomGen g => g -> [Int]
+octaves_seq' = sel_seq_c_rng 0.02 octaves_rng 4
+
+base_note_rng :: (Int,Int)
+base_note_rng = (35,47)
+
+base_note_seq' :: RandomGen g => g -> [Int]
+base_note_seq' = sel_seq_c_rng 0.01 base_note_rng 36
+
+probabilities' :: P
+probabilities' = M.fromList (map (\x -> (x,1)) [0..11])
+
+probabilities_incr :: P -> P
+probabilities_incr = M.map (\x -> if x < 0.9999 then x + 0.1 else x)
+
+probabilities_decr :: Int -> P -> P
+probabilities_decr z = M.insert z 0.1
+
+ag :: IO AG
+ag = do
+  a <- l_stepper_scramble amp_set
+  s <- l_stepper_scramble sus_set
+  p <- l_stepper_scramble pan_set
+  i <- l_stepper_scramble ioi_set
+  g <- newStdGen
+  m <- l_stepper (ioi_mult_seq' 0.1 g)
+  o <- l_stepper (octaves_seq' g)
+  b <- l_stepper (base_note_seq' g)
+  n <- scrambleIO note_set
+  return AG {note_row = n
+            ,amp_row = a
+            ,sus_row = s
+            ,pan_row = p
+            ,ioi_row = i
+            ,ioi_mult_seq = m
+            ,base_note_seq = b
+            ,octaves_seq = o
+            ,selections = selections'
+            ,probabilities = probabilities'}
+
+ag_note :: S -> Int -> Int -> Int -> Int
+ag_note s' z o b = ((s' M.! z) `mod` o) * 12 + b + z
+
+-- o,b,a,su,pn,i,im are lists
+-- p,s,z are nested lists
+ag_psz' :: RandomGen g => [Int] -> [Int] -> P -> S -> g -> [([P],[S],[Int])]
+ag_psz' nr cn p s g =
+    let (n:ns) = cn
+        ((p',s',c),g') = chord' p s n nr g
+        p'' = probabilities_incr (last p')
+        (s'',g'') = selections_step' (last s') g'
+    in (p',s',c) : ag_psz' nr ns p'' s'' g''
+
+ag_psz :: [Int] -> [Int] -> P -> S -> IO [([P], [S], [Int])]
+ag_psz nr cn p s = do
+  g <- newStdGen
+  return (ag_psz' nr cn p s g)
+
+{-
+let g = mkStdGen 0
+let cn = chord_n' g
+let t3_3 (_,_,x) = x
+take 12$ map t3_3$ ag_psz note_set cn probabilities' selections' g
+-}
+
+scramble_c :: [t] -> IO [t]
+scramble_c x = fmap cycle (scrambleIO x)
+
+type Score = ([([Int],[Int],[R],[R],[R],([P],[S],[Int]))],[R],[R])
+
+ag_score :: IO Score
+ag_score = do
+  a <- scramble_c amp_set
+  su <- scramble_c sus_set
+  pn <- scramble_c pan_set
+  i <- scramble_c ioi_set
+  g <- newStdGen
+  let m = ioi_mult_seq' 0.1 g
+      o = octaves_seq' g
+      b = base_note_seq' g
+  nr <- scrambleIO note_set
+  cn <- chord_n
+  let gr = splitPlaces (map (+ 1) cn)
+  psz <- ag_psz nr cn probabilities' selections'
+  return (zip6 (gr o) (gr b) (gr a) (gr su) (gr pn) psz,i,m)
+
+---ag_run_score (a,s,p,o,b,psz,i,m) =
+
+ag_run_note :: Transport t => t->Int->Int->R->R->R->(P,S,Int)->IO()
+ag_run_note fd o b a su pn (p,s,z) = do
+  let mn = ag_note s z o b
+  print ('γ',o,'δ',b)
+  print ('ε',map (set_prec 2) (M.elems p))
+  print ('ζ',M.elems s)
+  send fd (nd_msg (midiCPS (fromIntegral mn)) a su pn)
+
+ag_step :: Transport t => t -> AG -> IO AG
+ag_step fd r = do
+  let act (p,s,z) = do
+        o <- octaves_seq r
+        b <- base_note_seq r
+        a <- amp_row r
+        su <- sus_row r
+        pn <- pan_row r
+        ag_run_note fd o b a su pn (p,s,z)
+  (p',s') <- do let p = probabilities_incr (probabilities r)
+                s <- selections_step (selections r)
+                n <- wchooseIO [1,2,3,4,5] [0.5,0.35,0.1,0.025,0.025]
+                (p',s',c) <- chord p s n (note_row r)
+                mapM_ act (zip3 p' s' c)
+                return (last p',last s')
+  dt <- ioi_row r
+  i <- ioi_mult_seq r
+  wait (dt * i)
+  return (r {probabilities = p',selections = s'})
+
+ag_run :: Transport t => t -> Maybe Int -> IO ()
+ag_run fd i = do
+  r <- ag
+  ag_init fd
+  _ <- case i of
+         Just n -> mrec_n n (ag_step fd) r
+         Nothing -> mrec (ag_step fd) r
+  return ()
+
+main :: IO ()
+main = do
+  i <- randomRIO (256,512)
+  withSC3 (\fd -> ag_run fd (Just i) >> wait 9 >> reset fd)
+
+{-
+withSC3 ag_init
+withSC3 (\fd -> send fd (nd_msg 660 0.45 0.65 0))
+r <- ag
+withSC3 (\fd -> ag_step fd r)
+withSC3 (\fd -> ag_run fd (Just 32))
+withSC3 (\fd -> ag_run fd Nothing)
+withSC3 reset
+-}
diff --git a/Sound/SC3/Graph/NC_arpeggio.hs b/Sound/SC3/Graph/NC_arpeggio.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NC_arpeggio.hs
@@ -0,0 +1,87 @@
+-- http://www.listarc.bham.ac.uk/lists/sc-users/msg07473.html (nc)
+module Sound.SC3.Graph.NC_arpeggio where
+
+import Control.Monad {- base -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+analogarpeggio :: Synthdef
+analogarpeggio =
+    let k = control KR
+        o = k "out" 0
+        p = k "pan" 0
+        g = k "gate" 1
+        f = k "freq" 440
+        a = k "amp" 0.1
+        c = k "cutoffmult" 3
+        r = k "res" 0.1
+        e = let d = envADSR 0.01 0.3 0.5 1 1 (EnvNum (-4)) 0
+            in envGen AR g 1 0 1 RemoveSynth d
+        i = mix (saw AR (f * mce [0.497,0.999,1.0,2.03]))
+        s = bLowPass i (c * f) r * 0.25
+    in synthdef "analogarpeggio" (out o (pan2 (e * s * a) p 0.25))
+
+{-
+audition (pbind [(K_instr,psynth analogarpeggio)
+                ,(K_dur,pstutter 8 (pwrand 'α' [0.1,0.25] [2/3,1/3] inf))
+                ,(K_note,pwrand 'β' [0,2,4,5,7] [0.3,0.1,0.3,0.1,0.2] inf)
+                ,(K_octave,pstutter 4 (prand 'γ' [4,5,6,7] inf))
+                ,(K_param "pan",pbrown 'δ' (-1.0) 1.0 0.25 inf)
+                ,(K_amp,pbrown 'ε' 0.1 0.5 0.15 inf)
+                ,(K_param "cutoffmult",pbrown 'ζ' 4.0 5.0 0.1 inf)
+                ,(K_param "res",pbrown 'η' 0.0 1.0 0.25 inf)])
+-}
+
+-- > pinterp 3 0 9 == toP' [0,3,6]
+-- > pseries 6 ((15 - 3) / 6) 3 == toP' [6,8,10]
+pinterp :: (Fractional a) => Int -> a -> a -> P a
+pinterp n s e = pseries s ((e - s) / fromIntegral n) n
+
+pinterp' :: (Fractional a) => P Int -> P a -> P a -> P a
+pinterp' n s e = join (pzipWith3 pinterp n s e)
+
+arpeggio :: P_Bind
+arpeggio =
+    [(K_instr,psynth analogarpeggio)
+    ,(K_dur
+     ,let d = pwrand 'α' [0.25,0.125,0.0625] [0.4875,0.4875,0.025] inf
+      in pstutter 32 d)
+    ,(K_param "cutoffmult"
+     ,let n = prand 'β' [8,16,24,32] inf
+          s = pwhite 'γ' 2.5 5.0 inf
+          e = pwhite 'δ' 1.5 7.0 inf
+      in pinterp' n s e)
+    ,(K_param "res"
+     ,let n = prand 'ε' [8,16,24,32] inf
+          s = pexprand 'ζ' 0.02 0.5 inf
+          e = pexprand 'η' 0.02 1.0 inf
+      in pinterp' n s e)
+    ,(K_param "pan"
+     ,let n = prand 'θ' [8,16] inf
+          s = pwhite 'ι' (-1.0) 1.0 inf
+          s' = fmap (< 0) s
+          e = pif s' (pwhite 'κ' 0.0 1.0 inf) (pwhite 'λ' (-1.0) 0.0 inf)
+      in pinterp' n s e)
+    ,(K_amp
+     ,let n = prand 'μ' [8,16,24,32] inf
+          s = prand 'ν' [0.25,0.05,0.5] inf
+          e = prand 'ξ' [0.25,0.05,0.5,0.01] inf
+      in pinterp' n s e)
+    ,(K_note
+     ,let f x = pn (toP x) 8
+      in pseq (map f [[10,6,1,-2]
+                     ,[-3,1,6,9]
+                     ,[9,6,1,-3]
+                     ,[-2,1,6,10]
+                     ,[8,6,1,-4]
+                     ,[-3,1,6,9]
+                     ,[8,6,1,-3]
+                     ,[-6,1,6,8]]) inf)
+    ,(K_octave
+     ,pstutter 8 (pseq [7,6,5,4,4,5,6,7] inf))]
+
+main :: IO ()
+main = do
+  let n = 60/157
+      p = pedit K_dur (* n) (pbind arpeggio)
+  withSC3 (play p)
diff --git a/Sound/SC3/Graph/NC_ellipse_based_synthesis.hs b/Sound/SC3/Graph/NC_ellipse_based_synthesis.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NC_ellipse_based_synthesis.hs
@@ -0,0 +1,40 @@
+-- http://www.listarc.bham.ac.uk/lists/sc-users/msg09524.html (nc)
+module Sound.SC3.Graph.NC_ellipse_based_synthesis where
+
+import Sound.SC3 {- hsc3 -}
+
+ifU :: Num a => a -> a -> a -> a
+ifU t i j = (t * i) + ((1 - t) * j)
+
+ebs_nc :: UGen -> UGen -> UGen -> UGen
+ebs_nc wd fr sc =
+    let ph = phasor AR 0 (fr * 2 * pi * sampleDur) 0 (2 * pi) 0
+        sg = ifU ((ph `modE` (1.5 * pi)) >* (0.5 * pi)) (-1) 1
+    in cos (atan (wd + sc * tan ph)) * sg
+
+ebs_jr :: UGen -> UGen -> UGen -> UGen
+ebs_jr wd fr sc =
+    let ph = range 0 (2 * pi) (lfSaw AR fr 0)
+        sg = ifU ((ph `modE` (1.5 * pi)) >* (0.5 * pi)) (-1) 1
+    in cos (atan (wd + sc * tan ph)) * sg
+
+ebs_jmcc :: UGen -> UGen -> UGen -> UGen
+ebs_jmcc wd fr sc =
+    let ph = phasor AR 0 (fr * 2 * pi * sampleDur) 0 (2* pi) 0
+        sg = ifU ((ph `modE` (1.5 * pi)) >* (0.5 * pi)) (-1) 1
+    in cos (atan(wd + sc * tan ph)) * sg
+
+ctl :: (UGen -> UGen -> UGen -> t) -> t
+ctl f =
+    let fr = mouseY KR 4 444 Linear 0.1
+        sc = mouseX KR 0.1 1.0 Linear 0.1
+        wd = mouseR 'z' KR 0 2 Linear 0.1
+    in f wd fr sc
+
+main :: IO ()
+main = audition (out 0 (ctl ebs_jmcc))
+
+{-
+audition (out 0 (mce2 (ebs_nc 0 440 0.5) (ebs_jr 0 440 0.5)))
+audition (out 0 (mce2 (ebs_nc 0 440 0.5) (ebs_jmcc 0 440 0.5)))
+-}
diff --git a/Sound/SC3/Graph/NP_pebble_beach.hs b/Sound/SC3/Graph/NP_pebble_beach.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NP_pebble_beach.hs
@@ -0,0 +1,44 @@
+-- pebble beach (np)
+-- http://sccode.org/1-u
+-- requires 'scsynth -u 57110 -m 32768'
+module Sound.SC3.Graph.NP_pebble_beach where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+
+exprange :: UGen -> UGen -> UGen -> UGen
+exprange l r i = linExp i (-1) 1 l r
+
+bg_f :: UGen -> UGen
+bg_f k =
+    let sc = 0.4 + (k * 0.07)
+        fr = range 3100 4900 (lag (lfNoise0 'α' KR 21.8) 0.7) * sc
+        am = range 0 1 (lag (lfNoise1 'α' KR 5.227) 5.374)
+    in bpf (pinkNoise 'α' AR * 0.4) fr 0.1 * am
+
+fg_f :: UGen -> UGen -> UGen
+fg_f df tf =
+    let d = dust 'α' AR (df * rand 'α' 0.8 1.2) * 50
+        l = exprange 800 900 (sinOsc KR 2.2 0)
+        r = exprange 2600 2900 (sinOsc KR 5.228 0)
+        z = resonz d (tRand 'α' l r d) (tRand 'α' 0.03 0.08 d)
+        t = lagUD (range 2 0.5 (saw KR tf)) 0.6 2.8
+        o = z * t
+    in o + combL o 0.8 (rand 'α' 0.2 0.8) (lchoose 'α' [-4,4])
+
+pebble_beach' :: ID a => a -> UGen
+pebble_beach' j =
+    let bg' = let am = range 0 1 (lag (lfNoise0 'α' KR 34) 1.4)
+              in brownNoise 'α' AR * 0.06 * am
+        bg = bg' + sum (uprotect' j (map bg_f [0..19])) * 0.6
+        tf = range 0.122 0.24 (sinOsc KR 0.17 0)
+        df = exprange 1 700 (lfTri KR tf 0) * exprange 1 0.2 (lfTri KR tf 0)
+        fg = mix (uclone j 50 (fg_f df tf)) * 0.2
+    in (bg + fg) * line KR 0 1 1.2 DoNothing
+
+pebble_beach :: UGen
+pebble_beach = mce2 (pebble_beach' 'α') (pebble_beach' 'β')
+
+-- # UGens == 1994
+main :: IO ()
+main = audition (out 0 pebble_beach)
diff --git a/Sound/SC3/Graph/NV_nv_tw_1.hs b/Sound/SC3/Graph/NV_nv_tw_1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NV_nv_tw_1.hs
@@ -0,0 +1,17 @@
+-- http://sccode.org/1-V (nv)
+module Sound.SC3.Graph.NV_nv_tw_1 where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+
+nv_tw_1 :: UGen
+nv_tw_1 =
+    let a = uclone 'α' 2 (pinkNoise 'β' AR)
+        nd z =
+            let n = lfNoise1 'γ' KR (rand 'δ' 0 0.05)
+                f = linExp n (-1) 1 40 15000
+            in bBandStop z f (expRand 'ε' 0.1 2)
+    in lpf (useq 'ζ' 50 nd a) 1e5
+
+main :: IO ()
+main = audition (out 0 nv_tw_1)
diff --git a/Sound/SC3/Graph/NV_nv_tw_41.hs b/Sound/SC3/Graph/NV_nv_tw_41.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NV_nv_tw_41.hs
@@ -0,0 +1,17 @@
+-- http://sccode.org/1-V (nv)
+module Sound.SC3.Graph.NV_nv_tw_41 where
+
+import Sound.SC3.ID {- hsc3 -}
+
+nv_tw_41 :: UGen
+nv_tw_41 =
+    let nd i =
+            let t = (0.6 ** i) * 40 * impulse AR ((2 ** i) / 32) (1/2)
+                f = (4 ** lfNoise0 i KR (1/16)) * 300
+            in sin (rlpf t f 5e-3)
+        x = splay (mce (map nd [0..7])) 1 1 0 True
+        r u = let (p,q) = mce2c u in freeVerb2 p q 0.1 1 1
+    in r (r x)
+
+main :: IO ()
+main = audition (out 0 nv_tw_41)
diff --git a/Sound/SC3/Graph/NV_nv_tw_54.hs b/Sound/SC3/Graph/NV_nv_tw_54.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NV_nv_tw_54.hs
@@ -0,0 +1,32 @@
+-- http://sccode.org/1-V (nv)
+module Sound.SC3.Graph.NV_nv_tw_54 where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+fF :: Double -> Double -> Double
+fF i f =
+    let n = (((2 * i) `modE` 6 + 1) + floorE f) / (i `modE` 5 + 1)
+    in (f + log2 n) `modE` 2
+
+fS :: [Double]
+fS =
+    let lp i f = let f' = fF i f in f' : lp (i + 1) f'
+    in lp 0 0
+
+nvi :: Synthdef
+nvi =
+    let i = control KR "i" 0
+        f = control KR "f" 0
+        p = (i `modE` 8 + 2) * 52
+        e = line KR 0.1 0 1 RemoveSynth
+        o = syncSaw AR ((2 ** f) * 99 + mce2 0 1) p * e
+    in synthdef "nvi" (out 0 o)
+
+main :: IO ()
+main =
+    let fS' = map realToFrac fS
+    in audition (pbind [(K_instr,psynth nvi)
+                       ,(K_param "f",toP fS')
+                       ,(K_param "i",pseries 0 1 inf)
+                       ,(K_dur,0.3)])
diff --git a/Sound/SC3/Graph/PC_thx.hs b/Sound/SC3/Graph/PC_thx.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/PC_thx.hs
@@ -0,0 +1,47 @@
+-- http://ccrma-mail.stanford.edu/pipermail/stk/2007-January/000327.html (pc)
+module Sound.SC3.Graph.PC_thx where
+
+import Sound.SC3 {- hsc3 -}
+import System.Random {- random -}
+
+type R = Double
+
+rvb :: UGen -> R -> UGen
+rvb i rT =
+    let d = mce [0.0297,0.0371,0.0411,0.0437]
+        c = mix (combN i 0.05 d (constant rT) * 0.25)
+        f = (allpassN c 0.01 0.005 0.096835)
+    in allpassN f 0.01 0.0017 0.032924
+
+mk_env :: R -> R -> R -> R -> R -> R -> R -> EnvCurve -> UGen
+mk_env z0 t0 z1 t1 t2 z2 t3 c =
+    let z = map constant [z0,z1,z1,z2,z2]
+        t = map constant [t0,t1,t2,t3]
+        e = Envelope z t [c,c,c] Nothing Nothing
+    in envGen KR 1 1 0 1 RemoveSynth e
+
+mk_saw :: R -> R -> R -> UGen -> UGen
+mk_saw t4 f0 f1 l =
+    let f = mk_env f0 t0 f0 t1 t2 f1 (t3 + t4 + t5 + t5) EnvLin
+        g = mk_env 0 t0 0.1 (t1 + t2 + t3) t4 0.0 (t5 + t5) EnvLin
+        s = saw AR f
+        t0 = 0.035
+        t1 = 0.2267573696
+        t2 = 2.2675736061
+        t3 = 6.8027210884
+        t5 = 1.75
+    in pan2 s l g
+
+thx :: UGen
+thx =
+    let t4 = 7.9365079365
+        s = sum (zipWith3 (mk_saw t4) f0 f1 l)
+        n = 30
+        l = take n (randomRs (-1.0,1.0) (mkStdGen 1))
+        f = [29,87.5,116,175,233,350,524,880,1048,1760]
+        f0 = take n (randomRs (200.0,800.0) (mkStdGen 2))
+        f1 = take n (cycle f)
+    in rvb s t4
+
+main :: IO ()
+main = audition (out 0 thx)
diff --git a/Sound/SC3/Graph/PJ_forest_sounds_m.hs b/Sound/SC3/Graph/PJ_forest_sounds_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/PJ_forest_sounds_m.hs
@@ -0,0 +1,17 @@
+-- sc-users, 2007-04-06 (pj) [paul jones]
+module Sound.SC3.Graph.PJ_forest_sounds_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+insects :: UId m => m UGen
+insects = do
+  n1 <- brownNoise AR
+  n2 <- lfNoise2 KR 50
+  let o = sinOsc KR (n2 * 50 + 50) 0 * 100 + 2000
+  return (bpf n1 o 0.001 * 10)
+
+forest_sounds :: UId m => m UGen
+forest_sounds = clone 2 insects
+
+main :: IO ()
+main = audition . out 0 =<< forest_sounds
diff --git a/Sound/SC3/Graph/RB_hh_808.hs b/Sound/SC3/Graph/RB_hh_808.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RB_hh_808.hs
@@ -0,0 +1,32 @@
+-- hh-808 (rb)
+-- http://www.create.ucsb.edu/pipermail/sc-users/2007-August/036131.html
+module Sound.SC3.Graph.RB_hh_808 where
+
+import Sound.SC3 {- hsc3 -}
+
+hh_808 :: UGen
+hh_808 =
+  let time = 250
+      fr = [205.35,304.41,369.64,522.71,540.54,812.21]
+      env i j k = Envelope i j k Nothing Nothing
+      pulseEnv = let e = env [1.0,0.6] [time] [EnvNum (-0.5)]
+                 in envGen AR 1 1 0 (1/1000) DoNothing e
+      s = mix (lfPulse AR (mce (map (* 4.09) fr)) 0 0.5)
+      f = [\a -> ((a ==* 6.0) * 0.6) +
+                 ((a ==* 2.0) * 0.2) +
+                 ((a ==* 1.0) * 0.9)
+          ,\a -> (a * pulseEnv) + (mix (lfPulse AR (mce fr) 0 0.55)) * 0.9
+          ,\a -> rlpf a 7000 0.6
+          ,\a -> rhpf a 6800 1.5
+          ,\a -> rhpf a 6800 1.5
+          ,\a -> rhpf a 1200 1.5
+          ,\a -> a + freeVerb a 0.33 0.5 0.5
+          ,\a -> let c = map EnvNum [0,-0.5,0,-50]
+                     e = env [0,1,0.4,0,0] [2,time,50,500] c
+                 in a * envGen AR 1 1 0 (1/1000) RemoveSynth e
+          ,\a -> mce [a,delayN a 0.005 0.005]]
+  in foldl1 (flip (.)) f s * 2
+
+main :: IO ()
+main = audition (out 0 hh_808)
+
diff --git a/Sound/SC3/Graph/RD_adso.hs b/Sound/SC3/Graph/RD_adso.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_adso.hs
@@ -0,0 +1,45 @@
+-- adso (rd)
+module Sound.SC3.Graph.RD_adso where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+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)
+
+pattern :: Transport m => Int -> Double -> m ()
+pattern n t = do
+  z <- do l <- rrand 22 48
+          r <- rrand 54 122
+          sequence (replicate n (rrand l r))
+  send (b_setn1 0 0 z)
+  let rn i l r = do d <- nrrand n l r
+                    send (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 m => Int -> m ()
+run n = do
+  mapM_ (\i -> async (b_alloc i n 1)) [0..6]
+  _ <- play (out 0 (adso n))
+  mapM_ (pattern n) =<< nrrand 32 0.025 0.75
+  reset
+
+main :: IO ()
+main = withSC3 (run 24)
diff --git a/Sound/SC3/Graph/RD_bs_070705_m.hs b/Sound/SC3/Graph/RD_bs_070705_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_bs_070705_m.hs
@@ -0,0 +1,74 @@
+-- bs-070705 (rd)
+module Sound.SC3.Graph.RD_bs_070705_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+-- | One step in a bubble sort with specified /greater than/ function.
+bubble_p :: (a -> a -> Bool) -> [a] -> [a]
+bubble_p gt l =
+    case l of
+      e:f:g -> if e `gt` f
+               then f : bubble_p gt (e : g)
+               else e : bubble_p gt (f : g)
+      _ -> l
+
+-- | 'bubble_p' '>'.
+bubble :: (Ord a) => [a] -> [a]
+bubble = bubble_p (>)
+
+-- | One step in /odd even/ sorting, a bubble sort variant.
+odd_even :: (Ord a) => [a] -> [a]
+odd_even = reverse . bubble_p (<) . reverse . bubble_p (>)
+
+-- | Allocate required buffers to /n/ places.
+alloc_data :: Transport m => Int -> m ()
+alloc_data n = do
+  let alloc m b = async (b_alloc b m 1)
+  mapM_ (alloc n) [10, 11, 12]
+
+-- | Simple synthesis renderer, r is the impulse frequency (trigger rate).
+play_data :: (UId m,Transport m) => UGen -> m ()
+play_data r = do
+  let inf_sc = 9e8
+  phase <- dseries inf_sc 0 1
+  f' <- dbufrd 10 phase Loop
+  a' <- dbufrd 11 phase Loop
+  p' <- dbufrd 12 phase Loop
+  let tr = impulse AR r 0
+      f'' = demand tr 0 f'
+      a'' = demand tr 0 a'
+      p'' = demand tr 0 p'
+  play (out 0 (pan2 (ringz tr (midiCPS f'') 0.2) p'' a''))
+
+-- | Randomize initial data of /n/ places, /s/ sort for
+--   /m/ steps, pause for i seconds between each step.
+run_data :: Transport m => ([Double] -> [Double]) -> Int -> Int -> Double -> m ()
+run_data s n m i = do
+  f <- nrrand n 32 96
+  a <- nrrand n 0.25 1
+  p <- nrrand n (-1) 1
+  let prepare l' = take m (iterate s l')
+      f' = prepare f
+      a' = prepare a
+      p' = prepare p
+      l i' (f'', a'', p'') = do
+                     send (b_setn 10 [(0, f'')])
+                     send (b_setn 11 [(0, a'')])
+                     send (b_setn 12 [(0, p'')])
+                     pauseThread i'
+  mapM_ (l i) (zip3 f' a' p')
+
+-- | Run 'odd_even' for 32 iterations at 1 second intervals.
+main :: IO ()
+main = withSC3 (alloc_data 96 >> play_data 24 >> run_data odd_even 96 32 1)
+
+{--
+withSC3 (alloc_data 96)
+withSC3 (play_data 24 >> run_data odd_even 96 96 0.35)
+withSC3 (play_data 24 >> run_data bubble 96 64 0.75)
+withSC3 (play_data 24 >> run_data bubble 96 64 0.25)
+withSC3 (play_data 24 >> run_data bubble 96 32 0.25)
+withSC3 (play_data 24 >> run_data odd_even 96 16 0.25)
+--}
diff --git a/Sound/SC3/Graph/RD_ccomb_m.hs b/Sound/SC3/Graph/RD_ccomb_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_ccomb_m.hs
@@ -0,0 +1,22 @@
+-- ccomb (rd)
+module Sound.SC3.Graph.RD_ccomb_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+ccomb :: (Functor m,UId m) => m UGen
+ccomb = do
+  let rng l r i = linLin i (-1) 1 l r
+      lwr = 48
+      flwr = midiCPS lwr
+      spart t = do n <- fmap (rng lwr 72.0) (lfNoise2 KR 0.1)
+                   e <- fmap (decay2 t 0.01) (tRand 0.05 0.75 t)
+                   x <- fmap (* e) (whiteNoise AR)
+                   m <- lfNoise2 KR 0.1
+                   let f = lag (midiCPS n) 0.25
+                       m' = rng 1 8 m
+                   return (combC x (recip flwr) (recip f) m')
+  t <- dust KR (mce2 0.75 0.35)
+  return . (* 0.1) . sum =<< sequence (replicate 12 (spart t))
+
+main :: IO ()
+main = audition . out 0 =<< ccomb
diff --git a/Sound/SC3/Graph/RD_cds_070701_m.hs b/Sound/SC3/Graph/RD_cds_070701_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_cds_070701_m.hs
@@ -0,0 +1,112 @@
+-- | cds-070701 (rd)
+--
+-- The 'source' data are breakpoint sets normalized over the time
+-- interval (0,1).  There are a fixed number of 'locations' per cycle.
+-- The data sets are sampled at these locations and loaded into
+-- buffers.  The buffers are read using dbufrd.  One of the data sets
+-- gives the time interval to step forward.
+module Sound.SC3.Graph.RD_cds_070701_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+-- | Real
+type R = Double
+
+-- | Point
+type P = (R,R)
+
+-- | Data set
+type D = [P]
+
+-- | Points that bracket a time.
+pts :: D -> R -> (P,P)
+pts d n =
+    case d of
+      p0:p1:r -> let (t,_) = p1
+                 in if n <= t
+                    then (p0,p1)
+                    else pts (p1:r) n
+      _ -> error "pts"
+
+-- | Linear interpolation.
+--
+-- > lerp 0.5 (0,0) (1,1) == (0.5,0.5)
+-- > lerp 0.25 (0,0) (0.5,1) == (0.25,0.5)
+lerp :: R -> P -> P -> P
+lerp n (t0,d0) (t1,d1) =
+  let n' = (n - t0) / (t1 - t0)
+      f i = d0 + ((d1 - d0) * i)
+  in (n,f n')
+
+-- | Linear interpolating lookup.
+lerpd :: D -> R -> P
+lerpd t n =
+  let (p0,p1) = pts t n
+  in lerp n p0 p1
+
+-- | Linearize in time (ie. /t/ is in equal steps).
+rescale :: D -> Int -> D
+rescale t n = map (lerpd t) [0,1 / fromIntegral n .. 1]
+
+-- | Allocate data buffers for linearized envelopes.
+alloc_data :: Int -> IO ()
+alloc_data n = do
+  let alloc b = async (b_alloc b n 1)
+  withSC3 (mapM_ alloc [10,11,12,13])
+
+-- | Data can be loaded while nodes are running, ie. edited online.
+load_data :: Int -> (D,D,D,D) -> IO ()
+load_data n (t,f,a,p) = do
+  let setup d = map snd (rescale d n)
+  withSC3 (do send (b_setn 10 [(0,setup t)])
+              send (b_setn 11 [(0,setup f)])
+              send (b_setn 12 [(0,setup a)])
+              send (b_setn 13 [(0,setup p)]))
+
+-- | Simple synthesis of data.
+play_data :: IO ()
+play_data = do
+  let inf_sc = 9e8
+  phase <- dseries inf_sc 0 1
+  t' <- dbufrd 10 phase Loop
+  f' <- dbufrd 11 phase Loop
+  a' <- dbufrd 12 phase Loop
+  p' <- dbufrd 13 phase Loop
+  let tr = tDuty AR t' 0 DoNothing 1 0
+      f'' = demand tr 0 f'
+      a'' = demand tr 0 a'
+      p'' = demand tr 0 p'
+  audition (out 0 (pan2 (ringz tr f'' 0.2) p'' a''))
+
+-- | Sample data sets, load using 'load_data'.
+data_1 :: (D,D,D,D)
+data_1 = ([(0,0.1),(0.65,0.025),(1,0.1)]
+         ,[(0,200),(0.35,8900),(1,200)]
+         ,[(0,0.35),(0.65,0.65),(1,0.35)]
+         ,[(0,-1),(0.3,1),(1,-1)])
+
+data_2 :: (D,D,D,D)
+data_2 = ([(0,0.1),(0.5,0.005),(1,0.1)]
+         ,[(0,100),(0.5,13900),(1,200)]
+         ,[(0,0.75),(0.5,0.25),(1,0.75)]
+         ,[(0,1),(0.5,-1),(1,1)])
+
+data_3 :: (D,D,D,D)
+data_3 = ([(0,0.01),(0.5,0.25),(1,0.01)]
+         ,[(0,770),(0.5,77),(1,770)]
+         ,[(0,0.9),(0.5,0.6),(1,0.9)]
+         ,[(0,0),(0.5,1),(1,0)])
+
+-- | Switch between data sets at /dd/ at time interval /t/.
+data_switch :: [(D,D,D,D)] -> R -> IO ()
+data_switch dd t =
+    let w d = load_data 64 d >> pauseThread t
+    in mapM_ w dd >> data_switch dd t
+
+main :: IO ()
+main = do
+  alloc_data 64
+  load_data 64 data_1
+  play_data
+  data_switch [data_1,data_2,data_3] 4
diff --git a/Sound/SC3/Graph/RD_chrd_m.hs b/Sound/SC3/Graph/RD_chrd_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_chrd_m.hs
@@ -0,0 +1,26 @@
+-- chrd (rd)
+module Sound.SC3.Graph.RD_chrd_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+chrd :: UId m => m UGen
+chrd = do
+  r0 <- rand 0.05 0.5
+  [r1, r2] <- sequence (replicate 2 (rand (-1) 1))
+  r3 <- rand 0.15 0.35
+  r4 <- rand 0.005 0.01
+  let m = mce [60, 65, 72, 77, 79, 84]
+      ds = 3
+      d = mce (map (* ds) [5, 4, 5, 7, 4, 5])
+      f = midiCPS (xLine KR m (m + r0) d DoNothing)
+      z = envTrapezoid 0 r3 d r4
+      e = envGen KR 1 1 0 1 DoNothing z
+      p = xLine KR r1 r2 d DoNothing
+      o = fSinOsc AR f 0
+  return (mix (pan2 o p e))
+
+chrd9 :: UId m => m UGen
+chrd9 = fmap mix (clone 9 chrd)
+
+main :: IO ()
+main = audition . out 0 =<< chrd9
diff --git a/Sound/SC3/Graph/RD_chrd_t.hs b/Sound/SC3/Graph/RD_chrd_t.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_chrd_t.hs
@@ -0,0 +1,37 @@
+-- chrd-t (rd)
+module Sound.SC3.Graph.RD_chrd_t where
+
+import Control.Monad {- base -}
+import Control.Monad.Random {- MonadRandom -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Lang.Random.Monad
+
+chrd :: RandomGen g => [Int] -> Double -> Rand g UGen
+chrd ch ds = do
+  r0 <- rrand 0.05 0.5
+  r1 <- rrand (-1) 1
+  r2 <- rrand (-1) 1
+  r3 <- rrand 0.15 0.35
+  r4 <- rrand 0.005 0.01
+  let m = mce (map fromIntegral ch)
+      d = mce (map (* constant ds) [5, 4, 5, 7, 4, 5])
+      f = midiCPS (xLine KR m (m + r0) d DoNothing)
+      z = envTrapezoid 0 r3 d r4
+      e = envGen KR 1 1 0 1 DoNothing z
+      p = xLine KR r1 r2 d DoNothing
+      o = fSinOsc AR f 0
+  return (mix (pan2 o p e))
+
+chrdN :: RandomGen g => Int -> Int -> Double -> Rand g UGen
+chrdN i j ds = do
+  let scale = [0,2,4,5,7,9,11]
+      octaves = [4,5,6,7]
+  ch <- nchoose i [n + (o * 12) | n <- scale, o <- octaves]
+  c <- replicateM j (chrd ch ds)
+  return (sum c)
+
+main :: IO ()
+main = do
+  g <- getStdGen
+  overlapTextureS (21,0,3,maxBound) (runRand (chrdN 6 9 3)) g
diff --git a/Sound/SC3/Graph/RD_cricket_m.hs b/Sound/SC3/Graph/RD_cricket_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_cricket_m.hs
@@ -0,0 +1,23 @@
+-- cricket (rd)
+module Sound.SC3.Graph.RD_cricket_m where
+
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+cricket :: UId m => m UGen
+cricket = do
+  r1 <- clone 2 (rand 10 13)
+  r2 <- clone 2 (rand 10 13)
+  r3 <- clone 2 (rand 4 7)
+  let t = impulse KR 0.7 0
+      e = decay2 (impulse KR r1 0) 0.001 0.005
+      f = sinOsc KR r2 0 * e * r3
+  r4 <- clone 2 (tRand 2130 2230 t)
+  return (sinOsc AR r4 0 * f * 0.25)
+
+main :: IO ()
+main = overlapTextureU (7,2,3,maxBound) =<< cricket
+
+{-
+audition . out 0 =<< cricket
+-}
diff --git a/Sound/SC3/Graph/RD_crotale.hs b/Sound/SC3/Graph/RD_crotale.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_crotale.hs
@@ -0,0 +1,177 @@
+-- crotale (rd)
+module Sound.SC3.Graph.RD_crotale where
+
+import Sound.SC3.ID {- hsc3 -}
+
+crotale :: UGen
+crotale =
+    let (cf,ca,cd) = crotale_data
+        ps = mce [-12,-5,0,2,4,5,7,12]
+        n = pinkNoise 'α' AR
+        t = dust 'β' KR 3
+        fs = select (tIRand 'γ' 0 7 t) ps
+        g = tRand 'δ' 0 1 t
+        fo = tRand 'ε' 0 1 t
+        ds = tRand 'ζ' 2 7 t
+        p = tRand 'η' (-1) 1 t
+        s = decay2 t 0.06 0.01 * n * g
+        ks = klankSpec' cf ca (map recip cd)
+        k = dynKlank s (midiRatio fs) fo ds ks
+    in pan2 k p 1
+
+main :: IO ()
+main = audition (out 0 crotale)
+
+crotale_data :: ([Double],[Double],[Double])
+crotale_data =
+    ([35.45676040649414
+     ,128.59849548339844
+     ,346.9721984863281
+     ,483.5544128417969
+     ,1049.2449951171875
+     ,1564.0279541015625
+     ,1756.3399658203125
+     ,3391.666015625
+     ,3451.802001953125
+     ,3497.261962890625
+     ,3596.89794921875
+     ,3696.739013671875
+     ,3835.235107421875
+     ,3845.955078125
+     ,4254.85107421875
+     ,4407.533203125
+     ,4415.26416015625
+     ,4552.865234375
+     ,5538.076171875
+     ,5637.73681640625
+     ,5690.2978515625
+     ,5728.0068359375
+     ,5764.27685546875
+     ,5824.4189453125
+     ,6377.60498046875
+     ,6544.35009765625
+     ,6807.14404296875
+     ,6994.97021484375
+     ,7026.84619140625
+     ,7144.5859375
+     ,7269.61279296875
+     ,7393.6708984375
+     ,7897.259765625
+     ,8040.4580078125
+     ,8157.77099609375
+     ,8225.01953125
+     ,9126.150390625
+     ,9488.529296875
+     ,9916.408203125
+     ,10155.599609375
+     ,11715.9599609375
+     ,12111.830078125
+     ,12339.990234375
+     ,12417.669921875
+     ,12459.2802734375
+     ,12618.330078125
+     ,13116.490234375
+     ,13201.1298828125
+     ,13297.830078125
+     ,13533.75]
+    ,[0.0012827360769733787
+     ,0.0008040848188102245
+     ,0.017361238598823547
+     ,0.004835359752178192
+     ,0.004413491114974022
+     ,0.004110544919967651
+     ,0.0003338181704748422
+     ,0.0036140112206339836
+     ,0.006919348146766424
+     ,0.0003224937245249748
+     ,0.0006031467346474528
+     ,0.06686479598283768
+     ,0.000605064386036247
+     ,0.003602313343435526
+     ,0.0002835785271599889
+     ,0.015243238769471645
+     ,0.020536603406071663
+     ,0.016677580773830414
+     ,0.0009245267719961703
+     ,0.20205098390579224
+     ,0.0012542791664600372
+     ,0.012705927714705467
+     ,0.0002523190632928163
+     ,0.0004866079252678901
+     ,0.0006429700297303498
+     ,0.0007763264584355056
+     ,0.2081160992383957
+     ,0.0024918108247220516
+     ,0.00193469924852252
+     ,0.005231771152466536
+     ,0.0069242212921381
+     ,0.001203975174576044
+     ,0.2050020843744278
+     ,0.04060448706150055
+     ,0.0038344631902873516
+     ,0.002189427148550749
+     ,0.18056060373783112
+     ,0.002192433224990964
+     ,0.006516554858535528
+     ,0.009982921183109283
+     ,0.004745401442050934
+     ,0.046154771000146866
+     ,0.000510294979903847
+     ,0.0018905038014054298
+     ,0.0019782145973294973
+     ,0.006729386281222105
+     ,0.0023426134139299393
+     ,0.0024002245627343655
+     ,0.03515550494194031
+     ,0.0014084168942645192]
+    ,[5.203680992126465
+     ,1.7034343481063843
+     ,40.16516876220703
+     ,27.282501220703125
+     ,0.8950523138046265
+     ,42.84742736816406
+     ,2.6603667736053467
+     ,15.7678861618042
+     ,6.848367214202881
+     ,3.2325007915496826
+     ,1.7343382835388184
+     ,2.0202419757843018
+     ,4.7279052734375
+     ,9.400103569030762
+     ,0.7102512717247009
+     ,37.494625091552734
+     ,36.24879455566406
+     ,29.172658920288086
+     ,3.891019344329834
+     ,4.757885456085205
+     ,3.851426124572754
+     ,20.90781021118164
+     ,3.732874870300293
+     ,2.3834102153778076
+     ,10.443285942077637
+     ,8.795611381530762
+     ,20.98564338684082
+     ,18.01180076599121
+     ,25.297883987426758
+     ,14.819819450378418
+     ,42.39189910888672
+     ,2.9485135078430176
+     ,11.043763160705566
+     ,49.55165100097656
+     ,29.882694244384766
+     ,10.527188301086426
+     ,23.5572452545166
+     ,26.55561637878418
+     ,45.099605560302734
+     ,22.550390243530273
+     ,36.46126174926758
+     ,11.826201438903809
+     ,16.818185806274414
+     ,14.903121948242188
+     ,32.81113815307617
+     ,43.1389045715332
+     ,12.289558410644531
+     ,11.498942375183105
+     ,10.465788841247559
+     ,24.93169593811035])
+
diff --git a/Sound/SC3/Graph/RD_crotale_sine.hs b/Sound/SC3/Graph/RD_crotale_sine.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_crotale_sine.hs
@@ -0,0 +1,138 @@
+-- crotale-sine (rd)
+module Sound.SC3.Graph.RD_crotale_sine where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+crotale_sine :: UGen
+crotale_sine =
+    let (cf,ca) = crotale_data
+        g = control KR "gate" 1
+        m = control KR "m" 1
+        e = let p = envASR 1 1 1 (EnvNum (-4))
+            in envGen KR g 1 0 1 RemoveSynth p
+        fn m' f' a' =
+            let f = constant f'
+                a = constant a'
+                r0 = rand (f+0) 0 (2 * pi)
+                r1 = rand (f+1) 0.1 0.3
+                r2 = rand (f+2) 0.025 0.1
+                r3 = rand (f+3) 0 (2 * pi)
+                o = sinOsc AR (f * midiRatio (m' - 12)) r0
+                e' = e * sinOsc KR r1 0 * a
+            in pan2 o (sinOsc KR r2 r3) e'
+    in sum (zipWith (fn m) cf ca) * 0.1
+
+pattern :: P_Bind
+pattern =
+    [(K_param "m",pwhitei 'α' 0 12 inf)
+    ,(K_dur,pxrand 'β' [1,2,3] inf)
+    ,(K_sustain,6)]
+
+main :: IO ()
+main = do
+  let s = synthdef "crotale-sine" (out 0 crotale_sine)
+  audition (p_with (K_instr,psynth s) (pbind pattern))
+
+crotale_data :: ([Double],[Double])
+crotale_data =
+    ([35.45676040649414
+     ,128.59849548339844
+     ,346.9721984863281
+     ,483.5544128417969
+     ,1049.2449951171875
+     ,1564.0279541015625
+     ,1756.3399658203125
+     ,3391.666015625
+     ,3451.802001953125
+     ,3497.261962890625
+     ,3596.89794921875
+     ,3696.739013671875
+     ,3835.235107421875
+     ,3845.955078125
+     ,4254.85107421875
+     ,4407.533203125
+     ,4415.26416015625
+     ,4552.865234375
+     ,5538.076171875
+     ,5637.73681640625
+     ,5690.2978515625
+     ,5728.0068359375
+     ,5764.27685546875
+     ,5824.4189453125
+     ,6377.60498046875
+     ,6544.35009765625
+     ,6807.14404296875
+     ,6994.97021484375
+     ,7026.84619140625
+     ,7144.5859375
+     ,7269.61279296875
+     ,7393.6708984375
+     ,7897.259765625
+     ,8040.4580078125
+     ,8157.77099609375
+     ,8225.01953125
+     ,9126.150390625
+     ,9488.529296875
+     ,9916.408203125
+     ,10155.599609375
+     ,11715.9599609375
+     ,12111.830078125
+     ,12339.990234375
+     ,12417.669921875
+     ,12459.2802734375
+     ,12618.330078125
+     ,13116.490234375
+     ,13201.1298828125
+     ,13297.830078125
+     ,13533.75]
+    ,[0.0012827360769733787
+     ,0.0008040848188102245
+     ,0.017361238598823547
+     ,0.004835359752178192
+     ,0.004413491114974022
+     ,0.004110544919967651
+     ,0.0003338181704748422
+     ,0.0036140112206339836
+     ,0.006919348146766424
+     ,0.0003224937245249748
+     ,0.0006031467346474528
+     ,0.06686479598283768
+     ,0.000605064386036247
+     ,0.003602313343435526
+     ,0.0002835785271599889
+     ,0.015243238769471645
+     ,0.020536603406071663
+     ,0.016677580773830414
+     ,0.0009245267719961703
+     ,0.20205098390579224
+     ,0.0012542791664600372
+     ,0.012705927714705467
+     ,0.0002523190632928163
+     ,0.0004866079252678901
+     ,0.0006429700297303498
+     ,0.0007763264584355056
+     ,0.2081160992383957
+     ,0.0024918108247220516
+     ,0.00193469924852252
+     ,0.005231771152466536
+     ,0.0069242212921381
+     ,0.001203975174576044
+     ,0.2050020843744278
+     ,0.04060448706150055
+     ,0.0038344631902873516
+     ,0.002189427148550749
+     ,0.18056060373783112
+     ,0.002192433224990964
+     ,0.006516554858535528
+     ,0.009982921183109283
+     ,0.004745401442050934
+     ,0.046154771000146866
+     ,0.000510294979903847
+     ,0.0018905038014054298
+     ,0.0019782145973294973
+     ,0.006729386281222105
+     ,0.0023426134139299393
+     ,0.0024002245627343655
+     ,0.03515550494194031
+     ,0.0014084168942645192])
diff --git a/Sound/SC3/Graph/RD_cut_outs_m.hs b/Sound/SC3/Graph/RD_cut_outs_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_cut_outs_m.hs
@@ -0,0 +1,20 @@
+-- cut-outs (rd)
+module Sound.SC3.Graph.RD_cut_outs_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+cut_outs :: (Functor m,UId m) => m UGen
+cut_outs = do
+  let t = impulse AR 22 0 * (sinOsc KR 0.5 0 + 1)
+      x = mouseX KR 0.005 0.12 Exponential 0.1
+      y = mouseY KR 0.01 0.52 Exponential 0.1
+      n = do n1 <- lfNoise0 KR 2
+             n2 <- coinGate (0.05 + n1 + y * 0.4 + t * 0.5) (t * 0.5)
+             n3 <- tExpRand (mce2 500 900) 1600 t
+             return (ringz n2 n3 x)
+  s <- fmap sum (sequence (replicate 3 n))
+  b <- tRand 0 1 =<< dust KR 8
+  return (mrg [clip2 s (in' 1 KR 0) * 0.25,out 0 b])
+
+main :: IO ()
+main = audition . out 0 =<< cut_outs
diff --git a/Sound/SC3/Graph/RD_diffraction_m.hs b/Sound/SC3/Graph/RD_diffraction_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_diffraction_m.hs
@@ -0,0 +1,29 @@
+-- diffraction (rd)
+module Sound.SC3.Graph.RD_diffraction_m where
+
+import Control.Monad {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+
+diffraction ::(Functor m,UId m) => m UGen
+diffraction = do
+  let p = do let x = mouseX KR 0.001 0.02 Exponential 0.1
+                 y = mouseY KR 120 400 Exponential 0.1
+             f <- fmap (* mce2 32 64) (lfNoise0 KR 4)
+             w <- fmap (* x) (lfNoise0 KR 32)
+             z <- fmap (* 0.1) (lfNoise0 KR 2)
+             m <- lfNoise0 KR 6
+             let s = pulse AR f w
+             return (resonz s (y + z) (m * 0.4 + 0.8) * 0.5)
+      q = do n <- lfNoise0 KR 128
+             s <- p
+             return (combN s 0.2 (n * 0.1 + 0.1) 3)
+      r = let x = mouseX KR 0.75 1.25 Exponential 0.1
+              y = mouseY KR 0.25 1 Exponential 0.1
+              f _ = do fr <- fmap (* x) (rand 50 59)
+                       am <- fmap (* y) (rand 0.04 0.16)
+                       return (sinOsc AR fr 0 * am)
+          in liftM2 mce2 (mixFillM 16 f) (mixFillM 12 f)
+  fmap sum (sequence [p,q,r])
+
+main :: IO ()
+main = audition . out 0 =<< diffraction
diff --git a/Sound/SC3/Graph/RD_discretion.hs b/Sound/SC3/Graph/RD_discretion.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_discretion.hs
@@ -0,0 +1,22 @@
+-- discretion (rd)
+module Sound.SC3.Graph.RD_discretion where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+
+discretion :: UGen
+discretion =
+  let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
+      part = let f1 = randN 2 'α' 50 55
+                 f2 = randN 2 'β' 50 65
+                 f3 = randN 2 'γ' 50 55
+                 a = randN 2 'δ' 0.01 0.035
+                 t = 21
+                 f_ = mkls [(0,f1),(0.33,f2),(1,f3)] t
+                 a_ = mkls [(0,0),(0.33,a),(1,0)] t
+             in (saw AR f_ * a_)
+  in mix (uclone 'ε' 8 part)
+
+main :: IO ()
+main = audition (out 0 discretion)
diff --git a/Sound/SC3/Graph/RD_discretion_m.hs b/Sound/SC3/Graph/RD_discretion_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_discretion_m.hs
@@ -0,0 +1,20 @@
+-- discretion-m (rd)
+module Sound.SC3.Graph.RD_discretion_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+discretion :: UId m => m UGen
+discretion = do
+  let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
+      part = do f1 <- clone 2 (rand 50 55)
+                f2 <- clone 2 (rand 50 65)
+                f3 <- clone 2 (rand 50 55)
+                a <- clone 2 (rand 0.01 0.035)
+                let t = 21
+                    f_ = mkls [(0,f1),(0.33,f2),(1,f3)] t
+                    a_ = mkls [(0,0),(0.33,a),(1,0)] t
+                return (saw AR f_ * a_)
+  fmap mix (clone 8 part)
+
+main :: IO ()
+main = audition . out 0 =<< discretion
diff --git a/Sound/SC3/Graph/RD_e_lamell.hs b/Sound/SC3/Graph/RD_e_lamell.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_e_lamell.hs
@@ -0,0 +1,64 @@
+-- e-lamell (rd)
+module Sound.SC3.Graph.RD_e_lamell where
+
+import Control.Monad
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import qualified Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
+
+e_lamell :: UGen
+e_lamell =
+    let ctl = control KR
+        f = ctl "f" 440
+        n = ctl "n" 12
+        d = ctl "d" 0.1
+        l = ctl "l" 0
+        a = ctl "a" 1
+        t = lchoose 'α' [1,32]
+        h = line AR n t d DoNothing
+        s = blip AR f h
+        e_d = envPerc 0.005 d
+        e = envGen AR 1 a 0 1 RemoveSynth e_d
+    in pan2 s l e
+
+sendSynth :: Transport m => String -> UGen -> m Message
+sendSynth n u = async (d_recv (synthdef n u))
+
+mk_s_new :: Double -> Double -> Double -> Double -> Double -> Message
+mk_s_new f n d a l =
+    let p = [("f",f)
+            ,("n",n)
+            ,("d",d)
+            ,("a",a)
+            ,("l",l)]
+    in s_new "blip" (-1) AddToTail 1 p
+
+pattern :: Transport m => m ()
+pattern = do
+  let r_note o p = do oe <- R.choose o
+                      pe <- R.choose p
+                      return (oe * 12 + pe)
+      l_sel = r_note [2,3] [0]
+      h_sel = r_note [2,3,4,5] [0,2,5,7]
+  p <- do f <- liftM midiCPS l_sel
+          n <- R.rrand 2 36
+          d <- R.exprand 0.01 0.8
+          a <- R.rrand 0 0.75
+          l <- R.rrand (-1) 1
+          return (mk_s_new f n d a l)
+  q <- do f <- liftM midiCPS h_sel
+          n <- R.rrand 2 36
+          d <- R.exprand 0.01 1.2
+          a <- R.choose [0,0.25,0.5,1]
+          l <- R.rrand (-1) 1
+          return (mk_s_new f n d a l)
+  sendBundle (bundle immediately [p,q])
+  wait 0.1
+
+run :: Transport m => m ()
+run = do
+  _ <- sendSynth "blip" (out 0 e_lamell)
+  replicateM_ 64 pattern
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/RD_e_lamell_p.hs b/Sound/SC3/Graph/RD_e_lamell_p.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_e_lamell_p.hs
@@ -0,0 +1,43 @@
+-- e-lamell-p (rd)
+module Sound.SC3.Graph.RD_e_lamell_p where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+e_lamell :: UGen
+e_lamell =
+    let ctl = control KR
+        f = ctl "freq" 440
+        a = ctl "amp" 1
+        d = ctl "d" 0.1
+        n = ctl "n" 12
+        l = ctl "l" 0
+        t = lchoose 'α' [1,32]
+        h = line AR n t d DoNothing
+        s = blip AR f h
+        e_d = envPerc 0.005 d
+        e = envGen AR 1 a 0 1 RemoveSynth e_d
+    in pan2 s l e
+
+patterns :: [P_Bind]
+patterns =
+    let i = psynth (synthdef "e-lamell" (out 0 e_lamell))
+    in [[(K_instr,i)
+        ,(K_note,prand 'β' [0,2,5,7] inf)
+        ,(K_octave,pwrand 'γ' [2,3,4,5] [0.2,0.35,0.35,0.1] inf)
+        ,(K_dur,0.1)
+        ,(K_param "d",pwhite 'δ' 0.01 0.8 inf)
+        ,(K_amp,pwhite 'ε' 0 0.75 inf)
+        ,(K_param "n",pwhite 'ζ' 2 36 inf)
+        ,(K_param "l",pwhite 'η' (-1) 1 inf)]
+       ,[(K_instr,i)
+        ,(K_note,prand 'θ' [0] inf)
+        ,(K_octave,prand 'ι' [2,3] inf)
+        ,(K_dur,0.1)
+        ,(K_param "d",pwhite 'κ' 0.01 1.2 inf)
+        ,(K_amp,prand 'λ' [0,0.25,0.5,1] inf)
+        ,(K_param "n",pwhite 'μ' 2 36 inf)
+        ,(K_param "l",pwhite 'ν' (-1) 1 inf)]]
+
+main :: IO ()
+main = audition (ppar (map pbind patterns))
diff --git a/Sound/SC3/Graph/RD_eggcrate.hs b/Sound/SC3/Graph/RD_eggcrate.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_eggcrate.hs
@@ -0,0 +1,23 @@
+-- eggcrate (rd)
+module Sound.SC3.Graph.RD_eggcrate where
+
+import Sound.SC3.ID {- hsc3 -}
+
+atp :: (t -> u) -> (t,t) -> (u,u)
+atp f (i,j) = (f i,f j)
+
+eggcrate :: UGen
+eggcrate =
+  let cosu = cos . (* pi)
+      sinu = sin . (* pi)
+      eggcrate_f u v = cosu u * sinu v
+      p = mce [64,72,96,128,256,6400,7200,8400,9600]
+      (x,y) = atp (`brownNoise` KR) ('α','β')
+      t = dust 'γ' KR 2.4
+      (f0,f1) = atp (\z -> tChoose z t p) ('δ','ε')
+      f = linLin (eggcrate_f x y) (-1) 1 f0 f1
+      a = linLin x (-1) 1 0 0.1
+ in pan2 (mix (sinOsc AR f 0)) y a
+
+main :: IO ()
+main = audition (out 0 eggcrate)
diff --git a/Sound/SC3/Graph/RD_eggcrate_m.hs b/Sound/SC3/Graph/RD_eggcrate_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_eggcrate_m.hs
@@ -0,0 +1,20 @@
+-- eggcrate-m (rd)
+module Sound.SC3.Graph.RD_eggcrate_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+eggcrate :: UId m => m UGen
+eggcrate = do
+  let cosu = cos . (* pi)
+      sinu = sin . (* pi)
+      eggcrate_f u v = cosu u * sinu v
+      p = mce [64,72,96,128,256,6400,7200,8400,9600]
+  [x,y] <- sequence (replicate 2 (brownNoise KR))
+  t <- dust KR 2.4
+  [f0,f1] <- sequence (replicate 2 (tChoose t p))
+  let f = linLin (eggcrate_f x y) (-1) 1 f0 f1
+      a = linLin x (-1) 1 0 0.1
+  return (pan2 (mix (sinOsc AR f 0)) y a)
+
+main :: IO ()
+main = audition . out 0 =<< eggcrate
diff --git a/Sound/SC3/Graph/RD_f_lets_m.hs b/Sound/SC3/Graph/RD_f_lets_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_f_lets_m.hs
@@ -0,0 +1,31 @@
+-- f-lets (rd)
+module Sound.SC3.Graph.RD_f_lets_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+f_lets :: (Functor m,UId m) => m UGen
+f_lets = do
+  let f_let t g j n f = do
+           let pd = pulseDivider t j 0
+           r0 <- tIRand (mce2 2 1) n pd
+           r1 <- tRand 0.01 0.04 pd
+           r2 <- tRand 0.05 0.10 pd
+           return (formlet pd (f * r0) r1 r2 * g)
+      mk_n t = do
+           r0 <- tRand 0 1 t
+           r1 <- tRand 0 1 t
+           r2 <- tRand 0 1 t
+           r3 <- tRand 0 1 t
+           r4 <- coinGate 0.2 t
+           sequence [f_let t 0.15 2 9 (mce2 200 400)
+                    ,f_let t 0.25 2 9 (mce2 (200 + r0) (400 + r1))
+                    ,f_let t 0.05 4 5 (mce2 25 50)
+                    ,f_let t 0.15 4 5 (mce2 (25 + r2) (50 + r3))
+                    ,let lr = fmap (* latch r4 t)
+                     in lr (f_let t 0.5 1 16 (mce2 300 600))]
+      tr = impulse AR 24 0
+  n <- lfNoise0 KR 2
+  return . (* (n * 0.25 + 0.25)) . sum =<< mk_n tr
+
+main :: IO ()
+main = audition . out 0 =<< f_lets
diff --git a/Sound/SC3/Graph/RD_fb_090531.hs b/Sound/SC3/Graph/RD_fb_090531.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_fb_090531.hs
@@ -0,0 +1,48 @@
+-- fb-090531 (rd)
+module Sound.SC3.Graph.RD_fb_090531 where
+
+import Control.Monad {- base -}
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+fb_090531 :: UGen
+fb_090531 =
+    let k_in n = linLin (in' 1 KR n) (-1) 1
+        p = localIn 1 AR
+        bt = recip controlRate
+        ig_f = k_in 0 1 20
+        ig = impulse AR ig_f 0
+        f_f = k_in 1 220 880
+        f_rq = k_in 2 0.005 0.2
+        f = bpf ig f_f f_rq
+        d_t = k_in 3 0.1 0.105
+        d = delayC (f + p) 1 (d_t - bt)
+    in mrg [p,localOut d]
+
+-- | Constant reset.
+c_reset :: Transport m => Double -> m ()
+c_reset n = send (c_setn [(0,replicate 4 n)])
+
+-- | Random reset.
+r_reset :: Transport m => m ()
+r_reset = do
+  cs <- replicateM 4 (rrand (-1) 1)
+  send (c_setn [(0,cs)])
+
+-- | Loop random reset.
+lr_reset :: Transport m => Double -> m b
+lr_reset t = pauseThread t >> r_reset >> lr_reset t
+
+-- | Start fb_090531 and run lr_reset.  Type C-cC-i to interrupt.
+main :: IO ()
+main = do
+  audition (offsetOut 0 fb_090531)
+  withSC3 (c_reset 1 >> lr_reset 1)
+
+{-
+withSC3 (c_reset 0)
+withSC3 (c_reset 1)
+withSC3 (c_reset (-1))
+withSC3 r_reset
+-}
diff --git a/Sound/SC3/Graph/RD_fbl_fbf.hs b/Sound/SC3/Graph/RD_fbl_fbf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_fbl_fbf.hs
@@ -0,0 +1,37 @@
+-- fbl-fbf (rd)
+module Sound.SC3.Graph.RD_fbl_fbf where
+
+import Sound.SC3.ID {- hsc3 -}
+
+fbl :: UGen -> [UGen] -> [UGen] -> [UGen] -> (UGen, UGen)
+fbl l i d g =
+    let a0 = l + mce i
+        a1 = delayL a0 (maximum d) (mce d)
+    in (localOut (a1 * mce g),a1)
+
+fbf :: [UGen] -> [UGen] -> [UGen] -> [UGen] -> (UGen, UGen)
+fbf b i d g =
+    let a0 = inFeedback 1 (mce b) + mce i
+        a1 = delayL a0 (maximum d) (mce d)
+    in (offsetOut (mce b) (mce [a1 * mce g]),a1)
+
+fbl_fbf :: UGen
+fbl_fbf =
+  let n = brownNoise 'α' AR
+      e = decay (impulse AR 0.3 0) 0.1 * n * 0.2
+      c = 4
+      e' = replicate c e
+      b0 = [24,26,28,30]
+      d0 = [0.1,0.3,0.5,0.7]
+      g0 = [0.8,0.6,0.4,0.2]
+      b1 = [25,27,29,31]
+      d1 = [0.2,0.3,0.6,0.7]
+      g1 = [0.8,0.7,0.4,0.3]
+      (u0,s0) = fbl (localIn c AR) e' d0 g0
+      (u1,s1) = fbf b0 e' d0 g0
+      (u2,s2) = fbf b1 (mceChannels s1) d1 g1
+      o = mce [mix (s0 + s1),mix s2]
+  in mrg [u0,u1,u2,offsetOut 0 o]
+
+main :: IO ()
+main = withSC3 (reset >> play fbl_fbf)
diff --git a/Sound/SC3/Graph/RD_feedr_m.hs b/Sound/SC3/Graph/RD_feedr_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_feedr_m.hs
@@ -0,0 +1,37 @@
+-- feedr (rd)
+-- warning: input/output feedback loop
+module Sound.SC3.Graph.RD_feedr_m where
+
+import Sound.OSC.FD {- hosc -}
+import Sound.SC3.Monad.FD {- hsc3 -}
+
+delayWr :: UGen -> UGen -> UGen
+delayWr b = recordBuf AR b 0 1 0 1 Loop 0 DoNothing
+
+tap :: Int -> UGen -> UGen -> UGen
+tap nc b dt = playBuf nc AR b 1 0 (dt * (- sampleRate)) Loop DoNothing
+
+type State = (UGen,Double)
+
+feedr :: (UId m) => State -> Int -> m UGen
+feedr (ch,dl) n = do
+  t <- sequence (replicate n (rand 0.0 (constant dl)))
+  g <- sequence (replicate n (rand 0.4 1.0))
+  f <- sequence (replicate n (rand 0.9 0.95))
+  let d = zipWith (\p q -> tap 2 10 p * q) t g
+      x = mouseX KR 0.02 1.0 Exponential 0.1
+      s = clip2 (leakDC (hpf (sum d) 20) 0.995) 1
+      i = soundIn ch
+      r = i + sum (map (* x) (zipWith (*) d f))
+  return (mrg [out 0 s, delayWr 10 r])
+
+run :: Transport t => State -> t -> IO ()
+run (ch,dl) fd = do
+  nf <- fmap (* dl) (serverSampleRateActual fd)
+  send fd (b_alloc 10 (floor nf) 2)
+  audition =<< feedr (ch,dl) 18
+
+main :: IO ()
+main = withSC3 (run (mce2 4 5,6))
+
+-- withSC3 (\fd -> send fd (b_zero 10))
diff --git a/Sound/SC3/Graph/RD_fm_iter.hs b/Sound/SC3/Graph/RD_fm_iter.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_fm_iter.hs
@@ -0,0 +1,25 @@
+-- fm-iter (rd)
+module Sound.SC3.Graph.RD_fm_iter where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+-- audition (out 0 fm_iter)
+fm_iter :: UGen
+fm_iter =
+  let f0 = recip (0.3 + whiteNoise 'α' AR * 0.01)
+      t0 = impulse AR f0 0
+      t1 = tDelay t0 0.15
+      t = mce2 t0 t1
+      k = tRand 'β' 56 57 t
+      i = tRand 'γ' 40 480 t
+      j = tRand 'δ' (-1) 1 t
+      c = midiCPS k
+      m = midiCPS (k + 1 + j)
+      s = envPerc 0.01 0.9
+      e = envGen AR t 0.1 0 1 RemoveSynth s
+      f = sinOsc AR c 0 * i + m
+  in sinOsc AR f 0 * e
+
+main :: IO ()
+main = overlapTextureU (3,3,6,maxBound) fm_iter
diff --git a/Sound/SC3/Graph/RD_fm_kltr_m.hs b/Sound/SC3/Graph/RD_fm_kltr_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_fm_kltr_m.hs
@@ -0,0 +1,60 @@
+-- fm-kltr (rd)
+module Sound.SC3.Graph.RD_fm_kltr_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad as U {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+fm_kltr :: UId m => m UGen
+fm_kltr = do
+  r1 <- U.rand 0.975 1.025
+  r2 <- U.rand 0.5 1.5
+  r3 <- U.rand 0.975 1.025
+  r4 <- U.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))
+
+type R = Double
+
+fm :: Transport m => R -> R -> R -> R -> R -> m ()
+fm 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 (s_new "fm_kltr" (-1) AddToTail 1 p)
+
+nd :: Transport m => m ()
+nd = 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 53 ff a d i
+  wait t
+
+run :: (Transport m,UId m) => m ()
+run = do
+  u <- fm_kltr
+  _ <- async (d_recv (synthdef "fm_kltr" u))
+  sequence_ (replicate 32 nd)
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/RD_fm_kltr_p.hs b/Sound/SC3/Graph/RD_fm_kltr_p.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_fm_kltr_p.hs
@@ -0,0 +1,41 @@
+-- fm-kltr-p (rd)
+module Sound.SC3.Graph.RD_fm_kltr_p where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+fm_kltr :: UGen
+fm_kltr =
+  let r1 = rand 'α' 0.975 1.025
+      r2 = rand 'β' 0.5 1.5
+      r3 = rand 'γ' 0.975 1.025
+      r4 = rand 'δ' 0.75 1.25
+      o = control IR "out" 0
+      a = control KR "amp" 0.1
+      dt = control KR "sustain" 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 dt
+      e = envGen AR 1 a 0 1 RemoveSynth ep
+      so = sinOsc AR (xLine KR f (f * r1) dt DoNothing) 0
+      xl = xLine KR f2 (f2 * r3) dt DoNothing
+      m = so * line KR i (f * r2) dt DoNothing + xl
+      l = line KR p (p * r4) dt DoNothing
+  in out o (pan2 (sinOsc AR m 0) l e)
+
+pattern :: P_Bind
+pattern =
+    [(K_instr,psynth (synthdef "fm_kltr" fm_kltr))
+    ,(K_freq,fmap midiCPS 53)
+    ,(K_param "freq2",fmap midiCPS (pwhitei 'ε' 48 96 inf +
+                                    pwhite 'ζ' (-1) 1 inf))
+    ,(K_amp,pwhite 'η' 0.1 0.4 inf)
+    ,(K_dur,pwhite 'θ' 0.15 1.25 inf)
+    ,(K_sustain,pwhite 'ι' 5 6 inf)
+    ,(K_param "index",pwhite 'κ' 240 1480 inf)
+    ,(K_param "pan", pwhite 'λ' (-1) 1 inf)]
+
+main :: IO ()
+main = audition (pbind pattern)
diff --git a/Sound/SC3/Graph/RD_fwalk_m.hs b/Sound/SC3/Graph/RD_fwalk_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_fwalk_m.hs
@@ -0,0 +1,40 @@
+-- fwalk (rd)
+module Sound.SC3.Graph.RD_fwalk_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+fwalk' :: UId m => UGen -> m UGen
+fwalk' r = do
+  t <- dust KR 3
+  r1 <- tIRand 0 6 t
+  r2 <- tRand (-0.0001) 0.0001 t
+  let f = bufRdL 1 KR (mce2 0 1) r1 NoLoop
+      f' = f + r2
+      o1 = blip AR (midiCPS (r + f)) 12
+      o2 = blip AR (midiCPS (r + f')) 12
+  return ((o1 + o2) * decay2 t 0.3 1.2 * 0.1)
+
+fwalk :: UId m => m UGen
+fwalk = do
+  f1 <- fwalk' 24
+  f2 <- fwalk' 36
+  return (f1 + f2)
+
+run :: (UId m,Transport m) => m ()
+run = do
+  let n = [40,47,42,40,50
+          ,43,35,43,40,47
+          ,45,35,43,42,59
+          ,48,40,47,52,45]
+      m = [40,40,42,47,50
+          ,35,43,43,40,45
+          ,42,35,48,47,43
+          ,40,59,45,47,52]
+  _ <- async (b_alloc_setn1 0 0 n)
+  _ <- async (b_alloc_setn1 1 0 m)
+  f <- fwalk
+  play (out 0 f)
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/RD_h_chatter_m.hs b/Sound/SC3/Graph/RD_h_chatter_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_h_chatter_m.hs
@@ -0,0 +1,30 @@
+-- h-chatter (rd)
+module Sound.SC3.Graph.RD_h_chatter_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+h_chatter :: UId m => m UGen
+h_chatter = do
+  let mma m a = return . (+ a)  . (* m)
+      h0 = do n <- mma 5 5 =<< lfNoise0 KR 1
+              a <- mma 0.2 1.2 =<< lfNoise2 KR n
+              b <- mma 0.15 0.15 =<< lfNoise2 KR n
+              let f = 40
+                  h = henonN AR (mce2 f (f * 0.5)) a b 0 0
+              return (saw AR (h * 3200 + 1600) * 0.35)
+      h1 = do n0 <- lfNoise0 KR 32
+              n1 <- lfNoise0 KR 2
+              let a = mouseX KR 1.2 1.4 Linear 0.1
+                  b = mouseY KR 0.2 0.3 Linear 0.1
+                  wrp i = linLin i (-1) 1
+                  h = wrp n0 1 32
+                  p = wrp n1 2400 3200
+                  l = wrp n1 (-0.75) 0.75
+                  g = wrp n1 0.55 0.85
+                  f = 40
+                  o = blip AR (wrp (henonN AR f a b 0 0) p (p * 2)) h
+              return (pan2 o l g * 0.35)
+  h0 .+. h1
+
+main :: IO ()
+main = audition . out 0 =<< h_chatter
diff --git a/Sound/SC3/Graph/RD_implosion_m.hs b/Sound/SC3/Graph/RD_implosion_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_implosion_m.hs
@@ -0,0 +1,35 @@
+-- implosion (rd)
+module Sound.SC3.Graph.RD_implosion_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+mkls :: [(UGen,UGen)] -> UGen -> UGen
+mkls bp t =
+    let e = envCoord bp t 1 EnvLin
+    in envGen KR 1 1 0 1 RemoveSynth e
+
+mkrmp :: UGen -> UGen -> UGen -> UGen
+mkrmp l r = mkls [(0,l),(1,r)]
+
+pmr_n :: UId m => Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> m UGen
+pmr_n rt l0 l1 r0 r1 d = do
+  let le = mkrmp l0 r0 d
+      re = mkrmp l1 r1 d
+      wrp i = linLin i (-1) 1
+  n <- whiteNoise rt
+  return (wrp n le re)
+
+implosion :: UId m => m UGen
+implosion = do
+  n0 <- rand (-1) 0
+  n1 <- rand 0 1
+  d  <- rand 7.5 13.5
+  f0 <- rand 10990 16220
+  f1 <- rand  9440 19550
+  f <- pmr_n AR 440 f0 f1 f1 d
+  l <- pmr_n KR n0 n1 0 0 d
+  a <- pmr_n KR 0.1 0.6 0 0 d
+  return (pan2 (saw AR f) l a)
+
+main :: IO ()
+main = audition . out 0 =<< implosion
diff --git a/Sound/SC3/Graph/RD_k_ppr.hs b/Sound/SC3/Graph/RD_k_ppr.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_k_ppr.hs
@@ -0,0 +1,26 @@
+-- k-ppr (rd)
+module Sound.SC3.Graph.RD_k_ppr where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+
+k_ppr :: UGen
+k_ppr =
+  let wrp i = linLin i (-1) 1
+      x = mouseX KR 0.05 0.35 Linear 0.1
+      y = mouseY KR 0.15 0.75 Linear 0.1
+      ti = lfTri KR x 0
+      tf = wrp ti 100 200
+      t = impulse AR tf 0
+      stream e lf rf ld rd g =
+          let r1 = rand e 9 18
+              t' = pulseDivider t r1 0
+              r2 = tRand e lf (wrp ti lf rf) t'
+              r3 = tRand e ld rd t'
+          in ringz (decay2 t' 0.01 0.5) r2 (r3 * y) * g
+      s1 = stream 'α' 3140 6240 0.050 0.005 0.15
+      s2 = stream 'β' 0400 9000 0.005 0.005 0.15
+  in uclone 'γ' 2 s1 + uclone 'δ' 2 s2
+
+main :: IO ()
+main = audition (out 0 k_ppr)
diff --git a/Sound/SC3/Graph/RD_k_ppr_m.hs b/Sound/SC3/Graph/RD_k_ppr_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_k_ppr_m.hs
@@ -0,0 +1,25 @@
+-- k-ppr-m (rd)
+module Sound.SC3.Graph.RD_k_ppr_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+k_ppr_m :: UId m => m UGen
+k_ppr_m = do
+  let wrp i = linLin i (-1) 1
+      x = mouseX KR 0.05 0.35 Linear 0.1
+      y = mouseY KR 0.15 0.75 Linear 0.1
+      ti = lfTri KR x 0
+      tf = wrp ti 100 200
+      t = impulse AR tf 0
+      stream lf rf ld rd g =
+          do r1 <- rand 9 18
+             let t' = pulseDivider t r1 0
+             r2 <- tRand lf (wrp ti lf rf) t'
+             r3 <- tRand ld rd t'
+             return (ringz (decay2 t' 0.01 0.5) r2 (r3 * y) * g)
+      s1 = stream 3140 6240 0.050 0.005 0.15
+      s2 = stream 0400 9000 0.005 0.005 0.15
+  clone 2 s1 .+. clone 2 s2
+
+main :: IO ()
+main = audition . out 0 =<< k_ppr_m
diff --git a/Sound/SC3/Graph/RD_klink.hs b/Sound/SC3/Graph/RD_klink.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_klink.hs
@@ -0,0 +1,20 @@
+-- klink (rd)
+module Sound.SC3.Graph.RD_klink where
+
+import Sound.SC3.ID {- hsc3 -}
+
+klink :: UGen
+klink =
+  let n1 = lfNoise0 'α' KR (mce2 0.5 1.5)
+      o = sinOsc KR n1 0
+      a = abs (slope o) * mce2 2 3
+      t = impulse AR a 0
+      i = decay2 t 0.01 0.1
+      x = mouseX KR 960 3620 Exponential 0.2
+      y = mouseY KR 0.5 2.0 Linear 0.2
+      n2 = tRand 'β' x 3940 t
+      n3 = tRand 'γ' 0.005 0.275 t
+  in ringz i n2 (n3 * y)
+
+main :: IO ()
+main = audition (out 0 klink)
diff --git a/Sound/SC3/Graph/RD_lf_pulses.hs b/Sound/SC3/Graph/RD_lf_pulses.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_lf_pulses.hs
@@ -0,0 +1,17 @@
+-- lf pulses (rd)
+module Sound.SC3.Graph.RD_lf_pulses where
+
+import Sound.SC3.ID {- hsc3 -}
+
+lf_pulses :: UGen
+lf_pulses =
+  let n0 = lfNoise0 'α' AR (mce2 20 40)
+      n1 = lfNoise0 'β' AR (mce2 5 10)
+      x = mouseX KR 0.012 0.19 Exponential 0.1
+      f = formlet (blip AR 10 12) (n0 * 43 + 700) 0.005 x
+      o = sinOsc AR 40 0 * n1
+  in clip2 (leakDC (f + o) 0.995) 0.75
+
+main :: IO ()
+main = audition (out 0 lf_pulses)
+
diff --git a/Sound/SC3/Graph/RD_lg_timed_m.hs b/Sound/SC3/Graph/RD_lg_timed_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_lg_timed_m.hs
@@ -0,0 +1,25 @@
+-- lg-timed (rd)
+module Sound.SC3.Graph.RD_lg_timed_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+lg_timed :: UId m => m UGen
+lg_timed = do
+  let timed r y p =
+          do d0 <- dser r p
+             d1 <- dcons 0 d0
+             d2 <- dser r y
+             let t = tDuty AR d1 0 RemoveSynth d2 1
+             return (latch t t)
+      lg u = return (lag u 0.03)
+      n = mce [52,76,66,67,68,69]
+      a = mce [0.35,0.15,0.04,0.05,0.16,0.07]
+      d = mce [0.1,0.5,0.09,0.08,0.07,0.3]
+      x = mouseX KR 0.5 1.25 Linear 0.2
+  tn <- lg =<< timed dinf n (d * x)
+  ta <- lg =<< timed dinf a (d * x)
+  return (sinOsc AR (midiCPS tn) 0 * ta)
+
+main :: IO ()
+main = audition . out 0 =<< lg_timed
+
diff --git a/Sound/SC3/Graph/RD_lin_sosc.hs b/Sound/SC3/Graph/RD_lin_sosc.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_lin_sosc.hs
@@ -0,0 +1,93 @@
+-- lin-sosc (rd)
+module Sound.SC3.Graph.RD_lin_sosc where
+
+import Control.Concurrent {- base -}
+import Control.Monad {- base -}
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
+
+iota :: (Num a,Eq a,Num b) => a -> b -> b -> [b]
+iota n l s = if n == 0 then [] else l : iota (n - 1) (l + s) s
+
+geom :: (Num a,Eq a,Num b) => a -> b -> b -> [b]
+geom n i f = if n == 0 then [] else i : geom (n - 1) (i * f) f
+
+lineTo :: (Fractional a,Eq a) => a -> a -> a -> [a]
+lineTo n l r = iota n l ((r - l) / n)
+
+xlineTo :: (Floating a,Eq a) => a -> a -> a -> [a]
+xlineTo n l r = geom n l ((r / l) ** (1.0 / n))
+
+tblM :: UGen -> UGen -> UGen
+tblM b x = playBuf 1 AR b (x * bufRateScale KR b) 0 0 Loop DoNothing
+
+tblC :: UGen -> UGen -> UGen
+tblC b c = tblM b (in' 1 KR c)
+
+lin_sosc :: UGen
+lin_sosc =
+    let x = mouseX KR 0.001 1.0 Linear 0.1
+        o = sinOsc AR (tblM 0 x) 0 * tblM 1 x
+    in clip2 (pan2 o (tblC 1 0) 0.025) 0.25
+
+twoPi :: Double
+twoPi = pi * 2.0
+
+srng :: Fractional a => a -> a -> a -> a
+srng l r e =
+    let m = (l - r ) / 2
+    in m + l + (e * m)
+
+type Lin_Data = ([[Double]], [[Double]], [Double], [Double])
+
+lin_data :: Double -> Lin_Data
+lin_data n =
+    let f = [lineTo n 440.0 444.0
+            ,lineTo n 40.0 16000.0
+            ,xlineTo n 40.0 16000.0
+            ,map (srng 20 21000 . sin) (lineTo n 0.0 twoPi)
+            ,map (srng 20 12000 . cos) (lineTo n 0.0 twoPi)
+            ,map (srng 20 22000 . tan) (lineTo n 0.0 twoPi)
+            ,map (srng 20 90 . tan) (lineTo n 0.0 twoPi)]
+        a = [lineTo n 0.1 1.0
+            ,lineTo n 1.0 0.1
+            ,lineTo n 0.5 0.01
+            ,lineTo n 0.01 0.5
+            ,xlineTo n 1.0 0.1
+            ,xlineTo n 0.1 1.0
+            ,map sin (lineTo n 0.0 twoPi)
+            ,map cos (lineTo n 0.0 twoPi)
+            ,map ((* 0.001) . tan) (lineTo n 0 twoPi)]
+        l = [0.005,0.0075,0.01,0.025,0.05,0.075
+            ,0.1,0.25,0.5,0.75
+            ,0.8,0.85,1.0,1.005]
+        t = [0.01,0.05,0.1,0.15,0.25,0.5,0.75]
+    in (f,a,l,t)
+
+update :: Transport m => Lin_Data -> m ()
+update (f,a,l,t) = do
+  f' <- R.choose f
+  a' <- R.choose a
+  l' <- R.choose l
+  t' <- R.choose t
+  send (b_setn 0 [(0,f')])
+  send (b_setn 1 [(0,a')])
+  send (c_set [(0,l')])
+  pauseThread t'
+
+do_update :: Double -> IO ()
+do_update n = withSC3 (replicateM_ 128 (update (lin_data n)))
+
+run :: (Transport m, RealFrac a) => a -> m ()
+run n = do
+  _ <- async (b_alloc 0 (floor n) 1)
+  _ <- async (b_alloc 1 (floor n) 1)
+  play (out 0 lin_sosc)
+
+main :: IO ()
+main = do
+  let n = 1024
+  withSC3 (run n)
+  _ <- forkIO (do_update n)
+  return ()
diff --git a/Sound/SC3/Graph/RD_lso_061101_m.hs b/Sound/SC3/Graph/RD_lso_061101_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_lso_061101_m.hs
@@ -0,0 +1,111 @@
+-- | L-System oscillator (rd), 2006-11-01
+module Sound.SC3.Graph.RD_lso_061101_m where
+
+import Control.Monad {- base -}
+import Graphics.PS {- hps -}
+import qualified LSystem.LSystem as L {- hls -}
+import qualified LSystem.Systems as L
+import qualified LSystem.Turtle as L
+import qualified Sound.File.NeXT as F {- hsc3-sf -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
+import System.Directory {- directory -}
+import qualified System.FilePath as P {- filepath -}
+
+-- | Normalise to lie in (0,1).
+--
+-- > normalise [1,4,2,5] == [0.2,0.8,0.4,1]
+normalise :: (Fractional a,Ord a) => [a] -> [a]
+normalise s =
+    let n = 1 / maximum (map abs s)
+    in map (* n) s
+
+-- | 'L.render' rule.
+plain :: [Double] -> Pt Double -> Pt Double -> [Double]
+plain d (Pt x0 y0) (Pt x1 y1) = [x0,y0,x1,y1] ++ d
+
+-- | Render 'L.LSystem' to 'plain' data.
+lsys_run :: (L.LSystem,Double,Double) -> Int -> [Double]
+lsys_run (l,ta,lls) i =
+    let a = L.Turtle (radians ta) 1 (Pt 0 0) (pi/2) 1 lls []
+    in L.render [] plain (L.expand l i) a
+
+-- | 'normalise' '.' 'lsys_run'
+--
+-- > length (gen_d L.l0d 3)
+gen_d :: (L.LSystem,Double,Double) -> Int -> [Double]
+gen_d l = normalise . lsys_run l
+
+-- | Write 'gen_d' to 'FilePath' as /NeXT/ sound file.
+gen_f :: FilePath -> [Double] -> IO ()
+gen_f nm d = F.write nm (F.Header (length d) F.Float 44100 1) [d]
+
+-- | Rendered L-system data sets.
+lsys_data :: [[Double]]
+lsys_data =
+    [gen_d L.l0d 3
+    ,gen_d L.l1d 3
+    ,gen_d L.l2d 5
+    ,gen_d L.l3d 12
+    ,gen_d L.l4d 6
+    ,gen_d L.l5d 4
+    ,gen_d L.l6d 7
+    ,gen_d L.l7d 4
+    ,gen_d L.l8d 6
+    ,gen_d L.l9d 10
+    ,gen_d L.lAd 11
+    ,gen_d L.lBd 6
+    ,gen_d L.lCd 5]
+
+-- | Exceeds UDP limits.
+lsys_send :: IO ()
+lsys_send = do
+  let alloc (n,d) = async (b_alloc_setn1 n 0 d)
+  withSC3 (mapM_ alloc (zip [0..] lsys_data))
+
+
+-- | Filename for 'lsys_data'.
+lsys_fn :: FilePath  -> [FilePath]
+lsys_fn d =
+    let n = length lsys_data
+        nm i = d P.</> show i P.<.> "snd"
+    in map nm [0 .. n - 1]
+
+-- | Write 'lsys_data' to 'lsys_fn' using 'gen_f'.
+lsys_write :: FilePath -> IO ()
+lsys_write d = zipWithM_ gen_f (lsys_fn d) lsys_data
+
+-- | Load 'lsys_fn' at /scsynth/.
+lsys_load :: FilePath -> IO ()
+lsys_load d = do
+  let alloc (n,nm) = async (b_allocRead n nm 0 0)
+  withSC3 (mapM_ alloc (zip [0..] (lsys_fn d)))
+
+-- | Oscillator instrument
+oi :: IO UGen
+oi = do
+  let rng i = linLin i (-1) 1
+      exprng i = linExp i (-1) 1
+  c <- R.choose [0.25, 0.55, 0.75, 1.25]
+  let t = impulse KR c 0
+  b <- tIRand 0 12 t
+  let n  = bufFrames KR b
+      m  = n / 4
+      i  = floorE (rng (lfSaw AR c 0) 0 m) * 4
+      tt = impulse AR (m / c) 0
+      x0 = bufRdL 1 AR b i       NoLoop
+      y0 = bufRdL 1 AR b (i + 1) NoLoop
+      x1 = bufRdL 1 AR b (i + 2) NoLoop
+      y1 = bufRdL 1 AR b (i + 3) NoLoop
+  f0 <- R.choose [16, 32, 64, 128, 256, 512, 8192]
+  let f1 = 22000
+      o x y = let f = exprng x f0 f1
+              in pan2 (blip AR f (rng y 1 64)) y0 (decay tt 0.005)
+  return (o x0 y0 + o x1 y1)
+
+main :: IO ()
+main = do
+  t <- getTemporaryDirectory
+  lsys_write t
+  lsys_load t
+  oi >>= audition . out 0
diff --git a/Sound/SC3/Graph/RD_mouse_clatter_m.hs b/Sound/SC3/Graph/RD_mouse_clatter_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_mouse_clatter_m.hs
@@ -0,0 +1,33 @@
+-- mouse clatter (rd)
+module Sound.SC3.Graph.RD_mouse_clatter_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+mouse_clatter :: UId m => m UGen
+mouse_clatter = do
+  let x = mouseX KR 100 12000 Linear 0.1
+      y = mouseY KR 0.01 0.15 Linear 0.1
+  n1 <- lfNoise0 KR (mce [3,3.25])
+  let t = impulse KR (n1 * 16 + 18) 0
+  n2 <- tRand 0.005 y t
+  n3 <- whiteNoise AR
+  n4 <- tRand 10 x t
+  n5 <- tRand 0 1 t
+  n6 <- tExpRand 0.15 1 t
+  o <- let e = decay2 t 0.01 n2
+       in return (bpf (n3 * e) n4 n5)
+  n7 <- pv_RandComb (fft' 10 o) n6 t
+  return (o * 0.05 + ifft' n7)
+
+run :: (UId m,Transport m) => m ()
+run = do
+  _ <- async (b_alloc 10 2048 1)
+  play . out 0 =<< mouse_clatter
+
+main :: IO ()
+main = withSC3 run
+
+{-
+s.sendMsg('b_alloc', 10, 2048, 1);
+-}
diff --git a/Sound/SC3/Graph/RD_nharm_m.hs b/Sound/SC3/Graph/RD_nharm_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_nharm_m.hs
@@ -0,0 +1,36 @@
+-- nharm (rd)
+module Sound.SC3.Graph.RD_nharm_m where
+
+import Control.Concurrent {- base -}
+import Control.Monad
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad as U {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+nharm :: (Num b, Integral a) => a -> b -> [b]
+nharm n f = map ((* f) . fromIntegral) [1..n]
+
+klg :: UId m => UGen -> Int -> m UGen
+klg m u = do
+    n <- rrand 4 u
+    d <- iRand 9 12
+    f <- iRand m (m + 2)
+    l <- sequence (replicate n (U.rand 0.01 0.02))
+    p <- U.rand (-1.0) 1.0
+    let a = 0.5
+        e = envGen KR 1 0.9 0 1 RemoveSynth (envSine d a)
+        nh = nharm n (midiCPS f)
+        s = klangSpec nh l (replicate n 0.0)
+    return (pan2 (klang AR 1 0 s) p e)
+
+ply :: Int -> (Double,Double) -> UGen -> Int -> IO ()
+ply n (l,r) m u = do
+  let a = do pauseThread =<< rrand l r
+             audition . out 0 =<< klg m u
+  replicateM_ n a
+
+main :: IO ()
+main = do
+  _ <- forkIO (ply 32 (0.25,0.75) 92 24)
+  _ <- forkIO (ply 8 (1.25,1.75) 12 54)
+  return ()
diff --git a/Sound/SC3/Graph/RD_nharm_p.hs b/Sound/SC3/Graph/RD_nharm_p.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_nharm_p.hs
@@ -0,0 +1,38 @@
+-- nharm-p (rd)
+module Sound.SC3.Graph.RD_nharm_p where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+nharm :: Num n => Int -> n -> [n]
+nharm n f = map ((* f) . fromIntegral) [1..n]
+
+klg :: Int -> UGen
+klg n =
+    let f = control KR "freq" 440
+        d = rand 'α' 9 12
+        l = mceChannels (randN n 'α' 0.01 0.02)
+        p = rand 'α' (-1.0) 1.0
+        a = 0.5
+        e = envGen KR 1 0.9 0 1 RemoveSynth (envSine d a)
+        nh = nharm n f
+        s = klangSpec nh l (replicate n 0.0)
+    in out 0 (pan2 (klang AR 1 0 s) p e)
+
+type Range = (Field,Field)
+
+{- Note that the dur key is used only to schedule the nodes. Both it,
+and any gate message, are ignored by the UGen graph, which manages
+duration internally.  -}
+
+pN :: Int -> Range -> Range -> P Event
+pN n (m0,m1) (d0,d1) =
+    let s = synthdef ("klg" ++ show n) (klg n)
+    in pbind [(K_instr,psynth s)
+             ,(K_midinote,pwhite 'α' m0 m1 inf)
+             ,(K_dur,pwhite 'β' d0 d1 inf)]
+
+main :: IO ()
+main = audition (pmerge (pN 24 (90,92) (0.25,0.75))
+                        (pN 54 (12,14) (1.25,1.76)))
diff --git a/Sound/SC3/Graph/RD_pattern_buffer_m.hs b/Sound/SC3/Graph/RD_pattern_buffer_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_pattern_buffer_m.hs
@@ -0,0 +1,55 @@
+-- pattern buffer (rd)
+module Sound.SC3.Graph.RD_pattern_buffer_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+tseq :: [UGen] -> UGen
+tseq l =
+    let n = fromIntegral (length l) / 2.0
+    in select (lfSaw KR 0.5 0 * n + n) (mce l)
+
+pattern_buffer :: UId m => Int -> m UGen
+pattern_buffer c = do
+  let p = phasor AR 0 (bufRateScale KR 10) 0 (bufFrames KR 10) 0
+      t = bufRdC 1 AR 10 p Loop
+  r1 <- sequence (replicate c (rrand 36 96))
+  r2 <- sequence (replicate c (rrand (-1.0) 1.0))
+  r3 <- rrand 0 1
+  n1 <- tRand 0.02 0.08 t
+  let e = decay2 t 0.01 n1
+      f = midiCPS (tseq r1)
+      l = tseq r2
+      o = [sinOsc AR f 0, saw AR f] !! r3
+  return (pan2 o l e)
+
+set_pattern :: Transport m => Int -> Int -> m ()
+set_pattern nf c = do
+  let rs = do r0 <- rrand 0 nf
+              r1 <- rrand 0.0 1.0
+              send (b_set1 10 r0 r1)
+  sequence_ (replicate c rs)
+
+fill_clr :: (Transport m) => Int -> Int -> Double -> Int -> m b
+fill_clr nf c dt n = do
+  let go i = if i == 0
+             then do send (b_zero 10)
+                     go n
+             else do set_pattern nf c
+                     pauseThread dt
+                     go (i - 1)
+  go n
+
+run :: (UId m,Transport m) => m ()
+run = do
+  let nf = 2 * 48000
+      c = 24
+      n = 16
+      dt = 2.6
+  _ <- async (b_alloc 10 (nf * 2) 1)
+  play . out 0 =<< pattern_buffer c
+  fill_clr nf c dt n
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/RD_rzblp.hs b/Sound/SC3/Graph/RD_rzblp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_rzblp.hs
@@ -0,0 +1,37 @@
+-- rzblp (rd)
+module Sound.SC3.Graph.RD_rzblp where
+
+import Sound.SC3.ID {- hsc3 -}
+
+lfn :: ID a => a -> UGen -> UGen -> UGen -> UGen
+lfn z f l r =
+    let z' = z `joinID` l `joinID` r
+    in range l r (lfNoise0 z' KR f)
+
+hpb :: (ID a) => a -> UGen -> UGen
+hpb z q =
+    let g i = let z' = idHash z + i
+                  f = lfn z' q 1330 1395
+                  a = lfn z' q 0.001 0.007
+              in blip AR f 24 * a
+    in mixFill 2 g
+
+mk_f :: ID a => a -> (a -> UGen -> UGen -> UGen) -> UGen
+mk_f z d =
+    let q = lfn z 5.2 5.2 5.21
+        a = d z dinf (mce [1,3,2,7,8])
+        tr = impulse KR q 0
+        freq = demand tr 0 a * 30 + 340
+        rt = impulse AR q (mce2 0 0)
+        rf = lfn z 5 30 640
+        rbw = lfn z q 0.1 0.5
+    in sum [blip AR freq 3 * lfn z q 0.001 0.01
+           ,resonz rt rf rbw * lfn z q 0.01 1.8
+           ,hpb z q * lfn z q 1.2 1.8
+           ,blip AR (lfn z q 16 36) 3 * mce2 0.03 0.09]
+
+rzblp :: UGen
+rzblp = mk_f 'α' drand + mk_f 'β' dxrand
+
+main :: IO ()
+main = audition (out 0 rzblp)
diff --git a/Sound/SC3/Graph/RD_rzblp_hp.hs b/Sound/SC3/Graph/RD_rzblp_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_rzblp_hp.hs
@@ -0,0 +1,32 @@
+-- rzblp-hp (rd)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.RD_rzblp_hp where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+lfn :: UId m => UGen -> UGen -> UGen -> m UGen
+lfn f l r = fmap (range l r) (lfNoise0 KR f)
+
+hpb :: UId m => UGen -> m UGen
+hpb q =
+    let g :: UId m => Int -> m UGen
+        g _ = do blip AR #(lfn q 1330 1395) 24 *. lfn q 0.001 0.007
+    in mixFillM 2 g
+
+mk_f :: UId m => (UGen -> UGen -> m UGen) -> m UGen
+mk_f d = do
+  q <- lfn 5.2 5.2 5.21
+  a <- d dinf (mce [1,3,2,7,8])
+  let freq = demand (impulse KR q 0) 0 a * 30 + 340
+  s1 <- blip AR freq 3 *. lfn q 0.001 0.01
+  s2 <- resonz (impulse AR q (mce2 0 0)) #(lfn 5 30 640) #(lfn q 0.1 0.5)
+        *. lfn q 0.01 1.8
+  s3 <- hpb q .*. lfn q 1.2 1.8
+  let s4 = blip AR #(lfn q 16 36) 3 * mce2 0.03 0.09
+  return (sum [s1,s2,s3,s4])
+
+rzblp :: UId m => m UGen
+rzblp = mk_f drand .+. mk_f dxrand
+
+main :: IO ()
+main = audition . out 0 =<< rzblp
diff --git a/Sound/SC3/Graph/RD_rzblp_m.hs b/Sound/SC3/Graph/RD_rzblp_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_rzblp_m.hs
@@ -0,0 +1,35 @@
+-- rzblp-m (rd)
+module Sound.SC3.Graph.RD_rzblp_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+lfn :: UId m => UGen -> UGen -> UGen -> m UGen
+lfn f l r = fmap (range l r) (lfNoise0 KR f)
+
+hpb :: UId m => UGen -> m UGen
+hpb q =
+    let g :: UId m => Int -> m UGen
+        g _ = do f <- lfn q 1330 1395
+                 a <- lfn q 0.001 0.007
+                 return (blip AR f 24 * a)
+    in mixFillM 2 g
+
+mk_f :: UId m => (UGen -> UGen -> m UGen) -> m UGen
+mk_f d = do
+  q <- lfn 5.2 5.2 5.21
+  a <- d dinf (mce [1,3,2,7,8])
+  let freq = demand (impulse KR q 0) 0 a * 30 + 340
+  s1 <- blip AR freq 3 *. lfn q 0.001 0.01
+  s2 <- do f <- lfn 5 30 640
+           bw <- lfn q 0.1 0.5
+           resonz (impulse AR q (mce2 0 0)) f bw *. lfn q 0.01 1.8
+  s3 <- hpb q .*. lfn q 1.2 1.8
+  s4 <- do f <- lfn q 16 36
+           return (blip AR f 3 * mce2 0.03 0.09)
+  return (sum [s1,s2,s3,s4])
+
+rzblp :: UId m => m UGen
+rzblp = mk_f drand .+. mk_f dxrand
+
+main :: IO ()
+main = audition . out 0 =<< rzblp
diff --git a/Sound/SC3/Graph/RD_rzblp_u.hs b/Sound/SC3/Graph/RD_rzblp_u.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_rzblp_u.hs
@@ -0,0 +1,36 @@
+-- rzblp-u (rd)
+module Sound.SC3.Graph.RD_rzblp_u where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+
+lfn :: UGen -> UGen -> UGen -> UGen
+lfn f l r = range l r (lfNoise0 KR f)
+
+hpb :: UGen -> UGen
+hpb q =
+    let g :: Int -> UGen
+        g _ = let f = lfn q 1330 1395
+                  a = lfn q 0.001 0.007
+              in blip AR f 24 * a
+    in mixFill 2 g
+
+mk_f :: (UGen -> UGen -> UGen) -> UGen
+mk_f d =
+    let q = lfn 5.2 5.2 5.21
+        a = d dinf (mce [1,3,2,7,8])
+        tr = impulse KR q 0
+        freq = demand tr 0 a * 30 + 340
+    in sum [blip AR freq 3 * lfn q 0.001 0.01
+           ,resonz (impulse AR q (mce2 0 0))
+                   (lfn 5 30 640)
+                   (lfn q 0.1 0.5)
+                   * lfn q 0.01 1.8
+           ,hpb q * lfn q 1.2 1.8
+           ,blip AR (lfn q 16 36) 3 * mce2 0.03 0.09]
+
+rzblp :: UGen
+rzblp = mk_f drand + mk_f dxrand
+
+main :: IO ()
+main = audition (out 0 rzblp)
diff --git a/Sound/SC3/Graph/RD_s_chirp.hs b/Sound/SC3/Graph/RD_s_chirp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_s_chirp.hs
@@ -0,0 +1,32 @@
+-- s-chirp (rd)
+module Sound.SC3.Graph.RD_s_chirp where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+
+s_chirp :: UGen
+s_chirp =
+  let x = mouseX KR 15 0 Linear 0.1
+      y = mouseY KR 15 27 Linear 0.1
+      t = dust 'α' KR 9
+      b = tChoose 'β' t (mce [36,48,60,72])
+      n = lfNoise1 'γ' KR (mce2 3 3.05) * 0.04
+      d = tIRand 'δ' x y t
+      e = decay2 t 0.005 (tRand 'ε' 0.02 0.15 t)
+      o = let k = degreeToKey 0 d 12
+              f = midiCPS (b + k + n)
+              m = e * sinOsc AR f 0 * 0.2
+              u = pulseDivider t 9 0
+              r0 = tRand 'ζ' 0.0075 0.125 u
+              r1 = tRand 'η' 0.05 0.15 u
+          in m * 0.5 + allpassC m 0.15 r0 r1
+  in out 0 o
+
+act :: Transport m => m ()
+act = do
+  let scl = [0,2,3.2,5,7,9,10]
+  _ <- async (b_alloc_setn1 0 0 scl)
+  play s_chirp
+
+main :: IO ()
+main = withSC3 act
diff --git a/Sound/SC3/Graph/RD_scritto.hs b/Sound/SC3/Graph/RD_scritto.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_scritto.hs
@@ -0,0 +1,48 @@
+-- scritto (rd)
+module Sound.SC3.Graph.RD_scritto where
+
+import Control.Monad
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import qualified Sound.SC3.Lang.Data.Vowel as V {- hsc3-lang -}
+
+scritto_i :: UGen -> UGen
+scritto_i bx =
+    let buf_at b n = bufRd 1 KR b (mce [n .. n + 4]) NoLoop NoInterpolation
+        v_filter i f a b = resonz i f (b / f) * dbAmp a
+        n0 = lfNoise2 'α' KR 3
+        v_filter_b i =
+            let bi = linLin n0 (-1) 1 0 bx
+                b = buf_at bi in v_filter i (b 0) (b 5) (b 10)
+        t = impulse AR (n0 * 9 + 9) 0
+        ble (e,d) =
+            let n1 = tRand e 0.02 0.06 t
+                n2 = tIRand e 30 52 t
+                n3 = tIRand e 16 32 t
+                p = pulseDivider t d 0
+                b = blip AR (midiCPS n2) n3
+            in (decay2 p 0.01 n1 * b * 12)
+        voice = mix . v_filter_b
+    in out 0 (mce (map (voice . ble) (zip "ab" [1,2])))
+
+s_alloc :: Transport m => (V.Fdata Double,Int) -> m ()
+s_alloc (s,b) = do
+  let s_msg n (_,_,fr,am,bw) = b_setn1 n 0 (fr ++ am ++ bw)
+  _ <- async (b_alloc b 15 1)
+  send (s_msg b s)
+
+s_init :: Transport m => m ()
+s_init = mapM_ s_alloc (zip V.fdata_table [0..])
+
+act :: Transport m => Bool -> m ()
+act i = do
+  when i s_init
+  let n = constant (length (V.fdata_table::[V.Fdata Int]))
+  play (scritto_i n)
+
+main :: IO ()
+main = withSC3 (act True)
+
+{-
+withSC3 (act False)
+-}
diff --git a/Sound/SC3/Graph/RD_scritto_m.hs b/Sound/SC3/Graph/RD_scritto_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_scritto_m.hs
@@ -0,0 +1,29 @@
+-- scritto (rd)
+module Sound.SC3.Graph.RD_scritto_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+import qualified Sound.SC3.Lang.Data.Vowel as V {- hsc3-lang -}
+
+main :: IO ()
+main =
+  let s_msg n (_,_,f,a,b) = b_setn1 n 0 (f ++ a ++ b)
+      s_alloc (s,b) = do _ <- async (b_alloc b 15 1)
+                         send (s_msg b s)
+      buf_at b n = bufRd 1 KR b (mce [n .. n + 4]) NoLoop NoInterpolation
+      v_filter i f a b = resonz i f (b / f) * dbAmp a
+      v_filter_b bi i = v_filter i (buf_at bi 0) (buf_at bi 5) (buf_at bi 10)
+      mk_instr bx = do
+        n <- lfNoise2 KR 3
+        let t = impulse AR (n * 9 + 9) 0
+            i d = do n1 <- tRand 0.02 0.06 t
+                     n2 <- tIRand 30 52 t
+                     n3 <- tIRand 16 32 t
+                     let p = pulseDivider t d 0
+                         b = blip AR (midiCPS n2) n3
+                     return (decay2 p 0.01 n1 * b * 12)
+            bi = linLin n (-1) 1 0 bx
+            voice = mix . v_filter_b bi
+        return . out 0 . mce . map voice =<< mapM i [1,2]
+  in withSC3 (do mapM_ s_alloc (zip V.fdata_table [0..])
+                 let n = constant (length V.fdata_table)
+                 play =<< mk_instr n)
diff --git a/Sound/SC3/Graph/RD_seqr.hs b/Sound/SC3/Graph/RD_seqr.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_seqr.hs
@@ -0,0 +1,32 @@
+-- seqr (rd)
+module Sound.SC3.Graph.RD_seqr where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+
+nrand :: ID z => Int -> z -> UGen -> UGen -> [UGen]
+nrand n e l = mceChannels . randN n e l
+
+nfreq :: ID a => a -> Int -> UGen -> UGen -> [UGen]
+nfreq z n l r = map (midiCPS . floorE) (nrand n z l r)
+
+seqr_f :: UGen -> [UGen] -> UGen
+seqr_f f e =
+    let n = constant (length e `div` 2)
+    in select (lfSaw KR f 0 * n + n) (mce e)
+
+-- > Sound.SC3.UGen.Dot.draw (seqr 12)
+seqr :: Int -> UGen
+seqr n =
+  let f = rand 'α' 9 18 / constant n
+      b = blip AR (mce2 (seqr_f f (nfreq 'β' n 72 96))
+                        (seqr_f f (nfreq 'γ' n 72 84)))
+                  (mce2 (seqr_f f (nrand n 'δ' 1 3))
+                        (seqr_f f (nrand n 'ε' 3 6)))
+      a = mce2 (seqr_f f (nrand n 'ζ' 0.05 0.10))
+               (seqr_f f (nrand n 'η' 0.05 0.15))
+  in b * a
+
+-- n = rand 6 18
+main :: IO ()
+main = audition (out 0 (seqr 12))
diff --git a/Sound/SC3/Graph/RD_shifting_pulses_m.hs b/Sound/SC3/Graph/RD_shifting_pulses_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_shifting_pulses_m.hs
@@ -0,0 +1,53 @@
+-- shifting pulses (rd)
+module Sound.SC3.Graph.RD_shifting_pulses_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+wrp :: UGen -> UGen -> UGen -> UGen
+wrp i l r = linLin i (-1) 1 l r
+
+prt :: UId m => UGen -> UGen -> m UGen
+prt a f = do
+  r0 <- rand 0.2 0.9
+  r1 <- rand 0.95 1.05
+  r2 <- clone 2 (rand 0.95 1.05)
+  let f' = f * wrp (sinOsc KR r0 0) 1 1.01 * r1
+      a' = a * r2
+      o = sinOsc AR (mce2 f f') 0
+  return (o * a')
+
+-- audition . out 0 =<< prts 2 900 0.002
+-- audition . out 0 =<< prts 9 40 0.006
+prts :: UId m => UGen -> UGen -> UGen -> m UGen
+prts n f a = fmap sum (mapM (prt a) [f,f + f .. f * n])
+
+-- audition . out 0 =<< fmt
+fmt :: UId m => m UGen
+fmt = do
+  n <- (lfNoise2 KR 2)
+  return  (formant AR (mce2 20 21) (wrp n 10 100) 200 * 0.35)
+
+-- audition . out 0 =<< pulses
+pulses :: UId m => m UGen
+pulses = do
+  n0 <- clone 2 (brownNoise KR)
+  n1 <- clone 2 (brownNoise KR)
+  n2 <- clone 2 (brownNoise KR)
+  t <- dust KR 0.75
+  let warp i = linLin i (-1) 1
+      l = latch t t
+      p = pulse AR (warp n0 2 (mce2 11 15)) 0.01 * 0.1
+      f = warp n1 300 1800
+      rq = warp n2 0.01 2
+  return (mrg2 (l * rlpf p f rq) (sendTrig t 0 t))
+
+shifting_pulses :: UId m => m UGen
+shifting_pulses = do
+  p1 <- prts 2 900 0.008
+  p2 <- prts 9 40 0.022
+  f <- fmt
+  s <- pulses
+  return (p1 + p2 + f + s)
+
+main :: IO ()
+main = audition . out 0 =<< shifting_pulses
diff --git a/Sound/SC3/Graph/RD_sosc_lp_m.hs b/Sound/SC3/Graph/RD_sosc_lp_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_sosc_lp_m.hs
@@ -0,0 +1,50 @@
+-- sosc-lp (rd)
+module Sound.SC3.Graph.RD_sosc_lp_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+dustR :: UId m => Rate -> UGen -> UGen -> m UGen
+dustR r lo hi = do
+  n1 <- dwhite 1 lo hi
+  n2 <- whiteNoise r
+  d <- dseq dinf n1
+  return (tDuty r d 0 DoNothing (abs n2) 1)
+
+setup :: Transport m => m ()
+setup = do
+  let a = [60, 71, 89, 65, 36, 57, 92, 97, 92, 97]
+      b = [71, 89, 60, 57, 65, 36, 95, 92, 93, 97]
+  _ <- async (b_alloc 10 9 1)
+  _ <- async (b_alloc 11 9 1)
+  send (b_setn1 10 0 a)
+  send (b_setn1 11 0 b)
+
+sosc_lp :: UGen -> UGen -> UGen
+sosc_lp t n =
+    let d_env = decay2 t 0.002 2.5
+        idx = stepper t 0 0 15 1 0
+        f1 = let l = (bufRdL 1 KR 10 idx Loop - 24)
+                 r = (bufRdL 1 KR 11 idx Loop - 24)
+             in midiCPS (mce2 l r)
+        f2 = f1 + n * 1.2
+        o1 = sinOsc AR f1 0 * d_env
+        o2 = sinOsc AR f2 0 * d_env
+    in (o1 + o2) * 0.2
+
+sosc_lp_m :: UId m => m UGen
+sosc_lp_m = do
+  clk <- dustR KR 0.2 0.9
+  n <- lfNoise0 KR (mce2 1 3)
+  return (sosc_lp clk n)
+
+main :: IO ()
+main = withSC3 (setup >> sosc_lp_m >>= play . out 0)
+
+-- > withSC3 resetter
+resetter :: Transport m => m ()
+resetter = do
+  let a = [71, 60, 65, 89, 36, 57, 95, 97, 92, 97]
+      b = [89, 71, 60, 65, 57, 36, 92, 95, 93, 97]
+  send (b_setn1 10 0 a)
+  send (b_setn1 11 0 b)
diff --git a/Sound/SC3/Graph/RD_tgb_m.hs b/Sound/SC3/Graph/RD_tgb_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_tgb_m.hs
@@ -0,0 +1,44 @@
+-- tgb (rd)
+module Sound.SC3.Graph.RD_tgb_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+tgb :: UId m => UGen -> UGen -> m UGen
+tgb b d = do
+  let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
+      pm_t l r du t = let le = mkls l du
+                          re = mkls r du
+                      in tRand le re t
+      wrp i = linLin i (-1) 1
+      pm_n rt l du = do let le = mkls l du
+                            re = mkls l du
+                        n <- whiteNoise rt
+                        return (wrp n le re)
+  gps <- pm_n AR [(0,400),(1,900)] d
+  let t = impulse AR gps 0
+      pm_f (l,r) = pm_t l r d t
+  du <- pm_f ([(0,0.005),(0.5,0.015),(1,0.005)]
+             ,[(0,0.009),(0.5,0.020),(1,0.009)])
+  pn <- pm_f ([(0,-1.0),(0.5,-0.5),(1,0.5)]
+             ,[(0,-0.5),(0.5,0.5),(1,1.0)])
+  rt <- pm_f ([(0,6),(0.5,12),(1,6)]
+             ,[(0,12),(0.5,12),(1,12)])
+  cs <- pm_f ([(0,0),(1,0.95)]
+             ,[(0,0),(1,1)])
+  am <- pm_f ([(0,0.25),(0.5,0.55),(1,0.15)]
+             ,[(0,0.5),(0.5,0.75),(1,0.25)])
+  let cs' = cs * bufDur KR b
+  return (tGrains 2 t b rt cs' du pn am 2)
+
+tgb_10_12 :: UId m => m UGen
+tgb_10_12 = tgb 10 12
+
+act :: (UId m,Transport m) => m ()
+act = do
+  let fn = "/home/rohan/data/audio/pf-c5.aif"
+  _ <- async (b_allocRead 10 fn 0 0)
+  play . out 0 =<< tgb_10_12
+
+main :: IO ()
+main = withSC3 act
diff --git a/Sound/SC3/Graph/RD_tgr_rpr_m.hs b/Sound/SC3/Graph/RD_tgr_rpr_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_tgr_rpr_m.hs
@@ -0,0 +1,63 @@
+-- tgr-rpr (rd)
+module Sound.SC3.Graph.RD_tgr_rpr_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+dustR :: UId m => Rate -> UGen -> UGen -> m UGen
+dustR r lo hi = do
+  n1 <- dwhite 1 lo hi
+  n2 <- whiteNoise r
+  d <- dseq dinf n1
+  return (tDuty r d 0 DoNothing (abs n2) 1)
+
+rpr :: UId m => UGen -> UGen -> m UGen
+rpr n = tRand (in' 1 KR n) (in' 1 KR (n + 1))
+
+tgr_rpr :: (Functor m,UId m) => m UGen
+tgr_rpr = do
+  clk <- dustR AR (in' 1 KR 0) (in' 1 KR 1)
+  rat <- rpr 2 clk
+  dur <- rpr 4 clk
+  pos <- fmap (* bufDur KR 10) (rpr 8 clk)
+  pan <- rpr 10 clk
+  amp <- rpr 6 clk
+  return (tGrains 2 clk 10 rat pos dur pan amp 2)
+
+preset :: [Double]
+preset =
+    [0.01,0.02
+    ,0.95,1.05
+    ,0.02,0.06
+    ,0.6,0.7
+    ,0.7,0.9
+    ,-1.0,1.0]
+
+rSet :: [(Double, Double)]
+rSet =
+    [(0.005,0.025),(0.05,0.25)
+    ,(0.75,0.95),(1.05,1.25)
+    ,(0.001,0.01),(0.02,0.04)
+    ,(0.4,0.5),(0.7,0.8)
+    ,(0.0,0.45),(0.55,1.0)
+    ,(-1.0,0.0),(0.0,1.0)]
+
+edit :: Transport m => m ()
+edit = do
+  s <- mapM (uncurry rrand) rSet
+  send (c_setn [(0,s)])
+  wait 0.35
+
+run :: (UId m,Transport m) => m ()
+run = do
+  let sf = "/home/rohan/data/audio/pf-c5.snd"
+  _ <- async (b_allocRead 10 sf 0 0)
+  send (c_setn [(0,preset)])
+  play . out 0 =<< tgr_rpr
+  wait 0.3
+  _ <- sequence (replicate 64 edit)
+  reset
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/RD_tgrn.hs b/Sound/SC3/Graph/RD_tgrn.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_tgrn.hs
@@ -0,0 +1,26 @@
+-- tgrn (rd)
+module Sound.SC3.Graph.RD_tgrn where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+
+-- > Sound.SC3.UGen.Dot.draw (tgrn 10)
+tgrn :: UGen -> UGen
+tgrn b =
+  let trate = mouseY KR 2 120 Exponential 0.1
+      dur = 1.2 / trate
+      clk = impulse AR trate 0
+      pos = mouseX KR 0 (bufDur KR b) Linear 0.1
+      pan = whiteNoise 'α' KR * 0.6
+      n = roundTo (whiteNoise 'β' KR * 3) 1
+      rate = shiftLeft 1.2 n
+  in tGrains 2 clk b rate pos dur pan 0.5 2
+
+run :: Transport m => m ()
+run = do
+  let fn = "/home/rohan/data/audio/pf-c5.snd"
+  _ <- async (b_allocRead 10 fn 0 0)
+  play (out 0 (tgrn 10))
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/RD_thb.hs b/Sound/SC3/Graph/RD_thb.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_thb.hs
@@ -0,0 +1,191 @@
+-- thb (rd)
+module Sound.SC3.Graph.RD_thb where
+
+import Data.List
+import qualified Music.Theory.Contour.Polansky_1992 as T {- hmt -}
+import qualified Music.Theory.Pitch as T
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Math as M
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.OSC {- hosc -}
+
+-- | Happy birthday
+--
+-- > nub hb == "hapy birtd"
+-- > sort (nub hb) == " abdhiprty"
+hb :: String
+hb = "happy birthday"
+
+-- | Scale degrees
+hb_d :: Num n => [[n]]
+hb_d =
+    [[5,5,6,5,1,7]
+    ,[5,5,6,5,2,1]
+    ,[5,5,5,3,1,7,6]
+    ,[4,4,3,1,2,1]]
+
+-- | Octaves
+hb_o :: Num n => [[n]]
+hb_o =
+    [[3,3,3,3,4,3]
+    ,[3,3,3,3,4,4]
+    ,[3,3,4,4,4,3,3]
+    ,[4,4,4,4,4,4]]
+
+-- | Durations
+hb_t :: Num n => [[n]]
+hb_t =
+    [[3,1,4,4,4,8]
+    ,[3,1,4,4,4,8]
+    ,[3,1,4,4,4,4,4]
+    ,[3,1,4,4,4,4]]
+
+-- | Test typing
+--
+-- > withSC3 plain
+plain :: Transport m => m ()
+plain = do
+  _ <- async (d_recv defaultSynthdef)
+  let p :: [[Double]] -> P Field
+      p = toP . map realToFrac . concat
+  play (pbind [(K_degree,p hb_d - 1)
+              ,(K_octave,p hb_o + 1)
+              ,(K_dur,p hb_t / 16)])
+
+-- | Pitch classes
+--
+-- > tail hb_k == [[7,7,9,7,2,0],[7,7,7,4,0,11,9],[5,5,4,0,2,0]]
+hb_k :: Integral n => [[n]]
+hb_k =
+    let f = floor . M.degreeToKey [0,2,4,5,7,9,11] 12 . pred
+    in map (map f) (hb_d :: [[Double]])
+
+-- | Midi note numbers
+--
+-- > tail hb_m == [[55,55,57,55,62,60],[55,55,67,64,60,59,57],[65,65,64,60,62,60]]
+hb_m :: [[Integer]]
+hb_m = zipWith (\p q -> map T.octpc_to_midi (zip p q)) hb_o hb_k
+
+-- | Transposition predicate.
+is_trs :: (Eq a,Num a) => [a] -> [a] -> Bool
+is_trs p q = T.all_equal (zipWith (-) p q)
+
+-- | 'Enum' transposition predicate.
+--
+-- > e_is_trs "abc" "bcd" == True
+e_is_trs :: Enum a => [a] -> [a] -> Bool
+e_is_trs p q = is_trs (map fromEnum p) (map fromEnum q)
+
+-- | Delete transpositions
+--
+-- > del_trs ["abc","bcd","bca"] == ["abc","bca"]
+del_trs :: Enum a => [[a]] -> [[a]]
+del_trs = nubBy e_is_trs
+
+-- | All /n/ element combinations from /x/, degree is 'length' /x/ '^' /n/.
+--
+-- > all_n_cmb 3 "ab" == ["aaa","aab","aba","abb","baa","bab","bba","bbb"]
+-- > length (nub hb) ^ maximum (map length hb_d) == 10000000
+all_n_cmb :: Monad m => Int -> m a -> m [a]
+all_n_cmb n = sequence . replicate n
+
+-- | All non transpositionally equivalent combinations of elements of
+-- list 'hb' that match the contour of /x/.
+--
+-- > filter ((== 'h') . head) (gen_c [0..5]) == ["hiprty"]
+-- > sort (gen_c [0,1]) == [" a"," b"," d"," h"," i"," p"," r"," t"," y","ad","ah","ap","at","ay","bh","bp","br","bt","by","dy","hi","hp","hr","ht","hy","it","pr","pt","py","ty"]
+gen_c :: Ord a => [a] -> [String]
+gen_c x =
+      let c = T.contour_description x
+          p = all_n_cmb (length x) (nub hb)
+          f q = T.contour_description q == c
+      in del_trs (filter f p)
+
+-- | Cache of 'map' 'gen_c' 'hb_m'
+--
+-- > gen_c_hb_m_cache == map gen_c hb_m
+-- > map length gen_c_hb_m_cache == [209,209,210,209]
+gen_c_hb_m_cache :: [[String]]
+gen_c_hb_m_cache =
+    [["hhphyr","hhphyt","hhphtr","hhihyp","hhihyr","hhihyt","hhihrp","hhihtp","hhihtr","hhrhyt","aahapi","aahayp","aahayi","aahayr","aahayt","aaharp","aahari","aahatp","aahati","aahatr","aapayr","aapayt","aapatr","aabahd","aabaph","aabapi","aabapd","aabayh","aabayp","aabayi","aabayr","aabayt","aabayd","aabaih","aabaid","aabarh","aabarp","aabard","aabath","aabatp","aabati","aabatr","aabatd","aaiayp","aaiayr","aaiayt","aaiarp","aaiatp","aaiatr","aarayt","aadaph","aadapi","aadayh","aadayp","aadayi","aadayr","aadayt","aadaih","aadarh","aadarp","aadari","aadath","aadatp","aadati","aadatr","pprpyt","  h pi","  h yp","  h yi","  h yr","  h yt","  h rp","  h ri","  h tp","  h ti","  h tr","  a hb","  a hd","  a ph","  a pb","  a pi","  a pd","  a yh","  a yp","  a yb","  a yi","  a yr","  a yt","  a yd","  a ih","  a ib","  a id","  a rh","  a rp","  a rb","  a ri","  a rd","  a th","  a tp","  a tb","  a ti","  a tr","  a td","  a db","  p yr","  p yt","  p tr","  b hd","  b ph","  b pi","  b pd","  b yh","  b yp","  b yi","  b yr","  b yt","  b yd","  b ih","  b id","  b rh","  b rp","  b ri","  b rd","  b th","  b tp","  b ti","  b tr","  b td","  i yp","  i yr","  i yt","  i rp","  i tp","  i tr","  r yt","  d ph","  d pi","  d yh","  d yp","  d yi","  d yr","  d yt","  d ih","  d rh","  d rp","  d ri","  d th","  d tp","  d ti","  d tr","bbhbpi","bbhbyp","bbhbyi","bbhbyr","bbhbyt","bbhbrp","bbhbri","bbhbtp","bbhbti","bbhbtr","bbpbyr","bbpbyt","bbpbtr","bbibyp","bbibyr","bbibyt","bbibrp","bbibtp","bbibtr","bbrbyt","bbdbph","bbdbpi","bbdbyh","bbdbyp","bbdbyi","bbdbyr","bbdbyt","bbdbih","bbdbrh","bbdbrp","bbdbri","bbdbth","bbdbtp","bbdbti","bbdbtr","iipiyr","iipiyt","iipitr","iiriyt","ddhdpi","ddhdyp","ddhdyi","ddhdyr","ddhdyt","ddhdrp","ddhdri","ddhdtp","ddhdti","ddhdtr","ddpdyr","ddpdyt","ddpdtr","ddidyp","ddidyr","ddidyt","ddidrp","ddidtp","ddidtr","ddrdyt"]
+    ,["hhphyr","hhphyt","hhphtr","hhihyp","hhihyr","hhihyt","hhihrp","hhihtp","hhihtr","hhrhyt","aahapi","aahayp","aahayi","aahayr","aahayt","aaharp","aahari","aahatp","aahati","aahatr","aapayr","aapayt","aapatr","aabahd","aabaph","aabapi","aabapd","aabayh","aabayp","aabayi","aabayr","aabayt","aabayd","aabaih","aabaid","aabarh","aabarp","aabard","aabath","aabatp","aabati","aabatr","aabatd","aaiayp","aaiayr","aaiayt","aaiarp","aaiatp","aaiatr","aarayt","aadaph","aadapi","aadayh","aadayp","aadayi","aadayr","aadayt","aadaih","aadarh","aadarp","aadari","aadath","aadatp","aadati","aadatr","pprpyt","  h pi","  h yp","  h yi","  h yr","  h yt","  h rp","  h ri","  h tp","  h ti","  h tr","  a hb","  a hd","  a ph","  a pb","  a pi","  a pd","  a yh","  a yp","  a yb","  a yi","  a yr","  a yt","  a yd","  a ih","  a ib","  a id","  a rh","  a rp","  a rb","  a ri","  a rd","  a th","  a tp","  a tb","  a ti","  a tr","  a td","  a db","  p yr","  p yt","  p tr","  b hd","  b ph","  b pi","  b pd","  b yh","  b yp","  b yi","  b yr","  b yt","  b yd","  b ih","  b id","  b rh","  b rp","  b ri","  b rd","  b th","  b tp","  b ti","  b tr","  b td","  i yp","  i yr","  i yt","  i rp","  i tp","  i tr","  r yt","  d ph","  d pi","  d yh","  d yp","  d yi","  d yr","  d yt","  d ih","  d rh","  d rp","  d ri","  d th","  d tp","  d ti","  d tr","bbhbpi","bbhbyp","bbhbyi","bbhbyr","bbhbyt","bbhbrp","bbhbri","bbhbtp","bbhbti","bbhbtr","bbpbyr","bbpbyt","bbpbtr","bbibyp","bbibyr","bbibyt","bbibrp","bbibtp","bbibtr","bbrbyt","bbdbph","bbdbpi","bbdbyh","bbdbyp","bbdbyi","bbdbyr","bbdbyt","bbdbih","bbdbrh","bbdbrp","bbdbri","bbdbth","bbdbtp","bbdbti","bbdbtr","iipiyr","iipiyt","iipitr","iiriyt","ddhdpi","ddhdyp","ddhdyi","ddhdyr","ddhdyt","ddhdrp","ddhdri","ddhdtp","ddhdti","ddhdtr","ddpdyr","ddpdyt","ddpdtr","ddidyp","ddidyr","ddidyt","ddidrp","ddidtp","ddidtr","ddrdyt"]
+    ,["hhytrpi","aapihdb","aayphdb","aaypihb","aaypihd","aaypidb","aayihdb","aayrhdb","aayrphb","aayrphd","aayrpih","aayrpib","aayrpid","aayrpdb","aayrihb","aayrihd","aayridb","aaythdb","aaytphb","aaytphd","aaytpih","aaytpib","aaytpid","aaytpdb","aaytihb","aaytihd","aaytidb","aaytrhb","aaytrhd","aaytrph","aaytrpb","aaytrpi","aaytrpd","aaytrih","aaytrib","aaytrid","aaytrdb","aarphdb","aarpihb","aarpihd","aarpidb","aarihdb","aatphdb","aatpihb","aatpihd","aatpidb","aatihdb","aatrhdb","aatrphb","aatrphd","aatrpih","aatrpib","aatrpid","aatrpdb","aatrihb","aatrihd","aatridb","  phdba","  pihba","  pihda","  pihdb","  pidba","  yhdba","  yphba","  yphda","  yphdb","  ypiha","  ypihb","  ypihd","  ypiba","  ypida","  ypidb","  ypdba","  yihba","  yihda","  yihdb","  yidba","  yrhba","  yrhda","  yrhdb","  yrpha","  yrphb","  yrphd","  yrpba","  yrpih","  yrpia","  yrpib","  yrpid","  yrpda","  yrpdb","  yriha","  yrihb","  yrihd","  yriba","  yrida","  yridb","  yrdba","  ythba","  ythda","  ythdb","  ytpha","  ytphb","  ytphd","  ytpba","  ytpih","  ytpia","  ytpib","  ytpid","  ytpda","  ytpdb","  ytiha","  ytihb","  ytihd","  ytiba","  ytida","  ytidb","  ytrha","  ytrhb","  ytrhd","  ytrph","  ytrpa","  ytrpb","  ytrpi","  ytrpd","  ytrba","  ytrih","  ytria","  ytrib","  ytrid","  ytrda","  ytrdb","  ytdba","  ihdba","  rhdba","  rphba","  rphda","  rphdb","  rpiha","  rpihb","  rpihd","  rpiba","  rpida","  rpidb","  rpdba","  rihba","  rihda","  rihdb","  ridba","  thdba","  tphba","  tphda","  tphdb","  tpiha","  tpihb","  tpihd","  tpiba","  tpida","  tpidb","  tpdba","  tihba","  tihda","  tihdb","  tidba","  trhba","  trhda","  trhdb","  trpha","  trphb","  trphd","  trpba","  trpih","  trpia","  trpib","  trpid","  trpda","  trpdb","  triha","  trihb","  trihd","  triba","  trida","  tridb","  trdba","bbypihd","bbyrphd","bbyrpih","bbyrpid","bbyrihd","bbytphd","bbytpih","bbytpid","bbytihd","bbytrhd","bbytrph","bbytrpi","bbytrpd","bbytrih","bbytrid","bbrpihd","bbtpihd","bbtrphd","bbtrpih","bbtrpid","bbtrihd","ddyrpih","ddytpih","ddytrph","ddytrpi","ddytrih","ddtrpih"]
+    ,["hhb a ","hhdaba","hhd a ","hhd b ","pphaba","pphada","pph a ","pph b ","pph d ","pphbdb","ppb a ","ppiaha","ppiaba","ppiada","ppi h ","ppi a ","ppi b ","ppi d ","ppibhb","ppibdb","ppidhd","ppdaba","ppd a ","ppd b ","yyhaba","yyhada","yyh a ","yyh b ","yyh d ","yyhbdb","yyphih","yypaha","yypaba","yypaia","yypada","yyp h ","yyp a ","yyp b ","yyp i ","yyp d ","yypbhb","yypbib","yypbdb","yypdhd","yypdid","yyb a ","yyiaha","yyiaba","yyiada","yyi h ","yyi a ","yyi b ","yyi d ","yyibhb","yyibdb","yyidhd","yyrhph","yyrhih","yyraha","yyrapa","yyraba","yyraia","yyrada","yyr h ","yyr a ","yyr p ","yyr b ","yyr i ","yyr d ","yyrbhb","yyrbpb","yyrbib","yyrbdb","yyripi","yyrdhd","yyrdpd","yyrdid","yythph","yythih","yythrh","yytaha","yytapa","yytaba","yytaia","yytara","yytada","yytprp","yyt h ","yyt a ","yyt p ","yyt b ","yyt i ","yyt r ","yyt d ","yytbhb","yytbpb","yytbib","yytbrb","yytbdb","yytipi","yytiri","yytdhd","yytdpd","yytdid","yytdrd","yydaba","yyd a ","yyd b ","iihaba","iihada","iih a ","iih b ","iih d ","iihbdb","iib a ","iidaba","iid a ","iid b ","rrhaba","rrhada","rrh a ","rrh b ","rrh d ","rrhbdb","rrphih","rrpaha","rrpaba","rrpaia","rrpada","rrp h ","rrp a ","rrp b ","rrp i ","rrp d ","rrpbhb","rrpbib","rrpbdb","rrpdhd","rrpdid","rrb a ","rriaha","rriada","rri h ","rri a ","rri b ","rri d ","rribhb","rribdb","rridhd","rrdaba","rrd a ","rrd b ","tthaba","tthada","tth a ","tth b ","tth d ","tthbdb","ttphih","ttpaha","ttpaba","ttpaia","ttpada","ttp h ","ttp a ","ttp b ","ttp i ","ttp d ","ttpbhb","ttpbib","ttpbdb","ttpdhd","ttpdid","ttb a ","ttiaha","ttiaba","ttiada","tti h ","tti a ","tti b ","tti d ","ttibhb","ttibdb","ttidhd","ttrhph","ttrhih","ttraha","ttrapa","ttraba","ttraia","ttrada","ttr h ","ttr a ","ttr p ","ttr b ","ttr i ","ttr d ","ttrbhb","ttrbpb","ttrbib","ttrbdb","ttripi","ttrdhd","ttrdpd","ttrdid","ttdaba","ttd a ","ttd b ","ddb a "]]
+
+-- | 'concat' of 'tail' of 'gen_c_hb_m_cache'.  The first two phrases
+-- of 'hb' have the same contour.
+--
+-- > gen_c_hb_m_cache !! 0 == gen_c_hb_m_cache !! 1
+-- > length gen_c_hb_m_cache' == 209 + 210 + 209
+-- > gen_c_hb_m_cache' == nub gen_c_hb_m_cache'
+gen_c_hb_m_cache' :: [String]
+gen_c_hb_m_cache' = concat (tail gen_c_hb_m_cache)
+
+-- | Multiply enumeration index of /c/ by /n/.
+--
+-- > map (unc 1) hb == [104,97,112,112,121,32,98,105,114,116,104,100,97,121]
+-- > map (unc 1e-2) hb == [1.04,0.97,1.12,1.12,1.21,0.32,0.98,1.05,1.1400000000000001,1.16,1.04,1.0,0.97,1.21]
+unc :: (Num a, Enum b) => a -> b -> a
+unc n c = fromIntegral (fromEnum c) * n
+
+-- | 'unc' variant for 'hb' such that minima is @0@ and maxima @1@.
+--
+-- > map hb_md " y" == [0,1]
+hb_md :: (Ord a, Fractional a, Enum b) => b -> a
+hb_md c =
+    let i = map (unc 1) hb
+        l = minimum i
+        r = maximum i
+        n = r - l
+    in (unc 1 c - l) * (1 / n)
+
+-- | /(frequency,amplitude,zero-one)/
+type Cim n = (n,n,n)
+
+-- | 'Cim' scaled variants of 'unc'.
+--
+-- > map cim " y" == [(320.0,1.6e-2,0.0),(1210.0,6.05e-2,1.0)]
+cim :: (Fractional t,Ord t,Enum e) => e -> Cim t
+cim c =
+    let i = unc 1e-2 c
+    in (i * 1e3, i * 5e-2,hb_md c)
+
+-- | 'cim' of 'gen_c_hb_m_cache''.
+ph :: [(Double,Double,Double)]
+ph = concatMap (map cim) gen_c_hb_m_cache'
+
+-- | Trivial 'impulse' instrument
+--
+-- > audition ins_s
+ins_s :: Synthdef
+ins_s =
+    let f = control IR "freq" 440
+        l = control IR "loc" 0
+        a = control IR "amp" 0.1
+        d = control IR "sustain" 0.1
+        s = envSine d a
+        e = envGen AR 1 1 0 1 RemoveSynth s
+        i = impulse AR f 0
+    in synthdef "ins" (out 0 (pan2 i l e))
+
+-- | 'audition' 'ph' using pattern library.  /blur/ is @legato@.
+--
+-- > withSC3 (hear 1 (map cim "hiprty"))
+-- > withSC3 (hear 9 (map cim hb))
+hear :: Transport m => Double -> [Cim Double] -> m ()
+hear blur x =
+    let (f,d,c) = unzip3 x
+        p = toP . map realToFrac
+    in play (pbind [(K_instr,psynth ins_s)
+                   ,(K_freq,p f)
+                   ,(K_dur,p d)
+                   ,(K_legato,p (repeat blur))
+                   ,(K_amp,p c * 0.1 + 0.1)
+                   ,(K_param "loc",p c * 2 - 1)])
+
+main :: IO ()
+main = withSC3 (hear 9 ph)
+
+-- Local Variables:
+-- truncate-lines:t
+-- End:
diff --git a/Sound/SC3/Graph/RD_three_cpsw_m.hs b/Sound/SC3/Graph/RD_three_cpsw_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_three_cpsw_m.hs
@@ -0,0 +1,19 @@
+-- three-cpsw (rd)
+module Sound.SC3.Graph.RD_three_cpsw_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+three_cpsw :: UId m => m UGen
+three_cpsw = do
+  t <- dust KR (mce2 12 18)
+  f0 <- tRand 1 64 t
+  f1 <- lfNoise0 KR f0
+  a <- tRand 0.0 0.5 t
+  dt <- tRand 0.975 1.025 t
+  dh <- tRand 0.750 0.7505 t
+  let f = f1 * mce2 9000 12000 + 9500
+      o = saw AR f + saw AR (f * dh) + saw AR (f * dt)
+  return (clip2 (o * a) 0.75)
+
+main :: IO ()
+main = audition . out 0 =<< three_cpsw
diff --git a/Sound/SC3/Graph/RD_tipnso.hs b/Sound/SC3/Graph/RD_tipnso.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_tipnso.hs
@@ -0,0 +1,20 @@
+-- tipnso (rd)
+module Sound.SC3.Graph.RD_tipnso where
+
+import Sound.SC3.ID {- hsc3 -}
+
+tipnso :: UGen
+tipnso =
+  let x = mouseX KR 1 32 Linear 0.1
+      t = impulse AR x 0
+      n1 = tIRand 'α' 16 72 t
+      n2 = tIRand 'β' 0 1 t
+      n3 = pinkNoise 'γ' AR
+      e = decay2 t 0.01 (mce2 0.1 0.15)
+      f = midiCPS (n1 + 36 + (12 * n2))
+      s = sinOsc AR f 0 * e
+      b = bpf (n3 * e) (36 + midiCPS n1) (175 / midiCPS n1)
+  in (s + b) * mce2 0.15 0.1
+
+main :: IO ()
+main = audition (out 0 tipnso)
diff --git a/Sound/SC3/Graph/RD_tr_out_m.hs b/Sound/SC3/Graph/RD_tr_out_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_tr_out_m.hs
@@ -0,0 +1,33 @@
+-- tr-out (rd)
+module Sound.SC3.Graph.RD_tr_out_m where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+tr_nd :: UId m => UGen -> m (UGen,UGen)
+tr_nd n = do
+  t <- dust KR 1.6
+  r1 <- tRand 0 6 t
+  r2 <- tRand 0 6 t
+  r3 <- tRand 0 6 t
+  let f = midiCPS (bufRdN 1 KR 0 r1 NoLoop)
+      p = bufRdN 1 KR 1 r2 NoLoop
+      a = bufRdN 1 KR 2 r3 NoLoop
+  return (pan2 (sinOsc AR f 0) p a
+         ,sendTrig t n (f / 660))
+
+tr_out :: UId m => m UGen
+tr_out = do
+  ns <- mapM tr_nd [1..4]
+  let o = sum (map fst ns)
+  return (mrg (o : map snd ns))
+
+act :: (UId m,Transport m) => m ()
+act = do
+  _ <- async (b_alloc_setn1 0 0 [60,62,64,65,67,69])
+  _ <- async (b_alloc_setn1 1 0 [-1,-0.5,0,0.25,0.75,1.0])
+  _ <- async (b_alloc_setn1 2 0 [0.01,0.05,0.1,0.15,0.25,0.35])
+  play . out 0 =<< tr_out
+
+main :: IO ()
+main = withSC3 act
diff --git a/Sound/SC3/Graph/RD_trkl_m.hs b/Sound/SC3/Graph/RD_trkl_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_trkl_m.hs
@@ -0,0 +1,36 @@
+-- trkl (rd)
+module Sound.SC3.Graph.RD_trkl_m where
+
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+trkl :: UId m => UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> m UGen
+trkl d ul fu dy la fy = do
+  let tf = xLine KR 1 ul d RemoveSynth
+      st = impulse AR (tf * 8) 0
+      t = impulse AR tf 0
+  r0 <- rand (-1) 1
+  r1 <- rand (-1) 1
+  r2 <- tRand 0.05 1.0 t
+  r3 <- tExpRand 0.001 0.25 st -- non-zero minima
+  fh <- tRand 1.75 2.25 t
+  let a = dbAmp (line KR 12 la d RemoveSynth)
+      f = xLine KR fu 900 d RemoveSynth
+      p = line KR r0 r1 d RemoveSynth
+      o1 = mix (ringz (decay2 t 0.01 dy) (mce2 f (f * fh)) fy)
+      o2 = mix (saw AR (mce2 f (f * fh)))
+  return (pan2 (o1 + o2 * decay2 t 0.1 r2 * r3) p a)
+
+-- > audition . out 0 =<< trkl_r
+trkl_r :: UId m => m UGen
+trkl_r = do
+  d <- rand 0.5 16
+  ul <- rand 16 64
+  fu <- rand 1200 9000
+  dy <- rand 0.005 0.175
+  la <- rand (-60) (-25)
+  fy <- rand 0.015 0.125
+  trkl d ul fu dy la fy
+
+main :: IO ()
+main = overlapTextureU (5,2,12,maxBound) =<< trkl_r
diff --git a/Sound/SC3/Graph/RD_trmlo.hs b/Sound/SC3/Graph/RD_trmlo.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_trmlo.hs
@@ -0,0 +1,52 @@
+-- trmlo (rd)
+module Sound.SC3.Graph.RD_trmlo where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+-- > audition (out 0 trmlo)
+trmlo :: UGen
+trmlo =
+    let mWrp i l r = linLin i (-1) 1 (midiCPS l) (midiCPS r)
+        mWrp1 i m = mWrp i m (m + 1)
+        mWrpN i m n = mWrp i m (m + n)
+        o1 = let f = 5
+                 d = 3
+                 s = envSine d 0.1
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = 65
+                 m = sinOsc KR f 0
+             in pan2 (sinOsc AR (mWrp1 m n) 0) m e
+        o2 = let f = iRand 'α' 5 9
+                 d = iRand 'β' 5 9
+                 s = envSine d (rand 'γ' 0.1 0.2)
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = iRand 'δ' 69 72
+                 m = sinOsc KR f 0
+             in pan2 (sinOsc AR (mWrp1 m n) 0) m e
+        o3 = let f = iRand 'ε' 5 9
+                 d = iRand 'ζ' 9 12
+                 s = envSine d (rand 'η' 0.1 0.2)
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = iRand 'θ' 69 72
+                 m = sinOsc KR f 0
+                 l = line KR 0 (iRand 'ι' 1 5) d DoNothing
+             in pan2 (blip AR (mWrp1 m (n + l)) (linLin m (-1) 1 1 2)) m e
+        o4 = let f = iRand 'κ' 5 18
+                 d = iRand 'λ' 12 15
+                 s = envSine d (rand 'μ' 0.1 0.2)
+                 e = envGen KR 1 5e-2 0 1 DoNothing s
+                 n = iRand 'ν' 69 72
+                 m = sinOsc KR f 0
+                 l = line KR 0 (iRand 'ξ' 1 5) d RemoveSynth
+                 fr = mWrpN m (n + l) (iRand 'ο' 1 5)
+             in pan2 (blip AR fr (linLin m (-1) 1 1 (iRand 'π' 2 24))) m e
+    in o1 + o2 + o3 + o4
+
+main :: IO ()
+main = do
+  let s = synthdef "trmlo" (out 0 trmlo)
+      p = pbind [(K_instr,psynth s)
+                ,(K_dur,pxrand 'ρ' [0.25,0.5,1,2,4] inf)
+                ,(K_legato,1.25)]
+  audition p
diff --git a/Sound/SC3/Graph/RD_trmlo_u.hs b/Sound/SC3/Graph/RD_trmlo_u.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_trmlo_u.hs
@@ -0,0 +1,53 @@
+-- trmlo-u (rd)
+module Sound.SC3.Graph.RD_trmlo_u where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+-- > audition (out 0 trmlo)
+trmlo :: UGen
+trmlo =
+    let mWrp i l r = linLin i (-1) 1 (midiCPS l) (midiCPS r)
+        mWrp1 i m = mWrp i m (m + 1)
+        mWrpN i m n = mWrp i m (m + n)
+        o1 = let f = 5
+                 d = 3
+                 s = envSine d 0.1
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = 65
+                 m = sinOsc KR f 0
+             in pan2 (sinOsc AR (mWrp1 m n) 0) m e
+        o2 = let f = iRand 5 9
+                 d = iRand 5 9
+                 s = envSine d (rand 0.1 0.2)
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = iRand 69 72
+                 m = sinOsc KR f 0
+             in pan2 (sinOsc AR (mWrp1 m n) 0) m e
+        o3 = let f = iRand 5 9
+                 d = iRand 9 12
+                 s = envSine d (rand 0.1 0.2)
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = iRand 69 72
+                 m = sinOsc KR f 0
+                 l = line KR 0 (iRand 1 5) d DoNothing
+             in pan2 (blip AR (mWrp1 m (n + l)) (linLin m (-1) 1 1 2)) m e
+        o4 = let f = iRand 5 18
+                 d = iRand 12 15
+                 s = envSine d (rand 0.1 0.2)
+                 e = envGen KR 1 5e-2 0 1 DoNothing s
+                 n = iRand 69 72
+                 m = sinOsc KR f 0
+                 l = line KR 0 (iRand 1 5) d RemoveSynth
+                 fr = mWrpN m (n + l) (iRand 1 5)
+             in pan2 (blip AR fr (linLin m (-1) 1 1 (iRand 2 24))) m e
+    in o1 + o2 + o3 + o4
+
+main :: IO ()
+main = do
+  let s = synthdef "trmlo" (out 0 trmlo)
+      p = pbind [(K_instr,psynth s)
+                ,(K_dur,pxrand 'α' [0.25,0.5,1,2,4] inf)
+                ,(K_legato,1.25)]
+  audition p
diff --git a/Sound/SC3/Graph/RD_urandom.hs b/Sound/SC3/Graph/RD_urandom.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_urandom.hs
@@ -0,0 +1,46 @@
+-- urandom (rd)
+module Sound.SC3.Graph.RD_urandom where
+
+import Control.Monad {- base -}
+import qualified Data.ByteString.Lazy as B {- bytestring -}
+import Sound.OSC.Coding.Byte {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import System.IO {- base -}
+
+ur_bytes :: Int -> IO B.ByteString
+ur_bytes n = withFile "/dev/urandom" ReadMode (flip B.hGet n)
+
+ur_int :: IO Int
+ur_int = fmap decode_i32 (ur_bytes 4)
+
+ur_double :: IO Double
+ur_double = fmap decode_f64 (ur_bytes 8)
+
+ur_byte_set :: Int -> Int -> IO [B.ByteString]
+ur_byte_set n k =
+    let f h = replicateM k (B.hGet h n)
+    in withFile "/dev/urandom" ReadMode f
+
+-- > ur_int_set 3
+ur_int_set :: Int -> IO [Int]
+ur_int_set = fmap (map decode_i32) . ur_byte_set 4
+
+-- > fmap (map int_to_normal) (ur_int_set 3)
+int_to_normal :: Fractional n => Int -> n
+int_to_normal n = fromIntegral (abs n) / fromIntegral (maxBound::Int)
+
+ur_real_set :: Fractional n => Int -> IO [n]
+ur_real_set = fmap (map int_to_normal) . ur_int_set
+
+-- > audition =<< mk_node
+mk_node :: IO UGen
+mk_node = do
+  [f,g,l] <- ur_real_set 3
+  let f' = linLin f 0 1 440 660
+      g' = linLin g 0 1 0.05 0.25
+      l' = linLin l 0 1 (-1) 1
+  return (pan2 (sinOsc AR f' 0) l' g')
+
+main :: IO ()
+main = overlapTextureM (3,3,9,maxBound) mk_node
diff --git a/Sound/SC3/Graph/RD_vla_addtn.hs b/Sound/SC3/Graph/RD_vla_addtn.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_vla_addtn.hs
@@ -0,0 +1,148 @@
+-- vla-adttn (rd)
+module Sound.SC3.Graph.RD_vla_addtn where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+type R = Double
+type R2 = (R,R)
+
+vla :: [R2]
+vla =
+    [(-49.43290,1.99165)
+    ,(0.00000,1.09187)
+    ,(-2.53835,-2.73340)
+    ,(-8.55317,0.73919)
+    ,(-7.58952,-0.75267)
+    ,(-8.48353,1.70372)
+    ,(-13.92700,1.64759)
+    ,(-39.93130,-2.25142)
+    ,(-19.87800,-3.12024)
+    ,(-34.19660,-1.58899)
+    ,(-18.82040,-1.39847)
+    ,(-21.22520,2.04672)
+    ,(-21.33070,-0.14754)
+    ,(-31.08620,2.05345)
+    ,(-42.51880,-0.55890)
+    ,(-41.19730,0.23896)
+    ,(-46.80570,1.71249)
+    ,(-47.17510,2.37942)
+    ,(-37.97520,-0.83005)
+    ,(-38.32750,-2.49358)
+    ,(-44.79280,-1.16301)
+    ,(-49.11850,1.33082)
+    ,(-45.26480,-0.45146)
+    ,(-46.27050,-0.15578)
+    ,(-63.14360,-3.13979)
+    ,(-44.27590,-2.59826)
+    ,(-40.19680,-2.16540)
+    ,(-56.83330,0.48774)
+    ,(-56.62160,-0.84155)
+    ,(-55.76370,1.59076)
+    ,(-59.36050,-0.99090)
+    ,(-55.42520,-0.58264)
+    ,(-64.99020,0.00110)
+    ,(-63.45910,1.55117)
+    ,(-64.77610,2.68228)
+    ,(-68.27080,-1.82120)
+    ,(-71.90240,1.80545)
+    ,(-79.13910,2.99369)
+    ,(-64.94640,-3.12388)
+    ,(-59.41810,1.84679)
+    ,(-86.33570,1.81713)
+    ,(-88.53500,1.01834)
+    ,(-64.17470,-1.52081)
+    ,(-61.24430,1.45757)
+    ,(-69.88980,-0.47708)
+    ,(-65.39420,0.82882)
+    ,(-73.84740,0.41623)
+    ,(-72.26330,0.31856)
+    ,(-73.88560,2.64035)
+    ,(-70.86610,-0.43802)
+    ,(-67.86130,-0.43389)
+    ,(-80.76020,-2.50016)
+    ,(-66.44520,2.26219)
+    ,(-83.49810,2.57825)
+    ,(-66.01220,-2.08254)
+    ,(-65.30220,-2.83644)
+    ,(-74.05780,0.21665)
+    ,(-72.69060,-2.78729)
+    ,(-75.49700,2.96210)
+    ,(-69.45200,0.72293)
+    ,(-75.36160,0.14687)
+    ,(-70.21110,1.42155)
+    ,(-79.34420,0.76044)
+    ,(-81.56200,2.16997)
+    ,(-84.20670,3.11095)
+    ,(-74.40450,-2.98094)
+    ,(-76.67820,1.96564)
+    ,(-79.95980,2.68183)
+    ,(-77.31420,-1.92260)
+    ,(-74.60450,-1.89189)
+    ,(-67.98670,1.99457)
+    ,(-80.17960,-1.95013)
+    ,(-79.44400,-2.70955)
+    ,(-81.89010,3.12971)
+    ,(-80.18220,1.76888)
+    ,(-82.94420,2.77531)]
+
+p_prep :: R2 -> R2
+p_prep (a,p) = (dbAmp a,p)
+
+unp :: R2 -> [R]
+unp (i,j) = [i,j]
+
+vla_prep :: [R]
+vla_prep = concatMap (unp . p_prep) vla
+
+-- fr = freq,dt = detune
+vla_partial :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+vla_partial fr rise fall dt n =
+    let m = n * 2
+        ampl = bufRdN 1 KR 0 m NoLoop
+        ph = bufRdN 1 KR 0 (m + 1) NoLoop
+        o = let dt' = lfNoise1 'α' KR 1 * dt + 1.0
+            in fSinOsc AR (fr * (n + 1) * dt') ph
+        e = linen (impulse KR 0 0)
+                  (rise * rand 'β' 0.75 1.25)
+                  ampl
+                  (fall * rand 'γ' 0.75 1.25)
+                  DoNothing
+    in o * e
+
+vla_plyr :: UGen -> UGen
+vla_plyr n =
+    let a = control KR "amp" 0.1
+        f = control KR "freq" 129.897
+        rs = control KR "rise" 0.1
+        fa = control KR "fall" 0.5
+        l = control KR "loc" 0.0
+        dt = control KR "dt" 0.001
+        s = sum (map (vla_partial f rs fa dt) [0 .. n - 1])
+        e = detectSilence s 0.001 0.2 RemoveSynth
+    in mrg2 (pan2 s l a) e
+
+plyr36 :: Synthdef
+plyr36 = synthdef "plyr36" (out 0 (vla_plyr 36))
+
+pattern :: P_Bind
+pattern =
+    [(K_instr,pinstr "plyr36")
+    ,(K_param "loc",pwhite 'δ' (-1) 1 inf)
+    ,(K_amp,pwhite 'ε' 0.05 0.1 inf)
+    ,(K_degree,prand 'ζ' [0,1,2,3,4,5,6,7,8] inf)
+    ,(K_octave,prand 'η' [2,3] inf)
+    ,(K_param "dt",pwhite 'θ' 0.001 0.005 inf)
+    ,(K_param "rise",pwhite 'ι' 1 2 inf)
+    ,(K_param "fall",pwhite 'κ' 4 7 inf)
+    ,(K_dur,5)]
+
+act :: Transport m => m ()
+act = do
+  _ <- async (b_alloc_setn1 0 0 vla_prep)
+  _ <- async (d_recv plyr36)
+  play (pbind pattern)
+
+main :: IO ()
+main = withSC3 act
diff --git a/Sound/SC3/Graph/RD_vla_addtn_sharc.hs b/Sound/SC3/Graph/RD_vla_addtn_sharc.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_vla_addtn_sharc.hs
@@ -0,0 +1,79 @@
+-- vla-adttn-sharc (rd)
+module Sound.SC3.Graph.RD_vla_addtn_sharc where
+
+import Data.List {- base -}
+import Sound.Analysis.SHARC {- hsharc -}
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+type R = Double
+type R3 = (R,R,R)
+
+spectra :: [Instrument] -> String -> Int -> [R3]
+spectra sh nm j =
+  let Just i = find ((== nm) . instrument_id) sh
+  in note_spectra (note_normalise (notes i !! j))
+
+vla :: Transport m => FilePath -> m [R3]
+vla fn = do
+  Right sh <- liftIO (read_sharc fn)
+  return (spectra sh "viola_vibrato" 0)
+
+unp :: R3 -> [R]
+unp (_,i,j) = [i,j]
+
+vla_prep :: [R3] -> [R]
+vla_prep = concatMap unp
+
+-- fr = freq,dt = detune
+vla_partial :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+vla_partial fr rise fall dt n =
+    let m = n * 2
+        ampl = bufRdN 1 KR 0 m NoLoop
+        ph = bufRdN 1 KR 0 (m + 1) NoLoop
+        o = let dt' = lfNoise1 'α' KR 1 * dt + 1.0
+            in fSinOsc AR (fr * (n + 1) * dt') ph
+        e = linen (impulse KR 0 0)
+                  (rise * rand 'β' 0.75 1.25)
+                  ampl
+                  (fall * rand 'γ' 0.75 1.25)
+                  DoNothing
+    in o * e
+
+vla_plyr :: UGen -> UGen
+vla_plyr n =
+    let a = control KR "amp" 0.1
+        f = control KR "freq" 129.897
+        rs = control KR "rise" 0.1
+        fa = control KR "fall" 0.5
+        l = control KR "loc" 0.0
+        dt = control KR "dt" 0.001
+        s = sum (map (vla_partial f rs fa dt) [0 .. n - 1])
+        e = detectSilence s 0.001 0.2 RemoveSynth
+    in mrg2 (pan2 s l a) e
+
+plyr36 :: Synthdef
+plyr36 = synthdef "plyr36" (out 0 (vla_plyr 36))
+
+pattern :: P_Bind
+pattern =
+    [(K_instr,pinstr "plyr36")
+    ,(K_param "loc",pwhite 'δ' (-1) 1 inf)
+    ,(K_amp,pwhite 'ε' 0.05 0.1 inf)
+    ,(K_degree,prand 'ζ' [0,1,2,3,4,5,6,7,8] inf)
+    ,(K_octave,prand 'η' [2,3] inf)
+    ,(K_param "dt",pwhite 'θ' 0.001 0.005 inf)
+    ,(K_param "rise",pwhite 'ι' 1 2 inf)
+    ,(K_param "fall",pwhite 'κ' 4 7 inf)
+    ,(K_dur,prand 'λ' [3,5] inf)]
+
+act :: Transport m => FilePath -> m ()
+act fn = do
+  v <- vla fn
+  _ <- async (b_alloc_setn1 0 0 (vla_prep v))
+  _ <- async (d_recv plyr36)
+  play (pbind pattern)
+
+main :: IO ()
+main = withSC3 (act "/home/rohan/data/sharc/sharc.xml")
diff --git a/Sound/SC3/Graph/RD_vlc_distrtn_m.hs b/Sound/SC3/Graph/RD_vlc_distrtn_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_vlc_distrtn_m.hs
@@ -0,0 +1,150 @@
+-- vlc-distrtn (rd)
+-- caution - audio feedback graph
+module Sound.SC3.Graph.RD_vlc_distrtn_m where
+
+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)])
+  wait =<< 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)]
diff --git a/Sound/SC3/Graph/RD_voscil.hs b/Sound/SC3/Graph/RD_voscil.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_voscil.hs
@@ -0,0 +1,38 @@
+-- voscil (rd)
+module Sound.SC3.Graph.RD_voscil where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+-- > Sound.SC3.UGen.Dot.draw (voscil 32)
+voscil :: Real a => a -> UGen
+voscil b =
+  let lfn z = lfNoise0 z KR
+      hb = (constant b - 1) / 2
+      rt = 6
+      f = 600
+      v = vOsc AR (lfn 'α' rt * hb + hb) (f * 2) 0
+      o = let bf = lfn 'β' rt * 40 + 600
+              nh = lfn 'γ' rt * 16 + 24
+          in blip AR bf nh * (lfn 'δ' rt * 0.1 + 0.1)
+      p = pan2 (v + o) (lfn 'ε' rt) (lfn 'ζ' rt * 0.5 + 0.5)
+      w = vOsc AR (lfSaw KR (1 / rt) 0 * hb + hb) f 0
+      q = pan2 w (lfn 'η' rt) (lfn 'θ' rt * 0.5 + 0.5)
+  in p + q
+
+run :: Transport m => m ()
+run = do
+  let bn = 8192 * 4
+      b = 32
+      r_set i =
+          do m <- rrand 2 512
+             j <- sequence (replicate m (rrand 0 bn))
+             k <- sequence (replicate m (rrand (-1) 1))
+             _ <- async (b_alloc i bn 1)
+             send (b_set i (zip j k))
+  mapM_ r_set [0 .. (b - 1)]
+  play (out 0 (voscil b))
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/RD_voscil_u.hs b/Sound/SC3/Graph/RD_voscil_u.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_voscil_u.hs
@@ -0,0 +1,39 @@
+-- voscil-u (rd)
+module Sound.SC3.Graph.RD_voscil_u where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+
+-- > Sound.SC3.UGen.Dot.draw (voscil 32)
+voscil :: Real a => a -> UGen
+voscil b =
+  let lfn = lfNoise0 KR
+      hb = (constant b - 1) / 2
+      rt = 6
+      f = 600
+      v = vOsc AR (lfn rt * hb + hb) (f * 2) 0
+      o = let bf = lfn rt * 40 + 600
+              nh = lfn rt * 16 + 24
+          in blip AR bf nh * (lfn rt * 0.1 + 0.1)
+      p = pan2 (v + o) (lfn rt) (lfn rt * 0.5 + 0.5)
+      w = vOsc AR (lfSaw KR (1 / rt) 0 * hb + hb) f 0
+      q = pan2 w (lfn rt) (lfn rt * 0.5 + 0.5)
+  in p + q
+
+run :: Transport m => m ()
+run = do
+  let bn = 8192 * 4
+      b = 32
+      r_set i =
+          do m <- rrand 2 512
+             j <- sequence (replicate m (rrand 0 bn))
+             k <- sequence (replicate m (rrand (-1) 1))
+             _ <- async (b_alloc i bn 1)
+             send (b_set i (zip j k))
+  mapM_ r_set [0 .. (b - 1)]
+  play (out 0 (voscil b))
+
+main :: IO ()
+main = withSC3 run
diff --git a/Sound/SC3/Graph/RD_waveset.hs b/Sound/SC3/Graph/RD_waveset.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_waveset.hs
@@ -0,0 +1,155 @@
+-- A simple waveset synthesiser (rd)
+module Sound.SC3.Graph.RD_waveset where
+
+import qualified Data.Array as A {- array -}
+import Data.List {- base -}
+import qualified Sound.File.NeXT as F {- hsc3-sf -}
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import System.Environment
+import System.Random {- random -}
+
+-- * Score model.
+
+-- | Interval to schedule in advance.
+latency :: Double
+latency = 0.15
+
+-- | Add t to timestamp.
+offset :: Time -> Bundle -> Bundle
+offset t (Bundle t0 m) = Bundle (t + t0) m
+
+-- | Play non-empty set of osc bundles.
+play_set :: Transport m => [Bundle] -> m ()
+play_set [] = error "play_set:empty"
+play_set (x:xs) = do
+  let (Bundle t _) = x
+  pauseThreadUntil (t - latency)
+  mapM_ sendBundle (x:xs)
+
+-- | Play grouped score.
+play_sets :: Transport m => [[Bundle]] -> m ()
+play_sets [] = return ()
+play_sets s = do
+  t <- time
+  mapM_ (play_set . map (offset t)) s
+
+-- | Split l into chunks of at most n elements.
+form_sets :: Int -> [a] -> [[a]]
+form_sets _ [] = []
+form_sets n l =
+    let (a,b) = splitAt n l
+    in a : form_sets n b
+
+-- | Play score, send in sets on indicated cardinality.
+play_score :: Transport m => Int -> [Bundle] -> m ()
+play_score n s = play_sets (form_sets n s)
+
+-- * Waveset analysis
+
+-- | Zero-crossing predicate.
+is_zc :: (Num a, Ord a) => a -> a -> Bool
+is_zc a b = a <= 0 && b > 0
+
+-- | Locate fractional zero-crossing point.
+locate_fzc :: (Ord a, Fractional a) => a -> a -> a
+locate_fzc x y = (1.0 / (y - x)) * abs x
+
+-- | Fractional zero-crossing constructor, n is the initial frame location.
+fzc :: (Ord a, Fractional a) => a -> [a] -> [a]
+fzc _ [] = []
+fzc _ [_] = []
+fzc n (x:y:z) = if is_zc x y
+                then (n + locate_fzc x y) : fzc (n + 2.0) z
+                else fzc (n + 1.0) (y : z)
+
+-- | Remove zero crossings so that no waveset has length less than m.
+prune :: (Ord a, Num a) => a -> a -> [a] -> [a]
+prune _ _ [] = [] -- hmmm....
+prune m n (x:xs) = if (x - n) < m
+                   then prune m n xs
+                   else x : prune m x xs
+
+-- | zc -> ws
+ws :: [a] -> [(a,a)]
+ws [] = []
+ws [_] = []
+ws (x:y:z) = (x,y) : ws (y : z)
+
+-- * Waveset instrument
+
+-- | A trivial waveset instrument with unit envelope.
+waveset :: UGen
+waveset =
+    let k = control KR
+        o = k "out" 0
+        b = k "bufnum" 0
+        s = k "start" 0
+        e = k "end" 0
+        r = k "rate" 1
+        d = k "dur" 1
+        a = k "amp" 0.2
+        rs = bufRateScale KR b * r
+        ph = phasor AR 0 rs 0 (e - s) 0 + s
+        e_data = Envelope [a, a, 0] [d, 0] [EnvLin] Nothing Nothing
+        e_ugen = envGen AR 1 1 0 1 RemoveSynth e_data
+    in offsetOut o (bufRdL 1 AR b ph Loop * e_ugen)
+
+-- * Waveset synthesizer
+
+-- | Construct s_new message for synthesiser.
+mk_msg :: Double -> Double -> Double -> Double -> Message
+mk_msg b sf ef d =
+    let a = [("bufnum", b), ("start", sf), ("end", ef), ("dur", d)]
+    in s_new "waveset" (-1) AddToTail 1 a
+
+-- | Compare wavesets by duration.
+dur_ord :: (Num t, Ord t) => (t, t) -> (t, t) -> Ordering
+dur_ord (s0, e0) (s1, e1) = compare (e0 - s0) (e1 - s1)
+
+-- | Generate score from waveset data.
+mk_score :: Double -> [Double] -> [(Double, Double)] -> [Bundle]
+mk_score sr repeats w =
+    let durations = zipWith (\(s, e) r -> (e - s) * r / sr) w repeats
+        start_times = scanl (+) 0 durations
+        mk_elem (s,e) t d = Bundle t [mk_msg 10 s e d]
+    in zipWith3 mk_elem w start_times durations
+
+-- | n randomly chosen elements of w.
+rchoose :: Int -> [a] -> [a]
+rchoose n w =
+    let (l, r) = (1, length w)
+        a = A.listArray (l,r) w
+    in take n (map (a A.!) (randomRs (l,r) (mkStdGen 1)))
+
+-- | Load waveset instrument, allocate sound file buffer, do waveset
+--   analysis, generate & play scores.
+run_waveset :: Transport m => String -> m ()
+run_waveset fn = do
+  _ <- async (d_recv (synthdef "waveset" waveset))
+  _ <- async (b_allocRead 10 fn 0 0)
+  (hdr, cs) <- liftIO (F.read fn)
+  let nc = F.channelCount hdr
+      nf = F.frameCount hdr
+      sr = fromIntegral (F.sampleRate hdr)
+      b = cs !! 0
+      w = ws (prune 64 0 (fzc 0 b))
+      pl s = play_score 10 s >> wait 1
+      post = liftIO . putStrLn
+  post ("#f: " ++ show (nc, nf, sr))
+  post ("#w: " ++ show (length w)) -- force w
+  pl (mk_score sr (repeat 1) w)
+  pl (mk_score sr (repeat 2) (reverse w))
+  pl (mk_score sr (cycle [2,4,8]) (sortBy dur_ord w))
+  pl (mk_score sr (randomRs (1,24) (mkStdGen 2)) (rchoose 512 w))
+
+main :: IO ()
+main = do
+  a <- getArgs
+  case a of
+    [fn] -> withSC3 (run_waveset fn)
+    _ -> error "audio file?"
+
+{--
+withSC3 (run_waveset "/home/rohan/data/audio/pf-c5.snd")
+--}
diff --git a/Sound/SC3/Graph/RD_wial_m.hs b/Sound/SC3/Graph/RD_wial_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_wial_m.hs
@@ -0,0 +1,27 @@
+-- wial (rd)
+module Sound.SC3.Graph.RD_wial_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+wial :: (Functor m,UId m) => m UGen
+wial = do
+  let pls c d f = do let t = pulseDivider c d 0
+                         e = decay2 t 0.05 0.75
+                         o = sinOsc AR (toggleFF t * f + f * 2) 0
+                     n0 <- tIRand 0 1 t
+                     return (o * e * n0 * 0.5)
+      smpl f = [(4,6,f,0.75)
+               ,(2,6,f * 2,0.75)
+               ,(1,2,f * 16,0.025)
+               ,(1,5,f * 64,0.005)
+               ,(1,4,f * 128,0.035)
+               ,(1,3,f * 256,0.15)
+               ,(2,3,f * 512,0.35)]
+      plss c (d0,d1,f,a) = fmap (* a) (pls c (mce2 d0 d1) f)
+      clk = impulse AR 16 0
+  n0 <- dust KR 2
+  f <- tWChoose n0 (mce2 (20 * 0.66) 20) (mce2 0.25 0.75) 0
+  fmap sum (mapM (plss clk) (smpl f))
+
+main :: IO ()
+main = audition . out 0 =<< wial
diff --git a/Sound/SC3/Graph/RD_xy_interference.hs b/Sound/SC3/Graph/RD_xy_interference.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_xy_interference.hs
@@ -0,0 +1,18 @@
+-- xy-interference (rd)
+module Sound.SC3.Graph.RD_xy_interference where
+
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect
+
+xy_interference :: UGen
+xy_interference =
+  let x = mouseX KR 20 22000 Linear (mce2 0.005 0.025)
+      y = mouseY KR 20 22000 Linear (mce2 0.005 0.075)
+      nd = let n = lfNoise0 'α' KR (mce2 5 9)
+               a = sinOsc AR (x + n) 0
+               b = sinOsc AR y 0
+           in a * b
+  in mix (uclone 'β' 3 nd)
+
+main :: IO ()
+main = audition (out 0 xy_interference)
diff --git a/Sound/SC3/Graph/RD_xy_interference_m.hs b/Sound/SC3/Graph/RD_xy_interference_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_xy_interference_m.hs
@@ -0,0 +1,17 @@
+-- xy-interference-m (rd)
+module Sound.SC3.Graph.RD_xy_interference_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+xy_interference :: UId m => m UGen
+xy_interference = do
+  let x = mouseX KR 20 22000 Linear (mce2 0.005 0.025)
+      y = mouseY KR 20 22000 Linear (mce2 0.005 0.075)
+      nd = do n <- lfNoise0 KR (mce2 5 9)
+              let a = sinOsc AR (x + n) 0
+                  b = sinOsc AR y 0
+              return (a * b)
+  fmap sum (sequence (replicate 3 nd))
+
+main :: IO ()
+main = audition . out 0 =<< xy_interference
diff --git a/Sound/SC3/Graph/SC_bottle_m.hs b/Sound/SC3/Graph/SC_bottle_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/SC_bottle_m.hs
@@ -0,0 +1,27 @@
+-- bottle (sc)
+module Sound.SC3.Graph.SC_bottle_m where
+
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+bottle :: UId m => m UGen
+bottle = do
+  freq <- rand 220 880
+  wn <- whiteNoise AR
+  pn <- pinkNoise AR
+  let perc = envPerc 0.1 0.6
+      ex = envGen KR 1 1 0 1 DoNothing perc * wn * 0.02
+      flute = ringz ex freq 0.3
+      r = resonz pn (5 + (freq / 2)) 0.1
+      breath = envGen KR 1 1 0 1 DoNothing perc * r
+      rapf i = do x <- linRand 0.001 0.1 (-1)
+                  return (i + allpassN i 0.1 x 1.0 * 0.5)
+      cls i = let en = let c = EnvNum (-4) in (c,c,c)
+                  l = envLinen' 0.01 3.0 1.0 1 en
+                  z = (breath + i) * envGen KR 1 1 0 1 RemoveSynth l
+              in mce2 z z
+  f <- chainM 2 rapf flute
+  return (cls f)
+
+main :: IO ()
+main = overlapTextureU (2,0,2,maxBound) =<< bottle
diff --git a/Sound/SC3/Graph/SP_insects_m.hs b/Sound/SC3/Graph/SP_insects_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/SP_insects_m.hs
@@ -0,0 +1,22 @@
+-- insects (sp)
+module Sound.SC3.Graph.SP_insects_m where
+
+import Sound.SC3.Monad {- hsc3 -}
+
+insect :: UId m => m UGen
+insect = do
+  r1 <- rand 2000 3000
+  r2 <- rand 0.05 0.1
+  n1 <- lfNoise2 KR (r2 * 50 + 50)
+  r4 <- rand 1 10
+  r5 <- rand 0.05 0.1
+  n2 <- lfNoise2 KR r5
+  let a = sinOsc KR r4 0 * 0.5 + 0.5
+      o = sinOsc AR (r1 + n1) r2 * 0.005 * a
+  return (pan2 o n2 1)
+
+insects :: UId m => m UGen
+insects = fmap sum (sequence (replicate 60 insect))
+
+main :: IO ()
+main = audition . out 0 =<< insects
diff --git a/Sound/SC3/Graph/TM_drummer.hs b/Sound/SC3/Graph/TM_drummer.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/TM_drummer.hs
@@ -0,0 +1,19 @@
+-- drummer (tm)
+module Sound.SC3.Graph.TM_drummer where
+
+import Sound.SC3.ID {- hsc3 -}
+
+drummer :: UGen
+drummer =
+  let n = whiteNoise 'α' AR
+      tempo = 4
+      tr = impulse AR tempo 0
+      tr_2 = pulseDivider tr 4 2
+      tr_4 = pulseDivider tr 4 0
+      snare = n * decay2 tr_2 0.005 0.5
+      bass = sinOsc AR 60 0 * decay2 tr_4 0.005 0.5
+      hihat = hpf n 10000 * decay2 tr 0.005 0.5
+  in pan2 (snare + bass + hihat) 0 0.4
+
+main :: IO ()
+main = audition (out 0 drummer)
diff --git a/css/emacs.css b/css/emacs.css
new file mode 100644
--- /dev/null
+++ b/css/emacs.css
@@ -0,0 +1,16 @@
+/* http://code.haskell.org/~malcolm/hscolour/emacs.css */
+.hs-keyglyph { color: DarkGoldenrod;  }
+.hs-layout   { color: Black;}
+.hs-keyword  { color: PaleGreen;}
+.hs-comment, .hs-comment a { color: Firebrick;}
+.hs-str      { color: RosyBrown; }
+.hs-chr      { color: RosyBrown;}
+.hs-keyword  { color: BlueViolet; }
+.hs-conid    { color: ForestGreen; }
+.hs-varid    { color: black; }
+.hs-num      { color: black; }
+.hs-varop    { color: DarkGoldenrod; }
+.hs-conop    { color: DarkGoldenrod; }
+.hs-sel      { color: Red; }
+.hs-cpp      { color: Red; }
+.hs-definition { color: Blue; }
diff --git a/gr/1-1Ni.hs b/gr/1-1Ni.hs
--- a/gr/1-1Ni.hs
+++ b/gr/1-1Ni.hs
@@ -9,7 +9,7 @@
 scr h n f d =
     let (h0,h1) = h f
         o z = sinOsc AR (expRand z h0 h1) 0 * 0.2
-        m = mce (map o (take n ['a'..]))
+        m = mce (map o (take n ['α'..]))
         e = lfGauss AR d (1/4) 0 NoLoop RemoveSynth
     in splay (m * e) 1 0.1 0 True
 
@@ -17,14 +17,14 @@
 -- > Sound.SC3.UGen.Dot.draw (b 8)
 b :: Int -> Synthdef
 b np =
-    let f = midiCPS (lchoose 'a' [40,45,52])
+    let f = midiCPS (lchoose 'β' [40,45,52])
         h n = (n,n + (n / 64))
     in synthdef "b" (out 0 (scr h np f 9))
 
 -- > audition (c 12)
 c :: Int -> Synthdef
 c np =
-    let f = midiCPS (choose 'a' (in' 3 KR 0))
+    let f = midiCPS (choose 'γ' (in' 3 KR 0))
         h n = (n - (n / 128),n + (n / 128))
     in synthdef "c" (out 0 (scr h np f 6))
 
@@ -36,11 +36,10 @@
 -- > mapM_ killThread t
 begin :: Int -> IO [ThreadId]
 begin n = do
-  t0 <- forkIO (forever (audition (b n) >> pauseThread 4))
+  t0 <- forkIO (forever (audition (b n) >> wait 4))
   t1 <- forkIO (let set f = withSC3 (send (c_setn [(0,f)]))
-                in mapM_ (\f -> set f >> pauseThread 10) (cycle x))
-  t2 <- forkIO (do pauseThread 0.1
-                   forever (audition (c n) >> pauseThread 0.5))
+                in mapM_ (\f -> set f >> wait 10) (cycle x))
+  t2 <- forkIO (wait 0.1 >> forever (audition (c n) >> wait 0.5))
   return [t0,t1,t2]
 
 main :: IO ()
diff --git a/gr/1-4Q6.hs b/gr/1-4Q6.hs
--- a/gr/1-4Q6.hs
+++ b/gr/1-4Q6.hs
@@ -1,12 +1,9 @@
 -- http://sccode.org/1-4Q6 (f0)
 
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Control.Instrument
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 -- > audition risset
--- > Sound.SC3.UGen.Dot.draw risset
 --
 -- let set p = withSC3 (\fd -> send fd (n_set (-1) p))
 -- set [("trig",1)]
@@ -17,9 +14,9 @@
 risset =
     let k = control KR
         pan = k "pan" 0
-        freq = k "freq" 400
+        f = k "freq" 400
         ampl = k "amp" 0.1
-        dur = k "sustain" 2
+        d = k "sustain" 2
         tr = tr_control "trig" 1
         amps = [1,0.67,1,1.8,2.67,1.67,1.46,1.33,1.33,1,1.33]
         durs = [1,0.9,0.65,0.55,0.325,0.35,0.25,0.2,0.15,0.1,0.075]
@@ -27,21 +24,22 @@
         dets = [0,1,0,1.7,0,0,0,0,0,0,0]
         fn i =
             let shp = let c = EnvNum (-4.5)
-                      in envPerc' 0.005 (dur * durs!!i) (amps!!i) (c,c)
+                      in envPerc' 0.005 (d * durs!!i) (amps!!i) (c,c)
                 env = envGen AR tr 1 0 1 DoNothing shp
-            in sinOsc AR (freq * frqs!!i + dets!!i) 0 * ampl * env
+            in sinOsc AR (f * frqs!!i + dets!!i) 0 * ampl * env
         src = mixFill 11 fn
     in synthdef "risset" (out 0 (pan2 src pan 1))
 
-pattern :: P Event
+pattern :: P_Bind
 pattern =
-  let i = (InstrumentDef risset False)
-  in pmono i 1000 [("note",prand 'a' [0,2,5,7,11] inf)
-                  ,("octave",prand 'b' [4,5,6,7,9] inf)
-                  ,("legato",1)
-                  ,("dur",prand 'c' [2,3,5,7] inf)
-                  ,("amp",pwhite 'd' 0.025 0.15 inf)
-                  ,("trig",1)]
+  [(K_instr,pinstr' (Instr_Def risset False))
+  ,(K_id,1000)
+  ,(K_note,prand 'α' [0,2,5,7,11] inf)
+  ,(K_octave,prand 'β' [4,5,6,7,9] inf)
+  ,(K_legato,1)
+  ,(K_dur,prand 'γ' [2,3,5,7] inf)
+  ,(K_amp,pwhite 'δ' 0.025 0.15 inf)
+  ,(K_param "trig",1)]
 
 main :: IO ()
-main = audition pattern
+main = audition (pmono pattern)
diff --git a/gr/1-4QM.hs b/gr/1-4QM.hs
--- a/gr/1-4QM.hs
+++ b/gr/1-4QM.hs
@@ -4,25 +4,25 @@
 import Sound.OSC {- hosc -}
 import Sound.SC3.ID {- hsc3 -}
 import qualified Sound.SC3.Lang.Random.IO as L {- hsc3-lang -}
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
 type ST = (UGen,UGen,UGen)
 
 n1 :: ST -> UGen -> UGen
 n1 (s1,s2,s3) a =
-    let x = tScramble 'a' KR 1 (mce [60,67,75,79,94])
-        rel = choose 'a' (mce [0,0,0,0,0,0,0,1])
+    let x = tScramble 'α' KR 1 (mce [60,67,75,79,94])
+        rel = choose 'β' (mce [0,0,0,0,0,0,0,1])
         p = envPerc 0.01 (a + rel)
         e = envGen AR 1 1 0 1 RemoveSynth p
-        ta = midiCPS x * a * choose 'a' s1
-        tb = x * midiCPS (choose 'a' s2)
-        tc = a * midiCPS (choose 'a' s3)
+        ta = midiCPS x * a * choose 'γ' s1
+        tb = x * midiCPS (choose 'δ' s2)
+        tc = a * midiCPS (choose 'ε' s3)
     in out 0 (e * ay ta tb tc 0.25 3 15 10 7 4 1 0)
 
 mk_e :: UGen -> UGen -> UGen
 mk_e m k =
-    let g = let d = dseq 'a' dinf m
-                l = dxrand 'a' dinf (mce2 0 1)
+    let g = let d = dseq 'ζ' dinf m
+                l = dxrand 'η' dinf (mce2 0 1)
             in (duty KR d 0 DoNothing l)
         p = envPerc 0.01 k
     in envGen AR g 1 0 1 RemoveSynth p
@@ -31,13 +31,13 @@
 n2 a =
   let n z = brownNoise z AR
       e = mk_e (mce2 0.5 0.25) (a / 2)
-  in out 0 (e * mce2 (n 'a') (n 'b') * 0.6)
+  in out 0 (e * mce2 (n 'θ') (n 'ι') * 0.6)
 
 n3 :: UGen -> UGen
 n3 a =
   let n z = whiteNoise z AR
       e = mk_e (mce2 0.25 0.5) (a / 4)
-  in out 0 (e * lfNoise0 'a' KR 16 * mce2 (n 'a') (n 'b'))
+  in out 0 (e * lfNoise0 'κ' KR 16 * mce2 (n 'λ') (n 'μ'))
 
 c1_4QM :: Transport m => ST -> m ()
 c1_4QM st = do
@@ -46,7 +46,7 @@
   play (n1 st a)
   play (n2 a)
   play (n3 a)
-  liftIO (pauseThread dt)
+  liftIO (wait dt)
 
 main :: IO ()
 main = do
diff --git a/gr/1-4QN.hs b/gr/1-4QN.hs
--- a/gr/1-4QN.hs
+++ b/gr/1-4QN.hs
@@ -1,11 +1,10 @@
 -- http://sccode.org/1-4QN
 
 import Control.Concurrent {- base -}
-import Control.Monad
+import Control.Monad {- base -}
 import Sound.OSC {- hosc -}
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 import qualified Sound.SC3.Lang.Random.IO as L
 
 -- > withSC3 init_b
@@ -14,7 +13,7 @@
   _ <- async (b_alloc 0 512 1)
   async (b_gen_sine1 0 [Normalise,Wavetable,Clear] (map recip [1,2,3,4]))
 
--- > Sound.SC3.UGen.Dot.draw (mk_g (lfNoise0 'a'))
+-- > Sound.SC3.UGen.Dot.draw (mk_g (lfNoise0 'α'))
 mk_g :: (Rate -> UGen -> UGen) -> Synthdef
 mk_g o =
     let k = control KR
@@ -26,32 +25,34 @@
         ed = k "edens" 1
         l = line KR sd ed d DoNothing
         t = o AR l
-        e_p = envPerc (rand 'a' 0.0001 0.1) (d * rand 'a' 0.5 4)
+        e_p = envPerc (rand 'β' 0.0001 0.1) (d * rand 'γ' 0.5 4)
         e = envGen KR 1 1 0 1 RemoveSynth e_p
         g = grainBuf 2 t (1 / l) b r p 2 0 (-1) 512
     in synthdef "g" (out 0 (g * e))
 
-p1 :: P Event
-p1 = pbind
-    [("dur",pseq [4] inf)
-    ,("sdens",pseq [9000,1000,500] inf / 100)
-    ,("edens",prand 'a' [pseq [9000,1000,500] 1 / 10,pseq [1] 3] inf)
-    ,("rate",pwhite 'b' (-10) 10 inf)
-    ,("pos",pwhite 'c' (-10) 10 inf)]
+p1 :: P_Bind
+p1 =
+    [(K_dur,pseq [4] inf)
+    ,(K_param "sdens",pseq [9000,1000,500] inf / 100)
+    ,(K_param "edens",prand 'δ' [pseq [9000,1000,500] 1 / 10
+                                ,pseq [1] 3] inf)
+    ,(K_param "rate",pwhite 'ε' (-10) 10 inf)
+    ,(K_param "pos",pwhite 'ζ' (-10) 10 inf)]
 
-p2 :: P Event
-p2 = pbind
-     [("dur",pseq [4/3] inf)
-     ,("sdens",pseq [9000,1000,500,25] inf)
-     ,("edens",prand 'a' [pseq [9000,1000,500,25] 1,pseq [1] 4] inf)
-     ,("rate",pwhite 'b' (-100) 100 inf)
-     ,("pos",pwhite 'c' (-10) 10 inf)]
+p2 :: P_Bind
+p2 =
+    [(K_dur,pseq [4/3] inf)
+    ,(K_param "sdens",pseq [9000,1000,500,25] inf)
+    ,(K_param "edens",prand 'η' [pseq [9000,1000,500,25] 1
+                                ,pseq [1] 4] inf)
+    ,(K_param "rate",pwhite 'θ' (-100) 100 inf)
+    ,(K_param "pos",pwhite 'ι' (-10) 10 inf)]
 
 push_g :: Transport m => m Message
 push_g = do
   let ph u r f = u r f 0
       wd u r f = u r f 0 0
-      o_set = [lfNoise0 'a',ph sinOsc,ph impulse,wd lfPulse,ph lfSaw]
+      o_set = [lfNoise0 'κ',ph sinOsc,ph impulse,wd lfPulse,ph lfSaw]
   o <- L.choose o_set
   async (d_recv (mk_g o))
 
@@ -59,9 +60,9 @@
 update_g = do
   _ <- push_g
   dt <- L.choose [1,2,4,8,16,32]
-  pauseThread dt
+  wait dt
 
 main :: IO ()
 main = do
   _ <- forkIO (withSC3 (reset >> init_b >> forever update_g))
-  audition ("g",ppar [p1,p2])
+  audition (p_with (K_instr,pinstr "g") (ppar (map pbind [p1,p2])))
diff --git a/gr/1-4Qx.hs b/gr/1-4Qx.hs
--- a/gr/1-4Qx.hs
+++ b/gr/1-4Qx.hs
@@ -1,7 +1,7 @@
--- http://sccode.org/1-4Qx
+-- http://sccode.org/1-4Qx (jar)
+
 import Sound.SC3 {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw tw
 tw :: UGen
 tw =
     let l = lfCub
diff --git a/gr/1-Td.hs b/gr/1-Td.hs
--- a/gr/1-Td.hs
+++ b/gr/1-Td.hs
@@ -3,44 +3,42 @@
 import Sound.OSC {- hosc -}
 import Sound.SC3.ID {- hsc3 -}
 import qualified Sound.SC3.Lang.Collection as C {- hsc3-lang -}
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
--- > audition one_td_u
--- > Sound.SC3.UGen.Dot.draw one_td_u
 one_td_u :: UGen
 one_td_u =
     let base = control IR "base" 2.6
-        z1 = C.geom 5 2 2
-        z2 = C.geom 4 (base / 2) 2
-        z3 = C.geom 5 (base / 4) 2
-        z4 = C.geom 5 (1/8) 2
+        z1 = C.geom (5::Int) 2 2
+        z2 = C.geom (4::Int) (base / 2) 2
+        z3 = C.geom (5::Int) (base / 4) 2
+        z4 = C.geom (5::Int) (1/8) 2
         z5 = [4,6..24]
         rand_sym z n = rand z (- n) n
-        a = let fr = range 20 10000 (lfdNoise3 'a' KR (base / 4))
-            in lfBrownNoise2 'a' AR fr 0.005 0
-        b = let x = mouseX KR 0 (lchoose 'a' z1) Linear 0.2
-            in gbmanL AR x (rand_sym 'a' 3) (rand_sym 'b' 3) / 3
-        c = let y = mouseY KR 0 (lchoose 'b' z1) Linear 0.2
-                fr = gbmanL AR y (rand_sym 'c' 3) (rand_sym 'd' 3)
+        a = let fr = range 20 10000 (lfdNoise3 'α' KR (base / 4))
+            in lfBrownNoise2 'β' AR fr 0.005 0
+        b = let x = mouseX KR 0 (lchoose 'γ' z1) Linear 0.2
+            in gbmanL AR x (rand_sym 'δ' 3) (rand_sym 'ε' 3) / 3
+        c = let y = mouseY KR 0 (lchoose 'ζ' z1) Linear 0.2
+                fr = gbmanL AR y (rand_sym 'η' 3) (rand_sym 'θ' 3)
             in impulse AR (a2K fr * base / 4) 0 / 4
-        d = dust 'j' AR (lchoose 'c' z2) / 4
-        e = impulse AR (lchoose 'd' z2) 0 / 4
-        g = let n = lfdNoise3 'b' KR base
-                fr = range (rand 'e' 62 100) (rand 'f' 110 350) n
+        d = dust 'ι' AR (lchoose 'κ' z2) / 4
+        e = impulse AR (lchoose 'λ' z2) 0 / 4
+        g = let n = lfdNoise3 'μ' KR base
+                fr = range (rand 'ν' 62 100) (rand 'ξ' 110 350) n
             in lfPulse AR fr 0 0.5 * 0.003
-        amp = let n = dxrand 'a' dinf (mce z3)
+        amp = let n = dxrand 'ο' dinf (mce z3)
                   fr = demand (impulse KR (base / 16) 0) 0 n
-                  g_f = lchoose 'e' z4
-                  am = a2K (gbmanL AR g_f (rand_sym 'g' 3) (rand_sym 'h' 3))
+                  g_f = lchoose 'π' z4
+                  am = a2K (gbmanL AR g_f (rand_sym 'ρ' 3) (rand_sym 'σ' 3))
               in sinOsc KR fr 0 * 0.1 * am + 0.1
-        loc = let mu = rand 'i' 0.2 0.7
-                  ad = rand 'j' 0 0.3
-              in lfTri KR (base / lchoose 'f' z5) 0 * mu + ad
-        klk = let fr = randN 30 'a' 50 10000
-                  ph = randN 30 'a' 0 1
-                  am = randN 30 'b' 0 1
+        loc = let mu = rand 'τ' 0.2 0.7
+                  ad = rand 'υ' 0 0.3
+              in lfTri KR (base / lchoose 'φ' z5) 0 * mu + ad
+        klk = let fr = randN 30 'χ' 50 10000
+                  ph = randN 30 'ψ' 0 1
+                  am = randN 30 'ω' 0 1
                   l = klankSpec_mce fr ph am
-              in klank (lchoose 'g' [a,b,c,d,e,g]) 1 0 1 l
+              in klank (lchoose 'Α' [a,b,c,d,e,g]) 1 0 1 l
         sig = pan2 klk loc amp
     in out 0 sig
 
@@ -49,7 +47,7 @@
 
 postprocess_u :: UGen
 postprocess_u =
-    let z = freeVerb (in' 2 AR 0) (rand 'a' 0.33 1) 0.5 0.5
+    let z = freeVerb (in' 2 AR 0) (rand 'Β' 0.33 1) 0.5 0.5
     in replaceOut 0 (limiter z 1 1e-2)
 
 postprocess_s :: Synthdef
diff --git a/gr/acid-otophilia.hs b/gr/acid-otophilia.hs
--- a/gr/acid-otophilia.hs
+++ b/gr/acid-otophilia.hs
@@ -1,6 +1,6 @@
 -- 08091500Acid309 by_otophilia
 
-import Data.List
+import Data.List {- base -}
 import Data.Maybe
 import Sound.OSC {- hosc -}
 import Sound.SC3.ID {- hsc3 -}
@@ -22,7 +22,7 @@
         env1 = let d = mk_env [110,59,29] [0.005,0.29] [-4,-5]
                in midiCPS (envGen AR 1 1 0 1 DoNothing d)
         s = let p = lfPulse AR env1 0 0.5 - 0.5
-                q = p + mce2 (whiteNoise 'a' AR) (whiteNoise 'b' AR)
+                q = p + mce2 (whiteNoise 'α' AR) (whiteNoise 'β' AR)
                 r = lpf q (env1 * 1.5) * env0
             in clip2 (r + sinOsc AR env1 0.5 * env0 * 1.2) 1
     in synthdef "kick" (out bus s)
@@ -41,7 +41,7 @@
                    q = lfPulse AR (env1 * 1.6) 0 0.5 * 0.5 - 0.25
                    r = lpf (p + q) (env1 * 1.2) * env0
                in r + sinOsc AR env1 0.8 * env0
-        noise = let p = mce2 (whiteNoise 'a' AR) (whiteNoise 'b' AR) * 0.2
+        noise = let p = mce2 (whiteNoise 'γ' AR) (whiteNoise 'δ' AR) * 0.2
                     q = hpf p 200 * 2
                     r = bpf q 6900 0.6 * 3 + p
                 in r * env2
@@ -58,10 +58,10 @@
                in envGen AR 1 1 0 1 DoNothing d
         env2 = let d = mk_env [0,1,0] [0.02,0.3] [0,-4]
                in envGen AR 1 1 0 1 RemoveSynth d
-        noise1 = let p = mce2 (whiteNoise 'a' AR) (whiteNoise 'a' AR) * env1
+        noise1 = let p = mce2 (whiteNoise 'ε' AR) (whiteNoise 'ζ' AR) * env1
                      q = hpf p 600
                  in bpf q 2000 3
-        noise2 = let p = mce2 (whiteNoise 'a' AR) (whiteNoise 'a' AR) * env2
+        noise2 = let p = mce2 (whiteNoise 'η' AR) (whiteNoise 'θ' AR) * env2
                      q = hpf p 1000
                  in bpf q 1200 0.7 * 0.7
         s = let p = noise1 + noise2
@@ -84,7 +84,7 @@
                     p = sum (map f [0..n1-1])
                 in bHiPass p 1000 2 * env1
         noise = let n2 = 8
-                    p = whiteNoise 'a' AR
+                    p = whiteNoise 'ι' AR
                     f i = let t = 1 / midiCPS (linLin i 0 (n2-1) 40 50 + r2)
                           in combN p 0.05 t 0.1
                     q = sum (map f [0..n2-1]) * (1/n2) + p
@@ -164,7 +164,7 @@
 
 dr_seq_bundle :: Int -> Double -> D -> Bundle
 dr_seq_bundle fx_id t =
-    Bundle (UTCr t) .
+    bundle t .
     mapMaybe (dr_msg fx_id) .
     zip [0..]
 
@@ -190,9 +190,9 @@
                  m = if b0 == 1
                      then [p,n_set acid_id [("gate",1)]]
                      else [p]
-             in Bundle (UTCr t) m
+             in bundle t m
         off = let end_t = t + (dt * b1 * 0.25 * 0.99)
-              in Bundle (UTCr end_t) [n_set acid_id [("gate",0)]]
+              in bundle end_t [n_set acid_id [("gate",0)]]
     in if b1 > 0 then [on,off] else [on]
 
 -- * Runtime
@@ -216,7 +216,7 @@
 
 ao_run_seq :: Transport m => (Int,Int) -> [D] -> [B] -> m ()
 ao_run_seq (acid_id,fx_id) d_sq b_sq = do
-  init_t <- utcr
+  init_t <- time
   let dt_seq' = dt_seq 130
       t_seq = scanl1 (+) (init_t : dt_seq')
       act (t,dt,d,b) =
diff --git a/gr/after-goeyvaerts.hs b/gr/after-goeyvaerts.hs
--- a/gr/after-goeyvaerts.hs
+++ b/gr/after-goeyvaerts.hs
@@ -86,7 +86,7 @@
 coinIO :: R -> IO Bool
 coinIO = getStdRandom . coin
 
--- | 'R.wchoose' at 'R'
+-- | 'R.wchoose'.
 wchoose :: RandomGen g => [a] -> [R] -> g -> (a,g)
 wchoose = R.wchoose
 
@@ -118,11 +118,11 @@
         pan = control KR "pan" 0
         s = let p = mix (lfPar AR (freq * mce [0.999,1.001]) 0 * amp)
                 l = [10000,2000,4000,1000]
-                t = [0.005,rand 'a' 0.009 0.05,0.005]
+                t = [0.005,rand 'α' 0.009 0.05,0.005]
                 d = Envelope l t (replicate 3 EnvLin) Nothing Nothing
             in lpf (distort p) (envGen KR 1 1 0 1 DoNothing d)
         e = let l = [0,1,0.4,0.7,0]
-                t = [rand 'b' 0.001 0.005,0.005,0.005,sustain]
+                t = [rand 'β' 0.001 0.005,0.005,0.005,sustain]
                 d = Envelope l t (replicate 4 EnvLin) Nothing Nothing
             in envGen KR 1 1 0 1 RemoveSynth d
     in out 0 (pan2 (s * e) pan 1)
@@ -316,9 +316,9 @@
 ag_run_note :: Transport t => t->Int->Int->R->R->R->(P,S,Int)->IO()
 ag_run_note fd o b a su pn (p,s,z) = do
   let mn = ag_note s z o b
-  print ('o',o,'b',b)
-  print ('p',map (set_prec 2) (M.elems p))
-  print ('s',M.elems s)
+  print ('γ',o,'δ',b)
+  print ('ε',map (set_prec 2) (M.elems p))
+  print ('ζ',M.elems s)
   send fd (nd_msg (midiCPS (fromIntegral mn)) a su pn)
 
 ag_step :: Transport t => t -> AG -> IO AG
@@ -338,7 +338,7 @@
                 return (last p',last s')
   dt <- ioi_row r
   i <- ioi_mult_seq r
-  pauseThread (dt * i)
+  wait (dt * i)
   return (r {probabilities = p',selections = s'})
 
 ag_run :: Transport t => t -> Maybe Int -> IO ()
@@ -353,7 +353,7 @@
 main :: IO ()
 main = do
   i <- randomRIO (256,512)
-  withSC3 (\fd -> ag_run fd (Just i) >> pauseThread 9 >> reset fd)
+  withSC3 (\fd -> ag_run fd (Just i) >> wait 9 >> reset fd)
 
 {-
 withSC3 ag_init
diff --git a/gr/aleatoric-quartet-m.hs b/gr/aleatoric-quartet-m.hs
--- a/gr/aleatoric-quartet-m.hs
+++ b/gr/aleatoric-quartet-m.hs
@@ -2,7 +2,6 @@
 
 import Sound.SC3.Monad {- hsc3 -}
 
--- > aleatoric_quartet >>= Sound.SC3.UGen.Dot.draw
 aleatoric_quartet :: UId m => m UGen
 aleatoric_quartet = do
   let base_mn = control KR "note" 66
@@ -10,8 +9,6 @@
       density = mouseX KR 0.01 1 Linear 0.1
       dmul = recip density * 0.5 * amp
       dadd = amp - dmul
-      (>=>) f g x = f x >>= g
-      chain n f = foldl (>=>) return (replicate n f)
       rapf i = do r <- clone 2 (rand 0 0.05)
                   return (allpassN i 0.05 r 1)
       mk_f = do i0 <- iRand 0 2
@@ -27,7 +24,7 @@
                         n1 <- lfNoise1 KR 8
                         return (n0 * max 0 (n1 * dmul + dadd))
                 return (pan2 (combL x 0.02 f 3) r 1)
-  g <- chain 5 rapf =<< fmap sum (sequence (replicate 4 mk_s))
+  g <- chainM 5 rapf =<< fmap sum (sequence (replicate 4 mk_s))
   return (leakDC g 0.995)
 
 main :: IO ()
diff --git a/gr/alien-froggies.hs b/gr/alien-froggies.hs
--- a/gr/alien-froggies.hs
+++ b/gr/alien-froggies.hs
@@ -5,8 +5,8 @@
 
 alien_froggies :: UGen -> (UGen,UGen)
 alien_froggies r =
-    let r' = fold (r * exp (linRand 'a' (-0.2) 0.2 0)) 1 30
-        o = formant AR r' (expRand 'b' 200 3000) (rand 'c' 0 9 * r' + r')
+    let r' = fold (r * exp (linRand 'α' (-0.2) 0.2 0)) 1 30
+        o = formant AR r' (expRand 'β' 200 3000) (rand 'γ' 0 9 * r' + r')
     in (o * 0.05,r')
 
 main :: IO ()
diff --git a/gr/alien-meadow.hs b/gr/alien-meadow.hs
--- a/gr/alien-meadow.hs
+++ b/gr/alien-meadow.hs
@@ -3,7 +3,6 @@
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
--- > Sound.SC3.UGen.Dot.draw alien_meadow
 alien_meadow :: UGen
 alien_meadow =
     let a = rand 'α' 0 20
diff --git a/gr/ambient1.hs b/gr/ambient1.hs
--- a/gr/ambient1.hs
+++ b/gr/ambient1.hs
@@ -1,11 +1,8 @@
 -- http://sccode.org/1-1y
 -- some edits......
 
-import Control.Applicative
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Control.Instrument
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 chain :: a -> [a -> a] -> a
 chain n ff =
@@ -58,40 +55,45 @@
 audition bass_u
 -}
 
-pulse_i :: Instrument
-pulse_i = InstrumentDef (synthdef "pulse" pulse_u) False
+pulse_i :: Instr
+pulse_i = Instr_Def (synthdef "pulse" pulse_u) False
 
-drone_i :: Instrument
-drone_i = InstrumentDef (synthdef "drone" drone_u) False
+drone_i :: Instr
+drone_i = Instr_Def (synthdef "drone" drone_u) False
 
-bass_i :: Instrument
-bass_i = InstrumentDef (synthdef "bass" bass_u) False
+bass_i :: Instr
+bass_i = Instr_Def (synthdef "bass" bass_u) False
 
 dur_p :: Fractional a => P a
 dur_p = prand 'β' [3,0.7,1,0.5] inf
 
-pulse_p :: P Event
-pulse_p = pbind [("dur",dur_p * 10)
-                ,("midinote",prand 'α' [59,72,76,79,81,88,90] inf)
-                ,("amp",pwhite 'β' 0.2 0.27 inf)
-                ,("attackTime",pwhite 'γ' 0 7 inf)
-                ,("delayTime",0.02)]
-
-drone_p :: P Event
-drone_p = pbind [("dur",dur_p)
-                ,("midinote",prand 'α' [31,40,45,64,68,69] inf)
-                ,("amp",pwhite 'β' 0.03 0.08 inf * 0.7)
-                ,("phase",pwrand 'γ' [0,4.7123] [0.5,0.5] inf)]
+pulse_p :: P_Bind
+pulse_p =
+    [(K_instr,pinstr' pulse_i)
+    ,(K_dur,dur_p * 10)
+    ,(K_midinote,prand 'α' [59,72,76,79,81,88,90] inf)
+    ,(K_amp,pwhite 'β' 0.2 0.27 inf)
+    ,(K_param "attackTime",pwhite 'γ' 0 7 inf)
+    ,(K_param "delayTime",0.02)]
 
-bass_p :: P Event
-bass_p = pbind [("dur",dur_p)
-               ,("midinote",31)
-               ,("amp",0.3)]
+drone_p :: P_Bind
+drone_p =
+    [(K_instr,pinstr' drone_i)
+    ,(K_dur,dur_p)
+    ,(K_midinote,prand 'α' [31,40,45,64,68,69] inf)
+    ,(K_amp,pwhite 'β' 0.03 0.08 inf * 0.7)
+    ,(K_param "phase",pwrand 'γ' [0,4.7123] [0.5,0.5] inf)]
 
-ambient1_p :: P Event
-ambient1_p = ppar [pinstr (pure pulse_i) pulse_p
-                  ,pinstr (pure drone_i) drone_p
-                  ,pinstr (pure bass_i) bass_p]
+bass_p :: P_Bind
+bass_p =
+    [(K_instr,pinstr' bass_i)
+    ,(K_dur,dur_p)
+    ,(K_midinote,31)
+    ,(K_amp,0.3)]
 
 main :: IO ()
-main = audition ambient1_p
+main = do
+  let p = ppar [pbind pulse_p
+               ,pbind drone_p
+               ,pbind bass_p]
+  audition p
diff --git a/gr/analog-bubbles.hs b/gr/analog-bubbles.hs
--- a/gr/analog-bubbles.hs
+++ b/gr/analog-bubbles.hs
@@ -2,7 +2,6 @@
 
 import Sound.SC3 {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw (synthdef "analog-bubbles" analog_bubbles)
 analog_bubbles :: UGen
 analog_bubbles =
   let o = lfSaw KR (mce2 8 7.23) 0 * 3 + 80
diff --git a/gr/arpeggio.hs b/gr/arpeggio.hs
--- a/gr/arpeggio.hs
+++ b/gr/arpeggio.hs
@@ -2,10 +2,8 @@
 
 import Control.Monad {- base -}
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
--- > Sound.SC3.UGen.Dot.draw analogarpeggio
 analogarpeggio :: Synthdef
 analogarpeggio =
     let k = control KR
@@ -23,49 +21,53 @@
     in synthdef "analogarpeggio" (out o (pan2 (e * s * a) p 0.25))
 
 {-
-audition (analogarpeggio
-         ,(pbind [("dur",pwrand 'a' [0.1,0.25] [2/3,1/2] inf)
-                 ,("freq",pwhite 'b' 440.0 1600.0 inf)
-                 ,("pan",pwhite 'c' (-1.0) 1.0 inf)
-                 ,("amp",pwhite 'd' 0.0 0.5 inf)
-                 ,("cutoffmult",pwhite 'e' 4.0 5.0 inf)
-                 ,("res",pwhite 'f' 0.0 1.0 inf)]))
+audition (pbind [(K_instr,psynth analogarpeggio)
+                ,(K_dur,pstutter 8 (pwrand 'α' [0.1,0.25] [2/3,1/3] inf))
+                ,(K_note,pwrand 'β' [0,2,4,5,7] [0.3,0.1,0.3,0.1,0.2] inf)
+                ,(K_octave,pstutter 4 (prand 'γ' [4,5,6,7] inf))
+                ,(K_param "pan",pbrown 'δ' (-1.0) 1.0 0.25 inf)
+                ,(K_amp,pbrown 'ε' 0.1 0.5 0.15 inf)
+                ,(K_param "cutoffmult",pbrown 'ζ' 4.0 5.0 0.1 inf)
+                ,(K_param "res",pbrown 'η' 0.0 1.0 0.25 inf)])
 -}
 
+-- > pinterp 3 0 9 == toP' [0,3,6]
+-- > pseries 6 ((15 - 3) / 6) 3 == toP' [6,8,10]
 pinterp :: (Fractional a) => Int -> a -> a -> P a
 pinterp n s e = pseries s ((e - s) / fromIntegral n) n
 
 pinterp' :: (Fractional a) => P Int -> P a -> P a -> P a
 pinterp' n s e = join (pzipWith3 pinterp n s e)
 
-arpeggio :: [(Key,P Double)]
+arpeggio :: P_Bind
 arpeggio =
-    [("dur"
-     ,let d = pwrand 'n' [0.25,0.125,0.0625] [0.4875,0.4875,0.025] inf
+    [(K_instr,psynth analogarpeggio)
+    ,(K_dur
+     ,let d = pwrand 'α' [0.25,0.125,0.0625] [0.4875,0.4875,0.025] inf
       in pstutter 32 d)
-    ,("cutoffmult"
-     ,let n = prand 'a' [8,16,24,32] inf
-          s = pwhite 'b' 2.5 5.0 inf
-          e = pwhite 'c' 1.5 7.0 inf
+    ,(K_param "cutoffmult"
+     ,let n = prand 'β' [8,16,24,32] inf
+          s = pwhite 'γ' 2.5 5.0 inf
+          e = pwhite 'δ' 1.5 7.0 inf
       in pinterp' n s e)
-    ,("res"
-     ,let n = prand 'd' [8,16,24,32] inf
-          s = pexprand 'e' 0.02 0.5 inf
-          e = pexprand 'f' 0.02 1.0 inf
+    ,(K_param "res"
+     ,let n = prand 'ε' [8,16,24,32] inf
+          s = pexprand 'ζ' 0.02 0.5 inf
+          e = pexprand 'η' 0.02 1.0 inf
       in pinterp' n s e)
-    ,("pan"
-     ,let n = prand 'g' [8,16] inf
-          s = pwhite 'h' (-1.0) 1.0 inf
+    ,(K_param "pan"
+     ,let n = prand 'θ' [8,16] inf
+          s = pwhite 'ι' (-1.0) 1.0 inf
           s' = fmap (< 0) s
-          e = pif s' (pwhite 'i' 0.0 1.0 inf) (pwhite 'i' (-1.0) 0.0 inf)
+          e = pif s' (pwhite 'κ' 0.0 1.0 inf) (pwhite 'λ' (-1.0) 0.0 inf)
       in pinterp' n s e)
-    ,("amp"
-     ,let n = prand 'j' [8,16,24,32] inf
-          s = prand 'k' [0.25,0.05,0.5] inf
-          e = prand 'l' [0.25,0.05,0.5,0.01] inf
+    ,(K_amp
+     ,let n = prand 'μ' [8,16,24,32] inf
+          s = prand 'ν' [0.25,0.05,0.5] inf
+          e = prand 'ξ' [0.25,0.05,0.5,0.01] inf
       in pinterp' n s e)
-    ,("note"
-     ,let f x = pn (fromList x) 8
+    ,(K_note
+     ,let f x = pn (toP x) 8
       in pseq (map f [[10,6,1,-2]
                      ,[-3,1,6,9]
                      ,[9,6,1,-3]
@@ -74,11 +76,11 @@
                      ,[-3,1,6,9]
                      ,[8,6,1,-3]
                      ,[-6,1,6,8]]) inf)
-    ,("octave"
+    ,(K_octave
      ,pstutter 8 (pseq [7,6,5,4,4,5,6,7] inf))]
 
 main :: IO ()
 main = do
   let n = 60/157
-      p = pedit "dur" (* n) (pbind arpeggio)
-  withSC3 (play (analogarpeggio,p))
+      p = pedit K_dur (* n) (pbind arpeggio)
+  withSC3 (play p)
diff --git a/gr/babbling-brook-m.hs b/gr/babbling-brook-m.hs
--- a/gr/babbling-brook-m.hs
+++ b/gr/babbling-brook-m.hs
@@ -1,8 +1,8 @@
--- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html (jmcc)
+-- babbling brook (jmcc)
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
 
 import Sound.SC3.Monad {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw =<< babbling_brook
 babbling_brook :: UId m => m UGen
 babbling_brook = do
   let b f m a g = do n1 <- brownNoise AR
diff --git a/gr/birds-hp.hs b/gr/birds-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/birds-hp.hs
@@ -0,0 +1,22 @@
+-- birds (jmcc)
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+
+node :: UId m => m UGen
+node = do
+  let f = lag (lfSaw AR (7 + #(rand (-1.5) 1.5)) #(rand 0 1) * #(rand 11 15)) 0.1 + #(rand 94 102)
+  let a = lfPulse KR (1 / #(rand 12 15.6)) #(rand 0 1) 0.16 * 0.05
+  let b = sinOsc AR (midiCPS f) #(rand 0 1) * a
+  return (rotate2 b (silent 1) #(rand (-1) 1))
+
+birds :: UId m => m UGen
+birds = do
+  d <- return . sum =<< sequence (replicate 6 node)
+  let apf i = do return (allpassL i 0.07 #(rand 0 0.06) #(rand 0.7 2.0))
+  w <- chainM 12 apf d
+  return (d * 0.7 + w * 0.3)
+
+main :: IO ()
+main = audition . out 0 =<< birds
diff --git a/gr/birds-m.hs b/gr/birds-m.hs
--- a/gr/birds-m.hs
+++ b/gr/birds-m.hs
@@ -1,14 +1,8 @@
--- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html (jmcc)
+-- birds (jmcc)
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
 
 import Sound.SC3.Monad {- hsc3 -}
 
-composeM :: Monad m => [a -> m a] -> a -> m a
-composeM fs i = foldr (=<<) (return i) fs
-
-chainM :: Monad m => Int -> (a -> m a) -> a -> m a
-chainM n f = composeM (replicate n f)
-
--- > Sound.SC3.UGen.Dot.draw =<< birds
 birds :: UId m => m UGen
 birds = do
   let node = do r1 <- rand 94.0 102.0
diff --git a/gr/bit-reduction.hs b/gr/bit-reduction.hs
--- a/gr/bit-reduction.hs
+++ b/gr/bit-reduction.hs
@@ -4,16 +4,16 @@
 
 sample_rate_decrease :: UGen
 sample_rate_decrease =
-  let f = lfNoise2 'a' KR 8
-      nh = lfNoise2 'a' KR 3
+  let f = lfNoise2 'α' KR 8
+      nh = lfNoise2 'β' KR 3
       src = blip AR (f * 200 + 300) (nh * 10 + 20)
       sr = mouseX KR 1000 (sampleRate * 0.1) Exponential 0.2
   in latch src (impulse AR sr 0)
 
 bit_rate_decrease :: UGen
 bit_rate_decrease =
-  let f = lfNoise2 'a' KR 8
-      nh = lfNoise2 'a' KR 3
+  let f = lfNoise2 'γ' KR 8
+      nh = lfNoise2 'δ' KR 3
       src = blip AR (f * 200 + 300) (nh * 10 + 20)
       sr = mouseX KR 1000 (sampleRate * 0.1) Exponential 0.2
       bit_sz = mouseY KR 1 24 Exponential 0.2
diff --git a/gr/bitwise.hs b/gr/bitwise.hs
--- a/gr/bitwise.hs
+++ b/gr/bitwise.hs
@@ -6,7 +6,6 @@
 (.%.) :: UGen -> UGen -> UGen
 (.%.) = modE
 
--- > Sound.SC3.UGen.Dot.draw bitwise_operators
 bitwise_operators :: UGen
 bitwise_operators =
     let t = pulseCount (impulse AR 8e3 0) 0
diff --git a/gr/black-atlantic-currents.hs b/gr/black-atlantic-currents.hs
--- a/gr/black-atlantic-currents.hs
+++ b/gr/black-atlantic-currents.hs
@@ -2,7 +2,7 @@
 
 import Data.Numbers.Primes {- primes -}
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3.UGen.Protect {- hsc3 -}
 import System.Random {- random -}
 import System.Random.Shuffle {- random-shuffle -}
 
@@ -33,9 +33,9 @@
 
 bac :: UGen
 bac =
-  let x = let ph = i yn * uclone 'a' 2 (lfdNoise3 'a' KR 1)
+  let x = let ph = i yn * uclone 'α' 2 (lfdNoise3 'β' KR 1)
           in out xn (mceReverse (sinOsc AR (60 * 2) ph))
-      y = let ph = i xn * uclone 'a' 2 (lfdNoise3 'a' KR 0.3) * 4
+      y = let ph = i xn * uclone 'γ' 2 (lfdNoise3 'δ' KR 0.3) * 4
           in out yn (sinOsc AR (50 * 2) ph)
   in mrg [inFeedback 2 xn,y,x]
 
@@ -45,10 +45,10 @@
 bac' :: UGen
 bac' =
   let x = let f = c (nth_prime 23)
-              ph = i yn * uclone 'a' 2 (lfdNoise3 'a' KR (sqrt 2))
+              ph = i yn * uclone 'ε' 2 (lfdNoise3 'ζ' KR (sqrt 2))
           in out xn (mceReverse (sinOsc AR f ph))
       y = let f = c (chain 3 nth_prime 1)
-              ph = i xn * uclone 'a' 2 (lfdNoise3 'a' KR (sqrt pi)) * pi
+              ph = i xn * uclone 'η' 2 (lfdNoise3 'θ' KR (sqrt pi)) * pi
           in out yn (tanh (sinOsc AR f ph))
   in mrg [inFeedback 2 xn,y,x]
 
@@ -67,7 +67,7 @@
 
 bac''' :: UGen
 bac''' =
-  let x = let j = range 1 30 (lfNoise0 's' KR (log 2 / 2))
+  let x = let j = range 1 30 (lfNoise0 'ι' KR (log 2 / 2))
               f = select j (mce (map (c . nth_prime) [1..30]))
               ph = i zn * n' lfdNoise3 (map sqrt [1,2]) "ab"
           in out xn (mceReverse (sinOsc AR f ph))
@@ -86,9 +86,9 @@
 
 bac'''' :: UGen
 bac'''' =
-  let x = let j = range 1 30 (lfNoise2 's' KR (log 2 / 2))
+  let x = let j = range 1 30 (lfNoise2 'κ' KR (log 2 / 2))
               ph = i zn * n' lfdNoise3 (map sqrt [1,2]) "ab"
-              f' = map (c . nth_prime) (scramble 'p' [1,3..61])
+              f' = map (c . nth_prime) (scramble 'λ' [1,3..61])
               o = map (\f -> mceReverse (sinOsc AR f ph)) f'
           in out xn (mceChannel 1 (selectX j (mce o)))
       y = let f = c (chain 3 nth_prime 1)
diff --git a/gr/bohlen-pierce-140.hs b/gr/bohlen-pierce-140.hs
--- a/gr/bohlen-pierce-140.hs
+++ b/gr/bohlen-pierce-140.hs
@@ -1,18 +1,19 @@
 -- http://sccode.org/1-W (jj)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 bp140u :: UGen
 bp140u =
     let f z n = n * (3 ** (rand z 0 17 / 13))
         e = envGen AR 1 0.3 0 1 RemoveSynth (envPerc 0.01 1)
-        o = pmOsc AR (f 'a' (mce2 438 442)) (f 'b' 880) (f 'c' e) 0
+        o = pmOsc AR (f 'α' (mce2 438 442)) (f 'β' 880) (f 'γ' e) 0
     in o * e
 
--- > Sound.SC3.UGen.Dot.draw bp140u
 bp140 :: Synthdef
 bp140 = synthdef "bp140" (out 0 bp140u)
 
 main :: IO ()
-main = audition (bp140,pbind [("dur",prand 'a' [1/6,1/3] inf)])
+main = do
+  let p = pbind [(K_instr,psynth bp140),(K_dur,prand 'δ' [1/6,1/3] inf)]
+  audition p
diff --git a/gr/bottle-m.hs b/gr/bottle-m.hs
--- a/gr/bottle-m.hs
+++ b/gr/bottle-m.hs
@@ -8,9 +8,7 @@
   freq <- rand 220 880
   wn <- whiteNoise AR
   pn <- pinkNoise AR
-  let (>=>) f g x = f x >>= g
-      chain n f = foldl (>=>) return (replicate n f)
-      perc = envPerc 0.1 0.6
+  let perc = envPerc 0.1 0.6
       ex = envGen KR 1 1 0 1 DoNothing perc * wn * 0.02
       flute = ringz ex freq 0.3
       r = resonz pn (5 + (freq / 2)) 0.1
@@ -21,7 +19,7 @@
                   l = envLinen' 0.01 3.0 1.0 1 en
                   z = (breath + i) * envGen KR 1 1 0 1 RemoveSynth l
               in mce2 z z
-  f <- chain 2 rapf flute
+  f <- chainM 2 rapf flute
   return (cls f)
 
 main :: IO ()
diff --git a/gr/bowed-string-m.hs b/gr/bowed-string-m.hs
--- a/gr/bowed-string-m.hs
+++ b/gr/bowed-string-m.hs
@@ -1,6 +1,5 @@
 -- bowed string (jmcc)
 
-import Control.Monad {- base -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 import Sound.SC3.Monad {- hsc3 -}
 
@@ -13,7 +12,7 @@
   r0 <- expRand 0.125 0.5
   r1 <- rand 0.7 0.9
   r2 <- sequence (replicate 12 (rand 1.0 3.0))
-  f <- liftM midiCPS (liftM2 (+) (lchoose scale) (lchoose oct))
+  f <- midiCPS `fmap` (lchoose scale .+. lchoose oct)
   n1 <- lfNoise1 KR r0
   let x = n0 * 0.007 * max 0 (n1 * 0.6 + 0.4)
       geom n i z = take n (iterate (* z) i)
diff --git a/gr/bs-070705-m.hs b/gr/bs-070705-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/bs-070705-m.hs
@@ -0,0 +1,73 @@
+-- bs-070705 (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+-- | One step in a bubble sort with specified /greater than/ function.
+bubble_p :: (a -> a -> Bool) -> [a] -> [a]
+bubble_p gt l =
+    case l of
+      e:f:g -> if e `gt` f
+               then f : bubble_p gt (e : g)
+               else e : bubble_p gt (f : g)
+      _ -> l
+
+-- | 'bubble_p' '>'.
+bubble :: (Ord a) => [a] -> [a]
+bubble = bubble_p (>)
+
+-- | One step in /odd even/ sorting, a bubble sort variant.
+odd_even :: (Ord a) => [a] -> [a]
+odd_even = reverse . bubble_p (<) . reverse . bubble_p (>)
+
+-- | Allocate required buffers to /n/ places.
+alloc_data :: Transport m => Int -> m ()
+alloc_data n = do
+  let alloc m b = async (b_alloc b m 1)
+  mapM_ (alloc n) [10, 11, 12]
+
+-- | Simple synthesis renderer, r is the impulse frequency (trigger rate).
+play_data :: (UId m,Transport m) => UGen -> m ()
+play_data r = do
+  let inf_sc = 9e8
+  phase <- dseries inf_sc 0 1
+  f' <- dbufrd 10 phase Loop
+  a' <- dbufrd 11 phase Loop
+  p' <- dbufrd 12 phase Loop
+  let tr = impulse AR r 0
+      f'' = demand tr 0 f'
+      a'' = demand tr 0 a'
+      p'' = demand tr 0 p'
+  play (out 0 (pan2 (ringz tr (midiCPS f'') 0.2) p'' a''))
+
+-- | Randomize initial data of /n/ places, /s/ sort for
+--   /m/ steps, pause for i seconds between each step.
+run_data :: Transport m => ([Double] -> [Double]) -> Int -> Int -> Double -> m ()
+run_data s n m i = do
+  f <- nrrand n 32 96
+  a <- nrrand n 0.25 1
+  p <- nrrand n (-1) 1
+  let prepare l' = take m (iterate s l')
+      f' = prepare f
+      a' = prepare a
+      p' = prepare p
+      l i' (f'', a'', p'') = do
+                     send (b_setn 10 [(0, f'')])
+                     send (b_setn 11 [(0, a'')])
+                     send (b_setn 12 [(0, p'')])
+                     pauseThread i'
+  mapM_ (l i) (zip3 f' a' p')
+
+-- | Run 'odd_even' for 32 iterations at 1 second intervals.
+main :: IO ()
+main = withSC3 (alloc_data 96 >> play_data 24 >> run_data odd_even 96 32 1)
+
+{--
+withSC3 (alloc_data 96)
+withSC3 (play_data 24 >> run_data odd_even 96 96 0.35)
+withSC3 (play_data 24 >> run_data bubble 96 64 0.75)
+withSC3 (play_data 24 >> run_data bubble 96 64 0.25)
+withSC3 (play_data 24 >> run_data bubble 96 32 0.25)
+withSC3 (play_data 24 >> run_data odd_even 96 16 0.25)
+--}
diff --git a/gr/bs-070705.hs b/gr/bs-070705.hs
deleted file mode 100644
--- a/gr/bs-070705.hs
+++ /dev/null
@@ -1,73 +0,0 @@
--- bs-070705 (rd)
-
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
-import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
-
--- | One step in a bubble sort with specified /greater than/ function.
-bubble_p :: (a -> a -> Bool) -> [a] -> [a]
-bubble_p gt l =
-    case l of
-      e:f:g -> if e `gt` f
-               then f : bubble_p gt (e : g)
-               else e : bubble_p gt (f : g)
-      _ -> l
-
--- | 'bubble_p' '>'.
-bubble :: (Ord a) => [a] -> [a]
-bubble = bubble_p (>)
-
--- | One step in /odd even/ sorting, a bubble sort variant.
-odd_even :: (Ord a) => [a] -> [a]
-odd_even = reverse . bubble_p (<) . reverse . bubble_p (>)
-
--- | Allocate required buffers to /n/ places.
-alloc_data :: Transport m => Int -> m ()
-alloc_data n = do
-  let alloc m b = async (b_alloc b m 1)
-  mapM_ (alloc n) [10, 11, 12]
-
--- | Simple synthesis renderer, r is the impulse frequency (trigger rate).
-play_data :: (UId m,Transport m) => UGen -> m ()
-play_data r = do
-  let inf_sc = 9e8
-  phase <- dseries inf_sc 0 1
-  f' <- dbufrd 10 phase Loop
-  a' <- dbufrd 11 phase Loop
-  p' <- dbufrd 12 phase Loop
-  let tr = impulse AR r 0
-      f'' = demand tr 0 f'
-      a'' = demand tr 0 a'
-      p'' = demand tr 0 p'
-  play (out 0 (pan2 (ringz tr (midiCPS f'') 0.2) p'' a''))
-
--- | Randomize initial data of /n/ places, /s/ sort for
---   /m/ steps, pause for i seconds between each step.
-run_data :: Transport m => ([Double] -> [Double]) -> Int -> Int -> Double -> m ()
-run_data s n m i = do
-  f <- nrrand n 32 96
-  a <- nrrand n 0.25 1
-  p <- nrrand n (-1) 1
-  let prepare l' = take m (iterate s l')
-      f' = prepare f
-      a' = prepare a
-      p' = prepare p
-      l i' (f'', a'', p'') = do
-                     send (b_setn 10 [(0, f'')])
-                     send (b_setn 11 [(0, a'')])
-                     send (b_setn 12 [(0, p'')])
-                     pauseThread i'
-  mapM_ (l i) (zip3 f' a' p')
-
--- | Run 'odd_even' for 32 iterations at 1 second intervals.
-main :: IO ()
-main = withSC3 (alloc_data 96 >> play_data 24 >> run_data odd_even 96 32 1)
-
-{--
-withSC3 (alloc_data 96)
-withSC3 (play_data 24 >> run_data odd_even 96 96 0.35)
-withSC3 (play_data 24 >> run_data bubble 96 64 0.75)
-withSC3 (play_data 24 >> run_data bubble 96 64 0.25)
-withSC3 (play_data 24 >> run_data bubble 96 32 0.25)
-withSC3 (play_data 24 >> run_data odd_even 96 16 0.25)
---}
diff --git a/gr/buffer-display.hs b/gr/buffer-display.hs
--- a/gr/buffer-display.hs
+++ b/gr/buffer-display.hs
@@ -1,14 +1,13 @@
 -- http://sccode.org/1-1HR (f0)
 
-import Control.Concurrent
-import Data.CG.Minus {- hcg-minus -}
-import qualified Foreign.C.Math.Double as M {- cmath -}
+import Control.Concurrent {- base -}
 import qualified Graphics.Rendering.Cairo as C {- cairo -}
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.Cairo.Scope.Shell {- hsc3-cairo -}
 
 -- * Type
 
+type R = Double
 data BD_Type = BD_Line | BD_Warp | BD_Flower
 data BD = BD {gain :: R
              ,theta :: R
@@ -35,13 +34,16 @@
   mapM_ f (zip [0..] d)
   C.stroke
 
-pt_rotate' :: Floating a => a -> a -> a -> (a,a)
-pt_rotate' a x y = pt_xy (pt_rotate a (pt x y))
+pt_rotate :: Floating a => a -> (a,a) -> (a,a)
+pt_rotate a (x,y) =
+    let s = sin a
+        c = cos a
+    in (x * c - y * s,y * c + x * s)
 
 render_warp :: R -> R -> [R] -> C.Render ()
 render_warp n a d = do
   C.translate (n/2) (n/2)
-  let f (x,y) = let (x',y') = pt_rotate' (y * 2 * pi) (x * a) (y * a)
+  let f (x,y) = let (x',y') = pt_rotate (y * 2 * pi) (x * a,y * a)
                 in if x == 0 then C.moveTo x' y' else C.lineTo x' y'
   mapM_ f (zip [0..] d)
   C.stroke
@@ -51,8 +53,8 @@
   let d0 = d !! 0
   C.translate (n/2) (n/2)
   C.moveTo (d0 * d0) 0
-  let f (x,y) = let a = ((x `M.fmod` n) / n) * 2 * pi + t
-                    (x',y') = pt_rotate' a (y * y) (x * y)
+  let f (x,y) = let a = ((x `modE` n) / n) * 2 * pi + t
+                    (x',y') = pt_rotate a (y * y,x * y)
                 in C.lineTo x' y'
   mapM_ f (zip [0..] d)
   C.stroke
@@ -102,7 +104,7 @@
         v = varSaw AR x 0 0.5
         f = bpf v y 0.5
         s = sinOsc AR 0 f
-        n = brownNoise 'a' AR * 0.1
+        n = brownNoise 'α' AR * 0.1
     in out 0 (mce2 s n)
 
 bd_shell :: Int -> Shell BD
diff --git a/gr/ccomb-m.hs b/gr/ccomb-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/ccomb-m.hs
@@ -0,0 +1,21 @@
+-- ccomb (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+ccomb :: (Functor m,UId m) => m UGen
+ccomb = do
+  let rng l r i = linLin i (-1) 1 l r
+      lwr = 48
+      flwr = midiCPS lwr
+      spart t = do n <- fmap (rng lwr 72.0) (lfNoise2 KR 0.1)
+                   e <- fmap (decay2 t 0.01) (tRand 0.05 0.75 t)
+                   x <- fmap (* e) (whiteNoise AR)
+                   m <- lfNoise2 KR 0.1
+                   let f = lag (midiCPS n) 0.25
+                       m' = rng 1 8 m
+                   return (combC x (recip flwr) (recip f) m')
+  t <- dust KR (mce2 0.75 0.35)
+  return . (* 0.1) . sum =<< sequence (replicate 12 (spart t))
+
+main :: IO ()
+main = audition . out 0 =<< ccomb
diff --git a/gr/ccomb.hs b/gr/ccomb.hs
deleted file mode 100644
--- a/gr/ccomb.hs
+++ /dev/null
@@ -1,21 +0,0 @@
--- ccomb (rd)
-
-import Sound.SC3.Monad {- hsc3 -}
-
-ccomb :: (Functor m,UId m) => m UGen
-ccomb = do
-  let rng l r i = linLin i (-1) 1 l r
-      lwr = 48
-      flwr = midiCPS lwr
-      spart t = do n <- fmap (rng lwr 72.0) (lfNoise2 KR 0.1)
-                   e <- fmap (decay2 t 0.01) (tRand 0.05 0.75 t)
-                   x <- fmap (* e) (whiteNoise AR)
-                   m <- lfNoise2 KR 0.1
-                   let f = lag (midiCPS n) 0.25
-                       m' = rng 1 8 m
-                   return (combC x (recip flwr) (recip f) m')
-  t <- dust KR (mce2 0.75 0.35)
-  return . (* 0.1) . sum =<< sequence (replicate 12 (spart t))
-
-main :: IO ()
-main = audition . out 0 =<< ccomb
diff --git a/gr/cds-070701-m.hs b/gr/cds-070701-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/cds-070701-m.hs
@@ -0,0 +1,111 @@
+-- | cds-070701 (rd)
+--
+-- The 'source' data are breakpoint sets normalized over the time
+-- interval (0,1).  There are a fixed number of 'locations' per cycle.
+-- The data sets are sampled at these locations and loaded into
+-- buffers.  The buffers are read using dbufrd.  One of the data sets
+-- gives the time interval to step forward.
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+-- | Real
+type R = Double
+
+-- | Point
+type P = (R,R)
+
+-- | Data set
+type D = [P]
+
+-- | Points that bracket a time.
+pts :: D -> R -> (P,P)
+pts d n =
+    case d of
+      p0:p1:r -> let (t,_) = p1
+                 in if n <= t
+                    then (p0,p1)
+                    else pts (p1:r) n
+      _ -> error "pts"
+
+-- | Linear interpolation.
+--
+-- > lerp 0.5 (0,0) (1,1) == (0.5,0.5)
+-- > lerp 0.25 (0,0) (0.5,1) == (0.25,0.5)
+lerp :: R -> P -> P -> P
+lerp n (t0,d0) (t1,d1) =
+  let n' = (n - t0) / (t1 - t0)
+      f i = d0 + ((d1 - d0) * i)
+  in (n,f n')
+
+-- | Linear interpolating lookup.
+lerpd :: D -> R -> P
+lerpd t n =
+  let (p0,p1) = pts t n
+  in lerp n p0 p1
+
+-- | Linearize in time (ie. /t/ is in equal steps).
+rescale :: D -> Int -> D
+rescale t n = map (lerpd t) [0,1 / fromIntegral n .. 1]
+
+-- | Allocate data buffers for linearized envelopes.
+alloc_data :: Int -> IO ()
+alloc_data n = do
+  let alloc b = async (b_alloc b n 1)
+  withSC3 (mapM_ alloc [10,11,12,13])
+
+-- | Data can be loaded while nodes are running, ie. edited online.
+load_data :: Int -> (D,D,D,D) -> IO ()
+load_data n (t,f,a,p) = do
+  let setup d = map snd (rescale d n)
+  withSC3 (do send (b_setn 10 [(0,setup t)])
+              send (b_setn 11 [(0,setup f)])
+              send (b_setn 12 [(0,setup a)])
+              send (b_setn 13 [(0,setup p)]))
+
+-- | Simple synthesis of data.
+play_data :: IO ()
+play_data = do
+  let inf_sc = 9e8
+  phase <- dseries inf_sc 0 1
+  t' <- dbufrd 10 phase Loop
+  f' <- dbufrd 11 phase Loop
+  a' <- dbufrd 12 phase Loop
+  p' <- dbufrd 13 phase Loop
+  let tr = tDuty AR t' 0 DoNothing 1 0
+      f'' = demand tr 0 f'
+      a'' = demand tr 0 a'
+      p'' = demand tr 0 p'
+  audition (out 0 (pan2 (ringz tr f'' 0.2) p'' a''))
+
+-- | Sample data sets, load using 'load_data'.
+data_1 :: (D,D,D,D)
+data_1 = ([(0,0.1),(0.65,0.025),(1,0.1)]
+         ,[(0,200),(0.35,8900),(1,200)]
+         ,[(0,0.35),(0.65,0.65),(1,0.35)]
+         ,[(0,-1),(0.3,1),(1,-1)])
+
+data_2 :: (D,D,D,D)
+data_2 = ([(0,0.1),(0.5,0.005),(1,0.1)]
+         ,[(0,100),(0.5,13900),(1,200)]
+         ,[(0,0.75),(0.5,0.25),(1,0.75)]
+         ,[(0,1),(0.5,-1),(1,1)])
+
+data_3 :: (D,D,D,D)
+data_3 = ([(0,0.01),(0.5,0.25),(1,0.01)]
+         ,[(0,770),(0.5,77),(1,770)]
+         ,[(0,0.9),(0.5,0.6),(1,0.9)]
+         ,[(0,0),(0.5,1),(1,0)])
+
+-- | Switch between data sets at /dd/ at time interval /t/.
+data_switch :: [(D,D,D,D)] -> R -> IO ()
+data_switch dd t =
+    let w d = load_data 64 d >> pauseThread t
+    in mapM_ w dd >> data_switch dd t
+
+main :: IO ()
+main = do
+  alloc_data 64
+  load_data 64 data_1
+  play_data
+  data_switch [data_1,data_2,data_3] 4
diff --git a/gr/cds-070701.hs b/gr/cds-070701.hs
deleted file mode 100644
--- a/gr/cds-070701.hs
+++ /dev/null
@@ -1,111 +0,0 @@
--- | cds-070701 (rd)
---
--- The 'source' data are breakpoint sets normalized over the time
--- interval (0,1).  There are a fixed number of 'locations' per cycle.
--- The data sets are sampled at these locations and loaded into
--- buffers.  The buffers are read using dbufrd.  One of the data sets
--- gives the time interval to step forward.
-
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
-
--- | Real
-type R = Double
-
--- | Point
-type P = (R,R)
-
--- | Data set
-type D = [P]
-
--- | Points that bracket a time.
-pts :: D -> R -> (P,P)
-pts d n =
-    case d of
-      p0:p1:r -> let (t,_) = p1
-                 in if n <= t
-                    then (p0,p1)
-                    else pts (p1:r) n
-      _ -> error "pts"
-
--- | Linear interpolation.
---
--- > lerp 0.5 (0,0) (1,1) == (0.5,0.5)
--- > lerp 0.25 (0,0) (0.5,1) == (0.25,0.5)
-lerp :: R -> P -> P -> P
-lerp n (t0,d0) (t1,d1) =
-  let n' = (n - t0) / (t1 - t0)
-      f i = d0 + ((d1 - d0) * i)
-  in (n,f n')
-
--- | Linear interpolating lookup.
-lerpd :: D -> R -> P
-lerpd t n =
-  let (p0,p1) = pts t n
-  in lerp n p0 p1
-
--- | Linearize in time (ie. /t/ is in equal steps).
-rescale :: D -> Int -> D
-rescale t n = map (lerpd t) [0,1 / fromIntegral n .. 1]
-
--- | Allocate data buffers for linearized envelopes.
-alloc_data :: Int -> IO ()
-alloc_data n = do
-  let alloc b = async (b_alloc b n 1)
-  withSC3 (mapM_ alloc [10,11,12,13])
-
--- | Data can be loaded while nodes are running, ie. edited online.
-load_data :: Int -> (D,D,D,D) -> IO ()
-load_data n (t,f,a,p) = do
-  let setup d = map snd (rescale d n)
-  withSC3 (do send (b_setn 10 [(0,setup t)])
-              send (b_setn 11 [(0,setup f)])
-              send (b_setn 12 [(0,setup a)])
-              send (b_setn 13 [(0,setup p)]))
-
--- | Simple synthesis of data.
-play_data :: IO ()
-play_data = do
-  let inf_sc = 9e8
-  phase <- dseries inf_sc 0 1
-  t' <- dbufrd 10 phase Loop
-  f' <- dbufrd 11 phase Loop
-  a' <- dbufrd 12 phase Loop
-  p' <- dbufrd 13 phase Loop
-  let tr = tDuty AR t' 0 DoNothing 1 0
-      f'' = demand tr 0 f'
-      a'' = demand tr 0 a'
-      p'' = demand tr 0 p'
-  audition (out 0 (pan2 (ringz tr f'' 0.2) p'' a''))
-
--- | Sample data sets, load using 'load_data'.
-data_1 :: (D,D,D,D)
-data_1 = ([(0,0.1),(0.65,0.025),(1,0.1)]
-         ,[(0,200),(0.35,8900),(1,200)]
-         ,[(0,0.35),(0.65,0.65),(1,0.35)]
-         ,[(0,-1),(0.3,1),(1,-1)])
-
-data_2 :: (D,D,D,D)
-data_2 = ([(0,0.1),(0.5,0.005),(1,0.1)]
-         ,[(0,100),(0.5,13900),(1,200)]
-         ,[(0,0.75),(0.5,0.25),(1,0.75)]
-         ,[(0,1),(0.5,-1),(1,1)])
-
-data_3 :: (D,D,D,D)
-data_3 = ([(0,0.01),(0.5,0.25),(1,0.01)]
-         ,[(0,770),(0.5,77),(1,770)]
-         ,[(0,0.9),(0.5,0.6),(1,0.9)]
-         ,[(0,0),(0.5,1),(1,0)])
-
--- | Switch between data sets at /dd/ at time interval /t/.
-data_switch :: [(D,D,D,D)] -> R -> IO ()
-data_switch dd t =
-    let w d = load_data 64 d >> pauseThread t
-    in mapM_ w dd >> data_switch dd t
-
-main :: IO ()
-main = do
-  alloc_data 64
-  load_data 64 data_1
-  play_data
-  data_switch [data_1,data_2,data_3] 4
diff --git a/gr/chain-saw-m.hs b/gr/chain-saw-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/chain-saw-m.hs
@@ -0,0 +1,46 @@
+-- chain saw (jrhb)
+
+-- this graph generates long chains of unit generators and may require
+-- increasing the stack limit of the haskell run time system
+
+import qualified Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+coinIf :: Double -> a -> a -> IO a
+coinIf n a b = do
+  r <- R.coin n
+  return (if r then a else b)
+
+exprange :: UGen -> UGen -> UGen -> UGen
+exprange s = linExp s (-1) 1
+
+mceProduct :: UGen -> UGen
+mceProduct = mceEdit (\l -> [product l])
+
+clipu :: BinaryOp a => a -> a
+clipu s = clip2 s 1
+
+dup :: UGen -> UGen
+dup a = mce2 a a
+
+chain_saw :: IO UGen
+chain_saw = do
+  let f s1 = do xr <- fmap dup (expRand 0.1 2)
+                n1 <- lfNoise1 KR xr
+                n2 <- lfNoise1 KR xr
+                n3 <- lfNoise1 KR xr
+                f1 <- coinIf 0.6 (exprange n1 0.01 10) (exprange n2 10 50)
+                s2 <- coinIf 0.5 (1 - s1) (mceReverse s1)
+                let f2 = linExp s1 (-1) 1 f1 (f1 * exprange n3 2 10)
+                    u1 = lfSaw KR f2 0
+                    u2 = lfSaw KR (f1 * 0.1) 0 * 0.1 + 1
+                return . clipu =<< coinIf 0.5 (u1 * s2) (u1 * u2)
+      inp = lfSaw KR (0.2 * mce2 1 1.1) 0
+      b_freq = mce [70, 800, 9000, 5242]
+  ff <- chainM 8 f inp
+  let c_saw = mceProduct (saw AR (exprange ff 6 11000))
+      b_saw = dup (mix (bpf c_saw b_freq 0.2))
+  return (b_saw * 0.3)
+
+main :: IO ()
+main = audition . out 0 =<< chain_saw
diff --git a/gr/chain-saw.hs b/gr/chain-saw.hs
deleted file mode 100644
--- a/gr/chain-saw.hs
+++ /dev/null
@@ -1,50 +0,0 @@
--- chain saw (jrhb)
-
--- this graph generates long chains of unit generators and may require
--- increasing the stack limit of the haskell run time system
-
-import Control.Monad {- base -}
-import qualified Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
-
-coinIf :: Double -> a -> a -> IO a
-coinIf n a b = do
-  r <- R.coin n
-  return (if r then a else b)
-
-exprange :: UGen -> UGen -> UGen -> UGen
-exprange s = linExp s (-1) 1
-
-chain :: Monad m => Int -> (b -> m b) -> b -> m b
-chain n fn = foldr (<=<) return (replicate n fn)
-
-mceProduct :: UGen -> UGen
-mceProduct = mceEdit (\l -> [product l])
-
-clipu :: BinaryOp a => a -> a
-clipu s = clip2 s 1
-
-dup :: UGen -> UGen
-dup a = mce2 a a
-
-chain_saw :: IO UGen
-chain_saw = do
-  let f s1 = do xr <- fmap dup (expRand 0.1 2)
-                n1 <- lfNoise1 KR xr
-                n2 <- lfNoise1 KR xr
-                n3 <- lfNoise1 KR xr
-                f1 <- coinIf 0.6 (exprange n1 0.01 10) (exprange n2 10 50)
-                s2 <- coinIf 0.5 (1 - s1) (mceReverse s1)
-                let f2 = linExp s1 (-1) 1 f1 (f1 * exprange n3 2 10)
-                    u1 = lfSaw KR f2 0
-                    u2 = lfSaw KR (f1 * 0.1) 0 * 0.1 + 1
-                return . clipu =<< coinIf 0.5 (u1 * s2) (u1 * u2)
-      inp = lfSaw KR (0.2 * mce2 1 1.1) 0
-      b_freq = mce [70, 800, 9000, 5242]
-  ff <- chain 8 f inp
-  let c_saw = mceProduct (saw AR (exprange ff 6 11000))
-      b_saw = dup (mix (bpf c_saw b_freq 0.2))
-  return (b_saw * 0.3)
-
-main :: IO ()
-main = audition . out 0 =<< chain_saw
diff --git a/gr/choip.hs b/gr/choip.hs
--- a/gr/choip.hs
+++ b/gr/choip.hs
@@ -2,7 +2,7 @@
 
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 xl :: ID a => a -> a -> UGen -> UGen -> UGen -> UGen
@@ -14,16 +14,16 @@
 choip :: UGen
 choip =
     let t = 12
-        i = impulse AR (xl 'a' 'b' 1 30 t) 0
-        f = xl 'c' 'd' 600 8000 t
+        i = impulse AR (xl 'α' 'β' 1 30 t) 0
+        f = xl 'γ' 'δ' 600 8000 t
         a = sinOsc AR (decay2 i 0.05 0.5 * (-0.9 * f) + f) 0
-        l = line KR (r2 'e' 1) (r2 'f' 1) t DoNothing
-    in pan2 (decay2 (i * xl 'g' 'h' 0.01 0.5 t) 0.01 0.2 * a) l 1
+        l = line KR (r2 'ε' 1) (r2 'ζ' 1) t DoNothing
+    in pan2 (decay2 (i * xl 'η' 'θ' 0.01 0.5 t) 0.01 0.2 * a) l 1
 
 choip_pp :: UGen -> UGen
 choip_pp =
-    let f x = allpassN x 0.1 (randN 2 'a' 0 0.05) 4
-    in useq 'a' 4 f
+    let f x = allpassN x 0.1 (randN 2 'ι' 0 0.05) 4
+    in useq 'κ' 4 f
 
 main :: IO ()
 main = overlapTextureU_pp (1,10,8,maxBound) choip 2 choip_pp
diff --git a/gr/clustered-sines-m.hs b/gr/clustered-sines-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/clustered-sines-m.hs
@@ -0,0 +1,18 @@
+-- clustered sines (jmcc)
+
+import Control.Monad {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+-- > fmap synthstat (clone 2 cs)
+cs :: UId m => m UGen
+cs = do
+  let n = 80
+  f1 <- rand 100 1100
+  let f2 = 4 * f1
+  y <- replicateM n (f1 +. rand 0 f2)
+  let sp = klangSpec y (map (f1 /) y) (replicate n 0)
+  return (klang AR 1 0 sp * (0.3 / fromIntegral n))
+
+main :: IO ()
+main = xfadeTextureU (4,4,maxBound) =<< clone 2 cs
diff --git a/gr/clustered-sines.hs b/gr/clustered-sines.hs
--- a/gr/clustered-sines.hs
+++ b/gr/clustered-sines.hs
@@ -4,7 +4,7 @@
 import Sound.SC3.UGen.Protect
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
--- > Sound.SC3.UGen.Dot.draw cs
+-- > synthstat cs
 cs :: UGen
 cs =
     let n = 80
diff --git a/gr/contamination-zone.hs b/gr/contamination-zone.hs
--- a/gr/contamination-zone.hs
+++ b/gr/contamination-zone.hs
@@ -2,27 +2,27 @@
 
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 cz :: UGen
 cz =
     let f = expRand 'α' 800 8000
-        p = let e = lfNoise1 'α' KR (rand 'α' 0 3) * 0.0008 + 0.0022
-            in pinkNoise 'α' AR * e
-        s = sinOsc KR (linRand 'α' 0 1 0) 0 * (0.7 * f) + f
-        k = let sp = klankSpec_mce (randN 4 'α' 50 2000)
+        p = let e = lfNoise1 'β' KR (rand 'γ' 0 3) * 0.0008 + 0.0022
+            in pinkNoise 'δ' AR * e
+        s = sinOsc KR (linRand 'ε' 0 1 0) 0 * (0.7 * f) + f
+        k = let sp = klankSpec_mce (randN 4 'ζ' 50 2000)
                                    (mce [1,1,1,1])
-                                   (randN 4 'α' 0.2 4)
-            in abs (klank p 1 0 1 sp) * choose 'α' (mce2 (-1) 1)
+                                   (randN 4 'η' 0.2 4)
+            in abs (klank p 1 0 1 sp) * choose 'θ' (mce2 (-1) 1)
         r = rlpf k s 0.1
-        a = lfPulse KR (linRand 'α' 0 150 0) 0 (rand 'α' 0.2 0.4)
-    in pan2 r (lfNoise1 'α' KR (rand 'α' 0 1)) a
+        a = lfPulse KR (linRand 'ι' 0 150 0) 0 (rand 'κ' 0.2 0.4)
+    in pan2 r (lfNoise1 'λ' KR (rand 'μ' 0 1)) a
 
 cz_pp :: UGen -> UGen
 cz_pp =
-    let f x = allpassN x 0.04 (randN 2 'α' 0 0.04) 16
-    in useq 'α' 6 f
+    let f x = allpassN x 0.04 (randN 2 'ν' 0 0.04) 16
+    in useq 'ξ' 6 f
 
 main :: IO ()
 main = overlapTextureU_pp (3,8,4,maxBound) cz 2 cz_pp
diff --git a/gr/coolant.hs b/gr/coolant.hs
--- a/gr/coolant.hs
+++ b/gr/coolant.hs
@@ -4,14 +4,13 @@
 import Sound.SC3.UGen.Protect
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
--- > Sound.SC3.UGen.Dot.draw coolant
 coolant :: UGen
 coolant =
     let p = 20
-        s = onePole (uclone 'α' p (brownNoise 'α' AR) * 0.0015) 0.95
+        s = onePole (uclone 'α' p (brownNoise 'β' AR) * 0.0015) 0.95
         n = replicate p 1
-        sp = mce [klankSpec (uclone' 'α' p (rand 'α' 40 2400)) n n
-                 ,klankSpec (uclone' 'β' p (rand 'β' 40 2400)) n n]
+        sp = mce [klankSpec (uclone' 'γ' p (rand 'δ' 40 2400)) n n
+                 ,klankSpec (uclone' 'ε' p (rand 'ζ' 40 2400)) n n]
     in klank s 1 0 1 (mceTranspose sp)
 
 main :: IO ()
diff --git a/gr/crotale-sine.hs b/gr/crotale-sine.hs
--- a/gr/crotale-sine.hs
+++ b/gr/crotale-sine.hs
@@ -1,7 +1,7 @@
--- crotale-sine
+-- crotale-sine (rd)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 crotale_sine :: UGen
 crotale_sine =
@@ -22,12 +22,16 @@
             in pan2 o (sinOsc KR r2 r3) e'
     in sum (zipWith (fn m) cf ca) * 0.1
 
+pattern :: P_Bind
+pattern =
+    [(K_param "m",pwhitei 'α' 0 12 inf)
+    ,(K_dur,pxrand 'β' [1,2,3] inf)
+    ,(K_sustain,6)]
+
 main :: IO ()
 main = do
   let s = synthdef "crotale-sine" (out 0 crotale_sine)
-  audition (s,pbind [("m",pwhitei 'a' 0 12 inf)
-                    ,("dur",pxrand 'b' [1,2,3] inf)
-                    ,("sustain",6)])
+  audition (p_with (K_instr,psynth s) (pbind pattern))
 
 crotale_data :: ([Double],[Double])
 crotale_data =
diff --git a/gr/crotale.hs b/gr/crotale.hs
--- a/gr/crotale.hs
+++ b/gr/crotale.hs
@@ -6,13 +6,13 @@
 crotale =
     let (cf,ca,cd) = crotale_data
         ps = mce [-12,-5,0,2,4,5,7,12]
-        n = pinkNoise 'a' AR
-        t = dust 'a' KR 3
-        fs = select (tIRand 'a' 0 7 t) ps
-        g = tRand 'a' 0 1 t
-        fo = tRand 'b' 0 1 t
-        ds = tRand 'c' 2 7 t
-        p = tRand 'd' (-1) 1 t
+        n = pinkNoise 'α' AR
+        t = dust 'β' KR 3
+        fs = select (tIRand 'γ' 0 7 t) ps
+        g = tRand 'δ' 0 1 t
+        fo = tRand 'ε' 0 1 t
+        ds = tRand 'ζ' 2 7 t
+        p = tRand 'η' (-1) 1 t
         s = decay2 t 0.06 0.01 * n * g
         ks = klankSpec' cf ca (map recip cd)
         k = dynKlank s (midiRatio fs) fo ds ks
diff --git a/gr/cut-outs-m.hs b/gr/cut-outs-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/cut-outs-m.hs
@@ -0,0 +1,19 @@
+-- cut-outs (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+cut_outs :: (Functor m,UId m) => m UGen
+cut_outs = do
+  let t = impulse AR 22 0 * (sinOsc KR 0.5 0 + 1)
+      x = mouseX KR 0.005 0.12 Exponential 0.1
+      y = mouseY KR 0.01 0.52 Exponential 0.1
+      n = do n1 <- lfNoise0 KR 2
+             n2 <- coinGate (0.05 + n1 + y * 0.4 + t * 0.5) (t * 0.5)
+             n3 <- tExpRand (mce2 500 900) 1600 t
+             return (ringz n2 n3 x)
+  s <- fmap sum (sequence (replicate 3 n))
+  b <- tRand 0 1 =<< dust KR 8
+  return (mrg [clip2 s (in' 1 KR 0) * 0.25,out 0 b])
+
+main :: IO ()
+main = audition . out 0 =<< cut_outs
diff --git a/gr/cut-outs.hs b/gr/cut-outs.hs
deleted file mode 100644
--- a/gr/cut-outs.hs
+++ /dev/null
@@ -1,20 +0,0 @@
--- cut-outs (rd)
-
-import Sound.SC3.Monad {- hsc3 -}
-
--- > Sound.SC3.UGen.Dot.draw =<< cut_outs
-cut_outs :: (Functor m,UId m) => m UGen
-cut_outs = do
-  let t = impulse AR 22 0 * (sinOsc KR 0.5 0 + 1)
-      x = mouseX KR 0.005 0.12 Exponential 0.1
-      y = mouseY KR 0.01 0.52 Exponential 0.1
-      n = do n1 <- lfNoise0 KR 2
-             n2 <- coinGate (0.05 + n1 + y * 0.4 + t * 0.5) (t * 0.5)
-             n3 <- tExpRand (mce2 500 900) 1600 t
-             return (ringz n2 n3 x)
-  s <- fmap sum (sequence (replicate 3 n))
-  b <- tRand 0 1 =<< dust KR 8
-  return (mrg [clip2 s (in' 1 KR 0) * 0.25,out 0 b])
-
-main :: IO ()
-main = audition . out 0 =<< cut_outs
diff --git a/gr/cymbalism-accelerando.hs b/gr/cymbalism-accelerando.hs
--- a/gr/cymbalism-accelerando.hs
+++ b/gr/cymbalism-accelerando.hs
@@ -13,9 +13,9 @@
                 f = map (\e -> rand e f1 (f1 + f2)) (enumFromN n 15)
                 rt = map (\e -> rand e 1 5) (enumFromN n 15)
           in klankSpec f (replicate 15 1) rt
-      z = mce2 (y 'a') (y 'A')
-      w = whiteNoise 'α' AR * 0.02
-      tf = xLine KR (linRand 'β' 0.5 4.5 0) (rand 'γ' 0.5 35.5) 12 DoNothing
+      z = mce2 (y 'α') (y 'β')
+      w = whiteNoise 'γ' AR * 0.02
+      tf = xLine KR (linRand 'δ' 0.5 4.5 0) (rand 'ε' 0.5 35.5) 12 DoNothing
       t = impulse AR tf 0
       s = decay t 0.004 * w
   in klank s 1 0 1 (mceTranspose z)
diff --git a/gr/dark-sea-horns-hp.hs b/gr/dark-sea-horns-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/dark-sea-horns-hp.hs
@@ -0,0 +1,17 @@
+-- http://sccode.org/1-j#c51 (jl)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.UGen.External.RDU.Monad {- sc3-rdu -}
+
+dark_sea_horns :: UId m => m UGen
+dark_sea_horns = do
+  let n = lfNoise1
+  let x = localIn 2 AR
+  let a = tanh (sinOsc AR 65 (x * #(n AR 0.1) * 3) * #(n AR 3) * 6)
+  let f i = do return (allpassN i 0.3 #(randN 2 0.1 0.3) 5)
+  let o = tanh #(chainM 9 f a)
+  return (mrg2 o (localOut o))
+
+main :: IO ()
+main = audition . out 0 =<< dark_sea_horns
diff --git a/gr/dark-sea-horns.hs b/gr/dark-sea-horns.hs
--- a/gr/dark-sea-horns.hs
+++ b/gr/dark-sea-horns.hs
@@ -2,16 +2,15 @@
 
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
--- > Sound.SC3.UGen.Dot.draw dark_sea_horns
 dark_sea_horns :: UGen
 dark_sea_horns =
     let n = lfNoise1
         x = localIn 2 AR
-        a = tanh (sinOsc AR 65 (x * n 'a' AR 0.1 * 3) * (n 'a' AR 3 * 6))
-        f i = allpassN i 0.3 (randN 2 'a' 0.1 0.3) 5
-        o = tanh (useq 'a' 9 f a)
+        a = tanh (sinOsc AR 65 (x * n 'α' AR 0.1 * 3) * n 'β' AR 3 * 6)
+        f i = allpassN i 0.3 (randN 2 'γ' 0.1 0.3) 5
+        o = tanh (useq 'δ' 9 f a)
     in mrg2 o (localOut o)
 
 main :: IO ()
diff --git a/gr/data-space-hp.hs b/gr/data-space-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/data-space-hp.hs
@@ -0,0 +1,23 @@
+-- data space (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+data_space :: UId m => m UGen
+data_space = do
+    let r = rand 0
+    let p0 = lfPulse KR #(r 200) 0 #(r 1)
+    p1 <- lfPulse KR #(r 40) 0 #(r 1) *. r 8000 .+. r 2000
+    let p2 = lfPulse KR #(r 20) 0 #(r 1)
+    p3 <- lfPulse KR #(r 4) 0 #(r 1) *. r 8000 .+. r 2000
+    let p4 = lfPulse KR #(r 20) 0 #(r 1)
+    p5 <- lfPulse KR #(r 4) 0 #(r 1) *. r 8000 .+. r 2000
+    let f = p0 * p1 + p2 * p3 + p4 * p5
+    dt <- rand 0.15 0.35
+    let o = lfPulse AR f 0 0.5 * 0.04
+    l <- lfNoise0 KR #(r 3) .* 0.8
+    return (combL (pan2 o l 1) dt dt 3)
+
+main :: IO ()
+main = overlapTextureU (1,6,4,maxBound) =<< data_space
diff --git a/gr/data-space.hs b/gr/data-space.hs
--- a/gr/data-space.hs
+++ b/gr/data-space.hs
@@ -3,22 +3,19 @@
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
-randz :: ID a => a -> UGen -> UGen
-randz e = rand e 0
-
 data_space :: UGen
 data_space =
-    let r = randz
-        p0 = lfPulse KR (r 'a' 200) 0 (r 'b' 1)
-        p1 = lfPulse KR (r 'c' 40) 0 (r 'd' 1) * r 'e' 8000 + r 'f' 2000
-        p2 = lfPulse KR (r 'g' 20) 0 (r 'h' 1)
-        p3 = lfPulse KR (r 'i' 4) 0 (r 'j' 1) * r 'k' 8000 + r 'l'  2000
-        p4 = lfPulse KR (r 'm' 20) 0 (r 'n' 1)
-        p5 = lfPulse KR (r 'o' 4) 0 (r 'p' 1) * r 'q' 8000 + r 'r'  2000
+    let r e = rand e 0
+        p0 = lfPulse KR (r 'α' 200) 0 (r 'β' 1)
+        p1 = lfPulse KR (r 'γ' 40) 0 (r 'δ' 1) * r 'ε' 8000 + r 'ζ' 2000
+        p2 = lfPulse KR (r 'η' 20) 0 (r 'θ' 1)
+        p3 = lfPulse KR (r 'ι' 4) 0 (r 'κ' 1) * r 'λ' 8000 + r 'μ'  2000
+        p4 = lfPulse KR (r 'ν' 20) 0 (r 'ξ' 1)
+        p5 = lfPulse KR (r 'ο' 4) 0 (r 'π' 1) * r 'ρ' 8000 + r 'σ'  2000
         f = p0 * p1 + p2 * p3 + p4 * p5
-        dt = rand 's' 0.15 0.35
+        dt = rand 'τ' 0.15 0.35
         o = lfPulse AR f 0 0.5 * 0.04
-        l = lfNoise0 't' KR (r 'u' 3) * 0.8
+        l = lfNoise0 'υ' KR (r 'φ' 3) * 0.8
     in combL (pan2 o l 1) dt dt 3
 
 main :: IO ()
diff --git a/gr/deep-sea.hs b/gr/deep-sea.hs
--- a/gr/deep-sea.hs
+++ b/gr/deep-sea.hs
@@ -1,14 +1,13 @@
 -- deep sea (jrhb)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 rng :: UGen -> UGen -> UGen -> UGen
 rng s l r =
     let m = (r - l) * 0.5
     in mulAdd s m (m + l)
 
--- > Sound.SC3.UGen.Dot.draw deep_sea
 deep_sea :: UGen
 deep_sea =
     let amp = 1
@@ -30,4 +29,5 @@
 main :: IO ()
 main = do
   let s = synthdef "deep-sea" (out 0 deep_sea)
-  audition (s,pbind [("dur",pxrand 'a' [0.25,0.5,1,2] inf)])
+      p = pbind [(K_instr,psynth s),(K_dur,pxrand 'ζ' [0.25,0.5,1,2] inf)]
+  audition p
diff --git a/gr/deep-trip.hs b/gr/deep-trip.hs
--- a/gr/deep-trip.hs
+++ b/gr/deep-trip.hs
@@ -1,19 +1,19 @@
 -- deep trip (jmcc)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID  {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 deep_trip :: UGen
 deep_trip =
-    let f = midiCPS (lfNoise1 'a' KR (rand 'a' 0 0.3) * 60 + 70)
-        a'' = sinOsc KR (rand 'b' 0 40) 0 * 0.1
-        a' = max 0 (lfNoise1 'c' KR (rand 'd' 0 8) * a'')
-        a = lfNoise2 'e' AR (f * rand 'f' 0 0.5) * a'
+    let f = midiCPS (lfNoise1 'α' KR (rand 'β' 0 0.3) * 60 + 70)
+        a'' = sinOsc KR (rand 'γ' 0 40) 0 * 0.1
+        a' = max 0 (lfNoise1 'δ' KR (rand 'ε' 0 8) * a'')
+        a = lfNoise2 'ζ' AR (f * rand 'η' 0 0.5) * a'
         z = sinOsc AR f 0 * a
-        s = pan2 z (lfNoise1 'g' KR (rand 'h' 0 5)) 1
-        c0 = combN s 0.5 (randN 2 'i' 0.3 0.5) 20
-        c1 = combN s 0.5 (randN 2 'j' 0.3 0.5) 20
+        s = pan2 z (lfNoise1 'θ' KR (rand 'ι' 0 5)) 1
+        c0 = combN s 0.5 (randN 2 'κ' 0.3 0.5) 20
+        c1 = combN s 0.5 (randN 2 'λ' 0.3 0.5) 20
         in s + c0 + c1
 
 main :: IO ()
diff --git a/gr/default.hs b/gr/default.hs
--- a/gr/default.hs
+++ b/gr/default.hs
@@ -1,24 +1,17 @@
 -- default (jmcc)
 
+import Data.Default {- data-default -}
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
-defaultInstrument :: Synthdef
-defaultInstrument =
-    let f = control KR "freq" 440
-        a = control KR "amp" 0.1
-        p = control KR "pan" 0
-        g = control KR "gate" 1
-        e = linen g 0.01 0.7 0.3 RemoveSynth
-        f3 = mce [f,f + rand 'a' (-0.4) 0,f + rand 'b' 0 0.4]
-        l = xLine KR (rand 'c' 4000 5000) (rand 'd' 2500 3200) 1 DoNothing
-        z = lpf (mix (varSaw AR f3 0 0.3 * 0.3)) l * e
-    in synthdef "default" (out 0 (pan2 z p a))
+pattern :: P_Bind
+pattern =
+    [(K_instr,psynth def)
+    ,(K_note,pxrand 'α' [0,1,5,7,9] inf)
+    ,(K_octave,prand 'β' [3,4,5,6] inf)
+    ,(K_dur,pwrand 'γ' [0.1,0.2,0.4] [0.5,0.4,0.1] inf)
+    ,(K_amp,pbrown 'δ' 0.01 0.2 0.01 inf)
+    ,(K_param "pan",pbrown 'ε' (-1) 1 0.25 inf)]
 
 main :: IO ()
-main = audition (defaultInstrument
-                ,pbind [("note",pxrand 'a' [0,1,5,7,9] inf)
-                       ,("octave",prand 'b' [3,4,5,6] inf)
-                       ,("dur",pwrand 'c' [0.1,0.2,0.4] [0.5,0.4,0.1] inf)
-                       ,("amp",pbrown 'd' 0.01 0.2 0.01 inf)
-                       ,("pan",pbrown 'e' (-1) 1 0.25 inf)])
+main = audition (pbind pattern)
diff --git a/gr/demanding-studies.hs b/gr/demanding-studies.hs
--- a/gr/demanding-studies.hs
+++ b/gr/demanding-studies.hs
@@ -4,9 +4,9 @@
 
 demanding_studies :: UGen
 demanding_studies =
-  let s1 = drand 'a' dinf (mce [72, 75, 79, 82])
-      s2 = drand 'b' 1 (mce [82, 84, 86])
-      s3 = dseq 'c' dinf (mce [72, 75, 79, s2])
+  let s1 = drand 'α' dinf (mce [72, 75, 79, 82])
+      s2 = drand 'β' 1 (mce [82, 84, 86])
+      s3 = dseq 'γ' dinf (mce [72, 75, 79, s2])
       x = mouseX KR 5 13 Linear 0.2
       tr = impulse KR x 0
       f = demand tr 0 (mce [midiCPS (s1 - 12), midiCPS s3])
diff --git a/gr/dial-history-m.hs b/gr/dial-history-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/dial-history-m.hs
@@ -0,0 +1,35 @@
+-- dial history (jrhb)
+
+import Data.List {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+
+rng :: UGen -> UGen -> UGen -> UGen
+rng s = linLin s 0 1
+
+dial_history :: UId m => m UGen
+dial_history = do
+  let mfv = [[697,770,852,941],[1209,1336,1477,1633]]
+      numbers = [3,1] : [[a,b] | a <- [0..2],b <- [0..2]]
+      mce_r = mce . map mce
+  n <- dwhite dinf 7 12
+  w <- dwhite 1 2 7
+  b <- dbrown n 0.1 0.2 0.01
+  rate <- dseq dinf (mce2 w b)
+  q <- dseq dinf (mce [1..10])
+  g1 <- grayNoise AR
+  g2 <- grayNoise AR
+  d <- lfdNoise3 KR 0.5
+  let tr = trig (tDuty KR rate 0 DoNothing q 1) 0.09
+      pat = latch tr tr
+      x = mouseX KR 0 1 Linear 0.2
+      h = hasher (pat * x)
+      which = trunc (rng h 0 (constant (length numbers))) 1
+      both = select which (mce_r numbers)
+      dial = select both (mce_r (transpose mfv))
+      sig = sinOsc AR dial 0 * 0.05 * tr
+      dsig = delayN sig 0.2 (rng d 0 0.01)
+      hiss = g1 * 0.01 + hpf (g2 * 0.02) 3000
+  return (dsig + hiss)
+
+main :: IO ()
+main = audition . out 0 =<< dial_history
diff --git a/gr/dial-history.hs b/gr/dial-history.hs
deleted file mode 100644
--- a/gr/dial-history.hs
+++ /dev/null
@@ -1,36 +0,0 @@
--- dial history (jrhb)
-
-import Data.List {- base -}
-import Sound.SC3.Monad {- hsc3 -}
-
-rng :: UGen -> UGen -> UGen -> UGen
-rng s = linLin s 0 1
-
--- > Sound.SC3.UGen.Dot.draw =<< dial_history
-dial_history :: UId m => m UGen
-dial_history = do
-  let mfv = [[697,770,852,941],[1209,1336,1477,1633]]
-      numbers = [3,1] : [[a,b] | a <- [0..2],b <- [0..2]]
-      mce_r = mce . map mce
-  n <- dwhite dinf 7 12
-  w <- dwhite 1 2 7
-  b <- dbrown n 0.1 0.2 0.01
-  rate <- dseq dinf (mce2 w b)
-  q <- dseq dinf (mce [1..10])
-  g1 <- grayNoise AR
-  g2 <- grayNoise AR
-  d <- lfdNoise3 KR 0.5
-  let tr = trig (tDuty KR rate 0 DoNothing q 1) 0.09
-      pat = latch tr tr
-      x = mouseX KR 0 1 Linear 0.2
-      h = hasher (pat * x)
-      which = trunc (rng h 0 (constant (length numbers))) 1
-      both = select which (mce_r numbers)
-      dial = select both (mce_r (transpose mfv))
-      sig = sinOsc AR dial 0 * 0.05 * tr
-      dsig = delayN sig 0.2 (rng d 0 0.01)
-      hiss = g1 * 0.01 + hpf (g2 * 0.02) 3000
-  return (dsig + hiss)
-
-main :: IO ()
-main = audition . out 0 =<< dial_history
diff --git a/gr/diffraction-m.hs b/gr/diffraction-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/diffraction-m.hs
@@ -0,0 +1,28 @@
+-- diffraction (rd)
+
+import Control.Monad {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+
+diffraction ::(Functor m,UId m) => m UGen
+diffraction = do
+  let p = do let x = mouseX KR 0.001 0.02 Exponential 0.1
+                 y = mouseY KR 120 400 Exponential 0.1
+             f <- fmap (* mce2 32 64) (lfNoise0 KR 4)
+             w <- fmap (* x) (lfNoise0 KR 32)
+             z <- fmap (* 0.1) (lfNoise0 KR 2)
+             m <- lfNoise0 KR 6
+             let s = pulse AR f w
+             return (resonz s (y + z) (m * 0.4 + 0.8) * 0.5)
+      q = do n <- lfNoise0 KR 128
+             s <- p
+             return (combN s 0.2 (n * 0.1 + 0.1) 3)
+      r = let x = mouseX KR 0.75 1.25 Exponential 0.1
+              y = mouseY KR 0.25 1 Exponential 0.1
+              f _ = do fr <- fmap (* x) (rand 50 59)
+                       am <- fmap (* y) (rand 0.04 0.16)
+                       return (sinOsc AR fr 0 * am)
+          in liftM2 mce2 (mixFillM 16 f) (mixFillM 12 f)
+  fmap sum (sequence [p,q,r])
+
+main :: IO ()
+main = audition . out 0 =<< diffraction
diff --git a/gr/diffraction.hs b/gr/diffraction.hs
deleted file mode 100644
--- a/gr/diffraction.hs
+++ /dev/null
@@ -1,28 +0,0 @@
--- diffraction (rd)
-
-import Control.Monad {- base -}
-import Sound.SC3.Monad {- hsc3 -}
-
-diffraction ::(Functor m, UId m) => m UGen
-diffraction = do
-  let p = do let x = mouseX KR 0.001 0.02 Exponential 0.1
-                 y = mouseY KR 120 400 Exponential 0.1
-             f <- fmap (* mce2 32 64) (lfNoise0 KR 4)
-             w <- fmap (* x) (lfNoise0 KR 32)
-             z <- fmap (* 0.1) (lfNoise0 KR 2)
-             m <- lfNoise0 KR 6
-             let s = pulse AR f w
-             return (resonz s (y + z) (m * 0.4 + 0.8) * 0.5)
-      q = do n <- lfNoise0 KR 128
-             s <- p
-             return (combN s 0.2 (n * 0.1 + 0.1) 3)
-      r = let x = mouseX KR 0.75 1.25 Exponential 0.1
-              y = mouseY KR 0.25 1 Exponential 0.1
-              f _ = do fr <- fmap (* x) (rand 50 59)
-                       am <- fmap (* y) (rand 0.04 0.16)
-                       return (sinOsc AR fr 0 * am)
-          in liftM2 mce2 (mixFillM 16 f) (mixFillM 12 f)
-  return.sum =<< sequence [p, q, r]
-
-main :: IO ()
-main = audition . out 0 =<< diffraction
diff --git a/gr/discretion-m.hs b/gr/discretion-m.hs
--- a/gr/discretion-m.hs
+++ b/gr/discretion-m.hs
@@ -2,7 +2,6 @@
 
 import Sound.SC3.Monad {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw =<< discretion
 discretion :: UId m => m UGen
 discretion = do
   let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
diff --git a/gr/discretion.hs b/gr/discretion.hs
--- a/gr/discretion.hs
+++ b/gr/discretion.hs
@@ -2,21 +2,20 @@
 
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
--- > Sound.SC3.UGen.Dot.draw discretion
 discretion :: UGen
 discretion =
   let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
-      part = let f1 = randN 2 'a' 50 55
-                 f2 = randN 2 'c' 50 65
-                 f3 = randN 2 'e' 50 55
-                 a = randN 2 'g' 0.01 0.035
+      part = let f1 = randN 2 'α' 50 55
+                 f2 = randN 2 'β' 50 65
+                 f3 = randN 2 'γ' 50 55
+                 a = randN 2 'δ' 0.01 0.035
                  t = 21
                  f_ = mkls [(0,f1),(0.33,f2),(1,f3)] t
                  a_ = mkls [(0,0),(0.33,a),(1,0)] t
              in (saw AR f_ * a_)
-  in mix (uclone 'a' 8 part)
+  in mix (uclone 'ε' 8 part)
 
 main :: IO ()
 main = audition (out 0 discretion)
diff --git a/gr/doppler.hs b/gr/doppler.hs
--- a/gr/doppler.hs
+++ b/gr/doppler.hs
@@ -26,5 +26,5 @@
 main = do
   let s = rlpf (fSinOsc AR 200 0 * lfPulse AR 31.3 0 0.4) 400 0.3
   withSC3 (do play (out 0 (doppler (line_x 10 100 6) s))
-              pauseThread 8
+              wait 8
               play (out 0 (doppler (ellipse 10 75 12) s)))
diff --git a/gr/drummer.hs b/gr/drummer.hs
--- a/gr/drummer.hs
+++ b/gr/drummer.hs
@@ -1,4 +1,4 @@
--- drummer (thor magnusson)
+-- drummer (tm)
 
 import Sound.SC3.ID {- hsc3 -}
 
diff --git a/gr/e-lamell-p.hs b/gr/e-lamell-p.hs
--- a/gr/e-lamell-p.hs
+++ b/gr/e-lamell-p.hs
@@ -1,8 +1,7 @@
 -- e-lamell-p (rd)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 e_lamell :: UGen
 e_lamell =
@@ -12,32 +11,32 @@
         d = ctl "d" 0.1
         n = ctl "n" 12
         l = ctl "l" 0
-        t = lchoose 'a' [1,32]
+        t = lchoose 'α' [1,32]
         h = line AR n t d DoNothing
         s = blip AR f h
         e_d = envPerc 0.005 d
         e = envGen AR 1 a 0 1 RemoveSynth e_d
     in pan2 s l e
 
-pattern :: P Event
-pattern =
-  let p = pbind [("note",prand 'a' [0,2,5,7] inf)
-                ,("octave",pwrand 'b' [2,3,4,5] [0.2,0.35,0.35,0.1] inf)
-                ,("dur",0.1)
-                ,("d",pwhite 'c' 0.01 0.8 inf)
-                ,("amp",pwhite 'd' 0 0.75 inf)
-                ,("n",pwhite 'e' 2 36 inf)
-                ,("l",pwhite 'f' (-1) 1 inf)]
-      q = pbind [("note",prand 'g' [0] inf)
-                ,("octave",prand 'h' [2,3] inf)
-                ,("dur",0.1)
-                ,("d",pwhite 'i' 0.01 1.2 inf)
-                ,("amp",prand 'j' [0,0.25,0.5,1] inf)
-                ,("n",pwhite 'k' 2 36 inf)
-                ,("l",pwhite 'l' (-1) 1 inf)]
-  in ppar [p,q]
+patterns :: [P_Bind]
+patterns =
+    let i = psynth (synthdef "e-lamell" (out 0 e_lamell))
+    in [[(K_instr,i)
+        ,(K_note,prand 'β' [0,2,5,7] inf)
+        ,(K_octave,pwrand 'γ' [2,3,4,5] [0.2,0.35,0.35,0.1] inf)
+        ,(K_dur,0.1)
+        ,(K_param "d",pwhite 'δ' 0.01 0.8 inf)
+        ,(K_amp,pwhite 'ε' 0 0.75 inf)
+        ,(K_param "n",pwhite 'ζ' 2 36 inf)
+        ,(K_param "l",pwhite 'η' (-1) 1 inf)]
+       ,[(K_instr,i)
+        ,(K_note,prand 'θ' [0] inf)
+        ,(K_octave,prand 'ι' [2,3] inf)
+        ,(K_dur,0.1)
+        ,(K_param "d",pwhite 'κ' 0.01 1.2 inf)
+        ,(K_amp,prand 'λ' [0,0.25,0.5,1] inf)
+        ,(K_param "n",pwhite 'μ' 2 36 inf)
+        ,(K_param "l",pwhite 'ν' (-1) 1 inf)]]
 
 main :: IO ()
-main =
-    let s = synthdef "e-lamell" (out 0 e_lamell)
-    in audition (s,pattern)
+main = audition (ppar (map pbind patterns))
diff --git a/gr/e-lamell.hs b/gr/e-lamell.hs
--- a/gr/e-lamell.hs
+++ b/gr/e-lamell.hs
@@ -13,16 +13,13 @@
         d = ctl "d" 0.1
         l = ctl "l" 0
         a = ctl "a" 1
-        t = lchoose 'a' [1,32]
+        t = lchoose 'α' [1,32]
         h = line AR n t d DoNothing
         s = blip AR f h
         e_d = envPerc 0.005 d
         e = envGen AR 1 a 0 1 RemoveSynth e_d
     in pan2 s l e
 
-now :: Time
-now = NTPi 1
-
 sendSynth :: Transport m => String -> UGen -> m Message
 sendSynth n u = async (d_recv (synthdef n u))
 
@@ -54,8 +51,8 @@
           a <- R.choose [0,0.25,0.5,1]
           l <- R.rrand (-1) 1
           return (mk_s_new f n d a l)
-  sendBundle (Bundle now [p,q])
-  pauseThread 0.1
+  sendBundle (bundle immediately [p,q])
+  wait 0.1
 
 run :: Transport m => m ()
 run = do
diff --git a/gr/early-space-music-lp-side-two.hs b/gr/early-space-music-lp-side-two.hs
--- a/gr/early-space-music-lp-side-two.hs
+++ b/gr/early-space-music-lp-side-two.hs
@@ -3,35 +3,35 @@
 import Sound.SC3.ID {- hsc3 -}
 import qualified Sound.SC3.Lang.Random.Gen as R {- hsc3-lang -}
 import Sound.SC3.Lang.Control.OverlapTexture
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 import qualified System.Random as R {- random -}
 
 m1 :: UGen
 m1 =
-    let a = rand 'a' 0 20
-        b = rand 'b' 0 5000
-        c = rand 'c' 0 20
-        p = rand 'd' (-1) 1
+    let a = rand 'α' 0 20
+        b = rand 'β' 0 5000
+        c = rand 'γ' 0 20
+        p = rand 'δ' (-1) 1
     in pan2 (sinOsc AR (sinOsc AR a 0 * 0.1 * b + b) 0 * sinOsc KR c 0 * 0.08 + 0.08) p 1
 
 m2 :: UGen
 m2 =
-    let a0 = rand 'a' 40 240
-        a1 = a0 + rand 'b' (-1) 1
+    let a0 = rand 'ε' 40 240
+        a1 = a0 + rand 'ζ' (-1) 1
         a = mce2 a0 a1
-        b = expRand 'c' 50 2400
-        c = mce2 (a0 + rand 'd' (-1) 1) (a1 + rand 'e' (-1) 1)
-    in sinOsc AR (sinOsc AR a 0 * rand 'f' 0 1 * b + b) 0 * sinOsc KR c 0 * 0.025 + 0.025
+        b = expRand 'η' 50 2400
+        c = mce2 (a0 + rand 'θ' (-1) 1) (a1 + rand 'ι' (-1) 1)
+    in sinOsc AR (sinOsc AR a 0 * rand 'κ' 0 1 * b + b) 0 * sinOsc KR c 0 * 0.025 + 0.025
 
 m3 :: UGen
 m3 =
-    let f = midiCPS (rand 'a' 60 100)
-    in fSinOsc AR (mce2 f (f + 0.2)) 0 * lfNoise2 'b' KR (f * mce2 0.15 0.16) * 0.1
+    let f = midiCPS (rand 'λ' 60 100)
+    in fSinOsc AR (mce2 f (f + 0.2)) 0 * lfNoise2 'μ' KR (f * mce2 0.15 0.16) * 0.1
 
 -- audition (out 0 m4)
 m4 :: UGen
 m4 =
-    let a = lfPulse KR (expRand 'a' 0.2 1.2) 0 (rand 'a' 0.1 0.2)
+    let a = lfPulse KR (expRand 'ν' 0.2 1.2) 0 (rand 'ξ' 0.1 0.2)
         o i = let r = let (p,q) = mce2c (expRandN 2 i 0.1 20)
                       in xLine KR p q 25.6 DoNothing
                   f = midiCPS (rand i 24 96)
@@ -43,26 +43,25 @@
 -- audition (out 0 (m6 * 0.5))
 m6 :: UGen
 m6 =
-    let f = midiCPS (lfNoise1 'a' KR (rand 'b' 0 0.3) * 60 + 70)
-        a0 = lfNoise2 'c' AR (f * rand 'd' 0 0.5)
-        a1 = max 0 (lfNoise1 'e' KR (rand 'f' 0 8) * sinOsc KR (rand 'g' 0 40) 0 * 0.1)
+    let f = midiCPS (lfNoise1 'ο' KR (rand 'π' 0 0.3) * 60 + 70)
+        a0 = lfNoise2 'ρ' AR (f * rand 'σ' 0 0.5)
+        a1 = max 0 (lfNoise1 'τ' KR (rand 'υ' 0 8) * sinOsc KR (rand 'φ' 0 40) 0 * 0.1)
         z = sinOsc AR f 0 * a0 * a1
-    in pan2 z (lfNoise1 'h' KR (rand 'i' 0 5)) 1
+    in pan2 z (lfNoise1 'χ' KR (rand 'ψ' 0 5)) 1
 
 enumFromN :: Enum a => a -> Int -> [Int]
 enumFromN e i = let j = fromEnum e in [j .. j + i]
 
 -- audition (out 0 m7)
--- Sound.SC3.UGen.Dot.draw m7
 m7 :: UGen
 m7 =
     let p = 15
         k = let y z = let fr = mceChannels (expRandN p z 100 6000)
                           rt = mceChannels (randN p z 2 6)
                       in klankSpec fr (replicate p 1) rt
-            in mce2 (y 'α') (y 'β')
-        f = xLine KR (expRand 'α' 40 300) (expRand 'β' 40 300) 12 DoNothing
-        t = lfPulse AR f 0 (rand 'γ' 0.1 0.9) * 0.002 * max 0 (lfNoise2 'δ' KR (rand 'ε' 0 8))
+            in mce2 (y 'ω') (y 'Α')
+        f = xLine KR (expRand 'Β' 40 300) (expRand 'Γ' 40 300) 12 DoNothing
+        t = lfPulse AR f 0 (rand 'Δ' 0.1 0.9) * 0.002 * max 0 (lfNoise2 'Ε' KR (rand 'Ζ' 0 8))
     in distort (klank t 1 0 1 (mceTranspose k)) * 0.3
 
 esmlp2 :: R.RandomGen g => g -> (UGen, g)
@@ -72,7 +71,7 @@
 esmlp2_pp :: UGen -> UGen
 esmlp2_pp i =
     let c z = combN i 0.3 (mce2 (rand z 0.1 0.3) (rand z 0.12 0.32)) 8
-    in sum (map c ['a'..'e']) * 0.3
+    in sum (map c ['Η'..'Θ']) * 0.3
 
 main :: IO ()
 main = do
diff --git a/gr/eggcrate.hs b/gr/eggcrate.hs
--- a/gr/eggcrate.hs
+++ b/gr/eggcrate.hs
@@ -11,9 +11,9 @@
       sinu = sin . (* pi)
       eggcrate_f u v = cosu u * sinu v
       p = mce [64,72,96,128,256,6400,7200,8400,9600]
-      (x,y) = atp (`brownNoise` KR) ('a','b')
-      t = dust 'c' KR 2.4
-      (f0,f1) = atp (\z -> tChoose z t p) ('a','b')
+      (x,y) = atp (`brownNoise` KR) ('α','β')
+      t = dust 'γ' KR 2.4
+      (f0,f1) = atp (\z -> tChoose z t p) ('δ','ε')
       f = linLin (eggcrate_f x y) (-1) 1 f0 f1
       a = linLin x (-1) 1 0 0.1
  in pan2 (mix (sinOsc AR f 0)) y a
diff --git a/gr/f-lets-m.hs b/gr/f-lets-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/f-lets-m.hs
@@ -0,0 +1,30 @@
+-- f-lets (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+f_lets :: (Functor m,UId m) => m UGen
+f_lets = do
+  let f_let t g j n f = do
+           let pd = pulseDivider t j 0
+           r0 <- tIRand (mce2 2 1) n pd
+           r1 <- tRand 0.01 0.04 pd
+           r2 <- tRand 0.05 0.10 pd
+           return (formlet pd (f * r0) r1 r2 * g)
+      mk_n t = do
+           r0 <- tRand 0 1 t
+           r1 <- tRand 0 1 t
+           r2 <- tRand 0 1 t
+           r3 <- tRand 0 1 t
+           r4 <- coinGate 0.2 t
+           sequence [f_let t 0.15 2 9 (mce2 200 400)
+                    ,f_let t 0.25 2 9 (mce2 (200 + r0) (400 + r1))
+                    ,f_let t 0.05 4 5 (mce2 25 50)
+                    ,f_let t 0.15 4 5 (mce2 (25 + r2) (50 + r3))
+                    ,let lr = fmap (* latch r4 t)
+                     in lr (f_let t 0.5 1 16 (mce2 300 600))]
+      tr = impulse AR 24 0
+  n <- lfNoise0 KR 2
+  return . (* (n * 0.25 + 0.25)) . sum =<< mk_n tr
+
+main :: IO ()
+main = audition . out 0 =<< f_lets
diff --git a/gr/f-lets.hs b/gr/f-lets.hs
deleted file mode 100644
--- a/gr/f-lets.hs
+++ /dev/null
@@ -1,30 +0,0 @@
--- f-lets (rd)
-
-import Sound.SC3.Monad {- hsc3 -}
-
-f_lets :: (Functor m,UId m) => m UGen
-f_lets = do
-  let f_let t g j n f = do
-           let pd = pulseDivider t j 0
-           r0 <- tIRand (mce2 2 1) n pd
-           r1 <- tRand 0.01 0.04 pd
-           r2 <- tRand 0.05 0.10 pd
-           return (formlet pd (f * r0) r1 r2 * g)
-      mk_n t = do
-           r0 <- tRand 0 1 t
-           r1 <- tRand 0 1 t
-           r2 <- tRand 0 1 t
-           r3 <- tRand 0 1 t
-           r4 <- coinGate 0.2 t
-           sequence [f_let t 0.15 2 9 (mce2 200 400)
-                    ,f_let t 0.25 2 9 (mce2 (200 + r0) (400 + r1))
-                    ,f_let t 0.05 4 5 (mce2 25 50)
-                    ,f_let t 0.15 4 5 (mce2 (25 + r2) (50 + r3))
-                    ,let lr = fmap (* latch r4 t)
-                     in lr (f_let t 0.5 1 16 (mce2 300 600))]
-      tr = impulse AR 24 0
-  n <- lfNoise0 KR 2
-  return . (* (n * 0.25 + 0.25)) . sum =<< mk_n tr
-
-main :: IO ()
-main = audition . out 0 =<< f_lets
diff --git a/gr/f0-tw0028.hs b/gr/f0-tw0028.hs
--- a/gr/f0-tw0028.hs
+++ b/gr/f0-tw0028.hs
@@ -12,7 +12,7 @@
 f0_0028 :: UGen
 f0_0028 =
     let n = map ((* 99) . (`mod` 8)) (sc3_fib 16)
-        p = dseq 'a' dinf (dshuf 'a' 8 (mce (map fromInteger n)))
+        p = dseq 'α' dinf (dshuf 'β' 8 (mce (map fromInteger n)))
         q = combN (duty AR (1/8) 0 DoNothing p) 4 4 16
         o = lfTri AR q 0 / 4
         f = lfTri KR (1/16) 0 * 2e3 + 3e3
diff --git a/gr/f0-tw0045.hs b/gr/f0-tw0045.hs
--- a/gr/f0-tw0045.hs
+++ b/gr/f0-tw0045.hs
diff --git a/gr/f0-tw0077.hs b/gr/f0-tw0077.hs
--- a/gr/f0-tw0077.hs
+++ b/gr/f0-tw0077.hs
@@ -2,7 +2,6 @@
 
 import Sound.SC3 {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw f0_tw0077
 f0_tw0077 :: UGen
 f0_tw0077 =
     let a = sinOsc AR
diff --git a/gr/f0-tw0084.hs b/gr/f0-tw0084.hs
--- a/gr/f0-tw0084.hs
+++ b/gr/f0-tw0084.hs
@@ -2,7 +2,6 @@
 
 import Sound.SC3 {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw f0_tw0084
 f0_tw0084 :: UGen
 f0_tw0084 =
     let a = saw AR
diff --git a/gr/fb-090531.hs b/gr/fb-090531.hs
--- a/gr/fb-090531.hs
+++ b/gr/fb-090531.hs
@@ -1,8 +1,8 @@
 -- fb-090531 (rd)
 
+import Control.Monad {- base -}
 import Sound.OSC {- hosc -}
 import Sound.SC3 {- hsc3 -}
-import Control.Monad
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
 
 fb_090531 :: UGen
diff --git a/gr/fbl-fbf.hs b/gr/fbl-fbf.hs
--- a/gr/fbl-fbf.hs
+++ b/gr/fbl-fbf.hs
@@ -16,7 +16,7 @@
 
 fbl_fbf :: UGen
 fbl_fbf =
-  let n = brownNoise 'a' AR
+  let n = brownNoise 'α' AR
       e = decay (impulse AR 0.3 0) 0.1 * n * 0.2
       c = 4
       e' = replicate c e
diff --git a/gr/feedr-m.hs b/gr/feedr-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/feedr-m.hs
@@ -0,0 +1,36 @@
+-- feedr (rd)
+-- warning: input/output feedback loop
+
+import Sound.OSC.FD {- hosc -}
+import Sound.SC3.Monad.FD {- hsc3 -}
+
+delayWr :: UGen -> UGen -> UGen
+delayWr b = recordBuf AR b 0 1 0 1 Loop 0 DoNothing
+
+tap :: Int -> UGen -> UGen -> UGen
+tap nc b dt = playBuf nc AR b 1 0 (dt * (- sampleRate)) Loop DoNothing
+
+type State = (UGen,Double)
+
+feedr :: (UId m) => State -> Int -> m UGen
+feedr (ch,dl) n = do
+  t <- sequence (replicate n (rand 0.0 (constant dl)))
+  g <- sequence (replicate n (rand 0.4 1.0))
+  f <- sequence (replicate n (rand 0.9 0.95))
+  let d = zipWith (\p q -> tap 2 10 p * q) t g
+      x = mouseX KR 0.02 1.0 Exponential 0.1
+      s = clip2 (leakDC (hpf (sum d) 20) 0.995) 1
+      i = soundIn ch
+      r = i + sum (map (* x) (zipWith (*) d f))
+  return (mrg [out 0 s, delayWr 10 r])
+
+run :: Transport t => State -> t -> IO ()
+run (ch,dl) fd = do
+  nf <- fmap (* dl) (serverSampleRateActual fd)
+  send fd (b_alloc 10 (floor nf) 2)
+  audition =<< feedr (ch,dl) 18
+
+main :: IO ()
+main = withSC3 (run (mce2 4 5,6))
+
+-- withSC3 (\fd -> send fd (b_zero 10))
diff --git a/gr/feedr.hs b/gr/feedr.hs
deleted file mode 100644
--- a/gr/feedr.hs
+++ /dev/null
@@ -1,36 +0,0 @@
--- feedr (rd)
--- warning: input/output feedback loop
-
-import Sound.OSC.FD {- hosc -}
-import Sound.SC3.Monad.FD {- hsc3 -}
-
-delayWr :: UGen -> UGen -> UGen
-delayWr b = recordBuf AR b 0 1 0 1 Loop 0 DoNothing
-
-tap :: Int -> UGen -> UGen -> UGen
-tap nc b dt = playBuf nc AR b 1 0 (dt * (- sampleRate)) Loop DoNothing
-
-type State = (UGen,Double)
-
-feedr :: (UId m) => State -> Int -> m UGen
-feedr (ch,dl) n = do
-  t <- sequence (replicate n (rand 0.0 (constant dl)))
-  g <- sequence (replicate n (rand 0.4 1.0))
-  f <- sequence (replicate n (rand 0.9 0.95))
-  let d = zipWith (\p q -> tap 2 10 p * q) t g
-      x = mouseX KR 0.02 1.0 Exponential 0.1
-      s = clip2 (leakDC (hpf (sum d) 20) 0.995) 1
-      i = soundIn ch
-      r = i + sum (map (* x) (zipWith (*) d f))
-  return (mrg [out 0 s, delayWr 10 r])
-
-run :: Transport t => State -> t -> IO ()
-run (ch,dl) fd = do
-  nf <- fmap (* dl) (serverSampleRateActual fd)
-  send fd (b_alloc 10 (floor nf) 2)
-  audition =<< feedr (ch,dl) 18
-
-main :: IO ()
-main = withSC3 (run (mce2 4 5,6))
-
--- withSC3 (\fd -> send fd (b_zero 10))
diff --git a/gr/fm-iter.hs b/gr/fm-iter.hs
--- a/gr/fm-iter.hs
+++ b/gr/fm-iter.hs
@@ -1,15 +1,18 @@
 -- fm-iter (rd)
 
 import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
+-- audition (out 0 fm_iter)
 fm_iter :: UGen
 fm_iter =
-  let t0 = impulse AR (recip 0.30) 0
+  let f0 = recip (0.3 + whiteNoise 'α' AR * 0.01)
+      t0 = impulse AR f0 0
       t1 = tDelay t0 0.15
       t = mce2 t0 t1
-      k = tRand 'a' 56 57 t
-      i = tRand 'a' 40 480 t
-      j = tRand 'a' (-1) 1 t
+      k = tRand 'β' 56 57 t
+      i = tRand 'γ' 40 480 t
+      j = tRand 'δ' (-1) 1 t
       c = midiCPS k
       m = midiCPS (k + 1 + j)
       s = envPerc 0.01 0.9
@@ -18,4 +21,4 @@
   in sinOsc AR f 0 * e
 
 main :: IO ()
-main = audition (out 0 fm_iter)
+main = overlapTextureU (3,3,6,maxBound) fm_iter
diff --git a/gr/fm-kltr-m.hs b/gr/fm-kltr-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/fm-kltr-m.hs
@@ -0,0 +1,59 @@
+-- fm-kltr (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad as U {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+fm_kltr :: UId m => m UGen
+fm_kltr = do
+  r1 <- U.rand 0.975 1.025
+  r2 <- U.rand 0.5 1.5
+  r3 <- U.rand 0.975 1.025
+  r4 <- U.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))
+
+type R = Double
+
+fm :: Transport m => R -> R -> R -> R -> R -> m ()
+fm 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 (s_new "fm_kltr" (-1) AddToTail 1 p)
+
+nd :: Transport m => m ()
+nd = 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 53 ff a d i
+  wait t
+
+run :: (Transport m,UId m) => m ()
+run = do
+  u <- fm_kltr
+  _ <- async (d_recv (synthdef "fm_kltr" u))
+  sequence_ (replicate 32 nd)
+
+main :: IO ()
+main = withSC3 run
diff --git a/gr/fm-kltr-p.hs b/gr/fm-kltr-p.hs
--- a/gr/fm-kltr-p.hs
+++ b/gr/fm-kltr-p.hs
@@ -1,14 +1,14 @@
 -- fm-kltr-p (rd)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 fm_kltr :: UGen
 fm_kltr =
-  let r1 = rand 'a' 0.975 1.025
-      r2 = rand 'b' 0.5 1.5
-      r3 = rand 'c' 0.975 1.025
-      r4 = rand 'd' 0.75 1.25
+  let r1 = rand 'α' 0.975 1.025
+      r2 = rand 'β' 0.5 1.5
+      r3 = rand 'γ' 0.975 1.025
+      r4 = rand 'δ' 0.75 1.25
       o = control IR "out" 0
       a = control KR "amp" 0.1
       dt = control KR "sustain" 0.1
@@ -24,15 +24,17 @@
       l = line KR p (p * r4) dt DoNothing
   in out o (pan2 (sinOsc AR m 0) l e)
 
+pattern :: P_Bind
+pattern =
+    [(K_instr,psynth (synthdef "fm_kltr" fm_kltr))
+    ,(K_freq,fmap midiCPS 53)
+    ,(K_param "freq2",fmap midiCPS (pwhitei 'ε' 48 96 inf +
+                                    pwhite 'ζ' (-1) 1 inf))
+    ,(K_amp,pwhite 'η' 0.1 0.4 inf)
+    ,(K_dur,pwhite 'θ' 0.15 1.25 inf)
+    ,(K_sustain,pwhite 'ι' 5 6 inf)
+    ,(K_param "index",pwhite 'κ' 240 1480 inf)
+    ,(K_param "pan", pwhite 'λ' (-1) 1 inf)]
+
 main :: IO ()
-main = do
-  let s = synthdef "fm_kltr" fm_kltr
-      p = pbind [("freq",fmap midiCPS 53)
-                ,("freq2",fmap midiCPS (pwhitei 'a' 48 96 inf +
-                                        pwhite 'b' (-1) 1 inf))
-                ,("amp",pwhite 'c' 0.1 0.4 inf)
-                ,("dur",pwhite 'd' 0.15 1.25 inf)
-                ,("sustain",pwhite 'e' 5 6 inf)
-                ,("index",pwhite 'f' 240 1480 inf)
-                ,("pan", pwhite 'g' (-1) 1 inf)]
-  audition (s,p)
+main = audition (pbind pattern)
diff --git a/gr/fm-kltr.hs b/gr/fm-kltr.hs
deleted file mode 100644
--- a/gr/fm-kltr.hs
+++ /dev/null
@@ -1,59 +0,0 @@
--- fm-kltr (rd)
-
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad as U {- hsc3 -}
-import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
-
-fm_kltr :: UId m => m UGen
-fm_kltr = do
-  r1 <- U.rand 0.975 1.025
-  r2 <- U.rand 0.5 1.5
-  r3 <- U.rand 0.975 1.025
-  r4 <- U.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))
-
-type R = Double
-
-fm :: Transport m => R -> R -> R -> R -> R -> m ()
-fm 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 (s_new "fm_kltr" (-1) AddToTail 1 p)
-
-nd :: Transport m => m ()
-nd = 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 53 ff a d i
-  pauseThread t
-
-run :: (Transport m,UId m) => m ()
-run = do
-  u <- fm_kltr
-  _ <- async (d_recv (synthdef "fm_kltr" u))
-  sequence_ (replicate 32 nd)
-
-main :: IO ()
-main = withSC3 run
diff --git a/gr/for-ann.hs b/gr/for-ann.hs
--- a/gr/for-ann.hs
+++ b/gr/for-ann.hs
@@ -1,4 +1,4 @@
--- http://musicweb.ucsd.edu/~tre/wordpress/?p=131
+-- http://musicweb.ucsd.edu/~tre/wordpress/?p=131 (rd)
 
 import Sound.OSC {- hosc -}
 import Sound.SC3 {- hsc3 -}
@@ -31,10 +31,9 @@
 
 score :: Double -> NRT
 score z =
-    let at t = Bundle (NTPr t)
-        i = [d_recv (for_ann z),g_new [(1,AddToTail,0)]]
-        s t = at t [s_new "for-ann" (-1) AddToTail 1 []]
-    in NRT (at 0 i : map s [0,2.8 .. 669.2])
+    let i = [d_recv (for_ann z),g_new [(1,AddToTail,0)]]
+        s t = bundle t [s_new "for-ann" (-1) AddToTail 1 []]
+    in NRT (bundle 0 i : map s [0,2.8 .. 669.2])
 
 main :: IO ()
 main = audition (score (sixth "just"))
diff --git a/gr/forest-sounds-m.hs b/gr/forest-sounds-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/forest-sounds-m.hs
@@ -0,0 +1,16 @@
+-- sc-users, 2007-04-06 (pj) [paul jones]
+
+import Sound.SC3.Monad {- hsc3 -}
+
+insects :: UId m => m UGen
+insects = do
+  n1 <- brownNoise AR
+  n2 <- lfNoise2 KR 50
+  let o = sinOsc KR (n2 * 50 + 50) 0 * 100 + 2000
+  return (bpf n1 o 0.001 * 10)
+
+forest_sounds :: UId m => m UGen
+forest_sounds = clone 2 insects
+
+main :: IO ()
+main = audition . out 0 =<< forest_sounds
diff --git a/gr/forest-sounds.hs b/gr/forest-sounds.hs
deleted file mode 100644
--- a/gr/forest-sounds.hs
+++ /dev/null
@@ -1,16 +0,0 @@
--- sc-users, 2007-04-06 (paul jones)
-
-import Sound.SC3.Monad {- hsc3 -}
-
-insects :: UId m => m UGen
-insects = do
-  n1 <- brownNoise AR
-  n2 <- lfNoise2 KR 50
-  let o = sinOsc KR (n2 * 50 + 50) 0 * 100 + 2000
-  return (bpf n1 o 0.001 * 10)
-
-forest_sounds :: UId m => m UGen
-forest_sounds = clone 2 insects
-
-main :: IO ()
-main = audition . out 0 =<< forest_sounds
diff --git a/gr/fwalk-m.hs b/gr/fwalk-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/fwalk-m.hs
@@ -0,0 +1,39 @@
+-- fwalk (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+fwalk' :: UId m => UGen -> m UGen
+fwalk' r = do
+  t <- dust KR 3
+  r1 <- tIRand 0 6 t
+  r2 <- tRand (-0.0001) 0.0001 t
+  let f = bufRdL 1 KR (mce2 0 1) r1 NoLoop
+      f' = f + r2
+      o1 = blip AR (midiCPS (r + f)) 12
+      o2 = blip AR (midiCPS (r + f')) 12
+  return ((o1 + o2) * decay2 t 0.3 1.2 * 0.1)
+
+fwalk :: UId m => m UGen
+fwalk = do
+  f1 <- fwalk' 24
+  f2 <- fwalk' 36
+  return (f1 + f2)
+
+run :: (UId m,Transport m) => m ()
+run = do
+  let n = [40,47,42,40,50
+          ,43,35,43,40,47
+          ,45,35,43,42,59
+          ,48,40,47,52,45]
+      m = [40,40,42,47,50
+          ,35,43,43,40,45
+          ,42,35,48,47,43
+          ,40,59,45,47,52]
+  _ <- async (b_alloc_setn1 0 0 n)
+  _ <- async (b_alloc_setn1 1 0 m)
+  f <- fwalk
+  play (out 0 f)
+
+main :: IO ()
+main = withSC3 run
diff --git a/gr/fwalk.hs b/gr/fwalk.hs
deleted file mode 100644
--- a/gr/fwalk.hs
+++ /dev/null
@@ -1,39 +0,0 @@
--- fwalk (rd)
-
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
-
-fwalk' :: UId m => UGen -> m UGen
-fwalk' r = do
-  t <- dust KR 3
-  r1 <- tIRand 0 6 t
-  r2 <- tRand (-0.0001) 0.0001 t
-  let f = bufRdL 1 KR (mce2 0 1) r1 NoLoop
-      f' = f + r2
-      o1 = blip AR (midiCPS (r + f)) 12
-      o2 = blip AR (midiCPS (r + f')) 12
-  return ((o1 + o2) * decay2 t 0.3 1.2 * 0.1)
-
-fwalk :: UId m => m UGen
-fwalk = do
-  f1 <- fwalk' 24
-  f2 <- fwalk' 36
-  return (f1 + f2)
-
-run :: (UId m,Transport m) => m ()
-run = do
-  let n = [40,47,42,40,50
-          ,43,35,43,40,47
-          ,45,35,43,42,59
-          ,48,40,47,52,45]
-      m = [40,40,42,47,50
-          ,35,43,43,40,45
-          ,42,35,48,47,43
-          ,40,59,45,47,52]
-  _ <- async (b_alloc_setn1 0 0 n)
-  _ <- async (b_alloc_setn1 1 0 m)
-  f <- fwalk
-  play (out 0 f)
-
-main :: IO ()
-main = withSC3 run
diff --git a/gr/h-chatter-m.hs b/gr/h-chatter-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/h-chatter-m.hs
@@ -0,0 +1,29 @@
+-- h-chatter (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+h_chatter :: UId m => m UGen
+h_chatter = do
+  let mma m a = return . (+ a)  . (* m)
+      h0 = do n <- mma 5 5 =<< lfNoise0 KR 1
+              a <- mma 0.2 1.2 =<< lfNoise2 KR n
+              b <- mma 0.15 0.15 =<< lfNoise2 KR n
+              let f = 40
+                  h = henonN AR (mce2 f (f * 0.5)) a b 0 0
+              return (saw AR (h * 3200 + 1600) * 0.35)
+      h1 = do n0 <- lfNoise0 KR 32
+              n1 <- lfNoise0 KR 2
+              let a = mouseX KR 1.2 1.4 Linear 0.1
+                  b = mouseY KR 0.2 0.3 Linear 0.1
+                  wrp i = linLin i (-1) 1
+                  h = wrp n0 1 32
+                  p = wrp n1 2400 3200
+                  l = wrp n1 (-0.75) 0.75
+                  g = wrp n1 0.55 0.85
+                  f = 40
+                  o = blip AR (wrp (henonN AR f a b 0 0) p (p * 2)) h
+              return (pan2 o l g * 0.35)
+  h0 .+. h1
+
+main :: IO ()
+main = audition . out 0 =<< h_chatter
diff --git a/gr/h-chatter.hs b/gr/h-chatter.hs
deleted file mode 100644
--- a/gr/h-chatter.hs
+++ /dev/null
@@ -1,33 +0,0 @@
--- h-chatter (rd)
-
-import Control.Monad {- base -}
-import Sound.SC3.Monad {- hsc3 -}
-
-wrp :: UGen -> UGen -> UGen -> UGen
-wrp i = linLin i (-1) 1
-
--- > Sound.SC3.UGen.Dot.draw =<< h_chatter
-h_chatter :: UId m => m UGen
-h_chatter = do
-  let mma m a = return . (+ a)  . (* m)
-      h0 = do n <- mma 5 5 =<< lfNoise0 KR 1
-              a <- mma 0.2 1.2 =<< lfNoise2 KR n
-              b <- mma 0.15 0.15 =<< lfNoise2 KR n
-              let f = 40
-                  h = henonN AR (mce2 f (f * 0.5)) a b 0 0
-              return (saw AR (h * 3200 + 1600) * 0.35)
-      h1 = do n0 <- lfNoise0 KR 32
-              n1 <- lfNoise0 KR 2
-              let a = mouseX KR 1.2 1.4 Linear 0.1
-                  b = mouseY KR 0.2 0.3 Linear 0.1
-                  h = wrp n0 1 32
-                  p = wrp n1 2400 3200
-                  l = wrp n1 (-0.75) 0.75
-                  g = wrp n1 0.55 0.85
-                  f = 40
-                  o = blip AR (wrp (henonN AR f a b 0 0) p (p * 2)) h
-              return (pan2 o l g * 0.35)
-  liftM2 (+) h0 h1
-
-main :: IO ()
-main = audition . out 0 =<< h_chatter
diff --git a/gr/half-life.hs b/gr/half-life.hs
--- a/gr/half-life.hs
+++ b/gr/half-life.hs
@@ -7,7 +7,7 @@
   let t_half = 1/3.92
       n_atoms = 1e+5
       n = max 0 (n_atoms - pulseCount (localIn 2 AR) 0)
-      activity = dust 'a' AR (n * log 2 * t_half)
+      activity = dust 'α' AR (n * log 2 * t_half)
   in mrg [activity,localOut activity]
 
 main :: IO ()
diff --git a/gr/hansm.hs b/gr/hansm.hs
--- a/gr/hansm.hs
+++ b/gr/hansm.hs
@@ -101,5 +101,5 @@
            ,pointy_beaked_beetlefiend
            ,african_boojuboolubala
            ,common_muckoink]
-      fn x = bird_call x >> pauseThread 1.25
+      fn x = bird_call x >> wait 1.25
   withSC3 (mapM_ fn xs)
diff --git a/gr/harmonic-swimming.hs b/gr/harmonic-swimming.hs
--- a/gr/harmonic-swimming.hs
+++ b/gr/harmonic-swimming.hs
@@ -1,7 +1,7 @@
 -- harmonic swimming (jmcc)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
 harmonic_swimming :: UGen
 harmonic_swimming =
diff --git a/gr/harmonic-tumbling-m.hs b/gr/harmonic-tumbling-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/harmonic-tumbling-m.hs
@@ -0,0 +1,17 @@
+-- harmonic tumbling (jmcc)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+harmonic_tumbling :: UId m => m UGen
+harmonic_tumbling = do
+  let f = 80
+      p = 10
+      t = xLine KR (mce2 10 11) 0.1 60 DoNothing
+      o h = do n <- dust KR t
+               r <- rand 0 0.5
+               let e = decay2 (n * 0.02) 0.005 r
+               return (fSinOsc AR (f * (h + 1)) 0 * e)
+  fmap sum (mapM o [0..p])
+
+main :: IO ()
+main = audition . out 0 =<< harmonic_tumbling
diff --git a/gr/harmonic-tumbling.hs b/gr/harmonic-tumbling.hs
deleted file mode 100644
--- a/gr/harmonic-tumbling.hs
+++ /dev/null
@@ -1,17 +0,0 @@
--- harmonic tumbling (jmcc)
-
-import Sound.SC3.Monad {- hsc3 -}
-
-harmonic_tumbling :: UId m => m UGen
-harmonic_tumbling = do
-  let f = 80
-      p = 10
-      t = xLine KR (mce2 10 11) 0.1 60 DoNothing
-      o h = do n <- dust KR t
-               r <- rand 0 0.5
-               let e = decay2 (n * 0.02) 0.005 r
-               return (fSinOsc AR (f * (h + 1)) 0 * e)
-  return.sum =<< mapM o [0..p]
-
-main :: IO ()
-main = audition . out 0 =<< harmonic_tumbling
diff --git a/gr/hell-is-busy.hs b/gr/hell-is-busy.hs
--- a/gr/hell-is-busy.hs
+++ b/gr/hell-is-busy.hs
@@ -5,9 +5,9 @@
 
 hib :: UGen
 hib =
-    let o = fSinOsc AR (400 + rand 'a' 0 2000) 0
-        a = lfPulse KR (1 + rand 'b' 0 10.0) (rand 'c' 0 0.7) 0.04
-    in pan2 (o * a) (rand 'd' (-1) 1) 1
+    let o = fSinOsc AR (400 + rand 'α' 0 2000) 0
+        a = lfPulse KR (1 + rand 'β' 0 10.0) (rand 'γ' 0 0.7) 0.04
+    in pan2 (o * a) (rand 'δ' (-1) 1) 1
 
 main :: IO ()
 main = overlapTextureU (4,4,8,maxBound) hib
diff --git a/gr/hh-808.hs b/gr/hh-808.hs
--- a/gr/hh-808.hs
+++ b/gr/hh-808.hs
@@ -1,4 +1,4 @@
--- hh-808 (ryan at wabdo.com)
+-- hh-808 (rb)
 -- http://www.create.ucsb.edu/pipermail/sc-users/2007-August/036131.html
 
 import Sound.SC3 {- hsc3 -}
diff --git a/gr/implosion-m.hs b/gr/implosion-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/implosion-m.hs
@@ -0,0 +1,34 @@
+-- implosion (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+mkls :: [(UGen,UGen)] -> UGen -> UGen
+mkls bp t =
+    let e = envCoord bp t 1 EnvLin
+    in envGen KR 1 1 0 1 RemoveSynth e
+
+mkrmp :: UGen -> UGen -> UGen -> UGen
+mkrmp l r = mkls [(0,l),(1,r)]
+
+pmr_n :: UId m => Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> m UGen
+pmr_n rt l0 l1 r0 r1 d = do
+  let le = mkrmp l0 r0 d
+      re = mkrmp l1 r1 d
+      wrp i = linLin i (-1) 1
+  n <- whiteNoise rt
+  return (wrp n le re)
+
+implosion :: UId m => m UGen
+implosion = do
+  n0 <- rand (-1) 0
+  n1 <- rand 0 1
+  d  <- rand 7.5 13.5
+  f0 <- rand 10990 16220
+  f1 <- rand  9440 19550
+  f <- pmr_n AR 440 f0 f1 f1 d
+  l <- pmr_n KR n0 n1 0 0 d
+  a <- pmr_n KR 0.1 0.6 0 0 d
+  return (pan2 (saw AR f) l a)
+
+main :: IO ()
+main = audition . out 0 =<< implosion
diff --git a/gr/implosion.hs b/gr/implosion.hs
deleted file mode 100644
--- a/gr/implosion.hs
+++ /dev/null
@@ -1,36 +0,0 @@
--- implosion (rd)
-
-import Sound.SC3.Monad {- hsc3 -}
-
-mkls :: [(UGen,UGen)] -> UGen -> UGen
-mkls bp t =
-    let e = envCoord bp t 1 EnvLin
-    in envGen KR 1 1 0 1 RemoveSynth e
-
-mkrmp :: UGen -> UGen -> UGen -> UGen
-mkrmp l r = mkls [(0,l),(1,r)]
-
-wrp :: UGen -> UGen -> UGen -> UGen
-wrp i = linLin i (-1) 1
-
-pmr_n :: UId m => Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> m UGen
-pmr_n rt l0 l1 r0 r1 d = do
-  let le = mkrmp l0 r0 d
-      re = mkrmp l1 r1 d
-  n <- whiteNoise rt
-  return (wrp n le re)
-
-implosion :: UId m => m UGen
-implosion = do
-  n0 <- rand (-1) 0
-  n1 <- rand 0 1
-  d  <- rand 7.5 13.5
-  f0 <- rand 10990 16220
-  f1 <- rand  9440 19550
-  f <- pmr_n AR 440 f0 f1 f1 d
-  l <- pmr_n KR n0 n1 0 0 d
-  a <- pmr_n KR 0.1 0.6 0 0 d
-  return (pan2 (saw AR f) l a)
-
-main :: IO ()
-main = audition . out 0 =<< implosion
diff --git a/gr/insects-m.hs b/gr/insects-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/insects-m.hs
@@ -0,0 +1,21 @@
+-- insects (sp)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+insect :: UId m => m UGen
+insect = do
+  r1 <- rand 2000 3000
+  r2 <- rand 0.05 0.1
+  n1 <- lfNoise2 KR (r2 * 50 + 50)
+  r4 <- rand 1 10
+  r5 <- rand 0.05 0.1
+  n2 <- lfNoise2 KR r5
+  let a = sinOsc KR r4 0 * 0.5 + 0.5
+      o = sinOsc AR (r1 + n1) r2 * 0.005 * a
+  return (pan2 o n2 1)
+
+insects :: UId m => m UGen
+insects = fmap sum (sequence (replicate 60 insect))
+
+main :: IO ()
+main = audition . out 0 =<< insects
diff --git a/gr/insects.hs b/gr/insects.hs
deleted file mode 100644
--- a/gr/insects.hs
+++ /dev/null
@@ -1,21 +0,0 @@
--- insects (sam pluta)
-
-import Sound.SC3.Monad {- hsc3 -}
-
-insect :: UId m => m UGen
-insect = do
-  r1 <- rand 2000 3000
-  r2 <- rand 0.05 0.1
-  n1 <- lfNoise2 KR (r2 * 50 + 50)
-  r4 <- rand 1 10
-  r5 <- rand 0.05 0.1
-  n2 <- lfNoise2 KR r5
-  let a = sinOsc KR r4 0 * 0.5 + 0.5
-      o = sinOsc AR (r1 + n1) r2 * 0.005 * a
-  return (pan2 o n2 1)
-
-insects :: UId m => m UGen
-insects = return.sum =<< sequence (replicate 60 insect)
-
-main :: IO ()
-main = audition . out 0 =<< insects
diff --git a/gr/jl-1-Z.hs b/gr/jl-1-Z.hs
--- a/gr/jl-1-Z.hs
+++ b/gr/jl-1-Z.hs
@@ -2,7 +2,6 @@
 
 import Sound.SC3 {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw jl_z_1
 jl_z_1 :: UGen
 jl_z_1 =
     let a = lag (impulse KR 8 0) 0.1
diff --git a/gr/k-ppr-m.hs b/gr/k-ppr-m.hs
--- a/gr/k-ppr-m.hs
+++ b/gr/k-ppr-m.hs
@@ -1,9 +1,7 @@
 -- k-ppr-m (rd)
 
-import Control.Monad {- base -}
 import Sound.SC3.Monad {- hsc3 -}
 
--- > k_ppr_m >>= Sound.SC3.UGen.Dot.draw
 k_ppr_m :: UId m => m UGen
 k_ppr_m = do
   let wrp i = linLin i (-1) 1
@@ -20,7 +18,7 @@
              return (ringz (decay2 t' 0.01 0.5) r2 (r3 * y) * g)
       s1 = stream 3140 6240 0.050 0.005 0.15
       s2 = stream 0400 9000 0.005 0.005 0.15
-  liftM2 (+) (clone 2 s1) (clone 2 s2)
+  clone 2 s1 .+. clone 2 s2
 
 main :: IO ()
 main = audition . out 0 =<< k_ppr_m
diff --git a/gr/k-ppr.hs b/gr/k-ppr.hs
--- a/gr/k-ppr.hs
+++ b/gr/k-ppr.hs
@@ -3,7 +3,6 @@
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.UGen.Protect
 
--- > Sound.SC3.UGen.Dot.draw k_ppr
 k_ppr :: UGen
 k_ppr =
   let wrp i = linLin i (-1) 1
@@ -18,9 +17,9 @@
               r2 = tRand e lf (wrp ti lf rf) t'
               r3 = tRand e ld rd t'
           in ringz (decay2 t' 0.01 0.5) r2 (r3 * y) * g
-      s1 = stream 'a' 3140 6240 0.050 0.005 0.15
-      s2 = stream 'a' 0400 9000 0.005 0.005 0.15
-  in uclone 'a' 2 s1 + uclone 'b' 2 s2
+      s1 = stream 'α' 3140 6240 0.050 0.005 0.15
+      s2 = stream 'β' 0400 9000 0.005 0.005 0.15
+  in uclone 'γ' 2 s1 + uclone 'δ' 2 s2
 
 main :: IO ()
 main = audition (out 0 k_ppr)
diff --git a/gr/k2ws-hp.hs b/gr/k2ws-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/k2ws-hp.hs
@@ -0,0 +1,18 @@
+-- https://www.listarc.bham.ac.uk/lists/sc-users/msg21341.html (mn)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+
+k2ws :: UId m => m UGen
+k2ws = do
+  let fc = 400 + range 100 200 #(lfNoise2 AR (mce2 1 2))
+  let fm = range 100 200 #(lfNoise0 AR 5)
+  let i = range 1 20 #(lfNoise1 AR 10)
+  let x = sinOsc AR (fc + (sinOsc AR fm 0 * i * fm)) 0 * 0.5
+  let rf = range 1000 2000 (sinOsc AR (range 0.1 1 #(lfNoise1 AR 1)) 0)
+  let rq = range 0.5 10 #(lfNoise1 AR 1)
+  let ph = rlpf x rf rq * range 1.0 4.0 #(lfNoise1 AR 0.1) * 4 * pi
+  return (sinOsc AR 0.2 ph * 0.5)
+
+main :: IO ()
+main = audition . out 0 =<< k2ws
diff --git a/gr/k2ws.hs b/gr/k2ws.hs
--- a/gr/k2ws.hs
+++ b/gr/k2ws.hs
@@ -5,17 +5,16 @@
 rng :: (UGen,UGen) -> UGen -> UGen
 rng (i,j) = range i j
 
--- > Sound.SC3.UGen.Dot.draw k2ws
 k2ws :: UGen
 k2ws =
-    let fc = 400 + rng (100,200) (lfNoise2 'a' AR (mce2 1 2))
-        fm = rng (100,200) (lfNoise0 'a' AR 5)
-        i = rng (1,20) (lfNoise1 'a' AR 10)
+    let fc = 400 + rng (100,200) (lfNoise2 'α' AR (mce2 1 2))
+        fm = rng (100,200) (lfNoise0 'β' AR 5)
+        i = rng (1,20) (lfNoise1 'γ' AR 10)
         x = sinOsc AR (fc + (sinOsc AR fm 0 * i * fm)) 0 * 0.5
-        rf = rng (1000,2000) (sinOsc AR (rng (0.1,1) (lfNoise1 'b' AR 1)) 0)
-        rq = rng (0.5,10) (lfNoise1 'c' AR 1)
+        rf = rng (1000,2000) (sinOsc AR (rng (0.1,1) (lfNoise1 'δ' AR 1)) 0)
+        rq = rng (0.5,10) (lfNoise1 'ε' AR 1)
         a = rlpf x rf rq
-        ph = a * rng (1.0,4.0) (lfNoise1 'd' AR 0.1) * 4 * pi
+        ph = a * rng (1.0,4.0) (lfNoise1 'ζ' AR 0.1) * 4 * pi
     in sinOsc AR 0.2 ph * 0.5
 
 main :: IO ()
diff --git a/gr/kabelscahden.hs b/gr/kabelscahden.hs
--- a/gr/kabelscahden.hs
+++ b/gr/kabelscahden.hs
@@ -7,11 +7,11 @@
     let freq = 50
         sustain = 1
         amp = 0.5
-        hum = let t = dust 'a' KR (7 ** lfNoise1 'a' KR 0.3)
-                  h = toggleFF (coinGate 'b' 0.4 t) * rlpf (lfPulse AR freq 0 0.5 + (lfNoise1 'b' KR 2 * 0.5 - 0.5)) 6000 0.15
-                  n = trig t (tRand 'c' 0 0.01 (coinGate 'c' 0.4 t)) * whiteNoise 'c' AR
-                  m = trig t (tRand 'd' 0 0.01 (coinGate 'd' 0.4 t)) * brownNoise 'd' AR
-                  k = trig t (lfNoise1 'e' KR (mce2 4 4.2) * 0.1 + 0.11) * lfClipNoise 'e' AR (lfNoise0 'e' KR 7 * 30 + 40)
+        hum = let t = dust 'α' KR (7 ** lfNoise1 'β' KR 0.3)
+                  h = toggleFF (coinGate 'γ' 0.4 t) * rlpf (lfPulse AR freq 0 0.5 + (lfNoise1 'δ' KR 2 * 0.5 - 0.5)) 6000 0.15
+                  n = trig t (tRand 'ε' 0 0.01 (coinGate 'ζ' 0.4 t)) * whiteNoise 'η' AR
+                  m = trig t (tRand 'θ' 0 0.01 (coinGate 'ι' 0.4 t)) * brownNoise 'κ' AR
+                  k = trig t (lfNoise1 'λ' KR (mce2 4 4.2) * 0.1 + 0.11) * lfClipNoise 'μ' AR (lfNoise0 'ν' KR 7 * 30 + 40)
               in distort (leakDC ((h + n + m + k) * 10) 0.995)
         e = envGen KR 1 1 0 1 RemoveSynth (Envelope [amp,amp,0] [sustain,0] [] Nothing Nothing)
     in out 0 (clip2 hum 1 * e * 0.25)
diff --git a/gr/karplus-strong.hs b/gr/karplus-strong.hs
--- a/gr/karplus-strong.hs
+++ b/gr/karplus-strong.hs
@@ -13,8 +13,8 @@
         x = mouseX KR 0 0.01 Linear 0.1
         y = mouseY KR 0.85 1 Linear 0.1
         ugenIf a b c = (a * b) + ((1 - a) * c)
-        n = whiteNoise 'a' AR
-        d = dust 'a' KR 4
+        n = whiteNoise 'α' AR
+        d = dust 'β' KR 4
         n0 = (n * 0.5) + 0.5
         probSwitch i prob = ugenIf (n0 >* prob) i (negate i)
         laggedDelay = lag x 0.01
diff --git a/gr/klink.hs b/gr/klink.hs
--- a/gr/klink.hs
+++ b/gr/klink.hs
@@ -4,15 +4,15 @@
 
 klink :: UGen
 klink =
-  let n1 = lfNoise0 'a' KR (mce2 0.5 1.5)
+  let n1 = lfNoise0 'α' KR (mce2 0.5 1.5)
       o = sinOsc KR n1 0
       a = abs (slope o) * mce2 2 3
       t = impulse AR a 0
       i = decay2 t 0.01 0.1
       x = mouseX KR 960 3620 Exponential 0.2
       y = mouseY KR 0.5 2.0 Linear 0.2
-      n2 = tRand 'a' x 3940 t
-      n3 = tRand 'a' 0.005 0.275 t
+      n2 = tRand 'β' x 3940 t
+      n3 = tRand 'γ' 0.005 0.275 t
   in ringz i n2 (n3 * y)
 
 main :: IO ()
diff --git a/gr/laser-bubble.hs b/gr/laser-bubble.hs
--- a/gr/laser-bubble.hs
+++ b/gr/laser-bubble.hs
@@ -13,7 +13,7 @@
 
 laser_bubble :: Int -> UGen
 laser_bubble n =
-    let f = mce (map laser_bubble_f (take n ['a'..]))
+    let f = mce (map laser_bubble_f (take n ['α'..]))
         [s0,s1] = mceChannels (splay (sinOsc AR f 0) 1 1 0 True)
     in limiter (rotate2 s0 s1 (lfSaw KR 0.1 0)) 1 1e-2
 
diff --git a/gr/lf-pulses.hs b/gr/lf-pulses.hs
--- a/gr/lf-pulses.hs
+++ b/gr/lf-pulses.hs
@@ -4,8 +4,8 @@
 
 lf_pulses :: UGen
 lf_pulses =
-  let n0 = lfNoise0 'a' AR (mce2 20 40)
-      n1 = lfNoise0 'a' AR (mce2 5 10)
+  let n0 = lfNoise0 'α' AR (mce2 20 40)
+      n1 = lfNoise0 'β' AR (mce2 5 10)
       x = mouseX KR 0.012 0.19 Exponential 0.1
       f = formlet (blip AR 10 12) (n0 * 43 + 700) 0.005 x
       o = sinOsc AR 40 0 * n1
diff --git a/gr/lg-timed-m.hs b/gr/lg-timed-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/lg-timed-m.hs
@@ -0,0 +1,24 @@
+-- lg-timed (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+lg_timed :: UId m => m UGen
+lg_timed = do
+  let timed r y p =
+          do d0 <- dser r p
+             d1 <- dcons 0 d0
+             d2 <- dser r y
+             let t = tDuty AR d1 0 RemoveSynth d2 1
+             return (latch t t)
+      lg u = return (lag u 0.03)
+      n = mce [52,76,66,67,68,69]
+      a = mce [0.35,0.15,0.04,0.05,0.16,0.07]
+      d = mce [0.1,0.5,0.09,0.08,0.07,0.3]
+      x = mouseX KR 0.5 1.25 Linear 0.2
+  tn <- lg =<< timed dinf n (d * x)
+  ta <- lg =<< timed dinf a (d * x)
+  return (sinOsc AR (midiCPS tn) 0 * ta)
+
+main :: IO ()
+main = audition . out 0 =<< lg_timed
+
diff --git a/gr/lg-timed.hs b/gr/lg-timed.hs
deleted file mode 100644
--- a/gr/lg-timed.hs
+++ /dev/null
@@ -1,25 +0,0 @@
--- lg-timed (rd)
-
-import Sound.SC3.Monad {- hsc3 -}
-
--- > Sound.SC3.UGen.Dot.draw =<< lg_timed
-lg_timed :: UId m => m UGen
-lg_timed = do
-  let timed r y p =
-          do d0 <- dser r p
-             d1 <- dcons 0 d0
-             d2 <- dser r y
-             let t = tDuty AR d1 0 RemoveSynth d2 1
-             return (latch t t)
-      lg u = return (lag u 0.03)
-      n = mce [52,76,66,67,68,69]
-      a = mce [0.35,0.15,0.04,0.05,0.16,0.07]
-      d = mce [0.1,0.5,0.09,0.08,0.07,0.3]
-      x = mouseX KR 0.5 1.25 Linear 0.2
-  tn <- lg =<< timed dinf n (d * x)
-  ta <- lg =<< timed dinf a (d * x)
-  return (sinOsc AR (midiCPS tn) 0 * ta)
-
-main :: IO ()
-main = audition . out 0 =<< lg_timed
-
diff --git a/gr/lin-sosc.hs b/gr/lin-sosc.hs
--- a/gr/lin-sosc.hs
+++ b/gr/lin-sosc.hs
@@ -1,7 +1,7 @@
 -- lin-sosc (rd)
 
-import Control.Concurrent
-import Control.Monad
+import Control.Concurrent {- base -}
+import Control.Monad {- base -}
 import Sound.OSC {- hosc -}
 import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
diff --git a/gr/lso-061101-m.hs b/gr/lso-061101-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/lso-061101-m.hs
@@ -0,0 +1,110 @@
+-- | L-System oscillator (rd), 2006-11-01
+
+import Control.Monad {- base -}
+import Graphics.PS {- hps -}
+import qualified LSystem.LSystem as L {- hls -}
+import qualified LSystem.Systems as L
+import qualified LSystem.Turtle as L
+import qualified Sound.File.NeXT as F {- hsc3-sf -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
+import System.Directory {- directory -}
+import qualified System.FilePath as P {- filepath -}
+
+-- | Normalise to lie in (0,1).
+--
+-- > normalise [1,4,2,5] == [0.2,0.8,0.4,1]
+normalise :: (Fractional a,Ord a) => [a] -> [a]
+normalise s =
+    let n = 1 / maximum (map abs s)
+    in map (* n) s
+
+-- | 'L.render' rule.
+plain :: [Double] -> Pt Double -> Pt Double -> [Double]
+plain d (Pt x0 y0) (Pt x1 y1) = [x0,y0,x1,y1] ++ d
+
+-- | Render 'L.LSystem' to 'plain' data.
+lsys_run :: (L.LSystem,Double,Double) -> Int -> [Double]
+lsys_run (l,ta,lls) i =
+    let a = L.Turtle (radians ta) 1 (Pt 0 0) (pi/2) 1 lls []
+    in L.render [] plain (L.expand l i) a
+
+-- | 'normalise' '.' 'lsys_run'
+--
+-- > length (gen_d L.l0d 3)
+gen_d :: (L.LSystem,Double,Double) -> Int -> [Double]
+gen_d l = normalise . lsys_run l
+
+-- | Write 'gen_d' to 'FilePath' as /NeXT/ sound file.
+gen_f :: FilePath -> [Double] -> IO ()
+gen_f nm d = F.write nm (F.Header (length d) F.Float 44100 1) [d]
+
+-- | Rendered L-system data sets.
+lsys_data :: [[Double]]
+lsys_data =
+    [gen_d L.l0d 3
+    ,gen_d L.l1d 3
+    ,gen_d L.l2d 5
+    ,gen_d L.l3d 12
+    ,gen_d L.l4d 6
+    ,gen_d L.l5d 4
+    ,gen_d L.l6d 7
+    ,gen_d L.l7d 4
+    ,gen_d L.l8d 6
+    ,gen_d L.l9d 10
+    ,gen_d L.lAd 11
+    ,gen_d L.lBd 6
+    ,gen_d L.lCd 5]
+
+-- | Exceeds UDP limits.
+lsys_send :: IO ()
+lsys_send = do
+  let alloc (n,d) = async (b_alloc_setn1 n 0 d)
+  withSC3 (mapM_ alloc (zip [0..] lsys_data))
+
+
+-- | Filename for 'lsys_data'.
+lsys_fn :: FilePath  -> [FilePath]
+lsys_fn d =
+    let n = length lsys_data
+        nm i = d P.</> show i P.<.> "snd"
+    in map nm [0 .. n - 1]
+
+-- | Write 'lsys_data' to 'lsys_fn' using 'gen_f'.
+lsys_write :: FilePath -> IO ()
+lsys_write d = zipWithM_ gen_f (lsys_fn d) lsys_data
+
+-- | Load 'lsys_fn' at /scsynth/.
+lsys_load :: FilePath -> IO ()
+lsys_load d = do
+  let alloc (n,nm) = async (b_allocRead n nm 0 0)
+  withSC3 (mapM_ alloc (zip [0..] (lsys_fn d)))
+
+-- | Oscillator instrument
+oi :: IO UGen
+oi = do
+  let rng i = linLin i (-1) 1
+      exprng i = linExp i (-1) 1
+  c <- R.choose [0.25, 0.55, 0.75, 1.25]
+  let t = impulse KR c 0
+  b <- tIRand 0 12 t
+  let n  = bufFrames KR b
+      m  = n / 4
+      i  = floorE (rng (lfSaw AR c 0) 0 m) * 4
+      tt = impulse AR (m / c) 0
+      x0 = bufRdL 1 AR b i       NoLoop
+      y0 = bufRdL 1 AR b (i + 1) NoLoop
+      x1 = bufRdL 1 AR b (i + 2) NoLoop
+      y1 = bufRdL 1 AR b (i + 3) NoLoop
+  f0 <- R.choose [16, 32, 64, 128, 256, 512, 8192]
+  let f1 = 22000
+      o x y = let f = exprng x f0 f1
+              in pan2 (blip AR f (rng y 1 64)) y0 (decay tt 0.005)
+  return (o x0 y0 + o x1 y1)
+
+main :: IO ()
+main = do
+  t <- getTemporaryDirectory
+  lsys_write t
+  lsys_load t
+  oi >>= audition . out 0
diff --git a/gr/lso-061101.hs b/gr/lso-061101.hs
deleted file mode 100644
--- a/gr/lso-061101.hs
+++ /dev/null
@@ -1,111 +0,0 @@
--- | L-System oscillator (rd, 2006-11-01)
-
-import Control.Monad {- base -}
-import Graphics.PS.Pt {- hps -}
-import Graphics.PS.Unit
-import qualified LSystem.LSystem as L {- hls -}
-import qualified LSystem.Systems as L
-import qualified LSystem.Turtle as L
-import qualified Sound.File.NeXT as F {- hsc3-sf -}
-import Sound.SC3.Monad {- hsc3 -}
-import Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
-import System.Directory {- directory -}
-import qualified System.FilePath as P {- filepath -}
-
--- | Normalise to lie in (0,1).
---
--- > normalise [1,4,2,5] == [0.2,0.8,0.4,1]
-normalise :: (Fractional a,Ord a) => [a] -> [a]
-normalise s =
-    let n = 1 / maximum (map abs s)
-    in map (* n) s
-
--- | 'L.render' rule.
-plain :: [Double] -> Pt -> Pt -> [Double]
-plain d (Pt x0 y0) (Pt x1 y1) = [x0,y0,x1,y1] ++ d
-
--- | Render 'L.LSystem' to 'plain' data.
-lsys_run :: (L.LSystem,Double,Double) -> Int -> [Double]
-lsys_run (l,ta,ls) i =
-    let a = L.Turtle (radians ta) 1 (Pt 0 0) (pi/2) 1 ls []
-    in L.render [] plain (L.expand l i) a
-
--- | 'normalise' '.' 'lsys_run'
---
--- > length (gen_d L.l0d 3)
-gen_d :: (L.LSystem,Double,Double) -> Int -> [Double]
-gen_d l = normalise . lsys_run l
-
--- | Write 'gen_d' to 'FilePath' as /NeXT/ sound file.
-gen_f :: FilePath -> [Double] -> IO ()
-gen_f nm d = F.write nm (F.Header (length d) F.Float 44100 1) [d]
-
--- | Rendered L-system data sets.
-lsys_data :: [[Double]]
-lsys_data =
-    [gen_d L.l0d 3
-    ,gen_d L.l1d 3
-    ,gen_d L.l2d 5
-    ,gen_d L.l3d 12
-    ,gen_d L.l4d 6
-    ,gen_d L.l5d 4
-    ,gen_d L.l6d 7
-    ,gen_d L.l7d 4
-    ,gen_d L.l8d 6
-    ,gen_d L.l9d 10
-    ,gen_d L.lAd 11
-    ,gen_d L.lBd 6
-    ,gen_d L.lCd 5]
-
--- | Exceeds UDP limits.
-lsys_send :: IO ()
-lsys_send = do
-  let alloc (n,d) = async (b_alloc_setn1 n 0 d)
-  withSC3 (mapM_ alloc (zip [0..] lsys_data))
-
-
--- | Filename for 'lsys_data'.
-lsys_fn :: FilePath  -> [FilePath]
-lsys_fn d =
-    let n = length lsys_data
-        nm i = d P.</> show i P.<.> "snd"
-    in map nm [0 .. n - 1]
-
--- | Write 'lsys_data' to 'lsys_fn' using 'gen_f'.
-lsys_write :: FilePath -> IO ()
-lsys_write d = zipWithM_ gen_f (lsys_fn d) lsys_data
-
--- | Load 'lsys_fn' at /scsynth/.
-lsys_load :: FilePath -> IO ()
-lsys_load d = do
-  let alloc (n,nm) = async (b_allocRead n nm 0 0)
-  withSC3 (mapM_ alloc (zip [0..] (lsys_fn d)))
-
--- | Oscillator instrument
-oi :: IO UGen
-oi = do
-  let rng i = linLin i (-1) 1
-      exprng i = linExp i (-1) 1
-  c <- R.choose [0.25, 0.55, 0.75, 1.25]
-  let t = impulse KR c 0
-  b <- tIRand 0 12 t
-  let n  = bufFrames KR b
-      m  = n / 4
-      i  = floorE (rng (lfSaw AR c 0) 0 m) * 4
-      tt = impulse AR (m / c) 0
-      x0 = bufRdL 1 AR b i       NoLoop
-      y0 = bufRdL 1 AR b (i + 1) NoLoop
-      x1 = bufRdL 1 AR b (i + 2) NoLoop
-      y1 = bufRdL 1 AR b (i + 3) NoLoop
-  f0 <- R.choose [16, 32, 64, 128, 256, 512, 8192]
-  let f1 = 22000
-      o x y = let f = exprng x f0 f1
-              in pan2 (blip AR f (rng y 1 64)) y0 (decay tt 0.005)
-  return (o x0 y0 + o x1 y1)
-
-main :: IO ()
-main = do
-  t <- getTemporaryDirectory
-  lsys_write t
-  lsys_load t
-  oi >>= audition . out 0
diff --git a/gr/m21360.hs b/gr/m21360.hs
--- a/gr/m21360.hs
+++ b/gr/m21360.hs
@@ -13,15 +13,15 @@
 -- > audition (m21360 (mce [0,1]))
 m21360 :: UGen -> UGen
 m21360 b =
-    let del = mce [0.2,0.3,0.4,0.5] * rand 'a' 0.15 0.35
+    let del = mce [0.2,0.3,0.4,0.5] * rand 'α' 0.15 0.35
         loc = mce [-1,-0.7,0.6,1]
-        hpp = mce [rand 'a' 300 600,rand 'a' 900 1200]
+        hpp = mce [rand 'β' 300 600,rand 'γ' 900 1200]
         avg = mce [8000,14000]
         sdt = mce [300,400]
-        lpp = mce [rand 'a' 4300 4500,rand 'a' 4000 4200]
+        lpp = mce [rand 'δ' 4300 4500,rand 'ε' 4000 4200]
         sr = sampleRate
         local = localIn 2 AR
-        wn = line KR 0 1 0.1 DoNothing * whiteNoise 'a' AR * 0.03
+        wn = line KR 0 1 0.1 DoNothing * whiteNoise 'ζ' AR * 0.03
         ph = delTapWr AR b (wn + local)
         fb = delTapRd b ph del 1
         p_fb = mix (pan2 fb loc 1)
diff --git a/gr/microhelix.hs b/gr/microhelix.hs
--- a/gr/microhelix.hs
+++ b/gr/microhelix.hs
@@ -2,18 +2,10 @@
 
 import Sound.SC3.ID {- hsc3 -}
 
-rng :: UGen -> UGen -> UGen -> UGen
-rng l r =
-    let m = (r - l) * 0.5
-        a = m + l
-    in (+ a) . (* m)
-
 offset_id :: Enum a => Int -> a -> Int
 offset_id n e = n + fromEnum e
 
 -- mce...........................
---
--- > Sound.SC3.UGen.Dot.draw microhelix
 microhelix :: UGen
 microhelix =
     let rp = replicate
@@ -21,21 +13,21 @@
             let z = offset_id z_
                 i = mce (rp 8 (1/8) ++
                          rp 8 (1/4) ++
-                         [dseq (z 'a') (drand (z 'b') dinf (mce2 1 2)) (mce2 (1/16) (1/16))])
-                d = dxrand (z 'c') dinf (mceMap (* 1.25) i)
-            in tDuty AR d 0 DoNothing (dwhite (z 'd') dinf 0.5 1) 0
+                         [dseq (z 'α') (drand (z 'β') dinf (mce2 1 2)) (mce2 (1/16) (1/16))])
+                d = dxrand (z 'γ') dinf (mceMap (* 1.25) i)
+            in tDuty AR d 0 DoNothing (dwhite (z 'δ') dinf 0.5 1) 0
         ctrigs = mce2 (ctrigs_ 0) (ctrigs_ 12)
         clicks =
-            let n = pinkNoise 'e' AR * decay ctrigs (0.001 * abs (lfNoise1 'f' AR 4))
-            in fold (bpf n 15000 0.9 * (25 * rng 0 1 (lfNoise1 'g' AR 8))) (-1) 1
+            let n = pinkNoise 'ε' AR * decay ctrigs (0.001 * abs (lfNoise1 'ζ' AR 4))
+            in fold (bpf n 15000 0.9 * (25 * range 0 1 (lfNoise1 'η' AR 8))) (-1) 1
         snd1 =
             let o = sinOsc AR (midiCPS 44) 0 * 0.5 + sinOsc AR (midiCPS 90) 0 * 0.6
-            in lpf o (midiCPS 32) * 2 + hpf (lpf (whiteNoise 'h' AR * 0.008) 12000) 2400
+            in lpf o (midiCPS 32) * 2 + hpf (lpf (whiteNoise 'θ' AR * 0.008) 12000) 2400
         hiNoise =
-            let n = whiteNoise 'i' AR
-                e = decay2 (ctrigs * (lfNoise1 'j' AR 8 * 0.5 + 0.5)) 0.02 0.1 * 0.05
-            in bpf (n * e) (tRand 'k' 12000 15000 ctrigs) 0.9
-        trigMod = roundTo (lfNoise0 'l' AR 8) 1
+            let n = whiteNoise 'ι' AR
+                e = decay2 (ctrigs * (lfNoise1 'κ' AR 8 * 0.5 + 0.5)) 0.02 0.1 * 0.05
+            in bpf (n * e) (tRand 'λ' 12000 15000 ctrigs) 0.9
+        trigMod = roundTo (lfNoise0 'μ' AR 8) 1
         bass =
             let t = mceChannel 0 ctrigs * trigMod
                 ph = sweep t (2 * pi * mce2 52.8 740) + (pi/3)
@@ -48,8 +40,8 @@
         snd1' =
             let t = mceChannel 0 ctrigs
                 d = Envelope [0, 1, 0.6, 0] [0.0001, 0.4, 0.01] [EnvNum (-4)] Nothing Nothing
-                e = envGen AR (t * lfNoise0 'm' AR 8) 1 0 1 DoNothing d
-            in pan2 (snd1 * e) (tRand 'n' (-1) 1 t) 1
+                e = envGen AR (t * lfNoise0 'ν' AR 8) 1 0 1 DoNothing d
+            in pan2 (snd1 * e) (tRand 'ξ' (-1) 1 t) 1
     in limiter (midEQ (clicks + snd1' + hiNoise + bass) 14000 0.7 8) 1 0.01
 
 main :: IO ()
diff --git a/gr/modal-space.hs b/gr/modal-space.hs
--- a/gr/modal-space.hs
+++ b/gr/modal-space.hs
@@ -17,7 +17,7 @@
 
 modal_space :: UGen
 modal_space =
-    let n = uclone 'α' 2 (lfNoise1 'α' KR 3)
+    let n = uclone 'α' 2 (lfNoise1 'β' KR 3)
     in (ms n 48 + ms n 72) * 0.25
 
 run :: Transport m => m ()
diff --git a/gr/mridangam.hs b/gr/mridangam.hs
--- a/gr/mridangam.hs
+++ b/gr/mridangam.hs
@@ -2,12 +2,12 @@
 
 import Sound.OSC {- hosc -}
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 spe3_mridangam :: Synthdef
 spe3_mridangam =
     let t_amp = tr_control "t_amp" 1
-        n = whiteNoise 'a' AR * 70
+        n = whiteNoise 'α' AR * 70
         e = decay2 t_amp 0.002 0.1
         o = distort (resonz (n * e) (midiCPS 60) 0.02 * 4) * 0.4
     in synthdef "mridangam" (out 0 o)
@@ -19,7 +19,7 @@
         o = lpf (s1 + s2) (midiCPS 108) * 0.007
     in synthdef "drone" (out 0 o)
 
-p :: [P Double]
+p :: Fractional n => [P n]
 p =
     [pseq [0.0] 10
     -- intro
@@ -28,7 +28,7 @@
     ,pseq [0.9,0.0,0.0,0.2,0.0,0.2,0.0,0.2,0.0,0.0] 2
     ,pseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.2] 2
     -- solo
-    ,prand 'a' [pseq [0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0] 1
+    ,prand 'β' [pseq [0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0] 1
                ,pseq [0.9,0.2,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0] 1
                ,pseq [0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.2] 1
                ,pseq [0.9,0.0,0.0,0.7,0.2,0.2,0.0,0.7,0.0,0.0] 1
@@ -53,8 +53,9 @@
 act = do
   play spe3_drone
   _ <- async (d_recv spe3_mridangam)
-  let p' = pmono_d spe3_mridangam 100 [("t_amp",pseq p 1),("dur",1/8)]
-  play p'
+  let i = Instr_Def spe3_mridangam False
+  play (pmono [(K_instr,pinstr' i),(K_id,100)
+              ,(K_param "t_amp",pseq p 1),(K_dur,1/8)])
 
 main :: IO ()
 main = withSC3 act
diff --git a/gr/music-box.hs b/gr/music-box.hs
--- a/gr/music-box.hs
+++ b/gr/music-box.hs
@@ -3,8 +3,7 @@
 
 import Sound.OSC {- hosc -}
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 chain :: a -> [a -> a] -> a
 chain n c =
@@ -27,33 +26,34 @@
         dy = decay2 tr ea ed * 1
         i = mix (ringz dy (f * mce2 1 2) es)
         r = chain i [\s -> let e = decay2 tr 0.01 hd
-                               fr = mce [rand 'a' 1 1.1
-                                        ,rand 'a' 1.4 1.6
-                                        ,rand 'a' 1.9 2.1
-                                        ,rand 'a' 3.9 4.1]
+                               fr = mce [rand 'α' 1 1.1
+                                        ,rand 'β' 1.4 1.6
+                                        ,rand 'γ' 1.9 2.1
+                                        ,rand 'δ' 3.9 4.1]
                            in s + mix (sinOsc AR (f * fr) 0 * e)
                     ,\s -> bLowPass s (ff * linExp dy 0 1 1 fa) 0.1
-                    ,\s -> let e = envLinen 0 (es / rand 'a' 1 4) 0.1 1
+                    ,\s -> let e = envLinen 0 (es / rand 'ε' 1 4) 0.1 1
                            in s * envGen AR 1 1 0 1 RemoveSynth e]
     in offsetOut o (r * mce2 a a)
 
-pattern :: P Event
+pattern :: P_Bind
 pattern =
-    let o = prand 'a' [6,7] inf
-    in pbind [("degree",place [[0,1,2,3,4]
-                              ,[2,3,4,5,6]
-                              ,[4,3,4,3,6,7]
-                              ,[0,2,1,2,1,4,3,3,5]] inf)
-             ,("detune",pwhite 'b' (-2) 2 inf)
-             ,("octave",o)
-             ,("dur",prand 'c' [0.5,1,2] inf + pwhite 'd' (-0.1) 0.1 inf)
-             ,("amp",pwhite 'e' 0.01 0.1 inf)
-             ,("attack",pwhite 'f' 0.0005 0.001 inf)
-             ,("sustain",(o / 4) + pwhite 'g' 0.01 0.5 inf)
-             ,("ffreq",pwhite 'h' 200 2000 inf)
-             ,("famt",pwhite 'i' 3 6 inf)
-             ,("hdur",pwhite 'j' 0.05 0.3 inf)
-             ,("impdecay",pwhite 'k' 0.001 0.01 inf)]
+    let o = prand 'ζ' [6,7] inf
+    in [(K_instr,psynth (synthdef "ping" ping))
+       ,(K_degree,place [[0,1,2,3,4]
+                        ,[2,3,4,5,6]
+                        ,[4,3,4,3,6,7]
+                        ,[0,2,1,2,1,4,3,3,5]] inf)
+       ,(K_detune,pwhite 'η' (-2) 2 inf)
+       ,(K_octave,o)
+       ,(K_dur,prand 'θ' [0.5,1,2] inf + pwhite 'ι' (-0.1) 0.1 inf)
+       ,(K_amp,pwhite 'κ' 0.01 0.1 inf)
+       ,(K_param "attack",pwhite 'λ' 0.0005 0.001 inf)
+       ,(K_sustain,(o / 4) + pwhite 'μ' 0.01 0.5 inf)
+       ,(K_param "ffreq",pwhite 'ν' 200 2000 inf)
+       ,(K_param "famt",pwhite 'ξ' 3 6 inf)
+       ,(K_param "hdur",pwhite 'ο' 0.05 0.3 inf)
+       ,(K_param "impdecay",pwhite 'π' 0.001 0.01 inf)]
 
 amplitude_mod :: (ID a, Enum a) => a -> UGen -> UGen
 amplitude_mod z i =
@@ -73,7 +73,6 @@
 
 main :: IO ()
 main = do
-  let s = synthdef "ping" ping
-  withSC3 (do post "amplitude_mod" 2 0 (amplitude_mod 'a')
+  withSC3 (do post "amplitude_mod" 2 0 (amplitude_mod 'ρ')
               post "limiting" 2 0 limiting)
-  audition (s,pattern)
+  audition (pbind pattern)
diff --git a/gr/nharm-m.hs b/gr/nharm-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/nharm-m.hs
@@ -0,0 +1,35 @@
+-- nharm (rd)
+
+import Control.Concurrent {- base -}
+import Control.Monad
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad as U {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+nharm :: (Num b, Integral a) => a -> b -> [b]
+nharm n f = map ((* f) . fromIntegral) [1..n]
+
+klg :: UId m => UGen -> Int -> m UGen
+klg m u = do
+    n <- rrand 4 u
+    d <- iRand 9 12
+    f <- iRand m (m + 2)
+    l <- sequence (replicate n (U.rand 0.01 0.02))
+    p <- U.rand (-1.0) 1.0
+    let a = 0.5
+        e = envGen KR 1 0.9 0 1 RemoveSynth (envSine d a)
+        nh = nharm n (midiCPS f)
+        s = klangSpec nh l (replicate n 0.0)
+    return (pan2 (klang AR 1 0 s) p e)
+
+ply :: Int -> (Double,Double) -> UGen -> Int -> IO ()
+ply n (l,r) m u = do
+  let a = do pauseThread =<< rrand l r
+             audition . out 0 =<< klg m u
+  replicateM_ n a
+
+main :: IO ()
+main = do
+  _ <- forkIO (ply 32 (0.25,0.75) 92 24)
+  _ <- forkIO (ply 8 (1.25,1.75) 12 54)
+  return ()
diff --git a/gr/nharm-p.hs b/gr/nharm-p.hs
--- a/gr/nharm-p.hs
+++ b/gr/nharm-p.hs
@@ -1,9 +1,8 @@
--- nharm-p
+-- nharm-p (rd)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 nharm :: Num n => Int -> n -> [n]
 nharm n f = map ((* f) . fromIntegral) [1..n]
@@ -20,7 +19,7 @@
         s = klangSpec nh l (replicate n 0.0)
     in out 0 (pan2 (klang AR 1 0 s) p e)
 
-type Range = (Double,Double)
+type Range = (Field,Field)
 
 {- Note that the dur key is used only to schedule the nodes. Both it,
 and any gate message, are ignored by the UGen graph, which manages
@@ -28,10 +27,10 @@
 
 pN :: Int -> Range -> Range -> P Event
 pN n (m0,m1) (d0,d1) =
-    let i = synthdef ("klg" ++ show n) (klg n)
-        p = pbind [("midinote",pwhite 'α' m0 m1 inf)
-                  ,("dur",pwhite 'β' d0 d1 inf)]
-    in pinstr_d (return (i,False)) p
+    let s = synthdef ("klg" ++ show n) (klg n)
+    in pbind [(K_instr,psynth s)
+             ,(K_midinote,pwhite 'α' m0 m1 inf)
+             ,(K_dur,pwhite 'β' d0 d1 inf)]
 
 main :: IO ()
 main = audition (pmerge (pN 24 (90,92) (0.25,0.75))
diff --git a/gr/nharm.hs b/gr/nharm.hs
deleted file mode 100644
--- a/gr/nharm.hs
+++ /dev/null
@@ -1,35 +0,0 @@
---nharm (rd)
-
-import Control.Concurrent {- base -}
-import Control.Monad
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad as U {- hsc3 -}
-import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
-
-nharm :: (Num b, Integral a) => a -> b -> [b]
-nharm n f = map ((* f) . fromIntegral) [1..n]
-
-klg :: UId m => UGen -> Int -> m UGen
-klg m u = do
-    n <- rrand 4 u
-    d <- iRand 9 12
-    f <- iRand m (m + 2)
-    l <- sequence (replicate n (U.rand 0.01 0.02))
-    p <- U.rand (-1.0) 1.0
-    let a = 0.5
-        e = envGen KR 1 0.9 0 1 RemoveSynth (envSine d a)
-        nh = nharm n (midiCPS f)
-        s = klangSpec nh l (replicate n 0.0)
-    return (pan2 (klang AR 1 0 s) p e)
-
-ply :: Int -> (Double,Double) -> UGen -> Int -> IO ()
-ply n (l,r) m u = do
-  let a = do pauseThread =<< rrand l r
-             audition . out 0 =<< klg m u
-  replicateM_ n a
-
-main :: IO ()
-main = do
-  _ <- forkIO (ply 32 (0.25,0.75) 92 24)
-  _ <- forkIO (ply 8 (1.25,1.75) 12 54)
-  return ()
diff --git a/gr/noise-modulated-sines.hs b/gr/noise-modulated-sines.hs
--- a/gr/noise-modulated-sines.hs
+++ b/gr/noise-modulated-sines.hs
@@ -5,9 +5,9 @@
 
 nms :: UGen
 nms =
-    let f = midiCPS (rand 'a' 60 100)
+    let f = midiCPS (rand 'α' 60 100)
         o = fSinOsc AR (mce2 f (f + 0.2)) 0
-        a = lfNoise2 'b' KR (f * mce2 0.15 0.16) * 0.1
+        a = lfNoise2 'β' KR (f * mce2 0.15 0.16) * 0.1
     in o * a
 
 nms_pp :: (UGen -> UGen)
diff --git a/gr/nokia.hs b/gr/nokia.hs
--- a/gr/nokia.hs
+++ b/gr/nokia.hs
@@ -2,53 +2,48 @@
 -- partial...
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Control.Instrument
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 grain :: UGen
 grain =
     let o = control KR "out" 0
-        freq' = control KR "freq" 100
+        f = control KR "freq" 100
         attack = control KR "attack" 0
         decay' = control KR "decay" 1
-        sustain' = control KR "sustain" 0.1
+        sus = control KR "sustain" 0.1
         distort' = control KR "distort" 0
         fTime = control KR "fTime" 0.1
         fFac = control KR "fFac" 1.2
         amp' = control KR "amp" 1
         delay = control KR "delay" 0
-        startFreq = fFac * freq'
-        endFreq = freq'
+        startFreq = fFac * f
+        endFreq = f
         env l t = Envelope l t [] Nothing Nothing
         aEnv = let e = envPerc attack decay'
-               in envGen AR 1 amp' 0 sustain' RemoveSynth e
+               in envGen AR 1 amp' 0 sus RemoveSynth e
         fEnv = let e = env [startFreq,endFreq] [fTime]
                in envGen AR 1 1 0 1 DoNothing e
         src = wrap2 (sinOsc AR fEnv 1 * (1 + distort')) 1
     in out o (delayN (src * mce2 aEnv aEnv) 0.1 delay)
 
-pattern :: Enum e => (Value, e) -> P Event
+pattern :: Enum e => (Field,e) -> P_Bind
 pattern (f,z) =
-    let f_mul = prand 'a' [4,1,2,3,4,8] inf
-    in pbind [("freq",return f * f_mul * pwhite z 0.99 1 (12 * 4))
-             ,("dur",pseq [pseq [10,0.1,10] 1,pseq [0.1] 6
-                          ,pseq [1,pseq [0.1] 6,1] inf] 1)
-             ,("fTime",0.0125)
-             ,("fFac",5)
-             ,("sustain",0.1)
-             ,("attack",0.0005)
-             ,("decay",2)
-             ,("amp",0.1)
-             ,("delay",pwhite z 0.01 0.1 1 * 0.1)]
-
-grain_ip :: P Instrument
-grain_ip =
-    let n = "grain"
-        s = synthdef n grain
-    in pcons (InstrumentDef s False) (prepeat (InstrumentName n False))
+    let f_mul = prand 'α' [4,1,2,3,4,8] inf
+    in [(K_instr,pinstr "grain")
+       ,(K_freq,prepeat f * f_mul * phold (pwhite z 0.99 1 inf))
+       ,(K_dur,pseq [pseq [10,0.1,10] 1
+                    ,pseq [0.1] 6
+                    ,pseq [1,pseq [0.1] 6,1] inf] 1)
+       ,(K_param "fTime",0.0125)
+       ,(K_param "fFac",5)
+       ,(K_sustain,0.1)
+       ,(K_param "attack",0.0005)
+       ,(K_param "decay",2)
+       ,(K_amp,0.1)
+       ,(K_param "delay",phold (pwhite z 0.01 0.1 inf * 0.1))]
 
 main :: IO ()
 main =
     let f = concat (replicate 12 [1200, 800, 600, 200])
-    in audition (pinstr grain_ip (ppar (map pattern (zip f ['a'..]))))
+        p = ppar (map (pbind . pattern) (zip f ['β'..]))
+    in withSC3 (async (d_recv (synthdef "grain" grain)) >> play p)
diff --git a/gr/non-real-time.hs b/gr/non-real-time.hs
--- a/gr/non-real-time.hs
+++ b/gr/non-real-time.hs
@@ -13,12 +13,11 @@
 -- > audition score
 score :: NRT
 score =
-    let at t = Bundle (NTPr t)
-        mk_instr = d_recv (synthdef "test" graph)
+    let mk_instr = d_recv (synthdef "test" graph)
         mk_group = g_new [(1, AddToTail, 0)]
-        mk_synth t f = at t [s_new "test" (-1) AddToTail 1 [("freq", f)]]
+        mk_synth t f = bundle t [s_new "test" (-1) AddToTail 1 [("freq",f)]]
         notes = take 128 (zipWith mk_synth [1.0, 1.05 ..] [330, 350 ..])
-    in NRT (at 0.0 [mk_instr, mk_group] : notes)
+    in NRT (bundle 0.0 [mk_instr, mk_group] : notes)
 
 render :: NRT -> IO ()
 render s = do
diff --git a/gr/nv-tw-1.hs b/gr/nv-tw-1.hs
--- a/gr/nv-tw-1.hs
+++ b/gr/nv-tw-1.hs
@@ -5,12 +5,12 @@
 
 nv_tw_1 :: UGen
 nv_tw_1 =
-    let a = uclone 'a' 2 (pinkNoise 'a' AR)
+    let a = uclone 'α' 2 (pinkNoise 'β' AR)
         nd z =
-            let n = lfNoise1 'a' KR (rand 'a' 0 0.05)
+            let n = lfNoise1 'γ' KR (rand 'δ' 0 0.05)
                 f = linExp n (-1) 1 40 15000
-            in bBandStop z f (expRand 'a' 0.1 2)
-    in lpf (useq 'a' 50 nd a) 1e5
+            in bBandStop z f (expRand 'ε' 0.1 2)
+    in lpf (useq 'ζ' 50 nd a) 1e5
 
 main :: IO ()
 main = audition (out 0 nv_tw_1)
diff --git a/gr/nv-tw-54.hs b/gr/nv-tw-54.hs
--- a/gr/nv-tw-54.hs
+++ b/gr/nv-tw-54.hs
@@ -1,7 +1,7 @@
 -- http://sccode.org/1-V (nv)
 
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 fF :: Double -> Double -> Double
 fF i f =
@@ -23,6 +23,9 @@
     in synthdef "nvi" (out 0 o)
 
 main :: IO ()
-main = audition (nvi,pbind [("f",fromList fS)
-                           ,("i",pseries 0 1 inf)
-                           ,("dur",0.3)])
+main =
+    let fS' = map realToFrac fS
+    in audition (pbind [(K_instr,psynth nvi)
+                       ,(K_param "f",toP fS')
+                       ,(K_param "i",pseries 0 1 inf)
+                       ,(K_dur,0.3)])
diff --git a/gr/nx102.hs b/gr/nx102.hs
--- a/gr/nx102.hs
+++ b/gr/nx102.hs
@@ -3,18 +3,17 @@
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
--- > Sound.SC3.UGen.Dot.draw nx102
 -- > audition (out 0 nx102)
 nx102 :: UGen
 nx102 =
-    let r = rand 'a' 50 100
+    let r = rand 'α' 50 100
         b = playBuf 1 KR 1 r 1 0 Loop DoNothing
-        f = clip (b * rand 'a' 100 1000) (rand 'a' 5 12) (rand 'a' 12 20)
+        f = clip (b * rand 'β' 100 1000) (rand 'γ' 5 12) (rand 'δ' 12 20)
         o = pulse AR f 0.5
-        lrf = rand 'a' 100 5000
-        lrq = rand 'a' 0.005 0.1
-        hrf = rand 'a' 5000 20000
-        hrq = rand 'b' 0.005 0.1
+        lrf = rand 'ε' 100 5000
+        lrq = rand 'ζ' 0.005 0.1
+        hrf = rand 'η' 5000 20000
+        hrq = rand 'θ' 0.005 0.1
         s = rhpf (rlpf o lrf lrq) hrf hrq
         v = freeVerb s 0 0 0
         pk i n k = bPeakEQ i n 6.0 k
diff --git a/gr/one-line.hs b/gr/one-line.hs
--- a/gr/one-line.hs
+++ b/gr/one-line.hs
@@ -1,4 +1,4 @@
--- one-line (lance putnam)
+-- one-line (ljp)
 
 import Sound.SC3 {- hsc3 -}
 
diff --git a/gr/oscillator-cluster-m.hs b/gr/oscillator-cluster-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/oscillator-cluster-m.hs
@@ -0,0 +1,35 @@
+-- oscillator cluster
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+oscillator_cluster :: (Functor m,UId m) => m UGen
+oscillator_cluster = do
+  let ln a b d = line KR a b d RemoveSynth
+      rln r a b d = fmap (\n -> ln (a + n) b d) (rand 0 r)
+      prt d a cf = do r1 <- rand cf (cf + 2)
+                      r2 <- rln 1 5 0.01 d
+                      r3 <- rln 10 20 0 d
+                      r4 <- rand 0.1 0.2
+                      let f = mce2 cf r1 + sinOsc KR r2 0 * r3
+                          o = fSinOsc AR f 0
+                          e = decay2 (impulse AR 0 0) r4 d * a
+                      return (o * e)
+      np = 12
+      fp = sequence (replicate np (rand 220 660))
+  d <- rand 4 7
+  a <- rand 0.01 0.05
+  fmap sum (mapM (prt d a) =<< fp)
+
+main :: IO ()
+main = do
+  u <- oscillator_cluster
+  let s = synthdef "oscillator_cluster" (out 0 u)
+      p = pbind [(K_instr,psynth s),(K_dur,prand 'α' [0.25,0.5,1,3,5] inf)]
+  audition p
+
+{-
+audition . (out 0) =<< oscillator_cluster
+let otu = Sound.SC3.Lang.Control.OverlapTexture.overlapTextureU
+otu (0,6,3,maxBound) =<< oscillator_cluster
+-}
diff --git a/gr/oscillator-cluster.hs b/gr/oscillator-cluster.hs
deleted file mode 100644
--- a/gr/oscillator-cluster.hs
+++ /dev/null
@@ -1,34 +0,0 @@
--- oscillator cluster
-
-import Sound.SC3.Monad {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
-
-oscillator_cluster :: (Functor m,UId m) => m UGen
-oscillator_cluster = do
-  let ln a b d = line KR a b d RemoveSynth
-      rln r a b d = fmap (\n -> ln (a + n) b d) (rand 0 r)
-      prt d a cf = do r1 <- rand cf (cf + 2)
-                      r2 <- rln 1 5 0.01 d
-                      r3 <- rln 10 20 0 d
-                      r4 <- rand 0.1 0.2
-                      let f = mce2 cf r1 + sinOsc KR r2 0 * r3
-                          o = fSinOsc AR f 0
-                          e = decay2 (impulse AR 0 0) r4 d * a
-                      return (o * e)
-      np = 12
-      fp = sequence (replicate np (rand 220 660))
-  d <- rand 4 7
-  a <- rand 0.01 0.05
-  return.sum =<< mapM (prt d a) =<< fp
-
-main :: IO ()
-main = do
-  u <- oscillator_cluster
-  let s = synthdef "oscillator_cluster" (out 0 u)
-  audition (s,pbind [("dur",prand 'a' [0.25,0.5,1,3,5] inf)])
-
-{-
-audition . (out 0) =<< oscillator_cluster
-let otu = Sound.SC3.Lang.Control.OverlapTexture.overlapTextureU
-otu (0,6,3,maxBound) =<< oscillator_cluster
--}
diff --git a/gr/overlap-add.hs b/gr/overlap-add.hs
--- a/gr/overlap-add.hs
+++ b/gr/overlap-add.hs
@@ -1,20 +1,19 @@
--- overlap-add (jmcc, rd)
+-- overlap-add (jmcc)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 sine :: UGen
 sine =
     let r0 = expRand 'α' 500 1400
-        r1 = rand 'α' (-1) 1
+        r1 = rand 'β' (-1) 1
     in pan2 (sinOsc AR r0 0) r1 0.01
 
 noise :: UGen
 noise =
-    let n0 = whiteNoise 'α' AR
-        r0 = expRand 'α' 800 8400
-        r1 = rand 'α' (-1) 1
+    let n0 = whiteNoise 'γ' AR
+        r0 = expRand 'δ' 800 8400
+        r1 = rand 'ε' (-1) 1
     in pan2 (resonz (n0 * 0.1) r0 0.05) r1 0.25
 
 main :: IO ()
diff --git a/gr/pattern-buffer-m.hs b/gr/pattern-buffer-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/pattern-buffer-m.hs
@@ -0,0 +1,54 @@
+-- pattern buffer (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+tseq :: [UGen] -> UGen
+tseq l =
+    let n = fromIntegral (length l) / 2.0
+    in select (lfSaw KR 0.5 0 * n + n) (mce l)
+
+pattern_buffer :: UId m => Int -> m UGen
+pattern_buffer c = do
+  let p = phasor AR 0 (bufRateScale KR 10) 0 (bufFrames KR 10) 0
+      t = bufRdC 1 AR 10 p Loop
+  r1 <- sequence (replicate c (rrand 36 96))
+  r2 <- sequence (replicate c (rrand (-1.0) 1.0))
+  r3 <- rrand 0 1
+  n1 <- tRand 0.02 0.08 t
+  let e = decay2 t 0.01 n1
+      f = midiCPS (tseq r1)
+      l = tseq r2
+      o = [sinOsc AR f 0, saw AR f] !! r3
+  return (pan2 o l e)
+
+set_pattern :: Transport m => Int -> Int -> m ()
+set_pattern nf c = do
+  let rs = do r0 <- rrand 0 nf
+              r1 <- rrand 0.0 1.0
+              send (b_set1 10 r0 r1)
+  sequence_ (replicate c rs)
+
+fill_clr :: (Transport m) => Int -> Int -> Double -> Int -> m b
+fill_clr nf c dt n = do
+  let go i = if i == 0
+             then do send (b_zero 10)
+                     go n
+             else do set_pattern nf c
+                     pauseThread dt
+                     go (i - 1)
+  go n
+
+run :: (UId m,Transport m) => m ()
+run = do
+  let nf = 2 * 48000
+      c = 24
+      n = 16
+      dt = 2.6
+  _ <- async (b_alloc 10 (nf * 2) 1)
+  play . out 0 =<< pattern_buffer c
+  fill_clr nf c dt n
+
+main :: IO ()
+main = withSC3 run
diff --git a/gr/pattern-buffer.hs b/gr/pattern-buffer.hs
deleted file mode 100644
--- a/gr/pattern-buffer.hs
+++ /dev/null
@@ -1,54 +0,0 @@
--- pattern buffer (rd)
-
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
-import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
-
-tseq :: [UGen] -> UGen
-tseq l =
-    let n = fromIntegral (length l) / 2.0
-    in select (lfSaw KR 0.5 0 * n + n) (mce l)
-
-pattern_buffer :: UId m => Int -> m UGen
-pattern_buffer c = do
-  let p = phasor AR 0 (bufRateScale KR 10) 0 (bufFrames KR 10) 0
-      t = bufRdC 1 AR 10 p Loop
-  r1 <- sequence (replicate c (rrand 36 96))
-  r2 <- sequence (replicate c (rrand (-1.0) 1.0))
-  r3 <- rrand 0 1
-  n1 <- tRand 0.02 0.08 t
-  let e = decay2 t 0.01 n1
-      f = midiCPS (tseq r1)
-      l = tseq r2
-      o = [sinOsc AR f 0, saw AR f] !! r3
-  return (pan2 o l e)
-
-set_pattern :: Transport m => Int -> Int -> m ()
-set_pattern nf c = do
-  let rs = do r0 <- rrand 0 nf
-              r1 <- rrand 0.0 1.0
-              send (b_set1 10 r0 r1)
-  sequence_ (replicate c rs)
-
-fill_clr :: (Transport m) => Int -> Int -> Double -> Int -> m b
-fill_clr nf c dt n = do
-  let go i = if i == 0
-             then do send (b_zero 10)
-                     go n
-             else do set_pattern nf c
-                     pauseThread dt
-                     go (i - 1)
-  go n
-
-run :: (UId m,Transport m) => m ()
-run = do
-  let nf = 2 * 48000
-      c = 24
-      n = 16
-      dt = 2.6
-  _ <- async (b_alloc 10 (nf * 2) 1)
-  play . out 0 =<< pattern_buffer c
-  fill_clr nf c dt n
-
-main :: IO ()
-main = withSC3 run
diff --git a/gr/pkt-00.scd b/gr/pkt-00.scd
new file mode 100644
--- /dev/null
+++ b/gr/pkt-00.scd
@@ -0,0 +1,9 @@
+{
+var f0 = [100,200,300] + SinOsc.ar([0.11,0.22,0.33]);
+var ph0 = SinOsc.ar([0.1,0.2,0.3],0,2pi);
+var a0 = 0.1 + SinOsc.ar([0.01,0.02,0.03],0,0.05);
+var i = SinOsc.ar(f0,ph0,a0);
+var w = SinOsc.ar(SinOsc.ar(SinOsc.ar(0.13,0,5,6),0,8,50),0,1,1);
+var s = Splay.ar(i,w,0.7,SinOsc.ar(1.2,0,0.6));
+GVerb.ar(s,20,5,1,0.5,25,0,1,1);
+}.play
diff --git a/gr/pkt-07.scd b/gr/pkt-07.scd
new file mode 100644
--- /dev/null
+++ b/gr/pkt-07.scd
@@ -0,0 +1,37 @@
+{GVerb.ar(
+ LeakDC.ar(
+  SinOsc.ar(
+   SinOsc.ar(
+    SinOsc.ar(
+     SinOsc.ar(
+      SinOsc.ar(
+       SinOsc.ar(
+        SinOsc.ar(
+         1,
+         0,
+         2,
+         SinOsc.ar(1/2).exprange(1,2)
+        ),
+        0,
+        8,
+        SinOsc.ar(1/4).exprange(4,8)
+       ),
+       0,
+       32,
+       SinOsc.ar(1/8).exprange(16,32)
+      ),
+      0,
+      128,
+      SinOsc.ar(1/16).exprange(64,128)
+     ),
+     0,
+     512,
+     SinOsc.ar(1/32).exprange(256,512)
+    ),
+    0,
+    2048,
+    SinOsc.ar(1/64).exprange(1024,2048)
+   ),0,0.1
+  )
+ ),16,8,0.75,0.5)
+}.play
diff --git a/gr/plucked-strings-m.hs b/gr/plucked-strings-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/plucked-strings-m.hs
@@ -0,0 +1,27 @@
+-- plucked strings (jmcc)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+plucked_strings :: UId m => m UGen
+plucked_strings = do
+  let dt = do r0 <- rand 60 90
+              return (1 / midiCPS (floorE r0))
+      i = do r0 <- rand 2 2.2
+             n0 <- dust AR 0.5
+             r1 <- rand 0.05 0.15
+             r2 <- rand 0 (pi * 2)
+             r3 <- iRand 0 2
+             let s0 = impulse AR r0 0.3
+                 s1 = n0 * 0.3
+                 s2 = impulse AR (sinOsc KR r1 r2 * 5 + 5.2) 0.3
+             return (select r3 (mce [s0,s1,s2]))
+      s = do n0 <- pinkNoise AR
+             r1 <- rand (-1) 1
+             im <- i
+             dt' <- dt
+             let t = decay im 0.1 * n0 * 0.1
+             return (pan2 (combL t dt' dt' 4) r1 1)
+  fmap sum (sequence (replicate 5 s))
+
+main :: IO ()
+main = audition . out 0 =<< plucked_strings
diff --git a/gr/plucked-strings.hs b/gr/plucked-strings.hs
deleted file mode 100644
--- a/gr/plucked-strings.hs
+++ /dev/null
@@ -1,27 +0,0 @@
--- plucked strings (jmcc)
-
-import Sound.SC3.Monad {- hsc3 -}
-
-plucked_strings :: UId m => m UGen
-plucked_strings = do
-  let dt = do r0 <- rand 60 90
-              return (1 / midiCPS (floorE r0))
-      i = do r0 <- rand 2 2.2
-             n0 <- dust AR 0.5
-             r1 <- rand 0.05 0.15
-             r2 <- rand 0 (pi * 2)
-             r3 <- iRand 0 2
-             let s0 = impulse AR r0 0.3
-                 s1 = n0 * 0.3
-                 s2 = impulse AR (sinOsc KR r1 r2 * 5 + 5.2) 0.3
-             return (select r3 (mce [s0,s1,s2]))
-      s = do n0 <- pinkNoise AR
-             r1 <- rand (-1) 1
-             im <- i
-             dt' <- dt
-             let t = decay im 0.1 * n0 * 0.1
-             return (pan2 (combL t dt' dt' 4) r1 1)
-  return.sum =<< sequence (replicate 5 s)
-
-main :: IO ()
-main = audition . out 0 =<< plucked_strings
diff --git a/gr/police-state-m.hs b/gr/police-state-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/police-state-m.hs
@@ -0,0 +1,24 @@
+-- police state (jmcc)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+police_state :: UId m => m UGen
+police_state = do
+  let nd = do r0 <- rand 0.02 0.12
+              r1 <- rand 0 (pi * 2)
+              r2 <- rand 0 600
+              r3 <- rand 700 1300
+              r4 <- rand (-1) 1
+              r5 <- rand 80 120
+              n0 <- lfNoise2 AR r5
+              let f = sinOsc KR r0 r1 * r2 + r3
+              return (pan2 (sinOsc AR f 0 * n0 * 0.1) r4 1)
+  ns <- clone 4 nd
+  n0 <- clone 2 (lfNoise2 KR 0.4)
+  n1 <- lfNoise2 AR (n0 * 90 + 620)
+  n2 <- lfNoise2 KR (mce2 0.3 0.301)
+  let e = n1 * (n2 * 0.15 + 0.18)
+  return (combL (mix ns + e) 0.3 0.3 3)
+
+main :: IO ()
+main = audition . out 0 =<< police_state
diff --git a/gr/police-state.hs b/gr/police-state.hs
--- a/gr/police-state.hs
+++ b/gr/police-state.hs
@@ -1,24 +1,24 @@
 -- police state (jmcc)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.UGen.Protect {- hsc3 -}
 
-police_state :: UId m => m UGen
-police_state = do
-  let nd = do r0 <- rand 0.02 0.12
-              r1 <- rand 0 (pi*2)
-              r2 <- rand 0 600
-              r3 <- rand 700 1300
-              r4 <- rand (-1) 1
-              r5 <- rand 80 120
-              n0 <- lfNoise2 AR r5
-              let f = sinOsc KR r0 r1 * r2 + r3
-              return (pan2 (sinOsc AR f 0 * n0 * 0.1) r4 1)
-  ns <- clone 4 nd
-  n0 <- clone 2 (lfNoise2 KR 0.4)
-  n1 <- lfNoise2 AR (n0 * 90 + 620)
-  n2 <- lfNoise2 KR (mce2 0.3 0.301)
-  let e = n1 * (n2 * 0.15 + 0.18)
-  return (combL (mix ns + e) 0.3 0.3 3)
+nd :: UGen
+nd =
+    let n = lfNoise2 'α' AR (rand 'β' 80 120)
+        f = sinOsc KR (rand 'γ' 0.02 0.12) (rand 'δ' 0 (pi * 2)) *
+            rand 'ε' 0 600 +
+            rand 'ζ' 700 1300
+    in pan2 (sinOsc AR f 0 * n * 0.1) (rand 'η' (-1) 1) 1
 
+police_state :: UGen
+police_state =
+  let ns = uclone 'θ' 4 nd
+      n0 = uclone 'ι' 2 (lfNoise2 'κ' KR 0.4)
+      n1 = lfNoise2 'λ' AR (n0 * 90 + 620)
+      n2 = lfNoise2 'μ' KR (mce2 0.3 0.301)
+      e = n1 * (n2 * 0.15 + 0.18)
+  in combL (mix ns + e) 0.3 0.3 3
+
 main :: IO ()
-main = audition . out 0 =<< police_state
+main = audition (out 0 police_state)
diff --git a/gr/pond-life-hp.hs b/gr/pond-life-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/pond-life-hp.hs
@@ -0,0 +1,16 @@
+-- pond life (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+pond_life :: UId m => m UGen
+pond_life = do
+  let f = fSinOsc KR (20 + #(rand 0 30)) 0
+          * #(rand 100 400)
+          + #(linRand 500 2500 0)
+  let a = lfPulse KR (3 / #(rand 1 9)) #(rand 0.2 0.5) 0.04
+  return (pan2 (sinOsc AR f 0 * a) #(rand (-1) 1) 0.5)
+
+main :: IO ()
+main = overlapTextureU (8,8,4,maxBound) =<< pond_life
diff --git a/gr/pond-life.hs b/gr/pond-life.hs
--- a/gr/pond-life.hs
+++ b/gr/pond-life.hs
@@ -5,10 +5,10 @@
 
 pond_life :: UGen
 pond_life =
-    let f0 = 20 + rand 'a' 0 30
-        f1 = fSinOsc KR f0 0 * rand 'b' 100 400 + linRand 'c' 500 2500 0
-        a = lfPulse KR (3 / rand 'd' 1 9) (rand 'e' 0.2 0.5) 0.04
-    in pan2 (sinOsc AR f1 0 * a) (rand 'f' (-1) 1) 0.5
+    let f0 = 20 + rand 'α' 0 30
+        f1 = fSinOsc KR f0 0 * rand 'β' 100 400 + linRand 'γ' 500 2500 0
+        a = lfPulse KR (3 / rand 'δ' 1 9) (rand 'ε' 0.2 0.5) 0.04
+    in pan2 (sinOsc AR f1 0 * a) (rand 'ζ' (-1) 1) 0.5
 
 main :: IO ()
 main = overlapTextureU (8,8,4,maxBound) pond_life
diff --git a/gr/proxy-mixer-m.hs b/gr/proxy-mixer-m.hs
--- a/gr/proxy-mixer-m.hs
+++ b/gr/proxy-mixer-m.hs
@@ -13,7 +13,6 @@
 mce_scramble :: UGen -> IO UGen
 mce_scramble u = fmap mce (L.scramble (mceChannels u))
 
--- > pm >>= Sound.SC3.UGen.Dot.draw
 pm :: IO UGen
 pm = do
   e <- mk_e
diff --git a/gr/proxy-mixer.hs b/gr/proxy-mixer.hs
--- a/gr/proxy-mixer.hs
+++ b/gr/proxy-mixer.hs
@@ -1,7 +1,7 @@
 -- > Sound.SC3.UGen.Help.viewSC3Help "ProxyMixer"
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
 randN_l :: ID z => Int -> z -> UGen -> UGen -> [UGen]
 randN_l k z l = mceChannels . randN k z l
@@ -9,15 +9,14 @@
 iScramble :: ID z => z -> UGen -> UGen
 iScramble z = tScramble z KR 1
 
--- > Sound.SC3.UGen.Dot.draw pm
 pm :: UGen
 pm =
-    let e = let l = randN_l 11 'a' (-1) 1
-                t = randN_l 10 'a' 0 1
+    let e = let l = randN_l 11 'α' (-1) 1
+                t = randN_l 10 'β' 0 1
             in Envelope l t [EnvNum 0] (Just 9) (Just 0)
         env = envGen KR 1 1 0 1 DoNothing e
         p = midiRatio (env * mce [1, 0.33, -1] * 19) * 250
-        o = formant AR p (iScramble 'a' p * 2) (iScramble 'b' p)
+        o = formant AR p (iScramble 'γ' p * 2) (iScramble 'δ' p)
     in out 0 (splay o 1 1 0 True * 0.1)
 
 main :: IO ()
diff --git a/gr/pulsing-bottles-m.hs b/gr/pulsing-bottles-m.hs
--- a/gr/pulsing-bottles-m.hs
+++ b/gr/pulsing-bottles-m.hs
@@ -15,7 +15,7 @@
              p <- rand 0 (pi * 2)
              return (sinOsc KR f p)
       u = liftM2 (\x y -> pan2 x y 1) r s
-  return.sum =<< sequence (replicate 6 u)
+  fmap sum (sequence (replicate 6 u))
 
 main :: IO ()
 main = overlapTextureU (4,4,4,maxBound) =<< pulsing_bottles
diff --git a/gr/pwm-crossfade.hs b/gr/pwm-crossfade.hs
--- a/gr/pwm-crossfade.hs
+++ b/gr/pwm-crossfade.hs
@@ -5,12 +5,11 @@
 urangeM :: UGen -> UGen -> UGen
 urangeM u = let [u0,u1] = mceChannels u in urange u0 u1
 
--- > Sound.SC3.UGen.Dot.draw pwm_crossfade
 pwm_crossfade :: UGen
 pwm_crossfade =
     let n = mce [400,500,450,376,600]
         d = 1/20
-        f = demand (impulse KR d (mce2 0 0.5)) 0 (dseq 'a' dinf n)
+        f = demand (impulse KR d (mce2 0 0.5)) 0 (dseq 'α' dinf n)
         f_ = urangeM f (lfPulse KR 8 0 (range 0 1 (lfTri KR d 1)))
     in lpf (saw AR (max 376 f_ * mce2 1 0.99) * 0.5) 8000
 
diff --git a/gr/rails.hs b/gr/rails.hs
--- a/gr/rails.hs
+++ b/gr/rails.hs
@@ -7,16 +7,15 @@
 rand2 :: ID a => a -> UGen -> UGen
 rand2 e n = rand e (-n) n
 
--- > Sound.SC3.UGen.Dot.draw rails
 rails :: UGen
 rails =
     let n = 20 -- resonant modes
-        e = dust 'a' AR 100 * 0.04 -- excitation
+        e = dust 'α' AR 100 * 0.04 -- excitation
         f = xLine KR 3000 300 8 DoNothing -- sweep filter down
-        l = line KR (rand2 'b' 1) (rand2 'c' 1) 8 DoNothing -- sweep pan
-        r = uclone' 'a' n (200 + linRand 'd' 0 3000 0) -- resonant frequencies
+        l = line KR (rand2 'β' 1) (rand2 'γ' 1) 8 DoNothing -- sweep pan
+        r = uclone' 'δ' n (200 + linRand 'ε' 0 3000 0) -- resonant frequencies
         a = replicate n 1
-        t = uclone' 'b' n (0.2 + rand 'e' 0 1) -- ring times
+        t = uclone' 'ζ' n (0.2 + rand 'η' 0 1) -- ring times
         k = klank (resonz e f 0.2) 1 0 1 (klankSpec r a t)
     in pan2 k l 1
 
diff --git a/gr/rain-thunder.hs b/gr/rain-thunder.hs
--- a/gr/rain-thunder.hs
+++ b/gr/rain-thunder.hs
@@ -2,16 +2,15 @@
 
 import Sound.SC3.ID {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw rain_thunder
 rain_thunder :: UGen
 rain_thunder =
-    let n0 = pinkNoise 'a' AR * (0.08 + lfNoise1 'a' KR 0.3 * 0.02)
-        d0 = lpf (dust2 'b' AR (range 40 50 (lfNoise1 'b' KR 0.2))) 7000
+    let n0 = pinkNoise 'α' AR * (0.08 + lfNoise1 'β' KR 0.3 * 0.02)
+        d0 = lpf (dust2 'γ' AR (range 40 50 (lfNoise1 'δ' KR 0.2))) 7000
         e0 = line KR 0 1 10 DoNothing
         p0 = tanh (3 * gVerb (hpf (n0+d0) 400) 250 100 0.25 0.5 15 0.3 0.7 0.5 300 * e0)
         lfNoise1C e r f = clip (lfNoise1 e r f) 0 1
-        n1 = pinkNoise 'c' AR * ((lfNoise1C 'c' KR 3 * lfNoise1C 'c' KR 2) ** 1.8)
-        f1 = linExp (lfNoise1 'd' KR 1) (-1) 1 100 2500
+        n1 = pinkNoise 'ε' AR * ((lfNoise1C 'ζ' KR 3 * lfNoise1C 'η' KR 2) ** 1.8)
+        f1 = linExp (lfNoise1 'θ' KR 1) (-1) 1 100 2500
         e1 = line KR 0 0.7 30 DoNothing
         p1 = gVerb (tanh (lpf (10 * hpf n1 20) f1)) 270 30 0.7 0.5 15 0.5 0.7 0.5 300 * e1
     in limiter (p0 + p1) 1 0.01
diff --git a/gr/random-panning-sines-m.hs b/gr/random-panning-sines-m.hs
--- a/gr/random-panning-sines-m.hs
+++ b/gr/random-panning-sines-m.hs
@@ -3,7 +3,6 @@
 import Sound.SC3.Monad {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
--- > Sound.SC3.UGen.Dot.draw =<< rps
 rps :: UId m => m UGen
 rps = do
   let nd = do r0 <- linRand 80 2000 0
diff --git a/gr/random-panning-sines.hs b/gr/random-panning-sines.hs
--- a/gr/random-panning-sines.hs
+++ b/gr/random-panning-sines.hs
@@ -4,14 +4,13 @@
 import Sound.SC3.UGen.Protect
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
--- > Sound.SC3.UGen.Dot.draw rps
 rps :: UGen
 rps =
-    let nd = let o = fSinOsc AR (linRand 'a' 80 2000 0) 0
-                 l = lfNoise1 'b' KR (rand 'b' 0.8 1.2)
-                 a = lfNoise1 'c' KR (rand 'c' 0.82 0.98)
+    let nd = let o = fSinOsc AR (linRand 'α' 80 2000 0) 0
+                 l = lfNoise1 'β' KR (rand 'γ' 0.8 1.2)
+                 a = lfNoise1 'δ' KR (rand 'ε' 0.82 0.98)
              in pan2 o l a
-    in mix (uclone 'a' 8 nd) * (0.4 / 8)
+    in mix (uclone 'ζ' 8 nd) * (0.4 / 8)
 
 main :: IO ()
 main = overlapTextureU (8,8,2,maxBound) rps
diff --git a/gr/random-sine-waves-hp.hs b/gr/random-sine-waves-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/random-sine-waves-hp.hs
@@ -0,0 +1,10 @@
+-- random sine waves (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+main :: IO ()
+main = do
+  let rsw = pan2 (fSinOsc AR #(rand 0 2000) 0 * 0.02) #(rand (-1) 1) 1
+  overlapTextureU (2,5,12,maxBound) rsw
diff --git a/gr/random-sine-waves-she.hs b/gr/random-sine-waves-she.hs
new file mode 100644
--- /dev/null
+++ b/gr/random-sine-waves-she.hs
@@ -0,0 +1,11 @@
+-- random sine waves (jmcc)
+{-# OPTIONS_GHC -F -pgmF she #-}
+
+import Control.Applicative {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+main :: IO ()
+main = do
+  s <- (|pan2 ((|fSinOsc ~AR (rand 0 2000) ~0|) .* 0.02) (rand (-1) 1) ~1|)
+  overlapTextureU (2,5,12,maxBound) s
diff --git a/gr/random-sine-waves.hs b/gr/random-sine-waves.hs
--- a/gr/random-sine-waves.hs
+++ b/gr/random-sine-waves.hs
@@ -5,9 +5,9 @@
 
 rsw :: UGen
 rsw =
-    let f = rand 'a' 0 2000
+    let f = rand 'α' 0 2000
         o = fSinOsc AR f 0 * 0.02
-    in pan2 o (rand 'b' (-1) 1) 1
+    in pan2 o (rand 'β' (-1) 1) 1
 
 main :: IO ()
 main = overlapTextureU (2,5,12,maxBound) rsw
diff --git a/gr/record-scratcher.hs b/gr/record-scratcher.hs
--- a/gr/record-scratcher.hs
+++ b/gr/record-scratcher.hs
@@ -1,4 +1,4 @@
--- record scratcher (josh parmenter)
+-- record scratcher (jp)
 
 import Sound.OSC {- hosc -}
 import Sound.SC3 {- hsc3 -}
diff --git a/gr/red-frik-m.hs b/gr/red-frik-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/red-frik-m.hs
@@ -0,0 +1,24 @@
+-- red_frik (f0)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+red :: UId m => UGen -> UGen -> m UGen
+red tr n = do
+  r1 <- tRand 0.3 3 tr
+  r2 <- tRand 0.3 5 tr
+  r3 <- tRand 0 0.5 tr
+  r4 <- tRand 0.49 0.56 tr
+  r5 <- tRand 0.3 0.6 tr
+  r6 <- tRand 0.3 0.5 tr
+  let o1 = fSinOsc KR r2 0 * r3 + r4
+      o2 = fSinOsc KR o1 r5 * r6
+  return (rhpf n r1 o2)
+
+red_frik :: UId m => m UGen
+red_frik = do
+  n <- clone 2 (brownNoise AR)
+  let tr = impulse KR 0.1 0
+  red tr n
+
+main :: IO ()
+main = audition . out 0 =<< red_frik
diff --git a/gr/red-frik.hs b/gr/red-frik.hs
deleted file mode 100644
--- a/gr/red-frik.hs
+++ /dev/null
@@ -1,25 +0,0 @@
--- red_frik (f0)
-
-import Sound.SC3.Monad {- hsc3 -}
-
-red :: UId m => UGen -> UGen -> m UGen
-red tr n = do
-  r1 <- tRand 0.3 3 tr
-  r2 <- tRand 0.3 5 tr
-  r3 <- tRand 0 0.5 tr
-  r4 <- tRand 0.49 0.56 tr
-  r5 <- tRand 0.3 0.6 tr
-  r6 <- tRand 0.3 0.5 tr
-  let o1 = fSinOsc KR r2 0 * r3 + r4
-      o2 = fSinOsc KR o1 r5 * r6
-  return (rhpf n r1 o2)
-
--- > Sound.SC3.UGen.Dot.draw =<< red_frik
-red_frik :: UId m => m UGen
-red_frik = do
-  n <- clone 2 (brownNoise AR)
-  let tr = impulse KR 0.1 0
-  red tr n
-
-main :: IO ()
-main = audition . out 0 =<< red_frik
diff --git a/gr/resonant-dust-hp.hs b/gr/resonant-dust-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/resonant-dust-hp.hs
@@ -0,0 +1,15 @@
+-- resonant dust (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+resonant_dust :: UId m => m UGen
+resonant_dust = do
+  st <- rand 80 2080
+  let en = st + (st * #(rand (-0.5) 0.5))
+      rf = xLine KR st en 9 DoNothing
+  return (pan2 (resonz (#(dust AR #(rand 50 850)) * 0.3) rf 0.1) #(rand (-1) 1) 1)
+
+main :: IO ()
+main = overlapTextureU (5,2,9,maxBound) =<< resonant_dust
diff --git a/gr/resonant-dust.hs b/gr/resonant-dust.hs
--- a/gr/resonant-dust.hs
+++ b/gr/resonant-dust.hs
@@ -6,10 +6,10 @@
 resonant_dust :: UGen
 resonant_dust =
     let rf = let st = rand 'α' 80 2080
-                 en = st + (rand 'α' (-0.5) 0.5 * st)
+                 en = st + (rand 'β' (-0.5) 0.5 * st)
              in xLine KR st en 9 DoNothing
-        d = dust 'α' AR (rand 'α' 50 850) * 0.3
-    in pan2 (resonz d rf 0.1) (rand 'α' (-1) 1) 1
+        d = dust 'γ' AR (rand 'δ' 50 850) * 0.3
+    in pan2 (resonz d rf 0.1) (rand 'ε' (-1) 1) 1
 
 main :: IO ()
 main = overlapTextureU (5,2,9,maxBound) resonant_dust
diff --git a/gr/reverberated-sine-percussion-hp.hs b/gr/reverberated-sine-percussion-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/reverberated-sine-percussion-hp.hs
@@ -0,0 +1,20 @@
+-- reverberated sine percussion (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+
+reverberated_sine_percussion :: (Functor m,UId m) => m UGen
+reverberated_sine_percussion = do
+  let d = 6
+      c = 5
+      a = 4
+      s_ = do return (resonz (#(dust AR (2 / constant d)) * 50) (200 + #(rand 0 3000)) 0.003)
+      x_ i = do return (allpassN i 0.05 #(clone 2 (rand 0 0.05)) 1)
+  s <- fmap sum (sequence (replicate d s_))
+  y <- do let z = delayN s 0.048 0.48
+          return (mix (combL z 0.1 (#(lfNoise1 KR #(clone c (rand 0 0.1))) * 0.04 + 0.05) 15))
+  x <- chainM a x_ y
+  return (s + x * 0.2)
+
+main :: IO ()
+main = audition . out 0 =<< reverberated_sine_percussion
diff --git a/gr/reverberated-sine-percussion-m.hs b/gr/reverberated-sine-percussion-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/reverberated-sine-percussion-m.hs
@@ -0,0 +1,24 @@
+-- reverberated sine percussion (jmcc)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+reverberated_sine_percussion :: (Functor m,UId m) => m UGen
+reverberated_sine_percussion = do
+  let d = 6
+      c = 5
+      a = 4
+      s_ = do n <- dust AR (2 / constant d)
+              r <- rand 0 3000
+              return (resonz (n * 50) (200 + r) 0.003)
+      x_ i = do r <- clone 2 (rand 0 0.05)
+                return (allpassN i 0.05 r 1)
+  s <- fmap sum (sequence (replicate d s_))
+  y <- do let z = delayN s 0.048 0.48
+          r <- clone c (rand 0 0.1)
+          n <- lfNoise1 KR r
+          return (mix (combL z 0.1 (n * 0.04 + 0.05) 15))
+  x <- chainM a x_ y
+  return (s + x * 0.2)
+
+main :: IO ()
+main = audition . out 0 =<< reverberated_sine_percussion
diff --git a/gr/reverberated-sine-percussion.hs b/gr/reverberated-sine-percussion.hs
deleted file mode 100644
--- a/gr/reverberated-sine-percussion.hs
+++ /dev/null
@@ -1,27 +0,0 @@
--- reverberated sine percussion (jmcc)
-
-import Sound.SC3.Monad {- hsc3 -}
-
--- > Sound.SC3.UGen.Dot.draw =<< reverberated_sine_percussion
-reverberated_sine_percussion :: (Functor m,UId m) => m UGen
-reverberated_sine_percussion = do
-  let d = 6
-      c = 5
-      a = 4
-      s_ = do n <- dust AR (2 / constant d)
-              r <- rand 0 3000
-              return (resonz (n * 50) (200 + r) 0.003)
-      x_ i = do r <- clone 2 (rand 0 0.05)
-                return (allpassN i 0.05 r 1)
-      (>=>) f g x = f x >>= g
-      chain n f = foldl (>=>) return (replicate n f)
-  s <- fmap sum (sequence (replicate d s_))
-  y <- do let z = delayN s 0.048 0.48
-          r <- clone c (rand 0 0.1)
-          n <- lfNoise1 KR r
-          return (mix (combL z 0.1 (n * 0.04 + 0.05) 15))
-  x <- chain a x_ y
-  return (s + x * 0.2)
-
-main :: IO ()
-main = audition . out 0 =<< reverberated_sine_percussion
diff --git a/gr/ring-modulated-klank.hs b/gr/ring-modulated-klank.hs
--- a/gr/ring-modulated-klank.hs
+++ b/gr/ring-modulated-klank.hs
@@ -1,7 +1,7 @@
 -- ring modulated klank (jmcc)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 rmk :: UGen
diff --git a/gr/rm-octaver.hs b/gr/rm-octaver.hs
--- a/gr/rm-octaver.hs
+++ b/gr/rm-octaver.hs
@@ -1,4 +1,4 @@
--- rm-octaver (andrea valle, miller puckette)
+-- rm-octaver (av), courtesy miller puckette
 
 import Sound.SC3 {- hsc3 -}
 
diff --git a/gr/rzblp-hp.hs b/gr/rzblp-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/rzblp-hp.hs
@@ -0,0 +1,31 @@
+-- rzblp-hp (rd)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+
+lfn :: UId m => UGen -> UGen -> UGen -> m UGen
+lfn f l r = fmap (range l r) (lfNoise0 KR f)
+
+hpb :: UId m => UGen -> m UGen
+hpb q =
+    let g :: UId m => Int -> m UGen
+        g _ = do blip AR #(lfn q 1330 1395) 24 *. lfn q 0.001 0.007
+    in mixFillM 2 g
+
+mk_f :: UId m => (UGen -> UGen -> m UGen) -> m UGen
+mk_f d = do
+  q <- lfn 5.2 5.2 5.21
+  a <- d dinf (mce [1,3,2,7,8])
+  let freq = demand (impulse KR q 0) 0 a * 30 + 340
+  s1 <- blip AR freq 3 *. lfn q 0.001 0.01
+  s2 <- resonz (impulse AR q (mce2 0 0)) #(lfn 5 30 640) #(lfn q 0.1 0.5)
+        *. lfn q 0.01 1.8
+  s3 <- hpb q .*. lfn q 1.2 1.8
+  let s4 = blip AR #(lfn q 16 36) 3 * mce2 0.03 0.09
+  return (sum [s1,s2,s3,s4])
+
+rzblp :: UId m => m UGen
+rzblp = mk_f drand .+. mk_f dxrand
+
+main :: IO ()
+main = audition . out 0 =<< rzblp
diff --git a/gr/rzblp-m.hs b/gr/rzblp-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/rzblp-m.hs
@@ -0,0 +1,34 @@
+-- rzblp-m (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+lfn :: UId m => UGen -> UGen -> UGen -> m UGen
+lfn f l r = fmap (range l r) (lfNoise0 KR f)
+
+hpb :: UId m => UGen -> m UGen
+hpb q =
+    let g :: UId m => Int -> m UGen
+        g _ = do f <- lfn q 1330 1395
+                 a <- lfn q 0.001 0.007
+                 return (blip AR f 24 * a)
+    in mixFillM 2 g
+
+mk_f :: UId m => (UGen -> UGen -> m UGen) -> m UGen
+mk_f d = do
+  q <- lfn 5.2 5.2 5.21
+  a <- d dinf (mce [1,3,2,7,8])
+  let freq = demand (impulse KR q 0) 0 a * 30 + 340
+  s1 <- blip AR freq 3 *. lfn q 0.001 0.01
+  s2 <- do f <- lfn 5 30 640
+           bw <- lfn q 0.1 0.5
+           resonz (impulse AR q (mce2 0 0)) f bw *. lfn q 0.01 1.8
+  s3 <- hpb q .*. lfn q 1.2 1.8
+  s4 <- do f <- lfn q 16 36
+           return (blip AR f 3 * mce2 0.03 0.09)
+  return (sum [s1,s2,s3,s4])
+
+rzblp :: UId m => m UGen
+rzblp = mk_f drand .+. mk_f dxrand
+
+main :: IO ()
+main = audition . out 0 =<< rzblp
diff --git a/gr/rzblp-u.hs b/gr/rzblp-u.hs
--- a/gr/rzblp-u.hs
+++ b/gr/rzblp-u.hs
@@ -3,25 +3,33 @@
 import Sound.SC3 {- hsc3 -}
 import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
 
+lfn :: UGen -> UGen -> UGen -> UGen
+lfn f l r = range l r (lfNoise0 KR f)
+
+hpb :: UGen -> UGen
+hpb q =
+    let g :: Int -> UGen
+        g _ = let f = lfn q 1330 1395
+                  a = lfn q 0.001 0.007
+              in blip AR f 24 * a
+    in mixFill 2 g
+
+mk_f :: (UGen -> UGen -> UGen) -> UGen
+mk_f d =
+    let q = lfn 5.2 5.2 5.21
+        a = d dinf (mce [1,3,2,7,8])
+        tr = impulse KR q 0
+        freq = demand tr 0 a * 30 + 340
+    in sum [blip AR freq 3 * lfn q 0.001 0.01
+           ,resonz (impulse AR q (mce2 0 0))
+                   (lfn 5 30 640)
+                   (lfn q 0.1 0.5)
+                   * lfn q 0.01 1.8
+           ,hpb q * lfn q 1.2 1.8
+           ,blip AR (lfn q 16 36) 3 * mce2 0.03 0.09]
+
 rzblp :: UGen
-rzblp =
-  let wrp i l r = let m = (r - l) / 2
-                  in i * m + l + m
-      lfn f = wrp (lfNoise0 KR f)
-      hpb q = mixFill 2 (\_ -> let f = lfn q 1330 1395
-                                   a = lfn q 0.001 0.007
-                               in blip AR f 24 * a)
-      mk_f d = let q = lfn 5.2 5.2 5.21
-                   a = d dinf (mce [1,3,2,7,8])
-                   tr = impulse KR q 0
-                   freq = demand tr 0 a * 30 + 340
-               in sum [blip AR freq 3 * lfn q 0.001 0.01
-                      ,resonz (impulse AR q (mce2 0 0))
-                                  (lfn 5 30 640)
-                                  (lfn q 0.1 0.5) * lfn q 0.01 1.8
-                      ,hpb q * lfn q 1.2 1.8
-                      ,blip AR (lfn q 16 36) 3 * mce2 0.03 0.09]
-  in mk_f drand + mk_f dxrand
+rzblp = mk_f drand + mk_f dxrand
 
 main :: IO ()
 main = audition (out 0 rzblp)
diff --git a/gr/rzblp.hs b/gr/rzblp.hs
--- a/gr/rzblp.hs
+++ b/gr/rzblp.hs
@@ -2,15 +2,10 @@
 
 import Sound.SC3.ID {- hsc3 -}
 
-wrp :: Fractional a => a -> a -> a -> a
-wrp i l r =
-    let m = (r - l) / 2
-    in i * m + l + m
-
 lfn :: ID a => a -> UGen -> UGen -> UGen -> UGen
 lfn z f l r =
     let z' = z `joinID` l `joinID` r
-    in wrp (lfNoise0 z' KR f) l r
+    in range l r (lfNoise0 z' KR f)
 
 hpb :: (ID a) => a -> UGen -> UGen
 hpb z q =
@@ -35,7 +30,7 @@
            ,blip AR (lfn z q 16 36) 3 * mce2 0.03 0.09]
 
 rzblp :: UGen
-rzblp = mk_f 'a' drand + mk_f 'b' dxrand
+rzblp = mk_f 'α' drand + mk_f 'β' dxrand
 
 main :: IO ()
 main = audition (out 0 rzblp)
diff --git a/gr/s-chirp.hs b/gr/s-chirp.hs
--- a/gr/s-chirp.hs
+++ b/gr/s-chirp.hs
@@ -7,17 +7,17 @@
 s_chirp =
   let x = mouseX KR 15 0 Linear 0.1
       y = mouseY KR 15 27 Linear 0.1
-      t = dust 'a' KR 9
-      b = tChoose 'a' t (mce [36,48,60,72])
-      n = lfNoise1 'a' KR (mce2 3 3.05) * 0.04
-      d = tIRand 'a' x y t
-      e = decay2 t 0.005 (tRand 'a' 0.02 0.15 t)
+      t = dust 'α' KR 9
+      b = tChoose 'β' t (mce [36,48,60,72])
+      n = lfNoise1 'γ' KR (mce2 3 3.05) * 0.04
+      d = tIRand 'δ' x y t
+      e = decay2 t 0.005 (tRand 'ε' 0.02 0.15 t)
       o = let k = degreeToKey 0 d 12
               f = midiCPS (b + k + n)
               m = e * sinOsc AR f 0 * 0.2
               u = pulseDivider t 9 0
-              r0 = tRand 'a' 0.0075 0.125 u
-              r1 = tRand 'a' 0.05 0.15 u
+              r0 = tRand 'ζ' 0.0075 0.125 u
+              r1 = tRand 'η' 0.05 0.15 u
           in m * 0.5 + allpassC m 0.15 r0 r1
   in out 0 o
 
diff --git a/gr/sam-i-am.hs b/gr/sam-i-am.hs
--- a/gr/sam-i-am.hs
+++ b/gr/sam-i-am.hs
@@ -2,11 +2,10 @@
 
 import Control.Monad.Random {- MonadRandom -}
 import Data.List {- base -}
-import Data.Maybe
+import Data.Maybe {- base -}
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Random.Monad
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Random.Monad {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 text :: [String]
 text =
@@ -34,19 +33,22 @@
         o = sinOsc AR f1 0 * pulse AR f2 0.5 * saw AR f3 * e
     in synthdef "sam" (out 0 o)
 
-b :: RandomGen g => g -> [(String,[(String,Double)])]
+b :: (RandomGen g,Floating n,Random n) => g -> [(String,[(Key,n)])]
 b g =
     let mk w = do
           f1 <- exprand 200 9000
           f2 <- exprand 20 9000
           f3 <- exprand 20 9000
           let d = 0.1 * fromIntegral (length w)
-          return (w,[("freq1",f1),("freq2",f2),("freq3",f3),("dur",d)])
+          return (w,[(K_param "freq1",f1)
+                    ,(K_param "freq2",f2)
+                    ,(K_param "freq3",f3)
+                    ,(K_dur,d)])
     in evalRand (mapM mk a) g
 
 main :: IO ()
 main = do
   g <- getStdGen
   let t = b g
-      ae = mapMaybe (\w -> fmap event (lookup w t)) (concat x)
-  audition (sam,pseq (map return ae) 1)
+      ae = mapMaybe (\w -> fmap e_from_list (lookup w t)) (concat x)
+  audition (p_with (K_instr,psynth sam) (pseq (map return ae) 1))
diff --git a/gr/saucer-base.hs b/gr/saucer-base.hs
--- a/gr/saucer-base.hs
+++ b/gr/saucer-base.hs
@@ -6,9 +6,9 @@
 saucer_base :: UGen
 saucer_base =
     let a = rand 'α' 0 20
-        b = rand 'α' 0 1000
-        c = rand 'α' 0 5000
-        p = rand 'α' (-1) 1
+        b = rand 'β' 0 1000
+        c = rand 'γ' 0 5000
+        p = rand 'δ' (-1) 1
         o = sinOsc AR a 0 * b + (1.1 * b)
         o' = sinOsc AR o 0 * c + (1.1 * c)
     in pan2 (sinOsc AR o' 0 * 0.1) p 1
diff --git a/gr/scritto.hs b/gr/scritto.hs
--- a/gr/scritto.hs
+++ b/gr/scritto.hs
@@ -9,7 +9,7 @@
 scritto_i bx =
     let buf_at b n = bufRd 1 KR b (mce [n .. n + 4]) NoLoop NoInterpolation
         v_filter i f a b = resonz i f (b / f) * dbAmp a
-        n0 = lfNoise2 'a' KR 3
+        n0 = lfNoise2 'α' KR 3
         v_filter_b i =
             let bi = linLin n0 (-1) 1 0 bx
                 b = buf_at bi in v_filter i (b 0) (b 5) (b 10)
diff --git a/gr/seqr.hs b/gr/seqr.hs
--- a/gr/seqr.hs
+++ b/gr/seqr.hs
@@ -1,7 +1,7 @@
 -- seqr (rd)
 
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
 nrand :: ID z => Int -> z -> UGen -> UGen -> [UGen]
 nrand n e l = mceChannels . randN n e l
@@ -17,13 +17,13 @@
 -- > Sound.SC3.UGen.Dot.draw (seqr 12)
 seqr :: Int -> UGen
 seqr n =
-  let f = rand 'a' 9 18 / constant n
-      b = blip AR (mce2 (seqr_f f (nfreq 'a' n 72 96))
-                        (seqr_f f (nfreq 'b' n 72 84)))
-                  (mce2 (seqr_f f (nrand n 'c' 1 3))
-                        (seqr_f f (nrand n 'd' 3 6)))
-      a = mce2 (seqr_f f (nrand n 'e' 0.05 0.10))
-               (seqr_f f (nrand n 'f' 0.05 0.15))
+  let f = rand 'α' 9 18 / constant n
+      b = blip AR (mce2 (seqr_f f (nfreq 'β' n 72 96))
+                        (seqr_f f (nfreq 'γ' n 72 84)))
+                  (mce2 (seqr_f f (nrand n 'δ' 1 3))
+                        (seqr_f f (nrand n 'ε' 3 6)))
+      a = mce2 (seqr_f f (nrand n 'ζ' 0.05 0.10))
+               (seqr_f f (nrand n 'η' 0.05 0.15))
   in b * a
 
 -- n = rand 6 18
diff --git a/gr/shifting-pulses-m.hs b/gr/shifting-pulses-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/shifting-pulses-m.hs
@@ -0,0 +1,52 @@
+-- shifting pulses (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+wrp :: UGen -> UGen -> UGen -> UGen
+wrp i l r = linLin i (-1) 1 l r
+
+prt :: UId m => UGen -> UGen -> m UGen
+prt a f = do
+  r0 <- rand 0.2 0.9
+  r1 <- rand 0.95 1.05
+  r2 <- clone 2 (rand 0.95 1.05)
+  let f' = f * wrp (sinOsc KR r0 0) 1 1.01 * r1
+      a' = a * r2
+      o = sinOsc AR (mce2 f f') 0
+  return (o * a')
+
+-- audition . out 0 =<< prts 2 900 0.002
+-- audition . out 0 =<< prts 9 40 0.006
+prts :: UId m => UGen -> UGen -> UGen -> m UGen
+prts n f a = fmap sum (mapM (prt a) [f,f + f .. f * n])
+
+-- audition . out 0 =<< fmt
+fmt :: UId m => m UGen
+fmt = do
+  n <- (lfNoise2 KR 2)
+  return  (formant AR (mce2 20 21) (wrp n 10 100) 200 * 0.35)
+
+-- audition . out 0 =<< pulses
+pulses :: UId m => m UGen
+pulses = do
+  n0 <- clone 2 (brownNoise KR)
+  n1 <- clone 2 (brownNoise KR)
+  n2 <- clone 2 (brownNoise KR)
+  t <- dust KR 0.75
+  let warp i = linLin i (-1) 1
+      l = latch t t
+      p = pulse AR (warp n0 2 (mce2 11 15)) 0.01 * 0.1
+      f = warp n1 300 1800
+      rq = warp n2 0.01 2
+  return (mrg2 (l * rlpf p f rq) (sendTrig t 0 t))
+
+shifting_pulses :: UId m => m UGen
+shifting_pulses = do
+  p1 <- prts 2 900 0.008
+  p2 <- prts 9 40 0.022
+  f <- fmt
+  s <- pulses
+  return (p1 + p2 + f + s)
+
+main :: IO ()
+main = audition . out 0 =<< shifting_pulses
diff --git a/gr/shifting-pulses.hs b/gr/shifting-pulses.hs
deleted file mode 100644
--- a/gr/shifting-pulses.hs
+++ /dev/null
@@ -1,20 +0,0 @@
--- shifting pulses (rd)
-
-import Sound.SC3.Monad {- hsc3 -}
-
--- > Sound.SC3.UGen.Dot.draw =<< shifting_pulses
-shifting_pulses :: UId m => m UGen
-shifting_pulses = do
-  n0 <- clone 2 (brownNoise KR)
-  n1 <- clone 2 (brownNoise KR)
-  n2 <- clone 2 (brownNoise KR)
-  t <- dust KR 0.75
-  let warp i = linLin i (-1) 1
-      l = latch t t
-      p = pulse AR (warp n0 2 (mce2 11 15)) 0.01 * 0.1
-      f = warp n1 300 1800
-      rq = warp n2 0.01 2
-  return (l * rlpf p f rq)
-
-main :: IO ()
-main = audition . out 0 =<< shifting_pulses
diff --git a/gr/sidereal-time-hp.hs b/gr/sidereal-time-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/sidereal-time-hp.hs
@@ -0,0 +1,28 @@
+-- sidereal time (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Control.Monad {- base -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+sidereal_time :: UId m => m UGen
+sidereal_time = do
+  let p = 15
+  z <- let y = do
+             fr <- replicateM p (expRand 100 6000)
+             rt <- replicateM p (rand 2 6)
+             return (klankSpec fr (replicate p 1) rt)
+       in clone 2 y
+  let f = xLine KR #(expRand 40 300) #(expRand 40 300) 12 DoNothing
+  let t = lfPulse AR f 0 #(rand 0.1 0.9)
+          * max 0 #(lfNoise2 KR #(rand 0 8))
+          * 0.002
+      o = distort (klank t 1 0 1 (mceTranspose z)) * 0.1
+  return (combN o 0.6 #(rand 0.1 0.6) 8 + mceReverse o)
+
+main :: IO ()
+main = overlapTextureU (4,4,6,maxBound) =<< sidereal_time
+
+{-
+audition (out 0 sidereal_time)
+-}
diff --git a/gr/sidereal-time.hs b/gr/sidereal-time.hs
--- a/gr/sidereal-time.hs
+++ b/gr/sidereal-time.hs
@@ -7,15 +7,15 @@
 sidereal_time :: UGen
 sidereal_time =
   let p = 15
-      z = let y = let fr = uclone' 'α' p (expRand 'α' 100 6000)
-                      rt = uclone' 'α' p (rand 'α' 2 6)
+      z = let y = let fr = uclone' 'α' p (expRand 'β' 100 6000)
+                      rt = uclone' 'γ' p (rand 'δ' 2 6)
                   in klankSpec fr (replicate p 1) rt
-          in uclone 'α' 2 y
-      f = xLine KR (expRand 'α' 40 300) (expRand 'β' 40 300) 12 DoNothing
-      t = let e = lfNoise2 'γ' KR (rand 'δ' 0 8)
-          in lfPulse AR f 0 (rand 'ε' 0.1 0.9) * 0.002 * max 0 e
+          in uclone 'ε' 2 y
+      f = xLine KR (expRand 'ζ' 40 300) (expRand 'η' 40 300) 12 DoNothing
+      t = let e = lfNoise2 'θ' KR (rand 'ι' 0 8)
+          in lfPulse AR f 0 (rand 'κ' 0.1 0.9) * 0.002 * max 0 e
       o = distort (klank t 1 0 1 (mceTranspose z)) * 0.1
-  in combN o 0.6 (rand 'ζ' 0.1 0.6) 8 + mceReverse o
+  in combN o 0.6 (rand 'λ' 0.1 0.6) 8 + mceReverse o
 
 main :: IO ()
 main = overlapTextureU (4,4,6,maxBound) sidereal_time
diff --git a/gr/sinusdeklinationen.hs b/gr/sinusdeklinationen.hs
--- a/gr/sinusdeklinationen.hs
+++ b/gr/sinusdeklinationen.hs
@@ -2,8 +2,7 @@
 
 import Data.List.Split {- split -}
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
-import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 sinuscell :: UGen
 sinuscell =
@@ -20,20 +19,22 @@
         s = sinOsc AR fre 0
     in out b (pan2 s p e)
 
-pattern :: Enum e => (Double,[e]) -> P Event
+pattern :: Enum e => (Field,[e]) -> P_Bind
 pattern (c,z) =
     case z of
       [z0,z1,z2,z3] ->
           let a = pwhite z0 0 1 inf
               s = 0.2
               r = pwhite z1 0 1 inf
-          in pbind [("fre",pwhite z2 0 1100 inf)
-                   ,("atk",a)
-                   ,("sus",s)
-                   ,("rel",r)
-                   ,("dur",a+s+r)
-                   ,("amp",pwhite z3 0 1 inf)
-                   ,("pan",prepeat c)]
+              i = psynth (synthdef "sinuscell" sinuscell)
+          in [(K_instr,i)
+             ,(K_dur,a+s+r)
+             ,(K_amp,pwhite z3 0 1 inf)
+             ,(K_param "fre",pwhite z2 0 1100 inf)
+             ,(K_param "atk",a)
+             ,(K_param "sus",s)
+             ,(K_param "rel",r)
+             ,(K_param "pan",prepeat c)]
       _ -> undefined
 
 cells :: Fractional n => [n]
@@ -41,6 +42,5 @@
 
 main :: IO ()
 main =
-    let s = synthdef "sinuscell" sinuscell
-        c = zip cells (chunksOf 4 ['a'..])
-    in audition (s,ppar (map pattern c))
+    let c = zip cells (chunksOf 4 ['α'..])
+    in audition (ppar (map (pbind . pattern) c))
diff --git a/gr/snare-909.hs b/gr/snare-909.hs
--- a/gr/snare-909.hs
+++ b/gr/snare-909.hs
@@ -4,8 +4,8 @@
 
 snare_909 :: UGen -> UGen
 snare_909 tr =
-  let n = whiteNoise 'a' AR
-      v = tRand 'a' 0.25 1.0 tr
+  let n = whiteNoise 'α' AR
+      v = tRand 'β' 0.25 1.0 tr
       e a b = envGen AR tr 1 0 1 DoNothing (envPerc a b)
       e1 = e 0.0005 0.055
       e2 = e 0.0005 0.075
diff --git a/gr/sosc-lp-m.hs b/gr/sosc-lp-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/sosc-lp-m.hs
@@ -0,0 +1,49 @@
+-- sosc-lp (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+dustR :: UId m => Rate -> UGen -> UGen -> m UGen
+dustR r lo hi = do
+  n1 <- dwhite 1 lo hi
+  n2 <- whiteNoise r
+  d <- dseq dinf n1
+  return (tDuty r d 0 DoNothing (abs n2) 1)
+
+setup :: Transport m => m ()
+setup = do
+  let a = [60, 71, 89, 65, 36, 57, 92, 97, 92, 97]
+      b = [71, 89, 60, 57, 65, 36, 95, 92, 93, 97]
+  _ <- async (b_alloc 10 9 1)
+  _ <- async (b_alloc 11 9 1)
+  send (b_setn1 10 0 a)
+  send (b_setn1 11 0 b)
+
+sosc_lp :: UGen -> UGen -> UGen
+sosc_lp t n =
+    let d_env = decay2 t 0.002 2.5
+        idx = stepper t 0 0 15 1 0
+        f1 = let l = (bufRdL 1 KR 10 idx Loop - 24)
+                 r = (bufRdL 1 KR 11 idx Loop - 24)
+             in midiCPS (mce2 l r)
+        f2 = f1 + n * 1.2
+        o1 = sinOsc AR f1 0 * d_env
+        o2 = sinOsc AR f2 0 * d_env
+    in (o1 + o2) * 0.2
+
+sosc_lp_m :: UId m => m UGen
+sosc_lp_m = do
+  clk <- dustR KR 0.2 0.9
+  n <- lfNoise0 KR (mce2 1 3)
+  return (sosc_lp clk n)
+
+main :: IO ()
+main = withSC3 (setup >> sosc_lp_m >>= play . out 0)
+
+-- > withSC3 resetter
+resetter :: Transport m => m ()
+resetter = do
+  let a = [71, 60, 65, 89, 36, 57, 95, 97, 92, 97]
+      b = [89, 71, 60, 65, 57, 36, 92, 95, 93, 97]
+  send (b_setn1 10 0 a)
+  send (b_setn1 11 0 b)
diff --git a/gr/sosc-lp.hs b/gr/sosc-lp.hs
deleted file mode 100644
--- a/gr/sosc-lp.hs
+++ /dev/null
@@ -1,50 +0,0 @@
--- sosc-lp (rd)
-
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
-
-dustR :: UId m => Rate -> UGen -> UGen -> m UGen
-dustR r lo hi = do
-  n1 <- dwhite 1 lo hi
-  n2 <- whiteNoise r
-  d <- dseq dinf n1
-  return (tDuty r d 0 DoNothing (abs n2) 1)
-
-setup :: Transport m => m ()
-setup = do
-  let a = [60, 71, 89, 65, 36, 57, 92, 97, 92, 97]
-      b = [71, 89, 60, 57, 65, 36, 95, 92, 93, 97]
-  _ <- async (b_alloc 10 9 1)
-  _ <- async (b_alloc 11 9 1)
-  send (b_setn1 10 0 a)
-  send (b_setn1 11 0 b)
-
-sosc_lp :: UGen -> UGen -> UGen
-sosc_lp t n =
-    let d_env = decay2 t 0.002 2.5
-        idx = stepper t 0 0 15 1 0
-        f1 = let l = (bufRdL 1 KR 10 idx Loop - 24)
-                 r = (bufRdL 1 KR 11 idx Loop - 24)
-             in midiCPS (mce2 l r)
-        f2 = f1 + n * 1.2
-        o1 = sinOsc AR f1 0 * d_env
-        o2 = sinOsc AR f2 0 * d_env
-    in (o1 + o2) * 0.2
-
--- > Sound.SC3.UGen.Dot.draw =<< sosc_lp_m
-sosc_lp_m :: UId m => m UGen
-sosc_lp_m = do
-  clk <- dustR KR 0.2 0.9
-  n <- lfNoise0 KR (mce2 1 3)
-  return (sosc_lp clk n)
-
-main :: IO ()
-main = withSC3 (setup >> sosc_lp_m >>= play . out 0)
-
--- > withSC3 resetter
-resetter :: Transport m => m ()
-resetter = do
-  let a = [71, 60, 65, 89, 36, 57, 95, 97, 92, 97]
-      b = [89, 71, 60, 65, 57, 36, 92, 95, 93, 97]
-  send (b_setn1 10 0 a)
-  send (b_setn1 11 0 b)
diff --git a/gr/spe-m.hs b/gr/spe-m.hs
--- a/gr/spe-m.hs
+++ b/gr/spe-m.hs
@@ -3,12 +3,9 @@
 
 import Sound.SC3.Monad {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw =<< spe
 spe :: UId m => m UGen
 spe = do
-  let (>=>) f g x = f x >>= g
-      chain n f = foldl (>=>) return (replicate n f)
-      rapf i = do r <- clone 2 (rand 0 0.05)
+  let rapf i = do r <- clone 2 (rand 0 0.05)
                   return (allpassN i 0.05 r 4)
       src = do let t = impulse KR 9 0
                    e = envGen KR t 0.1 0 1 DoNothing (envPerc 0.1 1)
@@ -21,7 +18,7 @@
                    o = lfSaw AR f 0 * e
                    rq = midiCPS (n * 36 + 110)
                return (rlpf o rq 0.1)
-  chain 4 rapf =<< src
+  chainM 4 rapf =<< src
 
 main :: IO ()
 main = audition . out 0 =<< spe
diff --git a/gr/spe-p.hs b/gr/spe-p.hs
--- a/gr/spe-p.hs
+++ b/gr/spe-p.hs
@@ -1,30 +1,28 @@
 -- spe-p (jmcc)
 
 import Sound.SC3.Monad {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 spe3_allpass6 :: UId m => m Synthdef
 spe3_allpass6 = do
   n <- lfNoise1 KR 1
-  let freq = control KR "freq" 440
-      (>=>) f g x = f x >>= g
-      chain i f = foldl (>=>) return (replicate i f)
+  let fr = control KR "freq" 440
       rapf i = do r <- clone 2 (rand 0 0.05)
                   return (allpassN i 0.05 r 4)
       e = envGen KR 1 0.1 0 1 RemoveSynth (envPerc 0.1 1)
       rq = midiCPS (n * 36 + 110)
-      o = rlpf (lfSaw AR freq 0 * e) rq 0.1
-  u <- fmap (out 0) (chain 4 rapf o)
+      o = rlpf (lfSaw AR fr 0 * e) rq 0.1
+  u <- fmap (out 0) (chainM 4 rapf o)
   return (synthdef "spe" u)
 
-notes :: P Double
+notes :: Num n => P n
 notes =
-    let n = [prand' 'a' [pempty,fromList [24,31,36,43,48,55]] inf
-            ,pflop [60,prand 'b' [63,65] inf,67,prand 'c' [70,72,74] inf]
-            ,psplitPlaces (pwhite 'd' 3 9 inf) (fromList [74,75,77,79,81])]
+    let n = [prand' 'α' [pempty,toP [24,31,36,43,48,55]] inf
+            ,pflop [60,prand 'β' [63,65] inf,67,prand 'γ' [70,72,74] inf]
+            ,psplitPlaces (pwhite 'δ' 3 9 inf) (toP [74,75,77,79,81])]
     in pjoin (pseq1 n inf)
 
 main :: IO ()
 main = do
   i <- spe3_allpass6
-  audition (i,pbind [("midinote",notes),("dur",0.13)])
+  audition (pbind [(K_instr,psynth i),(K_midinote,notes),(K_dur,0.13)])
diff --git a/gr/synthetic-piano-m.hs b/gr/synthetic-piano-m.hs
--- a/gr/synthetic-piano-m.hs
+++ b/gr/synthetic-piano-m.hs
@@ -3,7 +3,6 @@
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 import Sound.SC3.Monad {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw =<< synthetic_piano
 synthetic_piano :: UId m => m UGen
 synthetic_piano = do
   n <- iRand 36 90
diff --git a/gr/tank-hp.hs b/gr/tank-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/tank-hp.hs
@@ -0,0 +1,36 @@
+-- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+
+pling :: UId m => m UGen
+pling = do
+  let s = decay2 #(dust AR 0.2) 0.1 0.5
+          * cubed (fSinOsc AR #(expRand 300 2200) 0)
+          * 0.1
+  return (pan2 s #(rand (-1) 1) 1)
+
+bang :: UId m => m UGen
+bang = do return (pan2 (decay2 #(dust AR 0.01) 0.04 0.3 * #(brownNoise AR)) 0 1)
+
+r_allpass :: UId m => UGen -> m UGen
+r_allpass i = do return (allpassN i 0.03 #(clone 2 (rand 0.005 0.02)) 1)
+
+tank_f :: UId m => UGen -> m UGen
+tank_f i = do
+  let [l,r] = mceChannels (onePole (localIn 2 AR * 0.98) 0.33)
+  let a = allpassN (rotate2 l r 0.23) 0.05 #(clone 2 (rand 0.01 0.05)) 2
+      b = delayN a 0.3 (mce [0.17,0.23])
+  let c = leakDC (allpassN b 0.05 #(clone 2 (rand 0.03 0.15)) 2) 0.995 + i
+  return (mrg [c,localOut c])
+
+tank :: UId m => m UGen
+tank = do
+  s <- bang .+. mixFillM 8 (const pling :: UId m => Int -> m UGen)
+  s' <- chainM 4 r_allpass s
+  tank_f s'
+
+main :: IO ()
+main = do
+  t <- tank
+  audition (out 0 t)
diff --git a/gr/tank-m.hs b/gr/tank-m.hs
--- a/gr/tank-m.hs
+++ b/gr/tank-m.hs
@@ -1,6 +1,6 @@
--- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html (jmcc)
+-- tank (jmcc)
+-- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html
 
-import Control.Monad {- base -}
 import Sound.SC3.Monad {- hsc3 -}
 
 pling :: UId m => m UGen
@@ -18,9 +18,6 @@
   n <- brownNoise AR
   return (pan2 (decay2 d 0.04 0.3 * n) 0 1)
 
-chain :: Monad m => Int -> (b -> m b) -> b -> m b
-chain n f = foldl (>=>) return (replicate n f)
-
 r_allpass :: UId m => UGen -> m UGen
 r_allpass i = do
   r <- clone 2 (rand 0.005 0.02)
@@ -41,14 +38,8 @@
       l7 = l6 + i
   return (mrg [l7,localOut l7])
 
--- > tank >>= Sound.SC3.UGen.Dot.draw
 tank :: UId m => m UGen
-tank = do
-  s <- liftM2 (+) bang (mixFillM 8 (const pling))
-  s' <- chain 4 r_allpass s
-  tank_f s'
+tank = tank_f =<< chainM 4 r_allpass =<< bang .+. mixFillM 8 (const pling)
 
 main :: IO ()
-main = do
-  t <- tank
-  audition (out 0 t)
+main = audition . out 0 =<< tank
diff --git a/gr/tank.hs b/gr/tank.hs
--- a/gr/tank.hs
+++ b/gr/tank.hs
@@ -1,8 +1,9 @@
--- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html (jmcc)
+-- tank (jmcc)
+-- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html
 
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
 pling :: ID a => a -> UGen
 pling e =
@@ -39,11 +40,10 @@
         l7 = l6 + i
     in mrg [l7,localOut l7]
 
--- > Sound.SC3.UGen.Dot.draw tank
 tank :: UGen
 tank =
-  let s = bang 'α' + mix (uclone 'β' 8 (pling 'β'))
-  in tank_f 'γ' (useq 'δ' 4 (r_allpass 'δ') s)
+  let s = bang 'α' + mix (uclone 'β' 8 (pling 'γ'))
+  in tank_f 'δ' (useq 'ε' 4 (r_allpass 'ζ') s)
 
 main :: IO ()
 main = audition (out 0 tank)
diff --git a/gr/tgb-m.hs b/gr/tgb-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/tgb-m.hs
@@ -0,0 +1,43 @@
+-- tgb (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+tgb :: UId m => UGen -> UGen -> m UGen
+tgb b d = do
+  let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
+      pm_t l r du t = let le = mkls l du
+                          re = mkls r du
+                      in tRand le re t
+      wrp i = linLin i (-1) 1
+      pm_n rt l du = do let le = mkls l du
+                            re = mkls l du
+                        n <- whiteNoise rt
+                        return (wrp n le re)
+  gps <- pm_n AR [(0,400),(1,900)] d
+  let t = impulse AR gps 0
+      pm_f (l,r) = pm_t l r d t
+  du <- pm_f ([(0,0.005),(0.5,0.015),(1,0.005)]
+             ,[(0,0.009),(0.5,0.020),(1,0.009)])
+  pn <- pm_f ([(0,-1.0),(0.5,-0.5),(1,0.5)]
+             ,[(0,-0.5),(0.5,0.5),(1,1.0)])
+  rt <- pm_f ([(0,6),(0.5,12),(1,6)]
+             ,[(0,12),(0.5,12),(1,12)])
+  cs <- pm_f ([(0,0),(1,0.95)]
+             ,[(0,0),(1,1)])
+  am <- pm_f ([(0,0.25),(0.5,0.55),(1,0.15)]
+             ,[(0,0.5),(0.5,0.75),(1,0.25)])
+  let cs' = cs * bufDur KR b
+  return (tGrains 2 t b rt cs' du pn am 2)
+
+tgb_10_12 :: UId m => m UGen
+tgb_10_12 = tgb 10 12
+
+act :: (UId m,Transport m) => m ()
+act = do
+  let fn = "/home/rohan/data/audio/pf-c5.aif"
+  _ <- async (b_allocRead 10 fn 0 0)
+  play . out 0 =<< tgb_10_12
+
+main :: IO ()
+main = withSC3 act
diff --git a/gr/tgb.hs b/gr/tgb.hs
deleted file mode 100644
--- a/gr/tgb.hs
+++ /dev/null
@@ -1,41 +0,0 @@
--- tgb (rd)
-
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
-
--- > Sound.SC3.UGen.Dot.draw =<< tgb 10 12
-tgb :: UId m => UGen -> UGen -> m UGen
-tgb b d = do
-  let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
-      pm_t l r du t = let le = mkls l du
-                          re = mkls r du
-                      in tRand le re t
-      wrp i = linLin i (-1) 1
-      pm_n rt l du = do let le = mkls l du
-                            re = mkls l du
-                        n <- whiteNoise rt
-                        return (wrp n le re)
-  gps <- pm_n AR [(0,400),(1,900)] d
-  let t = impulse AR gps 0
-      pm_f (l,r) = pm_t l r d t
-  du <- pm_f ([(0,0.005),(0.5,0.015),(1,0.005)]
-             ,[(0,0.009),(0.5,0.020),(1,0.009)])
-  pn <- pm_f ([(0,-1.0),(0.5,-0.5),(1,0.5)]
-             ,[(0,-0.5),(0.5,0.5),(1,1.0)])
-  rt <- pm_f ([(0,6),(0.5,12),(1,6)]
-             ,[(0,12),(0.5,12),(1,12)])
-  cs <- pm_f ([(0,0),(1,0.95)]
-             ,[(0,0),(1,1)])
-  am <- pm_f ([(0,0.25),(0.5,0.55),(1,0.15)]
-             ,[(0,0.5),(0.5,0.75),(1,0.25)])
-  let cs' = cs * bufDur KR b
-  return (tGrains 2 t b rt cs' du pn am 2)
-
-act :: (UId m,Transport m) => m ()
-act = do
-  let fn = "/home/rohan/data/audio/pf-c5.aif"
-  _ <- async (b_allocRead 10 fn 0 0)
-  play . out 0 =<< tgb 10 12
-
-main :: IO ()
-main = withSC3 act
diff --git a/gr/tgr-rpr-m.hs b/gr/tgr-rpr-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/tgr-rpr-m.hs
@@ -0,0 +1,62 @@
+-- tgr-rpr (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+
+dustR :: UId m => Rate -> UGen -> UGen -> m UGen
+dustR r lo hi = do
+  n1 <- dwhite 1 lo hi
+  n2 <- whiteNoise r
+  d <- dseq dinf n1
+  return (tDuty r d 0 DoNothing (abs n2) 1)
+
+rpr :: UId m => UGen -> UGen -> m UGen
+rpr n = tRand (in' 1 KR n) (in' 1 KR (n + 1))
+
+tgr_rpr :: (Functor m,UId m) => m UGen
+tgr_rpr = do
+  clk <- dustR AR (in' 1 KR 0) (in' 1 KR 1)
+  rat <- rpr 2 clk
+  dur <- rpr 4 clk
+  pos <- fmap (* bufDur KR 10) (rpr 8 clk)
+  pan <- rpr 10 clk
+  amp <- rpr 6 clk
+  return (tGrains 2 clk 10 rat pos dur pan amp 2)
+
+preset :: [Double]
+preset =
+    [0.01,0.02
+    ,0.95,1.05
+    ,0.02,0.06
+    ,0.6,0.7
+    ,0.7,0.9
+    ,-1.0,1.0]
+
+rSet :: [(Double, Double)]
+rSet =
+    [(0.005,0.025),(0.05,0.25)
+    ,(0.75,0.95),(1.05,1.25)
+    ,(0.001,0.01),(0.02,0.04)
+    ,(0.4,0.5),(0.7,0.8)
+    ,(0.0,0.45),(0.55,1.0)
+    ,(-1.0,0.0),(0.0,1.0)]
+
+edit :: Transport m => m ()
+edit = do
+  s <- mapM (uncurry rrand) rSet
+  send (c_setn [(0,s)])
+  wait 0.35
+
+run :: (UId m,Transport m) => m ()
+run = do
+  let sf = "/home/rohan/data/audio/pf-c5.snd"
+  _ <- async (b_allocRead 10 sf 0 0)
+  send (c_setn [(0,preset)])
+  play . out 0 =<< tgr_rpr
+  wait 0.3
+  _ <- sequence (replicate 64 edit)
+  reset
+
+main :: IO ()
+main = withSC3 run
diff --git a/gr/tgr-rpr.hs b/gr/tgr-rpr.hs
deleted file mode 100644
--- a/gr/tgr-rpr.hs
+++ /dev/null
@@ -1,63 +0,0 @@
--- tgr-rpr (rd)
-
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
-import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
-
-dustR :: UId m => Rate -> UGen -> UGen -> m UGen
-dustR r lo hi = do
-  n1 <- dwhite 1 lo hi
-  n2 <- whiteNoise r
-  d <- dseq dinf n1
-  return (tDuty r d 0 DoNothing (abs n2) 1)
-
-rpr :: UId m => UGen -> UGen -> m UGen
-rpr n = tRand (in' 1 KR n) (in' 1 KR (n + 1))
-
--- > Sound.SC3.UGen.Dot.draw =<< tgr_rpr
-tgr_rpr :: (Functor m,UId m) => m UGen
-tgr_rpr = do
-  clk <- dustR AR (in' 1 KR 0) (in' 1 KR 1)
-  rat <- rpr 2 clk
-  dur <- rpr 4 clk
-  pos <- fmap (* bufDur KR 10) (rpr 8 clk)
-  pan <- rpr 10 clk
-  amp <- rpr 6 clk
-  return (tGrains 2 clk 10 rat pos dur pan amp 2)
-
-preset :: [Double]
-preset =
-    [0.01,0.02
-    ,0.95,1.05
-    ,0.02,0.06
-    ,0.6,0.7
-    ,0.7,0.9
-    ,-1.0,1.0]
-
-rSet :: [(Double, Double)]
-rSet =
-    [(0.005,0.025),(0.05,0.25)
-    ,(0.75,0.95),(1.05,1.25)
-    ,(0.001,0.01),(0.02,0.04)
-    ,(0.4,0.5),(0.7,0.8)
-    ,(0.0,0.45),(0.55,1.0)
-    ,(-1.0,0.0),(0.0,1.0)]
-
-edit :: Transport m => m ()
-edit = do
-  s <- mapM (uncurry rrand) rSet
-  send (c_setn [(0,s)])
-  pauseThread 0.35
-
-run :: (UId m,Transport m) => m ()
-run = do
-  let sf = "/home/rohan/data/audio/pf-c5.snd"
-  _ <- async (b_allocRead 10 sf 0 0)
-  send (c_setn [(0,preset)])
-  play . out 0 =<< tgr_rpr
-  pauseThread 0.3
-  _ <- sequence (replicate 64 edit)
-  reset
-
-main :: IO ()
-main = withSC3 run
diff --git a/gr/thb.hs b/gr/thb.hs
--- a/gr/thb.hs
+++ b/gr/thb.hs
@@ -4,10 +4,8 @@
 import qualified Music.Theory.Contour.Polansky_1992 as T {- hmt -}
 import qualified Music.Theory.Pitch as T
 import Sound.SC3 {- hsc3 -}
-import qualified Sound.SC3.Lang.Control.Event as L {- hsc3-lang -}
-import qualified Sound.SC3.Lang.Control.Instrument as L
-import qualified Sound.SC3.Lang.Control.Pitch as L
-import qualified Sound.SC3.Lang.Pattern.ID as L
+import qualified Sound.SC3.Lang.Math as M
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 import Sound.OSC {- hosc -}
 
 -- | Happy birthday
@@ -46,18 +44,19 @@
 -- > withSC3 plain
 plain :: Transport m => m ()
 plain = do
-  _ <- async (d_recv L.defaultInstrument)
-  let p = L.toP . concat
-  play (L.pbind [("degree",p hb_d - 1)
-                ,("octave",p hb_o + 1)
-                ,("dur",p hb_t / 16)])
+  _ <- async (d_recv defaultSynthdef)
+  let p :: [[Double]] -> P Field
+      p = toP . map realToFrac . concat
+  play (pbind [(K_degree,p hb_d - 1)
+              ,(K_octave,p hb_o + 1)
+              ,(K_dur,p hb_t / 16)])
 
 -- | Pitch classes
 --
 -- > tail hb_k == [[7,7,9,7,2,0],[7,7,7,4,0,11,9],[5,5,4,0,2,0]]
 hb_k :: Integral n => [[n]]
 hb_k =
-    let f = floor . L.degree_to_key [0,2,4,5,7,9,11] 12 . pred
+    let f = floor . M.degreeToKey [0,2,4,5,7,9,11] 12 . pred
     in map (map f) (hb_d :: [[Double]])
 
 -- | Midi note numbers
@@ -172,14 +171,16 @@
 --
 -- > withSC3 (hear 1 (map cim "hiprty"))
 -- > withSC3 (hear 9 (map cim hb))
-hear :: Transport m => L.P L.Value -> [Cim L.Value] -> m ()
+hear :: Transport m => Double -> [Cim Double] -> m ()
 hear blur x =
-    let (freq,dur,c) = unzip3 x
-    in play (ins_s,L.pbind [("freq",L.toP freq)
-                           ,("dur",L.toP dur)
-                           ,("legato",blur)
-                           ,("amp",L.toP c * 0.1 + 0.1)
-                           ,("loc",L.toP c * 2 - 1)])
+    let (f,d,c) = unzip3 x
+        p = toP . map realToFrac
+    in play (pbind [(K_instr,psynth ins_s)
+                   ,(K_freq,p f)
+                   ,(K_dur,p d)
+                   ,(K_legato,p (repeat blur))
+                   ,(K_amp,p c * 0.1 + 0.1)
+                   ,(K_param "loc",p c * 2 - 1)])
 
 main :: IO ()
 main = withSC3 (hear 9 ph)
diff --git a/gr/three-cpsw-m.hs b/gr/three-cpsw-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/three-cpsw-m.hs
@@ -0,0 +1,18 @@
+-- three-cpsw (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+three_cpsw :: UId m => m UGen
+three_cpsw = do
+  t <- dust KR (mce2 12 18)
+  f0 <- tRand 1 64 t
+  f1 <- lfNoise0 KR f0
+  a <- tRand 0.0 0.5 t
+  dt <- tRand 0.975 1.025 t
+  dh <- tRand 0.750 0.7505 t
+  let f = f1 * mce2 9000 12000 + 9500
+      o = saw AR f + saw AR (f * dh) + saw AR (f * dt)
+  return (clip2 (o * a) 0.75)
+
+main :: IO ()
+main = audition . out 0 =<< three_cpsw
diff --git a/gr/three-cpsw.hs b/gr/three-cpsw.hs
deleted file mode 100644
--- a/gr/three-cpsw.hs
+++ /dev/null
@@ -1,19 +0,0 @@
--- three-cpsw (rd)
-
-import Sound.SC3.Monad {- hsc3 -}
-
--- > Sound.SC3.UGen.Dot.draw =<< three_cpsw
-three_cpsw :: UId m => m UGen
-three_cpsw = do
-  t <- dust KR (mce2 12 18)
-  f0 <- tRand 1 64 t
-  f1 <- lfNoise0 KR f0
-  a <- tRand 0.0 0.5 t
-  dt <- tRand 0.975 1.025 t
-  dh <- tRand 0.750 0.7505 t
-  let f = f1 * mce2 9000 12000 + 9500
-      o = saw AR f + saw AR (f * dh) + saw AR (f * dt)
-  return (clip2 (o * a) 0.75)
-
-main :: IO ()
-main = audition . out 0 =<< three_cpsw
diff --git a/gr/tipnso.hs b/gr/tipnso.hs
--- a/gr/tipnso.hs
+++ b/gr/tipnso.hs
@@ -6,9 +6,9 @@
 tipnso =
   let x = mouseX KR 1 32 Linear 0.1
       t = impulse AR x 0
-      n1 = tIRand 'a' 16 72 t
-      n2 = tIRand 'a' 0 1 t
-      n3 = pinkNoise 'a' AR
+      n1 = tIRand 'α' 16 72 t
+      n2 = tIRand 'β' 0 1 t
+      n3 = pinkNoise 'γ' AR
       e = decay2 t 0.01 (mce2 0.1 0.15)
       f = midiCPS (n1 + 36 + (12 * n2))
       s = sinOsc AR f 0 * e
diff --git a/gr/tr-out-m.hs b/gr/tr-out-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/tr-out-m.hs
@@ -0,0 +1,32 @@
+-- tr-out (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3.Monad {- hsc3 -}
+
+tr_nd :: UId m => UGen -> m (UGen,UGen)
+tr_nd n = do
+  t <- dust KR 1.6
+  r1 <- tRand 0 6 t
+  r2 <- tRand 0 6 t
+  r3 <- tRand 0 6 t
+  let f = midiCPS (bufRdN 1 KR 0 r1 NoLoop)
+      p = bufRdN 1 KR 1 r2 NoLoop
+      a = bufRdN 1 KR 2 r3 NoLoop
+  return (pan2 (sinOsc AR f 0) p a
+         ,sendTrig t n (f / 660))
+
+tr_out :: UId m => m UGen
+tr_out = do
+  ns <- mapM tr_nd [1..4]
+  let o = sum (map fst ns)
+  return (mrg (o : map snd ns))
+
+act :: (UId m,Transport m) => m ()
+act = do
+  _ <- async (b_alloc_setn1 0 0 [60,62,64,65,67,69])
+  _ <- async (b_alloc_setn1 1 0 [-1,-0.5,0,0.25,0.75,1.0])
+  _ <- async (b_alloc_setn1 2 0 [0.01,0.05,0.1,0.15,0.25,0.35])
+  play . out 0 =<< tr_out
+
+main :: IO ()
+main = withSC3 act
diff --git a/gr/tr-out.hs b/gr/tr-out.hs
deleted file mode 100644
--- a/gr/tr-out.hs
+++ /dev/null
@@ -1,33 +0,0 @@
--- tr-out (rd)
-
-import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
-
-tr_nd :: UId m => UGen -> m (UGen,UGen)
-tr_nd n = do
-  t <- dust KR 1.6
-  r1 <- tRand 0 6 t
-  r2 <- tRand 0 6 t
-  r3 <- tRand 0 6 t
-  let f = midiCPS (bufRdN 1 KR 0 r1 NoLoop)
-      p = bufRdN 1 KR 1 r2 NoLoop
-      a = bufRdN 1 KR 2 r3 NoLoop
-  return (pan2 (sinOsc AR f 0) p a
-         ,sendTrig t n (f / 660))
-
--- > Sound.SC3.UGen.Dot.draw =<< tr_out
-tr_out :: UId m => m UGen
-tr_out = do
-  ns <- mapM tr_nd [1..4]
-  let o = sum (map fst ns)
-  return (mrg (o : map snd ns))
-
-act :: (UId m,Transport m) => m ()
-act = do
-  _ <- async (b_alloc_setn1 0 0 [60,62,64,65,67,69])
-  _ <- async (b_alloc_setn1 1 0 [-1,-0.5,0,0.25,0.75,1.0])
-  _ <- async (b_alloc_setn1 2 0 [0.01,0.05,0.1,0.15,0.25,0.35])
-  play . out 0 =<< tr_out
-
-main :: IO ()
-main = withSC3 act
diff --git a/gr/train.hs b/gr/train.hs
--- a/gr/train.hs
+++ b/gr/train.hs
@@ -24,9 +24,9 @@
     let time = 24
         loc = let e = Envelope [-0.8,0.8] [time + 2] [EnvSin,EnvSin] Nothing Nothing
               in envGen AR 1 1 0 1 RemoveSynth e
-        n1 = whiteNoise 'a' AR
-        n2 = pinkNoise 'b' AR
-        n3 = whiteNoise 'c' AR
+        n1 = whiteNoise 'α' AR
+        n2 = pinkNoise 'β' AR
+        n3 = whiteNoise 'γ' AR
     in pan2 (steam time n1 n2 + whistle time n3) loc 1
 
 main :: IO ()
diff --git a/gr/tremulate-hp.hs b/gr/tremulate-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/tremulate-hp.hs
@@ -0,0 +1,17 @@
+-- tremulate (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+tremulate :: UId m => m UGen
+tremulate = do
+  let o = fSinOsc AR (#(rand 500 900) * mce [1,1.2,1.5,1.8]) 0
+  n <- clone 4 (lfNoise2 KR #(rand 30 90))
+  return (mix (pan2 o #(clone 4 (rand (-1) 1)) (max 0 (n * 0.1))))
+
+tremulate_pp :: UGen -> UGen
+tremulate_pp i = combN i 0.1 0.1 1
+
+main :: IO ()
+main = do xfadeTextureU_pp (0.5,2,maxBound) #(tremulate) 2 tremulate_pp
diff --git a/gr/tremulate-m.hs b/gr/tremulate-m.hs
--- a/gr/tremulate-m.hs
+++ b/gr/tremulate-m.hs
@@ -3,7 +3,6 @@
 import Sound.SC3.Monad {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
--- > Sound.SC3.UGen.Dot.draw =<< tremulate
 tremulate :: UId m => m UGen
 tremulate = do
   f <- rand 500 900
diff --git a/gr/tremulate.hs b/gr/tremulate.hs
--- a/gr/tremulate.hs
+++ b/gr/tremulate.hs
@@ -2,16 +2,15 @@
 
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
--- > Sound.SC3.UGen.Dot.draw tremulate
 tremulate :: UGen
 tremulate =
-    let f = rand 'a' 500 900
+    let f = rand 'α' 500 900
         o = fSinOsc AR (f * mce [1,1.2,1.5,1.8]) 0
-        r = randN 4 'a' 30 90
-        a = max 0 (lfNoise2 'a' KR r) * 0.1
-        l = randN 4 'a' (-1) 1
+        r = randN 4 'β' 30 90
+        a = max 0 (lfNoise2 'γ' KR r) * 0.1
+        l = randN 4 'δ' (-1) 1
     in mix (pan2 o l a)
 
 tremulate_pp :: UGen -> UGen
diff --git a/gr/trkl-m.hs b/gr/trkl-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/trkl-m.hs
@@ -0,0 +1,35 @@
+-- trkl (rd)
+
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Monad {- hsc3 -}
+
+trkl :: UId m => UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> m UGen
+trkl d ul fu dy la fy = do
+  let tf = xLine KR 1 ul d RemoveSynth
+      st = impulse AR (tf * 8) 0
+      t = impulse AR tf 0
+  r0 <- rand (-1) 1
+  r1 <- rand (-1) 1
+  r2 <- tRand 0.05 1.0 t
+  r3 <- tExpRand 0.001 0.25 st -- non-zero minima
+  fh <- tRand 1.75 2.25 t
+  let a = dbAmp (line KR 12 la d RemoveSynth)
+      f = xLine KR fu 900 d RemoveSynth
+      p = line KR r0 r1 d RemoveSynth
+      o1 = mix (ringz (decay2 t 0.01 dy) (mce2 f (f * fh)) fy)
+      o2 = mix (saw AR (mce2 f (f * fh)))
+  return (pan2 (o1 + o2 * decay2 t 0.1 r2 * r3) p a)
+
+-- > audition . out 0 =<< trkl_r
+trkl_r :: UId m => m UGen
+trkl_r = do
+  d <- rand 0.5 16
+  ul <- rand 16 64
+  fu <- rand 1200 9000
+  dy <- rand 0.005 0.175
+  la <- rand (-60) (-25)
+  fy <- rand 0.015 0.125
+  trkl d ul fu dy la fy
+
+main :: IO ()
+main = overlapTextureU (5,2,12,maxBound) =<< trkl_r
diff --git a/gr/trkl.hs b/gr/trkl.hs
deleted file mode 100644
--- a/gr/trkl.hs
+++ /dev/null
@@ -1,36 +0,0 @@
--- trkl (rd)
-
-import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
-
-trkl :: UId m => UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> m UGen
-trkl d ul fu dy la fy = do
-  let tf = xLine KR 1 ul d RemoveSynth
-      st = impulse AR (tf * 8) 0
-      t = impulse AR tf 0
-  r0 <- rand (-1) 1
-  r1 <- rand (-1) 1
-  r2 <- tRand 0.05 1.0 t
-  r3 <- tExpRand 0.001 0.25 st -- non-zero minima
-  fh <- tRand 1.75 2.25 t
-  let a = dbAmp (line KR 12 la d RemoveSynth)
-      f = xLine KR fu 900 d RemoveSynth
-      p = line KR r0 r1 d RemoveSynth
-      o1 = mix (ringz (decay2 t 0.01 dy) (mce2 f (f * fh)) fy)
-      o2 = mix (saw AR (mce2 f (f * fh)))
-  return (pan2 (o1 + o2 * decay2 t 0.1 r2 * r3) p a)
-
--- > Sound.SC3.UGen.Dot.draw =<< trkl_r
--- > audition . out 0 =<< trkl_r
-trkl_r :: UId m => m UGen
-trkl_r = do
-  d <- rand 0.5 16
-  ul <- rand 16 64
-  fu <- rand 1200 9000
-  dy <- rand 0.005 0.175
-  la <- rand (-60) (-25)
-  fy <- rand 0.015 0.125
-  trkl d ul fu dy la fy
-
-main :: IO ()
-main = overlapTextureU (5,2,12,maxBound) =<< trkl_r
diff --git a/gr/trmlo-u.hs b/gr/trmlo-u.hs
new file mode 100644
--- /dev/null
+++ b/gr/trmlo-u.hs
@@ -0,0 +1,52 @@
+-- trmlo-u (rd)
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+
+-- > audition (out 0 trmlo)
+trmlo :: UGen
+trmlo =
+    let mWrp i l r = linLin i (-1) 1 (midiCPS l) (midiCPS r)
+        mWrp1 i m = mWrp i m (m + 1)
+        mWrpN i m n = mWrp i m (m + n)
+        o1 = let f = 5
+                 d = 3
+                 s = envSine d 0.1
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = 65
+                 m = sinOsc KR f 0
+             in pan2 (sinOsc AR (mWrp1 m n) 0) m e
+        o2 = let f = iRand 5 9
+                 d = iRand 5 9
+                 s = envSine d (rand 0.1 0.2)
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = iRand 69 72
+                 m = sinOsc KR f 0
+             in pan2 (sinOsc AR (mWrp1 m n) 0) m e
+        o3 = let f = iRand 5 9
+                 d = iRand 9 12
+                 s = envSine d (rand 0.1 0.2)
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = iRand 69 72
+                 m = sinOsc KR f 0
+                 l = line KR 0 (iRand 1 5) d DoNothing
+             in pan2 (blip AR (mWrp1 m (n + l)) (linLin m (-1) 1 1 2)) m e
+        o4 = let f = iRand 5 18
+                 d = iRand 12 15
+                 s = envSine d (rand 0.1 0.2)
+                 e = envGen KR 1 5e-2 0 1 DoNothing s
+                 n = iRand 69 72
+                 m = sinOsc KR f 0
+                 l = line KR 0 (iRand 1 5) d RemoveSynth
+                 fr = mWrpN m (n + l) (iRand 1 5)
+             in pan2 (blip AR fr (linLin m (-1) 1 1 (iRand 2 24))) m e
+    in o1 + o2 + o3 + o4
+
+main :: IO ()
+main = do
+  let s = synthdef "trmlo" (out 0 trmlo)
+      p = pbind [(K_instr,psynth s)
+                ,(K_dur,pxrand 'α' [0.25,0.5,1,2,4] inf)
+                ,(K_legato,1.25)]
+  audition p
diff --git a/gr/trmlo.hs b/gr/trmlo.hs
--- a/gr/trmlo.hs
+++ b/gr/trmlo.hs
@@ -1,8 +1,7 @@
--- trmlo
+-- trmlo (rd)
 
-import Sound.SC3 {- hsc3 -}
-import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 -- > audition (out 0 trmlo)
 trmlo :: UGen
@@ -17,33 +16,36 @@
                  n = 65
                  m = sinOsc KR f 0
              in pan2 (sinOsc AR (mWrp1 m n) 0) m e
-        o2 = let f = iRand 5 9
-                 d = iRand 5 9
-                 s = envSine d (rand 0.1 0.2)
+        o2 = let f = iRand 'α' 5 9
+                 d = iRand 'β' 5 9
+                 s = envSine d (rand 'γ' 0.1 0.2)
                  e = envGen KR 1 1 0 1 DoNothing s
-                 n = iRand 69 72
+                 n = iRand 'δ' 69 72
                  m = sinOsc KR f 0
              in pan2 (sinOsc AR (mWrp1 m n) 0) m e
-        o3 = let f = iRand 5 9
-                 d = iRand 9 12
-                 s = envSine d (rand 0.1 0.2)
+        o3 = let f = iRand 'ε' 5 9
+                 d = iRand 'ζ' 9 12
+                 s = envSine d (rand 'η' 0.1 0.2)
                  e = envGen KR 1 1 0 1 DoNothing s
-                 n = iRand 69 72
+                 n = iRand 'θ' 69 72
                  m = sinOsc KR f 0
-                 l = line KR 0 (iRand 1 5) d DoNothing
+                 l = line KR 0 (iRand 'ι' 1 5) d DoNothing
              in pan2 (blip AR (mWrp1 m (n + l)) (linLin m (-1) 1 1 2)) m e
-        o4 = let f = iRand 5 18
-                 d = iRand 12 15
-                 s = envSine d (rand 0.1 0.2)
+        o4 = let f = iRand 'κ' 5 18
+                 d = iRand 'λ' 12 15
+                 s = envSine d (rand 'μ' 0.1 0.2)
                  e = envGen KR 1 5e-2 0 1 DoNothing s
-                 n = iRand 69 72
+                 n = iRand 'ν' 69 72
                  m = sinOsc KR f 0
-                 l = line KR 0 (iRand 1 5) d RemoveSynth
-                 fr = mWrpN m (n + l) (iRand 1 5)
-             in pan2 (blip AR fr (linLin m (-1) 1 1 (iRand 2 24))) m e
+                 l = line KR 0 (iRand 'ξ' 1 5) d RemoveSynth
+                 fr = mWrpN m (n + l) (iRand 'ο' 1 5)
+             in pan2 (blip AR fr (linLin m (-1) 1 1 (iRand 'π' 2 24))) m e
     in o1 + o2 + o3 + o4
 
 main :: IO ()
 main = do
   let s = synthdef "trmlo" (out 0 trmlo)
-  audition (s,pbind [("dur",pxrand 'a' [0.25,0.5,1,2,4] inf)])
+      p = pbind [(K_instr,psynth s)
+                ,(K_dur,pxrand 'ρ' [0.25,0.5,1,2,4] inf)
+                ,(K_legato,1.25)]
+  audition p
diff --git a/gr/uplink-hp.hs b/gr/uplink-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/uplink-hp.hs
@@ -0,0 +1,17 @@
+-- uplink (jmcc)
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+uplink :: UId m => m UGen
+uplink = do
+  let p0 = do return (lfPulse KR #(rand 0 20) 0 #(rand 0 1))
+  let p1 = do return (lfPulse KR #(rand 0 4) 0 #(rand 0 1)
+                      * #(rand 0 8000)
+                      + #(rand 0 2000))
+  f <- fmap mix (clone 2 (p0 .*. p1))
+  return (pan2 (lfPulse AR f 0 0.5 * 0.04) #(rand (-0.8) 0.8) 1)
+
+main :: IO ()
+main = overlapTextureU (4,1,5,maxBound) =<< uplink
diff --git a/gr/uplink.hs b/gr/uplink.hs
--- a/gr/uplink.hs
+++ b/gr/uplink.hs
@@ -7,14 +7,13 @@
 randz :: ID a => a -> UGen -> UGen
 randz e = rand e 0
 
--- > Sound.SC3.UGen.Dot.draw uplink
 uplink :: UGen
 uplink =
     let r = randz
-        p0 = lfPulse KR (r 'α' 20) 0 (r 'α' 1)
-        p1 = lfPulse KR (r 'β' 4) 0 (r 'β' 1) * r 'β' 8000 + r 'β' 2000
-        f = mix (uclone 'γ' 2 (p0 * p1))
-    in pan2 (lfPulse AR f 0 0.5 * 0.04) (rand 'δ' (-0.8) 0.8) 1
+        p0 = lfPulse KR (r 'α' 20) 0 (r 'β' 1)
+        p1 = lfPulse KR (r 'γ' 4) 0 (r 'δ' 1) * r 'ε' 8000 + r 'ζ' 2000
+        f = mix (uclone 'η' 2 (p0 * p1))
+    in pan2 (lfPulse AR f 0 0.5 * 0.04) (rand 'θ' (-0.8) 0.8) 1
 
 main :: IO ()
 main = overlapTextureU (4,1,5,maxBound) uplink
diff --git a/gr/urandom.hs b/gr/urandom.hs
--- a/gr/urandom.hs
+++ b/gr/urandom.hs
@@ -2,7 +2,7 @@
 
 import Control.Monad {- base -}
 import qualified Data.ByteString.Lazy as B {- bytestring -}
-import Sound.OpenSoundControl.Coding.Byte {- hosc -}
+import Sound.OSC.Coding.Byte {- hosc -}
 import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 import System.IO {- base -}
diff --git a/gr/vla-addtn-sharc.hs b/gr/vla-addtn-sharc.hs
--- a/gr/vla-addtn-sharc.hs
+++ b/gr/vla-addtn-sharc.hs
@@ -1,10 +1,10 @@
 -- vla-adttn-sharc (rd)
 
-import Data.List
+import Data.List {- base -}
 import Sound.Analysis.SHARC {- hsharc -}
 import Sound.OSC {- hosc -}
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 type R = Double
 type R3 = (R,R,R)
@@ -31,18 +31,18 @@
     let m = n * 2
         ampl = bufRdN 1 KR 0 m NoLoop
         ph = bufRdN 1 KR 0 (m + 1) NoLoop
-        o = let dt' = lfNoise1 'a' KR 1 * dt + 1.0
+        o = let dt' = lfNoise1 'α' KR 1 * dt + 1.0
             in fSinOsc AR (fr * (n + 1) * dt') ph
         e = linen (impulse KR 0 0)
-                  (rise * rand 'a' 0.75 1.25)
+                  (rise * rand 'β' 0.75 1.25)
                   ampl
-                  (fall * rand 'b' 0.75 1.25)
+                  (fall * rand 'γ' 0.75 1.25)
                   DoNothing
     in o * e
 
 vla_plyr :: UGen -> UGen
 vla_plyr n =
-    let a = control KR "ampl" 0.1
+    let a = control KR "amp" 0.1
         f = control KR "freq" 129.897
         rs = control KR "rise" 0.1
         fa = control KR "fall" 0.5
@@ -55,22 +55,24 @@
 plyr36 :: Synthdef
 plyr36 = synthdef "plyr36" (out 0 (vla_plyr 36))
 
-pattern :: [(String,P Double)]
+pattern :: P_Bind
 pattern =
-    [("loc",pwhite 'a' (-1) 1 inf)
-    ,("ampl",pwhite 'b' 0.05 0.1 inf)
-    ,("degree",prand 'c' [0,1,2,3,4,5,6,7,8] inf)
-    ,("octave",prand 'd' [2,3] inf)
-    ,("dt",pwhite 'e' 0.001 0.005 inf)
-    ,("rise",pwhite 'f' 1 2 inf)
-    ,("fall",pwhite 'g' 4 7 inf)
-    ,("dur",prand 'h' [3,5] inf)]
+    [(K_instr,pinstr "plyr36")
+    ,(K_param "loc",pwhite 'δ' (-1) 1 inf)
+    ,(K_amp,pwhite 'ε' 0.05 0.1 inf)
+    ,(K_degree,prand 'ζ' [0,1,2,3,4,5,6,7,8] inf)
+    ,(K_octave,prand 'η' [2,3] inf)
+    ,(K_param "dt",pwhite 'θ' 0.001 0.005 inf)
+    ,(K_param "rise",pwhite 'ι' 1 2 inf)
+    ,(K_param "fall",pwhite 'κ' 4 7 inf)
+    ,(K_dur,prand 'λ' [3,5] inf)]
 
 act :: Transport m => FilePath -> m ()
 act fn = do
   v <- vla fn
   _ <- async (b_alloc_setn1 0 0 (vla_prep v))
-  play (plyr36,pbind pattern)
+  _ <- async (d_recv plyr36)
+  play (pbind pattern)
 
 main :: IO ()
 main = withSC3 (act "/home/rohan/data/sharc/sharc.xml")
diff --git a/gr/vla-addtn.hs b/gr/vla-addtn.hs
--- a/gr/vla-addtn.hs
+++ b/gr/vla-addtn.hs
@@ -2,7 +2,7 @@
 
 import Sound.OSC {- hosc -}
 import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
 type R = Double
 type R2 = (R,R)
@@ -101,18 +101,18 @@
     let m = n * 2
         ampl = bufRdN 1 KR 0 m NoLoop
         ph = bufRdN 1 KR 0 (m + 1) NoLoop
-        o = let dt' = lfNoise1 'a' KR 1 * dt + 1.0
+        o = let dt' = lfNoise1 'α' KR 1 * dt + 1.0
             in fSinOsc AR (fr * (n + 1) * dt') ph
         e = linen (impulse KR 0 0)
-                  (rise * rand 'a' 0.75 1.25)
+                  (rise * rand 'β' 0.75 1.25)
                   ampl
-                  (fall * rand 'b' 0.75 1.25)
+                  (fall * rand 'γ' 0.75 1.25)
                   DoNothing
     in o * e
 
 vla_plyr :: UGen -> UGen
 vla_plyr n =
-    let a = control KR "ampl" 0.1
+    let a = control KR "amp" 0.1
         f = control KR "freq" 129.897
         rs = control KR "rise" 0.1
         fa = control KR "fall" 0.5
@@ -125,21 +125,23 @@
 plyr36 :: Synthdef
 plyr36 = synthdef "plyr36" (out 0 (vla_plyr 36))
 
-pattern :: [(String,P Double)]
+pattern :: P_Bind
 pattern =
-    [("loc",pwhite 'a' (-1) 1 inf)
-    ,("ampl",pwhite 'b' 0.05 0.1 inf)
-    ,("degree",prand 'c' [0,1,2,3,4,5,6,7,8] inf)
-    ,("octave",prand 'd' [2,3] inf)
-    ,("dt",pwhite 'e' 0.001 0.005 inf)
-    ,("rise",pwhite 'f' 1 2 inf)
-    ,("fall",pwhite 'g' 4 7 inf)
-    ,("dur",5)]
+    [(K_instr,pinstr "plyr36")
+    ,(K_param "loc",pwhite 'δ' (-1) 1 inf)
+    ,(K_amp,pwhite 'ε' 0.05 0.1 inf)
+    ,(K_degree,prand 'ζ' [0,1,2,3,4,5,6,7,8] inf)
+    ,(K_octave,prand 'η' [2,3] inf)
+    ,(K_param "dt",pwhite 'θ' 0.001 0.005 inf)
+    ,(K_param "rise",pwhite 'ι' 1 2 inf)
+    ,(K_param "fall",pwhite 'κ' 4 7 inf)
+    ,(K_dur,5)]
 
 act :: Transport m => m ()
 act = do
   _ <- async (b_alloc_setn1 0 0 vla_prep)
-  play (plyr36,pbind pattern)
+  _ <- async (d_recv plyr36)
+  play (pbind pattern)
 
 main :: IO ()
 main = withSC3 act
diff --git a/gr/vlc-distrtn-m.hs b/gr/vlc-distrtn-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/vlc-distrtn-m.hs
@@ -0,0 +1,149 @@
+-- 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)])
+  wait =<< 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)]
diff --git a/gr/vlc-distrtn.hs b/gr/vlc-distrtn.hs
deleted file mode 100644
--- a/gr/vlc-distrtn.hs
+++ /dev/null
@@ -1,149 +0,0 @@
--- 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)]
diff --git a/gr/voscil-u.hs b/gr/voscil-u.hs
new file mode 100644
--- /dev/null
+++ b/gr/voscil-u.hs
@@ -0,0 +1,38 @@
+-- voscil-u (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
+import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+
+-- > Sound.SC3.UGen.Dot.draw (voscil 32)
+voscil :: Real a => a -> UGen
+voscil b =
+  let lfn = lfNoise0 KR
+      hb = (constant b - 1) / 2
+      rt = 6
+      f = 600
+      v = vOsc AR (lfn rt * hb + hb) (f * 2) 0
+      o = let bf = lfn rt * 40 + 600
+              nh = lfn rt * 16 + 24
+          in blip AR bf nh * (lfn rt * 0.1 + 0.1)
+      p = pan2 (v + o) (lfn rt) (lfn rt * 0.5 + 0.5)
+      w = vOsc AR (lfSaw KR (1 / rt) 0 * hb + hb) f 0
+      q = pan2 w (lfn rt) (lfn rt * 0.5 + 0.5)
+  in p + q
+
+run :: Transport m => m ()
+run = do
+  let bn = 8192 * 4
+      b = 32
+      r_set i =
+          do m <- rrand 2 512
+             j <- sequence (replicate m (rrand 0 bn))
+             k <- sequence (replicate m (rrand (-1) 1))
+             _ <- async (b_alloc i bn 1)
+             send (b_set i (zip j k))
+  mapM_ r_set [0 .. (b - 1)]
+  play (out 0 (voscil b))
+
+main :: IO ()
+main = withSC3 run
diff --git a/gr/voscil.hs b/gr/voscil.hs
--- a/gr/voscil.hs
+++ b/gr/voscil.hs
@@ -1,24 +1,23 @@
 -- voscil (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3 {- hsc3 -}
+import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
-import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
 
 -- > Sound.SC3.UGen.Dot.draw (voscil 32)
 voscil :: Real a => a -> UGen
 voscil b =
-  let lfn = lfNoise0 KR
+  let lfn z = lfNoise0 z KR
       hb = (constant b - 1) / 2
       rt = 6
       f = 600
-      v = vOsc AR (lfn rt * hb + hb) (f * 2) 0
-      o = let bf = lfn rt * 40 + 600
-              nh = lfn rt * 16 + 24
-          in blip AR bf nh * (lfn rt * 0.1 + 0.1)
-      p = pan2 (v + o) (lfn rt) (lfn rt * 0.5 + 0.5)
+      v = vOsc AR (lfn 'α' rt * hb + hb) (f * 2) 0
+      o = let bf = lfn 'β' rt * 40 + 600
+              nh = lfn 'γ' rt * 16 + 24
+          in blip AR bf nh * (lfn 'δ' rt * 0.1 + 0.1)
+      p = pan2 (v + o) (lfn 'ε' rt) (lfn 'ζ' rt * 0.5 + 0.5)
       w = vOsc AR (lfSaw KR (1 / rt) 0 * hb + hb) f 0
-      q = pan2 w (lfn rt) (lfn rt * 0.5 + 0.5)
+      q = pan2 w (lfn 'η' rt) (lfn 'θ' rt * 0.5 + 0.5)
   in p + q
 
 run :: Transport m => m ()
diff --git a/gr/waveset.hs b/gr/waveset.hs
--- a/gr/waveset.hs
+++ b/gr/waveset.hs
@@ -15,17 +15,14 @@
 latency = 0.15
 
 -- | Add t to timestamp.
-offset :: Double -> Bundle -> Bundle
-offset t b =
-    case b of
-      Bundle (UTCr t0) m -> Bundle (UTCr (t + t0)) m
-      _ -> error "offset:non-UTCr bundle"
+offset :: Time -> Bundle -> Bundle
+offset t (Bundle t0 m) = Bundle (t + t0) m
 
 -- | Play non-empty set of osc bundles.
 play_set :: Transport m => [Bundle] -> m ()
 play_set [] = error "play_set:empty"
 play_set (x:xs) = do
-  let (Bundle (UTCr t) _) = x
+  let (Bundle t _) = x
   pauseThreadUntil (t - latency)
   mapM_ sendBundle (x:xs)
 
@@ -33,7 +30,7 @@
 play_sets :: Transport m => [[Bundle]] -> m ()
 play_sets [] = return ()
 play_sets s = do
-  t <- utcr
+  t <- time
   mapM_ (play_set . map (offset t)) s
 
 -- | Split l into chunks of at most n elements.
@@ -114,7 +111,7 @@
 mk_score sr repeats w =
     let durations = zipWith (\(s, e) r -> (e - s) * r / sr) w repeats
         start_times = scanl (+) 0 durations
-        mk_elem (s,e) t d = Bundle (UTCr t) [mk_msg 10 s e d]
+        mk_elem (s,e) t d = Bundle t [mk_msg 10 s e d]
     in zipWith3 mk_elem w start_times durations
 
 -- | n randomly chosen elements of w.
@@ -136,7 +133,7 @@
       sr = fromIntegral (F.sampleRate hdr)
       b = cs !! 0
       w = ws (prune 64 0 (fzc 0 b))
-      pl s = play_score 10 s >> pauseThread 1
+      pl s = play_score 10 s >> wait 1
       post = liftIO . putStrLn
   post ("#f: " ++ show (nc, nf, sr))
   post ("#w: " ++ show (length w)) -- force w
diff --git a/gr/what-was-i-thinking-m.hs b/gr/what-was-i-thinking-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/what-was-i-thinking-m.hs
@@ -0,0 +1,24 @@
+-- what was i thinking? (jmcc)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+what_was_i_thinking :: UId m => m UGen
+what_was_i_thinking = do
+  n0 <- lfNoise1 KR 0.2
+  n1 <- lfNoise1 KR 0.157
+  let p = pulse AR f (n1 * 0.4 + 0.5) * 0.04
+      i = lfPulse AR 0.1 0 0.05 * impulse AR 8 0 * 500
+      d = decay i 2
+      f = max (sinOsc KR 4 0 + 80) d
+      z = rlpf p (n0 * 2000 + 2400) 0.2
+      c x = do r <- rand 0 0.3
+               n <- lfNoise1 KR r
+               return (combL x 0.06 (n * 0.025 + 0.035) 1)
+      y = z * 0.6
+  z0 <- clone 2 (c y)
+  z1 <- clone 2 (c y)
+  return (z + mce [mix z0,mix z1])
+
+main :: IO ()
+main = audition . out 0 =<< what_was_i_thinking
+
diff --git a/gr/what-was-i-thinking.hs b/gr/what-was-i-thinking.hs
deleted file mode 100644
--- a/gr/what-was-i-thinking.hs
+++ /dev/null
@@ -1,25 +0,0 @@
--- what was i thinking? (jmcc)
-
-import Sound.SC3.Monad {- hsc3 -}
-
--- > Sound.SC3.UGen.Dot.draw =<< what_was_i_thinking
-what_was_i_thinking :: UId m => m UGen
-what_was_i_thinking = do
-  n0 <- lfNoise1 KR 0.2
-  n1 <- lfNoise1 KR 0.157
-  let p = pulse AR f (n1 * 0.4 + 0.5) * 0.04
-      i = lfPulse AR 0.1 0 0.05 * impulse AR 8 0 * 500
-      d = decay i 2
-      f = max (sinOsc KR 4 0 + 80) d
-      z = rlpf p (n0 * 2000 + 2400) 0.2
-      c x = do r <- rand 0 0.3
-               n <- lfNoise1 KR r
-               return (combL x 0.06 (n * 0.025 + 0.035) 1)
-      y = z * 0.6
-  z0 <- clone 2 (c y)
-  z1 <- clone 2 (c y)
-  return (z + mce [mix z0,mix z1])
-
-main :: IO ()
-main = audition . out 0 =<< what_was_i_thinking
-
diff --git a/gr/why-supercollider.hs b/gr/why-supercollider.hs
--- a/gr/why-supercollider.hs
+++ b/gr/why-supercollider.hs
@@ -2,18 +2,17 @@
 
 import Sound.SC3.ID {- hsc3 -}
 import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
 
--- > Sound.SC3.UGen.Dot.draw why_supercollider
 why_supercollider :: UGen
 why_supercollider =
-    let r = resonz (dust 'α' AR 0.2 * 50) (rand 'α' 200 3200) 0.003
-        s = mix (uclone 'α' 10 r)
+    let r = resonz (dust 'α' AR 0.2 * 50) (rand 'β' 200 3200) 0.003
+        s = mix (uclone 'γ' 10 r)
         z = delayN s 0.048 0.048
-        c = combL z 0.1 (lfNoise1 'α' KR (rand 'α' 0 0.1) * 0.04 + 0.05) 15
-        y = mix (uclone 'α' 7 c)
-        f i = allpassN i 0.050 (randN 2 'α' 0 0.05) 1
-        x = useq 'α' 4 f y
+        c = combL z 0.1 (lfNoise1 'δ' KR (rand 'ε' 0 0.1) * 0.04 + 0.05) 15
+        y = mix (uclone 'ζ' 7 c)
+        f i = allpassN i 0.050 (randN 2 'η' 0 0.05) 1
+        x = useq 'θ' 4 f y
     in out 0 (s + 0.2 * x)
 
 main :: IO ()
diff --git a/gr/wial-m.hs b/gr/wial-m.hs
new file mode 100644
--- /dev/null
+++ b/gr/wial-m.hs
@@ -0,0 +1,26 @@
+-- wial (rd)
+
+import Sound.SC3.Monad {- hsc3 -}
+
+wial :: (Functor m,UId m) => m UGen
+wial = do
+  let pls c d f = do let t = pulseDivider c d 0
+                         e = decay2 t 0.05 0.75
+                         o = sinOsc AR (toggleFF t * f + f * 2) 0
+                     n0 <- tIRand 0 1 t
+                     return (o * e * n0 * 0.5)
+      smpl f = [(4,6,f,0.75)
+               ,(2,6,f * 2,0.75)
+               ,(1,2,f * 16,0.025)
+               ,(1,5,f * 64,0.005)
+               ,(1,4,f * 128,0.035)
+               ,(1,3,f * 256,0.15)
+               ,(2,3,f * 512,0.35)]
+      plss c (d0,d1,f,a) = fmap (* a) (pls c (mce2 d0 d1) f)
+      clk = impulse AR 16 0
+  n0 <- dust KR 2
+  f <- tWChoose n0 (mce2 (20 * 0.66) 20) (mce2 0.25 0.75) 0
+  fmap sum (mapM (plss clk) (smpl f))
+
+main :: IO ()
+main = audition . out 0 =<< wial
diff --git a/gr/wial.hs b/gr/wial.hs
deleted file mode 100644
--- a/gr/wial.hs
+++ /dev/null
@@ -1,27 +0,0 @@
--- wial (rd)
-
-import Sound.SC3.Monad {- hsc3 -}
-
--- > Sound.SC3.UGen.Dot.draw =<< wial
-wial :: (Functor m,UId m) => m UGen
-wial = do
-  let pls c d f = do let t = pulseDivider c d 0
-                         e = decay2 t 0.05 0.75
-                         o = sinOsc AR (toggleFF t * f + f * 2) 0
-                     n0 <- tIRand 0 1 t
-                     return (o * e * n0 * 0.5)
-      smpl f = [(4,6,f,0.75)
-               ,(2,6,f * 2,0.75)
-               ,(1,2,f * 16,0.025)
-               ,(1,5,f * 64,0.005)
-               ,(1,4,f * 128,0.035)
-               ,(1,3,f * 256,0.15)
-               ,(2,3,f * 512,0.35)]
-      plss c (d0,d1,f,a) = fmap (* a) (pls c (mce2 d0 d1) f)
-      clk = impulse AR 16 0
-  n0 <- dust KR 2
-  f <- tWChoose n0 (mce2 (20 * 0.66) 20) (mce2 0.25 0.75) 0
-  return.sum =<< mapM (plss clk) (smpl f)
-
-main :: IO ()
-main = audition . out 0 =<< wial
diff --git a/gr/wind-metals-m.hs b/gr/wind-metals-m.hs
--- a/gr/wind-metals-m.hs
+++ b/gr/wind-metals-m.hs
@@ -4,7 +4,6 @@
 import Sound.SC3.Monad {- hsc3 -}
 
 -- > audition . out 0 =<< wind_metals
--- > Sound.SC3.UGen.Dot.draw =<< wind_metals
 wind_metals :: UId m => m UGen
 wind_metals = do
   let n = 6
diff --git a/gr/xy-interference-m.hs b/gr/xy-interference-m.hs
--- a/gr/xy-interference-m.hs
+++ b/gr/xy-interference-m.hs
@@ -2,7 +2,6 @@
 
 import Sound.SC3.Monad {- hsc3 -}
 
--- > Sound.SC3.UGen.Dot.draw =<< xy_interference
 xy_interference :: UId m => m UGen
 xy_interference = do
   let x = mouseX KR 20 22000 Linear (mce2 0.005 0.025)
@@ -11,7 +10,7 @@
               let a = sinOsc AR (x + n) 0
                   b = sinOsc AR y 0
               return (a * b)
-  return.sum =<< sequence (replicate 3 nd)
+  fmap sum (sequence (replicate 3 nd))
 
 main :: IO ()
 main = audition . out 0 =<< xy_interference
diff --git a/gr/xy-interference.hs b/gr/xy-interference.hs
--- a/gr/xy-interference.hs
+++ b/gr/xy-interference.hs
@@ -7,11 +7,11 @@
 xy_interference =
   let x = mouseX KR 20 22000 Linear (mce2 0.005 0.025)
       y = mouseY KR 20 22000 Linear (mce2 0.005 0.075)
-      nd = let n = lfNoise0 'a' KR (mce2 5 9)
+      nd = let n = lfNoise0 'α' KR (mce2 5 9)
                a = sinOsc AR (x + n) 0
                b = sinOsc AR y 0
            in a * b
-  in mix (uclone 'a' 3 nd)
+  in mix (uclone 'β' 3 nd)
 
 main :: IO ()
 main = audition (out 0 xy_interference)
diff --git a/hs/L.hs b/hs/L.hs
new file mode 100644
--- /dev/null
+++ b/hs/L.hs
@@ -0,0 +1,13 @@
+module L where
+
+import Data.Maybe {- base -}
+import Data.List {- base -}
+
+stripSuffix :: Eq a => [a] -> [a] -> Maybe [a]
+stripSuffix s l = fmap reverse (stripPrefix (reverse s) (reverse l))
+
+strip_suffix_or_id :: Eq a => [[a]] -> [a] -> [a]
+strip_suffix_or_id s l =
+    case s of
+      [] -> l
+      e:s' -> strip_suffix_or_id s' (fromMaybe l (stripSuffix e l))
diff --git a/hs/hsc3-graphs.hs b/hs/hsc3-graphs.hs
new file mode 100644
--- /dev/null
+++ b/hs/hsc3-graphs.hs
@@ -0,0 +1,428 @@
+import System.Environment {- base -}
+
+import qualified Sound.SC3.Graph.ADC_bit_reduction
+import qualified Sound.SC3.Graph.ADC_kabelscahden
+import qualified Sound.SC3.Graph.ADC_shepard_tones
+import qualified Sound.SC3.Graph.AM_karplus_strong
+import qualified Sound.SC3.Graph.AV_rm_octaver
+import qualified Sound.SC3.Graph.F0_sinusdeklinationen
+import qualified Sound.SC3.Graph.F0_f0_tw0051
+import qualified Sound.SC3.Graph.F0_pkt_07
+import qualified Sound.SC3.Graph.F0_f0_tw0030
+import qualified Sound.SC3.Graph.F0_f0_tw0011
+import qualified Sound.SC3.Graph.F0_f0_tw0033
+import qualified Sound.SC3.Graph.F0_f0_2012_04_19
+import qualified Sound.SC3.Graph.F0_f0_tw0077
+import qualified Sound.SC3.Graph.F0_1_4Q6
+import qualified Sound.SC3.Graph.F0_red_frik_m
+import qualified Sound.SC3.Graph.F0_pkt_26
+import qualified Sound.SC3.Graph.F0_f0_tw0020
+import qualified Sound.SC3.Graph.F0_pkt_28
+import qualified Sound.SC3.Graph.F0_hansm
+import qualified Sound.SC3.Graph.F0_pkt_00
+import qualified Sound.SC3.Graph.F0_f0_tw0045
+import qualified Sound.SC3.Graph.F0_f0_tw0049
+import qualified Sound.SC3.Graph.F0_f0_tw0014
+import qualified Sound.SC3.Graph.F0_f0_tw0084
+import qualified Sound.SC3.Graph.F0_buffer_display
+import qualified Sound.SC3.Graph.F0_f0_tw0028
+import qualified Sound.SC3.Graph.JAR_1_4Qx
+import qualified Sound.SC3.Graph.JJ_bohlen_pierce_140
+import qualified Sound.SC3.Graph.JL_dark_sea_horns_hp
+import qualified Sound.SC3.Graph.JL_pwm_crossfade
+import qualified Sound.SC3.Graph.JL_rain_thunder
+import qualified Sound.SC3.Graph.JL_jl_1_Z
+import qualified Sound.SC3.Graph.JL_bitwise
+import qualified Sound.SC3.Graph.JL_dark_sea_horns
+import qualified Sound.SC3.Graph.JMCC_tsort
+import qualified Sound.SC3.Graph.JMCC_police_state
+import qualified Sound.SC3.Graph.JMCC_wind_metals_m
+import qualified Sound.SC3.Graph.JMCC_babbling_brook_m
+import qualified Sound.SC3.Graph.JMCC_random_pulsations
+import qualified Sound.SC3.Graph.JMCC_moto_rev
+import qualified Sound.SC3.Graph.JMCC_sprinkler_m
+import qualified Sound.SC3.Graph.JMCC_demanding_studies
+import qualified Sound.SC3.Graph.JMCC_why_supercollider
+import qualified Sound.SC3.Graph.JMCC_deep_trip
+import qualified Sound.SC3.Graph.JMCC_alien_meadow
+import qualified Sound.SC3.Graph.JMCC_snare_909
+import qualified Sound.SC3.Graph.JMCC_uplink_hp
+import qualified Sound.SC3.Graph.JMCC_noise_burst_sweep
+import qualified Sound.SC3.Graph.JMCC_random_sine_waves_she
+import qualified Sound.SC3.Graph.JMCC_data_space
+import qualified Sound.SC3.Graph.JMCC_police_state_m
+import qualified Sound.SC3.Graph.JMCC_default
+import qualified Sound.SC3.Graph.JMCC_hell_is_busy
+import qualified Sound.SC3.Graph.JMCC_noise_modulated_sines
+import qualified Sound.SC3.Graph.JMCC_clustered_sines_m
+import qualified Sound.SC3.Graph.JMCC_coolant
+import qualified Sound.SC3.Graph.JMCC_harmonic_tumbling_m
+import qualified Sound.SC3.Graph.JMCC_slow_beating_harmonic_sines
+import qualified Sound.SC3.Graph.JMCC_tremulate_hp
+import qualified Sound.SC3.Graph.JMCC_resonant_dust
+import qualified Sound.SC3.Graph.JMCC_harmonic_swimming_m
+import qualified Sound.SC3.Graph.JMCC_synthetic_piano_m
+import qualified Sound.SC3.Graph.JMCC_sawed_cymbals
+import qualified Sound.SC3.Graph.JMCC_tank_m
+import qualified Sound.SC3.Graph.JMCC_clustered_sines
+import qualified Sound.SC3.Graph.JMCC_scratchy_m
+import qualified Sound.SC3.Graph.JMCC_aleatoric_quartet_m
+import qualified Sound.SC3.Graph.JMCC_spe_m
+import qualified Sound.SC3.Graph.JMCC_what_was_i_thinking_m
+import qualified Sound.SC3.Graph.JMCC_pond_life_hp
+import qualified Sound.SC3.Graph.JMCC_slow_beating_sines
+import qualified Sound.SC3.Graph.JMCC_spe_p
+import qualified Sound.SC3.Graph.JMCC_pulsing_bottles_m
+import qualified Sound.SC3.Graph.JMCC_early_space_music_lp_side_two
+import qualified Sound.SC3.Graph.JMCC_random_panning_sines_m
+import qualified Sound.SC3.Graph.JMCC_bowed_string_m
+import qualified Sound.SC3.Graph.JMCC_random_panning_sines
+import qualified Sound.SC3.Graph.JMCC_sidereal_time_hp
+import qualified Sound.SC3.Graph.JMCC_string_wander_cluster
+import qualified Sound.SC3.Graph.JMCC_alien_froggies
+import qualified Sound.SC3.Graph.JMCC_pulsing_bottles
+import qualified Sound.SC3.Graph.JMCC_strummable_guitar
+import qualified Sound.SC3.Graph.JMCC_overlap_add
+import qualified Sound.SC3.Graph.JMCC_choip
+import qualified Sound.SC3.Graph.JMCC_sprinkler
+import qualified Sound.SC3.Graph.JMCC_rails
+import qualified Sound.SC3.Graph.JMCC_pond_life
+import qualified Sound.SC3.Graph.JMCC_comb_delay_sweeps
+import qualified Sound.SC3.Graph.JMCC_tank_hp
+import qualified Sound.SC3.Graph.JMCC_harmonic_swimming
+import qualified Sound.SC3.Graph.JMCC_random_sine_waves
+import qualified Sound.SC3.Graph.JMCC_modal_space
+import qualified Sound.SC3.Graph.JMCC_lfo_modulation
+import qualified Sound.SC3.Graph.JMCC_cymbalism_accelerando
+import qualified Sound.SC3.Graph.JMCC_plucked_strings_m
+import qualified Sound.SC3.Graph.JMCC_uplink
+import qualified Sound.SC3.Graph.JMCC_sweepy_noise
+import qualified Sound.SC3.Graph.JMCC_random_sine_waves_hp
+import qualified Sound.SC3.Graph.JMCC_analog_bubbles
+import qualified Sound.SC3.Graph.JMCC_resonant_dust_hp
+import qualified Sound.SC3.Graph.JMCC_birds_hp
+import qualified Sound.SC3.Graph.JMCC_ring_modulated_klank
+import qualified Sound.SC3.Graph.JMCC_tremulate_m
+import qualified Sound.SC3.Graph.JMCC_tank
+import qualified Sound.SC3.Graph.JMCC_reverberated_sine_percussion_hp
+import qualified Sound.SC3.Graph.JMCC_theremin
+import qualified Sound.SC3.Graph.JMCC_data_space_hp
+import qualified Sound.SC3.Graph.JMCC_mridangam
+import qualified Sound.SC3.Graph.JMCC_reverberated_sine_percussion_m
+import qualified Sound.SC3.Graph.JMCC_doppler
+import qualified Sound.SC3.Graph.JMCC_scratchy
+import qualified Sound.SC3.Graph.JMCC_sidereal_time
+import qualified Sound.SC3.Graph.JMCC_birds_m
+import qualified Sound.SC3.Graph.JMCC_sample_and_hold_liquidities
+import qualified Sound.SC3.Graph.JMCC_tremulate
+import qualified Sound.SC3.Graph.JMCC_contamination_zone
+import qualified Sound.SC3.Graph.JMCC_saucer_base
+import qualified Sound.SC3.Graph.JMCC_cymbalism_m
+import qualified Sound.SC3.Graph.JP_record_scratcher
+import qualified Sound.SC3.Graph.JRHB_chain_saw_m
+import qualified Sound.SC3.Graph.JRHB_black_atlantic_currents
+import qualified Sound.SC3.Graph.JRHB_deep_sea
+import qualified Sound.SC3.Graph.JRHB_half_life
+import qualified Sound.SC3.Graph.JRHB_dial_history_m
+import qualified Sound.SC3.Graph.JRHB_sam_i_am
+import qualified Sound.SC3.Graph.LJP_one_line
+import qualified Sound.SC3.Graph.MN_k2ws
+import qualified Sound.SC3.Graph.MN_k2ws_hp
+import qualified Sound.SC3.Graph.NC_after_goeyvaerts
+import qualified Sound.SC3.Graph.NC_arpeggio
+import qualified Sound.SC3.Graph.NC_ellipse_based_synthesis
+import qualified Sound.SC3.Graph.NP_pebble_beach
+import qualified Sound.SC3.Graph.NV_nv_tw_54
+import qualified Sound.SC3.Graph.NV_nv_tw_41
+import qualified Sound.SC3.Graph.NV_nv_tw_1
+import qualified Sound.SC3.Graph.PC_thx
+import qualified Sound.SC3.Graph.PJ_forest_sounds_m
+import qualified Sound.SC3.Graph.RB_hh_808
+import qualified Sound.SC3.Graph.RD_bs_070705_m
+import qualified Sound.SC3.Graph.RD_scritto
+import qualified Sound.SC3.Graph.RD_ccomb_m
+import qualified Sound.SC3.Graph.RD_adso
+import qualified Sound.SC3.Graph.RD_lg_timed_m
+import qualified Sound.SC3.Graph.RD_three_cpsw_m
+import qualified Sound.SC3.Graph.RD_vlc_distrtn_m
+import qualified Sound.SC3.Graph.RD_implosion_m
+import qualified Sound.SC3.Graph.RD_discretion_m
+import qualified Sound.SC3.Graph.RD_diffraction_m
+import qualified Sound.SC3.Graph.RD_e_lamell_p
+import qualified Sound.SC3.Graph.RD_tgb_m
+import qualified Sound.SC3.Graph.RD_discretion
+import qualified Sound.SC3.Graph.RD_s_chirp
+import qualified Sound.SC3.Graph.RD_lso_061101_m
+import qualified Sound.SC3.Graph.RD_vla_addtn_sharc
+import qualified Sound.SC3.Graph.RD_cut_outs_m
+import qualified Sound.SC3.Graph.RD_vla_addtn
+import qualified Sound.SC3.Graph.RD_chrd_t
+import qualified Sound.SC3.Graph.RD_tr_out_m
+import qualified Sound.SC3.Graph.RD_crotale_sine
+import qualified Sound.SC3.Graph.RD_fm_kltr_p
+import qualified Sound.SC3.Graph.RD_fm_kltr_m
+import qualified Sound.SC3.Graph.RD_rzblp_hp
+import qualified Sound.SC3.Graph.RD_mouse_clatter_m
+import qualified Sound.SC3.Graph.RD_xy_interference
+import qualified Sound.SC3.Graph.RD_waveset
+import qualified Sound.SC3.Graph.RD_cds_070701_m
+import qualified Sound.SC3.Graph.RD_fb_090531
+import qualified Sound.SC3.Graph.RD_fbl_fbf
+import qualified Sound.SC3.Graph.RD_k_ppr
+import qualified Sound.SC3.Graph.RD_tipnso
+import qualified Sound.SC3.Graph.RD_thb
+import qualified Sound.SC3.Graph.RD_nharm_m
+import qualified Sound.SC3.Graph.RD_wial_m
+import qualified Sound.SC3.Graph.RD_fwalk_m
+import qualified Sound.SC3.Graph.RD_trmlo_u
+import qualified Sound.SC3.Graph.RD_chrd_m
+import qualified Sound.SC3.Graph.RD_h_chatter_m
+import qualified Sound.SC3.Graph.RD_sosc_lp_m
+import qualified Sound.SC3.Graph.RD_feedr_m
+import qualified Sound.SC3.Graph.RD_crotale
+import qualified Sound.SC3.Graph.RD_rzblp
+import qualified Sound.SC3.Graph.RD_cricket_m
+import qualified Sound.SC3.Graph.RD_tgr_rpr_m
+import qualified Sound.SC3.Graph.RD_for_ann
+import qualified Sound.SC3.Graph.RD_fm_iter
+import qualified Sound.SC3.Graph.RD_k_ppr_m
+import qualified Sound.SC3.Graph.RD_klink
+import qualified Sound.SC3.Graph.RD_f_lets_m
+import qualified Sound.SC3.Graph.RD_urandom
+import qualified Sound.SC3.Graph.RD_lf_pulses
+import qualified Sound.SC3.Graph.RD_trkl_m
+import qualified Sound.SC3.Graph.RD_xy_interference_m
+import qualified Sound.SC3.Graph.RD_voscil_u
+import qualified Sound.SC3.Graph.RD_voscil
+import qualified Sound.SC3.Graph.RD_eggcrate_m
+import qualified Sound.SC3.Graph.RD_rzblp_u
+import qualified Sound.SC3.Graph.RD_shifting_pulses_m
+import qualified Sound.SC3.Graph.RD_scritto_m
+import qualified Sound.SC3.Graph.RD_rzblp_m
+import qualified Sound.SC3.Graph.RD_eggcrate
+import qualified Sound.SC3.Graph.RD_tgrn
+import qualified Sound.SC3.Graph.RD_seqr
+import qualified Sound.SC3.Graph.RD_pattern_buffer_m
+import qualified Sound.SC3.Graph.RD_nharm_p
+import qualified Sound.SC3.Graph.RD_trmlo
+import qualified Sound.SC3.Graph.RD_lin_sosc
+import qualified Sound.SC3.Graph.RD_e_lamell
+import qualified Sound.SC3.Graph.SC_bottle_m
+import qualified Sound.SC3.Graph.SP_insects_m
+import qualified Sound.SC3.Graph.TM_drummer
+
+main :: IO ()
+main = do
+  a <- getArgs
+  case a of
+    ["bit-reduction"] -> Sound.SC3.Graph.ADC_bit_reduction.main
+    ["kabelscahden"] -> Sound.SC3.Graph.ADC_kabelscahden.main
+    ["shepard-tones"] -> Sound.SC3.Graph.ADC_shepard_tones.main
+    ["karplus-strong"] -> Sound.SC3.Graph.AM_karplus_strong.main
+    ["rm-octaver"] -> Sound.SC3.Graph.AV_rm_octaver.main
+    ["sinusdeklinationen"] -> Sound.SC3.Graph.F0_sinusdeklinationen.main
+    ["f0-tw0051"] -> Sound.SC3.Graph.F0_f0_tw0051.main
+    ["pkt-07"] -> Sound.SC3.Graph.F0_pkt_07.main
+    ["f0-tw0030"] -> Sound.SC3.Graph.F0_f0_tw0030.main
+    ["f0-tw0011"] -> Sound.SC3.Graph.F0_f0_tw0011.main
+    ["f0-tw0033"] -> Sound.SC3.Graph.F0_f0_tw0033.main
+    ["f0-2012-04-19"] -> Sound.SC3.Graph.F0_f0_2012_04_19.main
+    ["f0-tw0077"] -> Sound.SC3.Graph.F0_f0_tw0077.main
+    ["1-4Q6"] -> Sound.SC3.Graph.F0_1_4Q6.main
+    ["red-frik-m"] -> Sound.SC3.Graph.F0_red_frik_m.main
+    ["pkt-26"] -> Sound.SC3.Graph.F0_pkt_26.main
+    ["f0-tw0020"] -> Sound.SC3.Graph.F0_f0_tw0020.main
+    ["pkt-28"] -> Sound.SC3.Graph.F0_pkt_28.main
+    ["hansm"] -> Sound.SC3.Graph.F0_hansm.main
+    ["pkt-00"] -> Sound.SC3.Graph.F0_pkt_00.main
+    ["f0-tw0045"] -> Sound.SC3.Graph.F0_f0_tw0045.main
+    ["f0-tw0049"] -> Sound.SC3.Graph.F0_f0_tw0049.main
+    ["f0-tw0014"] -> Sound.SC3.Graph.F0_f0_tw0014.main
+    ["f0-tw0084"] -> Sound.SC3.Graph.F0_f0_tw0084.main
+    ["buffer-display"] -> Sound.SC3.Graph.F0_buffer_display.main
+    ["f0-tw0028"] -> Sound.SC3.Graph.F0_f0_tw0028.main
+    ["1-4Qx"] -> Sound.SC3.Graph.JAR_1_4Qx.main
+    ["bohlen-pierce-140"] -> Sound.SC3.Graph.JJ_bohlen_pierce_140.main
+    ["dark-sea-horns-hp"] -> Sound.SC3.Graph.JL_dark_sea_horns_hp.main
+    ["pwm-crossfade"] -> Sound.SC3.Graph.JL_pwm_crossfade.main
+    ["rain-thunder"] -> Sound.SC3.Graph.JL_rain_thunder.main
+    ["jl-1-Z"] -> Sound.SC3.Graph.JL_jl_1_Z.main
+    ["bitwise"] -> Sound.SC3.Graph.JL_bitwise.main
+    ["dark-sea-horns"] -> Sound.SC3.Graph.JL_dark_sea_horns.main
+    ["tsort"] -> Sound.SC3.Graph.JMCC_tsort.main
+    ["police-state"] -> Sound.SC3.Graph.JMCC_police_state.main
+    ["wind-metals-m"] -> Sound.SC3.Graph.JMCC_wind_metals_m.main
+    ["babbling-brook-m"] -> Sound.SC3.Graph.JMCC_babbling_brook_m.main
+    ["random-pulsations"] -> Sound.SC3.Graph.JMCC_random_pulsations.main
+    ["moto-rev"] -> Sound.SC3.Graph.JMCC_moto_rev.main
+    ["sprinkler-m"] -> Sound.SC3.Graph.JMCC_sprinkler_m.main
+    ["demanding-studies"] -> Sound.SC3.Graph.JMCC_demanding_studies.main
+    ["why-supercollider"] -> Sound.SC3.Graph.JMCC_why_supercollider.main
+    ["deep-trip"] -> Sound.SC3.Graph.JMCC_deep_trip.main
+    ["alien-meadow"] -> Sound.SC3.Graph.JMCC_alien_meadow.main
+    ["snare-909"] -> Sound.SC3.Graph.JMCC_snare_909.main
+    ["uplink-hp"] -> Sound.SC3.Graph.JMCC_uplink_hp.main
+    ["noise-burst-sweep"] -> Sound.SC3.Graph.JMCC_noise_burst_sweep.main
+    ["random-sine-waves-she"] -> Sound.SC3.Graph.JMCC_random_sine_waves_she.main
+    ["data-space"] -> Sound.SC3.Graph.JMCC_data_space.main
+    ["police-state-m"] -> Sound.SC3.Graph.JMCC_police_state_m.main
+    ["default"] -> Sound.SC3.Graph.JMCC_default.main
+    ["hell-is-busy"] -> Sound.SC3.Graph.JMCC_hell_is_busy.main
+    ["noise-modulated-sines"] -> Sound.SC3.Graph.JMCC_noise_modulated_sines.main
+    ["clustered-sines-m"] -> Sound.SC3.Graph.JMCC_clustered_sines_m.main
+    ["coolant"] -> Sound.SC3.Graph.JMCC_coolant.main
+    ["harmonic-tumbling-m"] -> Sound.SC3.Graph.JMCC_harmonic_tumbling_m.main
+    ["slow-beating-harmonic-sines"] -> Sound.SC3.Graph.JMCC_slow_beating_harmonic_sines.main
+    ["tremulate-hp"] -> Sound.SC3.Graph.JMCC_tremulate_hp.main
+    ["resonant-dust"] -> Sound.SC3.Graph.JMCC_resonant_dust.main
+    ["harmonic-swimming-m"] -> Sound.SC3.Graph.JMCC_harmonic_swimming_m.main
+    ["synthetic-piano-m"] -> Sound.SC3.Graph.JMCC_synthetic_piano_m.main
+    ["sawed-cymbals"] -> Sound.SC3.Graph.JMCC_sawed_cymbals.main
+    ["tank-m"] -> Sound.SC3.Graph.JMCC_tank_m.main
+    ["clustered-sines"] -> Sound.SC3.Graph.JMCC_clustered_sines.main
+    ["scratchy-m"] -> Sound.SC3.Graph.JMCC_scratchy_m.main
+    ["aleatoric-quartet-m"] -> Sound.SC3.Graph.JMCC_aleatoric_quartet_m.main
+    ["spe-m"] -> Sound.SC3.Graph.JMCC_spe_m.main
+    ["what-was-i-thinking-m"] -> Sound.SC3.Graph.JMCC_what_was_i_thinking_m.main
+    ["pond-life-hp"] -> Sound.SC3.Graph.JMCC_pond_life_hp.main
+    ["slow-beating-sines"] -> Sound.SC3.Graph.JMCC_slow_beating_sines.main
+    ["spe-p"] -> Sound.SC3.Graph.JMCC_spe_p.main
+    ["pulsing-bottles-m"] -> Sound.SC3.Graph.JMCC_pulsing_bottles_m.main
+    ["early-space-music-lp-side-two"] -> Sound.SC3.Graph.JMCC_early_space_music_lp_side_two.main
+    ["random-panning-sines-m"] -> Sound.SC3.Graph.JMCC_random_panning_sines_m.main
+    ["bowed-string-m"] -> Sound.SC3.Graph.JMCC_bowed_string_m.main
+    ["random-panning-sines"] -> Sound.SC3.Graph.JMCC_random_panning_sines.main
+    ["sidereal-time-hp"] -> Sound.SC3.Graph.JMCC_sidereal_time_hp.main
+    ["string-wander-cluster"] -> Sound.SC3.Graph.JMCC_string_wander_cluster.main
+    ["alien-froggies"] -> Sound.SC3.Graph.JMCC_alien_froggies.main
+    ["pulsing-bottles"] -> Sound.SC3.Graph.JMCC_pulsing_bottles.main
+    ["strummable-guitar"] -> Sound.SC3.Graph.JMCC_strummable_guitar.main
+    ["overlap-add"] -> Sound.SC3.Graph.JMCC_overlap_add.main
+    ["choip"] -> Sound.SC3.Graph.JMCC_choip.main
+    ["sprinkler"] -> Sound.SC3.Graph.JMCC_sprinkler.main
+    ["rails"] -> Sound.SC3.Graph.JMCC_rails.main
+    ["pond-life"] -> Sound.SC3.Graph.JMCC_pond_life.main
+    ["comb-delay-sweeps"] -> Sound.SC3.Graph.JMCC_comb_delay_sweeps.main
+    ["tank-hp"] -> Sound.SC3.Graph.JMCC_tank_hp.main
+    ["harmonic-swimming"] -> Sound.SC3.Graph.JMCC_harmonic_swimming.main
+    ["random-sine-waves"] -> Sound.SC3.Graph.JMCC_random_sine_waves.main
+    ["modal-space"] -> Sound.SC3.Graph.JMCC_modal_space.main
+    ["lfo-modulation"] -> Sound.SC3.Graph.JMCC_lfo_modulation.main
+    ["cymbalism-accelerando"] -> Sound.SC3.Graph.JMCC_cymbalism_accelerando.main
+    ["plucked-strings-m"] -> Sound.SC3.Graph.JMCC_plucked_strings_m.main
+    ["uplink"] -> Sound.SC3.Graph.JMCC_uplink.main
+    ["sweepy-noise"] -> Sound.SC3.Graph.JMCC_sweepy_noise.main
+    ["random-sine-waves-hp"] -> Sound.SC3.Graph.JMCC_random_sine_waves_hp.main
+    ["analog-bubbles"] -> Sound.SC3.Graph.JMCC_analog_bubbles.main
+    ["resonant-dust-hp"] -> Sound.SC3.Graph.JMCC_resonant_dust_hp.main
+    ["birds-hp"] -> Sound.SC3.Graph.JMCC_birds_hp.main
+    ["ring-modulated-klank"] -> Sound.SC3.Graph.JMCC_ring_modulated_klank.main
+    ["tremulate-m"] -> Sound.SC3.Graph.JMCC_tremulate_m.main
+    ["tank"] -> Sound.SC3.Graph.JMCC_tank.main
+    ["reverberated-sine-percussion-hp"] -> Sound.SC3.Graph.JMCC_reverberated_sine_percussion_hp.main
+    ["theremin"] -> Sound.SC3.Graph.JMCC_theremin.main
+    ["data-space-hp"] -> Sound.SC3.Graph.JMCC_data_space_hp.main
+    ["mridangam"] -> Sound.SC3.Graph.JMCC_mridangam.main
+    ["reverberated-sine-percussion-m"] -> Sound.SC3.Graph.JMCC_reverberated_sine_percussion_m.main
+    ["doppler"] -> Sound.SC3.Graph.JMCC_doppler.main
+    ["scratchy"] -> Sound.SC3.Graph.JMCC_scratchy.main
+    ["sidereal-time"] -> Sound.SC3.Graph.JMCC_sidereal_time.main
+    ["birds-m"] -> Sound.SC3.Graph.JMCC_birds_m.main
+    ["sample-and-hold-liquidities"] -> Sound.SC3.Graph.JMCC_sample_and_hold_liquidities.main
+    ["tremulate"] -> Sound.SC3.Graph.JMCC_tremulate.main
+    ["contamination-zone"] -> Sound.SC3.Graph.JMCC_contamination_zone.main
+    ["saucer-base"] -> Sound.SC3.Graph.JMCC_saucer_base.main
+    ["cymbalism-m"] -> Sound.SC3.Graph.JMCC_cymbalism_m.main
+    ["record-scratcher"] -> Sound.SC3.Graph.JP_record_scratcher.main
+    ["chain-saw-m"] -> Sound.SC3.Graph.JRHB_chain_saw_m.main
+    ["black-atlantic-currents"] -> Sound.SC3.Graph.JRHB_black_atlantic_currents.main
+    ["deep-sea"] -> Sound.SC3.Graph.JRHB_deep_sea.main
+    ["half-life"] -> Sound.SC3.Graph.JRHB_half_life.main
+    ["dial-history-m"] -> Sound.SC3.Graph.JRHB_dial_history_m.main
+    ["sam-i-am"] -> Sound.SC3.Graph.JRHB_sam_i_am.main
+    ["one-line"] -> Sound.SC3.Graph.LJP_one_line.main
+    ["k2ws"] -> Sound.SC3.Graph.MN_k2ws.main
+    ["k2ws-hp"] -> Sound.SC3.Graph.MN_k2ws_hp.main
+    ["after-goeyvaerts"] -> Sound.SC3.Graph.NC_after_goeyvaerts.main
+    ["arpeggio"] -> Sound.SC3.Graph.NC_arpeggio.main
+    ["ellipse-based-synthesis"] -> Sound.SC3.Graph.NC_ellipse_based_synthesis.main
+    ["pebble-beach"] -> Sound.SC3.Graph.NP_pebble_beach.main
+    ["nv-tw-54"] -> Sound.SC3.Graph.NV_nv_tw_54.main
+    ["nv-tw-41"] -> Sound.SC3.Graph.NV_nv_tw_41.main
+    ["nv-tw-1"] -> Sound.SC3.Graph.NV_nv_tw_1.main
+    ["thx"] -> Sound.SC3.Graph.PC_thx.main
+    ["forest-sounds-m"] -> Sound.SC3.Graph.PJ_forest_sounds_m.main
+    ["hh-808"] -> Sound.SC3.Graph.RB_hh_808.main
+    ["bs-070705-m"] -> Sound.SC3.Graph.RD_bs_070705_m.main
+    ["scritto"] -> Sound.SC3.Graph.RD_scritto.main
+    ["ccomb-m"] -> Sound.SC3.Graph.RD_ccomb_m.main
+    ["adso"] -> Sound.SC3.Graph.RD_adso.main
+    ["lg-timed-m"] -> Sound.SC3.Graph.RD_lg_timed_m.main
+    ["three-cpsw-m"] -> Sound.SC3.Graph.RD_three_cpsw_m.main
+    ["vlc-distrtn-m"] -> Sound.SC3.Graph.RD_vlc_distrtn_m.main
+    ["implosion-m"] -> Sound.SC3.Graph.RD_implosion_m.main
+    ["discretion-m"] -> Sound.SC3.Graph.RD_discretion_m.main
+    ["diffraction-m"] -> Sound.SC3.Graph.RD_diffraction_m.main
+    ["e-lamell-p"] -> Sound.SC3.Graph.RD_e_lamell_p.main
+    ["tgb-m"] -> Sound.SC3.Graph.RD_tgb_m.main
+    ["discretion"] -> Sound.SC3.Graph.RD_discretion.main
+    ["s-chirp"] -> Sound.SC3.Graph.RD_s_chirp.main
+    ["lso-061101-m"] -> Sound.SC3.Graph.RD_lso_061101_m.main
+    ["vla-addtn-sharc"] -> Sound.SC3.Graph.RD_vla_addtn_sharc.main
+    ["cut-outs-m"] -> Sound.SC3.Graph.RD_cut_outs_m.main
+    ["vla-addtn"] -> Sound.SC3.Graph.RD_vla_addtn.main
+    ["chrd-t"] -> Sound.SC3.Graph.RD_chrd_t.main
+    ["tr-out-m"] -> Sound.SC3.Graph.RD_tr_out_m.main
+    ["crotale-sine"] -> Sound.SC3.Graph.RD_crotale_sine.main
+    ["fm-kltr-p"] -> Sound.SC3.Graph.RD_fm_kltr_p.main
+    ["fm-kltr-m"] -> Sound.SC3.Graph.RD_fm_kltr_m.main
+    ["rzblp-hp"] -> Sound.SC3.Graph.RD_rzblp_hp.main
+    ["mouse-clatter-m"] -> Sound.SC3.Graph.RD_mouse_clatter_m.main
+    ["xy-interference"] -> Sound.SC3.Graph.RD_xy_interference.main
+    ["waveset"] -> Sound.SC3.Graph.RD_waveset.main
+    ["cds-070701-m"] -> Sound.SC3.Graph.RD_cds_070701_m.main
+    ["fb-090531"] -> Sound.SC3.Graph.RD_fb_090531.main
+    ["fbl-fbf"] -> Sound.SC3.Graph.RD_fbl_fbf.main
+    ["k-ppr"] -> Sound.SC3.Graph.RD_k_ppr.main
+    ["tipnso"] -> Sound.SC3.Graph.RD_tipnso.main
+    ["thb"] -> Sound.SC3.Graph.RD_thb.main
+    ["nharm-m"] -> Sound.SC3.Graph.RD_nharm_m.main
+    ["wial-m"] -> Sound.SC3.Graph.RD_wial_m.main
+    ["fwalk-m"] -> Sound.SC3.Graph.RD_fwalk_m.main
+    ["trmlo-u"] -> Sound.SC3.Graph.RD_trmlo_u.main
+    ["chrd-m"] -> Sound.SC3.Graph.RD_chrd_m.main
+    ["h-chatter-m"] -> Sound.SC3.Graph.RD_h_chatter_m.main
+    ["sosc-lp-m"] -> Sound.SC3.Graph.RD_sosc_lp_m.main
+    ["feedr-m"] -> Sound.SC3.Graph.RD_feedr_m.main
+    ["crotale"] -> Sound.SC3.Graph.RD_crotale.main
+    ["rzblp"] -> Sound.SC3.Graph.RD_rzblp.main
+    ["cricket-m"] -> Sound.SC3.Graph.RD_cricket_m.main
+    ["tgr-rpr-m"] -> Sound.SC3.Graph.RD_tgr_rpr_m.main
+    ["for-ann"] -> Sound.SC3.Graph.RD_for_ann.main
+    ["fm-iter"] -> Sound.SC3.Graph.RD_fm_iter.main
+    ["k-ppr-m"] -> Sound.SC3.Graph.RD_k_ppr_m.main
+    ["klink"] -> Sound.SC3.Graph.RD_klink.main
+    ["f-lets-m"] -> Sound.SC3.Graph.RD_f_lets_m.main
+    ["urandom"] -> Sound.SC3.Graph.RD_urandom.main
+    ["lf-pulses"] -> Sound.SC3.Graph.RD_lf_pulses.main
+    ["trkl-m"] -> Sound.SC3.Graph.RD_trkl_m.main
+    ["xy-interference-m"] -> Sound.SC3.Graph.RD_xy_interference_m.main
+    ["voscil-u"] -> Sound.SC3.Graph.RD_voscil_u.main
+    ["voscil"] -> Sound.SC3.Graph.RD_voscil.main
+    ["eggcrate-m"] -> Sound.SC3.Graph.RD_eggcrate_m.main
+    ["rzblp-u"] -> Sound.SC3.Graph.RD_rzblp_u.main
+    ["shifting-pulses-m"] -> Sound.SC3.Graph.RD_shifting_pulses_m.main
+    ["scritto-m"] -> Sound.SC3.Graph.RD_scritto_m.main
+    ["rzblp-m"] -> Sound.SC3.Graph.RD_rzblp_m.main
+    ["eggcrate"] -> Sound.SC3.Graph.RD_eggcrate.main
+    ["tgrn"] -> Sound.SC3.Graph.RD_tgrn.main
+    ["seqr"] -> Sound.SC3.Graph.RD_seqr.main
+    ["pattern-buffer-m"] -> Sound.SC3.Graph.RD_pattern_buffer_m.main
+    ["nharm-p"] -> Sound.SC3.Graph.RD_nharm_p.main
+    ["trmlo"] -> Sound.SC3.Graph.RD_trmlo.main
+    ["lin-sosc"] -> Sound.SC3.Graph.RD_lin_sosc.main
+    ["e-lamell"] -> Sound.SC3.Graph.RD_e_lamell.main
+    ["bottle-m"] -> Sound.SC3.Graph.SC_bottle_m.main
+    ["insects-m"] -> Sound.SC3.Graph.SP_insects_m.main
+    ["drummer"] -> Sound.SC3.Graph.TM_drummer.main
+    _ -> putStrLn "hsc3-graphs graph\n1-4Q6, 1-4Qx, adso, after-goeyvaerts, aleatoric-quartet-m, alien-froggies, alien-meadow, analog-bubbles, arpeggio, babbling-brook-m, birds-hp, birds-m, bit-reduction, bitwise, black-atlantic-currents, bohlen-pierce-140, bottle-m, bowed-string-m, bs-070705-m, buffer-display, ccomb-m, cds-070701-m, chain-saw-m, choip, chrd-m, chrd-t, clustered-sines, clustered-sines-m, comb-delay-sweeps, contamination-zone, coolant, cricket-m, crotale, crotale-sine, cut-outs-m, cymbalism-accelerando, cymbalism-m, dark-sea-horns, dark-sea-horns-hp, data-space, data-space-hp, deep-sea, deep-trip, default, demanding-studies, dial-history-m, diffraction-m, discretion, discretion-m, doppler, drummer, e-lamell, e-lamell-p, early-space-music-lp-side-two, eggcrate, eggcrate-m, ellipse-based-synthesis, f-lets-m, f0-2012-04-19, f0-tw0011, f0-tw0014, f0-tw0020, f0-tw0028, f0-tw0030, f0-tw0033, f0-tw0045, f0-tw0049, f0-tw0051, f0-tw0077, f0-tw0084, fb-090531, fbl-fbf, feedr-m, fm-iter, fm-kltr-m, fm-kltr-p, for-ann, forest-sounds-m, fwalk-m, h-chatter-m, half-life, hansm, harmonic-swimming, harmonic-swimming-m, harmonic-tumbling-m, hell-is-busy, hh-808, implosion-m, insects-m, jl-1-Z, k-ppr, k-ppr-m, k2ws, k2ws-hp, kabelscahden, karplus-strong, klink, lf-pulses, lfo-modulation, lg-timed-m, lin-sosc, lso-061101-m, modal-space, moto-rev, mouse-clatter-m, mridangam, nharm-m, nharm-p, noise-burst-sweep, noise-modulated-sines, nv-tw-1, nv-tw-41, nv-tw-54, one-line, overlap-add, pattern-buffer-m, pebble-beach, pkt-00, pkt-07, pkt-26, pkt-28, plucked-strings-m, police-state, police-state-m, pond-life, pond-life-hp, pulsing-bottles, pulsing-bottles-m, pwm-crossfade, rails, rain-thunder, random-panning-sines, random-panning-sines-m, random-pulsations, random-sine-waves, random-sine-waves-hp, random-sine-waves-she, record-scratcher, red-frik-m, resonant-dust, resonant-dust-hp, reverberated-sine-percussion-hp, reverberated-sine-percussion-m, ring-modulated-klank, rm-octaver, rzblp, rzblp-hp, rzblp-m, rzblp-u, s-chirp, sam-i-am, sample-and-hold-liquidities, saucer-base, sawed-cymbals, scratchy, scratchy-m, scritto, scritto-m, seqr, shepard-tones, shifting-pulses-m, sidereal-time, sidereal-time-hp, sinusdeklinationen, slow-beating-harmonic-sines, slow-beating-sines, snare-909, sosc-lp-m, spe-m, spe-p, sprinkler, sprinkler-m, string-wander-cluster, strummable-guitar, sweepy-noise, synthetic-piano-m, tank, tank-hp, tank-m, tgb-m, tgr-rpr-m, tgrn, thb, theremin, three-cpsw-m, thx, tipnso, tr-out-m, tremulate, tremulate-hp, tremulate-m, trkl-m, trmlo, trmlo-u, tsort, uplink, uplink-hp, urandom, vla-addtn, vla-addtn-sharc, vlc-distrtn-m, voscil, voscil-u, waveset, what-was-i-thinking-m, why-supercollider, wial-m, wind-metals-m, xy-interference, xy-interference-m"
diff --git a/hs/mk-ix.hs b/hs/mk-ix.hs
new file mode 100644
--- /dev/null
+++ b/hs/mk-ix.hs
@@ -0,0 +1,75 @@
+import Data.List {- base -}
+import Data.Maybe {- base -}
+import System.Directory  {- directory -}
+import System.Environment  {- base -}
+import System.FilePath  {- filepath -}
+import Text.Printf {- base -}
+
+import L
+
+-- (home,hs-project,use-html?,use-scm?)
+type State = (FilePath,FilePath,Bool,Bool)
+
+link :: FilePath -> FilePath -> String -> IO (Maybe String)
+link h p c = do
+  e <- doesFileExist (h </> p)
+  let r = if e then Just (printf "[%s](%s)" c p) else Nothing
+  return r
+
+type M_Str = Maybe String
+type HS_LN = [M_Str]
+
+alternates :: [String]
+alternates = ["m","u","hp","she","p"]
+
+alternates' :: [String]
+alternates' = map ('-':) alternates
+
+hs_plain :: State -> FilePath -> IO HS_LN
+hs_plain (hm,pr,_,_) nm = do
+  let gr = pr </> "gr"
+      alt k = link hm (gr </> nm ++ "-" ++ k <.> "hs") (k </> "hs")
+  hs <- link hm (gr </> nm <.> "hs") "hs"
+  a <- mapM alt alternates
+  return (hs : a)
+
+hs_html :: State -> FilePath -> IO HS_LN
+hs_html (hm,pr,_,_) nm = do
+  let ht = pr </> "html"
+      alt k = link hm (ht </> nm ++ "-" ++ k <.> "hs.html") (k </> "hs")
+  hs <- link hm (ht </> nm <.> "hs.html") "hs"
+  a <- mapM alt alternates
+  return (hs : a)
+
+entry :: State -> String -> IO String
+entry st nm = do
+  let (hm,pr,use_html,use_scm) = st
+  hs <- if use_html
+        then hs_html st nm
+        else hs_plain st nm
+  scd <- link hm (pr </> "gr" </> nm <.> "scd") "scd"
+  scm <- if use_scm
+         then link hm ("sw/rsc3/help/graph" </> nm <.> "scm") "scm"
+         else return Nothing
+  dot <- link hm (pr </> "dot" </> nm <.> "dot") "dot"
+  pdf <- link hm (pr </> "pdf" </> nm <.> "pdf") "pdf"
+  svg <- link hm (pr </> "svg" </> nm <.> "svg") "svg"
+  let ln = intercalate "," (catMaybes (hs ++ [scd,scm,dot,pdf,svg]))
+  return (printf "- %s [%s]" nm ln)
+
+-- > mk_ix ("/home/rohan","sw/hsc3-graphs",True,True)
+mk_ix :: State -> IO ()
+mk_ix st = do
+  let (hm,pr,_,_) = st
+  d <- getDirectoryContents (hm </> pr </> "gr")
+  let hs = mapMaybe (stripSuffix ".hs") (filter (".hs" `isSuffixOf`) d)
+      nm = map (strip_suffix_or_id alternates') hs
+  e <- mapM (entry st)(nub (sort nm))
+  writeFile (hm </> pr </> "md/ix.md") (unlines e)
+
+main :: IO ()
+main = do
+  [pr] <- getArgs
+  hm <- getHomeDirectory
+  let st = (hm,pr,True,True)
+  mk_ix st
diff --git a/hs/mk-lib.hs b/hs/mk-lib.hs
new file mode 100644
--- /dev/null
+++ b/hs/mk-lib.hs
@@ -0,0 +1,89 @@
+import Data.Char {- base -}
+import Data.Function {- base -}
+import Data.List {- base -}
+import Data.Maybe {- base -}
+import System.Directory  {- directory -}
+import System.FilePath  {- filepath -}
+import System.IO {- base -}
+import Text.Printf {- base -}
+import Text.Regex {- regex-compat -}
+
+import L
+
+dir :: FilePath
+dir = "sw/hsc3-graphs"
+
+-- (Name,Author)
+type GR = (String,String)
+
+gr_name :: FilePath -> FilePath -> FilePath
+gr_name h nm = h </> dir </> "gr" </> nm <.> "hs"
+
+author :: FilePath -> String -> IO (Maybe GR)
+author h nm = do
+  let nm' = fromMaybe (error "not hs") (stripSuffix ".hs" nm)
+  fd <- openFile (gr_name h nm') ReadMode
+  ln <- hGetLine fd
+  hClose fd
+  let r = mkRegex "[^(]*\\(([^)]*)"
+  case matchRegex r ln of
+    Just [au] -> return (Just (nm',au))
+    _ -> return Nothing
+
+to_underscore :: Char -> Char
+to_underscore c =
+    case c of
+      '-' -> '_'
+      _ -> c
+
+fix_gr :: GR -> GR
+fix_gr (nm,au) =
+    let au' = map toUpper au
+        nm' = map to_underscore nm
+    in (nm',au')
+
+mod_name :: GR -> String
+mod_name gr =
+    let (nm,au) = fix_gr gr
+    in printf "Sound.SC3.Graph.%s_%s" au nm
+
+gen_mod :: FilePath -> GR -> IO ()
+gen_mod h gr = do
+  let m_nm = mod_name gr
+      (nm,_) = gr
+      (nm',au') = fix_gr gr
+      m = au' ++ "_" ++ nm'
+  putStrLn ("                   " ++ m_nm ++ ",")
+  c <- readFile (gr_name h nm)
+  let (p,q) = span (not . null) (lines c)
+      c' = unlines (p ++ [printf "module %s where" m_nm] ++ q)
+  writeFile (h </> dir </> "Sound/SC3/Graph" </> m <.> "hs") c'
+
+gen_hsc3_graphs :: [GR] -> String
+gen_hsc3_graphs gr_seq =
+    let mk_import gr = "import qualified " ++ mod_name gr
+        mk_case_stmt gr = let (nm,_) = gr
+                              m_nm = mod_name gr
+                          in printf "    [\"%s\"] -> %s.main" nm m_nm
+        usage = "hsc3-graphs graph\\n" ++
+                intercalate ", " (sort (map fst gr_seq))
+    in unlines (["import System.Environment {- base -}"
+                ,""] ++
+                map mk_import gr_seq ++
+                [""
+                ,"main :: IO ()"
+                ,"main = do"
+                ,"  a <- getArgs"
+                ,"  case a of"] ++
+                map mk_case_stmt gr_seq ++
+                [printf "    _ -> putStrLn \"%s\"" usage])
+
+main :: IO ()
+main = do
+  h <- getHomeDirectory
+  d <- getDirectoryContents (h </> dir </> "gr")
+  let hs = filter (".hs" `isSuffixOf`) d
+  au <- mapM (author h) hs
+  let au' = sortBy (compare `on` snd) (catMaybes au)
+  mapM_ (gen_mod h) au'
+  writeFile (h </> dir </> "hs/hsc3-graphs.hs") (gen_hsc3_graphs au')
diff --git a/hsc3-graphs.cabal b/hsc3-graphs.cabal
--- a/hsc3-graphs.cabal
+++ b/hsc3-graphs.cabal
@@ -1,648 +1,1405 @@
 Name:              hsc3-graphs
-Version:           0.12
-Synopsis:          Haskell SuperCollider Graphs
-Description:       hsc3-graphs provides a collection of illustrative
-                   unit generator graphs for hsc3.
-License:           GPL
-Category:          Sound
-Copyright:         (c) Rohan Drape and others, 2006-2012
-Author:            Rohan Drape
-Maintainer:        rd@slavepianos.org
-Stability:         Experimental
-Homepage:          http://rd.slavepianos.org/?t=hsc3-graphs
-Tested-With:       GHC == 7.6.1
-Build-Type:        Simple
-Cabal-Version:     >= 1.8
-
-Data-files:        README
-                   gr/*.scd
-
-Source-Repository  head
-  Type:            darcs
-  Location:        http://rd.slavepianos.org/sw/hsc3-graphs/
-
--- Auto-generated: Tue Aug 21 14:50:33 EST 2012
-Executable hsc3-1-1Ni
- main-is: gr/1-1Ni.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-1-4Q6
- main-is: gr/1-4Q6.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-1-4QM
- main-is: gr/1-4QM.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang,sc3-rdu
-Executable hsc3-1-4QN
- main-is: gr/1-4QN.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-1-4Qx
- main-is: gr/1-4Qx.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-1-Td
- main-is: gr/1-Td.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang,sc3-rdu
-Executable hsc3-acid-otophilia
- main-is: gr/acid-otophilia.hs
- build-depends: base==4.*,hosc,hsc3,random
-Executable hsc3-adso
- main-is: gr/adso.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-after-goeyvaerts
- main-is: gr/after-goeyvaerts.hs
- build-depends: base==4.*,split,containers,hosc,hsc3,hsc3-lang,random
-Executable hsc3-aleatoric-quartet-m
- main-is: gr/aleatoric-quartet-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-alien-froggies
- main-is: gr/alien-froggies.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-alien-meadow
- main-is: gr/alien-meadow.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-ambient1
- main-is: gr/ambient1.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-analog-bubbles
- main-is: gr/analog-bubbles.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-arpeggio
- main-is: gr/arpeggio.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-babbling-brook-m
- main-is: gr/babbling-brook-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-birds-m
- main-is: gr/birds-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-bit-reduction
- main-is: gr/bit-reduction.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-bitwise
- main-is: gr/bitwise.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-black-atlantic-currents
- main-is: gr/black-atlantic-currents.hs
- build-depends: base==4.*,primes,hsc3,random,random-shuffle
-Executable hsc3-bohlen-pierce-140
- main-is: gr/bohlen-pierce-140.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-bottle-m
- main-is: gr/bottle-m.hs
- build-depends: base==4.*,hsc3-lang,hsc3
-Executable hsc3-bowed-string-m
- main-is: gr/bowed-string-m.hs
- build-depends: base==4.*,hsc3-lang,hsc3
-Executable hsc3-bs-070705
- main-is: gr/bs-070705.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-buffer-display
- main-is: gr/buffer-display.hs
- build-depends: base==4.*,hcg-minus,cmath,cairo,hsc3,hsc3-cairo
-Executable hsc3-ccomb
- main-is: gr/ccomb.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-cds-070701
- main-is: gr/cds-070701.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-chain-saw
- main-is: gr/chain-saw.hs
- build-depends: base==4.*,hsc3-lang,hsc3
-Executable hsc3-choip
- main-is: gr/choip.hs
- build-depends: base==4.*,hsc3,sc3-rdu,hsc3-lang
-Executable hsc3-chrd-m
- main-is: gr/chrd-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-chrd-t
- main-is: gr/chrd-t.hs
- build-depends: base==4.*,MonadRandom,hsc3,hsc3-lang
-Executable hsc3-clustered-sines
- main-is: gr/clustered-sines.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-comb-delay-sweeps
- main-is: gr/comb-delay-sweeps.hs
- build-depends: base==4.*,hsc3,hsc3-lang,random
-Executable hsc3-contamination-zone
- main-is: gr/contamination-zone.hs
- build-depends: base==4.*,hsc3,sc3-rdu,hsc3-lang
-Executable hsc3-coolant
- main-is: gr/coolant.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-cricket-m
- main-is: gr/cricket-m.hs
- build-depends: base==4.*,hsc3-lang,hsc3
-Executable hsc3-crotale
- main-is: gr/crotale.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-crotale-sine
- main-is: gr/crotale-sine.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-cut-outs
- main-is: gr/cut-outs.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-cymbalism-accelerando
- main-is: gr/cymbalism-accelerando.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-cymbalism-m
- main-is: gr/cymbalism-m.hs
- build-depends: base==4.*,hsc3-lang,hsc3
-Executable hsc3-dark-sea-horns
- main-is: gr/dark-sea-horns.hs
- build-depends: base==4.*,hsc3,sc3-rdu
-Executable hsc3-data-space
- main-is: gr/data-space.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-deep-sea
- main-is: gr/deep-sea.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-deep-trip
- main-is: gr/deep-trip.hs
- build-depends: base==4.*,hsc3,sc3-rdu,hsc3-lang
-Executable hsc3-default
- main-is: gr/default.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-demanding-studies
- main-is: gr/demanding-studies.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-dial-history
- main-is: gr/dial-history.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-diffraction
- main-is: gr/diffraction.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-discretion
- main-is: gr/discretion.hs
- build-depends: base==4.*,hsc3,sc3-rdu
-Executable hsc3-discretion-m
- main-is: gr/discretion-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-doppler
- main-is: gr/doppler.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-drummer
- main-is: gr/drummer.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-early-space-music-lp-side-two
- main-is: gr/early-space-music-lp-side-two.hs
- build-depends: base==4.*,hsc3,hsc3-lang,sc3-rdu,random
-Executable hsc3-eggcrate
- main-is: gr/eggcrate.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-eggcrate-m
- main-is: gr/eggcrate-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-e-lamell
- main-is: gr/e-lamell.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-e-lamell-p
- main-is: gr/e-lamell-p.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-ellipse-based-synthesis
- main-is: gr/ellipse-based-synthesis.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-2012-04-19
- main-is: gr/f0-2012-04-19.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0011
- main-is: gr/f0-tw0011.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0014
- main-is: gr/f0-tw0014.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0020
- main-is: gr/f0-tw0020.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0028
- main-is: gr/f0-tw0028.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0030
- main-is: gr/f0-tw0030.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0033
- main-is: gr/f0-tw0033.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0045
- main-is: gr/f0-tw0045.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0049
- main-is: gr/f0-tw0049.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0051
- main-is: gr/f0-tw0051.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0077
- main-is: gr/f0-tw0077.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-f0-tw0084
- main-is: gr/f0-tw0084.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-fb-090531
- main-is: gr/fb-090531.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-fbl-fbf
- main-is: gr/fbl-fbf.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-feedr
- main-is: gr/feedr.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-f-lets
- main-is: gr/f-lets.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-fm-iter
- main-is: gr/fm-iter.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-fm-kltr
- main-is: gr/fm-kltr.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-fm-kltr-p
- main-is: gr/fm-kltr-p.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-for-ann
- main-is: gr/for-ann.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-forest-sounds
- main-is: gr/forest-sounds.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-fwalk
- main-is: gr/fwalk.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-half-life
- main-is: gr/half-life.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-hansm
- main-is: gr/hansm.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-harmonic-swimming
- main-is: gr/harmonic-swimming.hs
- build-depends: base==4.*,hsc3,sc3-rdu
-Executable hsc3-harmonic-swimming-m
- main-is: gr/harmonic-swimming-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-harmonic-tumbling
- main-is: gr/harmonic-tumbling.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-h-chatter
- main-is: gr/h-chatter.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-hell-is-busy
- main-is: gr/hell-is-busy.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-hh-808
- main-is: gr/hh-808.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-implosion
- main-is: gr/implosion.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-insects
- main-is: gr/insects.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-jl-1-Z
- main-is: gr/jl-1-Z.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-k2ws
- main-is: gr/k2ws.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-kabelscahden
- main-is: gr/kabelscahden.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-karplus-strong
- main-is: gr/karplus-strong.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-klink
- main-is: gr/klink.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-k-ppr
- main-is: gr/k-ppr.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-k-ppr-m
- main-is: gr/k-ppr-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-laser-bubble
- main-is: gr/laser-bubble.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-lfo-modulation
- main-is: gr/lfo-modulation.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-lf-pulses
- main-is: gr/lf-pulses.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-lg-timed
- main-is: gr/lg-timed.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-lin-sosc
- main-is: gr/lin-sosc.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-lso-061101
- main-is: gr/lso-061101.hs
- build-depends: base==4.*,hps,hls,hsc3-sf,hsc3,hsc3-lang,directory,filepath
-Executable hsc3-lucier
- main-is: gr/lucier.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-m21360
- main-is: gr/m21360.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-microhelix
- main-is: gr/microhelix.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-modal-space
- main-is: gr/modal-space.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-moto-rev
- main-is: gr/moto-rev.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-mouse-clatter-m
- main-is: gr/mouse-clatter-m.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-mridangam
- main-is: gr/mridangam.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-music-box
- main-is: gr/music-box.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-nharm
- main-is: gr/nharm.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-nharm-p
- main-is: gr/nharm-p.hs
- build-depends: base==4.*,hsc3,sc3-rdu,hsc3-lang
-Executable hsc3-noise-burst-sweep
- main-is: gr/noise-burst-sweep.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-noise-modulated-sines
- main-is: gr/noise-modulated-sines.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-nokia
- main-is: gr/nokia.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-non-real-time
- main-is: gr/non-real-time.hs
- build-depends: base==4.*,hosc,hsc3,process
-Executable hsc3-nv-tw-1
- main-is: gr/nv-tw-1.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-nv-tw-41
- main-is: gr/nv-tw-41.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-nv-tw-54
- main-is: gr/nv-tw-54.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-nx102
- main-is: gr/nx102.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-one-line
- main-is: gr/one-line.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-oscillator-cluster
- main-is: gr/oscillator-cluster.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-overlap-add
- main-is: gr/overlap-add.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-pattern-buffer
- main-is: gr/pattern-buffer.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-pebble-beach
- main-is: gr/pebble-beach.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-pkt-26
- main-is: gr/pkt-26.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-pkt-28
- main-is: gr/pkt-28.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-plucked-strings
- main-is: gr/plucked-strings.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-police-state
- main-is: gr/police-state.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-pond-life
- main-is: gr/pond-life.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-proxy-mixer
- main-is: gr/proxy-mixer.hs
- build-depends: base==4.*,hsc3,sc3-rdu
-Executable hsc3-proxy-mixer-m
- main-is: gr/proxy-mixer-m.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-pulsing-bottles
- main-is: gr/pulsing-bottles.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-pulsing-bottles-m
- main-is: gr/pulsing-bottles-m.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-pwm-crossfade
- main-is: gr/pwm-crossfade.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-rails
- main-is: gr/rails.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-rain-thunder
- main-is: gr/rain-thunder.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-random-panning-sines
- main-is: gr/random-panning-sines.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-random-panning-sines-m
- main-is: gr/random-panning-sines-m.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-random-pulsations
- main-is: gr/random-pulsations.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-random-sine-waves
- main-is: gr/random-sine-waves.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-record-scratcher
- main-is: gr/record-scratcher.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-red-frik
- main-is: gr/red-frik.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-reset
- main-is: gr/reset.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-resonant-dust
- main-is: gr/resonant-dust.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-reverberated-sine-percussion
- main-is: gr/reverberated-sine-percussion.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-ring-modulated-klank
- main-is: gr/ring-modulated-klank.hs
- build-depends: base==4.*,hsc3,sc3-rdu,hsc3-lang
-Executable hsc3-rm-octaver
- main-is: gr/rm-octaver.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-rzblp
- main-is: gr/rzblp.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-rzblp-u
- main-is: gr/rzblp-u.hs
- build-depends: base==4.*,hsc3,hsc3-unsafe
-Executable hsc3-sam-i-am
- main-is: gr/sam-i-am.hs
- build-depends: base==4.*,MonadRandom,base==4.*,hsc3,hsc3-lang
-Executable hsc3-sample-and-hold-liquidities
- main-is: gr/sample-and-hold-liquidities.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-saucer-base
- main-is: gr/saucer-base.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-sawed-cymbals
- main-is: gr/sawed-cymbals.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-s-chirp
- main-is: gr/s-chirp.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-scratchy
- main-is: gr/scratchy.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-scratchy-m
- main-is: gr/scratchy-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-scritto
- main-is: gr/scritto.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-scritto-m
- main-is: gr/scritto-m.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-seqr
- main-is: gr/seqr.hs
- build-depends: base==4.*,hsc3,sc3-rdu
-Executable hsc3-shepard-tones
- main-is: gr/shepard-tones.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-shifting-pulses
- main-is: gr/shifting-pulses.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-sidereal-time
- main-is: gr/sidereal-time.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-sinusdeklinationen
- main-is: gr/sinusdeklinationen.hs
- build-depends: base==4.*,split,hsc3,hsc3-lang
-Executable hsc3-slow-beating-harmonic-sines
- main-is: gr/slow-beating-harmonic-sines.hs
- build-depends: base==4.*,MonadRandom,hsc3,hsc3-lang
-Executable hsc3-slow-beating-sines
- main-is: gr/slow-beating-sines.hs
- build-depends: base==4.*,MonadRandom,hsc3,hsc3-lang
-Executable hsc3-snare-909
- main-is: gr/snare-909.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-sosc-lp
- main-is: gr/sosc-lp.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-spe-m
- main-is: gr/spe-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-spe-p
- main-is: gr/spe-p.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-sprinkler
- main-is: gr/sprinkler.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-sprinkler-m
- main-is: gr/sprinkler-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-string-wander-cluster
- main-is: gr/string-wander-cluster.hs
- build-depends: base==4.*,hsc3,hsc3-lang,random
-Executable hsc3-strummable-guitar
- main-is: gr/strummable-guitar.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-sweepy-noise
- main-is: gr/sweepy-noise.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-synthetic-piano-m
- main-is: gr/synthetic-piano-m.hs
- build-depends: base==4.*,hsc3-lang,hsc3
-Executable hsc3-tank
- main-is: gr/tank.hs
- build-depends: base==4.*,hsc3,sc3-rdu
-Executable hsc3-tank-m
- main-is: gr/tank-m.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-tgb
- main-is: gr/tgb.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-tgrn
- main-is: gr/tgrn.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-tgr-rpr
- main-is: gr/tgr-rpr.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-thb
- main-is: gr/thb.hs
- build-depends: base==4.*,hmt,hsc3,hsc3-lang,hosc
-Executable hsc3-theremin
- main-is: gr/theremin.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-three-cpsw
- main-is: gr/three-cpsw.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-thx
- main-is: gr/thx.hs
- build-depends: base==4.*,hsc3,random
-Executable hsc3-tipnso
- main-is: gr/tipnso.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-train
- main-is: gr/train.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-tremulate
- main-is: gr/tremulate.hs
- build-depends: base==4.*,hsc3,hsc3-lang,sc3-rdu
-Executable hsc3-tremulate-m
- main-is: gr/tremulate-m.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-trkl
- main-is: gr/trkl.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-trmlo
- main-is: gr/trmlo.hs
- build-depends: base==4.*,hsc3,hsc3-unsafe,hsc3-lang
-Executable hsc3-tr-out
- main-is: gr/tr-out.hs
- build-depends: base==4.*,hosc,hsc3
-Executable hsc3-tsort
- main-is: gr/tsort.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-uplink
- main-is: gr/uplink.hs
- build-depends: base==4.*,hsc3,hsc3-lang
-Executable hsc3-urandom
- main-is: gr/urandom.hs
- build-depends: base==4.*,bytestring,hosc,hsc3,hsc3-lang,base
-Executable hsc3-vla-addtn
- main-is: gr/vla-addtn.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-vla-addtn-sharc
- main-is: gr/vla-addtn-sharc.hs
- build-depends: base==4.*,hsharc,hosc,hsc3,hsc3-lang
-Executable hsc3-vlc-distrtn
- main-is: gr/vlc-distrtn.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang
-Executable hsc3-voscil
- main-is: gr/voscil.hs
- build-depends: base==4.*,hosc,hsc3,hsc3-lang,hsc3-unsafe
-Executable hsc3-waveset
- main-is: gr/waveset.hs
- build-depends: base==4.*,array,base==4.*,hsc3-sf,hosc,hsc3,random
-Executable hsc3-what-was-i-thinking
- main-is: gr/what-was-i-thinking.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-why-supercollider
- main-is: gr/why-supercollider.hs
- build-depends: base==4.*,hsc3,sc3-rdu
-Executable hsc3-wial
- main-is: gr/wial.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-wind-metals-m
- main-is: gr/wind-metals-m.hs
- build-depends: base==4.*,hsc3-lang,hsc3
-Executable hsc3-xy-interference
- main-is: gr/xy-interference.hs
- build-depends: base==4.*,hsc3
-Executable hsc3-xy-interference-m
- main-is: gr/xy-interference-m.hs
- build-depends: base==4.*,hsc3
+Version:           0.14
+Synopsis:          Haskell SuperCollider Graphs
+Description:       hsc3-graphs provides a collection of illustrative
+                   unit generator graphs for hsc3.
+License:           GPL
+Category:          Sound
+Copyright:         (c) Rohan Drape and others, 2006-2013
+Author:            Rohan Drape
+Maintainer:        rd@slavepianos.org
+Stability:         Experimental
+Homepage:          http://rd.slavepianos.org/?t=hsc3-graphs
+Tested-With:       GHC == 7.6.1
+Build-Type:        Simple
+Cabal-Version:     >= 1.8
+
+Data-Files:        README
+                   Makefile
+                   css/*.css
+                   gr/*.scd
+                   hs/*.hs
+                   sh/*.sh
+
+Library
+  Build-Depends:   array,
+                   base == 4.*,
+                   bytestring,
+                   cairo,
+                   containers,
+                   data-default,
+                   directory,
+                   filepath,
+                   hls == 0.14.*,
+                   hmt == 0.14.*,
+                   hosc == 0.14.*,
+                   hps == 0.14.*,
+                   hsc3 == 0.14.*,
+                   hsc3-cairo == 0.14.*,
+                   hsc3-lang == 0.14.*,
+                   hsc3-sf == 0.14.*,
+                   hsc3-unsafe == 0.14.*,
+                   hsharc == 0.14.*,
+                   MonadRandom,
+                   primes,
+                   random,
+                   random-shuffle,
+                   sc3-rdu == 0.14.*,
+                   split
+  GHC-Options:     -Wall -fwarn-tabs
+  -- Auto-generated: Fri Apr 5 14:49:03 EST 2013
+  Exposed-Modules: Sound.SC3.Graph.ADC_bit_reduction,
+                   Sound.SC3.Graph.ADC_kabelscahden,
+                   Sound.SC3.Graph.ADC_shepard_tones,
+                   Sound.SC3.Graph.AM_karplus_strong,
+                   Sound.SC3.Graph.AV_rm_octaver,
+                   Sound.SC3.Graph.F0_sinusdeklinationen,
+                   Sound.SC3.Graph.F0_f0_tw0051,
+                   Sound.SC3.Graph.F0_f0_tw0030,
+                   Sound.SC3.Graph.F0_f0_tw0011,
+                   Sound.SC3.Graph.F0_f0_tw0033,
+                   Sound.SC3.Graph.F0_f0_2012_04_19,
+                   Sound.SC3.Graph.F0_f0_tw0077,
+                   Sound.SC3.Graph.F0_1_4Q6,
+                   Sound.SC3.Graph.F0_red_frik_m,
+                   Sound.SC3.Graph.F0_pkt_26,
+                   Sound.SC3.Graph.F0_f0_tw0020,
+                   Sound.SC3.Graph.F0_pkt_28,
+                   Sound.SC3.Graph.F0_hansm,
+                   Sound.SC3.Graph.F0_f0_tw0045,
+                   Sound.SC3.Graph.F0_f0_tw0049,
+                   Sound.SC3.Graph.F0_f0_tw0014,
+                   Sound.SC3.Graph.F0_f0_tw0084,
+                   Sound.SC3.Graph.F0_buffer_display,
+                   Sound.SC3.Graph.F0_f0_tw0028,
+                   Sound.SC3.Graph.JJ_bohlen_pierce_140,
+                   Sound.SC3.Graph.JL_dark_sea_horns_hp,
+                   Sound.SC3.Graph.JL_pwm_crossfade,
+                   Sound.SC3.Graph.JL_rain_thunder,
+                   Sound.SC3.Graph.JL_jl_1_Z,
+                   Sound.SC3.Graph.JL_bitwise,
+                   Sound.SC3.Graph.JL_dark_sea_horns,
+                   Sound.SC3.Graph.JMCC_tsort,
+                   Sound.SC3.Graph.JMCC_police_state,
+                   Sound.SC3.Graph.JMCC_wind_metals_m,
+                   Sound.SC3.Graph.JMCC_babbling_brook_m,
+                   Sound.SC3.Graph.JMCC_random_pulsations,
+                   Sound.SC3.Graph.JMCC_moto_rev,
+                   Sound.SC3.Graph.JMCC_sprinkler_m,
+                   Sound.SC3.Graph.JMCC_demanding_studies,
+                   Sound.SC3.Graph.JMCC_why_supercollider,
+                   Sound.SC3.Graph.JMCC_deep_trip,
+                   Sound.SC3.Graph.JMCC_alien_meadow,
+                   Sound.SC3.Graph.JMCC_snare_909,
+                   Sound.SC3.Graph.JMCC_uplink_hp,
+                   Sound.SC3.Graph.JMCC_noise_burst_sweep,
+                   Sound.SC3.Graph.JMCC_random_sine_waves_she,
+                   Sound.SC3.Graph.JMCC_data_space,
+                   Sound.SC3.Graph.JMCC_police_state_m,
+                   Sound.SC3.Graph.JMCC_default,
+                   Sound.SC3.Graph.JMCC_hell_is_busy,
+                   Sound.SC3.Graph.JMCC_noise_modulated_sines,
+                   Sound.SC3.Graph.JMCC_clustered_sines_m,
+                   Sound.SC3.Graph.JMCC_coolant,
+                   Sound.SC3.Graph.JMCC_harmonic_tumbling_m,
+                   Sound.SC3.Graph.JMCC_slow_beating_harmonic_sines,
+                   Sound.SC3.Graph.JMCC_tremulate_hp,
+                   Sound.SC3.Graph.JMCC_resonant_dust,
+                   Sound.SC3.Graph.JMCC_harmonic_swimming_m,
+                   Sound.SC3.Graph.JMCC_synthetic_piano_m,
+                   Sound.SC3.Graph.JMCC_sawed_cymbals,
+                   Sound.SC3.Graph.JMCC_tank_m,
+                   Sound.SC3.Graph.JMCC_clustered_sines,
+                   Sound.SC3.Graph.JMCC_scratchy_m,
+                   Sound.SC3.Graph.JMCC_aleatoric_quartet_m,
+                   Sound.SC3.Graph.JMCC_spe_m,
+                   Sound.SC3.Graph.JMCC_what_was_i_thinking_m,
+                   Sound.SC3.Graph.JMCC_pond_life_hp,
+                   Sound.SC3.Graph.JMCC_slow_beating_sines,
+                   Sound.SC3.Graph.JMCC_spe_p,
+                   Sound.SC3.Graph.JMCC_pulsing_bottles_m,
+                   Sound.SC3.Graph.JMCC_early_space_music_lp_side_two,
+                   Sound.SC3.Graph.JMCC_random_panning_sines_m,
+                   Sound.SC3.Graph.JMCC_bowed_string_m,
+                   Sound.SC3.Graph.JMCC_random_panning_sines,
+                   Sound.SC3.Graph.JMCC_sidereal_time_hp,
+                   Sound.SC3.Graph.JMCC_string_wander_cluster,
+                   Sound.SC3.Graph.JMCC_alien_froggies,
+                   Sound.SC3.Graph.JMCC_pulsing_bottles,
+                   Sound.SC3.Graph.JMCC_strummable_guitar,
+                   Sound.SC3.Graph.JMCC_choip,
+                   Sound.SC3.Graph.JMCC_sprinkler,
+                   Sound.SC3.Graph.JMCC_rails,
+                   Sound.SC3.Graph.JMCC_pond_life,
+                   Sound.SC3.Graph.JMCC_comb_delay_sweeps,
+                   Sound.SC3.Graph.JMCC_tank_hp,
+                   Sound.SC3.Graph.JMCC_harmonic_swimming,
+                   Sound.SC3.Graph.JMCC_random_sine_waves,
+                   Sound.SC3.Graph.JMCC_modal_space,
+                   Sound.SC3.Graph.JMCC_lfo_modulation,
+                   Sound.SC3.Graph.JMCC_cymbalism_accelerando,
+                   Sound.SC3.Graph.JMCC_plucked_strings_m,
+                   Sound.SC3.Graph.JMCC_uplink,
+                   Sound.SC3.Graph.JMCC_sweepy_noise,
+                   Sound.SC3.Graph.JMCC_random_sine_waves_hp,
+                   Sound.SC3.Graph.JMCC_analog_bubbles,
+                   Sound.SC3.Graph.JMCC_resonant_dust_hp,
+                   Sound.SC3.Graph.JMCC_birds_hp,
+                   Sound.SC3.Graph.JMCC_ring_modulated_klank,
+                   Sound.SC3.Graph.JMCC_tremulate_m,
+                   Sound.SC3.Graph.JMCC_tank,
+                   Sound.SC3.Graph.JMCC_reverberated_sine_percussion_hp,
+                   Sound.SC3.Graph.JMCC_theremin,
+                   Sound.SC3.Graph.JMCC_data_space_hp,
+                   Sound.SC3.Graph.JMCC_mridangam,
+                   Sound.SC3.Graph.JMCC_reverberated_sine_percussion_m,
+                   Sound.SC3.Graph.JMCC_doppler,
+                   Sound.SC3.Graph.JMCC_scratchy,
+                   Sound.SC3.Graph.JMCC_sidereal_time,
+                   Sound.SC3.Graph.JMCC_birds_m,
+                   Sound.SC3.Graph.JMCC_sample_and_hold_liquidities,
+                   Sound.SC3.Graph.JMCC_tremulate,
+                   Sound.SC3.Graph.JMCC_contamination_zone,
+                   Sound.SC3.Graph.JMCC_saucer_base,
+                   Sound.SC3.Graph.JMCC_cymbalism_m,
+                   Sound.SC3.Graph.JMCC_overlap_add,
+                   Sound.SC3.Graph.JP_record_scratcher,
+                   Sound.SC3.Graph.JRHB_chain_saw_m,
+                   Sound.SC3.Graph.JRHB_black_atlantic_currents,
+                   Sound.SC3.Graph.JRHB_deep_sea,
+                   Sound.SC3.Graph.JRHB_half_life,
+                   Sound.SC3.Graph.JRHB_dial_history_m,
+                   Sound.SC3.Graph.JRHB_sam_i_am,
+                   Sound.SC3.Graph.LJP_one_line,
+                   Sound.SC3.Graph.MN_k2ws,
+                   Sound.SC3.Graph.MN_k2ws_hp,
+                   Sound.SC3.Graph.NC_after_goeyvaerts,
+                   Sound.SC3.Graph.NC_arpeggio,
+                   Sound.SC3.Graph.NC_ellipse_based_synthesis,
+                   Sound.SC3.Graph.NP_pebble_beach,
+                   Sound.SC3.Graph.NV_nv_tw_54,
+                   Sound.SC3.Graph.NV_nv_tw_41,
+                   Sound.SC3.Graph.NV_nv_tw_1,
+                   Sound.SC3.Graph.PC_thx,
+                   Sound.SC3.Graph.PJ_forest_sounds_m,
+                   Sound.SC3.Graph.RB_hh_808,
+                   Sound.SC3.Graph.RD_bs_070705_m,
+                   Sound.SC3.Graph.RD_scritto,
+                   Sound.SC3.Graph.RD_ccomb_m,
+                   Sound.SC3.Graph.RD_adso,
+                   Sound.SC3.Graph.RD_lg_timed_m,
+                   Sound.SC3.Graph.RD_three_cpsw_m,
+                   Sound.SC3.Graph.RD_vlc_distrtn_m,
+                   Sound.SC3.Graph.RD_implosion_m,
+                   Sound.SC3.Graph.RD_discretion_m,
+                   Sound.SC3.Graph.RD_diffraction_m,
+                   Sound.SC3.Graph.RD_e_lamell_p,
+                   Sound.SC3.Graph.RD_tgb_m,
+                   Sound.SC3.Graph.RD_discretion,
+                   Sound.SC3.Graph.RD_s_chirp,
+                   Sound.SC3.Graph.RD_vla_addtn_sharc,
+                   Sound.SC3.Graph.RD_cut_outs_m,
+                   Sound.SC3.Graph.RD_vla_addtn,
+                   Sound.SC3.Graph.RD_chrd_t,
+                   Sound.SC3.Graph.RD_tr_out_m,
+                   Sound.SC3.Graph.RD_crotale_sine,
+                   Sound.SC3.Graph.RD_fm_kltr_p,
+                   Sound.SC3.Graph.RD_fm_kltr_m,
+                   Sound.SC3.Graph.RD_rzblp_hp,
+                   Sound.SC3.Graph.RD_mouse_clatter_m,
+                   Sound.SC3.Graph.RD_xy_interference,
+                   Sound.SC3.Graph.RD_waveset,
+                   Sound.SC3.Graph.RD_cds_070701_m,
+                   Sound.SC3.Graph.RD_fb_090531,
+                   Sound.SC3.Graph.RD_fbl_fbf,
+                   Sound.SC3.Graph.RD_k_ppr,
+                   Sound.SC3.Graph.RD_tipnso,
+                   Sound.SC3.Graph.RD_thb,
+                   Sound.SC3.Graph.RD_nharm_m,
+                   Sound.SC3.Graph.RD_wial_m,
+                   Sound.SC3.Graph.RD_fwalk_m,
+                   Sound.SC3.Graph.RD_trmlo_u,
+                   Sound.SC3.Graph.RD_chrd_m,
+                   Sound.SC3.Graph.RD_h_chatter_m,
+                   Sound.SC3.Graph.RD_sosc_lp_m,
+                   Sound.SC3.Graph.RD_feedr_m,
+                   Sound.SC3.Graph.RD_crotale,
+                   Sound.SC3.Graph.RD_rzblp,
+                   Sound.SC3.Graph.RD_cricket_m,
+                   Sound.SC3.Graph.RD_tgr_rpr_m,
+                   Sound.SC3.Graph.RD_fm_iter,
+                   Sound.SC3.Graph.RD_k_ppr_m,
+                   Sound.SC3.Graph.RD_klink,
+                   Sound.SC3.Graph.RD_f_lets_m,
+                   Sound.SC3.Graph.RD_urandom,
+                   Sound.SC3.Graph.RD_lf_pulses,
+                   Sound.SC3.Graph.RD_trkl_m,
+                   Sound.SC3.Graph.RD_xy_interference_m,
+                   Sound.SC3.Graph.RD_voscil_u,
+                   Sound.SC3.Graph.RD_voscil,
+                   Sound.SC3.Graph.RD_eggcrate_m,
+                   Sound.SC3.Graph.RD_rzblp_u,
+                   Sound.SC3.Graph.RD_shifting_pulses_m,
+                   Sound.SC3.Graph.RD_scritto_m,
+                   Sound.SC3.Graph.RD_rzblp_m,
+                   Sound.SC3.Graph.RD_eggcrate,
+                   Sound.SC3.Graph.RD_tgrn,
+                   Sound.SC3.Graph.RD_seqr,
+                   Sound.SC3.Graph.RD_pattern_buffer_m,
+                   Sound.SC3.Graph.RD_nharm_p,
+                   Sound.SC3.Graph.RD_trmlo,
+                   Sound.SC3.Graph.RD_lin_sosc,
+                   Sound.SC3.Graph.RD_e_lamell,
+                   Sound.SC3.Graph.RD_lso_061101_m,
+                   Sound.SC3.Graph.SC_bottle_m,
+                   Sound.SC3.Graph.SP_insects_m,
+                   Sound.SC3.Graph.TM_drummer
+
+Source-Repository  head
+ Type:             darcs
+ Location:         http://rd.slavepianos.org/sw/hsc3-graphs/
+
+Executable hsc3-graphs
+ hs-source-dirs: hs
+ main-is: hsc3-graphs.hs
+ build-depends: base,hsc3-graphs
+
+Flag build-exec
+ default:          False
+
+-- Auto-generated: Fri Apr 5 14:49:03 EST 2013
+Executable hsc3-1-1Ni
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/1-1Ni.hs
+ build-depends: base,hosc,hsc3
+Executable hsc3-1-4Q6
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/1-4Q6.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-1-4QM
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/1-4QM.hs
+ build-depends: base,hosc,hsc3,hsc3-lang,sc3-rdu
+Executable hsc3-1-4QN
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/1-4QN.hs
+ build-depends: base,hosc,hsc3,hsc3-lang
+Executable hsc3-1-4Qx
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/1-4Qx.hs
+ build-depends: hsc3
+Executable hsc3-1-Td
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/1-Td.hs
+ build-depends: hosc,hsc3,hsc3-lang,sc3-rdu
+Executable hsc3-acid-otophilia
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/acid-otophilia.hs
+ build-depends: base,hosc,hsc3,random
+Executable hsc3-adso
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/adso.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-after-goeyvaerts
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/after-goeyvaerts.hs
+ build-depends: base,containers,hosc,hsc3,hsc3-lang,random,split
+Executable hsc3-aleatoric-quartet-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/aleatoric-quartet-m.hs
+ build-depends: hsc3
+Executable hsc3-alien-froggies
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/alien-froggies.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-alien-meadow
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/alien-meadow.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-ambient1
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/ambient1.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-analog-bubbles
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/analog-bubbles.hs
+ build-depends: hsc3
+Executable hsc3-arpeggio
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/arpeggio.hs
+ build-depends: base,hsc3,hsc3-lang
+Executable hsc3-babbling-brook-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/babbling-brook-m.hs
+ build-depends: hsc3
+Executable hsc3-birds-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/birds-hp.hs
+ build-depends: hsc3
+Executable hsc3-birds-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/birds-m.hs
+ build-depends: hsc3
+Executable hsc3-bit-reduction
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/bit-reduction.hs
+ build-depends: hsc3
+Executable hsc3-bitwise
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/bitwise.hs
+ build-depends: hsc3
+Executable hsc3-black-atlantic-currents
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/black-atlantic-currents.hs
+ build-depends: hsc3,primes,random,random-shuffle
+Executable hsc3-bohlen-pierce-140
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/bohlen-pierce-140.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-bottle-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/bottle-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-bowed-string-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/bowed-string-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-bs-070705-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/bs-070705-m.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-buffer-display
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/buffer-display.hs
+ build-depends: base,cairo,cmath,hsc3,hsc3-cairo
+Executable hsc3-ccomb-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/ccomb-m.hs
+ build-depends: hsc3
+Executable hsc3-cds-070701-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/cds-070701-m.hs
+ build-depends: hosc,hsc3
+Executable hsc3-chain-saw-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/chain-saw-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-choip
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/choip.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
+Executable hsc3-chrd-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/chrd-m.hs
+ build-depends: hsc3
+Executable hsc3-chrd-t
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/chrd-t.hs
+ build-depends: base,hsc3,hsc3-lang,MonadRandom
+Executable hsc3-clustered-sines
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/clustered-sines.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-clustered-sines-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/clustered-sines-m.hs
+ build-depends: base,hsc3,hsc3-lang
+Executable hsc3-comb-delay-sweeps
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/comb-delay-sweeps.hs
+ build-depends: hsc3,hsc3-lang,random
+Executable hsc3-contamination-zone
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/contamination-zone.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
+Executable hsc3-coolant
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/coolant.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-cricket-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/cricket-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-crotale
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/crotale.hs
+ build-depends: hsc3
+Executable hsc3-crotale-sine
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/crotale-sine.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-cut-outs-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/cut-outs-m.hs
+ build-depends: hsc3
+Executable hsc3-cymbalism-accelerando
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/cymbalism-accelerando.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-cymbalism-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/cymbalism-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-dark-sea-horns
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/dark-sea-horns.hs
+ build-depends: hsc3,sc3-rdu
+Executable hsc3-dark-sea-horns-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/dark-sea-horns-hp.hs
+ build-depends: hsc3,sc3-rdu
+Executable hsc3-data-space
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/data-space.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-data-space-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/data-space-hp.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-deep-sea
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/deep-sea.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-deep-trip
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/deep-trip.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
+Executable hsc3-default
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/default.hs
+ build-depends: data-default,hsc3,hsc3-lang
+Executable hsc3-demanding-studies
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/demanding-studies.hs
+ build-depends: hsc3
+Executable hsc3-dial-history-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/dial-history-m.hs
+ build-depends: base,hsc3
+Executable hsc3-diffraction-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/diffraction-m.hs
+ build-depends: base,hsc3
+Executable hsc3-discretion
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/discretion.hs
+ build-depends: hsc3,sc3-rdu
+Executable hsc3-discretion-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/discretion-m.hs
+ build-depends: hsc3
+Executable hsc3-doppler
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/doppler.hs
+ build-depends: hosc,hsc3
+Executable hsc3-drummer
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/drummer.hs
+ build-depends: hsc3
+Executable hsc3-early-space-music-lp-side-two
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/early-space-music-lp-side-two.hs
+ build-depends: hsc3,hsc3-lang,random,sc3-rdu
+Executable hsc3-eggcrate
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/eggcrate.hs
+ build-depends: hsc3
+Executable hsc3-eggcrate-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/eggcrate-m.hs
+ build-depends: hsc3
+Executable hsc3-e-lamell
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/e-lamell.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-e-lamell-p
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/e-lamell-p.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-ellipse-based-synthesis
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/ellipse-based-synthesis.hs
+ build-depends: hsc3
+Executable hsc3-f0-2012-04-19
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-2012-04-19.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0011
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0011.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0014
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0014.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0020
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0020.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0028
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0028.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0030
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0030.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0033
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0033.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0045
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0045.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0049
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0049.hs
+ build-depends: base,hsc3
+Executable hsc3-f0-tw0051
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0051.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0077
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0077.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0084
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0084.hs
+ build-depends: hsc3
+Executable hsc3-fb-090531
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/fb-090531.hs
+ build-depends: base,hosc,hsc3,hsc3-lang
+Executable hsc3-fbl-fbf
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/fbl-fbf.hs
+ build-depends: hsc3
+Executable hsc3-feedr-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/feedr-m.hs
+ build-depends: hosc,hsc3
+Executable hsc3-f-lets-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f-lets-m.hs
+ build-depends: hsc3
+Executable hsc3-fm-iter
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/fm-iter.hs
+ build-depends: hsc3
+Executable hsc3-fm-kltr-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/fm-kltr-m.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-fm-kltr-p
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/fm-kltr-p.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-for-ann
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/for-ann.hs
+ build-depends: hosc,hsc3
+Executable hsc3-forest-sounds-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/forest-sounds-m.hs
+ build-depends: hsc3
+Executable hsc3-fwalk-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/fwalk-m.hs
+ build-depends: hosc,hsc3
+Executable hsc3-half-life
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/half-life.hs
+ build-depends: hsc3
+Executable hsc3-hansm
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/hansm.hs
+ build-depends: hosc,hsc3
+Executable hsc3-harmonic-swimming
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/harmonic-swimming.hs
+ build-depends: hsc3,sc3-rdu
+Executable hsc3-harmonic-swimming-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/harmonic-swimming-m.hs
+ build-depends: hsc3
+Executable hsc3-harmonic-tumbling-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/harmonic-tumbling-m.hs
+ build-depends: hsc3
+Executable hsc3-h-chatter-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/h-chatter-m.hs
+ build-depends: hsc3
+Executable hsc3-hell-is-busy
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/hell-is-busy.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-hh-808
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/hh-808.hs
+ build-depends: hsc3
+Executable hsc3-implosion-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/implosion-m.hs
+ build-depends: hsc3
+Executable hsc3-insects-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/insects-m.hs
+ build-depends: hsc3
+Executable hsc3-jl-1-Z
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/jl-1-Z.hs
+ build-depends: hsc3
+Executable hsc3-k2ws
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/k2ws.hs
+ build-depends: hsc3
+Executable hsc3-k2ws-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/k2ws-hp.hs
+ build-depends: hsc3
+Executable hsc3-kabelscahden
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/kabelscahden.hs
+ build-depends: hsc3
+Executable hsc3-karplus-strong
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/karplus-strong.hs
+ build-depends: hosc,hsc3
+Executable hsc3-klink
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/klink.hs
+ build-depends: hsc3
+Executable hsc3-k-ppr
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/k-ppr.hs
+ build-depends: hsc3
+Executable hsc3-k-ppr-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/k-ppr-m.hs
+ build-depends: hsc3
+Executable hsc3-laser-bubble
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/laser-bubble.hs
+ build-depends: hsc3
+Executable hsc3-lfo-modulation
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/lfo-modulation.hs
+ build-depends: hsc3
+Executable hsc3-lf-pulses
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/lf-pulses.hs
+ build-depends: hsc3
+Executable hsc3-lg-timed-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/lg-timed-m.hs
+ build-depends: hsc3
+Executable hsc3-lin-sosc
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/lin-sosc.hs
+ build-depends: base,hosc,hsc3,hsc3-lang
+Executable hsc3-lso-061101-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/lso-061101-m.hs
+ build-depends: base,directory,filepath,hls,hps,hsc3,hsc3-lang,hsc3-sf
+Executable hsc3-lucier
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/lucier.hs
+ build-depends: hsc3
+Executable hsc3-m21360
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/m21360.hs
+ build-depends: hosc,hsc3
+Executable hsc3-microhelix
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/microhelix.hs
+ build-depends: hsc3
+Executable hsc3-modal-space
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/modal-space.hs
+ build-depends: hosc,hsc3
+Executable hsc3-moto-rev
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/moto-rev.hs
+ build-depends: hsc3
+Executable hsc3-mouse-clatter-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/mouse-clatter-m.hs
+ build-depends: hosc,hsc3
+Executable hsc3-mridangam
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/mridangam.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-music-box
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/music-box.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-nharm-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nharm-m.hs
+ build-depends: base,hosc,hsc3,hsc3-lang
+Executable hsc3-nharm-p
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nharm-p.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
+Executable hsc3-noise-burst-sweep
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/noise-burst-sweep.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-noise-modulated-sines
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/noise-modulated-sines.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-nokia
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nokia.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-non-real-time
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/non-real-time.hs
+ build-depends: hosc,hsc3,process
+Executable hsc3-nv-tw-1
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nv-tw-1.hs
+ build-depends: hsc3
+Executable hsc3-nv-tw-41
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nv-tw-41.hs
+ build-depends: hsc3
+Executable hsc3-nv-tw-54
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nv-tw-54.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-nx102
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nx102.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-one-line
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/one-line.hs
+ build-depends: hsc3
+Executable hsc3-oscillator-cluster-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/oscillator-cluster-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-overlap-add
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/overlap-add.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-pattern-buffer-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pattern-buffer-m.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-pebble-beach
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pebble-beach.hs
+ build-depends: hsc3
+Executable hsc3-pkt-26
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pkt-26.hs
+ build-depends: hsc3
+Executable hsc3-pkt-28
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pkt-28.hs
+ build-depends: hsc3
+Executable hsc3-plucked-strings-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/plucked-strings-m.hs
+ build-depends: hsc3
+Executable hsc3-police-state
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/police-state.hs
+ build-depends: hsc3
+Executable hsc3-police-state-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/police-state-m.hs
+ build-depends: hsc3
+Executable hsc3-pond-life
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pond-life.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-pond-life-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pond-life-hp.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-proxy-mixer
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/proxy-mixer.hs
+ build-depends: hsc3,sc3-rdu
+Executable hsc3-proxy-mixer-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/proxy-mixer-m.hs
+ build-depends: base,hsc3,hsc3-lang
+Executable hsc3-pulsing-bottles
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pulsing-bottles.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-pulsing-bottles-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pulsing-bottles-m.hs
+ build-depends: base,hsc3,hsc3-lang
+Executable hsc3-pwm-crossfade
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pwm-crossfade.hs
+ build-depends: hsc3
+Executable hsc3-rails
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/rails.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-rain-thunder
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/rain-thunder.hs
+ build-depends: hsc3
+Executable hsc3-random-panning-sines
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/random-panning-sines.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-random-panning-sines-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/random-panning-sines-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-random-pulsations
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/random-pulsations.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-random-sine-waves
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/random-sine-waves.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-random-sine-waves-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/random-sine-waves-hp.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-random-sine-waves-she
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/random-sine-waves-she.hs
+ build-depends: base,hsc3,hsc3-lang
+Executable hsc3-record-scratcher
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/record-scratcher.hs
+ build-depends: hosc,hsc3
+Executable hsc3-red-frik-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/red-frik-m.hs
+ build-depends: hsc3
+Executable hsc3-reset
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/reset.hs
+ build-depends: hsc3
+Executable hsc3-resonant-dust
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/resonant-dust.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-resonant-dust-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/resonant-dust-hp.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-reverberated-sine-percussion-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/reverberated-sine-percussion-hp.hs
+ build-depends: hsc3
+Executable hsc3-reverberated-sine-percussion-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/reverberated-sine-percussion-m.hs
+ build-depends: hsc3
+Executable hsc3-ring-modulated-klank
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/ring-modulated-klank.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
+Executable hsc3-rm-octaver
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/rm-octaver.hs
+ build-depends: hsc3
+Executable hsc3-rzblp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/rzblp.hs
+ build-depends: hsc3
+Executable hsc3-rzblp-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/rzblp-hp.hs
+ build-depends: hsc3
+Executable hsc3-rzblp-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/rzblp-m.hs
+ build-depends: hsc3
+Executable hsc3-rzblp-u
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/rzblp-u.hs
+ build-depends: hsc3,hsc3-unsafe
+Executable hsc3-sam-i-am
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sam-i-am.hs
+ build-depends: base,hsc3,hsc3-lang,MonadRandom
+Executable hsc3-sample-and-hold-liquidities
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sample-and-hold-liquidities.hs
+ build-depends: hsc3
+Executable hsc3-saucer-base
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/saucer-base.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-sawed-cymbals
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sawed-cymbals.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-s-chirp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/s-chirp.hs
+ build-depends: hosc,hsc3
+Executable hsc3-scratchy
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/scratchy.hs
+ build-depends: hsc3
+Executable hsc3-scratchy-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/scratchy-m.hs
+ build-depends: hsc3
+Executable hsc3-scritto
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/scritto.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-scritto-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/scritto-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-seqr
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/seqr.hs
+ build-depends: hsc3,sc3-rdu
+Executable hsc3-shepard-tones
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/shepard-tones.hs
+ build-depends: hosc,hsc3
+Executable hsc3-shifting-pulses-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/shifting-pulses-m.hs
+ build-depends: hsc3
+Executable hsc3-sidereal-time
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sidereal-time.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-sidereal-time-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sidereal-time-hp.hs
+ build-depends: base,hsc3,hsc3-lang
+Executable hsc3-sinusdeklinationen
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sinusdeklinationen.hs
+ build-depends: hsc3,hsc3-lang,split
+Executable hsc3-slow-beating-harmonic-sines
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/slow-beating-harmonic-sines.hs
+ build-depends: base,hsc3,hsc3-lang,MonadRandom
+Executable hsc3-slow-beating-sines
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/slow-beating-sines.hs
+ build-depends: base,hsc3,hsc3-lang,MonadRandom
+Executable hsc3-snare-909
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/snare-909.hs
+ build-depends: hsc3
+Executable hsc3-sosc-lp-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sosc-lp-m.hs
+ build-depends: hosc,hsc3
+Executable hsc3-spe-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/spe-m.hs
+ build-depends: hsc3
+Executable hsc3-spe-p
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/spe-p.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-sprinkler
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sprinkler.hs
+ build-depends: hsc3
+Executable hsc3-sprinkler-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sprinkler-m.hs
+ build-depends: hsc3
+Executable hsc3-string-wander-cluster
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/string-wander-cluster.hs
+ build-depends: hsc3,hsc3-lang,random
+Executable hsc3-strummable-guitar
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/strummable-guitar.hs
+ build-depends: hsc3
+Executable hsc3-sweepy-noise
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/sweepy-noise.hs
+ build-depends: hsc3
+Executable hsc3-synthetic-piano-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/synthetic-piano-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-tank
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tank.hs
+ build-depends: hsc3,sc3-rdu
+Executable hsc3-tank-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tank-hp.hs
+ build-depends: hsc3
+Executable hsc3-tank-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tank-m.hs
+ build-depends: hsc3
+Executable hsc3-tgb-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tgb-m.hs
+ build-depends: hosc,hsc3
+Executable hsc3-tgrn
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tgrn.hs
+ build-depends: hosc,hsc3
+Executable hsc3-tgr-rpr-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tgr-rpr-m.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-thb
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/thb.hs
+ build-depends: hmt,hosc,hsc3,hsc3-lang
+Executable hsc3-theremin
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/theremin.hs
+ build-depends: hsc3
+Executable hsc3-three-cpsw-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/three-cpsw-m.hs
+ build-depends: hsc3
+Executable hsc3-thx
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/thx.hs
+ build-depends: hsc3,random
+Executable hsc3-tipnso
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tipnso.hs
+ build-depends: hsc3
+Executable hsc3-train
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/train.hs
+ build-depends: hsc3
+Executable hsc3-tremulate
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tremulate.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
+Executable hsc3-tremulate-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tremulate-hp.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-tremulate-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tremulate-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-trkl-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/trkl-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-trmlo
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/trmlo.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-trmlo-u
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/trmlo-u.hs
+ build-depends: hsc3,hsc3-lang,hsc3-unsafe
+Executable hsc3-tr-out-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tr-out-m.hs
+ build-depends: hosc,hsc3
+Executable hsc3-tsort
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tsort.hs
+ build-depends: hsc3
+Executable hsc3-uplink
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/uplink.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-uplink-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/uplink-hp.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-urandom
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/urandom.hs
+ build-depends: base,bytestring,hosc,hsc3,hsc3-lang
+Executable hsc3-vla-addtn
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/vla-addtn.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-vla-addtn-sharc
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/vla-addtn-sharc.hs
+ build-depends: base,hosc,hsc3,hsc3-lang,hsharc
+Executable hsc3-vlc-distrtn-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/vlc-distrtn-m.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-voscil
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/voscil.hs
+ build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-voscil-u
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/voscil-u.hs
+ build-depends: hosc,hsc3,hsc3-lang,hsc3-unsafe
+Executable hsc3-waveset
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/waveset.hs
+ build-depends: array,base,hosc,hsc3,hsc3-sf,random
+Executable hsc3-what-was-i-thinking-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/what-was-i-thinking-m.hs
+ build-depends: hsc3
+Executable hsc3-why-supercollider
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/why-supercollider.hs
+ build-depends: hsc3,sc3-rdu
+Executable hsc3-wial-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/wial-m.hs
+ build-depends: hsc3
+Executable hsc3-wind-metals-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/wind-metals-m.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-xy-interference
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/xy-interference.hs
+ build-depends: hsc3
+Executable hsc3-xy-interference-m
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/xy-interference-m.hs
+ build-depends: hsc3
diff --git a/sh/mk-dependencies.sh b/sh/mk-dependencies.sh
new file mode 100644
--- /dev/null
+++ b/sh/mk-dependencies.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+o="Makefile.graphs"
+echo -n "GRAPHS=" > $o
+ls *.hs | sed -r -e 's/(.*)\.hs/ \1\\/g' >> $o
diff --git a/sh/mk-html.sh b/sh/mk-html.sh
new file mode 100644
--- /dev/null
+++ b/sh/mk-html.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+for i in *.hs
+do
+    HsColour -css $i -o../html/$i.html
+done
diff --git a/sh/mk-packages.sh b/sh/mk-packages.sh
new file mode 100644
--- /dev/null
+++ b/sh/mk-packages.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+function mk_packages
+{
+    i=$1.hs
+    o=$1.packages
+    grep '{- .* -}' $i | \
+        sed -e 's/.*{- //g' | \
+        sed -e 's/ -}//g' | \
+        sort -u | \
+        xargs echo | \
+        sed -e 's/ /,/g' > $o
+}
+
+function mk_cabal
+{
+    o=$1.cabal
+    read < $1.packages p
+    echo "Executable hsc3-"$1 > $o
+    echo " If !flag(build-exec)" >> $o
+    echo "  buildable: False" >> $o
+    echo " main-is: gr/"$1".hs" >> $o
+    echo " build-depends: "$p >> $o
+}
+
+for i in *.hs ; do mk_packages $(basename $i .hs) ; done
+for i in *.hs ; do mk_cabal $(basename $i .hs) ; done
+
+c="../hsc3-graphs.cabal"
+d=$(date)
+echo "-- Auto-generated: "$d >> $c
+cat *.cabal >> $c
diff --git a/sh/mk-pdf.sh b/sh/mk-pdf.sh
new file mode 100644
--- /dev/null
+++ b/sh/mk-pdf.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+for i in *.dot.gz
+do
+    zcat $i | dot -Tpdf -o ../pdf/$(basename $i .dot.gz).pdf
+done
diff --git a/sh/mk-svg.sh b/sh/mk-svg.sh
new file mode 100644
--- /dev/null
+++ b/sh/mk-svg.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+if [ -d dot ]
+then
+    for i in dot/*.dot
+    do
+        dot $i -Tsvg -o svg/$(basename $i .dot).svg
+    done
+fi
+
+if [ -d dot.gz ]
+then
+    for i in dot.gz/*.dot.gz
+    do
+        zcat $i | dot -Tsvg -o svg/$(basename $i .dot.gz).svg
+    done
+fi
+
diff --git a/sh/statistics.sh b/sh/statistics.sh
new file mode 100644
--- /dev/null
+++ b/sh/statistics.sh
@@ -0,0 +1,8 @@
+grep \(adc\) */*.hs
+grep \(am\) */*.hs
+grep \(f0\) */*.hs | wc -l
+grep \(jl\) */*.hs
+grep \(jmcc\) */*.hs | wc -l
+grep \(jrhb\) */*.hs
+grep \(nc\) */*.hs
+grep \(nv\) */*.hs
