diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 mk-html:
 	mkdir -p html
 	cp -f css/emacs.css html/hscolour.css
-	(cd gr ; sh ../sh/mk-html.sh)
+	sh sh/mk-html.sh
 
 mk-pdf:
 	mkdir -p pdf
@@ -29,6 +29,12 @@
 	rm -f svg/*.svg
 	rm -R Sound
 	rm -f hs/hsc3-graphs.hs
+
+push-sp:
+	darcs push -a rd@slavepianos.org:sw/hsc3-graphs
+
+pull-sp:
+	darcs pull -a http://rd.slavepianos.org/sw/hsc3-graphs
 
 remote-update:
 	ssh rd@slavepianos.org "(cd sw/hsc3-graphs; make all)"
diff --git a/README b/README
--- a/README
+++ b/README
@@ -8,14 +8,14 @@
 
 Graphs credits are on the first line of each file, and are courtesy:
 
-- James McCartney ([jmcc][sc3], 70)
-- Rohan Drape ([rd][rd], 61)
-- Fredrik Olofsson ([f0][f0], 19)
+- James McCartney ([jmcc][sc3], 92)
+- Rohan Drape ([rd][rd], 70)
+- Fredrik Olofsson ([f0][f0], 25)
 - Julian Rohrhuber ([jrhb][jrhb], 7)
-- Jonatan Liljedahl ([jl][jl], 5)
+- Jonatan Liljedahl ([jl][jl], 6)
+- Nathaniel Virgo ([nv][nv], 4)
 - Alberto De Campo ([adc][adc], 3)
 - 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)
@@ -24,6 +24,7 @@
 - Lance J. Putnam ([ljp][ljp], 1)
 - Ryan Brown ([rb][rb], 1)
 - Sam Pluta ([sp][sp], 1)
+- Till Bovermann ([tb][tb], 1)
 - Thor Magnusson ([tm][tm], 1)
 
 In most cases the `sclang` variants have been re-written prior to
@@ -34,11 +35,16 @@
 
 There is a `Makefile` at `gr`, type `make dep; make all`.
 
+Requires:
+
+- cabal install hscolour
+- cabal install she
+
 [hs]: http://haskell.org/
 [sc3]: http://audiosynth.com/
 [hsc3]: http://rd.slavepianos.org/?t=hsc3
 [gr]: http://rd.slavepianos.org/?t=hsc3-graphs
-[gr-ix]: ?t=hsc3-graphs&m=md/ix.md
+[gr-ix]: ?t=hsc3-graphs&e=md/ix.md
 
 [adc]: http://medienhaus.udk-berlin.de/pages/Dr._Alberto_De_Campo
 [am]: http://yaxu.org/
@@ -54,9 +60,10 @@
 [nv]: http://nathanielvirgo.com/
 [rb]: http://www.wabdo.com/
 [sp]: http://www.sampluta.com/
+[tb]: http://www.lfsaw.de/
 [tm]: http://www.sussex.ac.uk/Users/thm21/
 
-© [rohan drape][rd] and others, 2006-2013, [gpl]
+© [rohan drape][rd] and others, 2006-2014, [gpl]
 
 [rd]: http://rd.slavepianos.org/
 [gpl]: http://gnu.org/copyleft/
diff --git a/Sound/SC3/Graph/ADC_adc_16_6_2.hs b/Sound/SC3/Graph/ADC_adc_16_6_2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/ADC_adc_16_6_2.hs
@@ -0,0 +1,51 @@
+-- adc-16-6-2 (adc) #p.489
+{-# OPTIONS_GHC -F -pgmF hsc3-uparam #-}
+module Sound.SC3.Graph.ADC_adc_16_6_2 where
+
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.List as L {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
+
+constQ :: Synthdef
+constQ =
+    let uparam = {bus=0,bufnum=0,amp=0.1,pan=0,centerPos=0.5,sustain=0.1,rate=1,freq=400,rq=0.3}
+        ringtime = min ((2.4 / (freq * rq)) * 0.66) 0.5 -- estimated
+        ampcomp = (rq ** (-1)) * ((400 / freq) ** 0.5)
+        envSig = let env = envelope [0,amp,0] (map (* sustain) [0.5,0.5]) [EnvWelch]
+                 in envGen AR 1 1 0 1 DoNothing env
+        cutoffEnv = let env = envelope [1,1,0] [sustain + ringtime,0.01] [EnvLin]
+                    in envGen KR 1 1 0 1 RemoveSynth env
+        startPos = (centerPos - (sustain * rate * 0.5)) * bufSampleRate IR bufnum
+        grain = playBuf 1 AR bufnum rate 0 startPos Loop DoNothing * envSig
+        filtered = bpf grain freq rq * ampcomp
+    in synthdef "constQ" (offsetOut bus (pan2 filtered pan cutoffEnv))
+
+p :: Double -> P.Param
+p b =
+    [("bufnum",repeat b)
+    ,("sustain",P.white 'α' 0.02 0.04)
+    ,("amp",P.white 'β' 0.05 0.25)
+    ,("centerPos",cycle [0,0.01 .. 2])
+    ,("dur",L.brown 'γ' 0.01 0.09 5)
+    ,("rate",P.white 'δ' 0.95 1.05)
+    ,("freq",map midiCPS (L.brown 'ε' 64 120 8))
+    ,("pan",P.white 'ζ' (-1) 1)
+    ,("rq",P.white 'η' 0.03 0.15)]
+
+p' :: Double -> P.Param
+p' b =
+    [("bufnum",repeat b)
+    ,("sustain",P.white 'θ' 0.02 0.04)
+    ,("amp",repeat 0.3)
+    ,("centerPos",cycle [0,0.01 .. 2])
+    ,("dur",P.white 'ι' 0.01 0.03)
+    ,("rate",P.white 'κ' 0.95 1.05)
+    ,("freq",map midiCPS (L.brown 'λ' 80 82 8))
+    ,("pan",P.white 'μ' (-1) 1)
+    ,("rq",repeat 0.05)]
+
+main :: IO ()
+main = withSC3$do
+  let fn = "/usr/local/share/SuperCollider/sounds/a11wlk01-44_1.aiff"
+  _ <- async (b_allocRead 0 fn 0 0)
+  play (P.sbind [(constQ,p 0),(constQ,p' 0)])
diff --git a/Sound/SC3/Graph/ADC_bit_reduction.hs b/Sound/SC3/Graph/ADC_bit_reduction.hs
--- a/Sound/SC3/Graph/ADC_bit_reduction.hs
+++ b/Sound/SC3/Graph/ADC_bit_reduction.hs
@@ -1,7 +1,7 @@
 -- bit reduction (adc)
 module Sound.SC3.Graph.ADC_bit_reduction where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 sample_rate_decrease :: UGen
 sample_rate_decrease =
diff --git a/Sound/SC3/Graph/ADC_kabelscahden.hs b/Sound/SC3/Graph/ADC_kabelscahden.hs
--- a/Sound/SC3/Graph/ADC_kabelscahden.hs
+++ b/Sound/SC3/Graph/ADC_kabelscahden.hs
@@ -1,7 +1,7 @@
 -- march 2003 (adc) / (jrhb)
 module Sound.SC3.Graph.ADC_kabelscahden where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 kabelScahden :: UGen
 kabelScahden =
diff --git a/Sound/SC3/Graph/ADC_waveset.hs b/Sound/SC3/Graph/ADC_waveset.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/ADC_waveset.hs
@@ -0,0 +1,163 @@
+-- A simple waveset synthesiser (adc)
+{-# OPTIONS_GHC -F -pgmF hsc3-uparam #-}
+module Sound.SC3.Graph.ADC_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 {- base -}
+import System.Random {- random -}
+
+-- * 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 0 [-1,1,-1,3] == [0.5,2.25]
+fzc :: (Ord a, Fractional a) => a -> [a] -> [a]
+fzc n =
+    let rec k s = case s of
+                    x:y:s' -> if is_zc x y
+                              then (k + locate_fzc x y) : rec (k + 2.0) s'
+                              else rec (k + 1.0) (y : s')
+                    _ -> []
+    in rec n
+
+-- | Remove zero crossings so that no waveset has length less than m.
+prune :: (Ord a, Num a) => a -> [a] -> [a]
+prune m =
+    let rec n zc =
+            case zc of
+              [] -> [n]
+              x:zc' -> if (x - n) < m
+                       then rec n zc'
+                       else x : rec x zc'
+    in rec 0
+
+-- | Zero crossings to waveset bounds.
+--
+-- zc_to_ws [1,7,15] == [(1,7),(7,15)]
+zc_to_ws :: [a] -> [(a,a)]
+zc_to_ws =
+    let rec zc =
+            case zc of
+              x:y:zc' -> (x,y) : rec (y : zc')
+              _ -> []
+    in rec
+
+-- * Waveset instrument
+
+-- | A trivial waveset instrument with unit envelope.
+waveset :: UGen
+waveset =
+    let uparam = {bus=0,bufnum=0,start=0,end=0,rate=1,sustain=1,amp=0.2}
+        rs = bufRateScale KR bufnum * rate
+        ph = phasor AR 0 rs 0 (end - start) 0 + start -- see adc for rationale
+        e_data = Envelope [amp, amp, 0] [sustain, 0] [EnvLin] Nothing Nothing
+        e_ugen = envGen AR 1 1 0 1 RemoveSynth e_data
+    in offsetOut bus (bufRdL 1 AR bufnum 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), ("sustain", 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.
+--
+-- > withSC3 (run_waveset 64 "/home/rohan/data/audio/pf-c5.snd")
+run_waveset :: Transport m => Double -> String -> m ()
+run_waveset pr 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 = zc_to_ws (prune pr (fzc 0 b))
+      pl s = play (NRT 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))
+  return ()
+
+main :: IO ()
+main = do
+  a <- getArgs
+  case a of
+    [fn] -> withSC3 (run_waveset 64 fn)
+    _ -> error "audio file?"
+
+{-
+-- * 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)
+-}
diff --git a/Sound/SC3/Graph/AF_birds_am_fm.hs b/Sound/SC3/Graph/AF_birds_am_fm.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/AF_birds_am_fm.hs
@@ -0,0 +1,152 @@
+-- birds-am-fm (af)
+-- http://www.obiwannabe.co.uk/tutorials/html/tutorial_birds.html
+-- perhaps some mis-translations...
+module Sound.SC3.Graph.AF_birds_am_fm where
+
+-- import Debug.Trace {- base -}
+import System.Random {- random -}
+
+import Sound.SC3 hiding (sweep) {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.Gen as R
+
+-- > audition (out 0 (pd_noise 'a' * 0.1))
+pd_noise :: ID a => a -> UGen
+pd_noise e = whiteNoise e AR
+
+-- > audition (out 0 (pd_lop (pd_noise 'a') 500 * 0.1))
+pd_lop :: UGen -> UGen -> UGen
+pd_lop = lpf -- actually lop is one-pole, lpf is two pole...
+
+-- > audition (out 0 (pd_osc 440 * 0.1))
+pd_osc :: UGen -> UGen
+pd_osc f = sinOsc AR f pi
+
+-- > audition (out 0 (pd_phasor 440 * 0.1))
+pd_phasor :: UGen -> UGen
+pd_phasor f = linLin_b (lfSaw AR f 0) 0 1
+
+-- | Ramp doesn't make sense with a constant input signal.
+--
+-- > audition (out 0 (pd_osc (pd_line (lfNoise0 'a' AR 0.5) 300 * 500 + 300) * 0.1))
+pd_line :: UGen -> UGen -> UGen
+pd_line x msec = if isConstant x then x else ramp x (msec / 1000)
+
+-- > audition (out 0 (pd_clip (pd_osc 220) (-0.05) 0.05))
+pd_clip :: UGen -> UGen -> UGen -> UGen
+pd_clip = clip
+
+-- > audition (out 0 (pd_cos (pd_phasor 440) * 0.1))
+pd_cos :: Floating a => a -> a
+pd_cos i = cos (i * 2 * pi)
+
+-- > audition (out 0 (pd_vcf (pd_noise 'a') (pd_phasor 0.1 * 500 + 200) 6 * 0.1))
+pd_vcf :: UGen -> UGen -> UGen -> UGen
+pd_vcf i cf q = bpf i cf (1 / q)
+
+data B n = B {artic :: n
+             ,tweet :: n
+             ,syr1a :: n
+             ,syr1m :: n
+             ,syr2a :: n
+             ,syr2m :: n
+             ,basef :: n
+             ,sweep :: n
+             ,moda :: n
+             ,modb :: n
+             ,tf1 :: n
+             ,tb1 :: n
+             ,tf2 :: n
+             ,tb2 :: n
+             ,reson :: n
+             ,vol :: n}
+         deriving (Show)
+
+square :: Num a => a -> a
+square n = n * n
+
+-- > let (_,o) = autotweet (presets !! 0)
+-- > Sound.SC3.UGen.Dot.draw o
+-- > audition (out 0 (sinOsc AR (sqrt o * 1000) 0 * 0.1))
+autotweet :: B UGen -> (UGen,UGen)
+autotweet b_data =
+    let artic' = pd_line (artic b_data) 300
+        tweet' = tweet b_data * 3
+        ph = let x = abs (pd_lop (pd_noise 'a') 0.01) * (tweet' * 1000)
+                 y = pd_osc x * (x * tweet')
+             in pd_lop (pd_phasor y) 2
+    in (ph,square (pd_cos (pd_clip (artic' - ph) (-0.25) 0.25)))
+
+type TW = (UGen, UGen, UGen, UGen, UGen, UGen, UGen)
+
+-- > Sound.SC3.UGen.Dot.draw (tweetypie (1,2,3,4,5,6,7))
+tweetypie :: TW -> UGen
+tweetypie (a,b,c,d,e,f,g) =
+    let m = pd_osc (pd_osc a * pd_osc b * c + d)
+    in pd_lop ((pd_vcf m e g + pd_vcf m f g) * 0.5) 5000
+
+modmatrix :: UGen -> B UGen -> TW
+modmatrix modall b_data =
+    let get var mul tm = pd_line (var b_data * mul) tm
+        syr1a' = get syr1a 3000 300
+        syr1m' = get syr1m 200 500
+        syr2a' = get syr2a 3000 300
+        syr2m' = get syr2m 200 500
+        basef' = get basef 5000 300
+        sweep' = get sweep 3000 300
+        moda' = get moda 2000 300
+        modb' = get modb 50 300
+        tf1' = get tf1 3000 300
+        tb1' = get tb1 3000 300
+        tf2' = get tf2 3000 300
+        tb2' = get tb2 3000 300
+        reson' = reson b_data * 20 + 2
+        a = (syr1a' * modall) + syr2a'
+        b = let p = syr1a' + syr1m'
+                q = p * modall
+                r = syr2a' + syr2m'
+            in q + r
+        c = modall * moda' * modb'
+        d = (modall * sweep') + basef'
+        e = (modall * tf1') + tb1'
+        f = (modall * tf2') + tb2'
+    in (a,b,c,d,e,f,reson')
+
+-- > Sound.SC3.UGen.Dot.draw (birdbox (presets !! 0))
+birdbox :: B UGen -> UGen
+birdbox b_data =
+    let (modall,a) = autotweet b_data
+        tw = tweetypie (modmatrix modall b_data)
+        a' = sqrt a * 1000
+    in pd_vcf tw a' 0.1 * vol b_data
+
+presets :: Fractional n => [B n]
+presets =
+    [B 0.683544 0.658228 0.177215 0.0886076 0.911392 0.0126582 0.291139 0.772152 0.0886076 0.632911 0.316456 0.860759 0.227848 0.620253 0.417722 0.199808
+    ,B 0.683544 0.582278 0.405063 0.78481 0.911392 0.0126582 0.848101 0.0506329 0.0886076 0.632911 0.316456 0.240506 0.113924 0.620253 0.417722 0.199808
+    ,B 0.924051 0.936709 0.886076 0.78481 0 0.291139 0.126582 0.721519 0.0253165 0.189873 0.0759494 0.810127 0.329114 0.139241 0.0759494 0.243502
+    ,B 0.455696 0.620253 0 0.0506329 0.0126582 0.0126582 0.56962 1 0.0506329 0.620253 0.949367 0.810127 0.848101 0.683544 0.0886076 0.127144
+    ,B 0.21519 0.518987 0.379747 1 0.0126582 0.0126582 0.405063 1 0.0506329 0.620253 0.949367 0.164557 0.848101 0.164557 0.746835 0.372008
+    ,B 0.886076 0.518987 0 0.0632911 0.0126582 0.0126582 0.278481 0.417722 0.0506329 0.278481 0.443038 0.164557 0.544304 0.164557 0.746835 0.372008
+    ,B 0.962025 0.898734 0 0.278481 0.164557 0.822785 0.0759494 0.417722 0.556962 0.113924 0.291139 0.126582 0.544304 0.151899 0.911392 0.372008
+    ,B 0.164557 0.974684 0.734177 0.670886 0.240506 0.202532 0.227848 0.392405 0.0253165 0.392405 0.291139 0.126582 0.544304 0.734177 0.379747 0.868261
+    ,B 0.708861 0.721519 0.253165 0.0759494 0.658228 0.177215 0.746835 0.202532 0.329114 0.202532 0.417722 0.177215 0.392405 0.405063 1 0.314002
+    ,B 0.392405 0.721519 0.0759494 0.316456 0.658228 0.177215 0.177215 0.848101 0.0886076 0.202532 0.417722 0.177215 0.392405 0.405063 1 0.314002
+    ,B 0.379747 0.962025 0.265823 0.0126582 0.0886076 0.177215 0.721519 0.139241 0.113924 0.139241 0.0759494 0.759494 0.936709 0.911392 0.848101 0.314002
+    ,B 0.291139 0.556962 0.0632911 0.0253165 0.0506329 0.0379747 0.0759494 0 0.177215 0.227848 0.0759494 0.240506 0.0379747 0.506329 0.924051 0.314002
+    ,B 0.848101 0.772152 0.367089 0.189873 0.35443 0.0506329 0.0126582 0.177215 0.101266 0.0253165 0.924051 0.0886076 1 0.0886076 0.455696 0.732876]
+
+-- B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+-- > hearb (presets !! 4)
+hearb :: B UGen -> IO ()
+hearb = audition . out 0 . birdbox
+
+main :: IO ()
+main = do
+  let f g = let (p,g') = R.choose presets g in (birdbox p,g')
+  overlapTextureS (20,4,5,maxBound) f =<< getStdGen
+
+-- Local Variables:
+-- truncate-lines:t
+-- End:
diff --git a/Sound/SC3/Graph/AM_karplus_strong.hs b/Sound/SC3/Graph/AM_karplus_strong.hs
--- a/Sound/SC3/Graph/AM_karplus_strong.hs
+++ b/Sound/SC3/Graph/AM_karplus_strong.hs
@@ -2,7 +2,7 @@
 module Sound.SC3.Graph.AM_karplus_strong where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 -- x = delay, y = blend / gain
 karplus_strong :: UGen
@@ -21,7 +21,7 @@
         laggedDelay = lag x 0.01
         o = sinOsc AR 200 0
         a0 = decay d 0.025 * o
-        a1 = localIn 1 AR + (a0 * (y - 0.25))
+        a1 = localIn' 1 AR + (a0 * (y - 0.25))
         a2 = delayN a1 0.01 laggedDelay
         a3 = delay1 a2
         a4 = (a2 + a3) * 0.5
diff --git a/Sound/SC3/Graph/AV_rm_octaver.hs b/Sound/SC3/Graph/AV_rm_octaver.hs
--- a/Sound/SC3/Graph/AV_rm_octaver.hs
+++ b/Sound/SC3/Graph/AV_rm_octaver.hs
@@ -1,16 +1,19 @@
 -- rm-octaver (av), courtesy miller puckette
+-- http://crca.ucsd.edu/~msp/techniques/latest/book-html/node77.html
 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
+defaultPitch x = pitch x 440 60 4000 100 16 1 0.01 0.5 1 0
 
 rm_octaver :: UGen -> UGen
 rm_octaver i =
     let p = defaultPitch i
-        f = mceChannel 0 p
-    in sinOsc AR (f * 0.5) 0 * i + i
+        [f,tr] = mceChannels p
+    in lag3 tr 0.1 * sinOsc AR (f * 0.5) 0 * i + i
 
+-- > audition (out 0 (soundIn 4))
 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
--- a/Sound/SC3/Graph/F0_1_4Q6.hs
+++ b/Sound/SC3/Graph/F0_1_4Q6.hs
@@ -2,15 +2,15 @@
 module Sound.SC3.Graph.F0_1_4Q6 where
 
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- 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)]
+-- > let set p = withSC3 (send (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
@@ -31,16 +31,19 @@
         src = mixFill 11 fn
     in synthdef "risset" (out 0 (pan2 src pan 1))
 
-pattern :: [P_Bind]
+pattern :: (Synthdef,Int,P.Param)
 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)]
+    let fr = let d = P.rand 'α' [0,2,5,7,11]
+                 o = P.rand 'β' [4,5,6,7,9]
+                 sc = [0,2,4,5,7,9,11]
+             in P.degree_to_cps' sc 12 d o
+        du = P.rand 'γ' [2,3,5,7]
+    in (risset,1000
+       ,[("freq",fr)
+        ,("dur",du)
+        ,("sustain",map (* 1.25) du)
+        ,("amp",P.white 'δ' 0.025 0.15)
+        ,("trig",repeat 1)])
 
 main :: IO ()
-main = audition (pmono pattern)
+main = audition (P.nbind1 pattern)
diff --git a/Sound/SC3/Graph/F0_buffer_display.hs b/Sound/SC3/Graph/F0_buffer_display.hs
--- a/Sound/SC3/Graph/F0_buffer_display.hs
+++ b/Sound/SC3/Graph/F0_buffer_display.hs
@@ -3,7 +3,7 @@
 
 import Control.Concurrent {- base -}
 import qualified Graphics.Rendering.Cairo as C {- cairo -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Cairo.Scope.Shell {- hsc3-cairo -}
 
 -- * Type
@@ -119,7 +119,7 @@
 
 {-
 
-import Sound.SC3.ID
+import Sound.SC3
 
 let s = saw AR (mouseX KR 20 800 Exponential 0.2)
 in audition (out 0 s)
diff --git a/Sound/SC3/Graph/F0_f0_454598285861617665.hs b/Sound/SC3/Graph/F0_f0_454598285861617665.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_454598285861617665.hs
@@ -0,0 +1,16 @@
+-- https://twitter.com/redFrik/status/454598285861617665 (f0)
+module Sound.SC3.Graph.F0_f0_454598285861617665 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_454598285861617665 :: UGen
+f0_454598285861617665 =
+    let b = mce [9,8 .. 1]
+        c = lfTri AR (3 ** lfTri AR (1 / b) (b / 9)) 0
+        d = lfTri AR (1 / b) 0 `modE` 1 / 9 + 0.01
+        f = 2 ** roundE (lfTri AR (b / 99) 0) * 99 * b
+        o = grainSin 2 c d f 0 (-1) 512
+    in splay (tanh o) 1 1 0 True / 2
+
+main :: IO ()
+main = audition (out 0 f0_454598285861617665)
diff --git a/Sound/SC3/Graph/F0_f0_456384156159574016.hs b/Sound/SC3/Graph/F0_f0_456384156159574016.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_456384156159574016.hs
@@ -0,0 +1,14 @@
+-- https://twitter.com/redFrik/status/456384156159574016 (f0)
+module Sound.SC3.Graph.F0_f0_456384156159574016 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_456384156159574016 :: UGen
+f0_456384156159574016 =
+    let a = 1 / mce [3,12,4,1,6,2]
+        s = lag3 (sinOsc AR a 0) (abs (sinOsc AR (2.67 ** a) 0)) * 99
+        f = ((sinOsc AR ((1 / a) / 9) a >* 0) * 20 + 99) / a
+    in splay (sinOsc AR (hpf (ringz s f 1) 440) 0) 1 1 0 True * 0.25
+
+main :: IO ()
+main = audition (out 0 f0_456384156159574016)
diff --git a/Sound/SC3/Graph/F0_f0_tw0026.hs b/Sound/SC3/Graph/F0_f0_tw0026.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0026.hs
@@ -0,0 +1,34 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
+module Sound.SC3.Graph.F0_f0_tw0026 where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Collection.Extension {- hsc3-lang -}
+import Sound.SC3.Lang.Math {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern.Plain {- hsc3-lang -}
+
+fibs :: Num n => [n]
+fibs = 0 : scanl (+) 1 fibs
+
+-- | In SC3, List.fibs begins at 1.
+nfibs :: Num a => Int -> [a]
+nfibs n = take n (tail fibs)
+
+-- | In SC3, % of zero is zero.
+mod0 :: (Extending f, Integral c) => f c -> f c -> f c
+mod0 l = let f p q = if q == 0 then 0 else p `mod` q in zipWith_c f l
+
+post_proc :: UGen
+post_proc = let s = combL (tanh (in' 1 AR 8) / 8) 1 1 8 in mce2 s s * 0.1
+
+pattern :: NRT
+pattern =
+    let d = nfibs 32 `mod0` (nfibs 64  `mod0` [12])
+        f = map (\x -> degree_to_cps [0,2,4,5,7,9,11] 12 (fromIntegral x) 4) d
+    in sbind1 (defaultSynthdef
+              ,[("amp",repeat 8)
+               ,("dur",repeat 0.25)
+               ,("freq",cycle f)
+               ,("out",repeat 8)])
+
+main :: IO ()
+main = audition (out 0 post_proc) >> audition pattern
diff --git a/Sound/SC3/Graph/F0_f0_tw0028.hs b/Sound/SC3/Graph/F0_f0_tw0028.hs
--- a/Sound/SC3/Graph/F0_f0_tw0028.hs
+++ b/Sound/SC3/Graph/F0_f0_tw0028.hs
@@ -1,7 +1,7 @@
 -- http://www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
 module Sound.SC3.Graph.F0_f0_tw0028 where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 fib :: Integral i => [i]
 fib = 0 : scanl (+) 1 fib
diff --git a/Sound/SC3/Graph/F0_f0_tw0030.hs b/Sound/SC3/Graph/F0_f0_tw0030.hs
--- a/Sound/SC3/Graph/F0_f0_tw0030.hs
+++ b/Sound/SC3/Graph/F0_f0_tw0030.hs
@@ -1,7 +1,7 @@
 -- www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
 module Sound.SC3.Graph.F0_f0_tw0030 where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 f0_0030 :: UGen
 f0_0030 =
@@ -9,7 +9,7 @@
         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)
+    in out 0 (gVerb o 80 3 0.5 0.5 15 1 0.7 0.5 300 * 0.1)
 
 main :: IO ()
 main = audition f0_0030
diff --git a/Sound/SC3/Graph/F0_f0_tw0033.hs b/Sound/SC3/Graph/F0_f0_tw0033.hs
--- a/Sound/SC3/Graph/F0_f0_tw0033.hs
+++ b/Sound/SC3/Graph/F0_f0_tw0033.hs
@@ -1,8 +1,7 @@
 -- 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
+import Sound.SC3 {- hsc3 -}
 
 f0_0033 :: UGen
 f0_0033 =
@@ -11,7 +10,7 @@
         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)
+    in out 0 (splay ((o >* n) / 3) 1 1 0 True * 0.1)
 
 main :: IO ()
 main = audition f0_0033
diff --git a/Sound/SC3/Graph/F0_f0_tw0041.hs b/Sound/SC3/Graph/F0_f0_tw0041.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0041.hs
@@ -0,0 +1,16 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
+module Sound.SC3.Graph.F0_f0_tw0041 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0041 :: UGen
+f0_tw0041 =
+    let s = sweep (localIn' 6 AR) 1
+        i = impulse AR (mce [1,0.749,6,12,3,4]) 0
+        o = sinOsc AR (1 / runningMax s i) 0
+    in mrg [tanh (splay o 1 1 0 True) / 2 * 0.1
+           ,localOut o]
+
+main :: IO ()
+main = audition (out 0 f0_tw0041)
+
diff --git a/Sound/SC3/Graph/F0_f0_tw0045.hs b/Sound/SC3/Graph/F0_f0_tw0045.hs
--- a/Sound/SC3/Graph/F0_f0_tw0045.hs
+++ b/Sound/SC3/Graph/F0_f0_tw0045.hs
@@ -9,7 +9,7 @@
         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))
+    in tanh (a f p 1 0) * 0.1
 
 main :: IO ()
-main = audition f0_0045
+main = audition (out 0 f0_0045)
diff --git a/Sound/SC3/Graph/F0_f0_tw0120.hs b/Sound/SC3/Graph/F0_f0_tw0120.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0120.hs
@@ -0,0 +1,17 @@
+-- http://sccode.org/1-4Qy (f0)
+module Sound.SC3.Graph.F0_f0_tw0120 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0120 :: UGen
+f0_tw0120 =
+    let a = lfTri
+        z = a KR (1 / mce2 7 8) 0 * a KR (1 / 9) 0 * 99
+        l = midiCPS (mce [60 .. 79])
+        f = select z l
+        w = a KR (1 / mce2 3 4) 0 `modE` 1
+        o = varSaw AR f 0 w
+    in combN o 1 (1 / mce2 5 6) 8 / 4
+
+main :: IO ()
+main = audition (out 0 f0_tw0120)
diff --git a/Sound/SC3/Graph/F0_f0_tw0121.hs b/Sound/SC3/Graph/F0_f0_tw0121.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0121.hs
@@ -0,0 +1,16 @@
+-- http://sccode.org/1-4Qy (f0)
+module Sound.SC3.Graph.F0_f0_tw0121 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0121 :: UGen
+f0_tw0121 =
+    let a = sinOsc
+        z = a KR (1 / mce2 8 7) 0 * a KR (1 / 30) 0 * 9
+        l = midiCPS (mce [56,62 .. 98])
+        m = a AR (1 / mce2 4 3) 0
+        o = a AR (select z l) 0 * m
+    in tanh (combN o 1 (1 / mce2 6 5) 9)
+
+main :: IO ()
+main = audition (out 0 f0_tw0121)
diff --git a/Sound/SC3/Graph/F0_f0_tw0125.hs b/Sound/SC3/Graph/F0_f0_tw0125.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0125.hs
@@ -0,0 +1,17 @@
+-- http://sccode.org/1-4Qy (f0)
+module Sound.SC3.Graph.F0_f0_tw0125 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0125 :: UGen
+f0_tw0125 =
+    let a = sinOsc AR
+        f = a (1 / mce [8,9]) 0 * 4 + mce [400,202]
+        u = (a (1/9) 0 + 1) / 88
+        d = (a (1/8) 0 + 1) / 99
+        i = inFeedback 1 (mce [1,0])
+        p = combC (lagUD i u d) 1 0.08 9
+    in a f p
+
+main :: IO ()
+main = audition (out 0 f0_tw0125)
diff --git a/Sound/SC3/Graph/F0_f0_tw0134.hs b/Sound/SC3/Graph/F0_f0_tw0134.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0134.hs
@@ -0,0 +1,24 @@
+-- http://sccode.org/1-4Qy (f0)
+-- scsynth -u 57110 -w 512
+module Sound.SC3.Graph.F0_f0_tw0134 where
+
+import Sound.SC3 {- hsc3 -}
+
+mean :: Fractional a => [a] -> a
+mean l = sum l / fromIntegral (length l)
+
+f0_tw0134 :: UGen
+f0_tw0134 =
+    let a = lfSaw AR
+        n' = 50
+        n = constant n'
+        z i = let o1 = a ((i + 1) / mce [3,4]) 0
+                  o2 = a ((i + 1) / 8) 0 + 1
+                  f0 = o1 >* o2 * (n / 2) + n
+                  m = a ((i + 1) / n) (i / (n / 2))
+                  o3 = blip AR f0 (i + mce [2,3]) * m
+              in ringz o3 ((i + 1) * (n * 2 - 1)) 0.1
+    in mean (map z [0 .. n'])  / 5
+
+main :: IO ()
+main = audition (out 0 f0_tw0134)
diff --git a/Sound/SC3/Graph/F0_f0_tw0220.hs b/Sound/SC3/Graph/F0_f0_tw0220.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0220.hs
@@ -0,0 +1,21 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/617 (f0)
+module Sound.SC3.Graph.F0_f0_tw0220 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0220 :: UGen
+f0_tw0220 =
+    let c = inFeedback 1 0
+        b = clearBuf (localBuf 'α' 1 90000)
+        g = tGrains 2 (sinOsc AR 3 0) b (c + 3) 2 12 0 0.1 4
+        r = recordBuf AR b 0 1 0 1 Loop 1 DoNothing c
+    in mrg2 (hpf (sinOsc AR 99 (c * 6) / 9 + g) 9) r
+
+main :: IO ()
+main = withSC3 (play (out 0 f0_tw0220))
+
+{-
+2014-10-11: tgrains needs a patch to work with localbuf
+http://article.gmane.org/gmane.comp.audio.supercollider.user/110110
+main = withSC3 (async (b_alloc bufnum 90000 1) >> play (out 0 f0_tw0220))
+-}
diff --git a/Sound/SC3/Graph/F0_f0_tw0224.hs b/Sound/SC3/Graph/F0_f0_tw0224.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0224.hs
@@ -0,0 +1,15 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/617 (f0)
+module Sound.SC3.Graph.F0_f0_tw0224 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0224 :: UGen
+f0_tw0224 =
+    let c = 200000
+        b = clearBuf (localBuf 'α' 2 c)
+        d = bufRd 2 AR b (sinOsc AR (mce2 2 3 * 9) 0 * c) NoLoop LinearInterpolation
+        w = bufWr b (abs (sinOsc AR (mce2 99 145) 0) * c) Loop (sinOsc AR (3 / mce2 2 3) 0 / 3)
+    in mrg2 d w
+
+main :: IO ()
+main = audition (out 0 f0_tw0224)
diff --git a/Sound/SC3/Graph/F0_f0_tw0225.hs b/Sound/SC3/Graph/F0_f0_tw0225.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/F0_f0_tw0225.hs
@@ -0,0 +1,13 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/617 (f0)
+module Sound.SC3.Graph.F0_f0_tw0225 where
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0225 :: UGen
+f0_tw0225 =
+    let b = mce [1..8] * 99
+        o = blip AR (b / 2 + lfSaw KR ((-8) / b) 1 * 99) (b / 4 + (lfSaw KR (1 / b) 1 * 99))
+    in sin (splay (combN (o * sinOsc AR (8 / b) (lfSaw AR (99 / b) 0)) 0.2 0.2 1) 1 1 0 True)
+
+main :: IO ()
+main = audition (out 0 f0_tw0225)
diff --git a/Sound/SC3/Graph/F0_hansm.hs b/Sound/SC3/Graph/F0_hansm.hs
--- a/Sound/SC3/Graph/F0_hansm.hs
+++ b/Sound/SC3/Graph/F0_hansm.hs
@@ -1,4 +1,4 @@
--- http://www.fredrikolofsson.com/f0blog/?q=node/457 (f0)
+-- http://www.fredrikolofsson.com/f0blog/?q=node/457 (f0) (af)
 -- http://obiwannabe.co.uk/tutorials/html/tutorial_birds.html
 module Sound.SC3.Graph.F0_hansm where
 
diff --git a/Sound/SC3/Graph/F0_red_frik_m.hs b/Sound/SC3/Graph/F0_red_frik_m.hs
--- a/Sound/SC3/Graph/F0_red_frik_m.hs
+++ b/Sound/SC3/Graph/F0_red_frik_m.hs
@@ -1,23 +1,23 @@
 -- red_frik (f0)
 module Sound.SC3.Graph.F0_red_frik_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  r1 <- tRandM 0.3 3 tr
+  r2 <- tRandM 0.3 5 tr
+  r3 <- tRandM 0 0.5 tr
+  r4 <- tRandM 0.49 0.56 tr
+  r5 <- tRandM 0.3 0.6 tr
+  r6 <- tRandM 0.3 0.5 tr
   let o1 = fSinOsc KR r2 0 * r3 + r4
-      o2 = fSinOsc KR o1 r5 * r6
+      o2 = fSinOsc KR o1 0 * r5 + r6
   return (rhpf n r1 o2)
 
 red_frik :: UId m => m UGen
 red_frik = do
-  n <- clone 2 (brownNoise AR)
+  n <- clone 2 (brownNoiseM AR)
   let tr = impulse KR 0.1 0
   red tr n
 
diff --git a/Sound/SC3/Graph/F0_sinusdeklinationen.hs b/Sound/SC3/Graph/F0_sinusdeklinationen.hs
--- a/Sound/SC3/Graph/F0_sinusdeklinationen.hs
+++ b/Sound/SC3/Graph/F0_sinusdeklinationen.hs
@@ -1,41 +1,34 @@
 -- http://www.fredrikolofsson.com/f0blog/?q=node/488 (f0)
+{-# OPTIONS_GHC -F -pgmF hsc3-psynth #-}
 module Sound.SC3.Graph.F0_sinusdeklinationen where
 
 import Data.List.Split {- split -}
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3.Lang.Collection.Numerical.Truncating () {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- 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
+sinuscell :: Synthdef
+sinuscell = psynth {bus=0,pan=0,amp=0.5,freq=400,atk=1,sus=0.2,rel=1} where
+    let e_d = envLinen atk sus rel amp
         e = envGen KR 1 0.1 0 1 RemoveSynth e_d
-        s = sinOsc AR fre 0
-    in out b (pan2 s p e)
+        s = sinOsc AR freq 0
+    in out bus (pan2 s pan e)
 
-pattern :: Enum e => (Field,[e]) -> [P_Bind]
+pattern :: Enum e => (Double,[e]) -> (Synthdef,P.Param)
 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)]
+          let a = P.white z0 0 1
+              s = repeat 0.2
+              r = P.white z1 0 1
+          in (sinuscell
+             ,[("dur",a + s + r)
+              ,("amp",P.white z3 0 1)
+              ,("freq",P.white z2 0 1100)
+              ,("atk",a)
+              ,("sus",s)
+              ,("rel",r)
+              ,("pan",repeat c)])
       _ -> undefined
 
 cells :: Fractional n => [n]
@@ -44,4 +37,4 @@
 main :: IO ()
 main =
     let c = zip cells (chunksOf 4 ['α'..])
-    in audition (ppar (map (pbind . pattern) c))
+    in audition (P.sbind (map pattern c))
diff --git a/Sound/SC3/Graph/JJ_bohlen_pierce_140.hs b/Sound/SC3/Graph/JJ_bohlen_pierce_140.hs
--- a/Sound/SC3/Graph/JJ_bohlen_pierce_140.hs
+++ b/Sound/SC3/Graph/JJ_bohlen_pierce_140.hs
@@ -1,8 +1,8 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 bp140u :: UGen
 bp140u =
@@ -15,6 +15,4 @@
 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
+main = audition (P.sbind1 (bp140,[("dur",P.rand 'δ' [1/6,1/3])]))
diff --git a/Sound/SC3/Graph/JL_bitwise.hs b/Sound/SC3/Graph/JL_bitwise.hs
--- a/Sound/SC3/Graph/JL_bitwise.hs
+++ b/Sound/SC3/Graph/JL_bitwise.hs
@@ -14,7 +14,7 @@
               ((t *  5) .&. (t .>>. (mce2 3 4))) .|.
               ((t *  2) .&. (t .>>. 9)) .|.
               ((t *  8) .&. (t .>>. 11))) - 3) .%. 256
-    in tanh (hpf (((s / 127) - 1) * 3) 20)
+    in tanh (hpf (((s / 127) - 1) * 3) 20) * 0.02
 
 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
--- a/Sound/SC3/Graph/JL_dark_sea_horns.hs
+++ b/Sound/SC3/Graph/JL_dark_sea_horns.hs
@@ -1,14 +1,13 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 dark_sea_horns :: UGen
 dark_sea_horns =
     let n = lfNoise1
-        x = localIn 2 AR
+        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)
diff --git a/Sound/SC3/Graph/JL_dark_sea_horns_hp.hs b/Sound/SC3/Graph/JL_dark_sea_horns_hp.hs
--- a/Sound/SC3/Graph/JL_dark_sea_horns_hp.hs
+++ b/Sound/SC3/Graph/JL_dark_sea_horns_hp.hs
@@ -2,15 +2,15 @@
 {-# 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 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 dark_sea_horns :: UId m => m UGen
 dark_sea_horns = do
-  let n = lfNoise1
-  let x = localIn 2 AR
+  let n = lfNoise1M
+  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 f i = do return (allpassN i 0.3 #(randNM 2 0.1 0.3) 5)
   let o = tanh #(chainM 9 f a)
   return (mrg2 o (localOut o))
 
diff --git a/Sound/SC3/Graph/JL_pwm_crossfade.hs b/Sound/SC3/Graph/JL_pwm_crossfade.hs
--- a/Sound/SC3/Graph/JL_pwm_crossfade.hs
+++ b/Sound/SC3/Graph/JL_pwm_crossfade.hs
@@ -1,7 +1,7 @@
 -- http://sccode.org/1-L (jl)
 module Sound.SC3.Graph.JL_pwm_crossfade where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 urangeM :: UGen -> UGen -> UGen
 urangeM u = let [u0,u1] = mceChannels u in urange u0 u1
diff --git a/Sound/SC3/Graph/JL_rain_thunder.hs b/Sound/SC3/Graph/JL_rain_thunder.hs
--- a/Sound/SC3/Graph/JL_rain_thunder.hs
+++ b/Sound/SC3/Graph/JL_rain_thunder.hs
@@ -1,7 +1,7 @@
 -- http://sccode.org/1-e (jl)
 module Sound.SC3.Graph.JL_rain_thunder where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 rain_thunder :: UGen
 rain_thunder =
diff --git a/Sound/SC3/Graph/JMCC_aleatoric_quartet_m.hs b/Sound/SC3/Graph/JMCC_aleatoric_quartet_m.hs
--- a/Sound/SC3/Graph/JMCC_aleatoric_quartet_m.hs
+++ b/Sound/SC3/Graph/JMCC_aleatoric_quartet_m.hs
@@ -1,28 +1,29 @@
--- aleatoric quartet (jmcc)
+-- aleatoric quartet (jmcc) #7
 module Sound.SC3.Graph.JMCC_aleatoric_quartet_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
+-- > g <- aleatoric_quartet
 aleatoric_quartet :: UId m => m UGen
 aleatoric_quartet = do
-  let base_mn = control KR "note" 66
-      amp = control KR "ampl" 0.07
+  let base_mn = 66 -- control KR "note" 66
+      amp = 0.07 -- 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)
+      rapf i = do r <- clone 2 (randM 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
+      mk_f = do r0 <- lchooseM [1, 0.5, 0.25]
+                r1 <- randM (-30) 30
+                n0 <- lfNoise0M 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
+                r <- randM (-1) 1
+                x <- do n0 <- pinkNoiseM AR
+                        n1 <- lfNoise1M 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))
diff --git a/Sound/SC3/Graph/JMCC_alien_froggies.hs b/Sound/SC3/Graph/JMCC_alien_froggies.hs
--- a/Sound/SC3/Graph/JMCC_alien_froggies.hs
+++ b/Sound/SC3/Graph/JMCC_alien_froggies.hs
@@ -1,14 +1,15 @@
--- alien froggies (jmcc)
+-- alien froggies (jmcc) #1
 module Sound.SC3.Graph.JMCC_alien_froggies where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
-alien_froggies :: UGen -> (UGen,UGen)
+alien_froggies :: 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')
+    in o * 0.05
 
+-- > let u = alien_froggies 11
 main :: IO ()
-main = overlapTextureS (0.25,0.5,5,maxBound) alien_froggies 11
+main = overlapTextureU (0.25,0.5,5,maxBound) (alien_froggies 11)
diff --git a/Sound/SC3/Graph/JMCC_alien_froggies_rec.hs b/Sound/SC3/Graph/JMCC_alien_froggies_rec.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_alien_froggies_rec.hs
@@ -0,0 +1,14 @@
+-- alien froggies (jmcc) #1
+module Sound.SC3.Graph.JMCC_alien_froggies_rec where
+
+import Sound.SC3 {- 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
--- a/Sound/SC3/Graph/JMCC_alien_meadow.hs
+++ b/Sound/SC3/Graph/JMCC_alien_meadow.hs
@@ -1,17 +1,14 @@
--- alien meadow (jmcc)
+-- alien meadow (jmcc) #6
 module Sound.SC3.Graph.JMCC_alien_meadow where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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)
+    let b = rand 'α' 0 5000
+        f = sinOsc AR (rand 'β' 0 20) 0 * b * 0.1 + b
+    in pan2 (sinOsc AR f 0) (rand 'γ' (-1) 1) (sinOsc AR (rand 'δ' 0 20) 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
--- a/Sound/SC3/Graph/JMCC_analog_bubbles.hs
+++ b/Sound/SC3/Graph/JMCC_analog_bubbles.hs
@@ -1,8 +1,12 @@
--- analog bubbles (jmcc)
+-- analog bubbles (jmcc) #1
 module Sound.SC3.Graph.JMCC_analog_bubbles where
 
 import Sound.SC3 {- hsc3 -}
 
+-- > putStrLn$synthstat analog_bubbles
+-- > let g = synthdef_to_graphdef (synthdef "analog-bubbles" (out 0 analog_bubbles))
+-- > import qualified Sound.SC3.Server.Graphdef as G
+-- > putStrLn$G.graphdef_stat g
 analog_bubbles :: UGen
 analog_bubbles =
   let o = lfSaw KR (mce2 8 7.23) 0 * 3 + 80
diff --git a/Sound/SC3/Graph/JMCC_analog_bubbles_mouse.hs b/Sound/SC3/Graph/JMCC_analog_bubbles_mouse.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_analog_bubbles_mouse.hs
@@ -0,0 +1,17 @@
+-- analog bubbles with mouse control (jmcc) #3
+module Sound.SC3.Graph.JMCC_analog_bubbles_mouse where
+
+import Sound.SC3 {- hsc3 -}
+
+analog_bubbles_mouse :: UGen
+analog_bubbles_mouse =
+  let y = mouseY KR 0.1 10 Exponential 0.2 -- lfo 1 rate
+      x = mouseX KR 2 40 Exponential 0.2  -- lfo 2 rate
+      o2 = lfSaw KR x 0 * (-3) + 80 -- depth & offset in semitones
+      o1 = lfSaw KR y 0 * 24 + o2 -- depth in semitones, offset is lfo_2
+      f = midiCPS o1 -- convert to frequency
+      s = sinOsc AR f 0 * 0.04
+  in combN s 0.2 0.2 4 -- echoing sine wave
+
+main :: IO ()
+main = audition (out 0 analog_bubbles_mouse)
diff --git a/Sound/SC3/Graph/JMCC_analogue_daze.hs b/Sound/SC3/Graph/JMCC_analogue_daze.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_analogue_daze.hs
@@ -0,0 +1,25 @@
+-- analogue daze (jmcc) #3
+module Sound.SC3.Graph.JMCC_analogue_daze where
+
+import Sound.SC3 {- hsc3 -}
+
+analogue_daze :: UGen
+analogue_daze =
+    let pattern = [55,63,60,63,57,65,62,65]
+        sequ k s tr = demand tr 0 (dseq k dinf (mce s))
+        f k octave clockRate pwmrate fltrate =
+            let trg = impulse KR clockRate 0
+                pattern' = map (midiCPS .  (+ (12 * octave))) pattern
+                sq = sequ 'α' pattern' trg
+                pwm = sinOsc KR pwmrate (rand ('β' `joinID` k) 0 (2 * pi)) * 0.4 + 0.5
+                cf = sinOsc KR fltrate (rand ('γ' `joinID` k) 0 (2 * pi)) * 1400 + 2000
+            in rlpf (lfPulse AR (lag sq 0.05) 0 pwm * 0.1) cf (1/15)
+        a = lfNoise0 'δ' AR (lfNoise1 'ε' KR 0.3 * 6000 + 8000) * (mce2 0.07 0.08)
+        x = decay (impulse AR 2 0) 0.15 * a
+        g = mce [f 'ζ' 1 8 0.31 0.2,f 'η' 0 2 0.13 0.11] + x
+        z = 0.4 * (combN g 0.375 0.375 5 + mceReverse g)
+        e = envLinen 2 56 2 1
+    in z * envGen KR 1 1 0 1 RemoveSynth e
+
+main :: IO ()
+main = audition (out 0 analogue_daze)
diff --git a/Sound/SC3/Graph/JMCC_babbling_brook.hs b/Sound/SC3/Graph/JMCC_babbling_brook.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_babbling_brook.hs
@@ -0,0 +1,17 @@
+-- babbling brook (jmcc) #SC3
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
+module Sound.SC3.Graph.JMCC_babbling_brook where
+
+import Sound.SC3 {- hsc3 -}
+
+babbling_brook :: UGen
+babbling_brook =
+  let b f m a g = let n3 = lpf (brownNoise 'α' AR) f * m + a
+                      n4 = onePole (brownNoise 'β' AR) 0.99
+                  in rhpf n4 n3 0.03 * g
+      x = uclone 'γ' 2 (b 14 400 500 0.006)
+      y = uclone 'δ' 2 (b 20 800 1000 0.010)
+  in x + y
+
+main :: IO ()
+main = audition (out 0 babbling_brook)
diff --git a/Sound/SC3/Graph/JMCC_babbling_brook_m.hs b/Sound/SC3/Graph/JMCC_babbling_brook_m.hs
--- a/Sound/SC3/Graph/JMCC_babbling_brook_m.hs
+++ b/Sound/SC3/Graph/JMCC_babbling_brook_m.hs
@@ -1,13 +1,13 @@
--- babbling brook (jmcc)
+-- babbling brook (jmcc) #SC3
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
 
 babbling_brook :: UId m => m UGen
 babbling_brook = do
-  let b f m a g = do n1 <- brownNoise AR
-                     n2 <- brownNoise AR
+  let b f m a g = do n1 <- brownNoiseM AR
+                     n2 <- brownNoiseM AR
                      let n3 = lpf n2 f * m + a
                          n4 = onePole n1 0.99
                      return (rhpf n4 n3 0.03 * g)
diff --git a/Sound/SC3/Graph/JMCC_berlin_1977.hs b/Sound/SC3/Graph/JMCC_berlin_1977.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_berlin_1977.hs
@@ -0,0 +1,32 @@
+-- berlin 1977 (jmcc) #4
+module Sound.SC3.Graph.JMCC_berlin_1977 where
+
+import Sound.SC3 {- hsc3 -}
+
+-- Somewhat akin to SC2 Sequencer.
+sequ :: ID a => a -> [UGen] -> UGen -> UGen
+sequ e s tr = demand tr 0 (dseq e dinf (mce s))
+
+-- Somewhat akin to SC2 Sequencer with random selection function as input.
+sequR :: ID a => a -> [UGen] -> UGen -> UGen
+sequR e s tr = demand tr 0 (dshuf e dinf (mce s))
+
+berlin_1977 :: UGen
+berlin_1977 =
+    let clock_rate = mouseX KR 5 20 Exponential 0.2 -- mouse x controls clock rate
+        clock_time = 1 / clock_rate
+        clock = impulse KR clock_rate 0 -- sequencer trigger
+        patternList = [55,60,63,62,60,67,63,58];
+        note = sequ 'α' patternList clock -- midi note pattern sequencer
+        clock_16 = pulseDivider clock 16 0 -- divide clock by 16
+        note' = sequR 'β' [-12,-7,-5,0,2,5] clock_16 + note -- transpose somewhat randomly
+        freq = midiCPS note' -- convert midi note to cycles per second
+        env = decay2 clock (0.05 * clock_time) (2 * clock_time)
+        amp = env * 0.1 + 0.02 -- amplitude envelope
+        filt = env * (fSinOsc KR 0.17 0 * 800)+ 1400 -- filter frequency
+        pw = sinOsc KR 0.08 (mce2 0 (0.5 * pi)) * 0.45 + 0.5 -- pulse width LFO(s)
+        s = pulse AR freq pw * amp
+    in combN (rlpf s filt 0.15) 0.2 (mce2 0.2 0.17) 1.5
+
+main :: IO ()
+main = audition (out 0 berlin_1977)
diff --git a/Sound/SC3/Graph/JMCC_birdies.hs b/Sound/SC3/Graph/JMCC_birdies.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_birdies.hs
@@ -0,0 +1,21 @@
+-- birdies (jmcc) #6
+module Sound.SC3.Graph.JMCC_birdies where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (- n) n
+
+birdies :: UGen
+birdies =
+    let p1 = lfPulse KR (0.4 + rand 'α' 0 1) 0 (rand 'β' 0 0.8 + 0.1) * (rand 'γ' 0 3 + 4) + 2
+        p2 = lfPulse KR (0.4 + rand 'δ' 0 1) 0 (rand 'ε' 0 0.8 + 0.1) * (rand 'ζ' 0 3 + 4)
+        p3 = lfPulse KR (0.2 + rand 'η' 0 0.5) 0 0.4 * 0.02
+        sw = lfSaw KR (p1 + p2) 0 * (- (1000 + rand 'θ' 0 800)) + (4000 + rand2 'ι' 1200)
+        freq = lag sw 0.05
+        amp = lag p3 0.3
+    in pan2 (sinOsc AR freq 0 * amp) (rand2 'κ' 1) 1
+
+main :: IO ()
+main = overlapTextureU (7,4,4,maxBound) birdies
diff --git a/Sound/SC3/Graph/JMCC_birds.hs b/Sound/SC3/Graph/JMCC_birds.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_birds.hs
@@ -0,0 +1,22 @@
+-- birds (jmcc)
+module Sound.SC3.Graph.JMCC_birds where
+
+import Sound.SC3 {- hsc3 -}
+
+node :: UGen
+node =
+  let f = lag (lfSaw AR (7 + rand 'α' (-1.5) 1.5) (rand 'β' 0 1) * rand 'γ' 11 15) 0.1 + rand 'δ' 94 102
+      a = lfPulse KR (1 / rand 'ε' 12 15.6) (rand 'ζ' 0 1) 0.16 * 0.05
+      b = sinOsc AR (midiCPS f) (rand 'η' 0 1) * a
+  in rotate2 b (silent 1) (rand 'θ' (-1) 1)
+
+-- > putStrLn$synthstat birds
+birds :: UGen
+birds =
+  let d = mix (uclone 'α' 6 node)
+      f i = allpassL i 0.07 (rand 'β' 0 0.06) (rand 'γ' 0.7 2.0)
+      w = useq 'δ' 12 f d
+  in d * 0.7 + w * 0.3
+
+main :: IO ()
+main = audition (out 0 birds)
diff --git a/Sound/SC3/Graph/JMCC_birds_hp.hs b/Sound/SC3/Graph/JMCC_birds_hp.hs
--- a/Sound/SC3/Graph/JMCC_birds_hp.hs
+++ b/Sound/SC3/Graph/JMCC_birds_hp.hs
@@ -3,21 +3,22 @@
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.JMCC_birds_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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))
+  let f = lag (lfSaw AR (7 + #(randM (-1.5) 1.5)) #(randM 0 1) * #(randM 11 15)) 0.1 + #(randM 94 102)
+  let a = lfPulse KR (1 / #(randM 12 15.6)) #(randM 0 1) 0.16 * 0.05
+  let b = sinOsc AR (midiCPS f) #(randM 0 1) * a
+  return (rotate2 b (silent 1) #(randM (-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
+  let f i = do return (allpassL i 0.07 #(randM 0 0.06) #(randM 0.7 2.0))
+  w <- chainM 12 f d
   return (d * 0.7 + w * 0.3)
 
+-- > birds >>= putStrLn . synthstat
 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
--- a/Sound/SC3/Graph/JMCC_birds_m.hs
+++ b/Sound/SC3/Graph/JMCC_birds_m.hs
@@ -2,28 +2,29 @@
 -- 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 -}
+import Sound.SC3 {- 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 node = do r1 <- randM 94.0 102.0
+                r2 <- randM (-1.5) 1.5
+                r3 <- randM 0.0 1.0
+                r4 <- randM 11.0 15.0
+                r5 <- randM 0.0 1.0
+                r6 <- randM 12.0 15.6
+                r7 <- randM 0.0 1.0
+                r8 <- randM (-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
+      apf i = do r1 <- randM 0.0 0.06
+                 r2 <- randM 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)
 
+-- > birds >>= putStrLn . synthstat
 main :: IO ()
 main = audition . out 0 =<< birds
diff --git a/Sound/SC3/Graph/JMCC_blips_001.hs b/Sound/SC3/Graph/JMCC_blips_001.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_blips_001.hs
@@ -0,0 +1,31 @@
+-- blips 001 (jmcc) #SC3d1.5
+module Sound.SC3.Graph.JMCC_blips_001 where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (-n) n
+
+blip_001 :: ID a => a -> UGen
+blip_001 e =
+    let f = xLine KR (expRand 'α' 0.25 400) (expRand 'β' 0.25 400) 4 DoNothing
+        nh = xLine KR (expRand 'γ' 2 100) (expRand 'δ' 2 100) 4 DoNothing
+    in uprotect e (blip AR f nh)
+
+blips_001 :: UGen
+blips_001 =
+    let c = rand 'ε' 0 1 <* 0.8
+        o = blip_001 'ζ' * blip_001 'η'
+    in (c * pan2 o (line KR (rand2 'θ' 1) (rand2 'ι' 1) 4 DoNothing) 0.3)
+
+-- > let g = blips_pp blips_001
+-- > audition (out 0 (blips_pp blips_001))
+blips_pp :: UGen -> UGen
+blips_pp z =
+    let z' = distort z
+        f x = allpassN x 0.05 (mce2 (rand 'κ' 0 0.05) (rand 'λ' 0 0.05)) 4
+    in useq 'μ' 6 f z'
+
+main :: IO ()
+main = overlapTextureU_pp (2,1,12,maxBound) blips_001 2 blips_pp
diff --git a/Sound/SC3/Graph/JMCC_blips_001_hp.hs b/Sound/SC3/Graph/JMCC_blips_001_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_blips_001_hp.hs
@@ -0,0 +1,34 @@
+-- blips 001 (jmcc) #SC3d1.5
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_blips_001_hp where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: UId m => UGen -> m UGen
+rand2 n = randM (-n) n
+
+blips_001 :: UId m => m UGen
+blips_001 = do
+  let c = #(randM 0 1) <* 0.8
+  let b = do
+        let f = xLine KR #(expRandM 0.25 400) #(expRandM 0.25 400) 4 DoNothing
+        let nh = xLine KR #(expRandM 2 100) #(expRandM 2 100) 4 DoNothing
+        return (blip AR f nh)
+  return (c * pan2 (#(b) * #(b)) (line KR #(rand2 1) #(rand2 1) 4 DoNothing) 0.3)
+
+{-
+iter_m :: (Monad m, Num a, Ord a) => (b -> m b) -> a -> b -> m b
+iter_m f n st = if n > 0 then iter_m f (n - 1) =<< f st else return st
+
+postProcess :: UId m => UGen -> m UGen
+postProcess z = do
+  let z' = distort z
+      f x = do
+        return (allpassN x 0.05 (mce2 #(rand 0 0.05) #(rand 0 0.05)) 4)
+  iter_m f 6 z'
+-}
+
+main :: IO ()
+main = overlapTextureU (2,1,12,maxBound) =<< blips_001
+
diff --git a/Sound/SC3/Graph/JMCC_blips_001_u.hs b/Sound/SC3/Graph/JMCC_blips_001_u.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_blips_001_u.hs
@@ -0,0 +1,34 @@
+-- blips 001 (jmcc) #SC3d1.5
+module Sound.SC3.Graph.JMCC_blips_001_u where
+
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.UGen.Unsafe as U {- hsc3-unsafe -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: UGen -> UGen
+rand2 n = U.rand (-n) n
+
+-- ghci 7.6.3 doesn't see through this...
+blip_001 :: t -> UGen
+blip_001 _ =
+    let f = xLine KR (U.expRand 0.25 400) (U.expRand 0.25 400) 4 DoNothing
+        nh = xLine KR (U.expRand 2 100) (U.expRand 2 100) 4 DoNothing
+    in blip AR f nh
+
+blips_001 :: UGen
+blips_001 =
+    let c = U.rand 0 1 <* 0.8
+        o = blip_001 'α' * blip_001 'β'
+    in (c * pan2 o (line KR (rand2 1) (rand2 1) 4 DoNothing) 0.3)
+
+iter :: (Num a, Ord a) => (t -> t) -> a -> t -> t
+iter f n st = if n > 0 then iter f (n - 1) (f st) else st
+
+postProcess :: UGen -> UGen
+postProcess z =
+    let z' = distort z
+        f x = allpassN x 0.05 (mce2 (U.rand 0 0.05) (U.rand 0 0.05)) 4
+    in iter f 6 z'
+
+main :: IO ()
+main = overlapTextureU_pp (2,1,12,maxBound) blips_001 2 postProcess
diff --git a/Sound/SC3/Graph/JMCC_bouncing_objects.hs b/Sound/SC3/Graph/JMCC_bouncing_objects.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_bouncing_objects.hs
@@ -0,0 +1,24 @@
+-- bouncing objects (jmcc) #2
+module Sound.SC3.Graph.JMCC_bouncing_objects where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.ID as R {- hsc3-lang -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+
+bouncing_objects :: UGen
+bouncing_objects =
+  let imp_frq = xLine KR (5 + rand 'α' (-2) 2) 600 4 DoNothing
+      imp_amp = xLine KR 0.09 0.000009 4 DoNothing
+      imp = impulse AR imp_frq 0 * imp_amp
+      exc = decay imp 0.001
+      flt_frq = randN 4 'β' 400 8400
+      flt_amp = randN 4 'γ' 0 1
+      flt_rtm = randN 4 'δ' 0.01 0.11
+      flt = klank exc 1 0 1 (klankSpec_mce flt_frq flt_amp flt_rtm)
+      loc = pan2 flt (rand 'ε' (-1) 1) 1
+      e = Envelope [1,1,0] [3,0.001] (replicate 2 EnvLin) Nothing Nothing
+  in loc * envGen KR 1 1 0 1 RemoveSynth e
+
+main :: IO ()
+main = spawnTextureU (\i -> R.rrand i 0.6 1.6,maxBound) bouncing_objects
diff --git a/Sound/SC3/Graph/JMCC_bowed_string_m.hs b/Sound/SC3/Graph/JMCC_bowed_string_m.hs
--- a/Sound/SC3/Graph/JMCC_bowed_string_m.hs
+++ b/Sound/SC3/Graph/JMCC_bowed_string_m.hs
@@ -1,20 +1,22 @@
 -- bowed string (jmcc)
 module Sound.SC3.Graph.JMCC_bowed_string_m where
 
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
 
+-- > u <- bowed_string
 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
+  n0 <- clone 2 (brownNoiseM AR)
+  r0 <- expRandM 0.125 0.5
+  r1 <- randM 0.7 0.9
+  r2 <- sequence (replicate 12 (randM 1.0 3.0))
+  f <- midiCPS `fmap` (lchooseM scale .+. lchooseM oct)
+  n1 <- lfNoise1M 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)
diff --git a/Sound/SC3/Graph/JMCC_choip.hs b/Sound/SC3/Graph/JMCC_choip.hs
--- a/Sound/SC3/Graph/JMCC_choip.hs
+++ b/Sound/SC3/Graph/JMCC_choip.hs
@@ -1,9 +1,8 @@
--- choip (jmcc)
+-- choip (jmcc) #10
 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 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 xl :: ID a => a -> a -> UGen -> UGen -> UGen -> UGen
@@ -17,7 +16,7 @@
     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
+        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
 
@@ -27,4 +26,4 @@
     in useq 'κ' 4 f
 
 main :: IO ()
-main = overlapTextureU_pp (1,10,8,maxBound) choip 2 choip_pp
+main = overlapTextureU_pp (10,1,8,maxBound) choip 2 choip_pp
diff --git a/Sound/SC3/Graph/JMCC_clustered_sines.hs b/Sound/SC3/Graph/JMCC_clustered_sines.hs
--- a/Sound/SC3/Graph/JMCC_clustered_sines.hs
+++ b/Sound/SC3/Graph/JMCC_clustered_sines.hs
@@ -1,8 +1,7 @@
--- clustered sines (jmcc)
+-- clustered sines (jmcc) #2
 module Sound.SC3.Graph.JMCC_clustered_sines where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 -- > synthstat cs
@@ -11,9 +10,9 @@
     let n = 80
         f1 = rand 'α' 100 1100
         f2 = 4 * f1
-        sp = let y = uclone' 'α' n (f1 + rand 'α' 0 f2)
+        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))
+    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
--- a/Sound/SC3/Graph/JMCC_clustered_sines_m.hs
+++ b/Sound/SC3/Graph/JMCC_clustered_sines_m.hs
@@ -1,17 +1,17 @@
--- clustered sines (jmcc)
+-- clustered sines (jmcc) #2
 module Sound.SC3.Graph.JMCC_clustered_sines_m where
 
 import Control.Monad {- base -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  f1 <- randM 100 1100
   let f2 = 4 * f1
-  y <- replicateM n (f1 +. rand 0 f2)
+  y <- replicateM n (f1 +. randM 0 f2)
   let sp = klangSpec y (map (f1 /) y) (replicate n 0)
   return (klang AR 1 0 sp * (0.3 / fromIntegral n))
 
diff --git a/Sound/SC3/Graph/JMCC_comb_delay_sweeps.hs b/Sound/SC3/Graph/JMCC_comb_delay_sweeps.hs
--- a/Sound/SC3/Graph/JMCC_comb_delay_sweeps.hs
+++ b/Sound/SC3/Graph/JMCC_comb_delay_sweeps.hs
@@ -1,7 +1,7 @@
--- comb delay sweeps (jmcc)
+-- comb delay sweeps (jmcc) #6
 module Sound.SC3.Graph.JMCC_comb_delay_sweeps where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 import System.Random {- random -}
 
@@ -15,7 +15,6 @@
        ,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
@@ -24,7 +23,21 @@
         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))
+    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)
+
+cds' :: UGen
+cds' =
+    let s = fold (rand 'α' (- 7) 8) 50 120
+        e = fold (rand 'β' (- 7) 8) 50 120
+        l = line KR s e 4 DoNothing
+        w = whiteNoise 'γ' AR * 0.005
+        d = 1 / midiCPS l
+        c = 1 / midiCPS s
+        o = combC w 0.01 d (c * 1000)
+    in pan2 o (rand 'δ' (-1) 1) 1
+
+main' :: IO ()
+main' = overlapTextureU (4/3,4/3,9,maxBound) cds'
diff --git a/Sound/SC3/Graph/JMCC_contamination_zone.hs b/Sound/SC3/Graph/JMCC_contamination_zone.hs
--- a/Sound/SC3/Graph/JMCC_contamination_zone.hs
+++ b/Sound/SC3/Graph/JMCC_contamination_zone.hs
@@ -1,9 +1,8 @@
--- contamination zone (jmcc)
+-- contamination zone (jmcc) #9
 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 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 cz :: UGen
@@ -20,6 +19,7 @@
         a = lfPulse KR (linRand 'ι' 0 150 0) 0 (rand 'κ' 0.2 0.4)
     in pan2 r (lfNoise1 'λ' KR (rand 'μ' 0 1)) a
 
+-- > let g = cz_pp (silent 1)
 cz_pp :: UGen -> UGen
 cz_pp =
     let f x = allpassN x 0.04 (randN 2 'ν' 0 0.04) 16
diff --git a/Sound/SC3/Graph/JMCC_coolant.hs b/Sound/SC3/Graph/JMCC_coolant.hs
--- a/Sound/SC3/Graph/JMCC_coolant.hs
+++ b/Sound/SC3/Graph/JMCC_coolant.hs
@@ -1,8 +1,7 @@
--- coolant (jmcc)
+-- coolant (jmcc) #2
 module Sound.SC3.Graph.JMCC_coolant where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 coolant :: UGen
@@ -15,4 +14,4 @@
     in klank s 1 0 1 (mceTranspose sp)
 
 main :: IO ()
-main = xfadeTextureU (4,4,maxBound) coolant
+main = overlapTextureU (4,4,2,maxBound) coolant
diff --git a/Sound/SC3/Graph/JMCC_cymbalism_accelerando.hs b/Sound/SC3/Graph/JMCC_cymbalism_accelerando.hs
--- a/Sound/SC3/Graph/JMCC_cymbalism_accelerando.hs
+++ b/Sound/SC3/Graph/JMCC_cymbalism_accelerando.hs
@@ -1,7 +1,7 @@
--- cymbalism accellerando (jmcc)
+-- cymbalism accelerando (jmcc) #2
 module Sound.SC3.Graph.JMCC_cymbalism_accelerando where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 enumFromN :: Enum a => a -> Int -> [Int]
diff --git a/Sound/SC3/Graph/JMCC_cymbalism_m.hs b/Sound/SC3/Graph/JMCC_cymbalism_m.hs
--- a/Sound/SC3/Graph/JMCC_cymbalism_m.hs
+++ b/Sound/SC3/Graph/JMCC_cymbalism_m.hs
@@ -1,20 +1,21 @@
--- cymbalism (jmcc)
+-- cymbalism (jmcc) #2
 module Sound.SC3.Graph.JMCC_cymbalism_m where
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
+-- > g <- cymbalism
 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))
+  f1 <- randM 500 2500
+  f2 <- randM 0 8000
+  let y = do f <- sequence (p (randM f1 (f1 + f2)))
+             rt <- sequence (p (randM 1 5))
              return (klankSpec f (p 1) rt)
   z <- clone 2 y
-  n <- fmap (* 0.03) (whiteNoise AR)
-  tf <- rand 0.5 3.5
+  n <- fmap (* 0.03) (whiteNoiseM AR)
+  tf <- randM 0.5 3.5
   let t = impulse AR tf 0
       s = decay t 0.004 * n
   return (klank s 1 0 1 (mceTranspose z))
diff --git a/Sound/SC3/Graph/JMCC_data_space.hs b/Sound/SC3/Graph/JMCC_data_space.hs
--- a/Sound/SC3/Graph/JMCC_data_space.hs
+++ b/Sound/SC3/Graph/JMCC_data_space.hs
@@ -1,7 +1,7 @@
--- data space (jmcc)
+-- data space (jmcc) #2
 module Sound.SC3.Graph.JMCC_data_space where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 data_space :: UGen
diff --git a/Sound/SC3/Graph/JMCC_data_space_hp.hs b/Sound/SC3/Graph/JMCC_data_space_hp.hs
--- a/Sound/SC3/Graph/JMCC_data_space_hp.hs
+++ b/Sound/SC3/Graph/JMCC_data_space_hp.hs
@@ -1,13 +1,13 @@
--- data space (jmcc)
+-- data space (jmcc) #2
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.JMCC_data_space_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 data_space :: UId m => m UGen
 data_space = do
-    let r = rand 0
+    let r = randM 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)
@@ -15,9 +15,9 @@
     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
+    dt <- randM 0.15 0.35
     let o = lfPulse AR f 0 0.5 * 0.04
-    l <- lfNoise0 KR #(r 3) .* 0.8
+    l <- lfNoise0M KR #(r 3) .* 0.8
     return (combL (pan2 o l 1) dt dt 3)
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/JMCC_deep_trip.hs b/Sound/SC3/Graph/JMCC_deep_trip.hs
--- a/Sound/SC3/Graph/JMCC_deep_trip.hs
+++ b/Sound/SC3/Graph/JMCC_deep_trip.hs
@@ -1,8 +1,8 @@
--- deep trip (jmcc)
+-- deep trip (jmcc) #9
 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 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU  {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 deep_trip :: UGen
diff --git a/Sound/SC3/Graph/JMCC_default.hs b/Sound/SC3/Graph/JMCC_default.hs
--- a/Sound/SC3/Graph/JMCC_default.hs
+++ b/Sound/SC3/Graph/JMCC_default.hs
@@ -1,18 +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 -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.List as L {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
-pattern :: [P_Bind]
+pattern :: (Synthdef,P.Param)
 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)]
+    let to_cps = P.degree_to_cps' [0,2,4,5,7,9,11] 12
+    in (defaultSynthdef
+       ,[("freq",to_cps (P.xrand 'α' [0,1,5,7,9]) (P.rand 'β' [2,3,4,5,6]))
+        ,("dur",P.wrand 'γ' [0.1,0.2,0.4] [0.5,0.4,0.1])
+        ,("amp",L.brown 'δ' 0.01 0.2 0.01)
+        ,("pan",L.brown 'ε' (-1) 1 0.25)])
 
 main :: IO ()
-main = audition (pbind pattern)
+main = audition (P.sbind1 pattern)
diff --git a/Sound/SC3/Graph/JMCC_demanding_studies.hs b/Sound/SC3/Graph/JMCC_demanding_studies.hs
--- a/Sound/SC3/Graph/JMCC_demanding_studies.hs
+++ b/Sound/SC3/Graph/JMCC_demanding_studies.hs
@@ -1,7 +1,7 @@
 -- demanding studies (jmcc)
 module Sound.SC3.Graph.JMCC_demanding_studies where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 demanding_studies :: UGen
 demanding_studies =
diff --git a/Sound/SC3/Graph/JMCC_distort_input.hs b/Sound/SC3/Graph/JMCC_distort_input.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_distort_input.hs
@@ -0,0 +1,12 @@
+-- distort input (jmcc) #5
+module Sound.SC3.Graph.JMCC_distort_input where
+
+import Sound.SC3 {- hsc3 -}
+
+distort_input :: UGen
+distort_input =
+    let gain = mouseX KR 1 100 Exponential 0.2  -- mouse x controls gain into distortion
+    in distort (soundIn (mce2 0 1) * gain) * 0.4
+
+main :: IO ()
+main = audition (out 0 distort_input)
diff --git a/Sound/SC3/Graph/JMCC_doppler.hs b/Sound/SC3/Graph/JMCC_doppler.hs
--- a/Sound/SC3/Graph/JMCC_doppler.hs
+++ b/Sound/SC3/Graph/JMCC_doppler.hs
@@ -23,9 +23,14 @@
     let t = line KR (-pi/2) (pi * 3/2) dt RemoveSynth
     in (a * cos t,b * sin t)
 
+src :: UGen
+src = rlpf (fSinOsc AR 200 0 * lfPulse AR 31.3 0 0.4) 400 0.3
+
+d1 :: UGen
+d1 = doppler (line_x 10 100 6) src
+
+d2 :: UGen
+d2 = doppler (ellipse 10 75 12) src
+
 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)))
+main = withSC3 (play (out 0 d1) >> wait 8 >> play (out 0 d2))
diff --git a/Sound/SC3/Graph/JMCC_drone_plus_rhythm.hs b/Sound/SC3/Graph/JMCC_drone_plus_rhythm.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_drone_plus_rhythm.hs
@@ -0,0 +1,51 @@
+-- drone plus rhythm (jmcc) #12
+module Sound.SC3.Graph.JMCC_drone_plus_rhythm where
+
+import Control.Concurrent {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+scale :: Num a => [a]
+scale = [0, 2, 3, 5, 7, 9, 10]
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 z n = rand z (negate n) n
+
+drone_1 :: UGen
+drone_1 =
+    let f0 = midiCPS (lchoose 'α' [24,36] + rand2 'β' 0.08)
+        f1 = lfSaw AR (mce2 f0 (f0 + 0.2)) 0 * lfNoise2 'γ' KR (f0 * mce2 0.05 0.04) * 0.06
+    in lpf f1 (rand 'δ' 1000 3000)
+
+drone_1_txt :: IO ()
+drone_1_txt = overlapTextureU (4,4,8,maxBound) drone_1
+
+drone_2 :: UGen
+drone_2 =
+    let x = rand 'ε' 0 1 >* 0.8
+        m = lchoose 'ζ' [60,72] + lchoose 'η' scale + uclone 'θ' 2 (rand2 'ι' 0.05)
+    in sinOsc AR (midiCPS m) 0 * x * rand 'κ' 0.04 0.07
+
+drone_2_txt :: IO ()
+drone_2_txt = overlapTextureU (4,6,3,maxBound) drone_2
+
+iseqr :: ID a => a -> [UGen] -> UGen -> UGen
+iseqr z s tr = tr * demand tr 0 (dxrand z dinf (mce s))
+
+rhy :: UGen
+rhy =
+    let m = lchoose 'λ' [48, 60, 72, 84] + lchoose 'μ' scale + uclone 'ν' 2 (rand2 'ξ' 0.03)
+        sq = iseqr 'ο' [0,1,0,1,1,0] (impulse AR (lchoose 'π' [1.5,3,6]) 0)
+        sg = lfPulse AR (midiCPS m) 0 0.4 * rand 'ρ' 0.03 0.08
+    in rlpf (decay2 sq 0.004 (rand 'σ' 0.2 0.7) * sg) (expRand 'τ' 800 2000) 0.1
+
+pp :: UGen -> UGen
+pp z = combN z 0.5 0.5 6 + mceReverse z
+
+rhy_txt :: IO ()
+rhy_txt = overlapTextureU_pp (6,6,6,maxBound) rhy 2 pp
+
+main = do
+  forkIO drone_1_txt
+  forkIO drone_2_txt
+  forkIO rhy_txt
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
--- a/Sound/SC3/Graph/JMCC_early_space_music_lp_side_two.hs
+++ b/Sound/SC3/Graph/JMCC_early_space_music_lp_side_two.hs
@@ -1,10 +1,10 @@
--- early space music LP, side 2 (jmcc)
+-- early space music LP, side 2 (jmcc) #12
 module Sound.SC3.Graph.JMCC_early_space_music_lp_side_two where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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 Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 import qualified System.Random as R {- random -}
 
 m1 :: UGen
@@ -29,29 +29,30 @@
     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
 
+id_seq :: Enum a => a -> Int -> [Int]
+id_seq c n = let c' = fromEnum c in [c' .. c' + n - 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)
+        o z = let i = constant z
+                  r = let (p,q) = mce2c (expRandN 2 z 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)
+                  f = midiCPS (rand z 24 96)
+                  e = max 0 (sinOsc KR (r * rand z 0.9 1.1) (rand z 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
+              in pan2 s (rand z (-1) 1) 1
+    in sum (map o (id_seq 0 12)) * 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)
+    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]
+    in pan2 z (lfNoise1 'ψ' KR (rand 'ω' 0 5)) 1
 
 -- audition (out 0 m7)
 m7 :: UGen
@@ -60,9 +61,9 @@
         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 +73,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 ['Η'..'Θ']) * 0.3
+    in sum (map c (id_seq 'Θ' 5)) * 0.3
 
 main :: IO ()
 main = do
diff --git a/Sound/SC3/Graph/JMCC_filter_input.hs b/Sound/SC3/Graph/JMCC_filter_input.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_filter_input.hs
@@ -0,0 +1,14 @@
+-- filter input (jmcc) #5
+module Sound.SC3.Graph.JMCC_filter_input where
+
+import Sound.SC3 {- hsc3 -}
+
+filter_input :: UGen
+filter_input =
+    let rQ = mouseY KR 0.01 1 Exponential 0.2 -- bandwidth ratio = 1/Q
+        cf = mouseX KR 100 12000 Exponential 0.2 -- mouse x controls cutoff freq
+        sg = soundIn (mce2 0 1) * 0.4 * sqrt rQ -- attenuate to offset resonance
+    in rlpf sg cf rQ
+
+main :: IO ()
+main = audition (out 0 filter_input)
diff --git a/Sound/SC3/Graph/JMCC_hard_sync_sawtooth_with_lfo.hs b/Sound/SC3/Graph/JMCC_hard_sync_sawtooth_with_lfo.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_hard_sync_sawtooth_with_lfo.hs
@@ -0,0 +1,17 @@
+-- hard sync sawtooth with lfo (jmcc) #6
+module Sound.SC3.Graph.JMCC_hard_sync_sawtooth_with_lfo where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+hsswl :: UGen
+hsswl =
+    let f = midiCPS (30 + iRand 'α' 0 50)
+        o = sinOsc KR 0.2 (mce [0, rand 'β' 0 (2 * pi)]) * (2 * f) + (3 * f)
+    in syncSaw AR (mce [f, f + 0.2]) o * 0.05
+
+pp :: UGen -> UGen
+pp z = combN z 0.3 0.3 4 + mceReverse z
+
+main :: IO ()
+main = overlapTextureU_pp (4,4,4,maxBound) hsswl 2 pp
diff --git a/Sound/SC3/Graph/JMCC_harmonic_swimming.hs b/Sound/SC3/Graph/JMCC_harmonic_swimming.hs
--- a/Sound/SC3/Graph/JMCC_harmonic_swimming.hs
+++ b/Sound/SC3/Graph/JMCC_harmonic_swimming.hs
@@ -1,8 +1,8 @@
--- harmonic swimming (jmcc)
+-- harmonic swimming (jmcc) #1
 module Sound.SC3.Graph.JMCC_harmonic_swimming where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 harmonic_swimming :: UGen
 harmonic_swimming =
diff --git a/Sound/SC3/Graph/JMCC_harmonic_swimming_m.hs b/Sound/SC3/Graph/JMCC_harmonic_swimming_m.hs
--- a/Sound/SC3/Graph/JMCC_harmonic_swimming_m.hs
+++ b/Sound/SC3/Graph/JMCC_harmonic_swimming_m.hs
@@ -1,7 +1,7 @@
--- harmonic swimming (jmcc)
+-- harmonic swimming (jmcc) #1
 module Sound.SC3.Graph.JMCC_harmonic_swimming_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 harmonic_swimming :: UId m => m UGen
 harmonic_swimming =
@@ -9,8 +9,8 @@
         f = 50
         p = 20
         l = line KR 0 (- a) 60 DoNothing
-        o h = do r <- clone 2 (rand 2 8)
-                 n <- lfNoise1 KR r
+        o h = do r <- clone 2 (randM 2 8)
+                 n <- lfNoise1M KR r
                  let e = max 0 (n * a + l)
                  return (fSinOsc AR (f * (h + 1)) 0 * e)
     in fmap sum (mapM o [0..p])
diff --git a/Sound/SC3/Graph/JMCC_harmonic_tumbling.hs b/Sound/SC3/Graph/JMCC_harmonic_tumbling.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_harmonic_tumbling.hs
@@ -0,0 +1,18 @@
+-- harmonic tumbling (jmcc) #1
+module Sound.SC3.Graph.JMCC_harmonic_tumbling where
+
+import Sound.SC3 {- hsc3 -}
+
+harmonic_tumbling :: UGen
+harmonic_tumbling =
+  let f = 80
+      p = 10::Int
+      t = xLine KR (mce2 10 11) 0.1 60 DoNothing
+      o h = let n = dust h KR t
+                r = rand h 0.25 0.5
+                e = decay2 (n * 0.02) 0.005 r
+            in fSinOsc AR (f * (fromIntegral h + 1)) 0 * e
+  in sum (map o [0..p])
+
+main :: IO ()
+main = audition (out 0 harmonic_tumbling)
diff --git a/Sound/SC3/Graph/JMCC_harmonic_tumbling_m.hs b/Sound/SC3/Graph/JMCC_harmonic_tumbling_m.hs
--- a/Sound/SC3/Graph/JMCC_harmonic_tumbling_m.hs
+++ b/Sound/SC3/Graph/JMCC_harmonic_tumbling_m.hs
@@ -1,15 +1,15 @@
--- harmonic tumbling (jmcc)
+-- harmonic tumbling (jmcc) #1
 module Sound.SC3.Graph.JMCC_harmonic_tumbling_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+      o h = do n <- dustM KR t
+               r <- randM 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])
diff --git a/Sound/SC3/Graph/JMCC_hell_is_busy.hs b/Sound/SC3/Graph/JMCC_hell_is_busy.hs
--- a/Sound/SC3/Graph/JMCC_hell_is_busy.hs
+++ b/Sound/SC3/Graph/JMCC_hell_is_busy.hs
@@ -1,13 +1,13 @@
--- hell is busy (jmcc)
+-- hell is busy (jmcc) #1
 module Sound.SC3.Graph.JMCC_hell_is_busy where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+        a = lfPulse KR (1 + rand 'β' 0 10.0) 0 (rand 'γ' 0 0.7) * 0.04
     in pan2 (o * a) (rand 'δ' (-1) 1) 1
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/JMCC_impulse_sequencer.hs b/Sound/SC3/Graph/JMCC_impulse_sequencer.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_impulse_sequencer.hs
@@ -0,0 +1,28 @@
+-- impulse sequencer (jmcc) SC2
+module Sound.SC3.Graph.JMCC_impulse_sequencer where
+
+import Sound.SC3 {- hsc3 -}
+
+isequ :: ID i => i -> [UGen] -> UGen -> UGen
+isequ z s tr = tr * demand tr 0 (dseq z dinf (mce s))
+
+impulse_sequencer :: UGen
+impulse_sequencer =
+    let -- single sample impulse as trigger
+        t = impulse AR 8 0
+        -- clave rhythm
+        c_sq = isequ 'α' [1,0,0,1,0,0,1,0,0,0,1,0,1,0,0,0] t
+        c = decay2 c_sq 0.001 0.3 * fSinOsc AR 1700 0 * 0.1
+        -- dee dee dee dee dee
+        d_sq = isequ 'β' [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0] t
+        d = decay2 d_sq 0.001 0.3 * fSinOsc AR 2400 0 * 0.04
+        -- noise drum
+        n_sq = isequ 'γ' [1.0, 0.1, 0.1, 1.0, 0.1, 1.0, 0.1, 0.1] t
+        n = decay2 n_sq 0.001 0.25 * brownNoise 'δ' AR * 0.1
+        -- bass drum
+        b_sq = isequ 'ε' [1,0,0.2,0,0.2,0,0.2,0] t
+        b = decay2 b_sq 0.001 0.5 * fSinOsc AR 100 0 * 0.2
+    in c + d + n + b
+
+main :: IO ()
+main = audition (out 0 impulse_sequencer)
diff --git a/Sound/SC3/Graph/JMCC_landon_rose.hs b/Sound/SC3/Graph/JMCC_landon_rose.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_landon_rose.hs
@@ -0,0 +1,28 @@
+-- landon rose (jmcc) #8
+module Sound.SC3.Graph.JMCC_landon_rose where
+
+import Sound.SC3 {- hsc3 -}
+
+nt :: Num n => [[n]]
+nt = [[32,43,54, 89]
+     ,[10,34,80,120]
+     ,[67,88,90,100]
+     ,[76,88,99,124]]
+
+fr :: Floating n => [[n]]
+fr = map (map midiCPS') nt
+
+nd :: ID a => a -> UGen -> [UGen] -> UGen
+nd z e f =
+    let p = klankSpec f (replicate 4 1) (replicate 4 3)
+        x = e * pinkNoise z AR * mce2 0.0011 0.0012
+    in klank x 1 0 1 p
+
+env :: Real n => n -> UGen
+env i = abs (sinOsc AR (1 / 8) ((constant i / 2) * pi))
+
+lr :: UGen
+lr = sum (zipWith3 nd "αβγδ" (map env [0 .. 3]) fr)
+
+main :: IO ()
+main = audition (out 0 lr)
diff --git a/Sound/SC3/Graph/JMCC_lfo_modulation.hs b/Sound/SC3/Graph/JMCC_lfo_modulation.hs
--- a/Sound/SC3/Graph/JMCC_lfo_modulation.hs
+++ b/Sound/SC3/Graph/JMCC_lfo_modulation.hs
@@ -1,11 +1,14 @@
--- lfo modulation (jmcc)
+-- lfo modulation (jmcc) #1
 module Sound.SC3.Graph.JMCC_lfo_modulation where
 
 import Sound.SC3 {- hsc3 -}
 
-main :: IO ()
-main =
+lfo_modulation :: UGen
+lfo_modulation =
   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))
+  in combL s 0.3 (mce2 0.2 0.25) 2
+
+main :: IO ()
+main = audition (out 0 lfo_modulation)
diff --git a/Sound/SC3/Graph/JMCC_metal_plate.hs b/Sound/SC3/Graph/JMCC_metal_plate.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_metal_plate.hs
@@ -0,0 +1,32 @@
+-- metal plate (jmcc) #4
+module Sound.SC3.Graph.JMCC_metal_plate where
+
+import Sound.SC3 {- hsc3 -}
+
+mp :: UGen
+mp =
+    let
+        sr = 48000
+        -- number of delay lines
+        n = 4
+        -- maximum delay time
+        maxdt = ceiling (sr * 0.03)
+        -- allocate buffers for delay lines
+        buf = map (\k -> asLocalBuf k (replicate maxdt 0)) [0 .. n - 1]
+        -- assign random tap times
+        tap_tm = uclone' 'a' n (rand 'a' 0.015 0.03)
+        -- excitation
+        exc_freq = mouseY KR 10 8000 Linear 0.2
+        exc_trig = impulse AR 0.5 0 * 0.2
+        exc = decay2 exc_trig 0.01 0.2 * lfNoise2 'a' AR exc_freq
+        -- tap the delay lines
+        del = zipWith (tap 1) buf tap_tm
+        -- filter the taps
+        flt_freq = mouseX KR 10 5000 Linear 0.2
+        flt = map (\i -> lpf i flt_freq * 0.98) del
+        -- write to delay lines
+        wr = zipWith (\b f -> recordBuf AR b 0 1 0 1 Loop 1 DoNothing (f + exc)) buf flt
+    in mrg (sum flt : wr)
+
+main :: IO ()
+main = audition (out 0 mp)
diff --git a/Sound/SC3/Graph/JMCC_modal_space.hs b/Sound/SC3/Graph/JMCC_modal_space.hs
--- a/Sound/SC3/Graph/JMCC_modal_space.hs
+++ b/Sound/SC3/Graph/JMCC_modal_space.hs
@@ -1,31 +1,23 @@
--- modal space (jmcc)
+-- modal space, using local buffer (jmcc) #8
 module Sound.SC3.Graph.JMCC_modal_space where
 
-import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 ms :: UGen -> UGen -> UGen
 ms n r =
-    let x = mouseX KR 0 15 Linear 0.1
-        k = degreeToKey 0 x 12
+    let b = asLocalBuf 'α' [0,2,3.2,5,7,9,10] -- dorian scale
+        x = mouseX KR 0 15 Linear 0.1 -- mouse indexes into scale
+        k = degreeToKey b x 12 -- 12 notes per octave
         o = sinOsc AR (midiCPS (r + k + n * 0.04)) 0 * 0.1
-        t = lfPulse AR (midiCPS (mce2 48 55)) 0.15 0.5
+        t = lfPulse AR (midiCPS (mce2 48 55)) 0 0.15
         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)
+modal_space = (ms (lfNoise1 'β' KR 3) 48 + ms (lfNoise1 'γ' KR 3) 72) * 0.25
 
 main :: IO ()
-main = withSC3 run
+main = audition (out 0 modal_space)
+
diff --git a/Sound/SC3/Graph/JMCC_modal_space_buf.hs b/Sound/SC3/Graph/JMCC_modal_space_buf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_modal_space_buf.hs
@@ -0,0 +1,30 @@
+-- modal space (jmcc) #8
+module Sound.SC3.Graph.JMCC_modal_space_buf where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+
+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 0.15
+        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
--- a/Sound/SC3/Graph/JMCC_moto_rev.hs
+++ b/Sound/SC3/Graph/JMCC_moto_rev.hs
@@ -1,4 +1,4 @@
--- moto rev (jmcc)
+-- moto rev (jmcc) #1
 module Sound.SC3.Graph.JMCC_moto_rev where
 
 import Sound.SC3 {- hsc3 -}
diff --git a/Sound/SC3/Graph/JMCC_mridangam.hs b/Sound/SC3/Graph/JMCC_mridangam.hs
--- a/Sound/SC3/Graph/JMCC_mridangam.hs
+++ b/Sound/SC3/Graph/JMCC_mridangam.hs
@@ -1,62 +1,66 @@
--- mridangam (jmcc)
+-- mridangam (jmcc) #SPE3
 module Sound.SC3.Graph.JMCC_mridangam where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Bind as P {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.ID as R {- hsc3-lang -}
 
-spe3_mridangam :: Synthdef
-spe3_mridangam =
-    let t_amp = tr_control "t_amp" 1
+mridangam :: UGen
+mridangam =
+    let a = tr_control "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)
+        e = decay2 a 0.002 0.1
+    in distort (resonz (n * e) (midiCPS 60) 0.02 * 4) * 0.4
 
-spe3_drone :: Synthdef
-spe3_drone =
+drone :: UGen
+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)
+    in lpf (s1 + s2) (midiCPS 108) * 0.007
 
-p :: Fractional n => [P n]
-p =
-    [pseq [0.0] 10
+lseq :: [a] -> Int -> [a]
+lseq l n = concat (replicate n l)
+
+lrand :: Enum e => e -> [[a]] -> Int -> [a]
+lrand e l n = concat (R.nchoose e n l)
+
+a_seq :: Fractional n => Char -> [[n]]
+a_seq e =
+    [lseq [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
+    ,lseq [0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.2,0.0,0.2,0.0,0.0] 2
+    ,lseq [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
+    ,lrand e [[0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+             ,[0.9,0.2,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+             ,[0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.2]
+             ,[0.9,0.0,0.0,0.7,0.2,0.2,0.0,0.7,0.0,0.0]
+             ,[0.9,0.0,0.0,0.7,0.0,0.2,0.2,0.7,0.2,0.0]
+             ,[0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.2,0.2]
+             ,[0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.0,0.0]
+             ,[0.9,0.0,0.0,0.7,0.2,0.2,0.2,0.7,0.0,0.0]
+             ,[0.9,0.0,0.4,0.0,0.4,0.0,0.4,0.0,0.4,0.0]
+             ,[0.9,0.0,0.0,0.4,0.0,0.0,0.4,0.2,0.4,0.2]
+             ,[0.9,0.0,0.2,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+             ,[0.9,0.0,0.0,0.7,0.0,0.0,0.0,0.7,0.0,0.0]
+             ,[0.9,0.7,0.7,0.0,0.0,0.2,0.2,0.2,0.0,0.0]
+             ,[0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]] 30
     -- tehai
-    ,pseq [2.0,0.0,0.2,0.5,0.0,0.2,0.9
+    ,lseq [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]
+    ,[5.0]]
 
 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)])
+  play (out 0 drone)
+  let sy = synthdef "mridangam" (out 0 mridangam)
+      a = concat (a_seq 'α')
+  play (P.nbind1 (sy,100,[("amp",a),("dur",repeat (1/8))]))
 
 main :: IO ()
 main = withSC3 act
diff --git a/Sound/SC3/Graph/JMCC_mridangam_dr.hs b/Sound/SC3/Graph/JMCC_mridangam_dr.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_mridangam_dr.hs
@@ -0,0 +1,67 @@
+-- mridangam (jmcc) #SPE3
+module Sound.SC3.Graph.JMCC_mridangam_dr where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Bind as P {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.ID as R {- hsc3-lang -}
+
+-- > let g = drum (dust 'α' AR 1)
+-- > audition (out 0 g)
+drum :: UGen -> UGen
+drum a =
+    let n = whiteNoise 'α' AR * 70
+        e = decay2 a 0.002 0.1
+    in distort (resonz (n * e) (midiCPS 60) 0.02 * 4) * 0.4
+
+drone :: UGen
+drone =
+    let s1 = saw AR (midiCPS (mce2 60 60.04))
+        s2 = saw AR (midiCPS (mce2 67 67.04))
+    in lpf (s1 + s2) (midiCPS 108) * 0.007
+
+lseq :: [Double] -> UGen -> UGen
+lseq l n = dseq 'β' n (mce (map constant l))
+
+lrand :: [[Double]] -> UGen -> UGen
+lrand l n = drand 'γ' n (mce (map (flip lseq 1) l))
+
+a_solo :: UGen
+a_solo =
+    lrand [[0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+          ,[0.9,0.2,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+          ,[0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.2]
+          ,[0.9,0.0,0.0,0.7,0.2,0.2,0.0,0.7,0.0,0.0]
+          ,[0.9,0.0,0.0,0.7,0.0,0.2,0.2,0.7,0.2,0.0]
+          ,[0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.2,0.2]
+          ,[0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.0,0.0]
+          ,[0.9,0.0,0.0,0.7,0.2,0.2,0.2,0.7,0.0,0.0]
+          ,[0.9,0.0,0.4,0.0,0.4,0.0,0.4,0.0,0.4,0.0]
+          ,[0.9,0.0,0.0,0.4,0.0,0.0,0.4,0.2,0.4,0.2]
+          ,[0.9,0.0,0.2,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+          ,[0.9,0.0,0.0,0.7,0.0,0.0,0.0,0.7,0.0,0.0]
+          ,[0.9,0.7,0.7,0.0,0.0,0.2,0.2,0.2,0.0,0.0]
+          ,[0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]] 30
+
+a_seq :: [UGen]
+a_seq =
+    [lseq [0.0] 10
+    -- intro
+    ,lseq [0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.2,0.0,0.2,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.2] 2
+    -- solo
+    ,a_solo
+    -- tehai
+    ,lseq [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
+    ,lseq [5.0] 1]
+
+mridangam :: UGen
+mridangam = drum (tDuty AR (1 / 8) 0 DoNothing (dseq 'δ' 1 (mce a_seq)) 0) + drone
+
+main :: IO ()
+main = audition (out 0 mridangam)
diff --git a/Sound/SC3/Graph/JMCC_narrow_band_filtered_crackle_noise.hs b/Sound/SC3/Graph/JMCC_narrow_band_filtered_crackle_noise.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_narrow_band_filtered_crackle_noise.hs
@@ -0,0 +1,20 @@
+-- narrow band filtered crackle noise (jmcc) #2
+module Sound.SC3.Graph.JMCC_narrow_band_filtered_crackle_noise where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (- n) n
+
+nbfcn :: UGen
+nbfcn =
+    let e = envLinen 2 5 2 1
+        rf1 = rand 'α' 0 2000 + 80
+        rf2 = rf1 + (rand2 'β' 0.2 * rf1)
+        rf = xLine KR rf1 rf2 9 DoNothing
+        c = crackle AR 1.97 + rand 'γ' 0 0.03 * 0.15
+    in pan2 (resonz c rf 0.2) (rand2 'δ' 1) (envGen AR 1 1 0 1 RemoveSynth e)
+
+main :: IO ()
+main = spawnTextureU (const 2,maxBound) nbfcn
diff --git a/Sound/SC3/Graph/JMCC_noise_burst_sweep.hs b/Sound/SC3/Graph/JMCC_noise_burst_sweep.hs
--- a/Sound/SC3/Graph/JMCC_noise_burst_sweep.hs
+++ b/Sound/SC3/Graph/JMCC_noise_burst_sweep.hs
@@ -1,8 +1,7 @@
--- noise burst sweep (jmcc)
+-- noise burst sweep (jmcc) #6
 module Sound.SC3.Graph.JMCC_noise_burst_sweep where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 nbs :: ID a => a -> UGen
@@ -18,5 +17,6 @@
 main = overlapTextureU (4,2,4,maxBound) (nbs 'α')
 
 {-
-audition (out 0 (nbs 'α'))
+let g = nbs 'α'
+audition (out 0 g)
 -}
diff --git a/Sound/SC3/Graph/JMCC_noise_modulated_sawtooths.hs b/Sound/SC3/Graph/JMCC_noise_modulated_sawtooths.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_noise_modulated_sawtooths.hs
@@ -0,0 +1,18 @@
+-- noise modulated sawtooths (jmcc) #6
+module Sound.SC3.Graph.JMCC_noise_modulated_sawtooths where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+nms :: UGen
+nms =
+    let f = midiCPS (rand 'α' 60 100)
+        o = lfSaw 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_noise_modulated_sines.hs b/Sound/SC3/Graph/JMCC_noise_modulated_sines.hs
--- a/Sound/SC3/Graph/JMCC_noise_modulated_sines.hs
+++ b/Sound/SC3/Graph/JMCC_noise_modulated_sines.hs
@@ -1,7 +1,7 @@
--- noise modulated sines (jmcc)
+-- noise modulated sines (jmcc) #6
 module Sound.SC3.Graph.JMCC_noise_modulated_sines where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 nms :: UGen
diff --git a/Sound/SC3/Graph/JMCC_overlap_add.hs b/Sound/SC3/Graph/JMCC_overlap_add.hs
--- a/Sound/SC3/Graph/JMCC_overlap_add.hs
+++ b/Sound/SC3/Graph/JMCC_overlap_add.hs
@@ -1,8 +1,8 @@
 -- overlap-add (jmcc)
 module Sound.SC3.Graph.JMCC_overlap_add where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 sine :: UGen
 sine =
@@ -18,5 +18,5 @@
     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])
+main = audition (nrt_merge (overlapTexture_nrt (1,0) (4,4,6,maxBound) sine)
+                           (overlapTexture_nrt (1,0) (4,4,6,maxBound) noise))
diff --git a/Sound/SC3/Graph/JMCC_phase_modulation.hs b/Sound/SC3/Graph/JMCC_phase_modulation.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_phase_modulation.hs
@@ -0,0 +1,24 @@
+-- phase modulation with slow beats (jmcc) #6
+module Sound.SC3.Graph.JMCC_phase_modulation where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (-n) n
+
+nrec :: (Num a, Ord a) => a -> (t -> t) -> t -> t
+nrec n f st = if n > 0 then nrec (n - 1) f (f st) else st
+
+pmwsb :: UGen
+pmwsb =
+    let x = mouseX KR 100 6000 Exponential 0.2 -- random freq of new events
+        y = mouseY KR 0 2 Linear 0.2 -- modulation index
+        o (e,a) = let f = rand e 0 x
+                  in (succ e,fSinOsc AR (mce [f,f + rand2 'α' 1]) 0 * y + a)
+        (_,ph) = nrec 3 o ('β',0)
+        freq = rand 'γ' 0 x
+    in sinOsc AR (mce [freq, freq + rand2 'δ' 1]) ph * 0.1
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) pmwsb
diff --git a/Sound/SC3/Graph/JMCC_plucked_strings_m.hs b/Sound/SC3/Graph/JMCC_plucked_strings_m.hs
--- a/Sound/SC3/Graph/JMCC_plucked_strings_m.hs
+++ b/Sound/SC3/Graph/JMCC_plucked_strings_m.hs
@@ -1,23 +1,23 @@
 -- plucked strings (jmcc)
 module Sound.SC3.Graph.JMCC_plucked_strings_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 plucked_strings :: UId m => m UGen
 plucked_strings = do
-  let dt = do r0 <- rand 60 90
+  let dt = do r0 <- randM 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
+      i = do r0 <- randM 2 2.2
+             n0 <- dustM AR 0.5
+             r1 <- randM 0.05 0.15
+             r2 <- randM 0 (pi * 2)
+             r3 <- iRandM 0 2
+             let s0 = impulse AR r0 0 * 0.3
                  s1 = n0 * 0.3
-                 s2 = impulse AR (sinOsc KR r1 r2 * 5 + 5.2) 0.3
+                 s2 = impulse AR (sinOsc KR r1 r2 * 5 + 5.2) 0 * 0.3
              return (select r3 (mce [s0,s1,s2]))
-      s = do n0 <- pinkNoise AR
-             r1 <- rand (-1) 1
+      s = do n0 <- pinkNoiseM AR
+             r1 <- randM (-1) 1
              im <- i
              dt' <- dt
              let t = decay im 0.1 * n0 * 0.1
diff --git a/Sound/SC3/Graph/JMCC_police_state.hs b/Sound/SC3/Graph/JMCC_police_state.hs
--- a/Sound/SC3/Graph/JMCC_police_state.hs
+++ b/Sound/SC3/Graph/JMCC_police_state.hs
@@ -1,8 +1,7 @@
--- police state (jmcc)
+-- police state (jmcc) #2
 module Sound.SC3.Graph.JMCC_police_state where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 nd :: UGen
 nd =
diff --git a/Sound/SC3/Graph/JMCC_police_state_m.hs b/Sound/SC3/Graph/JMCC_police_state_m.hs
--- a/Sound/SC3/Graph/JMCC_police_state_m.hs
+++ b/Sound/SC3/Graph/JMCC_police_state_m.hs
@@ -1,23 +1,23 @@
--- police state (jmcc)
+-- police state (jmcc) #2
 module Sound.SC3.Graph.JMCC_police_state_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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 nd = do r0 <- randM 0.02 0.12
+              r1 <- randM 0 (pi * 2)
+              r2 <- randM 0 600
+              r3 <- randM 700 1300
+              r4 <- randM (-1) 1
+              r5 <- randM 80 120
+              n0 <- lfNoise2M 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)
+  n0 <- clone 2 (lfNoise2M KR 0.4)
+  n1 <- lfNoise2M AR (n0 * 90 + 620)
+  n2 <- lfNoise2M KR (mce2 0.3 0.301)
   let e = n1 * (n2 * 0.15 + 0.18)
   return (combL (mix ns + e) 0.3 0.3 3)
 
diff --git a/Sound/SC3/Graph/JMCC_pond_life.hs b/Sound/SC3/Graph/JMCC_pond_life.hs
--- a/Sound/SC3/Graph/JMCC_pond_life.hs
+++ b/Sound/SC3/Graph/JMCC_pond_life.hs
@@ -1,14 +1,14 @@
--- pond life (jmcc)
+-- pond life (jmcc) #1
 module Sound.SC3.Graph.JMCC_pond_life where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+        a = lfPulse KR (3 / rand 'δ' 1 9) 0 (rand 'ε' 0.2 0.5) * 0.04
     in pan2 (sinOsc AR f1 0 * a) (rand 'ζ' (-1) 1) 0.5
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/JMCC_pond_life_ha.hs b/Sound/SC3/Graph/JMCC_pond_life_ha.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_pond_life_ha.hs
@@ -0,0 +1,17 @@
+-- pond life (jmcc) #1
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-at #-}
+module Sound.SC3.Graph.JMCC_pond_life_ha where
+
+import Data.Hashable {- hashable -}
+import Sound.SC3 {- 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)) 0 (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
--- a/Sound/SC3/Graph/JMCC_pond_life_hp.hs
+++ b/Sound/SC3/Graph/JMCC_pond_life_hp.hs
@@ -1,17 +1,17 @@
--- pond life (jmcc)
+-- pond life (jmcc) #1
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.JMCC_pond_life_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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)
+  let f = fSinOsc KR (20 + #(randM 0 30)) 0
+          * #(randM 100 400)
+          + #(linRandM 500 2500 0)
+  let a = lfPulse KR (3 / #(randM 1 9)) 0 #(randM 0.2 0.5) * 0.04
+  return (pan2 (sinOsc AR f 0 * a) #(randM (-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
--- a/Sound/SC3/Graph/JMCC_pulsing_bottles.hs
+++ b/Sound/SC3/Graph/JMCC_pulsing_bottles.hs
@@ -1,8 +1,7 @@
--- pulsing bottles (jmcc)
+-- pulsing bottles (jmcc) #2
 module Sound.SC3.Graph.JMCC_pulsing_bottles where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 pulsing_bottles :: UGen
diff --git a/Sound/SC3/Graph/JMCC_pulsing_bottles_m.hs b/Sound/SC3/Graph/JMCC_pulsing_bottles_m.hs
--- a/Sound/SC3/Graph/JMCC_pulsing_bottles_m.hs
+++ b/Sound/SC3/Graph/JMCC_pulsing_bottles_m.hs
@@ -1,19 +1,19 @@
--- pulsing bottles (jmcc)
+-- pulsing bottles (jmcc) #2
 module Sound.SC3.Graph.JMCC_pulsing_bottles_m where
 
 import Control.Monad {- base -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  let r = do n <- whiteNoiseM AR
+             r0 <- randM 4 14
+             r1 <- randM 0 0.7
+             r2 <- randM 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)
+      s = do f <- randM 0.1 0.5
+             p <- randM 0 (pi * 2)
              return (sinOsc KR f p)
       u = liftM2 (\x y -> pan2 x y 1) r s
   fmap sum (sequence (replicate 6 u))
diff --git a/Sound/SC3/Graph/JMCC_rails.hs b/Sound/SC3/Graph/JMCC_rails.hs
--- a/Sound/SC3/Graph/JMCC_rails.hs
+++ b/Sound/SC3/Graph/JMCC_rails.hs
@@ -1,8 +1,7 @@
--- rails (jmcc)
+-- rails (jmcc) #2
 module Sound.SC3.Graph.JMCC_rails where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 rand2 :: ID a => a -> UGen -> UGen
diff --git a/Sound/SC3/Graph/JMCC_random_panning_sines.hs b/Sound/SC3/Graph/JMCC_random_panning_sines.hs
--- a/Sound/SC3/Graph/JMCC_random_panning_sines.hs
+++ b/Sound/SC3/Graph/JMCC_random_panning_sines.hs
@@ -1,8 +1,7 @@
--- random panning sines (jmcc)
+-- random panning sines (jmcc) #4
 module Sound.SC3.Graph.JMCC_random_panning_sines where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 rps :: UGen
diff --git a/Sound/SC3/Graph/JMCC_random_panning_sines_m.hs b/Sound/SC3/Graph/JMCC_random_panning_sines_m.hs
--- a/Sound/SC3/Graph/JMCC_random_panning_sines_m.hs
+++ b/Sound/SC3/Graph/JMCC_random_panning_sines_m.hs
@@ -1,15 +1,15 @@
--- random panning sines (jmcc)
+-- random panning sines (jmcc) #4
 module Sound.SC3.Graph.JMCC_random_panning_sines_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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 nd = do r0 <- linRandM 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
+              l <- lfNoise1M KR =<< randM 0.8 1.2
+              a <- lfNoise1M KR =<< randM 0.82 0.98
               return (pan2 o l a)
   r <- clone 8 nd
   return (mix r * (0.4 / 8))
diff --git a/Sound/SC3/Graph/JMCC_random_pulsations.hs b/Sound/SC3/Graph/JMCC_random_pulsations.hs
--- a/Sound/SC3/Graph/JMCC_random_pulsations.hs
+++ b/Sound/SC3/Graph/JMCC_random_pulsations.hs
@@ -1,15 +1,16 @@
--- random pulsations (jmcc)
+-- random pulsations (jmcc) #1
 module Sound.SC3.Graph.JMCC_random_pulsations where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+    let e = envLinen 2 5 2 0.02
+        o1 = fSinOsc AR (rand 'α' 0 2000) 0 * envGen KR 1 1 0 1 DoNothing e
+        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
+main = spawnTextureU (const (9/8),maxBound) rp
diff --git a/Sound/SC3/Graph/JMCC_random_sine_waves.hs b/Sound/SC3/Graph/JMCC_random_sine_waves.hs
--- a/Sound/SC3/Graph/JMCC_random_sine_waves.hs
+++ b/Sound/SC3/Graph/JMCC_random_sine_waves.hs
@@ -1,7 +1,7 @@
--- random sine waves (jmcc)
+-- random sine waves (jmcc) #1
 module Sound.SC3.Graph.JMCC_random_sine_waves where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 rsw :: UGen
diff --git a/Sound/SC3/Graph/JMCC_random_sine_waves_hp.hs b/Sound/SC3/Graph/JMCC_random_sine_waves_hp.hs
--- a/Sound/SC3/Graph/JMCC_random_sine_waves_hp.hs
+++ b/Sound/SC3/Graph/JMCC_random_sine_waves_hp.hs
@@ -1,11 +1,11 @@
--- random sine waves (jmcc)
+-- random sine waves (jmcc) #1
 {-# 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 {- 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
+  let rsw = pan2 (fSinOsc AR #(randM 0 2000) 0 * 0.02) #(randM (-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
--- a/Sound/SC3/Graph/JMCC_random_sine_waves_she.hs
+++ b/Sound/SC3/Graph/JMCC_random_sine_waves_she.hs
@@ -1,12 +1,13 @@
--- random sine waves (jmcc)
+-- random sine waves (jmcc) #1
 {-# 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 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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|)
+  s <- (|pan2 ((|fSinOsc ~AR (randM 0 2000) ~0|) .* 0.02) (randM (-1) 1) ~1|)
   overlapTextureU (2,5,12,maxBound) s
diff --git a/Sound/SC3/Graph/JMCC_reso_pulse.hs b/Sound/SC3/Graph/JMCC_reso_pulse.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_reso_pulse.hs
@@ -0,0 +1,28 @@
+-- reso-pulse (jmcc) #1
+module Sound.SC3.Graph.JMCC_reso_pulse where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 k n = rand k (-n) n
+
+reso_pulse :: UGen
+reso_pulse =
+    let f = midiCPS (lchoose 'α' [25,30,34,37,41,42,46,49,53,54,58,61,63,66])
+        f' = 2 * f + rand2 'β' 0.5
+    in (lfPulse AR f 0 0.2 + lfPulse AR f' 0 0.2) * 0.02
+
+-- > let g = reso_pulse_pp (silent 1)
+reso_pulse_pp :: UGen -> UGen
+reso_pulse_pp z =
+    let lfoFreq = 6
+        lfo = lfNoise0 'γ' KR lfoFreq * 1000 + 1200
+        x = mouseX KR 0.2 0.02 Exponential 0.2
+        left = rlpf z lfo x
+        delayTime = 2 / lfoFreq
+        right = delayN left delayTime delayTime
+    in mce2 left right
+
+main :: IO ()
+main = overlapTextureU_pp (4,2,4,maxBound) reso_pulse 1 reso_pulse_pp
diff --git a/Sound/SC3/Graph/JMCC_resonant_dust.hs b/Sound/SC3/Graph/JMCC_resonant_dust.hs
--- a/Sound/SC3/Graph/JMCC_resonant_dust.hs
+++ b/Sound/SC3/Graph/JMCC_resonant_dust.hs
@@ -1,7 +1,7 @@
--- resonant dust (jmcc)
+-- resonant dust (jmcc) #2
 module Sound.SC3.Graph.JMCC_resonant_dust where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 resonant_dust :: UGen
diff --git a/Sound/SC3/Graph/JMCC_resonant_dust_hp.hs b/Sound/SC3/Graph/JMCC_resonant_dust_hp.hs
--- a/Sound/SC3/Graph/JMCC_resonant_dust_hp.hs
+++ b/Sound/SC3/Graph/JMCC_resonant_dust_hp.hs
@@ -1,16 +1,16 @@
--- resonant dust (jmcc)
+-- resonant dust (jmcc) #2
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.JMCC_resonant_dust_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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))
+  st <- randM 80 2080
+  let en = st + (st * #(randM (-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)
+  return (pan2 (resonz (#(dustM AR #(randM 50 850)) * 0.3) rf 0.1) #(randM (-1) 1) 1)
 
 main :: IO ()
 main = overlapTextureU (5,2,9,maxBound) =<< resonant_dust
diff --git a/Sound/SC3/Graph/JMCC_resonators_harmonic_series.hs b/Sound/SC3/Graph/JMCC_resonators_harmonic_series.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_resonators_harmonic_series.hs
@@ -0,0 +1,25 @@
+-- resonators harmonic series (jmcc) #2
+module Sound.SC3.Graph.JMCC_resonators_harmonic_series where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Collection as C {- hsc3-lang -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 z n = rand z (negate n) n
+
+rhs :: UGen
+rhs =
+    let p = 12
+        noise = brownNoise 'α' AR * 0.001
+        rat = [1.0,1.125,1.25,1.333,1.5,1.667,1.875,2.0,2.25,2.5,2.667,3.0,3.333,3.75,4.0]
+        freq = lchoose 'β' rat * 120
+        resFreqs = zipWith (+) (C.series p freq freq) (uclone' 'γ' p (rand2 'δ' 0.5))
+        spec = klankSpec
+               resFreqs
+               (map (\i -> 1 / (constant i + 1)) [0 .. p - 1])
+               (uclone' 'ε' p (rand 'ζ' 0.5 4.5))
+    in uclone 'η' 2 (klank noise 1 0 1 spec)
+
+main :: IO ()
+main = xfadeTextureU (1,7,maxBound) rhs
diff --git a/Sound/SC3/Graph/JMCC_reverberated_noise_bursts.hs b/Sound/SC3/Graph/JMCC_reverberated_noise_bursts.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_reverberated_noise_bursts.hs
@@ -0,0 +1,15 @@
+-- reverberated noise bursts (jmcc) #3
+module Sound.SC3.Graph.JMCC_reverberated_noise_bursts where
+
+import Sound.SC3 {- hsc3 -}
+
+rnb :: UGen
+rnb =
+    let s = decay (dust 'α' AR 0.6 * 0.2) 0.15 * pinkNoise 'β' AR
+        z = delayN s 0.048 0.048
+        y = mix (combL z 0.1 (lfNoise1 'γ' KR (uclone 'δ' 6 (rand 'ε' 0 0.1)) * 0.04 + 0.05) 15)
+        f = useq 'ζ' 4 (\i -> allpassN i 0.050 (uclone 'η' 2 (rand 'θ' 0 0.05)) 1)
+    in s + f y
+
+main :: IO ()
+main = audition (out 0 rnb)
diff --git a/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_hp.hs b/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_hp.hs
--- a/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_hp.hs
+++ b/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_hp.hs
@@ -1,19 +1,20 @@
--- reverberated sine percussion (jmcc)
+-- reverberated sine percussion (jmcc) #3
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.JMCC_reverberated_sine_percussion_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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_ = do return (resonz (#(dustM AR (2 / constant d)) * 50) (200 + #(randM 0 3000)) 0.003)
+      x_ i = do return (allpassN i 0.05 #(clone 2 (randM 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))
+          return (mix (combL z 0.1 (#(lfNoise1M KR #(clone c (randM 0 0.1))) * 0.04 + 0.05) 15))
   x <- chainM a x_ y
   return (s + x * 0.2)
 
diff --git a/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_m.hs b/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_m.hs
--- a/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_m.hs
+++ b/Sound/SC3/Graph/JMCC_reverberated_sine_percussion_m.hs
@@ -1,22 +1,23 @@
--- reverberated sine percussion (jmcc)
+-- reverberated sine percussion (jmcc) #3
 module Sound.SC3.Graph.JMCC_reverberated_sine_percussion_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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
+      s_ = do n <- dustM AR (2 / constant d)
+              r <- randM 0 3000
               return (resonz (n * 50) (200 + r) 0.003)
-      x_ i = do r <- clone 2 (rand 0 0.05)
+      x_ i = do r <- clone 2 (randM 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
+          r <- clone c (randM 0 0.1)
+          n <- lfNoise1M KR r
           return (mix (combL z 0.1 (n * 0.04 + 0.05) 15))
   x <- chainM a x_ y
   return (s + x * 0.2)
diff --git a/Sound/SC3/Graph/JMCC_ring_modulate_input.hs b/Sound/SC3/Graph/JMCC_ring_modulate_input.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_ring_modulate_input.hs
@@ -0,0 +1,14 @@
+-- ring modulate input (jmcc) #5
+module Sound.SC3.Graph.JMCC_ring_modulate_input where
+
+import Sound.SC3 {- hsc3 -}
+
+ring_modulate_input :: UGen
+ring_modulate_input =
+    let input = soundIn (mce2 0 1)
+        x = mouseX KR 10 4000 Exponential 0.2 -- mouse x controls ring mod freq
+        modulator = sinOsc AR x (mce2 0 (0.5 * pi)) -- offset phase of one osc by 90 degrees
+    in input * modulator
+
+main :: IO ()
+main = audition (out 0 ring_modulate_input)
diff --git a/Sound/SC3/Graph/JMCC_ring_modulated_klank.hs b/Sound/SC3/Graph/JMCC_ring_modulated_klank.hs
--- a/Sound/SC3/Graph/JMCC_ring_modulated_klank.hs
+++ b/Sound/SC3/Graph/JMCC_ring_modulated_klank.hs
@@ -1,8 +1,8 @@
--- ring modulated klank (jmcc)
+-- ring modulated klank (jmcc) #2
 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 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 rmk :: UGen
diff --git a/Sound/SC3/Graph/JMCC_sample_and_hold_liquidities.hs b/Sound/SC3/Graph/JMCC_sample_and_hold_liquidities.hs
--- a/Sound/SC3/Graph/JMCC_sample_and_hold_liquidities.hs
+++ b/Sound/SC3/Graph/JMCC_sample_and_hold_liquidities.hs
@@ -1,13 +1,13 @@
--- sample and hold liquidities (jmcc)
+-- sample and hold liquidities (jmcc) #4
 module Sound.SC3.Graph.JMCC_sample_and_hold_liquidities where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 shl :: UGen
 shl =
     let r = mouseX KR 1 200 Exponential 0.1
         t = recip r
-        c = impulse KR r 0.4
+        c = impulse KR r 0 * 0.4
         cf = mouseY KR 100 8000 Exponential 0.1
         f = latch (whiteNoise 'α' KR * cf * 0.5 + cf) c
         p = latch (whiteNoise 'β' KR) c
diff --git a/Sound/SC3/Graph/JMCC_saucer_base.hs b/Sound/SC3/Graph/JMCC_saucer_base.hs
--- a/Sound/SC3/Graph/JMCC_saucer_base.hs
+++ b/Sound/SC3/Graph/JMCC_saucer_base.hs
@@ -1,7 +1,7 @@
--- saucer base (jmcc)
+-- saucer base (jmcc) #6
 module Sound.SC3.Graph.JMCC_saucer_base where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 saucer_base :: UGen
diff --git a/Sound/SC3/Graph/JMCC_sawed_cymbals.hs b/Sound/SC3/Graph/JMCC_sawed_cymbals.hs
--- a/Sound/SC3/Graph/JMCC_sawed_cymbals.hs
+++ b/Sound/SC3/Graph/JMCC_sawed_cymbals.hs
@@ -1,8 +1,7 @@
--- sawed cymbals (jmcc)
+-- sawed cymbals (jmcc) #9
 module Sound.SC3.Graph.JMCC_sawed_cymbals where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 sawed_cymbals :: UGen
diff --git a/Sound/SC3/Graph/JMCC_scratchy.hs b/Sound/SC3/Graph/JMCC_scratchy.hs
--- a/Sound/SC3/Graph/JMCC_scratchy.hs
+++ b/Sound/SC3/Graph/JMCC_scratchy.hs
@@ -1,13 +1,13 @@
--- scratchy (jmcc)
+-- scratchy (jmcc) #1
 module Sound.SC3.Graph.JMCC_scratchy where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+  let n = brownNoise 'α' AR * 0.5 - 0.49
+      n' = uclone 'β' 2 n
+  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
--- a/Sound/SC3/Graph/JMCC_scratchy_m.hs
+++ b/Sound/SC3/Graph/JMCC_scratchy_m.hs
@@ -1,11 +1,11 @@
--- scratchy-m (jmcc)
+-- scratchy-m (jmcc) #1
 module Sound.SC3.Graph.JMCC_scratchy_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 scratchy :: UId m => m UGen
 scratchy = do
-  n <- clone 2 (brownNoise AR)
+  n <- clone 2 (brownNoiseM AR)
   let f = max (n * 0.5 - 0.49) 0 * 20
   return (rhpf f 5000 1)
 
diff --git a/Sound/SC3/Graph/JMCC_sidereal_time.hs b/Sound/SC3/Graph/JMCC_sidereal_time.hs
--- a/Sound/SC3/Graph/JMCC_sidereal_time.hs
+++ b/Sound/SC3/Graph/JMCC_sidereal_time.hs
@@ -1,8 +1,7 @@
--- sidereal time (jmcc)
+-- sidereal time (jmcc) #9
 module Sound.SC3.Graph.JMCC_sidereal_time where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 sidereal_time :: UGen
diff --git a/Sound/SC3/Graph/JMCC_sidereal_time_hp.hs b/Sound/SC3/Graph/JMCC_sidereal_time_hp.hs
--- a/Sound/SC3/Graph/JMCC_sidereal_time_hp.hs
+++ b/Sound/SC3/Graph/JMCC_sidereal_time_hp.hs
@@ -1,25 +1,25 @@
--- sidereal time (jmcc)
+-- sidereal time (jmcc) #9
 {-# 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 {- 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)
+             fr <- replicateM p (expRandM 100 6000)
+             rt <- replicateM p (randM 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))
+  let f = xLine KR #(expRandM 40 300) #(expRandM 40 300) 12 DoNothing
+  let t = lfPulse AR f 0 #(randM 0.1 0.9)
+          * max 0 #(lfNoise2M KR #(randM 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)
+  return (combN o 0.6 #(randM 0.1 0.6) 8 + mceReverse o)
 
 main :: IO ()
 main = overlapTextureU (4,4,6,maxBound) =<< sidereal_time
diff --git a/Sound/SC3/Graph/JMCC_slow_beating_harmonic_sines.hs b/Sound/SC3/Graph/JMCC_slow_beating_harmonic_sines.hs
--- a/Sound/SC3/Graph/JMCC_slow_beating_harmonic_sines.hs
+++ b/Sound/SC3/Graph/JMCC_slow_beating_harmonic_sines.hs
@@ -1,11 +1,11 @@
--- slow beating harmonic sines (jmcc)
+-- slow beating harmonic sines (jmcc) #7
 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
+import Sound.SC3.Lang.Random.Monad as L {- hsc3-lang -}
 
 r_freq :: (RandomGen g) => Int -> Int -> Rand g [Double]
 r_freq k i = do
@@ -24,7 +24,7 @@
 
 sbhs :: (RandomGen g) => Int -> Double -> Int -> Rand g UGen
 sbhs n d m = do
-  k' <- rand 12
+  k' <- L.rand 12
   let k = 24 + k'
   f <- r_freq k n
   p_fr <- mapM (r_harmonics d m) f
diff --git a/Sound/SC3/Graph/JMCC_slow_beating_sines.hs b/Sound/SC3/Graph/JMCC_slow_beating_sines.hs
--- a/Sound/SC3/Graph/JMCC_slow_beating_sines.hs
+++ b/Sound/SC3/Graph/JMCC_slow_beating_sines.hs
@@ -1,4 +1,4 @@
--- slow beating sines (jmcc)
+-- slow beating sines (jmcc) #7
 module Sound.SC3.Graph.JMCC_slow_beating_sines where
 
 import Control.Monad {- base -}
@@ -21,6 +21,7 @@
 r_phase :: (RandomGen g) => Int -> Rand g [Double]
 r_phase m = nrrand m 0 (2 * pi)
 
+-- > g <- fmap (fst . runRand (sbs 3 0.4 3)) getStdGen
 sbs :: (RandomGen g) => Int -> Double -> Int -> Rand g UGen
 sbs n d m = do
   f <- r_freq n
diff --git a/Sound/SC3/Graph/JMCC_snare_909.hs b/Sound/SC3/Graph/JMCC_snare_909.hs
--- a/Sound/SC3/Graph/JMCC_snare_909.hs
+++ b/Sound/SC3/Graph/JMCC_snare_909.hs
@@ -1,7 +1,7 @@
 -- snare-909 (jmcc)
 module Sound.SC3.Graph.JMCC_snare_909 where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 snare_909 :: UGen -> UGen
 snare_909 tr =
diff --git a/Sound/SC3/Graph/JMCC_spe_m.hs b/Sound/SC3/Graph/JMCC_spe_m.hs
--- a/Sound/SC3/Graph/JMCC_spe_m.hs
+++ b/Sound/SC3/Graph/JMCC_spe_m.hs
@@ -1,20 +1,21 @@
--- spe (jmcc)
--- variant of graph in streams & patterns tutorial
+-- spe (jmcc)/(rd)
 module Sound.SC3.Graph.JMCC_spe_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
+-- fmap (Sound.SC3.UGen.PP.ugen_graph_forth_pp False) spe
 spe :: UId m => m UGen
 spe = do
-  let rapf i = do r <- clone 2 (rand 0 0.05)
+  let rapf i = do r <- clone 2 (randM 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
+               n <- lfNoise1M KR 1
+               m <- dseqM dinf s
                let f = midiCPS (demand t 0 m + 32)
                    o = lfSaw AR f 0 * e
                    rq = midiCPS (n * 36 + 110)
diff --git a/Sound/SC3/Graph/JMCC_spe_p.hs b/Sound/SC3/Graph/JMCC_spe_p.hs
--- a/Sound/SC3/Graph/JMCC_spe_p.hs
+++ b/Sound/SC3/Graph/JMCC_spe_p.hs
@@ -1,14 +1,17 @@
 -- spe-p (jmcc)
 module Sound.SC3.Graph.JMCC_spe_p where
 
-import Sound.SC3.Monad {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
+import qualified Sound.SC3.Lang.Collection as C {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Bind as P {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.List as P {- hsc3-lang -}
 
 spe3_allpass6 :: UId m => m Synthdef
 spe3_allpass6 = do
-  n <- lfNoise1 KR 1
+  n <- lfNoise1M KR 1
   let fr = control KR "freq" 440
-      rapf i = do r <- clone 2 (rand 0 0.05)
+      rapf i = do r <- clone 2 (randM 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)
@@ -16,14 +19,20 @@
   u <- fmap (out 0) (chainM 4 rapf o)
   return (synthdef "spe" u)
 
-notes :: Num n => P n
+lseq1 :: [[a]] -> [a]
+lseq1 = concat . C.flop
+
+inf :: Int
+inf = maxBound
+
+notes :: Num n => [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)
+    let n = [P.rand' 'α' [[],[24,31,36,43,48,55]] inf
+            ,C.flop [[60],P.rand' 'β' [63,65] inf,[67],P.rand' 'γ' [70,72,74] inf]
+            ,[P.rand' 'a' [74,75,77,79,81] 3]]
+    in concat (lseq1 n)
 
 main :: IO ()
 main = do
   i <- spe3_allpass6
-  audition (pbind [(K_instr,psynth i),(K_midinote,notes),(K_dur,0.13)])
+  audition (P.sbind1 (i,[("freq",map midiCPS notes),("dur",repeat 0.13)]))
diff --git a/Sound/SC3/Graph/JMCC_sprinkler.hs b/Sound/SC3/Graph/JMCC_sprinkler.hs
--- a/Sound/SC3/Graph/JMCC_sprinkler.hs
+++ b/Sound/SC3/Graph/JMCC_sprinkler.hs
@@ -1,14 +1,22 @@
--- sprinkler (jmcc)
+-- sprinkler (jmcc) #1
 module Sound.SC3.Graph.JMCC_sprinkler where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 sprinkler :: UGen
 sprinkler =
-  let n = whiteNoise 'α' AR
-      f = lfPulse KR 0.09 0 0.16 * 10 + 7
+  let f = lfPulse KR 0.09 0 0.16 * 10 + 7
       t = lfPulse KR f 0 0.25 * 0.1
+      n = whiteNoise 'α' AR
   in bpz2 (n * t)
 
 main :: IO ()
 main = audition (out 0 sprinkler)
+
+-- > audition (out 0 sprinkler')
+sprinkler' :: UGen
+sprinkler' =
+           let n = whiteNoise 'α' AR
+               f = mouseX KR 0.2 50 Linear 0.2
+               t = lfPulse KR f 0 0.25 * 0.1
+           in bpz2 (n * t)
diff --git a/Sound/SC3/Graph/JMCC_sprinkler_m.hs b/Sound/SC3/Graph/JMCC_sprinkler_m.hs
--- a/Sound/SC3/Graph/JMCC_sprinkler_m.hs
+++ b/Sound/SC3/Graph/JMCC_sprinkler_m.hs
@@ -1,11 +1,11 @@
--- sprinkler-m (jmcc)
+-- sprinkler-m (jmcc) #1
 module Sound.SC3.Graph.JMCC_sprinkler_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 sprinkler_m :: UId m => m UGen
 sprinkler_m = do
-  n <- whiteNoise AR
+  n <- whiteNoiseM 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))
diff --git a/Sound/SC3/Graph/JMCC_string_wander_cluster.hs b/Sound/SC3/Graph/JMCC_string_wander_cluster.hs
--- a/Sound/SC3/Graph/JMCC_string_wander_cluster.hs
+++ b/Sound/SC3/Graph/JMCC_string_wander_cluster.hs
@@ -1,7 +1,7 @@
--- string wander-cluster (jmcc)
+-- string wander-cluster (jmcc) #6
 module Sound.SC3.Graph.JMCC_string_wander_cluster where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 import System.Random {- random -}
 
@@ -16,9 +16,21 @@
 swc st =
     let (n,g) = wander st
         d = 1 / midiCPS (constant n)
-        w = whiteNoise 'c' AR * 0.008
+        w = whiteNoise 'α' AR * 0.008
         o = combC w 0.01 d (d * 1000)
-    in (pan2 o (rand 'd' (-1) 1) 1,(n,g))
+    in (pan2 o (rand 'β' (-1) 1) 1,(n,g))
 
 main :: IO ()
 main = overlapTextureS (4/3,4/3,6,maxBound) swc (60,mkStdGen 0)
+
+swc' :: UGen
+swc' =
+    let n = rand 'α' 50 100
+        n' = fold (n + rand 'β' 0 15 - 7) 50 120
+        d = 1 / midiCPS n'
+        w = whiteNoise 'γ' AR * 0.008
+        o = combC w 0.01 d (d * 1000)
+    in pan2 o (rand 'δ' (-1) 1) 1
+
+main' :: IO ()
+main' = overlapTextureU (4/3,4/3,6,maxBound) swc'
diff --git a/Sound/SC3/Graph/JMCC_strummable_guitar.hs b/Sound/SC3/Graph/JMCC_strummable_guitar.hs
--- a/Sound/SC3/Graph/JMCC_strummable_guitar.hs
+++ b/Sound/SC3/Graph/JMCC_strummable_guitar.hs
@@ -1,20 +1,24 @@
--- strummable guitar (jmcc)
+-- strummable guitar (jmcc) #11
 module Sound.SC3.Graph.JMCC_strummable_guitar where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
-strummable_guitar :: UGen
-strummable_guitar =
+str :: UGen -> Double -> UGen
+str sc ix' =
+    let ix = constant ix'
+        x = mouseX KR 0 1 Linear 0.2
+        t = abs (hpz1 (x >* (0.25 + ix * 0.1)))
+        e = decay t 0.05
+        n = pinkNoise ix' AR * e
+        dt = 1 / midiCPS sc
+        s = combL n dt dt 4
+    in pan2 s (ix * 0.2 - 0.5) 1
+
+gtr :: UGen
+gtr =
     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
+        strs = sum (zipWith str scale [0..])
+    in leakDC (lpf strs 12000) 0.995
 
 main :: IO ()
-main = audition (out 0 strummable_guitar)
+main = audition (out 0 gtr)
diff --git a/Sound/SC3/Graph/JMCC_sweepy_noise.hs b/Sound/SC3/Graph/JMCC_sweepy_noise.hs
--- a/Sound/SC3/Graph/JMCC_sweepy_noise.hs
+++ b/Sound/SC3/Graph/JMCC_sweepy_noise.hs
@@ -1,8 +1,7 @@
--- sweepy noise (jmcc)
+-- sweepy noise (jmcc) #6
 module Sound.SC3.Graph.JMCC_sweepy_noise where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 sweepy_noise :: UGen
 sweepy_noise =
diff --git a/Sound/SC3/Graph/JMCC_swept_resonant_noise.hs b/Sound/SC3/Graph/JMCC_swept_resonant_noise.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_swept_resonant_noise.hs
@@ -0,0 +1,21 @@
+-- swept resonant noise (jmcc) #2
+module Sound.SC3.Graph.JMCC_swept_resonant_noise where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+srn :: UGen
+srn =
+  let p = 10
+      n = whiteNoise 'α' AR * 0.007
+      f = midiCPS (fSinOsc KR (rand 'β' 0.1 0.3) 0 * rand 'γ' 0 24 + rand 'δ' 36 84)
+      sw = resonz n f 0.1
+      spec = klankSpec_mce
+             (linRandN p 'ε' 80 10080 0)
+             (mce (replicate p 1))
+             (randN p 'ζ' 0.5 2.5)
+  in uclone 'η' 2 (klank sw 1 0 1 spec)
+
+main :: IO ()
+main = overlapTextureU (4,4,5,maxBound) srn
diff --git a/Sound/SC3/Graph/JMCC_synthetic_piano_m.hs b/Sound/SC3/Graph/JMCC_synthetic_piano_m.hs
--- a/Sound/SC3/Graph/JMCC_synthetic_piano_m.hs
+++ b/Sound/SC3/Graph/JMCC_synthetic_piano_m.hs
@@ -1,17 +1,18 @@
--- synthetic piano (jmcc)
+-- synthetic piano (jmcc) #3
 module Sound.SC3.Graph.JMCC_synthetic_piano_m where
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
+-- > g <- synthetic_piano
 synthetic_piano :: UId m => m UGen
 synthetic_piano = do
-  n <- iRand 36 90
-  f <- rand 0.1 0.5
-  ph <- rand 0 (pi * 2)
+  n <- iRandM 36 90
+  f <- randM 0.1 0.5
+  ph <- randM 0 1
   let s = impulse AR f ph * 0.1
       e = decay2 s 0.008 0.04
-      c i = do n0 <- lfNoise2 AR 3000
+      c i = do n0 <- lfNoise2M AR 3000
                let o = [-0.05,0,0.04] !! i
                    dt = 1 / midiCPS (n + o)
                return (combL (n0 * e) dt dt 6)
diff --git a/Sound/SC3/Graph/JMCC_tank.hs b/Sound/SC3/Graph/JMCC_tank.hs
--- a/Sound/SC3/Graph/JMCC_tank.hs
+++ b/Sound/SC3/Graph/JMCC_tank.hs
@@ -2,49 +2,48 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- 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
+pling :: UGen
+pling =
+    let d = dust 'α' AR 0.2
+        f = expRand 'β' 300 2200
+        p = rand 'γ' (-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
+bang :: UGen
+bang =
+    let d = dust 'δ' AR 0.01
+        n = brownNoise 'ε' 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
+-- > let u = useq 'λ' 4 r_allpass (soundIn 0)
+r_allpass :: UGen -> UGen
+r_allpass i = allpassN i 0.03 (randN 2 'ζ' 0.005 0.02) 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
+tank_f :: UGen -> UGen
+tank_f i =
+    let l0 = localIn 2 AR (mce2 0 0) * 0.98
         l1 = onePole l0 0.33
         (l1l,l1r) = mce2c l1
         l2 = rotate2 l1l l1r 0.23
-        l3 = allpassN l2 0.05 r1 2
+        l3 = allpassN l2 0.05 (randN 2 'θ' 0.01 0.05) 2
         l4 = delayN l3 0.3 (mce2 0.17 0.23)
-        l5 = allpassN l4 0.05 r2 2
+        l5 = allpassN l4 0.05 (randN 2 'ι' 0.03 0.15) 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)
+  let s = bang + mix (uclone 'κ' 8 pling)
+  in tank_f (useq 'λ' 4 r_allpass s)
 
 main :: IO ()
 main = audition (out 0 tank)
+
+-- > audition (out 0 trev)
+trev = tank_f (useq 'λ' 4 r_allpass (soundIn 0))
diff --git a/Sound/SC3/Graph/JMCC_tank_hp.hs b/Sound/SC3/Graph/JMCC_tank_hp.hs
--- a/Sound/SC3/Graph/JMCC_tank_hp.hs
+++ b/Sound/SC3/Graph/JMCC_tank_hp.hs
@@ -2,27 +2,29 @@
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.JMCC_tank_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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)
+  let s = decay2 #(dustM AR 0.2) 0.1 0.5
+          * cubed (fSinOsc AR #(expRandM 300 2200) 0)
           * 0.1
-  return (pan2 s #(rand (-1) 1) 1)
+  return (pan2 s #(randM (-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)
+bang = do return (pan2 (decay2 #(dustM AR 0.01) 0.04 0.3 * #(brownNoiseM 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)
+r_allpass i = do return (allpassN i 0.03 #(clone 2 (randM 0.005 0.02)) 1)
 
+-- > audition . out 0 =<< tank_f (soundIn 4)
 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
+  let [l,r] = mceChannels (onePole (localIn' 2 AR * 0.98) 0.33)
+  let a = allpassN (rotate2 l r 0.23) 0.05 #(clone 2 (randM 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
+  let c = leakDC (allpassN b 0.05 #(clone 2 (randM 0.03 0.15)) 2) 0.995 + i
   return (mrg [c,localOut c])
 
 tank :: UId m => m UGen
diff --git a/Sound/SC3/Graph/JMCC_tank_m.hs b/Sound/SC3/Graph/JMCC_tank_m.hs
--- a/Sound/SC3/Graph/JMCC_tank_m.hs
+++ b/Sound/SC3/Graph/JMCC_tank_m.hs
@@ -2,33 +2,35 @@
 -- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html
 module Sound.SC3.Graph.JMCC_tank_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
 pling :: UId m => m UGen
 pling = do
-  d <- dust AR 0.2
-  f <- expRand 300 2200
-  p <- rand (-1) 1
+  d <- dustM AR 0.2
+  f <- expRandM 300 2200
+  p <- randM (-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
+  d <- dustM AR 0.01
+  n <- brownNoiseM 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)
+  r <- clone 2 (randM 0.005 0.02)
   return (allpassN i 0.03 r 1)
 
+-- > audition . out 0 =<< tank_f (soundIn 4)
 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
+  r1 <- clone 2 (randM 0.01 0.05)
+  r2 <- clone 2 (randM 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
diff --git a/Sound/SC3/Graph/JMCC_tapping_tools.hs b/Sound/SC3/Graph/JMCC_tapping_tools.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_tapping_tools.hs
@@ -0,0 +1,22 @@
+-- tapping tools (jmcc) #7
+module Sound.SC3.Graph.JMCC_tapping_tools where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+tapping_tools :: UGen
+tapping_tools =
+    let e = envLinen 1 4 1 1
+        rate = xLine KR 64 0.125 60 DoNothing
+        exc = decay (impulse AR (linRand 'α' 1 21 0 * rate) 0 * 0.03) 0.001
+        spc = klankSpec_mce (randN 4 'β' 400 8400) (mce [1,1,1,1]) (randN 4 'γ' 0.01 0.11)
+        flt = klank exc 1 0 1 spc
+    in pan2 flt (rand 'δ' (-1) 1) (envGen KR 1 1 0 1 RemoveSynth e)
+
+-- > let g = pp (silent 1)
+pp :: UGen -> UGen
+pp z = let f x = allpassN x 0.05 (mce2 (rand 'ε' 0 0.05) (rand 'ζ' 0 0.05)) 2 in useq 'η' 3 f z
+
+main :: IO ()
+main = overlapTextureU_pp (2,1,3,maxBound) tapping_tools 2 pp
diff --git a/Sound/SC3/Graph/JMCC_tremulate.hs b/Sound/SC3/Graph/JMCC_tremulate.hs
--- a/Sound/SC3/Graph/JMCC_tremulate.hs
+++ b/Sound/SC3/Graph/JMCC_tremulate.hs
@@ -1,9 +1,9 @@
--- tremulate (jmcc)
+-- tremulate (jmcc) #1
 module Sound.SC3.Graph.JMCC_tremulate where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 tremulate :: UGen
 tremulate =
diff --git a/Sound/SC3/Graph/JMCC_tremulate_hp.hs b/Sound/SC3/Graph/JMCC_tremulate_hp.hs
--- a/Sound/SC3/Graph/JMCC_tremulate_hp.hs
+++ b/Sound/SC3/Graph/JMCC_tremulate_hp.hs
@@ -2,14 +2,14 @@
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.JMCC_tremulate_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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))))
+  let o = fSinOsc AR (#(randM 500 900) * mce [1,1.2,1.5,1.8]) 0
+  n <- clone 4 (lfNoise2M KR #(randM 30 90))
+  return (mix (pan2 o #(clone 4 (randM (-1) 1)) (max 0 (n * 0.1))))
 
 tremulate_pp :: UGen -> UGen
 tremulate_pp i = combN i 0.1 0.1 1
diff --git a/Sound/SC3/Graph/JMCC_tremulate_m.hs b/Sound/SC3/Graph/JMCC_tremulate_m.hs
--- a/Sound/SC3/Graph/JMCC_tremulate_m.hs
+++ b/Sound/SC3/Graph/JMCC_tremulate_m.hs
@@ -1,17 +1,17 @@
--- tremulate (jmcc)
+-- tremulate (jmcc) #1
 module Sound.SC3.Graph.JMCC_tremulate_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 tremulate :: UId m => m UGen
 tremulate = do
-  f <- rand 500 900
+  f <- randM 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)
+  r <- randM 30 90
+  n <- clone 4 (lfNoise2M KR r)
   let a = max 0 (n * 0.1)
-  l <- clone 4 (rand (-1) 1)
+  l <- clone 4 (randM (-1) 1)
   return (mix (pan2 o l a))
 
 tremulate_pp :: UGen -> UGen
diff --git a/Sound/SC3/Graph/JMCC_tsort.hs b/Sound/SC3/Graph/JMCC_tsort.hs
--- a/Sound/SC3/Graph/JMCC_tsort.hs
+++ b/Sound/SC3/Graph/JMCC_tsort.hs
@@ -2,14 +2,16 @@
 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.)
+of interconnect buffers, so to run this test we must delete all graphs
+that would otherwise be loaded.)
+
 -}
 
 import Sound.SC3 {- hsc3 -}
diff --git a/Sound/SC3/Graph/JMCC_uplink.hs b/Sound/SC3/Graph/JMCC_uplink.hs
--- a/Sound/SC3/Graph/JMCC_uplink.hs
+++ b/Sound/SC3/Graph/JMCC_uplink.hs
@@ -1,8 +1,7 @@
--- uplink (jmcc)
+-- uplink (jmcc) #2
 module Sound.SC3.Graph.JMCC_uplink where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 randz :: ID a => a -> UGen -> UGen
diff --git a/Sound/SC3/Graph/JMCC_uplink_hp.hs b/Sound/SC3/Graph/JMCC_uplink_hp.hs
--- a/Sound/SC3/Graph/JMCC_uplink_hp.hs
+++ b/Sound/SC3/Graph/JMCC_uplink_hp.hs
@@ -1,18 +1,19 @@
--- uplink (jmcc)
+-- uplink (jmcc) #2
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.JMCC_uplink_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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))
+  let p0 = do return (lfPulse KR #(randM 0 20) 0 #(randM 0 1))
+  let p1 = do return (lfPulse KR #(randM 0 4) 0 #(randM 0 1)
+                      * #(randM 0 8000)
+                      + #(randM 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)
+  return (pan2 (lfPulse AR f 0 0.5 * 0.04) #(randM (-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
--- a/Sound/SC3/Graph/JMCC_what_was_i_thinking_m.hs
+++ b/Sound/SC3/Graph/JMCC_what_was_i_thinking_m.hs
@@ -1,19 +1,20 @@
--- what was i thinking? (jmcc)
+-- what was i thinking? (jmcc) #2
 module Sound.SC3.Graph.JMCC_what_was_i_thinking_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
+-- > g <- 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
+  n0 <- lfNoise1M KR 0.2
+  n1 <- lfNoise1M 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
+      c x = do r <- randM 0 0.3
+               n <- lfNoise1M KR r
                return (combL x 0.06 (n * 0.025 + 0.035) 1)
       y = z * 0.6
   z0 <- clone 2 (c y)
diff --git a/Sound/SC3/Graph/JMCC_why_supercollider.hs b/Sound/SC3/Graph/JMCC_why_supercollider.hs
--- a/Sound/SC3/Graph/JMCC_why_supercollider.hs
+++ b/Sound/SC3/Graph/JMCC_why_supercollider.hs
@@ -1,9 +1,8 @@
--- why supercollider (jmcc)
+-- why supercollider (jmcc) #0
 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 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 why_supercollider :: UGen
 why_supercollider =
@@ -12,7 +11,7 @@
         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
+        f i = allpassN i 0.05 (randN 2 'η' 0 0.05) 1
         x = useq 'θ' 4 f y
     in out 0 (s + 0.2 * x)
 
diff --git a/Sound/SC3/Graph/JMCC_wind_metals_m.hs b/Sound/SC3/Graph/JMCC_wind_metals_m.hs
--- a/Sound/SC3/Graph/JMCC_wind_metals_m.hs
+++ b/Sound/SC3/Graph/JMCC_wind_metals_m.hs
@@ -2,19 +2,19 @@
 module Sound.SC3.Graph.JMCC_wind_metals_m where
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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))
+  base <- expRandM 60 4000
+  rng <- randM 500 8000
+  n0 <- clone 2 (brownNoiseM AR)
+  r0 <- expRandM 0.125 0.5
+  n1 <- lfNoise1M KR r0
+  f <- sequence (replicate n (randM base (base + rng)))
+  dt <- sequence (replicate n (randM 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
diff --git a/Sound/SC3/Graph/JMCC_zizle.hs b/Sound/SC3/Graph/JMCC_zizle.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_zizle.hs
@@ -0,0 +1,26 @@
+-- zizle (jmcc) #SC3d1.5
+module Sound.SC3.Graph.JMCC_zizle where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+twopi :: Floating n => n
+twopi = 2 * pi
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (-n) n
+
+-- > Sound.SC3.UGen.Dot.draw zizle
+-- > audition zizle
+zizle :: UGen
+zizle =
+  let a e f = let fm = mce2 (rand 'α' 0.7 1.3) 1
+                  ph = mce2 (rand 'β' 0 twopi) (rand 'γ' 0 twopi)
+              in uprotect e (mix (sinOsc AR (f * fm) ph * 0.1))
+      a1 = max (a 'δ' (expRand 'ε' 0.3 8)) 0
+      a2 = abs (a 'ζ' (expRand 'η' 6 24))
+      o = sinOsc AR (midiCPS (rand 'θ' 24 108)) (rand 'ι' 0 twopi)
+  in pan2 (o * a1 * a2) (rand2 'κ' 1) 1
+
+main :: IO ()
+main = overlapTextureU (4,4,12,maxBound) zizle
diff --git a/Sound/SC3/Graph/JMCC_zizle_hp.hs b/Sound/SC3/Graph/JMCC_zizle_hp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JMCC_zizle_hp.hs
@@ -0,0 +1,25 @@
+-- zizle (jmcc) #SC3d1.5
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+module Sound.SC3.Graph.JMCC_zizle_hp where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+twopi :: Floating n => n
+twopi = 2 * pi
+
+rand2 :: UId m => UGen -> m UGen
+rand2 n = randM (-n) n
+
+-- Sound.SC3.UGen.Dot.draw =<< zizle
+-- audition =<< zizle
+zizle :: UId m => m UGen
+zizle = do
+  let a f = mix (sinOsc AR (f * mce2 #(randM 0.7 1.3) 1) (mce2 #(randM 0 twopi) #(randM 0 twopi)) * 0.1)
+  let a1 = max (a #(expRandM 0.3 8)) 0
+  let a2 = abs (a #(expRandM 6 24))
+  let o = sinOsc AR (midiCPS #(randM 24 108)) #(randM 0 twopi)
+  return (pan2 (o * a1 * a2) #(rand2 1) 1)
+
+main :: IO ()
+main = overlapTextureU (4,4,12,maxBound) =<< zizle
diff --git a/Sound/SC3/Graph/JRHB_black_atlantic_currents.hs b/Sound/SC3/Graph/JRHB_black_atlantic_currents.hs
--- a/Sound/SC3/Graph/JRHB_black_atlantic_currents.hs
+++ b/Sound/SC3/Graph/JRHB_black_atlantic_currents.hs
@@ -2,10 +2,10 @@
 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 -}
+
+import Sound.SC3 {- hsc3 -}
 
 nth_prime :: Integral a => Int -> a
 nth_prime j = primes !! j
diff --git a/Sound/SC3/Graph/JRHB_chain_saw_m.hs b/Sound/SC3/Graph/JRHB_chain_saw_m.hs
--- a/Sound/SC3/Graph/JRHB_chain_saw_m.hs
+++ b/Sound/SC3/Graph/JRHB_chain_saw_m.hs
@@ -5,7 +5,7 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
 
 coinIf :: Double -> a -> a -> IO a
 coinIf n a b = do
@@ -26,10 +26,10 @@
 
 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
+  let f s1 = do xr <- fmap dup (expRandM 0.1 2)
+                n1 <- lfNoise1M KR xr
+                n2 <- lfNoise1M KR xr
+                n3 <- lfNoise1M 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)
diff --git a/Sound/SC3/Graph/JRHB_deep_sea.hs b/Sound/SC3/Graph/JRHB_deep_sea.hs
--- a/Sound/SC3/Graph/JRHB_deep_sea.hs
+++ b/Sound/SC3/Graph/JRHB_deep_sea.hs
@@ -1,13 +1,8 @@
 -- 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)
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 deep_sea :: UGen
 deep_sea =
@@ -22,7 +17,7 @@
         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)
+        f2 = f * ((count `modE` range (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]
@@ -30,5 +25,5 @@
 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
+      sc = P.sbind1 (s,[("dur",P.xrand 'ζ' [0.25,0.5,1,2])])
+  audition sc
diff --git a/Sound/SC3/Graph/JRHB_dial_history_m.hs b/Sound/SC3/Graph/JRHB_dial_history_m.hs
--- a/Sound/SC3/Graph/JRHB_dial_history_m.hs
+++ b/Sound/SC3/Graph/JRHB_dial_history_m.hs
@@ -2,33 +2,30 @@
 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
+import Sound.SC3 {- hsc3 -}
 
 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
+  n <- dwhiteM dinf 7 12
+  w <- dwhiteM 1 2 7
+  b <- dbrownM n 0.1 0.2 0.01
+  rate <- dseqM dinf (mce2 w b)
+  q <- dseqM dinf (mce [1..10])
+  g1 <- grayNoiseM AR
+  g2 <- grayNoiseM AR
+  d <- lfdNoise3M 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
+      which = trunc (linLin_u 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)
+      dsig = delayN sig 0.2 (linLin_u d 0 0.01)
       hiss = g1 * 0.01 + hpf (g2 * 0.02) 3000
   return (dsig + hiss)
 
diff --git a/Sound/SC3/Graph/JRHB_half_life.hs b/Sound/SC3/Graph/JRHB_half_life.hs
--- a/Sound/SC3/Graph/JRHB_half_life.hs
+++ b/Sound/SC3/Graph/JRHB_half_life.hs
@@ -1,13 +1,13 @@
 -- half-life (jrhb)
 module Sound.SC3.Graph.JRHB_half_life where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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)
+      n = max 0 (n_atoms - pulseCount (localIn' 2 AR) 0)
       activity = dust 'α' AR (n * log 2 * t_half)
   in mrg [activity,localOut activity]
 
diff --git a/Sound/SC3/Graph/JRHB_sam_i_am.hs b/Sound/SC3/Graph/JRHB_sam_i_am.hs
--- a/Sound/SC3/Graph/JRHB_sam_i_am.hs
+++ b/Sound/SC3/Graph/JRHB_sam_i_am.hs
@@ -4,9 +4,10 @@
 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 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 text :: [String]
 text =
@@ -34,22 +35,23 @@
         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 :: (Floating t, RandomGen g, Random t) => g -> [(String,(t,t,t,t))]
 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)])
+          return (w,(f1,f2,f3,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))
+      (f1,f2,f3,d) = unzip4 (mapMaybe (\w -> lookup w t) (concat x))
+      p = [("freq1",f1)
+          ,("freq2",f2)
+          ,("freq3",f3)
+          ,("dur",d)]
+  audition (P.sbind1 (sam,p))
diff --git a/Sound/SC3/Graph/JR_jr_100515.hs b/Sound/SC3/Graph/JR_jr_100515.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/JR_jr_100515.hs
@@ -0,0 +1,20 @@
+-- http://permalink.gmane.org/gmane.comp.audio.supercollider.user/100515 (jr)
+module Sound.SC3.Graph.JR_jr_100515 where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import System.Random {- random -}
+
+pat :: UGen
+pat = panAz 32 (sinOscFB AR 18 1.4) (sinOscFB AR 0.2 1.4) 1 2 0.5
+
+mat :: Int -> UGen -> UGen
+mat n x = splay (sinOscFB AR (expRandN n 'α' 1 11e3) x * x) 1 1 0 True
+
+main :: IO ()
+main = do
+  let r = randomRs (1,64) (mkStdGen 245763)
+      f (n0:n) = (mat n0 pat,n)
+      f [] = undefined
+  overlapTextureS (6,2,2,maxBound) f r
diff --git a/Sound/SC3/Graph/MN_k2ws.hs b/Sound/SC3/Graph/MN_k2ws.hs
--- a/Sound/SC3/Graph/MN_k2ws.hs
+++ b/Sound/SC3/Graph/MN_k2ws.hs
@@ -1,7 +1,7 @@
 -- https://www.listarc.bham.ac.uk/lists/sc-users/msg21341.html (mn)
 module Sound.SC3.Graph.MN_k2ws where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 rng :: (UGen,UGen) -> UGen -> UGen
 rng (i,j) = range i j
diff --git a/Sound/SC3/Graph/MN_k2ws_hp.hs b/Sound/SC3/Graph/MN_k2ws_hp.hs
--- a/Sound/SC3/Graph/MN_k2ws_hp.hs
+++ b/Sound/SC3/Graph/MN_k2ws_hp.hs
@@ -2,17 +2,17 @@
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.MN_k2ws_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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 fc = 400 + range 100 200 #(lfNoise2M AR (mce2 1 2))
+  let fm = range 100 200 #(lfNoise0M AR 5)
+  let i = range 1 20 #(lfNoise1M 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
+  let rf = range 1000 2000 (sinOsc AR (range 0.1 1 #(lfNoise1M AR 1)) 0)
+  let rq = range 0.5 10 #(lfNoise1M AR 1)
+  let ph = rlpf x rf rq * range 1.0 4.0 #(lfNoise1M AR 0.1) * 4 * pi
   return (sinOsc AR 0.2 ph * 0.5)
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/NC_after_goeyvaerts.hs b/Sound/SC3/Graph/NC_after_goeyvaerts.hs
--- a/Sound/SC3/Graph/NC_after_goeyvaerts.hs
+++ b/Sound/SC3/Graph/NC_after_goeyvaerts.hs
@@ -6,7 +6,7 @@
 import Data.List.Split {- split -}
 import qualified Data.Map as M {- containers -}
 import Sound.OSC.FD {- hosc -}
-import Sound.SC3.ID.FD {- hsc3 -}
+import Sound.SC3.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 -}
diff --git a/Sound/SC3/Graph/NC_arpeggio.hs b/Sound/SC3/Graph/NC_arpeggio.hs
--- a/Sound/SC3/Graph/NC_arpeggio.hs
+++ b/Sound/SC3/Graph/NC_arpeggio.hs
@@ -5,21 +5,24 @@
 import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
+outk :: UGen -> UGen
+outk = out (control KR "out" 0)
+
+pan2k :: UGen -> UGen
+pan2k s = pan2 s (control KR "pan" 0) (control KR "amp" 0.1)
+
 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))
+    in synthdef "analogarpeggio" (outk (pan2k (e * s)))
 
 {-
 audition (pbind [(K_instr,psynth analogarpeggio)
@@ -84,4 +87,4 @@
 main = do
   let n = 60/157
       p = pedit K_dur (* n) (pbind arpeggio)
-  withSC3 (play p)
+  paudition p
diff --git a/Sound/SC3/Graph/NP_pebble_beach.hs b/Sound/SC3/Graph/NP_pebble_beach.hs
--- a/Sound/SC3/Graph/NP_pebble_beach.hs
+++ b/Sound/SC3/Graph/NP_pebble_beach.hs
@@ -3,8 +3,7 @@
 -- requires 'scsynth -u 57110 -m 32768'
 module Sound.SC3.Graph.NP_pebble_beach where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 exprange :: UGen -> UGen -> UGen -> UGen
 exprange l r i = linExp i (-1) 1 l r
diff --git a/Sound/SC3/Graph/NV_nv_ml_2014_06_03.hs b/Sound/SC3/Graph/NV_nv_ml_2014_06_03.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NV_nv_ml_2014_06_03.hs
@@ -0,0 +1,18 @@
+-- sc-users, 2014-06-03 (nv)
+module Sound.SC3.Graph.NV_nv_ml_2014_06_03 where
+
+import Sound.SC3 {- hsc3 -}
+
+nv_ml_2014_06_03 :: UGen
+nv_ml_2014_06_03 =
+    let y = mouseY KR 1 100 Linear 0.2
+        x = mouseX KR 50 400 Exponential 0.2
+        i = decay (impulse AR 0.5 0) 0.1
+        i' = sin (bpf (i * y) 50 1)
+    in pluck i' (lfSaw AR 10000 0) 0.1 (1 / x) 4 0.5
+
+repl :: Int -> UGen -> UGen
+repl n = mce . replicate n
+
+main :: IO ()
+main = audition (out 0 (repl 2 nv_ml_2014_06_03))
diff --git a/Sound/SC3/Graph/NV_nv_tw_1.hs b/Sound/SC3/Graph/NV_nv_tw_1.hs
--- a/Sound/SC3/Graph/NV_nv_tw_1.hs
+++ b/Sound/SC3/Graph/NV_nv_tw_1.hs
@@ -1,8 +1,7 @@
 -- 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
+import Sound.SC3 {- hsc3 -}
 
 nv_tw_1 :: UGen
 nv_tw_1 =
diff --git a/Sound/SC3/Graph/NV_nv_tw_2013_01_11.hs b/Sound/SC3/Graph/NV_nv_tw_2013_01_11.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NV_nv_tw_2013_01_11.hs
@@ -0,0 +1,34 @@
+-- https://twitter.com/headcube/status/289761321065541633 (nv)
+module Sound.SC3.Graph.NV_nv_tw_2013_01_11 where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Collection {- hsc3-lang -}
+
+mce_concat :: [UGen] -> UGen
+mce_concat = mce . concat . map mceChannels
+
+mce_rotate :: Integral i => i -> UGen -> UGen
+mce_rotate n = mce . rotate n . mceChannels
+
+-- > length (mceChannels nv_tw_2013_01_11) == 100
+nv_tw_2013_01_11 :: UGen
+nv_tw_2013_01_11 =
+    let nc = 80
+        i = inFeedback nc 20
+        n = (uclone 'α' nc (lfNoise1 'β' KR 1e-3 + 1)) / constant nc
+        j = combL (lpf i 2e3) 1 n 0.05
+        d = uclone 'γ' nc (dust2 'δ' AR 0.01)
+        x = sin (j + d)
+    in mce_concat [splay x 1 1 0 True
+                  ,mce (replicate 18 0)
+                  ,(x - mce_rotate 1 x) / 2]
+
+main :: IO ()
+main = audition (out 0 nv_tw_2013_01_11)
+
+main_w :: IO ()
+main_w = do
+  let sy = synthdef "nv_tw_2013_01_11" (out 0 nv_tw_2013_01_11)
+  synthdefWrite sy "/tmp"
+  withSC3 (do _ <- async (d_load "/tmp/nv_tw_2013_01_11.scsyndef")
+              send (s_new "nv_tw_2013_01_11" (-1) AddToTail 1 []))
diff --git a/Sound/SC3/Graph/NV_nv_tw_2013_12_04.hs b/Sound/SC3/Graph/NV_nv_tw_2013_12_04.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NV_nv_tw_2013_12_04.hs
@@ -0,0 +1,22 @@
+-- https://twitter.com/headcube/status/408145586970324992 (nv)
+module Sound.SC3.Graph.NV_nv_tw_2013_12_04 where
+
+import Sound.SC3 {- hsc3 -}
+
+mean :: Fractional a => [a] -> a
+mean l = sum l / fromIntegral (length l)
+
+f :: UGen -> UGen
+f j =
+    let i = j + 1;
+        a = saw AR ((1 / i + 1) / 6)
+        p = pluck a a 1 (1 / i / (3 - lfPulse AR (1 / i) 0 0.5) / 30) 9 (0.9 / i)
+        x = (0.5 ** i) * p
+        o = sinOsc AR 2 0 + mce2 4 9
+    in combC x 1 (o * 1e-3) 0 - x
+
+nv :: UGen
+nv = mean (map f [0 .. 8]) / 9
+
+main :: IO ()
+main = audition (out 0 nv)
diff --git a/Sound/SC3/Graph/NV_nv_tw_2014_02_21.hs b/Sound/SC3/Graph/NV_nv_tw_2014_02_21.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NV_nv_tw_2014_02_21.hs
@@ -0,0 +1,29 @@
+-- https://twitter.com/headcube/status/437094206767513600 (nv)
+-- requires -m at scsynth
+module Sound.SC3.Graph.NV_nv_tw_2014_02_21 where
+
+import Sound.SC3 {- hsc3 -}
+
+x :: UGen
+x = impulse AR 0.05 0
+
+-- > audition (out 0 (f x))
+f :: UGen -> UGen
+f i =
+    let n e = lfNoise2 e KR
+        a = allpassL (leakDC i 0.995) 4 ((8 ** n 'α' 0.1) / 2) 8 * 1.2
+    in tanh (lpf a ((8 ** n 'β' (mce2 (rand 'γ' 0 0.1) (rand 'δ' 0 0.1))) * 2500))
+
+-- > audition (out 0 y)
+y :: UGen
+y = useq 'ε' 20 f x * 5
+
+-- > audition (out 0 z)
+z :: UGen
+z = mix (uclone 'ζ' 4 y)
+
+z_opt :: UGen
+z_opt = ugen_optimise_ir_rand z
+
+main :: IO ()
+main = audition (out 0 z_opt)
diff --git a/Sound/SC3/Graph/NV_nv_tw_2014_06_03.hs b/Sound/SC3/Graph/NV_nv_tw_2014_06_03.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/NV_nv_tw_2014_06_03.hs
@@ -0,0 +1,36 @@
+-- https://twitter.com/headcube/status/474064500564324352 (nv)
+-- requires -m at scsynth
+-- inaccurate...
+module Sound.SC3.Graph.NV_nv_tw_2014_06_03 where
+
+import Sound.SC3 {- hsc3 -}
+
+-- > audition (out 0 p)
+p :: UGen
+p = lfPulse AR (2 ** rand 'α' (-9) 1) (rand 'β' 0 2 / 2) 0.5
+
+q :: Int -> UGen
+q i = product (uclone' 'γ' (i + 2) p) / (1 + constant i) + 1
+
+-- > audition (out 0 s)
+s :: UGen
+s =
+    let f = product (uprotect' 'δ' (map q [0 .. 7])) * 86
+    in pluck (sin (bpf f f 1)) (saw AR 440) 1 (1 / f) 9 0.5
+
+nv :: UGen
+nv = splay (uclone 'ε' 9 s) 1 1 0 True
+
+-- > audition (out 0 nv_opt)
+nv_opt :: UGen
+nv_opt = ugen_optimise_const_operator (ugen_optimise_ir_rand nv)
+
+-- > via_disk (out 0 nv)
+via_disk :: UGen -> IO ()
+via_disk u = do
+  let sy = synthdef "nv" u
+  synthdefWrite sy "/tmp"
+  withSC3 (async (d_load "/tmp/nv.scsyndef") >> send (s_new "nv" (-1) AddToHead 1 []))
+
+main :: IO ()
+main = audition (out 0 nv_opt)
diff --git a/Sound/SC3/Graph/NV_nv_tw_41.hs b/Sound/SC3/Graph/NV_nv_tw_41.hs
--- a/Sound/SC3/Graph/NV_nv_tw_41.hs
+++ b/Sound/SC3/Graph/NV_nv_tw_41.hs
@@ -1,15 +1,16 @@
 -- http://sccode.org/1-V (nv)
 module Sound.SC3.Graph.NV_nv_tw_41 where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+    let nd z =
+            let i = constant z
+                t = (0.6 ** i) * 40 * impulse AR ((2 ** i) / 32) (1/2)
+                f = (4 ** lfNoise0 z KR (1/16)) * 300
             in sin (rlpf t f 5e-3)
-        x = splay (mce (map nd [0..7])) 1 1 0 True
+        x = splay (mce (map nd [0::Int .. 7])) 1 1 0 True
         r u = let (p,q) = mce2c u in freeVerb2 p q 0.1 1 1
     in r (r x)
 
diff --git a/Sound/SC3/Graph/NV_nv_tw_54.hs b/Sound/SC3/Graph/NV_nv_tw_54.hs
--- a/Sound/SC3/Graph/NV_nv_tw_54.hs
+++ b/Sound/SC3/Graph/NV_nv_tw_54.hs
@@ -2,7 +2,7 @@
 module Sound.SC3.Graph.NV_nv_tw_54 where
 
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Bind as P {- hsc3-lang -}
 
 fF :: Double -> Double -> Double
 fF i f =
@@ -25,8 +25,7 @@
 
 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)])
+    let p = [("f",fS)
+            ,("i",[0..])
+            ,("dur",repeat 0.3)]
+    in audition (P.sbind1 (nvi,p))
diff --git a/Sound/SC3/Graph/PJ_forest_sounds_m.hs b/Sound/SC3/Graph/PJ_forest_sounds_m.hs
--- a/Sound/SC3/Graph/PJ_forest_sounds_m.hs
+++ b/Sound/SC3/Graph/PJ_forest_sounds_m.hs
@@ -1,12 +1,12 @@
 -- sc-users, 2007-04-06 (pj) [paul jones]
 module Sound.SC3.Graph.PJ_forest_sounds_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 insects :: UId m => m UGen
 insects = do
-  n1 <- brownNoise AR
-  n2 <- lfNoise2 KR 50
+  n1 <- brownNoiseM AR
+  n2 <- lfNoise2M KR 50
   let o = sinOsc KR (n2 * 50 + 50) 0 * 100 + 2000
   return (bpf n1 o 0.001 * 10)
 
diff --git a/Sound/SC3/Graph/RD_bs_070705_m.hs b/Sound/SC3/Graph/RD_bs_070705_m.hs
--- a/Sound/SC3/Graph/RD_bs_070705_m.hs
+++ b/Sound/SC3/Graph/RD_bs_070705_m.hs
@@ -2,7 +2,7 @@
 module Sound.SC3.Graph.RD_bs_070705_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
 
 -- | One step in a bubble sort with specified /greater than/ function.
@@ -32,10 +32,10 @@
 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
+  phase <- dseriesM inf_sc 0 1
+  f' <- dbufrdM 10 phase Loop
+  a' <- dbufrdM 11 phase Loop
+  p' <- dbufrdM 12 phase Loop
   let tr = impulse AR r 0
       f'' = demand tr 0 f'
       a'' = demand tr 0 a'
diff --git a/Sound/SC3/Graph/RD_ccomb_m.hs b/Sound/SC3/Graph/RD_ccomb_m.hs
--- a/Sound/SC3/Graph/RD_ccomb_m.hs
+++ b/Sound/SC3/Graph/RD_ccomb_m.hs
@@ -1,21 +1,20 @@
 -- ccomb (rd)
 module Sound.SC3.Graph.RD_ccomb_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 ccomb :: (Functor m,UId m) => m UGen
 ccomb = do
-  let rng l r i = linLin i (-1) 1 l r
-      lwr = 48
+  let 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
+      spart t = do n <- fmap (range lwr 72.0) (lfNoise2M KR 0.1)
+                   e <- fmap (decay2 t 0.01) (tRandM 0.05 0.75 t)
+                   x <- fmap (* e) (whiteNoiseM AR)
+                   m <- lfNoise2M KR 0.1
                    let f = lag (midiCPS n) 0.25
-                       m' = rng 1 8 m
+                       m' = range 1 8 m
                    return (combC x (recip flwr) (recip f) m')
-  t <- dust KR (mce2 0.75 0.35)
+  t <- dustM KR (mce2 0.75 0.35)
   return . (* 0.1) . sum =<< sequence (replicate 12 (spart t))
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_cds_070701_m.hs b/Sound/SC3/Graph/RD_cds_070701_m.hs
--- a/Sound/SC3/Graph/RD_cds_070701_m.hs
+++ b/Sound/SC3/Graph/RD_cds_070701_m.hs
@@ -8,7 +8,7 @@
 module Sound.SC3.Graph.RD_cds_070701_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 -- | Real
 type R = Double
@@ -68,11 +68,11 @@
 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
+  phase <- dseriesM inf_sc 0 1
+  t' <- dbufrdM 10 phase Loop
+  f' <- dbufrdM 11 phase Loop
+  a' <- dbufrdM 12 phase Loop
+  p' <- dbufrdM 13 phase Loop
   let tr = tDuty AR t' 0 DoNothing 1 0
       f'' = demand tr 0 f'
       a'' = demand tr 0 a'
diff --git a/Sound/SC3/Graph/RD_chrd_m.hs b/Sound/SC3/Graph/RD_chrd_m.hs
--- a/Sound/SC3/Graph/RD_chrd_m.hs
+++ b/Sound/SC3/Graph/RD_chrd_m.hs
@@ -1,14 +1,14 @@
 -- chrd (rd)
 module Sound.SC3.Graph.RD_chrd_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  r0 <- randM 0.05 0.5
+  [r1, r2] <- sequence (replicate 2 (randM (-1) 1))
+  r3 <- randM 0.15 0.35
+  r4 <- randM 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])
diff --git a/Sound/SC3/Graph/RD_cricket_m.hs b/Sound/SC3/Graph/RD_cricket_m.hs
--- a/Sound/SC3/Graph/RD_cricket_m.hs
+++ b/Sound/SC3/Graph/RD_cricket_m.hs
@@ -2,17 +2,17 @@
 module Sound.SC3.Graph.RD_cricket_m where
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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)
+  r1 <- clone 2 (randM 10 13)
+  r2 <- clone 2 (randM 10 13)
+  r3 <- clone 2 (randM 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)
+  r4 <- clone 2 (tRandM 2130 2230 t)
   return (sinOsc AR r4 0 * f * 0.25)
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_crotale.hs b/Sound/SC3/Graph/RD_crotale.hs
--- a/Sound/SC3/Graph/RD_crotale.hs
+++ b/Sound/SC3/Graph/RD_crotale.hs
@@ -1,7 +1,7 @@
 -- crotale (rd)
 module Sound.SC3.Graph.RD_crotale where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 crotale :: UGen
 crotale =
diff --git a/Sound/SC3/Graph/RD_crotale_sine.hs b/Sound/SC3/Graph/RD_crotale_sine.hs
--- a/Sound/SC3/Graph/RD_crotale_sine.hs
+++ b/Sound/SC3/Graph/RD_crotale_sine.hs
@@ -1,8 +1,8 @@
 -- crotale-sine (rd)
 module Sound.SC3.Graph.RD_crotale_sine where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 crotale_sine :: UGen
 crotale_sine =
@@ -12,27 +12,28 @@
         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'
+            let k = floor f' :: Int
+                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)
+                r0 = rand (k + 0) 0 (2 * pi)
+                r1 = rand (k + 1) 0.1 0.3
+                r2 = rand (k + 2) 0.025 0.1
+                r3 = rand (k + 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 :: P.Param
 pattern =
-    [(K_param "m",pwhitei 'α' 0 12 inf)
-    ,(K_dur,pxrand 'β' [1,2,3] inf)
-    ,(K_sustain,6)]
+    [("m",map roundE (P.white 'α' 0 12))
+    ,("dur",P.xrand 'β' [1,2,3])
+    ,("sustain",repeat 6)]
 
 main :: IO ()
 main = do
   let s = synthdef "crotale-sine" (out 0 crotale_sine)
-  audition (p_with (K_instr,psynth s) (pbind pattern))
+  audition (P.sbind1 (s,pattern))
 
 crotale_data :: ([Double],[Double])
 crotale_data =
diff --git a/Sound/SC3/Graph/RD_cut_outs_m.hs b/Sound/SC3/Graph/RD_cut_outs_m.hs
--- a/Sound/SC3/Graph/RD_cut_outs_m.hs
+++ b/Sound/SC3/Graph/RD_cut_outs_m.hs
@@ -1,19 +1,19 @@
 -- cut-outs (rd)
 module Sound.SC3.Graph.RD_cut_outs_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+      n = do n1 <- lfNoise0M KR 2
+             n2 <- coinGateM (0.05 + n1 + y * 0.4 + t * 0.5) (t * 0.5)
+             n3 <- tExpRandM (mce2 500 900) 1600 t
              return (ringz n2 n3 x)
   s <- fmap sum (sequence (replicate 3 n))
-  b <- tRand 0 1 =<< dust KR 8
+  b <- tRandM 0 1 =<< dustM KR 8
   return (mrg [clip2 s (in' 1 KR 0) * 0.25,out 0 b])
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_diffraction_m.hs b/Sound/SC3/Graph/RD_diffraction_m.hs
--- a/Sound/SC3/Graph/RD_diffraction_m.hs
+++ b/Sound/SC3/Graph/RD_diffraction_m.hs
@@ -2,25 +2,25 @@
 module Sound.SC3.Graph.RD_diffraction_m where
 
 import Control.Monad {- base -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+             f <- fmap (* mce2 32 64) (lfNoise0M KR 4)
+             w <- fmap (* x) (lfNoise0M KR 32)
+             z <- fmap (* 0.1) (lfNoise0M KR 2)
+             m <- lfNoise0M 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
+      q = do n <- lfNoise0M 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)
+              f _ = do fr <- fmap (* x) (randM 50 59)
+                       am <- fmap (* y) (randM 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])
diff --git a/Sound/SC3/Graph/RD_discretion.hs b/Sound/SC3/Graph/RD_discretion.hs
--- a/Sound/SC3/Graph/RD_discretion.hs
+++ b/Sound/SC3/Graph/RD_discretion.hs
@@ -1,9 +1,8 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 discretion :: UGen
 discretion =
diff --git a/Sound/SC3/Graph/RD_discretion_m.hs b/Sound/SC3/Graph/RD_discretion_m.hs
--- a/Sound/SC3/Graph/RD_discretion_m.hs
+++ b/Sound/SC3/Graph/RD_discretion_m.hs
@@ -1,15 +1,15 @@
 -- discretion-m (rd)
 module Sound.SC3.Graph.RD_discretion_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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)
+      part = do f1 <- clone 2 (randM 50 55)
+                f2 <- clone 2 (randM 50 65)
+                f3 <- clone 2 (randM 50 55)
+                a <- clone 2 (randM 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
diff --git a/Sound/SC3/Graph/RD_e_lamell.hs b/Sound/SC3/Graph/RD_e_lamell.hs
--- a/Sound/SC3/Graph/RD_e_lamell.hs
+++ b/Sound/SC3/Graph/RD_e_lamell.hs
@@ -3,7 +3,7 @@
 
 import Control.Monad
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
 
 e_lamell :: UGen
diff --git a/Sound/SC3/Graph/RD_e_lamell_p.hs b/Sound/SC3/Graph/RD_e_lamell_p.hs
--- a/Sound/SC3/Graph/RD_e_lamell_p.hs
+++ b/Sound/SC3/Graph/RD_e_lamell_p.hs
@@ -1,8 +1,8 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 e_lamell :: UGen
 e_lamell =
@@ -19,25 +19,22 @@
         e = envGen AR 1 a 0 1 RemoveSynth e_d
     in pan2 s l e
 
-patterns :: [[P_Bind]]
+patterns :: [(Synthdef,P.Param)]
 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)]]
+    let sy = synthdef "e-lamell" (out 0 e_lamell)
+        to_cps = P.degree_to_cps' [0,2,4,5,7,9,11] 12
+    in [(sy,[("freq",to_cps (P.rand 'β' [0,2,5,7]) (P.wrand 'γ' [2,3,4,5] [0.2,0.35,0.35,0.1]))
+            ,("dur",repeat 0.1)
+            ,("d",P.white 'δ' 0.01 0.8)
+            ,("amp",P.white 'ε' 0 0.75)
+            ,("n",P.white 'ζ' 2 36)
+            ,("l",P.white 'η' (-1) 1)])
+       ,(sy,[("freq",to_cps (P.rand 'θ' [0]) (P.rand 'ι' [1,2,3]))
+            ,("dur",repeat 0.1)
+            ,("d",P.white 'κ' 0.01 1.2)
+            ,("amp",P.rand 'λ' [0,0.25,0.5,1])
+            ,("n",P.white 'μ' 2 36)
+            ,("l",P.white 'ν' (-1) 1)])]
 
 main :: IO ()
-main = audition (ppar (map pbind patterns))
+main = audition (P.sbind patterns)
diff --git a/Sound/SC3/Graph/RD_eggcrate.hs b/Sound/SC3/Graph/RD_eggcrate.hs
--- a/Sound/SC3/Graph/RD_eggcrate.hs
+++ b/Sound/SC3/Graph/RD_eggcrate.hs
@@ -1,7 +1,7 @@
 -- eggcrate (rd)
 module Sound.SC3.Graph.RD_eggcrate where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 atp :: (t -> u) -> (t,t) -> (u,u)
 atp f (i,j) = (f i,f j)
@@ -15,8 +15,8 @@
       (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
+      f = linLin_b (eggcrate_f x y) f0 f1
+      a = linLin_b x 0 0.1
  in pan2 (mix (sinOsc AR f 0)) y a
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_eggcrate_m.hs b/Sound/SC3/Graph/RD_eggcrate_m.hs
--- a/Sound/SC3/Graph/RD_eggcrate_m.hs
+++ b/Sound/SC3/Graph/RD_eggcrate_m.hs
@@ -1,7 +1,7 @@
 -- eggcrate-m (rd)
 module Sound.SC3.Graph.RD_eggcrate_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 eggcrate :: UId m => m UGen
 eggcrate = do
@@ -9,11 +9,11 @@
       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
+  [x,y] <- sequence (replicate 2 (brownNoiseM KR))
+  t <- dustM KR 2.4
+  [f0,f1] <- sequence (replicate 2 (tChooseM t p))
+  let f = linLin_b (eggcrate_f x y) f0 f1
+      a = linLin_b x 0 0.1
   return (pan2 (mix (sinOsc AR f 0)) y a)
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_f_lets_m.hs b/Sound/SC3/Graph/RD_f_lets_m.hs
--- a/Sound/SC3/Graph/RD_f_lets_m.hs
+++ b/Sound/SC3/Graph/RD_f_lets_m.hs
@@ -1,22 +1,22 @@
 -- f-lets (rd)
 module Sound.SC3.Graph.RD_f_lets_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+           r0 <- tIRandM (mce2 2 1) n pd
+           r1 <- tRandM 0.01 0.04 pd
+           r2 <- tRandM 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
+           r0 <- tRandM 0 1 t
+           r1 <- tRandM 0 1 t
+           r2 <- tRandM 0 1 t
+           r3 <- tRandM 0 1 t
+           r4 <- coinGateM 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)
@@ -24,7 +24,7 @@
                     ,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
+  n <- lfNoise0M KR 2
   return . (* (n * 0.25 + 0.25)) . sum =<< mk_n tr
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_fb_090531.hs b/Sound/SC3/Graph/RD_fb_090531.hs
--- a/Sound/SC3/Graph/RD_fb_090531.hs
+++ b/Sound/SC3/Graph/RD_fb_090531.hs
@@ -8,8 +8,8 @@
 
 fb_090531 :: UGen
 fb_090531 =
-    let k_in n = linLin (in' 1 KR n) (-1) 1
-        p = localIn 1 AR
+    let k_in n = linLin_b (in' 1 KR n)
+        p = localIn' 1 AR
         bt = recip controlRate
         ig_f = k_in 0 1 20
         ig = impulse AR ig_f 0
diff --git a/Sound/SC3/Graph/RD_fbl_fbf.hs b/Sound/SC3/Graph/RD_fbl_fbf.hs
--- a/Sound/SC3/Graph/RD_fbl_fbf.hs
+++ b/Sound/SC3/Graph/RD_fbl_fbf.hs
@@ -1,7 +1,7 @@
 -- fbl-fbf (rd)
 module Sound.SC3.Graph.RD_fbl_fbf where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 fbl :: UGen -> [UGen] -> [UGen] -> [UGen] -> (UGen, UGen)
 fbl l i d g =
@@ -27,7 +27,7 @@
       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
+      (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]
diff --git a/Sound/SC3/Graph/RD_feedr_m.hs b/Sound/SC3/Graph/RD_feedr_m.hs
--- a/Sound/SC3/Graph/RD_feedr_m.hs
+++ b/Sound/SC3/Graph/RD_feedr_m.hs
@@ -3,22 +3,23 @@
 module Sound.SC3.Graph.RD_feedr_m where
 
 import Sound.OSC.FD {- hosc -}
-import Sound.SC3.Monad.FD {- hsc3 -}
+import Sound.SC3.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
+tap' :: Int -> UGen -> UGen -> UGen
+tap' nc b dt = playBuf nc AR b 1 0 (dt * (- sampleRate)) Loop DoNothing
 
 type State = (UGen,Double)
 
+-- > u <- feedr (mce2 0 1,6) 18
 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
+  t <- sequence (replicate n (randM 0.0 (constant dl)))
+  g <- sequence (replicate n (randM 0.4 1.0))
+  f <- sequence (replicate n (randM 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
@@ -32,6 +33,6 @@
   audition =<< feedr (ch,dl) 18
 
 main :: IO ()
-main = withSC3 (run (mce2 4 5,6))
+main = withSC3 (run (mce2 0 1,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
--- a/Sound/SC3/Graph/RD_fm_iter.hs
+++ b/Sound/SC3/Graph/RD_fm_iter.hs
@@ -1,7 +1,7 @@
 -- fm-iter (rd)
 module Sound.SC3.Graph.RD_fm_iter where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 -- audition (out 0 fm_iter)
diff --git a/Sound/SC3/Graph/RD_fm_kltr_m.hs b/Sound/SC3/Graph/RD_fm_kltr_m.hs
--- a/Sound/SC3/Graph/RD_fm_kltr_m.hs
+++ b/Sound/SC3/Graph/RD_fm_kltr_m.hs
@@ -2,15 +2,15 @@
 module Sound.SC3.Graph.RD_fm_kltr_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad as U {- hsc3 -}
+import Sound.SC3 {- 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
+  r1 <- randM 0.975 1.025
+  r2 <- randM 0.5 1.5
+  r3 <- randM 0.975 1.025
+  r4 <- randM 0.75 1.25
   let o = control IR "out" 0
       a = control KR "amp" 0.1
       d = control KR "dur" 0.1
diff --git a/Sound/SC3/Graph/RD_fm_kltr_p.hs b/Sound/SC3/Graph/RD_fm_kltr_p.hs
--- a/Sound/SC3/Graph/RD_fm_kltr_p.hs
+++ b/Sound/SC3/Graph/RD_fm_kltr_p.hs
@@ -1,8 +1,8 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 fm_kltr :: UGen
 fm_kltr =
@@ -25,17 +25,15 @@
       l = line KR p (p * r4) dt DoNothing
   in out o (pan2 (sinOsc AR m 0) l e)
 
-pattern :: [P_Bind]
+pattern :: P.Param
 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)]
+    [("freq",repeat (midiCPS 53))
+    ,("freq2",map midiCPS (P.white 'α' 48 96))
+    ,("amp",P.white 'β' 0.1 0.4)
+    ,("dur",P.white 'γ' 0.15 1.25)
+    ,("sustain",P.white 'δ' 5 6)
+    ,("index",P.white 'ε' 240 1480)
+    ,("pan",P.white 'ζ' (-1) 1)]
 
 main :: IO ()
-main = audition (pbind pattern)
+main = audition (P.sbind1 (synthdef "fm_kltr" fm_kltr,pattern))
diff --git a/Sound/SC3/Graph/RD_fwalk_m.hs b/Sound/SC3/Graph/RD_fwalk_m.hs
--- a/Sound/SC3/Graph/RD_fwalk_m.hs
+++ b/Sound/SC3/Graph/RD_fwalk_m.hs
@@ -2,13 +2,13 @@
 module Sound.SC3.Graph.RD_fwalk_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  t <- dustM KR 3
+  r1 <- tIRandM 0 6 t
+  r2 <- tRandM (-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
diff --git a/Sound/SC3/Graph/RD_h_chatter_m.hs b/Sound/SC3/Graph/RD_h_chatter_m.hs
--- a/Sound/SC3/Graph/RD_h_chatter_m.hs
+++ b/Sound/SC3/Graph/RD_h_chatter_m.hs
@@ -1,28 +1,27 @@
 -- h-chatter (rd)
 module Sound.SC3.Graph.RD_h_chatter_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+      h0 = do n <- mma 5 5 =<< lfNoise0M KR 1
+              a <- mma 0.2 1.2 =<< lfNoise2M KR n
+              b <- mma 0.15 0.15 =<< lfNoise2M 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
+      h1 = do n0 <- lfNoise0M KR 32
+              n1 <- lfNoise0M 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
+                  h = linLin_b n0 1 32
+                  p = linLin_b n1 2400 3200
+                  l = linLin_b n1 (-0.75) 0.75
+                  g = linLin_b n1 0.55 0.85
                   f = 40
-                  o = blip AR (wrp (henonN AR f a b 0 0) p (p * 2)) h
+                  o = blip AR (linLin_b (henonN AR f a b 0 0) p (p * 2)) h
               return (pan2 o l g * 0.35)
   h0 .+. h1
 
diff --git a/Sound/SC3/Graph/RD_implosion_m.hs b/Sound/SC3/Graph/RD_implosion_m.hs
--- a/Sound/SC3/Graph/RD_implosion_m.hs
+++ b/Sound/SC3/Graph/RD_implosion_m.hs
@@ -1,7 +1,7 @@
 -- implosion (rd)
 module Sound.SC3.Graph.RD_implosion_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 mkls :: [(UGen,UGen)] -> UGen -> UGen
 mkls bp t =
@@ -15,17 +15,16 @@
 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)
+  n <- whiteNoiseM rt
+  return (linLin_b 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
+  n0 <- randM (-1) 0
+  n1 <- randM 0 1
+  d  <- randM 7.5 13.5
+  f0 <- randM 10990 16220
+  f1 <- randM  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
diff --git a/Sound/SC3/Graph/RD_k_ppr.hs b/Sound/SC3/Graph/RD_k_ppr.hs
--- a/Sound/SC3/Graph/RD_k_ppr.hs
+++ b/Sound/SC3/Graph/RD_k_ppr.hs
@@ -1,21 +1,19 @@
 -- k-ppr (rd)
 module Sound.SC3.Graph.RD_k_ppr where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 k_ppr :: UGen
 k_ppr =
-  let wrp i = linLin i (-1) 1
-      x = mouseX KR 0.05 0.35 Linear 0.1
+  let 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
+      tf = linLin_b 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'
+              r2 = tRand e lf (linLin_b 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
diff --git a/Sound/SC3/Graph/RD_k_ppr_m.hs b/Sound/SC3/Graph/RD_k_ppr_m.hs
--- a/Sound/SC3/Graph/RD_k_ppr_m.hs
+++ b/Sound/SC3/Graph/RD_k_ppr_m.hs
@@ -1,21 +1,20 @@
 -- k-ppr-m (rd)
 module Sound.SC3.Graph.RD_k_ppr_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  let 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
+      tf = linLin_b ti 100 200
       t = impulse AR tf 0
       stream lf rf ld rd g =
-          do r1 <- rand 9 18
+          do r1 <- randM 9 18
              let t' = pulseDivider t r1 0
-             r2 <- tRand lf (wrp ti lf rf) t'
-             r3 <- tRand ld rd t'
+             r2 <- tRandM lf (linLin_b ti lf rf) t'
+             r3 <- tRandM 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
diff --git a/Sound/SC3/Graph/RD_klink.hs b/Sound/SC3/Graph/RD_klink.hs
--- a/Sound/SC3/Graph/RD_klink.hs
+++ b/Sound/SC3/Graph/RD_klink.hs
@@ -1,7 +1,7 @@
 -- klink (rd)
 module Sound.SC3.Graph.RD_klink where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 klink :: UGen
 klink =
diff --git a/Sound/SC3/Graph/RD_lf_pulses.hs b/Sound/SC3/Graph/RD_lf_pulses.hs
--- a/Sound/SC3/Graph/RD_lf_pulses.hs
+++ b/Sound/SC3/Graph/RD_lf_pulses.hs
@@ -1,7 +1,7 @@
 -- lf pulses (rd)
 module Sound.SC3.Graph.RD_lf_pulses where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 lf_pulses :: UGen
 lf_pulses =
diff --git a/Sound/SC3/Graph/RD_lg_timed_m.hs b/Sound/SC3/Graph/RD_lg_timed_m.hs
--- a/Sound/SC3/Graph/RD_lg_timed_m.hs
+++ b/Sound/SC3/Graph/RD_lg_timed_m.hs
@@ -1,14 +1,14 @@
 -- lg-timed (rd)
 module Sound.SC3.Graph.RD_lg_timed_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+          do d0 <- dserM r p
+             d1 <- dconsM 0 d0
+             d2 <- dserM r y
              let t = tDuty AR d1 0 RemoveSynth d2 1
              return (latch t t)
       lg u = return (lag u 0.03)
diff --git a/Sound/SC3/Graph/RD_lso_061101_m.hs b/Sound/SC3/Graph/RD_lso_061101_m.hs
--- a/Sound/SC3/Graph/RD_lso_061101_m.hs
+++ b/Sound/SC3/Graph/RD_lso_061101_m.hs
@@ -2,15 +2,17 @@
 module Sound.SC3.Graph.RD_lso_061101_m where
 
 import Control.Monad {- base -}
+import System.Directory {- directory -}
+import qualified System.FilePath as P {- filepath -}
+
 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 {- 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).
 --
@@ -84,14 +86,12 @@
 -- | 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
+  b <- tIRandM 0 12 t
   let n  = bufFrames KR b
       m  = n / 4
-      i  = floorE (rng (lfSaw AR c 0) 0 m) * 4
+      i  = floorE (linLin_b (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
@@ -99,8 +99,8 @@
       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)
+      o x y = let f = linExp_b x f0 f1
+              in pan2 (blip AR f (linLin_b y 1 64)) y0 (decay tt 0.005)
   return (o x0 y0 + o x1 y1)
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_lz_bf.hs b/Sound/SC3/Graph/RD_lz_bf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_lz_bf.hs
@@ -0,0 +1,25 @@
+-- lz-bf (rd)
+module Sound.SC3.Graph.RD_lz_bf where
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+
+lz_bf_u :: UGen
+lz_bf_u =
+  let x = mouseX KR 1 12 Linear 0.1
+      l = lorenzL AR sampleRate
+                     (mulAdd (lfNoise0 'α' KR x) 2 12)
+                     (mulAdd (lfNoise0 'β' KR x) 20 38)
+                     (mulAdd (lfNoise0 'γ' KR x) 1.5 3)
+                     (mce2 0.025 0.05)
+                     0.1 0.0 0.0
+      p = phasor AR 0 (l * 24 * bufRateScale KR 0) 0 (bufFrames KR 0) 0
+  in bufRd 1 AR 0 p NoLoop CubicInterpolation
+
+lz_bf :: Transport m => String -> m ()
+lz_bf fn = do
+  _ <- async (b_allocRead 0 fn 0 0)
+  play (out 0 lz_bf_u)
+
+main :: IO ()
+main = withSC3 (lz_bf "/home/rohan/data/audio/pf-c5.aif")
diff --git a/Sound/SC3/Graph/RD_mouse_clatter_m.hs b/Sound/SC3/Graph/RD_mouse_clatter_m.hs
--- a/Sound/SC3/Graph/RD_mouse_clatter_m.hs
+++ b/Sound/SC3/Graph/RD_mouse_clatter_m.hs
@@ -1,33 +1,25 @@
 -- 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)
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
-run :: (UId m,Transport m) => m ()
-run = do
-  _ <- async (b_alloc 10 2048 1)
-  play . out 0 =<< mouse_clatter
+mouse_clatter :: UGen
+mouse_clatter =
+    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])
+        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 bpf (n3 * e) n4 n5
+        c = pv_Splita 'η' (ffta 'θ' 2048 o 0.5 0 1 0)
+        n7 = pv_RandComb 'ι' c n6 t
+    in mix (o * 0.05 + ifft n7 0 0)
 
 main :: IO ()
-main = withSC3 run
-
-{-
-s.sendMsg('b_alloc', 10, 2048, 1);
--}
+main = audition (out 0 mouse_clatter)
diff --git a/Sound/SC3/Graph/RD_nharm_m.hs b/Sound/SC3/Graph/RD_nharm_m.hs
--- a/Sound/SC3/Graph/RD_nharm_m.hs
+++ b/Sound/SC3/Graph/RD_nharm_m.hs
@@ -4,7 +4,7 @@
 import Control.Concurrent {- base -}
 import Control.Monad
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad as U {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
 
 nharm :: (Num b, Integral a) => a -> b -> [b]
@@ -13,10 +13,10 @@
 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
+    d <- iRandM 9 12
+    f <- iRandM m (m + 2)
+    l <- sequence (replicate n (randM 0.01 0.02))
+    p <- randM (-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)
diff --git a/Sound/SC3/Graph/RD_nharm_p.hs b/Sound/SC3/Graph/RD_nharm_p.hs
--- a/Sound/SC3/Graph/RD_nharm_p.hs
+++ b/Sound/SC3/Graph/RD_nharm_p.hs
@@ -1,9 +1,9 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 nharm :: Num n => Int -> n -> [n]
 nharm n f = map ((* f) . fromIntegral) [1..n]
@@ -20,19 +20,17 @@
         s = klangSpec nh l (replicate n 0.0)
     in out 0 (pan2 (klang AR 1 0 s) p e)
 
-type Range = (Field,Field)
+type Range = (Double,Double)
 
-{- 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.  -}
+{- Note that the dur key is used only to schedule the nodes, the UGen
+graph manages duration internally.-}
 
-pN :: Int -> Range -> Range -> P Event
+pN :: Int -> Range -> Range -> (Synthdef,P.Param)
 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)]
+    in (s,[("freq",map midiCPS (P.white 'α' m0 m1))
+          ,("dur",P.white 'β' d0 d1)])
 
 main :: IO ()
-main = audition (pmerge (pN 24 (90,92) (0.25,0.75))
-                        (pN 54 (12,14) (1.25,1.76)))
+main = audition (P.sbind [(pN 24 (90,92) (0.25,0.75))
+                         ,(pN 54 (12,14) (1.25,1.76))])
diff --git a/Sound/SC3/Graph/RD_oscillator_cluster_m.hs b/Sound/SC3/Graph/RD_oscillator_cluster_m.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_oscillator_cluster_m.hs
@@ -0,0 +1,36 @@
+-- oscillator cluster (rd)
+module Sound.SC3.Graph.RD_oscillator_cluster_m where
+
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- 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) (randM 0 r)
+      prt d a cf = do r1 <- randM cf (cf + 2)
+                      r2 <- rln 1 5 0.01 d
+                      r3 <- rln 10 20 0 d
+                      r4 <- randM 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 (randM 220 660))
+  d <- randM 4 7
+  a <- randM 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 = [("dur",P.rand 'α' [0.25,0.5,1,3,5])]
+  audition (P.sbind1 (s,p))
+
+{-
+audition . (out 0) =<< oscillator_cluster
+let otu = Sound.SC3.Lang.Control.OverlapTexture.overlapTextureU
+otu (3,1,5,maxBound) =<< oscillator_cluster
+-}
diff --git a/Sound/SC3/Graph/RD_pattern_buffer_m.hs b/Sound/SC3/Graph/RD_pattern_buffer_m.hs
--- a/Sound/SC3/Graph/RD_pattern_buffer_m.hs
+++ b/Sound/SC3/Graph/RD_pattern_buffer_m.hs
@@ -2,7 +2,7 @@
 module Sound.SC3.Graph.RD_pattern_buffer_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
 
 tseq :: [UGen] -> UGen
@@ -17,7 +17,7 @@
   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
+  n1 <- tRandM 0.02 0.08 t
   let e = decay2 t 0.01 n1
       f = midiCPS (tseq r1)
       l = tseq r2
diff --git a/Sound/SC3/Graph/RD_rzblp.hs b/Sound/SC3/Graph/RD_rzblp.hs
--- a/Sound/SC3/Graph/RD_rzblp.hs
+++ b/Sound/SC3/Graph/RD_rzblp.hs
@@ -1,16 +1,17 @@
 -- rzblp (rd)
 module Sound.SC3.Graph.RD_rzblp where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
-lfn :: ID a => a -> UGen -> UGen -> UGen -> UGen
+lfn :: ID a => a -> UGen -> Double -> Double -> UGen
 lfn z f l r =
     let z' = z `joinID` l `joinID` r
-    in range l r (lfNoise0 z' KR f)
+    in range (constant l) (constant r) (lfNoise0 z' KR f)
 
-hpb :: (ID a) => a -> UGen -> UGen
+hpb :: ID a => a -> UGen -> UGen
 hpb z q =
-    let g i = let z' = idHash z + i
+    let g :: Int -> UGen
+        g i = let z' = z `joinID` i
                   f = lfn z' q 1330 1395
                   a = lfn z' q 0.001 0.007
               in blip AR f 24 * a
diff --git a/Sound/SC3/Graph/RD_rzblp_hp.hs b/Sound/SC3/Graph/RD_rzblp_hp.hs
--- a/Sound/SC3/Graph/RD_rzblp_hp.hs
+++ b/Sound/SC3/Graph/RD_rzblp_hp.hs
@@ -2,10 +2,11 @@
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 module Sound.SC3.Graph.RD_rzblp_hp where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
 lfn :: UId m => UGen -> UGen -> UGen -> m UGen
-lfn f l r = fmap (range l r) (lfNoise0 KR f)
+lfn f l r = fmap (range l r) (lfNoise0M KR f)
 
 hpb :: UId m => UGen -> m UGen
 hpb q =
@@ -26,7 +27,7 @@
   return (sum [s1,s2,s3,s4])
 
 rzblp :: UId m => m UGen
-rzblp = mk_f drand .+. mk_f dxrand
+rzblp = mk_f drandM .+. mk_f dxrandM
 
 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
--- a/Sound/SC3/Graph/RD_rzblp_m.hs
+++ b/Sound/SC3/Graph/RD_rzblp_m.hs
@@ -1,10 +1,11 @@
 -- rzblp-m (rd)
 module Sound.SC3.Graph.RD_rzblp_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
 lfn :: UId m => UGen -> UGen -> UGen -> m UGen
-lfn f l r = fmap (range l r) (lfNoise0 KR f)
+lfn f l r = fmap (range l r) (lfNoise0M KR f)
 
 hpb :: UId m => UGen -> m UGen
 hpb q =
@@ -29,7 +30,7 @@
   return (sum [s1,s2,s3,s4])
 
 rzblp :: UId m => m UGen
-rzblp = mk_f drand .+. mk_f dxrand
+rzblp = mk_f drandM .+. mk_f dxrandM
 
 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
--- a/Sound/SC3/Graph/RD_rzblp_u.hs
+++ b/Sound/SC3/Graph/RD_rzblp_u.hs
@@ -2,10 +2,10 @@
 module Sound.SC3.Graph.RD_rzblp_u where
 
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+import qualified Sound.SC3.UGen.Unsafe as U {- hsc3-unsafe -}
 
 lfn :: UGen -> UGen -> UGen -> UGen
-lfn f l r = range l r (lfNoise0 KR f)
+lfn f l r = range l r (U.lfNoise0 KR f)
 
 hpb :: UGen -> UGen
 hpb q =
@@ -30,7 +30,7 @@
            ,blip AR (lfn q 16 36) 3 * mce2 0.03 0.09]
 
 rzblp :: UGen
-rzblp = mk_f drand + mk_f dxrand
+rzblp = mk_f U.drand + mk_f U.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
--- a/Sound/SC3/Graph/RD_s_chirp.hs
+++ b/Sound/SC3/Graph/RD_s_chirp.hs
@@ -2,7 +2,7 @@
 module Sound.SC3.Graph.RD_s_chirp where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 s_chirp :: UGen
 s_chirp =
diff --git a/Sound/SC3/Graph/RD_scritto.hs b/Sound/SC3/Graph/RD_scritto.hs
--- a/Sound/SC3/Graph/RD_scritto.hs
+++ b/Sound/SC3/Graph/RD_scritto.hs
@@ -3,7 +3,7 @@
 
 import Control.Monad
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Data.Vowel as V {- hsc3-lang -}
 
 scritto_i :: UGen -> UGen
@@ -12,7 +12,7 @@
         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
+            let bi = linLin_b n0 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) =
diff --git a/Sound/SC3/Graph/RD_scritto_m.hs b/Sound/SC3/Graph/RD_scritto_m.hs
--- a/Sound/SC3/Graph/RD_scritto_m.hs
+++ b/Sound/SC3/Graph/RD_scritto_m.hs
@@ -1,7 +1,7 @@
 -- scritto (rd)
 module Sound.SC3.Graph.RD_scritto_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Data.Vowel as V {- hsc3-lang -}
 
 main :: IO ()
@@ -13,15 +13,15 @@
       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
+        n <- lfNoise2M 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
+            i d = do n1 <- tRandM 0.02 0.06 t
+                     n2 <- tIRandM 30 52 t
+                     n3 <- tIRandM 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
+            bi = linLin_b n 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..])
diff --git a/Sound/SC3/Graph/RD_seqr.hs b/Sound/SC3/Graph/RD_seqr.hs
--- a/Sound/SC3/Graph/RD_seqr.hs
+++ b/Sound/SC3/Graph/RD_seqr.hs
@@ -1,8 +1,8 @@
 -- seqr (rd)
 module Sound.SC3.Graph.RD_seqr where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 nrand :: ID z => Int -> z -> UGen -> UGen -> [UGen]
 nrand n e l = mceChannels . randN n e l
diff --git a/Sound/SC3/Graph/RD_seqr_n.hs b/Sound/SC3/Graph/RD_seqr_n.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_seqr_n.hs
@@ -0,0 +1,25 @@
+-- seqr-n (rd)
+module Sound.SC3.Graph.RD_seqr_n where
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+
+seqr_f :: UGen -> UGen -> UGen
+seqr_f f e =
+    let n = constant (mceDegree e) / 2
+    in select (mulAdd (lfSaw KR f 0) n n) e
+
+seqr_n :: Int -> UGen
+seqr_n n =
+  let f = iRand 'α' 9 18 / constant n
+      o1 = let f1 = seqr_f f (midiCPS (iRandN n 'β' 72 96))
+               f2 = seqr_f f (midiCPS (iRandN n 'γ' 72 84))
+               h1 = seqr_f f (randN n 'δ' 1 3)
+               h2 = seqr_f f (randN n 'ε' 3 6)
+           in blip AR (mce2 f1 f2) (mce2 h1 h2)
+      o2 = mce2 (seqr_f f (randN n 'ζ' 0.05 0.10)) (seqr_f f (randN n 'η' 0.05 0.15))
+  in o1 * o2
+
+main :: IO ()
+main = overlapTextureU (6,6,3,maxBound) (seqr_n 13)
diff --git a/Sound/SC3/Graph/RD_shifting_pulses_m.hs b/Sound/SC3/Graph/RD_shifting_pulses_m.hs
--- a/Sound/SC3/Graph/RD_shifting_pulses_m.hs
+++ b/Sound/SC3/Graph/RD_shifting_pulses_m.hs
@@ -1,17 +1,14 @@
 -- 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
+import Sound.SC3 {- hsc3 -}
 
 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
+  r0 <- randM 0.2 0.9
+  r1 <- randM 0.95 1.05
+  r2 <- clone 2 (randM 0.95 1.05)
+  let f' = f * linLin_b (sinOsc KR r0 0) 1 1.01 * r1
       a' = a * r2
       o = sinOsc AR (mce2 f f') 0
   return (o * a')
@@ -24,21 +21,21 @@
 -- 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)
+  n <- (lfNoise2M KR 2)
+  return (formant AR (mce2 20 21) (linLin_b 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
+  n0 <- clone 2 (brownNoiseM KR)
+  n1 <- clone 2 (brownNoiseM KR)
+  n2 <- clone 2 (brownNoiseM KR)
+  t <- dustM 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
+      f = warp n1 90 300
+      rq = warp n2 2 9
   return (mrg2 (l * rlpf p f rq) (sendTrig t 0 t))
 
 shifting_pulses :: UId m => m UGen
diff --git a/Sound/SC3/Graph/RD_sosc_lp_m.hs b/Sound/SC3/Graph/RD_sosc_lp_m.hs
--- a/Sound/SC3/Graph/RD_sosc_lp_m.hs
+++ b/Sound/SC3/Graph/RD_sosc_lp_m.hs
@@ -2,13 +2,13 @@
 module Sound.SC3.Graph.RD_sosc_lp_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+dustR' :: UId m => Rate -> UGen -> UGen -> m UGen
+dustR' r lo hi = do
+  n1 <- dwhiteM 1 lo hi
+  n2 <- whiteNoiseM r
+  d <- dseqM dinf n1
   return (tDuty r d 0 DoNothing (abs n2) 1)
 
 setup :: Transport m => m ()
@@ -20,6 +20,9 @@
   send (b_setn1 10 0 a)
   send (b_setn1 11 0 b)
 
+--b0 = asLocalBuf 'α' [60, 71, 89, 65, 36, 57, 92, 97, 92, 97]
+--b1 = asLocalBuf 'β' [71, 89, 60, 57, 65, 36, 95, 92, 93, 97]
+
 sosc_lp :: UGen -> UGen -> UGen
 sosc_lp t n =
     let d_env = decay2 t 0.002 2.5
@@ -34,8 +37,8 @@
 
 sosc_lp_m :: UId m => m UGen
 sosc_lp_m = do
-  clk <- dustR KR 0.2 0.9
-  n <- lfNoise0 KR (mce2 1 3)
+  clk <- dustR' KR 0.2 0.9
+  n <- lfNoise0M KR (mce2 1 3)
   return (sosc_lp clk n)
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_tgb_m.hs b/Sound/SC3/Graph/RD_tgb_m.hs
--- a/Sound/SC3/Graph/RD_tgb_m.hs
+++ b/Sound/SC3/Graph/RD_tgb_m.hs
@@ -2,19 +2,18 @@
 module Sound.SC3.Graph.RD_tgb_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+                      in tRandM le re t
       pm_n rt l du = do let le = mkls l du
                             re = mkls l du
-                        n <- whiteNoise rt
-                        return (wrp n le re)
+                        n <- whiteNoiseM rt
+                        return (linLin_b 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
diff --git a/Sound/SC3/Graph/RD_tgr_rpr_m.hs b/Sound/SC3/Graph/RD_tgr_rpr_m.hs
--- a/Sound/SC3/Graph/RD_tgr_rpr_m.hs
+++ b/Sound/SC3/Graph/RD_tgr_rpr_m.hs
@@ -2,22 +2,22 @@
 module Sound.SC3.Graph.RD_tgr_rpr_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+dustR' :: UId m => Rate -> UGen -> UGen -> m UGen
+dustR' r lo hi = do
+  n1 <- dwhiteM 1 lo hi
+  n2 <- whiteNoiseM r
+  d <- dseqM 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))
+rpr n = tRandM (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)
+  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)
diff --git a/Sound/SC3/Graph/RD_tgrn.hs b/Sound/SC3/Graph/RD_tgrn.hs
--- a/Sound/SC3/Graph/RD_tgrn.hs
+++ b/Sound/SC3/Graph/RD_tgrn.hs
@@ -2,7 +2,7 @@
 module Sound.SC3.Graph.RD_tgrn where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 -- > Sound.SC3.UGen.Dot.draw (tgrn 10)
 tgrn :: UGen -> UGen
diff --git a/Sound/SC3/Graph/RD_thb.hs b/Sound/SC3/Graph/RD_thb.hs
--- a/Sound/SC3/Graph/RD_thb.hs
+++ b/Sound/SC3/Graph/RD_thb.hs
@@ -1,14 +1,18 @@
 -- thb (rd)
+{-# OPTIONS_GHC -F -pgmF hsc3-psynth #-}
 module Sound.SC3.Graph.RD_thb where
 
-import Data.List
+import Data.List {- base -}
+
 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.SC3.Common.Monad.Syntax {- hsc3 -}
 import Sound.OSC {- hosc -}
 
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
+
 -- | Happy birthday
 --
 -- > nub hb == "hapy birtd"
@@ -46,19 +50,18 @@
 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)])
+  let fr = map P.octpc_to_cps (zip (concat hb_o .+ 1) (concat hb_k))
+  play (P.sbind1 (defaultSynthdef
+                 ,[("freq",fr)
+                  ,("dur",concat 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 :: Num 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]])
+    let f = fromInteger . floor . P.degreeToKey [0,2,4,5,7,9,11] 12 . pred
+    in map (map f) hb_d
 
 -- | Midi note numbers
 --
@@ -158,15 +161,11 @@
 --
 -- > 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
+ins_s = psynth {bus = 0,freq = 440,loc = 0,amp = 0.1,sustain = 0.1} where
+    let s = envSine sustain amp
         e = envGen AR 1 1 0 1 RemoveSynth s
-        i = impulse AR f 0
-    in synthdef "ins" (out 0 (pan2 i l e))
+        i = impulse AR freq 0
+    in out bus (pan2 i loc e)
 
 -- | 'audition' 'ph' using pattern library.  /blur/ is @legato@.
 --
@@ -175,13 +174,12 @@
 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)])
+        pr = [("freq",f)
+             ,("dur",d)
+             ,("sustain",d .* blur)
+             ,("amp",c .* 0.1 .+ 0.1)
+             ,("loc",c .* 2 .- 1)]
+    in play (P.sbind1 (ins_s,pr))
 
 main :: IO ()
 main = withSC3 (hear 9 ph)
diff --git a/Sound/SC3/Graph/RD_three_cpsw.hs b/Sound/SC3/Graph/RD_three_cpsw.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/RD_three_cpsw.hs
@@ -0,0 +1,19 @@
+-- three-cpsw (rd)
+module Sound.SC3.Graph.RD_three_cpsw where
+
+import Sound.SC3 {- hsc3 -}
+
+three_cpsw :: UGen
+three_cpsw =
+    let 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
+        f = f1 * mce2 9000 12000 + 9500
+        o = saw AR f + saw AR (f * dh) + saw AR (f * dt)
+    in clip2 (o * a) 0.75
+
+main :: IO ()
+main = audition (out 0 three_cpsw)
diff --git a/Sound/SC3/Graph/RD_three_cpsw_m.hs b/Sound/SC3/Graph/RD_three_cpsw_m.hs
--- a/Sound/SC3/Graph/RD_three_cpsw_m.hs
+++ b/Sound/SC3/Graph/RD_three_cpsw_m.hs
@@ -1,16 +1,16 @@
 -- three-cpsw (rd)
 module Sound.SC3.Graph.RD_three_cpsw_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  t <- dustM KR (mce2 12 18)
+  f0 <- tRandM 1 64 t
+  f1 <- lfNoise0M KR f0
+  a <- tRandM 0.0 0.5 t
+  dt <- tRandM 0.975 1.025 t
+  dh <- tRandM 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)
diff --git a/Sound/SC3/Graph/RD_tipnso.hs b/Sound/SC3/Graph/RD_tipnso.hs
--- a/Sound/SC3/Graph/RD_tipnso.hs
+++ b/Sound/SC3/Graph/RD_tipnso.hs
@@ -1,7 +1,7 @@
 -- tipnso (rd)
 module Sound.SC3.Graph.RD_tipnso where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 tipnso :: UGen
 tipnso =
diff --git a/Sound/SC3/Graph/RD_tr_out_m.hs b/Sound/SC3/Graph/RD_tr_out_m.hs
--- a/Sound/SC3/Graph/RD_tr_out_m.hs
+++ b/Sound/SC3/Graph/RD_tr_out_m.hs
@@ -2,14 +2,14 @@
 module Sound.SC3.Graph.RD_tr_out_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  t <- dustM KR 1.6
+  r1 <- tRandM 0 6 t
+  r2 <- tRandM 0 6 t
+  r3 <- tRandM 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
diff --git a/Sound/SC3/Graph/RD_trkl_m.hs b/Sound/SC3/Graph/RD_trkl_m.hs
--- a/Sound/SC3/Graph/RD_trkl_m.hs
+++ b/Sound/SC3/Graph/RD_trkl_m.hs
@@ -2,18 +2,18 @@
 module Sound.SC3.Graph.RD_trkl_m where
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  r0 <- randM (-1) 1
+  r1 <- randM (-1) 1
+  r2 <- tRandM 0.05 1.0 t
+  r3 <- tExpRandM 0.001 0.25 st -- non-zero minima
+  fh <- tRandM 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
@@ -24,12 +24,12 @@
 -- > 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
+  d <- randM 0.5 16
+  ul <- randM 16 64
+  fu <- randM 1200 9000
+  dy <- randM 0.005 0.175
+  la <- randM (-60) (-25)
+  fy <- randM 0.015 0.125
   trkl d ul fu dy la fy
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_trmlo.hs b/Sound/SC3/Graph/RD_trmlo.hs
--- a/Sound/SC3/Graph/RD_trmlo.hs
+++ b/Sound/SC3/Graph/RD_trmlo.hs
@@ -1,13 +1,13 @@
 -- trmlo (rd)
 module Sound.SC3.Graph.RD_trmlo where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 -- > audition (out 0 trmlo)
 trmlo :: UGen
 trmlo =
-    let mWrp i l r = linLin i (-1) 1 (midiCPS l) (midiCPS r)
+    let mWrp i l r = linLin_b i (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
@@ -31,7 +31,7 @@
                  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
+             in pan2 (blip AR (mWrp1 m (n + l)) (linLin_b m 1 2)) m e
         o4 = let f = iRand 'κ' 5 18
                  d = iRand 'λ' 12 15
                  s = envSine d (rand 'μ' 0.1 0.2)
@@ -40,13 +40,11 @@
                  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 pan2 (blip AR fr (linLin_b m 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
+      p = [("dur",P.xrand 'ρ' [0.25,0.5,1,2,4])]
+  audition (P.sbind1 (s,p))
diff --git a/Sound/SC3/Graph/RD_trmlo_u.hs b/Sound/SC3/Graph/RD_trmlo_u.hs
--- a/Sound/SC3/Graph/RD_trmlo_u.hs
+++ b/Sound/SC3/Graph/RD_trmlo_u.hs
@@ -2,13 +2,13 @@
 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 -}
+import qualified Sound.SC3.UGen.Unsafe as U {- hsc3-unsafe -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 -- > audition (out 0 trmlo)
 trmlo :: UGen
 trmlo =
-    let mWrp i l r = linLin i (-1) 1 (midiCPS l) (midiCPS r)
+    let mWrp i l r = linLin_b i (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
@@ -18,36 +18,34 @@
                  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 = U.iRand 5 9
+                 d = U.iRand 5 9
+                 s = envSine d (U.rand 0.1 0.2)
                  e = envGen KR 1 1 0 1 DoNothing s
-                 n = iRand 69 72
+                 n = U.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 = U.iRand 5 9
+                 d = U.iRand 9 12
+                 s = envSine d (U.rand 0.1 0.2)
                  e = envGen KR 1 1 0 1 DoNothing s
-                 n = iRand 69 72
+                 n = U.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)
+                 l = line KR 0 (U.iRand 1 5) d DoNothing
+             in pan2 (blip AR (mWrp1 m (n + l)) (linLin_b m 1 2)) m e
+        o4 = let f = U.iRand 5 18
+                 d = U.iRand 12 15
+                 s = envSine d (U.rand 0.1 0.2)
                  e = envGen KR 1 5e-2 0 1 DoNothing s
-                 n = iRand 69 72
+                 n = U.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 (U.iRand 1 5) d RemoveSynth
+                 fr = mWrpN m (n + l) (U.iRand 1 5)
+             in pan2 (blip AR fr (linLin_b m 1 (U.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
+      p = [("dur",P.xrand 'ρ' [0.25,0.5,1,2,4])]
+  audition (P.sbind1 (s,p))
diff --git a/Sound/SC3/Graph/RD_urandom.hs b/Sound/SC3/Graph/RD_urandom.hs
--- a/Sound/SC3/Graph/RD_urandom.hs
+++ b/Sound/SC3/Graph/RD_urandom.hs
@@ -3,7 +3,8 @@
 
 import Control.Monad {- base -}
 import qualified Data.ByteString.Lazy as B {- bytestring -}
-import Sound.OSC.Coding.Byte {- hosc -}
+import Data.Int {- base -}
+import Data.Binary {- binary -}
 import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 import System.IO {- base -}
@@ -11,35 +12,33 @@
 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_int32 :: IO Int32
+ur_int32 = fmap decode (ur_bytes 4)
 
 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
+-- > ur_int32_set 3
+ur_int32_set :: Int -> IO [Int32]
+ur_int32_set = fmap (map decode) . 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)
+-- > fmap (map int32_to_normal) (ur_int32_set 3)
+int32_to_normal :: Fractional n => Int32 -> n
+int32_to_normal n = fromIntegral (abs n) / fromIntegral (maxBound::Int32)
 
+-- > ur_real_set 3
 ur_real_set :: Fractional n => Int -> IO [n]
-ur_real_set = fmap (map int_to_normal) . ur_int_set
+ur_real_set = fmap (map int32_to_normal) . ur_int32_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
+  let f' = linLin_u f 440 660
+      g' = linLin_u g 0.05 0.25
+      l' = linLin_u l (-1) 1
   return (pan2 (sinOsc AR f' 0) l' g')
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_vla_addtn.hs b/Sound/SC3/Graph/RD_vla_addtn.hs
--- a/Sound/SC3/Graph/RD_vla_addtn.hs
+++ b/Sound/SC3/Graph/RD_vla_addtn.hs
@@ -1,14 +1,51 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
-type R = Double
-type R2 = (R,R)
+-- fr = freq,dt = detune
+vla_partial :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+vla_partial b fr rise fall dt n =
+    let m = n * 2
+        ampl = dbAmp (bufRdN 1 KR b m NoLoop)
+        ph = bufRdN 1 KR b (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 :: [R2]
+vla_plyr :: UGen -> UGen -> UGen
+vla_plyr b n =
+    let fr = midiCPS (rand 'α' 10 30)
+        rise = rand 'β' 1 2
+        fall = rand 'γ' 4 7
+        dt = rand 'δ' 0.001 0.005
+        a = rand 'ε' 0.05 0.1
+        l = rand 'ζ' (-1) 1
+        s = sum (map (vla_partial b fr rise fall dt) [0 .. n - 1])
+        e = detectSilence s 0.001 0.2 RemoveSynth
+    in mrg2 (pan2 s l a) e
+
+plyr36 :: UGen
+plyr36 =
+    let unp (i,j) = [i,j]
+        b = asLocalBuf 'α' (concatMap (map double_to_ugen . unp) vla)
+    in vla_plyr b 36
+
+main :: IO ()
+main = spawnTextureU (const 3,maxBound) plyr36
+
+-- q = quantised
+vla_q :: (RealFrac n,Fractional n) => [(n,n)]
+vla_q = let f (a,p) = (roundTo_ a 0.1,roundTo_ p 0.1) in map f vla
+
+-- ampl (DB) and phase data
+vla :: Fractional n => [(n,n)]
 vla =
     [(-49.43290,1.99165)
     ,(0.00000,1.09187)
@@ -86,63 +123,3 @@
     ,(-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
--- a/Sound/SC3/Graph/RD_vla_addtn_sharc.hs
+++ b/Sound/SC3/Graph/RD_vla_addtn_sharc.hs
@@ -1,11 +1,13 @@
 -- vla-adttn-sharc (rd)
+{-# OPTIONS_GHC -F -pgmF hsc3-uparam #-}
+-- http://www.timbre.ws/sharc/
 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 -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 type R = Double
 type R3 = (R,R,R)
@@ -43,37 +45,31 @@
 
 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])
+    let uparam = {amp = 0.1,freq = 129.897,rise = 0.1,fall = 0.5,loc = 0,dt = 0.001}
+        s = sum (map (vla_partial freq rise fall dt) [0 .. n - 1])
         e = detectSilence s 0.001 0.2 RemoveSynth
-    in mrg2 (pan2 s l a) e
+    in mrg2 (pan2 s loc amp) e
 
 plyr36 :: Synthdef
 plyr36 = synthdef "plyr36" (out 0 (vla_plyr 36))
 
-pattern :: [P_Bind]
+pattern :: P.Param
 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)]
+    let to_cps = P.degree_to_cps' [0,2,4,5,7,9,11] 12
+    in [("loc",P.white 'α' (-1) 1)
+       ,("amp",P.white 'β' 0.05 0.1)
+       ,("freq",to_cps (P.rand 'γ' [0,1,2,3,4,5,6,7,8]) (P.rand 'δ' [1,2]))
+       ,("dt",P.white 'ε' 0.001 0.005)
+       ,("rise",P.white 'ζ' 1 2)
+       ,("fall",P.white 'η' 4 7)
+       ,("dur",repeat 5)]
 
 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)
+  play (P.sbind1 (plyr36,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
--- a/Sound/SC3/Graph/RD_vlc_distrtn_m.hs
+++ b/Sound/SC3/Graph/RD_vlc_distrtn_m.hs
@@ -1,9 +1,10 @@
 -- vlc-distrtn (rd)
+{-# OPTIONS_GHC -F -pgmF hsc3-uparam #-}
 -- caution - audio feedback graph
 module Sound.SC3.Graph.RD_vlc_distrtn_m where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Random.IO as L {- hsc3-lang -}
 
 prep :: (Double,Double) -> [Double]
@@ -11,8 +12,8 @@
 
 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
+  n0 <- lfNoise1M KR 1
+  n1 <- randM 0.75 1.25
   let m = n * 2
       ampl = bufRdN 1 KR b m NoLoop
       f = freq * (n + 1) * (n0 * detune + 1)
@@ -20,14 +21,7 @@
 
 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
+  let uparam = {buf=0,iamp=0.1,ampl=0.1,freq=129.897,fall=0.5,loc=0.0,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))
 
@@ -64,7 +58,7 @@
 run = do
   _ <- async (b_alloc 0 (length vlc * 2) 1)
   send (b_setn1 0 0 (concatMap prep vlc))
-  let i = soundIn 4
+  let i = soundIn 0
   _ <- async . d_recv . synthdef "plyr48" =<< plyr i 48
   send (s_new "plyr48" 1002 AddToTail 1 [])
   sequence_ (replicate 32 pattern)
diff --git a/Sound/SC3/Graph/RD_voscil.hs b/Sound/SC3/Graph/RD_voscil.hs
--- a/Sound/SC3/Graph/RD_voscil.hs
+++ b/Sound/SC3/Graph/RD_voscil.hs
@@ -2,7 +2,7 @@
 module Sound.SC3.Graph.RD_voscil where
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
 
 -- > Sound.SC3.UGen.Dot.draw (voscil 32)
diff --git a/Sound/SC3/Graph/RD_voscil_u.hs b/Sound/SC3/Graph/RD_voscil_u.hs
--- a/Sound/SC3/Graph/RD_voscil_u.hs
+++ b/Sound/SC3/Graph/RD_voscil_u.hs
@@ -4,12 +4,12 @@
 import Sound.OSC {- hosc -}
 import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
-import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+import qualified Sound.SC3.UGen.Unsafe as U {- hsc3-unsafe -}
 
 -- > Sound.SC3.UGen.Dot.draw (voscil 32)
 voscil :: Real a => a -> UGen
 voscil b =
-  let lfn = lfNoise0 KR
+  let lfn = U.lfNoise0 KR
       hb = (constant b - 1) / 2
       rt = 6
       f = 600
diff --git a/Sound/SC3/Graph/RD_waveset.hs b/Sound/SC3/Graph/RD_waveset.hs
deleted file mode 100644
--- a/Sound/SC3/Graph/RD_waveset.hs
+++ /dev/null
@@ -1,155 +0,0 @@
--- 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
--- a/Sound/SC3/Graph/RD_wial_m.hs
+++ b/Sound/SC3/Graph/RD_wial_m.hs
@@ -1,14 +1,14 @@
 -- wial (rd)
 module Sound.SC3.Graph.RD_wial_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+                     n0 <- tIRandM 0 1 t
                      return (o * e * n0 * 0.5)
       smpl f = [(4,6,f,0.75)
                ,(2,6,f * 2,0.75)
@@ -19,8 +19,8 @@
                ,(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
+  n0 <- dustM KR 2
+  f <- tWChooseM n0 (mce2 (20 * 0.66) 20) (mce2 0.25 0.75) 0
   fmap sum (mapM (plss clk) (smpl f))
 
 main :: IO ()
diff --git a/Sound/SC3/Graph/RD_xy_interference.hs b/Sound/SC3/Graph/RD_xy_interference.hs
--- a/Sound/SC3/Graph/RD_xy_interference.hs
+++ b/Sound/SC3/Graph/RD_xy_interference.hs
@@ -1,8 +1,7 @@
 -- xy-interference (rd)
 module Sound.SC3.Graph.RD_xy_interference where
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 xy_interference :: UGen
 xy_interference =
@@ -12,7 +11,7 @@
                a = sinOsc AR (x + n) 0
                b = sinOsc AR y 0
            in a * b
-  in mix (uclone 'β' 3 nd)
+  in mix (uclone 'β' 3 nd) * 0.1
 
 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
--- a/Sound/SC3/Graph/RD_xy_interference_m.hs
+++ b/Sound/SC3/Graph/RD_xy_interference_m.hs
@@ -1,13 +1,13 @@
 -- xy-interference-m (rd)
 module Sound.SC3.Graph.RD_xy_interference_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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)
+      nd = do n <- lfNoise0M KR (mce2 5 9)
               let a = sinOsc AR (x + n) 0
                   b = sinOsc AR y 0
               return (a * b)
diff --git a/Sound/SC3/Graph/SC_bottle_m.hs b/Sound/SC3/Graph/SC_bottle_m.hs
--- a/Sound/SC3/Graph/SC_bottle_m.hs
+++ b/Sound/SC3/Graph/SC_bottle_m.hs
@@ -2,19 +2,19 @@
 module Sound.SC3.Graph.SC_bottle_m where
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 bottle :: UId m => m UGen
 bottle = do
-  freq <- rand 220 880
-  wn <- whiteNoise AR
-  pn <- pinkNoise AR
+  freq <- randM 220 880
+  wn <- whiteNoiseM AR
+  pn <- pinkNoiseM 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)
+      rapf i = do x <- linRandM 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
diff --git a/Sound/SC3/Graph/SP_insects_m.hs b/Sound/SC3/Graph/SP_insects_m.hs
--- a/Sound/SC3/Graph/SP_insects_m.hs
+++ b/Sound/SC3/Graph/SP_insects_m.hs
@@ -1,16 +1,16 @@
 -- insects (sp)
 module Sound.SC3.Graph.SP_insects_m where
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  r1 <- randM 2000 3000
+  r2 <- randM 0.05 0.1
+  n1 <- lfNoise2M KR (r2 * 50 + 50)
+  r4 <- randM 1 10
+  r5 <- randM 0.05 0.1
+  n2 <- lfNoise2M 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)
diff --git a/Sound/SC3/Graph/TB_1_4Tw.hs b/Sound/SC3/Graph/TB_1_4Tw.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/Graph/TB_1_4Tw.hs
@@ -0,0 +1,15 @@
+-- http://sccode.org/1-4Tw (tb)
+module Sound.SC3.Graph.TB_1_4Tw where
+
+import Sound.SC3 {- hsc3 -}
+
+one_4tw :: UGen
+one_4tw =
+    let im = mix (impulse AR (mce3 1 (1/3) (1/5)) (mce3 0 0.133 0.5))
+        f i = tDuty AR (max 0.25 (timer i)) 0 DoNothing 1 0
+        g n i = sinOsc AR ((4000 + (i * 500))) 0 * decay2 n 0.01 0.2
+        nd = zipWith g (iterate f im) [0..9]
+    in splay (mce nd) 1 1 0 True
+
+main :: IO ()
+main = audition (out 0 one_4tw)
diff --git a/Sound/SC3/Graph/TM_drummer.hs b/Sound/SC3/Graph/TM_drummer.hs
--- a/Sound/SC3/Graph/TM_drummer.hs
+++ b/Sound/SC3/Graph/TM_drummer.hs
@@ -1,7 +1,7 @@
 -- drummer (tm)
 module Sound.SC3.Graph.TM_drummer where
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 drummer :: UGen
 drummer =
diff --git a/gr/1-1Ni.hs b/gr/1-1Ni.hs
--- a/gr/1-1Ni.hs
+++ b/gr/1-1Ni.hs
@@ -1,9 +1,9 @@
 -- http://sccode.org/1-1Ni
 
 import Control.Concurrent {- base -}
-import Control.Monad
+import Control.Monad {- base -}
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 scr :: (UGen -> (UGen,UGen)) -> Int -> UGen -> UGen -> UGen
 scr h n f d =
@@ -11,7 +11,7 @@
         o z = sinOsc AR (expRand z h0 h1) 0 * 0.2
         m = mce (map o (take n ['α'..]))
         e = lfGauss AR d (1/4) 0 NoLoop RemoveSynth
-    in splay (m * e) 1 0.1 0 True
+    in splay (m * e) 1 0.25 0 True
 
 -- > audition (b 12)
 -- > Sound.SC3.UGen.Dot.draw (b 8)
diff --git a/gr/1-1Ni.scd b/gr/1-1Ni.scd
new file mode 100644
--- /dev/null
+++ b/gr/1-1Ni.scd
@@ -0,0 +1,34 @@
+// http://sccode.org/1-1Ni
+
+{
+var f = {
+    var h = [40,45,52].choose.midicps;
+    var o = {SinOsc.ar(exprand(h,h + (h / 64)),0,0.2)};
+    {Splay.ar(o ! 16) * LFGauss.ar(9,1/4,0,0,2)}.play;
+    4.wait;
+};
+var g = {
+    var h = x.choose.midicps;
+    var o = {SinOsc.ar(exprand(h - (h / 128),h + (h / 128)),0,0.1)};
+    {Splay.ar(o ! 16) * LFGauss.ar(6,1/4,0,0,2)}.play;
+    0.5.wait;
+};
+var ch = [[72,69,64], [70,64,62], [67,60,70], [65,60,69], [64,60,67], [65,60,69]];
+var x = ch[0];
+var b = {f.loop}.fork;
+var c = {g.loop}.fork;
+var main = {
+    5.do({
+        ch.do({
+            arg i;
+            x = i;
+            x.postln;
+            10.wait;
+        });
+    });
+    10.wait;
+    c.stop;
+    4.wait;
+    b.stop;
+};
+main.fork}.();
diff --git a/gr/1-4Q6.hs b/gr/1-4Q6.hs
--- a/gr/1-4Q6.hs
+++ b/gr/1-4Q6.hs
@@ -1,15 +1,15 @@
 -- http://sccode.org/1-4Q6 (f0)
 
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- 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)]
+-- > let set p = withSC3 (send (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
@@ -30,16 +30,19 @@
         src = mixFill 11 fn
     in synthdef "risset" (out 0 (pan2 src pan 1))
 
-pattern :: [P_Bind]
+pattern :: (Synthdef,Int,P.Param)
 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)]
+    let fr = let d = P.rand 'α' [0,2,5,7,11]
+                 o = P.rand 'β' [4,5,6,7,9]
+                 sc = [0,2,4,5,7,9,11]
+             in P.degree_to_cps' sc 12 d o
+        du = P.rand 'γ' [2,3,5,7]
+    in (risset,1000
+       ,[("freq",fr)
+        ,("dur",du)
+        ,("sustain",map (* 1.25) du)
+        ,("amp",P.white 'δ' 0.025 0.15)
+        ,("trig",repeat 1)])
 
 main :: IO ()
-main = audition (pmono pattern)
+main = audition (P.nbind1 pattern)
diff --git a/gr/1-4Q6.scd b/gr/1-4Q6.scd
--- a/gr/1-4Q6.scd
+++ b/gr/1-4Q6.scd
@@ -12,7 +12,7 @@
  ;SinOsc.ar(freq*frqs[i]+dets[i],0,amp*env)}
 ;var src = Mix.fill(11,fn)
 ;Out.ar(out,Pan2.ar(src,pan));
-}).add;
+}).send;
 
 a = Synth(\risset,[\freq,72.midicps,\dur,4])
 a.set(\t_trig,1)
diff --git a/gr/1-4QM.hs b/gr/1-4QM.hs
--- a/gr/1-4QM.hs
+++ b/gr/1-4QM.hs
@@ -2,9 +2,9 @@
 
 import Control.Monad {- base -}
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Random.IO as L {- hsc3-lang -}
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 type ST = (UGen,UGen,UGen)
 
diff --git a/gr/1-4QM.scd b/gr/1-4QM.scd
--- a/gr/1-4QM.scd
+++ b/gr/1-4QM.scd
@@ -10,7 +10,7 @@
   ;play{var p = Env.perc(0.01,a + rel.next)
        ;var e = EnvGen.ar(p,doneAction:2)
        ;var x = [60,67,75,79,94].scramble
-	   ;var ta = x.midicps * a * s1.choose
+       ;var ta = x.midicps * a * s1.choose
        ;var tb = x * s2.choose.midicps
        ;var tc = a * s3.choose.midicps
        ;e * AY.ar(ta,tb,tc,0.25,3,15,10,7)}
diff --git a/gr/1-4QN.hs b/gr/1-4QN.hs
--- a/gr/1-4QN.hs
+++ b/gr/1-4QN.hs
@@ -3,8 +3,8 @@
 import Control.Concurrent {- base -}
 import Control.Monad {- base -}
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 import qualified Sound.SC3.Lang.Random.IO as L
 
 -- > withSC3 init_b
@@ -14,6 +14,7 @@
   async (b_gen_sine1 0 [Normalise,Wavetable,Clear] (map recip [1,2,3,4]))
 
 -- > Sound.SC3.UGen.Dot.draw (mk_g (lfNoise0 'α'))
+-- > audition (mk_g (lfNoise0 'α'))
 mk_g :: (Rate -> UGen -> UGen) -> Synthdef
 mk_g o =
     let k = control KR
@@ -30,29 +31,26 @@
         g = grainBuf 2 t (1 / l) b r p 2 0 (-1) 512
     in synthdef "g" (out 0 (g * e))
 
-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_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)]
+pb :: [P.Param]
+pb =
+    [[("dur",repeat 4)
+     ,("sdens",cycle [9000,1000,500] ./ 100)
+     ,("edens",concat (P.rand 'α' [[9000,1000,500] ./ 10
+                                  ,[1,1,1]]))
+     ,("rate",P.white 'β' (-10) 10)
+     ,("pos",P.white 'γ' (-10) 10)]
+    ,[("dur",repeat (4/3))
+     ,("sdens",cycle [9000,1000,500,25])
+     ,("edens",concat (P.rand 'δ' [[9000,1000,500,25]
+                                  ,[1,1,1,1]]))
+     ,("rate",P.white 'ε' (-100) 100)
+     ,("pos",P.white 'ζ' (-10) 10)]]
 
 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 'κ',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))
 
@@ -62,7 +60,11 @@
   dt <- L.choose [1,2,4,8,16,32]
   wait dt
 
+-- 1. there is a 'pattern' that plays the 'g'
+-- 2. there is a process that sends new 'g' definitions to scsynth
 main :: IO ()
 main = do
   _ <- forkIO (withSC3 (reset >> init_b >> forever update_g))
-  audition (p_with (K_instr,pinstr "g") (ppar (map pbind [p1,p2])))
+  let g = mk_g (lfNoise0 'α')
+      sc = P.sbind (zip (repeat g) pb)
+  audition sc
diff --git a/gr/1-4QN.scd b/gr/1-4QN.scd
--- a/gr/1-4QN.scd
+++ b/gr/1-4QN.scd
@@ -15,25 +15,25 @@
   ;Out.ar(out,g * env)}).add()};
 
 b = Pbind(
-	\instrument,\g1,
-	\dur,Pseq([4],inf),
-	\sdens,Pseq([9000,1000,500]/100,inf),
-	\edens,Prand([Pseq([9000,1000,500]/10,1),Pseq([1],3)],inf),
-	\rate,Pfunc({-10.0.rrand(10)}),
-	\pos,Pfunc({-10.0.rrand(10)}),
-	\bufnum,z.bufnum);
+    \instrument,\g1,
+    \dur,Pseq([4],inf),
+    \sdens,Pseq([9000,1000,500]/100,inf),
+    \edens,Prand([Pseq([9000,1000,500]/10,1),Pseq([1],3)],inf),
+    \rate,Pfunc({-10.0.rrand(10)}),
+    \pos,Pfunc({-10.0.rrand(10)}),
+    \bufnum,z.bufnum);
 
 c = Pbind(
-	\instrument,\g1,
-	\dur,Pseq([4/3],inf),
-	\sdens,Pseq([9000,1000,500,25],inf),
-	\edens,Prand([Pseq([9000,1000,500,25],1),Pseq([1],4)],inf),
-	\rate,Pfunc({-100.0.rrand(100)}),
-	\pos,Pfunc({-10.0.rrand(10)}),
-	\bufnum,z.bufnum);
+    \instrument,\g1,
+    \dur,Pseq([4/3],inf),
+    \sdens,Pseq([9000,1000,500,25],inf),
+    \edens,Prand([Pseq([9000,1000,500,25],1),Pseq([1],4)],inf),
+    \rate,Pfunc({-100.0.rrand(100)}),
+    \pos,Pfunc({-10.0.rrand(10)}),
+    \bufnum,z.bufnum);
 
 fork({loop
  {var o = [LFNoise0,SinOsc,Impulse,LFPulse,LFSaw].choose
- ;g.value(o);[1,2,4,8,16,32].choose.postln.wait}});
+ ;g.(o);[1,2,4,8,16,32].choose.postln.wait}});
 
 [b,c].do({|p| p.play});
diff --git a/gr/1-4Tw.hs b/gr/1-4Tw.hs
new file mode 100644
--- /dev/null
+++ b/gr/1-4Tw.hs
@@ -0,0 +1,14 @@
+-- http://sccode.org/1-4Tw (tb)
+
+import Sound.SC3 {- hsc3 -}
+
+one_4tw :: UGen
+one_4tw =
+    let im = mix (impulse AR (mce3 1 (1/3) (1/5)) (mce3 0 0.133 0.5))
+        f i = tDuty AR (max 0.25 (timer i)) 0 DoNothing 1 0
+        g n i = sinOsc AR ((4000 + (i * 500))) 0 * decay2 n 0.01 0.2
+        nd = zipWith g (iterate f im) [0..9]
+    in splay (mce nd) 1 1 0 True
+
+main :: IO ()
+main = audition (out 0 one_4tw)
diff --git a/gr/1-4Tw.scd b/gr/1-4Tw.scd
new file mode 100644
--- /dev/null
+++ b/gr/1-4Tw.scd
@@ -0,0 +1,5 @@
+{var i = Impulse.ar([1,3,5].reciprocal,[0,0.133,0.5]).sum
+;var f = {|st,z| [TDuty.ar(max(0.25,Timer.ar(st.first)),0,1)] ++ st}
+;var n = (1..10).inject([i],f)
+;n = n.collect{|n,i| SinOsc.ar((4000 + (i * 500))) * Decay2.ar(n,0.01,0.2)}
+;Splay.ar(n)}.play
diff --git a/gr/1-4VL.hs b/gr/1-4VL.hs
new file mode 100644
--- /dev/null
+++ b/gr/1-4VL.hs
@@ -0,0 +1,83 @@
+-- http://sccode.org/1-4VL
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.ID as R {- hsc3-lang -}
+
+tb_freq :: [UGen]
+tb_freq =
+    let n e z (l,r) = range l r (lfNoise1 e KR z)
+        ln (s,e,d) = line KR s e d DoNothing
+        f0 = n 'α' 0.5 (2424, 2444)
+    in [f0 + ln (20, 0, 0.5)
+       ,f0 + n 'β' 0.5 (1, 3)
+       ,n 'γ' 1.5 (5435, 5440) - ln (35, 0, 1)
+       ,n 'δ' 1.5 (5480, 5485) - ln (10, 0, 0.5)
+       ,n 'ε' 2 (8435, 8445) + ln (15, 0, 0.05)
+       ,n 'ζ' 2 (8665, 8670)
+       ,n 'η' 2 (8704, 8709)
+       ,n 'θ' 2 (8807, 8817)
+       ,n 'ι' 2 (9570, 9607)
+       ,n 'κ' 2 (10567, 10572) - ln (20, 0, 0.05)
+       ,n 'λ' 2 (10627, 10636) + ln (35, 0, 0.05)
+       ,n 'μ' 2 (14689, 14697) - ln (10, 0, 0.05)]
+
+tb_amp :: [UGen]
+tb_amp =
+    let n e z (l,r) = range l r (lfNoise1 e KR z)
+        a = [n 'α' 1 (-10, -5)
+            ,n 'β' 1 (-20, -10)
+            ,n 'γ' 1 (-12, -6)
+            ,n 'δ' 1 (-12, -6)
+            ,-20
+            ,-20
+            ,-20
+            ,-25
+            ,-10
+            ,-20
+            ,-20
+            ,-25]
+    in map dbAmp a
+
+tb_rtime :: Floating b => b -> [b]
+tb_rtime freqscale =
+    let t = [20 * (freqscale ** 0.2)
+            ,20 * (freqscale ** 0.2)
+            ,5
+            ,5
+            ,0.6
+            ,0.5
+            ,0.3
+            ,0.25
+            ,0.4
+            ,0.5
+            ,0.4
+            ,0.6]
+    in map (* ((recip freqscale) ** 0.5)) t
+
+prayer_bell :: UGen -> UGen -> UGen -> UGen -> DoneAction -> UGen
+prayer_bell exc freq decayscale lagTime doneAction =
+    let freqscale = lag3 (freq / 2434) lagTime
+        decayscale' = lag3 decayscale lagTime
+        spec = klankSpec tb_freq tb_amp (tb_rtime freqscale)
+        sig = dynKlank exc freqscale 0 decayscale' spec
+        end = detectSilence (mix sig) 1e-4 0.1 doneAction
+    in mrg2 sig end
+
+-- > audition (out 0 bell_1)
+bell_1 :: UGen
+bell_1 =
+    let tr = impulse AR 0 0 * rand 'α' 0.05 0.09
+        exc = tr + (pinkNoise 'β' AR * xLine KR 2e-3 1e-6 15 DoNothing)
+        frq = lchoose 'γ' [120,240 .. 2000]
+    in prayer_bell exc frq 1 0 RemoveSynth
+
+-- > audition (out 0 bell_2)
+bell_2 :: UGen
+bell_2 =
+    let exc = impulse AR 0 0 * rand 'α' 0.05 0.09
+        frq = lchoose 'β' [240, 360 .. 2000]
+    in prayer_bell exc frq 1 10 RemoveSynth
+
+main :: IO ()
+main = spawnTextureU (\i -> R.rrand i (1/3) 9,maxBound) (lchoose 'α' [bell_1,bell_2])
diff --git a/gr/1-9.hs b/gr/1-9.hs
new file mode 100644
--- /dev/null
+++ b/gr/1-9.hs
@@ -0,0 +1,16 @@
+-- http://sccode.org/1-9
+
+import Sound.SC3 {- hsc3 -}
+
+k :: Enum a => a -> Int -> [Int]
+k c n = let i = fromEnum c in [i .. i + n]
+
+u :: UGen
+u =
+    let a = hpf (pinkNoise 'α' AR * 0.005) 10 * line KR 0 1 9 DoNothing
+        f i = let i' = constant i
+              in ringz (a * lfNoise1 i KR (0.05 + rand i 0 0.1)) (55 * i' + 60) 0.2
+    in tanh (gVerb (sum (map f (k 'β' 98))) 70 99 0.5 0.5 15 1 0.7 0.5 300)
+
+main :: IO ()
+main = audition (out 0 u)
diff --git a/gr/1-9.scd b/gr/1-9.scd
new file mode 100644
--- /dev/null
+++ b/gr/1-9.scd
@@ -0,0 +1,5 @@
+// http://sccode.org/1-9
+
+{var a = HPF.ar(PinkNoise.ar * 0.005,10) * Line.kr(0,1,9)
+;var f = {arg i; Ringz.ar(a * LFNoise1.kr(0.05 + 0.1.rand),55 * i + 60,0.2)}
+;GVerb.ar((f ! 99).sum,70,99).tanh}.play
diff --git a/gr/1-Td.hs b/gr/1-Td.hs
--- a/gr/1-Td.hs
+++ b/gr/1-Td.hs
@@ -1,9 +1,9 @@
 -- http://sccode.org/1-Td
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Collection as C {- hsc3-lang -}
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 one_td_u :: UGen
 one_td_u =
diff --git a/gr/acid-otophilia.hs b/gr/acid-otophilia.hs
--- a/gr/acid-otophilia.hs
+++ b/gr/acid-otophilia.hs
@@ -3,7 +3,7 @@
 import Data.List {- base -}
 import Data.Maybe
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import System.Random {- random -}
 
 -- * Instruments
diff --git a/gr/adc-16-6-2.hs b/gr/adc-16-6-2.hs
new file mode 100644
--- /dev/null
+++ b/gr/adc-16-6-2.hs
@@ -0,0 +1,50 @@
+-- adc-16-6-2 (adc) #p.489
+{-# OPTIONS_GHC -F -pgmF hsc3-uparam #-}
+
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.List as L {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
+
+constQ :: Synthdef
+constQ =
+    let uparam = {bus=0,bufnum=0,amp=0.1,pan=0,centerPos=0.5,sustain=0.1,rate=1,freq=400,rq=0.3}
+        ringtime = min ((2.4 / (freq * rq)) * 0.66) 0.5 -- estimated
+        ampcomp = (rq ** (-1)) * ((400 / freq) ** 0.5)
+        envSig = let env = envelope [0,amp,0] (map (* sustain) [0.5,0.5]) [EnvWelch]
+                 in envGen AR 1 1 0 1 DoNothing env
+        cutoffEnv = let env = envelope [1,1,0] [sustain + ringtime,0.01] [EnvLin]
+                    in envGen KR 1 1 0 1 RemoveSynth env
+        startPos = (centerPos - (sustain * rate * 0.5)) * bufSampleRate IR bufnum
+        grain = playBuf 1 AR bufnum rate 0 startPos Loop DoNothing * envSig
+        filtered = bpf grain freq rq * ampcomp
+    in synthdef "constQ" (offsetOut bus (pan2 filtered pan cutoffEnv))
+
+p :: Double -> P.Param
+p b =
+    [("bufnum",repeat b)
+    ,("sustain",P.white 'α' 0.02 0.04)
+    ,("amp",P.white 'β' 0.05 0.25)
+    ,("centerPos",cycle [0,0.01 .. 2])
+    ,("dur",L.brown 'γ' 0.01 0.09 5)
+    ,("rate",P.white 'δ' 0.95 1.05)
+    ,("freq",map midiCPS (L.brown 'ε' 64 120 8))
+    ,("pan",P.white 'ζ' (-1) 1)
+    ,("rq",P.white 'η' 0.03 0.15)]
+
+p' :: Double -> P.Param
+p' b =
+    [("bufnum",repeat b)
+    ,("sustain",P.white 'θ' 0.02 0.04)
+    ,("amp",repeat 0.3)
+    ,("centerPos",cycle [0,0.01 .. 2])
+    ,("dur",P.white 'ι' 0.01 0.03)
+    ,("rate",P.white 'κ' 0.95 1.05)
+    ,("freq",map midiCPS (L.brown 'λ' 80 82 8))
+    ,("pan",P.white 'μ' (-1) 1)
+    ,("rq",repeat 0.05)]
+
+main :: IO ()
+main = withSC3$do
+  let fn = "/usr/local/share/SuperCollider/sounds/a11wlk01-44_1.aiff"
+  _ <- async (b_allocRead 0 fn 0 0)
+  play (P.sbind [(constQ,p 0),(constQ,p' 0)])
diff --git a/gr/adc-16-6-2.scd b/gr/adc-16-6-2.scd
new file mode 100644
--- /dev/null
+++ b/gr/adc-16-6-2.scd
@@ -0,0 +1,37 @@
+// adc-16-6-2 (adc) #p.489
+
+b = Buffer.read(s, "sounds/a11wlk01-44_1.aiff");
+
+d = SynthDef(\constQ, {
+    arg out, bufnum=0, amp=0.1, pan, centerPos=0.5, sustain=0.1, rate=1, freq=400, rq=0.3;
+    var ringtime = (2.4 / (freq * rq) * 0.66).min(0.5); // estimated
+    var ampcomp = (rq ** -1) * (400 / freq ** 0.5);
+    var envSig = EnvGen.ar(Env([0, amp, 0], [0.5, 0.5] * sustain, \welch));
+    var cutoffEnv = EnvGen.kr(Env([1, 1, 0], [sustain+ringtime,0.01]), doneAction: 2);
+    var startPos = (centerPos - (sustain * rate * 0.5)) * BufSampleRate.ir(bufnum);
+    var grain = PlayBuf.ar(1, bufnum, rate, 0, startPos, 1) * envSig;
+    var filtered = BPF.ar( grain, freq, rq, ampcomp);
+    OffsetOut.ar(out, Pan2.ar(filtered, pan, cutoffEnv))
+}, \ir.dup(8)).add;
+
+Pbindef(\gr1Q,
+	\instrument, \constQ,
+    \bufnum, b.bufnum,
+	\sustain, 0.01,
+    \amp, 0.2,
+	\centerPos, Pn(Penv([1, 2.0], [10], \lin)),
+	\dur, Pn(Penv([0.01, 0.09, 0.03].scramble, [0.38, 0.62] * 10, \exp)),
+	\rate, Pwhite(0.95, 1.05),
+	\freq, Pbrown(64.0, 120, 8.0).midicps,
+	\pan, Pwhite(-1, 1, inf),
+	\rq, 0.03
+).play;
+
+Pbindef(\gr1Q, \rq, 0.05);
+Pbindef(\gr1Q, \rq, 0.01);
+Pbindef(\gr1Q, \sustain, 0.03, \amp, 0.3);
+Pbindef(\gr1Q, \freq, Pbrown(80, 82, 18.0).midicps);
+Pbindef(\gr1Q, \rq, 0.03);
+Pbindef(\gr1Q, \rate, Pn(Penv([1,1], [6], \lin)));
+Pbindef(\gr1Q, \dur, Pwhite(0.01, 0.02));
+Pbindef(\gr1Q, \centerPos, Pn(Penv([0, 1.0], [10], \lin)));
diff --git a/gr/after-goeyvaerts.hs b/gr/after-goeyvaerts.hs
--- a/gr/after-goeyvaerts.hs
+++ b/gr/after-goeyvaerts.hs
@@ -5,7 +5,7 @@
 import Data.List.Split {- split -}
 import qualified Data.Map as M {- containers -}
 import Sound.OSC.FD {- hosc -}
-import Sound.SC3.ID.FD {- hsc3 -}
+import Sound.SC3.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 -}
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
@@ -1,27 +1,28 @@
--- aleatoric quartet (jmcc)
+-- aleatoric quartet (jmcc) #7
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
+-- > g <- aleatoric_quartet
 aleatoric_quartet :: UId m => m UGen
 aleatoric_quartet = do
-  let base_mn = control KR "note" 66
-      amp = control KR "ampl" 0.07
+  let base_mn = 66 -- control KR "note" 66
+      amp = 0.07 -- 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)
+      rapf i = do r <- clone 2 (randM 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
+      mk_f = do r0 <- lchooseM [1, 0.5, 0.25]
+                r1 <- randM (-30) 30
+                n0 <- lfNoise0M 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
+                r <- randM (-1) 1
+                x <- do n0 <- pinkNoiseM AR
+                        n1 <- lfNoise1M 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))
diff --git a/gr/aleatoric-quartet.scd b/gr/aleatoric-quartet.scd
--- a/gr/aleatoric-quartet.scd
+++ b/gr/aleatoric-quartet.scd
@@ -1,3 +1,5 @@
+// aleatoric quartet (jmcc) #7
+
 { var amp = 0.07
 ; var density = MouseX.kr(0.01, 1, 'linear', 0.1)
 ; var dmul = density.reciprocal * 0.5 * amp
@@ -5,18 +7,18 @@
 ; var rapf = { arg i
              ; var r = Array.fill(2, { Rand(0, 0.05) })
              ; AllpassN.ar(i, 0.05, r, 1) }
-; var mk_f = { var i0 = IRand.new(0, 2)
+; var mk_f = { var i0 = IRand(0, 2)
              ; var r0 = Select.kr(i0, [1, 0.5, 0.25])
-             ; var r1 = Rand.new(-30, 30)
+             ; var r1 = Rand(-30, 30)
              ; var n0 = LFNoise0.kr(r0)
              ; var m = Lag.kr((n0 * 7 + 66 + r1).round(1), 0.2)
              ; m.midicps }
-; var mk_s = { var f = mk_f.value.reciprocal
-             ; var r = Rand.new(-1, 1)
-             ; var n0 = PinkNoise.ar()
+; var mk_s = { var f = mk_f.().reciprocal
+             ; var r = Rand(-1, 1)
+             ; var n0 = PinkNoise.ar
              ; var n1 = LFNoise1.kr(8)
              ; var x = n0 * 0.max(n1 * dmul + dadd)
              ; Pan2.ar(CombL.ar(x, 0.02, f, 3), r, 1) }
 ; var g = Mix.fill(4, mk_s)
-; 5.do({ g = rapf.value(g) })
-; Out.ar(0, LeakDC.ar(g, 0.995)) }.play
+; 5.do({ g = rapf.(g) })
+; LeakDC.ar(g, 0.995) }.play
diff --git a/gr/alien-froggies-rec.hs b/gr/alien-froggies-rec.hs
new file mode 100644
--- /dev/null
+++ b/gr/alien-froggies-rec.hs
@@ -0,0 +1,13 @@
+-- alien froggies (jmcc) #1
+
+import Sound.SC3 {- 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/gr/alien-froggies.hs b/gr/alien-froggies.hs
--- a/gr/alien-froggies.hs
+++ b/gr/alien-froggies.hs
@@ -1,13 +1,14 @@
--- alien froggies (jmcc)
+-- alien froggies (jmcc) #1
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
-alien_froggies :: UGen -> (UGen,UGen)
+alien_froggies :: 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')
+    in o * 0.05
 
+-- > let u = alien_froggies 11
 main :: IO ()
-main = overlapTextureS (0.25,0.5,5,maxBound) alien_froggies 11
+main = overlapTextureU (0.25,0.5,5,maxBound) (alien_froggies 11)
diff --git a/gr/alien-froggies.scd b/gr/alien-froggies.scd
--- a/gr/alien-froggies.scd
+++ b/gr/alien-froggies.scd
@@ -1,5 +1,9 @@
-var rate = 11.0;
-play({OverlapTexture.ar({
-rate = (rate * (0.2.bilinrand.exp)).fold(1.0,30.0);
-var o = Formant.ar(rate,exprand(200,3000.0),9.0.rand * rate + rate,0.05)},
-0.5,0.25,5,1)})
+// alien froggies (jmcc) #1
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var rate = 11;
+    var r = (rate * (0.2.bilinrand.exp)).fold(1.0,30.0);
+    Formant.ar(r,exprand(200,3000.0),9.0.rand * r + r,0.05);
+},sustainTime:0.5,transitionTime:0.25,overlap:5);
diff --git a/gr/alien-meadow.hs b/gr/alien-meadow.hs
--- a/gr/alien-meadow.hs
+++ b/gr/alien-meadow.hs
@@ -1,16 +1,13 @@
--- alien meadow (jmcc)
+-- alien meadow (jmcc) #6
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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)
+    let b = rand 'α' 0 5000
+        f = sinOsc AR (rand 'β' 0 20) 0 * b * 0.1 + b
+    in pan2 (sinOsc AR f 0) (rand 'γ' (-1) 1) (sinOsc AR (rand 'δ' 0 20) 0 * 0.05 + 0.05)
 
 main :: IO ()
 main = overlapTextureU (2,6,6,maxBound) alien_meadow
diff --git a/gr/alien-meadow.scd b/gr/alien-meadow.scd
new file mode 100644
--- /dev/null
+++ b/gr/alien-meadow.scd
@@ -0,0 +1,11 @@
+// alien meadow (jmcc) #6
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var a = 20.0.rand;
+    var b = 5000.0.rand;
+    var c = 20.0.rand;
+    var pan = 1.0.rand2;
+    Pan2.ar(SinOsc.ar(SinOsc.ar(a, 0, 0.1*b, b), 0, SinOsc.kr(c, 0, 0.05, 0.05)), pan);
+},sustainTime:6,transitionTime:2,overlap:6);
diff --git a/gr/ambient1.hs b/gr/ambient1.hs
--- a/gr/ambient1.hs
+++ b/gr/ambient1.hs
@@ -2,7 +2,7 @@
 -- some edits......
 
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 chain :: a -> [a -> a] -> a
 chain n ff =
@@ -55,45 +55,42 @@
 audition bass_u
 -}
 
-pulse_i :: Instr
-pulse_i = Instr_Def (synthdef "pulse" pulse_u) False
+pulse_s :: Synthdef
+pulse_s = synthdef "pulse" pulse_u
 
-drone_i :: Instr
-drone_i = Instr_Def (synthdef "drone" drone_u) False
+drone_s :: Synthdef
+drone_s = synthdef "drone" drone_u
 
-bass_i :: Instr
-bass_i = Instr_Def (synthdef "bass" bass_u) False
+bass_s :: Synthdef
+bass_s = synthdef "bass" bass_u
 
-dur_p :: Fractional a => P a
-dur_p = prand 'β' [3,0.7,1,0.5] inf
+dur_p :: Fractional a => [a]
+dur_p = P.rand 'β' [3,0.7,1,0.5]
 
-pulse_p :: [P_Bind]
+pulse_p :: P.Param
 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)]
+    [("dur",map (* 10) dur_p)
+    ,("freq",fmap midiCPS (P.rand 'α' [59,72,76,79,81,88,90]))
+    ,("amp",P.white 'β' 0.2 0.27)
+    ,("attackTime",P.white 'γ' 0 7)
+    ,("delayTime",repeat 0.02)]
 
-drone_p :: [P_Bind]
+drone_p :: P.Param
 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)]
+    [("dur",dur_p)
+    ,("freq",fmap midiCPS (P.rand 'α' [31,40,45,64,68,69]))
+    ,("amp",P.white 'β' 0.02 0.06)
+    ,("phase",P.rand 'γ' [0,4.7123])]
 
-bass_p :: [P_Bind]
+bass_p :: P.Param
 bass_p =
-    [(K_instr,pinstr' bass_i)
-    ,(K_dur,dur_p)
-    ,(K_midinote,31)
-    ,(K_amp,0.3)]
+    [("dur",dur_p)
+    ,("freq",repeat (midiCPS 31))
+    ,("amp",repeat 0.3)]
 
 main :: IO ()
 main = do
-  let p = ppar [pbind pulse_p
-               ,pbind drone_p
-               ,pbind bass_p]
-  audition p
+  let sc = P.sbind [(pulse_s,pulse_p)
+                   ,(drone_s,drone_p)
+                   ,(bass_s,bass_p)]
+  audition sc
diff --git a/gr/analog-bubbles-mouse.hs b/gr/analog-bubbles-mouse.hs
new file mode 100644
--- /dev/null
+++ b/gr/analog-bubbles-mouse.hs
@@ -0,0 +1,16 @@
+-- analog bubbles with mouse control (jmcc) #3
+
+import Sound.SC3 {- hsc3 -}
+
+analog_bubbles_mouse :: UGen
+analog_bubbles_mouse =
+  let y = mouseY KR 0.1 10 Exponential 0.2 -- lfo 1 rate
+      x = mouseX KR 2 40 Exponential 0.2  -- lfo 2 rate
+      o2 = lfSaw KR x 0 * (-3) + 80 -- depth & offset in semitones
+      o1 = lfSaw KR y 0 * 24 + o2 -- depth in semitones, offset is lfo_2
+      f = midiCPS o1 -- convert to frequency
+      s = sinOsc AR f 0 * 0.04
+  in combN s 0.2 0.2 4 -- echoing sine wave
+
+main :: IO ()
+main = audition (out 0 analog_bubbles_mouse)
diff --git a/gr/analog-bubbles-mouse.scd b/gr/analog-bubbles-mouse.scd
new file mode 100644
--- /dev/null
+++ b/gr/analog-bubbles-mouse.scd
@@ -0,0 +1,9 @@
+// analog bubbles with mouse control (jmcc) #3
+
+{var y = MouseY.kr(0.1,10,'exponential') /* lfo 1 rate */
+;var x = MouseX.kr(2,40,'exponential')  /* lfo 2 rate */
+;var lfo_2 = LFSaw.kr(x,0,-3,80) /* depth & offset in semitones */
+;var lfo_1 = LFSaw.kr(y,0,24,lfo_2) /* depth in semitones, offset is lfo_2 */
+;var freq = lfo_1.midicps /* convert to frequency */
+;CombN.ar(SinOsc.ar(freq, 0, 0.04), 0.2, 0.2, 2) /* echoing sine wave */
+}.play
diff --git a/gr/analog-bubbles.hs b/gr/analog-bubbles.hs
--- a/gr/analog-bubbles.hs
+++ b/gr/analog-bubbles.hs
@@ -1,7 +1,11 @@
--- analog bubbles (jmcc)
+-- analog bubbles (jmcc) #1
 
 import Sound.SC3 {- hsc3 -}
 
+-- > putStrLn$synthstat analog_bubbles
+-- > let g = synthdef_to_graphdef (synthdef "analog-bubbles" (out 0 analog_bubbles))
+-- > import qualified Sound.SC3.Server.Graphdef as G
+-- > putStrLn$G.graphdef_stat g
 analog_bubbles :: UGen
 analog_bubbles =
   let o = lfSaw KR (mce2 8 7.23) 0 * 3 + 80
diff --git a/gr/analog-bubbles.scd b/gr/analog-bubbles.scd
--- a/gr/analog-bubbles.scd
+++ b/gr/analog-bubbles.scd
@@ -1,4 +1,6 @@
-{var o = LFSaw.kr([87.23]0380)
-;var f = LFSaw.kr(0.4024o)
-;var s = SinOsc.ar(f.midicps00.04)
-;Out.ar(0CombN.ar(s0.20.240.1))}.play
+// analog bubbles (jmcc) #1
+
+{var o = LFSaw.kr([8,7.23],0) * 3 + 80
+;var f = LFSaw.kr(0.4,0) * 24 + o // glissando function
+;var s = SinOsc.ar(f.midicps,0) * 0.04
+;CombN.ar(s,0.2,0.2,4) * 0.1}.play // echoing sine wave
diff --git a/gr/analogue-daze.hs b/gr/analogue-daze.hs
new file mode 100644
--- /dev/null
+++ b/gr/analogue-daze.hs
@@ -0,0 +1,24 @@
+-- analogue daze (jmcc) #3
+
+import Sound.SC3 {- hsc3 -}
+
+analogue_daze :: UGen
+analogue_daze =
+    let pattern = [55,63,60,63,57,65,62,65]
+        sequ k s tr = demand tr 0 (dseq k dinf (mce s))
+        f k octave clockRate pwmrate fltrate =
+            let trg = impulse KR clockRate 0
+                pattern' = map (midiCPS .  (+ (12 * octave))) pattern
+                sq = sequ 'α' pattern' trg
+                pwm = sinOsc KR pwmrate (rand ('β' `joinID` k) 0 (2 * pi)) * 0.4 + 0.5
+                cf = sinOsc KR fltrate (rand ('γ' `joinID` k) 0 (2 * pi)) * 1400 + 2000
+            in rlpf (lfPulse AR (lag sq 0.05) 0 pwm * 0.1) cf (1/15)
+        a = lfNoise0 'δ' AR (lfNoise1 'ε' KR 0.3 * 6000 + 8000) * (mce2 0.07 0.08)
+        x = decay (impulse AR 2 0) 0.15 * a
+        g = mce [f 'ζ' 1 8 0.31 0.2,f 'η' 0 2 0.13 0.11] + x
+        z = 0.4 * (combN g 0.375 0.375 5 + mceReverse g)
+        e = envLinen 2 56 2 1
+    in z * envGen KR 1 1 0 1 RemoveSynth e
+
+main :: IO ()
+main = audition (out 0 analogue_daze)
diff --git a/gr/analogue-daze.scd b/gr/analogue-daze.scd
new file mode 100644
--- /dev/null
+++ b/gr/analogue-daze.scd
@@ -0,0 +1,21 @@
+// analogue daze (jmcc) #3
+
+{
+var pattern = #[55,63,60,63,57,65,62,65];
+var f = {
+    arg octave, clockRate, pwmrate, fltrate;
+    var sequ = {arg s, tr; Demand.kr(tr, 0, Dseq(s, inf))};
+    var tr = Impulse.kr(clockRate);
+    var pattern_ = (pattern + (12 * octave)).midicps;
+    var sq = sequ.(pattern_, tr);
+    var pwm = SinOsc.kr(pwmrate, 2pi.rand, 0.4, 0.5);
+    var cf = SinOsc.kr(fltrate, 2pi.rand, 1400, 2000);
+    RLPF.ar(LFPulse.ar(Lag.kr(sq,0.05), 0, pwm, 0.1), cf, 1/15);
+};
+var a = LFNoise0.ar(LFNoise1.kr(0.3,6000,8000),[0.07,0.07]);
+var x = Decay.ar(Impulse.ar(2), 0.15, a);
+var g = [f.(1,8,0.31,0.2), f.(0,2,0.13,0.11)] + x;
+var z = 0.4 * (CombN.ar(g, 0.375, 0.375, 5) + g.reverse);
+var e = Env.linen(2, 56, 2);
+z * EnvGen.kr(e,doneAction:2);
+}.play;
diff --git a/gr/arpeggio.hs b/gr/arpeggio.hs
--- a/gr/arpeggio.hs
+++ b/gr/arpeggio.hs
@@ -4,21 +4,24 @@
 import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Pattern {- hsc3-lang -}
 
+outk :: UGen -> UGen
+outk = out (control KR "out" 0)
+
+pan2k :: UGen -> UGen
+pan2k s = pan2 s (control KR "pan" 0) (control KR "amp" 0.1)
+
 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))
+    in synthdef "analogarpeggio" (outk (pan2k (e * s)))
 
 {-
 audition (pbind [(K_instr,psynth analogarpeggio)
@@ -83,4 +86,4 @@
 main = do
   let n = 60/157
       p = pedit K_dur (* n) (pbind arpeggio)
-  withSC3 (play p)
+  paudition 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,12 +1,12 @@
--- babbling brook (jmcc)
+-- babbling brook (jmcc) #SC3
 -- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 babbling_brook :: UId m => m UGen
 babbling_brook = do
-  let b f m a g = do n1 <- brownNoise AR
-                     n2 <- brownNoise AR
+  let b f m a g = do n1 <- brownNoiseM AR
+                     n2 <- brownNoiseM AR
                      let n3 = lpf n2 f * m + a
                          n4 = onePole n1 0.99
                      return (rhpf n4 n3 0.03 * g)
diff --git a/gr/babbling-brook.hs b/gr/babbling-brook.hs
new file mode 100644
--- /dev/null
+++ b/gr/babbling-brook.hs
@@ -0,0 +1,16 @@
+-- babbling brook (jmcc) #SC3
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
+
+import Sound.SC3 {- hsc3 -}
+
+babbling_brook :: UGen
+babbling_brook =
+  let b f m a g = let n3 = lpf (brownNoise 'α' AR) f * m + a
+                      n4 = onePole (brownNoise 'β' AR) 0.99
+                  in rhpf n4 n3 0.03 * g
+      x = uclone 'γ' 2 (b 14 400 500 0.006)
+      y = uclone 'δ' 2 (b 20 800 1000 0.010)
+  in x + y
+
+main :: IO ()
+main = audition (out 0 babbling_brook)
diff --git a/gr/babbling-brook.scd b/gr/babbling-brook.scd
--- a/gr/babbling-brook.scd
+++ b/gr/babbling-brook.scd
@@ -1,7 +1,9 @@
-{ var b = { arg f, m, a, g
-          ; { var n1 = OnePole.ar(BrownNoise.ar, 0.99)
-            ; var n2 = LPF.ar(BrownNoise.ar, f)
-            ; RHPF.ar(n1, n2 * m + a, 0.03, g) } }
-; var x = b.value(14, 400, 500, 0.006) ! 2
-; var y = b.value(20, 800, 1000, 0.010) ! 2
-; Out.ar(0, x + y) }.play
+// babbling brook (jmcc) #SC3
+
+{var b = {arg f, m, a, g
+         ;{var n1 = OnePole.ar(BrownNoise.ar, 0.99)
+          ;var n2 = LPF.ar(BrownNoise.ar, f)
+          ;RHPF.ar(n1, n2 * m + a, 0.03, g)}}
+;var x = b.(14, 400, 500, 0.06) ! 2
+;var y = b.(20, 800, 1000, 0.10) ! 2
+;x + y}.play
diff --git a/gr/berlin-1977.hs b/gr/berlin-1977.hs
new file mode 100644
--- /dev/null
+++ b/gr/berlin-1977.hs
@@ -0,0 +1,31 @@
+-- berlin 1977 (jmcc) #4
+
+import Sound.SC3 {- hsc3 -}
+
+-- Somewhat akin to SC2 Sequencer.
+sequ :: ID a => a -> [UGen] -> UGen -> UGen
+sequ e s tr = demand tr 0 (dseq e dinf (mce s))
+
+-- Somewhat akin to SC2 Sequencer with random selection function as input.
+sequR :: ID a => a -> [UGen] -> UGen -> UGen
+sequR e s tr = demand tr 0 (dshuf e dinf (mce s))
+
+berlin_1977 :: UGen
+berlin_1977 =
+    let clock_rate = mouseX KR 5 20 Exponential 0.2 -- mouse x controls clock rate
+        clock_time = 1 / clock_rate
+        clock = impulse KR clock_rate 0 -- sequencer trigger
+        patternList = [55,60,63,62,60,67,63,58];
+        note = sequ 'α' patternList clock -- midi note pattern sequencer
+        clock_16 = pulseDivider clock 16 0 -- divide clock by 16
+        note' = sequR 'β' [-12,-7,-5,0,2,5] clock_16 + note -- transpose somewhat randomly
+        freq = midiCPS note' -- convert midi note to cycles per second
+        env = decay2 clock (0.05 * clock_time) (2 * clock_time)
+        amp = env * 0.1 + 0.02 -- amplitude envelope
+        filt = env * (fSinOsc KR 0.17 0 * 800)+ 1400 -- filter frequency
+        pw = sinOsc KR 0.08 (mce2 0 (0.5 * pi)) * 0.45 + 0.5 -- pulse width LFO(s)
+        s = pulse AR freq pw * amp
+    in combN (rlpf s filt 0.15) 0.2 (mce2 0.2 0.17) 1.5
+
+main :: IO ()
+main = audition (out 0 berlin_1977)
diff --git a/gr/berlin-1977.scd b/gr/berlin-1977.scd
new file mode 100644
--- /dev/null
+++ b/gr/berlin-1977.scd
@@ -0,0 +1,18 @@
+// berlin 1977 (jmcc) #4
+
+{var sequ = {arg s,tr; Demand.kr(tr,0,Dseq(s,inf))}
+;var sequR = {arg s,tr; Demand.kr(tr,0,Dshuf(s,inf))}
+;var clock_rate = MouseX.kr(5,20,'exponential',0.2) // mouse x controls clock rate
+;var clock_time = 1 / clock_rate
+;var clock = Impulse.kr(clock_rate,0) // sequencer trigger
+;var patternList = [55,60,63,62,60,67,63,58]
+;var note = sequ.(patternList,clock) // midi note pattern sequencer
+;var clock_16 = PulseDivider.kr(clock,16,0) // divide clock by 16
+;var note_ = sequR.([-12,-7,-5,0,2,5],clock_16) + note // transpose somewhat randomly
+;var freq = note_.midicps // convert midi note to cycles per second
+;var env = Decay2.kr(clock,0.05 * clock_time,2 * clock_time)
+;var amp = env * 0.1 + 0.02 // amplitude envelope
+;var filt = env * (FSinOsc.kr(0.17,0) * 800) + 1400 // filter frequency
+;var pw = SinOsc.kr(0.08,[0,0.5 * pi]) * 0.45 + 0.5 // pulse width LFO(s)
+;var s = Pulse.ar(freq,pw) * amp
+;CombN.ar(RLPF.ar(s,filt,0.15),0.2,[0.2,0.17],1.5)}.play;
diff --git a/gr/birdies.hs b/gr/birdies.hs
new file mode 100644
--- /dev/null
+++ b/gr/birdies.hs
@@ -0,0 +1,20 @@
+-- birdies (jmcc) #6
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (- n) n
+
+birdies :: UGen
+birdies =
+    let p1 = lfPulse KR (0.4 + rand 'α' 0 1) 0 (rand 'β' 0 0.8 + 0.1) * (rand 'γ' 0 3 + 4) + 2
+        p2 = lfPulse KR (0.4 + rand 'δ' 0 1) 0 (rand 'ε' 0 0.8 + 0.1) * (rand 'ζ' 0 3 + 4)
+        p3 = lfPulse KR (0.2 + rand 'η' 0 0.5) 0 0.4 * 0.02
+        sw = lfSaw KR (p1 + p2) 0 * (- (1000 + rand 'θ' 0 800)) + (4000 + rand2 'ι' 1200)
+        freq = lag sw 0.05
+        amp = lag p3 0.3
+    in pan2 (sinOsc AR freq 0 * amp) (rand2 'κ' 1) 1
+
+main :: IO ()
+main = overlapTextureU (7,4,4,maxBound) birdies
diff --git a/gr/birdies.scd b/gr/birdies.scd
new file mode 100644
--- /dev/null
+++ b/gr/birdies.scd
@@ -0,0 +1,13 @@
+// birdies (jmcc) #6
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var p1 = LFPulse.kr(0.4 + 1.0.rand, 0, 0.8.rand + 0.1, 3.0.rand + 4, 2);
+    var p2 = LFPulse.kr(0.4 + 1.0.rand, 0, 0.8.rand + 0.1, 3.0.rand + 4);
+    var p3 = LFPulse.kr(0.2 + 0.5.rand, 0, 0.4, 0.02);
+    var sw = LFSaw.kr(p1 + p2, 0, (1000 + 800.rand).neg, 4000 + 1200.rand2);
+    var freq = Lag.kr(sw, 0.05);
+    var amp = Lag.kr(p3, 0.3);
+    Pan2.ar(SinOsc.ar(freq,0,amp), 1.0.rand2);
+},7,4,4);
diff --git a/gr/birds-am-fm.hs b/gr/birds-am-fm.hs
new file mode 100644
--- /dev/null
+++ b/gr/birds-am-fm.hs
@@ -0,0 +1,151 @@
+-- birds-am-fm (af)
+-- http://www.obiwannabe.co.uk/tutorials/html/tutorial_birds.html
+-- perhaps some mis-translations...
+
+-- import Debug.Trace {- base -}
+import System.Random {- random -}
+
+import Sound.SC3 hiding (sweep) {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.Gen as R
+
+-- > audition (out 0 (pd_noise 'a' * 0.1))
+pd_noise :: ID a => a -> UGen
+pd_noise e = whiteNoise e AR
+
+-- > audition (out 0 (pd_lop (pd_noise 'a') 500 * 0.1))
+pd_lop :: UGen -> UGen -> UGen
+pd_lop = lpf -- actually lop is one-pole, lpf is two pole...
+
+-- > audition (out 0 (pd_osc 440 * 0.1))
+pd_osc :: UGen -> UGen
+pd_osc f = sinOsc AR f pi
+
+-- > audition (out 0 (pd_phasor 440 * 0.1))
+pd_phasor :: UGen -> UGen
+pd_phasor f = linLin_b (lfSaw AR f 0) 0 1
+
+-- | Ramp doesn't make sense with a constant input signal.
+--
+-- > audition (out 0 (pd_osc (pd_line (lfNoise0 'a' AR 0.5) 300 * 500 + 300) * 0.1))
+pd_line :: UGen -> UGen -> UGen
+pd_line x msec = if isConstant x then x else ramp x (msec / 1000)
+
+-- > audition (out 0 (pd_clip (pd_osc 220) (-0.05) 0.05))
+pd_clip :: UGen -> UGen -> UGen -> UGen
+pd_clip = clip
+
+-- > audition (out 0 (pd_cos (pd_phasor 440) * 0.1))
+pd_cos :: Floating a => a -> a
+pd_cos i = cos (i * 2 * pi)
+
+-- > audition (out 0 (pd_vcf (pd_noise 'a') (pd_phasor 0.1 * 500 + 200) 6 * 0.1))
+pd_vcf :: UGen -> UGen -> UGen -> UGen
+pd_vcf i cf q = bpf i cf (1 / q)
+
+data B n = B {artic :: n
+             ,tweet :: n
+             ,syr1a :: n
+             ,syr1m :: n
+             ,syr2a :: n
+             ,syr2m :: n
+             ,basef :: n
+             ,sweep :: n
+             ,moda :: n
+             ,modb :: n
+             ,tf1 :: n
+             ,tb1 :: n
+             ,tf2 :: n
+             ,tb2 :: n
+             ,reson :: n
+             ,vol :: n}
+         deriving (Show)
+
+square :: Num a => a -> a
+square n = n * n
+
+-- > let (_,o) = autotweet (presets !! 0)
+-- > Sound.SC3.UGen.Dot.draw o
+-- > audition (out 0 (sinOsc AR (sqrt o * 1000) 0 * 0.1))
+autotweet :: B UGen -> (UGen,UGen)
+autotweet b_data =
+    let artic' = pd_line (artic b_data) 300
+        tweet' = tweet b_data * 3
+        ph = let x = abs (pd_lop (pd_noise 'a') 0.01) * (tweet' * 1000)
+                 y = pd_osc x * (x * tweet')
+             in pd_lop (pd_phasor y) 2
+    in (ph,square (pd_cos (pd_clip (artic' - ph) (-0.25) 0.25)))
+
+type TW = (UGen, UGen, UGen, UGen, UGen, UGen, UGen)
+
+-- > Sound.SC3.UGen.Dot.draw (tweetypie (1,2,3,4,5,6,7))
+tweetypie :: TW -> UGen
+tweetypie (a,b,c,d,e,f,g) =
+    let m = pd_osc (pd_osc a * pd_osc b * c + d)
+    in pd_lop ((pd_vcf m e g + pd_vcf m f g) * 0.5) 5000
+
+modmatrix :: UGen -> B UGen -> TW
+modmatrix modall b_data =
+    let get var mul tm = pd_line (var b_data * mul) tm
+        syr1a' = get syr1a 3000 300
+        syr1m' = get syr1m 200 500
+        syr2a' = get syr2a 3000 300
+        syr2m' = get syr2m 200 500
+        basef' = get basef 5000 300
+        sweep' = get sweep 3000 300
+        moda' = get moda 2000 300
+        modb' = get modb 50 300
+        tf1' = get tf1 3000 300
+        tb1' = get tb1 3000 300
+        tf2' = get tf2 3000 300
+        tb2' = get tb2 3000 300
+        reson' = reson b_data * 20 + 2
+        a = (syr1a' * modall) + syr2a'
+        b = let p = syr1a' + syr1m'
+                q = p * modall
+                r = syr2a' + syr2m'
+            in q + r
+        c = modall * moda' * modb'
+        d = (modall * sweep') + basef'
+        e = (modall * tf1') + tb1'
+        f = (modall * tf2') + tb2'
+    in (a,b,c,d,e,f,reson')
+
+-- > Sound.SC3.UGen.Dot.draw (birdbox (presets !! 0))
+birdbox :: B UGen -> UGen
+birdbox b_data =
+    let (modall,a) = autotweet b_data
+        tw = tweetypie (modmatrix modall b_data)
+        a' = sqrt a * 1000
+    in pd_vcf tw a' 0.1 * vol b_data
+
+presets :: Fractional n => [B n]
+presets =
+    [B 0.683544 0.658228 0.177215 0.0886076 0.911392 0.0126582 0.291139 0.772152 0.0886076 0.632911 0.316456 0.860759 0.227848 0.620253 0.417722 0.199808
+    ,B 0.683544 0.582278 0.405063 0.78481 0.911392 0.0126582 0.848101 0.0506329 0.0886076 0.632911 0.316456 0.240506 0.113924 0.620253 0.417722 0.199808
+    ,B 0.924051 0.936709 0.886076 0.78481 0 0.291139 0.126582 0.721519 0.0253165 0.189873 0.0759494 0.810127 0.329114 0.139241 0.0759494 0.243502
+    ,B 0.455696 0.620253 0 0.0506329 0.0126582 0.0126582 0.56962 1 0.0506329 0.620253 0.949367 0.810127 0.848101 0.683544 0.0886076 0.127144
+    ,B 0.21519 0.518987 0.379747 1 0.0126582 0.0126582 0.405063 1 0.0506329 0.620253 0.949367 0.164557 0.848101 0.164557 0.746835 0.372008
+    ,B 0.886076 0.518987 0 0.0632911 0.0126582 0.0126582 0.278481 0.417722 0.0506329 0.278481 0.443038 0.164557 0.544304 0.164557 0.746835 0.372008
+    ,B 0.962025 0.898734 0 0.278481 0.164557 0.822785 0.0759494 0.417722 0.556962 0.113924 0.291139 0.126582 0.544304 0.151899 0.911392 0.372008
+    ,B 0.164557 0.974684 0.734177 0.670886 0.240506 0.202532 0.227848 0.392405 0.0253165 0.392405 0.291139 0.126582 0.544304 0.734177 0.379747 0.868261
+    ,B 0.708861 0.721519 0.253165 0.0759494 0.658228 0.177215 0.746835 0.202532 0.329114 0.202532 0.417722 0.177215 0.392405 0.405063 1 0.314002
+    ,B 0.392405 0.721519 0.0759494 0.316456 0.658228 0.177215 0.177215 0.848101 0.0886076 0.202532 0.417722 0.177215 0.392405 0.405063 1 0.314002
+    ,B 0.379747 0.962025 0.265823 0.0126582 0.0886076 0.177215 0.721519 0.139241 0.113924 0.139241 0.0759494 0.759494 0.936709 0.911392 0.848101 0.314002
+    ,B 0.291139 0.556962 0.0632911 0.0253165 0.0506329 0.0379747 0.0759494 0 0.177215 0.227848 0.0759494 0.240506 0.0379747 0.506329 0.924051 0.314002
+    ,B 0.848101 0.772152 0.367089 0.189873 0.35443 0.0506329 0.0126582 0.177215 0.101266 0.0253165 0.924051 0.0886076 1 0.0886076 0.455696 0.732876]
+
+-- B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+-- > hearb (presets !! 4)
+hearb :: B UGen -> IO ()
+hearb = audition . out 0 . birdbox
+
+main :: IO ()
+main = do
+  let f g = let (p,g') = R.choose presets g in (birdbox p,g')
+  overlapTextureS (20,4,5,maxBound) f =<< getStdGen
+
+-- Local Variables:
+-- truncate-lines:t
+-- End:
diff --git a/gr/birds-hp.hs b/gr/birds-hp.hs
--- a/gr/birds-hp.hs
+++ b/gr/birds-hp.hs
@@ -2,21 +2,22 @@
 -- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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))
+  let f = lag (lfSaw AR (7 + #(randM (-1.5) 1.5)) #(randM 0 1) * #(randM 11 15)) 0.1 + #(randM 94 102)
+  let a = lfPulse KR (1 / #(randM 12 15.6)) #(randM 0 1) 0.16 * 0.05
+  let b = sinOsc AR (midiCPS f) #(randM 0 1) * a
+  return (rotate2 b (silent 1) #(randM (-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
+  let f i = do return (allpassL i 0.07 #(randM 0 0.06) #(randM 0.7 2.0))
+  w <- chainM 12 f d
   return (d * 0.7 + w * 0.3)
 
+-- > birds >>= putStrLn . synthstat
 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,28 +1,29 @@
 -- birds (jmcc)
 -- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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 node = do r1 <- randM 94.0 102.0
+                r2 <- randM (-1.5) 1.5
+                r3 <- randM 0.0 1.0
+                r4 <- randM 11.0 15.0
+                r5 <- randM 0.0 1.0
+                r6 <- randM 12.0 15.6
+                r7 <- randM 0.0 1.0
+                r8 <- randM (-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
+      apf i = do r1 <- randM 0.0 0.06
+                 r2 <- randM 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)
 
+-- > birds >>= putStrLn . synthstat
 main :: IO ()
 main = audition . out 0 =<< birds
diff --git a/gr/birds.hs b/gr/birds.hs
new file mode 100644
--- /dev/null
+++ b/gr/birds.hs
@@ -0,0 +1,21 @@
+-- birds (jmcc)
+
+import Sound.SC3 {- hsc3 -}
+
+node :: UGen
+node =
+  let f = lag (lfSaw AR (7 + rand 'α' (-1.5) 1.5) (rand 'β' 0 1) * rand 'γ' 11 15) 0.1 + rand 'δ' 94 102
+      a = lfPulse KR (1 / rand 'ε' 12 15.6) (rand 'ζ' 0 1) 0.16 * 0.05
+      b = sinOsc AR (midiCPS f) (rand 'η' 0 1) * a
+  in rotate2 b (silent 1) (rand 'θ' (-1) 1)
+
+-- > putStrLn$synthstat birds
+birds :: UGen
+birds =
+  let d = mix (uclone 'α' 6 node)
+      f i = allpassL i 0.07 (rand 'β' 0 0.06) (rand 'γ' 0.7 2.0)
+      w = useq 'δ' 12 f d
+  in d * 0.7 + w * 0.3
+
+main :: IO ()
+main = audition (out 0 birds)
diff --git a/gr/bit-reduction.hs b/gr/bit-reduction.hs
--- a/gr/bit-reduction.hs
+++ b/gr/bit-reduction.hs
@@ -1,6 +1,6 @@
 -- bit reduction (adc)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 sample_rate_decrease :: UGen
 sample_rate_decrease =
diff --git a/gr/bitwise.hs b/gr/bitwise.hs
--- a/gr/bitwise.hs
+++ b/gr/bitwise.hs
@@ -13,7 +13,7 @@
               ((t *  5) .&. (t .>>. (mce2 3 4))) .|.
               ((t *  2) .&. (t .>>. 9)) .|.
               ((t *  8) .&. (t .>>. 11))) - 3) .%. 256
-    in tanh (hpf (((s / 127) - 1) * 3) 20)
+    in tanh (hpf (((s / 127) - 1) * 3) 20) * 0.02
 
 main :: IO ()
 main = audition (out 0 bitwise_operators)
diff --git a/gr/bitwise.scd b/gr/bitwise.scd
--- a/gr/bitwise.scd
+++ b/gr/bitwise.scd
@@ -5,4 +5,4 @@
            ((t *  5) & (t >> [3,4])) |
            ((t *  2) & (t >> 9)) |
            ((t *  8) & (t >> 11))) - 3) % 256
-;HPF.ar(((s / 127) - 1) * 3, 20).tanh}.play
+;HPF.ar(((s / 127) - 1) * 3, 20).tanh * 0.02}.play
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
@@ -1,10 +1,10 @@
 -- http://www.listarc.bham.ac.uk/lists/sc-users/msg08240.html (jrhb)
 
 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 -}
+
+import Sound.SC3 {- hsc3 -}
 
 nth_prime :: Integral a => Int -> a
 nth_prime j = primes !! j
diff --git a/gr/blips-001-hp.hs b/gr/blips-001-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/blips-001-hp.hs
@@ -0,0 +1,33 @@
+-- blips 001 (jmcc) #SC3d1.5
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: UId m => UGen -> m UGen
+rand2 n = randM (-n) n
+
+blips_001 :: UId m => m UGen
+blips_001 = do
+  let c = #(randM 0 1) <* 0.8
+  let b = do
+        let f = xLine KR #(expRandM 0.25 400) #(expRandM 0.25 400) 4 DoNothing
+        let nh = xLine KR #(expRandM 2 100) #(expRandM 2 100) 4 DoNothing
+        return (blip AR f nh)
+  return (c * pan2 (#(b) * #(b)) (line KR #(rand2 1) #(rand2 1) 4 DoNothing) 0.3)
+
+{-
+iter_m :: (Monad m, Num a, Ord a) => (b -> m b) -> a -> b -> m b
+iter_m f n st = if n > 0 then iter_m f (n - 1) =<< f st else return st
+
+postProcess :: UId m => UGen -> m UGen
+postProcess z = do
+  let z' = distort z
+      f x = do
+        return (allpassN x 0.05 (mce2 #(rand 0 0.05) #(rand 0 0.05)) 4)
+  iter_m f 6 z'
+-}
+
+main :: IO ()
+main = overlapTextureU (2,1,12,maxBound) =<< blips_001
+
diff --git a/gr/blips-001-u.hs b/gr/blips-001-u.hs
new file mode 100644
--- /dev/null
+++ b/gr/blips-001-u.hs
@@ -0,0 +1,33 @@
+-- blips 001 (jmcc) #SC3d1.5
+
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.UGen.Unsafe as U {- hsc3-unsafe -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: UGen -> UGen
+rand2 n = U.rand (-n) n
+
+-- ghci 7.6.3 doesn't see through this...
+blip_001 :: t -> UGen
+blip_001 _ =
+    let f = xLine KR (U.expRand 0.25 400) (U.expRand 0.25 400) 4 DoNothing
+        nh = xLine KR (U.expRand 2 100) (U.expRand 2 100) 4 DoNothing
+    in blip AR f nh
+
+blips_001 :: UGen
+blips_001 =
+    let c = U.rand 0 1 <* 0.8
+        o = blip_001 'α' * blip_001 'β'
+    in (c * pan2 o (line KR (rand2 1) (rand2 1) 4 DoNothing) 0.3)
+
+iter :: (Num a, Ord a) => (t -> t) -> a -> t -> t
+iter f n st = if n > 0 then iter f (n - 1) (f st) else st
+
+postProcess :: UGen -> UGen
+postProcess z =
+    let z' = distort z
+        f x = allpassN x 0.05 (mce2 (U.rand 0 0.05) (U.rand 0 0.05)) 4
+    in iter f 6 z'
+
+main :: IO ()
+main = overlapTextureU_pp (2,1,12,maxBound) blips_001 2 postProcess
diff --git a/gr/blips-001.hs b/gr/blips-001.hs
new file mode 100644
--- /dev/null
+++ b/gr/blips-001.hs
@@ -0,0 +1,30 @@
+-- blips 001 (jmcc) #SC3d1.5
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (-n) n
+
+blip_001 :: ID a => a -> UGen
+blip_001 e =
+    let f = xLine KR (expRand 'α' 0.25 400) (expRand 'β' 0.25 400) 4 DoNothing
+        nh = xLine KR (expRand 'γ' 2 100) (expRand 'δ' 2 100) 4 DoNothing
+    in uprotect e (blip AR f nh)
+
+blips_001 :: UGen
+blips_001 =
+    let c = rand 'ε' 0 1 <* 0.8
+        o = blip_001 'ζ' * blip_001 'η'
+    in (c * pan2 o (line KR (rand2 'θ' 1) (rand2 'ι' 1) 4 DoNothing) 0.3)
+
+-- > let g = blips_pp blips_001
+-- > audition (out 0 (blips_pp blips_001))
+blips_pp :: UGen -> UGen
+blips_pp z =
+    let z' = distort z
+        f x = allpassN x 0.05 (mce2 (rand 'κ' 0 0.05) (rand 'λ' 0 0.05)) 4
+    in useq 'μ' 6 f z'
+
+main :: IO ()
+main = overlapTextureU_pp (2,1,12,maxBound) blips_001 2 blips_pp
diff --git a/gr/blips-001.scd b/gr/blips-001.scd
new file mode 100644
--- /dev/null
+++ b/gr/blips-001.scd
@@ -0,0 +1,19 @@
+// blips 001 (jmcc) #SC3d1.5
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    if(0.8.coin, {
+        var b = {
+            var f = XLine.kr(exprand(0.25, 400), exprand(0.25, 400), 4);
+            var nh = XLine.kr(exprand(2, 100), exprand(2, 100), 4);
+            Blip.ar(f, nh);
+        };
+        Pan2.ar(b.() * b.(),Line.kr(1.0.rand2, 1.0.rand2, 4), 0.3);
+    },{Silent.ar});
+}, 2, 1, 12, postProcess: {
+	arg z;
+    z = z.distort;
+	6.do({z = AllpassN.ar(z, 0.05, [0.05.rand, 0.05.rand], 4)});
+	z;
+});
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,7 +1,7 @@
 -- http://sccode.org/1-W (jj)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 bp140u :: UGen
 bp140u =
@@ -14,6 +14,4 @@
 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
+main = audition (P.sbind1 (bp140,[("dur",P.rand 'δ' [1/6,1/3])]))
diff --git a/gr/bottle-m.hs b/gr/bottle-m.hs
--- a/gr/bottle-m.hs
+++ b/gr/bottle-m.hs
@@ -1,19 +1,19 @@
 -- bottle (sc)
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 bottle :: UId m => m UGen
 bottle = do
-  freq <- rand 220 880
-  wn <- whiteNoise AR
-  pn <- pinkNoise AR
+  freq <- randM 220 880
+  wn <- whiteNoiseM AR
+  pn <- pinkNoiseM 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)
+      rapf i = do x <- linRandM 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
diff --git a/gr/bouncing-objects.hs b/gr/bouncing-objects.hs
new file mode 100644
--- /dev/null
+++ b/gr/bouncing-objects.hs
@@ -0,0 +1,23 @@
+-- bouncing objects (jmcc) #2
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.ID as R {- hsc3-lang -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+
+bouncing_objects :: UGen
+bouncing_objects =
+  let imp_frq = xLine KR (5 + rand 'α' (-2) 2) 600 4 DoNothing
+      imp_amp = xLine KR 0.09 0.000009 4 DoNothing
+      imp = impulse AR imp_frq 0 * imp_amp
+      exc = decay imp 0.001
+      flt_frq = randN 4 'β' 400 8400
+      flt_amp = randN 4 'γ' 0 1
+      flt_rtm = randN 4 'δ' 0.01 0.11
+      flt = klank exc 1 0 1 (klankSpec_mce flt_frq flt_amp flt_rtm)
+      loc = pan2 flt (rand 'ε' (-1) 1) 1
+      e = Envelope [1,1,0] [3,0.001] (replicate 2 EnvLin) Nothing Nothing
+  in loc * envGen KR 1 1 0 1 RemoveSynth e
+
+main :: IO ()
+main = spawnTextureU (\i -> R.rrand i 0.6 1.6,maxBound) bouncing_objects
diff --git a/gr/bouncing-objects.scd b/gr/bouncing-objects.scd
new file mode 100644
--- /dev/null
+++ b/gr/bouncing-objects.scd
@@ -0,0 +1,24 @@
+// bouncing objects (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~spawn.({
+    // impulses trigger decay envelope
+    var imp_frq = XLine.kr(5 + 2.0.rand2, 600, 4); // accelerating frequency
+    var imp_amp = XLine.kr(0.09, 0.000009, 4); // decaying impulse amplitude
+    var imp = Impulse.ar(imp_frq,0,imp_amp);
+    // decays excite filter bank
+    var exc = Decay.ar(imp,0.001);
+    // resonant filter bank simulates resonant modes of bouncing objects
+    var flt_frq = Array.fill(4, { 400 + 8000.0.rand }); // resonant freqs
+    var flt_amp = Array.fill(4, { 1.0.rand });
+    var flt_rtm = Array.fill(4, { 0.01 + 0.1.rand });
+    var flt = Klank.ar(`[flt_frq,flt_amp,flt_rtm],exc);
+    // place each bouncer at a random position in the stereo field
+    var loc = Pan2.ar(flt,1.0.rand2);
+    // 3 second cut off envelope to end sound
+    var e = Env([1, 1, 0],[3, 0.001]);
+    loc * EnvGen.kr(e,doneAction:2);
+}, nextTime: { 0.6 + 0.6.rand });
+
+// lightbulbs, pencils, cans, and other assorted objects
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,19 +1,21 @@
 -- bowed string (jmcc)
 
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
 
+-- > u <- bowed_string
 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
+  n0 <- clone 2 (brownNoiseM AR)
+  r0 <- expRandM 0.125 0.5
+  r1 <- randM 0.7 0.9
+  r2 <- sequence (replicate 12 (randM 1.0 3.0))
+  f <- midiCPS `fmap` (lchooseM scale .+. lchooseM oct)
+  n1 <- lfNoise1M 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)
diff --git a/gr/bowed-string.scd b/gr/bowed-string.scd
--- a/gr/bowed-string.scd
+++ b/gr/bowed-string.scd
@@ -1,13 +1,15 @@
+// bowed string (jmcc)
+
 { var root = 5
 ; var scale = #[0,2,4,5,7,9,11] + root
 ; var oct = #[24,36,48,60,72,84]
 ; var f = (scale.choose + oct.choose).midicps
-; var n0 = BrownNoise.ar().dup
-; var r0 = ExpRand.new(0.125,0.5)
+; var n0 = BrownNoise.ar.dup
+; var r0 = ExpRand(0.125,0.5)
 ; var n1 = LFNoise1.kr(r0)
-; var r1 = Rand.new(0.7,0.9)
-; var r2 = Array.fill(12,{ Rand.new(1.0,3.0) })
+; var r1 = Rand(0.7,0.9)
+; var r2 = Array.fill(12,{ Rand(1.0,3.0) })
 ; var x = n0 * 0.007 * max(0,n1 * 0.6 + 0.4)
 ; var d = `[Array.series(12,f,f),Array.geom(12,1,r1),r2]
 ; var k = Klank.ar(d,x)
-; Out.ar(0,(k * 0.1).softclip) }.play
+; (k * 0.1).softclip }.play
diff --git a/gr/bs-070705-m.hs b/gr/bs-070705-m.hs
--- a/gr/bs-070705-m.hs
+++ b/gr/bs-070705-m.hs
@@ -1,7 +1,7 @@
 -- bs-070705 (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
 
 -- | One step in a bubble sort with specified /greater than/ function.
@@ -31,10 +31,10 @@
 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
+  phase <- dseriesM inf_sc 0 1
+  f' <- dbufrdM 10 phase Loop
+  a' <- dbufrdM 11 phase Loop
+  p' <- dbufrdM 12 phase Loop
   let tr = impulse AR r 0
       f'' = demand tr 0 f'
       a'' = demand tr 0 a'
diff --git a/gr/buffer-display.hs b/gr/buffer-display.hs
--- a/gr/buffer-display.hs
+++ b/gr/buffer-display.hs
@@ -2,7 +2,7 @@
 
 import Control.Concurrent {- base -}
 import qualified Graphics.Rendering.Cairo as C {- cairo -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Cairo.Scope.Shell {- hsc3-cairo -}
 
 -- * Type
@@ -118,7 +118,7 @@
 
 {-
 
-import Sound.SC3.ID
+import Sound.SC3
 
 let s = saw AR (mouseX KR 20 800 Exponential 0.2)
 in audition (out 0 s)
diff --git a/gr/ccomb-m.hs b/gr/ccomb-m.hs
--- a/gr/ccomb-m.hs
+++ b/gr/ccomb-m.hs
@@ -1,20 +1,19 @@
 -- ccomb (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 ccomb :: (Functor m,UId m) => m UGen
 ccomb = do
-  let rng l r i = linLin i (-1) 1 l r
-      lwr = 48
+  let 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
+      spart t = do n <- fmap (range lwr 72.0) (lfNoise2M KR 0.1)
+                   e <- fmap (decay2 t 0.01) (tRandM 0.05 0.75 t)
+                   x <- fmap (* e) (whiteNoiseM AR)
+                   m <- lfNoise2M KR 0.1
                    let f = lag (midiCPS n) 0.25
-                       m' = rng 1 8 m
+                       m' = range 1 8 m
                    return (combC x (recip flwr) (recip f) m')
-  t <- dust KR (mce2 0.75 0.35)
+  t <- dustM KR (mce2 0.75 0.35)
   return . (* 0.1) . sum =<< sequence (replicate 12 (spart t))
 
 main :: IO ()
diff --git a/gr/ccomb.scd b/gr/ccomb.scd
--- a/gr/ccomb.scd
+++ b/gr/ccomb.scd
@@ -3,9 +3,9 @@
 ;var spart = {arg t
               ;{var n = LFNoise2.kr(0.1).range(lwr,72.0)
                ;var e = Decay2.kr(t,0.01,TRand.kr(0.05,0.75,t))
-               ;var x = WhiteNoise.ar() * e
+               ;var x = WhiteNoise.ar * e
                ;var m = LFNoise2.kr(0.1)
                ;var f = Lag.kr(n.midicps,0.25)
                ;CombC.ar(x,flwr.reciprocal,f.reciprocal,m.range(1,8))}}
 ;var t = Dust.kr([0.75,0.35])
-;Out.ar(0,Mix.fill(12,spart.value(t)) * 0.1)}.play
+;Mix.fill(12,spart.(t)) * 0.1}.play
diff --git a/gr/cds-070701-m.hs b/gr/cds-070701-m.hs
--- a/gr/cds-070701-m.hs
+++ b/gr/cds-070701-m.hs
@@ -7,7 +7,7 @@
 -- gives the time interval to step forward.
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 -- | Real
 type R = Double
@@ -67,11 +67,11 @@
 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
+  phase <- dseriesM inf_sc 0 1
+  t' <- dbufrdM 10 phase Loop
+  f' <- dbufrdM 11 phase Loop
+  a' <- dbufrdM 12 phase Loop
+  p' <- dbufrdM 13 phase Loop
   let tr = tDuty AR t' 0 DoNothing 1 0
       f'' = demand tr 0 f'
       a'' = demand tr 0 a'
diff --git a/gr/chain-saw-m.hs b/gr/chain-saw-m.hs
--- a/gr/chain-saw-m.hs
+++ b/gr/chain-saw-m.hs
@@ -4,7 +4,7 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
 
 coinIf :: Double -> a -> a -> IO a
 coinIf n a b = do
@@ -25,10 +25,10 @@
 
 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
+  let f s1 = do xr <- fmap dup (expRandM 0.1 2)
+                n1 <- lfNoise1M KR xr
+                n2 <- lfNoise1M KR xr
+                n3 <- lfNoise1M 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)
diff --git a/gr/chain-saw.scd b/gr/chain-saw.scd
--- a/gr/chain-saw.scd
+++ b/gr/chain-saw.scd
@@ -1,9 +1,9 @@
 { var f = { arg s1
-          ; var rate = ExpRand.new(0.1, 2).dup
+          ; var rate = ExpRand(0.1, 2).dup
           ; var n1 = { LFNoise1.kr(rate).exprange(0.01, 10) }
           ; var n2 = { LFNoise1.kr(rate).exprange(10, 50) }
           ; var n3 = LFNoise1.kr(rate).exprange(2, 10)
-          ; var f1 = if(0.6.coin) { n1.value } { n2.value }
+          ; var f1 = if(0.6.coin) { n1.() } { n2.() }
           ; var s2 = [1 - s1, s1.reverse].choose
           ; var f2 = LinExp.kr(s1, -1, 1, f1, f1 * n3)
           ; var u1 = LFSaw.kr(f2, 0)
@@ -15,7 +15,7 @@
           ; func }
 ; var inp = LFSaw.kr(0.2 * [1, 1.1], 0)
 ; var b_freq = [70, 800, 9000, 5242]
-; var ff = g.(f, 4).value(inp)
+; var ff = g.(f, 4).(inp)
 ; var c_saw = Saw.ar(ff.exprange(6, 11000)).product
 ; var b_saw = BPF.ar(c_saw, b_freq, 0.2).sum.dup
-; Out.ar(0, b_saw * 0.3) }.play
+; b_saw * 0.3 }.play
diff --git a/gr/choip.hs b/gr/choip.hs
--- a/gr/choip.hs
+++ b/gr/choip.hs
@@ -1,8 +1,7 @@
--- choip (jmcc)
+-- choip (jmcc) #10
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 xl :: ID a => a -> a -> UGen -> UGen -> UGen -> UGen
@@ -16,7 +15,7 @@
     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
+        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
 
@@ -26,4 +25,4 @@
     in useq 'κ' 4 f
 
 main :: IO ()
-main = overlapTextureU_pp (1,10,8,maxBound) choip 2 choip_pp
+main = overlapTextureU_pp (10,1,8,maxBound) choip 2 choip_pp
diff --git a/gr/choip.scd b/gr/choip.scd
--- a/gr/choip.scd
+++ b/gr/choip.scd
@@ -1,9 +1,17 @@
-var t = 12;
-var z = OverlapTexture.ar({
-  var i = Impulse.ar(XLine.kr(exprand(1,30),exprand(1,30),t));
-  var f = XLine.kr(exprand(600.0,8000.0),exprand(600.0,8000.0),t);
-  var a = SinOsc.ar(Decay2.ar(impulses,0.05,0.5,-0.9*f,f));
-  var l = Line.kr(1.0.rand2,1.0.rand2,t);
-  var j = XLine.kr(exprand(0.01,0.5),exprand(0.01,0.5),t);
-  Pan2.ar(Decay2.ar(i * j,0.01,0.2,a),l)},t-2,1,8,2);
-4.do({z = AllpassN.ar(z,0.1,[0.05.rand,0.05.rand],4)});
+// choip (jmcc) #10
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var t = 12;
+    var i = Impulse.ar(XLine.kr(exprand(1,30),exprand(1,30),t));
+    var f = XLine.kr(exprand(600.0,8000.0),exprand(600.0,8000.0),t);
+    var a = SinOsc.ar(Decay2.ar(i,0.05,0.5,-0.9*f,f));
+    var l = Line.kr(1.0.rand2,1.0.rand2,t);
+    var j = XLine.kr(exprand(0.01,0.5),exprand(0.01,0.5),t);
+    Pan2.ar(Decay2.ar(i * j,0.01,0.2,a),l);
+},sustainTime:10,transitionTime:1,overlap:8,postProcess:{
+    arg z;
+    4.do({ z = AllpassN.ar(z, 0.1, [0.05.rand,0.05.rand], 4)});
+    z;
+});
diff --git a/gr/chrd-m.hs b/gr/chrd-m.hs
--- a/gr/chrd-m.hs
+++ b/gr/chrd-m.hs
@@ -1,13 +1,13 @@
 -- chrd (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  r0 <- randM 0.05 0.5
+  [r1, r2] <- sequence (replicate 2 (randM (-1) 1))
+  r3 <- randM 0.15 0.35
+  r4 <- randM 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])
diff --git a/gr/chrd.scd b/gr/chrd.scd
--- a/gr/chrd.scd
+++ b/gr/chrd.scd
@@ -1,8 +1,8 @@
-{ var chrd = { var r0 = Rand.new(0.05, 0.5)
-             ; var r1 = Rand.new(-1, 1)
-             ; var r2 = Rand.new(-1, 1)
-             ; var r3 = Rand.new(0.15, 0.35)
-             ; var r4 = Rand.new(0.005, 0.01)
+{ var chrd = { var r0 = Rand(0.05, 0.5)
+             ; var r1 = Rand(-1, 1)
+             ; var r2 = Rand(-1, 1)
+             ; var r3 = Rand(0.15, 0.35)
+             ; var r4 = Rand(0.005, 0.01)
              ; var m = [60, 65, 72, 77, 79, 84]
              ; var ds = 3
              ; var d = [5, 4, 5, 7, 4, 5] * ds
@@ -13,4 +13,4 @@
              ; var p = XLine.kr(r1, r2, d)
              ; var o = SinOsc.ar(f, 0)
              ; Mix.ar(Pan2.ar(o, p, e)) }
-; Out.ar(0, Mix.fill(9, chrd)) }.play
+; Mix.fill(9, chrd) }.play
diff --git a/gr/clustered-sines-m.hs b/gr/clustered-sines-m.hs
--- a/gr/clustered-sines-m.hs
+++ b/gr/clustered-sines-m.hs
@@ -1,16 +1,16 @@
--- clustered sines (jmcc)
+-- clustered sines (jmcc) #2
 
 import Control.Monad {- base -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  f1 <- randM 100 1100
   let f2 = 4 * f1
-  y <- replicateM n (f1 +. rand 0 f2)
+  y <- replicateM n (f1 +. randM 0 f2)
   let sp = klangSpec y (map (f1 /) y) (replicate n 0)
   return (klang AR 1 0 sp * (0.3 / fromIntegral n))
 
diff --git a/gr/clustered-sines.hs b/gr/clustered-sines.hs
--- a/gr/clustered-sines.hs
+++ b/gr/clustered-sines.hs
@@ -1,7 +1,6 @@
--- clustered sines (jmcc)
+-- clustered sines (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 -- > synthstat cs
@@ -10,9 +9,9 @@
     let n = 80
         f1 = rand 'α' 100 1100
         f2 = 4 * f1
-        sp = let y = uclone' 'α' n (f1 + rand 'α' 0 f2)
+        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))
+    in uclone 'δ' 2 (klang AR 1 0 sp * (0.3 / fromIntegral n))
 
 main :: IO ()
 main = xfadeTextureU (4,4,maxBound) cs
diff --git a/gr/clustered-sines.scd b/gr/clustered-sines.scd
new file mode 100644
--- /dev/null
+++ b/gr/clustered-sines.scd
@@ -0,0 +1,17 @@
+// clustered sines (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~xfade_texture.({
+    var n = 80;
+    var f1 = 100 + 1000.0.rand;
+    var f2 = 4.0 * f1;
+    var z = Array.fill(2, {
+        `[  // sine oscil bank specification :
+            y = Array.fill(n, { f1 + f2.rand} ), // frequencies
+            f1 / y, // amplitudes
+            nil // phases default to zero
+        ]
+    });
+    Klang.ar(z, 1, 0) * (0.3/n);
+}, 4, 4);
diff --git a/gr/comb-delay-sweeps.hs b/gr/comb-delay-sweeps.hs
--- a/gr/comb-delay-sweeps.hs
+++ b/gr/comb-delay-sweeps.hs
@@ -1,6 +1,6 @@
--- comb delay sweeps (jmcc)
+-- comb delay sweeps (jmcc) #6
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 import System.Random {- random -}
 
@@ -14,7 +14,6 @@
        ,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
@@ -23,7 +22,21 @@
         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))
+    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)
+
+cds' :: UGen
+cds' =
+    let s = fold (rand 'α' (- 7) 8) 50 120
+        e = fold (rand 'β' (- 7) 8) 50 120
+        l = line KR s e 4 DoNothing
+        w = whiteNoise 'γ' AR * 0.005
+        d = 1 / midiCPS l
+        c = 1 / midiCPS s
+        o = combC w 0.01 d (c * 1000)
+    in pan2 o (rand 'δ' (-1) 1) 1
+
+main' :: IO ()
+main' = overlapTextureU (4/3,4/3,9,maxBound) cds'
diff --git a/gr/comb-delay-sweeps.scd b/gr/comb-delay-sweeps.scd
new file mode 100644
--- /dev/null
+++ b/gr/comb-delay-sweeps.scd
@@ -0,0 +1,17 @@
+// comb delay sweeps (jmcc) #6
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    arg dur;
+    {
+        var note = 50 + 70.rand;
+        var endNote = (note + 15.rand - 7).fold(50,120);
+        var note_ = (note + 15.rand - 7).fold(50,120);
+        var endNote_ = (endNote + 15.rand - 7).fold(50,120);
+        var noteSweep = Line.kr(note_, endNote_, dur);
+        var dt = 1/noteSweep.midicps;
+        var dc = 1/note_.midicps * 1000;
+        Pan2.ar(CombC.ar(WhiteNoise.ar(0.005), 0.01, dt, dc),1.0.rand2);
+    }
+}.(4),sustainTime:4/3,transitionTime:4/3,overlap:6);
diff --git a/gr/contamination-zone.hs b/gr/contamination-zone.hs
--- a/gr/contamination-zone.hs
+++ b/gr/contamination-zone.hs
@@ -1,8 +1,7 @@
--- contamination zone (jmcc)
+-- contamination zone (jmcc) #9
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 cz :: UGen
@@ -19,6 +18,7 @@
         a = lfPulse KR (linRand 'ι' 0 150 0) 0 (rand 'κ' 0.2 0.4)
     in pan2 r (lfNoise1 'λ' KR (rand 'μ' 0 1)) a
 
+-- > let g = cz_pp (silent 1)
 cz_pp :: UGen -> UGen
 cz_pp =
     let f x = allpassN x 0.04 (randN 2 'ν' 0 0.04) 16
diff --git a/gr/contamination-zone.scd b/gr/contamination-zone.scd
new file mode 100644
--- /dev/null
+++ b/gr/contamination-zone.scd
@@ -0,0 +1,27 @@
+// contamination zone (jmcc) #9
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var f = exprand(800, 8000);
+    Pan2.ar(
+        RLPF.ar(
+            Klank.ar(
+                `[
+                    Array.rand(4, 50.0, 2000.0),
+                    nil,
+                    Array.rand(4, 0.2, 4.0)
+                ],
+                PinkNoise.ar(LFNoise1.kr(3.0.rand, 0.0008, 0.0022))
+            ).abs * #[-1, 1].choose,
+            SinOsc.kr(1.0.linrand, 0, 0.7 * f, f),
+            0.1
+        ),
+        LFNoise1.kr(1.0.rand),
+        LFPulse.kr(15.0.linrand, 0, 0.2 + 0.2.rand)
+    )
+}, 8, 3, 4, postProcess: {
+    arg z;
+    6.do({ z = AllpassN.ar(z, 0.1, [0.05.rand,0.05.rand], 4)});
+    z;
+});
diff --git a/gr/coolant.hs b/gr/coolant.hs
--- a/gr/coolant.hs
+++ b/gr/coolant.hs
@@ -1,7 +1,6 @@
--- coolant (jmcc)
+-- coolant (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 coolant :: UGen
@@ -14,4 +13,4 @@
     in klank s 1 0 1 (mceTranspose sp)
 
 main :: IO ()
-main = xfadeTextureU (4,4,maxBound) coolant
+main = overlapTextureU (4,4,2,maxBound) coolant
diff --git a/gr/coolant.scd b/gr/coolant.scd
new file mode 100644
--- /dev/null
+++ b/gr/coolant.scd
@@ -0,0 +1,11 @@
+// coolant (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var p = 10;
+    Klank.ar([
+        `[Array.fill(p, { 40 + 2000.0.rand }),nil,nil],
+        `[Array.fill(p, { 40 + 2000.0.rand }),nil,nil]],
+        OnePole.ar(BrownNoise.ar([0.002,0.002]),0.95));
+},sustainTime:4,transitionTime:4,overlap:2);
diff --git a/gr/cricket-m.hs b/gr/cricket-m.hs
--- a/gr/cricket-m.hs
+++ b/gr/cricket-m.hs
@@ -1,17 +1,17 @@
 -- cricket (rd)
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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)
+  r1 <- clone 2 (randM 10 13)
+  r2 <- clone 2 (randM 10 13)
+  r3 <- clone 2 (randM 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)
+  r4 <- clone 2 (tRandM 2130 2230 t)
   return (sinOsc AR r4 0 * f * 0.25)
 
 main :: IO ()
diff --git a/gr/cricket.scd b/gr/cricket.scd
--- a/gr/cricket.scd
+++ b/gr/cricket.scd
@@ -1,8 +1,8 @@
-{ var r1 = Array.fill(2, { Rand.new(10, 13) })
-; var r2 = Array.fill(2, { Rand.new(10, 13) })
-; var r3 = Array.fill(2, { Rand.new(4, 7) })
+{ var r1 = Array.fill(2, { Rand(10, 13) })
+; var r2 = Array.fill(2, { Rand(10, 13) })
+; var r3 = Array.fill(2, { Rand(4, 7) })
 ; var t = Impulse.kr(0.7, 0)
 ; var e = Decay2.kr(Impulse.kr(r1, 0), 0.001, 0.005)
 ; var f = SinOsc.kr(r2, 0) * e * r3
 ; var r4 = Array.fill(2, { TRand.kr(2220, 2227, t) })
-; Out.ar(0, SinOsc.ar(r4, 0) * f * 0.25) }.play
+; SinOsc.ar(r4, 0) * f * 0.25 }.play
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 (rd)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 crotale_sine :: UGen
 crotale_sine =
@@ -11,27 +11,28 @@
         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'
+            let k = floor f' :: Int
+                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)
+                r0 = rand (k + 0) 0 (2 * pi)
+                r1 = rand (k + 1) 0.1 0.3
+                r2 = rand (k + 2) 0.025 0.1
+                r3 = rand (k + 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 :: P.Param
 pattern =
-    [(K_param "m",pwhitei 'α' 0 12 inf)
-    ,(K_dur,pxrand 'β' [1,2,3] inf)
-    ,(K_sustain,6)]
+    [("m",map roundE (P.white 'α' 0 12))
+    ,("dur",P.xrand 'β' [1,2,3])
+    ,("sustain",repeat 6)]
 
 main :: IO ()
 main = do
   let s = synthdef "crotale-sine" (out 0 crotale_sine)
-  audition (p_with (K_instr,psynth s) (pbind pattern))
+  audition (P.sbind1 (s,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
@@ -1,6 +1,6 @@
 -- crotale (rd)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 crotale :: UGen
 crotale =
diff --git a/gr/crotale.scd b/gr/crotale.scd
--- a/gr/crotale.scd
+++ b/gr/crotale.scd
@@ -152,7 +152,7 @@
 ; var ca = crotale[1]
 ; var cd = crotale[2]
 ; var ps = [-12, -5, 0, 2, 4, 5, 7, 12]
-; var n = PinkNoise.ar()
+; var n = PinkNoise.ar
 ; var t = Dust.kr(3)
 ; var fs = Select.kr(TIRand.kr(0, 7, t), ps)
 ; var g = TRand.kr(0, 1, t)
@@ -161,4 +161,4 @@
 ; var p = TRand.kr(-1, 1, t)
 ; var s = Decay2.kr(t, 0.06, 0.01) * n * g
 ; var k = DynKlank.ar(`[cf, ca, cd.reciprocal], s, fs.midiratio, fo, ds)
-; Out.ar(0, Pan2.ar(k, p, 1)) }.play
+; Pan2.ar(k, p, 1) }.play
diff --git a/gr/cut-outs-m.hs b/gr/cut-outs-m.hs
--- a/gr/cut-outs-m.hs
+++ b/gr/cut-outs-m.hs
@@ -1,18 +1,18 @@
 -- cut-outs (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+      n = do n1 <- lfNoise0M KR 2
+             n2 <- coinGateM (0.05 + n1 + y * 0.4 + t * 0.5) (t * 0.5)
+             n3 <- tExpRandM (mce2 500 900) 1600 t
              return (ringz n2 n3 x)
   s <- fmap sum (sequence (replicate 3 n))
-  b <- tRand 0 1 =<< dust KR 8
+  b <- tRandM 0 1 =<< dustM KR 8
   return (mrg [clip2 s (in' 1 KR 0) * 0.25,out 0 b])
 
 main :: IO ()
diff --git a/gr/cut-outs.scd b/gr/cut-outs.scd
--- a/gr/cut-outs.scd
+++ b/gr/cut-outs.scd
@@ -8,4 +8,4 @@
 ; var s = Mix.fill(3, n)
 ; var b = TRand.kr(0, 1, Dust.kr(8))
 ; Out.kr(0, b)
-; Out.ar(0, s.clip2(In.kr(0, 1)) * 0.25) }.play
+; s.clip2(In.kr(0, 1)) * 0.25 }.play
diff --git a/gr/cymbalism-accelerando.hs b/gr/cymbalism-accelerando.hs
--- a/gr/cymbalism-accelerando.hs
+++ b/gr/cymbalism-accelerando.hs
@@ -1,6 +1,6 @@
--- cymbalism accellerando (jmcc)
+-- cymbalism accelerando (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 enumFromN :: Enum a => a -> Int -> [Int]
diff --git a/gr/cymbalism-accelerando.scd b/gr/cymbalism-accelerando.scd
new file mode 100644
--- /dev/null
+++ b/gr/cymbalism-accelerando.scd
@@ -0,0 +1,19 @@
+// cymbalism accelerando (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~xfade_texture.({
+    var p = 15; // number of partials per channel per 'cymbal'.
+    var f1 = 500 + 2000.0.rand;
+    var f2 = 8000.0.rand;
+    var z = Array.fill(2, {
+        `[  // sine oscil bank specification:
+            y = Array.fill(p, { f1 + f2.rand} ), // frequencies
+            nil, // amplitudes default to 1.0
+            Array.fill(p, { 1.0 + 4.0.rand }) // ring times
+        ]
+    });
+    var tf = XLine.kr(4.0.linrand + 0.5, 35.0.rand + 0.5, 12);
+    var t = Impulse.ar(tf);
+    Klank.ar(z, Decay.ar(t, 0.004, WhiteNoise.ar(0.02)));
+}, 4, 4);
diff --git a/gr/cymbalism-m.hs b/gr/cymbalism-m.hs
--- a/gr/cymbalism-m.hs
+++ b/gr/cymbalism-m.hs
@@ -1,19 +1,20 @@
--- cymbalism (jmcc)
+-- cymbalism (jmcc) #2
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
+-- > g <- cymbalism
 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))
+  f1 <- randM 500 2500
+  f2 <- randM 0 8000
+  let y = do f <- sequence (p (randM f1 (f1 + f2)))
+             rt <- sequence (p (randM 1 5))
              return (klankSpec f (p 1) rt)
   z <- clone 2 y
-  n <- fmap (* 0.03) (whiteNoise AR)
-  tf <- rand 0.5 3.5
+  n <- fmap (* 0.03) (whiteNoiseM AR)
+  tf <- randM 0.5 3.5
   let t = impulse AR tf 0
       s = decay t 0.004 * n
   return (klank s 1 0 1 (mceTranspose z))
diff --git a/gr/cymbalism.scd b/gr/cymbalism.scd
--- a/gr/cymbalism.scd
+++ b/gr/cymbalism.scd
@@ -1,11 +1,16 @@
+// cymbalism (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~xfade_texture.(
 {var p = 15
-;var f1 = Rand.new(500,2500)
-;var f2 = Rand.new(0,8000)
-;var y = {var f = Array.fill(p,{f1 + Rand.new(0,f2)} )
-         ;var rt = Array.fill(p,{1 + Rand.new(0,4)})
+;var f1 = Rand(500,2500)
+;var f2 = Rand(0,8000)
+;var y = {var f = Array.fill(p,{f1 + Rand(0,f2)})
+         ;var rt = Array.fill(p,{1 + Rand(0,4)})
          ;`[f,nil,rt]}
 ;var z = Array.fill(2,y)
-;var t = Impulse.ar(Rand.new(0,3) + 0.5,0)
-;var n = WhiteNoise.ar() * 0.03
+;var t = Impulse.ar(Rand(0,3) + 0.5,0)
+;var n = WhiteNoise.ar * 0.03
 ;var s = Decay.ar(t,0.004) * n
-;Out.ar(0,Klank.ar(z,s))}.play
+;Klank.ar(z,s)},4,4);
diff --git a/gr/dark-sea-horns-hp.hs b/gr/dark-sea-horns-hp.hs
--- a/gr/dark-sea-horns-hp.hs
+++ b/gr/dark-sea-horns-hp.hs
@@ -1,15 +1,15 @@
 -- 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 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 dark_sea_horns :: UId m => m UGen
 dark_sea_horns = do
-  let n = lfNoise1
-  let x = localIn 2 AR
+  let n = lfNoise1M
+  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 f i = do return (allpassN i 0.3 #(randNM 2 0.1 0.3) 5)
   let o = tanh #(chainM 9 f a)
   return (mrg2 o (localOut o))
 
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
@@ -1,13 +1,12 @@
 -- http://sccode.org/1-j#c51 (jl)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 dark_sea_horns :: UGen
 dark_sea_horns =
     let n = lfNoise1
-        x = localIn 2 AR
+        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)
diff --git a/gr/data-space-hp.hs b/gr/data-space-hp.hs
--- a/gr/data-space-hp.hs
+++ b/gr/data-space-hp.hs
@@ -1,12 +1,12 @@
--- data space (jmcc)
+-- data space (jmcc) #2
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 data_space :: UId m => m UGen
 data_space = do
-    let r = rand 0
+    let r = randM 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)
@@ -14,9 +14,9 @@
     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
+    dt <- randM 0.15 0.35
     let o = lfPulse AR f 0 0.5 * 0.04
-    l <- lfNoise0 KR #(r 3) .* 0.8
+    l <- lfNoise0M KR #(r 3) .* 0.8
     return (combL (pan2 o l 1) dt dt 3)
 
 main :: IO ()
diff --git a/gr/data-space.hs b/gr/data-space.hs
--- a/gr/data-space.hs
+++ b/gr/data-space.hs
@@ -1,6 +1,6 @@
--- data space (jmcc)
+-- data space (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 data_space :: UGen
diff --git a/gr/data-space.scd b/gr/data-space.scd
new file mode 100644
--- /dev/null
+++ b/gr/data-space.scd
@@ -0,0 +1,14 @@
+// data space (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var dt = 0.25.rand + 0.1;
+    var osc = {
+        arg n;
+        var e = LFPulse.kr(4.0.rand, 0, 1.0.rand, 8000.rand, 2000.rand);
+        LFPulse.kr(n.rand, 0, 1.0.rand, e)
+    };
+    var freq = osc.(200) + osc.(20) + osc.(20);
+    CombL.ar(Pan2.ar(LFPulse.ar(freq, 0, 0.5, 0.04), LFNoise0.kr(3.0.rand, 0.8)), dt, dt, 3);
+},sustainTime:6,transitionTime:1,overlap:4);
diff --git a/gr/deep-sea.hs b/gr/deep-sea.hs
--- a/gr/deep-sea.hs
+++ b/gr/deep-sea.hs
@@ -1,12 +1,7 @@
 -- deep sea (jrhb)
 
-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)
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 deep_sea :: UGen
 deep_sea =
@@ -21,7 +16,7 @@
         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)
+        f2 = f * ((count `modE` range (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]
@@ -29,5 +24,5 @@
 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
+      sc = P.sbind1 (s,[("dur",P.xrand 'ζ' [0.25,0.5,1,2])])
+  audition sc
diff --git a/gr/deep-sea.scd b/gr/deep-sea.scd
--- a/gr/deep-sea.scd
+++ b/gr/deep-sea.scd
@@ -1,10 +1,10 @@
 { var amp = 1
 ; var pan = 0
 ; var variation = 0.9
-; var n = Rand.new(7, 46)
-; var dt1 = 25.0 + Rand.new(-1.7, 1.7)
+; var n = Rand(7, 46)
+; var dt1 = 25.0 + Rand(-1.7, 1.7)
 ; var dt2 = (dt1 + LFNoise2.kr(2)) * variation * 0.001
-; var freq = 901 + Rand.new(0, 65)
+; var freq = 901 + Rand(0, 65)
 ; var t = Impulse.ar(dt2.reciprocal, 0, 100)
 ; var count = PulseCount.ar(t, 0)
 ; var mul = count < n
@@ -12,4 +12,4 @@
 ; var freq2 = freq * ((count % LFNoise1.kr(1).range(2, 20)) + 1)
 ; var u2 = BPF.ar(u1, freq2, 1) * 0.2
 ; DetectSilence.ar(u2, 0.0001, 0.2, 2)
-; Out.ar(0, Pan2.ar(u2, pan, amp * 10)) }.play
+; Pan2.ar(u2, pan, amp * 10) }.play
diff --git a/gr/deep-trip.hs b/gr/deep-trip.hs
--- a/gr/deep-trip.hs
+++ b/gr/deep-trip.hs
@@ -1,7 +1,7 @@
--- deep trip (jmcc)
+-- deep trip (jmcc) #9
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU.ID  {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU  {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 deep_trip :: UGen
diff --git a/gr/deep-trip.scd b/gr/deep-trip.scd
new file mode 100644
--- /dev/null
+++ b/gr/deep-trip.scd
@@ -0,0 +1,13 @@
+// deep trip (jmcc) #9
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var f = LFNoise1.kr(0.3.rand, 60, 70).midicps;
+    var a = LFNoise2.ar(f * 0.5.rand,LFNoise1.kr(8.0.rand, SinOsc.kr(40.0.rand,0,0.1)).max(0));
+    var z = SinOsc.ar(f, 0, a);
+    var s = Pan2.ar(z, LFNoise1.kr(5.0.rand));
+    var c1 = CombN.ar(s, 0.5, [0.2.rand + 0.3, 0.2.rand + 0.3], 20);
+    var c2 = CombN.ar(s, 0.5, [0.2.rand + 0.3, 0.2.rand + 0.3], 20);
+    s + c1 + c2;
+}, 12, 4, 4);
diff --git a/gr/default.hs b/gr/default.hs
--- a/gr/default.hs
+++ b/gr/default.hs
@@ -1,17 +1,17 @@
 -- default (jmcc)
 
-import Data.Default {- data-default -}
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.List as L {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
-pattern :: [P_Bind]
+pattern :: (Synthdef,P.Param)
 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)]
+    let to_cps = P.degree_to_cps' [0,2,4,5,7,9,11] 12
+    in (defaultSynthdef
+       ,[("freq",to_cps (P.xrand 'α' [0,1,5,7,9]) (P.rand 'β' [2,3,4,5,6]))
+        ,("dur",P.wrand 'γ' [0.1,0.2,0.4] [0.5,0.4,0.1])
+        ,("amp",L.brown 'δ' 0.01 0.2 0.01)
+        ,("pan",L.brown 'ε' (-1) 1 0.25)])
 
 main :: IO ()
-main = audition (pbind pattern)
+main = audition (P.sbind1 pattern)
diff --git a/gr/default.scd b/gr/default.scd
--- a/gr/default.scd
+++ b/gr/default.scd
@@ -1,8 +1,12 @@
+// default (jmcc)
+
 SynthDef(\default, {
-arg out=0,freq=440,amp=0.1,pan=0,gate=1;
-var e = Linen.kr(gate, 0.01, 0.7, 0.3, 2);
-var f3 = freq + [0, Rand(-0.4,0.0), Rand(0.0,0.4)];
-var l = XLine.kr(Rand(4000,5000), Rand(2500,3200), 1);
-var z = LPF.ar(Mix.new(VarSaw.ar(f3, 0, 0.3, 0.3)),l) * e;
-OffsetOut.ar(out, Pan2.ar(z, pan, amp));
+    arg out=0,freq=440,amp=0.1,pan=0,gate=1;
+    var e = Linen.kr(gate, 0.01, 0.7, 0.3, 2);
+    var f3 = freq + [0, Rand(-0.4,0.0), Rand(0.0,0.4)];
+    var l = XLine.kr(Rand(4000,5000), Rand(2500,3200), 1);
+    var z = LPF.ar(Mix(VarSaw.ar(f3, 0, 0.3, 0.3)),l) * e;
+    OffsetOut.ar(out, Pan2.ar(z, pan, amp));
 },[\ir]).add;
+
+Pbind(\note,Pseq([1,2,3],1)).play;
diff --git a/gr/demanding-studies.hs b/gr/demanding-studies.hs
--- a/gr/demanding-studies.hs
+++ b/gr/demanding-studies.hs
@@ -1,6 +1,6 @@
 -- demanding studies (jmcc)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 demanding_studies :: UGen
 demanding_studies =
diff --git a/gr/demanding-studies.scd b/gr/demanding-studies.scd
--- a/gr/demanding-studies.scd
+++ b/gr/demanding-studies.scd
@@ -1,10 +1,12 @@
-{var s1 = Drand.new([72,75,79,82],inf)
-;var s2 = Drand.new([82,84,86],1)
-;var s3 = Dseq.new([72,75,79,s2],inf)
+// demanding studies (jmcc)
+
+{var s1 = Drand([72,75,79,82],inf)
+;var s2 = Drand([82,84,86],1)
+;var s3 = Dseq([72,75,79,s2],inf)
 ;var x = MouseX.kr(5,13,'linear',0.2)
 ;var tr = Impulse.kr(x,0)
 ;var f = Demand.kr(tr,0,[(s1 - 12).midicps,s3.midicps])
 ;var o1 = SinOsc.ar(f + [0,0.7],0)
 ;var o2 = Saw.ar(f + [0,0.7]) * 0.3
 ;var o3 = (o1 + o2).distort.log.distort.cubed
-;Out.ar(0,o3 * 0.1)}.play
+;o3 * 0.1}.play;
diff --git a/gr/dial-history-m.hs b/gr/dial-history-m.hs
--- a/gr/dial-history-m.hs
+++ b/gr/dial-history-m.hs
@@ -1,33 +1,30 @@
 -- dial history (jrhb)
 
 import Data.List {- base -}
-import Sound.SC3.Monad {- hsc3 -}
-
-rng :: UGen -> UGen -> UGen -> UGen
-rng s = linLin s 0 1
+import Sound.SC3 {- hsc3 -}
 
 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
+  n <- dwhiteM dinf 7 12
+  w <- dwhiteM 1 2 7
+  b <- dbrownM n 0.1 0.2 0.01
+  rate <- dseqM dinf (mce2 w b)
+  q <- dseqM dinf (mce [1..10])
+  g1 <- grayNoiseM AR
+  g2 <- grayNoiseM AR
+  d <- lfdNoise3M 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
+      which = trunc (linLin_u 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)
+      dsig = delayN sig 0.2 (linLin_u d 0 0.01)
       hiss = g1 * 0.01 + hpf (g2 * 0.02) 3000
   return (dsig + hiss)
 
diff --git a/gr/dial-history.scd b/gr/dial-history.scd
--- a/gr/dial-history.scd
+++ b/gr/dial-history.scd
@@ -1,10 +1,10 @@
 { var mfv = [[697, 770, 852, 941], [1209, 1336, 1477, 1633]]
 ; var numbers = [[3, 1]] ++ {: [a, b], a <- (0..2), b <- (0..2) }.all
-; var n = Dwhite.new(7, 12, inf)
-; var w = Dwhite.new(2, 7, 1)
-; var b = Dbrown.new(0.1, 0.2, 0.01, n)
-; var rate = Dseq.new([w, b], inf)
-; var q = Dseq.new((1..10), inf)
+; var n = Dwhite(7, 12, inf)
+; var w = Dwhite(2, 7, 1)
+; var b = Dbrown(0.1, 0.2, 0.01, n)
+; var rate = Dseq([w, b], inf)
+; var q = Dseq((1..10), inf)
 ; var trig = Trig.kr(TDuty.kr(rate, 0, q), 0.09)
 ; var pat = Latch.kr(trig, trig)
 ; var x = MouseX.kr(0, 1, 'linear', 0.2)
@@ -15,8 +15,8 @@
 ; var sig = SinOsc.ar(dial, 0) * 0.05 * trig
 ; var d = LFDNoise3.kr(0.5)
 ; var dsig = DelayC.ar(sig, 0.2, d.range(0, 0.01))
-; var g1 = GrayNoise.AR
-; var g2 = GrayNoise.AR
+; var g1 = GrayNoise.ar
+; var g2 = GrayNoise.ar
 ; var z = Silent.ar(1)
 ; var hiss = g1 * 0.01 + HPF.ar(g2 * 0.02, 3000)
-; Out.ar(0, [z, dsig + hiss]) }.play
+; [z, dsig + hiss] }.play
diff --git a/gr/diffraction-m.hs b/gr/diffraction-m.hs
--- a/gr/diffraction-m.hs
+++ b/gr/diffraction-m.hs
@@ -1,25 +1,25 @@
 -- diffraction (rd)
 
 import Control.Monad {- base -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+             f <- fmap (* mce2 32 64) (lfNoise0M KR 4)
+             w <- fmap (* x) (lfNoise0M KR 32)
+             z <- fmap (* 0.1) (lfNoise0M KR 2)
+             m <- lfNoise0M 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
+      q = do n <- lfNoise0M 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)
+              f _ = do fr <- fmap (* x) (randM 50 59)
+                       am <- fmap (* y) (randM 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])
diff --git a/gr/diffraction.scd b/gr/diffraction.scd
--- a/gr/diffraction.scd
+++ b/gr/diffraction.scd
@@ -7,11 +7,11 @@
          ;var s = Pulse.ar(f,w)
          ;Resonz.ar(s,y + z,(m * 0.4) + 0.8) * 0.5}
 ;var q = {var n = LFNoise0.kr(128)
-         ;CombN.ar(p.value,0.2,(n * 0.1) + 0.1,3)}
+         ;CombN.ar(p.(),0.2,(n * 0.1) + 0.1,3)}
 ;var r = {var x1 = MouseX.kr(0.75,1.25,'exponential',0.1)
          ;var y1 = MouseY.kr(0.25,1,'exponential',0.1)
          ;var f = {var fr = Rand(50,59) * x1
                   ;var am = Rand(0.04,0.16) * y1
                   ;SinOsc.ar(fr,0) * am}
          ;[Mix.fill(16,f),Mix.fill(12,f)]}
-;Out.ar(0,p.value + q.value + r.value)}.play
+;p.() + q.() + r.()}.play
diff --git a/gr/discretion-m.hs b/gr/discretion-m.hs
--- a/gr/discretion-m.hs
+++ b/gr/discretion-m.hs
@@ -1,14 +1,14 @@
 -- discretion-m (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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)
+      part = do f1 <- clone 2 (randM 50 55)
+                f2 <- clone 2 (randM 50 65)
+                f3 <- clone 2 (randM 50 55)
+                a <- clone 2 (randM 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
diff --git a/gr/discretion.hs b/gr/discretion.hs
--- a/gr/discretion.hs
+++ b/gr/discretion.hs
@@ -1,8 +1,7 @@
 -- discretion (rd)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 discretion :: UGen
 discretion =
diff --git a/gr/distort-input.hs b/gr/distort-input.hs
new file mode 100644
--- /dev/null
+++ b/gr/distort-input.hs
@@ -0,0 +1,11 @@
+-- distort input (jmcc) #5
+
+import Sound.SC3 {- hsc3 -}
+
+distort_input :: UGen
+distort_input =
+    let gain = mouseX KR 1 100 Exponential 0.2  -- mouse x controls gain into distortion
+    in distort (soundIn (mce2 0 1) * gain) * 0.4
+
+main :: IO ()
+main = audition (out 0 distort_input)
diff --git a/gr/distort-input.scd b/gr/distort-input.scd
new file mode 100644
--- /dev/null
+++ b/gr/distort-input.scd
@@ -0,0 +1,4 @@
+// distort input (jmcc) #5
+
+{var gain = MouseX.kr(1,100,'exponential') /* mouse x controls gain into distortion */
+;SoundIn.ar([0,1], gain).distort * 0.4}.play;
diff --git a/gr/doppler.hs b/gr/doppler.hs
--- a/gr/doppler.hs
+++ b/gr/doppler.hs
@@ -22,9 +22,14 @@
     let t = line KR (-pi/2) (pi * 3/2) dt RemoveSynth
     in (a * cos t,b * sin t)
 
+src :: UGen
+src = rlpf (fSinOsc AR 200 0 * lfPulse AR 31.3 0 0.4) 400 0.3
+
+d1 :: UGen
+d1 = doppler (line_x 10 100 6) src
+
+d2 :: UGen
+d2 = doppler (ellipse 10 75 12) src
+
 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)))
+main = withSC3 (play (out 0 d1) >> wait 8 >> play (out 0 d2))
diff --git a/gr/drone-plus-rhythm.hs b/gr/drone-plus-rhythm.hs
new file mode 100644
--- /dev/null
+++ b/gr/drone-plus-rhythm.hs
@@ -0,0 +1,50 @@
+-- drone plus rhythm (jmcc) #12
+
+import Control.Concurrent {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+scale :: Num a => [a]
+scale = [0, 2, 3, 5, 7, 9, 10]
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 z n = rand z (negate n) n
+
+drone_1 :: UGen
+drone_1 =
+    let f0 = midiCPS (lchoose 'α' [24,36] + rand2 'β' 0.08)
+        f1 = lfSaw AR (mce2 f0 (f0 + 0.2)) 0 * lfNoise2 'γ' KR (f0 * mce2 0.05 0.04) * 0.06
+    in lpf f1 (rand 'δ' 1000 3000)
+
+drone_1_txt :: IO ()
+drone_1_txt = overlapTextureU (4,4,8,maxBound) drone_1
+
+drone_2 :: UGen
+drone_2 =
+    let x = rand 'ε' 0 1 >* 0.8
+        m = lchoose 'ζ' [60,72] + lchoose 'η' scale + uclone 'θ' 2 (rand2 'ι' 0.05)
+    in sinOsc AR (midiCPS m) 0 * x * rand 'κ' 0.04 0.07
+
+drone_2_txt :: IO ()
+drone_2_txt = overlapTextureU (4,6,3,maxBound) drone_2
+
+iseqr :: ID a => a -> [UGen] -> UGen -> UGen
+iseqr z s tr = tr * demand tr 0 (dxrand z dinf (mce s))
+
+rhy :: UGen
+rhy =
+    let m = lchoose 'λ' [48, 60, 72, 84] + lchoose 'μ' scale + uclone 'ν' 2 (rand2 'ξ' 0.03)
+        sq = iseqr 'ο' [0,1,0,1,1,0] (impulse AR (lchoose 'π' [1.5,3,6]) 0)
+        sg = lfPulse AR (midiCPS m) 0 0.4 * rand 'ρ' 0.03 0.08
+    in rlpf (decay2 sq 0.004 (rand 'σ' 0.2 0.7) * sg) (expRand 'τ' 800 2000) 0.1
+
+pp :: UGen -> UGen
+pp z = combN z 0.5 0.5 6 + mceReverse z
+
+rhy_txt :: IO ()
+rhy_txt = overlapTextureU_pp (6,6,6,maxBound) rhy 2 pp
+
+main = do
+  forkIO drone_1_txt
+  forkIO drone_2_txt
+  forkIO rhy_txt
diff --git a/gr/drone-plus-rhythm.scd b/gr/drone-plus-rhythm.scd
new file mode 100644
--- /dev/null
+++ b/gr/drone-plus-rhythm.scd
@@ -0,0 +1,33 @@
+// drone plus rhythm (jmcc) #12
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~scale = #[0, 2, 3, 5, 7, 9, 10];
+
+~overlap_texture.({
+    var f = (#[24,36].choose + 0.08.rand2).midicps;
+    LPF.ar(LFSaw.ar([f, f + 0.2], 0, LFNoise2.kr(f*[0.05, 0.04], 0.06)), rrand(1000,3000));
+}, 4, 4, 8);
+
+~overlap_texture.({
+    arg i;
+    if (i > 1 and: { 0.8.coin }, {
+        var f = (#[60, 72].choose + ~scale.choose + [0.05.rand2, 0.05.rand2]).midicps;
+        SinOsc.ar(f, 0, rrand(0.04,0.07));
+    }, {
+        Silent.ar(2)
+    });
+}, 4, 6, 3);
+
+~overlap_texture.({
+    arg i;
+    var isequ = {arg s, tr; tr * Demand.ar(tr, 0, Dseq(s, inf))};
+    if (i > 8, {
+        var f = (#[48, 60, 72, 84].choose + ~scale.choose + [0.03.rand2, 0.03.rand2]).midicps;
+        var sq = isequ.([1,1,1,0,0,0].scramble,Impulse.ar([1.5,3,6].choose));
+        var sg = LFPulse.ar(f, 0, 0.4, rrand(0.03,0.08));
+        RLPF.ar(Decay2.ar(sq, 0.004, rrand(0.2, 0.7),sg),exprand(800,2000),0.1)
+    },{ Silent.ar(2) });
+}, 6, 6, 6);
+
+~post_process.({arg z; CombN.ar(z, 0.5, 0.5, 6, 1, z.reverse)});
diff --git a/gr/drummer.hs b/gr/drummer.hs
--- a/gr/drummer.hs
+++ b/gr/drummer.hs
@@ -1,6 +1,6 @@
 -- drummer (tm)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 drummer :: UGen
 drummer =
diff --git a/gr/drummer.scd b/gr/drummer.scd
--- a/gr/drummer.scd
+++ b/gr/drummer.scd
@@ -1,9 +1,9 @@
-{ var tempo = 4
-; var n = WhiteNoise.ar()
-; var tr = Impulse.ar(tempo, 0)
-; var tr_2 = PulseDivider.ar(tr, 4, 2)
-; var tr_4 = PulseDivider.ar(tr, 4, 0)
-; var snare = n * Decay2.ar(tr_2, 0.005, 0.5)
-; var bass = SinOsc.ar(60, 0) * Decay2.ar(tr_4, 0.005, 0.5)
-; var hihat = HPF.ar(n, 10000) * Decay2.ar(tr, 0.005, 0.5)
-; Out.ar(0, Pan2.ar(snare + bass + hihat, 0, 0.4)) }.play
+{var tempo = 4
+;var n = WhiteNoise.ar
+;var tr = Impulse.ar(tempo, 0)
+;var tr_2 = PulseDivider.ar(tr, 4, 2)
+;var tr_4 = PulseDivider.ar(tr, 4, 0)
+;var snare = n * Decay2.ar(tr_2, 0.005, 0.5)
+;var bass = SinOsc.ar(60, 0) * Decay2.ar(tr_4, 0.005, 0.5)
+;var hihat = HPF.ar(n, 10000) * Decay2.ar(tr, 0.005, 0.5)
+;Out.ar(0, Pan2.ar(snare + bass + hihat, 0, 0.4))}.play
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,7 +1,7 @@
 -- e-lamell-p (rd)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 e_lamell :: UGen
 e_lamell =
@@ -18,25 +18,22 @@
         e = envGen AR 1 a 0 1 RemoveSynth e_d
     in pan2 s l e
 
-patterns :: [[P_Bind]]
+patterns :: [(Synthdef,P.Param)]
 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)]]
+    let sy = synthdef "e-lamell" (out 0 e_lamell)
+        to_cps = P.degree_to_cps' [0,2,4,5,7,9,11] 12
+    in [(sy,[("freq",to_cps (P.rand 'β' [0,2,5,7]) (P.wrand 'γ' [2,3,4,5] [0.2,0.35,0.35,0.1]))
+            ,("dur",repeat 0.1)
+            ,("d",P.white 'δ' 0.01 0.8)
+            ,("amp",P.white 'ε' 0 0.75)
+            ,("n",P.white 'ζ' 2 36)
+            ,("l",P.white 'η' (-1) 1)])
+       ,(sy,[("freq",to_cps (P.rand 'θ' [0]) (P.rand 'ι' [1,2,3]))
+            ,("dur",repeat 0.1)
+            ,("d",P.white 'κ' 0.01 1.2)
+            ,("amp",P.rand 'λ' [0,0.25,0.5,1])
+            ,("n",P.white 'μ' 2 36)
+            ,("l",P.white 'ν' (-1) 1)])]
 
 main :: IO ()
-main = audition (ppar (map pbind patterns))
+main = audition (P.sbind patterns)
diff --git a/gr/e-lamell.hs b/gr/e-lamell.hs
--- a/gr/e-lamell.hs
+++ b/gr/e-lamell.hs
@@ -2,7 +2,7 @@
 
 import Control.Monad
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Random.IO as R {- hsc3-lang -}
 
 e_lamell :: UGen
diff --git a/gr/early-space-music-lp-side-one.scd b/gr/early-space-music-lp-side-one.scd
new file mode 100644
--- /dev/null
+++ b/gr/early-space-music-lp-side-one.scd
@@ -0,0 +1,31 @@
+// early space music lp side one (jmcc) #12
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+	var scale = [0, 2, 4, 5, 7, 9, 11];
+	var octave = [24, 36, 48, 60, 72, 84, 96] - 3;
+    var s1 = {
+        var f = (scale.choose + octave.choose).midicps;
+        var z = {
+            var ff = f * SinOsc.kr(exprand(4,6),0,0.008,1);
+            LFSaw.ar([ff * rrand(0.99,1.01), ff * rrand(0.99,1.01)], 0, 0.01)
+        };
+        var x = LPZ2.ar(LPZ2.ar(Mix.arFill(10, z)));
+        if (0.3.coin && (f < 1400), {
+            x = RLPF.ar(x, SinOsc.kr(rrand(0.3,0.8),0,f*rrand(0.5,3), f * rrand(4,12)), 0.1)
+        });
+        x
+    };
+    var s2 = {
+        var rnd = {exprand(4,12) * [1,rrand(0.9,1.1)]};
+        var rates = XLine.kr(rnd.(), rnd.(), 12) * [1,-1].choose;
+        var sw = LFSaw.kr(rates, 0, rrand(2,16), rrand(40,120));
+        var f = LFTri.kr(exprand(0.25,0.5) * [1,-1].choose, 0, linrand(4,30), sw).midicps;
+        CombN.ar(SinOsc.ar(f, 0, 0.02), 0.3, rrand(0.15,0.3), 4)
+    };
+    [s1,s2].choose.();
+}, 4, 4, 6, postProcess: {
+    arg z;
+    CombN.ar(z, 0.5, [0.5,0.47], 7, 1, z.reverse)
+});
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
@@ -1,9 +1,9 @@
--- early space music LP, side 2 (jmcc)
+-- early space music LP, side 2 (jmcc) #12
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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 Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 import qualified System.Random as R {- random -}
 
 m1 :: UGen
@@ -28,29 +28,30 @@
     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
 
+id_seq :: Enum a => a -> Int -> [Int]
+id_seq c n = let c' = fromEnum c in [c' .. c' + n - 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)
+        o z = let i = constant z
+                  r = let (p,q) = mce2c (expRandN 2 z 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)
+                  f = midiCPS (rand z 24 96)
+                  e = max 0 (sinOsc KR (r * rand z 0.9 1.1) (rand z 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
+              in pan2 s (rand z (-1) 1) 1
+    in sum (map o (id_seq 0 12)) * 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)
+    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]
+    in pan2 z (lfNoise1 'ψ' KR (rand 'ω' 0 5)) 1
 
 -- audition (out 0 m7)
 m7 :: UGen
@@ -59,9 +60,9 @@
         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)
@@ -71,7 +72,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 ['Η'..'Θ']) * 0.3
+    in sum (map c (id_seq 'Θ' 5)) * 0.3
 
 main :: IO ()
 main = do
diff --git a/gr/early-space-music-lp-side-two.scd b/gr/early-space-music-lp-side-two.scd
new file mode 100644
--- /dev/null
+++ b/gr/early-space-music-lp-side-two.scd
@@ -0,0 +1,52 @@
+// early space music lp side two (jmcc) #12
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    [{
+        var a = 20.0.rand;
+        var b = 5000.0.rand;
+        var c = 20.0.rand;
+        var pan = 1.0.rand2;
+        Pan2.ar(SinOsc.ar(SinOsc.ar(a, 0, 0.1*b, b), 0, SinOsc.kr(c, 0, 0.08, 0.08)), pan)
+    },{
+        var a0 = 200.0.rand + 40;
+        var a1 = a0 + 1.0.rand2;
+        var a = [a0, a1];
+        var b = exprand(50,2400);
+        var c = [a0 + 1.0.rand2, a1 + 1.0.rand2];
+        SinOsc.ar(SinOsc.ar(a, 0, 1.0.rand * b, b), 0, SinOsc.kr(c, 0, 0.025, 0.025))
+    },{
+        var f = (60 + 40.rand).midicps;
+        FSinOsc.ar([f, f + 0.2], 0, LFNoise2.kr(f*[0.15, 0.16], 0.1));
+    },{
+        var f = rrand(24, 96).midicps;
+        var r = XLine.kr(exprand(0.1,20),exprand(0.1,20), 25.6);
+        var n = 12;
+        Mix.arFill(n, {
+            arg i;
+            var a = SinOsc.kr( r * rrand(0.9,1.1),2pi.rand,0.1,-0.05);
+            var o = FSinOsc.ar(f * i + f, 0, a.max(0));
+            Pan2.ar(o * (1/(i+1)), 1.0.rand2)
+        }) * LFPulse.kr(exprand(0.2,1.2), 0, rrand(0.1,0.2));
+    },{
+        var f = LFNoise1.kr(0.3.rand, 60, 70).midicps;
+        var o = SinOsc.kr(40.0.rand,0,0.1);
+        var a = LFNoise2.ar(f * 0.5.rand, LFNoise1.kr(8.0.rand, o).max(0));
+        var z = SinOsc.ar(f, 0, a);
+        Pan2.ar(z, LFNoise1.kr(5.0.rand));
+    },{
+        var f1 = 100;
+        var f2 = 6000.0;
+        var f = Array.fill(p, { exprand(f1, f2) }); // frequencies
+        var rt = Array.fill(p, { 2.0 + 4.0.rand });	// ring times
+        var z = Array.fill(2, {`[f, nil,rt]});
+        var f3 = XLine.kr(exprand(40.0, 300.0), exprand(40.0, 300.0), 12);
+        var in = LFPulse.ar(f3, 0, rrand(0.1, 0.9), 0.002 * LFNoise2.kr(8.0.rand).max(0));
+        Klank.ar(z, in).distort * 0.3;
+    }].choose.();
+}, 2, 4, 6, postProcess: {
+    arg z;
+    var fn = {CombN.ar(z, 0.3, [rrand(0.1,0.3),rrand(0.1,0.3)], 8)};
+    Mix.arFill(5,fn) * 0.3;
+});
diff --git a/gr/eggcrate-m.hs b/gr/eggcrate-m.hs
--- a/gr/eggcrate-m.hs
+++ b/gr/eggcrate-m.hs
@@ -1,6 +1,6 @@
 -- eggcrate-m (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 eggcrate :: UId m => m UGen
 eggcrate = do
@@ -8,11 +8,11 @@
       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
+  [x,y] <- sequence (replicate 2 (brownNoiseM KR))
+  t <- dustM KR 2.4
+  [f0,f1] <- sequence (replicate 2 (tChooseM t p))
+  let f = linLin_b (eggcrate_f x y) f0 f1
+      a = linLin_b x 0 0.1
   return (pan2 (mix (sinOsc AR f 0)) y a)
 
 main :: IO ()
diff --git a/gr/eggcrate.hs b/gr/eggcrate.hs
--- a/gr/eggcrate.hs
+++ b/gr/eggcrate.hs
@@ -1,6 +1,6 @@
 -- eggcrate (rd)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 atp :: (t -> u) -> (t,t) -> (u,u)
 atp f (i,j) = (f i,f j)
@@ -14,8 +14,8 @@
       (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
+      f = linLin_b (eggcrate_f x y) f0 f1
+      a = linLin_b x 0 0.1
  in pan2 (mix (sinOsc AR f 0)) y a
 
 main :: IO ()
diff --git a/gr/eggcrate.scd b/gr/eggcrate.scd
--- a/gr/eggcrate.scd
+++ b/gr/eggcrate.scd
@@ -1,11 +1,10 @@
-{var eggcrate = {arg u,v
-                ;(u * pi).cos * (v * pi).sin}
+{var eggcrate = {arg u,v; (u * pi).cos * (v * pi).sin}
 ;var p = [64,72,96,128,256,6400,7200,8400,9600]
-;var x = BrownNoise.kr()
-;var y = BrownNoise.kr()
+;var x = BrownNoise.kr
+;var y = BrownNoise.kr
 ;var t = Dust.kr(2.4)
 ;var f0 = TChoose.kr(t,p)
 ;var f1 = TChoose.kr(t,p)
-;var f = LinLin.kr(eggcrate.value(x,y),-1,1,f0,f1)
+;var f = LinLin.kr(eggcrate.(x,y),-1,1,f0,f1)
 ;var a = LinLin.kr(x,-1,1,0,0.1)
-;Out.ar(0,Pan2.ar(Mix.ar(SinOsc.ar(f,0)),y,a))}.play
+;Pan2.ar(Mix.ar(SinOsc.ar(f,0)),y,a)}.play
diff --git a/gr/f-lets-m.hs b/gr/f-lets-m.hs
--- a/gr/f-lets-m.hs
+++ b/gr/f-lets-m.hs
@@ -1,21 +1,21 @@
 -- f-lets (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+           r0 <- tIRandM (mce2 2 1) n pd
+           r1 <- tRandM 0.01 0.04 pd
+           r2 <- tRandM 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
+           r0 <- tRandM 0 1 t
+           r1 <- tRandM 0 1 t
+           r2 <- tRandM 0 1 t
+           r3 <- tRandM 0 1 t
+           r4 <- coinGateM 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)
@@ -23,7 +23,7 @@
                     ,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
+  n <- lfNoise0M KR 2
   return . (* (n * 0.25 + 0.25)) . sum =<< mk_n tr
 
 main :: IO ()
diff --git a/gr/f0-454598285861617665.hs b/gr/f0-454598285861617665.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-454598285861617665.hs
@@ -0,0 +1,15 @@
+-- https://twitter.com/redFrik/status/454598285861617665 (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+f0_454598285861617665 :: UGen
+f0_454598285861617665 =
+    let b = mce [9,8 .. 1]
+        c = lfTri AR (3 ** lfTri AR (1 / b) (b / 9)) 0
+        d = lfTri AR (1 / b) 0 `modE` 1 / 9 + 0.01
+        f = 2 ** roundE (lfTri AR (b / 99) 0) * 99 * b
+        o = grainSin 2 c d f 0 (-1) 512
+    in splay (tanh o) 1 1 0 True / 2
+
+main :: IO ()
+main = audition (out 0 f0_454598285861617665)
diff --git a/gr/f0-454598285861617665.scd b/gr/f0-454598285861617665.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-454598285861617665.scd
@@ -0,0 +1,8 @@
+// https://twitter.com/redFrik/status/454598285861617665
+
+{var b = (9..1)
+;var c = LFTri.ar(3 ** LFTri.ar(1 / b,b / 9))
+;var d = LFTri.ar(1 / b) % 1 / 9 + 0.01
+;var f = 2 ** LFTri.ar(b / 99).round * 99 * b
+;var o = GrainSin.ar(2,c,d,f)
+;Splay.ar(o.tanh) / 2}.play
diff --git a/gr/f0-456384156159574016.hs b/gr/f0-456384156159574016.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-456384156159574016.hs
@@ -0,0 +1,13 @@
+-- https://twitter.com/redFrik/status/456384156159574016 (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+f0_456384156159574016 :: UGen
+f0_456384156159574016 =
+    let a = 1 / mce [3,12,4,1,6,2]
+        s = lag3 (sinOsc AR a 0) (abs (sinOsc AR (2.67 ** a) 0)) * 99
+        f = ((sinOsc AR ((1 / a) / 9) a >* 0) * 20 + 99) / a
+    in splay (sinOsc AR (hpf (ringz s f 1) 440) 0) 1 1 0 True * 0.25
+
+main :: IO ()
+main = audition (out 0 f0_456384156159574016)
diff --git a/gr/f0-456384156159574016.scd b/gr/f0-456384156159574016.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-456384156159574016.scd
@@ -0,0 +1,7 @@
+// https://twitter.com/redFrik/status/456384156159574016
+
+{var a = 1 / [3,12,4,1,6,2]
+;var s = SinOsc.ar(a).lag3(SinOsc.ar(2.67 ** a).abs) * 99
+;var f = ((SinOsc.ar((1 / a) / 9,a) > 0) * 20 + 99) / a
+;Splay.ar(SinOsc.ar(HPF.ar(Ringz.ar(s,f)))) * 0.25}.play
+
diff --git a/gr/f0-tw0001.scd b/gr/f0-tw0001.scd
deleted file mode 100644
--- a/gr/f0-tw0001.scd
+++ /dev/null
@@ -1,1 +0,0 @@
-r{99.do{|i|x={Pan2.ar(SinOsc.ar(i+1,SinOsc.ar((i%9).div(3)*100+(i%9)+500),0.03),1.0.rand2)}.play;2.wait;x.release(25)}}.play
diff --git a/gr/f0-tw0006.scd b/gr/f0-tw0006.scd
deleted file mode 100644
--- a/gr/f0-tw0006.scd
+++ /dev/null
@@ -1,1 +0,0 @@
-r{loop{x={GVerb.ar(MoogFF.ar(ClipNoise.ar*0.4,LFPar.kr({0.3.rand}!2,0,600,990)),9,9,1)}.play(s,0,19);3.wait;x.release}}.play
diff --git a/gr/f0-tw0026.hs b/gr/f0-tw0026.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0026.hs
@@ -0,0 +1,33 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Collection.Extension {- hsc3-lang -}
+import Sound.SC3.Lang.Math {- hsc3-lang -}
+import Sound.SC3.Lang.Pattern.Plain {- hsc3-lang -}
+
+fibs :: Num n => [n]
+fibs = 0 : scanl (+) 1 fibs
+
+-- | In SC3, List.fibs begins at 1.
+nfibs :: Num a => Int -> [a]
+nfibs n = take n (tail fibs)
+
+-- | In SC3, % of zero is zero.
+mod0 :: (Extending f, Integral c) => f c -> f c -> f c
+mod0 l = let f p q = if q == 0 then 0 else p `mod` q in zipWith_c f l
+
+post_proc :: UGen
+post_proc = let s = combL (tanh (in' 1 AR 8) / 8) 1 1 8 in mce2 s s * 0.1
+
+pattern :: NRT
+pattern =
+    let d = nfibs 32 `mod0` (nfibs 64  `mod0` [12])
+        f = map (\x -> degree_to_cps [0,2,4,5,7,9,11] 12 (fromIntegral x) 4) d
+    in sbind1 (defaultSynthdef
+              ,[("amp",repeat 8)
+               ,("dur",repeat 0.25)
+               ,("freq",cycle f)
+               ,("out",repeat 8)])
+
+main :: IO ()
+main = audition (out 0 post_proc) >> audition pattern
diff --git a/gr/f0-tw0026.scd b/gr/f0-tw0026.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0026.scd
@@ -0,0 +1,4 @@
+// http://www.fredrikolofsson.com/f0blog/?q=node/537
+
+{CombL.ar(In.ar(8).tanh/8,1,1,8)!2 * 0.1}.play
+;Pbind(\amp,8,\dur,1/4,\degree,Pseq(List.fib(32)%(List.fib(64)%12),inf),\out,8).play
diff --git a/gr/f0-tw0028.hs b/gr/f0-tw0028.hs
--- a/gr/f0-tw0028.hs
+++ b/gr/f0-tw0028.hs
@@ -1,6 +1,6 @@
 -- http://www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 fib :: Integral i => [i]
 fib = 0 : scanl (+) 1 fib
diff --git a/gr/f0-tw0030.hs b/gr/f0-tw0030.hs
--- a/gr/f0-tw0030.hs
+++ b/gr/f0-tw0030.hs
@@ -1,6 +1,6 @@
 -- www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 f0_0030 :: UGen
 f0_0030 =
@@ -8,7 +8,7 @@
         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)
+    in out 0 (gVerb o 80 3 0.5 0.5 15 1 0.7 0.5 300 * 0.1)
 
 main :: IO ()
 main = audition f0_0030
diff --git a/gr/f0-tw0030.scd b/gr/f0-tw0030.scd
--- a/gr/f0-tw0030.scd
+++ b/gr/f0-tw0030.scd
@@ -4,4 +4,4 @@
 ;var f = a.ar(1,0,5,a.ar([0.05,0.04],0,50,160).round(50))
 ;var w = a.ar(0.2,0,0.5,a.ar(3,0,0.2,0.5))
 ;var o = VarSaw.ar(f,0,w) / 8
-;GVerb.ar(o,80)}.play
+;GVerb.ar(o,80) * 0.1}.play
diff --git a/gr/f0-tw0033.hs b/gr/f0-tw0033.hs
--- a/gr/f0-tw0033.hs
+++ b/gr/f0-tw0033.hs
@@ -1,7 +1,6 @@
 -- www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 f0_0033 :: UGen
 f0_0033 =
@@ -10,7 +9,7 @@
         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)
+    in out 0 (splay ((o >* n) / 3) 1 1 0 True * 0.1)
 
 main :: IO ()
 main = audition f0_0033
diff --git a/gr/f0-tw0033.scd b/gr/f0-tw0033.scd
--- a/gr/f0-tw0033.scd
+++ b/gr/f0-tw0033.scd
@@ -5,4 +5,4 @@
 ;var n = BrownNoise.ar(a)
 ;var z = {|i| [i + 1 * f,i * f + (i + 1 / 3)]}
 ;var o = LFPar.ar(z ! 4,0)
-;Splay.ar((o > n) / 3)}.play
+;Splay.ar((o > n) / 3) * 0.1}.play
diff --git a/gr/f0-tw0041.hs b/gr/f0-tw0041.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0041.hs
@@ -0,0 +1,15 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/537 (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0041 :: UGen
+f0_tw0041 =
+    let s = sweep (localIn' 6 AR) 1
+        i = impulse AR (mce [1,0.749,6,12,3,4]) 0
+        o = sinOsc AR (1 / runningMax s i) 0
+    in mrg [tanh (splay o 1 1 0 True) / 2 * 0.1
+           ,localOut o]
+
+main :: IO ()
+main = audition (out 0 f0_tw0041)
+
diff --git a/gr/f0-tw0041.scd b/gr/f0-tw0041.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0041.scd
@@ -0,0 +1,7 @@
+// http://www.fredrikolofsson.com/f0blog/?q=node/537
+
+{var s = Sweep.ar(LocalIn.ar(6))
+;var i = Impulse.ar([1,0.749,6,12,3,4])
+;var o = SinOsc.ar(1 / RunningMax.ar(s,i))
+;LocalOut.ar(o)
+;Splay.ar(o).tanh / 2 * 0.1}.play
diff --git a/gr/f0-tw0045.hs b/gr/f0-tw0045.hs
--- a/gr/f0-tw0045.hs
+++ b/gr/f0-tw0045.hs
@@ -8,7 +8,7 @@
         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))
+    in tanh (a f p 1 0) * 0.1
 
 main :: IO ()
-main = audition f0_0045
+main = audition (out 0 f0_0045)
diff --git a/gr/f0-tw0045.scd b/gr/f0-tw0045.scd
--- a/gr/f0-tw0045.scd
+++ b/gr/f0-tw0045.scd
@@ -4,4 +4,4 @@
 ;var f = a.ar(a.ar(0.11,0,1,0),0,1,0)
 ;var p_f = a.ar(95*a.ar(0.01,0,1,1),0,a.ar(5e-3,0,50,0),100)
 ;var p = a.ar(p_f,a.ar([98,97],0,1,0),pi+a.ar(5e-4,0,1,0),0)
-;a.ar(f,p,1,0).tanh}.play
+;a.ar(f,p,1,0).tanh * 0.1}.play
diff --git a/gr/f0-tw0120.hs b/gr/f0-tw0120.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0120.hs
@@ -0,0 +1,16 @@
+-- http://sccode.org/1-4Qy (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0120 :: UGen
+f0_tw0120 =
+    let a = lfTri
+        z = a KR (1 / mce2 7 8) 0 * a KR (1 / 9) 0 * 99
+        l = midiCPS (mce [60 .. 79])
+        f = select z l
+        w = a KR (1 / mce2 3 4) 0 `modE` 1
+        o = varSaw AR f 0 w
+    in combN o 1 (1 / mce2 5 6) 8 / 4
+
+main :: IO ()
+main = audition (out 0 f0_tw0120)
diff --git a/gr/f0-tw0120.scd b/gr/f0-tw0120.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0120.scd
@@ -0,0 +1,9 @@
+//--tweet0120
+
+{var a = LFTri
+;var z = a.kr(1/[7,8])*a.kr(1/9,0,99)
+;var l = (60..79).midicps
+;var f = Select.kr(z,l)
+;var w = a.kr(1/[3,4])%1
+;var o = VarSaw.ar(f,0,w)
+;CombN.ar(o,1,1/[5,6],8)/4}.play
diff --git a/gr/f0-tw0121.hs b/gr/f0-tw0121.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0121.hs
@@ -0,0 +1,15 @@
+-- http://sccode.org/1-4Qy (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0121 :: UGen
+f0_tw0121 =
+    let a = sinOsc
+        z = a KR (1 / mce2 8 7) 0 * a KR (1 / 30) 0 * 9
+        l = midiCPS (mce [56,62 .. 98])
+        m = a AR (1 / mce2 4 3) 0
+        o = a AR (select z l) 0 * m
+    in tanh (combN o 1 (1 / mce2 6 5) 9)
+
+main :: IO ()
+main = audition (out 0 f0_tw0121)
diff --git a/gr/f0-tw0121.scd b/gr/f0-tw0121.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0121.scd
@@ -0,0 +1,8 @@
+//--tweet0121
+
+{var a = SinOsc
+;var z = a.kr(1/[8,7]) * a.kr(1/30,0,9)
+;var l = (56,62..98).midicps
+;var m = a.ar(1/[4,3])
+;var o = a.ar(Select.kr(z,l),0,m)
+;CombN.ar(o,1,1/[6,5],9).tanh}.play
diff --git a/gr/f0-tw0125.hs b/gr/f0-tw0125.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0125.hs
@@ -0,0 +1,16 @@
+-- http://sccode.org/1-4Qy (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0125 :: UGen
+f0_tw0125 =
+    let a = sinOsc AR
+        f = a (1 / mce [8,9]) 0 * 4 + mce [400,202]
+        u = (a (1/9) 0 + 1) / 88
+        d = (a (1/8) 0 + 1) / 99
+        i = inFeedback 1 (mce [1,0])
+        p = combC (lagUD i u d) 1 0.08 9
+    in a f p
+
+main :: IO ()
+main = audition (out 0 f0_tw0125)
diff --git a/gr/f0-tw0125.scd b/gr/f0-tw0125.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0125.scd
@@ -0,0 +1,8 @@
+//--tweet0125
+{var a = SinOsc
+;var f = a.ar(1/[8,9])*4+[400,202]
+;var u = a.ar(1/9)+1/88
+;var d = a.ar(1/8)+1/99
+;var i = InFeedback.ar([1,0])
+;var p = CombC.ar(i.lagud(u,d),1,0.08,9)
+;a.ar(f,p)}.play
diff --git a/gr/f0-tw0134.hs b/gr/f0-tw0134.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0134.hs
@@ -0,0 +1,23 @@
+-- http://sccode.org/1-4Qy (f0)
+-- scsynth -u 57110 -w 512
+
+import Sound.SC3 {- hsc3 -}
+
+mean :: Fractional a => [a] -> a
+mean l = sum l / fromIntegral (length l)
+
+f0_tw0134 :: UGen
+f0_tw0134 =
+    let a = lfSaw AR
+        n' = 50
+        n = constant n'
+        z i = let o1 = a ((i + 1) / mce [3,4]) 0
+                  o2 = a ((i + 1) / 8) 0 + 1
+                  f0 = o1 >* o2 * (n / 2) + n
+                  m = a ((i + 1) / n) (i / (n / 2))
+                  o3 = blip AR f0 (i + mce [2,3]) * m
+              in ringz o3 ((i + 1) * (n * 2 - 1)) 0.1
+    in mean (map z [0 .. n'])  / 5
+
+main :: IO ()
+main = audition (out 0 f0_tw0134)
diff --git a/gr/f0-tw0134.scd b/gr/f0-tw0134.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0134.scd
@@ -0,0 +1,12 @@
+//--tweet0134
+
+{var a = LFSaw
+;var n = 50
+;var z = {arg i
+         ;var o1 = a.ar(i + 1 / [3,4])
+         ;var o2 = a.ar(i + 1 / 8) + 1
+         ;var f0 = o1 > o2 * (n / 2) + n
+         ;var m = a.ar(i + 1 / n,i / (n / 2))
+         ;var o3 = Blip.ar(f0,i + [2,3]) * m
+         ;Ringz.ar(o3,i + 1 * (n * 2 - 1),0.1)}
+;mean(z ! n) / 5}.play
diff --git a/gr/f0-tw0220.hs b/gr/f0-tw0220.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0220.hs
@@ -0,0 +1,20 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/617 (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0220 :: UGen
+f0_tw0220 =
+    let c = inFeedback 1 0
+        b = clearBuf (localBuf 'α' 1 90000)
+        g = tGrains 2 (sinOsc AR 3 0) b (c + 3) 2 12 0 0.1 4
+        r = recordBuf AR b 0 1 0 1 Loop 1 DoNothing c
+    in mrg2 (hpf (sinOsc AR 99 (c * 6) / 9 + g) 9) r
+
+main :: IO ()
+main = withSC3 (play (out 0 f0_tw0220))
+
+{-
+2014-10-11: tgrains needs a patch to work with localbuf
+http://article.gmane.org/gmane.comp.audio.supercollider.user/110110
+main = withSC3 (async (b_alloc bufnum 90000 1) >> play (out 0 f0_tw0220))
+-}
diff --git a/gr/f0-tw0220.scd b/gr/f0-tw0220.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0220.scd
@@ -0,0 +1,7 @@
+// http://www.fredrikolofsson.com/f0blog/?q=node/617
+
+{var c = InFeedback.ar(0,1)
+;var b = LocalBuf(90000).clear
+;var g = TGrains.ar(2,SinOsc.ar(3,0),b,c + 3,2,12)
+;RecordBuf.ar(c,b)
+;HPF.ar(SinOsc.ar(99,c * 6) / 9 + g,9)}.play
diff --git a/gr/f0-tw0224.hs b/gr/f0-tw0224.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0224.hs
@@ -0,0 +1,14 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/617 (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0224 :: UGen
+f0_tw0224 =
+    let c = 200000
+        b = clearBuf (localBuf 'α' 2 c)
+        d = bufRd 2 AR b (sinOsc AR (mce2 2 3 * 9) 0 * c) NoLoop LinearInterpolation
+        w = bufWr b (abs (sinOsc AR (mce2 99 145) 0) * c) Loop (sinOsc AR (3 / mce2 2 3) 0 / 3)
+    in mrg2 d w
+
+main :: IO ()
+main = audition (out 0 f0_tw0224)
diff --git a/gr/f0-tw0224.scd b/gr/f0-tw0224.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0224.scd
@@ -0,0 +1,7 @@
+// http://www.fredrikolofsson.com/f0blog/?q=node/617
+
+{var c = 200000
+;var b = LocalBuf(c,2).clear /* ClearBuf(LocalBuf(c,2)) */
+;var d = BufRd.ar(2,b,SinOsc.ar([2,3] * 9) * c,0)
+;BufWr.ar(SinOsc.ar(3 / [2,3]) / 3,b,SinOsc.ar([99,145]).abs * c)
+;d}.draw
diff --git a/gr/f0-tw0225.hs b/gr/f0-tw0225.hs
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0225.hs
@@ -0,0 +1,12 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/617 (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+f0_tw0225 :: UGen
+f0_tw0225 =
+    let b = mce [1..8] * 99
+        o = blip AR (b / 2 + lfSaw KR ((-8) / b) 1 * 99) (b / 4 + (lfSaw KR (1 / b) 1 * 99))
+    in sin (splay (combN (o * sinOsc AR (8 / b) (lfSaw AR (99 / b) 0)) 0.2 0.2 1) 1 1 0 True)
+
+main :: IO ()
+main = audition (out 0 f0_tw0225)
diff --git a/gr/f0-tw0225.scd b/gr/f0-tw0225.scd
new file mode 100644
--- /dev/null
+++ b/gr/f0-tw0225.scd
@@ -0,0 +1,5 @@
+// http://www.fredrikolofsson.com/f0blog/?q=node/617
+
+{var b = (1..8) * 99
+;var o = Blip.ar(b / 2 + LFSaw.kr(-8 / b,1,99),b / 4 + LFSaw.kr(1 / b,1,99))
+;Splay.ar(CombN.ar(o * SinOsc.ar(8 / b,LFSaw.ar(99 / b)))).sin}.play
diff --git a/gr/fb-090531.hs b/gr/fb-090531.hs
--- a/gr/fb-090531.hs
+++ b/gr/fb-090531.hs
@@ -7,8 +7,8 @@
 
 fb_090531 :: UGen
 fb_090531 =
-    let k_in n = linLin (in' 1 KR n) (-1) 1
-        p = localIn 1 AR
+    let k_in n = linLin_b (in' 1 KR n)
+        p = localIn' 1 AR
         bt = recip controlRate
         ig_f = k_in 0 1 20
         ig = impulse AR ig_f 0
diff --git a/gr/fbl-fbf.hs b/gr/fbl-fbf.hs
--- a/gr/fbl-fbf.hs
+++ b/gr/fbl-fbf.hs
@@ -1,6 +1,6 @@
 -- fbl-fbf (rd)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 fbl :: UGen -> [UGen] -> [UGen] -> [UGen] -> (UGen, UGen)
 fbl l i d g =
@@ -26,7 +26,7 @@
       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
+      (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]
diff --git a/gr/feedr-m.hs b/gr/feedr-m.hs
--- a/gr/feedr-m.hs
+++ b/gr/feedr-m.hs
@@ -2,22 +2,23 @@
 -- warning: input/output feedback loop
 
 import Sound.OSC.FD {- hosc -}
-import Sound.SC3.Monad.FD {- hsc3 -}
+import Sound.SC3.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
+tap' :: Int -> UGen -> UGen -> UGen
+tap' nc b dt = playBuf nc AR b 1 0 (dt * (- sampleRate)) Loop DoNothing
 
 type State = (UGen,Double)
 
+-- > u <- feedr (mce2 0 1,6) 18
 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
+  t <- sequence (replicate n (randM 0.0 (constant dl)))
+  g <- sequence (replicate n (randM 0.4 1.0))
+  f <- sequence (replicate n (randM 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
@@ -31,6 +32,6 @@
   audition =<< feedr (ch,dl) 18
 
 main :: IO ()
-main = withSC3 (run (mce2 4 5,6))
+main = withSC3 (run (mce2 0 1,6))
 
 -- withSC3 (\fd -> send fd (b_zero 10))
diff --git a/gr/filter-input.hs b/gr/filter-input.hs
new file mode 100644
--- /dev/null
+++ b/gr/filter-input.hs
@@ -0,0 +1,13 @@
+-- filter input (jmcc) #5
+
+import Sound.SC3 {- hsc3 -}
+
+filter_input :: UGen
+filter_input =
+    let rQ = mouseY KR 0.01 1 Exponential 0.2 -- bandwidth ratio = 1/Q
+        cf = mouseX KR 100 12000 Exponential 0.2 -- mouse x controls cutoff freq
+        sg = soundIn (mce2 0 1) * 0.4 * sqrt rQ -- attenuate to offset resonance
+    in rlpf sg cf rQ
+
+main :: IO ()
+main = audition (out 0 filter_input)
diff --git a/gr/filter-input.scd b/gr/filter-input.scd
new file mode 100644
--- /dev/null
+++ b/gr/filter-input.scd
@@ -0,0 +1,6 @@
+// filter input (jmcc) #5
+
+{var rQ = MouseY.kr(0.01, 1, 'exponential') // bandwidth ratio = 1/Q
+;var i = SoundIn.ar([0,1], 0.4 * rQ.sqrt) // attenuate to offset resonance
+;var cf = MouseX.kr(100, 12000, 'exponential') // mouse x controls cutoff freq
+;RLPF.ar(i,cf,rQ)}.play;
diff --git a/gr/fm-iter.hs b/gr/fm-iter.hs
--- a/gr/fm-iter.hs
+++ b/gr/fm-iter.hs
@@ -1,6 +1,6 @@
 -- fm-iter (rd)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 -- audition (out 0 fm_iter)
diff --git a/gr/fm-kltr-m.hs b/gr/fm-kltr-m.hs
--- a/gr/fm-kltr-m.hs
+++ b/gr/fm-kltr-m.hs
@@ -1,15 +1,15 @@
 -- fm-kltr (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad as U {- hsc3 -}
+import Sound.SC3 {- 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
+  r1 <- randM 0.975 1.025
+  r2 <- randM 0.5 1.5
+  r3 <- randM 0.975 1.025
+  r4 <- randM 0.75 1.25
   let o = control IR "out" 0
       a = control KR "amp" 0.1
       d = control KR "dur" 0.1
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,7 +1,7 @@
 -- fm-kltr-p (rd)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 fm_kltr :: UGen
 fm_kltr =
@@ -24,17 +24,15 @@
       l = line KR p (p * r4) dt DoNothing
   in out o (pan2 (sinOsc AR m 0) l e)
 
-pattern :: [P_Bind]
+pattern :: P.Param
 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)]
+    [("freq",repeat (midiCPS 53))
+    ,("freq2",map midiCPS (P.white 'α' 48 96))
+    ,("amp",P.white 'β' 0.1 0.4)
+    ,("dur",P.white 'γ' 0.15 1.25)
+    ,("sustain",P.white 'δ' 5 6)
+    ,("index",P.white 'ε' 240 1480)
+    ,("pan",P.white 'ζ' (-1) 1)]
 
 main :: IO ()
-main = audition (pbind pattern)
+main = audition (P.sbind1 (synthdef "fm_kltr" fm_kltr,pattern))
diff --git a/gr/for-ann.scd b/gr/for-ann.scd
--- a/gr/for-ann.scd
+++ b/gr/for-ann.scd
@@ -1,7 +1,7 @@
 {{{var d = 33.6
   ;var f0 = 40
   ;var f1 = 40 * (2**8)
-  ;var f_e = Env.new([f0,f1],[d],\exp)
+  ;var f_e = Env([f0,f1],[d],\exp)
   ;var f = EnvGen.ar(f_e,1,1,0,1,0)
   ;var a_e = Env.linen(d/4,d/2,d)
   ;var a = EnvGen.ar(a_e,1,0.1,0,1,2)
diff --git a/gr/forest-sounds-m.hs b/gr/forest-sounds-m.hs
--- a/gr/forest-sounds-m.hs
+++ b/gr/forest-sounds-m.hs
@@ -1,11 +1,11 @@
 -- sc-users, 2007-04-06 (pj) [paul jones]
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 insects :: UId m => m UGen
 insects = do
-  n1 <- brownNoise AR
-  n2 <- lfNoise2 KR 50
+  n1 <- brownNoiseM AR
+  n2 <- lfNoise2M KR 50
   let o = sinOsc KR (n2 * 50 + 50) 0 * 100 + 2000
   return (bpf n1 o 0.001 * 10)
 
diff --git a/gr/forest-sounds.scd b/gr/forest-sounds.scd
--- a/gr/forest-sounds.scd
+++ b/gr/forest-sounds.scd
@@ -2,4 +2,4 @@
                 ; var n2 = LFNoise2.kr(50)
                 ; var o = SinOsc.kr(n2 * 50 + 50, 0) * 100 + 2000
                 ; BPF.ar(n1, o, 0.001) * 10 }
-; Out.ar(0, Array.fill(2, insects)) }.play
+; Array.fill(2, insects) }.play
diff --git a/gr/fwalk-m.hs b/gr/fwalk-m.hs
--- a/gr/fwalk-m.hs
+++ b/gr/fwalk-m.hs
@@ -1,13 +1,13 @@
 -- fwalk (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  t <- dustM KR 3
+  r1 <- tIRandM 0 6 t
+  r2 <- tRandM (-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
diff --git a/gr/griot.scd b/gr/griot.scd
new file mode 100644
--- /dev/null
+++ b/gr/griot.scd
@@ -0,0 +1,26 @@
+// griot modeling (jmcc)
+
+{
+    // maximum delay time
+    var maxdt = Server.default.sampleRate * 0.03;
+    // number of delay lines
+    var n = 5;
+    // allocate buffers for the delay lines
+    var buf = Array.fill(n, { LocalBuf.newFrom(Array.fill(maxdt,0)); });
+    // assign tap times which determine the string pitches
+    var tapTimes = Array.series(n, 0.003, 0.0005);
+    // excitation (brownian in place of jmcc melody function...)
+    var exc_env = Env.new([0,1,0], [0.01, 0.2], -2);
+    var exc_trig = Impulse.kr(n,0);
+    var exc_ch = Demand.kr(exc_trig,0,Dbrown(0,n-1,1,inf));
+    var exc_fr = MouseY.kr(10, 10000);
+    var exc_sg = LFNoise2.ar(exc_fr, EnvGen.kr(exc_env, exc_trig, 0.1.rand));
+    var exc = n.collect({arg i; exc_sg * ((exc_ch - i).abs < 1)});
+    // tap the delay lines
+    var del = n.collect({arg i; Tap.ar(buf[i], 1, tapTimes[i])});
+    // filter the taps
+    var flt = LPF.ar(del, MouseX.kr(10, 10000), 0.98);
+    // write to delay lines
+    n.do({arg i; RecordBuf.ar(flt[i] + exc[i],buf[i])});
+    Mix.ar(flt);
+}.play
diff --git a/gr/h-chatter-m.hs b/gr/h-chatter-m.hs
--- a/gr/h-chatter-m.hs
+++ b/gr/h-chatter-m.hs
@@ -1,27 +1,26 @@
 -- h-chatter (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+      h0 = do n <- mma 5 5 =<< lfNoise0M KR 1
+              a <- mma 0.2 1.2 =<< lfNoise2M KR n
+              b <- mma 0.15 0.15 =<< lfNoise2M 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
+      h1 = do n0 <- lfNoise0M KR 32
+              n1 <- lfNoise0M 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
+                  h = linLin_b n0 1 32
+                  p = linLin_b n1 2400 3200
+                  l = linLin_b n1 (-0.75) 0.75
+                  g = linLin_b n1 0.55 0.85
                   f = 40
-                  o = blip AR (wrp (henonN AR f a b 0 0) p (p * 2)) h
+                  o = blip AR (linLin_b (henonN AR f a b 0 0) p (p * 2)) h
               return (pan2 o l g * 0.35)
   h0 .+. h1
 
diff --git a/gr/h-chatter.scd b/gr/h-chatter.scd
--- a/gr/h-chatter.scd
+++ b/gr/h-chatter.scd
@@ -15,4 +15,4 @@
            ; var f = 40
            ; var o = Blip.ar(HenonN.ar(f, a, b, 0, 0).range(p, p * 2), h)
            ; Pan2.ar(o, l, g) * 0.35 }
-; Out.ar(0, h0.value + h1.value) }.play
+; h0.() + h1.() }.play
diff --git a/gr/half-life.hs b/gr/half-life.hs
--- a/gr/half-life.hs
+++ b/gr/half-life.hs
@@ -1,12 +1,12 @@
 -- half-life (jrhb)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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)
+      n = max 0 (n_atoms - pulseCount (localIn' 2 AR) 0)
       activity = dust 'α' AR (n * log 2 * t_half)
   in mrg [activity,localOut activity]
 
diff --git a/gr/half-life.scd b/gr/half-life.scd
--- a/gr/half-life.scd
+++ b/gr/half-life.scd
@@ -3,4 +3,4 @@
 ; var n = max(0, n_atoms - PulseCount.ar(LocalIn.ar(2), 0))
 ; var activity = Dust.ar(n * 2.log / t_half)
 ; LocalOut.ar(activity)
-; Out.ar(0, activity) }.play
+; activity }.play
diff --git a/gr/hansm.hs b/gr/hansm.hs
--- a/gr/hansm.hs
+++ b/gr/hansm.hs
@@ -1,4 +1,4 @@
--- http://www.fredrikolofsson.com/f0blog/?q=node/457 (f0)
+-- http://www.fredrikolofsson.com/f0blog/?q=node/457 (f0) (af)
 -- http://obiwannabe.co.uk/tutorials/html/tutorial_birds.html
 
 import Sound.OSC {- hosc -}
diff --git a/gr/hard-sync-sawtooth-with-lfo.hs b/gr/hard-sync-sawtooth-with-lfo.hs
new file mode 100644
--- /dev/null
+++ b/gr/hard-sync-sawtooth-with-lfo.hs
@@ -0,0 +1,16 @@
+-- hard sync sawtooth with lfo (jmcc) #6
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+hsswl :: UGen
+hsswl =
+    let f = midiCPS (30 + iRand 'α' 0 50)
+        o = sinOsc KR 0.2 (mce [0, rand 'β' 0 (2 * pi)]) * (2 * f) + (3 * f)
+    in syncSaw AR (mce [f, f + 0.2]) o * 0.05
+
+pp :: UGen -> UGen
+pp z = combN z 0.3 0.3 4 + mceReverse z
+
+main :: IO ()
+main = overlapTextureU_pp (4,4,4,maxBound) hsswl 2 pp
diff --git a/gr/hard-sync-sawtooth-with-lfo.scd b/gr/hard-sync-sawtooth-with-lfo.scd
new file mode 100644
--- /dev/null
+++ b/gr/hard-sync-sawtooth-with-lfo.scd
@@ -0,0 +1,11 @@
+// hard sync sawtooth with lfo (jmcc) #6
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var f = (30 + 50.rand).midicps;
+    SyncSaw.ar([f, f + 0.2], SinOsc.kr(0.2, [0, 2pi.rand], 2*f, 3*f), 0.05);
+}, 4, 4, 4, postProcess: {
+    arg z;
+    CombN.ar(z, 0.3, 0.3, 4, 1, z.reverse);
+}, numChannels: 2);
diff --git a/gr/harmonic-swimming-m.hs b/gr/harmonic-swimming-m.hs
--- a/gr/harmonic-swimming-m.hs
+++ b/gr/harmonic-swimming-m.hs
@@ -1,6 +1,6 @@
--- harmonic swimming (jmcc)
+-- harmonic swimming (jmcc) #1
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 harmonic_swimming :: UId m => m UGen
 harmonic_swimming =
@@ -8,8 +8,8 @@
         f = 50
         p = 20
         l = line KR 0 (- a) 60 DoNothing
-        o h = do r <- clone 2 (rand 2 8)
-                 n <- lfNoise1 KR r
+        o h = do r <- clone 2 (randM 2 8)
+                 n <- lfNoise1M KR r
                  let e = max 0 (n * a + l)
                  return (fSinOsc AR (f * (h + 1)) 0 * e)
     in fmap sum (mapM o [0..p])
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)
+-- harmonic swimming (jmcc) #1
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 harmonic_swimming :: UGen
 harmonic_swimming =
diff --git a/gr/harmonic-swimming.scd b/gr/harmonic-swimming.scd
--- a/gr/harmonic-swimming.scd
+++ b/gr/harmonic-swimming.scd
@@ -1,10 +1,12 @@
-{ var a = 0.02
-; var f = 50
-; var p = 20
-; var l = Line.kr(0, a.neg, 60, 0)
-; var o = { arg h
-          ; var r = 6 + [Rand.new(-4, 4), Rand.new(-4, 4)]
-          ; var n = LFNoise1.kr(r)
-          ; var e = max(0, n * a + l)
-          ; FSinOsc.ar(f * (h + 1), 0) * e }
-; Out.ar(0, (0..p).collect(o).sum) }.play
+// harmonic swimming (jmcc) #1
+
+{var a = 0.02 /* amplitude scale */
+;var f = 50 /* fundamental frequency */
+;var p = 20 /* number of partials per channel */
+;var l = Line.kr(0, a.neg, 60, 0) /* amplitude offset, causes sound to separate and fade */
+;var o = {arg h
+         ;var r = 6 + [Rand(-4, 4), Rand(-4, 4)] /* amplitude rate */
+         ;var n = LFNoise1.kr(r)
+         ;var e = max(0, n * a + l) /* clip negative amplitudes to zero */
+         ;FSinOsc.ar(f * (h + 1), 0) * e}
+;(0..p).collect(o).sum}.play
diff --git a/gr/harmonic-tumbling-m.hs b/gr/harmonic-tumbling-m.hs
--- a/gr/harmonic-tumbling-m.hs
+++ b/gr/harmonic-tumbling-m.hs
@@ -1,14 +1,14 @@
--- harmonic tumbling (jmcc)
+-- harmonic tumbling (jmcc) #1
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+      o h = do n <- dustM KR t
+               r <- randM 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])
diff --git a/gr/harmonic-tumbling.hs b/gr/harmonic-tumbling.hs
new file mode 100644
--- /dev/null
+++ b/gr/harmonic-tumbling.hs
@@ -0,0 +1,17 @@
+-- harmonic tumbling (jmcc) #1
+
+import Sound.SC3 {- hsc3 -}
+
+harmonic_tumbling :: UGen
+harmonic_tumbling =
+  let f = 80
+      p = 10::Int
+      t = xLine KR (mce2 10 11) 0.1 60 DoNothing
+      o h = let n = dust h KR t
+                r = rand h 0.25 0.5
+                e = decay2 (n * 0.02) 0.005 r
+            in fSinOsc AR (f * (fromIntegral h + 1)) 0 * e
+  in sum (map o [0..p])
+
+main :: IO ()
+main = audition (out 0 harmonic_tumbling)
diff --git a/gr/harmonic-tumbling.scd b/gr/harmonic-tumbling.scd
--- a/gr/harmonic-tumbling.scd
+++ b/gr/harmonic-tumbling.scd
@@ -1,9 +1,11 @@
+// harmonic tumbling (jmcc) #1
+
 {var f = 80
 ;var p = 10
-;var t = XLine.kr([10,11],0.1,60,doneAction: 0)
+;var t = XLine.kr([10,11],0.1,60,doneAction: 0) /* trigger probability decreases over time */
 ;var o = {arg h
          ;var n = Dust.kr(t)
-         ;var r = Rand.new(0,0.5)
+         ;var r = Rand(0,0.5)
          ;var e = Decay2.kr(n * 0.02,0.005,r)
          ;FSinOsc.ar(f * (h + 1),0) * e}
-;Out.ar(0,(0..p).collect(o).sum)}.play
+;(0..p).collect(o).sum}.play
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
@@ -1,12 +1,12 @@
--- hell is busy (jmcc)
+-- hell is busy (jmcc) #1
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+        a = lfPulse KR (1 + rand 'β' 0 10.0) 0 (rand 'γ' 0 0.7) * 0.04
     in pan2 (o * a) (rand 'δ' (-1) 1) 1
 
 main :: IO ()
diff --git a/gr/hell-is-busy.scd b/gr/hell-is-busy.scd
--- a/gr/hell-is-busy.scd
+++ b/gr/hell-is-busy.scd
@@ -1,2 +1,9 @@
-var o = FSinOsc.ar(400+2000.0.rand,LFPulse.kr(1+10.0.rand,0.7.rand,0.04));
-{OverlapTexture.ar({Pan2.ar(o,1.0.rand2)},4,4,8,2)}.play
+// hell is busy (jmcc) #1
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var n = 8; /* number of simultaneous events */
+    var e = LFPulse.kr(1+10.0.rand, 0, 0.7.rand, 0.04); /* amplitude envelope */
+    Pan2.ar(FSinOsc.ar(400+2000.0.rand, 0, e),1.0.rand2)
+}, 4, 4, 8)
diff --git a/gr/implosion-m.hs b/gr/implosion-m.hs
--- a/gr/implosion-m.hs
+++ b/gr/implosion-m.hs
@@ -1,6 +1,6 @@
 -- implosion (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 mkls :: [(UGen,UGen)] -> UGen -> UGen
 mkls bp t =
@@ -14,17 +14,16 @@
 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)
+  n <- whiteNoiseM rt
+  return (linLin_b 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
+  n0 <- randM (-1) 0
+  n1 <- randM 0 1
+  d  <- randM 7.5 13.5
+  f0 <- randM 10990 16220
+  f1 <- randM  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
diff --git a/gr/impulse-sequencer.hs b/gr/impulse-sequencer.hs
new file mode 100644
--- /dev/null
+++ b/gr/impulse-sequencer.hs
@@ -0,0 +1,27 @@
+-- impulse sequencer (jmcc) SC2
+
+import Sound.SC3 {- hsc3 -}
+
+isequ :: ID i => i -> [UGen] -> UGen -> UGen
+isequ z s tr = tr * demand tr 0 (dseq z dinf (mce s))
+
+impulse_sequencer :: UGen
+impulse_sequencer =
+    let -- single sample impulse as trigger
+        t = impulse AR 8 0
+        -- clave rhythm
+        c_sq = isequ 'α' [1,0,0,1,0,0,1,0,0,0,1,0,1,0,0,0] t
+        c = decay2 c_sq 0.001 0.3 * fSinOsc AR 1700 0 * 0.1
+        -- dee dee dee dee dee
+        d_sq = isequ 'β' [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0] t
+        d = decay2 d_sq 0.001 0.3 * fSinOsc AR 2400 0 * 0.04
+        -- noise drum
+        n_sq = isequ 'γ' [1.0, 0.1, 0.1, 1.0, 0.1, 1.0, 0.1, 0.1] t
+        n = decay2 n_sq 0.001 0.25 * brownNoise 'δ' AR * 0.1
+        -- bass drum
+        b_sq = isequ 'ε' [1,0,0.2,0,0.2,0,0.2,0] t
+        b = decay2 b_sq 0.001 0.5 * fSinOsc AR 100 0 * 0.2
+    in c + d + n + b
+
+main :: IO ()
+main = audition (out 0 impulse_sequencer)
diff --git a/gr/impulse-sequencer.scd b/gr/impulse-sequencer.scd
new file mode 100644
--- /dev/null
+++ b/gr/impulse-sequencer.scd
@@ -0,0 +1,18 @@
+// impulse sequencer (jmcc) SC2
+
+{var isequ = {arg s, tr; tr * Demand.ar(tr, 0, Dseq(s, inf))}
+// single sample impulse as trigger
+;var t = Impulse.ar(8)
+// clave rhythm
+;var c_sq = isequ.([1,0,0,1,0,0,1,0,0,0,1,0,1,0,0,0],t)
+;var c = Decay2.ar(c_sq, 0.001, 0.3, FSinOsc.ar(1700, 0, 0.1))
+// dee dee dee dee dee
+;var d_sq = isequ.([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0], t)
+;var d = Decay2.ar(d_sq, 0.001, 0.3, FSinOsc.ar(2400, 0, 0.04))
+// noise drum
+;var n_sq = isequ.([1.0, 0.1, 0.1, 1.0, 0.1, 1.0, 0.1, 0.1], t)
+;var n = Decay2.ar(n_sq, 0.001, 0.25, BrownNoise.ar(0.1))
+// bass drum
+;var b_sq = isequ.([1,0,0.2,0,0.2,0,0.2,0], t)
+;var b = Decay2.ar(b_sq, 0.001, 0.5, FSinOsc.ar(100, 0, 0.2))
+;c + d + n + b}.play
diff --git a/gr/insects-m.hs b/gr/insects-m.hs
--- a/gr/insects-m.hs
+++ b/gr/insects-m.hs
@@ -1,15 +1,15 @@
 -- insects (sp)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  r1 <- randM 2000 3000
+  r2 <- randM 0.05 0.1
+  n1 <- lfNoise2M KR (r2 * 50 + 50)
+  r4 <- randM 1 10
+  r5 <- randM 0.05 0.1
+  n2 <- lfNoise2M 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)
diff --git a/gr/jr-100515.hs b/gr/jr-100515.hs
new file mode 100644
--- /dev/null
+++ b/gr/jr-100515.hs
@@ -0,0 +1,19 @@
+-- http://permalink.gmane.org/gmane.comp.audio.supercollider.user/100515 (jr)
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import System.Random {- random -}
+
+pat :: UGen
+pat = panAz 32 (sinOscFB AR 18 1.4) (sinOscFB AR 0.2 1.4) 1 2 0.5
+
+mat :: Int -> UGen -> UGen
+mat n x = splay (sinOscFB AR (expRandN n 'α' 1 11e3) x * x) 1 1 0 True
+
+main :: IO ()
+main = do
+  let r = randomRs (1,64) (mkStdGen 245763)
+      f (n0:n) = (mat n0 pat,n)
+      f [] = undefined
+  overlapTextureS (6,2,2,maxBound) f r
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,20 +1,19 @@
 -- k-ppr-m (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  let 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
+      tf = linLin_b ti 100 200
       t = impulse AR tf 0
       stream lf rf ld rd g =
-          do r1 <- rand 9 18
+          do r1 <- randM 9 18
              let t' = pulseDivider t r1 0
-             r2 <- tRand lf (wrp ti lf rf) t'
-             r3 <- tRand ld rd t'
+             r2 <- tRandM lf (linLin_b ti lf rf) t'
+             r3 <- tRandM 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
diff --git a/gr/k-ppr.hs b/gr/k-ppr.hs
--- a/gr/k-ppr.hs
+++ b/gr/k-ppr.hs
@@ -1,20 +1,18 @@
 -- k-ppr (rd)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 k_ppr :: UGen
 k_ppr =
-  let wrp i = linLin i (-1) 1
-      x = mouseX KR 0.05 0.35 Linear 0.1
+  let 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
+      tf = linLin_b 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'
+              r2 = tRand e lf (linLin_b 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
diff --git a/gr/k-ppr.scd b/gr/k-ppr.scd
--- a/gr/k-ppr.scd
+++ b/gr/k-ppr.scd
@@ -4,11 +4,11 @@
 ; var tf = ti.range(100, 200)
 ; var t = Impulse.ar(tf, 0)
 ; var stream = { arg lf, rf, ld, rd, g
-               ; { var r1 = Rand.new(9, 18)
+               ; { var r1 = Rand(9, 18)
                  ; var t_ = PulseDivider.ar(t, r1, 0)
                  ; var r2 = TRand.ar(lf, ti.range(lf, rf), t_)
                  ; var r3 = TRand.ar(ld, rd, t_)
                  ; Ringz.ar(Decay2.ar(t_, 0.01, 0.5), r2, r3 * y) * g } }
-; var s1 = stream.value(3140, 6240, 0.050, 0.005, 0.15)
-; var s2 = stream.value(0400, 9000, 0.005, 0.005, 0.15)
-; Out.ar(0, Array.fill(2, s1) + Array.fill(2, s2)) }.play
+; var s1 = stream.(3140, 6240, 0.050, 0.005, 0.15)
+; var s2 = stream.(0400, 9000, 0.005, 0.005, 0.15)
+; Array.fill(2, s1) + Array.fill(2, s2) }.play
diff --git a/gr/k2ws-hp.hs b/gr/k2ws-hp.hs
--- a/gr/k2ws-hp.hs
+++ b/gr/k2ws-hp.hs
@@ -1,17 +1,17 @@
 -- https://www.listarc.bham.ac.uk/lists/sc-users/msg21341.html (mn)
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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 fc = 400 + range 100 200 #(lfNoise2M AR (mce2 1 2))
+  let fm = range 100 200 #(lfNoise0M AR 5)
+  let i = range 1 20 #(lfNoise1M 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
+  let rf = range 1000 2000 (sinOsc AR (range 0.1 1 #(lfNoise1M AR 1)) 0)
+  let rq = range 0.5 10 #(lfNoise1M AR 1)
+  let ph = rlpf x rf rq * range 1.0 4.0 #(lfNoise1M AR 0.1) * 4 * pi
   return (sinOsc AR 0.2 ph * 0.5)
 
 main :: IO ()
diff --git a/gr/k2ws.hs b/gr/k2ws.hs
--- a/gr/k2ws.hs
+++ b/gr/k2ws.hs
@@ -1,6 +1,6 @@
 -- https://www.listarc.bham.ac.uk/lists/sc-users/msg21341.html (mn)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 rng :: (UGen,UGen) -> UGen -> UGen
 rng (i,j) = range i j
diff --git a/gr/k2ws.scd b/gr/k2ws.scd
--- a/gr/k2ws.scd
+++ b/gr/k2ws.scd
@@ -8,5 +8,4 @@
 ;var rq = LFNoise1.ar(1).range(0.5,10)
 ;var a = RLPF.ar(x, rf, rq)
 ;var ph = a * LFNoise1.ar(0.1).range(1.0,4.0) * 4pi
-;var o = SinOsc.ar(0.2,ph) * 0.5
-;Out.ar(0,o)}.play
+;SinOsc.ar(0.2,ph) * 0.5}.play
diff --git a/gr/kabelscahden.hs b/gr/kabelscahden.hs
--- a/gr/kabelscahden.hs
+++ b/gr/kabelscahden.hs
@@ -1,6 +1,6 @@
 -- march 2003 (adc) / (jrhb)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 kabelScahden :: UGen
 kabelScahden =
diff --git a/gr/karplus-strong.hs b/gr/karplus-strong.hs
--- a/gr/karplus-strong.hs
+++ b/gr/karplus-strong.hs
@@ -1,7 +1,7 @@
 -- http://doc.gold.ac.uk/~ma503am/alex/vocable-source-released/ (am)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 -- x = delay, y = blend / gain
 karplus_strong :: UGen
@@ -20,7 +20,7 @@
         laggedDelay = lag x 0.01
         o = sinOsc AR 200 0
         a0 = decay d 0.025 * o
-        a1 = localIn 1 AR + (a0 * (y - 0.25))
+        a1 = localIn' 1 AR + (a0 * (y - 0.25))
         a2 = delayN a1 0.01 laggedDelay
         a3 = delay1 a2
         a4 = (a2 + a3) * 0.5
diff --git a/gr/klink.hs b/gr/klink.hs
--- a/gr/klink.hs
+++ b/gr/klink.hs
@@ -1,6 +1,6 @@
 -- klink (rd)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 klink :: UGen
 klink =
diff --git a/gr/klink.scd b/gr/klink.scd
--- a/gr/klink.scd
+++ b/gr/klink.scd
@@ -7,4 +7,4 @@
 ;var y = MouseY.kr(0.5,2.0,'linear',0.2)
 ;var n2 = TRand.ar(x,3940,t)
 ;var n3 = TRand.ar(0.005,0.275,t)
-;Out.ar(0,Ringz.ar(i,n2,n3 * y))}.play
+;Ringz.ar(i,n2,n3 * y)}.play
diff --git a/gr/landon-rose.hs b/gr/landon-rose.hs
new file mode 100644
--- /dev/null
+++ b/gr/landon-rose.hs
@@ -0,0 +1,27 @@
+-- landon rose (jmcc) #8
+
+import Sound.SC3 {- hsc3 -}
+
+nt :: Num n => [[n]]
+nt = [[32,43,54, 89]
+     ,[10,34,80,120]
+     ,[67,88,90,100]
+     ,[76,88,99,124]]
+
+fr :: Floating n => [[n]]
+fr = map (map midiCPS') nt
+
+nd :: ID a => a -> UGen -> [UGen] -> UGen
+nd z e f =
+    let p = klankSpec f (replicate 4 1) (replicate 4 3)
+        x = e * pinkNoise z AR * mce2 0.0011 0.0012
+    in klank x 1 0 1 p
+
+env :: Real n => n -> UGen
+env i = abs (sinOsc AR (1 / 8) ((constant i / 2) * pi))
+
+lr :: UGen
+lr = sum (zipWith3 nd "αβγδ" (map env [0 .. 3]) fr)
+
+main :: IO ()
+main = audition (out 0 lr)
diff --git a/gr/landon-rose.scd b/gr/landon-rose.scd
new file mode 100644
--- /dev/null
+++ b/gr/landon-rose.scd
@@ -0,0 +1,18 @@
+// landon rose (jmcc) #8
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~spawn.({
+    arg i;
+    var tring = #[3, 3, 3, 3];
+    var specList = [
+        `[ [32,43,54, 89].midicps, nil, tring ],
+        `[ [10,34,80,120].midicps, nil, tring ],
+        `[ [67,88,90,100].midicps, nil, tring ],
+        `[ [14,23,34, 45].midicps, nil, tring ],
+        `[ [76,88,99,124].midicps, nil, tring ]
+    ];
+    var e = Env.sine(4,1);
+    var n = PinkNoise.ar([0.001,0.001]);
+    Klank.ar(specList.wrapAt(i),n) * EnvGen.ar(e,doneAction:2);
+}, 2);
diff --git a/gr/laser-bubble.hs b/gr/laser-bubble.hs
--- a/gr/laser-bubble.hs
+++ b/gr/laser-bubble.hs
@@ -1,6 +1,6 @@
 -- https://www.listarc.bham.ac.uk/lists/sc-users/msg14775.html
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 laser_bubble_f :: ID a => a -> UGen
 laser_bubble_f z =
diff --git a/gr/lf-pulses.hs b/gr/lf-pulses.hs
--- a/gr/lf-pulses.hs
+++ b/gr/lf-pulses.hs
@@ -1,6 +1,6 @@
 -- lf pulses (rd)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 lf_pulses :: UGen
 lf_pulses =
diff --git a/gr/lf-pulses.scd b/gr/lf-pulses.scd
--- a/gr/lf-pulses.scd
+++ b/gr/lf-pulses.scd
@@ -3,4 +3,4 @@
 ; var x = MouseX.kr(0.012, 0.19, 'exponential', 0.1)
 ; var f = Formlet.ar(Blip.ar(10, 12), n0 * 43 + 700, 0.005, x)
 ; var o = SinOsc.ar(40, 0) * n1
-; Out.ar(0, LeakDC.ar(f + o, 0.995).clip2(0.75)) }.play
+; LeakDC.ar(f + o, 0.995).clip2(0.75) }.play
diff --git a/gr/lfo-modulation.hs b/gr/lfo-modulation.hs
--- a/gr/lfo-modulation.hs
+++ b/gr/lfo-modulation.hs
@@ -1,10 +1,13 @@
--- lfo modulation (jmcc)
+-- lfo modulation (jmcc) #1
 
 import Sound.SC3 {- hsc3 -}
 
-main :: IO ()
-main =
+lfo_modulation :: UGen
+lfo_modulation =
   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))
+  in combL s 0.3 (mce2 0.2 0.25) 2
+
+main :: IO ()
+main = audition (out 0 lfo_modulation)
diff --git a/gr/lfo-modulation.scd b/gr/lfo-modulation.scd
--- a/gr/lfo-modulation.scd
+++ b/gr/lfo-modulation.scd
@@ -1,4 +1,6 @@
+// lfo modulation (jmcc) #1
+
 {var o = FSinOsc.kr(0.05,0,80,160)
 ;var p = FSinOsc.kr([0.6,0.7],0,3600,4000)
 ;var s = RLPF.ar(LFPulse.ar(o,0,0.4,0.05),p,0.2)
-;Out.ar(0,CombL.ar(s,0.3,[0.2,0.25],2))}.play
+;CombL.ar(s,0.3,[0.2,0.25],2)}.play
diff --git a/gr/lg-timed-m.hs b/gr/lg-timed-m.hs
--- a/gr/lg-timed-m.hs
+++ b/gr/lg-timed-m.hs
@@ -1,13 +1,13 @@
 -- lg-timed (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+          do d0 <- dserM r p
+             d1 <- dconsM 0 d0
+             d2 <- dserM r y
              let t = tDuty AR d1 0 RemoveSynth d2 1
              return (latch t t)
       lg u = return (lag u 0.03)
diff --git a/gr/lg-timed.scd b/gr/lg-timed.scd
--- a/gr/lg-timed.scd
+++ b/gr/lg-timed.scd
@@ -1,11 +1,11 @@
 { var dcons = { arg x, xs
-              ; var i = Dseq.new([0, 1], 1)
-              ; var a = Dseq.new([x, xs], 1)
-              ; Dswitch.new(a, i) }
+              ; var i = Dseq([0, 1], 1)
+              ; var a = Dseq([x, xs], 1)
+              ; Dswitch(a, i) }
 ; var timed = { arg r, y, p
-              ; var d0 = Dser.new(p, r)
-              ; var d1 = dcons.value(0, d0)
-              ; var d2 = Dser.new(y, r)
+              ; var d0 = Dser(p, r)
+              ; var d1 = dcons.(0, d0)
+              ; var d2 = Dser(y, r)
               ; var t = TDuty.ar(d1, 0, d2, 2, 1)
               ; Latch.ar(t, t) }
 ; var lg = { arg u
@@ -14,6 +14,6 @@
 ; var a = [0.35, 0.15, 0.04, 0.05, 0.16, 0.07]
 ; var d = [0.1, 0.5, 0.09, 0.08, 0.07, 0.3]
 ; var x = MouseX.kr(0.5, 1.25, 'linear', 0.2)
-; var tn = lg.value(timed.value(inf, n, d * x))
-; var ta = lg.value(timed.value(inf, a, d * x))
-; Out.ar(0, SinOsc.ar(tn.midicps, 0) * ta) }.play
+; var tn = lg.(timed.(inf, n, d * x))
+; var ta = lg.(timed.(inf, a, d * x))
+; SinOsc.ar(tn.midicps, 0) * ta }.play
diff --git a/gr/lots-o-sines.scd b/gr/lots-o-sines.scd
new file mode 100644
--- /dev/null
+++ b/gr/lots-o-sines.scd
@@ -0,0 +1,11 @@
+// lots-o-sins (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~xfade_texture.({
+    var n = 60; // n sines in each channel (twice as many during cross-fade)
+    var z = [`[Array.fill(n, { 40 + 10000.0.linrand} ), nil, nil],
+        `[Array.fill(n, { 40 + 10000.0.linrand} ), nil, nil]
+    ];
+    Klang.ar(z, 1, 0) * (0.1/n);
+}, 4, 4);
diff --git a/gr/lp.hs b/gr/lp.hs
new file mode 100644
--- /dev/null
+++ b/gr/lp.hs
@@ -0,0 +1,47 @@
+-- http://article.gmane.org/gmane.comp.lang.haskell.art/993
+
+import Sound.SC3 {- hsc3 -}
+
+lp :: Synthdef
+lp =
+    let in_bus = control KR "in_bus" 0
+        out_bus = control KR "out_bus" 0
+        buf_num = control KR "buf_num" 0
+        lp_frames = control KR "lp_frames" 48000
+        rec_level = control KR "rec_level" 1
+        mute = control KR "mute" 0
+        oct = control KR "oct" 1
+        dir = control KR "dir" 1
+        latency = control KR "latency" 256
+        t_reset = tr_control "t_reset" 0
+        lp_frames' = min (bufFrames KR buf_num) lp_frames
+        rec_ph = phasor AR t_reset (oct * dir) 0 lp_frames' 0
+        play_ph = wrap (rec_ph + latency) 0 (lp_frames' - 1)
+        play_rd = bufRdL 1 AR buf_num play_ph Loop
+        rec_rd = bufRdL 1 AR buf_num rec_ph Loop
+        in_sig = soundIn in_bus * rec_level
+        env = envGen KR (1 - mute) 1 0 1 DoNothing (envADSR 0.05 1 1 0.1 1 (EnvNum (-4)) 0)
+        wr = bufWr buf_num rec_ph Loop (in_sig + rec_rd)
+    in synthdef "lp" (mrg2 (out out_bus (play_rd * env)) wr)
+
+node_id :: Int
+node_id = 1000
+
+set :: String -> Double -> IO ()
+set k v = withSC3 (send (n_set1 node_id k v))
+
+main :: IO ()
+main =
+    withSC3$do
+      _ <- async (b_alloc 0 (48000 * 2) 1)
+      play_at (node_id,AddToHead,1) lp
+
+{-
+set "oct" 1.0
+set "dir" 1.0
+set "mute" 0.0
+set "t_reset" 1.0
+set "lp_frames" (48000 * 2.0)
+set "rec_level" 1
+set "latency" 300
+-}
diff --git a/gr/lp.scd b/gr/lp.scd
new file mode 100644
--- /dev/null
+++ b/gr/lp.scd
@@ -0,0 +1,29 @@
+// http://article.gmane.org/gmane.comp.lang.haskell.art/993
+
+SynthDef(\lp,{
+    arg in_bus=0,out_bus=0,buf_num=0,lp_frames=48000,rec_level=1,mute=0,oct=1,dir=1,latency=256,t_reset=0;
+    var lp_frames_chk = min(BufFrames.kr(buf_num),lp_frames);
+    var rec_ph = Phasor.ar(t_reset,oct * dir,0,lp_frames_chk,0);
+    var play_ph = Wrap.ar((rec_ph + latency),0,lp_frames_chk - 1);
+    var play_rd = BufRd.ar(1,buf_num,play_ph,1,2);
+    var rec_rd = BufRd.ar(1,buf_num,rec_ph,1,2);
+    var in_sig = SoundIn.ar(in_bus) * rec_level;
+    var env = EnvGen.kr(Env.adsr(0.05,1,1,0.1),1 - mute);
+    BufWr.ar(in_sig + rec_rd, buf_num, rec_ph, 1);
+    Out.ar(out_bus,play_rd.dup * env);
+}).add;
+
+SynthDescLib.at(\lp).def.draw
+b = Buffer.alloc(s,2 * s.sampleRate);
+l = Synth(\lp, [\buf_num, b, \lp_frames, b.numFrames]);
+l.set(\lp_frames, b.numFrames);
+l.set(\rec_level, 1.0);
+l.set(\mute, 0.0);
+l.set(\oct, 1.0);
+l.set(\dir, 1.0);
+l.set(\latency, 300);
+l.set(\t_reset, 1);
+b.zero
+
+r = {{l.set(\oct, rrand(0.75,1.15)); l.set(\dir, [-1.0,1.0].choose); rrand(0.15,0.5).wait}.loop}.fork;
+r.stop;
diff --git a/gr/lso-061101-m.hs b/gr/lso-061101-m.hs
--- a/gr/lso-061101-m.hs
+++ b/gr/lso-061101-m.hs
@@ -1,15 +1,17 @@
 -- | L-System oscillator (rd), 2006-11-01
 
 import Control.Monad {- base -}
+import System.Directory {- directory -}
+import qualified System.FilePath as P {- filepath -}
+
 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 {- 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).
 --
@@ -83,14 +85,12 @@
 -- | 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
+  b <- tIRandM 0 12 t
   let n  = bufFrames KR b
       m  = n / 4
-      i  = floorE (rng (lfSaw AR c 0) 0 m) * 4
+      i  = floorE (linLin_b (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
@@ -98,8 +98,8 @@
       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)
+      o x y = let f = linExp_b x f0 f1
+              in pan2 (blip AR f (linLin_b y 1 64)) y0 (decay tt 0.005)
   return (o x0 y0 + o x1 y1)
 
 main :: IO ()
diff --git a/gr/lucier.hs b/gr/lucier.hs
--- a/gr/lucier.hs
+++ b/gr/lucier.hs
@@ -5,7 +5,7 @@
 http://www.listarc.bham.ac.uk/lists/sc-users/msg47540.html
 -}
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 lucier_wire :: UGen -> UGen
 lucier_wire freq =
@@ -18,7 +18,7 @@
         max_delay = 1.0 -- maximum delay time (corresponds to a length = c * s)
         mk_delay i r = lpz1 (delayC i max_delay (r * string_delay))
         mk_allpass i r dt = lpz1 (allpassC i max_delay (r * string_delay) dt)
-        drv = localIn 1 AR -- driver (source + data stored in the string)
+        drv = localIn' 1 AR -- driver (source + data stored in the string)
         pk1_R =
             let i = drv
                 r = src_pos - pk1_pos
diff --git a/gr/lucier.scd b/gr/lucier.scd
--- a/gr/lucier.scd
+++ b/gr/lucier.scd
@@ -8,9 +8,9 @@
 ; var pk2_p = 0.9
 ; var max_dt = 1
 ; var mk_dl = { arg i, r
-                 ; LPZ1.ar(DelayC.ar(i, max_dt, r * string_dt)) }
+              ; LPZ1.ar(DelayC.ar(i, max_dt, r * string_dt)) }
 ; var mk_ap = { arg i, r, dt
-	          ; LPZ1.ar(AllpassC.ar(i, max_dt, r * string_dt, dt)) }
+              ; LPZ1.ar(AllpassC.ar(i, max_dt, r * string_dt, dt)) }
 ; var drv = LocalIn.ar(1)
 ; var r = { Rand(0.001, 0.11) }
 ; var pk1_R = mk_dl.(drv, src_p - pk1_p, 2 + r.())
diff --git a/gr/lz-bf.hs b/gr/lz-bf.hs
new file mode 100644
--- /dev/null
+++ b/gr/lz-bf.hs
@@ -0,0 +1,24 @@
+-- lz-bf (rd)
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+
+lz_bf_u :: UGen
+lz_bf_u =
+  let x = mouseX KR 1 12 Linear 0.1
+      l = lorenzL AR sampleRate
+                     (mulAdd (lfNoise0 'α' KR x) 2 12)
+                     (mulAdd (lfNoise0 'β' KR x) 20 38)
+                     (mulAdd (lfNoise0 'γ' KR x) 1.5 3)
+                     (mce2 0.025 0.05)
+                     0.1 0.0 0.0
+      p = phasor AR 0 (l * 24 * bufRateScale KR 0) 0 (bufFrames KR 0) 0
+  in bufRd 1 AR 0 p NoLoop CubicInterpolation
+
+lz_bf :: Transport m => String -> m ()
+lz_bf fn = do
+  _ <- async (b_allocRead 0 fn 0 0)
+  play (out 0 lz_bf_u)
+
+main :: IO ()
+main = withSC3 (lz_bf "/home/rohan/data/audio/pf-c5.aif")
diff --git a/gr/m21360.hs b/gr/m21360.hs
--- a/gr/m21360.hs
+++ b/gr/m21360.hs
@@ -1,7 +1,7 @@
 -- https://www.listarc.bham.ac.uk/lists/sc-users/msg21360.html
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 -- > withSC3 (reset >> init_b [0,1])
 init_b :: Transport m => [Int] -> m ()
@@ -20,10 +20,10 @@
         sdt = mce [300,400]
         lpp = mce [rand 'δ' 4300 4500,rand 'ε' 4000 4200]
         sr = sampleRate
-        local = localIn 2 AR
+        local = localIn' 2 AR
         wn = line KR 0 1 0.1 DoNothing * whiteNoise 'ζ' AR * 0.03
         ph = delTapWr AR b (wn + local)
-        fb = delTapRd b ph del 1
+        fb = delTapRd AR b ph del 1
         p_fb = mix (pan2 fb loc 1)
         h_fb = hpf p_fb hpp
         ao = averageOutput (abs h_fb) (impulse KR (recip (avg / sr)) 0)
diff --git a/gr/m21360.scd b/gr/m21360.scd
--- a/gr/m21360.scd
+++ b/gr/m21360.scd
@@ -19,4 +19,4 @@
 ;var n_fb = h_fb * (0.02 / (Lag.ar(ao,sdt / sr).clip(0.0001,1)))
 ;var l_fb = LPF.ar(n_fb,lpf)
 ;LocalOut.ar(l_fb)
-;Out.ar(0,l_fb)}.play;
+;l_fb}.play;
diff --git a/gr/metal-plate.hs b/gr/metal-plate.hs
new file mode 100644
--- /dev/null
+++ b/gr/metal-plate.hs
@@ -0,0 +1,31 @@
+-- metal plate (jmcc) #4
+
+import Sound.SC3 {- hsc3 -}
+
+mp :: UGen
+mp =
+    let
+        sr = 48000
+        -- number of delay lines
+        n = 4
+        -- maximum delay time
+        maxdt = ceiling (sr * 0.03)
+        -- allocate buffers for delay lines
+        buf = map (\k -> asLocalBuf k (replicate maxdt 0)) [0 .. n - 1]
+        -- assign random tap times
+        tap_tm = uclone' 'a' n (rand 'a' 0.015 0.03)
+        -- excitation
+        exc_freq = mouseY KR 10 8000 Linear 0.2
+        exc_trig = impulse AR 0.5 0 * 0.2
+        exc = decay2 exc_trig 0.01 0.2 * lfNoise2 'a' AR exc_freq
+        -- tap the delay lines
+        del = zipWith (tap 1) buf tap_tm
+        -- filter the taps
+        flt_freq = mouseX KR 10 5000 Linear 0.2
+        flt = map (\i -> lpf i flt_freq * 0.98) del
+        -- write to delay lines
+        wr = zipWith (\b f -> recordBuf AR b 0 1 0 1 Loop 1 DoNothing (f + exc)) buf flt
+    in mrg (sum flt : wr)
+
+main :: IO ()
+main = audition (out 0 mp)
diff --git a/gr/metal-plate.scd b/gr/metal-plate.scd
new file mode 100644
--- /dev/null
+++ b/gr/metal-plate.scd
@@ -0,0 +1,24 @@
+// metal plate (jmcc) #4
+
+{
+    // number of delay lines
+    var n = 4;
+    // maximum delay time
+    var maxdt = Server.default.sampleRate * 0.03;
+    // allocate buffers for delay lines
+    var buf = Array.fill(n, {LocalBuf.newFrom(Array.fill(maxdt,0));});
+    // assign random tap times
+    var tap_tm = Array.rand(n, 0.015, 0.03);
+    // excitation
+    var exc_freq = MouseY.kr(10, 8000);
+    var exc_trig = Impulse.ar(0.5, 0, 0.2);
+    var exc = Decay2.ar(exc_trig, 0.01, 0.2, LFNoise2.ar(exc_freq));
+    // tap the delay lines
+    var del = n.collect({arg i; Tap.ar(buf[i], 1, tap_tm[i])});
+    // filter the taps
+    var flt_freq = MouseX.kr(10, 5000);
+    var flt = LPF.ar(del, flt_freq, 0.98);
+    // write to delay lines
+    n.do({arg i; RecordBuf.ar(flt[i] + exc,buf[i])});
+    Mix.ar(flt);
+}.play
diff --git a/gr/microhelix.hs b/gr/microhelix.hs
--- a/gr/microhelix.hs
+++ b/gr/microhelix.hs
@@ -1,6 +1,6 @@
 -- Batuhan Bozkurt 2009 http://www.earslap.com
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 offset_id :: Enum a => Int -> a -> Int
 offset_id n e = n + fromEnum e
diff --git a/gr/modal-space-buf.hs b/gr/modal-space-buf.hs
new file mode 100644
--- /dev/null
+++ b/gr/modal-space-buf.hs
@@ -0,0 +1,29 @@
+-- modal space (jmcc) #8
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+
+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 0.15
+        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/gr/modal-space-buf.scd b/gr/modal-space-buf.scd
new file mode 100644
--- /dev/null
+++ b/gr/modal-space-buf.scd
@@ -0,0 +1,19 @@
+// modal space (jmcc) #8
+
+{var s = Server.default
+;var b = 0
+;var p = FloatArray[0,2,3.2,5,7,9,10]
+;var x = MouseX.kr(0,15,'linear',0.1)
+;var k = DegreeToKey.kr(b,x,12)
+;var c = {arg n,r
+         ;var o = SinOsc.ar((r + k + (n * 0.04)).midicps,0) * 0.1
+         ;var t = LFPulse.ar([48,55].midicps,0,0.15)
+         ;var f = (SinOsc.kr(0.1,0) * 10 + r).midicps
+         ;var d = RLPF.ar(t,f,0.1) * 0.1
+         ;var m = o + d
+         ;CombN.ar(m,0.31,0.31,2) + m}
+;var n = LFNoise1.kr([3,3])
+;var b_setn1 = {arg b,i,p
+               ;["/b_setn",b,i,p.size] ++ p}
+;s.sendMsg("/b_alloc",b,p.size,1,b_setn1.(b,0,p).asRawOSC)
+;(c.(n,48) + c.(n,72)) * 0.25}.play
diff --git a/gr/modal-space.hs b/gr/modal-space.hs
--- a/gr/modal-space.hs
+++ b/gr/modal-space.hs
@@ -1,30 +1,22 @@
--- modal space (jmcc)
+-- modal space, using local buffer (jmcc) #8
 
-import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 ms :: UGen -> UGen -> UGen
 ms n r =
-    let x = mouseX KR 0 15 Linear 0.1
-        k = degreeToKey 0 x 12
+    let b = asLocalBuf 'α' [0,2,3.2,5,7,9,10] -- dorian scale
+        x = mouseX KR 0 15 Linear 0.1 -- mouse indexes into scale
+        k = degreeToKey b x 12 -- 12 notes per octave
         o = sinOsc AR (midiCPS (r + k + n * 0.04)) 0 * 0.1
-        t = lfPulse AR (midiCPS (mce2 48 55)) 0.15 0.5
+        t = lfPulse AR (midiCPS (mce2 48 55)) 0 0.15
         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)
+modal_space = (ms (lfNoise1 'β' KR 3) 48 + ms (lfNoise1 'γ' KR 3) 72) * 0.25
 
 main :: IO ()
-main = withSC3 run
+main = audition (out 0 modal_space)
+
diff --git a/gr/modal-space.scd b/gr/modal-space.scd
--- a/gr/modal-space.scd
+++ b/gr/modal-space.scd
@@ -1,17 +1,14 @@
-{var s = Server.default
-;var b = 0
-;var p = FloatArray[0,2,3.2,5,7,9,10]
+// modal space (jmcc) #8
+
+{var b = LocalBuf.newFrom([0,2,3.2,5,7,9,10])
 ;var x = MouseX.kr(0,15,'linear',0.1)
 ;var k = DegreeToKey.kr(b,x,12)
 ;var c = {arg n,r
          ;var o = SinOsc.ar((r + k + (n * 0.04)).midicps,0) * 0.1
-         ;var t = LFPulse.ar([48,55].midicps,0.15,0.5)
+         ;var t = LFPulse.ar([48,55].midicps,0,0.15)
          ;var f = (SinOsc.kr(0.1,0) * 10 + r).midicps
          ;var d = RLPF.ar(t,f,0.1) * 0.1
          ;var m = o + d
          ;CombN.ar(m,0.31,0.31,2) + m}
 ;var n = LFNoise1.kr([3,3])
-;var b_setn1 = {arg b,i,p
-               ;["/b_setn",b,i,p.size] ++ p}
-;s.sendMsg("/b_alloc",b,p.size,1,b_setn1.value(b,0,p).asRawOSC)
-;Out.ar(0,(c.value(n,48) + c.value(n,72)) * 0.25)}.play
+;(c.(n,48) + c.(n,72)) * 0.25}.play
diff --git a/gr/moto-rev.hs b/gr/moto-rev.hs
--- a/gr/moto-rev.hs
+++ b/gr/moto-rev.hs
@@ -1,4 +1,4 @@
--- moto rev (jmcc)
+-- moto rev (jmcc) #1
 
 import Sound.SC3 {- hsc3 -}
 
diff --git a/gr/moto-rev.scd b/gr/moto-rev.scd
--- a/gr/moto-rev.scd
+++ b/gr/moto-rev.scd
@@ -1,3 +1,5 @@
-{ var f = SinOsc.kr(0.2, 0) * 10 + 21
-; var s = LFPulse.ar(f, [0, 0.1], 0.1)
-; Out.ar(0, RLPF.ar(s, 100, 0.1).clip2(0.4)) }.play
+// moto rev (jmcc) #1
+
+{var f = SinOsc.kr(0.2, 0) * 10 + 21
+;var s = LFPulse.ar(f, [0, 0.1], 0.1)
+;RLPF.ar(s, 100, 0.1).clip2(0.4)}.play
diff --git a/gr/mouse-clatter-m.hs b/gr/mouse-clatter-m.hs
--- a/gr/mouse-clatter-m.hs
+++ b/gr/mouse-clatter-m.hs
@@ -1,32 +1,24 @@
 -- mouse clatter (rd)
 
-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)
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
-run :: (UId m,Transport m) => m ()
-run = do
-  _ <- async (b_alloc 10 2048 1)
-  play . out 0 =<< mouse_clatter
+mouse_clatter :: UGen
+mouse_clatter =
+    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])
+        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 bpf (n3 * e) n4 n5
+        c = pv_Splita 'η' (ffta 'θ' 2048 o 0.5 0 1 0)
+        n7 = pv_RandComb 'ι' c n6 t
+    in mix (o * 0.05 + ifft n7 0 0)
 
 main :: IO ()
-main = withSC3 run
-
-{-
-s.sendMsg('b_alloc', 10, 2048, 1);
--}
+main = audition (out 0 mouse_clatter)
diff --git a/gr/mouse-clatter.scd b/gr/mouse-clatter.scd
--- a/gr/mouse-clatter.scd
+++ b/gr/mouse-clatter.scd
@@ -1,14 +1,14 @@
-{var x = MouseX.kr(100,12000,'linear',0.1)
+{var b = LocalBuf(2048,1)
+;var x = MouseX.kr(100,12000,'linear',0.1)
 ;var y = MouseY.kr(0.01,0.15,'linear',0.1)
 ;var n1 = LFNoise0.kr([3,3.25])
 ;var t = Impulse.kr((n1 * 16) + 18,0)
 ;var n2 = TRand.kr(0.005,y,t)
-;var n3 = WhiteNoise.ar()
+;var n3 = WhiteNoise.ar
 ;var n4 = TRand.kr(10,x,t)
 ;var n5 = TRand.kr(0,1,t)
 ;var n6 = TExpRand.kr(0.15,1,t)
 ;var o = {var e = Decay2.kr(t,0.01,n2)
          ;BPF.ar(n3 * e,n4,n5)}
-;var n7 = PV_RandComb(FFT(10,o),n6,t)
-;var s = (o * 0.05) + IFFT(n7)
-;Out.ar(0,s)}.play
+;var n7 = PV_RandComb(FFT(b,o),n6,t)
+;(o * 0.05) + IFFT(n7)}.play
diff --git a/gr/mouse.hs b/gr/mouse.hs
new file mode 100644
--- /dev/null
+++ b/gr/mouse.hs
@@ -0,0 +1,14 @@
+-- https://mohayonao.github.io/CoffeeCollider/#mouse.coffee
+
+import Sound.SC3 {- hsc3 -}
+
+mouse :: UGen
+mouse =
+    let freq = mouseY KR 100 1000 Exponential 0.1
+        freq1 = freq * mouseX KR 2 0.5 Linear 2.5
+        freq2 = freq * mouseX KR 0.5 2 Linear 2.5
+        feedback = mouseButton KR 0 pi 5
+    in sinOscFB AR (mce2 freq1 freq2) feedback * 0.25
+
+main :: IO ()
+main = audition (out 0 mouse)
diff --git a/gr/mouse.scd b/gr/mouse.scd
new file mode 100644
--- /dev/null
+++ b/gr/mouse.scd
@@ -0,0 +1,7 @@
+// https://mohayonao.github.io/CoffeeCollider/#mouse.coffee
+
+{var freq = MouseY.kr(100, 1000, 'exponential')
+;var freq1 = freq * MouseX.kr(2, 0.5, lag:2.5)
+;var freq2 = freq * MouseX.kr(0.5, 2, lag:2.5)
+;var feedback = MouseButton.kr(0, pi, lag:5)
+;SinOscFB.ar([freq1, freq2], feedback, mul:0.1)}.play;
diff --git a/gr/mridangam-dr.hs b/gr/mridangam-dr.hs
new file mode 100644
--- /dev/null
+++ b/gr/mridangam-dr.hs
@@ -0,0 +1,66 @@
+-- mridangam (jmcc) #SPE3
+
+import Sound.OSC {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Bind as P {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.ID as R {- hsc3-lang -}
+
+-- > let g = drum (dust 'α' AR 1)
+-- > audition (out 0 g)
+drum :: UGen -> UGen
+drum a =
+    let n = whiteNoise 'α' AR * 70
+        e = decay2 a 0.002 0.1
+    in distort (resonz (n * e) (midiCPS 60) 0.02 * 4) * 0.4
+
+drone :: UGen
+drone =
+    let s1 = saw AR (midiCPS (mce2 60 60.04))
+        s2 = saw AR (midiCPS (mce2 67 67.04))
+    in lpf (s1 + s2) (midiCPS 108) * 0.007
+
+lseq :: [Double] -> UGen -> UGen
+lseq l n = dseq 'β' n (mce (map constant l))
+
+lrand :: [[Double]] -> UGen -> UGen
+lrand l n = drand 'γ' n (mce (map (flip lseq 1) l))
+
+a_solo :: UGen
+a_solo =
+    lrand [[0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+          ,[0.9,0.2,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+          ,[0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.2]
+          ,[0.9,0.0,0.0,0.7,0.2,0.2,0.0,0.7,0.0,0.0]
+          ,[0.9,0.0,0.0,0.7,0.0,0.2,0.2,0.7,0.2,0.0]
+          ,[0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.2,0.2]
+          ,[0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.0,0.0]
+          ,[0.9,0.0,0.0,0.7,0.2,0.2,0.2,0.7,0.0,0.0]
+          ,[0.9,0.0,0.4,0.0,0.4,0.0,0.4,0.0,0.4,0.0]
+          ,[0.9,0.0,0.0,0.4,0.0,0.0,0.4,0.2,0.4,0.2]
+          ,[0.9,0.0,0.2,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+          ,[0.9,0.0,0.0,0.7,0.0,0.0,0.0,0.7,0.0,0.0]
+          ,[0.9,0.7,0.7,0.0,0.0,0.2,0.2,0.2,0.0,0.0]
+          ,[0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]] 30
+
+a_seq :: [UGen]
+a_seq =
+    [lseq [0.0] 10
+    -- intro
+    ,lseq [0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.2,0.0,0.2,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.2] 2
+    -- solo
+    ,a_solo
+    -- tehai
+    ,lseq [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
+    ,lseq [5.0] 1]
+
+mridangam :: UGen
+mridangam = drum (tDuty AR (1 / 8) 0 DoNothing (dseq 'δ' 1 (mce a_seq)) 0) + drone
+
+main :: IO ()
+main = audition (out 0 mridangam)
diff --git a/gr/mridangam.hs b/gr/mridangam.hs
--- a/gr/mridangam.hs
+++ b/gr/mridangam.hs
@@ -1,61 +1,65 @@
--- mridangam (jmcc)
+-- mridangam (jmcc) #SPE3
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Bind as P {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.ID as R {- hsc3-lang -}
 
-spe3_mridangam :: Synthdef
-spe3_mridangam =
-    let t_amp = tr_control "t_amp" 1
+mridangam :: UGen
+mridangam =
+    let a = tr_control "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)
+        e = decay2 a 0.002 0.1
+    in distort (resonz (n * e) (midiCPS 60) 0.02 * 4) * 0.4
 
-spe3_drone :: Synthdef
-spe3_drone =
+drone :: UGen
+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)
+    in lpf (s1 + s2) (midiCPS 108) * 0.007
 
-p :: Fractional n => [P n]
-p =
-    [pseq [0.0] 10
+lseq :: [a] -> Int -> [a]
+lseq l n = concat (replicate n l)
+
+lrand :: Enum e => e -> [[a]] -> Int -> [a]
+lrand e l n = concat (R.nchoose e n l)
+
+a_seq :: Fractional n => Char -> [[n]]
+a_seq e =
+    [lseq [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
+    ,lseq [0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.0] 2
+    ,lseq [0.9,0.0,0.0,0.2,0.0,0.2,0.0,0.2,0.0,0.0] 2
+    ,lseq [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
+    ,lrand e [[0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+             ,[0.9,0.2,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+             ,[0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.2]
+             ,[0.9,0.0,0.0,0.7,0.2,0.2,0.0,0.7,0.0,0.0]
+             ,[0.9,0.0,0.0,0.7,0.0,0.2,0.2,0.7,0.2,0.0]
+             ,[0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.2,0.2]
+             ,[0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.0,0.0]
+             ,[0.9,0.0,0.0,0.7,0.2,0.2,0.2,0.7,0.0,0.0]
+             ,[0.9,0.0,0.4,0.0,0.4,0.0,0.4,0.0,0.4,0.0]
+             ,[0.9,0.0,0.0,0.4,0.0,0.0,0.4,0.2,0.4,0.2]
+             ,[0.9,0.0,0.2,0.7,0.0,0.2,0.0,0.7,0.0,0.0]
+             ,[0.9,0.0,0.0,0.7,0.0,0.0,0.0,0.7,0.0,0.0]
+             ,[0.9,0.7,0.7,0.0,0.0,0.2,0.2,0.2,0.0,0.0]
+             ,[0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]] 30
     -- tehai
-    ,pseq [2.0,0.0,0.2,0.5,0.0,0.2,0.9
+    ,lseq [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]
+    ,[5.0]]
 
 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)])
+  play (out 0 drone)
+  let sy = synthdef "mridangam" (out 0 mridangam)
+      a = concat (a_seq 'α')
+  play (P.nbind1 (sy,100,[("amp",a),("dur",repeat (1/8))]))
 
 main :: IO ()
 main = withSC3 act
diff --git a/gr/mridangam.scd b/gr/mridangam.scd
new file mode 100644
--- /dev/null
+++ b/gr/mridangam.scd
@@ -0,0 +1,44 @@
+// mridangam (jmcc) #SPE3
+
+{var m = {
+    arg t_amp = 1;
+    var n = WhiteNoise.ar(70) * Decay2.kr(t_amp, 0.002, 0.1);
+    Resonz.ar(n, 60.midicps, 0.02, 4).distort * 0.4};
+var d = {
+    var s1 = Saw.ar([60, 60.04].midicps);
+    var s2 = Saw.ar([67, 67.04].midicps);
+    LPF.ar(s1 + s2,108.midicps, 0.007)};
+var p =
+  Pseq([
+    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]),
+        Pseq(#[0.9, 0.2, 0.0, 0.7, 0.0, 0.2, 0.0, 0.7, 0.0, 0.0]),
+        Pseq(#[0.9, 0.0, 0.0, 0.7, 0.0, 0.2, 0.0, 0.7, 0.0, 0.2]),
+        Pseq(#[0.9, 0.0, 0.0, 0.7, 0.2, 0.2, 0.0, 0.7, 0.0, 0.0]),
+        Pseq(#[0.9, 0.0, 0.0, 0.7, 0.0, 0.2, 0.2, 0.7, 0.2, 0.0]),
+        Pseq(#[0.9, 0.2, 0.2, 0.7, 0.2, 0.2, 0.2, 0.7, 0.2, 0.2]),
+        Pseq(#[0.9, 0.2, 0.2, 0.7, 0.2, 0.2, 0.2, 0.7, 0.0, 0.0]),
+        Pseq(#[0.9, 0.0, 0.0, 0.7, 0.2, 0.2, 0.2, 0.7, 0.0, 0.0]),
+        Pseq(#[0.9, 0.0, 0.4, 0.0, 0.4, 0.0, 0.4, 0.0, 0.4, 0.0]),
+        Pseq(#[0.9, 0.0, 0.0, 0.4, 0.0, 0.0, 0.4, 0.2, 0.4, 0.2]),
+        Pseq(#[0.9, 0.0, 0.2, 0.7, 0.0, 0.2, 0.0, 0.7, 0.0, 0.0]),
+        Pseq(#[0.9, 0.0, 0.0, 0.7, 0.0, 0.0, 0.0, 0.7, 0.0, 0.0]),
+        Pseq(#[0.9, 0.7, 0.7, 0.0, 0.0, 0.2, 0.2, 0.2, 0.0, 0.0]),
+        Pseq(#[0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
+    ], 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),
+    Pseq(#[0.0], 1)]);
+d.play;
+Pbind(\instrument,SynthDef(\m,m),\amp,p,\dur,1/8).play}.()
diff --git a/gr/music-box.hs b/gr/music-box.hs
--- a/gr/music-box.hs
+++ b/gr/music-box.hs
@@ -2,8 +2,9 @@
 -- partial...
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Collection.Numerical.Truncating () {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 chain :: a -> [a -> a] -> a
 chain n c =
@@ -11,49 +12,46 @@
       [] -> n
       f:c' -> chain (f n) c'
 
+-- > audition ping
 ping :: UGen
 ping =
-    let o = control KR "out" 0
+    let k = control KR
         f = control KR "freq" 440
         a = control KR "amp" 0.1
-        ed = control KR "impdecay" 0.01
-        ea = control KR "attack" 0.0001
         es = control KR "sustain" 0.1
-        fa = control KR "famt" 3
-        ff = control KR "ffreq" 1000
-        hd = control KR "hdur" 0.1
         tr = impulse AR 0 0
-        dy = decay2 tr ea ed * 1
+        dy = decay2 tr (k "attack" 0.0001) (k "impdecay" 0.01)
         i = mix (ringz dy (f * mce2 1 2) es)
-        r = chain i [\s -> let e = decay2 tr 0.01 hd
+        r = chain i [\s -> let e = decay2 tr 0.01 (k "hdur" 0.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 -> bLowPass s (k "ffreq" 1000 * linExp dy 0 1 1 (k "famt" 3)) 0.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)
+    in out (k "out" 0) (r * mce2 a a)
 
-pattern :: [P_Bind]
+pattern :: P.Param
 pattern =
-    let o = prand 'ζ' [6,7] inf
-    in [(K_instr,psynth (synthdef "ping" ping))
-       ,(K_degree,place [[0,1,2,3,4]
+    let octave = P.rand 'ζ' [6,7]
+        degree = P.lace [[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)]
+                        ,[0,2,1,2,1,4,3,3,5]]
+        detune = P.white 'η' (-2) 2
+        to_cps = P.degree_to_cps [0,2,4,5,7,9,11] 12
+        freq = zipWith to_cps degree octave + detune
+    in [("freq",freq)
+       ,("attack",P.white 'λ' 0.0005 0.001)
+       ,("sustain",(octave / 4) + P.white 'μ' 0.01 0.5)
+       ,("ffreq",P.white 'ν' 200 2000)
+       ,("famt",P.white 'ξ' 3 6)
+       ,("hdur",P.white 'ο' 0.05 0.3)
+       ,("impdecay",P.white 'π' 0.001 0.01)
+       ,("amp",P.white 'κ' 0.01 0.1 * 0.3)
+       ,("dur",P.rand 'θ' [0.5,1,2] + P.white 'ι' (-0.1) 0.1)]
 
 amplitude_mod :: (ID a, Enum a) => a -> UGen -> UGen
 amplitude_mod z i =
@@ -73,6 +71,7 @@
 
 main :: IO ()
 main = do
+  let sy = synthdef "ping" ping
   withSC3 (do post "amplitude_mod" 2 0 (amplitude_mod 'ρ')
               post "limiting" 2 0 limiting)
-  audition (pbind pattern)
+  audition (P.sbind1 (sy,pattern))
diff --git a/gr/narrow-band-filtered-crackle-noise.hs b/gr/narrow-band-filtered-crackle-noise.hs
new file mode 100644
--- /dev/null
+++ b/gr/narrow-band-filtered-crackle-noise.hs
@@ -0,0 +1,19 @@
+-- narrow band filtered crackle noise (jmcc) #2
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (- n) n
+
+nbfcn :: UGen
+nbfcn =
+    let e = envLinen 2 5 2 1
+        rf1 = rand 'α' 0 2000 + 80
+        rf2 = rf1 + (rand2 'β' 0.2 * rf1)
+        rf = xLine KR rf1 rf2 9 DoNothing
+        c = crackle AR 1.97 + rand 'γ' 0 0.03 * 0.15
+    in pan2 (resonz c rf 0.2) (rand2 'δ' 1) (envGen AR 1 1 0 1 RemoveSynth e)
+
+main :: IO ()
+main = spawnTextureU (const 2,maxBound) nbfcn
diff --git a/gr/narrow-band-filtered-crackle-noise.scd b/gr/narrow-band-filtered-crackle-noise.scd
new file mode 100644
--- /dev/null
+++ b/gr/narrow-band-filtered-crackle-noise.scd
@@ -0,0 +1,12 @@
+// narrow band filtered crackle noise (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~spawn.({
+    var e = Env.linen(2, 5, 2);
+    var rf1 = 2000.0.rand + 80;
+    var rf2 = rf1 + (0.2.rand2 * rf1);
+    var rf = XLine.kr(rf1, rf2, 9);
+    var c = Crackle.ar(1.97 + 0.03.rand, 0.15);
+    Pan2.ar(Resonz.ar(c, rf, 0.2), 1.0.rand2, EnvGen.ar(e,doneAction:2));
+}, 2);
diff --git a/gr/nharm-m.hs b/gr/nharm-m.hs
--- a/gr/nharm-m.hs
+++ b/gr/nharm-m.hs
@@ -3,7 +3,7 @@
 import Control.Concurrent {- base -}
 import Control.Monad
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad as U {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
 
 nharm :: (Num b, Integral a) => a -> b -> [b]
@@ -12,10 +12,10 @@
 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
+    d <- iRandM 9 12
+    f <- iRandM m (m + 2)
+    l <- sequence (replicate n (randM 0.01 0.02))
+    p <- randM (-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)
diff --git a/gr/nharm-p.hs b/gr/nharm-p.hs
--- a/gr/nharm-p.hs
+++ b/gr/nharm-p.hs
@@ -1,8 +1,8 @@
 -- nharm-p (rd)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 nharm :: Num n => Int -> n -> [n]
 nharm n f = map ((* f) . fromIntegral) [1..n]
@@ -19,19 +19,17 @@
         s = klangSpec nh l (replicate n 0.0)
     in out 0 (pan2 (klang AR 1 0 s) p e)
 
-type Range = (Field,Field)
+type Range = (Double,Double)
 
-{- 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.  -}
+{- Note that the dur key is used only to schedule the nodes, the UGen
+graph manages duration internally.-}
 
-pN :: Int -> Range -> Range -> P Event
+pN :: Int -> Range -> Range -> (Synthdef,P.Param)
 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)]
+    in (s,[("freq",map midiCPS (P.white 'α' m0 m1))
+          ,("dur",P.white 'β' d0 d1)])
 
 main :: IO ()
-main = audition (pmerge (pN 24 (90,92) (0.25,0.75))
-                        (pN 54 (12,14) (1.25,1.76)))
+main = audition (P.sbind [(pN 24 (90,92) (0.25,0.75))
+                         ,(pN 54 (12,14) (1.25,1.76))])
diff --git a/gr/noise-burst-sweep.hs b/gr/noise-burst-sweep.hs
--- a/gr/noise-burst-sweep.hs
+++ b/gr/noise-burst-sweep.hs
@@ -1,7 +1,6 @@
--- noise burst sweep (jmcc)
+-- noise burst sweep (jmcc) #6
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 nbs :: ID a => a -> UGen
@@ -17,5 +16,6 @@
 main = overlapTextureU (4,2,4,maxBound) (nbs 'α')
 
 {-
-audition (out 0 (nbs 'α'))
+let g = nbs 'α'
+audition (out 0 g)
 -}
diff --git a/gr/noise-burst-sweep.scd b/gr/noise-burst-sweep.scd
--- a/gr/noise-burst-sweep.scd
+++ b/gr/noise-burst-sweep.scd
@@ -1,6 +1,8 @@
+// noise burst sweep (jmcc) #6
+
 {var n = WhiteNoise.ar ! 2
 ;var lfoRate = MouseX.kr(10,60,'exponential',0.2)
 ;var amp = max(0,LFSaw.kr(lfoRate,-1))
 ;var cfreq = MouseY.kr(400,8000,'exponential',0.2)
 ;var freq = SinOsc.kr(0.2,0) * cfreq + (1.05 * cfreq)
-;Out.ar(0,Resonz.ar(n * amp,freq,0.1))}.play
+;Resonz.ar(n * amp,freq,0.1)}.play
diff --git a/gr/noise-modulated-sawtooths.hs b/gr/noise-modulated-sawtooths.hs
new file mode 100644
--- /dev/null
+++ b/gr/noise-modulated-sawtooths.hs
@@ -0,0 +1,17 @@
+-- noise modulated sawtooths (jmcc) #6
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+nms :: UGen
+nms =
+    let f = midiCPS (rand 'α' 60 100)
+        o = lfSaw 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/gr/noise-modulated-sawtooths.scd b/gr/noise-modulated-sawtooths.scd
new file mode 100644
--- /dev/null
+++ b/gr/noise-modulated-sawtooths.scd
@@ -0,0 +1,9 @@
+// noise modulated sawtooths (jmcc) #6
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var f = (60 + 40.rand).midicps;
+    LFSaw.ar([f, f + 0.2], 0, LFNoise2.kr(f * [0.15, 0.16], 0.1));
+}, 4, 4, 4, postProcess: {arg z; CombN.ar(z, 0.5, 0.5, 4, 1, z.reverse)});
+
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
@@ -1,6 +1,6 @@
--- noise modulated sines (jmcc)
+-- noise modulated sines (jmcc) #6
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 nms :: UGen
diff --git a/gr/noise-modulated-sines.scd b/gr/noise-modulated-sines.scd
new file mode 100644
--- /dev/null
+++ b/gr/noise-modulated-sines.scd
@@ -0,0 +1,8 @@
+// noise modulated sines (jmcc) #6
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var f = (60 + 40.rand).midicps;
+    FSinOsc.ar([f, f + 0.2], 0, LFNoise2.kr(f * [0.15, 0.16], 0.1));
+}, 4, 4, 4, postProcess: {arg z; CombN.ar(z, 0.3, 0.3, 4, 1, z.reverse)});
diff --git a/gr/nokia.hs b/gr/nokia.hs
--- a/gr/nokia.hs
+++ b/gr/nokia.hs
@@ -1,35 +1,26 @@
 -- http://tai-studio.org/index.php/2012/02/alarm-clock-sound/
+{-# OPTIONS_GHC -F -pgmF hsc3-psynth #-}
 -- partial...
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 hiding (decay,distort) {- hsc3 -}
+import Sound.SC3.Lang.Pattern hiding (freq) {- hsc3-lang -}
 
-grain :: UGen
-grain =
-    let o = control KR "out" 0
-        f = control KR "freq" 100
-        attack = control KR "attack" 0
-        decay' = control KR "decay" 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 * f
-        endFreq = f
+grain :: Synthdef
+grain = psynth {bus=0,freq=100,attack=0,decay=1,sustain=0.1,distort=0,fTime=0.1,fFac=1.2,amp=1,delay=0} where
+    let startFreq = fFac * freq
+        endFreq = freq
         env l t = Envelope l t [] Nothing Nothing
-        aEnv = let e = envPerc attack decay'
-               in envGen AR 1 amp' 0 sus RemoveSynth e
+        aEnv = let e = envPerc attack decay
+               in envGen AR 1 amp 0 sustain 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)
+        src = wrap2 (sinOsc AR fEnv 1 * (1 + distort)) 1
+    in out bus (delayN (src * mce2 aEnv aEnv) 0.1 delay)
 
 pattern :: Enum e => (Field,e) -> [P_Bind]
 pattern (f,z) =
     let f_mul = prand 'α' [4,1,2,3,4,8] inf
-    in [(K_instr,pinstr "grain")
+    in [(K_instr,psynth 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
@@ -46,4 +37,4 @@
 main =
     let f = concat (replicate 12 [1200, 800, 600, 200])
         p = ppar (map (pbind . pattern) (zip f ['β'..]))
-    in withSC3 (async (d_recv (synthdef "grain" grain)) >> play p)
+    in withSC3 (async (d_recv grain) >> pplay p)
diff --git a/gr/nv-ml-2014-06-03.hs b/gr/nv-ml-2014-06-03.hs
new file mode 100644
--- /dev/null
+++ b/gr/nv-ml-2014-06-03.hs
@@ -0,0 +1,17 @@
+-- sc-users, 2014-06-03 (nv)
+
+import Sound.SC3 {- hsc3 -}
+
+nv_ml_2014_06_03 :: UGen
+nv_ml_2014_06_03 =
+    let y = mouseY KR 1 100 Linear 0.2
+        x = mouseX KR 50 400 Exponential 0.2
+        i = decay (impulse AR 0.5 0) 0.1
+        i' = sin (bpf (i * y) 50 1)
+    in pluck i' (lfSaw AR 10000 0) 0.1 (1 / x) 4 0.5
+
+repl :: Int -> UGen -> UGen
+repl n = mce . replicate n
+
+main :: IO ()
+main = audition (out 0 (repl 2 nv_ml_2014_06_03))
diff --git a/gr/nv-ml-2014-06-03.scd b/gr/nv-ml-2014-06-03.scd
new file mode 100644
--- /dev/null
+++ b/gr/nv-ml-2014-06-03.scd
@@ -0,0 +1,5 @@
+{var y = MouseY.kr(1,100)
+;var x = MouseX.kr(50,400,\exponential)
+;var i = Decay.ar(Impulse.ar(0.5),0.1)
+;var i_ = BPF.ar(i * y, 50).sin
+;Pluck.ar(i_,LFSaw.ar(10000),0.1,1 / x,4) ! 2}.play
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
@@ -1,7 +1,6 @@
 -- http://sccode.org/1-V (nv)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 nv_tw_1 :: UGen
 nv_tw_1 =
diff --git a/gr/nv-tw-2013-01-11.hs b/gr/nv-tw-2013-01-11.hs
new file mode 100644
--- /dev/null
+++ b/gr/nv-tw-2013-01-11.hs
@@ -0,0 +1,33 @@
+-- https://twitter.com/headcube/status/289761321065541633 (nv)
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Collection {- hsc3-lang -}
+
+mce_concat :: [UGen] -> UGen
+mce_concat = mce . concat . map mceChannels
+
+mce_rotate :: Integral i => i -> UGen -> UGen
+mce_rotate n = mce . rotate n . mceChannels
+
+-- > length (mceChannels nv_tw_2013_01_11) == 100
+nv_tw_2013_01_11 :: UGen
+nv_tw_2013_01_11 =
+    let nc = 80
+        i = inFeedback nc 20
+        n = (uclone 'α' nc (lfNoise1 'β' KR 1e-3 + 1)) / constant nc
+        j = combL (lpf i 2e3) 1 n 0.05
+        d = uclone 'γ' nc (dust2 'δ' AR 0.01)
+        x = sin (j + d)
+    in mce_concat [splay x 1 1 0 True
+                  ,mce (replicate 18 0)
+                  ,(x - mce_rotate 1 x) / 2]
+
+main :: IO ()
+main = audition (out 0 nv_tw_2013_01_11)
+
+main_w :: IO ()
+main_w = do
+  let sy = synthdef "nv_tw_2013_01_11" (out 0 nv_tw_2013_01_11)
+  synthdefWrite sy "/tmp"
+  withSC3 (do _ <- async (d_load "/tmp/nv_tw_2013_01_11.scsyndef")
+              send (s_new "nv_tw_2013_01_11" (-1) AddToTail 1 []))
diff --git a/gr/nv-tw-2013-01-11.scd b/gr/nv-tw-2013-01-11.scd
new file mode 100644
--- /dev/null
+++ b/gr/nv-tw-2013-01-11.scd
@@ -0,0 +1,12 @@
+// https://twitter.com/headcube/status/289761321065541633 (nv)
+
+{var i = InFeedback.ar(20,99)
+;var n = (LFNoise1.kr(1e-3 ! 99) + 1) / 99
+;var j = CombL.ar(LPF.ar(i,2e3),1,n,0.05)
+;var d = Dust2.ar(0.01 ! 99)
+;var x = sin(j + d)
+;Splay.ar(x) ++ (0 ! 18) ++ ((x - x.rotate) / 2)}.play
+
+play{Splay.ar(x=sin(CombL.ar(LPF.ar(InFeedback.ar(20,99),2e3),1,LFNoise1.kr(1e-3!99)+1/99,0.05)+Dust2.ar(0.01!99)))++(0!18)++(x-x.rotate/2)}
+
+DotViewer.useTables = false;
diff --git a/gr/nv-tw-2013-10-08.scd b/gr/nv-tw-2013-10-08.scd
new file mode 100644
--- /dev/null
+++ b/gr/nv-tw-2013-10-08.scd
@@ -0,0 +1,13 @@
+// https://twitter.com/headcube/status/387489141274857472 (nv)
+// not stable here (2014-06-14)
+
+{
+    var n = LFNoise0;
+    var x = Saw.ar(0.7 ** lag(kr(n, 1/5), 2) * [601,500,749]);
+    var f = {
+        arg i;
+        var a = 0.9 ** i;
+        x = x + BAllPass.ar(x, 9 ** n.kr(a) * 2e3) + CombL.ar(x, 1, a, 8) / 2.1
+    };
+    Splay.ar(f ! 9 @ 8)
+}.play
diff --git a/gr/nv-tw-2013-12-04.hs b/gr/nv-tw-2013-12-04.hs
new file mode 100644
--- /dev/null
+++ b/gr/nv-tw-2013-12-04.hs
@@ -0,0 +1,21 @@
+-- https://twitter.com/headcube/status/408145586970324992 (nv)
+
+import Sound.SC3 {- hsc3 -}
+
+mean :: Fractional a => [a] -> a
+mean l = sum l / fromIntegral (length l)
+
+f :: UGen -> UGen
+f j =
+    let i = j + 1;
+        a = saw AR ((1 / i + 1) / 6)
+        p = pluck a a 1 (1 / i / (3 - lfPulse AR (1 / i) 0 0.5) / 30) 9 (0.9 / i)
+        x = (0.5 ** i) * p
+        o = sinOsc AR 2 0 + mce2 4 9
+    in combC x 1 (o * 1e-3) 0 - x
+
+nv :: UGen
+nv = mean (map f [0 .. 8]) / 9
+
+main :: IO ()
+main = audition (out 0 nv)
diff --git a/gr/nv-tw-2013-12-04.scd b/gr/nv-tw-2013-12-04.scd
new file mode 100644
--- /dev/null
+++ b/gr/nv-tw-2013-12-04.scd
@@ -0,0 +1,11 @@
+// https://twitter.com/headcube/status/408145586970324992 (nv)
+
+{var f = {
+    arg j;
+    var i = j + 1;
+    var a = Saw.ar((1 / i + 1) / 6);
+    var p = Pluck.ar(a, a, 1, 1 / i / (3 - LFPulse.ar(1 / i)) / 30, 9, 0.9 / i);
+    var x = (0.5 ** i) * p;
+    var o = SinOsc.ar(2) + [4,9];
+    CombC.ar(x, 1, o * 1e-3, 0) - x};
+mean(f ! 9)/9}.play
diff --git a/gr/nv-tw-2014-02-21.hs b/gr/nv-tw-2014-02-21.hs
new file mode 100644
--- /dev/null
+++ b/gr/nv-tw-2014-02-21.hs
@@ -0,0 +1,28 @@
+-- https://twitter.com/headcube/status/437094206767513600 (nv)
+-- requires -m at scsynth
+
+import Sound.SC3 {- hsc3 -}
+
+x :: UGen
+x = impulse AR 0.05 0
+
+-- > audition (out 0 (f x))
+f :: UGen -> UGen
+f i =
+    let n e = lfNoise2 e KR
+        a = allpassL (leakDC i 0.995) 4 ((8 ** n 'α' 0.1) / 2) 8 * 1.2
+    in tanh (lpf a ((8 ** n 'β' (mce2 (rand 'γ' 0 0.1) (rand 'δ' 0 0.1))) * 2500))
+
+-- > audition (out 0 y)
+y :: UGen
+y = useq 'ε' 20 f x * 5
+
+-- > audition (out 0 z)
+z :: UGen
+z = mix (uclone 'ζ' 4 y)
+
+z_opt :: UGen
+z_opt = ugen_optimise_ir_rand z
+
+main :: IO ()
+main = audition (out 0 z_opt)
diff --git a/gr/nv-tw-2014-02-21.scd b/gr/nv-tw-2014-02-21.scd
new file mode 100644
--- /dev/null
+++ b/gr/nv-tw-2014-02-21.scd
@@ -0,0 +1,7 @@
+// https://twitter.com/headcube/status/437094206767513600
+
+{{var x = Impulse.ar(0.05)
+ ;20.do{var n = LFNoise2
+       ;var a = AllpassL.ar(LeakDC.ar(x), 4, 8 ** kr(n, 0.1) / 2, 8) * 1.2
+       ;x = LPF.ar(a, 8 ** n.kr({0.1.rand} ! 2) * 2500, 1).tanh}
+ ;x * 5}.play}!4
diff --git a/gr/nv-tw-2014-06-03.hs b/gr/nv-tw-2014-06-03.hs
new file mode 100644
--- /dev/null
+++ b/gr/nv-tw-2014-06-03.hs
@@ -0,0 +1,35 @@
+-- https://twitter.com/headcube/status/474064500564324352 (nv)
+-- requires -m at scsynth
+-- inaccurate...
+
+import Sound.SC3 {- hsc3 -}
+
+-- > audition (out 0 p)
+p :: UGen
+p = lfPulse AR (2 ** rand 'α' (-9) 1) (rand 'β' 0 2 / 2) 0.5
+
+q :: Int -> UGen
+q i = product (uclone' 'γ' (i + 2) p) / (1 + constant i) + 1
+
+-- > audition (out 0 s)
+s :: UGen
+s =
+    let f = product (uprotect' 'δ' (map q [0 .. 7])) * 86
+    in pluck (sin (bpf f f 1)) (saw AR 440) 1 (1 / f) 9 0.5
+
+nv :: UGen
+nv = splay (uclone 'ε' 9 s) 1 1 0 True
+
+-- > audition (out 0 nv_opt)
+nv_opt :: UGen
+nv_opt = ugen_optimise_const_operator (ugen_optimise_ir_rand nv)
+
+-- > via_disk (out 0 nv)
+via_disk :: UGen -> IO ()
+via_disk u = do
+  let sy = synthdef "nv" u
+  synthdefWrite sy "/tmp"
+  withSC3 (async (d_load "/tmp/nv.scsyndef") >> send (s_new "nv" (-1) AddToHead 1 []))
+
+main :: IO ()
+main = audition (out 0 nv_opt)
diff --git a/gr/nv-tw-2014-06-03.scd b/gr/nv-tw-2014-06-03.scd
new file mode 100644
--- /dev/null
+++ b/gr/nv-tw-2014-06-03.scd
@@ -0,0 +1,7 @@
+// https://twitter.com/headcube/status/474064500564324352
+
+{var p = {LFPulse.ar(2 ** rrand(-9,1), 2.rand / 2)}
+;var q = {arg i; product(p ! (i + 2)) / (1 + i) + 1}
+;var s = {var f = product(q ! 8) * 86
+         ;Pluck.ar(BPF.ar(f, f).sin, Saw.ar, 1, 1 / f, 9)}
+;Splay.ar(s ! 9)}.play
diff --git a/gr/nv-tw-41.hs b/gr/nv-tw-41.hs
--- a/gr/nv-tw-41.hs
+++ b/gr/nv-tw-41.hs
@@ -1,14 +1,15 @@
 -- http://sccode.org/1-V (nv)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+    let nd z =
+            let i = constant z
+                t = (0.6 ** i) * 40 * impulse AR ((2 ** i) / 32) (1/2)
+                f = (4 ** lfNoise0 z KR (1/16)) * 300
             in sin (rlpf t f 5e-3)
-        x = splay (mce (map nd [0..7])) 1 1 0 True
+        x = splay (mce (map nd [0::Int .. 7])) 1 1 0 True
         r u = let (p,q) = mce2c u in freeVerb2 p q 0.1 1 1
     in r (r x)
 
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 {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Bind as P {- hsc3-lang -}
 
 fF :: Double -> Double -> Double
 fF i f =
@@ -24,8 +24,7 @@
 
 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)])
+    let p = [("f",fS)
+            ,("i",[0..])
+            ,("dur",repeat 0.3)]
+    in audition (P.sbind1 (nvi,p))
diff --git a/gr/nx102.hs b/gr/nx102.hs
--- a/gr/nx102.hs
+++ b/gr/nx102.hs
@@ -1,6 +1,6 @@
 -- http://sccode.org/1-4QO
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 -- > audition (out 0 nx102)
@@ -24,5 +24,5 @@
 main =
     let fn = "/home/rohan/data/audio/pf-c5.aif"
         ac = do _ <- async (b_allocRead 1 fn 0 0)
-                play (overlapTextureP (6,3,9,maxBound) nx102)
+                play (overlapTexture_nrt (1,0) (6,3,9,maxBound) nx102)
     in withSC3 ac
diff --git a/gr/one-line.scd b/gr/one-line.scd
--- a/gr/one-line.scd
+++ b/gr/one-line.scd
@@ -1,4 +1,4 @@
 {var lfs = LFSaw.ar([1,0.99],[0,0.6],2000,2000)
 ;var lfs_t = lfs.trunc([400,600]) * [1,-1]
-;var f = OnePole.ar(Mix.new(lfs_t),0.98)
-;Out.ar(0,Pan2.ar(SinOsc.ar(f,0),0,0.1))}.play
+;var f = OnePole.ar(Mix(lfs_t),0.98)
+;Pan2.ar(SinOsc.ar(f,0),0,0.1)}.play
diff --git a/gr/oscillator-cluster-m.hs b/gr/oscillator-cluster-m.hs
--- a/gr/oscillator-cluster-m.hs
+++ b/gr/oscillator-cluster-m.hs
@@ -1,35 +1,35 @@
--- oscillator cluster
+-- oscillator cluster (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- 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)
+      rln r a b d = fmap (\n -> ln (a + n) b d) (randM 0 r)
+      prt d a cf = do r1 <- randM cf (cf + 2)
                       r2 <- rln 1 5 0.01 d
                       r3 <- rln 10 20 0 d
-                      r4 <- rand 0.1 0.2
+                      r4 <- randM 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
+      fp = sequence (replicate np (randM 220 660))
+  d <- randM 4 7
+  a <- randM 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
+      p = [("dur",P.rand 'α' [0.25,0.5,1,3,5])]
+  audition (P.sbind1 (s,p))
 
 {-
 audition . (out 0) =<< oscillator_cluster
 let otu = Sound.SC3.Lang.Control.OverlapTexture.overlapTextureU
-otu (0,6,3,maxBound) =<< oscillator_cluster
+otu (3,1,5,maxBound) =<< oscillator_cluster
 -}
diff --git a/gr/oscillator-cluster.scd b/gr/oscillator-cluster.scd
--- a/gr/oscillator-cluster.scd
+++ b/gr/oscillator-cluster.scd
@@ -1,23 +1,23 @@
 {var ln = {arg a,b,d;Line.kr(a,b,d,1)}
 ;var xln = {arg a,b,d;XLine.kr(a,b,d,1)}
 ;var rln = {arg r,a,b,d
-           ;var n = Rand.new(0,r)
-           ;ln.value(a + n,b,d)}
+           ;var n = Rand(0,r)
+           ;ln.(a + n,b,d)}
 ;var rxln = {arg r,a,b,d
-            ;var n = Rand.new(0,r)
-            ;xln.value(a + n,b,d)}
+            ;var n = Rand(0,r)
+            ;xln.(a + n,b,d)}
 ;var prt = {arg d,a
            ;{arg cf
-            ;var r1 = Rand.new(cf,cf + 2)
-            ;var r2 = rln.value(1,5,0.01,d)
-            ;var r3 = rln.value(10,20,0,d)
-            ;var r4 = Rand.new(0.1,0.2)
+            ;var r1 = Rand(cf,cf + 2)
+            ;var r2 = rln.(1,5,0.01,d)
+            ;var r3 = rln.(10,20,0,d)
+            ;var r4 = Rand(0.1,0.2)
             ;var f = [cf,r1] + (SinOsc.kr(r2,0) * r3)
             ;var o = FSinOsc.ar(f,0)
             ;var e = Decay2.ar(Impulse.ar(0,0),r4,d) * a
             ;o * e}}
 ;var np = 12
-;var fp = Array.fill(np,{Rand.new(220,660)})
-;var d = Rand.new(4,7)
-;var a = Rand.new(0.01,0.05)
-;Out.ar(0,fp.collect(prt.value(d,a)).sum)}.play
+;var fp = Array.fill(np,{Rand(220,660)})
+;var d = Rand(4,7)
+;var a = Rand(0.01,0.05)
+;fp.collect(prt.(d,a)).sum}.play
diff --git a/gr/overlap-add.hs b/gr/overlap-add.hs
--- a/gr/overlap-add.hs
+++ b/gr/overlap-add.hs
@@ -1,7 +1,7 @@
 -- overlap-add (jmcc)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 sine :: UGen
 sine =
@@ -17,5 +17,5 @@
     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])
+main = audition (nrt_merge (overlapTexture_nrt (1,0) (4,4,6,maxBound) sine)
+                           (overlapTexture_nrt (1,0) (4,4,6,maxBound) noise))
diff --git a/gr/overlap-texture.scd b/gr/overlap-texture.scd
new file mode 100644
--- /dev/null
+++ b/gr/overlap-texture.scd
@@ -0,0 +1,59 @@
+~add_env = {
+    arg newEventFunc, i;
+    {
+        var sustainTime = \sustainTime.kr(4);
+        var transitionTime = \transitionTime.kr(1);
+        var env = Env([0,1,1,0],[transitionTime,sustainTime,transitionTime],\sin);
+        Out.ar(0,newEventFunc.(i) * EnvGen.kr(env,doneAction: 2));
+    };
+};
+
+~spawn = {
+    arg newEventFunc, nextTime, maxRepeats = inf;
+    Task({
+        maxRepeats.do({
+            arg i;
+            {Out.ar(0,newEventFunc.(i))}.play;
+            nextTime.value.wait;
+        });
+    }).play;
+};
+
+~xfade_texture = {
+    arg newEventFunc, sustainTime = 4.0, transitionTime = 4.0, maxRepeats = inf;
+    var period = sustainTime + transitionTime;
+    Task({
+        maxRepeats.do({
+            arg i;
+            ~add_env.(newEventFunc,i).play(args:[
+                \sustainTime:sustainTime,
+                \transitionTime:transitionTime]);
+            period.wait;
+        });
+    }).play;
+};
+
+~overlap_texture = {
+    arg newEventFunc, sustainTime = 4.0, transitionTime = 4.0, overlap = 2, maxRepeats = inf,
+        postProcess = nil, bus = 0, numChannels = 2;
+    var period = (sustainTime + (transitionTime * 2)) / overlap;
+    Task({
+        maxRepeats.do({
+            arg i;
+            ~add_env.(newEventFunc,i).play(args:[
+                \sustainTime:sustainTime,
+                \transitionTime:transitionTime]);
+            period.wait;
+        });
+    }).play;
+    if(postProcess.notNil,{~post_process.(postProcess,bus,numChannels)});
+};
+
+~post_process = {
+    arg treatment, bus = 0, numChannels = 2;
+    {
+        var z = In.ar(bus,numChannels);
+        z = treatment.(z);
+        ReplaceOut.ar(bus,z);
+    }.play(addAction: \addToTail);
+};
diff --git a/gr/pattern-buffer-m.hs b/gr/pattern-buffer-m.hs
--- a/gr/pattern-buffer-m.hs
+++ b/gr/pattern-buffer-m.hs
@@ -1,7 +1,7 @@
 -- pattern buffer (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
 
 tseq :: [UGen] -> UGen
@@ -16,7 +16,7 @@
   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
+  n1 <- tRandM 0.02 0.08 t
   let e = decay2 t 0.01 n1
       f = midiCPS (tseq r1)
       l = tseq r2
diff --git a/gr/pebble-beach.hs b/gr/pebble-beach.hs
--- a/gr/pebble-beach.hs
+++ b/gr/pebble-beach.hs
@@ -2,8 +2,7 @@
 -- http://sccode.org/1-u
 -- requires 'scsynth -u 57110 -m 32768'
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 exprange :: UGen -> UGen -> UGen -> UGen
 exprange l r i = linExp i (-1) 1 l r
diff --git a/gr/phase-modulation.hs b/gr/phase-modulation.hs
new file mode 100644
--- /dev/null
+++ b/gr/phase-modulation.hs
@@ -0,0 +1,23 @@
+-- phase modulation with slow beats (jmcc) #6
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (-n) n
+
+nrec :: (Num a, Ord a) => a -> (t -> t) -> t -> t
+nrec n f st = if n > 0 then nrec (n - 1) f (f st) else st
+
+pmwsb :: UGen
+pmwsb =
+    let x = mouseX KR 100 6000 Exponential 0.2 -- random freq of new events
+        y = mouseY KR 0 2 Linear 0.2 -- modulation index
+        o (e,a) = let f = rand e 0 x
+                  in (succ e,fSinOsc AR (mce [f,f + rand2 'α' 1]) 0 * y + a)
+        (_,ph) = nrec 3 o ('β',0)
+        freq = rand 'γ' 0 x
+    in sinOsc AR (mce [freq, freq + rand2 'δ' 1]) ph * 0.1
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) pmwsb
diff --git a/gr/phase-modulation.scd b/gr/phase-modulation.scd
new file mode 100644
--- /dev/null
+++ b/gr/phase-modulation.scd
@@ -0,0 +1,15 @@
+// phase modulation with slow beats (jmcc) #6
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+	var x = MouseX.kr(100, 6000, 'exponential'); // random freq of new events
+	var y = MouseY.kr(0, 2); // modulation index
+    var a = 0;
+    3.do({
+        f = Rand(0,x);
+        a = FSinOsc.ar([f, f + 1.0.rand2], 0, y, a);
+    });
+    f = Rand(0,x);
+    SinOsc.ar([f, f+1.0.rand2], a, 0.1)
+}, 4, 4, 4);
diff --git a/gr/pkt-00.hs b/gr/pkt-00.hs
new file mode 100644
--- /dev/null
+++ b/gr/pkt-00.hs
@@ -0,0 +1,17 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/490 (f0)
+
+import Sound.SC3 {- hsc3 -}
+
+pkt_00 :: UGen
+pkt_00 =
+    let sosc fr = sinOsc AR fr 0
+        f0 = mce3 100 200 300 + sosc (mce3 0.11 0.22 0.33)
+        ph0 = sosc (mce3 0.1 0.2 0.3) * 2 * pi
+        a0 = 0.1 + sosc (mce3 0.01 0.02 0.03) * 0.05
+        i = sinOsc AR f0 ph0 * a0
+        w = sosc (sosc (sosc 0.13 * 5 + 6) * 8 + 50)
+        s = splay i w 0.7 (sosc 1.2 * 0.6) True
+    in out 0 (gVerb s 20 5 1 0.5 25 0 1 1 30)
+
+main :: IO ()
+main = audition pkt_00
diff --git a/gr/pkt-07.hs b/gr/pkt-07.hs
new file mode 100644
--- /dev/null
+++ b/gr/pkt-07.hs
@@ -0,0 +1,26 @@
+-- http://www.fredrikolofsson.com/f0blog/?q=node/490 (f0)
+
+import Data.List {- base -}
+import Sound.SC3 {- hsc3 -}
+
+type T4 a = (a,a,a,a)
+
+-- > param 6
+param :: Fractional n => Int -> [T4 n]
+param n =
+    let f g z = take n (iterate g z)
+    in zip4 (f (* 4) 2) (f (/ 2) (1/2)) (f (* 4) 1) (f (* 4) 2)
+
+gen :: UGen -> T4 UGen -> UGen
+gen f0 (m,f1,l,r) = sinOsc AR f0 0 * m + linExp (sinOsc AR f1 0) (-1) 1 l r
+
+-- audition (pkt_07 12)
+-- Sound.SC3.UGen.Dot.draw (pkt_07 6)
+pkt_07 :: Int -> UGen
+pkt_07 n =
+    let c = foldl gen 1 (param n)
+        o = sinOsc AR c 0 * 0.1
+    in out 0 (gVerb (leakDC o 0.995) 16 8 0.75 0.5 15 1 0.7 0.5 16)
+
+main :: IO ()
+main = audition (pkt_07 6)
diff --git a/gr/plucked-strings-m.hs b/gr/plucked-strings-m.hs
--- a/gr/plucked-strings-m.hs
+++ b/gr/plucked-strings-m.hs
@@ -1,22 +1,22 @@
 -- plucked strings (jmcc)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 plucked_strings :: UId m => m UGen
 plucked_strings = do
-  let dt = do r0 <- rand 60 90
+  let dt = do r0 <- randM 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
+      i = do r0 <- randM 2 2.2
+             n0 <- dustM AR 0.5
+             r1 <- randM 0.05 0.15
+             r2 <- randM 0 (pi * 2)
+             r3 <- iRandM 0 2
+             let s0 = impulse AR r0 0 * 0.3
                  s1 = n0 * 0.3
-                 s2 = impulse AR (sinOsc KR r1 r2 * 5 + 5.2) 0.3
+                 s2 = impulse AR (sinOsc KR r1 r2 * 5 + 5.2) 0 * 0.3
              return (select r3 (mce [s0,s1,s2]))
-      s = do n0 <- pinkNoise AR
-             r1 <- rand (-1) 1
+      s = do n0 <- pinkNoiseM AR
+             r1 <- randM (-1) 1
              im <- i
              dt' <- dt
              let t = decay im 0.1 * n0 * 0.1
diff --git a/gr/plucked-strings.scd b/gr/plucked-strings.scd
new file mode 100644
--- /dev/null
+++ b/gr/plucked-strings.scd
@@ -0,0 +1,13 @@
+// plucked strings (jmcc)
+
+{var dt = {1 / rrand(60,90).floor.midicps}
+;var i =
+    {var s0 = Impulse.ar(rrand(2,2.2),0,0.3)
+    ;var s1 = Dust.ar(0.5) * 0.3
+    ;var s2 = Impulse.ar(SinOsc.kr(rrand(0.05,0.15),rrand(0,pi * 2)) * 5 + 5.2,0) * 0.3
+    ;[s0,s1,s2].choose}
+;var s =
+    {var dt_ = dt.()
+    ;var t = Decay.ar(i.(),0.1) * PinkNoise.ar * 0.1
+    ;Pan2.ar(CombL.ar(t,dt_,dt_,4),rrand(-1,1),1)}
+;Mix.fill(5,s)}.play
diff --git a/gr/pm-crotale.scd b/gr/pm-crotale.scd
new file mode 100644
--- /dev/null
+++ b/gr/pm-crotale.scd
@@ -0,0 +1,20 @@
+// pm-crotale (dmc) #1.7
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~spawn.(
+{var midi = IRand(48,72)
+;var tone = Rand(1,6)
+;var art = Rand(2,6)
+;var amp = Rand(0.1,0.3)
+;var pan = Rand(-1,1)
+;var freq = midi.midicps
+;var env = Env.perc(0,art)
+;var mod = 5 + (1 / IRand(2,6))
+;var amp_1 = EnvGen.kr(env,1,0.3,0,art,0)
+;var amp_2 = EnvGen.kr(env,1,Rand(0.1,0.5),0,1.3 * art,2)
+;var sig = PMOsc.ar(freq,mod * freq,EnvGen.kr(env,1,tone,0,art,0),0)
+;Pan2.ar(sig,pan,amp_1 * amp_2)},{rrand(0.25,4)});
+
+// the graph as given in the book is odd.
+// amp_1 is applied pre pan2, amp_2 is applied post.
diff --git a/gr/police-state-m.hs b/gr/police-state-m.hs
--- a/gr/police-state-m.hs
+++ b/gr/police-state-m.hs
@@ -1,22 +1,22 @@
--- police state (jmcc)
+-- police state (jmcc) #2
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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 nd = do r0 <- randM 0.02 0.12
+              r1 <- randM 0 (pi * 2)
+              r2 <- randM 0 600
+              r3 <- randM 700 1300
+              r4 <- randM (-1) 1
+              r5 <- randM 80 120
+              n0 <- lfNoise2M 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)
+  n0 <- clone 2 (lfNoise2M KR 0.4)
+  n1 <- lfNoise2M AR (n0 * 90 + 620)
+  n2 <- lfNoise2M KR (mce2 0.3 0.301)
   let e = n1 * (n2 * 0.15 + 0.18)
   return (combL (mix ns + e) 0.3 0.3 3)
 
diff --git a/gr/police-state.hs b/gr/police-state.hs
--- a/gr/police-state.hs
+++ b/gr/police-state.hs
@@ -1,7 +1,6 @@
--- police state (jmcc)
+-- police state (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 nd :: UGen
 nd =
diff --git a/gr/police-state.scd b/gr/police-state.scd
--- a/gr/police-state.scd
+++ b/gr/police-state.scd
@@ -1,9 +1,11 @@
-{var node = {var r0 = Rand.new(0.02,0.12)
-            ;var r1 = Rand.new(0,2pi)
-            ;var r2 = Rand.new(0,600)
-            ;var r3 = 1000 + Rand.new(-300,300)
-            ;var r4 = Rand.new(-1,1)
-            ;var r5 = 100 + Rand.new(-20,20)
+// police state (jmcc) #2
+
+{var node = {var r0 = Rand(0.02,0.12)
+            ;var r1 = Rand(0,2pi)
+            ;var r2 = Rand(0,600)
+            ;var r3 = 1000 + Rand(-300,300)
+            ;var r4 = Rand(-1,1)
+            ;var r5 = 100 + Rand(-20,20)
             ;var n0 = LFNoise2.ar(r5)
             ;var f = SinOsc.kr(r0,r1,r2,r3)
             ;Pan2.ar(SinOsc.ar(f,0) * n0 * 0.1,r4,1)}
@@ -11,4 +13,4 @@
 ;var n1 = LFNoise2.ar(n0 * 90 + 620)
 ;var n2 = LFNoise2.kr([0.3,0.3])
 ;var e = n1 * (n2 * 0.15 + 0.18)
-;Out.ar(0,CombL.ar(Mix.fill(4,node) + e,0.3,0.3,3))}.play
+;CombL.ar(Mix.fill(4,node) + e,0.3,0.3,3)}.play
diff --git a/gr/pond-life-ha.hs b/gr/pond-life-ha.hs
new file mode 100644
--- /dev/null
+++ b/gr/pond-life-ha.hs
@@ -0,0 +1,16 @@
+-- pond life (jmcc) #1
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-at #-}
+
+import Data.Hashable {- hashable -}
+import Sound.SC3 {- 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)) 0 (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/pond-life-hp.hs b/gr/pond-life-hp.hs
--- a/gr/pond-life-hp.hs
+++ b/gr/pond-life-hp.hs
@@ -1,16 +1,16 @@
--- pond life (jmcc)
+-- pond life (jmcc) #1
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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)
+  let f = fSinOsc KR (20 + #(randM 0 30)) 0
+          * #(randM 100 400)
+          + #(linRandM 500 2500 0)
+  let a = lfPulse KR (3 / #(randM 1 9)) 0 #(randM 0.2 0.5) * 0.04
+  return (pan2 (sinOsc AR f 0 * a) #(randM (-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
@@ -1,13 +1,13 @@
--- pond life (jmcc)
+-- pond life (jmcc) #1
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+        a = lfPulse KR (3 / rand 'δ' 1 9) 0 (rand 'ε' 0.2 0.5) * 0.04
     in pan2 (sinOsc AR f1 0 * a) (rand 'ζ' (-1) 1) 0.5
 
 main :: IO ()
diff --git a/gr/pond-life.scd b/gr/pond-life.scd
--- a/gr/pond-life.scd
+++ b/gr/pond-life.scd
@@ -1,3 +1,9 @@
-var f = FSinOsc.kr(20+30.0.rand,100+300.0.rand,500 + 2000.0.linrand);
-var o = SinOsc.ar(f,0,LFPulse.kr(3/(1 + 8.0.rand),0.2+0.3.rand,0.04));
-OverlapTexture.ar({Pan2.ar(o,1.0.rand2)},8,8,4,2)
+// pond life (jmcc) #1
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var f = FSinOsc.kr(20+30.0.rand,0,100+300.0.rand,500 + 2000.0.linrand);
+    var o = SinOsc.ar(f,0,LFPulse.kr(3/(1 + 8.0.rand),0,0.2+0.3.rand,0.04));
+    Pan2.ar(o,1.0.rand2);
+},sustainTime:8,transitionTime:8,overlap:4);
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
@@ -1,7 +1,7 @@
 -- > Sound.SC3.UGen.Help.viewSC3Help "ProxyMixer"
 
 import Control.Monad {- base -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Random.IO as L {- hsc3-lang -}
 
 mk_e :: IO (Envelope UGen)
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.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 randN_l :: ID z => Int -> z -> UGen -> UGen -> [UGen]
 randN_l k z l = mceChannels . randN k z l
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
@@ -1,18 +1,18 @@
--- pulsing bottles (jmcc)
+-- pulsing bottles (jmcc) #2
 
 import Control.Monad {- base -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  let r = do n <- whiteNoiseM AR
+             r0 <- randM 4 14
+             r1 <- randM 0 0.7
+             r2 <- randM 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)
+      s = do f <- randM 0.1 0.5
+             p <- randM 0 (pi * 2)
              return (sinOsc KR f p)
       u = liftM2 (\x y -> pan2 x y 1) r s
   fmap sum (sequence (replicate 6 u))
diff --git a/gr/pulsing-bottles.hs b/gr/pulsing-bottles.hs
--- a/gr/pulsing-bottles.hs
+++ b/gr/pulsing-bottles.hs
@@ -1,7 +1,6 @@
--- pulsing bottles (jmcc)
+-- pulsing bottles (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 pulsing_bottles :: UGen
diff --git a/gr/pulsing-bottles.scd b/gr/pulsing-bottles.scd
new file mode 100644
--- /dev/null
+++ b/gr/pulsing-bottles.scd
@@ -0,0 +1,9 @@
+// pulsing bottles (jmcc) #2
+
+{
+var n = 6; /* number of 'bottles' */
+Mix.arFill(n, {
+    var a = LFPulse.kr(4 + 10.0.rand, 0, 0.7.rand, 0.8/n);
+    var l = SinOsc.kr(0.1 + 0.4.rand, 2pi.rand);
+    Pan2.ar(Resonz.ar(WhiteNoise.ar(a),400 + 7000.0.linrand,0.01),l)});
+}.play;
diff --git a/gr/pwm-crossfade.hs b/gr/pwm-crossfade.hs
--- a/gr/pwm-crossfade.hs
+++ b/gr/pwm-crossfade.hs
@@ -1,6 +1,6 @@
 -- http://sccode.org/1-L (jl)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 urangeM :: UGen -> UGen -> UGen
 urangeM u = let [u0,u1] = mceChannels u in urange u0 u1
diff --git a/gr/rails.hs b/gr/rails.hs
--- a/gr/rails.hs
+++ b/gr/rails.hs
@@ -1,7 +1,6 @@
--- rails (jmcc)
+-- rails (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 rand2 :: ID a => a -> UGen -> UGen
diff --git a/gr/rails.scd b/gr/rails.scd
--- a/gr/rails.scd
+++ b/gr/rails.scd
@@ -1,9 +1,14 @@
-{var n = 20
-;var e = Dust.ar(100,0.04)
-;var f = XLine.kr(3000,300,8)
-;var l = Line.kr(1.0.rand2,1.0.rand2,8)
-;var r = Array.fill(n,{200 + 3000.0.linrand})
-;var t = Array.fill(n,{0.2 + 1.0.rand})
-;var k = Klank.ar(`[r,nil,t],Resonz.ar(e,f,0.2))
-;Pan2.ar(k,l)
-}.play
+// rails (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var n = 20; /* resonant modes */
+    var e = Dust.ar(100,0.04); /* excitation */
+    var f = XLine.kr(3000,300,8); /* sweep filter down */
+    var l = Line.kr(1.0.rand2,1.0.rand2,8); /* sweep pan */
+    var r = Array.fill(n,{200 + 3000.0.linrand}); /* resonant frequencies */
+    var t = Array.fill(n,{0.2 + 1.0.rand}); /* ring times */
+    var k = Klank.ar(`[r,nil,t],Resonz.ar(e,f,0.2));
+    Pan2.ar(k,l);
+},sustainTime:2,transitionTime:3,overlap:4);
diff --git a/gr/rain-thunder.hs b/gr/rain-thunder.hs
--- a/gr/rain-thunder.hs
+++ b/gr/rain-thunder.hs
@@ -1,6 +1,6 @@
 -- http://sccode.org/1-e (jl)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 rain_thunder :: UGen
 rain_thunder =
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
@@ -1,14 +1,14 @@
--- random panning sines (jmcc)
+-- random panning sines (jmcc) #4
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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 nd = do r0 <- linRandM 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
+              l <- lfNoise1M KR =<< randM 0.8 1.2
+              a <- lfNoise1M KR =<< randM 0.82 0.98
               return (pan2 o l a)
   r <- clone 8 nd
   return (mix r * (0.4 / 8))
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
@@ -1,7 +1,6 @@
--- random panning sines (jmcc)
+-- random panning sines (jmcc) #4
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 rps :: UGen
diff --git a/gr/random-panning-sines.scd b/gr/random-panning-sines.scd
new file mode 100644
--- /dev/null
+++ b/gr/random-panning-sines.scd
@@ -0,0 +1,14 @@
+// random panning sines (jmcc) #4
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~xfade_texture.({
+    var n = 8;
+    Mix.ar(Array.fill(n, {
+        Pan2.ar(
+            FSinOsc.ar(80 + 2000.0.linrand),
+            LFNoise1.kr(0.4 + 0.8.rand),
+                LFNoise1.kr(0.4 + 0.8.rand, 0.4, 0.5)
+        )
+        })) * (0.4 / n);
+}, 8, 8);
diff --git a/gr/random-pulsations.hs b/gr/random-pulsations.hs
--- a/gr/random-pulsations.hs
+++ b/gr/random-pulsations.hs
@@ -1,14 +1,15 @@
--- random pulsations (jmcc)
+-- random pulsations (jmcc) #1
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+    let e = envLinen 2 5 2 0.02
+        o1 = fSinOsc AR (rand 'α' 0 2000) 0 * envGen KR 1 1 0 1 DoNothing e
+        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
+main = spawnTextureU (const (9/8),maxBound) rp
diff --git a/gr/random-pulsations.scd b/gr/random-pulsations.scd
new file mode 100644
--- /dev/null
+++ b/gr/random-pulsations.scd
@@ -0,0 +1,11 @@
+// random pulsations (jmcc) #1
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~spawn.({
+    var env = Env.linen(2, 5, 2, 0.02);
+    var o1 = FSinOsc.ar(2000.0.rand, 0, EnvGen.kr(env,doneAction:2));
+    var o2 = SinOsc.ar(8+80.0.linrand, 0);
+    var o3 = SinOsc.kr(0.3+0.5.rand, 2pi.rand, 0.7);
+    Pan2.ar(o1.amclip(o2), o3);
+},nextTime:9/8);
diff --git a/gr/random-sine-waves-hp.hs b/gr/random-sine-waves-hp.hs
--- a/gr/random-sine-waves-hp.hs
+++ b/gr/random-sine-waves-hp.hs
@@ -1,10 +1,10 @@
--- random sine waves (jmcc)
+-- random sine waves (jmcc) #1
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  let rsw = pan2 (fSinOsc AR #(randM 0 2000) 0 * 0.02) #(randM (-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
--- a/gr/random-sine-waves-she.hs
+++ b/gr/random-sine-waves-she.hs
@@ -1,11 +1,12 @@
--- random sine waves (jmcc)
+-- random sine waves (jmcc) #1
 {-# OPTIONS_GHC -F -pgmF she #-}
 
 import Control.Applicative {- base -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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|)
+  s <- (|pan2 ((|fSinOsc ~AR (randM 0 2000) ~0|) .* 0.02) (randM (-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
@@ -1,6 +1,6 @@
--- random sine waves (jmcc)
+-- random sine waves (jmcc) #1
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 rsw :: UGen
diff --git a/gr/random-sine-waves.scd b/gr/random-sine-waves.scd
--- a/gr/random-sine-waves.scd
+++ b/gr/random-sine-waves.scd
@@ -1,3 +1,9 @@
-var e = Env.linen(2,5,2);
-var o = FSinOsc.ar(2000.0.rand,EnvGen.kr(e,1,0,0.02));
-play({Spawn.ar({Pan2.ar(o,1.0.rand2)},2,9/12)})
+// random sine waves (jmcc) #1
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~spawn.({
+    var env = Env.linen(2, 5, 2);
+    var osc = FSinOsc.ar(2000.0.rand,0,EnvGen.kr(env, doneAction:2, levelScale:0.02));
+    Pan2.ar(osc,1.0.rand2);
+},nextTime:9/12);
diff --git a/gr/record-scratcher.scd b/gr/record-scratcher.scd
--- a/gr/record-scratcher.scd
+++ b/gr/record-scratcher.scd
@@ -1,7 +1,7 @@
-{ var fn = "/home/rohan/audio/metal.wav"
+{ var fn = "/home/rohan/data/audio/pf-c5.snd"
 ; var b = 0
 ; var gate = 1
-; var e = Env.new([0, 1, 0], [0.1, 0.1], \sin, 1, nil)
+; var e = Env([0, 1, 0], [0.1, 0.1], \sin, 1, nil)
 ; var env = EnvGen.kr(e, gate, doneAction: 2)
 ; var x = MouseX.kr(-10, 10, 'linear', 0.2)
 ; var dx = x - DelayN.kr(x, 0.1, 0.1)
@@ -10,4 +10,4 @@
 ; var scr = PlayBuf.ar(1, b, bdxr, 0, 0, 1)
 ; var s = Server.default
 ; s.sendMsg("/b_allocRead", b, fn, 0, 0)
-; Out.ar(0, (scr * env).dup ) }.play
+; (scr * env).dup }.play
diff --git a/gr/red-frik-m.hs b/gr/red-frik-m.hs
--- a/gr/red-frik-m.hs
+++ b/gr/red-frik-m.hs
@@ -1,22 +1,22 @@
 -- red_frik (f0)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  r1 <- tRandM 0.3 3 tr
+  r2 <- tRandM 0.3 5 tr
+  r3 <- tRandM 0 0.5 tr
+  r4 <- tRandM 0.49 0.56 tr
+  r5 <- tRandM 0.3 0.6 tr
+  r6 <- tRandM 0.3 0.5 tr
   let o1 = fSinOsc KR r2 0 * r3 + r4
-      o2 = fSinOsc KR o1 r5 * r6
+      o2 = fSinOsc KR o1 0 * r5 + r6
   return (rhpf n r1 o2)
 
 red_frik :: UId m => m UGen
 red_frik = do
-  n <- clone 2 (brownNoise AR)
+  n <- clone 2 (brownNoiseM AR)
   let tr = impulse KR 0.1 0
   red tr n
 
diff --git a/gr/red-frik.scd b/gr/red-frik.scd
--- a/gr/red-frik.scd
+++ b/gr/red-frik.scd
@@ -6,8 +6,8 @@
             ; var r5 = TRand.kr(0.3, 0.6, tr)
             ; var r6 = TRand.kr(0.3, 0.5, tr)
             ; var o1 = FSinOsc.kr(r2, 0, r3, r4)
-            ; var o2 = FSinOsc.kr(o1, r5, r6)
+            ; var o2 = FSinOsc.kr(o1, 0, r5, r6)
             ; RHPF.ar(n, r1, o2) }
 ; var n = [BrownNoise.ar, BrownNoise.ar]
 ; var tr = Impulse.kr(0.1, 0)
-; Out.ar(0, red.value(tr, n)) }.play
+; red.(tr, n) }.play
diff --git a/gr/reso-pulse.hs b/gr/reso-pulse.hs
new file mode 100644
--- /dev/null
+++ b/gr/reso-pulse.hs
@@ -0,0 +1,27 @@
+-- reso-pulse (jmcc) #1
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 k n = rand k (-n) n
+
+reso_pulse :: UGen
+reso_pulse =
+    let f = midiCPS (lchoose 'α' [25,30,34,37,41,42,46,49,53,54,58,61,63,66])
+        f' = 2 * f + rand2 'β' 0.5
+    in (lfPulse AR f 0 0.2 + lfPulse AR f' 0 0.2) * 0.02
+
+-- > let g = reso_pulse_pp (silent 1)
+reso_pulse_pp :: UGen -> UGen
+reso_pulse_pp z =
+    let lfoFreq = 6
+        lfo = lfNoise0 'γ' KR lfoFreq * 1000 + 1200
+        x = mouseX KR 0.2 0.02 Exponential 0.2
+        left = rlpf z lfo x
+        delayTime = 2 / lfoFreq
+        right = delayN left delayTime delayTime
+    in mce2 left right
+
+main :: IO ()
+main = overlapTextureU_pp (4,2,4,maxBound) reso_pulse 1 reso_pulse_pp
diff --git a/gr/reso-pulse.scd b/gr/reso-pulse.scd
new file mode 100644
--- /dev/null
+++ b/gr/reso-pulse.scd
@@ -0,0 +1,17 @@
+// reso-pulse (jmcc) #1
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var f = #[25, 30, 34, 37, 41, 42, 46, 49, 53, 54, 58, 61, 63, 66].choose.midicps;
+    LFPulse.ar(f, 0, 0.2, 1, LFPulse.ar(2*f + 0.5.rand2, 0, 0.2, 1)) * 0.02;
+},sustainTime:4, transitionTime:2, overlap:4, postProcess:{
+    arg z;
+    var lfoFreq = 6;
+    var lfo = LFNoise0.kr(lfoFreq, 1000, 1200); // cutoff freq
+    var x = MouseX.kr(0.2, 0.02, 'exponential'); // filter bandwidth
+    var left = RLPF.ar(z, lfo, x);
+    var delayTime = 2 / lfoFreq;
+    var right = DelayN.ar(left, delayTime, delayTime); // delay right channel by two beats
+    [left,right];
+},numChannels:1);
diff --git a/gr/resonant-dust-hp.hs b/gr/resonant-dust-hp.hs
--- a/gr/resonant-dust-hp.hs
+++ b/gr/resonant-dust-hp.hs
@@ -1,15 +1,15 @@
--- resonant dust (jmcc)
+-- resonant dust (jmcc) #2
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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))
+  st <- randM 80 2080
+  let en = st + (st * #(randM (-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)
+  return (pan2 (resonz (#(dustM AR #(randM 50 850)) * 0.3) rf 0.1) #(randM (-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
@@ -1,6 +1,6 @@
--- resonant dust (jmcc)
+-- resonant dust (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 resonant_dust :: UGen
diff --git a/gr/resonant-dust.scd b/gr/resonant-dust.scd
new file mode 100644
--- /dev/null
+++ b/gr/resonant-dust.scd
@@ -0,0 +1,12 @@
+// resonant dust (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~spawn.({
+    var e = Env.linen(2, 5, 2);
+    var rf1 = 2000.0.rand + 80;
+    var rf2 = rf1 + (0.5.rand2 * rf1);
+    var d = Dust.ar(50 + 800.rand, 0.3);
+    var s = Resonz.ar(d, XLine.kr(rf1, rf2, 9), 0.1);
+    Pan2.ar(s, 1.0.rand2, EnvGen.ar(e, doneAction:2));
+}, 2);
diff --git a/gr/resonators-harmonic-series.hs b/gr/resonators-harmonic-series.hs
new file mode 100644
--- /dev/null
+++ b/gr/resonators-harmonic-series.hs
@@ -0,0 +1,24 @@
+-- resonators harmonic series (jmcc) #2
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Collection as C {- hsc3-lang -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 z n = rand z (negate n) n
+
+rhs :: UGen
+rhs =
+    let p = 12
+        noise = brownNoise 'α' AR * 0.001
+        rat = [1.0,1.125,1.25,1.333,1.5,1.667,1.875,2.0,2.25,2.5,2.667,3.0,3.333,3.75,4.0]
+        freq = lchoose 'β' rat * 120
+        resFreqs = zipWith (+) (C.series p freq freq) (uclone' 'γ' p (rand2 'δ' 0.5))
+        spec = klankSpec
+               resFreqs
+               (map (\i -> 1 / (constant i + 1)) [0 .. p - 1])
+               (uclone' 'ε' p (rand 'ζ' 0.5 4.5))
+    in uclone 'η' 2 (klank noise 1 0 1 spec)
+
+main :: IO ()
+main = xfadeTextureU (1,7,maxBound) rhs
diff --git a/gr/resonators-harmonic-series.scd b/gr/resonators-harmonic-series.scd
new file mode 100644
--- /dev/null
+++ b/gr/resonators-harmonic-series.scd
@@ -0,0 +1,21 @@
+// resonators harmonic series (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~xfade_texture.({
+    var p = 12; // number of overtones
+    var noise = BrownNoise.ar(0.001);
+    // a list representing a just diatonic scale expressed as ratios.
+    var rat = #[1.0,1.125,1.25,1.333,1.5,1.667,1.875,2.0,2.25,2.5,2.667,3.0,3.333,3.75,4.0];
+    // one value is chosen at random and multiplied by a 120 Hz fundamental
+    var freq = rat.choose * 120.0;
+    var resFreqs = Array.series(p, freq, freq) + Array.fill(p, { 0.5.rand2 });
+    var spec = Array.fill(2, {
+        `[  // filter bank specification
+            resFreqs,
+            Array.fill(p, { arg i; 1/(i+1) }),
+            Array.fill(p, { 0.5 + 4.0.rand })
+        ]
+    });
+    Klank.ar(spec, noise);
+}, 1, 7);
diff --git a/gr/reverberated-noise-bursts.hs b/gr/reverberated-noise-bursts.hs
new file mode 100644
--- /dev/null
+++ b/gr/reverberated-noise-bursts.hs
@@ -0,0 +1,14 @@
+-- reverberated noise bursts (jmcc) #3
+
+import Sound.SC3 {- hsc3 -}
+
+rnb :: UGen
+rnb =
+    let s = decay (dust 'α' AR 0.6 * 0.2) 0.15 * pinkNoise 'β' AR
+        z = delayN s 0.048 0.048
+        y = mix (combL z 0.1 (lfNoise1 'γ' KR (uclone 'δ' 6 (rand 'ε' 0 0.1)) * 0.04 + 0.05) 15)
+        f = useq 'ζ' 4 (\i -> allpassN i 0.050 (uclone 'η' 2 (rand 'θ' 0 0.05)) 1)
+    in s + f y
+
+main :: IO ()
+main = audition (out 0 rnb)
diff --git a/gr/reverberated-noise-bursts.scd b/gr/reverberated-noise-bursts.scd
new file mode 100644
--- /dev/null
+++ b/gr/reverberated-noise-bursts.scd
@@ -0,0 +1,14 @@
+// reverberated noise bursts (jmcc) #3
+
+{
+// pink noise percussion sound
+var s = Decay.ar(Dust.ar(0.6, 0.2), 0.15, PinkNoise.ar);
+// reverb predelay time
+var z = DelayN.ar(s, 0.048, 0.048);
+// 6 modulated comb delays in parallel
+var y = Mix.ar(CombL.ar(z, 0.1, LFNoise1.kr(Array.fill(6,{0.1.rand}), 0.04, 0.05), 15));
+// chain of 4 allpass delays on each of two channels (8 total)
+4.do({y = AllpassN.ar(y, 0.050, [0.050.rand, 0.050.rand], 1)});
+// add original sound to reverb
+s + y
+}.play;
diff --git a/gr/reverberated-sine-percussion-hp.hs b/gr/reverberated-sine-percussion-hp.hs
--- a/gr/reverberated-sine-percussion-hp.hs
+++ b/gr/reverberated-sine-percussion-hp.hs
@@ -1,18 +1,19 @@
--- reverberated sine percussion (jmcc)
+-- reverberated sine percussion (jmcc) #3
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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_ = do return (resonz (#(dustM AR (2 / constant d)) * 50) (200 + #(randM 0 3000)) 0.003)
+      x_ i = do return (allpassN i 0.05 #(clone 2 (randM 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))
+          return (mix (combL z 0.1 (#(lfNoise1M KR #(clone c (randM 0 0.1))) * 0.04 + 0.05) 15))
   x <- chainM a x_ y
   return (s + x * 0.2)
 
diff --git a/gr/reverberated-sine-percussion-m.hs b/gr/reverberated-sine-percussion-m.hs
--- a/gr/reverberated-sine-percussion-m.hs
+++ b/gr/reverberated-sine-percussion-m.hs
@@ -1,21 +1,22 @@
--- reverberated sine percussion (jmcc)
+-- reverberated sine percussion (jmcc) #3
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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
+      s_ = do n <- dustM AR (2 / constant d)
+              r <- randM 0 3000
               return (resonz (n * 50) (200 + r) 0.003)
-      x_ i = do r <- clone 2 (rand 0 0.05)
+      x_ i = do r <- clone 2 (randM 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
+          r <- clone c (randM 0 0.1)
+          n <- lfNoise1M KR r
           return (mix (combL z 0.1 (n * 0.04 + 0.05) 15))
   x <- chainM a x_ y
   return (s + x * 0.2)
diff --git a/gr/reverberated-sine-percussion.scd b/gr/reverberated-sine-percussion.scd
--- a/gr/reverberated-sine-percussion.scd
+++ b/gr/reverberated-sine-percussion.scd
@@ -1,15 +1,10 @@
-{var d = 6
-;var c = 5
-;var a = 4
-;var s_ = {var n = Dust.ar(2 / d)
-          ;var r = Rand.new(0,3000)
-          ;Resonz.ar(n * 50,200 + r,0.003)}
-;var s = Mix.ar(Array.fill(d,s_))
-;var z = DelayN.ar(s,0.048)
-;var y_ = LFNoise1.kr(Array.fill(c,{Rand.new(0,0.1)}),0.04,0.05)
-;var y = Mix.ar(CombL.ar(z,0.1,y_,15))
-;var x = y
-;var x_ = {var r = [Rand.new(0,0.05),Rand.new(0,0.05)]
-          ;x = AllpassN.ar(x,0.050,r,1)}
-;a.do(x_)
-;Out.ar(0,s + (0.2 * x))}.play
+// reverberated sine percussion (jmcc) #3
+
+{{arg d, c, a
+ ;var s = Mix.ar(Array.fill(d,{Resonz.ar(Dust.ar(2 / d) * 50,200 + Rand(0,3000),0.003)}))
+ ;var z = DelayN.ar(s,0.048,0.048)
+ ;var y_ = LFNoise1.kr(Array.fill(c,{Rand(0,0.1)}),0.04,0.05)
+ ;var y = Mix.ar(CombL.ar(z,0.1,y_,15))
+ ;var x = y
+ ;a.do({x = AllpassN.ar(x,0.050,[Rand(0,0.05),Rand(0,0.05)],1)})
+ ;s + (0.2 * x)}.(6,5,4)}.play
diff --git a/gr/ring-modulate-input.hs b/gr/ring-modulate-input.hs
new file mode 100644
--- /dev/null
+++ b/gr/ring-modulate-input.hs
@@ -0,0 +1,13 @@
+-- ring modulate input (jmcc) #5
+
+import Sound.SC3 {- hsc3 -}
+
+ring_modulate_input :: UGen
+ring_modulate_input =
+    let input = soundIn (mce2 0 1)
+        x = mouseX KR 10 4000 Exponential 0.2 -- mouse x controls ring mod freq
+        modulator = sinOsc AR x (mce2 0 (0.5 * pi)) -- offset phase of one osc by 90 degrees
+    in input * modulator
+
+main :: IO ()
+main = audition (out 0 ring_modulate_input)
diff --git a/gr/ring-modulate-input.scd b/gr/ring-modulate-input.scd
new file mode 100644
--- /dev/null
+++ b/gr/ring-modulate-input.scd
@@ -0,0 +1,7 @@
+// ring modulate input (jmcc) #5
+
+{var input = SoundIn.ar([0,1])
+;var x = MouseX.kr(10,4000,'exponential') /* mouse x controls ring mod freq */
+;var modulator = SinOsc.ar(x,[0,0.5pi]) /* offset phase of one osc by 90 degrees */
+;input * modulator}.play
+
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)
+-- ring modulated klank (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 rmk :: UGen
diff --git a/gr/ring-modulated-klank.scd b/gr/ring-modulated-klank.scd
new file mode 100644
--- /dev/null
+++ b/gr/ring-modulated-klank.scd
@@ -0,0 +1,10 @@
+// ring modulated klank (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var p = 8; // number of partials
+    var i = Dust.ar(20, 0.02);
+    var a = Klank.ar(`[Array.rand(p, 100, 10000), nil, Array.rand(p, 0.2, 1.0)], i);
+    Pan2.ar(SinOsc.ar(LFNoise2.kr(1.0 + 0.3.rand2, 200, 350 + 50.rand), 0, a), 1.0.rand2);
+}, 4, 4, 4);
diff --git a/gr/rm-octaver.hs b/gr/rm-octaver.hs
--- a/gr/rm-octaver.hs
+++ b/gr/rm-octaver.hs
@@ -1,15 +1,18 @@
 -- rm-octaver (av), courtesy miller puckette
+-- http://crca.ucsd.edu/~msp/techniques/latest/book-html/node77.html
 
+
 import Sound.SC3 {- hsc3 -}
 
 defaultPitch :: UGen -> UGen
-defaultPitch x = pitch x 440 60 4000 100 16 1 0.01 0.5 1
+defaultPitch x = pitch x 440 60 4000 100 16 1 0.01 0.5 1 0
 
 rm_octaver :: UGen -> UGen
 rm_octaver i =
     let p = defaultPitch i
-        f = mceChannel 0 p
-    in sinOsc AR (f * 0.5) 0 * i + i
+        [f,tr] = mceChannels p
+    in lag3 tr 0.1 * sinOsc AR (f * 0.5) 0 * i + i
 
+-- > audition (out 0 (soundIn 4))
 main :: IO ()
 main = audition (out 0 (rm_octaver (soundIn 4)))
diff --git a/gr/rzblp-hp.hs b/gr/rzblp-hp.hs
--- a/gr/rzblp-hp.hs
+++ b/gr/rzblp-hp.hs
@@ -1,10 +1,11 @@
 -- rzblp-hp (rd)
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
 lfn :: UId m => UGen -> UGen -> UGen -> m UGen
-lfn f l r = fmap (range l r) (lfNoise0 KR f)
+lfn f l r = fmap (range l r) (lfNoise0M KR f)
 
 hpb :: UId m => UGen -> m UGen
 hpb q =
@@ -25,7 +26,7 @@
   return (sum [s1,s2,s3,s4])
 
 rzblp :: UId m => m UGen
-rzblp = mk_f drand .+. mk_f dxrand
+rzblp = mk_f drandM .+. mk_f dxrandM
 
 main :: IO ()
 main = audition . out 0 =<< rzblp
diff --git a/gr/rzblp-m.hs b/gr/rzblp-m.hs
--- a/gr/rzblp-m.hs
+++ b/gr/rzblp-m.hs
@@ -1,9 +1,10 @@
 -- rzblp-m (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
 lfn :: UId m => UGen -> UGen -> UGen -> m UGen
-lfn f l r = fmap (range l r) (lfNoise0 KR f)
+lfn f l r = fmap (range l r) (lfNoise0M KR f)
 
 hpb :: UId m => UGen -> m UGen
 hpb q =
@@ -28,7 +29,7 @@
   return (sum [s1,s2,s3,s4])
 
 rzblp :: UId m => m UGen
-rzblp = mk_f drand .+. mk_f dxrand
+rzblp = mk_f drandM .+. mk_f dxrandM
 
 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
@@ -1,10 +1,10 @@
 -- rzblp-u (rd)
 
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+import qualified Sound.SC3.UGen.Unsafe as U {- hsc3-unsafe -}
 
 lfn :: UGen -> UGen -> UGen -> UGen
-lfn f l r = range l r (lfNoise0 KR f)
+lfn f l r = range l r (U.lfNoise0 KR f)
 
 hpb :: UGen -> UGen
 hpb q =
@@ -29,7 +29,7 @@
            ,blip AR (lfn q 16 36) 3 * mce2 0.03 0.09]
 
 rzblp :: UGen
-rzblp = mk_f drand + mk_f dxrand
+rzblp = mk_f U.drand + mk_f U.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
@@ -1,15 +1,16 @@
 -- rzblp (rd)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
-lfn :: ID a => a -> UGen -> UGen -> UGen -> UGen
+lfn :: ID a => a -> UGen -> Double -> Double -> UGen
 lfn z f l r =
     let z' = z `joinID` l `joinID` r
-    in range l r (lfNoise0 z' KR f)
+    in range (constant l) (constant r) (lfNoise0 z' KR f)
 
-hpb :: (ID a) => a -> UGen -> UGen
+hpb :: ID a => a -> UGen -> UGen
 hpb z q =
-    let g i = let z' = idHash z + i
+    let g :: Int -> UGen
+        g i = let z' = z `joinID` i
                   f = lfn z' q 1330 1395
                   a = lfn z' q 0.001 0.007
               in blip AR f 24 * a
diff --git a/gr/s-chirp.hs b/gr/s-chirp.hs
--- a/gr/s-chirp.hs
+++ b/gr/s-chirp.hs
@@ -1,7 +1,7 @@
 -- s-chirp (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 s_chirp :: UGen
 s_chirp =
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
@@ -3,9 +3,10 @@
 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 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 text :: [String]
 text =
@@ -33,22 +34,23 @@
         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 :: (Floating t, RandomGen g, Random t) => g -> [(String,(t,t,t,t))]
 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)])
+          return (w,(f1,f2,f3,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))
+      (f1,f2,f3,d) = unzip4 (mapMaybe (\w -> lookup w t) (concat x))
+      p = [("freq1",f1)
+          ,("freq2",f2)
+          ,("freq3",f3)
+          ,("dur",d)]
+  audition (P.sbind1 (sam,p))
diff --git a/gr/sample-and-hold-liquidities.hs b/gr/sample-and-hold-liquidities.hs
--- a/gr/sample-and-hold-liquidities.hs
+++ b/gr/sample-and-hold-liquidities.hs
@@ -1,12 +1,12 @@
--- sample and hold liquidities (jmcc)
+-- sample and hold liquidities (jmcc) #4
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 shl :: UGen
 shl =
     let r = mouseX KR 1 200 Exponential 0.1
         t = recip r
-        c = impulse KR r 0.4
+        c = impulse KR r 0 * 0.4
         cf = mouseY KR 100 8000 Exponential 0.1
         f = latch (whiteNoise 'α' KR * cf * 0.5 + cf) c
         p = latch (whiteNoise 'β' KR) c
diff --git a/gr/sample-and-hold-liquidities.scd b/gr/sample-and-hold-liquidities.scd
--- a/gr/sample-and-hold-liquidities.scd
+++ b/gr/sample-and-hold-liquidities.scd
@@ -1,8 +1,10 @@
+// sample and hold liquidities (jmcc) #4
+
 {var r = MouseX.kr(1,200,'exponential',0.1)
 ;var t = r.reciprocal
-;var c = Impulse.kr(r,0.4)
+;var c = Impulse.kr(r,0,0.4)
 ;var cf = MouseY.kr(100,8000,'exponential',0.1)
 ;var f = Latch.kr(WhiteNoise.kr * cf * 0.5 + cf,c)
 ;var p = Latch.kr(WhiteNoise.kr,c)
 ;var i = Pan2.ar(SinOsc.ar(f,0,Decay2.kr(c,0.1 * t,0.9 * t)),p,1)
-;Out.ar(0,CombN.ar(i,0.3,0.3,2))}.play
+;CombN.ar(i,0.3,0.3,2)}.play
diff --git a/gr/saucer-base.hs b/gr/saucer-base.hs
--- a/gr/saucer-base.hs
+++ b/gr/saucer-base.hs
@@ -1,6 +1,6 @@
--- saucer base (jmcc)
+-- saucer base (jmcc) #6
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 saucer_base :: UGen
diff --git a/gr/saucer-base.scd b/gr/saucer-base.scd
new file mode 100644
--- /dev/null
+++ b/gr/saucer-base.scd
@@ -0,0 +1,12 @@
+// saucer base (jmcc) #6
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var a = 20.0.rand;
+    var b = 1000.0.rand;
+    var c = 5000.0.rand;
+    var pan = 1.0.rand2;
+    Pan2.ar(SinOsc.ar(SinOsc.ar(SinOsc.ar(a, 0, b, 1.1*b), 0, c, 1.1*c), 0, 0.1), pan);
+},6,2,4);
+
diff --git a/gr/sawed-cymbals.hs b/gr/sawed-cymbals.hs
--- a/gr/sawed-cymbals.hs
+++ b/gr/sawed-cymbals.hs
@@ -1,7 +1,6 @@
--- sawed cymbals (jmcc)
+-- sawed cymbals (jmcc) #9
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 sawed_cymbals :: UGen
diff --git a/gr/sawed-cymbals.scd b/gr/sawed-cymbals.scd
new file mode 100644
--- /dev/null
+++ b/gr/sawed-cymbals.scd
@@ -0,0 +1,14 @@
+// sawed cymbals (jmcc) #9
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var p = 15;	// number of partials per channel per 'cymbal'.
+    var f1 = 500 + 2000.0.rand;
+    var f2 = 8000.0.rand;
+    var fr = Array.fill(p, {f1 + f2.rand}); // frequencies
+    var rt = Array.fill(p, {2.0 + 4.0.rand}); // ring times
+    var sp = Array.fill(2, {`[fr,nil,rt]});
+    Klank.ar(sp,LFSaw.ar(XLine.kr(600.0.rand, 600.0.rand, 12), 0, 0.0005));
+}, 4, 4, 6);
+
diff --git a/gr/scratchy-m.hs b/gr/scratchy-m.hs
--- a/gr/scratchy-m.hs
+++ b/gr/scratchy-m.hs
@@ -1,10 +1,10 @@
--- scratchy-m (jmcc)
+-- scratchy-m (jmcc) #1
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 scratchy :: UId m => m UGen
 scratchy = do
-  n <- clone 2 (brownNoise AR)
+  n <- clone 2 (brownNoiseM AR)
   let f = max (n * 0.5 - 0.49) 0 * 20
   return (rhpf f 5000 1)
 
diff --git a/gr/scratchy.hs b/gr/scratchy.hs
--- a/gr/scratchy.hs
+++ b/gr/scratchy.hs
@@ -1,12 +1,12 @@
--- scratchy (jmcc)
+-- scratchy (jmcc) #1
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- 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
+  let n = brownNoise 'α' AR * 0.5 - 0.49
+      n' = uclone 'β' 2 n
+  in rhpf (max n' 0 * 20) 5000 1
 
 main :: IO ()
 main = audition (out 0 scratchy)
diff --git a/gr/scratchy.scd b/gr/scratchy.scd
--- a/gr/scratchy.scd
+++ b/gr/scratchy.scd
@@ -1,3 +1,5 @@
-{ var n = BrownNoise.ar([0.5, 0.5])
-; var f = (n - 0.49).max(0) * 20
-; Out.ar(0, RHPF.ar(f, 5000, 1)) }.play
+// scratchy (jmcc) #1
+
+{var n = BrownNoise.ar([0.5, 0.5])
+;var f = (n - 0.49).max(0) * 20
+;RHPF.ar(f, 5000, 1)}.play
diff --git a/gr/scritto-m.hs b/gr/scritto-m.hs
--- a/gr/scritto-m.hs
+++ b/gr/scritto-m.hs
@@ -1,6 +1,6 @@
 -- scritto (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Data.Vowel as V {- hsc3-lang -}
 
 main :: IO ()
@@ -12,15 +12,15 @@
       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
+        n <- lfNoise2M 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
+            i d = do n1 <- tRandM 0.02 0.06 t
+                     n2 <- tIRandM 30 52 t
+                     n3 <- tIRandM 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
+            bi = linLin_b n 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..])
diff --git a/gr/scritto.hs b/gr/scritto.hs
--- a/gr/scritto.hs
+++ b/gr/scritto.hs
@@ -2,7 +2,7 @@
 
 import Control.Monad
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Data.Vowel as V {- hsc3-lang -}
 
 scritto_i :: UGen -> UGen
@@ -11,7 +11,7 @@
         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
+            let bi = linLin_b n0 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) =
diff --git a/gr/seqr-n.hs b/gr/seqr-n.hs
new file mode 100644
--- /dev/null
+++ b/gr/seqr-n.hs
@@ -0,0 +1,24 @@
+-- seqr-n (rd)
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+
+seqr_f :: UGen -> UGen -> UGen
+seqr_f f e =
+    let n = constant (mceDegree e) / 2
+    in select (mulAdd (lfSaw KR f 0) n n) e
+
+seqr_n :: Int -> UGen
+seqr_n n =
+  let f = iRand 'α' 9 18 / constant n
+      o1 = let f1 = seqr_f f (midiCPS (iRandN n 'β' 72 96))
+               f2 = seqr_f f (midiCPS (iRandN n 'γ' 72 84))
+               h1 = seqr_f f (randN n 'δ' 1 3)
+               h2 = seqr_f f (randN n 'ε' 3 6)
+           in blip AR (mce2 f1 f2) (mce2 h1 h2)
+      o2 = mce2 (seqr_f f (randN n 'ζ' 0.05 0.10)) (seqr_f f (randN n 'η' 0.05 0.15))
+  in o1 * o2
+
+main :: IO ()
+main = overlapTextureU (6,6,3,maxBound) (seqr_n 13)
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.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 nrand :: ID z => Int -> z -> UGen -> UGen -> [UGen]
 nrand n e l = mceChannels . randN n e l
diff --git a/gr/shepard-tones.scd b/gr/shepard-tones.scd
--- a/gr/shepard-tones.scd
+++ b/gr/shepard-tones.scd
@@ -9,5 +9,4 @@
 ;var phases = (0..9) * 0.1 * 1024 + ph
 ;var freqs = BufRd.ar(1,b1.bufnum,phases)
 ;var amps = BufRd.ar(1,b2.bufnum,phases)
-;var tone = Mix.ar(SinOsc.ar(freqs) * amps) * 0.1
-;Out.ar(0,tone)}.play
+;Mix.ar(SinOsc.ar(freqs) * amps) * 0.1}.play
diff --git a/gr/shifting-pulses-m.hs b/gr/shifting-pulses-m.hs
--- a/gr/shifting-pulses-m.hs
+++ b/gr/shifting-pulses-m.hs
@@ -1,16 +1,13 @@
 -- shifting pulses (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
-
-wrp :: UGen -> UGen -> UGen -> UGen
-wrp i l r = linLin i (-1) 1 l r
+import Sound.SC3 {- hsc3 -}
 
 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
+  r0 <- randM 0.2 0.9
+  r1 <- randM 0.95 1.05
+  r2 <- clone 2 (randM 0.95 1.05)
+  let f' = f * linLin_b (sinOsc KR r0 0) 1 1.01 * r1
       a' = a * r2
       o = sinOsc AR (mce2 f f') 0
   return (o * a')
@@ -23,21 +20,21 @@
 -- 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)
+  n <- (lfNoise2M KR 2)
+  return (formant AR (mce2 20 21) (linLin_b 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
+  n0 <- clone 2 (brownNoiseM KR)
+  n1 <- clone 2 (brownNoiseM KR)
+  n2 <- clone 2 (brownNoiseM KR)
+  t <- dustM 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
+      f = warp n1 90 300
+      rq = warp n2 2 9
   return (mrg2 (l * rlpf p f rq) (sendTrig t 0 t))
 
 shifting_pulses :: UId m => m UGen
diff --git a/gr/shifting-pulses.scd b/gr/shifting-pulses.scd
--- a/gr/shifting-pulses.scd
+++ b/gr/shifting-pulses.scd
@@ -1,9 +1,9 @@
 {var n0 = BrownNoise.kr.dup
-var n1 = BrownNoise.kr.dup
-var n2 = BrownNoise.kr.dup
-var t = Dust.kr(0.75)
-var l = Latch.kr(t,t)
-var p = Pulse.ar(n0.range(2,[11,15]),0.01) * 0.1
-var f = n1.range(300,1800)
-var rq = n2.range(0.01,2)
-Out.ar(0,l * RLPF.ar(p,f,rq))}.play
+;var n1 = BrownNoise.kr.dup
+;var n2 = BrownNoise.kr.dup
+;var t = Dust.kr(0.75)
+;var l = Latch.kr(t,t)
+;var p = Pulse.ar(n0.range(2,[11,15]),0.01) * 0.1
+;var f = n1.range(300,1800)
+;var rq = n2.range(0.01,2)
+;l * RLPF.ar(p,f,rq)}.play
diff --git a/gr/sidereal-time-hp.hs b/gr/sidereal-time-hp.hs
--- a/gr/sidereal-time-hp.hs
+++ b/gr/sidereal-time-hp.hs
@@ -1,24 +1,24 @@
--- sidereal time (jmcc)
+-- sidereal time (jmcc) #9
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
 import Control.Monad {- base -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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)
+             fr <- replicateM p (expRandM 100 6000)
+             rt <- replicateM p (randM 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))
+  let f = xLine KR #(expRandM 40 300) #(expRandM 40 300) 12 DoNothing
+  let t = lfPulse AR f 0 #(randM 0.1 0.9)
+          * max 0 #(lfNoise2M KR #(randM 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)
+  return (combN o 0.6 #(randM 0.1 0.6) 8 + mceReverse o)
 
 main :: IO ()
 main = overlapTextureU (4,4,6,maxBound) =<< sidereal_time
diff --git a/gr/sidereal-time.hs b/gr/sidereal-time.hs
--- a/gr/sidereal-time.hs
+++ b/gr/sidereal-time.hs
@@ -1,7 +1,6 @@
--- sidereal time (jmcc)
+-- sidereal time (jmcc) #9
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 sidereal_time :: UGen
diff --git a/gr/sidereal-time.scd b/gr/sidereal-time.scd
--- a/gr/sidereal-time.scd
+++ b/gr/sidereal-time.scd
@@ -1,9 +1,16 @@
-var p = 15;
-play({OverlapTexture.ar({
-var z = Array.fill(2,{`[Array.fill(p,{exprand(100.0,6000.0)}),
-                        nil,
-                        Array.fill(p,{2.0 + 4.0.rand})]});
-var f = XLine.kr(exprand(40.0,300.0),exprand(40.0,300.0),12);
-var t = LFPulse.ar(f,rrand(0.1,0.9),0.002 * LFNoise2.kr(8.0.rand).max(0));
-var o = Klank.ar(z,t).distort * 0.1;
-CombN.ar(o,0.6,0.5.rand + 0.1,8,1,o.reverse);},4,4,6,2)}))
+// sidereal time (jmcc) #9
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var p = 15;
+    var z = Array.fill(2,{`[Array.fill(p,{exprand(100.0,6000.0)}),
+        nil,
+        Array.fill(p,{2.0 + 4.0.rand})]});
+    var f = XLine.kr(exprand(40.0,300.0),exprand(40.0,300.0),12);
+    var t = LFPulse.ar(f,0,rrand(0.1,0.9),0.002 * LFNoise2.kr(8.0.rand).max(0));
+    Klank.ar(z,t).distort * 0.1;
+},sustainTime:4,transitionTime:4,overlap:6,postProcess:{
+    arg z;
+    CombN.ar(z,0.6,0.5.rand + 0.1,8,1,z.reverse);
+});
diff --git a/gr/sinusdeklinationen.hs b/gr/sinusdeklinationen.hs
--- a/gr/sinusdeklinationen.hs
+++ b/gr/sinusdeklinationen.hs
@@ -1,40 +1,33 @@
 -- http://www.fredrikolofsson.com/f0blog/?q=node/488 (f0)
+{-# OPTIONS_GHC -F -pgmF hsc3-psynth #-}
 
 import Data.List.Split {- split -}
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3.Lang.Collection.Numerical.Truncating () {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- 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
+sinuscell :: Synthdef
+sinuscell = psynth {bus=0,pan=0,amp=0.5,freq=400,atk=1,sus=0.2,rel=1} where
+    let e_d = envLinen atk sus rel amp
         e = envGen KR 1 0.1 0 1 RemoveSynth e_d
-        s = sinOsc AR fre 0
-    in out b (pan2 s p e)
+        s = sinOsc AR freq 0
+    in out bus (pan2 s pan e)
 
-pattern :: Enum e => (Field,[e]) -> [P_Bind]
+pattern :: Enum e => (Double,[e]) -> (Synthdef,P.Param)
 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)]
+          let a = P.white z0 0 1
+              s = repeat 0.2
+              r = P.white z1 0 1
+          in (sinuscell
+             ,[("dur",a + s + r)
+              ,("amp",P.white z3 0 1)
+              ,("freq",P.white z2 0 1100)
+              ,("atk",a)
+              ,("sus",s)
+              ,("rel",r)
+              ,("pan",repeat c)])
       _ -> undefined
 
 cells :: Fractional n => [n]
@@ -43,4 +36,4 @@
 main :: IO ()
 main =
     let c = zip cells (chunksOf 4 ['α'..])
-    in audition (ppar (map (pbind . pattern) c))
+    in audition (P.sbind (map pattern c))
diff --git a/gr/slow-beating-harmonic-sines.hs b/gr/slow-beating-harmonic-sines.hs
--- a/gr/slow-beating-harmonic-sines.hs
+++ b/gr/slow-beating-harmonic-sines.hs
@@ -1,10 +1,10 @@
--- slow beating harmonic sines (jmcc)
+-- slow beating harmonic sines (jmcc) #7
 
 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
+import Sound.SC3.Lang.Random.Monad as L {- hsc3-lang -}
 
 r_freq :: (RandomGen g) => Int -> Int -> Rand g [Double]
 r_freq k i = do
@@ -23,7 +23,7 @@
 
 sbhs :: (RandomGen g) => Int -> Double -> Int -> Rand g UGen
 sbhs n d m = do
-  k' <- rand 12
+  k' <- L.rand 12
   let k = 24 + k'
   f <- r_freq k n
   p_fr <- mapM (r_harmonics d m) f
diff --git a/gr/slow-beating-harmonic-sines.scd b/gr/slow-beating-harmonic-sines.scd
new file mode 100644
--- /dev/null
+++ b/gr/slow-beating-harmonic-sines.scd
@@ -0,0 +1,33 @@
+// slow beating harmonic sines (jmcc) #7
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~xfade_texture.({
+    var n = 8; // number of notes
+    var d = 0.4; // beat freq deviation
+    var m = 5; // harmonics per note
+    var p = Array(m*n);
+    var q = Array(m*n);
+    var k = 24 + 12.rand;
+    n.do({
+        var freq = (#[0,2,4,5,7,9].choose + (7.rand*12) + k).midicps;
+        p.add(freq + d.rand2);
+        p.add(freq*2 + d.rand2);
+        p.add(freq*4 + d.rand2);
+        p.add(freq*5 + d.rand2);
+            p.add(freq*6 + d.rand2);
+    });
+    n.do({
+        arg i;
+        var freq = p.at(m*i);
+        q.add(freq + d.rand2);
+        q.add(freq*2 + d.rand2);
+        q.add(freq*4 + d.rand2);
+        q.add(freq*5 + d.rand2);
+        q.add(freq*6 + d.rand2);
+    });
+    z = [`[p, nil, Array.rand(m*n, 0, 2pi)],
+         `[q, nil, Array.rand(m*n, 0, 2pi)]
+            ];
+    Klang.ar(z) * (0.1/n);
+}, 6, 3);
diff --git a/gr/slow-beating-sines.hs b/gr/slow-beating-sines.hs
--- a/gr/slow-beating-sines.hs
+++ b/gr/slow-beating-sines.hs
@@ -1,4 +1,4 @@
--- slow beating sines (jmcc)
+-- slow beating sines (jmcc) #7
 
 import Control.Monad {- base -}
 import Control.Monad.Random {- MonadRandom -}
@@ -20,6 +20,7 @@
 r_phase :: (RandomGen g) => Int -> Rand g [Double]
 r_phase m = nrrand m 0 (2 * pi)
 
+-- > g <- fmap (fst . runRand (sbs 3 0.4 3)) getStdGen
 sbs :: (RandomGen g) => Int -> Double -> Int -> Rand g UGen
 sbs n d m = do
   f <- r_freq n
diff --git a/gr/slow-beating-sines.scd b/gr/slow-beating-sines.scd
new file mode 100644
--- /dev/null
+++ b/gr/slow-beating-sines.scd
@@ -0,0 +1,29 @@
+// slow beating sines (jmcc) #7
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~xfade_texture.({
+    var n = 20; // n*3 components in each channel
+    var d = 5.0; // beat freq deviation
+    var p = Array(3*n);
+    var q = Array(3*n);
+    n.do({
+        var freq = (24 + 60.rand).midicps;
+        p.add(freq);
+        p.add(freq + d.rand2);
+        p.add(freq + d.rand2);
+    });
+    n.do({
+        arg i;
+        var freq = p.at(3*i);
+        q.add(freq + d.rand2);
+        q.add(freq + d.rand2);
+        q.add(freq + d.rand2);
+    });
+    z = [`[p, nil, Array.rand(3*n, 0, 2pi)],
+         `[q, nil, Array.rand(3*n, 0, 2pi)]
+    ];
+    Klang.ar(z) * (0.1/n);
+}, 4, 4);
+
+// ritual hymn in praise of the god of the LS-3000 life support unit.
diff --git a/gr/snare-909.hs b/gr/snare-909.hs
--- a/gr/snare-909.hs
+++ b/gr/snare-909.hs
@@ -1,6 +1,6 @@
 -- snare-909 (jmcc)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 snare_909 :: UGen -> UGen
 snare_909 tr =
diff --git a/gr/snare-909.scd b/gr/snare-909.scd
--- a/gr/snare-909.scd
+++ b/gr/snare-909.scd
@@ -1,11 +1,13 @@
+// snare-909 (jmcc)
+
 { var snr =
       { arg tr, n, v
       ; var e = { arg a, b
                 ; EnvGen.ar(Env.perc(a, b), tr, 1, 0, 1, 0) }
-      ; var e1 = e.value(0.0005, 0.055)
-      ; var e2 = e.value(0.0005, 0.075)
-      ; var e3 = e.value(0.0005, 0.4)
-      ; var e4 = e.value(0.0005, 0.283)
+      ; var e1 = e.(0.0005, 0.055)
+      ; var e2 = e.(0.0005, 0.075)
+      ; var e3 = e.(0.0005, 0.4)
+      ; var e4 = e.(0.0005, 0.283)
       ; var t1 = LFTri.ar(330, 0)
       ; var t2 = LFTri.ar(185, 0)
       ; var x1 = LPF.ar(n, 7040) * (0.1 + v)
@@ -16,6 +18,6 @@
 ; var x = MouseX.kr(1, 4, 'linear', 0.2)
 ; var y = MouseY.kr(0.25, 0.75, 'exponential', 0.2)
 ; var t = Impulse.kr(3 * x, 0)
-; var n = WhiteNoise.AR
+; var n = WhiteNoise.ar
 ; var v = TRand.kr(0.25, 1.0, t)
-; Out.ar(0, Pan2.ar(snr.value(t, n, v), 0, y)) }.play
+; Pan2.ar(snr.(t, n, v), 0, y) }.play
diff --git a/gr/sosc-lp-m.hs b/gr/sosc-lp-m.hs
--- a/gr/sosc-lp-m.hs
+++ b/gr/sosc-lp-m.hs
@@ -1,13 +1,13 @@
 -- sosc-lp (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+dustR' :: UId m => Rate -> UGen -> UGen -> m UGen
+dustR' r lo hi = do
+  n1 <- dwhiteM 1 lo hi
+  n2 <- whiteNoiseM r
+  d <- dseqM dinf n1
   return (tDuty r d 0 DoNothing (abs n2) 1)
 
 setup :: Transport m => m ()
@@ -19,6 +19,9 @@
   send (b_setn1 10 0 a)
   send (b_setn1 11 0 b)
 
+--b0 = asLocalBuf 'α' [60, 71, 89, 65, 36, 57, 92, 97, 92, 97]
+--b1 = asLocalBuf 'β' [71, 89, 60, 57, 65, 36, 95, 92, 93, 97]
+
 sosc_lp :: UGen -> UGen -> UGen
 sosc_lp t n =
     let d_env = decay2 t 0.002 2.5
@@ -33,8 +36,8 @@
 
 sosc_lp_m :: UId m => m UGen
 sosc_lp_m = do
-  clk <- dustR KR 0.2 0.9
-  n <- lfNoise0 KR (mce2 1 3)
+  clk <- dustR' KR 0.2 0.9
+  n <- lfNoise0M KR (mce2 1 3)
   return (sosc_lp clk n)
 
 main :: IO ()
diff --git a/gr/spe-m.hs b/gr/spe-m.hs
--- a/gr/spe-m.hs
+++ b/gr/spe-m.hs
@@ -1,19 +1,20 @@
--- spe (jmcc)
--- variant of graph in streams & patterns tutorial
+-- spe (jmcc)/(rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
+-- fmap (Sound.SC3.UGen.PP.ugen_graph_forth_pp False) spe
 spe :: UId m => m UGen
 spe = do
-  let rapf i = do r <- clone 2 (rand 0 0.05)
+  let rapf i = do r <- clone 2 (randM 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
+               n <- lfNoise1M KR 1
+               m <- dseqM dinf s
                let f = midiCPS (demand t 0 m + 32)
                    o = lfSaw AR f 0 * e
                    rq = midiCPS (n * 36 + 110)
diff --git a/gr/spe-p.hs b/gr/spe-p.hs
--- a/gr/spe-p.hs
+++ b/gr/spe-p.hs
@@ -1,13 +1,16 @@
 -- spe-p (jmcc)
 
-import Sound.SC3.Monad {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
+import qualified Sound.SC3.Lang.Collection as C {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.Bind as P {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Pattern.List as P {- hsc3-lang -}
 
 spe3_allpass6 :: UId m => m Synthdef
 spe3_allpass6 = do
-  n <- lfNoise1 KR 1
+  n <- lfNoise1M KR 1
   let fr = control KR "freq" 440
-      rapf i = do r <- clone 2 (rand 0 0.05)
+      rapf i = do r <- clone 2 (randM 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)
@@ -15,14 +18,20 @@
   u <- fmap (out 0) (chainM 4 rapf o)
   return (synthdef "spe" u)
 
-notes :: Num n => P n
+lseq1 :: [[a]] -> [a]
+lseq1 = concat . C.flop
+
+inf :: Int
+inf = maxBound
+
+notes :: Num n => [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)
+    let n = [P.rand' 'α' [[],[24,31,36,43,48,55]] inf
+            ,C.flop [[60],P.rand' 'β' [63,65] inf,[67],P.rand' 'γ' [70,72,74] inf]
+            ,[P.rand' 'a' [74,75,77,79,81] 3]]
+    in concat (lseq1 n)
 
 main :: IO ()
 main = do
   i <- spe3_allpass6
-  audition (pbind [(K_instr,psynth i),(K_midinote,notes),(K_dur,0.13)])
+  audition (P.sbind1 (i,[("freq",map midiCPS notes),("dur",repeat 0.13)]))
diff --git a/gr/spe.scd b/gr/spe.scd
new file mode 100644
--- /dev/null
+++ b/gr/spe.scd
@@ -0,0 +1,12 @@
+// spe (jmcc)
+
+{var t = Impulse.kr(9,0)
+;var s = [00,03,02,07,08,32,16,18,00,12,24,32]
+;var m = Dseq(s,inf)
+;var f = (Demand.kr(t,0,m) + 32).midicps
+;var e = EnvGen.kr(Env.perc, gate: t, levelScale: 0.1, doneAction: 0)
+;var o = LFSaw.ar(f) * e
+;var rq = LFNoise1.kr(1, 36, 110).midicps
+;var z = RLPF.ar(o, rq, 0.1)
+;4.do({z = AllpassN.ar(z, 0.05, [0.05.rand, 0.05.rand], 4)})
+;z}.play
diff --git a/gr/sprinkler-m.hs b/gr/sprinkler-m.hs
--- a/gr/sprinkler-m.hs
+++ b/gr/sprinkler-m.hs
@@ -1,10 +1,10 @@
--- sprinkler-m (jmcc)
+-- sprinkler-m (jmcc) #1
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 sprinkler_m :: UId m => m UGen
 sprinkler_m = do
-  n <- whiteNoise AR
+  n <- whiteNoiseM 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))
diff --git a/gr/sprinkler-mouse.scd b/gr/sprinkler-mouse.scd
new file mode 100644
--- /dev/null
+++ b/gr/sprinkler-mouse.scd
@@ -0,0 +1,5 @@
+// sprinkler mouse (jmcc) #1
+
+{var f = MouseX.kr(0.2,50)
+;var t = LFPulse.kr(f,0,0.25,0.1)
+;BPZ2.ar(WhiteNoise.ar * t)}.play
diff --git a/gr/sprinkler.hs b/gr/sprinkler.hs
--- a/gr/sprinkler.hs
+++ b/gr/sprinkler.hs
@@ -1,13 +1,21 @@
--- sprinkler (jmcc)
+-- sprinkler (jmcc) #1
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 sprinkler :: UGen
 sprinkler =
-  let n = whiteNoise 'α' AR
-      f = lfPulse KR 0.09 0 0.16 * 10 + 7
+  let f = lfPulse KR 0.09 0 0.16 * 10 + 7
       t = lfPulse KR f 0 0.25 * 0.1
+      n = whiteNoise 'α' AR
   in bpz2 (n * t)
 
 main :: IO ()
 main = audition (out 0 sprinkler)
+
+-- > audition (out 0 sprinkler')
+sprinkler' :: UGen
+sprinkler' =
+           let n = whiteNoise 'α' AR
+               f = mouseX KR 0.2 50 Linear 0.2
+               t = lfPulse KR f 0 0.25 * 0.1
+           in bpz2 (n * t)
diff --git a/gr/sprinkler.scd b/gr/sprinkler.scd
--- a/gr/sprinkler.scd
+++ b/gr/sprinkler.scd
@@ -1,3 +1,5 @@
+// sprinkler (jmcc) #1
+
 {var f = LFPulse.kr(0.09,0,0.16,10,7)
 ;var t = LFPulse.kr(f,0,0.25,0.1)
-;Out.ar(0,BPZ2.ar(WhiteNoise.ar * t))}.play
+;BPZ2.ar(WhiteNoise.ar * t)}.play
diff --git a/gr/string-wander-cluster.hs b/gr/string-wander-cluster.hs
--- a/gr/string-wander-cluster.hs
+++ b/gr/string-wander-cluster.hs
@@ -1,6 +1,6 @@
--- string wander-cluster (jmcc)
+-- string wander-cluster (jmcc) #6
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 import System.Random {- random -}
 
@@ -15,9 +15,21 @@
 swc st =
     let (n,g) = wander st
         d = 1 / midiCPS (constant n)
-        w = whiteNoise 'c' AR * 0.008
+        w = whiteNoise 'α' AR * 0.008
         o = combC w 0.01 d (d * 1000)
-    in (pan2 o (rand 'd' (-1) 1) 1,(n,g))
+    in (pan2 o (rand 'β' (-1) 1) 1,(n,g))
 
 main :: IO ()
 main = overlapTextureS (4/3,4/3,6,maxBound) swc (60,mkStdGen 0)
+
+swc' :: UGen
+swc' =
+    let n = rand 'α' 50 100
+        n' = fold (n + rand 'β' 0 15 - 7) 50 120
+        d = 1 / midiCPS n'
+        w = whiteNoise 'γ' AR * 0.008
+        o = combC w 0.01 d (d * 1000)
+    in pan2 o (rand 'δ' (-1) 1) 1
+
+main' :: IO ()
+main' = overlapTextureU (4/3,4/3,6,maxBound) swc'
diff --git a/gr/string-wander-cluster.scd b/gr/string-wander-cluster.scd
new file mode 100644
--- /dev/null
+++ b/gr/string-wander-cluster.scd
@@ -0,0 +1,10 @@
+// string wander-cluster (jmcc) #6
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var note = 50 + 50.rand;
+    var note_ = (note + 15.rand - 7).fold(50,120);
+    var delay = 1/note_.midicps;
+    Pan2.ar(CombC.ar(WhiteNoise.ar(0.008), 0.01, delay, delay * 1000), 1.0.rand2)
+},sustainTime:4/3,transitionTime:4/3,overlap:6);
diff --git a/gr/strummable-guitar.hs b/gr/strummable-guitar.hs
--- a/gr/strummable-guitar.hs
+++ b/gr/strummable-guitar.hs
@@ -1,19 +1,23 @@
--- strummable guitar (jmcc)
+-- strummable guitar (jmcc) #11
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
-strummable_guitar :: UGen
-strummable_guitar =
+str :: UGen -> Double -> UGen
+str sc ix' =
+    let ix = constant ix'
+        x = mouseX KR 0 1 Linear 0.2
+        t = abs (hpz1 (x >* (0.25 + ix * 0.1)))
+        e = decay t 0.05
+        n = pinkNoise ix' AR * e
+        dt = 1 / midiCPS sc
+        s = combL n dt dt 4
+    in pan2 s (ix * 0.2 - 0.5) 1
+
+gtr :: UGen
+gtr =
     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
+        strs = sum (zipWith str scale [0..])
+    in leakDC (lpf strs 12000) 0.995
 
 main :: IO ()
-main = audition (out 0 strummable_guitar)
+main = audition (out 0 gtr)
diff --git a/gr/strummable-guitar.scd b/gr/strummable-guitar.scd
--- a/gr/strummable-guitar.scd
+++ b/gr/strummable-guitar.scd
@@ -1,3 +1,5 @@
+// strummable guitar (jmcc) #11
+
 {var scale = [52,57,62,67,71,76]
 ;var str = {arg i
            ;var x = MouseX.kr(0,1,'linear',0.2)
@@ -8,4 +10,4 @@
            ;var s = CombL.ar(n,dt,dt,4)
            ;Pan2.ar(s,i * 0.2 - 0.5,1)}
 ;var strs = Mix.fill(scale.size,str)
-;Out.ar(0,LeakDC.ar(LPF.ar(strs,12000),0.995))}.play
+;LeakDC.ar(LPF.ar(strs,12000),0.995)}.play
diff --git a/gr/sweepy-noise.hs b/gr/sweepy-noise.hs
--- a/gr/sweepy-noise.hs
+++ b/gr/sweepy-noise.hs
@@ -1,7 +1,6 @@
--- sweepy noise (jmcc)
+-- sweepy noise (jmcc) #6
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 sweepy_noise :: UGen
 sweepy_noise =
diff --git a/gr/sweepy-noise.scd b/gr/sweepy-noise.scd
--- a/gr/sweepy-noise.scd
+++ b/gr/sweepy-noise.scd
@@ -1,5 +1,7 @@
+// sweepy noise (jmcc) #6
+
 {var lfoDepth = MouseY.kr(200,8000,'exponential',0.1)
 ;var lfoRate = MouseX.kr(4,60,'exponential',0.1)
 ;var freq = LFSaw.kr(lfoRate,0) * lfoDepth + (lfoDepth * 1.2)
 ;var filtered = RLPF.ar(WhiteNoise.ar([0.03,0.03]),freq,0.1)
-;Out.ar(0,CombN.ar(filtered,0.3,0.3,2) + filtered) }.play
+;CombN.ar(filtered,0.3,0.3,2) + filtered}.play
diff --git a/gr/swept-resonant-noise.hs b/gr/swept-resonant-noise.hs
new file mode 100644
--- /dev/null
+++ b/gr/swept-resonant-noise.hs
@@ -0,0 +1,20 @@
+-- swept resonant noise (jmcc) #2
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+srn :: UGen
+srn =
+  let p = 10
+      n = whiteNoise 'α' AR * 0.007
+      f = midiCPS (fSinOsc KR (rand 'β' 0.1 0.3) 0 * rand 'γ' 0 24 + rand 'δ' 36 84)
+      sw = resonz n f 0.1
+      spec = klankSpec_mce
+             (linRandN p 'ε' 80 10080 0)
+             (mce (replicate p 1))
+             (randN p 'ζ' 0.5 2.5)
+  in uclone 'η' 2 (klank sw 1 0 1 spec)
+
+main :: IO ()
+main = overlapTextureU (4,4,5,maxBound) srn
diff --git a/gr/swept-resonant-noise.scd b/gr/swept-resonant-noise.scd
new file mode 100644
--- /dev/null
+++ b/gr/swept-resonant-noise.scd
@@ -0,0 +1,13 @@
+// swept resonant noise (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var p = 10; // number of partials
+    var n = WhiteNoise.ar(0.007);
+    var f = FSinOsc.kr(0.1 + 0.2.rand,0,12 + 12.rand2,60 + 24.rand2).midicps;
+    var sweep = Resonz.ar(n,f,0.1);
+    var spec_f = {`[Array.fill(p,{80 + 10000.0.linrand}),nil,Array.fill(p,{0.5 + 2.0.rand})]};
+    var spec = Array.fill(2,spec_f);
+    Klank.ar(spec,sweep);
+},4,4,5);
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
@@ -1,16 +1,17 @@
--- synthetic piano (jmcc)
+-- synthetic piano (jmcc) #3
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
+-- > g <- synthetic_piano
 synthetic_piano :: UId m => m UGen
 synthetic_piano = do
-  n <- iRand 36 90
-  f <- rand 0.1 0.5
-  ph <- rand 0 (pi * 2)
+  n <- iRandM 36 90
+  f <- randM 0.1 0.5
+  ph <- randM 0 1
   let s = impulse AR f ph * 0.1
       e = decay2 s 0.008 0.04
-      c i = do n0 <- lfNoise2 AR 3000
+      c i = do n0 <- lfNoise2M AR 3000
                let o = [-0.05,0,0.04] !! i
                    dt = 1 / midiCPS (n + o)
                return (combL (n0 * e) dt dt 6)
diff --git a/gr/synthetic-piano.scd b/gr/synthetic-piano.scd
--- a/gr/synthetic-piano.scd
+++ b/gr/synthetic-piano.scd
@@ -1,6 +1,8 @@
-{var p = {var n = IRand.new(36,90)
-         ;var f = Rand.new(0.1,0.5)
-         ;var ph = Rand.new(0,pi * 2)
+// synthetic piano (jmcc) #3
+
+{var p = {var n = IRand(36,90)
+         ;var f = Rand(0.1,0.5)
+         ;var ph = Rand(0,1)
          ;var s = Impulse.ar(f,ph) * 0.1
          ;var e = Decay2.ar(s,0.008,0.04)
          ;var c = {arg i
@@ -11,4 +13,4 @@
          ;var l = ((n - 36) / 27) - 1
          ;var c_ = Mix.fill(3,c)
          ;Pan2.ar(c_,l,1) }
-;Out.ar(0,Mix.fill(6,p)) }.play
+;Mix.fill(6,p)}.play
diff --git a/gr/tank-hp.hs b/gr/tank-hp.hs
--- a/gr/tank-hp.hs
+++ b/gr/tank-hp.hs
@@ -1,27 +1,29 @@
 -- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html (jmcc)
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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)
+  let s = decay2 #(dustM AR 0.2) 0.1 0.5
+          * cubed (fSinOsc AR #(expRandM 300 2200) 0)
           * 0.1
-  return (pan2 s #(rand (-1) 1) 1)
+  return (pan2 s #(randM (-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)
+bang = do return (pan2 (decay2 #(dustM AR 0.01) 0.04 0.3 * #(brownNoiseM 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)
+r_allpass i = do return (allpassN i 0.03 #(clone 2 (randM 0.005 0.02)) 1)
 
+-- > audition . out 0 =<< tank_f (soundIn 4)
 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
+  let [l,r] = mceChannels (onePole (localIn' 2 AR * 0.98) 0.33)
+  let a = allpassN (rotate2 l r 0.23) 0.05 #(clone 2 (randM 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
+  let c = leakDC (allpassN b 0.05 #(clone 2 (randM 0.03 0.15)) 2) 0.995 + i
   return (mrg [c,localOut c])
 
 tank :: UId m => m UGen
diff --git a/gr/tank-m.hs b/gr/tank-m.hs
--- a/gr/tank-m.hs
+++ b/gr/tank-m.hs
@@ -1,33 +1,35 @@
 -- tank (jmcc)
 -- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- hsc3 -}
 
 pling :: UId m => m UGen
 pling = do
-  d <- dust AR 0.2
-  f <- expRand 300 2200
-  p <- rand (-1) 1
+  d <- dustM AR 0.2
+  f <- expRandM 300 2200
+  p <- randM (-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
+  d <- dustM AR 0.01
+  n <- brownNoiseM 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)
+  r <- clone 2 (randM 0.005 0.02)
   return (allpassN i 0.03 r 1)
 
+-- > audition . out 0 =<< tank_f (soundIn 4)
 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
+  r1 <- clone 2 (randM 0.01 0.05)
+  r2 <- clone 2 (randM 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
diff --git a/gr/tank.hs b/gr/tank.hs
--- a/gr/tank.hs
+++ b/gr/tank.hs
@@ -1,49 +1,48 @@
 -- 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.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- 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
+pling :: UGen
+pling =
+    let d = dust 'α' AR 0.2
+        f = expRand 'β' 300 2200
+        p = rand 'γ' (-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
+bang :: UGen
+bang =
+    let d = dust 'δ' AR 0.01
+        n = brownNoise 'ε' 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
+-- > let u = useq 'λ' 4 r_allpass (soundIn 0)
+r_allpass :: UGen -> UGen
+r_allpass i = allpassN i 0.03 (randN 2 'ζ' 0.005 0.02) 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
+tank_f :: UGen -> UGen
+tank_f i =
+    let l0 = localIn 2 AR (mce2 0 0) * 0.98
         l1 = onePole l0 0.33
         (l1l,l1r) = mce2c l1
         l2 = rotate2 l1l l1r 0.23
-        l3 = allpassN l2 0.05 r1 2
+        l3 = allpassN l2 0.05 (randN 2 'θ' 0.01 0.05) 2
         l4 = delayN l3 0.3 (mce2 0.17 0.23)
-        l5 = allpassN l4 0.05 r2 2
+        l5 = allpassN l4 0.05 (randN 2 'ι' 0.03 0.15) 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)
+  let s = bang + mix (uclone 'κ' 8 pling)
+  in tank_f (useq 'λ' 4 r_allpass s)
 
 main :: IO ()
 main = audition (out 0 tank)
+
+-- > audition (out 0 trev)
+trev = tank_f (useq 'λ' 4 r_allpass (soundIn 0))
diff --git a/gr/tank.scd b/gr/tank.scd
--- a/gr/tank.scd
+++ b/gr/tank.scd
@@ -1,18 +1,20 @@
+// tank (jmcc)
+
 {var r_allpass = {arg signal
-                 ;var r = {Rand.new(0.005, 0.02)}.dup
+                 ;var r = {Rand(0.005, 0.02)}.dup
                  ;AllpassN.ar(signal, 0.03, r, 1);}
 ;var pling = {var d = Dust.ar(0.2)
-             ;var f = ExpRand.new(300, 2200)
-             ;var p = Rand.new(-1, 1)
+             ;var f = ExpRand(300, 2200)
+             ;var p = Rand(-1, 1)
              ;var s1 = FSinOsc.ar(f, 0).cubed
              ;var s2 = Decay2.ar(d, 0.1, 0.5) * 0.1 * s1
              ;Pan2.ar(s2, p, 1)}
 ;var bang = {var d = Dust.ar(0.01)
-            ;var n = BrownNoise.AR
+            ;var n = BrownNoise.ar
             ;Pan2.ar(Decay2.ar(d, 0.04, 0.3) * n, 0, 1)}
 ;var tank = {arg i
-            ;var r1 = {Rand.new(0.01,0.05)}.dup
-            ;var r2 = {Rand.new(0.03,0.15)}.dup
+            ;var r1 = {Rand(0.01,0.05)}.dup
+            ;var r2 = {Rand(0.03,0.15)}.dup
             ;var l0 = LocalIn.ar(2) * 0.98
             ;var l1 = OnePole.ar(l0, 0.33)
             ;var l2 = Rotate2.ar(l1[0], l1[1], 0.23)
@@ -23,6 +25,6 @@
             ;var l7 = l6 + i
             ;LocalOut.ar(l7)
             ;l7}
-;var signal = Mix.fill(12, pling) + bang.value
-;4.do({signal = r_allpass.value(signal)})
-;Out.ar(0, tank.value(signal))}.play
+;var signal = Mix.fill(12, pling) + bang.()
+;4.do({signal = r_allpass.(signal)})
+;tank.(signal)}.draw
diff --git a/gr/tapping-tools.hs b/gr/tapping-tools.hs
new file mode 100644
--- /dev/null
+++ b/gr/tapping-tools.hs
@@ -0,0 +1,21 @@
+-- tapping tools (jmcc) #7
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+tapping_tools :: UGen
+tapping_tools =
+    let e = envLinen 1 4 1 1
+        rate = xLine KR 64 0.125 60 DoNothing
+        exc = decay (impulse AR (linRand 'α' 1 21 0 * rate) 0 * 0.03) 0.001
+        spc = klankSpec_mce (randN 4 'β' 400 8400) (mce [1,1,1,1]) (randN 4 'γ' 0.01 0.11)
+        flt = klank exc 1 0 1 spc
+    in pan2 flt (rand 'δ' (-1) 1) (envGen KR 1 1 0 1 RemoveSynth e)
+
+-- > let g = pp (silent 1)
+pp :: UGen -> UGen
+pp z = let f x = allpassN x 0.05 (mce2 (rand 'ε' 0 0.05) (rand 'ζ' 0 0.05)) 2 in useq 'η' 3 f z
+
+main :: IO ()
+main = overlapTextureU_pp (2,1,3,maxBound) tapping_tools 2 pp
diff --git a/gr/tapping-tools.scd b/gr/tapping-tools.scd
new file mode 100644
--- /dev/null
+++ b/gr/tapping-tools.scd
@@ -0,0 +1,13 @@
+// tapping tools (jmcc) #7
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~spawn.({
+    var e = Env.linen(1, 4, 1);
+    var rate = XLine.kr(64, 0.125, 60, 0);
+    var exc = Decay.ar(Impulse.ar((1 + 20.0.linrand) * rate, 0, 0.03), 0.001);
+    var spc = `[Array.fill(4, {400 + 8000.0.rand}), nil, Array.fill(4, {0.01 + 0.1.rand})];
+    var flt = Klank.ar(spc, exc);
+    Pan2.ar(flt, 1.0.rand2, EnvGen.kr(e, doneAction:2))
+}, 2);
+~post_process.({arg z = 3.do({z = AllpassN.ar(z, 0.05, [0.05.rand,0.05.rand], 2);}); z});
diff --git a/gr/tgb-m.hs b/gr/tgb-m.hs
--- a/gr/tgb-m.hs
+++ b/gr/tgb-m.hs
@@ -1,19 +1,18 @@
 -- tgb (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+                      in tRandM le re t
       pm_n rt l du = do let le = mkls l du
                             re = mkls l du
-                        n <- whiteNoise rt
-                        return (wrp n le re)
+                        n <- whiteNoiseM rt
+                        return (linLin_b 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
diff --git a/gr/tgr-rpr-m.hs b/gr/tgr-rpr-m.hs
--- a/gr/tgr-rpr-m.hs
+++ b/gr/tgr-rpr-m.hs
@@ -1,22 +1,22 @@
 -- tgr-rpr (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+dustR' :: UId m => Rate -> UGen -> UGen -> m UGen
+dustR' r lo hi = do
+  n1 <- dwhiteM 1 lo hi
+  n2 <- whiteNoiseM r
+  d <- dseqM 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))
+rpr n = tRandM (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)
+  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)
diff --git a/gr/tgrn.hs b/gr/tgrn.hs
--- a/gr/tgrn.hs
+++ b/gr/tgrn.hs
@@ -1,7 +1,7 @@
 -- tgrn (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 -- > Sound.SC3.UGen.Dot.draw (tgrn 10)
 tgrn :: UGen -> UGen
diff --git a/gr/thb.hs b/gr/thb.hs
--- a/gr/thb.hs
+++ b/gr/thb.hs
@@ -1,13 +1,17 @@
 -- thb (rd)
+{-# OPTIONS_GHC -F -pgmF hsc3-psynth #-}
 
-import Data.List
+import Data.List {- base -}
+
 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.SC3.Common.Monad.Syntax {- hsc3 -}
 import Sound.OSC {- hosc -}
 
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
+
 -- | Happy birthday
 --
 -- > nub hb == "hapy birtd"
@@ -45,19 +49,18 @@
 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)])
+  let fr = map P.octpc_to_cps (zip (concat hb_o .+ 1) (concat hb_k))
+  play (P.sbind1 (defaultSynthdef
+                 ,[("freq",fr)
+                  ,("dur",concat 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 :: Num 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]])
+    let f = fromInteger . floor . P.degreeToKey [0,2,4,5,7,9,11] 12 . pred
+    in map (map f) hb_d
 
 -- | Midi note numbers
 --
@@ -157,15 +160,11 @@
 --
 -- > 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
+ins_s = psynth {bus = 0,freq = 440,loc = 0,amp = 0.1,sustain = 0.1} where
+    let s = envSine sustain amp
         e = envGen AR 1 1 0 1 RemoveSynth s
-        i = impulse AR f 0
-    in synthdef "ins" (out 0 (pan2 i l e))
+        i = impulse AR freq 0
+    in out bus (pan2 i loc e)
 
 -- | 'audition' 'ph' using pattern library.  /blur/ is @legato@.
 --
@@ -174,13 +173,12 @@
 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)])
+        pr = [("freq",f)
+             ,("dur",d)
+             ,("sustain",d .* blur)
+             ,("amp",c .* 0.1 .+ 0.1)
+             ,("loc",c .* 2 .- 1)]
+    in play (P.sbind1 (ins_s,pr))
 
 main :: IO ()
 main = withSC3 (hear 9 ph)
diff --git a/gr/theremin.scd b/gr/theremin.scd
--- a/gr/theremin.scd
+++ b/gr/theremin.scd
@@ -1,8 +1,10 @@
-{ var mod = 7
-; var detune = 0
-; var x = MouseX.kr(0, 0.9, 'linear', 0.2)
-; var y = MouseY.kr(4000, 200, 'exponential', 0.8)
-; var f = y + detune
-; var f_ = f + (f * SinOsc.ar(mod, 0) * 0.02)
-; var a = SinOsc.ar(f_, 0) * x
-; Out.ar(0, (Pan2.ar(a, 0, 1))) }.play
+// theremin (jmcc)
+
+{var mod = 7
+;var detune = 0
+;var x = MouseX.kr(0, 0.9, 'linear', 0.2)
+;var y = MouseY.kr(4000, 200, 'exponential', 0.8)
+;var f = y + detune
+;var f_ = f + (f * SinOsc.ar(mod, 0) * 0.02)
+;var a = SinOsc.ar(f_, 0) * x
+;Pan2.ar(a, 0, 1)}.play
diff --git a/gr/three-cpsw-m.hs b/gr/three-cpsw-m.hs
--- a/gr/three-cpsw-m.hs
+++ b/gr/three-cpsw-m.hs
@@ -1,15 +1,15 @@
 -- three-cpsw (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  t <- dustM KR (mce2 12 18)
+  f0 <- tRandM 1 64 t
+  f1 <- lfNoise0M KR f0
+  a <- tRandM 0.0 0.5 t
+  dt <- tRandM 0.975 1.025 t
+  dh <- tRandM 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)
diff --git a/gr/three-cpsw.hs b/gr/three-cpsw.hs
new file mode 100644
--- /dev/null
+++ b/gr/three-cpsw.hs
@@ -0,0 +1,18 @@
+-- three-cpsw (rd)
+
+import Sound.SC3 {- hsc3 -}
+
+three_cpsw :: UGen
+three_cpsw =
+    let 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
+        f = f1 * mce2 9000 12000 + 9500
+        o = saw AR f + saw AR (f * dh) + saw AR (f * dt)
+    in clip2 (o * a) 0.75
+
+main :: IO ()
+main = audition (out 0 three_cpsw)
diff --git a/gr/three-cpsw.scd b/gr/three-cpsw.scd
--- a/gr/three-cpsw.scd
+++ b/gr/three-cpsw.scd
@@ -6,4 +6,4 @@
 ;var dh = TRand.kr(0.750,0.7505,t)
 ;var f = f1 * [9000,12000] + 9500
 ;var o = Saw.ar(f) + Saw.ar(f * dh) + Saw.ar(f * dt)
-;Out.ar(0,(o * a).clip2(0.75)) }.play
+;(o * a).clip2(0.75)}.play
diff --git a/gr/tipnso.hs b/gr/tipnso.hs
--- a/gr/tipnso.hs
+++ b/gr/tipnso.hs
@@ -1,6 +1,6 @@
 -- tipnso (rd)
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 tipnso :: UGen
 tipnso =
diff --git a/gr/tr-out-m.hs b/gr/tr-out-m.hs
--- a/gr/tr-out-m.hs
+++ b/gr/tr-out-m.hs
@@ -1,14 +1,14 @@
 -- tr-out (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  t <- dustM KR 1.6
+  r1 <- tRandM 0 6 t
+  r2 <- tRandM 0 6 t
+  r3 <- tRandM 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
diff --git a/gr/train.hs b/gr/train.hs
--- a/gr/train.hs
+++ b/gr/train.hs
@@ -1,6 +1,6 @@
 -- http://www.create.ucsb.edu/pipermail/sc-users/2007-August/035957.html
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
 steam :: UGen -> UGen -> UGen -> UGen
 steam time n1 n2 =
diff --git a/gr/tremulate-hp.hs b/gr/tremulate-hp.hs
--- a/gr/tremulate-hp.hs
+++ b/gr/tremulate-hp.hs
@@ -1,14 +1,14 @@
 -- tremulate (jmcc)
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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))))
+  let o = fSinOsc AR (#(randM 500 900) * mce [1,1.2,1.5,1.8]) 0
+  n <- clone 4 (lfNoise2M KR #(randM 30 90))
+  return (mix (pan2 o #(clone 4 (randM (-1) 1)) (max 0 (n * 0.1))))
 
 tremulate_pp :: UGen -> UGen
 tremulate_pp i = combN i 0.1 0.1 1
diff --git a/gr/tremulate-m.hs b/gr/tremulate-m.hs
--- a/gr/tremulate-m.hs
+++ b/gr/tremulate-m.hs
@@ -1,16 +1,16 @@
--- tremulate (jmcc)
+-- tremulate (jmcc) #1
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 tremulate :: UId m => m UGen
 tremulate = do
-  f <- rand 500 900
+  f <- randM 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)
+  r <- randM 30 90
+  n <- clone 4 (lfNoise2M KR r)
   let a = max 0 (n * 0.1)
-  l <- clone 4 (rand (-1) 1)
+  l <- clone 4 (randM (-1) 1)
   return (mix (pan2 o l a))
 
 tremulate_pp :: UGen -> UGen
diff --git a/gr/tremulate.hs b/gr/tremulate.hs
--- a/gr/tremulate.hs
+++ b/gr/tremulate.hs
@@ -1,8 +1,8 @@
--- tremulate (jmcc)
+-- tremulate (jmcc) #1
 
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 tremulate :: UGen
 tremulate =
diff --git a/gr/tremulate.scd b/gr/tremulate.scd
--- a/gr/tremulate.scd
+++ b/gr/tremulate.scd
@@ -1,7 +1,15 @@
-play({CombN.ar(XFadeTexture.ar({
-f = 500 + 400.rand;
-r = 30 + 60.rand;
-o = FSinOsc.ar(f*[1.0,1.2,1.5,1.8]);
-a = max(0,LFNoise2.kr([r,r,r,r],0.1));
-l = [1.0.rand2,1.0.rand2,1.0.rand2,1.0.rand2];
-Mix.ar(Pan2.ar(o*a,l))},2,0.5,2),0.1,0.1,1)})
+// tremulate (jmcc) #1
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var f = 500 + 400.rand;
+    var r = 30 + 60.rand;
+    var o = FSinOsc.ar(f*[1.0,1.2,1.5,1.8]);
+    var a = max(0,LFNoise2.kr([r,r,r,r],0.1));
+    var l = [1.0.rand2,1.0.rand2,1.0.rand2,1.0.rand2];
+    Mix.ar(Pan2.ar(o*a,l));
+},sustainTime:0.5,transitionTime:2,overlap:3,postProcess:{
+    arg z;
+    CombN.ar(z,0.1,0.1,1);
+});
diff --git a/gr/trkl-m.hs b/gr/trkl-m.hs
--- a/gr/trkl-m.hs
+++ b/gr/trkl-m.hs
@@ -1,18 +1,18 @@
 -- trkl (rd)
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+  r0 <- randM (-1) 1
+  r1 <- randM (-1) 1
+  r2 <- tRandM 0.05 1.0 t
+  r3 <- tExpRandM 0.001 0.25 st -- non-zero minima
+  fh <- tRandM 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
@@ -23,12 +23,12 @@
 -- > 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
+  d <- randM 0.5 16
+  ul <- randM 16 64
+  fu <- randM 1200 9000
+  dy <- randM 0.005 0.175
+  la <- randM (-60) (-25)
+  fy <- randM 0.015 0.125
   trkl d ul fu dy la fy
 
 main :: IO ()
diff --git a/gr/trmlo-u.hs b/gr/trmlo-u.hs
--- a/gr/trmlo-u.hs
+++ b/gr/trmlo-u.hs
@@ -1,13 +1,13 @@
 -- trmlo-u (rd)
 
 import Sound.SC3 {- hsc3 -}
-import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import qualified Sound.SC3.UGen.Unsafe as U {- hsc3-unsafe -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 -- > audition (out 0 trmlo)
 trmlo :: UGen
 trmlo =
-    let mWrp i l r = linLin i (-1) 1 (midiCPS l) (midiCPS r)
+    let mWrp i l r = linLin_b i (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
@@ -17,36 +17,34 @@
                  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 = U.iRand 5 9
+                 d = U.iRand 5 9
+                 s = envSine d (U.rand 0.1 0.2)
                  e = envGen KR 1 1 0 1 DoNothing s
-                 n = iRand 69 72
+                 n = U.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 = U.iRand 5 9
+                 d = U.iRand 9 12
+                 s = envSine d (U.rand 0.1 0.2)
                  e = envGen KR 1 1 0 1 DoNothing s
-                 n = iRand 69 72
+                 n = U.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)
+                 l = line KR 0 (U.iRand 1 5) d DoNothing
+             in pan2 (blip AR (mWrp1 m (n + l)) (linLin_b m 1 2)) m e
+        o4 = let f = U.iRand 5 18
+                 d = U.iRand 12 15
+                 s = envSine d (U.rand 0.1 0.2)
                  e = envGen KR 1 5e-2 0 1 DoNothing s
-                 n = iRand 69 72
+                 n = U.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 (U.iRand 1 5) d RemoveSynth
+                 fr = mWrpN m (n + l) (U.iRand 1 5)
+             in pan2 (blip AR fr (linLin_b m 1 (U.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
+      p = [("dur",P.xrand 'ρ' [0.25,0.5,1,2,4])]
+  audition (P.sbind1 (s,p))
diff --git a/gr/trmlo.hs b/gr/trmlo.hs
--- a/gr/trmlo.hs
+++ b/gr/trmlo.hs
@@ -1,12 +1,12 @@
 -- trmlo (rd)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 -- > audition (out 0 trmlo)
 trmlo :: UGen
 trmlo =
-    let mWrp i l r = linLin i (-1) 1 (midiCPS l) (midiCPS r)
+    let mWrp i l r = linLin_b i (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
@@ -30,7 +30,7 @@
                  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
+             in pan2 (blip AR (mWrp1 m (n + l)) (linLin_b m 1 2)) m e
         o4 = let f = iRand 'κ' 5 18
                  d = iRand 'λ' 12 15
                  s = envSine d (rand 'μ' 0.1 0.2)
@@ -39,13 +39,11 @@
                  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 pan2 (blip AR fr (linLin_b m 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
+      p = [("dur",P.xrand 'ρ' [0.25,0.5,1,2,4])]
+  audition (P.sbind1 (s,p))
diff --git a/gr/tsort.hs b/gr/tsort.hs
--- a/gr/tsort.hs
+++ b/gr/tsort.hs
@@ -1,14 +1,16 @@
 -- http://create.ucsb.edu/pipermail/sc-users/2003-March/002807.html (jmcc)
 
 {-
+
 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.)
+of interconnect buffers, so to run this test we must delete all graphs
+that would otherwise be loaded.)
+
 -}
 
 import Sound.SC3 {- hsc3 -}
diff --git a/gr/tw-463992770596577280.hs b/gr/tw-463992770596577280.hs
new file mode 100644
--- /dev/null
+++ b/gr/tw-463992770596577280.hs
@@ -0,0 +1,16 @@
+-- https://twitter.com/thormagnusson/status/463992770596577280
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+f :: Int -> UGen
+f z =
+    let x = fromIntegral z + 1
+        e = lfNoise2 z AR 0.5 * line AR 0 0.1 (rand z 1 99) DoNothing / (x * 0.2)
+    in sinOsc AR (30 * x + linLin_b (lfNoise2 z AR 0.1) (-2) 2) 0 * e
+
+g :: UGen
+g = uclone 'α' 2 (sum (map f [0 .. 23]))
+
+main :: IO ()
+main = overlapTextureU (60,15,3,maxBound) g
diff --git a/gr/tw-463992770596577280.scd b/gr/tw-463992770596577280.scd
new file mode 100644
--- /dev/null
+++ b/gr/tw-463992770596577280.scd
@@ -0,0 +1,10 @@
+// https://twitter.com/thormagnusson/status/463992770596577280
+
+var f = {
+    arg i;
+    var x = i + 1;
+    var e = LFNoise2.ar(0.5) * (Line.ar(0,0.1,99.rand) / (x * 0.2));
+    SinOsc.ar(30*x+LFNoise2.ar(0.1).range(-2,2),0,e)
+};
+var g = {(f ! rrand(9,28)).sum};
+{g ! 2}.play;
diff --git a/gr/tw-98315246548172800.hs b/gr/tw-98315246548172800.hs
new file mode 100644
--- /dev/null
+++ b/gr/tw-98315246548172800.hs
@@ -0,0 +1,13 @@
+-- https://twitter.com/rukano/status/98315246548172800
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+tw :: UGen
+tw =
+    let h = lchoose 'α' [100,800,3000]
+        o = sinOsc AR (expRand 'β' 60 h) 0 * 0.1
+    in splay (uclone 'γ' 40 o) 1 1 0 True * lfGauss AR 19 (1/4) 0 NoLoop RemoveSynth
+
+main :: IO ()
+main = spawnTextureU (const 8,maxBound) tw
diff --git a/gr/tw-98315246548172800.scd b/gr/tw-98315246548172800.scd
new file mode 100644
--- /dev/null
+++ b/gr/tw-98315246548172800.scd
@@ -0,0 +1,6 @@
+// https://twitter.com/rukano/status/98315246548172800
+
+{{var h = [100,800,3000].choose
+ ;var o = {SinOsc.ar(exprand(60,h),0,0.1)}
+ ;{Splay.ar(o ! 40) * LFGauss.ar(19,1/4,0,0,2)}.play
+ ;8.wait}.loop}.fork
diff --git a/gr/uplink-hp.hs b/gr/uplink-hp.hs
--- a/gr/uplink-hp.hs
+++ b/gr/uplink-hp.hs
@@ -1,17 +1,18 @@
--- uplink (jmcc)
+-- uplink (jmcc) #2
 {-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Common.Monad.Syntax {- 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))
+  let p0 = do return (lfPulse KR #(randM 0 20) 0 #(randM 0 1))
+  let p1 = do return (lfPulse KR #(randM 0 4) 0 #(randM 0 1)
+                      * #(randM 0 8000)
+                      + #(randM 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)
+  return (pan2 (lfPulse AR f 0 0.5 * 0.04) #(randM (-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
@@ -1,7 +1,6 @@
--- uplink (jmcc)
+-- uplink (jmcc) #2
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
 randz :: ID a => a -> UGen -> UGen
diff --git a/gr/uplink.scd b/gr/uplink.scd
new file mode 100644
--- /dev/null
+++ b/gr/uplink.scd
@@ -0,0 +1,12 @@
+// uplink (jmcc) #2
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var osc = {
+        var e = LFPulse.kr(4.0.rand, 0, 1.0.rand, 8000.rand, 2000.rand);
+        LFPulse.kr(20.0.rand, 0, 1.0.rand, e)
+    };
+    var freq = osc.() + osc.();
+    Pan2.ar( LFPulse.ar(freq, 0, 0.5, 0.04), 0.8.rand2)
+}, 4, 1, 5);
diff --git a/gr/urandom.hs b/gr/urandom.hs
--- a/gr/urandom.hs
+++ b/gr/urandom.hs
@@ -2,7 +2,8 @@
 
 import Control.Monad {- base -}
 import qualified Data.ByteString.Lazy as B {- bytestring -}
-import Sound.OSC.Coding.Byte {- hosc -}
+import Data.Int {- base -}
+import Data.Binary {- binary -}
 import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 import System.IO {- base -}
@@ -10,35 +11,33 @@
 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_int32 :: IO Int32
+ur_int32 = fmap decode (ur_bytes 4)
 
 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
+-- > ur_int32_set 3
+ur_int32_set :: Int -> IO [Int32]
+ur_int32_set = fmap (map decode) . 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)
+-- > fmap (map int32_to_normal) (ur_int32_set 3)
+int32_to_normal :: Fractional n => Int32 -> n
+int32_to_normal n = fromIntegral (abs n) / fromIntegral (maxBound::Int32)
 
+-- > ur_real_set 3
 ur_real_set :: Fractional n => Int -> IO [n]
-ur_real_set = fmap (map int_to_normal) . ur_int_set
+ur_real_set = fmap (map int32_to_normal) . ur_int32_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
+  let f' = linLin_u f 440 660
+      g' = linLin_u g 0.05 0.25
+      l' = linLin_u l (-1) 1
   return (pan2 (sinOsc AR f' 0) l' g')
 
 main :: IO ()
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,12 @@
 -- vla-adttn-sharc (rd)
+{-# OPTIONS_GHC -F -pgmF hsc3-uparam #-}
+-- http://www.timbre.ws/sharc/
 
 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 -}
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.Lang.Pattern.Plain as P {- hsc3-lang -}
 
 type R = Double
 type R3 = (R,R,R)
@@ -42,37 +44,31 @@
 
 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])
+    let uparam = {amp = 0.1,freq = 129.897,rise = 0.1,fall = 0.5,loc = 0,dt = 0.001}
+        s = sum (map (vla_partial freq rise fall dt) [0 .. n - 1])
         e = detectSilence s 0.001 0.2 RemoveSynth
-    in mrg2 (pan2 s l a) e
+    in mrg2 (pan2 s loc amp) e
 
 plyr36 :: Synthdef
 plyr36 = synthdef "plyr36" (out 0 (vla_plyr 36))
 
-pattern :: [P_Bind]
+pattern :: P.Param
 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)]
+    let to_cps = P.degree_to_cps' [0,2,4,5,7,9,11] 12
+    in [("loc",P.white 'α' (-1) 1)
+       ,("amp",P.white 'β' 0.05 0.1)
+       ,("freq",to_cps (P.rand 'γ' [0,1,2,3,4,5,6,7,8]) (P.rand 'δ' [1,2]))
+       ,("dt",P.white 'ε' 0.001 0.005)
+       ,("rise",P.white 'ζ' 1 2)
+       ,("fall",P.white 'η' 4 7)
+       ,("dur",repeat 5)]
 
 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)
+  play (P.sbind1 (plyr36,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
@@ -1,13 +1,50 @@
 -- vla-adttn (rd)
 
-import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.Lang.Pattern {- hsc3-lang -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
 
-type R = Double
-type R2 = (R,R)
+-- fr = freq,dt = detune
+vla_partial :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+vla_partial b fr rise fall dt n =
+    let m = n * 2
+        ampl = dbAmp (bufRdN 1 KR b m NoLoop)
+        ph = bufRdN 1 KR b (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 :: [R2]
+vla_plyr :: UGen -> UGen -> UGen
+vla_plyr b n =
+    let fr = midiCPS (rand 'α' 10 30)
+        rise = rand 'β' 1 2
+        fall = rand 'γ' 4 7
+        dt = rand 'δ' 0.001 0.005
+        a = rand 'ε' 0.05 0.1
+        l = rand 'ζ' (-1) 1
+        s = sum (map (vla_partial b fr rise fall dt) [0 .. n - 1])
+        e = detectSilence s 0.001 0.2 RemoveSynth
+    in mrg2 (pan2 s l a) e
+
+plyr36 :: UGen
+plyr36 =
+    let unp (i,j) = [i,j]
+        b = asLocalBuf 'α' (concatMap (map double_to_ugen . unp) vla)
+    in vla_plyr b 36
+
+main :: IO ()
+main = spawnTextureU (const 3,maxBound) plyr36
+
+-- q = quantised
+vla_q :: (RealFrac n,Fractional n) => [(n,n)]
+vla_q = let f (a,p) = (roundTo_ a 0.1,roundTo_ p 0.1) in map f vla
+
+-- ampl (DB) and phase data
+vla :: Fractional n => [(n,n)]
 vla =
     [(-49.43290,1.99165)
     ,(0.00000,1.09187)
@@ -85,63 +122,3 @@
     ,(-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/gr/vlc-distrtn-m.hs b/gr/vlc-distrtn-m.hs
--- a/gr/vlc-distrtn-m.hs
+++ b/gr/vlc-distrtn-m.hs
@@ -1,8 +1,9 @@
 -- vlc-distrtn (rd)
+{-# OPTIONS_GHC -F -pgmF hsc3-uparam #-}
 -- caution - audio feedback graph
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import qualified Sound.SC3.Lang.Random.IO as L {- hsc3-lang -}
 
 prep :: (Double,Double) -> [Double]
@@ -10,8 +11,8 @@
 
 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
+  n0 <- lfNoise1M KR 1
+  n1 <- randM 0.75 1.25
   let m = n * 2
       ampl = bufRdN 1 KR b m NoLoop
       f = freq * (n + 1) * (n0 * detune + 1)
@@ -19,14 +20,7 @@
 
 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
+  let uparam = {buf=0,iamp=0.1,ampl=0.1,freq=129.897,fall=0.5,loc=0.0,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))
 
@@ -63,7 +57,7 @@
 run = do
   _ <- async (b_alloc 0 (length vlc * 2) 1)
   send (b_setn1 0 0 (concatMap prep vlc))
-  let i = soundIn 4
+  let i = soundIn 0
   _ <- async . d_recv . synthdef "plyr48" =<< plyr i 48
   send (s_new "plyr48" 1002 AddToTail 1 [])
   sequence_ (replicate 32 pattern)
diff --git a/gr/voscil-u.hs b/gr/voscil-u.hs
--- a/gr/voscil-u.hs
+++ b/gr/voscil-u.hs
@@ -3,12 +3,12 @@
 import Sound.OSC {- hosc -}
 import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
-import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+import qualified Sound.SC3.UGen.Unsafe as U {- hsc3-unsafe -}
 
 -- > Sound.SC3.UGen.Dot.draw (voscil 32)
 voscil :: Real a => a -> UGen
 voscil b =
-  let lfn = lfNoise0 KR
+  let lfn = U.lfNoise0 KR
       hb = (constant b - 1) / 2
       rt = 6
       f = 600
diff --git a/gr/voscil.hs b/gr/voscil.hs
--- a/gr/voscil.hs
+++ b/gr/voscil.hs
@@ -1,7 +1,7 @@
 -- voscil (rd)
 
 import Sound.OSC {- hosc -}
-import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 import Sound.SC3.Lang.Random.IO {- hsc3-lang -}
 
 -- > Sound.SC3.UGen.Dot.draw (voscil 32)
diff --git a/gr/waveset.hs b/gr/waveset.hs
--- a/gr/waveset.hs
+++ b/gr/waveset.hs
@@ -1,49 +1,14 @@
--- A simple waveset synthesiser (rd)
+-- A simple waveset synthesiser (adc)
+{-# OPTIONS_GHC -F -pgmF hsc3-uparam #-}
 
 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.Environment {- base -}
 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.
@@ -55,51 +20,57 @@
 locate_fzc x y = (1.0 / (y - x)) * abs x
 
 -- | Fractional zero-crossing constructor, n is the initial frame location.
+--
+-- > fzc 0 [-1,1,-1,3] == [0.5,2.25]
 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)
+fzc n =
+    let rec k s = case s of
+                    x:y:s' -> if is_zc x y
+                              then (k + locate_fzc x y) : rec (k + 2.0) s'
+                              else rec (k + 1.0) (y : s')
+                    _ -> []
+    in rec n
 
 -- | 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
+prune :: (Ord a, Num a) => a -> [a] -> [a]
+prune m =
+    let rec n zc =
+            case zc of
+              [] -> [n]
+              x:zc' -> if (x - n) < m
+                       then rec n zc'
+                       else x : rec x zc'
+    in rec 0
 
--- | zc -> ws
-ws :: [a] -> [(a,a)]
-ws [] = []
-ws [_] = []
-ws (x:y:z) = (x,y) : ws (y : z)
+-- | Zero crossings to waveset bounds.
+--
+-- zc_to_ws [1,7,15] == [(1,7),(7,15)]
+zc_to_ws :: [a] -> [(a,a)]
+zc_to_ws =
+    let rec zc =
+            case zc of
+              x:y:zc' -> (x,y) : rec (y : zc')
+              _ -> []
+    in rec
 
 -- * 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
+    let uparam = {bus=0,bufnum=0,start=0,end=0,rate=1,sustain=1,amp=0.2}
+        rs = bufRateScale KR bufnum * rate
+        ph = phasor AR 0 rs 0 (end - start) 0 + start -- see adc for rationale
+        e_data = Envelope [amp, amp, 0] [sustain, 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)
+    in offsetOut bus (bufRdL 1 AR bufnum 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)]
+    let a = [("bufnum", b), ("start", sf), ("end", ef), ("sustain", d)]
     in s_new "waveset" (-1) AddToTail 1 a
 
 -- | Compare wavesets by duration.
@@ -123,8 +94,10 @@
 
 -- | Load waveset instrument, allocate sound file buffer, do waveset
 --   analysis, generate & play scores.
-run_waveset :: Transport m => String -> m ()
-run_waveset fn = do
+--
+-- > withSC3 (run_waveset 64 "/home/rohan/data/audio/pf-c5.snd")
+run_waveset :: Transport m => Double -> String -> m ()
+run_waveset pr fn = do
   _ <- async (d_recv (synthdef "waveset" waveset))
   _ <- async (b_allocRead 10 fn 0 0)
   (hdr, cs) <- liftIO (F.read fn)
@@ -132,8 +105,8 @@
       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
+      w = zc_to_ws (prune pr (fzc 0 b))
+      pl s = play (NRT s) >> wait 1
       post = liftIO . putStrLn
   post ("#f: " ++ show (nc, nf, sr))
   post ("#w: " ++ show (length w)) -- force w
@@ -141,14 +114,49 @@
   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))
+  return ()
 
 main :: IO ()
 main = do
   a <- getArgs
   case a of
-    [fn] -> withSC3 (run_waveset fn)
+    [fn] -> withSC3 (run_waveset 64 fn)
     _ -> error "audio file?"
 
-{--
-withSC3 (run_waveset "/home/rohan/data/audio/pf-c5.snd")
---}
+{-
+-- * 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)
+-}
diff --git a/gr/what-was-i-thinking-m.hs b/gr/what-was-i-thinking-m.hs
--- a/gr/what-was-i-thinking-m.hs
+++ b/gr/what-was-i-thinking-m.hs
@@ -1,18 +1,19 @@
--- what was i thinking? (jmcc)
+-- what was i thinking? (jmcc) #2
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- hsc3 -}
 
+-- > g <- 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
+  n0 <- lfNoise1M KR 0.2
+  n1 <- lfNoise1M 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
+      c x = do r <- randM 0 0.3
+               n <- lfNoise1M KR r
                return (combL x 0.06 (n * 0.025 + 0.035) 1)
       y = z * 0.6
   z0 <- clone 2 (c y)
diff --git a/gr/what-was-i-thinking.scd b/gr/what-was-i-thinking.scd
--- a/gr/what-was-i-thinking.scd
+++ b/gr/what-was-i-thinking.scd
@@ -1,3 +1,5 @@
+// what was i thinking? (jmcc) #2
+
 {var n0 = LFNoise1.kr(0.2,2000,2400)
 ;var n1 = LFNoise1.kr(0.157,0.4,0.5)
 ;var i = LFPulse.ar(0.1,0,0.05) * Impulse.ar(8,0) * 500
@@ -6,9 +8,8 @@
 ;var p = Pulse.ar(f,n1) * 0.04
 ;var z = RLPF.ar(p,n0,0.2)
 ;var c = {arg i
-         ;var r = Rand.new(0,0.3)
+         ;var r = Rand(0,0.3)
          ;var n = LFNoise1.kr(r,0.025,0.035)
          ;CombL.ar(i,0.06,n,1)}
 ;var y = z * 0.6
-;Out.ar(0,z + [c.value(y) + c.value(y)
-              ,c.value(y) + c.value(y)])}.play
+;z + [c.(y) + c.(y),c.(y) + c.(y)]}.play
diff --git a/gr/why-supercollider.hs b/gr/why-supercollider.hs
--- a/gr/why-supercollider.hs
+++ b/gr/why-supercollider.hs
@@ -1,8 +1,7 @@
--- why supercollider (jmcc)
+-- why supercollider (jmcc) #0
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
-import Sound.SC3.UGen.External.RDU.ID {- sc3-rdu -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.External.RDU {- sc3-rdu -}
 
 why_supercollider :: UGen
 why_supercollider =
@@ -11,7 +10,7 @@
         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
+        f i = allpassN i 0.05 (randN 2 'η' 0 0.05) 1
         x = useq 'θ' 4 f y
     in out 0 (s + 0.2 * x)
 
diff --git a/gr/why-supercollider.scd b/gr/why-supercollider.scd
--- a/gr/why-supercollider.scd
+++ b/gr/why-supercollider.scd
@@ -1,3 +1,5 @@
+// why supercollider (jmcc) #0
+
 {var r = {Resonz.ar(Dust.ar(0.2,50),200 + 3000.0.rand,0.003)}
 ;var s = Mix.ar(Array.fill(10,r))
 ;var z = DelayN.ar(s,0.048)
diff --git a/gr/wial-m.hs b/gr/wial-m.hs
--- a/gr/wial-m.hs
+++ b/gr/wial-m.hs
@@ -1,13 +1,13 @@
 -- wial (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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
+                     n0 <- tIRandM 0 1 t
                      return (o * e * n0 * 0.5)
       smpl f = [(4,6,f,0.75)
                ,(2,6,f * 2,0.75)
@@ -18,8 +18,8 @@
                ,(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
+  n0 <- dustM KR 2
+  f <- tWChooseM n0 (mce2 (20 * 0.66) 20) (mce2 0.25 0.75) 0
   fmap sum (mapM (plss clk) (smpl f))
 
 main :: IO ()
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
@@ -1,19 +1,19 @@
 -- wind metals (jmcc)
 
 import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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))
+  base <- expRandM 60 4000
+  rng <- randM 500 8000
+  n0 <- clone 2 (brownNoiseM AR)
+  r0 <- expRandM 0.125 0.5
+  n1 <- lfNoise1M KR r0
+  f <- sequence (replicate n (randM base (base + rng)))
+  dt <- sequence (replicate n (randM 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
diff --git a/gr/wind-metals.scd b/gr/wind-metals.scd
--- a/gr/wind-metals.scd
+++ b/gr/wind-metals.scd
@@ -1,11 +1,17 @@
+// wind metals (jmcc)
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.(
 {var n = 6
-;var base = ExpRand.new(60,4000)
-;var rng = Rand.new(500.0,8000.0)
+;var base = ExpRand(60,4000)
+;var rng = Rand(500.0,8000.0)
 ;var n0 = BrownNoise.ar([0.007,0.007])
-;var r0 = ExpRand.new(0.125,0.5)
+;var r0 = ExpRand(0.125,0.5)
 ;var n1 = LFNoise1.kr(r0,0.75,0.25)
 ;var exc = n0 * max(0,n1)
-;var f = Array.fill(n,{Rand.new(0,rng) + base})
-;var dt = Array.fill(n,{Rand.new(0.1,2.0)})
+;var f = Array.fill(n,{Rand(0,rng) + base})
+;var dt = Array.fill(n,{Rand(0.1,2.0)})
 ;var s = Klank.ar(`[f,nil,dt],exc)
-;Out.ar(0,(s * 0.1).softclip)}.play
+;(s * 0.1).softclip
+},5,2,12);
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
@@ -1,12 +1,12 @@
 -- xy-interference-m (rd)
 
-import Sound.SC3.Monad {- hsc3 -}
+import Sound.SC3 {- 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)
+      nd = do n <- lfNoise0M KR (mce2 5 9)
               let a = sinOsc AR (x + n) 0
                   b = sinOsc AR y 0
               return (a * b)
diff --git a/gr/xy-interference.hs b/gr/xy-interference.hs
--- a/gr/xy-interference.hs
+++ b/gr/xy-interference.hs
@@ -1,7 +1,6 @@
 -- xy-interference (rd)
 
-import Sound.SC3.ID {- hsc3 -}
-import Sound.SC3.UGen.Protect
+import Sound.SC3 {- hsc3 -}
 
 xy_interference :: UGen
 xy_interference =
@@ -11,7 +10,7 @@
                a = sinOsc AR (x + n) 0
                b = sinOsc AR y 0
            in a * b
-  in mix (uclone 'β' 3 nd)
+  in mix (uclone 'β' 3 nd) * 0.1
 
 main :: IO ()
 main = audition (out 0 xy_interference)
diff --git a/gr/xy-interference.scd b/gr/xy-interference.scd
--- a/gr/xy-interference.scd
+++ b/gr/xy-interference.scd
@@ -4,4 +4,4 @@
           ;var a = SinOsc.ar(x + n,0)
           ;var b = SinOsc.ar(y,0)
           ;a * b}
-;Out.ar(0,Mix.fill(3,nd))}.play
+;Mix.fill(3,nd)}.play
diff --git a/gr/zizle-hp.hs b/gr/zizle-hp.hs
new file mode 100644
--- /dev/null
+++ b/gr/zizle-hp.hs
@@ -0,0 +1,24 @@
+-- zizle (jmcc) #SC3d1.5
+{-# OPTIONS_GHC -F -pgmF hsc3-hash-paren #-}
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+twopi :: Floating n => n
+twopi = 2 * pi
+
+rand2 :: UId m => UGen -> m UGen
+rand2 n = randM (-n) n
+
+-- Sound.SC3.UGen.Dot.draw =<< zizle
+-- audition =<< zizle
+zizle :: UId m => m UGen
+zizle = do
+  let a f = mix (sinOsc AR (f * mce2 #(randM 0.7 1.3) 1) (mce2 #(randM 0 twopi) #(randM 0 twopi)) * 0.1)
+  let a1 = max (a #(expRandM 0.3 8)) 0
+  let a2 = abs (a #(expRandM 6 24))
+  let o = sinOsc AR (midiCPS #(randM 24 108)) #(randM 0 twopi)
+  return (pan2 (o * a1 * a2) #(rand2 1) 1)
+
+main :: IO ()
+main = overlapTextureU (4,4,12,maxBound) =<< zizle
diff --git a/gr/zizle.hs b/gr/zizle.hs
new file mode 100644
--- /dev/null
+++ b/gr/zizle.hs
@@ -0,0 +1,25 @@
+-- zizle (jmcc) #SC3d1.5
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+
+twopi :: Floating n => n
+twopi = 2 * pi
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (-n) n
+
+-- > Sound.SC3.UGen.Dot.draw zizle
+-- > audition zizle
+zizle :: UGen
+zizle =
+  let a e f = let fm = mce2 (rand 'α' 0.7 1.3) 1
+                  ph = mce2 (rand 'β' 0 twopi) (rand 'γ' 0 twopi)
+              in uprotect e (mix (sinOsc AR (f * fm) ph * 0.1))
+      a1 = max (a 'δ' (expRand 'ε' 0.3 8)) 0
+      a2 = abs (a 'ζ' (expRand 'η' 6 24))
+      o = sinOsc AR (midiCPS (rand 'θ' 24 108)) (rand 'ι' 0 twopi)
+  in pan2 (o * a1 * a2) (rand2 'κ' 1) 1
+
+main :: IO ()
+main = overlapTextureU (4,4,12,maxBound) zizle
diff --git a/gr/zizle.scd b/gr/zizle.scd
new file mode 100644
--- /dev/null
+++ b/gr/zizle.scd
@@ -0,0 +1,10 @@
+// zizle (jmcc) #SC3d1.5
+
+"/home/rohan/sw/hsc3-graphs/gr/overlap-texture.scd".load;
+
+~overlap_texture.({
+    var a = {arg f; Mix.ar(SinOsc.ar(f * [rrand(0.7,1.3),1], [2pi.rand,2pi.rand], 0.1))};
+    var a1 = a.(exprand(0.3,8)).max(0);
+    var a2 = a.(exprand(6,24)).abs;
+    Pan2.ar(SinOsc.ar(rrand(24,108).midicps, 2pi.rand) * a1 * a2,1.0.rand2);
+}, 4, 4, 12);
diff --git a/hs/hsc3-graphs.hs b/hs/hsc3-graphs.hs
--- a/hs/hsc3-graphs.hs
+++ b/hs/hsc3-graphs.hs
@@ -1,428 +1,542 @@
 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.ADC_adc_16_6_2
+import qualified Sound.SC3.Graph.ADC_waveset
+import qualified Sound.SC3.Graph.ADC_bit_reduction
+import qualified Sound.SC3.Graph.AF_birds_am_fm
 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_tw0125
+import qualified Sound.SC3.Graph.F0_f0_454598285861617665
+import qualified Sound.SC3.Graph.F0_f0_tw0041
+import qualified Sound.SC3.Graph.F0_f0_tw0134
+import qualified Sound.SC3.Graph.F0_f0_tw0014
+import qualified Sound.SC3.Graph.F0_f0_tw0026
+import qualified Sound.SC3.Graph.F0_hansm
+import qualified Sound.SC3.Graph.F0_f0_456384156159574016
+import qualified Sound.SC3.Graph.F0_f0_tw0045
+import qualified Sound.SC3.Graph.F0_f0_tw0220
+import qualified Sound.SC3.Graph.F0_buffer_display
+import qualified Sound.SC3.Graph.F0_red_frik_m
+import qualified Sound.SC3.Graph.F0_f0_2012_04_19
+import qualified Sound.SC3.Graph.F0_pkt_26
 import qualified Sound.SC3.Graph.F0_f0_tw0051
+import qualified Sound.SC3.Graph.F0_f0_tw0225
+import qualified Sound.SC3.Graph.F0_f0_tw0121
+import qualified Sound.SC3.Graph.F0_f0_tw0084
+import qualified Sound.SC3.Graph.F0_pkt_00
+import qualified Sound.SC3.Graph.F0_f0_tw0033
+import qualified Sound.SC3.Graph.F0_f0_tw0224
 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_sinusdeklinationen
+import qualified Sound.SC3.Graph.F0_f0_tw0028
 import qualified Sound.SC3.Graph.F0_f0_tw0020
+import qualified Sound.SC3.Graph.F0_1_4Q6
+import qualified Sound.SC3.Graph.F0_f0_tw0120
 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_tw0030
+import qualified Sound.SC3.Graph.F0_f0_tw0077
 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_pwm_crossfade
+import qualified Sound.SC3.Graph.JL_dark_sea_horns_hp
 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.JL_jl_1_Z
+import qualified Sound.SC3.Graph.JL_rain_thunder
+import qualified Sound.SC3.Graph.JMCC_harmonic_tumbling
+import qualified Sound.SC3.Graph.JMCC_sample_and_hold_liquidities
 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_modal_space
+import qualified Sound.SC3.Graph.JMCC_modal_space_buf
 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_why_supercollider
+import qualified Sound.SC3.Graph.JMCC_strummable_guitar
+import qualified Sound.SC3.Graph.JMCC_contamination_zone
 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_harmonic_swimming_m
+import qualified Sound.SC3.Graph.JMCC_spe_p
 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_cymbalism_m
 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_cymbalism_accelerando
+import qualified Sound.SC3.Graph.JMCC_blips_001
+import qualified Sound.SC3.Graph.JMCC_blips_001_u
+import qualified Sound.SC3.Graph.JMCC_spe_m
+import qualified Sound.SC3.Graph.JMCC_landon_rose
+import qualified Sound.SC3.Graph.JMCC_noise_modulated_sines
+import qualified Sound.SC3.Graph.JMCC_data_space
+import qualified Sound.SC3.Graph.JMCC_scratchy
+import qualified Sound.SC3.Graph.JMCC_analog_bubbles_mouse
+import qualified Sound.SC3.Graph.JMCC_resonant_dust
+import qualified Sound.SC3.Graph.JMCC_hell_is_busy
+import qualified Sound.SC3.Graph.JMCC_reverberated_sine_percussion_m
+import qualified Sound.SC3.Graph.JMCC_metal_plate
 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_reso_pulse
+import qualified Sound.SC3.Graph.JMCC_ring_modulated_klank
+import qualified Sound.SC3.Graph.JMCC_noise_burst_sweep
+import qualified Sound.SC3.Graph.JMCC_birdies
+import qualified Sound.SC3.Graph.JMCC_random_sine_waves
+import qualified Sound.SC3.Graph.JMCC_pond_life
+import qualified Sound.SC3.Graph.JMCC_tremulate_m
+import qualified Sound.SC3.Graph.JMCC_tank_m
+import qualified Sound.SC3.Graph.JMCC_bouncing_objects
+import qualified Sound.SC3.Graph.JMCC_police_state_m
+import qualified Sound.SC3.Graph.JMCC_moto_rev
+import qualified Sound.SC3.Graph.JMCC_deep_trip
+import qualified Sound.SC3.Graph.JMCC_demanding_studies
+import qualified Sound.SC3.Graph.JMCC_swept_resonant_noise
+import qualified Sound.SC3.Graph.JMCC_bowed_string_m
+import qualified Sound.SC3.Graph.JMCC_impulse_sequencer
+import qualified Sound.SC3.Graph.JMCC_analogue_daze
+import qualified Sound.SC3.Graph.JMCC_tremulate_hp
+import qualified Sound.SC3.Graph.JMCC_uplink
 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_sawed_cymbals
+import qualified Sound.SC3.Graph.JMCC_sprinkler_m
+import qualified Sound.SC3.Graph.JMCC_tremulate
+import qualified Sound.SC3.Graph.JMCC_random_panning_sines_m
+import qualified Sound.SC3.Graph.JMCC_birds
+import qualified Sound.SC3.Graph.JMCC_random_panning_sines
+import qualified Sound.SC3.Graph.JMCC_zizle
+import qualified Sound.SC3.Graph.JMCC_random_sine_waves_she
+import qualified Sound.SC3.Graph.JMCC_analog_bubbles
+import qualified Sound.SC3.Graph.JMCC_pond_life_ha
+import qualified Sound.SC3.Graph.JMCC_choip
 import qualified Sound.SC3.Graph.JMCC_sidereal_time
+import qualified Sound.SC3.Graph.JMCC_coolant
+import qualified Sound.SC3.Graph.JMCC_comb_delay_sweeps
+import qualified Sound.SC3.Graph.JMCC_pond_life_hp
+import qualified Sound.SC3.Graph.JMCC_sweepy_noise
+import qualified Sound.SC3.Graph.JMCC_clustered_sines
+import qualified Sound.SC3.Graph.JMCC_tapping_tools
+import qualified Sound.SC3.Graph.JMCC_scratchy_m
+import qualified Sound.SC3.Graph.JMCC_police_state
+import qualified Sound.SC3.Graph.JMCC_overlap_add
+import qualified Sound.SC3.Graph.JMCC_noise_modulated_sawtooths
+import qualified Sound.SC3.Graph.JMCC_alien_froggies_rec
+import qualified Sound.SC3.Graph.JMCC_drone_plus_rhythm
+import qualified Sound.SC3.Graph.JMCC_ring_modulate_input
+import qualified Sound.SC3.Graph.JMCC_alien_meadow
+import qualified Sound.SC3.Graph.JMCC_hard_sync_sawtooth_with_lfo
 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_sidereal_time_hp
+import qualified Sound.SC3.Graph.JMCC_filter_input
+import qualified Sound.SC3.Graph.JMCC_blips_001_hp
+import qualified Sound.SC3.Graph.JMCC_pulsing_bottles_m
+import qualified Sound.SC3.Graph.JMCC_babbling_brook_m
+import qualified Sound.SC3.Graph.JMCC_snare_909
+import qualified Sound.SC3.Graph.JMCC_phase_modulation
+import qualified Sound.SC3.Graph.JMCC_lfo_modulation
+import qualified Sound.SC3.Graph.JMCC_data_space_hp
+import qualified Sound.SC3.Graph.JMCC_tsort
+import qualified Sound.SC3.Graph.JMCC_narrow_band_filtered_crackle_noise
+import qualified Sound.SC3.Graph.JMCC_what_was_i_thinking_m
+import qualified Sound.SC3.Graph.JMCC_tank_hp
+import qualified Sound.SC3.Graph.JMCC_pulsing_bottles
+import qualified Sound.SC3.Graph.JMCC_string_wander_cluster
+import qualified Sound.SC3.Graph.JMCC_sprinkler
+import qualified Sound.SC3.Graph.JMCC_distort_input
+import qualified Sound.SC3.Graph.JMCC_wind_metals_m
+import qualified Sound.SC3.Graph.JMCC_babbling_brook
+import qualified Sound.SC3.Graph.JMCC_alien_froggies
+import qualified Sound.SC3.Graph.JMCC_reverberated_sine_percussion_hp
+import qualified Sound.SC3.Graph.JMCC_reverberated_noise_bursts
 import qualified Sound.SC3.Graph.JMCC_saucer_base
-import qualified Sound.SC3.Graph.JMCC_cymbalism_m
+import qualified Sound.SC3.Graph.JMCC_harmonic_tumbling_m
+import qualified Sound.SC3.Graph.JMCC_berlin_1977
+import qualified Sound.SC3.Graph.JMCC_harmonic_swimming
+import qualified Sound.SC3.Graph.JMCC_resonant_dust_hp
+import qualified Sound.SC3.Graph.JMCC_doppler
+import qualified Sound.SC3.Graph.JMCC_slow_beating_harmonic_sines
+import qualified Sound.SC3.Graph.JMCC_mridangam_dr
+import qualified Sound.SC3.Graph.JMCC_random_sine_waves_hp
+import qualified Sound.SC3.Graph.JMCC_plucked_strings_m
+import qualified Sound.SC3.Graph.JMCC_default
+import qualified Sound.SC3.Graph.JMCC_resonators_harmonic_series
+import qualified Sound.SC3.Graph.JMCC_zizle_hp
+import qualified Sound.SC3.Graph.JMCC_clustered_sines_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.JR_jr_100515
+import qualified Sound.SC3.Graph.JRHB_dial_history_m
 import qualified Sound.SC3.Graph.JRHB_deep_sea
+import qualified Sound.SC3.Graph.JRHB_black_atlantic_currents
+import qualified Sound.SC3.Graph.JRHB_chain_saw_m
 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.MN_k2ws
 import qualified Sound.SC3.Graph.NC_arpeggio
+import qualified Sound.SC3.Graph.NC_after_goeyvaerts
 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_2013_01_11
 import qualified Sound.SC3.Graph.NV_nv_tw_54
+import qualified Sound.SC3.Graph.NV_nv_tw_2014_02_21
 import qualified Sound.SC3.Graph.NV_nv_tw_41
 import qualified Sound.SC3.Graph.NV_nv_tw_1
+import qualified Sound.SC3.Graph.NV_nv_tw_2014_06_03
+import qualified Sound.SC3.Graph.NV_nv_ml_2014_06_03
+import qualified Sound.SC3.Graph.NV_nv_tw_2013_12_04
 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_h_chatter_m
+import qualified Sound.SC3.Graph.RD_three_cpsw
+import qualified Sound.SC3.Graph.RD_chrd_m
+import qualified Sound.SC3.Graph.RD_tgb_m
+import qualified Sound.SC3.Graph.RD_eggcrate
 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_e_lamell_p
+import qualified Sound.SC3.Graph.RD_seqr_n
+import qualified Sound.SC3.Graph.RD_bs_070705_m
+import qualified Sound.SC3.Graph.RD_shifting_pulses_m
+import qualified Sound.SC3.Graph.RD_adso
 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_xy_interference_m
+import qualified Sound.SC3.Graph.RD_f_lets_m
+import qualified Sound.SC3.Graph.RD_pattern_buffer_m
+import qualified Sound.SC3.Graph.RD_discretion
+import qualified Sound.SC3.Graph.RD_scritto_m
+import qualified Sound.SC3.Graph.RD_trkl_m
+import qualified Sound.SC3.Graph.RD_wial_m
+import qualified Sound.SC3.Graph.RD_trmlo
+import qualified Sound.SC3.Graph.RD_lz_bf
+import qualified Sound.SC3.Graph.RD_sosc_lp_m
+import qualified Sound.SC3.Graph.RD_k_ppr_m
+import qualified Sound.SC3.Graph.RD_three_cpsw_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_rzblp_u
+import qualified Sound.SC3.Graph.RD_for_ann
+import qualified Sound.SC3.Graph.RD_k_ppr
 import qualified Sound.SC3.Graph.RD_cds_070701_m
+import qualified Sound.SC3.Graph.RD_tr_out_m
+import qualified Sound.SC3.Graph.RD_voscil
+import qualified Sound.SC3.Graph.RD_rzblp
+import qualified Sound.SC3.Graph.RD_xy_interference
+import qualified Sound.SC3.Graph.RD_feedr_m
+import qualified Sound.SC3.Graph.RD_mouse_clatter_m
+import qualified Sound.SC3.Graph.RD_discretion_m
+import qualified Sound.SC3.Graph.RD_tgrn
+import qualified Sound.SC3.Graph.RD_fwalk_m
+import qualified Sound.SC3.Graph.RD_chrd_t
+import qualified Sound.SC3.Graph.RD_e_lamell
+import qualified Sound.SC3.Graph.RD_ccomb_m
+import qualified Sound.SC3.Graph.RD_cricket_m
+import qualified Sound.SC3.Graph.RD_s_chirp
+import qualified Sound.SC3.Graph.RD_lf_pulses
 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_oscillator_cluster_m
+import qualified Sound.SC3.Graph.RD_lin_sosc
+import qualified Sound.SC3.Graph.RD_nharm_p
 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_seqr
+import qualified Sound.SC3.Graph.RD_lso_061101_m
+import qualified Sound.SC3.Graph.RD_vla_addtn
+import qualified Sound.SC3.Graph.RD_eggcrate_m
+import qualified Sound.SC3.Graph.RD_fbl_fbf
 import qualified Sound.SC3.Graph.RD_klink
-import qualified Sound.SC3.Graph.RD_f_lets_m
+import qualified Sound.SC3.Graph.RD_crotale
 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_lg_timed_m
+import qualified Sound.SC3.Graph.RD_crotale_sine
+import qualified Sound.SC3.Graph.RD_vlc_distrtn_m
+import qualified Sound.SC3.Graph.RD_fm_iter
+import qualified Sound.SC3.Graph.RD_diffraction_m
+import qualified Sound.SC3.Graph.RD_fm_kltr_p
 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_thb
 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.RD_tgr_rpr_m
+import qualified Sound.SC3.Graph.RD_fm_kltr_m
+import qualified Sound.SC3.Graph.RD_tipnso
 import qualified Sound.SC3.Graph.SC_bottle_m
 import qualified Sound.SC3.Graph.SP_insects_m
+import qualified Sound.SC3.Graph.TB_1_4Tw
 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
+    ["adc-16-6-2"] -> Sound.SC3.Graph.ADC_adc_16_6_2.main
+    ["waveset"] -> Sound.SC3.Graph.ADC_waveset.main
+    ["bit-reduction"] -> Sound.SC3.Graph.ADC_bit_reduction.main
+    ["birds-am-fm"] -> Sound.SC3.Graph.AF_birds_am_fm.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-tw0125"] -> Sound.SC3.Graph.F0_f0_tw0125.main
+    ["f0-454598285861617665"] -> Sound.SC3.Graph.F0_f0_454598285861617665.main
+    ["f0-tw0041"] -> Sound.SC3.Graph.F0_f0_tw0041.main
+    ["f0-tw0134"] -> Sound.SC3.Graph.F0_f0_tw0134.main
+    ["f0-tw0014"] -> Sound.SC3.Graph.F0_f0_tw0014.main
+    ["f0-tw0026"] -> Sound.SC3.Graph.F0_f0_tw0026.main
+    ["hansm"] -> Sound.SC3.Graph.F0_hansm.main
+    ["f0-456384156159574016"] -> Sound.SC3.Graph.F0_f0_456384156159574016.main
+    ["f0-tw0045"] -> Sound.SC3.Graph.F0_f0_tw0045.main
+    ["f0-tw0220"] -> Sound.SC3.Graph.F0_f0_tw0220.main
+    ["buffer-display"] -> Sound.SC3.Graph.F0_buffer_display.main
+    ["red-frik-m"] -> Sound.SC3.Graph.F0_red_frik_m.main
+    ["f0-2012-04-19"] -> Sound.SC3.Graph.F0_f0_2012_04_19.main
+    ["pkt-26"] -> Sound.SC3.Graph.F0_pkt_26.main
     ["f0-tw0051"] -> Sound.SC3.Graph.F0_f0_tw0051.main
+    ["f0-tw0225"] -> Sound.SC3.Graph.F0_f0_tw0225.main
+    ["f0-tw0121"] -> Sound.SC3.Graph.F0_f0_tw0121.main
+    ["f0-tw0084"] -> Sound.SC3.Graph.F0_f0_tw0084.main
+    ["pkt-00"] -> Sound.SC3.Graph.F0_pkt_00.main
+    ["f0-tw0033"] -> Sound.SC3.Graph.F0_f0_tw0033.main
+    ["f0-tw0224"] -> Sound.SC3.Graph.F0_f0_tw0224.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
+    ["sinusdeklinationen"] -> Sound.SC3.Graph.F0_sinusdeklinationen.main
+    ["f0-tw0028"] -> Sound.SC3.Graph.F0_f0_tw0028.main
     ["f0-tw0020"] -> Sound.SC3.Graph.F0_f0_tw0020.main
+    ["1-4Q6"] -> Sound.SC3.Graph.F0_1_4Q6.main
+    ["f0-tw0120"] -> Sound.SC3.Graph.F0_f0_tw0120.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-tw0030"] -> Sound.SC3.Graph.F0_f0_tw0030.main
+    ["f0-tw0077"] -> Sound.SC3.Graph.F0_f0_tw0077.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
+    ["pwm-crossfade"] -> Sound.SC3.Graph.JL_pwm_crossfade.main
+    ["dark-sea-horns-hp"] -> Sound.SC3.Graph.JL_dark_sea_horns_hp.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
+    ["jl-1-Z"] -> Sound.SC3.Graph.JL_jl_1_Z.main
+    ["rain-thunder"] -> Sound.SC3.Graph.JL_rain_thunder.main
+    ["harmonic-tumbling"] -> Sound.SC3.Graph.JMCC_harmonic_tumbling.main
+    ["sample-and-hold-liquidities"] -> Sound.SC3.Graph.JMCC_sample_and_hold_liquidities.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
+    ["modal-space"] -> Sound.SC3.Graph.JMCC_modal_space.main
+    ["modal-space-buf"] -> Sound.SC3.Graph.JMCC_modal_space_buf.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
+    ["why-supercollider"] -> Sound.SC3.Graph.JMCC_why_supercollider.main
+    ["strummable-guitar"] -> Sound.SC3.Graph.JMCC_strummable_guitar.main
+    ["contamination-zone"] -> Sound.SC3.Graph.JMCC_contamination_zone.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
+    ["harmonic-swimming-m"] -> Sound.SC3.Graph.JMCC_harmonic_swimming_m.main
+    ["spe-p"] -> Sound.SC3.Graph.JMCC_spe_p.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
+    ["cymbalism-m"] -> Sound.SC3.Graph.JMCC_cymbalism_m.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
+    ["cymbalism-accelerando"] -> Sound.SC3.Graph.JMCC_cymbalism_accelerando.main
+    ["blips-001"] -> Sound.SC3.Graph.JMCC_blips_001.main
+    ["blips-001-u"] -> Sound.SC3.Graph.JMCC_blips_001_u.main
+    ["spe-m"] -> Sound.SC3.Graph.JMCC_spe_m.main
+    ["landon-rose"] -> Sound.SC3.Graph.JMCC_landon_rose.main
+    ["noise-modulated-sines"] -> Sound.SC3.Graph.JMCC_noise_modulated_sines.main
+    ["data-space"] -> Sound.SC3.Graph.JMCC_data_space.main
+    ["scratchy"] -> Sound.SC3.Graph.JMCC_scratchy.main
+    ["analog-bubbles-mouse"] -> Sound.SC3.Graph.JMCC_analog_bubbles_mouse.main
+    ["resonant-dust"] -> Sound.SC3.Graph.JMCC_resonant_dust.main
+    ["hell-is-busy"] -> Sound.SC3.Graph.JMCC_hell_is_busy.main
+    ["reverberated-sine-percussion-m"] -> Sound.SC3.Graph.JMCC_reverberated_sine_percussion_m.main
+    ["metal-plate"] -> Sound.SC3.Graph.JMCC_metal_plate.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
+    ["reso-pulse"] -> Sound.SC3.Graph.JMCC_reso_pulse.main
+    ["ring-modulated-klank"] -> Sound.SC3.Graph.JMCC_ring_modulated_klank.main
+    ["noise-burst-sweep"] -> Sound.SC3.Graph.JMCC_noise_burst_sweep.main
+    ["birdies"] -> Sound.SC3.Graph.JMCC_birdies.main
+    ["random-sine-waves"] -> Sound.SC3.Graph.JMCC_random_sine_waves.main
+    ["pond-life"] -> Sound.SC3.Graph.JMCC_pond_life.main
+    ["tremulate-m"] -> Sound.SC3.Graph.JMCC_tremulate_m.main
+    ["tank-m"] -> Sound.SC3.Graph.JMCC_tank_m.main
+    ["bouncing-objects"] -> Sound.SC3.Graph.JMCC_bouncing_objects.main
+    ["police-state-m"] -> Sound.SC3.Graph.JMCC_police_state_m.main
+    ["moto-rev"] -> Sound.SC3.Graph.JMCC_moto_rev.main
+    ["deep-trip"] -> Sound.SC3.Graph.JMCC_deep_trip.main
+    ["demanding-studies"] -> Sound.SC3.Graph.JMCC_demanding_studies.main
+    ["swept-resonant-noise"] -> Sound.SC3.Graph.JMCC_swept_resonant_noise.main
+    ["bowed-string-m"] -> Sound.SC3.Graph.JMCC_bowed_string_m.main
+    ["impulse-sequencer"] -> Sound.SC3.Graph.JMCC_impulse_sequencer.main
+    ["analogue-daze"] -> Sound.SC3.Graph.JMCC_analogue_daze.main
+    ["tremulate-hp"] -> Sound.SC3.Graph.JMCC_tremulate_hp.main
+    ["uplink"] -> Sound.SC3.Graph.JMCC_uplink.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
+    ["sawed-cymbals"] -> Sound.SC3.Graph.JMCC_sawed_cymbals.main
+    ["sprinkler-m"] -> Sound.SC3.Graph.JMCC_sprinkler_m.main
+    ["tremulate"] -> Sound.SC3.Graph.JMCC_tremulate.main
+    ["random-panning-sines-m"] -> Sound.SC3.Graph.JMCC_random_panning_sines_m.main
+    ["birds"] -> Sound.SC3.Graph.JMCC_birds.main
+    ["random-panning-sines"] -> Sound.SC3.Graph.JMCC_random_panning_sines.main
+    ["zizle"] -> Sound.SC3.Graph.JMCC_zizle.main
+    ["random-sine-waves-she"] -> Sound.SC3.Graph.JMCC_random_sine_waves_she.main
+    ["analog-bubbles"] -> Sound.SC3.Graph.JMCC_analog_bubbles.main
+    ["pond-life-ha"] -> Sound.SC3.Graph.JMCC_pond_life_ha.main
+    ["choip"] -> Sound.SC3.Graph.JMCC_choip.main
     ["sidereal-time"] -> Sound.SC3.Graph.JMCC_sidereal_time.main
+    ["coolant"] -> Sound.SC3.Graph.JMCC_coolant.main
+    ["comb-delay-sweeps"] -> Sound.SC3.Graph.JMCC_comb_delay_sweeps.main
+    ["pond-life-hp"] -> Sound.SC3.Graph.JMCC_pond_life_hp.main
+    ["sweepy-noise"] -> Sound.SC3.Graph.JMCC_sweepy_noise.main
+    ["clustered-sines"] -> Sound.SC3.Graph.JMCC_clustered_sines.main
+    ["tapping-tools"] -> Sound.SC3.Graph.JMCC_tapping_tools.main
+    ["scratchy-m"] -> Sound.SC3.Graph.JMCC_scratchy_m.main
+    ["police-state"] -> Sound.SC3.Graph.JMCC_police_state.main
+    ["overlap-add"] -> Sound.SC3.Graph.JMCC_overlap_add.main
+    ["noise-modulated-sawtooths"] -> Sound.SC3.Graph.JMCC_noise_modulated_sawtooths.main
+    ["alien-froggies-rec"] -> Sound.SC3.Graph.JMCC_alien_froggies_rec.main
+    ["drone-plus-rhythm"] -> Sound.SC3.Graph.JMCC_drone_plus_rhythm.main
+    ["ring-modulate-input"] -> Sound.SC3.Graph.JMCC_ring_modulate_input.main
+    ["alien-meadow"] -> Sound.SC3.Graph.JMCC_alien_meadow.main
+    ["hard-sync-sawtooth-with-lfo"] -> Sound.SC3.Graph.JMCC_hard_sync_sawtooth_with_lfo.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
+    ["sidereal-time-hp"] -> Sound.SC3.Graph.JMCC_sidereal_time_hp.main
+    ["filter-input"] -> Sound.SC3.Graph.JMCC_filter_input.main
+    ["blips-001-hp"] -> Sound.SC3.Graph.JMCC_blips_001_hp.main
+    ["pulsing-bottles-m"] -> Sound.SC3.Graph.JMCC_pulsing_bottles_m.main
+    ["babbling-brook-m"] -> Sound.SC3.Graph.JMCC_babbling_brook_m.main
+    ["snare-909"] -> Sound.SC3.Graph.JMCC_snare_909.main
+    ["phase-modulation"] -> Sound.SC3.Graph.JMCC_phase_modulation.main
+    ["lfo-modulation"] -> Sound.SC3.Graph.JMCC_lfo_modulation.main
+    ["data-space-hp"] -> Sound.SC3.Graph.JMCC_data_space_hp.main
+    ["tsort"] -> Sound.SC3.Graph.JMCC_tsort.main
+    ["narrow-band-filtered-crackle-noise"] -> Sound.SC3.Graph.JMCC_narrow_band_filtered_crackle_noise.main
+    ["what-was-i-thinking-m"] -> Sound.SC3.Graph.JMCC_what_was_i_thinking_m.main
+    ["tank-hp"] -> Sound.SC3.Graph.JMCC_tank_hp.main
+    ["pulsing-bottles"] -> Sound.SC3.Graph.JMCC_pulsing_bottles.main
+    ["string-wander-cluster"] -> Sound.SC3.Graph.JMCC_string_wander_cluster.main
+    ["sprinkler"] -> Sound.SC3.Graph.JMCC_sprinkler.main
+    ["distort-input"] -> Sound.SC3.Graph.JMCC_distort_input.main
+    ["wind-metals-m"] -> Sound.SC3.Graph.JMCC_wind_metals_m.main
+    ["babbling-brook"] -> Sound.SC3.Graph.JMCC_babbling_brook.main
+    ["alien-froggies"] -> Sound.SC3.Graph.JMCC_alien_froggies.main
+    ["reverberated-sine-percussion-hp"] -> Sound.SC3.Graph.JMCC_reverberated_sine_percussion_hp.main
+    ["reverberated-noise-bursts"] -> Sound.SC3.Graph.JMCC_reverberated_noise_bursts.main
     ["saucer-base"] -> Sound.SC3.Graph.JMCC_saucer_base.main
-    ["cymbalism-m"] -> Sound.SC3.Graph.JMCC_cymbalism_m.main
+    ["harmonic-tumbling-m"] -> Sound.SC3.Graph.JMCC_harmonic_tumbling_m.main
+    ["berlin-1977"] -> Sound.SC3.Graph.JMCC_berlin_1977.main
+    ["harmonic-swimming"] -> Sound.SC3.Graph.JMCC_harmonic_swimming.main
+    ["resonant-dust-hp"] -> Sound.SC3.Graph.JMCC_resonant_dust_hp.main
+    ["doppler"] -> Sound.SC3.Graph.JMCC_doppler.main
+    ["slow-beating-harmonic-sines"] -> Sound.SC3.Graph.JMCC_slow_beating_harmonic_sines.main
+    ["mridangam-dr"] -> Sound.SC3.Graph.JMCC_mridangam_dr.main
+    ["random-sine-waves-hp"] -> Sound.SC3.Graph.JMCC_random_sine_waves_hp.main
+    ["plucked-strings-m"] -> Sound.SC3.Graph.JMCC_plucked_strings_m.main
+    ["default"] -> Sound.SC3.Graph.JMCC_default.main
+    ["resonators-harmonic-series"] -> Sound.SC3.Graph.JMCC_resonators_harmonic_series.main
+    ["zizle-hp"] -> Sound.SC3.Graph.JMCC_zizle_hp.main
+    ["clustered-sines-m"] -> Sound.SC3.Graph.JMCC_clustered_sines_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
+    ["jr-100515"] -> Sound.SC3.Graph.JR_jr_100515.main
+    ["dial-history-m"] -> Sound.SC3.Graph.JRHB_dial_history_m.main
     ["deep-sea"] -> Sound.SC3.Graph.JRHB_deep_sea.main
+    ["black-atlantic-currents"] -> Sound.SC3.Graph.JRHB_black_atlantic_currents.main
+    ["chain-saw-m"] -> Sound.SC3.Graph.JRHB_chain_saw_m.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
+    ["k2ws"] -> Sound.SC3.Graph.MN_k2ws.main
     ["arpeggio"] -> Sound.SC3.Graph.NC_arpeggio.main
+    ["after-goeyvaerts"] -> Sound.SC3.Graph.NC_after_goeyvaerts.main
     ["ellipse-based-synthesis"] -> Sound.SC3.Graph.NC_ellipse_based_synthesis.main
     ["pebble-beach"] -> Sound.SC3.Graph.NP_pebble_beach.main
+    ["nv-tw-2013-01-11"] -> Sound.SC3.Graph.NV_nv_tw_2013_01_11.main
     ["nv-tw-54"] -> Sound.SC3.Graph.NV_nv_tw_54.main
+    ["nv-tw-2014-02-21"] -> Sound.SC3.Graph.NV_nv_tw_2014_02_21.main
     ["nv-tw-41"] -> Sound.SC3.Graph.NV_nv_tw_41.main
     ["nv-tw-1"] -> Sound.SC3.Graph.NV_nv_tw_1.main
+    ["nv-tw-2014-06-03"] -> Sound.SC3.Graph.NV_nv_tw_2014_06_03.main
+    ["nv-ml-2014-06-03"] -> Sound.SC3.Graph.NV_nv_ml_2014_06_03.main
+    ["nv-tw-2013-12-04"] -> Sound.SC3.Graph.NV_nv_tw_2013_12_04.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
+    ["h-chatter-m"] -> Sound.SC3.Graph.RD_h_chatter_m.main
+    ["three-cpsw"] -> Sound.SC3.Graph.RD_three_cpsw.main
+    ["chrd-m"] -> Sound.SC3.Graph.RD_chrd_m.main
+    ["tgb-m"] -> Sound.SC3.Graph.RD_tgb_m.main
+    ["eggcrate"] -> Sound.SC3.Graph.RD_eggcrate.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
+    ["e-lamell-p"] -> Sound.SC3.Graph.RD_e_lamell_p.main
+    ["seqr-n"] -> Sound.SC3.Graph.RD_seqr_n.main
+    ["bs-070705-m"] -> Sound.SC3.Graph.RD_bs_070705_m.main
+    ["shifting-pulses-m"] -> Sound.SC3.Graph.RD_shifting_pulses_m.main
+    ["adso"] -> Sound.SC3.Graph.RD_adso.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
+    ["xy-interference-m"] -> Sound.SC3.Graph.RD_xy_interference_m.main
+    ["f-lets-m"] -> Sound.SC3.Graph.RD_f_lets_m.main
+    ["pattern-buffer-m"] -> Sound.SC3.Graph.RD_pattern_buffer_m.main
+    ["discretion"] -> Sound.SC3.Graph.RD_discretion.main
+    ["scritto-m"] -> Sound.SC3.Graph.RD_scritto_m.main
+    ["trkl-m"] -> Sound.SC3.Graph.RD_trkl_m.main
+    ["wial-m"] -> Sound.SC3.Graph.RD_wial_m.main
+    ["trmlo"] -> Sound.SC3.Graph.RD_trmlo.main
+    ["lz-bf"] -> Sound.SC3.Graph.RD_lz_bf.main
+    ["sosc-lp-m"] -> Sound.SC3.Graph.RD_sosc_lp_m.main
+    ["k-ppr-m"] -> Sound.SC3.Graph.RD_k_ppr_m.main
+    ["three-cpsw-m"] -> Sound.SC3.Graph.RD_three_cpsw_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
+    ["rzblp-u"] -> Sound.SC3.Graph.RD_rzblp_u.main
+    ["for-ann"] -> Sound.SC3.Graph.RD_for_ann.main
+    ["k-ppr"] -> Sound.SC3.Graph.RD_k_ppr.main
     ["cds-070701-m"] -> Sound.SC3.Graph.RD_cds_070701_m.main
+    ["tr-out-m"] -> Sound.SC3.Graph.RD_tr_out_m.main
+    ["voscil"] -> Sound.SC3.Graph.RD_voscil.main
+    ["rzblp"] -> Sound.SC3.Graph.RD_rzblp.main
+    ["xy-interference"] -> Sound.SC3.Graph.RD_xy_interference.main
+    ["feedr-m"] -> Sound.SC3.Graph.RD_feedr_m.main
+    ["mouse-clatter-m"] -> Sound.SC3.Graph.RD_mouse_clatter_m.main
+    ["discretion-m"] -> Sound.SC3.Graph.RD_discretion_m.main
+    ["tgrn"] -> Sound.SC3.Graph.RD_tgrn.main
+    ["fwalk-m"] -> Sound.SC3.Graph.RD_fwalk_m.main
+    ["chrd-t"] -> Sound.SC3.Graph.RD_chrd_t.main
+    ["e-lamell"] -> Sound.SC3.Graph.RD_e_lamell.main
+    ["ccomb-m"] -> Sound.SC3.Graph.RD_ccomb_m.main
+    ["cricket-m"] -> Sound.SC3.Graph.RD_cricket_m.main
+    ["s-chirp"] -> Sound.SC3.Graph.RD_s_chirp.main
+    ["lf-pulses"] -> Sound.SC3.Graph.RD_lf_pulses.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
+    ["oscillator-cluster-m"] -> Sound.SC3.Graph.RD_oscillator_cluster_m.main
+    ["lin-sosc"] -> Sound.SC3.Graph.RD_lin_sosc.main
+    ["nharm-p"] -> Sound.SC3.Graph.RD_nharm_p.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
+    ["seqr"] -> Sound.SC3.Graph.RD_seqr.main
+    ["lso-061101-m"] -> Sound.SC3.Graph.RD_lso_061101_m.main
+    ["vla-addtn"] -> Sound.SC3.Graph.RD_vla_addtn.main
+    ["eggcrate-m"] -> Sound.SC3.Graph.RD_eggcrate_m.main
+    ["fbl-fbf"] -> Sound.SC3.Graph.RD_fbl_fbf.main
     ["klink"] -> Sound.SC3.Graph.RD_klink.main
-    ["f-lets-m"] -> Sound.SC3.Graph.RD_f_lets_m.main
+    ["crotale"] -> Sound.SC3.Graph.RD_crotale.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
+    ["lg-timed-m"] -> Sound.SC3.Graph.RD_lg_timed_m.main
+    ["crotale-sine"] -> Sound.SC3.Graph.RD_crotale_sine.main
+    ["vlc-distrtn-m"] -> Sound.SC3.Graph.RD_vlc_distrtn_m.main
+    ["fm-iter"] -> Sound.SC3.Graph.RD_fm_iter.main
+    ["diffraction-m"] -> Sound.SC3.Graph.RD_diffraction_m.main
+    ["fm-kltr-p"] -> Sound.SC3.Graph.RD_fm_kltr_p.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
+    ["thb"] -> Sound.SC3.Graph.RD_thb.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
+    ["tgr-rpr-m"] -> Sound.SC3.Graph.RD_tgr_rpr_m.main
+    ["fm-kltr-m"] -> Sound.SC3.Graph.RD_fm_kltr_m.main
+    ["tipnso"] -> Sound.SC3.Graph.RD_tipnso.main
     ["bottle-m"] -> Sound.SC3.Graph.SC_bottle_m.main
     ["insects-m"] -> Sound.SC3.Graph.SP_insects_m.main
+    ["1-4Tw"] -> Sound.SC3.Graph.TB_1_4Tw.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"
+    _ -> putStrLn "hsc3-graphs graph\n1-4Q6, 1-4Qx, 1-4Tw, adc-16-6-2, adso, after-goeyvaerts, aleatoric-quartet-m, alien-froggies, alien-froggies-rec, alien-meadow, analog-bubbles, analog-bubbles-mouse, analogue-daze, arpeggio, babbling-brook, babbling-brook-m, berlin-1977, birdies, birds, birds-am-fm, birds-hp, birds-m, bit-reduction, bitwise, black-atlantic-currents, blips-001, blips-001-hp, blips-001-u, bohlen-pierce-140, bottle-m, bouncing-objects, 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, distort-input, doppler, drone-plus-rhythm, 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-454598285861617665, f0-456384156159574016, f0-tw0011, f0-tw0014, f0-tw0020, f0-tw0026, f0-tw0028, f0-tw0030, f0-tw0033, f0-tw0041, f0-tw0045, f0-tw0049, f0-tw0051, f0-tw0077, f0-tw0084, f0-tw0120, f0-tw0121, f0-tw0125, f0-tw0134, f0-tw0220, f0-tw0224, f0-tw0225, fb-090531, fbl-fbf, feedr-m, filter-input, fm-iter, fm-kltr-m, fm-kltr-p, for-ann, forest-sounds-m, fwalk-m, h-chatter-m, half-life, hansm, hard-sync-sawtooth-with-lfo, harmonic-swimming, harmonic-swimming-m, harmonic-tumbling, harmonic-tumbling-m, hell-is-busy, hh-808, implosion-m, impulse-sequencer, insects-m, jl-1-Z, jr-100515, k-ppr, k-ppr-m, k2ws, k2ws-hp, kabelscahden, karplus-strong, klink, landon-rose, lf-pulses, lfo-modulation, lg-timed-m, lin-sosc, lso-061101-m, lz-bf, metal-plate, modal-space, modal-space-buf, moto-rev, mouse-clatter-m, mridangam, mridangam-dr, narrow-band-filtered-crackle-noise, nharm-m, nharm-p, noise-burst-sweep, noise-modulated-sawtooths, noise-modulated-sines, nv-ml-2014-06-03, nv-tw-1, nv-tw-2013-01-11, nv-tw-2013-12-04, nv-tw-2014-02-21, nv-tw-2014-06-03, nv-tw-41, nv-tw-54, one-line, oscillator-cluster-m, overlap-add, pattern-buffer-m, pebble-beach, phase-modulation, pkt-00, pkt-07, pkt-26, pkt-28, plucked-strings-m, police-state, police-state-m, pond-life, pond-life-ha, 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, reso-pulse, resonant-dust, resonant-dust-hp, resonators-harmonic-series, reverberated-noise-bursts, reverberated-sine-percussion-hp, reverberated-sine-percussion-m, ring-modulate-input, 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, seqr-n, 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, swept-resonant-noise, synthetic-piano-m, tank, tank-hp, tank-m, tapping-tools, tgb-m, tgr-rpr-m, tgrn, thb, theremin, three-cpsw, 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, zizle, zizle-hp"
diff --git a/hs/jmcc.hs b/hs/jmcc.hs
new file mode 100644
--- /dev/null
+++ b/hs/jmcc.hs
@@ -0,0 +1,122 @@
+import Control.Monad {- base -}
+import System.Directory {- directory -}
+import System.FilePath {- filepath -}
+
+prj_dir :: FilePath
+prj_dir = "/home/rohan/sw/hsc3-graphs"
+
+to_file_name :: String -> String
+to_file_name =
+    let f c = if c `elem` " " then '-' else c
+    in map f
+
+to_file :: String -> String -> FilePath
+to_file ext nm = prj_dir </> "gr" </> to_file_name nm <.> ext
+
+jmcc_sc2 :: [[String]]
+jmcc_sc2 =
+    -- SC2
+    [["why supercollider"]
+    ,["analog bubbles"
+     ,"lfo modulation"
+     ,"hell is busy"
+     ,"pond life"
+     ,"alien froggies"
+     ,"random sine waves"
+     ,"random pulsations"
+     ,"moto rev"
+     ,"scratchy"
+     ,"tremulate"
+     ,"reso pulse"
+     ,"sprinkler"
+     ,"sprinkler mouse"
+     ,"harmonic swimming"
+     ,"harmonic tumbling"]
+    ,["rails"
+     ,"bouncing objects"
+     ,"lots-o-sines"
+     ,"clustered sines"
+     ,"resonators harmonic series"
+     ,"swept resonant noise"
+     ,"coolant"
+     ,"pulsing bottles"
+     ,"what was i thinking"
+     ,"narrow band filtered crackle noise"
+     ,"resonant dust"
+     ,"police state"
+     ,"uplink"
+     ,"data space"
+     ,"cymbalism"
+     ,"cymbalism accelerando"
+     ,"ring modulated klank"]
+    ,["analogue daze"
+     ,"synthetic piano"
+     ,"reverberated sine percussion"
+     ,"reverberated noise bursts"
+     ,"analog bubbles mouse"]
+    ,["berlin 1977"
+     ,"metal plate"
+     ,"sample and hold liquidities"
+     ,"random panning sines"]
+    ,["distort input"
+     ,"ring modulate input"
+     ,"filter input"]
+    ,["sweepy noise"
+     ,"string wander-cluster"
+     ,"comb delay sweeps"
+     ,"noise burst sweep"
+     ,"saucer base"
+     ,"alien meadow"
+     ,"birdies"
+     ,"phase modulation"
+     ,"hard sync sawtooth with lfo"
+     ,"noise modulated sines"
+     ,"noise modulated sawtooths"]
+    ,["aleatoric quartet"
+     ,"slow beating sines"
+     ,"slow beating harmonic sines"
+     ,"tapping tools"]
+    ,["modal space"
+     ,"landon rose"]
+    ,["deep trip"
+     ,"sawed cymbals"
+     ,"sidereal time"
+     ,"contamination zone"]
+    ,[]
+    ,["strummable guitar"
+     ,"drone plus rhythm"
+     ,"early space music lp side one"
+     ,"early space music lp side two"]
+    -- SC3d1.5
+    ,["blips 001"
+     ,"zizle"]
+    -- SC3
+    ,["babbling brook"]
+    ,["mridangam"]]
+
+jmcc_fnames :: String -> [FilePath]
+jmcc_fnames ext = concatMap (map (to_file ext)) jmcc_sc2
+
+-- > jmcc_missing "fs"
+-- > jmcc_missing "scm"
+jmcc_missing :: String -> IO [FilePath]
+jmcc_missing = filterM (fmap not . doesFileExist) . jmcc_fnames
+
+jmcc_concat :: String -> (String -> r) -> IO [r]
+jmcc_concat ext f = do
+  fn <- filterM doesFileExist (jmcc_fnames ext)
+  d <- mapM readFile fn
+  let d' = map f d
+  return d'
+
+-- > writeFile "/tmp/jmcc.scd" . unlines =<< jmcc_scd
+jmcc_scd :: IO [String]
+jmcc_scd = let f s = concat ["(\n",s,")\n"] in jmcc_concat "scd" f
+
+-- > writeFile "/home/rohan/sw/hsc3-lisp/help/jmcc.lisp" . unlines =<< jmcc_scm
+jmcc_scm :: IO [String]
+jmcc_scm = jmcc_concat "scm" id
+
+-- > writeFile "/home/rohan/sw/hsc3-forth/help/jmcc.fs" . unlines =<< jmcc_fs
+jmcc_fs :: IO [String]
+jmcc_fs = jmcc_concat "fs" id
diff --git a/hs/mk-ix.hs b/hs/mk-ix.hs
--- a/hs/mk-ix.hs
+++ b/hs/mk-ix.hs
@@ -20,7 +20,7 @@
 type HS_LN = [M_Str]
 
 alternates :: [String]
-alternates = ["m","u","hp","she","p"]
+alternates = ["m","u","ha","hp","she","p"]
 
 alternates' :: [String]
 alternates' = map ('-':) alternates
@@ -47,14 +47,23 @@
   hs <- if use_html
         then hs_html st nm
         else hs_plain st nm
-  scd <- link hm (pr </> "gr" </> nm <.> "scd") "scd"
+  fs <- if use_html
+        then link hm (pr </> "html" </> nm <.> "fsu.htm") "fs"
+        else link hm (pr </> "gr" </> nm <.> "fs") "fs"
+  scd <- if use_html
+         then link hm (pr </> "html" </> nm <.> "scd.html") "scd"
+         else link hm (pr </> "gr" </> nm <.> "scd") "scd"
   scm <- if use_scm
-         then link hm ("sw/rsc3/help/graph" </> nm <.> "scm") "scm"
+         then if use_html
+              then link hm (pr </> "html" </> nm <.> "scm.html") "scm"
+              else link hm ("sw/rsc3/help/graph" </> nm <.> "scm") "scm"
          else return Nothing
-  dot <- link hm (pr </> "dot" </> nm <.> "dot") "dot"
+  dot <- if False
+         then link hm (pr </> "dot" </> nm <.> "dot") "dot"
+         else return Nothing
   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]))
+  let ln = intercalate "," (catMaybes (hs ++ [fs,scd,scm,dot,pdf,svg]))
   return (printf "- %s [%s]" nm ln)
 
 -- > mk_ix ("/home/rohan","sw/hsc3-graphs",True,True)
diff --git a/hsc3-graphs.cabal b/hsc3-graphs.cabal
--- a/hsc3-graphs.cabal
+++ b/hsc3-graphs.cabal
@@ -1,16 +1,16 @@
 Name:              hsc3-graphs
-Version:           0.14.1
+Version:           0.15
 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
+Copyright:         (c) Rohan Drape and others, 2006-2014
 Author:            Rohan Drape
 Maintainer:        rd@slavepianos.org
 Stability:         Experimental
-Homepage:          http://rd.slavepianos.org/?t=hsc3-graphs
-Tested-With:       GHC == 7.6.1
+Homepage:          http://rd.slavepianos.org/t/hsc3-graphs
+Tested-With:       GHC == 7.8.2
 Build-Type:        Simple
 Cabal-Version:     >= 1.8
 
@@ -24,155 +24,206 @@
 Library
   Build-Depends:   array,
                    base == 4.*,
+                   binary,
                    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.*,
+                   hls == 0.15.*,
+                   hmt == 0.15.*,
+                   hosc == 0.15.*,
+                   hps == 0.15.*,
+                   hsc3 == 0.15.*,
+                   hsc3-cairo == 0.15.*,
+                   hsc3-lang == 0.15.*,
+                   hsc3-sf == 0.15.*,
+                   hsc3-unsafe == 0.15.*,
+                   hsc3-utils == 0.15.*,
+                   hsharc == 0.15.*,
                    MonadRandom,
                    primes,
                    random,
                    random-shuffle,
-                   sc3-rdu == 0.14.*,
+                   sc3-rdu == 0.15.*,
+                   she,
                    split
   GHC-Options:     -Wall -fwarn-tabs
-  -- Auto-generated: Fri Apr 5 14:49:03 EST 2013
-  Exposed-Modules: Sound.SC3.Graph.ADC_bit_reduction,
+  -- Auto-generated by hs/mk-lib.hs: Monday 16 June 17:05:21 EST 2014
+  Exposed-Modules: Sound.SC3.Graph.ADC_adc_16_6_2,
+                   Sound.SC3.Graph.ADC_bit_reduction,
                    Sound.SC3.Graph.ADC_kabelscahden,
                    Sound.SC3.Graph.ADC_shepard_tones,
+                   Sound.SC3.Graph.ADC_waveset,
+                   Sound.SC3.Graph.AF_birds_am_fm,
                    Sound.SC3.Graph.AM_karplus_strong,
                    Sound.SC3.Graph.AV_rm_octaver,
-                   Sound.SC3.Graph.F0_sinusdeklinationen,
                    Sound.SC3.Graph.F0_1_4Q6,
                    Sound.SC3.Graph.F0_buffer_display,
                    Sound.SC3.Graph.F0_f0_2012_04_19,
+                   Sound.SC3.Graph.F0_f0_454598285861617665,
+                   Sound.SC3.Graph.F0_f0_456384156159574016,
                    Sound.SC3.Graph.F0_f0_tw0011,
                    Sound.SC3.Graph.F0_f0_tw0014,
                    Sound.SC3.Graph.F0_f0_tw0020,
+                   Sound.SC3.Graph.F0_f0_tw0026,
                    Sound.SC3.Graph.F0_f0_tw0028,
                    Sound.SC3.Graph.F0_f0_tw0030,
                    Sound.SC3.Graph.F0_f0_tw0033,
+                   Sound.SC3.Graph.F0_f0_tw0041,
                    Sound.SC3.Graph.F0_f0_tw0045,
                    Sound.SC3.Graph.F0_f0_tw0049,
                    Sound.SC3.Graph.F0_f0_tw0051,
                    Sound.SC3.Graph.F0_f0_tw0077,
                    Sound.SC3.Graph.F0_f0_tw0084,
+                   Sound.SC3.Graph.F0_f0_tw0120,
+                   Sound.SC3.Graph.F0_f0_tw0121,
+                   Sound.SC3.Graph.F0_f0_tw0125,
+                   Sound.SC3.Graph.F0_f0_tw0134,
+                   Sound.SC3.Graph.F0_f0_tw0220,
+                   Sound.SC3.Graph.F0_f0_tw0224,
+                   Sound.SC3.Graph.F0_f0_tw0225,
                    Sound.SC3.Graph.F0_hansm,
                    Sound.SC3.Graph.F0_pkt_00,
                    Sound.SC3.Graph.F0_pkt_07,
                    Sound.SC3.Graph.F0_pkt_26,
                    Sound.SC3.Graph.F0_pkt_28,
                    Sound.SC3.Graph.F0_red_frik_m,
+                   Sound.SC3.Graph.F0_sinusdeklinationen,
                    Sound.SC3.Graph.JAR_1_4Qx,
                    Sound.SC3.Graph.JJ_bohlen_pierce_140,
+                   Sound.SC3.Graph.JL_bitwise,
+                   Sound.SC3.Graph.JL_dark_sea_horns,
                    Sound.SC3.Graph.JL_dark_sea_horns_hp,
+                   Sound.SC3.Graph.JL_jl_1_Z,
                    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_aleatoric_quartet_m,
+                   Sound.SC3.Graph.JMCC_alien_froggies,
+                   Sound.SC3.Graph.JMCC_alien_froggies_rec,
                    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_analog_bubbles,
+                   Sound.SC3.Graph.JMCC_analog_bubbles_mouse,
+                   Sound.SC3.Graph.JMCC_analogue_daze,
+                   Sound.SC3.Graph.JMCC_babbling_brook,
+                   Sound.SC3.Graph.JMCC_babbling_brook_m,
+                   Sound.SC3.Graph.JMCC_berlin_1977,
+                   Sound.SC3.Graph.JMCC_birdies,
+                   Sound.SC3.Graph.JMCC_birds,
+                   Sound.SC3.Graph.JMCC_birds_hp,
+                   Sound.SC3.Graph.JMCC_birds_m,
+                   Sound.SC3.Graph.JMCC_blips_001,
+                   Sound.SC3.Graph.JMCC_blips_001_hp,
+                   Sound.SC3.Graph.JMCC_blips_001_u,
+                   Sound.SC3.Graph.JMCC_bouncing_objects,
+                   Sound.SC3.Graph.JMCC_bowed_string_m,
+                   Sound.SC3.Graph.JMCC_choip,
+                   Sound.SC3.Graph.JMCC_clustered_sines,
+                   Sound.SC3.Graph.JMCC_clustered_sines_m,
+                   Sound.SC3.Graph.JMCC_comb_delay_sweeps,
+                   Sound.SC3.Graph.JMCC_contamination_zone,
+                   Sound.SC3.Graph.JMCC_coolant,
+                   Sound.SC3.Graph.JMCC_cymbalism_accelerando,
+                   Sound.SC3.Graph.JMCC_cymbalism_m,
                    Sound.SC3.Graph.JMCC_data_space,
-                   Sound.SC3.Graph.JMCC_police_state_m,
+                   Sound.SC3.Graph.JMCC_data_space_hp,
+                   Sound.SC3.Graph.JMCC_deep_trip,
                    Sound.SC3.Graph.JMCC_default,
+                   Sound.SC3.Graph.JMCC_demanding_studies,
+                   Sound.SC3.Graph.JMCC_distort_input,
+                   Sound.SC3.Graph.JMCC_doppler,
+                   Sound.SC3.Graph.JMCC_drone_plus_rhythm,
+                   Sound.SC3.Graph.JMCC_early_space_music_lp_side_two,
+                   Sound.SC3.Graph.JMCC_filter_input,
+                   Sound.SC3.Graph.JMCC_hard_sync_sawtooth_with_lfo,
+                   Sound.SC3.Graph.JMCC_harmonic_swimming,
+                   Sound.SC3.Graph.JMCC_harmonic_swimming_m,
+                   Sound.SC3.Graph.JMCC_harmonic_tumbling,
+                   Sound.SC3.Graph.JMCC_harmonic_tumbling_m,
                    Sound.SC3.Graph.JMCC_hell_is_busy,
+                   Sound.SC3.Graph.JMCC_impulse_sequencer,
+                   Sound.SC3.Graph.JMCC_landon_rose,
+                   Sound.SC3.Graph.JMCC_lfo_modulation,
+                   Sound.SC3.Graph.JMCC_metal_plate,
+                   Sound.SC3.Graph.JMCC_modal_space,
+                   Sound.SC3.Graph.JMCC_modal_space_buf,
+                   Sound.SC3.Graph.JMCC_moto_rev,
+                   Sound.SC3.Graph.JMCC_mridangam,
+                   Sound.SC3.Graph.JMCC_mridangam_dr,
+                   Sound.SC3.Graph.JMCC_narrow_band_filtered_crackle_noise,
+                   Sound.SC3.Graph.JMCC_noise_burst_sweep,
+                   Sound.SC3.Graph.JMCC_noise_modulated_sawtooths,
                    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_overlap_add,
+                   Sound.SC3.Graph.JMCC_phase_modulation,
+                   Sound.SC3.Graph.JMCC_plucked_strings_m,
+                   Sound.SC3.Graph.JMCC_police_state,
+                   Sound.SC3.Graph.JMCC_police_state_m,
+                   Sound.SC3.Graph.JMCC_pond_life,
+                   Sound.SC3.Graph.JMCC_pond_life_ha,
                    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_pulsing_bottles_m,
                    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_panning_sines,
+                   Sound.SC3.Graph.JMCC_random_panning_sines_m,
+                   Sound.SC3.Graph.JMCC_random_pulsations,
                    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_random_sine_waves_she,
+                   Sound.SC3.Graph.JMCC_resonant_dust,
                    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_resonators_harmonic_series,
+                   Sound.SC3.Graph.JMCC_reso_pulse,
+                   Sound.SC3.Graph.JMCC_reverberated_noise_bursts,
                    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_ring_modulated_klank,
+                   Sound.SC3.Graph.JMCC_ring_modulate_input,
+                   Sound.SC3.Graph.JMCC_sample_and_hold_liquidities,
+                   Sound.SC3.Graph.JMCC_saucer_base,
+                   Sound.SC3.Graph.JMCC_sawed_cymbals,
                    Sound.SC3.Graph.JMCC_scratchy,
+                   Sound.SC3.Graph.JMCC_scratchy_m,
                    Sound.SC3.Graph.JMCC_sidereal_time,
-                   Sound.SC3.Graph.JMCC_birds_m,
-                   Sound.SC3.Graph.JMCC_sample_and_hold_liquidities,
+                   Sound.SC3.Graph.JMCC_sidereal_time_hp,
+                   Sound.SC3.Graph.JMCC_slow_beating_harmonic_sines,
+                   Sound.SC3.Graph.JMCC_slow_beating_sines,
+                   Sound.SC3.Graph.JMCC_snare_909,
+                   Sound.SC3.Graph.JMCC_spe_m,
+                   Sound.SC3.Graph.JMCC_spe_p,
+                   Sound.SC3.Graph.JMCC_sprinkler,
+                   Sound.SC3.Graph.JMCC_sprinkler_m,
+                   Sound.SC3.Graph.JMCC_string_wander_cluster,
+                   Sound.SC3.Graph.JMCC_strummable_guitar,
+                   Sound.SC3.Graph.JMCC_sweepy_noise,
+                   Sound.SC3.Graph.JMCC_swept_resonant_noise,
+                   Sound.SC3.Graph.JMCC_synthetic_piano_m,
+                   Sound.SC3.Graph.JMCC_tank,
+                   Sound.SC3.Graph.JMCC_tank_hp,
+                   Sound.SC3.Graph.JMCC_tank_m,
+                   Sound.SC3.Graph.JMCC_tapping_tools,
+                   Sound.SC3.Graph.JMCC_theremin,
                    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.JMCC_tremulate_hp,
+                   Sound.SC3.Graph.JMCC_tremulate_m,
+                   Sound.SC3.Graph.JMCC_tsort,
+                   Sound.SC3.Graph.JMCC_uplink,
+                   Sound.SC3.Graph.JMCC_uplink_hp,
+                   Sound.SC3.Graph.JMCC_what_was_i_thinking_m,
+                   Sound.SC3.Graph.JMCC_why_supercollider,
+                   Sound.SC3.Graph.JMCC_wind_metals_m,
+                   Sound.SC3.Graph.JMCC_zizle,
+                   Sound.SC3.Graph.JMCC_zizle_hp,
                    Sound.SC3.Graph.JP_record_scratcher,
-                   Sound.SC3.Graph.JRHB_chain_saw_m,
                    Sound.SC3.Graph.JRHB_black_atlantic_currents,
+                   Sound.SC3.Graph.JRHB_chain_saw_m,
                    Sound.SC3.Graph.JRHB_deep_sea,
-                   Sound.SC3.Graph.JRHB_half_life,
                    Sound.SC3.Graph.JRHB_dial_history_m,
+                   Sound.SC3.Graph.JRHB_half_life,
                    Sound.SC3.Graph.JRHB_sam_i_am,
+                   Sound.SC3.Graph.JR_jr_100515,
                    Sound.SC3.Graph.LJP_one_line,
                    Sound.SC3.Graph.MN_k2ws,
                    Sound.SC3.Graph.MN_k2ws_hp,
@@ -180,9 +231,14 @@
                    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_ml_2014_06_03,
                    Sound.SC3.Graph.NV_nv_tw_1,
+                   Sound.SC3.Graph.NV_nv_tw_2013_01_11,
+                   Sound.SC3.Graph.NV_nv_tw_2013_12_04,
+                   Sound.SC3.Graph.NV_nv_tw_2014_02_21,
+                   Sound.SC3.Graph.NV_nv_tw_2014_06_03,
+                   Sound.SC3.Graph.NV_nv_tw_41,
+                   Sound.SC3.Graph.NV_nv_tw_54,
                    Sound.SC3.Graph.PC_thx,
                    Sound.SC3.Graph.PJ_forest_sounds_m,
                    Sound.SC3.Graph.RB_hh_808,
@@ -199,14 +255,14 @@
                    Sound.SC3.Graph.RD_diffraction_m,
                    Sound.SC3.Graph.RD_discretion,
                    Sound.SC3.Graph.RD_discretion_m,
-                   Sound.SC3.Graph.RD_e_lamell,
-                   Sound.SC3.Graph.RD_e_lamell_p,
                    Sound.SC3.Graph.RD_eggcrate,
                    Sound.SC3.Graph.RD_eggcrate_m,
-                   Sound.SC3.Graph.RD_f_lets_m,
+                   Sound.SC3.Graph.RD_e_lamell,
+                   Sound.SC3.Graph.RD_e_lamell_p,
                    Sound.SC3.Graph.RD_fb_090531,
                    Sound.SC3.Graph.RD_fbl_fbf,
                    Sound.SC3.Graph.RD_feedr_m,
+                   Sound.SC3.Graph.RD_f_lets_m,
                    Sound.SC3.Graph.RD_fm_iter,
                    Sound.SC3.Graph.RD_fm_kltr_m,
                    Sound.SC3.Graph.RD_fm_kltr_p,
@@ -214,16 +270,18 @@
                    Sound.SC3.Graph.RD_fwalk_m,
                    Sound.SC3.Graph.RD_h_chatter_m,
                    Sound.SC3.Graph.RD_implosion_m,
+                   Sound.SC3.Graph.RD_klink,
                    Sound.SC3.Graph.RD_k_ppr,
                    Sound.SC3.Graph.RD_k_ppr_m,
-                   Sound.SC3.Graph.RD_klink,
                    Sound.SC3.Graph.RD_lf_pulses,
                    Sound.SC3.Graph.RD_lg_timed_m,
                    Sound.SC3.Graph.RD_lin_sosc,
                    Sound.SC3.Graph.RD_lso_061101_m,
+                   Sound.SC3.Graph.RD_lz_bf,
                    Sound.SC3.Graph.RD_mouse_clatter_m,
                    Sound.SC3.Graph.RD_nharm_m,
                    Sound.SC3.Graph.RD_nharm_p,
+                   Sound.SC3.Graph.RD_oscillator_cluster_m,
                    Sound.SC3.Graph.RD_pattern_buffer_m,
                    Sound.SC3.Graph.RD_rzblp,
                    Sound.SC3.Graph.RD_rzblp_hp,
@@ -233,30 +291,32 @@
                    Sound.SC3.Graph.RD_scritto,
                    Sound.SC3.Graph.RD_scritto_m,
                    Sound.SC3.Graph.RD_seqr,
+                   Sound.SC3.Graph.RD_seqr_n,
                    Sound.SC3.Graph.RD_shifting_pulses_m,
                    Sound.SC3.Graph.RD_sosc_lp_m,
                    Sound.SC3.Graph.RD_tgb_m,
-                   Sound.SC3.Graph.RD_tgr_rpr_m,
                    Sound.SC3.Graph.RD_tgrn,
+                   Sound.SC3.Graph.RD_tgr_rpr_m,
                    Sound.SC3.Graph.RD_thb,
+                   Sound.SC3.Graph.RD_three_cpsw,
                    Sound.SC3.Graph.RD_three_cpsw_m,
                    Sound.SC3.Graph.RD_tipnso,
-                   Sound.SC3.Graph.RD_tr_out_m,
                    Sound.SC3.Graph.RD_trkl_m,
                    Sound.SC3.Graph.RD_trmlo,
                    Sound.SC3.Graph.RD_trmlo_u,
+                   Sound.SC3.Graph.RD_tr_out_m,
                    Sound.SC3.Graph.RD_urandom,
                    Sound.SC3.Graph.RD_vla_addtn,
                    Sound.SC3.Graph.RD_vla_addtn_sharc,
                    Sound.SC3.Graph.RD_vlc_distrtn_m,
                    Sound.SC3.Graph.RD_voscil,
                    Sound.SC3.Graph.RD_voscil_u,
-                   Sound.SC3.Graph.RD_waveset,
                    Sound.SC3.Graph.RD_wial_m,
                    Sound.SC3.Graph.RD_xy_interference,
                    Sound.SC3.Graph.RD_xy_interference_m,
                    Sound.SC3.Graph.SC_bottle_m,
                    Sound.SC3.Graph.SP_insects_m,
+                   Sound.SC3.Graph.TB_1_4Tw,
                    Sound.SC3.Graph.TM_drummer
 
 Source-Repository  head
@@ -271,7 +331,7 @@
 Flag build-exec
  default:          False
 
--- Auto-generated: Fri Apr 5 14:49:03 EST 2013
+-- Auto-generated by sh/mk-packages.sh: Monday 13 October 17:12:27 EST 2014
 Executable hsc3-1-1Ni
  If !flag(build-exec)
   buildable: False
@@ -297,6 +357,21 @@
   buildable: False
  main-is: gr/1-4Qx.hs
  build-depends: hsc3
+Executable hsc3-1-4Tw
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/1-4Tw.hs
+ build-depends: hsc3
+Executable hsc3-1-4VL
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/1-4VL.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-1-9
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/1-9.hs
+ build-depends: hsc3
 Executable hsc3-1-Td
  If !flag(build-exec)
   buildable: False
@@ -307,6 +382,11 @@
   buildable: False
  main-is: gr/acid-otophilia.hs
  build-depends: base,hosc,hsc3,random
+Executable hsc3-adc-16-6-2
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/adc-16-6-2.hs
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-adso
  If !flag(build-exec)
   buildable: False
@@ -327,6 +407,11 @@
   buildable: False
  main-is: gr/alien-froggies.hs
  build-depends: hsc3,hsc3-lang
+Executable hsc3-alien-froggies-rec
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/alien-froggies-rec.hs
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-alien-meadow
  If !flag(build-exec)
   buildable: False
@@ -342,16 +427,51 @@
   buildable: False
  main-is: gr/analog-bubbles.hs
  build-depends: hsc3
+Executable hsc3-analog-bubbles-mouse
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/analog-bubbles-mouse.hs
+ build-depends: hsc3
+Executable hsc3-analogue-daze
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/analogue-daze.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
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/babbling-brook.hs
+ build-depends: hsc3
 Executable hsc3-babbling-brook-m
  If !flag(build-exec)
   buildable: False
  main-is: gr/babbling-brook-m.hs
  build-depends: hsc3
+Executable hsc3-berlin-1977
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/berlin-1977.hs
+ build-depends: hsc3
+Executable hsc3-birdies
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/birdies.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-birds-am-fm
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/birds-am-fm.hs
+ build-depends: base,hsc3,hsc3-lang,random
+Executable hsc3-birds
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/birds.hs
+ build-depends: hsc3
 Executable hsc3-birds-hp
  If !flag(build-exec)
   buildable: False
@@ -377,6 +497,21 @@
   buildable: False
  main-is: gr/black-atlantic-currents.hs
  build-depends: hsc3,primes,random,random-shuffle
+Executable hsc3-blips-001
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/blips-001.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-blips-001-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/blips-001-hp.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-blips-001-u
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/blips-001-u.hs
+ build-depends: hsc3,hsc3-lang,hsc3-unsafe
 Executable hsc3-bohlen-pierce-140
  If !flag(build-exec)
   buildable: False
@@ -387,6 +522,11 @@
   buildable: False
  main-is: gr/bottle-m.hs
  build-depends: hsc3,hsc3-lang
+Executable hsc3-bouncing-objects
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/bouncing-objects.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
 Executable hsc3-bowed-string-m
  If !flag(build-exec)
   buildable: False
@@ -401,7 +541,7 @@
  If !flag(build-exec)
   buildable: False
  main-is: gr/buffer-display.hs
- build-depends: base,cairo,cmath,hsc3,hsc3-cairo
+ build-depends: base,cairo,hsc3,hsc3-cairo
 Executable hsc3-ccomb-m
  If !flag(build-exec)
   buildable: False
@@ -521,7 +661,7 @@
  If !flag(build-exec)
   buildable: False
  main-is: gr/default.hs
- build-depends: data-default,hsc3,hsc3-lang
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-demanding-studies
  If !flag(build-exec)
   buildable: False
@@ -547,11 +687,21 @@
   buildable: False
  main-is: gr/discretion-m.hs
  build-depends: hsc3
+Executable hsc3-distort-input
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/distort-input.hs
+ build-depends: hsc3
 Executable hsc3-doppler
  If !flag(build-exec)
   buildable: False
  main-is: gr/doppler.hs
  build-depends: hosc,hsc3
+Executable hsc3-drone-plus-rhythm
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/drone-plus-rhythm.hs
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-drummer
  If !flag(build-exec)
   buildable: False
@@ -592,6 +742,16 @@
   buildable: False
  main-is: gr/f0-2012-04-19.hs
  build-depends: hsc3
+Executable hsc3-f0-454598285861617665
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-454598285861617665.hs
+ build-depends: hsc3
+Executable hsc3-f0-456384156159574016
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-456384156159574016.hs
+ build-depends: hsc3
 Executable hsc3-f0-tw0011
  If !flag(build-exec)
   buildable: False
@@ -607,6 +767,11 @@
   buildable: False
  main-is: gr/f0-tw0020.hs
  build-depends: hsc3
+Executable hsc3-f0-tw0026
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0026.hs
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-f0-tw0028
  If !flag(build-exec)
   buildable: False
@@ -622,6 +787,11 @@
   buildable: False
  main-is: gr/f0-tw0033.hs
  build-depends: hsc3
+Executable hsc3-f0-tw0041
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0041.hs
+ build-depends: hsc3
 Executable hsc3-f0-tw0045
  If !flag(build-exec)
   buildable: False
@@ -647,6 +817,41 @@
   buildable: False
  main-is: gr/f0-tw0084.hs
  build-depends: hsc3
+Executable hsc3-f0-tw0120
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0120.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0121
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0121.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0125
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0125.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0134
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0134.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0220
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0220.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0224
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0224.hs
+ build-depends: hsc3
+Executable hsc3-f0-tw0225
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/f0-tw0225.hs
+ build-depends: hsc3
 Executable hsc3-fb-090531
  If !flag(build-exec)
   buildable: False
@@ -662,6 +867,11 @@
   buildable: False
  main-is: gr/feedr-m.hs
  build-depends: hosc,hsc3
+Executable hsc3-filter-input
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/filter-input.hs
+ build-depends: hsc3
 Executable hsc3-f-lets-m
  If !flag(build-exec)
   buildable: False
@@ -671,7 +881,7 @@
  If !flag(build-exec)
   buildable: False
  main-is: gr/fm-iter.hs
- build-depends: hsc3
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-fm-kltr-m
  If !flag(build-exec)
   buildable: False
@@ -707,6 +917,11 @@
   buildable: False
  main-is: gr/hansm.hs
  build-depends: hosc,hsc3
+Executable hsc3-hard-sync-sawtooth-with-lfo
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/hard-sync-sawtooth-with-lfo.hs
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-harmonic-swimming
  If !flag(build-exec)
   buildable: False
@@ -717,6 +932,11 @@
   buildable: False
  main-is: gr/harmonic-swimming-m.hs
  build-depends: hsc3
+Executable hsc3-harmonic-tumbling
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/harmonic-tumbling.hs
+ build-depends: hsc3
 Executable hsc3-harmonic-tumbling-m
  If !flag(build-exec)
   buildable: False
@@ -742,6 +962,11 @@
   buildable: False
  main-is: gr/implosion-m.hs
  build-depends: hsc3
+Executable hsc3-impulse-sequencer
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/impulse-sequencer.hs
+ build-depends: hsc3
 Executable hsc3-insects-m
  If !flag(build-exec)
   buildable: False
@@ -752,6 +977,11 @@
   buildable: False
  main-is: gr/jl-1-Z.hs
  build-depends: hsc3
+Executable hsc3-jr-100515
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/jr-100515.hs
+ build-depends: hsc3,hsc3-lang,random,sc3-rdu
 Executable hsc3-k2ws
  If !flag(build-exec)
   buildable: False
@@ -787,6 +1017,11 @@
   buildable: False
  main-is: gr/k-ppr-m.hs
  build-depends: hsc3
+Executable hsc3-landon-rose
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/landon-rose.hs
+ build-depends: hsc3
 Executable hsc3-laser-bubble
  If !flag(build-exec)
   buildable: False
@@ -812,6 +1047,11 @@
   buildable: False
  main-is: gr/lin-sosc.hs
  build-depends: base,hosc,hsc3,hsc3-lang
+Executable hsc3-lp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/lp.hs
+ build-depends: hsc3
 Executable hsc3-lso-061101-m
  If !flag(build-exec)
   buildable: False
@@ -822,41 +1062,71 @@
   buildable: False
  main-is: gr/lucier.hs
  build-depends: hsc3
+Executable hsc3-lz-bf
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/lz-bf.hs
+ build-depends: hosc,hsc3
 Executable hsc3-m21360
  If !flag(build-exec)
   buildable: False
  main-is: gr/m21360.hs
  build-depends: hosc,hsc3
+Executable hsc3-metal-plate
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/metal-plate.hs
+ build-depends: hsc3
 Executable hsc3-microhelix
  If !flag(build-exec)
   buildable: False
  main-is: gr/microhelix.hs
  build-depends: hsc3
+Executable hsc3-modal-space-buf
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/modal-space-buf.hs
+ build-depends: hosc,hsc3
 Executable hsc3-modal-space
  If !flag(build-exec)
   buildable: False
  main-is: gr/modal-space.hs
- build-depends: hosc,hsc3
+ build-depends: hsc3
 Executable hsc3-moto-rev
  If !flag(build-exec)
   buildable: False
  main-is: gr/moto-rev.hs
  build-depends: hsc3
+Executable hsc3-mouse
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/mouse.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
+ build-depends: hsc3,sc3-rdu
 Executable hsc3-mridangam
  If !flag(build-exec)
   buildable: False
  main-is: gr/mridangam.hs
  build-depends: hosc,hsc3,hsc3-lang
+Executable hsc3-mridangam-dr
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/mridangam-dr.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-narrow-band-filtered-crackle-noise
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/narrow-band-filtered-crackle-noise.hs
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-nharm-m
  If !flag(build-exec)
   buildable: False
@@ -872,6 +1142,11 @@
   buildable: False
  main-is: gr/noise-burst-sweep.hs
  build-depends: hsc3,hsc3-lang
+Executable hsc3-noise-modulated-sawtooths
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/noise-modulated-sawtooths.hs
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-noise-modulated-sines
  If !flag(build-exec)
   buildable: False
@@ -887,11 +1162,36 @@
   buildable: False
  main-is: gr/non-real-time.hs
  build-depends: hosc,hsc3,process
+Executable hsc3-nv-ml-2014-06-03
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nv-ml-2014-06-03.hs
+ build-depends: hsc3
 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-2013-01-11
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nv-tw-2013-01-11.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-nv-tw-2013-12-04
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nv-tw-2013-12-04.hs
+ build-depends: hsc3
+Executable hsc3-nv-tw-2014-02-21
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nv-tw-2014-02-21.hs
+ build-depends: hsc3
+Executable hsc3-nv-tw-2014-06-03
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/nv-tw-2014-06-03.hs
+ build-depends: hsc3
 Executable hsc3-nv-tw-41
  If !flag(build-exec)
   buildable: False
@@ -932,6 +1232,21 @@
   buildable: False
  main-is: gr/pebble-beach.hs
  build-depends: hsc3
+Executable hsc3-phase-modulation
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/phase-modulation.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-pkt-00
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pkt-00.hs
+ build-depends: hsc3
+Executable hsc3-pkt-07
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pkt-07.hs
+ build-depends: base,hsc3
 Executable hsc3-pkt-26
  If !flag(build-exec)
   buildable: False
@@ -962,6 +1277,11 @@
   buildable: False
  main-is: gr/pond-life.hs
  build-depends: hsc3,hsc3-lang
+Executable hsc3-pond-life-ha
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/pond-life-ha.hs
+ build-depends: hashable,hsc3,hsc3-lang
 Executable hsc3-pond-life-hp
  If !flag(build-exec)
   buildable: False
@@ -1057,6 +1377,21 @@
   buildable: False
  main-is: gr/resonant-dust-hp.hs
  build-depends: hsc3,hsc3-lang
+Executable hsc3-resonators-harmonic-series
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/resonators-harmonic-series.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-reso-pulse
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/reso-pulse.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-reverberated-noise-bursts
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/reverberated-noise-bursts.hs
+ build-depends: hsc3
 Executable hsc3-reverberated-sine-percussion-hp
  If !flag(build-exec)
   buildable: False
@@ -1072,6 +1407,11 @@
   buildable: False
  main-is: gr/ring-modulated-klank.hs
  build-depends: hsc3,hsc3-lang,sc3-rdu
+Executable hsc3-ring-modulate-input
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/ring-modulate-input.hs
+ build-depends: hsc3
 Executable hsc3-rm-octaver
  If !flag(build-exec)
   buildable: False
@@ -1147,6 +1487,11 @@
   buildable: False
  main-is: gr/seqr.hs
  build-depends: hsc3,sc3-rdu
+Executable hsc3-seqr-n
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/seqr-n.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
 Executable hsc3-shepard-tones
  If !flag(build-exec)
   buildable: False
@@ -1227,6 +1572,11 @@
   buildable: False
  main-is: gr/sweepy-noise.hs
  build-depends: hsc3
+Executable hsc3-swept-resonant-noise
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/swept-resonant-noise.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
 Executable hsc3-synthetic-piano-m
  If !flag(build-exec)
   buildable: False
@@ -1247,6 +1597,11 @@
   buildable: False
  main-is: gr/tank-m.hs
  build-depends: hsc3
+Executable hsc3-tapping-tools
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tapping-tools.hs
+ build-depends: hsc3,hsc3-lang,sc3-rdu
 Executable hsc3-tgb-m
  If !flag(build-exec)
   buildable: False
@@ -1266,12 +1621,17 @@
  If !flag(build-exec)
   buildable: False
  main-is: gr/thb.hs
- build-depends: hmt,hosc,hsc3,hsc3-lang
+ build-depends: base,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
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/three-cpsw.hs
+ build-depends: hsc3
 Executable hsc3-three-cpsw-m
  If !flag(build-exec)
   buildable: False
@@ -1332,6 +1692,16 @@
   buildable: False
  main-is: gr/tsort.hs
  build-depends: hsc3
+Executable hsc3-tw-463992770596577280
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tw-463992770596577280.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-tw-98315246548172800
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/tw-98315246548172800.hs
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-uplink
  If !flag(build-exec)
   buildable: False
@@ -1346,12 +1716,12 @@
  If !flag(build-exec)
   buildable: False
  main-is: gr/urandom.hs
- build-depends: base,bytestring,hosc,hsc3,hsc3-lang
+ build-depends: base,binary,bytestring,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
+ build-depends: hsc3,hsc3-lang
 Executable hsc3-vla-addtn-sharc
  If !flag(build-exec)
   buildable: False
@@ -1407,3 +1777,13 @@
   buildable: False
  main-is: gr/xy-interference-m.hs
  build-depends: hsc3
+Executable hsc3-zizle
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/zizle.hs
+ build-depends: hsc3,hsc3-lang
+Executable hsc3-zizle-hp
+ If !flag(build-exec)
+  buildable: False
+ main-is: gr/zizle-hp.hs
+ build-depends: hsc3,hsc3-lang
diff --git a/sh/mk-html.sh b/sh/mk-html.sh
--- a/sh/mk-html.sh
+++ b/sh/mk-html.sh
@@ -1,5 +1,41 @@
 #!/bin/bash
-for i in *.hs
+
+d=$HOME/sw/hsc3-graphs
+s=$HOME/sw/rsc3/help/graph
+
+# FORTH
+g=$d/fs/gen.fs
+echo 0 TO FRAMES > $g
+for i in $d/gr/*.fs ; do echo HTML $(basename $i) >> $g ; done
+echo CR BYE >> $g
+(cd $d/gr ; gforth $d/fs/Forth2HTML.fs $g)
+cp $d/gr/*.fs html
+mv $d/gr/*.fsu.htm html
+
+# HASKELL
+for i in $d/gr/*.hs
 do
-    HsColour -css $i -o../html/$i.html
+    o=$d/html/$(basename $i).html
+    # if test -f $o then echo "$o exists" else ... fi
+    HsColour -css $i -o$i.html
+    mv $i.html $o
 done
+
+# SUPERCOLLIDER
+for i in $d/gr/*.scd
+do
+    o=$d/html/$(basename $i).html
+    # if test -f $o then echo "$o exists" else ... fi #
+    sh $d/sh/scd-to-html.sh $i
+    mv $i.html $o
+done
+
+# SCHEME
+for i in $s/*.scm
+do
+    o=$d/html/$(basename $i).html
+    # if test -f $o then echo "$o exists" else ... fi
+    sh $d/sh/scm-to-html.sh $i
+    mv $i.html $o
+done
+
diff --git a/sh/mk-packages.sh b/sh/mk-packages.sh
--- a/sh/mk-packages.sh
+++ b/sh/mk-packages.sh
@@ -28,5 +28,5 @@
 
 c="../hsc3-graphs.cabal"
 d=$(date)
-echo "-- Auto-generated: "$d >> $c
+echo "-- Auto-generated by sh/mk-packages.sh: "$d >> $c
 cat *.cabal >> $c
diff --git a/sh/mk-svg.sh b/sh/mk-svg.sh
--- a/sh/mk-svg.sh
+++ b/sh/mk-svg.sh
@@ -3,7 +3,13 @@
 then
     for i in dot/*.dot
     do
-        dot $i -Tsvg -o svg/$(basename $i .dot).svg
+        o=svg/$(basename $i .dot).svg
+        if test -f $o
+        then echo "$o exists"
+        else
+            echo "svg: $o"
+            dot $i -Tsvg -o $o
+        fi
     done
 fi
 
@@ -11,7 +17,13 @@
 then
     for i in dot.gz/*.dot.gz
     do
-        zcat $i | dot -Tsvg -o svg/$(basename $i .dot.gz).svg
+        o=svg/$(basename $i .dot.gz).svg
+        if test -f $o
+        then echo "$o exists"
+        else
+            echo "svg: $o"
+            zcat $i | dot -Tsvg -o $o
+        fi
     done
 fi
 
diff --git a/sh/print-fs.sh b/sh/print-fs.sh
new file mode 100644
--- /dev/null
+++ b/sh/print-fs.sh
@@ -0,0 +1,8 @@
+d=~/sw/hsc3-graphs
+
+for i in gr/*.fs ; do
+    cat $i
+    echo
+    echo "( ----------------------------------------------------------------------------- )"
+    echo
+done
diff --git a/sh/scd-to-html.sh b/sh/scd-to-html.sh
new file mode 100644
--- /dev/null
+++ b/sh/scd-to-html.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+d=$HOME/sw/hsc3-graphs/
+f=$1
+g=$f.html
+
+echo scd-to-html d=$d f=$f g=$g
+
+rm -f $g
+cat $d/html/scd/pre.html > $g
+cat $f >> $g
+cat $d/html/scd/post.html >> $g
diff --git a/sh/scm-to-html.sh b/sh/scm-to-html.sh
new file mode 100644
--- /dev/null
+++ b/sh/scm-to-html.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+d=$HOME/sw/hsc3-graphs/
+f=$1
+g=$f.html
+
+echo scm-to-html d=$d f=$f g=$g
+
+rm -f $g
+cat $d/html/scm/pre.html > $g
+cat $f >> $g
+cat $d/html/scm/post.html >> $g
diff --git a/sh/statistics.sh b/sh/statistics.sh
--- a/sh/statistics.sh
+++ b/sh/statistics.sh
@@ -1,8 +1,9 @@
-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
+echo adc; grep \(adc\) */*.hs | wc -l
+echo am; grep \(am\) */*.hs | wc -l
+echo f0; grep \(f0\) */*.hs | wc -l
+echo jl; grep \(jl\) */*.hs | wc -l
+echo jmcc; grep \(jmcc\) */*.hs | wc -l
+echo jrhb; grep \(jrhb\) */*.hs | wc -l
+echo nc; grep \(nc\) */*.hs | wc -l
+echo nv; grep \(nv\) */*.hs | wc -l
+echo rd; grep \(rd\) */*.hs | wc -l
