diff --git a/README b/README
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
 hsc3-graphs - haskell supercollider graphs
 
-hsc3-graphs provides a collection of illustrative 
+hsc3-graphs provides a collection of illustrative
 unit generator graphs for hsc3.
 
   http://slavepianos.org/rd/?t=hsc3-graphs
diff --git a/hsc3-graphs.cabal b/hsc3-graphs.cabal
--- a/hsc3-graphs.cabal
+++ b/hsc3-graphs.cabal
@@ -1,7 +1,7 @@
 Name:              hsc3-graphs
-Version:           0.9
+Version:           0.11
 Synopsis:          Haskell SuperCollider Graphs
-Description:       hsc3-graphs provides a collection of illustrative 
+Description:       hsc3-graphs provides a collection of illustrative
                    unit generator graphs for hsc3.
 License:           GPL
 Category:          Sound
@@ -10,411 +10,698 @@
 Maintainer:        rd@slavepianos.org
 Stability:         Experimental
 Homepage:          http://slavepianos.org/rd/?t=hsc3-graphs
-Tested-With:       GHC == 6.12.1
+Tested-With:       GHC == 7.0.4
 Build-Type:        Simple
-Cabal-Version:     >= 1.6
+Cabal-Version:     >= 1.8
 
 Data-files:        README
+                   src/*.scd
+                   src/*.scm
 
+Executable         hsc3-acid-otophilia
+ main-is:          src/acid-otophilia.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, random
+
 Executable         hsc3-adso
- main-is:          src/adso.lhs
- build-depends:    base==4.*, hosc==0.9, hsc3==0.9, random
+ main-is:          src/adso.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, random
 
+Executable         hsc3-after-goeyvaerts
+ main-is:          src/after-goeyvaerts.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-lang==0.11.*,
+                   containers, random, split
+
 Executable         hsc3-aleatoric-quartet
- main-is:          src/aleatoric-quartet.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/aleatoric-quartet-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-alien-froggies
+ main-is:          src/alien-froggies.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-alien-meadow
+ main-is:          src/alien-meadow.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-ambient1
+ main-is:          src/ambient1.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-analog-bubbles
- main-is:          src/analog-bubbles.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/analog-bubbles.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-arpeggio
+ main-is:          src/arpeggio.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-babbling-brook
- main-is:          src/babbling-brook.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/babbling-brook-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-birds
- main-is:          src/birds.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/birds-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-bit-reduction
- main-is:          src/bit-reduction.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/bit-reduction.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-black-atlantic-currents
+ main-is:          src/black-atlantic-currents.hs
+ build-depends:    base==4.*, hsc3==0.11.*, primes, random, random-shuffle
+
+Executable         hsc3-bohlen-pierce-140
+ main-is:          src/bohlen-pierce-140.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-bottle
- main-is:          src/bottle.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/bottle-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-bowed-string
- main-is:          src/bowed-string.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/bowed-string-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*, random
 
+Executable         hsc3-bs-070705
+ main-is:          src/bs-070705.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hosc==0.11.*, random
+
 Executable         hsc3-ccomb
- main-is:          src/ccomb.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/ccomb.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-cds-070701
+ main-is:          src/cds-070701.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hosc==0.11.*
+
 Executable         hsc3-chain-saw
- main-is:          src/chain-saw.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/chain-saw.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*, random
 
-Executable         hsc3-chrd
- main-is:          src/chrd.lhs
- build-depends:    base==4.*, hsc3==0.9
+Executable         hsc3-choip
+ main-is:          src/choip.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+Executable         hsc3-chrd-m
+ main-is:          src/chrd-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-chrd-t
+ main-is:          src/chrd-t.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*, MonadRandom
+
+Executable         hsc3-clustered-sines
+ main-is:          src/clustered-sines.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-comb-delay-sweeps
+ main-is:          src/comb-delay-sweeps.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*, random
+
+Executable         hsc3-coolant
+ main-is:          src/coolant.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-contamination-zone
+ main-is:          src/contamination-zone.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-cricket
- main-is:          src/cricket.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/cricket.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-crotale
- main-is:          src/crotale.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/crotale.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-crotale-sine
- main-is:          src/crotale-sine.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/crotale-sine.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-cut-outs
- main-is:          src/cut-outs.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/cut-outs.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-cymbalism
- main-is:          src/cymbalism.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/cymbalism.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+Executable         hsc3-cymbalism-accelerando
+ main-is:          src/cymbalism-accelerando.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-dark-sea-horns
+ main-is:          src/dark-sea-horns.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-data-space
+ main-is:          src/data-space.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-deep-sea
- main-is:          src/deep-sea.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/deep-sea.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*, random
 
+Executable         hsc3-deep-trip
+ main-is:          src/deep-trip.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-default
- main-is:          src/default.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/default.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-demanding-studies
- main-is:          src/demanding-studies.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/demanding-studies.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-dial-history
- main-is:          src/dial-history.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/dial-history.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-diffraction
- main-is:          src/diffraction.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/diffraction.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-discretion
- main-is:          src/discretion.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/discretion.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-discretion-m
+ main-is:          src/discretion-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-doppler
+ main-is:          src/doppler.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hosc==0.11.*
+
 Executable         hsc3-drummer
- main-is:          src/drummer.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/drummer.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-early-space-music-lp-side-two
+ main-is:          src/early-space-music-lp-side-two.hs
+ build-depends:    base==4.*,hosc==0.11.*,hsc3==0.11.*,hsc3-lang==0.11.*,random
+
 Executable         hsc3-eggcrate
- main-is:          src/eggcrate.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/eggcrate.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-eggcrate-m
+ main-is:          src/eggcrate-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-e-lamell
- main-is:          src/e-lamell.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/e-lamell.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+Executable         hsc3-e-lamell-p
+ main-is:          src/e-lamell-p.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-ellipse-based-synthesis
+ main-is:          src/ellipse-based-synthesis.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-fbl-fbf
- main-is:          src/fbl-fbf.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/fbl-fbf.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
-Executable         hsc3-feedr
- main-is:          src/feedr.lhs
- build-depends:    base==4.*, hsc3==0.9
+Executable         hsc3-fb-090531
+ main-is:          src/fb-090531.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hosc==0.11.*, random
 
+--Executable         hsc3-feedr
+-- main-is:          src/feedr.hs
+-- build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-f-lets
- main-is:          src/f-lets.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/f-lets.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-fm-iter
- main-is:          src/fm-iter.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/fm-iter.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-fm-kltr
- main-is:          src/fm-kltr.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/fm-kltr.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, random
 
+Executable         hsc3-fm-kltr-p
+ main-is:          src/fm-kltr-p.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-forest-sounds
- main-is:          src/forest-sounds.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/forest-sounds.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-fwalk
- main-is:          src/fwalk.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/fwalk.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-half-life
- main-is:          src/half-life.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/half-life.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-hansm
  main-is:          src/hansm.hs
- build-depends:    base==4.*, hosc==0.9, hsc3==0.9
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-harmonic-swimming
- main-is:          src/harmonic-swimming.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/harmonic-swimming.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-harmonic-swimming-m
+ main-is:          src/harmonic-swimming-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-harmonic-tumbling
- main-is:          src/harmonic-tumbling.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/harmonic-tumbling.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-h-chatter
- main-is:          src/h-chatter.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/h-chatter.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-hell-is-busy
+ main-is:          src/hell-is-busy.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-hh-808
- main-is:          src/hh-808.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/hh-808.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-implosion
- main-is:          src/implosion.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/implosion.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-insects
- main-is:          src/insects.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/insects.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-jl-1-Z
+ main-is:          src/jl-1-Z.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-kabelscahden
+ main-is:          src/kabelscahden.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-karplus-strong
- main-is:          src/karplus-strong.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/karplus-strong.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-klink
- main-is:          src/klink.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/klink.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-k-ppr
- main-is:          src/k-ppr.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/k-ppr.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-k-ppr-m
+ main-is:          src/k-ppr-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-lfo-modulation
- main-is:          src/lfo-modulation.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/lfo-modulation.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-lf-pulses
- main-is:          src/lf-pulses.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/lf-pulses.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-lg-timed
- main-is:          src/lg-timed.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/lg-timed.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-lin-sosc
- main-is:          src/lin-sosc.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/lin-sosc.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+Executable         hsc3-lso-061101
+ main-is:          src/lso-061101.hs
+ build-depends:    base==4.*, directory, filepath, hls, hosc==0.11.*, hps, hsc3==0.11.*, hsc3-sf, random
+
 Executable         hsc3-lucier
  main-is:          src/lucier.hs
- build-depends:    base==4.*, hsc3==0.9
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-microhelix
+ main-is:          src/microhelix.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-mridangam
+ main-is:          src/mridangam.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-modal-space
- main-is:          src/modal-space.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/modal-space.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-moto-rev
- main-is:          src/moto-rev.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/moto-rev.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-mouse-clatter
- main-is:          src/mouse-clatter.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/mouse-clatter-m.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-nharm
- main-is:          src/nharm.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/nharm.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, random
 
+Executable         hsc3-nharm-p
+ main-is:          src/nharm-p.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-noise-burst-sweep
- main-is:          src/noise-burst-sweep.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/noise-burst-sweep.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+Executable         hsc3-noise-modulated-sines
+ main-is:          src/noise-modulated-sines.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-non-real-time
  main-is:          src/non-real-time.hs
- build-depends:    base==4.*, hosc==0.9, hsc3==0.9, process
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, process
 
+Executable         hsc3-nv-tw-1
+ main-is:          src/nv-tw-1.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-nv-tw-41
+ main-is:          src/nv-tw-41.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-nv-tw-54
+ main-is:          src/nv-tw-54.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-one-line
- main-is:          src/one-line.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/one-line.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-oscillator-cluster
- main-is:          src/oscillator-cluster.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/oscillator-cluster.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-overlap-add
- main-is:          src/overlap-add.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/overlap-add.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-pattern-buffer
- main-is:          src/pattern-buffer.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/pattern-buffer.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, random
 
+Executable         hsc3-pebble-beach
+ main-is:          src/pebble-beach.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-plucked-strings
- main-is:          src/plucked-strings.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/plucked-strings.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-police-state
- main-is:          src/police-state.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/police-state.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-pulsing-bottles
- main-is:          src/pulsing-bottles.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/pulsing-bottles.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+Executable         hsc3-pulsing-bottles-m
+ main-is:          src/pulsing-bottles-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-rails
+ main-is:          src/rails.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-rain-thunder
+ main-is:          src/rain-thunder.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-random-panning-sines
+ main-is:          src/random-panning-sines.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-random-panning-sines-m
+ main-is:          src/random-panning-sines-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-random-pulsations
+ main-is:          src/random-pulsations.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-random-sine-waves
+ main-is:          src/random-sine-waves.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-record-scratcher
- main-is:          src/record-scratcher.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/record-scratcher.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-red-frik
- main-is:          src/red-frik.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/red-frik.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-reset
  main-is:          src/reset.hs
- build-depends:    base==4.*, hsc3==0.9
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-resonant-dust
+ main-is:          src/resonant-dust.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-reverberated-sine-percussion
- main-is:          src/reverberated-sine-percussion.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/reverberated-sine-percussion.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
-Executable         hsc3-rm-octaver
- main-is:          src/rm-octaver.lhs
- build-depends:    base==4.*, hsc3==0.9
+Executable         hsc3-ring-modulated-klank
+ main-is:          src/ring-modulated-klank.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+--Executable         hsc3-rm-octaver
+-- main-is:          src/rm-octaver.hs
+-- build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-rzblp
+ main-is:          src/rzblp.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-unsafe==0.11.*
+
+Executable         hsc3-sam-i-am
+ main-is:          src/sam-i-am.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*, MonadRandom
+
 Executable         hsc3-sample-and-hold-liquidities
- main-is:          src/sample-and-hold-liquidities.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/sample-and-hold-liquidities.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-saucer-base
+ main-is:          src/saucer-base.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-sawed-cymbals
+ main-is:          src/sawed-cymbals.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-s-chirp
- main-is:          src/s-chirp.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/s-chirp.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-scratchy
- main-is:          src/scratchy.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/scratchy.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-scratchy-m
- main-is:          src/scratchy-m.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/scratchy-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-scritto
- main-is:          src/scritto.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/scritto.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+Executable         hsc3-scritto-m
+ main-is:          src/scritto-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-seqr
+ main-is:          src/seqr.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-shepard-tones
- main-is:          src/shepard-tones.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/shepard-tones.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-shifting-pulses
- main-is:          src/shifting-pulses.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/shifting-pulses.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-sidereal-time
+ main-is:          src/sidereal-time.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-slow-beating-harmonic-sines
+ main-is:          src/slow-beating-harmonic-sines.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*, MonadRandom
+
+Executable         hsc3-slow-beating-sines
+ main-is:          src/slow-beating-sines.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*, MonadRandom
+
 Executable         hsc3-snare-909
- main-is:          src/snare-909.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/snare-909.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
-Executable         hsc3-sosc-lp
- main-is:          src/sosc-lp.lhs
- build-depends:    base==4.*, hsc3==0.9
+--Executable         hsc3-sosc-lp
+-- main-is:          src/sosc-lp.hs
+-- build-depends:    base==4.*, hsc3==0.11.*
 
-Executable         hsc3-spe
- main-is:          src/spe.lhs
- build-depends:    base==4.*, hsc3==0.9
+Executable         hsc3-spe-m
+ main-is:          src/spe-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-spe-p
+ main-is:          src/spe-p.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-sprinkler
- main-is:          src/sprinkler.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/sprinkler.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-sprinkler-m
- main-is:          src/sprinkler-m.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/sprinkler-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-string-wander-cluster
+ main-is:          src/string-wander-cluster.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*, random
+
 Executable         hsc3-strummable-guitar
- main-is:          src/strummable-guitar.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/strummable-guitar.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-sweepy-noise
- main-is:          src/sweepy-noise.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/sweepy-noise.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-synthetic-piano
- main-is:          src/synthetic-piano.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/synthetic-piano-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-tank
- main-is:          src/tank.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/tank.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-tank-m
+ main-is:          src/tank-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-tgb
- main-is:          src/tgb.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/tgb.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, random
 
 Executable         hsc3-tgrn
- main-is:          src/tgrn.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/tgrn.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-tgr-rpr
- main-is:          src/tgr-rpr.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/tgr-rpr.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, random
 
 Executable         hsc3-theremin
- main-is:          src/theremin.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/theremin.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-three-cpsw
- main-is:          src/three-cpsw.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/three-cpsw.hs
+ build-depends:    base==4.*, hsc3==0.11.*, random
 
 Executable         hsc3-thx
- main-is:          src/thx.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/thx.hs
+ build-depends:    base==4.*, hsc3==0.11.*, random
 
 Executable         hsc3-tipnso
- main-is:          src/tipnso.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/tipnso.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-train
- main-is:          src/train.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/train.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
-Executable         hsc3-trkl
- main-is:          src/trkl.lhs
- build-depends:    base==4.*, hsc3==0.9
+Executable         hsc3-tremulate
+ main-is:          src/tremulate.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+Executable         hsc3-tremulate-m
+ main-is:          src/tremulate-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+--Executable         hsc3-trkl
+-- main-is:          src/trkl.hs
+-- build-depends:    base==4.*, hsc3==0.11.*
+
+Executable         hsc3-trmlo
+ main-is:          src/trmlo.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-unsafe==0.11.*, hsc3-lang==0.11.*
+
 Executable         hsc3-tr-out
- main-is:          src/tr-out.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/tr-out.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*
 
 Executable         hsc3-tsort
  main-is:          src/tsort.lhs
- build-depends:    base==4.*, hsc3==0.9
+ build-depends:    base==4.*, hsc3==0.11.*
 
-Executable         hsc3-vlc-distrtn
- main-is:          src/vlc-distrtn.lhs
- build-depends:    base==4.*, hsc3==0.9
+Executable         hsc3-uplink
+ main-is:          src/uplink.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
+Executable         hsc3-voscil
+ main-is:          src/voscil.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-unsafe==0.11.*, random
+
+Executable         hsc3-vla-addtn
+ main-is:          src/vla-addtn.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-lang==0.11.*
+
+Executable         hsc3-vla-addtn-sharc
+ main-is:          src/vla-addtn-sharc.hs
+ build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-lang==0.11.*, hsharc==0.11.*
+
+--Executable         hsc3-vlc-distrtn
+-- main-is:          src/vlc-distrtn.hs
+-- build-depends:    base==4.*, hosc==0.11.*, hsc3==0.11.*, random
+
 Executable         hsc3-waveset
  main-is:          src/waveset.hs
- build-depends:    array, base==4.*, hosc==0.9, hsc3==0.9, hsc3-sf==0.9, random
+ build-depends:    array, base==4.*, hosc==0.11.*, hsc3==0.11.*, hsc3-sf==0.11.*, random
 
 Executable         hsc3-what-was-i-thinking
- main-is:          src/what-was-i-thinking.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/what-was-i-thinking.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
+Executable         hsc3-why-supercollider
+ main-is:          src/why-supercollider.hs
+ build-depends:    base==4.*, hsc3==0.11.*
+
 Executable         hsc3-wial
- main-is:          src/wial.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/wial.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-wind-metals
- main-is:          src/wind-metals.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/wind-metals-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*, hsc3-lang==0.11.*
 
 Executable         hsc3-xy-interference
- main-is:          src/xy-interference.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/xy-interference.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Executable         hsc3-xy-interference-m
- main-is:          src/xy-interference-m.lhs
- build-depends:    base==4.*, hsc3==0.9
+ main-is:          src/xy-interference-m.hs
+ build-depends:    base==4.*, hsc3==0.11.*
 
 Source-Repository  head
   Type:            darcs
diff --git a/src/acid-otophilia.hs b/src/acid-otophilia.hs
new file mode 100644
--- /dev/null
+++ b/src/acid-otophilia.hs
@@ -0,0 +1,235 @@
+-- 08091500Acid309 by_otophilia
+
+import Data.List
+import Data.Maybe
+import Sound.OpenSoundControl {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import System.Random {- random -}
+
+-- * Instruments
+
+mk_ec :: [UGen] -> [EnvCurve]
+mk_ec = map EnvNum
+
+mk_env :: [UGen] -> [UGen] -> [UGen] -> [UGen]
+mk_env l t c = env l t (mk_ec c) 0 0
+
+kick :: Synthdef
+kick =
+    let bus = control KR "outBus" 0
+        env0 = let d = mk_env [0.5,1,0.5,0] [0.005,0.06,0.26] [-4,-2,-4]
+               in envGen AR 1 1 0 1 RemoveSynth d
+        env1 = let d = mk_env [110,59,29] [0.005,0.29] [-4,-5]
+               in midiCPS (envGen AR 1 1 0 1 DoNothing d)
+	s = let p = lfPulse AR env1 0 0.5 - 0.5
+                q = p + mce2 (whiteNoise 'a' AR) (whiteNoise 'b' AR)
+                r = lpf q (env1 * 1.5) * env0
+            in clip2 (r + sinOsc AR env1 0.5 * env0 * 1.2) 1
+    in synthdef "kick" (out bus s)
+
+snare :: Synthdef
+snare =
+    let bus = control KR "outBus" 0
+        amp = control KR "amp" 0.8
+        env0 = let d = mk_env [0.5,1,0.5,0] [0.005,0.03,0.10] [-4,-2,-4]
+               in envGen AR 1 1 0 1 DoNothing d
+        env1 = let d = mk_env [110,60,49] [0.005,0.1] [-4,-5]
+               in midiCPS (envGen AR 1 1 0 1 DoNothing d)
+        env2 = let d = mk_env [1,0.4,0] [0.05,0.13] [-2,-2]
+               in envGen AR 1 1 0 1 RemoveSynth d
+	oscs = let p = lfPulse AR env1 0 0.5 - 0.5
+                   q = lfPulse AR (env1 * 1.6) 0 0.5 * 0.5 - 0.25
+                   r = lpf (p + q) (env1 * 1.2) * env0
+               in r + sinOsc AR env1 0.8 * env0
+	noise = let p = mce2 (whiteNoise 'a' AR) (whiteNoise 'b' AR) * 0.2
+                    q = hpf p 200 * 2
+                    r = bpf q 6900 0.6 * 3 + p
+	        in r * env2
+	s = clip2 (oscs + noise) 1 * amp
+    in synthdef "snare" (out bus s)
+
+clap :: Synthdef
+clap =
+    let bus = control KR "outBus" 0
+        amp = control KR "amp" 0.5
+        env1 = let d = mk_env [0,1,0,1,0,1,0,1,0]
+                              [0.001,0.013,0,0.01,0,0.01,0,0.03]
+                              [0,-3,0,-3,0,-3,0,-4]
+               in envGen AR 1 1 0 1 DoNothing d
+        env2 = let d = mk_env [0,1,0] [0.02,0.3] [0,-4]
+               in envGen AR 1 1 0 1 RemoveSynth d
+	noise1 = let p = mce2 (whiteNoise 'a' AR) (whiteNoise 'a' AR) * env1
+                     q = hpf p 600
+                 in bpf q 2000 3
+	noise2 = let p = mce2 (whiteNoise 'a' AR) (whiteNoise 'a' AR) * env2
+                     q = hpf p 1000
+                 in bpf q 1200 0.7 * 0.7
+	s = let p = noise1 + noise2
+	    in softClip (p * 2) * amp
+    in synthdef "clap" (out bus s)
+
+hat :: Synthdef
+hat =
+    let bus = control KR "outBus" 0
+        amp = control KR "amp" 0.3
+        env1 = let d = mk_env [0,1.0,0] [0.001,0.2] [0,-12]
+               in envGen AR 1 1 0 1 DoNothing d
+        env2 = let d = mk_env [0,1.0,0.05,0] [0.002,0.05,0.03] [0,-4,-4]
+               in envGen AR 1 1 0 1 RemoveSynth d
+        (r0:r1:r2:_) = randomRs (-4.0,4.0) (mkStdGen 5)
+	oscs1 = let n1 = 5
+                    f i = let f0 = midiCPS (linLin i 0 (n1-1) 42 75 + r0)
+                              f1 = midiCPS (linLin i 0 (n1-1) 78 80 + r1)
+                          in sinOsc AR f0 (sinOsc AR f1 0 * 12) * (1/n1)
+                    p = sum (map f [0..n1-1])
+                in bHiPass p 1000 2 * env1
+        noise = let n2 = 8
+                    p = whiteNoise 'a' AR
+                    f i = let t = 1 / midiCPS (linLin i 0 (n2-1) 40 50 + r2)
+                          in combN p 0.05 t 0.1
+                    q = sum (map f [0..n2-1]) * (1/n2) + p
+                    r = bpf q 6000 0.9 * 0.5 + q
+                in bHiPass (bLowShelf r 3000 0.5 (-6)) 1000 1.5 * env2
+        s = softClip (noise + oscs1) * amp
+    in synthdef "hat" (out bus s)
+
+acid :: Synthdef
+acid =
+    let bus = control KR "outBus" 0
+        gate' = control KR "gate" 1
+        pitch' = control KR "pitch" 50
+        amp = control KR "amp" 0.3
+	pitch'' = lag pitch' 0.12 * (1 - trig gate' 0.001) * gate'
+        env1 = let d = env [0,1,0,0] [0.001,2,0.04] (mk_ec [0,-4,-4]) 2 0
+               in envGen AR gate' amp 0 1 DoNothing d
+        env2 = let d = envADSR 0.001 0.8 0 0.8 70 (EnvNum (-4)) 0
+               in envGen AR gate' 1 0 1 DoNothing d
+	s = let p = lfPulse AR (midiCPS pitch'') 0.0 0.51 * 2 - 1
+                q = rlpf p (midiCPS (pitch'' + env2)) 0.3
+	    in q * env1
+    in synthdef "acid" (out bus (mce2 s s))
+
+fx :: Synthdef
+fx =
+    let bus = control KR "outBus" 0
+        gate' = control KR "gate" 0
+	i = in' 2 AR bus
+        e = let d = env [0.02,0.3,0.02] [0.4,0.01] (mk_ec [3,-4]) 1 0
+            in envGen KR (1 - trig gate' 0.01) 1 0 1 DoNothing d
+        r = let MCE [i0,i1] = i
+            in freeVerb2 (bpf i0 3500 1.5) (bpf i1 3500 1.5) 1 0.95 0.15 * e
+        s = limiter (hpf ((i + r) * 1.2) 40) 1 0.02
+    in synthdef "fx" (replaceOut bus s)
+
+-- * Sequences
+
+type D = [Int]
+
+dr_seq :: Num a => [[[a]]]
+dr_seq =
+    let s = [[[1,0,0,0, 0,0,0,0, 1,0,0,1, 0,0,1,0]
+             ,[0,0,0,0, 0,0,0,2, 0,2,1,0, 4,3,3,3]
+             ,[0,0,0,0, 4,0,0,0, 0,0,0,0, 4,0,0,0]
+             ,[1,2,4,0, 1,0,4,0, 1,2,4,2, 1,0,4,2]
+             ,[1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0]]
+            ,[[0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]
+             ,[0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]
+             ,[0,0,0,0, 4,0,0,0, 0,0,0,0, 4,0,0,0]
+             ,[1,2,4,0, 1,0,4,0, 1,2,4,2, 1,0,4,2]
+             ,[1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0]]
+            ,[[1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0]
+             ,[0,0,0,0, 0,0,0,2, 0,0,0,0, 0,0,0,0]
+             ,[0,0,0,0, 4,0,0,0, 0,0,0,0, 4,0,0,0]
+             ,[1,2,4,0, 1,0,4,0, 1,2,4,2, 1,0,4,2]
+             ,[1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0]]
+            ,[[1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0]
+             ,[0,0,0,0, 4,0,0,2, 0,0,0,0, 4,0,0,0]
+             ,[0,0,0,0, 0,0,0,0, 0,0,0,0, 4,0,0,0]
+             ,[1,2,4,0, 1,0,4,0, 1,2,4,2, 1,0,4,2]
+             ,[1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0]]]
+    in map transpose s
+
+dr_msg :: Int -> (Int,Int) -> Maybe OSC
+dr_msg fx_id (i,x) =
+    let m nm pr = Just (s_new nm (-1) AddToHead 1 pr)
+        x' = fromIntegral x
+        sq n = n * n
+    in case i of
+         0 -> if x > 0 then m "kick" [] else Nothing
+         1 -> if x > 0 then m "snare" [("amp",sq (x'/4) * 0.7)] else Nothing
+         2 -> if x > 0 then m "clap" [("amp",sq (x'/4) * 0.5)] else Nothing
+         3 -> if x > 0 then m "hat" [("amp",sq (x'/4) * 0.32)] else Nothing
+         4 -> Just (n_set fx_id [("gate",x')])
+         _ -> error "dr_seq_msg"
+
+dr_seq_msg :: Int -> Double -> D -> OSC
+dr_seq_msg fx_id t =
+    Bundle (UTCr t) .
+    mapMaybe (dr_msg fx_id) .
+    zip [0..]
+
+b_seq :: Num a => [[a]]
+b_seq =
+    let s = [[1,1,1,1, 1,1,1,1, 0,1,0,1, 1,1,1,0]
+            ,[1,1,0,2, 1,1,0,0, 2,0,2,0, 1,2,0,4]
+            ,map (+ 38) [-24,-12,0,-12, 0,-12,10,12, 0,7,-7,0, -11,1,13,15]]
+    in transpose s
+
+type B = (Int,Double,Double)
+
+b_form :: [Int] -> B
+b_form xs =
+    let i = fromIntegral
+    in case xs of
+         [b1,b2,b3] -> (b1,i b2,i b3)
+         _ -> error "b_form"
+
+b_seq_msg :: Int -> Double -> Double -> B -> [OSC]
+b_seq_msg acid_id dt t (b0,b1,b2) =
+    let on = let p = n_set acid_id [("pitch",b2)]
+                 m = if b0 == 1
+                     then [p,n_set acid_id [("gate",1)]]
+                     else [p]
+             in Bundle (UTCr t) m
+        off = let end_t = t + (dt * b1 * 0.25 * 0.99)
+              in Bundle (UTCr end_t) [n_set acid_id [("gate",0)]]
+    in if b1 > 0 then [on,off] else [on]
+
+-- * Runtime
+
+ao_init :: Transport t => t -> IO (Int,Int)
+ao_init fd = do
+  let i = [kick,snare,clap,hat,acid,fx]
+  _ <- async fd (Bundle immediately (map d_recv i))
+  let acid_id = 10
+      fx_id = 11
+  send fd (s_new "acid" acid_id AddToHead 1 [("gate",0)])
+  send fd (s_new "fx" fx_id AddToTail 1 [])
+  return (acid_id,fx_id)
+
+dt_seq :: Double -> [Double]
+dt_seq bpm =
+    let shf = 0.16
+        n = 60 / bpm
+        dt i = if i `mod` 2 == 0 then 0.25 * (1 + shf) else 0.25 * (1 - shf)
+    in map ((* n) . dt) ([0..]::[Int])
+
+ao_run_seq :: Transport t => t -> (Int,Int) -> [D] -> [B] -> IO ()
+ao_run_seq fd (acid_id,fx_id) d_sq b_sq = do
+  init_t <- utcr
+  let dt_seq' = dt_seq 130
+      t_seq = scanl1 (+) (init_t : dt_seq')
+      act (t,dt,d,b) =
+          do send fd (dr_seq_msg fx_id t d)
+             mapM_ (send fd) (b_seq_msg acid_id dt t b)
+             pauseThreadUntil t
+  mapM_ act (zip4 t_seq dt_seq' d_sq b_sq)
+
+main :: IO ()
+main =
+    let act fd = do
+          let d_sq = cycle (concat dr_seq)
+              b_sq = map b_form (cycle b_seq)
+          ids <- ao_init fd
+          ao_run_seq fd ids d_sq b_sq
+  in withSC3 act
diff --git a/src/adso.hs b/src/adso.hs
new file mode 100644
--- /dev/null
+++ b/src/adso.hs
@@ -0,0 +1,50 @@
+-- adso (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3
+import System.Random
+
+getb :: Real a => UGen -> a -> UGen
+getb b j =
+    let k = mce [0 .. constant j - 1]
+    in bufRdN 1 KR b k NoLoop
+
+adso :: Real a => a -> UGen
+adso n =
+    let m = sinOsc KR (getb 3 n) 0
+        f = midiCPS (getb 0 n) * (m * getb 4 n + 1)
+        l = getb 2 n
+        g = getb 1 n
+    in mix (pan2 (sinOsc AR f 0) l g)
+
+rrand :: Random a => a -> a -> IO a
+rrand l r = getStdRandom (randomR (l, r))
+
+rrand_l :: Random a => Int -> a -> a -> IO [a]
+rrand_l j l r = sequence (replicate j (rrand l r))
+
+pattern :: Transport t => t -> Int -> Double -> IO ()
+pattern fd n t = do
+  z <- do l <- rrand 22 48
+          r <- rrand 54 122
+          sequence (replicate n (rrand l r))
+  send fd (b_setn1 0 0 z)
+  let rn i l r = do d <- rrand_l n l r
+                    send fd (b_setn1 i 0 d)
+  rn 1 0 0.1
+  rn 2 (-1) 1
+  rn 3 2 12
+  rn 4 0.001 0.0075
+  rn 5 1 24
+  rn 6 0.05 2.4
+  pauseThread t
+
+run :: Transport t => Int -> t -> IO ()
+run n fd = do
+  mapM_ (\i -> async fd (b_alloc i n 1)) [0..6]
+  _ <- play fd (out 0 (adso n))
+  mapM_ (pattern fd n) =<< rrand_l 32 0.025 0.75
+  reset fd
+
+main :: IO ()
+main = withSC3 (run 24)
diff --git a/src/adso.lhs b/src/adso.lhs
deleted file mode 100644
--- a/src/adso.lhs
+++ /dev/null
@@ -1,34 +0,0 @@
-adso (rd)
-
-> import Sound.OpenSoundControl
-> import Sound.SC3
-> import System.Random
-
-> main =
->   let { rrand l r = getStdRandom (randomR (l, r))
->       ; rrand_l j l r = sequence (replicate j (rrand l r))
->       ; n = 24
->       ; adso = let { get b j = let k = mce [0 .. constant j - 1]
->                                in bufRdN 1 kr b k NoLoop
->                    ; m = sinOsc kr (get 3 n) 0
->                    ; f = midiCPS (get 0 n) * (m * get 4 n + 1)
->                    ; l = get 2 n
->                    ; g = get 1 n }
->                in out 0 (mix (pan2 (sinOsc ar f 0) l g))
->       ; pattern fd t = do { z <- do { l <- rrand 22 48
->                                     ; r <- rrand 54 122
->                                     ; sequence (replicate n (rrand l r)) }
->                           ; send fd (b_setn1 0 0 z)
->                           ; let rn i l r = do { d <- rrand_l n l r
->                                               ; send fd (b_setn1 i 0 d) }
->                             in do { rn 1 0 0.1
->                                   ; rn 2 (-1) 1
->                                   ; rn 3 2 12
->                                   ; rn 4 0.001 0.0075
->                                   ; rn 5 1 24
->                                   ; rn 6 0.05 2.4 }
->                           ; pauseThread t } }
->   in withSC3 (\fd ->   do { mapM_ (\i ->   async fd (b_alloc i n 1)) [0..6]
->                         ; play fd adso
->                         ; mapM_ (pattern fd) =<< rrand_l 32 0.025 0.75
->                         ; reset fd })
diff --git a/src/after-goeyvaerts.hs b/src/after-goeyvaerts.hs
new file mode 100644
--- /dev/null
+++ b/src/after-goeyvaerts.hs
@@ -0,0 +1,366 @@
+-- after goeyvaerts, nick collins, 2007
+
+import Control.Concurrent.MVar
+import Data.List
+import Data.List.Split
+import qualified Data.Map as M {- containers -}
+import Sound.OpenSoundControl {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import qualified Sound.SC3.Lang.Collection as C {- hsc3-lang -}
+import qualified Sound.SC3.Lang.Random.Gen as R
+import System.Random {- random -}
+
+-- * SCHEMA
+
+-- | infinite monadic recursion
+mrec :: Monad m => (a -> m a) -> a -> m a
+mrec f i = f i >>= mrec f
+
+-- | monadic recursion with counter
+mrec_n :: Monad m => Int -> (a -> m a) -> a -> m a
+mrec_n n f i =
+    if n == 0
+    then return i
+    else f i >>= mrec_n (n - 1) f
+
+-- | recursion function useful for random processes (g = random state)
+r_chain :: (g -> (a,g)) -> g -> [a]
+r_chain f g =
+    let (r,g') = f g
+    in r : r_chain f g'
+
+r_chain_fb :: ((a,g) -> (a,g)) -> a -> g -> [a]
+r_chain_fb f r_ g_ =
+    let go (r,g) = let (r',g') = f (r,g) in r' : go (r',g')
+    in r_ : go (r_,g_)
+
+-- | an action that steps through a stored sequence
+l_step :: MVar [a] -> IO a
+l_step r =
+    let f [] = undefined
+        f (x:xs) = (xs,x)
+    in modifyMVar r (return . f)
+
+-- | generate a stepper action from a list
+l_stepper :: [a] -> IO (IO a)
+l_stepper l = do
+  r <- newMVar (cycle l)
+  return (l_step r)
+
+l_stepper_scramble :: [a] -> IO (IO a)
+l_stepper_scramble l = scrambleIO l >>= l_stepper
+
+{-
+a <- l_stepper [1..5]
+sequence (replicate 10 a)
+-}
+
+type SEL a b g = (a,g) -> (b,g)
+
+-- | a recursion schema where s chooses between a and b at each step
+sel_seq :: RandomGen g => SEL a Bool g->SEL a a g->SEL a a g->a->g->[a]
+sel_seq s a b j =
+    let step (i,g) =
+            let (r,g') = s (i,g)
+            in if r then a (i,g') else b (i,g')
+    in r_chain_fb step j
+
+-- | variant where s is a (coin' c) and a is (rrand'c r)
+sel_seq_c_rng :: (RandomGen g,Random a) => R -> (a,a) -> a -> g -> [a]
+sel_seq_c_rng c r i g =
+    let s = coin c . snd
+        a = rrandc r . snd
+    in sel_seq s a id i g
+
+-- | monadic if
+ifM :: Monad m => m Bool -> m b -> m b -> m b
+ifM i j k = do
+  i' <- i
+  if i' then j else k
+
+-- | coin at R
+coin :: (RandomGen g) => R -> g -> (Bool,g)
+coin = R.coin
+
+-- | 'coin' at R
+coinIO :: R -> IO Bool
+coinIO = getStdRandom . coin
+
+-- | 'R.wchoose' at 'R'
+wchoose :: RandomGen g => [a] -> [R] -> g -> (a,g)
+wchoose = R.wchoose
+
+-- | wchoose at R
+wchooseIO :: [a] -> [R] -> IO a
+wchooseIO l= getStdRandom . wchoose l
+
+-- | rrand with duple range
+rrandc :: (RandomGen g,Random n) => (n,n) -> g -> (n,g)
+rrandc = uncurry R.rrand
+
+scrambleIO :: [t] -> IO [t]
+scrambleIO = getStdRandom . R.scramble
+
+-- | set precision
+set_prec :: Int -> Double -> Double
+set_prec n x =
+    let n' = 10 ^ n
+        x' = round (x * n') :: Integer
+    in fromIntegral x' / n'
+
+-- * AFTER GOEYVAERTS
+
+nd :: UGen
+nd =
+    let freq = control KR "freq" 440
+        amp = control KR "amp" 0.1
+        sustain = control KR "sustain" 0.1
+        pan = control KR "pan" 0
+        s = let p = mix (lfPar AR (freq * mce [0.999,1.001]) 0 * amp)
+                l = [10000,2000,4000,1000]
+                t = [0.005,rand 'a' 0.009 0.05,0.005]
+                d = env l t (replicate 3 EnvLin) 0 0
+            in lpf (distort p) (envGen KR 1 1 0 1 DoNothing d)
+        e = let l = [0,1,0.4,0.7,0]
+                t = [rand 'b' 0.001 0.005,0.005,0.005,sustain]
+                d = env l t (replicate 4 EnvLin) 0 0
+            in envGen KR 1 1 0 1 RemoveSynth d
+    in out 0 (pan2 (s * e) pan 1)
+
+fx :: UGen
+fx = replaceOut 0 (freeVerb (in' 2 AR 0) 0.33 1.5 0.5)
+
+ag_init :: Transport t => t -> IO ()
+ag_init fd = do
+  _ <- async fd (Bundle immediately [d_recv (synthdef "nd" nd)
+                                    ,d_recv (synthdef "fx" fx)])
+  send fd (s_new "fx" (-1) AddToHead 1 [])
+  return ()
+
+nd_msg :: Double -> Double -> Double -> Double -> OSC
+nd_msg f a s p =
+    let nd_arg = [("freq",f),("amp",a),("sustain",s),("pan",p)]
+    in s_new "nd" (-1) AddToHead 1 nd_arg
+
+type R = Double
+type P = M.Map Int R
+type S = M.Map Int Int
+data AG = AG {note_row :: [Int]
+             ,amp_row :: IO R
+             ,sus_row :: IO R
+             ,pan_row :: IO R
+             ,ioi_row :: IO R
+             ,ioi_mult_seq :: IO R
+             ,base_note_seq :: IO Int
+             ,octaves_seq :: IO Int
+             ,selections :: S
+             ,probabilities :: P}
+
+selections' :: S
+selections' = M.fromList (map (\i -> (i,0)) [0..11])
+
+selections_incr :: Int -> S -> S
+selections_incr = M.adjust (+ 1)
+
+selections_step' :: RandomGen g => S -> g -> (S,g)
+selections_step' s g =
+    let (r,g') = coin 0.03 g
+    in (if r then selections' else s,g')
+
+selections_step :: S -> IO S
+selections_step s = ifM (coinIO 0.03) (return selections') (return s)
+
+note_set :: [Int]
+note_set = [0 .. 11]
+
+note_step' :: RandomGen g => [Int] -> P -> g -> (Int,g)
+note_step' n p = R.wchoose n (C.normalizeSum (M.elems p))
+
+note_step :: [Int] -> P -> IO Int
+note_step n = getStdRandom . note_step' n
+
+chord_n' :: RandomGen g => g -> [Int]
+chord_n' = r_chain (wchoose [1,2,3,4,5] [0.5,0.35,0.1,0.025,0.025])
+
+chord_n :: IO [Int]
+chord_n = fmap chord_n' newStdGen
+
+chord' :: RandomGen g => P -> S -> Int -> [Int] -> g -> (([P],[S],[Int]),g)
+chord' p_ s_ =
+    let go (pl,sl,zl) p s n nr g =
+            if n == 0
+            then ((reverse pl,reverse sl,reverse zl),g)
+            else let (z,g') = note_step' nr p g
+                     p' = probabilities_decr z p
+                     s' = selections_incr z s
+                 in go (p':pl,s':sl,z:zl) p' s' (n - 1) nr g'
+    in go ([p_],[s_],[]) p_ s_
+
+chord :: P -> S -> Int -> [Int] -> IO ([P],[S],[Int])
+chord p s n = getStdRandom . chord' p s n
+
+amp_set :: [R]
+amp_set = map (dbAmp . negate) [1,3 .. 36]
+
+sus_set :: [R]
+sus_set = map ((/ exp 1) . exp . (/ 37)) [1 .. 37]
+
+pan_set :: [R]
+pan_set = map ((+ (-1)) . (* 2) . (/ 31)) [1 .. 31]
+
+ioi_set :: [R]
+ioi_set = map ((12 **) . (/ 12)) [1..12]
+
+ioi_mult_set :: [R]
+ioi_mult_set = [0.01,0.025,0.05,0.1,0.2]
+
+ioi_mult_seq' :: RandomGen g => R -> g -> [R]
+ioi_mult_seq' i g =
+    let s = uncurry coin
+        a = R.choose ioi_mult_set . snd
+    in sel_seq s a id i g
+
+--ioi_mult_seq_ = getStdRandom . ioi_mult_seq
+
+octaves_rng :: (Int,Int)
+octaves_rng = (2,5)
+
+octaves_seq' :: RandomGen g => g -> [Int]
+octaves_seq' = sel_seq_c_rng 0.02 octaves_rng 4
+
+base_note_rng :: (Int,Int)
+base_note_rng = (35,47)
+
+base_note_seq' :: RandomGen g => g -> [Int]
+base_note_seq' = sel_seq_c_rng 0.01 base_note_rng 36
+
+probabilities' :: P
+probabilities' = M.fromList (map (\x -> (x,1)) [0..11])
+
+probabilities_incr :: P -> P
+probabilities_incr = M.map (\x -> if x < 0.9999 then x + 0.1 else x)
+
+probabilities_decr :: Int -> P -> P
+probabilities_decr z = M.insert z 0.1
+
+ag :: IO AG
+ag = do
+  a <- l_stepper_scramble amp_set
+  s <- l_stepper_scramble sus_set
+  p <- l_stepper_scramble pan_set
+  i <- l_stepper_scramble ioi_set
+  g <- newStdGen
+  m <- l_stepper (ioi_mult_seq' 0.1 g)
+  o <- l_stepper (octaves_seq' g)
+  b <- l_stepper (base_note_seq' g)
+  n <- scrambleIO note_set
+  return AG {note_row = n
+            ,amp_row = a
+            ,sus_row = s
+            ,pan_row = p
+            ,ioi_row = i
+            ,ioi_mult_seq = m
+            ,base_note_seq = b
+            ,octaves_seq = o
+            ,selections = selections'
+            ,probabilities = probabilities'}
+
+ag_note :: S -> Int -> Int -> Int -> Int
+ag_note s' z o b = ((s' M.! z) `mod` o) * 12 + b + z
+
+-- o,b,a,su,pn,i,im are lists
+-- p,s,z are nested lists
+ag_psz' :: RandomGen g => [Int] -> [Int] -> P -> S -> g -> [([P],[S],[Int])]
+ag_psz' nr cn p s g =
+    let (n:ns) = cn
+        ((p',s',c),g') = chord' p s n nr g
+        p'' = probabilities_incr (last p')
+        (s'',g'') = selections_step' (last s') g'
+    in (p',s',c) : ag_psz' nr ns p'' s'' g''
+
+ag_psz :: [Int] -> [Int] -> P -> S -> IO [([P], [S], [Int])]
+ag_psz nr cn p s = do
+  g <- newStdGen
+  return (ag_psz' nr cn p s g)
+
+{-
+let g = mkStdGen 0
+let cn = chord_n' g
+let t3_3 (_,_,x) = x
+take 12$ map t3_3$ ag_psz note_set cn probabilities' selections' g
+-}
+
+scramble_c :: [t] -> IO [t]
+scramble_c x = fmap cycle (scrambleIO x)
+
+type Score = ([([Int],[Int],[R],[R],[R],([P],[S],[Int]))],[R],[R])
+
+ag_score :: IO Score
+ag_score = do
+  a <- scramble_c amp_set
+  su <- scramble_c sus_set
+  pn <- scramble_c pan_set
+  i <- scramble_c ioi_set
+  g <- newStdGen
+  let m = ioi_mult_seq' 0.1 g
+      o = octaves_seq' g
+      b = base_note_seq' g
+  nr <- scrambleIO note_set
+  cn <- chord_n
+  let gr = splitPlaces (map (+ 1) cn)
+  psz <- ag_psz nr cn probabilities' selections'
+  return (zip6 (gr o) (gr b) (gr a) (gr su) (gr pn) psz,i,m)
+
+---ag_run_score (a,s,p,o,b,psz,i,m) =
+
+ag_run_note :: Transport t => t->Int->Int->R->R->R->(P,S,Int)->IO()
+ag_run_note fd o b a su pn (p,s,z) = do
+  let mn = ag_note s z o b
+  print ('o',o,'b',b)
+  print ('p',map (set_prec 2) (M.elems p))
+  print ('s',M.elems s)
+  send fd (nd_msg (midiCPS (fromIntegral mn)) a su pn)
+
+ag_step :: Transport t => t -> AG -> IO AG
+ag_step fd r = do
+  let act (p,s,z) = do
+        o <- octaves_seq r
+        b <- base_note_seq r
+        a <- amp_row r
+        su <- sus_row r
+        pn <- pan_row r
+        ag_run_note fd o b a su pn (p,s,z)
+  (p',s') <- do let p = probabilities_incr (probabilities r)
+                s <- selections_step (selections r)
+                n <- wchooseIO [1,2,3,4,5] [0.5,0.35,0.1,0.025,0.025]
+                (p',s',c) <- chord p s n (note_row r)
+                mapM_ act (zip3 p' s' c)
+                return (last p',last s')
+  dt <- ioi_row r
+  i <- ioi_mult_seq r
+  pauseThread (dt * i)
+  return (r {probabilities = p',selections = s'})
+
+ag_run :: Transport t => t -> Maybe Int -> IO ()
+ag_run fd i = do
+  r <- ag
+  ag_init fd
+  _ <- case i of
+         Just n -> mrec_n n (ag_step fd) r
+         Nothing -> mrec (ag_step fd) r
+  return ()
+
+main :: IO ()
+main = do
+  i <- randomRIO (256,512)
+  withSC3 (\fd -> ag_run fd (Just i) >> pauseThread 9 >> reset fd)
+
+{-
+withSC3 ag_init
+withSC3 (\fd -> send fd (nd_msg 660 0.45 0.65 0))
+r <- ag
+withSC3 (\fd -> ag_step fd r)
+withSC3 (\fd -> ag_run fd (Just 32))
+withSC3 (\fd -> ag_run fd Nothing)
+withSC3 reset
+-}
diff --git a/src/aleatoric-quartet-m.hs b/src/aleatoric-quartet-m.hs
new file mode 100644
--- /dev/null
+++ b/src/aleatoric-quartet-m.hs
@@ -0,0 +1,33 @@
+-- aleatoric quartet (jmcc)
+
+import Sound.SC3.Monadic
+
+aleatoric_quartet :: (Functor m,UId m) => m UGen
+aleatoric_quartet = do
+  let base_mn = control KR "note" 66
+      amp = control KR "ampl" 0.07
+      density = mouseX' KR 0.01 1 Linear 0.1
+      dmul = recip density * 0.5 * amp
+      dadd = amp - dmul
+      (>=>) f g x = f x >>= g
+      chain n f = foldl (>=>) return (replicate n f)
+      rapf i = do r <- clone 2 (rand 0 0.05)
+                  return (allpassN i 0.05 r 1)
+      mk_f = do i0 <- iRand 0 2
+                let r0 = select i0 (mce [1, 0.5, 0.25])
+                r1 <- rand (-30) 30
+                n0 <- lfNoise0 KR r0
+                let m = n0 * 7 + base_mn + r1
+                    m' = lag (roundTo m 1) 0.2
+                return (midiCPS m')
+      mk_s = do f <- fmap recip mk_f
+                r <- rand (-1) 1
+                x <- do n0 <- pinkNoise AR
+                        n1 <- lfNoise1 KR 8
+                        return (n0 * max 0 (n1 * dmul + dadd))
+                return (pan2 (combL x 0.02 f 3) r 1)
+  g <- chain 5 rapf =<< fmap sum (sequence (replicate 4 mk_s))
+  return (leakDC g 0.995)
+
+main :: IO ()
+main = audition . out 0 =<< aleatoric_quartet
diff --git a/src/aleatoric-quartet.lhs b/src/aleatoric-quartet.lhs
deleted file mode 100644
--- a/src/aleatoric-quartet.lhs
+++ /dev/null
@@ -1,52 +0,0 @@
-aleatoric quartet (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main = 
->   let { base_mn = control KR "note" 66
->       ; amp = control KR "ampl" 0.07
->       ; density = mouseX kr 0.01 1 Linear 0.1
->       ; dmul = recip density * 0.5 * amp
->       ; dadd = amp - dmul
->       ; (>=>) f g = \x ->   f x >>= g
->       ; chain n f = foldl (>=>) return (replicate n f)
->       ; rapf i = do { r <- clone 2 (rand 0 0.05)
->                     ; return (allpassN i 0.05 r 1) }
->       ; mk_f = do { i0 <- iRand 0 2
->                   ; let r0 = select i0 (mce [1, 0.5, 0.25])
->                     in do { r1 <- rand (-30) 30
->                           ; n0 <- lfNoise0 kr r0
->                           ; let { m = n0 * 7 + base_mn + r1
->                                 ; m' = lag (roundE m 1) 0.2 }
->                             in return (midiCPS m') } }
->       ; mk_s = do { f <- fmap recip mk_f
->                   ; r <- rand (-1) 1
->                   ; x <- do { n0 <- pinkNoise ar
->                             ; n1 <- lfNoise1 kr 8
->                             ; return (n0 * max 0 (n1 * dmul + dadd)) }
->                   ; return (pan2 (combL x 0.02 f 3) r 1) } }
->   in do { g <- chain 5 rapf =<< fmap sum (sequence (replicate 4 mk_s))
->         ; audition (out 0 (leakDC g 0.995)) }
-
-{ var amp = 0.07
-; var density = MouseX.kr(0.01, 1, 'linear', 0.1)
-; var dmul = density.reciprocal * 0.5 * amp
-; var dadd = amp - dmul
-; 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 r0 = Select.kr(i0, [1, 0.5, 0.25])
-             ; var r1 = Rand.new(-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 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
diff --git a/src/aleatoric-quartet.scd b/src/aleatoric-quartet.scd
new file mode 100644
--- /dev/null
+++ b/src/aleatoric-quartet.scd
@@ -0,0 +1,22 @@
+{ var amp = 0.07
+; var density = MouseX.kr(0.01, 1, 'linear', 0.1)
+; var dmul = density.reciprocal * 0.5 * amp
+; var dadd = amp - dmul
+; 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 r0 = Select.kr(i0, [1, 0.5, 0.25])
+             ; var r1 = Rand.new(-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 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
diff --git a/src/alien-froggies.hs b/src/alien-froggies.hs
new file mode 100644
--- /dev/null
+++ b/src/alien-froggies.hs
@@ -0,0 +1,13 @@
+-- alien froggies (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+alien_froggies :: UGen -> (UGen,UGen)
+alien_froggies r =
+    let r' = fold (r * exp (linRand 'a' (-0.2) 0.2 0)) 1 30
+        o = formant AR r' (expRand 'b' 200 3000) (rand 'c' 0 9 * r' + r')
+    in (o * 0.05,r')
+
+main :: IO ()
+main = overlapTextureS (0.5,0.25,5,maxBound) alien_froggies 11
diff --git a/src/alien-froggies.scd b/src/alien-froggies.scd
new file mode 100644
--- /dev/null
+++ b/src/alien-froggies.scd
@@ -0,0 +1,5 @@
+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)})
diff --git a/src/alien-meadow.hs b/src/alien-meadow.hs
new file mode 100644
--- /dev/null
+++ b/src/alien-meadow.hs
@@ -0,0 +1,16 @@
+-- alien meadow (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+alien_meadow :: UGen
+alien_meadow =
+    let a = rand 'a' 0 20
+        b = rand 'b' 0 5000
+        c = rand 'c' 0 20
+        p = rand 'd' (-1) 1
+        f = sinOsc AR a 0 * b * 0.1 + b
+    in pan2 (sinOsc AR f 0) p (sinOsc AR c 0 * 0.05 + 0.05)
+
+main :: IO ()
+main = overlapTextureU (6,2,6,maxBound) alien_meadow
diff --git a/src/ambient1.hs b/src/ambient1.hs
new file mode 100644
--- /dev/null
+++ b/src/ambient1.hs
@@ -0,0 +1,97 @@
+-- ambient1 (http://sccode.org/1-1y)
+-- some edits......
+
+import Control.Applicative
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.Lang.Control.Event {- hsc3-lang -}
+import Sound.SC3.Lang.Control.Instrument
+import Sound.SC3.Lang.Pattern.ID
+
+chain :: a -> [a -> a] -> a
+chain n ff =
+    case ff of
+      [] -> n
+      f:ff' -> chain (f n) ff'
+
+chain0 :: Num a => [a -> a] -> a
+chain0 = chain 0
+
+pulse_u :: UGen
+pulse_u =
+    let k = control KR
+        f = k "freq" 440
+        a = k "amp" 0.1
+        aT = k "attackTime" 0.01
+        dT = k "delayTime" 10
+	e = envGen KR 1 1 0 1 RemoveSynth (envPerc aT 10)
+	z = sinOsc AR f 0 * 0.7
+	o = let l = sinOsc KR 3 0
+            in pan2 (toggleFF (tDelay z dT) * sinOsc AR f 0) l 0.6
+	s = clip2 ((pan2 z (sinOsc KR 5 pi) 0.7 + o) * e) 1
+    in out 0 (freeVerb s 0.7 1.0 0.4 * a)
+
+drone_u :: UGen
+drone_u =
+    let k = control KR
+        f = k "freq" 440
+        a = k "amp" 0.1
+        ph = k "phase" 0
+        e = envGen KR 1 1 0 1 RemoveSynth (envSine 10 1)
+	s = chain0 [\_ -> lfPulse AR f 0 0.15
+                   ,\o -> rlpf o (sinOsc KR 0.3 0 * 200 + 1500) 0.1
+                   ,\o -> freeVerb o 0.5 0.5 0.5 * e
+	           ,\o -> pan2 o (sinOsc KR (1/10) ph) a]
+    in out 0 s
+
+bass_u :: UGen
+bass_u =
+    let k = control KR
+        f = k "freq" 96
+        a = k "amp" 0.1
+	e = envGen KR 1 1 0 1 RemoveSynth (envPerc' 0.5 1 1 (EnvLin,EnvLin))
+	s = sinOsc AR f 0 * a * e
+    in out 0 (pan2 s 0 1)
+
+{-
+audition pulse_u
+audition drone_u
+audition bass_u
+-}
+
+pulse_i :: Instrument
+pulse_i = InstrumentDef (synthdef "pulse" pulse_u)
+
+drone_i :: Instrument
+drone_i = InstrumentDef (synthdef "drone" drone_u)
+
+bass_i :: Instrument
+bass_i = InstrumentDef (synthdef "bass" bass_u)
+
+dur_p :: Fractional a => P a
+dur_p = prand 'β' [3,0.7,1,0.5] inf
+
+pulse_p :: P Event
+pulse_p = pbind [("dur",dur_p * 10)
+                ,("midinote",prand 'α' [59,72,76,79,81,88,90] inf)
+                ,("amp",pwhite 'β' 0.2 0.27 inf)
+                ,("attackTime",pwhite 'γ' 0 7 inf)
+		,("delayTime",0.02)]
+
+drone_p :: P Event
+drone_p = pbind [("dur",dur_p)
+                ,("midinote",prand 'α' [31,40,45,64,68,69] inf)
+                ,("amp",pwhite 'β' 0.03 0.08 inf * 0.7)
+                ,("phase",pwrand 'γ' [0,4.7123] [0.5,0.5] inf)]
+
+bass_p :: P Event
+bass_p = pbind [("dur",dur_p)
+               ,("midinote",31)
+               ,("amp",0.3)]
+
+ambient1_p :: P Event
+ambient1_p = ppar [pinstr (pure pulse_i) pulse_p
+                  ,pinstr (pure drone_i) drone_p
+                  ,pinstr (pure bass_i) bass_p]
+
+main :: IO ()
+main = audition ambient1_p
diff --git a/src/analog-bubbles.hs b/src/analog-bubbles.hs
new file mode 100644
--- /dev/null
+++ b/src/analog-bubbles.hs
@@ -0,0 +1,13 @@
+-- analog bubbles (jmcc)
+
+import Sound.SC3
+
+analog_bubbles :: UGen
+analog_bubbles =
+  let o = lfSaw KR (mce2 8 7.23) 0 * 3 + 80
+      f = lfSaw KR 0.4 0 * 24 + o
+      s = sinOsc AR (midiCPS f) 0 * 0.04
+  in combN s 0.2 0.2 4
+
+main :: IO ()
+main = audition (out 0 analog_bubbles)
diff --git a/src/analog-bubbles.lhs b/src/analog-bubbles.lhs
deleted file mode 100644
--- a/src/analog-bubbles.lhs
+++ /dev/null
@@ -1,14 +0,0 @@
-analog bubbles (jmcc)
-
-> import Sound.SC3
-
-> main =
->   let { o = lfSaw kr (mce2 8 7.23) 0 * 3 + 80
->       ; f = lfSaw kr 0.4 0 * 24 + o
->       ; s = sinOsc ar (midiCPS f) 0 * 0.04 }
->   in audition (out 0 (combN s 0.2 0.2 4))
-
-{ var o = LFSaw.kr([8, 7.23], 0, 3, 80)
-; var f = LFSaw.kr(0.4, 0, 24, o)
-; var s = SinOsc.ar(f.midicps, 0, 0.04)
-; Out.ar(0, CombN.ar(s, 0.2, 0.2, 4, 0.1)) }.play
diff --git a/src/analog-bubbles.scd b/src/analog-bubbles.scd
new file mode 100644
--- /dev/null
+++ b/src/analog-bubbles.scd
@@ -0,0 +1,4 @@
+{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
diff --git a/src/arpeggio.hs b/src/arpeggio.hs
new file mode 100644
--- /dev/null
+++ b/src/arpeggio.hs
@@ -0,0 +1,84 @@
+-- arpeggio (nc)
+-- http://www.listarc.bham.ac.uk/lists/sc-users/msg07473.html
+
+import Control.Monad
+import Sound.SC3
+import Sound.SC3.Lang.Control.Event
+import Sound.SC3.Lang.Pattern.ID
+
+analogarpeggio :: Synthdef
+analogarpeggio =
+    let k = control KR
+        o = k "out" 0
+        p = k "pan" 0
+        g = k "gate" 1
+        f = k "freq" 440
+        a = k "amp" 0.1
+        c = k "cutoffmult" 3
+        r = k "res" 0.1
+        e = let d = envADSR 0.01 0.3 0.5 1 1 (EnvNum (-4)) 0
+            in envGen AR g 1 0 1 RemoveSynth d
+        i = mix (saw AR (f * mce [0.497,0.999,1.0,2.03]))
+	s = bLowPass i (c * f) r * 0.25
+    in synthdef "analogarpeggio" (out o (pan2 (e * s * a) p 0.25))
+
+{-
+audition (analogarpeggio
+         ,(pbind [("dur",pwrand 'a' [0.1,0.25] [2/3,1/2] inf)
+                 ,("freq",pwhite 'b' 440.0 1600.0 inf)
+                 ,("pan",pwhite 'c' (-1.0) 1.0 inf)
+                 ,("amp",pwhite 'd' 0.0 0.5 inf)
+                 ,("cutoffmult",pwhite 'e' 4.0 5.0 inf)
+                 ,("res",pwhite 'f' 0.0 1.0 inf)]))
+-}
+
+pinterp :: (Fractional a) => Int -> a -> a -> P a
+pinterp n s e = pseries s ((e - s) / fromIntegral n) n
+
+pinterp' :: (Fractional a) => P Int -> P a -> P a -> P a
+pinterp' n s e = join (pzipWith3 pinterp n s e)
+
+arpeggio :: [(Key,P Double)]
+arpeggio =
+    [("dur"
+     ,let d = pwrand 'n' [0.25,0.125,0.0625] [0.4875,0.4875,0.025] inf
+      in pstutter 32 d)
+    ,("cutoffmult"
+     ,let n = prand 'a' [8,16,24,32] inf
+          s = pwhite 'b' 2.5 5.0 inf
+          e = pwhite 'c' 1.5 7.0 inf
+      in pinterp' n s e)
+    ,("res"
+     ,let n = prand 'd' [8,16,24,32] inf
+          s = pexprand 'e' 0.02 0.5 inf
+          e = pexprand 'f' 0.02 1.0 inf
+      in pinterp' n s e)
+    ,("pan"
+     ,let n = prand 'g' [8,16] inf
+          s = pwhite 'h' (-1.0) 1.0 inf
+          s' = fmap (< 0) s
+          e = pif s' (pwhite 'i' 0.0 1.0 inf) (pwhite 'i' (-1.0) 0.0 inf)
+      in pinterp' n s e)
+    ,("amp"
+     ,let n = prand 'j' [8,16,24,32] inf
+          s = prand 'k' [0.25,0.05,0.5] inf
+          e = prand 'l' [0.25,0.05,0.5,0.01] inf
+      in pinterp' n s e)
+    ,("note"
+     ,let f x = pn (fromList x) 8
+      in pseq (map f [[10,6,1,-2]
+                     ,[-3,1,6,9]
+                     ,[9,6,1,-3]
+                     ,[-2,1,6,10]
+                     ,[8,6,1,-4]
+                     ,[-3,1,6,9]
+                     ,[8,6,1,-3]
+                     ,[-6,1,6,8]]) inf)
+    ,("octave"
+     ,pstutter 8 (pseq [7,6,5,4,4,5,6,7] inf))]
+
+main :: IO ()
+main = do
+  let n = 60/157
+      p = pedit "dur" (* n) (pbind arpeggio)
+  withSC3 (\fd -> play fd (analogarpeggio,p))
diff --git a/src/babbling-brook-m.hs b/src/babbling-brook-m.hs
new file mode 100644
--- /dev/null
+++ b/src/babbling-brook-m.hs
@@ -0,0 +1,18 @@
+-- babbling brook (jmcc)
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
+
+import Sound.SC3.Monadic
+
+babbling_brook :: IO UGen
+babbling_brook = do
+  let b f m a g = do n1 <- brownNoise AR
+                     n2 <- brownNoise AR
+                     let n3 = lpf n2 f * m + a
+                         n4 = onePole n1 0.99
+                     return (rhpf n4 n3 0.03 * g)
+  x <- clone 2 (b 14 400 500 0.006)
+  y <- clone 2 (b 20 800 1000 0.010)
+  return (x + y)
+
+main :: IO ()
+main = audition . out 0 =<< babbling_brook
diff --git a/src/babbling-brook.lhs b/src/babbling-brook.lhs
deleted file mode 100644
--- a/src/babbling-brook.lhs
+++ /dev/null
@@ -1,23 +0,0 @@
-babbling brook (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main = 
->   let b f m a g = do { n1 <- brownNoise ar
->                      ; n2 <- brownNoise ar
->                      ; let { n3 = lpf n2 f * m + a
->                            ; n4 = onePole n1 0.99 }
->                        in return (rhpf n4 n3 0.03 * g) }
->   in do { x <- clone 2 (b 14 400 500 0.006)
->         ; y <- clone 2 (b 20 800 1000 0.010)
->         ; audition (out 0 (x + y)) }
-
-{ 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
-
-http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
diff --git a/src/babbling-brook.scd b/src/babbling-brook.scd
new file mode 100644
--- /dev/null
+++ b/src/babbling-brook.scd
@@ -0,0 +1,7 @@
+{ 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
diff --git a/src/birds-m.hs b/src/birds-m.hs
new file mode 100644
--- /dev/null
+++ b/src/birds-m.hs
@@ -0,0 +1,34 @@
+-- birds (jmcc)
+-- http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
+
+import Sound.SC3.Monadic
+
+composeM :: Monad m => [a -> m a] -> a -> m a
+composeM fs i = foldr (=<<) (return i) fs
+
+chainM :: Monad m => Int -> (a -> m a) -> a -> m a
+chainM n f = composeM (replicate n f)
+
+birds :: UId m => m UGen
+birds = do
+  let node = do r1 <- rand 94.0 102.0
+                r2 <- rand (-1.5) 1.5
+                r3 <- rand 0.0 1.0
+                r4 <- rand 11.0 15.0
+                r5 <- rand 0.0 1.0
+                r6 <- rand 12.0 15.6
+                r7 <- rand 0.0 1.0
+                r8 <- rand (-1.0) 1.0
+                let f = r1 + lag (lfSaw AR (7 + r2) r3 * r4) 0.1
+                    a = lfPulse KR (1.0 / r6) r7 0.16 * 0.05
+                    b = sinOsc AR (midiCPS f) r5 * a
+                return (rotate2 b (silent 1) r8)
+      apf i = do r1 <- rand 0.0 0.06
+                 r2 <- rand 0.7 2.0
+                 return (allpassL i 0.07 r1 r2)
+  d <- return . sum =<< sequence (replicate 6 node)
+  w <- chainM 12 apf d
+  return (d * 0.7 + w * 0.3)
+
+main :: IO ()
+main = audition . out 0 =<< birds
diff --git a/src/birds.lhs b/src/birds.lhs
deleted file mode 100644
--- a/src/birds.lhs
+++ /dev/null
@@ -1,28 +0,0 @@
-birds (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { node = do { r1 <- rand 94.0 102.0
->                   ; r2 <- rand (-1.5) 1.5
->                   ; r3 <- rand 0.0 1.0
->                   ; r4 <- rand 11.0 15.0
->                   ; r5 <- rand 0.0 1.0
->                   ; r6 <- rand 12.0 15.6
->                   ; r7 <- rand 0.0 1.0
->                   ; r8 <- rand (-1.0) 1.0
->                   ; let { f = r1 + lag (lfSaw AR (7 + r2) r3 * r4) 0.1
->                         ; a = lfPulse KR (1.0 / r6) r7 0.16 * 0.05
->                         ; b = sinOsc AR (midiCPS f) r5 * a } 
->                     in return (rotate2 b (silent 1) r8) }
->       ; apf i = do { r1 <- rand 0.0 0.06
->                    ; r2 <- rand 0.7 2.0
->                    ; return (allpassL i 0.07 r1 r2) }
->       ; composeM [] i = return i
->       ; composeM (f:fs) i = f =<< composeM fs i
->       ; chainM n f = composeM (replicate n f) }
->   in do { d <- return . sum =<< sequence (replicate 6 node)
->         ; w <- chainM 12 apf d
->         ; audition (out 0 (d * 0.7 + w * 0.3)) }
-
-http://lists.create.ucsb.edu/pipermail/sc-users/2007-April/033239.html
diff --git a/src/bit-reduction.hs b/src/bit-reduction.hs
new file mode 100644
--- /dev/null
+++ b/src/bit-reduction.hs
@@ -0,0 +1,25 @@
+-- bit reduction (adc)
+
+import Sound.SC3.ID
+
+sample_rate_decrease :: UGen
+sample_rate_decrease =
+  let f = lfNoise2 'a' KR 8
+      nh = lfNoise2 'a' KR 3
+      src = blip AR (f * 200 + 300) (nh * 10 + 20)
+      sr = mouseX' KR 1000 (sampleRate * 0.1) Exponential 0.2
+  in latch src (impulse AR sr 0)
+
+bit_rate_decrease :: UGen
+bit_rate_decrease =
+  let f = lfNoise2 'a' KR 8
+      nh = lfNoise2 'a' KR 3
+      src = blip AR (f * 200 + 300) (nh * 10 + 20)
+      sr = mouseX' KR 1000 (sampleRate * 0.1) Exponential 0.2
+      bit_sz = mouseY' KR 1 24 Exponential 0.2
+      down_sample = latch src (impulse AR sr 0)
+      bit_redux = roundTo down_sample (0.5 ** bit_sz)
+  in mce2 down_sample bit_redux
+
+main :: IO ()
+main = audition (out 0 (sample_rate_decrease + bit_rate_decrease))
diff --git a/src/bit-reduction.lhs b/src/bit-reduction.lhs
deleted file mode 100644
--- a/src/bit-reduction.lhs
+++ /dev/null
@@ -1,37 +0,0 @@
-bit reduction (adc)
-
-> import Sound.SC3.Monadic
-
-> sample_rate_decrease =
->   do { f <- lfNoise2 kr 8
->      ; nh <- lfNoise2 kr 3
->      ; let { src = blip ar (f * 200 + 300) (nh * 10 + 20)
->            ; sr = mouseX kr 1000 (sampleRate * 0.1) Exponential 0.2 }
->        in audition (out 0 (latch src (impulse ar sr 0))) }
-
-{ var f = LFNoise2.kr(8)
-; var nh = LFNoise2.kr(3)
-; var src = Blip.ar(f * 200 + 300, nh * 10 + 20)
-; var sr = MouseX.kr(1000, s.sampleRate * 0.1, 'exponential', 0.2)
-; Out.ar(0, Latch.ar(src, Impulse.ar(sr, 0))) }.play
-
-> bit_rate_decrease =
->   do { f <- lfNoise2 kr 8
->      ; nh <- lfNoise2 kr 3
->      ; let { src = blip ar (f * 200 + 300) (nh * 10 + 20)
->            ; sr = mouseX kr 1000 (sampleRate * 0.1) Exponential 0.2
->            ; bit_sz = mouseY kr 1 24 Exponential 0.2
->            ; down_sample = latch src (impulse ar sr 0)
->            ; bit_redux = roundE down_sample (0.5 ** bit_sz) }
->        in audition (out 0 (mce2 down_sample bit_redux)) }
-
-{ var f = LFNoise2.kr(8)
-; var nh = LFNoise2.kr(3)
-; var src = Blip.ar(f * 200 + 300, nh * 10 + 20)
-; var sr = MouseX.kr(1000, s.sampleRate * 0.1, 'exponential', 0.2)
-; var bit_sz = MouseY.kr(1, 24, 'exponential', 0.2) 
-; var down_sample = Latch.ar(src, Impulse.ar(sr, 0))
-; var bit_redux = down_sample.round(0.5 ** bit_sz)
-; Out.ar(0, [down_sample, bit_redux]) }.play
-
-> main = bit_rate_decrease
diff --git a/src/bit-reduction.scd b/src/bit-reduction.scd
new file mode 100644
--- /dev/null
+++ b/src/bit-reduction.scd
@@ -0,0 +1,14 @@
+{ var f = LFNoise2.kr(8)
+; var nh = LFNoise2.kr(3)
+; var src = Blip.ar(f * 200 + 300, nh * 10 + 20)
+; var sr = MouseX.kr(1000, s.sampleRate * 0.1, 'exponential', 0.2)
+; Out.ar(0, Latch.ar(src, Impulse.ar(sr, 0))) }.play
+
+{ var f = LFNoise2.kr(8)
+; var nh = LFNoise2.kr(3)
+; var src = Blip.ar(f * 200 + 300, nh * 10 + 20)
+; var sr = MouseX.kr(1000, s.sampleRate * 0.1, 'exponential', 0.2)
+; var bit_sz = MouseY.kr(1, 24, 'exponential', 0.2)
+; var down_sample = Latch.ar(src, Impulse.ar(sr, 0))
+; var bit_redux = down_sample.round(0.5 ** bit_sz)
+; Out.ar(0, [down_sample, bit_redux]) }.play
diff --git a/src/black-atlantic-currents.hs b/src/black-atlantic-currents.hs
new file mode 100644
--- /dev/null
+++ b/src/black-atlantic-currents.hs
@@ -0,0 +1,108 @@
+-- black atlantic currents (jr)
+-- http://www.listarc.bham.ac.uk/lists/sc-users/msg08240.html
+
+import Data.Numbers.Primes {- primes -}
+import Sound.SC3.ID {- hsc3 -}
+import System.Random {- random -}
+import System.Random.Shuffle {- random-shuffle -}
+
+nth_prime :: Integral a => Int -> a
+nth_prime j = primes !! j
+
+chain :: Int -> (t -> t) -> t -> t
+chain j f x = if j == 0 then x else chain (j - 1) f (f x)
+
+xn,yn,zn :: Num a => a
+xn = 64
+yn = 65
+zn = 66
+
+type NF t a = a -> Rate -> t -> UGen
+
+n :: NF t a -> t -> [a] -> UGen
+n g f = mce . map (\k -> g k KR f)
+
+n' :: NF t a -> [t] -> [a] -> UGen
+n' g f = mce . map (\(f',k) -> g k KR f') . zip f
+
+i :: UGen -> UGen
+i = inFeedback 2
+
+c :: Int -> UGen
+c = Constant . fromIntegral
+
+bac :: UGen
+bac =
+  let x = let ph = i yn * uclone 'a' 2 (lfdNoise3 'a' KR 1)
+          in out xn (mceReverse (sinOsc AR (60 * 2) ph))
+      y = let ph = i xn * uclone 'a' 2 (lfdNoise3 'a' KR 0.3) * 4
+          in out yn (sinOsc AR (50 * 2) ph)
+  in mrg [inFeedback 2 xn,y,x]
+
+bac' :: UGen
+bac' =
+  let x = let f = c (nth_prime 23)
+              ph = i yn * uclone 'a' 2 (lfdNoise3 'a' KR (sqrt 2))
+          in out xn (mceReverse (sinOsc AR f ph))
+      y = let f = c (chain 3 nth_prime 1)
+              ph = i xn * uclone 'a' 2 (lfdNoise3 'a' KR (sqrt pi)) * pi
+          in out yn (tanh (sinOsc AR f ph))
+  in mrg [inFeedback 2 xn,y,x]
+
+bac'' :: UGen
+bac'' =
+  let x = let f = c (nth_prime 23)
+              ph = i yn * n' lfdNoise3 (map sqrt [1,2]) "ab"
+          in out xn (mceReverse (sinOsc AR f ph))
+      y = let f = c (chain 3 nth_prime 1)
+              ph = i xn * n lfdNoise1 (sqrt pi) "cd" * pi
+          in out yn (tanh (sinOsc AR f ph))
+      z = let f = c (chain 3 nth_prime 2)
+              ph = i yn * n lfdNoise0 (sqrt (sqrt pi)) "ef" * 42 * pi
+          in out zn (tanh (sinOsc AR f ph) * exp (-0.5 * pi))
+  in mrg [inFeedback 2 xn,y,x,z]
+
+bac''' :: UGen
+bac''' =
+  let x = let j = range 1 30 (lfNoise0 's' KR (log 2 / 2))
+              f = select j (mce (map (c . nth_prime) [1..30]))
+              ph = i zn * n' lfdNoise3 (map sqrt [1,2]) "ab"
+          in out xn (mceReverse (sinOsc AR f ph))
+      y = let f = c (chain 3 nth_prime 1)
+              ph = i xn * n lfdNoise1 (sqrt pi) "cd" * pi
+          in out yn (tanh (sinOsc AR f ph) * exp 1)
+      z = let f = c (chain 3 nth_prime 2)
+              ph = i yn * n lfdNoise0 (sqrt (sqrt pi)) "ef" * 42 * pi
+          in out zn (tanh (sinOsc AR f ph) * exp (-0.5 * pi))
+  in mrg [inFeedback 2 xn,y,x,z]
+
+scramble :: Enum a => a -> [t] -> [t]
+scramble j k =
+    let g = mkStdGen (fromEnum j)
+    in shuffle' k (length k) g
+
+bac'''' :: UGen
+bac'''' =
+  let x = let j = range 1 30 (lfNoise2 's' KR (log 2 / 2))
+              ph = i zn * n' lfdNoise3 (map sqrt [1,2]) "ab"
+              f' = map (c . nth_prime) (scramble 'p' [1,3..61])
+              o = map (\f -> mceReverse (sinOsc AR f ph)) f'
+          in out xn (mceChannel 1 (selectX j (mce o)))
+      y = let f = c (chain 3 nth_prime 1)
+              ph = i xn * n lfdNoise1 (sqrt pi) "cd" * pi
+          in out yn (tanh (sinOsc AR f ph) * exp 1)
+      z = let f = c (chain 3 nth_prime 2)
+              ph = i yn * n lfdNoise0 (sqrt (sqrt pi)) "ef" * 42 * pi
+          in out zn (tanh (sinOsc AR f ph) * exp (-0.5 * pi))
+  in mrg [inFeedback 2 xn,y,x,z]
+
+{-
+audition (out 0 bac)
+audition (out 0 bac')
+audition (out 0 bac'')
+audition (out 0 bac''')
+audition (out 0 bac'''')
+-}
+
+main :: IO ()
+main = audition (out 0 bac)
diff --git a/src/bohlen-pierce-140.hs b/src/bohlen-pierce-140.hs
new file mode 100644
--- /dev/null
+++ b/src/bohlen-pierce-140.hs
@@ -0,0 +1,22 @@
+-- bohlen-pierce-140 (jj)
+-- http://sccode.org/1-W
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Pattern.ID
+
+bp140u :: UGen
+bp140u =
+    let f z n = n * (3 ** (rand z 0 17 / 13))
+        e = envGen AR 1 0.3 0 1 RemoveSynth (envPerc 0.01 1)
+        o = pmOsc AR (f 'a' (mce2 438 442)) (f 'b' 880) (f 'c' e) 0
+    in o * e
+
+bp140 :: Synthdef
+bp140 = synthdef "bp140" (out 0 bp140u)
+
+main :: IO ()
+main = audition (bp140,pbind [("dur",prand 'a' [1/6,1/3] inf)])
+
+{-
+Sound.SC3.UGen.Dot.draw bp140u
+-}
diff --git a/src/bohlen-pierce-140.scd b/src/bohlen-pierce-140.scd
new file mode 100644
--- /dev/null
+++ b/src/bohlen-pierce-140.scd
@@ -0,0 +1,5 @@
+fork{loop{play{
+f=_*3.pow(17.rand/13);
+e=EnvGen.ar(Env.perc,1,0.3,0,1,2);
+PMOsc.ar(f.([438,442]),f.(880),f.(e))*e
+};[1/6,1/3].choose.wait}}
diff --git a/src/bottle-m.hs b/src/bottle-m.hs
new file mode 100644
--- /dev/null
+++ b/src/bottle-m.hs
@@ -0,0 +1,28 @@
+-- bottle (sc)
+
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.Monadic
+
+bottle :: UId m => m UGen
+bottle = do
+  freq <- rand 220 880
+  wn <- whiteNoise AR
+  pn <- pinkNoise AR
+  let (>=>) f g x = f x >>= g
+      chain n f = foldl (>=>) return (replicate n f)
+      perc = envPerc 0.1 0.6
+      ex = envGen KR 1 1 0 1 DoNothing perc * wn * 0.02
+      flute = ringz ex freq 0.3
+      r = resonz pn (5 + (freq / 2)) 0.1
+      breath = envGen KR 1 1 0 1 DoNothing perc * r
+      rapf i = do x <- linRand 0.001 0.1 (-1)
+                  return (i + allpassN i 0.1 x 1.0 * 0.5)
+      cls i = let en = let c = EnvNum (-4) in (c,c,c)
+                  l = envLinen' 0.01 3.0 1.0 1 en
+                  z = (breath + i) * envGen KR 1 1 0 1 RemoveSynth l
+              in mce2 z z
+  f <- chain 2 rapf flute
+  return (cls f)
+
+main :: IO ()
+main = overlapTextureU (0,2,2,maxBound) =<< bottle
diff --git a/src/bottle.lhs b/src/bottle.lhs
deleted file mode 100644
--- a/src/bottle.lhs
+++ /dev/null
@@ -1,23 +0,0 @@
-bottle (sc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { freq <- rand 220 880
->      ; wn <- whiteNoise ar
->      ; pn <- pinkNoise ar
->      ; let { (>=>) f g = \x -> f x >>= g
->            ; chain n f = foldl (>=>) return (replicate n f)
->            ; perc = envPerc 0.1 0.6
->            ; ex = envGen kr 1 1 0 1 DoNothing perc * wn * 0.02
->            ; flute = ringz ex freq 0.3
->            ; r = resonz pn (5 + (freq / 2)) 0.1
->            ; breath = envGen kr 1 1 0 1 DoNothing perc * r
->            ; rapf i = do { x <- linRand 0.001 0.1 (-1)
->                          ; return (i + allpassN i 0.1 x 1.0 * 0.5) }
->            ; cls i = let { en = let c = EnvNum (-4) in (c,c,c)
->                          ; l = envLinen' 0.01 3.0 1.0 1 en
->                          ; z = (breath + i) * envGen kr 1 1 0 1 RemoveSynth l }
->                      in mce2 z z }
->        in do { f <- (chain 2 rapf) flute
->              ; audition (out 0 (cls f)) } }
diff --git a/src/bowed-string-m.hs b/src/bowed-string-m.hs
new file mode 100644
--- /dev/null
+++ b/src/bowed-string-m.hs
@@ -0,0 +1,26 @@
+-- bowed string (jmcc)
+
+import Control.Monad
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.Monadic
+
+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 <- liftM midiCPS (liftM2 (+) (iChoose' scale) (iChoose' oct))
+  n1 <- lfNoise1 KR r0
+  let x = n0 * 0.007 * max 0 (n1 * 0.6 + 0.4)
+      geom n i z = take n (iterate (* z) i)
+      iota n i z = take n (iterate (+ z) i)
+      d = klankSpec (iota 12 f f) (geom 12 1 r1) r2
+      k = klank x 1 0 1 d
+  return (softClip (k * 0.1))
+
+main :: IO ()
+main = overlapTextureU (2,5,12,maxBound) =<< bowed_string
diff --git a/src/bowed-string.lhs b/src/bowed-string.lhs
deleted file mode 100644
--- a/src/bowed-string.lhs
+++ /dev/null
@@ -1,38 +0,0 @@
-bowed string (jmcc)
-
-> import Control.Monad
-> import Sound.SC3.Monadic
-> import System.Random
-
-> main =
->     let { rrand l r = getStdRandom (randomR (l, r))
->         ; choose l = fmap (l !!) (rrand 0 (length l - 1))
->         ; root = 5
->         ; scale = map (+ root) [0, 2, 4, 5, 7, 9, 11]
->         ; oct = [24, 36, 48, 60, 72, 84] }
->   in do { 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 <- fmap midiCPS (liftM2 (+) (choose scale) (choose oct))
->         ; n1 <- lfNoise1 kr r0
->         ; let { x = n0 * 0.007 * max 0 (n1 * 0.6 + 0.4)
->               ; geom n i z = take n (iterate (* z) i)
->               ; iota n i z = take n (iterate (+ z) i)
->               ; d = klankSpec (iota 12 f f) (geom 12 1 r1) r2
->               ; k = klank x 1 0 1 d }
->         in audition (out 0 (softClip (k * 0.1))) }
-
-{ 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 n1 = LFNoise1.kr(r0)
-; var r1 = Rand.new(0.7,0.9)
-; var r2 = Array.fill(12, { Rand.new(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
diff --git a/src/bowed-string.scd b/src/bowed-string.scd
new file mode 100644
--- /dev/null
+++ b/src/bowed-string.scd
@@ -0,0 +1,13 @@
+{ 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 n1 = LFNoise1.kr(r0)
+; var r1 = Rand.new(0.7,0.9)
+; var r2 = Array.fill(12,{ Rand.new(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
diff --git a/src/bs-070705.hs b/src/bs-070705.hs
new file mode 100644
--- /dev/null
+++ b/src/bs-070705.hs
@@ -0,0 +1,87 @@
+-- bs-070705 (rd)
+
+import Control.Monad
+import Sound.SC3.Monadic
+import Sound.OpenSoundControl
+import System.Random
+
+-- | One step in a bubble sort with specified /greater than/ function.
+bubble_p :: (a -> a -> Bool) -> [a] -> [a]
+bubble_p gt l =
+    case l of
+      e:f:g -> if e `gt` f
+               then f : bubble_p gt (e : g)
+               else e : bubble_p gt (f : g)
+      _ -> l
+
+-- | 'bubble_p' '>'.
+bubble :: (Ord a) => [a] -> [a]
+bubble = bubble_p (>)
+
+-- | One step in /odd even/ sorting, a bubble sort variant.
+odd_even :: (Ord a) => [a] -> [a]
+odd_even = reverse . bubble_p (<) . reverse . bubble_p (>)
+
+-- | Allocate required buffers to /n/ places.
+alloc_data :: Int -> IO ()
+alloc_data n = do
+  let alloc fd m b = async fd (b_alloc b m 1)
+  withSC3 (\fd -> mapM_ (alloc fd n) [10, 11, 12])
+
+-- | Simple synthesis renderer, r is the impulse frequency (trigger rate).
+play_data :: UGen -> IO ()
+play_data r = do
+  let inf_sc = 9e8
+  phase <- dseries inf_sc 0 1
+  f' <- dbufrd 10 phase Loop
+  a' <- dbufrd 11 phase Loop
+  p' <- dbufrd 12 phase Loop
+  let tr = impulse AR r 0
+      f'' = demand tr 0 f'
+      a'' = demand tr 0 a'
+      p'' = demand tr 0 p'
+  audition (out 0 (pan2 (ringz tr (midiCPS f'') 0.2) p'' a''))
+
+-- | Randomize initial data of /n/ places, /s/ sort for
+--   /m/ steps, pause for i seconds between each step.
+run_data :: ([Double] -> [Double]) -> Int -> Int -> Double -> IO ()
+run_data s n m i = do
+  f <- rrandl n 32 96
+  a <- rrandl n 0.25 1
+  p <- rrandl n (-1) 1
+  let prepare l' = take m (iterate s l')
+      f' = prepare f
+      a' = prepare a
+      p' = prepare p
+      l fd i' (f'', a'', p'') = do
+                     send fd (b_setn 10 [(0, f'')])
+                     send fd (b_setn 11 [(0, a'')])
+                     send fd (b_setn 12 [(0, p'')])
+                     pauseThread i'
+      c fd = mapM_ (l fd i) (zip3 f' a' p')
+  withSC3 c
+
+-- | A random number.
+rrand :: Double -> Double -> IO Double
+rrand l r = getStdRandom (randomR (l,r))
+
+-- | A list of random numbers.
+rrandl :: Int -> Double -> Double -> IO [Double]
+rrandl n l r = replicateM n (rrand l r)
+
+-- | Run 'odd_even' for 32 iterations at 1 second intervals.
+main :: IO ()
+main = do
+  alloc_data 96
+  play_data 24
+  run_data odd_even 96 32 1
+
+{--
+alloc_data 96
+play_data 24 >> run_data odd_even 96 96 0.35
+play_data 24 >> run_data bubble 96 64 0.75
+play_data 24 >> run_data bubble 96 64 0.25
+play_data 24 >> run_data bubble 96 32 0.25
+play_data 24 >> run_data odd_even 96 16 0.25
+--}
+
diff --git a/src/ccomb.hs b/src/ccomb.hs
new file mode 100644
--- /dev/null
+++ b/src/ccomb.hs
@@ -0,0 +1,21 @@
+-- ccomb (rd)
+
+import Sound.SC3.Monadic
+
+ccomb :: (Functor m,UId m) => m UGen
+ccomb = do
+  let rng l r i = linLin i (-1) 1 l r
+      lwr = 48
+      flwr = midiCPS lwr
+      spart t = do n <- fmap (rng lwr 72.0) (lfNoise2 KR 0.1)
+                   e <- fmap (decay2 t 0.01) (tRand 0.05 0.75 t)
+                   x <- fmap (* e) (whiteNoise AR)
+                   m <- lfNoise2 KR 0.1
+                   let f = lag (midiCPS n) 0.25
+                       m' = rng 1 8 m
+                   return (combC x (recip flwr) (recip f) m')
+  t <- dust KR (mce2 0.75 0.35)
+  return . (* 0.1) . sum =<< sequence (replicate 12 (spart t))
+
+main :: IO ()
+main = audition . out 0 =<< ccomb
diff --git a/src/ccomb.lhs b/src/ccomb.lhs
deleted file mode 100644
--- a/src/ccomb.lhs
+++ /dev/null
@@ -1,28 +0,0 @@
-ccomb (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { rng l r i = linLin i (-1) 1 l r
->       ; lwr = 48
->       ; flwr = midiCPS lwr
->       ; spart t = do { n <- fmap (rng lwr 72.0) (lfNoise2 kr 0.1)
->                      ; e <- fmap (decay2 t 0.01) (tRand 0.05 0.75 t)
->                      ; x <- fmap (* e) (whiteNoise ar)
->                      ; m <- lfNoise2 kr 0.1
->                      ; let f = lag (midiCPS n) 0.25
->                        in return (combC x (recip flwr) (recip f) (rng 1 8 m)) } }
->   in do { t <- dust kr (mce2 0.75 0.35)
->         ; audition . (out 0) . (* 0.1) . sum =<< sequence (replicate 12 (spart t)) }
-
-{ var lwr = 48
-; var flwr = lwr.midicps
-; 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 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
diff --git a/src/ccomb.scd b/src/ccomb.scd
new file mode 100644
--- /dev/null
+++ b/src/ccomb.scd
@@ -0,0 +1,11 @@
+{var lwr = 48
+;var flwr = lwr.midicps
+;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 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
diff --git a/src/cds-070701.hs b/src/cds-070701.hs
new file mode 100644
--- /dev/null
+++ b/src/cds-070701.hs
@@ -0,0 +1,110 @@
+-- | cds-070701 (rd)
+--
+-- The 'source' data are breakpoint sets normalized over the time
+-- interval (0,1).  There are a fixed number of 'locations' per cycle.
+-- The data sets are sampled at these locations and loaded into
+-- buffers.  The buffers are read using dbufrd.  One of the data sets
+-- gives the time interval to step forward.
+import Sound.OpenSoundControl
+import Sound.SC3.Monadic
+
+-- | Real
+type R = Double
+
+-- | Point
+type P = (R,R)
+
+-- | Data set
+type D = [P]
+
+-- | Points that bracket a time.
+pts :: D -> R -> (P,P)
+pts d n =
+    case d of
+      p0:p1:r -> let (t,_) = p1
+                 in if n <= t
+                    then (p0,p1)
+                    else pts (p1:r) n
+      _ -> error "pts"
+
+-- | Linear interpolation.
+--
+-- > lerp 0.5 (0,0) (1,1) == (0.5,0.5)
+-- > lerp 0.25 (0,0) (0.5,1) == (0.25,0.5)
+lerp :: R -> P -> P -> P
+lerp n (t0,d0) (t1,d1) =
+  let n' = (n - t0) / (t1 - t0)
+      f i = d0 + ((d1 - d0) * i)
+  in (n,f n')
+
+-- | Linear interpolating lookup.
+fetch :: D -> R -> P
+fetch t n =
+  let (p0,p1) = pts t n
+  in lerp n p0 p1
+
+-- | Linearize in time (ie. /t/ is in equal steps).
+rescale :: D -> Int -> D
+rescale t n = map (fetch t) [0,1 / fromIntegral n .. 1]
+
+-- | Allocate data buffers for linearized envelopes.
+alloc_data :: Int -> IO ()
+alloc_data n = do
+  let alloc fd b = async fd (b_alloc b n 1)
+  withSC3 (\fd -> mapM_ (alloc fd) [10,11,12,13])
+
+-- | Data can be loaded while nodes are running, ie. edited online.
+load_data :: Int -> (D,D,D,D) -> IO ()
+load_data n (t,f,a,p) = do
+  let setup d = map snd (rescale d n)
+  withSC3 (\fd -> do send fd (b_setn 10 [(0,setup t)])
+                     send fd (b_setn 11 [(0,setup f)])
+                     send fd (b_setn 12 [(0,setup a)])
+                     send fd (b_setn 13 [(0,setup p)]))
+
+-- | Simple synthesis of data.
+play_data :: IO ()
+play_data = do
+  let inf_sc = 9e8
+  phase <- dseries inf_sc 0 1
+  t' <- dbufrd 10 phase Loop
+  f' <- dbufrd 11 phase Loop
+  a' <- dbufrd 12 phase Loop
+  p' <- dbufrd 13 phase Loop
+  let tr = tDuty AR t' 0 DoNothing 1 0
+      f'' = demand tr 0 f'
+      a'' = demand tr 0 a'
+      p'' = demand tr 0 p'
+  audition (out 0 (pan2 (ringz tr f'' 0.2) p'' a''))
+
+-- | Sample data sets, load using 'load_data'.
+data_1 :: (D,D,D,D)
+data_1 = ([(0,0.1),(0.65,0.025),(1,0.1)]
+         ,[(0,200),(0.35,8900),(1,200)]
+         ,[(0,0.35),(0.65,0.65),(1,0.35)]
+         ,[(0,-1),(0.3,1),(1,-1)])
+
+data_2 :: (D,D,D,D)
+data_2 = ([(0,0.1),(0.5,0.005),(1,0.1)]
+         ,[(0,100),(0.5,13900),(1,200)]
+         ,[(0,0.75),(0.5,0.25),(1,0.75)]
+         ,[(0,1),(0.5,-1),(1,1)])
+
+data_3 :: (D,D,D,D)
+data_3 = ([(0,0.01),(0.5,0.25),(1,0.01)]
+         ,[(0,770),(0.5,77),(1,770)]
+         ,[(0,0.9),(0.5,0.6),(1,0.9)]
+         ,[(0,0),(0.5,1),(1,0)])
+
+-- | Switch between data sets at /dd/ at time interval /t/.
+data_switch :: [(D,D,D,D)] -> R -> IO ()
+data_switch dd t =
+    let w d = load_data 64 d >> pauseThread t
+    in mapM_ w dd >> data_switch dd t
+
+main :: IO ()
+main = do
+  alloc_data 64
+  load_data 64 data_1
+  play_data
+  data_switch [data_1,data_2,data_3] 4
diff --git a/src/chain-saw.hs b/src/chain-saw.hs
new file mode 100644
--- /dev/null
+++ b/src/chain-saw.hs
@@ -0,0 +1,50 @@
+-- chain saw (jrhb)
+
+{- this graph generates long chains of unit generators and may require
+increasing the stack limit of the haskell run time system -}
+
+import Control.Monad
+import qualified Sound.SC3.Lang.Random.IO as R
+import Sound.SC3.Monadic
+
+coinIf :: Double -> a -> a -> IO a
+coinIf n a b = do
+  r <- R.coin n
+  return (if r then a else b)
+
+exprange :: UGen -> UGen -> UGen -> UGen
+exprange s = linExp s (-1) 1
+
+chain :: Monad m => Int -> (b -> m b) -> b -> m b
+chain n fn = foldr (<=<) return (replicate n fn)
+
+mceProduct :: UGen -> UGen
+mceProduct = mceEdit (\l -> [product l])
+
+clipu :: BinaryOp a => a -> a
+clipu s = clip2 s 1
+
+dup :: UGen -> UGen
+dup a = mce2 a a
+
+chain_saw :: IO UGen
+chain_saw = do
+  let f s1 = do xr <- fmap dup (expRand 0.1 2)
+                n1 <- lfNoise1 KR xr
+                n2 <- lfNoise1 KR xr
+                n3 <- lfNoise1 KR xr
+                f1 <- coinIf 0.6 (exprange n1 0.01 10) (exprange n2 10 50)
+                s2 <- coinIf 0.5 (1 - s1) (mceReverse s1)
+                let f2 = linExp s1 (-1) 1 f1 (f1 * exprange n3 2 10)
+                    u1 = lfSaw KR f2 0
+                    u2 = lfSaw KR (f1 * 0.1) 0 * 0.1 + 1
+                return . clipu =<< coinIf 0.5 (u1 * s2) (u1 * u2)
+      inp = lfSaw KR (0.2 * mce2 1 1.1) 0
+      b_freq = mce [70, 800, 9000, 5242]
+  ff <- chain 8 f inp
+  let c_saw = mceProduct (saw AR (exprange ff 6 11000))
+      b_saw = dup (mix (bpf c_saw b_freq 0.2))
+  return (b_saw * 0.3)
+
+main :: IO ()
+main = audition . out 0 =<< chain_saw
diff --git a/src/chain-saw.lhs b/src/chain-saw.lhs
deleted file mode 100644
--- a/src/chain-saw.lhs
+++ /dev/null
@@ -1,56 +0,0 @@
-chain saw (jrhb)
-
-[this graph generates long chains of unit generators and may require
-increasing the stack limit of the haskell run time system]
-
-> import Control.Monad
-> import Sound.SC3.Monadic
-> import System.Random
-
-> main =
->    let { rrand l r = getStdRandom (randomR (l, r)) :: IO Double
->        ; coin n a b = do { m <- rrand 0.0 1.0
->                          ; return (if m > n then a else b) }
->        ; exprange s l r = linExp s (-1) 1 l r
->        ; chain n fn = foldr (<=<) return (replicate n fn)
->        ; mceProduct = mceEdit (\l -> [product l])
->        ; clipu s = clip2 s 1
->        ; dup a = mce2 a a
->        ; f s1 = do { xr <- fmap dup (expRand 0.1 2)
->                    ; n1 <- lfNoise1 kr xr
->                    ; n2 <- lfNoise1 kr xr
->                    ; n3 <- lfNoise1 kr xr
->                    ; f1 <- coin 0.6 (exprange n1 0.01 10) (exprange n2 10 50)
->                    ; s2 <- coin 0.5 (1 - s1) (mceReverse s1)
->                    ; let { f2 = linExp s1 (-1) 1 f1 (f1 * exprange n3 2 10)
->                          ; u1 = lfSaw kr f2 0
->                          ; u2 = lfSaw kr (f1 * 0.1) 0 * 0.1 + 1 }
->                   in return . clipu =<< coin 0.5 (u1 * s2) (u1 * u2) }
->        ; inp = lfSaw kr (0.2 * mce2 1 1.1) 0
->        ; b_freq = mce [70, 800, 9000, 5242] }
->   in do { ff <- chain 8 f inp
->         ; let { c_saw = mceProduct (saw ar (exprange ff 6 11000))
->               ; b_saw = dup (mix (bpf c_saw b_freq 0.2)) }
->         in audition (out 0 (b_saw * 0.3)) }
-
-{ var f = { arg s1
-          ; var rate = ExpRand.new(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 s2 = [1 - s1, s1.reverse].choose
-          ; var f2 = LinExp.kr(s1, -1, 1, f1, f1 * n3)
-          ; var u1 = LFSaw.kr(f2, 0)
-          ; var u2 = LFSaw.kr(f1 * 0.1, 0, 0.1, 1)
-          ; var u3 = if(0.5.coin) { u1 * s2 } { u1 * u2 }
-          ; u3.clip2(1) }
-; var g = { arg func, n
-          ; n.do { func = func <> func }
-          ; 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 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
diff --git a/src/chain-saw.scd b/src/chain-saw.scd
new file mode 100644
--- /dev/null
+++ b/src/chain-saw.scd
@@ -0,0 +1,21 @@
+{ var f = { arg s1
+          ; var rate = ExpRand.new(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 s2 = [1 - s1, s1.reverse].choose
+          ; var f2 = LinExp.kr(s1, -1, 1, f1, f1 * n3)
+          ; var u1 = LFSaw.kr(f2, 0)
+          ; var u2 = LFSaw.kr(f1 * 0.1, 0, 0.1, 1)
+          ; var u3 = if(0.5.coin) { u1 * s2 } { u1 * u2 }
+          ; u3.clip2(1) }
+; var g = { arg func, n
+          ; n.do { func = func <> func }
+          ; 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 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
diff --git a/src/choip.hs b/src/choip.hs
new file mode 100644
--- /dev/null
+++ b/src/choip.hs
@@ -0,0 +1,27 @@
+-- choip (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+xl :: ID a => a -> a -> UGen -> UGen -> UGen -> UGen
+xl e0 e1 l r t = xLine KR (expRand e0 l r) (expRand e1 l r) t DoNothing
+
+r2 :: ID a => a -> UGen -> UGen
+r2 e n = rand e (-n) n
+
+choip :: UGen
+choip =
+    let t = 12
+        i = impulse AR (xl 'a' 'b' 1 30 t) 0
+        f = xl 'c' 'd' 600 8000 t
+        a = sinOsc AR (decay2 i 0.05 0.5 * (-0.9 * f) + f) 0
+        l = line KR (r2 'e' 1) (r2 'f' 1) t DoNothing
+    in pan2 (decay2 (i * xl 'g' 'h' 0.01 0.5 t) 0.01 0.2 * a) l 1
+
+choip_pp :: UGen -> UGen
+choip_pp =
+    let f x = allpassN x 0.1 (udup 2 (rand 'a' 0 0.05)) 4
+    in useq 'a' 4 f
+
+main :: IO ()
+main = overlapTextureU_pp (10,1,8,maxBound) choip 2 choip_pp
diff --git a/src/choip.scd b/src/choip.scd
new file mode 100644
--- /dev/null
+++ b/src/choip.scd
@@ -0,0 +1,9 @@
+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)});
diff --git a/src/chrd-m.hs b/src/chrd-m.hs
new file mode 100644
--- /dev/null
+++ b/src/chrd-m.hs
@@ -0,0 +1,25 @@
+-- chrd (rd)
+
+import Sound.SC3.Monadic
+
+chrd :: IO UGen
+chrd = do
+  r0 <- rand 0.05 0.5
+  [r1, r2] <- sequence (replicate 2 (rand (-1) 1))
+  r3 <- rand 0.15 0.35
+  r4 <- rand 0.005 0.01
+  let m = mce [60, 65, 72, 77, 79, 84]
+      ds = 3
+      d = mce (map (* ds) [5, 4, 5, 7, 4, 5])
+      f = midiCPS (xLine KR m (m + r0) d DoNothing)
+      z = envTrapezoid 0 r3 d r4
+      e = envGen KR 1 1 0 1 DoNothing z
+      p = xLine KR r1 r2 d DoNothing
+      o = fSinOsc AR f 0
+  return (mix (pan2 o p e))
+
+chrd9 :: IO UGen
+chrd9 = return . mix =<< clone 9 chrd
+
+main :: IO ()
+main = audition . out 0 =<< chrd9
diff --git a/src/chrd-t.hs b/src/chrd-t.hs
new file mode 100644
--- /dev/null
+++ b/src/chrd-t.hs
@@ -0,0 +1,36 @@
+-- chrd-t (rd)
+
+import Control.Monad
+import Control.Monad.Random {- MonadRandom -}
+import Sound.SC3
+import Sound.SC3.Lang.Control.OverlapTexture {- hsc3-lang -}
+import Sound.SC3.Lang.Random.Monad
+
+chrd :: RandomGen g => [Int] -> Double -> Rand g UGen
+chrd ch ds = do
+  r0 <- rrand 0.05 0.5
+  r1 <- rrand (-1) 1
+  r2 <- rrand (-1) 1
+  r3 <- rrand 0.15 0.35
+  r4 <- rrand 0.005 0.01
+  let m = mce (map fromIntegral ch)
+      d = mce (map (* constant ds) [5, 4, 5, 7, 4, 5])
+      f = midiCPS (xLine KR m (m + r0) d DoNothing)
+      z = envTrapezoid 0 r3 d r4
+      e = envGen KR 1 1 0 1 DoNothing z
+      p = xLine KR r1 r2 d DoNothing
+      o = fSinOsc AR f 0
+  return (mix (pan2 o p e))
+
+chrdN :: RandomGen g => Int -> Int -> Double -> Rand g UGen
+chrdN i j ds = do
+  let scale = [0,2,4,5,7,9,11]
+      octaves = [4,5,6,7]
+  ch <- nchoose i [n + (o * 12) | n <- scale, o <- octaves]
+  c <- replicateM j (chrd ch ds)
+  return (sum c)
+
+main :: IO ()
+main = do
+  g <- getStdGen
+  overlapTextureS (0,21,3,maxBound) (runRand (chrdN 6 9 3)) g
diff --git a/src/chrd.lhs b/src/chrd.lhs
deleted file mode 100644
--- a/src/chrd.lhs
+++ /dev/null
@@ -1,36 +0,0 @@
-chrd (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let chrd = do { r0 <- rand 0.05 0.5
->                 ; [r1, r2] <- sequence (replicate 2 (rand (-1) 1))
->                 ; r3 <- rand 0.15 0.35
->                 ; r4 <- rand 0.005 0.01
->                 ; let { m = mce [60, 65, 72, 77, 79, 84]
->                       ; ds = 3
->                       ; d = mce (map (* ds) [5, 4, 5, 7, 4, 5])
->                       ; f = midiCPS (xLine kr m (m + r0) d DoNothing)
->                       ; z = envTrapezoid 0 r3 d r4
->                       ; e = envGen kr 1 1 0 1 DoNothing z
->                       ; p = xLine kr r1 r2 d DoNothing
->                       ; o = fSinOsc ar f 0 }
->                   in return (mix (pan2 o p e)) }
->   in audition . out 0 . mix =<< clone 9 chrd
-
-{ 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 m = [60, 65, 72, 77, 79, 84]
-             ; var ds = 3
-             ; var d = [5, 4, 5, 7, 4, 5] * ds
-             ; var f = XLine.kr(m, m + r0, d).midicps
-             ; var z_ = Env.linen(r3 * d, 0, (1 - r3) * d, r4)
-             ; var z = Env.sine(d.maxItem, r4)
-             ; var e = EnvGen.kr(z, 1, 1, 0, 1)
-             ; 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
diff --git a/src/chrd.scd b/src/chrd.scd
new file mode 100644
--- /dev/null
+++ b/src/chrd.scd
@@ -0,0 +1,16 @@
+{ 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 m = [60, 65, 72, 77, 79, 84]
+             ; var ds = 3
+             ; var d = [5, 4, 5, 7, 4, 5] * ds
+             ; var f = XLine.kr(m, m + r0, d).midicps
+             ; var z_ = Env.linen(r3 * d, 0, (1 - r3) * d, r4)
+             ; var z = Env.sine(d.maxItem, r4)
+             ; var e = EnvGen.kr(z, 1, 1, 0, 1)
+             ; 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
diff --git a/src/clustered-sines.hs b/src/clustered-sines.hs
new file mode 100644
--- /dev/null
+++ b/src/clustered-sines.hs
@@ -0,0 +1,21 @@
+-- clustered sines (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+cs :: UGen
+cs =
+    let n = 80
+        f1 = rand 'a' 100 1100
+        f2 = 4 * f1
+        sp = let y = (udup' n (f1 + rand 'a' 0 f2))
+             in klangSpec y (map (f1 /) y) (replicate n 0)
+    in uclone 'a' 2 (klang AR 1 0 sp * (0.3 / fromIntegral n))
+
+main :: IO ()
+main = xfadeTextureU (4,4,maxBound) cs
+
+{-
+audition (out 0 cs)
+Control.Concurrent.forkIO (Sound.SC3.UGen.Dot.draw (out 0 cs))
+-}
diff --git a/src/comb-delay-sweeps.hs b/src/comb-delay-sweeps.hs
new file mode 100644
--- /dev/null
+++ b/src/comb-delay-sweeps.hs
@@ -0,0 +1,32 @@
+-- comb delay sweeps (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+import System.Random
+
+type ST = (Double,Double,StdGen)
+
+wander :: ST -> ST
+wander (s,e,g) =
+    let (s',g') = randomR (-7,8) g
+        (e',g'') = randomR (-7,8) g'
+    in (foldToRange 50 120 (s + s')
+       ,foldToRange 50 120 (e + e')
+       ,g'')
+
+cds :: ST -> (UGen,ST)
+cds st =
+    let (s,e,g) = wander st
+        l = line KR (constant s) (constant e) 4 DoNothing
+        w = whiteNoise 'c' AR * 0.005
+        d = 1 / midiCPS l
+        c = 1 / midiCPS (constant s)
+        o = combC w 0.01 d (c * 1000)
+    in (pan2 o (rand 'd' (-1) 1) 1,(s,e,g))
+
+main :: IO ()
+main = overlapTextureS (4/3,4/3,9,maxBound) cds (60,61,mkStdGen 3567824)
+
+{-
+Sound.SC3.UGen.Dot.draw cds
+-}
diff --git a/src/contamination-zone.hs b/src/contamination-zone.hs
new file mode 100644
--- /dev/null
+++ b/src/contamination-zone.hs
@@ -0,0 +1,31 @@
+-- contamination zone (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+cz :: UGen
+cz =
+    let f = expRand 'a' 800 8000
+        p = let e = lfNoise1 'a' KR (rand 'a' 0 3) * 0.0008 + 0.0022
+            in pinkNoise 'a' AR * e
+        s = sinOsc KR (linRand 'a' 0 1 0) 0 * (0.7 * f) + f
+        k = let sp = klankSpec (udup' 4 (rand 'a' 50 2000))
+                               [1,1,1,1]
+                               (udup' 4 (rand 'a' 0.2 4))
+            in abs (klank p 1 0 1 sp) * iChoose 'a' (mce [-1,1])
+        r = rlpf k s 0.1
+        a = lfPulse KR (linRand 'a' 0 150 0) 0 (rand 'a' 0.2 0.4)
+    in pan2 r (lfNoise1 'a' KR (rand 'a' 0 1)) a
+
+cz_pp :: UGen -> UGen
+cz_pp =
+    let f x = allpassN x 0.04 (udup 2 (rand 'a' 0 0.04)) 16
+    in useq 'a' 6 f
+
+main :: IO ()
+main = overlapTextureU_pp (8,3,4,maxBound) cz 2 cz_pp
+
+{-
+audition (out 0 cz)
+audition (out 0 (cz_pp cz))
+-}
diff --git a/src/coolant.hs b/src/coolant.hs
new file mode 100644
--- /dev/null
+++ b/src/coolant.hs
@@ -0,0 +1,21 @@
+-- coolant (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+coolant :: UGen
+coolant =
+    let p = 20
+        s = onePole (udup 2 (brownNoise 'a' AR) * 0.0015) 0.95
+        n = replicate p 1
+        sp = mce [klankSpec (udup' p (rand 'a' 40 2400)) n n
+                 ,klankSpec (udup' p (rand 'b' 40 2400)) n n]
+    in klank s 1 0 1 (mceTranspose sp)
+
+main :: IO ()
+main = xfadeTextureU (4,4,maxBound) coolant
+
+{-
+audition (out 0 coolant)
+Sound.SC3.UGen.Dot.draw (out 0 coolant)
+-}
diff --git a/src/cricket.hs b/src/cricket.hs
new file mode 100644
--- /dev/null
+++ b/src/cricket.hs
@@ -0,0 +1,22 @@
+-- cricket (rd)
+
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.Monadic
+
+cricket :: UId m => m UGen
+cricket = do
+  r1 <- clone 2 (rand 10 13)
+  r2 <- clone 2 (rand 10 13)
+  r3 <- clone 2 (rand 4 7)
+  let t = impulse KR 0.7 0
+      e = decay2 (impulse KR r1 0) 0.001 0.005
+      f = sinOsc KR r2 0 * e * r3
+  r4 <- clone 2 (tRand 2130 2230 t)
+  return (sinOsc AR r4 0 * f * 0.25)
+
+main :: IO ()
+main = overlapTextureU (2,7,3,maxBound) =<< cricket
+
+{-
+audition . out 0 =<< cricket
+-}
diff --git a/src/cricket.lhs b/src/cricket.lhs
deleted file mode 100644
--- a/src/cricket.lhs
+++ /dev/null
@@ -1,22 +0,0 @@
-cricket (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { r1 <- clone 2 (rand 10 13)
->      ; r2 <- clone 2 (rand 10 13)
->      ; r3 <- clone 2 (rand 4 7)
->      ; let { t = impulse kr 0.7 0
->            ; e = decay2 (impulse kr r1 0) 0.001 0.005
->            ; f = sinOsc kr r2 0 * e * r3 }
->        in do { r4 <- clone 2 (tRand 2220 2227 t)
->              ; audition (out 0 (sinOsc ar r4 0 * f * 0.25)) } }
-
-{ 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 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
diff --git a/src/cricket.scd b/src/cricket.scd
new file mode 100644
--- /dev/null
+++ b/src/cricket.scd
@@ -0,0 +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 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
diff --git a/src/crotale-sine.hs b/src/crotale-sine.hs
new file mode 100644
--- /dev/null
+++ b/src/crotale-sine.hs
@@ -0,0 +1,133 @@
+-- crotale-sine (rd)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Pattern.ID
+
+crotale_sine :: UGen
+crotale_sine =
+    let (cf,ca) = crotale_data
+        g = control KR "gate" 1
+        m = control KR "m" 1
+        e = let p = envASR 1 1 1 (EnvNum (-4))
+            in envGen KR g 1 0 1 RemoveSynth p
+        fn m' f' a' =
+            let f = constant f'
+                a = constant a'
+                r0 = rand (f+0) 0 (2 * pi)
+                r1 = rand (f+1) 0.1 0.3
+                r2 = rand (f+2) 0.025 0.1
+                r3 = rand (f+3) 0 (2 * pi)
+                o = sinOsc AR (f * midiRatio (m' - 12)) r0
+                e' = e * sinOsc KR r1 0 * a
+            in pan2 o (sinOsc KR r2 r3) e'
+    in sum (zipWith (fn m) cf ca) * 0.1
+
+main :: IO ()
+main = do
+  let s = synthdef "crotale-sine" (out 0 crotale_sine)
+  audition (s,pbind [("m",pwhitei 'a' 0 12 inf)
+                    ,("dur",pxrand 'b' [1,2,3] inf)
+                    ,("sustain",6)])
+
+crotale_data :: ([Double],[Double])
+crotale_data =
+    ([35.45676040649414
+     ,128.59849548339844
+     ,346.9721984863281
+     ,483.5544128417969
+     ,1049.2449951171875
+     ,1564.0279541015625
+     ,1756.3399658203125
+     ,3391.666015625
+     ,3451.802001953125
+     ,3497.261962890625
+     ,3596.89794921875
+     ,3696.739013671875
+     ,3835.235107421875
+     ,3845.955078125
+     ,4254.85107421875
+     ,4407.533203125
+     ,4415.26416015625
+     ,4552.865234375
+     ,5538.076171875
+     ,5637.73681640625
+     ,5690.2978515625
+     ,5728.0068359375
+     ,5764.27685546875
+     ,5824.4189453125
+     ,6377.60498046875
+     ,6544.35009765625
+     ,6807.14404296875
+     ,6994.97021484375
+     ,7026.84619140625
+     ,7144.5859375
+     ,7269.61279296875
+     ,7393.6708984375
+     ,7897.259765625
+     ,8040.4580078125
+     ,8157.77099609375
+     ,8225.01953125
+     ,9126.150390625
+     ,9488.529296875
+     ,9916.408203125
+     ,10155.599609375
+     ,11715.9599609375
+     ,12111.830078125
+     ,12339.990234375
+     ,12417.669921875
+     ,12459.2802734375
+     ,12618.330078125
+     ,13116.490234375
+     ,13201.1298828125
+     ,13297.830078125
+     ,13533.75]
+    ,[0.0012827360769733787
+     ,0.0008040848188102245
+     ,0.017361238598823547
+     ,0.004835359752178192
+     ,0.004413491114974022
+     ,0.004110544919967651
+     ,0.0003338181704748422
+     ,0.0036140112206339836
+     ,0.006919348146766424
+     ,0.0003224937245249748
+     ,0.0006031467346474528
+     ,0.06686479598283768
+     ,0.000605064386036247
+     ,0.003602313343435526
+     ,0.0002835785271599889
+     ,0.015243238769471645
+     ,0.020536603406071663
+     ,0.016677580773830414
+     ,0.0009245267719961703
+     ,0.20205098390579224
+     ,0.0012542791664600372
+     ,0.012705927714705467
+     ,0.0002523190632928163
+     ,0.0004866079252678901
+     ,0.0006429700297303498
+     ,0.0007763264584355056
+     ,0.2081160992383957
+     ,0.0024918108247220516
+     ,0.00193469924852252
+     ,0.005231771152466536
+     ,0.0069242212921381
+     ,0.001203975174576044
+     ,0.2050020843744278
+     ,0.04060448706150055
+     ,0.0038344631902873516
+     ,0.002189427148550749
+     ,0.18056060373783112
+     ,0.002192433224990964
+     ,0.006516554858535528
+     ,0.009982921183109283
+     ,0.004745401442050934
+     ,0.046154771000146866
+     ,0.000510294979903847
+     ,0.0018905038014054298
+     ,0.0019782145973294973
+     ,0.006729386281222105
+     ,0.0023426134139299393
+     ,0.0024002245627343655
+     ,0.03515550494194031
+     ,0.0014084168942645192])
diff --git a/src/crotale-sine.lhs b/src/crotale-sine.lhs
deleted file mode 100644
--- a/src/crotale-sine.lhs
+++ /dev/null
@@ -1,170 +0,0 @@
-crotale-sine (rd)
-
-> import Sound.SC3.ID
-
-> main =
->     let { crotale = ( [ 35.45676040649414
->                       , 128.59849548339844
->                       , 346.9721984863281
->                       , 483.5544128417969
->                       , 1049.2449951171875
->                       , 1564.0279541015625
->                       , 1756.3399658203125
->                       , 3391.666015625
->                       , 3451.802001953125
->                       , 3497.261962890625
->                       , 3596.89794921875
->                       , 3696.739013671875
->                       , 3835.235107421875
->                       , 3845.955078125
->                       , 4254.85107421875
->                       , 4407.533203125
->                       , 4415.26416015625
->                       , 4552.865234375
->                       , 5538.076171875
->                       , 5637.73681640625
->                       , 5690.2978515625
->                       , 5728.0068359375
->                       , 5764.27685546875
->                       , 5824.4189453125
->                       , 6377.60498046875
->                       , 6544.35009765625
->                       , 6807.14404296875
->                       , 6994.97021484375
->                       , 7026.84619140625
->                       , 7144.5859375
->                       , 7269.61279296875
->                       , 7393.6708984375
->                       , 7897.259765625
->                       , 8040.4580078125
->                       , 8157.77099609375
->                       , 8225.01953125
->                       , 9126.150390625
->                       , 9488.529296875
->                       , 9916.408203125
->                       , 10155.599609375
->                       , 11715.9599609375
->                       , 12111.830078125
->                       , 12339.990234375
->                       , 12417.669921875
->                       , 12459.2802734375
->                       , 12618.330078125
->                       , 13116.490234375
->                       , 13201.1298828125
->                       , 13297.830078125
->                       , 13533.75 ]
->                     , [ 0.0012827360769733787
->                       , 0.0008040848188102245
->                       , 0.017361238598823547
->                       , 0.004835359752178192
->                       , 0.004413491114974022
->                       , 0.004110544919967651
->                       , 0.0003338181704748422
->                       , 0.0036140112206339836
->                       , 0.006919348146766424
->                       , 0.0003224937245249748
->                       , 0.0006031467346474528
->                       , 0.06686479598283768
->                       , 0.000605064386036247
->                       , 0.003602313343435526
->                       , 0.0002835785271599889
->                       , 0.015243238769471645
->                       , 0.020536603406071663
->                       , 0.016677580773830414
->                       , 0.0009245267719961703
->                       , 0.20205098390579224
->                       , 0.0012542791664600372
->                       , 0.012705927714705467
->                       , 0.0002523190632928163
->                       , 0.0004866079252678901
->                       , 0.0006429700297303498
->                       , 0.0007763264584355056
->                       , 0.2081160992383957
->                       , 0.0024918108247220516
->                       , 0.00193469924852252
->                       , 0.005231771152466536
->                       , 0.0069242212921381
->                       , 0.001203975174576044
->                       , 0.2050020843744278
->                       , 0.04060448706150055
->                       , 0.0038344631902873516
->                       , 0.002189427148550749
->                       , 0.18056060373783112
->                       , 0.002192433224990964
->                       , 0.006516554858535528
->                       , 0.009982921183109283
->                       , 0.004745401442050934
->                       , 0.046154771000146866
->                       , 0.000510294979903847
->                       , 0.0018905038014054298
->                       , 0.0019782145973294973
->                       , 0.006729386281222105
->                       , 0.0023426134139299393
->                       , 0.0024002245627343655
->                       , 0.03515550494194031
->                       , 0.0014084168942645192 ]
->                     , [ 5.203680992126465
->                       , 1.7034343481063843
->                       , 40.16516876220703
->                       , 27.282501220703125
->                       , 0.8950523138046265
->                       , 42.84742736816406
->                       , 2.6603667736053467
->                       , 15.7678861618042
->                       , 6.848367214202881
->                       , 3.2325007915496826
->                       , 1.7343382835388184
->                       , 2.0202419757843018
->                       , 4.7279052734375
->                       , 9.400103569030762
->                       , 0.7102512717247009
->                       , 37.494625091552734
->                       , 36.24879455566406
->                       , 29.172658920288086
->                       , 3.891019344329834
->                       , 4.757885456085205
->                       , 3.851426124572754
->                       , 20.90781021118164
->                       , 3.732874870300293
->                       , 2.3834102153778076
->                       , 10.443285942077637
->                       , 8.795611381530762
->                       , 20.98564338684082
->                       , 18.01180076599121
->                       , 25.297883987426758
->                       , 14.819819450378418
->                       , 42.39189910888672
->                       , 2.9485135078430176
->                       , 11.043763160705566
->                       , 49.55165100097656
->                       , 29.882694244384766
->                       , 10.527188301086426
->                       , 23.5572452545166
->                       , 26.55561637878418
->                       , 45.099605560302734
->                       , 22.550390243530273
->                       , 36.46126174926758
->                       , 11.826201438903809
->                       , 16.818185806274414
->                       , 14.903121948242188
->                       , 32.81113815307617
->                       , 43.1389045715332
->                       , 12.289558410644531
->                       , 11.498942375183105
->                       , 10.465788841247559
->                       , 24.93169593811035 ] )
->         ; (cf, ca, _) = crotale
->         ; fn m f a = let { r0 = rand (f+0) 0 (2 * pi)
->                          ; r1 = rand (f+1) 0.1 0.3
->                          ; r2 = rand (f+2) 0.025 0.1
->                          ; r3 = rand (f+3) 0 (2 * pi)
->                          ; o = sinOsc AR (f * midiRatio m) r0
->                          ; a' = a * sinOsc KR r1 0 }
->                      in pan2 o (sinOsc KR r2 r3) a'
->         ; oo = let { x = control KR "m" 1 }
->                in out 0 (sum (zipWith (fn x) cf ca) * 0.1)
->         }
->   in withSC3 (\fd -> do { _ <- async fd (d_recv (synthdef "c" oo))
->                         ; send fd (s_new "c" (-1) AddToTail 1 [("m",-12)])
->                         ; send fd (s_new "c" (-1) AddToTail 1 [("m",-9)])
->                         })
diff --git a/src/crotale.hs b/src/crotale.hs
new file mode 100644
--- /dev/null
+++ b/src/crotale.hs
@@ -0,0 +1,176 @@
+-- crotale (rd)
+
+import Sound.SC3.ID
+
+crotale :: UGen
+crotale =
+    let (cf,ca,cd) = crotale_data
+        ps = mce [-12,-5,0,2,4,5,7,12]
+        n = pinkNoise 'a' AR
+        t = dust 'a' KR 3
+        fs = select (tIRand 'a' 0 7 t) ps
+        g = tRand 'a' 0 1 t
+        fo = tRand 'b' 0 1 t
+        ds = tRand 'c' 2 7 t
+        p = tRand 'd' (-1) 1 t
+        s = decay2 t 0.06 0.01 * n * g
+        ks = klankSpec' cf ca (map recip cd)
+        k = dynKlank s (midiRatio fs) fo ds ks
+    in pan2 k p 1
+
+main :: IO ()
+main = audition (out 0 crotale)
+
+crotale_data :: ([Double],[Double],[Double])
+crotale_data =
+    ([35.45676040649414
+     ,128.59849548339844
+     ,346.9721984863281
+     ,483.5544128417969
+     ,1049.2449951171875
+     ,1564.0279541015625
+     ,1756.3399658203125
+     ,3391.666015625
+     ,3451.802001953125
+     ,3497.261962890625
+     ,3596.89794921875
+     ,3696.739013671875
+     ,3835.235107421875
+     ,3845.955078125
+     ,4254.85107421875
+     ,4407.533203125
+     ,4415.26416015625
+     ,4552.865234375
+     ,5538.076171875
+     ,5637.73681640625
+     ,5690.2978515625
+     ,5728.0068359375
+     ,5764.27685546875
+     ,5824.4189453125
+     ,6377.60498046875
+     ,6544.35009765625
+     ,6807.14404296875
+     ,6994.97021484375
+     ,7026.84619140625
+     ,7144.5859375
+     ,7269.61279296875
+     ,7393.6708984375
+     ,7897.259765625
+     ,8040.4580078125
+     ,8157.77099609375
+     ,8225.01953125
+     ,9126.150390625
+     ,9488.529296875
+     ,9916.408203125
+     ,10155.599609375
+     ,11715.9599609375
+     ,12111.830078125
+     ,12339.990234375
+     ,12417.669921875
+     ,12459.2802734375
+     ,12618.330078125
+     ,13116.490234375
+     ,13201.1298828125
+     ,13297.830078125
+     ,13533.75]
+    ,[0.0012827360769733787
+     ,0.0008040848188102245
+     ,0.017361238598823547
+     ,0.004835359752178192
+     ,0.004413491114974022
+     ,0.004110544919967651
+     ,0.0003338181704748422
+     ,0.0036140112206339836
+     ,0.006919348146766424
+     ,0.0003224937245249748
+     ,0.0006031467346474528
+     ,0.06686479598283768
+     ,0.000605064386036247
+     ,0.003602313343435526
+     ,0.0002835785271599889
+     ,0.015243238769471645
+     ,0.020536603406071663
+     ,0.016677580773830414
+     ,0.0009245267719961703
+     ,0.20205098390579224
+     ,0.0012542791664600372
+     ,0.012705927714705467
+     ,0.0002523190632928163
+     ,0.0004866079252678901
+     ,0.0006429700297303498
+     ,0.0007763264584355056
+     ,0.2081160992383957
+     ,0.0024918108247220516
+     ,0.00193469924852252
+     ,0.005231771152466536
+     ,0.0069242212921381
+     ,0.001203975174576044
+     ,0.2050020843744278
+     ,0.04060448706150055
+     ,0.0038344631902873516
+     ,0.002189427148550749
+     ,0.18056060373783112
+     ,0.002192433224990964
+     ,0.006516554858535528
+     ,0.009982921183109283
+     ,0.004745401442050934
+     ,0.046154771000146866
+     ,0.000510294979903847
+     ,0.0018905038014054298
+     ,0.0019782145973294973
+     ,0.006729386281222105
+     ,0.0023426134139299393
+     ,0.0024002245627343655
+     ,0.03515550494194031
+     ,0.0014084168942645192]
+    ,[5.203680992126465
+     ,1.7034343481063843
+     ,40.16516876220703
+     ,27.282501220703125
+     ,0.8950523138046265
+     ,42.84742736816406
+     ,2.6603667736053467
+     ,15.7678861618042
+     ,6.848367214202881
+     ,3.2325007915496826
+     ,1.7343382835388184
+     ,2.0202419757843018
+     ,4.7279052734375
+     ,9.400103569030762
+     ,0.7102512717247009
+     ,37.494625091552734
+     ,36.24879455566406
+     ,29.172658920288086
+     ,3.891019344329834
+     ,4.757885456085205
+     ,3.851426124572754
+     ,20.90781021118164
+     ,3.732874870300293
+     ,2.3834102153778076
+     ,10.443285942077637
+     ,8.795611381530762
+     ,20.98564338684082
+     ,18.01180076599121
+     ,25.297883987426758
+     ,14.819819450378418
+     ,42.39189910888672
+     ,2.9485135078430176
+     ,11.043763160705566
+     ,49.55165100097656
+     ,29.882694244384766
+     ,10.527188301086426
+     ,23.5572452545166
+     ,26.55561637878418
+     ,45.099605560302734
+     ,22.550390243530273
+     ,36.46126174926758
+     ,11.826201438903809
+     ,16.818185806274414
+     ,14.903121948242188
+     ,32.81113815307617
+     ,43.1389045715332
+     ,12.289558410644531
+     ,11.498942375183105
+     ,10.465788841247559
+     ,24.93169593811035])
+
diff --git a/src/crotale.lhs b/src/crotale.lhs
deleted file mode 100644
--- a/src/crotale.lhs
+++ /dev/null
@@ -1,333 +0,0 @@
-crotale (rd)
-
-> import Sound.SC3.ID
-
-> main =
->     let { crotale = ( [ 35.45676040649414
->                       , 128.59849548339844
->                       , 346.9721984863281
->                       , 483.5544128417969
->                       , 1049.2449951171875
->                       , 1564.0279541015625
->                       , 1756.3399658203125
->                       , 3391.666015625
->                       , 3451.802001953125
->                       , 3497.261962890625
->                       , 3596.89794921875
->                       , 3696.739013671875
->                       , 3835.235107421875
->                       , 3845.955078125
->                       , 4254.85107421875
->                       , 4407.533203125
->                       , 4415.26416015625
->                       , 4552.865234375
->                       , 5538.076171875
->                       , 5637.73681640625
->                       , 5690.2978515625
->                       , 5728.0068359375
->                       , 5764.27685546875
->                       , 5824.4189453125
->                       , 6377.60498046875
->                       , 6544.35009765625
->                       , 6807.14404296875
->                       , 6994.97021484375
->                       , 7026.84619140625
->                       , 7144.5859375
->                       , 7269.61279296875
->                       , 7393.6708984375
->                       , 7897.259765625
->                       , 8040.4580078125
->                       , 8157.77099609375
->                       , 8225.01953125
->                       , 9126.150390625
->                       , 9488.529296875
->                       , 9916.408203125
->                       , 10155.599609375
->                       , 11715.9599609375
->                       , 12111.830078125
->                       , 12339.990234375
->                       , 12417.669921875
->                       , 12459.2802734375
->                       , 12618.330078125
->                       , 13116.490234375
->                       , 13201.1298828125
->                       , 13297.830078125
->                       , 13533.75 ]
->                     , [ 0.0012827360769733787
->                       , 0.0008040848188102245
->                       , 0.017361238598823547
->                       , 0.004835359752178192
->                       , 0.004413491114974022
->                       , 0.004110544919967651
->                       , 0.0003338181704748422
->                       , 0.0036140112206339836
->                       , 0.006919348146766424
->                       , 0.0003224937245249748
->                       , 0.0006031467346474528
->                       , 0.06686479598283768
->                       , 0.000605064386036247
->                       , 0.003602313343435526
->                       , 0.0002835785271599889
->                       , 0.015243238769471645
->                       , 0.020536603406071663
->                       , 0.016677580773830414
->                       , 0.0009245267719961703
->                       , 0.20205098390579224
->                       , 0.0012542791664600372
->                       , 0.012705927714705467
->                       , 0.0002523190632928163
->                       , 0.0004866079252678901
->                       , 0.0006429700297303498
->                       , 0.0007763264584355056
->                       , 0.2081160992383957
->                       , 0.0024918108247220516
->                       , 0.00193469924852252
->                       , 0.005231771152466536
->                       , 0.0069242212921381
->                       , 0.001203975174576044
->                       , 0.2050020843744278
->                       , 0.04060448706150055
->                       , 0.0038344631902873516
->                       , 0.002189427148550749
->                       , 0.18056060373783112
->                       , 0.002192433224990964
->                       , 0.006516554858535528
->                       , 0.009982921183109283
->                       , 0.004745401442050934
->                       , 0.046154771000146866
->                       , 0.000510294979903847
->                       , 0.0018905038014054298
->                       , 0.0019782145973294973
->                       , 0.006729386281222105
->                       , 0.0023426134139299393
->                       , 0.0024002245627343655
->                       , 0.03515550494194031
->                       , 0.0014084168942645192 ]
->                     , [ 5.203680992126465
->                       , 1.7034343481063843
->                       , 40.16516876220703
->                       , 27.282501220703125
->                       , 0.8950523138046265
->                       , 42.84742736816406
->                       , 2.6603667736053467
->                       , 15.7678861618042
->                       , 6.848367214202881
->                       , 3.2325007915496826
->                       , 1.7343382835388184
->                       , 2.0202419757843018
->                       , 4.7279052734375
->                       , 9.400103569030762
->                       , 0.7102512717247009
->                       , 37.494625091552734
->                       , 36.24879455566406
->                       , 29.172658920288086
->                       , 3.891019344329834
->                       , 4.757885456085205
->                       , 3.851426124572754
->                       , 20.90781021118164
->                       , 3.732874870300293
->                       , 2.3834102153778076
->                       , 10.443285942077637
->                       , 8.795611381530762
->                       , 20.98564338684082
->                       , 18.01180076599121
->                       , 25.297883987426758
->                       , 14.819819450378418
->                       , 42.39189910888672
->                       , 2.9485135078430176
->                       , 11.043763160705566
->                       , 49.55165100097656
->                       , 29.882694244384766
->                       , 10.527188301086426
->                       , 23.5572452545166
->                       , 26.55561637878418
->                       , 45.099605560302734
->                       , 22.550390243530273
->                       , 36.46126174926758
->                       , 11.826201438903809
->                       , 16.818185806274414
->                       , 14.903121948242188
->                       , 32.81113815307617
->                       , 43.1389045715332
->                       , 12.289558410644531
->                       , 11.498942375183105
->                       , 10.465788841247559
->                       , 24.93169593811035 ] )
->         ; (cf, ca, cd) = crotale
->         ; ps = mce [-12, -5, 0, 2, 4, 5, 7, 12]
->         ; n = pinkNoise 'a' ar
->         ; t = dust 'a' kr 3
->         ; fs = select (tiRand 'a' 0 7 t) ps
->         ; g = tRand 'a' 0 1 t
->         ; fo = tRand 'b' 0 1 t
->         ; ds = tRand 'c' 2 7 t
->         ; p = tRand 'd' (-1) 1 t
->         ; s = decay2 t 0.06 0.01 * n * g
->         ; ks = klankSpec cf ca (map recip cd)
->         ; k = dynKlank s (midiRatio fs) fo ds ks }
->   in audition (out 0 (pan2 k p 1))
-
-{ var crotale = [ [ 35.45676040649414
-                  , 128.59849548339844
-                  , 346.9721984863281
-                  , 483.5544128417969
-                  , 1049.2449951171875
-                  , 1564.0279541015625
-                  , 1756.3399658203125
-                  , 3391.666015625
-                  , 3451.802001953125
-                  , 3497.261962890625
-                  , 3596.89794921875
-                  , 3696.739013671875
-                  , 3835.235107421875
-                  , 3845.955078125
-                  , 4254.85107421875
-                  , 4407.533203125
-                  , 4415.26416015625
-                  , 4552.865234375
-                  , 5538.076171875
-                  , 5637.73681640625
-                  , 5690.2978515625
-                  , 5728.0068359375
-                  , 5764.27685546875
-                  , 5824.4189453125
-                  , 6377.60498046875
-                  , 6544.35009765625
-                  , 6807.14404296875
-                  , 6994.97021484375
-                  , 7026.84619140625
-                  , 7144.5859375
-                  , 7269.61279296875
-                  , 7393.6708984375
-                  , 7897.259765625
-                  , 8040.4580078125
-                  , 8157.77099609375
-                  , 8225.01953125
-                  , 9126.150390625
-                  , 9488.529296875
-                  , 9916.408203125
-                  , 10155.599609375
-                  , 11715.9599609375
-                  , 12111.830078125
-                  , 12339.990234375
-                  , 12417.669921875
-                  , 12459.2802734375
-                  , 12618.330078125
-                  , 13116.490234375
-                  , 13201.1298828125
-                  , 13297.830078125
-                  , 13533.75 ]
-                , [ 0.0012827360769733787
-                  , 0.0008040848188102245
-                  , 0.017361238598823547
-                  , 0.004835359752178192
-                  , 0.004413491114974022
-                  , 0.004110544919967651
-                  , 0.0003338181704748422
-                  , 0.0036140112206339836
-                  , 0.006919348146766424
-                  , 0.0003224937245249748
-                  , 0.0006031467346474528
-                  , 0.06686479598283768
-                  , 0.000605064386036247
-                  , 0.003602313343435526
-                  , 0.0002835785271599889
-                  , 0.015243238769471645
-                  , 0.020536603406071663
-                  , 0.016677580773830414
-                  , 0.0009245267719961703
-                  , 0.20205098390579224
-                  , 0.0012542791664600372
-                  , 0.012705927714705467
-                  , 0.0002523190632928163
-                  , 0.0004866079252678901
-                  , 0.0006429700297303498
-                  , 0.0007763264584355056
-                  , 0.2081160992383957
-                  , 0.0024918108247220516
-                  , 0.00193469924852252
-                  , 0.005231771152466536
-                  , 0.0069242212921381
-                  , 0.001203975174576044
-                  , 0.2050020843744278
-                  , 0.04060448706150055
-                  , 0.0038344631902873516
-                  , 0.002189427148550749
-                  , 0.18056060373783112
-                  , 0.002192433224990964
-                  , 0.006516554858535528
-                  , 0.009982921183109283
-                  , 0.004745401442050934
-                  , 0.046154771000146866
-                  , 0.000510294979903847
-                  , 0.0018905038014054298
-                  , 0.0019782145973294973
-                  , 0.006729386281222105
-                  , 0.0023426134139299393
-                  , 0.0024002245627343655
-                  , 0.03515550494194031
-                  , 0.0014084168942645192 ]
-                , [ 5.203680992126465
-                  , 1.7034343481063843
-                  , 40.16516876220703
-                  , 27.282501220703125
-                  , 0.8950523138046265
-                  , 42.84742736816406
-                  , 2.6603667736053467
-                  , 15.7678861618042
-                  , 6.848367214202881
-                  , 3.2325007915496826
-                  , 1.7343382835388184
-                  , 2.0202419757843018
-                  , 4.7279052734375
-                  , 9.400103569030762
-                  , 0.7102512717247009
-                  , 37.494625091552734
-                  , 36.24879455566406
-                  , 29.172658920288086
-                  , 3.891019344329834
-                  , 4.757885456085205
-                  , 3.851426124572754
-                  , 20.90781021118164
-                  , 3.732874870300293
-                  , 2.3834102153778076
-                  , 10.443285942077637
-                  , 8.795611381530762
-                  , 20.98564338684082
-                  , 18.01180076599121
-                  , 25.297883987426758
-                  , 14.819819450378418
-                  , 42.39189910888672
-                  , 2.9485135078430176
-                  , 11.043763160705566
-                  , 49.55165100097656
-                  , 29.882694244384766
-                  , 10.527188301086426
-                  , 23.5572452545166
-                  , 26.55561637878418
-                  , 45.099605560302734
-                  , 22.550390243530273
-                  , 36.46126174926758
-                  , 11.826201438903809
-                  , 16.818185806274414
-                  , 14.903121948242188
-                  , 32.81113815307617
-                  , 43.1389045715332
-                  , 12.289558410644531
-                  , 11.498942375183105
-                  , 10.465788841247559
-                  , 24.93169593811035 ] ]
-; var cf = crotale[0]
-; var ca = crotale[1]
-; var cd = crotale[2]
-; var ps = [-12, -5, 0, 2, 4, 5, 7, 12]
-; 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)
-; var fo = TRand.kr(0, 1, t)
-; var ds = TRand.kr(2, 7, t)
-; 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
diff --git a/src/crotale.scd b/src/crotale.scd
new file mode 100644
--- /dev/null
+++ b/src/crotale.scd
@@ -0,0 +1,164 @@
+{ var crotale = [ [ 35.45676040649414
+                  , 128.59849548339844
+                  , 346.9721984863281
+                  , 483.5544128417969
+                  , 1049.2449951171875
+                  , 1564.0279541015625
+                  , 1756.3399658203125
+                  , 3391.666015625
+                  , 3451.802001953125
+                  , 3497.261962890625
+                  , 3596.89794921875
+                  , 3696.739013671875
+                  , 3835.235107421875
+                  , 3845.955078125
+                  , 4254.85107421875
+                  , 4407.533203125
+                  , 4415.26416015625
+                  , 4552.865234375
+                  , 5538.076171875
+                  , 5637.73681640625
+                  , 5690.2978515625
+                  , 5728.0068359375
+                  , 5764.27685546875
+                  , 5824.4189453125
+                  , 6377.60498046875
+                  , 6544.35009765625
+                  , 6807.14404296875
+                  , 6994.97021484375
+                  , 7026.84619140625
+                  , 7144.5859375
+                  , 7269.61279296875
+                  , 7393.6708984375
+                  , 7897.259765625
+                  , 8040.4580078125
+                  , 8157.77099609375
+                  , 8225.01953125
+                  , 9126.150390625
+                  , 9488.529296875
+                  , 9916.408203125
+                  , 10155.599609375
+                  , 11715.9599609375
+                  , 12111.830078125
+                  , 12339.990234375
+                  , 12417.669921875
+                  , 12459.2802734375
+                  , 12618.330078125
+                  , 13116.490234375
+                  , 13201.1298828125
+                  , 13297.830078125
+                  , 13533.75 ]
+                , [ 0.0012827360769733787
+                  , 0.0008040848188102245
+                  , 0.017361238598823547
+                  , 0.004835359752178192
+                  , 0.004413491114974022
+                  , 0.004110544919967651
+                  , 0.0003338181704748422
+                  , 0.0036140112206339836
+                  , 0.006919348146766424
+                  , 0.0003224937245249748
+                  , 0.0006031467346474528
+                  , 0.06686479598283768
+                  , 0.000605064386036247
+                  , 0.003602313343435526
+                  , 0.0002835785271599889
+                  , 0.015243238769471645
+                  , 0.020536603406071663
+                  , 0.016677580773830414
+                  , 0.0009245267719961703
+                  , 0.20205098390579224
+                  , 0.0012542791664600372
+                  , 0.012705927714705467
+                  , 0.0002523190632928163
+                  , 0.0004866079252678901
+                  , 0.0006429700297303498
+                  , 0.0007763264584355056
+                  , 0.2081160992383957
+                  , 0.0024918108247220516
+                  , 0.00193469924852252
+                  , 0.005231771152466536
+                  , 0.0069242212921381
+                  , 0.001203975174576044
+                  , 0.2050020843744278
+                  , 0.04060448706150055
+                  , 0.0038344631902873516
+                  , 0.002189427148550749
+                  , 0.18056060373783112
+                  , 0.002192433224990964
+                  , 0.006516554858535528
+                  , 0.009982921183109283
+                  , 0.004745401442050934
+                  , 0.046154771000146866
+                  , 0.000510294979903847
+                  , 0.0018905038014054298
+                  , 0.0019782145973294973
+                  , 0.006729386281222105
+                  , 0.0023426134139299393
+                  , 0.0024002245627343655
+                  , 0.03515550494194031
+                  , 0.0014084168942645192 ]
+                , [ 5.203680992126465
+                  , 1.7034343481063843
+                  , 40.16516876220703
+                  , 27.282501220703125
+                  , 0.8950523138046265
+                  , 42.84742736816406
+                  , 2.6603667736053467
+                  , 15.7678861618042
+                  , 6.848367214202881
+                  , 3.2325007915496826
+                  , 1.7343382835388184
+                  , 2.0202419757843018
+                  , 4.7279052734375
+                  , 9.400103569030762
+                  , 0.7102512717247009
+                  , 37.494625091552734
+                  , 36.24879455566406
+                  , 29.172658920288086
+                  , 3.891019344329834
+                  , 4.757885456085205
+                  , 3.851426124572754
+                  , 20.90781021118164
+                  , 3.732874870300293
+                  , 2.3834102153778076
+                  , 10.443285942077637
+                  , 8.795611381530762
+                  , 20.98564338684082
+                  , 18.01180076599121
+                  , 25.297883987426758
+                  , 14.819819450378418
+                  , 42.39189910888672
+                  , 2.9485135078430176
+                  , 11.043763160705566
+                  , 49.55165100097656
+                  , 29.882694244384766
+                  , 10.527188301086426
+                  , 23.5572452545166
+                  , 26.55561637878418
+                  , 45.099605560302734
+                  , 22.550390243530273
+                  , 36.46126174926758
+                  , 11.826201438903809
+                  , 16.818185806274414
+                  , 14.903121948242188
+                  , 32.81113815307617
+                  , 43.1389045715332
+                  , 12.289558410644531
+                  , 11.498942375183105
+                  , 10.465788841247559
+                  , 24.93169593811035 ] ]
+; var cf = crotale[0]
+; var ca = crotale[1]
+; var cd = crotale[2]
+; var ps = [-12, -5, 0, 2, 4, 5, 7, 12]
+; 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)
+; var fo = TRand.kr(0, 1, t)
+; var ds = TRand.kr(2, 7, t)
+; 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
diff --git a/src/cut-outs.hs b/src/cut-outs.hs
new file mode 100644
--- /dev/null
+++ b/src/cut-outs.hs
@@ -0,0 +1,19 @@
+-- cut-outs (rd)
+
+import Sound.SC3.Monadic
+
+cut_outs :: (Functor m,UId m) => m UGen
+cut_outs = do
+  let t = impulse AR 22 0 * (sinOsc KR 0.5 0 + 1)
+      x = mouseX' KR 0.005 0.12 Exponential 0.1
+      y = mouseY' KR 0.01 0.52 Exponential 0.1
+      n = do n1 <- lfNoise0 KR 2
+             n2 <- coinGate (0.05 + n1 + y * 0.4 + t * 0.5) (t * 0.5)
+             n3 <- tExpRand (mce2 500 900) 1600 t
+             return (ringz n2 n3 x)
+  s <- fmap sum (sequence (replicate 3 n))
+  b <- tRand 0 1 =<< dust KR 8
+  return (mrg [clip2 s (in' 1 KR 0) * 0.25,out 0 b])
+
+main :: IO ()
+main = audition . out 0 =<< cut_outs
diff --git a/src/cut-outs.lhs b/src/cut-outs.lhs
deleted file mode 100644
--- a/src/cut-outs.lhs
+++ /dev/null
@@ -1,30 +0,0 @@
-cut-outs (rd)
-
-> import Sound.SC3.Monadic
-> import qualified Sound.SC3.ID as I
-
-> main =
->   let { t = impulse ar 22 0 * (sinOsc kr 0.5 0 + 1)
->       ; x = linLin (I.lfNoise0 'a' KR 1) (-1) 1 0.005 0.012
->    {- ; x = mouseX kr 0.005 0.12 Exponential 0.1 -}
->       ; y = linLin (I.lfNoise0 'b' KR 1) (-1) 1 0.01 0.52
->    {- ; y = mouseY kr 0.01 0.52 Exponential 0.1 -}
->       ; n = do { n1 <- lfNoise0 kr 2
->                ; n2 <- coinGate (0.05 + n1 + y * 0.4 + t * 0.5) (t * 0.5)
->                ; n3 <- tExpRand (mce2 500 900) 1600 t
->                ; return (ringz n2 n3 x) } }
->   in do { s <- fmap sum (sequence (replicate 3 n))
->         ; b <- tRand 0 1 =<< dust kr 8
->         ; audition (mrg [out 0 b, out 0 (clip2 s (in' 1 kr 0) * 0.25)]) }
-
-{ var t = Impulse.ar(22, 0) * (SinOsc.kr(0.5, 0) + 1)
-; var x = MouseX.kr(0.005, 0.12, 'exponential', 0.1)
-; var y = MouseY.kr(0.01, 0.52, 'exponential', 0.1)
-; var n = { var n1 = LFNoise0.kr(2)
-          ; var n2 = CoinGate.ar(0.05 + n1 + (y * 0.4) + (t * 0.5), t * 0.5)
-          ; var n3 = TExpRand.ar([500, 900], 1600, t)
-          ; Ringz.ar(n2, n3, x) }
-; 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
diff --git a/src/cut-outs.scd b/src/cut-outs.scd
new file mode 100644
--- /dev/null
+++ b/src/cut-outs.scd
@@ -0,0 +1,11 @@
+{ var t = Impulse.ar(22, 0) * (SinOsc.kr(0.5, 0) + 1)
+; var x = MouseX.kr(0.005, 0.12, 'exponential', 0.1)
+; var y = MouseY.kr(0.01, 0.52, 'exponential', 0.1)
+; var n = { var n1 = LFNoise0.kr(2)
+          ; var n2 = CoinGate.ar(0.05 + n1 + (y * 0.4) + (t * 0.5), t * 0.5)
+          ; var n3 = TExpRand.ar([500, 900], 1600, t)
+          ; Ringz.ar(n2, n3, x) }
+; 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
diff --git a/src/cymbalism-accelerando.hs b/src/cymbalism-accelerando.hs
new file mode 100644
--- /dev/null
+++ b/src/cymbalism-accelerando.hs
@@ -0,0 +1,24 @@
+-- cymbalism accellerando (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+enumFromN :: Enum a => a -> Int -> [Int]
+enumFromN e i = let j = fromEnum e in [j .. j + i]
+
+cymbalism_accellerando :: UGen
+cymbalism_accellerando =
+  let y n = let f1 = rand n 500 2500
+                f2 = rand n 0 8000
+                f = map (\e -> rand e f1 (f1 + f2)) (enumFromN n 15)
+                rt = map (\e -> rand e 1 5) (enumFromN n 15)
+          in klankSpec f (replicate 15 1) rt
+      z = mce2 (y 'a') (y 'A')
+      w = whiteNoise 'α' AR * 0.02
+      tf = xLine KR (linRand 'β' 0.5 4.5 0) (rand 'γ' 0.5 35.5) 12 DoNothing
+      t = impulse AR tf 0
+      s = decay t 0.004 * w
+  in klank s 1 0 1 (mceTranspose z)
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) cymbalism_accellerando
diff --git a/src/cymbalism.hs b/src/cymbalism.hs
new file mode 100644
--- /dev/null
+++ b/src/cymbalism.hs
@@ -0,0 +1,26 @@
+-- cymbalism (jmcc)
+
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.Monadic
+
+cymbalism :: (Functor m,UId m) => m UGen
+cymbalism = do
+  let p = replicate 15
+  f1 <- rand 500 2500
+  f2 <- rand 0 8000
+  let y = do f <- sequence (p (rand f1 (f1 + f2)))
+             rt <- sequence (p (rand 1 5))
+             return (klankSpec f (p 1) rt)
+  z <- clone 2 y
+  n <- fmap (* 0.03) (whiteNoise AR)
+  tf <- rand 0.5 3.5
+  let t = impulse AR tf 0
+      s = decay t 0.004 * n
+  return (klank s 1 0 1 (mceTranspose z))
+
+main :: IO ()
+main = overlapTextureU (3,6,6,maxBound) =<< cymbalism
+
+{-
+main = audition . out 0 =<< cymbalism
+-}
diff --git a/src/cymbalism.lhs b/src/cymbalism.lhs
deleted file mode 100644
--- a/src/cymbalism.lhs
+++ /dev/null
@@ -1,30 +0,0 @@
-cymbalism (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let p = replicate 15
->   in do { f1 <- rand 500 2500
->         ; f2 <- rand 0 8000
->         ; let y = do { f <- sequence (p (rand f1 (f1 + f2)))
->                      ; rt <- sequence (p (rand 1 5))
->                      ; return (klankSpec f (p 1) rt) }
->           in do { z <- clone 2 y
->                 ; n <- fmap (* 0.03) (whiteNoise ar)
->                 ; tf <- rand 0.5 3.5
->                 ; let { t = impulse ar tf 0
->                       ; s = decay t 0.004 * n
->                       ; k = klank s 1 0 1 (mceTranspose z) }
->                   in audition (out 0 k) } }
-
-{ 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) })
-          ; `[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 s = Decay.ar(t, 0.004) * n
-; Out.ar(0, Klank.ar(z, s)) }.play
diff --git a/src/cymbalism.scd b/src/cymbalism.scd
new file mode 100644
--- /dev/null
+++ b/src/cymbalism.scd
@@ -0,0 +1,11 @@
+{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)})
+         ;`[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 s = Decay.ar(t,0.004) * n
+;Out.ar(0,Klank.ar(z,s))}.play
diff --git a/src/dark-sea-horns.hs b/src/dark-sea-horns.hs
new file mode 100644
--- /dev/null
+++ b/src/dark-sea-horns.hs
@@ -0,0 +1,20 @@
+-- dark sea horns (jl)
+-- http://sccode.org/1-j#c51
+
+import Sound.SC3.ID
+
+dark_sea_horns :: UGen
+dark_sea_horns =
+    let n = lfNoise1
+        x = localIn 2 AR
+        a = tanh (sinOsc AR 65 (x * n 'a' AR 0.1 * 3) * (n 'a' AR 3 * 6))
+        f i = allpassN i 0.3 (udup 2 (rand 'a' 0.1 0.3)) 5
+        o = tanh (useq 'a' 9 f a)
+    in mrg2 o (localOut o)
+
+main :: IO ()
+main = audition (out 0 dark_sea_horns)
+
+{-
+Sound.SC3.UGen.Dot.draw dark_sea_horns
+-}
diff --git a/src/dark-sea-horns.scd b/src/dark-sea-horns.scd
new file mode 100644
--- /dev/null
+++ b/src/dark-sea-horns.scd
@@ -0,0 +1,13 @@
+{n=LFNoise1
+;x=LocalIn.ar(2)
+;a=SinOsc.ar(65,x*n.ar(0.1,3),n.ar(3,6)).tanh
+;9.do{a=AllpassL.ar(a,0.3,{0.2.rand+0.1}!2,5)}
+;a=a.tanh
+;LocalOut.ar(a)
+;a}.play
+
+n=LFNoise1;
+Ndef(\x,{
+a=SinOsc.ar(65,Ndef(\x).ar*n.ar(0.1,3),n.ar(3,6)).tanh;
+9.do{a=AllpassL.ar(a,0.3,{0.2.rand+0.1}!2,5)};
+a.tanh}).play
diff --git a/src/data-space.hs b/src/data-space.hs
new file mode 100644
--- /dev/null
+++ b/src/data-space.hs
@@ -0,0 +1,25 @@
+-- data space (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+randz :: ID a => a -> UGen -> UGen
+randz e = rand e 0
+
+data_space :: UGen
+data_space =
+    let r = randz
+        p0 = lfPulse KR (r 'a' 200) 0 (r 'b' 1)
+	p1 = lfPulse KR (r 'c' 40) 0 (r 'd' 1) * r 'e' 8000 + r 'f' 2000
+        p2 = lfPulse KR (r 'g' 20) 0 (r 'h' 1)
+        p3 = lfPulse KR (r 'i' 4) 0 (r 'j' 1) * r 'k' 8000 + r 'l'  2000
+        p4 = lfPulse KR (r 'm' 20) 0 (r 'n' 1)
+        p5 = lfPulse KR (r 'o' 4) 0 (r 'p' 1) * r 'q' 8000 + r 'r'  2000
+        f = p0 * p1 + p2 * p3 + p4 * p5
+        dt = rand 's' 0.15 0.35
+        o = lfPulse AR f 0 0.5 * 0.04
+        l = lfNoise0 't' KR (r 'u' 3) * 0.8
+    in combL (pan2 o l 1) dt dt 3
+
+main :: IO ()
+main = overlapTextureU (6,1,4,maxBound) data_space
diff --git a/src/deep-sea.hs b/src/deep-sea.hs
new file mode 100644
--- /dev/null
+++ b/src/deep-sea.hs
@@ -0,0 +1,37 @@
+-- deep sea (jrhb)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Pattern.ID
+
+rng :: UGen -> UGen -> UGen -> UGen
+rng s l r =
+    let m = (r - l) * 0.5
+    in mulAdd s m (m + l)
+
+deep_sea :: UGen
+deep_sea =
+    let amp = 1
+        pan = 0
+        variation = 0.9
+        n = rand 'α' 7 46
+        dt1 = 25.0 + rand 'β' (-1.7) 1.7
+        dt2 = (dt1 + lfNoise2 'γ' KR 2) * variation * 0.001
+        f = 901 + rand 'δ' 0 65
+        t = impulse AR (recip dt2) 0 * 100
+        count = pulseCount t 0
+        mul = count <* n
+        u1 = bpf (mul * t) f 1 * 0.1
+        f2 = f * ((count `modE` rng (lfNoise1 'ε' KR 1) 2 20) + 1)
+        u2 = bpf u1 f2 1 * 0.2
+    in mrg [pan2 u2 pan (amp * 10)
+           ,detectSilence u2 0.0001 0.2 RemoveSynth]
+
+main :: IO ()
+main = do
+  let s = synthdef "deep-sea" (out 0 deep_sea)
+  audition (s,pbind [("dur",pxrand 'a' [0.25,0.5,1,2] inf)])
+
+{-
+Sound.SC3.UGen.Dot.draw (out 0 deep_sea)
+audition (out 0 deep_sea)
+-}
diff --git a/src/deep-sea.lhs b/src/deep-sea.lhs
deleted file mode 100644
--- a/src/deep-sea.lhs
+++ /dev/null
@@ -1,37 +0,0 @@
-deep sea (jrhb)
-
-> import Sound.SC3.ID
-
-> main =
->   let { range s l r = let m = (r - l) * 0.5 in mulAdd s m (m + l)
->       ; amp = 1
->       ; pan = 0
->       ; variation = 0.9
->       ; n = rand 'α' 7 46
->       ; dt1 = 25.0 + rand 'β' (-1.7) 1.7
->       ; dt2 = (dt1 + lfNoise2 'γ' kr 2) * variation * 0.001
->       ; f = 901 + rand 'δ' 0 65
->       ; t = impulse ar (recip dt2) 0 * 100
->       ; count = pulseCount t 0
->       ; mul = count <* n
->       ; u1 = bpf (mul * t) f 1 * 0.1
->       ; f2 = f * ((count `modE` range (lfNoise1 'ε' kr 1) 2 20) + 1)
->       ; u2 = bpf u1 f2 1 * 0.2 }
->   in audition (mrg [ detectSilence u2 0.0001 0.2 RemoveSynth
->                    , out 0 (pan2 u2 pan (amp * 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 dt2 = (dt1 + LFNoise2.kr(2)) * variation * 0.001
-; var freq = 901 + Rand.new(0, 65)
-; var t = Impulse.ar(dt2.reciprocal, 0, 100)
-; var count = PulseCount.ar(t, 0)
-; var mul = count < n
-; var u1 = BPF.ar(mul * t, freq, 1) * 0.1
-; 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
diff --git a/src/deep-sea.scd b/src/deep-sea.scd
new file mode 100644
--- /dev/null
+++ b/src/deep-sea.scd
@@ -0,0 +1,15 @@
+{ 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 dt2 = (dt1 + LFNoise2.kr(2)) * variation * 0.001
+; var freq = 901 + Rand.new(0, 65)
+; var t = Impulse.ar(dt2.reciprocal, 0, 100)
+; var count = PulseCount.ar(t, 0)
+; var mul = count < n
+; var u1 = BPF.ar(mul * t, freq, 1) * 0.1
+; 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
diff --git a/src/deep-trip.hs b/src/deep-trip.hs
new file mode 100644
--- /dev/null
+++ b/src/deep-trip.hs
@@ -0,0 +1,19 @@
+-- deep trip (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+deep_trip :: UGen
+deep_trip =
+    let f = midiCPS (lfNoise1 'a' KR (rand 'a' 0 0.3) * 60 + 70)
+        a'' = sinOsc KR (rand 'b' 0 40) 0 * 0.1
+        a' = max 0 (lfNoise1 'c' KR (rand 'd' 0 8) * a'')
+        a = lfNoise2 'e' AR (f * rand 'f' 0 0.5) * a'
+        z = sinOsc AR f 0 * a
+        s = pan2 z (lfNoise1 'g' KR (rand 'h' 0 5)) 1
+        c0 = combN s 0.5 (mce [rand 'i' 0.3 0.5,rand 'j' 0.3 0.5]) 20
+        c1 = combN s 0.5 (mce [rand 'k' 0.3 0.5,rand 'l' 0.3 0.5]) 20
+        in s + c0 + c1
+
+main :: IO ()
+main = overlapTextureU (12,4,4,maxBound) deep_trip
diff --git a/src/default.hs b/src/default.hs
new file mode 100644
--- /dev/null
+++ b/src/default.hs
@@ -0,0 +1,24 @@
+-- default (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Pattern.ID
+
+defaultInstrument :: Synthdef
+defaultInstrument =
+    let f = control KR "freq" 440
+        a = control KR "amp" 0.1
+        p = control KR "pan" 0
+        g = control KR "gate" 1
+        e = linen g 0.01 0.7 0.3 RemoveSynth
+        f3 = mce [f,f + rand 'a' (-0.4) 0,f + rand 'b' 0 0.4]
+        l = xLine KR (rand 'c' 4000 5000) (rand 'd' 2500 3200) 1 DoNothing
+        z = lpf (mix (varSaw AR f3 0 0.3 * 0.3)) l * e
+    in synthdef "default" (out 0 (pan2 z p a))
+
+main :: IO ()
+main = audition (defaultInstrument
+                ,pbind [("note",pxrand 'a' [0,1,5,7,9] inf)
+                       ,("octave",prand 'b' [3,4,5,6] inf)
+                       ,("dur",pwrand 'c' [0.1,0.2,0.4] [0.5,0.4,0.1] inf)
+                       ,("amp",pbrown 'd' 0.01 0.2 0.01 inf)
+                       ,("pan",pbrown 'e' (-1) 1 0.25 inf)])
diff --git a/src/default.lhs b/src/default.lhs
deleted file mode 100644
--- a/src/default.lhs
+++ /dev/null
@@ -1,36 +0,0 @@
-default (jmcc)
-
-> import Sound.SC3.Monadic
-> import Sound.OpenSoundControl
-> import System.Random
-
-> main =
->   let { def = do { r0 <- rand (-0.4) 0.0
->                  ; r1 <- rand 0.0 0.4
->                  ; r2 <- rand 4000 5000
->                  ; r3 <- rand 2500 3200
->                  ; let { f = control KR "freq" 440
->                        ; a = control KR "amp" 0.1
->                        ; p = control KR "pan" 0
->                        ; g = control KR "gate" 1
->                        ; e = linen g 0.01 (a * 0.7) 0.3 RemoveSynth
->                        ; f3 = mce [f, f + r0, f + r1]
->                        ; l = xLine KR r2 r3 1 DoNothing
->                        ; z = lpf (mix (varSaw AR f3 0 0.3)) l * e }
->                    in return (pan2 z p 1) }
->       ; rrand lr = getStdRandom (randomR lr)
->       ; tone fd nid = do { pan <- rrand (-1, 1)
->                          ; amp <- rrand (0.1, 0.3)
->                          ; indx <- rrand (0, 7)
->                          ; let note = [60, 62, 64, 65, 67, 69, 71, 72] !! indx
->                            in send fd (s_new "default" nid AddToTail 1
->                                        [("freq", midiCPS note)
->                                        ,("pan", pan)
->                                        ,("amp", amp)])
->                          ; pauseThread 0.075
->                          ; send fd (n_set nid [("gate", 0)])
->                          ; pauseThread 0.075 } }
->   in withSC3 (\fd -> do { u <- def
->                         ; async fd (d_recv (synthdef "default" (out 0 u)))
->                         ; reset fd
->                         ; mapM_ (tone fd) [1024..1036] })
diff --git a/src/default.scd b/src/default.scd
new file mode 100644
--- /dev/null
+++ b/src/default.scd
@@ -0,0 +1,8 @@
+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));
+},[\ir]).add;
diff --git a/src/demanding-studies.hs b/src/demanding-studies.hs
new file mode 100644
--- /dev/null
+++ b/src/demanding-studies.hs
@@ -0,0 +1,19 @@
+-- demanding studies (jmcc)
+
+import Sound.SC3.ID
+
+demanding_studies :: UGen
+demanding_studies =
+  let s1 = drand 'a' dinf (mce [72, 75, 79, 82])
+      s2 = drand 'b' 1 (mce [82, 84, 86])
+      s3 = dseq 'c' dinf (mce [72, 75, 79, s2])
+      x = mouseX' KR 5 13 Linear 0.2
+      tr = impulse KR x 0
+      f = demand tr 0 (mce [midiCPS (s1 - 12), midiCPS s3])
+      o1 = sinOsc AR (f + mce2 0 0.7) 0
+      o2 = saw AR (f + mce2 0 0.7) * 0.3
+      o3 = cubed (distort (log (distort (o1 + o2))))
+  in o3 * 0.1
+
+main :: IO ()
+main = audition (out 0 demanding_studies)
diff --git a/src/demanding-studies.lhs b/src/demanding-studies.lhs
deleted file mode 100644
--- a/src/demanding-studies.lhs
+++ /dev/null
@@ -1,27 +0,0 @@
-demanding studies (jmcc)
-
-> import Sound.SC3.ID
-
-> main =
->   let { s1 = drand 'a' dinf (mce [72, 75, 79, 82])
->       ; s2 = drand 'b' 1 (mce [82, 84, 86])
->       ; s3 = dseq 'c' dinf (mce [72, 75, 79, s2])
->       ; x = linLin (lfNoise0 'd' KR 1) (-1) 1 5 13 
->    {- ; x = mouseX kr 5 13 Linear 0.2 -}
->       ; tr = impulse kr x 0
->       ; f = demand tr 0 (mce [midiCPS (s1 - 12), midiCPS s3])
->       ; o1 = sinOsc ar (f + mce2 0 0.7) 0
->       ; o2 = saw ar (f + mce2 0 0.7) * 0.3
->       ; o3 = cubed (distort (log (distort (o1 + o2)))) }
->   in audition (out 0 (o3 * 0.1))
-
-{ 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)
-; 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
diff --git a/src/demanding-studies.scd b/src/demanding-studies.scd
new file mode 100644
--- /dev/null
+++ b/src/demanding-studies.scd
@@ -0,0 +1,10 @@
+{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)
+;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
diff --git a/src/dial-history.hs b/src/dial-history.hs
new file mode 100644
--- /dev/null
+++ b/src/dial-history.hs
@@ -0,0 +1,35 @@
+-- dial history (jrhb)
+
+import Data.List
+import Sound.SC3.Monadic
+
+rng :: UGen -> UGen -> UGen -> UGen
+rng s = linLin s 0 1
+
+dial_history :: UId m => m UGen
+dial_history = do
+  let mfv = [[697,770,852,941],[1209,1336,1477,1633]]
+      numbers = [3,1] : [[a,b] | a <- [0..2],b <- [0..2]]
+      mce_r = mce . map mce
+  n <- dwhite dinf 7 12
+  w <- dwhite 1 2 7
+  b <- dbrown n 0.1 0.2 0.01
+  rate <- dseq dinf (mce2 w b)
+  q <- dseq dinf (mce [1..10])
+  g1 <- grayNoise AR
+  g2 <- grayNoise AR
+  d <- lfdNoise3 KR 0.5
+  let tr = trig (tDuty KR rate 0 DoNothing q 1) 0.09
+      pat = latch tr tr
+      x = mouseX' KR 0 1 Linear 0.2
+      h = hasher (pat * x)
+      which = trunc (rng h 0 (constant (length numbers))) 1
+      both = select which (mce_r numbers)
+      dial = select both (mce_r (transpose mfv))
+      sig = sinOsc AR dial 0 * 0.05 * tr
+      dsig = delayN sig 0.2 (rng d 0 0.01)
+      hiss = g1 * 0.01 + hpf (g2 * 0.02) 3000
+  return (dsig + hiss)
+
+main :: IO ()
+main = audition . out 0 =<< dial_history
diff --git a/src/dial-history.lhs b/src/dial-history.lhs
deleted file mode 100644
--- a/src/dial-history.lhs
+++ /dev/null
@@ -1,54 +0,0 @@
-dial history (jrhb)
-
-> import Data.List
-> import Sound.SC3.Monadic
-> import qualified Sound.SC3.ID as I
-
-> main =
->   let { mfv = [[697, 770, 852, 941], [1209, 1336, 1477, 1633]]
->       ; numbers = [[3, 1]] ++ [[a, b] | a <- [0..2], b <- [0..2]]
->       ; range s l r = linLin s 0 1 l r
->       ; mce_r = mce . map mce }
->   in do { n <- dwhite dinf 7 12
->         ; w <- dwhite 1 2 7
->         ; b <- dbrown n 0.1 0.2 0.01
->         ; rate <- dseq dinf (mce2 w b)
->         ; q <- dseq dinf (mce [1..10])
->         ; g1 <- grayNoise ar
->         ; g2 <- grayNoise ar
->         ; d <- lfdNoise3 kr 0.5
->         ; let { tr = trig (tDuty kr rate 0 DoNothing q 1) 0.09
->               ; pat = latch tr tr
->               ; x = linLin (I.lfNoise0 'a' KR 1) (-1) 1 0 1
->            {- ; x = mouseX kr 0 1 Linear 0.2 -}
->               ; h = hasher (pat * x)
->               ; which = trunc (range 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 (range d 0 0.01)
->               ; hiss = g1 * 0.01 + hpf (g2 * 0.02) 3000 }
->           in audition (out 0 (dsig + hiss)) }
-
-{ 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 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)
-; var h = Hasher.kr(pat * x)
-; var which = h.range(0, numbers.size).trunc.(1)
-; var both = Select.kr(which, numbers)
-; var dial = Select.kr(both, mfv.flop)
-; 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 z = Silent.ar(1)
-; var hiss = g1 * 0.01 + HPF.ar(g2 * 0.02, 3000)
-; Out.ar(0, [z, dsig + hiss]) }.play
diff --git a/src/dial-history.scd b/src/dial-history.scd
new file mode 100644
--- /dev/null
+++ b/src/dial-history.scd
@@ -0,0 +1,22 @@
+{ 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 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)
+; var h = Hasher.kr(pat * x)
+; var which = h.range(0, numbers.size).trunc.(1)
+; var both = Select.kr(which, numbers)
+; var dial = Select.kr(both, mfv.flop)
+; 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 z = Silent.ar(1)
+; var hiss = g1 * 0.01 + HPF.ar(g2 * 0.02, 3000)
+; Out.ar(0, [z, dsig + hiss]) }.play
diff --git a/src/diffraction.hs b/src/diffraction.hs
new file mode 100644
--- /dev/null
+++ b/src/diffraction.hs
@@ -0,0 +1,28 @@
+-- diffraction (rd)
+
+import Control.Monad
+import Sound.SC3.Monadic
+
+diffraction ::(Functor m, UId m) => m UGen
+diffraction = do
+  let p = do let x = mouseX' KR 0.001 0.02 Exponential 0.1
+                 y = mouseY' KR 120 400 Exponential 0.1
+             f <- fmap (* mce2 32 64) (lfNoise0 KR 4)
+             w <- fmap (* x) (lfNoise0 KR 32)
+             z <- fmap (* 0.1) (lfNoise0 KR 2)
+             m <- lfNoise0 KR 6
+             let s = pulse AR f w
+             return (resonz s (y + z) (m * 0.4 + 0.8) * 0.5)
+      q = do n <- lfNoise0 KR 128
+             s <- p
+             return (combN s 0.2 (n * 0.1 + 0.1) 3)
+      r = let x = mouseX' KR 0.75 1.25 Exponential 0.1
+              y = mouseY' KR 0.25 1 Exponential 0.1
+              f _ = do fr <- fmap (* x) (rand 50 59)
+                       am <- fmap (* y) (rand 0.04 0.16)
+                       return (sinOsc AR fr 0 * am)
+          in liftM2 mce2 (mixFillM 16 f) (mixFillM 12 f)
+  return.sum =<< sequence [p, q, r]
+
+main :: IO ()
+main = audition . out 0 =<< diffraction
diff --git a/src/diffraction.lhs b/src/diffraction.lhs
deleted file mode 100644
--- a/src/diffraction.lhs
+++ /dev/null
@@ -1,47 +0,0 @@
-diffraction (rd)
-
-> import Control.Monad
-> import Sound.SC3.Monadic
-> import qualified Sound.SC3.ID as I
-
-> main =
->   let { p = let { x = linLin (I.lfNoise0 'a' KR 1) (-1) 1 0.001 0.02 
->              {- ; x = mouseX kr 0.001 0.02 Exponential 0.1 -}
->                 ; y = linLin (I.lfNoise0 'b' KR 1) (-1) 1 120 400
->              {- ; y = mouseY kr 120 400 Exponential 0.1 -} }
->             in do { f <- fmap (* mce2 32 64) (lfNoise0 kr 4)
->                   ; w <- fmap (* x) (lfNoise0 kr 32)
->                   ; z <- fmap (* 0.1) (lfNoise0 kr 2)
->                   ; m <- lfNoise0 kr 6
->                   ; let s = pulse ar f w
->                     in return (resonz s (y + z) (m * 0.4 + 0.8) * 0.5) }
->       ; q = do { n <- lfNoise0 kr 128
->                ; s <- p
->                ; return (combN s 0.2 (n * 0.1 + 0.1) 3) }
->       ; r = let { x = linLin (I.lfNoise0 'c' KR 1) (-1) 1 0.75 1.25
->              {- ; x = mouseX kr 0.75 1.25 Exponential 0.1 -}
->                 ; y = linLin (I.lfNoise0 'c' KR 1) (-1) 1 0.25 1
->              {- ; y = mouseY kr 0.25 1 Exponential 0.1 -}
->                 ; f _ = do { fr <- fmap (* x) (rand 50 59)
->                            ; am <- fmap (* y) (rand 0.04 0.16)
->                            ; return (sinOsc ar fr 0 * am) } }
->             in liftM2 mce2 (mixFillM 16 f) (mixFillM 12 f) }
->   in audition . (out 0) . sum =<< sequence [p, q, r]
-
-{ var x = MouseX.kr(0.001, 0.02, 'exponential', 0.1)
-; var y = MouseY.kr(120, 400, 'exponential', 0.1)
-; var p = { var f = LFNoise0.kr(4) * [32, 64]
-	      ; var w = LFNoise0.kr(32) * x
-	      ; var z = LFNoise0.kr(2) * 0.1
-          ; var m = LFNoise0.kr(6)
-	      ; 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) }
-; 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
diff --git a/src/diffraction.scd b/src/diffraction.scd
new file mode 100644
--- /dev/null
+++ b/src/diffraction.scd
@@ -0,0 +1,17 @@
+{var x = MouseX.kr(0.001,0.02,'exponential',0.1)
+;var y = MouseY.kr(120,400,'exponential',0.1)
+;var p = {var f = LFNoise0.kr(4) * [32,64]
+         ;var w = LFNoise0.kr(32) * x
+         ;var z = LFNoise0.kr(2) * 0.1
+         ;var m = LFNoise0.kr(6)
+         ;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)}
+;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
diff --git a/src/discretion-m.hs b/src/discretion-m.hs
new file mode 100644
--- /dev/null
+++ b/src/discretion-m.hs
@@ -0,0 +1,23 @@
+-- discretion-m (rd)
+
+import Sound.SC3.Monadic
+
+discretion :: IO UGen
+discretion = do
+  let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
+      part = do f1 <- clone 2 (rand 50 55)
+                f2 <- clone 2 (rand 50 65)
+                f3 <- clone 2 (rand 50 55)
+                a <- clone 2 (rand 0.01 0.035)
+                let t = 21
+                    f_ = mkls [(0,f1),(0.33,f2),(1,f3)] t
+                    a_ = mkls [(0,0),(0.33,a),(1,0)] t
+                return (saw AR f_ * a_)
+  fmap mix (clone 8 part)
+
+main :: IO ()
+main = audition . out 0 =<< discretion
+
+{-
+Sound.SC3.UGen.Dot.draw =<< discretion
+-}
diff --git a/src/discretion.hs b/src/discretion.hs
new file mode 100644
--- /dev/null
+++ b/src/discretion.hs
@@ -0,0 +1,23 @@
+-- discretion (rd)
+
+import Sound.SC3.ID
+
+discretion :: UGen
+discretion =
+  let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
+      part = let f1 = udup 2 (rand 'a' 50 55)
+                 f2 = udup 2 (rand 'c' 50 65)
+                 f3 = udup 2 (rand 'e' 50 55)
+                 a = udup 2 (rand 'g' 0.01 0.035)
+                 t = 21
+                 f_ = mkls [(0,f1),(0.33,f2),(1,f3)] t
+                 a_ = mkls [(0,0),(0.33,a),(1,0)] t
+             in (saw AR f_ * a_)
+  in mix (uclone 'a' 8 part)
+
+main :: IO ()
+main = audition (out 0 discretion)
+
+{-
+Sound.SC3.UGen.Dot.draw discretion
+-}
diff --git a/src/discretion.lhs b/src/discretion.lhs
deleted file mode 100644
--- a/src/discretion.lhs
+++ /dev/null
@@ -1,15 +0,0 @@
-discretion (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { mkls bp t = envGen kr 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
->       ; part = do { f1 <- clone 2 (rand 50 55)
->                   ; f2 <- clone 2 (rand 50 65)
->                   ; f3 <- clone 2 (rand 50 55)
->                   ; a <- clone 2 (rand 0.01 0.035)
->                   ; let { t = 21
->                         ; f_ = mkls [(0, f1), (0.33, f2), (1, f3)] t
->                         ; a_ = mkls [(0, 0), (0.33, a), (1, 0)] t }
->                     in return (saw ar f_ * a_) } }
->   in audition . out 0 . mix =<< clone 8 part
diff --git a/src/doppler.hs b/src/doppler.hs
new file mode 100644
--- /dev/null
+++ b/src/doppler.hs
@@ -0,0 +1,32 @@
+-- doppler (jmcc,rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3
+
+-- observer at origin, signal 's' at coordinates ('x','y')
+doppler :: (UGen,UGen) -> UGen -> UGen
+doppler (x,y) s =
+    let d = hypot x y
+        a = 40 / squared d
+        maxd = 110
+    in delayL s (maxd / 344) (d / 344) * a
+
+-- straight line at x axis from (-y,y) over dt seconds
+line_x :: UGen -> UGen -> UGen -> (UGen,UGen)
+line_x x y dt = (x,line KR (-y) y dt RemoveSynth)
+
+-- ellipse centered at origin and interecting x at +-a and y at +-b.
+-- traversal is over dt seconds
+ellipse :: UGen -> UGen -> UGen -> (UGen,UGen)
+ellipse a b dt =
+    let t = line KR (-pi/2) (pi * 3/2) dt RemoveSynth
+    in (a * cos t,b * sin t)
+
+main :: IO ()
+main = do
+  let s = rlpf (fSinOsc AR 200 0 * lfPulse AR 31.3 0 0.4) 400 0.3
+  withSC3 (\fd -> do print "line_x"
+                     play fd (out 0 (doppler (line_x 10 100 6) s))
+                     pauseThread 8
+                     print "ellipse"
+                     play fd (out 0 (doppler (ellipse 10 75 12) s)))
diff --git a/src/drummer.hs b/src/drummer.hs
new file mode 100644
--- /dev/null
+++ b/src/drummer.hs
@@ -0,0 +1,18 @@
+-- drummer (thor magnusson)
+
+import Sound.SC3.ID
+
+drummer :: UGen
+drummer =
+  let n = whiteNoise 'α' AR
+      tempo = 4
+      tr = impulse AR tempo 0
+      tr_2 = pulseDivider tr 4 2
+      tr_4 = pulseDivider tr 4 0
+      snare = n * decay2 tr_2 0.005 0.5
+      bass = sinOsc AR 60 0 * decay2 tr_4 0.005 0.5
+      hihat = hpf n 10000 * decay2 tr 0.005 0.5
+  in pan2 (snare + bass + hihat) 0 0.4
+
+main :: IO ()
+main = audition (out 0 drummer)
diff --git a/src/drummer.lhs b/src/drummer.lhs
deleted file mode 100644
--- a/src/drummer.lhs
+++ /dev/null
@@ -1,24 +0,0 @@
-drummer (thor magnusson)
-
-> import Sound.SC3.ID
-
-> main =
->   let { n = whiteNoise 'α' AR
->       ; tempo = 4
->       ; tr = impulse AR tempo 0
->       ; tr_2 = pulseDivider tr 4 2
->       ; tr_4 = pulseDivider tr 4 0
->       ; snare = n * decay2 tr_2 0.005 0.5
->       ; bass = sinOsc AR 60 0 * decay2 tr_4 0.005 0.5
->       ; hihat = hpf n 10000 * decay2 tr 0.005 0.5 }
->   in audition (out 0 (pan2 (snare + bass + hihat) 0 0.4))
-
-{ 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/src/drummer.scd b/src/drummer.scd
new file mode 100644
--- /dev/null
+++ b/src/drummer.scd
@@ -0,0 +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
diff --git a/src/e-lamell-p.hs b/src/e-lamell-p.hs
new file mode 100644
--- /dev/null
+++ b/src/e-lamell-p.hs
@@ -0,0 +1,43 @@
+-- e-lamell-p (rd)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.Event
+import Sound.SC3.Lang.Pattern.ID
+
+e_lamell :: UGen
+e_lamell =
+    let ctl = control KR
+        f = ctl "freq" 440
+        a = ctl "amp" 1
+        d = ctl "d" 0.1
+        n = ctl "n" 12
+        l = ctl "l" 0
+        t = iChoose 'a' (mce2 1 32)
+        h = line AR n t d DoNothing
+        s = blip AR f h
+        e_d = envPerc 0.005 d
+        e = envGen AR 1 a 0 1 RemoveSynth e_d
+    in pan2 s l e
+
+pattern :: P Event
+pattern =
+  let p = pbind [("note",prand 'a' [0,2,5,7] inf)
+                ,("octave",pwrand 'b' [2,3,4,5] [0.2,0.35,0.35,0.1] inf)
+                ,("dur",0.1)
+                ,("d",pwhite 'c' 0.01 0.8 inf)
+                ,("amp",pwhite 'd' 0 0.75 inf)
+                ,("n",pwhite 'e' 2 36 inf)
+                ,("l",pwhite 'f' (-1) 1 inf)]
+      q = pbind [("note",prand 'g' [0] inf)
+                ,("octave",prand 'h' [2,3] inf)
+                ,("dur",0.1)
+                ,("d",pwhite 'i' 0.01 1.2 inf)
+                ,("amp",prand 'j' [0,0.25,0.5,1] inf)
+                ,("n",pwhite 'k' 2 36 inf)
+                ,("l",pwhite 'l' (-1) 1 inf)]
+  in ppar [p,q]
+
+main :: IO ()
+main =
+    let s = synthdef "e-lamell" (out 0 e_lamell)
+    in audition (s,pattern)
diff --git a/src/e-lamell.hs b/src/e-lamell.hs
new file mode 100644
--- /dev/null
+++ b/src/e-lamell.hs
@@ -0,0 +1,66 @@
+-- e-lamell (rd)
+
+import Control.Monad
+import Sound.OpenSoundControl
+import Sound.SC3.ID
+import qualified Sound.SC3.Lang.Random.IO as R
+
+e_lamell :: UGen
+e_lamell =
+    let ctl = control KR
+        f = ctl "f" 440
+        n = ctl "n" 12
+        d = ctl "d" 0.1
+        l = ctl "l" 0
+        a = ctl "a" 1
+        t = iChoose 'a' (mce2 1 32)
+        h = line AR n t d DoNothing
+        s = blip AR f h
+        e_d = envPerc 0.005 d
+        e = envGen AR 1 a 0 1 RemoveSynth e_d
+    in pan2 s l e
+
+now :: Time
+now = NTPi 1
+
+sendSynth :: Transport t => t -> String -> UGen -> IO OSC
+sendSynth fd n u = async fd (d_recv (synthdef n u))
+
+mk_s_new :: Double -> Double -> Double -> Double -> Double -> OSC
+mk_s_new f n d a l =
+    let p = [("f",f)
+            ,("n",n)
+            ,("d",d)
+            ,("a",a)
+            ,("l",l)]
+    in s_new "blip" (-1) AddToTail 1 p
+
+pattern :: Transport t => t -> IO ()
+pattern fd = do
+  let r_note o p = do oe <- R.choose o
+                      pe <- R.choose p
+                      return (oe * 12 + pe)
+      l_sel = r_note [2,3] [0]
+      h_sel = r_note [2,3,4,5] [0,2,5,7]
+  p <- do f <- liftM midiCPS l_sel
+          n <- R.rrand 2 36
+          d <- R.exprand 0.01 0.8
+          a <- R.rrand 0 0.75
+          l <- R.rrand (-1) 1
+          return (mk_s_new f n d a l)
+  q <- do f <- liftM midiCPS h_sel
+          n <- R.rrand 2 36
+          d <- R.exprand 0.01 1.2
+          a <- R.choose [0,0.25,0.5,1]
+          l <- R.rrand (-1) 1
+          return (mk_s_new f n d a l)
+  send fd (Bundle now [p,q])
+  pauseThread 0.1
+
+run :: Transport t => t -> IO ()
+run fd = do
+  _ <- sendSynth fd "blip" (out 0 e_lamell)
+  replicateM_ 64 (pattern fd)
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/e-lamell.lhs b/src/e-lamell.lhs
deleted file mode 100644
--- a/src/e-lamell.lhs
+++ /dev/null
@@ -1,54 +0,0 @@
-e-lamell (rd)
-
-> import Control.Monad
-> import Sound.OpenSoundControl
-> import Sound.SC3.Monadic
-> import System.Random
-
-> main =
->   let { now = NTPi 1
->       ; rrand l r = getStdRandom (randomR (l, r))
->       ; exp_rrand a b = do { n <- rrand 0 1
->                            ; let r = b / a 
->                              in return ((r ** n) * a) }
->       ; choose l = return . (l !!) =<< rrand 0 (length l - 1)
->       ; sendSynth fd n u = async fd (d_recv (synthdef n u))
->       ; e_lamell = let { ctl s v = control kr s v
->                        ; f = ctl "f" 440
->                        ; n = ctl "n" 12
->                        ; d = ctl "d" 0.1
->                        ; l = ctl "l" 0
->                        ; a = ctl "a" 1 }
->                    in do { t <- tChoose 1 (mce2 1 32)
->                          ; let { h = line ar n t d DoNothing
->                                ; s = blip ar f h
->                                ; e_d = envPerc 0.005 d
->                                ; e = envGen ar 1 a 0 1 RemoveSynth e_d }
->                            in return (out 0 (pan2 s l e)) }
->       ; r_note o p = do { oe <- choose o
->                         ; pe <- choose p
->                         ; return (oe * 12 + pe) }
->       ; l_sel = r_note [2, 3] [0]
->       ; h_sel = r_note [2, 3, 4] [0]
->       ; mk_s_new f n d a l = s_new "blip" (-1) AddToTail 1
->                                    [("f", f)
->                                    ,("n", n)
->                                    ,("d", d)
->                                    ,("a", a)
->                                    ,("l", l)]
->       ; pattern fd = do { p <- do { f <- liftM midiCPS l_sel
->                                   ; n <- rrand 2 36
->                                   ; d <- exp_rrand 0.01 0.4
->                                   ; a <- rrand 0 0.75
->                                   ; l <- rrand (-1) 1
->                                   ; return (mk_s_new f n d a l) }
->                         ; q <- do { f <- liftM midiCPS h_sel
->                                   ; n <- rrand 2 36
->                                   ; d <- exp_rrand 0.01 0.4
->                                   ; a <- choose [0, 0.25, 0.5, 1]
->                                   ; l <- rrand (-1) 1
->                                   ; return (mk_s_new f n d a l) }
->                         ; send fd (Bundle now [p, q]) 
->                         ; pauseThread 0.1 } }
->   in withSC3 (\fd -> do { _ <- sendSynth fd "blip" =<< e_lamell
->                         ; replicateM_ 64 (pattern fd) })
diff --git a/src/early-space-music-lp-side-two.hs b/src/early-space-music-lp-side-two.hs
new file mode 100644
--- /dev/null
+++ b/src/early-space-music-lp-side-two.hs
@@ -0,0 +1,78 @@
+-- early space music LP, side 2 (jmcc)
+
+import Sound.SC3.ID
+import qualified Sound.SC3.Lang.Random.Gen as R
+import Sound.SC3.Lang.Control.OverlapTexture
+import qualified System.Random as R
+
+m1 :: UGen
+m1 =
+    let a = rand 'a' 0 20
+	b = rand 'b' 0 5000
+	c = rand 'c' 0 20
+	p = rand 'd' (-1) 1
+    in pan2 (sinOsc AR (sinOsc AR a 0 * 0.1 * b + b) 0 * sinOsc KR c 0 * 0.08 + 0.08) p 1
+
+m2 :: UGen
+m2 =
+    let a0 = rand 'a' 40 240
+	a1 = a0 + rand 'b' (-1) 1
+	a = mce2 a0 a1
+	b = expRand 'c' 50 2400
+	c = mce2 (a0 + rand 'd' (-1) 1) (a1 + rand 'e' (-1) 1)
+    in sinOsc AR (sinOsc AR a 0 * rand 'f' 0 1 * b + b) 0 * sinOsc KR c 0 * 0.025 + 0.025
+
+m3 :: UGen
+m3 =
+    let f = midiCPS (rand 'a' 60 100)
+    in fSinOsc AR (mce2 f (f + 0.2)) 0 * lfNoise2 'b' KR (f * mce2 0.15 0.16) * 0.1
+
+m4 :: UGen
+m4 =
+    let f = midiCPS (rand 'a' 24 96)
+	r = xLine KR (expRand 'b' 0.1 20) (expRand 'c' 0.1 20) 25.6 DoNothing
+        a = lfPulse KR (expRand 'd' 0.2 1.2) 0 (rand 'e' 0.1 0.2)
+        o i = let e = max 0 (sinOsc KR (r * rand 'f' 0.9 1.1) (rand 'g' 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 (uprotect' 'a' (map o [0..11])) * a
+
+m6 :: UGen
+m6 =
+    let f = midiCPS (lfNoise1 'a' KR (rand 'b' 0 0.3) * 60 + 70)
+        a0 = lfNoise2 'c' AR (f * rand 'd' 0 0.5)
+        a1 = max 0 (lfNoise1 'e' KR (rand 'f' 0 8) * sinOsc KR (rand 'g' 0 40) 0 * 0.1)
+	z = sinOsc AR f 0 * a0 * a1
+    in pan2 z (lfNoise1 'h' KR (rand 'i' 0 5)) 1
+
+enumFromN :: Enum a => a -> Int -> [Int]
+enumFromN e i = let j = fromEnum e in [j .. j + i]
+
+m7 :: UGen
+m7 =
+    let p = 15
+        z = let y = let fr = map (\e -> expRand e 100 6000) (enumFromN 'a' p)
+                        rt = map (\e -> rand e 2 6) (enumFromN 'a' p)
+                    in klankSpec fr (replicate p 1) rt
+            in uclone 'a' 2 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 z)) * 0.3
+
+esmlp2 :: R.RandomGen g => g -> (UGen, g)
+esmlp2 = R.choose (map (* 0.3) [m1,m2,m3,m4,m6,m7])
+
+esmlp2_pp :: UGen -> UGen
+esmlp2_pp i =
+    let c = combN i 0.3 (mce2 (rand 'a' 0.1 0.3) (rand 'a' 0.12 0.32)) 8
+    in mix (uclone 'a' 5 c) * 0.3
+
+main :: IO ()
+main = do
+  let g = R.mkStdGen 0
+  overlapTextureS_pp (2,4,6,maxBound) esmlp2 g 2 esmlp2_pp
+
+{-
+audition (out 0 (m6 * 0.5))
+Sound.SC3.UGen.Dot.draw m7
+-}
diff --git a/src/eggcrate-m.hs b/src/eggcrate-m.hs
new file mode 100644
--- /dev/null
+++ b/src/eggcrate-m.hs
@@ -0,0 +1,19 @@
+-- eggcrate-m (rd)
+
+import Sound.SC3.Monadic
+
+eggcrate :: UId m => m UGen
+eggcrate = do
+  let cosu = cos . (* pi)
+      sinu = sin . (* pi)
+      eggcrate_f u v = cosu u * sinu v
+      p = mce [64,72,96,128,256,6400,7200,8400,9600]
+  [x,y] <- sequence (replicate 2 (brownNoise KR))
+  t <- dust KR 2.4
+  [f0,f1] <- sequence (replicate 2 (tChoose t p))
+  let f = linLin (eggcrate_f x y) (-1) 1 f0 f1
+      a = linLin x (-1) 1 0 0.1
+  return (pan2 (mix (sinOsc AR f 0)) y a)
+
+main :: IO ()
+main = audition . out 0 =<< eggcrate
diff --git a/src/eggcrate.hs b/src/eggcrate.hs
new file mode 100644
--- /dev/null
+++ b/src/eggcrate.hs
@@ -0,0 +1,22 @@
+-- eggcrate (rd)
+
+import Sound.SC3.ID
+
+atp :: (t -> u) -> (t,t) -> (u,u)
+atp f (i,j) = (f i,f j)
+
+eggcrate :: UGen
+eggcrate =
+  let cosu = cos . (* pi)
+      sinu = sin . (* pi)
+      eggcrate_f u v = cosu u * sinu v
+      p = mce [64,72,96,128,256,6400,7200,8400,9600]
+      (x,y) = atp (`brownNoise` KR) ('a','b')
+      t = dust 'c' KR 2.4
+      (f0,f1) = atp (\z -> tChoose z t p) ('a','b')
+      f = linLin (eggcrate_f x y) (-1) 1 f0 f1
+      a = linLin x (-1) 1 0 0.1
+ in pan2 (mix (sinOsc AR f 0)) y a
+
+main :: IO ()
+main = audition (out 0 eggcrate)
diff --git a/src/eggcrate.lhs b/src/eggcrate.lhs
deleted file mode 100644
--- a/src/eggcrate.lhs
+++ /dev/null
@@ -1,27 +0,0 @@
-eggcrate (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { cosu = cos . (* pi) 
->       ; sinu = sin . (* pi)
->       ; eggcrate u v = cosu u * sinu v
->       ; p = mce [64, 72, 96, 128, 256, 6400, 7200, 8400, 9600] }
->   in do { [x, y] <- sequence (replicate 2 (brownNoise kr))
->         ; t <- dust kr 2.4
->         ; [f0, f1] <- sequence (replicate 2 (tChoose t p))
->         ; let { f = linLin (eggcrate x y) (-1) 1 f0 f1
->               ; a = linLin x (-1) 1 0 0.1 }
->           in audition (out 0 (pan2 (mix (sinOsc ar f 0)) y a)) }
-
-{ 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 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 a = LinLin.kr(x, -1, 1, 0, 0.1)
-; Out.ar(0, Pan2.ar(Mix.ar(SinOsc.ar(f, 0)), y, a)) }.play
diff --git a/src/eggcrate.scd b/src/eggcrate.scd
new file mode 100644
--- /dev/null
+++ b/src/eggcrate.scd
@@ -0,0 +1,11 @@
+{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 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 a = LinLin.kr(x,-1,1,0,0.1)
+;Out.ar(0,Pan2.ar(Mix.ar(SinOsc.ar(f,0)),y,a))}.play
diff --git a/src/ellipse-based-synthesis.hs b/src/ellipse-based-synthesis.hs
new file mode 100644
--- /dev/null
+++ b/src/ellipse-based-synthesis.hs
@@ -0,0 +1,40 @@
+-- ellipse based synthesis (nc)
+-- http://www.listarc.bham.ac.uk/lists/sc-users/msg09524.html
+
+import Sound.SC3
+
+ifU :: Num a => a -> a -> a -> a
+ifU t i j = (t * i) + ((1 - t) * j)
+
+ebs_nc :: UGen -> UGen -> UGen -> UGen
+ebs_nc wd fr sc =
+    let ph = phasor AR 0 (fr * 2 * pi * sampleDur) 0 (2 * pi) 0
+        sg = ifU ((ph `modE` (1.5 * pi)) >* (0.5 * pi)) (-1) 1
+    in cos (atan (wd + sc * tan ph)) * sg
+
+ebs_jr :: UGen -> UGen -> UGen -> UGen
+ebs_jr wd fr sc =
+    let ph = range 0 (2 * pi) (lfSaw AR fr 0)
+        sg = ifU ((ph `modE` (1.5 * pi)) >* (0.5 * pi)) (-1) 1
+    in cos (atan (wd + sc * tan ph)) * sg
+
+ebs_jmcc :: UGen -> UGen -> UGen -> UGen
+ebs_jmcc wd fr sc =
+    let ph = phasor AR 0 (fr * 2 * pi * sampleDur) 0 (2* pi) 0
+        sg = ifU ((ph `modE` (1.5 * pi)) >* (0.5 * pi)) (-1) 1
+    in cos (atan(wd + sc * tan ph)) * sg
+
+ctl :: (UGen -> UGen -> UGen -> t) -> t
+ctl f =
+    let fr = mouseY' KR 4 444 Linear 0.1
+        sc = mouseX' KR 0.1 1.0 Linear 0.1
+        wd = mouseR 'z' KR 0 2 Linear 0.1
+    in f wd fr sc
+
+main :: IO ()
+main = audition (out 0 (ctl ebs_jmcc))
+
+{-
+audition (out 0 (mce2 (ebs_nc 0 440 0.5) (ebs_jr 0 440 0.5)))
+audition (out 0 (mce2 (ebs_nc 0 440 0.5) (ebs_jmcc 0 440 0.5)))
+-}
diff --git a/src/f-lets.hs b/src/f-lets.hs
new file mode 100644
--- /dev/null
+++ b/src/f-lets.hs
@@ -0,0 +1,30 @@
+-- f-lets (rd)
+
+import Sound.SC3.Monadic
+
+f_lets :: (Functor m,UId m) => m UGen
+f_lets = do
+  let f_let t g j n f = do
+           let pd = pulseDivider t j 0
+           r0 <- tIRand (mce2 2 1) n pd
+           r1 <- tRand 0.01 0.04 pd
+           r2 <- tRand 0.05 0.10 pd
+           return (formlet pd (f * r0) r1 r2 * g)
+      mk_n t = do
+           r0 <- tRand 0 1 t
+           r1 <- tRand 0 1 t
+           r2 <- tRand 0 1 t
+           r3 <- tRand 0 1 t
+           r4 <- coinGate 0.2 t
+           sequence [f_let t 0.15 2 9 (mce2 200 400)
+                    ,f_let t 0.25 2 9 (mce2 (200 + r0) (400 + r1))
+                    ,f_let t 0.05 4 5 (mce2 25 50)
+                    ,f_let t 0.15 4 5 (mce2 (25 + r2) (50 + r3))
+                    ,let lr = fmap (* latch r4 t)
+                     in lr (f_let t 0.5 1 16 (mce2 300 600))]
+      tr = impulse AR 24 0
+  n <- lfNoise0 KR 2
+  return . (* (n * 0.25 + 0.25)) . sum =<< mk_n tr
+
+main :: IO ()
+main = audition . out 0 =<< f_lets
diff --git a/src/f-lets.lhs b/src/f-lets.lhs
deleted file mode 100644
--- a/src/f-lets.lhs
+++ /dev/null
@@ -1,26 +0,0 @@
-f-lets (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { f_let t g j n f = 
->         let pd = pulseDivider t j 0
->         in do { r0 <- tiRand (mce2 2 1) n pd
->               ; r1 <- tRand 0.01 0.04 pd
->               ; r2 <- tRand 0.05 0.10 pd
->               ; return (formlet pd (f * r0) r1 r2 * g) }
->       ; mk_n t = do { r0 <- tRand 0 1 t
->                     ; r1 <- tRand 0 1 t
->                     ; r2 <- tRand 0 1 t
->                     ; r3 <- tRand 0 1 t
->                     ; r4 <- coinGate 0.2 t
->                     ; sequence
->                       [ f_let t 0.15 2 9 (mce2 200 400)
->                       , f_let t 0.25 2 9 (mce2 (200 + r0) (400 + r1))
->                       , f_let t 0.05 4 5 (mce2 25 50)
->                       , f_let t 0.15 4 5 (mce2 (25 + r2) (50 + r3))
->                       , let lr = fmap (* (latch r4 t))
->                         in lr (f_let t 0.5 1 16 (mce2 300 600)) ] }
->       ; tr = impulse ar 24 0 }
->   in do { n <- lfNoise0 kr 2
->         ; audition . out 0 . (* (n * 0.25 + 0.25)) . sum =<< mk_n tr }
diff --git a/src/fb-090531.hs b/src/fb-090531.hs
new file mode 100644
--- /dev/null
+++ b/src/fb-090531.hs
@@ -0,0 +1,47 @@
+-- fb-090531 (rd)
+
+import Sound.OpenSoundControl {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import Control.Monad
+import System.Random {- random -}
+
+fb_090531 :: UGen
+fb_090531 =
+    let k_in n = linLin (in' 1 KR n) (-1) 1
+        p = localIn 1 AR
+        bt = recip controlRate
+        ig_f = k_in 0 1 20
+        ig = impulse AR ig_f 0
+        f_f = k_in 1 220 880
+        f_rq = k_in 2 0.005 0.2
+        f = bpf ig f_f f_rq
+        d_t = k_in 3 0.1 0.105
+        d = delayC (f + p) 1 (d_t - bt)
+    in mrg [p,localOut d]
+
+-- | Constant reset.
+c_reset :: Transport t => Double -> t -> IO ()
+c_reset n fd = send fd (c_setn [(0,replicate 4 n)])
+
+-- | Random reset.
+r_reset :: Transport t => t -> IO ()
+r_reset fd = do
+  cs <- replicateM 4 (randomRIO (-1,1))
+  send fd (c_setn [(0,cs)])
+
+-- | Loop random reset.
+lr_reset :: Transport t => Double -> t -> IO b
+lr_reset t fd = pauseThread t >> r_reset fd >> lr_reset t fd
+
+-- | Start fb_090531 and run lr_reset.  Type C-cC-i to interrupt.
+main :: IO ()
+main = do
+  audition (offsetOut 0 fb_090531)
+  withSC3 (c_reset 1 >> lr_reset 1)
+
+{-
+withSC3 (c_reset 0)
+withSC3 (c_reset 1)
+withSC3 (c_reset (-1))
+withSC3 r_reset
+-}
diff --git a/src/fbl-fbf.hs b/src/fbl-fbf.hs
new file mode 100644
--- /dev/null
+++ b/src/fbl-fbf.hs
@@ -0,0 +1,36 @@
+-- fbl-fbf (rd)
+
+import Sound.SC3.ID
+
+fbl :: UGen -> [UGen] -> [UGen] -> [UGen] -> (UGen, UGen)
+fbl l i d g =
+    let a0 = l + mce i
+        a1 = delayL a0 (maximum d) (mce d)
+    in (localOut (a1 * mce g),a1)
+
+fbf :: [UGen] -> [UGen] -> [UGen] -> [UGen] -> (UGen, UGen)
+fbf b i d g =
+    let a0 = inFeedback 1 (mce b) + mce i
+        a1 = delayL a0 (maximum d) (mce d)
+    in (offsetOut (mce b) (mce [a1 * mce g]),a1)
+
+fbl_fbf :: UGen
+fbl_fbf =
+  let n = brownNoise 'a' AR
+      e = decay (impulse AR 0.3 0) 0.1 * n * 0.2
+      c = 4
+      e' = replicate c e
+      b0 = [24,26,28,30]
+      d0 = [0.1,0.3,0.5,0.7]
+      g0 = [0.8,0.6,0.4,0.2]
+      b1 = [25,27,29,31]
+      d1 = [0.2,0.3,0.6,0.7]
+      g1 = [0.8,0.7,0.4,0.3]
+      (u0,s0) = fbl (localIn c AR) e' d0 g0
+      (u1,s1) = fbf b0 e' d0 g0
+      (u2,s2) = fbf b1 (mceChannels s1) d1 g1
+      o = mce [mix (s0 + s1),mix s2]
+  in mrg [u0,u1,u2,offsetOut 0 o]
+
+main :: IO ()
+main = withSC3 (\fd -> reset fd >> audition fbl_fbf)
diff --git a/src/fbl-fbf.lhs b/src/fbl-fbf.lhs
deleted file mode 100644
--- a/src/fbl-fbf.lhs
+++ /dev/null
@@ -1,27 +0,0 @@
-fbl-fbf (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { fbl l i d g = let { a0 = l + mce i
->                           ; a1 = delayL a0 (maximum d) (mce d) }
->                       in (localOut (a1 * mce g), a1)
->       ; fbf b i d g = let { a0 = inFeedback 1 (mce b) + mce i
->                           ; a1 = delayL a0 (maximum d) (mce d) }
->                       in (offsetOut (mce b) (mce [a1 * mce g]), a1) }
->   in do { withSC3 reset
->         ; n <- brownNoise ar
->         ; let { e = decay (impulse ar 0.3 0) 0.1 * n * 0.2
->               ; c = 4
->               ; e' = replicate c e
->               ; b0 = [24, 26, 28, 30]
->               ; d0 = [0.1, 0.3, 0.5, 0.7]
->               ; g0 = [0.8, 0.6, 0.4, 0.2]
->               ; b1 = [25, 27, 29, 31]
->               ; d1 = [0.2, 0.3, 0.6, 0.7]
->               ; g1 = [0.8, 0.7, 0.4, 0.3]
->               ; (u0, s0) = fbl (localIn c ar) e' d0 g0
->               ; (u1, s1) = fbf b0 e' d0 g0
->               ; (u2, s2) = fbf b1 (mceChannels s1) d1 g1
->               ; o = mce [mix (s0 + s1), mix s2] }
->           in audition (mrg [u0, u1, u2, offsetOut 0 o]) }
diff --git a/src/feedr.lhs b/src/feedr.lhs
deleted file mode 100644
--- a/src/feedr.lhs
+++ /dev/null
@@ -1,25 +0,0 @@
-feedr (rd)
-warning: input/output feedback loop
-
-> import Sound.SC3.Monadic
-> import qualified Sound.SC3.ID as I
-
-> main =
->   let { delayWr b i = recordBuf b 0 1 0 1 Loop 0 DoNothing i
->       ; tap nc b dt = playBuf nc b 1 0 (dt * (- sampleRate)) Loop DoNothing
->       ; dl = 6
->       ; feedr n = do { t <- sequence (replicate n (rand 0.0 (constant dl)))
->                      ; g <- sequence (replicate n (rand 0.4 1.0))
->                      ; f <- sequence (replicate n (rand 0.9 0.95))
->                      ; let { d = zipWith (\p q -> tap 2 10 p * q) t g
->                         {- ; x = mouseX kr 0.02 1.0 Exponential 0.1 -}
->                            ; x = linLin (I.lfNoise0 'a' KR 1) (-1) 1 0.02 1
->                            ; s = clip2 (leakDC (hpf (sum d) 20) 0.995) 1
->                            ; i = soundIn (mce2 0 1)
->                            ; r = i + sum (map (* x) (zipWith (*) d f)) }
->                        in return (mrg [out 0 s, delayWr 10 r]) } }
->   in withSC3 (\fd -> do { nf <- fmap (* dl) (serverSampleRateActual fd)
->                         ; send fd (b_alloc 10 (floor nf) 2)
->                         ; audition =<< feedr 18 })
-
-withSC3 (\fd -> send fd (b_zero 10))
diff --git a/src/fm-iter.hs b/src/fm-iter.hs
new file mode 100644
--- /dev/null
+++ b/src/fm-iter.hs
@@ -0,0 +1,21 @@
+-- fm-iter (rd)
+
+import Sound.SC3.ID
+
+fm_iter :: UGen
+fm_iter =
+  let t0 = impulse AR (recip 0.30) 0
+      t1 = tDelay t0 0.15
+      t = mce2 t0 t1
+      k = tRand 'a' 56 57 t
+      i = tRand 'a' 40 480 t
+      j = tRand 'a' (-1) 1 t
+      c = midiCPS k
+      m = midiCPS (k + 1 + j)
+      s = envPerc 0.01 0.9
+      e = envGen AR t 0.1 0 1 RemoveSynth s
+      f = sinOsc AR c 0 * i + m
+  in sinOsc AR f 0 * e
+
+main :: IO ()
+main = audition (out 0 fm_iter)
diff --git a/src/fm-iter.lhs b/src/fm-iter.lhs
deleted file mode 100644
--- a/src/fm-iter.lhs
+++ /dev/null
@@ -1,17 +0,0 @@
-fm-iter (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { t0 = impulse ar (recip 0.30) 0
->       ; t1 = tDelay t0 0.15
->       ; t = mce2 t0 t1 }
->   in do { k <- tRand 56 57 t
->         ; i <- tRand 40 480 t
->         ; j <- tRand (-1) 1 t
->         ; let { c = midiCPS k
->               ; m = midiCPS (k + 1 + j)
->               ; s = envPerc 0.01 0.9
->               ; e = envGen ar t 0.1 0 1 RemoveSynth s
->               ; f = sinOsc ar c 0 * i + m }
->           in audition (out 0 (sinOsc ar f 0 * e)) }
diff --git a/src/fm-kltr-p.hs b/src/fm-kltr-p.hs
new file mode 100644
--- /dev/null
+++ b/src/fm-kltr-p.hs
@@ -0,0 +1,38 @@
+-- fm-kltr-p (rd)
+
+import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.ID
+
+fm_kltr :: UGen
+fm_kltr =
+  let r1 = rand 'a' 0.975 1.025
+      r2 = rand 'b' 0.5 1.5
+      r3 = rand 'c' 0.975 1.025
+      r4 = rand 'd' 0.75 1.25
+      o = control IR "out" 0
+      a = control KR "amp" 0.1
+      dt = control KR "sustain" 0.1
+      f = control KR "freq" 400.0
+      i = control KR "index" 40.0
+      p = control KR "pan" 0.0
+      f2 = control KR "freq2" 600
+      ep = envPerc 0.01 dt
+      e = envGen AR 1 a 0 1 RemoveSynth ep
+      so = sinOsc AR (xLine KR f (f * r1) dt DoNothing) 0
+      xl = xLine KR f2 (f2 * r3) dt DoNothing
+      m = so * line KR i (f * r2) dt DoNothing + xl
+      l = line KR p (p * r4) dt DoNothing
+  in pan2 (sinOsc AR m 0) l e
+
+main :: IO ()
+main = do
+  let s = synthdef "fm_kltr" (out 0 fm_kltr)
+      p = pbind [("freq",fmap midiCPS 53)
+                ,("freq2",fmap midiCPS (pwhitei 'a' 48 96 inf +
+                                        pwhite 'b' (-1) 1 inf))
+                ,("amp",pwhite 'c' 0.1 0.4 inf)
+                ,("dur",pwhite 'd' 0.15 1.25 inf)
+                ,("sustain",pwhite 'e' 5 6 inf)
+                ,("index",pwhite 'f' 240 1480 inf)
+                ,("pan", pwhite 'g' (-1) 1 inf)]
+  audition (s,p)
diff --git a/src/fm-kltr.hs b/src/fm-kltr.hs
new file mode 100644
--- /dev/null
+++ b/src/fm-kltr.hs
@@ -0,0 +1,62 @@
+-- fm-kltr (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3.Monadic
+import System.Random
+
+fm_kltr :: UId m => m UGen
+fm_kltr = do
+  r1 <- rand 0.975 1.025
+  r2 <- rand 0.5 1.5
+  r3 <- rand 0.975 1.025
+  r4 <- rand 0.75 1.25
+  let o = control IR "out" 0
+      a = control KR "amp" 0.1
+      d = control KR "dur" 0.1
+      f = control KR "freq" 400.0
+      i = control KR "index" 40.0
+      p = control KR "pan" 0.0
+      f2 = control KR "freq2" 600
+      ep = envPerc 0.01 d
+      e = envGen AR 1 a 0 1 RemoveSynth ep
+      so = sinOsc AR (xLine KR f (f * r1) d DoNothing) 0
+      xl = xLine KR f2 (f2 * r3) d DoNothing
+      m = so * line KR i (f * r2) d DoNothing + xl
+      l = line KR p (p * r4) d DoNothing
+  return (out o (pan2 (sinOsc AR m 0) l e))
+
+rrand :: Random a => a -> a -> IO a
+rrand l r = getStdRandom (randomR (l, r))
+
+type R = Double
+
+fm :: Transport t => t -> R -> R -> R -> R -> R -> IO ()
+fm fd f ff a d i = do
+  r1 <- rrand (-1) 1
+  r2 <- rrand (-1) 1
+  let p = [("freq", midiCPS f)
+          ,("freq2", midiCPS ff + r1)
+          ,("amp", a)
+          ,("dur", d)
+          ,("index", i)
+          ,("pan", r2)]
+  send fd (s_new "fm_kltr" (-1) AddToTail 1 p)
+
+nd :: Transport t => t -> IO ()
+nd fd = do
+  ff <- rrand 48 96
+  a <- rrand 0.1 0.4
+  d <- rrand 1.2 7.2
+  i <- rrand 240 1480
+  t <- rrand 0.15 1.25
+  fm fd 53 ff a d i
+  pauseThread t
+
+run :: Transport t => t -> IO ()
+run fd = do
+  u <- fm_kltr
+  _ <- async fd (d_recv (synthdef "fm_kltr" u))
+  sequence_ (replicate 32 (nd fd))
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/fm-kltr.lhs b/src/fm-kltr.lhs
deleted file mode 100644
--- a/src/fm-kltr.lhs
+++ /dev/null
@@ -1,49 +0,0 @@
-fm-kltr (rd)
-
-> import Sound.OpenSoundControl
-> import Sound.SC3.Monadic
-> import System.Random
-
-> main =
->   let { rrand l r = getStdRandom (randomR (l, r))
->       ; gr =
->             do { r1 <- rand 0.975 1.025
->                ; r2 <- rand 0.5 1.5
->                ; r3 <- rand 0.975 1.025
->                ; r4 <- rand 0.75 1.25
->                ; let { o = control ir "out" 0
->                   {- ; t = control kr "trig" 0 {- unused -} -}
->                      ; a = control kr "amp" 0.1
->                      ; d = control kr "dur" 0.1
->                      ; f = control kr "freq" 400.0
->                      ; i = control kr "index" 40.0
->                      ; p = control kr "pan" 0.0
->                      ; f2 = control kr "freq2" 600
->                      ; ep = envPerc 0.01 d
->                      ; e = envGen ar 1 a 0 1 RemoveSynth ep
->                      ; so = sinOsc ar (xLine kr f (f * r1) d DoNothing) 0
->                      ; xl = xLine kr f2 (f2 * r3) d DoNothing
->                      ; m = so * line kr i (f * r2) d DoNothing + xl
->                      ; l = line kr p (p * r4) d DoNothing }
->                  in return (out o (pan2 (sinOsc ar m 0) l e)) }
->       ; fm fd f ff a d i =
->           do { r1 <- rrand (-1) 1
->              ; r2 <- rrand (-1) 1
->              ; send fd (s_new "fm" (-1) AddToTail 1
->                               [("freq", midiCPS f)
->                               ,("freq2", midiCPS ff + r1)
->                               ,("amp", a)
->                               ,("dur", d)
->                               ,("index", i)
->                               ,("pan", r2)]) }
->       ; nd fd =
->           do { ff <- rrand 48 96
->              ; a <- rrand 0.1 0.4
->              ; d <- rrand 1.2 7.2
->              ; i <- rrand 240 1480
->              ; t <- rrand 0.15 1.25
->              ; fm fd 53 ff a d i
->              ; pauseThread t } }
->   in withSC3 (\fd -> do { u <- gr
->                         ; _ <- async fd (d_recv (synthdef "fm" u))
->                         ; sequence (replicate 32 (nd fd)) })
diff --git a/src/forest-sounds.hs b/src/forest-sounds.hs
new file mode 100644
--- /dev/null
+++ b/src/forest-sounds.hs
@@ -0,0 +1,17 @@
+-- forest sounds (paul jones)
+-- sc-users, 2007-04-06
+
+import Sound.SC3.Monadic
+
+insects :: UId m => m UGen
+insects = do
+  n1 <- brownNoise AR
+  n2 <- lfNoise2 KR 50
+  let o = sinOsc KR (n2 * 50 + 50) 0 * 100 + 2000
+  return (bpf n1 o 0.001 * 10)
+
+forest_sounds :: UId m => m UGen
+forest_sounds = clone 2 insects
+
+main :: IO ()
+main = audition . out 0 =<< forest_sounds
diff --git a/src/forest-sounds.lhs b/src/forest-sounds.lhs
deleted file mode 100644
--- a/src/forest-sounds.lhs
+++ /dev/null
@@ -1,18 +0,0 @@
-forest sounds (paul jones)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let insects = do { n1 <- brownNoise ar
->                    ; n2 <- lfNoise2 kr 50
->                    ; let o = sinOsc kr (n2 * 50 + 50) 0 * 100 + 2000
->                      in return (bpf n1 o 0.001 * 10) }
->   in audition . (out 0) =<< clone 2 insects
-
-{ var insects = { var n1 = BrownNoise.ar
-                ; 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
-
-sc-users, 2007-04-06
diff --git a/src/forest-sounds.scd b/src/forest-sounds.scd
new file mode 100644
--- /dev/null
+++ b/src/forest-sounds.scd
@@ -0,0 +1,5 @@
+{ var insects = { var n1 = BrownNoise.ar
+                ; 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
diff --git a/src/fwalk.hs b/src/fwalk.hs
new file mode 100644
--- /dev/null
+++ b/src/fwalk.hs
@@ -0,0 +1,39 @@
+-- fwalk (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3.Monadic
+
+fwalk' :: UId m => UGen -> m UGen
+fwalk' r = do
+  t <- dust KR 3
+  r1 <- tIRand 0 6 t
+  r2 <- tRand (-0.0001) 0.0001 t
+  let f = bufRdL 1 KR (mce2 0 1) r1 NoLoop
+      f' = f + r2
+      o1 = blip AR (midiCPS (r + f)) 12
+      o2 = blip AR (midiCPS (r + f')) 12
+  return ((o1 + o2) * decay2 t 0.3 1.2 * 0.1)
+
+fwalk :: UId m => m UGen
+fwalk = do
+  f1 <- fwalk' 24
+  f2 <- fwalk' 36
+  return (f1 + f2)
+
+run :: Transport t => t -> IO ()
+run fd = do
+  let n = [40,47,42,40,50
+          ,43,35,43,40,47
+          ,45,35,43,42,59
+          ,48,40,47,52,45]
+      m = [40,40,42,47,50
+          ,35,43,43,40,45
+          ,42,35,48,47,43
+          ,40,59,45,47,52]
+  _ <- async fd (b_alloc_setn1 0 0 n)
+  _ <- async fd (b_alloc_setn1 1 0 m)
+  f <- fwalk
+  play fd (out 0 f)
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/fwalk.lhs b/src/fwalk.lhs
deleted file mode 100644
--- a/src/fwalk.lhs
+++ /dev/null
@@ -1,28 +0,0 @@
-fwalk (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { n = [ 40.0, 47.0, 42.0, 40.0, 50.0
->             , 43.0, 35.0, 43.0, 40.0, 47.0
->             , 45.0, 35.0, 43.0, 42.0, 59.0
->             , 48.0, 40.0, 47.0, 52.0, 45.0 ]
->       ; m = [ 40.0, 40.0, 42.0, 47.0, 50.0
->             , 35.0, 43.0, 43.0, 40.0, 45.0
->             , 42.0, 35.0, 48.0, 47.0, 43.0
->             , 40.0, 59.0, 45.0, 47.0, 52.0 ] 
->       ; a = map (\b -> b_alloc b 20 1) [0, 1]
->       ; s = map (\(b, d) -> b_setn1 b 0 d) [(0, n), (1, m)]
->       ; fwalk r = do { t <- dust kr 3
->                      ; r1 <- tiRand 0 6 t
->                      ; r2 <- tRand (-0.0001) 0.0001 t
->                      ; let { f = bufRdL 1 kr (mce2 0 1) r1 NoLoop
->                            ; f' = f + r2
->                            ; o1 = blip ar (midiCPS (r + f)) 12
->                            ; o2 = blip ar (midiCPS (r + f')) 12 }
->                        in return ((o1 + o2) * decay2 t 0.3 1.2 * 0.1) } }
->   in withSC3 (\fd -> do { f1 <- fwalk 24
->                         ; f2 <- fwalk 36
->                         ; mapM_ (async fd) a
->                         ; mapM_ (send fd) s
->                         ; play fd (out 0 (f1 + f2)) })
diff --git a/src/h-chatter.hs b/src/h-chatter.hs
new file mode 100644
--- /dev/null
+++ b/src/h-chatter.hs
@@ -0,0 +1,32 @@
+-- h-chatter (rd)
+
+import Control.Monad
+import Sound.SC3.Monadic
+
+wrp :: UGen -> UGen -> UGen -> UGen
+wrp i = linLin i (-1) 1
+
+h_chatter :: UId m => m UGen
+h_chatter = do
+  let mma m a = return . (+ a)  . (* m)
+      h0 = do n <- mma 5 5 =<< lfNoise0 KR 1
+              a <- mma 0.2 1.2 =<< lfNoise2 KR n
+              b <- mma 0.15 0.15 =<< lfNoise2 KR n
+              let f = 40
+                  h = henonN AR (mce2 f (f * 0.5)) a b 0 0
+              return (saw AR (h * 3200 + 1600) * 0.35)
+      h1 = do n0 <- lfNoise0 KR 32
+              n1 <- lfNoise0 KR 2
+              let a = mouseX' KR 1.2 1.4 Linear 0.1
+                  b = mouseY' KR 0.2 0.3 Linear 0.1
+                  h = wrp n0 1 32
+                  p = wrp n1 2400 3200
+                  l = wrp n1 (-0.75) 0.75
+                  g = wrp n1 0.55 0.85
+                  f = 40
+                  o = blip AR (wrp (henonN AR f a b 0 0) p (p * 2)) h
+              return (pan2 o l g * 0.35)
+  liftM2 (+) h0 h1
+
+main :: IO ()
+main = audition . out 0 =<< h_chatter
diff --git a/src/h-chatter.lhs b/src/h-chatter.lhs
deleted file mode 100644
--- a/src/h-chatter.lhs
+++ /dev/null
@@ -1,45 +0,0 @@
-h-chatter (rd)
-
-> import Control.Monad
-> import Sound.SC3.Monadic
-
-> main =
->   let { wrp i l r = linLin i (-1) 1 l r
->       ; mma m a = return . (+ a)  . (* m)
->       ; h0 = do { n <- mma 5 5 =<< lfNoise0 kr 1
->                 ; a <- mma 0.2 1.2 =<< lfNoise2 kr n
->                 ; b <- mma 0.15 0.15 =<< lfNoise2 kr n
->                 ; let { f = 40
->                       ; h = henonN ar (mce2 f (f * 0.5)) a b 0 0 }
->                   in return (saw ar (h * 3200 + 1600) * 0.35) }
->       ; h1 = do { n0 <- lfNoise0 kr 32
->                 ; n1 <- lfNoise0 kr 2
->                 ; let { a = mouseX kr 1.2 1.4 Linear 0.1
->                       ; b = mouseY kr 0.2 0.3 Linear 0.1
->                       ; h = wrp n0 1 32
->                       ; p = wrp n1 2400 3200
->                       ; l = wrp n1 (-0.75) 0.75
->                       ; g = wrp n1 0.55 0.85
->                       ; f = 40
->                       ; o = blip ar (wrp (henonN ar f a b 0 0) p (p * 2)) h }
->                   in return (pan2 o l g * 0.35) } }
->   in audition . out 0 =<< liftM2 (+) h0 h1
-
-{ var h0 = { var n = LFNoise0.kr(1, 5, 5)
-           ; var a = LFNoise0.kr(1, 0.2, 1.2)
-           ; var b = LFNoise0.kr(1, 0.15, 0.15)
-           ; var f = 40
-           ; var h = HenonN.ar([f, f * 0.5], a, b, 0, 0)
-           ; Saw.ar(h * 3200 + 1600) * 0.35 }
-; var h1 = { var n0 = LFNoise0.kr(32)
-           ; var n1 = LFNoise0.kr(2)
-           ; var a = MouseX.kr(1.2, 1.4, 'linear', 0.1)
-           ; var b = MouseY.kr(0.2, 0.3, 'linear', 0.1)
-           ; var h = n0.range(1, 32)
-           ; var p = n1.range(2400, 3200)
-           ; var l = n1.range(-0.75, 0.75)
-           ; var g = n1.range(0.55, 0.85)
-           ; 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
diff --git a/src/h-chatter.scd b/src/h-chatter.scd
new file mode 100644
--- /dev/null
+++ b/src/h-chatter.scd
@@ -0,0 +1,18 @@
+{ var h0 = { var n = LFNoise0.kr(1, 5, 5)
+           ; var a = LFNoise0.kr(1, 0.2, 1.2)
+           ; var b = LFNoise0.kr(1, 0.15, 0.15)
+           ; var f = 40
+           ; var h = HenonN.ar([f, f * 0.5], a, b, 0, 0)
+           ; Saw.ar(h * 3200 + 1600) * 0.35 }
+; var h1 = { var n0 = LFNoise0.kr(32)
+           ; var n1 = LFNoise0.kr(2)
+           ; var a = MouseX.kr(1.2, 1.4, 'linear', 0.1)
+           ; var b = MouseY.kr(0.2, 0.3, 'linear', 0.1)
+           ; var h = n0.range(1, 32)
+           ; var p = n1.range(2400, 3200)
+           ; var l = n1.range(-0.75, 0.75)
+           ; var g = n1.range(0.55, 0.85)
+           ; 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
diff --git a/src/half-life.hs b/src/half-life.hs
new file mode 100644
--- /dev/null
+++ b/src/half-life.hs
@@ -0,0 +1,14 @@
+-- half-life (jrhb)
+
+import Sound.SC3.ID
+
+half_life :: UGen
+half_life =
+  let t_half = 1/3.92
+      n_atoms = 1e+5
+      n = max 0 (n_atoms - pulseCount (localIn 2 AR) 0)
+      activity = dust 'a' AR (n * log 2 * t_half)
+  in mrg [activity,localOut activity]
+
+main :: IO ()
+main = audition (out 0 half_life)
diff --git a/src/half-life.lhs b/src/half-life.lhs
deleted file mode 100644
--- a/src/half-life.lhs
+++ /dev/null
@@ -1,18 +0,0 @@
-half-life (jrhb)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { t_half = 3.92
->       ; n_atoms = 1e+5
->       ; n = max 0 (n_atoms - pulseCount (localIn 2 ar) 0) }
->   in do { activity <- dust ar (n * log 2 / t_half)
->         ; audition (mrg [ localOut activity
->                         , out 0 activity ]) }
-
-{ var t_half = 3.92
-; var n_atoms = 1e+5
-; 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
diff --git a/src/half-life.scd b/src/half-life.scd
new file mode 100644
--- /dev/null
+++ b/src/half-life.scd
@@ -0,0 +1,6 @@
+{ var t_half = 3.92
+; var n_atoms = 1e+5
+; 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
diff --git a/src/harmonic-swimming-m.hs b/src/harmonic-swimming-m.hs
new file mode 100644
--- /dev/null
+++ b/src/harmonic-swimming-m.hs
@@ -0,0 +1,15 @@
+-- harmonic swimming (jmcc)
+
+import Sound.SC3.Monadic
+
+main :: IO ()
+main =
+  let a = 0.02
+      f = 50
+      p = 20
+      l = line KR 0 (- a) 60 DoNothing
+      o h = do r <- clone 2 (rand 2 8)
+               n <- lfNoise1 KR r
+               let e = max 0 (n * a + l)
+               return (fSinOsc AR (f * (h + 1)) 0 * e)
+  in audition . out 0 . sum =<< mapM o [0..p]
diff --git a/src/harmonic-swimming.hs b/src/harmonic-swimming.hs
new file mode 100644
--- /dev/null
+++ b/src/harmonic-swimming.hs
@@ -0,0 +1,18 @@
+-- harmonic swimming (jmcc)
+
+import Sound.SC3.ID
+
+harmonic_swimming :: UGen
+harmonic_swimming =
+  let a = 0.02
+      f = 50
+      p = 20
+      l = line KR 0 (- a) 60 DoNothing
+      o h = let r = udup 2 (rand 'a' 2 8)
+                n = lfNoise1 'a' KR r
+                e = max 0 (n * a + l)
+            in fSinOsc AR (f * (h + 1)) 0 * e
+  in sum (uprotect' 'a' (map o [0..p]))
+
+main :: IO ()
+main = audition (out 0 harmonic_swimming)
diff --git a/src/harmonic-swimming.lhs b/src/harmonic-swimming.lhs
deleted file mode 100644
--- a/src/harmonic-swimming.lhs
+++ /dev/null
@@ -1,25 +0,0 @@
-harmonic swimming (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { a = 0.02
->       ; f = 50
->       ; p = 20
->       ; l = line kr 0 (- a) 60 DoNothing 
->       ; o h = do { r <- clone 2 (rand 2 8)
->                  ; n <- lfNoise1 kr r
->                  ; let e = max 0 (n * a + l)
->                    in return (fSinOsc ar (f * (h + 1)) 0 * e) } }
->   in audition . out 0 . sum =<< mapM o [0..p]
-
-{ 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
diff --git a/src/harmonic-swimming.scd b/src/harmonic-swimming.scd
new file mode 100644
--- /dev/null
+++ b/src/harmonic-swimming.scd
@@ -0,0 +1,10 @@
+{ 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
diff --git a/src/harmonic-tumbling.hs b/src/harmonic-tumbling.hs
new file mode 100644
--- /dev/null
+++ b/src/harmonic-tumbling.hs
@@ -0,0 +1,17 @@
+-- harmonic tumbling (jmcc)
+
+import Sound.SC3.Monadic
+
+harmonic_tumbling :: UId m => m UGen
+harmonic_tumbling = do
+  let f = 80
+      p = 10
+      t = xLine KR (mce2 10 11) 0.1 60 DoNothing
+      o h = do n <- dust KR t
+               r <- rand 0 0.5
+               let e = decay2 (n * 0.02) 0.005 r
+               return (fSinOsc AR (f * (h + 1)) 0 * e)
+  return.sum =<< mapM o [0..p]
+
+main :: IO ()
+main = audition . out 0 =<< harmonic_tumbling
diff --git a/src/harmonic-tumbling.lhs b/src/harmonic-tumbling.lhs
deleted file mode 100644
--- a/src/harmonic-tumbling.lhs
+++ /dev/null
@@ -1,23 +0,0 @@
-harmonic tumbling (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { f = 80
->       ; p = 10
->       ; t = xLine kr (mce2 10 11) 0.1 60 DoNothing
->       ; o h = do { n <- dust kr t
->                  ; r <- rand 0 0.5
->                  ; let e = decay2 (n * 0.02) 0.005 r
->                    in return (fSinOsc ar (f * (h + 1)) 0 * e) } }
->   in audition . out 0 . sum =<< mapM o [0..p]
-
-{ var f = 80
-; var p = 10
-; var t = XLine.kr([10, 11], 0.1, 60, doneAction: 0)
-; var o = { arg h
-          ; var n = Dust.kr(t)
-          ; var r = Rand.new(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
diff --git a/src/harmonic-tumbling.scd b/src/harmonic-tumbling.scd
new file mode 100644
--- /dev/null
+++ b/src/harmonic-tumbling.scd
@@ -0,0 +1,9 @@
+{var f = 80
+;var p = 10
+;var t = XLine.kr([10,11],0.1,60,doneAction: 0)
+;var o = {arg h
+         ;var n = Dust.kr(t)
+         ;var r = Rand.new(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
diff --git a/src/hell-is-busy.hs b/src/hell-is-busy.hs
new file mode 100644
--- /dev/null
+++ b/src/hell-is-busy.hs
@@ -0,0 +1,13 @@
+-- hell is busy (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+hib :: UGen
+hib =
+    let o = fSinOsc AR (400 + rand 'a' 0 2000) 0
+        a = lfPulse KR (1 + rand 'b' 0 10.0) (rand 'c' 0 0.7) 0.04
+    in pan2 (o * a) (rand 'd' (-1) 1) 1
+
+main :: IO ()
+main = overlapTextureU (4,4,8,maxBound) hib
diff --git a/src/hell-is-busy.scd b/src/hell-is-busy.scd
new file mode 100644
--- /dev/null
+++ b/src/hell-is-busy.scd
@@ -0,0 +1,2 @@
+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
diff --git a/src/hh-808.hs b/src/hh-808.hs
new file mode 100644
--- /dev/null
+++ b/src/hh-808.hs
@@ -0,0 +1,30 @@
+-- hh-808 (ryan at wabdo.com)
+-- http://www.create.ucsb.edu/pipermail/sc-users/2007-August/036131.html
+
+import Sound.SC3
+
+hh_808 :: UGen
+hh_808 =
+  let time = 250
+      fr = [205.35,304.41,369.64,522.71,540.54,812.21]
+      pulseEnv = let e = env [1.0,0.6] [time] [EnvNum (-0.5)] 0 0
+                 in envGen AR 1 1 0 (1/1000) DoNothing e
+      s = mix (lfPulse AR (mce (map (* 4.09) fr)) 0 0.5)
+      f = [\a -> ((a ==* 6.0) * 0.6) +
+                 ((a ==* 2.0) * 0.2) +
+                 ((a ==* 1.0) * 0.9)
+          ,\a -> (a * pulseEnv) + (mix (lfPulse AR (mce fr) 0 0.55)) * 0.9
+          ,\a -> rlpf a 7000 0.6
+          ,\a -> rhpf a 6800 1.5
+          ,\a -> rhpf a 6800 1.5
+          ,\a -> rhpf a 1200 1.5
+          ,\a -> a + freeVerb a 0.33 0.5 0.5
+          ,\a -> let c = map EnvNum [0,-0.5,0,-50]
+                     e = env [0,1,0.4,0,0] [2,time,50,500] c 0 0
+                 in a * envGen AR 1 1 0 (1/1000) RemoveSynth e
+          ,\a -> mce [a,delayN a 0.005 0.005]]
+  in foldl1 (flip (.)) f s * 2
+
+main :: IO ()
+main = audition (out 0 hh_808)
+
diff --git a/src/hh-808.lhs b/src/hh-808.lhs
deleted file mode 100644
--- a/src/hh-808.lhs
+++ /dev/null
@@ -1,25 +0,0 @@
-hh-808 (ryan at wabdo.com)
-
-> import Sound.SC3
-
-> main =
->   let { time = 250
->       ; freqs = [205.35, 304.41, 369.64, 522.71, 540.54, 812.21]
->       ; pulseEnv = let e = env [1.0, 0.6] [time] [EnvNum (-0.5)] 0 0
->                    in envGen ar 1 1 0 (1/1000) DoNothing e
->       ; s = mix (lfPulse ar (mce (map (* 4.09) freqs)) 0 0.5)
->       ; f = [ \a -> ((a ==* 6.0) * 0.6) + ((a ==* 2.0) * 0.2) + ((a ==* 1.0) * 0.9)
->             , \a -> (a * pulseEnv) + ((mix (lfPulse ar (mce freqs) 0 0.55)) * 0.9)
->             , \a -> rlpf a 7000 0.6
->             , \a -> rhpf a 6800 1.5
->             , \a -> rhpf a 6800 1.5
->             , \a -> rhpf a 1200 1.5
->             , \a -> a + freeVerb a 0.33 0.5 0.5
->             , \a -> let { c = map EnvNum [0, -0.5, 0, -50]
->                         ; e = env [0, 1, 0.4, 0, 0] [2, time, 50, 500] c 0 0 }
->                     in a * envGen ar 1 1 0 (1/1000) RemoveSynth e
->             , \a -> mce [a, delayN a 0.005 0.005] ]
->       ; (>>>) = flip (.) }
->   in audition (out 0 (foldl1 (>>>) f s * 2))
-
-http://www.create.ucsb.edu/pipermail/sc-users/2007-August/036131.html
diff --git a/src/implosion.hs b/src/implosion.hs
new file mode 100644
--- /dev/null
+++ b/src/implosion.hs
@@ -0,0 +1,36 @@
+-- implosion (rd)
+
+import Sound.SC3.Monadic
+
+mkls :: [(UGen,UGen)] -> UGen -> UGen
+mkls bp t =
+    let e = envCoord bp t 1 EnvLin
+    in envGen KR 1 1 0 1 RemoveSynth e
+
+mkrmp :: UGen -> UGen -> UGen -> UGen
+mkrmp l r = mkls [(0,l),(1,r)]
+
+wrp :: UGen -> UGen -> UGen -> UGen
+wrp i = linLin i (-1) 1
+
+pmr_n :: UId m => Rate -> UGen -> UGen -> UGen -> UGen -> UGen -> m UGen
+pmr_n rt l0 l1 r0 r1 d = do
+  let le = mkrmp l0 r0 d
+      re = mkrmp l1 r1 d
+  n <- whiteNoise rt
+  return (wrp n le re)
+
+implosion :: IO UGen
+implosion = do
+  n0 <- rand (-1) 0
+  n1 <- rand 0 1
+  d  <- rand 7.5 13.5
+  f0 <- rand 10990 16220
+  f1 <- rand  9440 19550
+  f <- pmr_n AR 440 f0 f1 f1 d
+  l <- pmr_n KR n0 n1 0 0 d
+  a <- pmr_n KR 0.1 0.6 0 0 d
+  return (pan2 (saw AR f) l a)
+
+main :: IO ()
+main = audition . out 0 =<< implosion
diff --git a/src/implosion.lhs b/src/implosion.lhs
deleted file mode 100644
--- a/src/implosion.lhs
+++ /dev/null
@@ -1,22 +0,0 @@
-implosion (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { mkls bp t = let e = envCoord bp t 1 EnvLin
->                     in envGen kr 1 1 0 1 RemoveSynth e
->       ; mkrmp l r t = mkls [(0, l), (1, r)] t
->       ; wrp i l r = linLin i (-1) 1 l r
->       ; pmr_n rt l0 l1 r0 r1 d = let { le = mkrmp l0 r0 d
->                                      ; re = mkrmp l1 r1 d }
->                                  in do { n <- whiteNoise rt
->                                        ; return (wrp n le re) } }
->   in do { n0 <- rand (-1) 0
->         ; n1 <- rand 0 1
->         ; d  <- rand 7.5 13.5
->         ; f0 <- rand 10990 16220
->         ; f1 <- rand  9440 19550
->         ; f <- pmr_n ar 440 f0 f1 f1 d
->         ; l <- pmr_n kr n0 n1 0 0 d
->         ; a <- pmr_n kr 0.1 0.6 0 0 d
->         ; audition (out 0 (pan2 (saw ar f) l a)) }
diff --git a/src/insects.hs b/src/insects.hs
new file mode 100644
--- /dev/null
+++ b/src/insects.hs
@@ -0,0 +1,21 @@
+-- insects (sam pluta)
+
+import Sound.SC3.Monadic
+
+insect :: UId m => m UGen
+insect = do
+  r1 <- rand 2000 3000
+  r2 <- rand 0.05 0.1
+  n1 <- lfNoise2 KR (r2 * 50 + 50)
+  r4 <- rand 1 10
+  r5 <- rand 0.05 0.1
+  n2 <- lfNoise2 KR r5
+  let a = sinOsc KR r4 0 * 0.5 + 0.5
+      o = sinOsc AR (r1 + n1) r2 * 0.005 * a
+  return (pan2 o n2 1)
+
+insects :: UId m => m UGen
+insects = return.sum =<< sequence (replicate 60 insect)
+
+main :: IO ()
+main = audition . out 0 =<< insects
diff --git a/src/insects.lhs b/src/insects.lhs
deleted file mode 100644
--- a/src/insects.lhs
+++ /dev/null
@@ -1,15 +0,0 @@
-insects (sam pluta)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let insect = do { r1 <- rand 2000 3000
->                   ; r2 <- rand 0.05 0.1
->                   ; n1 <- lfNoise2 KR (r2 * 50 + 50)
->                   ; r4 <- rand 1 10
->                   ; r5 <- rand 0.05 0.1
->                   ; n2 <- lfNoise2 KR r5
->                   ; let { a = sinOsc KR r4 0 * 0.5 + 0.5
->                         ; o = sinOsc AR (r1 + n1) r2 * 0.005 * a }
->                     in return (pan2 o n2 1) }
->   in audition . (out 0) . sum =<< sequence (replicate 60 insect)
diff --git a/src/jl-1-Z.hs b/src/jl-1-Z.hs
new file mode 100644
--- /dev/null
+++ b/src/jl-1-Z.hs
@@ -0,0 +1,20 @@
+-- http://sccode.org/1-Z
+
+import Sound.SC3
+
+jl_z_1 :: UGen
+jl_z_1 =
+    let a = lag (impulse KR 8 0) 0.1
+        b = crackle AR (lag (abs (lfSaw KR 3 0)) 0.1 * 1.8)
+        c = a * b
+        d = lag (impulse KR 2 0 + impulse KR 4 0.5) 0.1
+        e = blip AR 4.9 7 * 0.4
+        f = d * e
+    in tanh (c + gVerb f 1 1 0.5 0.5 15 1 0.7 0.5 300 * 5) * 2
+
+main :: IO ()
+main = audition (out 0 jl_z_1)
+
+{-
+Sound.SC3.UGen.Dot.draw (out 0 jl_z_1)
+-}
diff --git a/src/jl-1-Z.scd b/src/jl-1-Z.scd
new file mode 100644
--- /dev/null
+++ b/src/jl-1-Z.scd
@@ -0,0 +1,16 @@
+~jl_1_z =
+    {var a = Impulse.kr(8,0).lag(0.1)
+    ;var b = Crackle.ar(LFSaw.kr(3,0).abs.lag(0.1) * 1.8)
+    ;var c = a * b
+    ;var d = (Impulse.kr(2,0) + Impulse.kr(4,0.5)).lag(0.1)
+    ;var e = Blip.ar(4.9,7) * 0.4
+    ;var f = d * e
+    ;tanh(c + GVerb.ar(f,1,1,0.5,0.5,15,1,0.7,0.5,300) * 5) * 2}
+
+~jl_1_z.play
+~jl_1_z.draw
+
+/*
+play{a=Impulse;tanh(a.kr(8).lag*Crackle.ar(LFSaw.kr(3).abs.lag*1.8)+
+GVerb.ar([a.kr(2)+a.kr(4,0.5)].lag*Blip.ar(4.9,7,0.4)!2,1,1)*5)}
+*/
diff --git a/src/k-ppr-m.hs b/src/k-ppr-m.hs
new file mode 100644
--- /dev/null
+++ b/src/k-ppr-m.hs
@@ -0,0 +1,29 @@
+-- k-ppr-m (rd)
+
+import Control.Monad
+import Sound.SC3.Monadic
+
+k_ppr_m :: IO UGen
+k_ppr_m = do
+  let wrp i = linLin i (-1) 1
+      x = mouseX' KR 0.05 0.35 Linear 0.1
+      y = mouseY' KR 0.15 0.75 Linear 0.1
+      ti = lfTri KR x 0
+      tf = wrp ti 100 200
+      t = impulse AR tf 0
+      stream lf rf ld rd g =
+          do r1 <- rand 9 18
+             let t' = pulseDivider t r1 0
+             r2 <- tRand lf (wrp ti lf rf) t'
+             r3 <- tRand ld rd t'
+             return (ringz (decay2 t' 0.01 0.5) r2 (r3 * y) * g)
+      s1 = stream 3140 6240 0.050 0.005 0.15
+      s2 = stream 0400 9000 0.005 0.005 0.15
+  liftM2 (+) (clone 2 s1) (clone 2 s2)
+
+main :: IO ()
+main = audition . out 0 =<< k_ppr_m
+
+{-
+k_ppr_m >>= Sound.SC3.UGen.Dot.draw
+-}
diff --git a/src/k-ppr.hs b/src/k-ppr.hs
new file mode 100644
--- /dev/null
+++ b/src/k-ppr.hs
@@ -0,0 +1,28 @@
+-- k-ppr (rd)
+
+import Sound.SC3.ID
+
+k_ppr :: UGen
+k_ppr =
+  let wrp i = linLin i (-1) 1
+      x = mouseX' KR 0.05 0.35 Linear 0.1
+      y = mouseY' KR 0.15 0.75 Linear 0.1
+      ti = lfTri KR x 0
+      tf = wrp ti 100 200
+      t = impulse AR tf 0
+      stream e lf rf ld rd g =
+          let r1 = rand e 9 18
+              t' = pulseDivider t r1 0
+              r2 = tRand e lf (wrp ti lf rf) t'
+              r3 = tRand e ld rd t'
+          in ringz (decay2 t' 0.01 0.5) r2 (r3 * y) * g
+      s1 = stream 'a' 3140 6240 0.050 0.005 0.15
+      s2 = stream 'a' 0400 9000 0.005 0.005 0.15
+  in uclone 'a' 2 s1 + uclone 'b' 2 s2
+
+main :: IO ()
+main = audition (out 0 k_ppr)
+
+{-
+Sound.SC3.UGen.Dot.draw k_ppr
+-}
diff --git a/src/k-ppr.lhs b/src/k-ppr.lhs
deleted file mode 100644
--- a/src/k-ppr.lhs
+++ /dev/null
@@ -1,39 +0,0 @@
-k-ppr (rd)
-
-> import Control.Monad
-> import Sound.SC3.Monadic
-> import qualified Sound.SC3.ID as I
-
-> main =
->   let { wrp i l r = linLin i (-1) 1 l r
->       ; x = linLin (I.lfNoise0 'a' KR 1) (-1) 1 0.05 0.35
->    {- ; x = mouseX kr 0.05 0.35 Linear 0.1 -}
->       ; y = linLin (I.lfNoise0 'b' KR 1) (-1) 1 0.15 0.75
->    {- ; y = mouseY kr 0.15 0.75 Linear 0.1 -}
->       ; ti = lfTri kr x 0
->       ; tf = wrp ti 100 200
->       ; t = impulse ar tf 0
->       ; stream lf rf ld rd g = 
->           do { r1 <- rand 9 18
->              ; let t' = pulseDivider t r1 0
->                in do { r2 <- tRand lf (wrp ti lf rf) t'
->                      ; r3 <- tRand ld rd t'
->                      ; return (ringz (decay2 t' 0.01 0.5) r2 (r3 * y) * g) } } 
->       ; s1 = stream 3140 6240 0.050 0.005 0.15 
->       ; s2 = stream 0400 9000 0.005 0.005 0.15 }
->   in audition . out 0 =<< liftM2 (+) (clone 2 s1) (clone 2 s2)
-
-{ var x = MouseX.kr(0.05, 0.35, 'linear', 0.1)
-; var y = MouseY.kr(0.15, 0.75, 'linear', 0.1)
-; var ti = LFTri.kr(x, 0)
-; 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 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
diff --git a/src/k-ppr.scd b/src/k-ppr.scd
new file mode 100644
--- /dev/null
+++ b/src/k-ppr.scd
@@ -0,0 +1,14 @@
+{ var x = MouseX.kr(0.05, 0.35, 'linear', 0.1)
+; var y = MouseY.kr(0.15, 0.75, 'linear', 0.1)
+; var ti = LFTri.kr(x, 0)
+; 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 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
diff --git a/src/kabelscahden.hs b/src/kabelscahden.hs
new file mode 100644
--- /dev/null
+++ b/src/kabelscahden.hs
@@ -0,0 +1,18 @@
+-- Kabelscahden
+-- Alberto de Campo and Julian Rohrhuber, 3/2003
+
+import Sound.SC3.ID
+
+kabelscahden :: UGen
+kabelscahden =
+    let t = dust 'a' KR (7 ** lfNoise1 'b' KR 0.3)
+	h' = toggleFF (coinGate 'd' 0.4 t)
+	h = h' * rlpf (lfPulse AR 50 0 0.5 + (lfNoise1 'e' KR 2 * 0.5 - 0.5)) 6000 0.15
+	n = trig t (tRand 'f' 0 0.01 (coinGate 'g' 0.4 t)) * whiteNoise 'h' AR
+	m = trig t (tRand 'i' 0 0.01 (coinGate 'j' 0.4 t)) * brownNoise 'k' AR
+	k' = trig t (lfNoise1 'l' KR (mce2 4 4.2) * 0.1 + 0.11)
+        k = k' * lfClipNoise 'm' AR (lfNoise0 'n' KR 7 * 30 + 40)
+    in out 0 (distort (leakDC ((h + n + m + k) * 10) 0.995))
+
+main :: IO ()
+main = audition kabelscahden
diff --git a/src/karplus-strong.hs b/src/karplus-strong.hs
new file mode 100644
--- /dev/null
+++ b/src/karplus-strong.hs
@@ -0,0 +1,47 @@
+-- karplus strong (alex mclean)
+-- http://doc.gold.ac.uk/~ma503am/alex/vocable-source-released/
+
+import Sound.OpenSoundControl
+import Sound.SC3.ID
+
+karplus_strong :: UGen
+karplus_strong =
+    let vf i s = let f = in' 5 KR i
+                     a = in' 5 KR (i + 5)
+                     b = in' 5 KR (i + 10)
+                 in mix (resonz s f (b / f) * dbAmp a)
+        x = mouseX' KR 0 0.01 Linear 0.1 {- delay -}
+        y = mouseY' KR 0.85 1 Linear 0.1 {- blend / gain -}
+        ugenIf a b c = (a * b) + ((1 - a) * c)
+        n = whiteNoise 'a' AR
+        d = dust 'a' KR 4
+        n0 = (n * 0.5) + 0.5
+        probSwitch i prob = ugenIf (n0 >* prob) i (negate i)
+        laggedDelay = lag x 0.01
+        o = sinOsc AR 200 0
+        a0 = decay d 0.025 * o
+        a1 = localIn 1 AR + (a0 * (y - 0.25))
+        a2 = delayN a1 0.01 laggedDelay
+        a3 = delay1 a2
+        a4 = (a2 + a3) * 0.5
+        a5 = probSwitch a4 y
+        a6 = vf (toggleFF d * 15) a5
+        a7 = a6 * 1.5
+    in mrg [localOut (a5 * 0.99),out 0 (mce2 a7 a7)]
+
+act :: Transport t => t -> IO ()
+act fd = do
+  let aA = ("aA"
+           ,[800,1150,2800,3500,4950]
+           ,[0,-4 ,-20,-36,-60]
+           ,[80,90, 120,130,140])
+      aU = ("aU"
+           ,[325,700,2530,3500,4950]
+           ,[0,-12,-30,-40,-64]
+           ,[50,60, 170,180,200])
+      cs (_,c1,c2,c3) = c1 ++ c2 ++ c3
+  send fd (c_setn [(0,cs aA),(15,cs aU)])
+  play fd karplus_strong
+
+main :: IO ()
+main = withSC3 act
diff --git a/src/karplus-strong.lhs b/src/karplus-strong.lhs
deleted file mode 100644
--- a/src/karplus-strong.lhs
+++ /dev/null
@@ -1,40 +0,0 @@
-karplus strong (alex mclean)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { aA = ( "aA" 
->              , [800, 1150, 2800, 3500, 4950]
->              , [0, -4  , -20, -36 , -60]
->              , [80, 90,  120, 130, 140] )
->       ; aU = ( "aU" 
->              , [325, 700, 2530, 3500, 4950]
->              , [0, -12 , -30, -40, -64]
->              , [50, 60,  170, 180, 200] )
->       ; cs (_, c1, c2, c3) = c1 ++ c2 ++ c3
->       ; vf i s = let { f = in' 5 kr i
->                      ; a = in' 5 kr (i + 5)
->                      ; b = in' 5 kr (i + 10) }
->                  in mix (resonz s f (b / f) * dbAmp a)
->       ; ks n d = let { x = mouseX kr 0 0.01 Linear 0.1 {- delay -}
->                      ; y = mouseY kr 0.85 1 Linear 0.1 {- blend / gain -}
->                      ; ugenIf a b c = (a * b) + ((1 - a) * c)
->                      ; n0 = (n / 2) + 0.5
->                      ; probSwitch i prob = ugenIf (n0 >* prob) i (negate i)
->                      ; laggedDelay = lag x 0.01
->                      ; o = sinOsc ar 200 0
->                      ; a0 = decay d 0.025 * o
->                      ; a1 = localIn 1 ar + (a0 * (y - 0.25))
->                      ; a2 = delayN a1 0.01 laggedDelay
->                      ; a3 = delay1 a2
->                      ; a4 = (a2 + a3) / 2.0
->                      ; a5 = probSwitch a4 y
->                      ; a6 = vf (toggleFF d * 15) a5
->                      ; a7 = a6 * 1.5 }
->                 in mrg [localOut (a5 * 0.99), out 0 (mce [a7, a7])] }
->   in withSC3 (\fd -> do { send fd (c_setn [(0,cs aA), (15, cs aU)])
->                         ; n <- whiteNoise ar
->                         ; d <- dust kr 4
->                         ; play fd (ks n d) })
-
-Variant on http://doc.gold.ac.uk/~ma503am/alex/vocable-source-released/
diff --git a/src/klink.hs b/src/klink.hs
new file mode 100644
--- /dev/null
+++ b/src/klink.hs
@@ -0,0 +1,19 @@
+-- klink (rd)
+
+import Sound.SC3.ID
+
+klink :: UGen
+klink =
+  let n1 = lfNoise0 'a' KR (mce2 0.5 1.5)
+      o = sinOsc KR n1 0
+      a = abs (slope o) * mce2 2 3
+      t = impulse AR a 0
+      i = decay2 t 0.01 0.1
+      x = mouseX' KR 960 3620 Exponential 0.2
+      y = mouseY' KR 0.5 2.0 Linear 0.2
+      n2 = tRand 'a' x 3940 t
+      n3 = tRand 'a' 0.005 0.275 t
+  in ringz i n2 (n3 * y)
+
+main :: IO ()
+main = audition (out 0 klink)
diff --git a/src/klink.lhs b/src/klink.lhs
deleted file mode 100644
--- a/src/klink.lhs
+++ /dev/null
@@ -1,28 +0,0 @@
-klink (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { n1 <- lfNoise0 kr (mce2 0.5 1.5)
->      ; let { o = sinOsc kr n1 0
->            ; f = mce2 2 3
->            ; a = abs (slope o) * f
->            ; t = impulse ar a 0
->            ; i = decay2 t 0.01 0.1
->            ; x = mouseX kr 960 3620 Exponential 0.2
->            ; y = mouseY kr 0.5 2.0 Linear 0.2 }
->        in do { n2 <- tRand x 3940 t
->              ; n3 <- tRand 0.005 0.275 t
->              ; audition (out 0 (ringz i n2 (n3 * y))) } }
-
-{ var n1 = LFNoise0.kr([0.5, 1.5])
-; var o = SinOsc.kr(n1, 0)
-; var f = [2, 3]
-; var a = Slope.kr(o).abs * f
-; var t = Impulse.ar(a, 0)
-; var i = Decay2.ar(t, 0.01, 0.1)
-; var x = MouseX.kr(960, 3620, 'exponential', 0.2)
-; 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
diff --git a/src/klink.scd b/src/klink.scd
new file mode 100644
--- /dev/null
+++ b/src/klink.scd
@@ -0,0 +1,10 @@
+{var n1 = LFNoise0.kr([0.5,1.5])
+;var o = SinOsc.kr(n1,0)
+;var a = Slope.kr(o).abs * [2,3]
+;var t = Impulse.ar(a,0)
+;var i = Decay2.ar(t,0.01,0.1)
+;var x = MouseX.kr(960,3620,'exponential',0.2)
+;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
diff --git a/src/lf-pulses.hs b/src/lf-pulses.hs
new file mode 100644
--- /dev/null
+++ b/src/lf-pulses.hs
@@ -0,0 +1,16 @@
+-- lf pulses (rd)
+
+import Sound.SC3.ID
+
+lf_pulses :: UGen
+lf_pulses =
+  let n0 = lfNoise0 'a' AR (mce2 20 40)
+      n1 = lfNoise0 'a' AR (mce2 5 10)
+      x = mouseX' KR 0.012 0.19 Exponential 0.1
+      f = formlet (blip AR 10 12) (n0 * 43 + 700) 0.005 x
+      o = sinOsc AR 40 0 * n1
+  in clip2 (leakDC (f + o) 0.995) 0.75
+
+main :: IO ()
+main = audition (out 0 lf_pulses)
+
diff --git a/src/lf-pulses.lhs b/src/lf-pulses.lhs
deleted file mode 100644
--- a/src/lf-pulses.lhs
+++ /dev/null
@@ -1,20 +0,0 @@
-lf pulses (rd)
-
-> import Sound.SC3.Monadic
-> import qualified Sound.SC3.ID as I
-
-> main =
->   do { n0 <- lfNoise0 AR (mce2 20 40)
->      ; n1 <- lfNoise0 AR (mce2 5 10)
->      ; let { x = linLin (I.lfNoise0 'a' KR 1) (-1) 1 0.012 0.19
->         {- ; x = mouseX KR 0.012 0.19 Exponential 0.1 -}
->            ; f = formlet (blip AR 10 12) (n0 * 43 + 700) 0.005 x 
->            ; o = sinOsc AR 40 0 * n1 }
->        in audition (out 0 (clip2 (leakDC (f + o) 0.995) 0.75)) }
-
-{ var n0 = LFNoise0.ar([20, 40])
-; var n1 = LFNoise0.ar([5, 10])
-; 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
diff --git a/src/lf-pulses.scd b/src/lf-pulses.scd
new file mode 100644
--- /dev/null
+++ b/src/lf-pulses.scd
@@ -0,0 +1,6 @@
+{ var n0 = LFNoise0.ar([20, 40])
+; var n1 = LFNoise0.ar([5, 10])
+; 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
diff --git a/src/lfo-modulation.hs b/src/lfo-modulation.hs
new file mode 100644
--- /dev/null
+++ b/src/lfo-modulation.hs
@@ -0,0 +1,10 @@
+-- lfo modulation (jmcc)
+
+import Sound.SC3
+
+main :: IO ()
+main =
+  let o = fSinOsc KR 0.05 0 * 80 + 160
+      p = fSinOsc KR (mce2 0.6 0.7) 0 * 3600 + 4000
+      s = rlpf (lfPulse AR o 0 0.4 * 0.05) p 0.2
+  in audition (out 0 (combL s 0.3 (mce2 0.2 0.25) 2))
diff --git a/src/lfo-modulation.lhs b/src/lfo-modulation.lhs
deleted file mode 100644
--- a/src/lfo-modulation.lhs
+++ /dev/null
@@ -1,14 +0,0 @@
-lfo modulation (jmcc)
-
-> import Sound.SC3
-
-> main =
->   let { o = fSinOsc kr 0.05 0 * 80 + 160
->       ; p = fSinOsc kr (mce2 0.6 0.7) 0 * 3600 + 4000
->       ; s = rlpf (lfPulse ar o 0 0.4 * 0.05) p 0.2 }
->   in audition (out 0 (combL s 0.3 (mce2 0.2 0.25) 2))
-
-{ 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
diff --git a/src/lfo-modulation.scd b/src/lfo-modulation.scd
new file mode 100644
--- /dev/null
+++ b/src/lfo-modulation.scd
@@ -0,0 +1,4 @@
+{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
diff --git a/src/lg-timed.hs b/src/lg-timed.hs
new file mode 100644
--- /dev/null
+++ b/src/lg-timed.hs
@@ -0,0 +1,24 @@
+-- lg-timed (rd)
+
+import Sound.SC3.Monadic
+
+lg_timed :: UId m => m UGen
+lg_timed = do
+  let timed r y p =
+          do d0 <- dser r p
+             d1 <- dcons 0 d0
+             d2 <- dser r y
+             let t = tDuty AR d1 0 RemoveSynth d2 1
+             return (latch t t)
+      lg u = return (lag u 0.03)
+      n = mce [52,76,66,67,68,69]
+      a = mce [0.35,0.15,0.04,0.05,0.16,0.07]
+      d = mce [0.1,0.5,0.09,0.08,0.07,0.3]
+      x = mouseX' KR 0.5 1.25 Linear 0.2
+  tn <- lg =<< timed dinf n (d * x)
+  ta <- lg =<< timed dinf a (d * x)
+  return (sinOsc AR (midiCPS tn) 0 * ta)
+
+main :: IO ()
+main = audition . out 0 =<< lg_timed
+
diff --git a/src/lg-timed.lhs b/src/lg-timed.lhs
deleted file mode 100644
--- a/src/lg-timed.lhs
+++ /dev/null
@@ -1,39 +0,0 @@
-lg-timed (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { timed r y p =
->         do { d0 <- dser r p
->            ; d1 <- dcons 0 d0
->            ; d2 <- dser r y
->            ; let t = tDuty AR d1 0 RemoveSynth d2 1
->              in return (latch t t) }
->       ; lg u = return (lag u 0.03)
->       ; n = mce [52, 76, 66, 67, 68, 69]
->       ; a = mce [0.35, 0.15, 0.04, 0.05, 0.16, 0.07]
->       ; d = mce [0.1, 0.5, 0.09, 0.08, 0.07, 0.3]
->       ; x = mouseX KR 0.5 1.25 Linear 0.2 }
->   in do { tn <- lg =<< timed dinf n (d * x)
->         ; ta <- lg =<< timed dinf a (d * x)
->         ; audition (out 0 (sinOsc AR (midiCPS tn) 0 * ta)) }
-
-{ var dcons = { arg x, xs
-              ; var i = Dseq.new([0, 1], 1)
-              ; var a = Dseq.new([x, xs], 1)
-              ; Dswitch.new(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 t = TDuty.ar(d1, 0, d2, 2, 1)
-              ; Latch.ar(t, t) }
-; var lg = { arg u
-           ; Lag.ar(u, 0.03) }
-; var n = [52, 76, 66, 67, 68, 69]
-; 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
diff --git a/src/lg-timed.scd b/src/lg-timed.scd
new file mode 100644
--- /dev/null
+++ b/src/lg-timed.scd
@@ -0,0 +1,19 @@
+{ var dcons = { arg x, xs
+              ; var i = Dseq.new([0, 1], 1)
+              ; var a = Dseq.new([x, xs], 1)
+              ; Dswitch.new(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 t = TDuty.ar(d1, 0, d2, 2, 1)
+              ; Latch.ar(t, t) }
+; var lg = { arg u
+           ; Lag.ar(u, 0.03) }
+; var n = [52, 76, 66, 67, 68, 69]
+; 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
diff --git a/src/lin-sosc.hs b/src/lin-sosc.hs
new file mode 100644
--- /dev/null
+++ b/src/lin-sosc.hs
@@ -0,0 +1,93 @@
+-- lin-sosc (rd)
+
+import Control.Concurrent
+import Control.Monad
+import Sound.OpenSoundControl
+import Sound.SC3
+import qualified Sound.SC3.Lang.Random.IO as R
+
+iota :: (Num a, Num b) => a -> b -> b -> [b]
+iota 0 _ _ = []
+iota n l s = l : iota (n - 1) (l + s) s
+
+geom :: (Num a, Num b) => a -> b -> b -> [b]
+geom 0 _ _ = []
+geom n i f = i : geom (n - 1) (i * f) f
+
+lineTo :: Fractional a => a -> a -> a -> [a]
+lineTo n l r = iota n l ((r - l) / n)
+
+xlineTo :: Floating a => a -> a -> a -> [a]
+xlineTo n l r = geom n l ((r / l) ** (1.0 / n))
+
+tblM :: UGen -> UGen -> UGen
+tblM b x = playBuf 1 AR b (x * bufRateScale KR b) 0 0 Loop DoNothing
+
+tblC :: UGen -> UGen -> UGen
+tblC b c = tblM b (in' 1 KR c)
+
+lin_sosc :: UGen
+lin_sosc =
+    let x = mouseX' KR 0.001 1.0 Linear 0.1
+        o = sinOsc AR (tblM 0 x) 0 * tblM 1 x
+    in clip2 (pan2 o (tblC 1 0) 0.025) 0.25
+
+twoPi :: Double
+twoPi = pi * 2.0
+
+srng :: Fractional a => a -> a -> a -> a
+srng l r e =
+    let m = (l - r ) / 2
+    in m + l + (e * m)
+
+type Lin_Data = ([[Double]], [[Double]], [Double], [Double])
+
+lin_data :: Double -> Lin_Data
+lin_data n =
+    let f = [lineTo n 440.0 444.0
+            ,lineTo n 40.0 16000.0
+            ,xlineTo n 40.0 16000.0
+            ,map (srng 20 21000 . sin) (lineTo n 0.0 twoPi)
+            ,map (srng 20 12000 . cos) (lineTo n 0.0 twoPi)
+            ,map (srng 20 22000 . tan) (lineTo n 0.0 twoPi)
+            ,map (srng 20 90 . tan) (lineTo n 0.0 twoPi)]
+        a = [lineTo n 0.1 1.0
+            ,lineTo n 1.0 0.1
+            ,lineTo n 0.5 0.01
+            ,lineTo n 0.01 0.5
+            ,xlineTo n 1.0 0.1
+            ,xlineTo n 0.1 1.0
+            ,map sin (lineTo n 0.0 twoPi)
+            ,map cos (lineTo n 0.0 twoPi)
+            ,map ((* 0.001) . tan) (lineTo n 0 twoPi)]
+        l = [0.005,0.0075,0.01,0.025,0.05,0.075
+            ,0.1,0.25,0.5,0.75
+            ,0.8,0.85,1.0,1.005]
+        t = [0.01,0.05,0.1,0.15,0.25,0.5,0.75]
+    in (f,a,l,t)
+
+update :: Transport t => Lin_Data -> t -> IO ()
+update (f,a,l,t) fd = do
+  f' <- R.choose f
+  a' <- R.choose a
+  l' <- R.choose l
+  t' <- R.choose t
+  send fd (b_setn 0 [(0,f')])
+  send fd (b_setn 1 [(0,a')])
+  send fd (c_set [(0,l')])
+  pauseThread t'
+
+do_update :: Double -> IO ()
+do_update n = withSC3 (replicateM_ 128 . update (lin_data n))
+
+run :: Transport t => t -> IO ()
+run fd = do
+  let n = 1024
+  _ <- async fd (b_alloc 0 (floor n) 1)
+  _ <- async fd (b_alloc 1 (floor n) 1)
+  play fd (out 0 lin_sosc)
+  _ <- forkIO (do_update n)
+  return ()
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/lin-sosc.lhs b/src/lin-sosc.lhs
deleted file mode 100644
--- a/src/lin-sosc.lhs
+++ /dev/null
@@ -1,59 +0,0 @@
-lin-sosc (rd)
-
-> import Control.Concurrent
-> import Control.Monad
-> import Sound.OpenSoundControl
-> import Sound.SC3.ID
-> import System.Random
-
-> main =
->   let { n' = 1024
->       ; x = linLin (lfNoise0 'a' KR 1) (-1) 1 0.001 1
->    {- ; x = mouseX KR 0.001 1.0 Linear 0.1 -}
->       ; tblM b = playBuf 1 b (x * bufRateScale KR b) 0 0 Loop DoNothing
->       ; tblC b c = playBuf 1 b (in' 1 KR c * bufRateScale KR b) 0 0 Loop DoNothing
->       ; o = sinOsc AR (tblM 0) 0 * tblM 1 
->       ; co = clip2 (pan2 o (tblC 1 0) 0.025) 0.25
->       ; rrand (a, b) = getStdRandom (randomR (a,b))
->       ; choose l = fmap (l !!) (rrand (0, length l - 1))
->       ; iota 0 _ _ = []
->       ; iota n l s = l : iota (n - 1) (l + s) s
->       ; geom 0 _ _ = []
->       ; geom n i f = i : geom (n - 1) (i * f) f
->       ; lineTo n l r = iota n l ((r - l) / n)
->       ; xlineTo n l r = geom n l ((r / l) ** (1.0 / n))
->       ; twoPi = pi * 2.0
->       ; srng l r e = let m = (l - r ) / 2
->                      in m + l + (e * m) 
->       ; freq = [ lineTo n' 440.0 444.0
->                , lineTo n' 40.0 16000.0
->                , xlineTo n' 40.0 16000.0
->                , map (srng 20 21000 . sin) (lineTo n' 0.0 twoPi)
->                , map (srng 20 12000 . cos) (lineTo n' 0.0 twoPi)
->                , map (srng 20 22000 . tan) (lineTo n' 0.0 twoPi)
->                , map (srng 20 90 . tan) (lineTo n' 0.0 twoPi) ]
->       ; ampl = [ lineTo n' 0.1 1.0
->                , lineTo n' 1.0 0.1
->                , lineTo n' 0.5 0.01
->                , lineTo n' 0.01 0.5
->                , xlineTo n' 1.0 0.1
->                , xlineTo n' 0.1 1.0
->                , map sin (lineTo n' 0.0 twoPi)
->                , map cos (lineTo n' 0.0 twoPi)
->                , map (* 0.001) (map tan (lineTo n' 0 twoPi)) ]
->       ; sloc = [ 0.005, 0.0075, 0.01, 0.025, 0.05, 0.075
->                , 0.1, 0.25, 0.5, 0.75
->                , 0.8, 0.85, 1.0, 1.005 ]
->       ; paus = [0.01, 0.05, 0.1, 0.15, 0.25, 0.5, 0.75]
->       ; update fd = do { f <- choose freq
->                        ; a <- choose ampl
->                        ; s <- choose sloc
->                        ; p <- choose paus
->                        ; send fd (b_setn 0 [(0, f)])
->                        ; send fd (b_setn 1 [(0, a)])
->                        ; send fd (c_set [(0, s)])
->                        ; pauseThread p } }
->   in do { _ <- withSC3 (\fd -> do { _ <- async fd (b_alloc 0 (floor n') 1)
->                                   ; _ <- async fd (b_alloc 1 (floor n') 1)
->                                   ; play fd (out 0 co) })
->         ; forkIO (withSC3 (\fd -> replicateM_ 128 (update fd))) }
diff --git a/src/lso-061101.hs b/src/lso-061101.hs
new file mode 100644
--- /dev/null
+++ b/src/lso-061101.hs
@@ -0,0 +1,112 @@
+-- | L-System oscillator (rd, 2006-11-01)
+import Control.Monad
+import Graphics.PS.Pt {- hps -}
+import Graphics.PS.Unit
+import qualified LSystem.LSystem as L {- hls -}
+import qualified LSystem.Systems as L
+import qualified LSystem.Turtle as L
+import qualified Sound.File.NeXT as F {- hsc3-sf -}
+import Sound.SC3.Monadic {- hsc3 -}
+import System.Directory {- directory -}
+import qualified System.FilePath as P {- filepath -}
+import System.Random {- random -}
+
+-- | Normalise to lie in (0,1).
+--
+-- > normalise [1,4,2,5] == [0.2,0.8,0.4,1]
+normalise :: (Fractional a,Ord a) => [a] -> [a]
+normalise s =
+    let n = 1 / maximum (map abs s)
+    in map (* n) s
+
+-- | 'L.render' rule.
+plain :: [Double] -> Pt -> Pt -> [Double]
+plain d (Pt x0 y0) (Pt x1 y1) = [x0,y0,x1,y1] ++ d
+
+-- | Render 'L.LSystem' to 'plain' data.
+lsys_run :: (L.LSystem,Double,Double) -> Int -> [Double]
+lsys_run (l,ta,ls) i =
+    let a = L.Turtle (radians ta) 1 (Pt 0 0) (pi/2) 1 ls []
+    in L.render [] plain (L.expand l i) a
+
+-- | 'normalise' '.' 'lsys_run'
+--
+-- > length (gen_d L.l0d 3)
+gen_d :: (L.LSystem,Double,Double) -> Int -> [Double]
+gen_d l = normalise . lsys_run l
+
+-- | Write 'gen_d' to 'FilePath' as /NeXT/ sound file.
+gen_f :: FilePath -> [Double] -> IO ()
+gen_f nm d = F.write nm (F.Header (length d) F.Float 44100 1) [d]
+
+-- | Rendered L-system data sets.
+lsys_data :: [[Double]]
+lsys_data =
+    [gen_d L.l0d 3
+    ,gen_d L.l1d 3
+    ,gen_d L.l2d 5
+    ,gen_d L.l3d 12
+    ,gen_d L.l4d 6
+    ,gen_d L.l5d 4
+    ,gen_d L.l6d 7
+    ,gen_d L.l7d 4
+    ,gen_d L.l8d 6
+    ,gen_d L.l9d 10
+    ,gen_d L.lAd 11
+    ,gen_d L.lBd 6
+    ,gen_d L.lCd 5]
+
+-- | Exceeds UDP limits.
+lsys_send :: IO ()
+lsys_send = do
+  let alloc fd (n,d) = async fd (b_alloc_setn1 n 0 d)
+  withSC3 (\fd -> mapM_ (alloc fd) (zip [0..] lsys_data))
+
+
+-- | Filename for 'lsys_data'.
+lsys_fn :: FilePath  -> [FilePath]
+lsys_fn d =
+    let n = length lsys_data
+        nm i = d P.</> show i P.<.> "snd"
+    in map nm [0 .. n - 1]
+
+-- | Write 'lsys_data' to 'lsys_fn' using 'gen_f'.
+lsys_write :: FilePath -> IO ()
+lsys_write d = zipWithM_ gen_f (lsys_fn d) lsys_data
+
+-- | Load 'lsys_fn' at /scsynth/.
+lsys_load :: FilePath -> IO ()
+lsys_load d = do
+  let alloc fd (n,nm) = async fd (b_allocRead n nm 0 0)
+  withSC3 (\fd -> mapM_ (alloc fd) (zip [0..] (lsys_fn d)))
+
+-- | Oscillator instrument
+oi :: IO UGen
+oi = do
+  let rrand l r = getStdRandom (randomR (l, r))
+      choose l = fmap (l !!) (rrand 0 (length l - 1))
+      rng i = linLin i (-1) 1
+      exprng i = linExp i (-1) 1
+  c <- choose [0.25, 0.55, 0.75, 1.25]
+  let t = impulse KR c 0
+  b <- tIRand 0 12 t
+  let n  = bufFrames KR b
+      m  = n / 4
+      i  = floorE (rng (lfSaw AR c 0) 0 m) * 4
+      tt = impulse AR (m / c) 0
+      x0 = bufRdL 1 AR b i       NoLoop
+      y0 = bufRdL 1 AR b (i + 1) NoLoop
+      x1 = bufRdL 1 AR b (i + 2) NoLoop
+      y1 = bufRdL 1 AR b (i + 3) NoLoop
+  f0 <- choose [16, 32, 64, 128, 256, 512, 8192]
+  let f1 = 22000
+      o x y = let f = exprng x f0 f1
+              in pan2 (blip AR f (rng y 1 64)) y0 (decay tt 0.005)
+  return (o x0 y0 + o x1 y1)
+
+main :: IO ()
+main = do
+  t <- getTemporaryDirectory
+  lsys_write t
+  lsys_load t
+  oi >>= audition . out 0
diff --git a/src/lucier.hs b/src/lucier.hs
--- a/src/lucier.hs
+++ b/src/lucier.hs
@@ -56,38 +56,9 @@
 	outR = pk2_L + pk2_R
     in audition (out 0 (mrg [mce2 outL outR, drv, source, l_out]))
 
+main :: IO ()
 main = lucier_wire 60
 
 {-
 lucier_wire 60
-
-{ var blocksize = ControlRate.ir.reciprocal
-; var mk_dt = { |f| f.reciprocal - blocksize }
-; var string_dt = mk_dt.(60)
-; var c = 425
-; var len = 40
-; var pk1_p = 0.1
-; var src_p = 0.3
-; 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)) }
-; var mk_ap = { arg i, r, 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.())
-; var pk1_L = mk_ap.(pk1_R * -1, pk1_p * 2, r.())
-; var pk2_L = mk_dl.(pk1_L, pk2_p - pk1_p, r.()) * 0.99
-; var strL = mk_dl.(pk2_L, 1 - pk2_p, r.())
-; var pk2_R = mk_ap.(strL * -1, 1 - pk2_p, 2 + r.()) * 0.99
-; var strR = mk_dl.(pk2_R, pk2_p - src_p, 2 + r.())
-; var src = { var a = Amplitude.kr(drv, mul: 11)
-            ; p = Pulse.ar(60 + a, mul: 0.1)
-            ; RLPF.ar((SinOsc.ar(220, 0) * 0.01) + p, 320, 0.05) }
-; var src_n = { var a = Amplitude.kr(drv).min(1.0)
-              ; Normalizer.ar(src, 0.7) * (1.0 - a) }
-; LocalOut.ar(src * 0.2 + strR)
-; [pk1_L + pk1_R, pk2_L + pk2_R, drv, src] }.play
-
 -}
diff --git a/src/lucier.scd b/src/lucier.scd
new file mode 100644
--- /dev/null
+++ b/src/lucier.scd
@@ -0,0 +1,28 @@
+{ var blocksize = ControlRate.ir.reciprocal
+; var mk_dt = { |f| f.reciprocal - blocksize }
+; var string_dt = mk_dt.(60)
+; var c = 425
+; var len = 40
+; var pk1_p = 0.1
+; var src_p = 0.3
+; 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)) }
+; var mk_ap = { arg i, r, 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.())
+; var pk1_L = mk_ap.(pk1_R * -1, pk1_p * 2, r.())
+; var pk2_L = mk_dl.(pk1_L, pk2_p - pk1_p, r.()) * 0.99
+; var strL = mk_dl.(pk2_L, 1 - pk2_p, r.())
+; var pk2_R = mk_ap.(strL * -1, 1 - pk2_p, 2 + r.()) * 0.99
+; var strR = mk_dl.(pk2_R, pk2_p - src_p, 2 + r.())
+; var src = { var a = Amplitude.kr(drv, mul: 11)
+            ; p = Pulse.ar(60 + a, mul: 0.1)
+            ; RLPF.ar((SinOsc.ar(220, 0) * 0.01) + p, 320, 0.05) }
+; var src_n = { var a = Amplitude.kr(drv).min(1.0)
+              ; Normalizer.ar(src, 0.7) * (1.0 - a) }
+; LocalOut.ar(src * 0.2 + strR)
+; [pk1_L + pk1_R, pk2_L + pk2_R, drv, src] }.play
diff --git a/src/microhelix.hs b/src/microhelix.hs
new file mode 100644
--- /dev/null
+++ b/src/microhelix.hs
@@ -0,0 +1,58 @@
+-- Batuhan Bozkurt 2009 http://www.earslap.com
+
+import Sound.SC3.ID
+
+rng :: UGen -> UGen -> UGen -> UGen
+rng l r =
+    let m = (r - l) * 0.5
+	a = m + l
+    in (+ a) . (* m)
+
+offset_id :: Enum a => Int -> a -> Int
+offset_id n e = n + fromEnum e
+
+-- mce...........................
+microhelix :: UGen
+microhelix =
+    let rp = replicate
+        ctrigs_ z_ =
+            let z = offset_id z_
+                i = mce (rp 8 (1/8) ++
+                         rp 8 (1/4) ++
+                         [dseq (z 'a') (drand (z 'b') dinf (mce2 1 2)) (mce2 (1/16) (1/16))])
+                d = dxrand (z 'c') dinf (mceMap (* 1.25) i)
+            in tDuty AR d 0 DoNothing (dwhite (z 'd') dinf 0.5 1) 0
+        ctrigs = mce2 (ctrigs_ 0) (ctrigs_ 12)
+        clicks =
+            let n = pinkNoise 'e' AR * decay ctrigs (0.001 * abs (lfNoise1 'f' AR 4))
+	    in fold (bpf n 15000 0.9 * (25 * rng 0 1 (lfNoise1 'g' AR 8))) (-1) 1
+	snd1 =
+            let o = sinOsc AR (midiCPS 44) 0 * 0.5 + sinOsc AR (midiCPS 90) 0 * 0.6
+	    in lpf o (midiCPS 32) * 2 + hpf (lpf (whiteNoise 'h' AR * 0.008) 12000) 2400
+        hiNoise =
+            let n = whiteNoise 'i' AR
+                e = decay2 (ctrigs * (lfNoise1 'j' AR 8 * 0.5 + 0.5)) 0.02 0.1 * 0.05
+            in bpf (n * e) (tRand 'k' 12000 15000 ctrigs) 0.9
+	trigMod = roundTo (lfNoise0 'l' AR 8) 1
+	bass =
+            let t = mceChannel 0 ctrigs * trigMod
+                ph = sweep t (2 * pi * mce2 52.8 740) + (pi/3)
+                ph' = wrap ph (-pi) pi
+                mean u = mceSum u / fromIntegral (mceDegree u)
+                o = tanh (mean (sinOsc AR 0 ph' * mce2 2 0.05))
+                d = env [0, 0.5, 0.4, 0] [0, 0.2, 0.01] [EnvNum (-5)] 0 0
+                e = envGen AR (abs t) 1 0 1 DoNothing d
+	    in o * e * 0.25
+        snd1' =
+            let t = mceChannel 0 ctrigs
+                d = env [0, 1, 0.6, 0] [0.0001, 0.4, 0.01] [EnvNum (-4)] 0 0
+                e = envGen AR (t * lfNoise0 'm' AR 8) 1 0 1 DoNothing d
+	    in pan2 (snd1 * e) (tRand 'n' (-1) 1 t) 1
+    in limiter (midEQ (clicks + snd1' + hiNoise + bass) 14000 0.7 8) 1 0.01
+
+main :: IO ()
+main = audition (out 0 microhelix)
+
+{-
+Sound.SC3.UGen.Dot.draw microhelix
+-}
diff --git a/src/modal-space.hs b/src/modal-space.hs
new file mode 100644
--- /dev/null
+++ b/src/modal-space.hs
@@ -0,0 +1,29 @@
+-- modal space (jmcc)
+
+import Sound.OpenSoundControl
+import Sound.SC3.ID
+
+ms :: UGen -> UGen -> UGen
+ms n r =
+    let x = mouseX' KR 0 15 Linear 0.1
+        k = degreeToKey 0 x 12
+        o = sinOsc AR (midiCPS (r + k + n * 0.04)) 0 * 0.1
+        t = lfPulse AR (midiCPS (mce2 48 55)) 0.15 0.5
+        f = midiCPS (sinOsc KR 0.1 0 * 10 + r)
+        d = rlpf t f 0.1 * 0.1
+        m = o + d
+    in combN m 0.31 0.31 2 + m
+
+modal_space :: UGen
+modal_space =
+    let n = udup 2 (lfNoise1 'a' KR 3)
+    in (ms n 48 + ms n 72) * 0.25
+
+run :: Transport t => t -> IO ()
+run fd = do
+  let p = [0,2,3.2,5,7,9,10]
+  _ <- async fd (b_alloc_setn1 0 0 p)
+  play fd (out 0 modal_space)
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/modal-space.lhs b/src/modal-space.lhs
deleted file mode 100644
--- a/src/modal-space.lhs
+++ /dev/null
@@ -1,37 +0,0 @@
-modal space (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { b = 0
->       ; p = [0, 2, 3.2, 5, 7, 9, 10] 
->       ; x = mouseX kr 0 15 Linear 0.1
->       ; k = degreeToKey 0 x 12
->       ; c n r = let { o = sinOsc ar (midiCPS (r + k + n * 0.04)) 0 * 0.1
->                     ; t = lfPulse ar (midiCPS (mce2 48 55)) 0.15 0.5
->                     ; f = midiCPS (sinOsc kr 0.1 0 * 10 + r)
->                     ; d = rlpf t f 0.1 * 0.1
->                     ; m = o + d }
->                 in combN m 0.31 0.31 2 + m }
->   in withSC3 (\fd -> do { async fd (b_alloc b (length p) 1)
->                         ; send fd (b_setn1 b 0 p)
->                         ; n <- clone 2 (lfNoise1 kr 3)
->                         ; play fd (out 0 ((c n 48 + c n 72) * 0.25)) })
-
-{ 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.15, 0.5)
-          ; 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
diff --git a/src/modal-space.scd b/src/modal-space.scd
new file mode 100644
--- /dev/null
+++ b/src/modal-space.scd
@@ -0,0 +1,17 @@
+{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.15,0.5)
+         ;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
diff --git a/src/moto-rev.hs b/src/moto-rev.hs
new file mode 100644
--- /dev/null
+++ b/src/moto-rev.hs
@@ -0,0 +1,12 @@
+-- moto rev (jmcc)
+
+import Sound.SC3
+
+moto_rev :: UGen
+moto_rev =
+  let f = sinOsc KR 0.2 0 * 10 + 21
+      s = lfPulse AR f (mce2 0 0.1) 0.1
+  in clip2 (rlpf s 100 0.1) 0.4
+
+main :: IO ()
+main = audition (out 0 moto_rev)
diff --git a/src/moto-rev.lhs b/src/moto-rev.lhs
deleted file mode 100644
--- a/src/moto-rev.lhs
+++ /dev/null
@@ -1,12 +0,0 @@
-moto rev (jmcc)
-
-> import Sound.SC3
-
-> main =
->   let { f = sinOsc kr 0.2 0 * 10 + 21
->       ; s = lfPulse ar f (mce2 0 0.1) 0.1 }
->   in audition (out 0 (clip2 (rlpf s 100 0.1) 0.4))
-
-{ 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
diff --git a/src/moto-rev.scd b/src/moto-rev.scd
new file mode 100644
--- /dev/null
+++ b/src/moto-rev.scd
@@ -0,0 +1,3 @@
+{ 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
diff --git a/src/mouse-clatter-m.hs b/src/mouse-clatter-m.hs
new file mode 100644
--- /dev/null
+++ b/src/mouse-clatter-m.hs
@@ -0,0 +1,32 @@
+-- mouse clatter (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3.Monadic
+
+mouse_clatter :: UId m => m UGen
+mouse_clatter = do
+  let x = mouseX' KR 100 12000 Linear 0.1
+      y = mouseY' KR 0.01 0.15 Linear 0.1
+  n1 <- lfNoise0 KR (mce [3,3.25])
+  let t = impulse KR (n1 * 16 + 18) 0
+  n2 <- tRand 0.005 y t
+  n3 <- whiteNoise AR
+  n4 <- tRand 10 x t
+  n5 <- tRand 0 1 t
+  n6 <- tExpRand 0.15 1 t
+  o <- let e = decay2 t 0.01 n2
+       in return (bpf (n3 * e) n4 n5)
+  n7 <- pv_RandComb (fft' 10 o) n6 t
+  return (o * 0.05 + ifft' n7)
+
+run :: Transport t => t -> IO ()
+run fd = do
+  _ <- async fd (b_alloc 10 2048 1)
+  play fd . out 0 =<< mouse_clatter
+
+main :: IO ()
+main = withSC3 run
+
+{-
+s.sendMsg('b_alloc', 10, 2048, 1);
+-}
diff --git a/src/mouse-clatter.lhs b/src/mouse-clatter.lhs
deleted file mode 100644
--- a/src/mouse-clatter.lhs
+++ /dev/null
@@ -1,55 +0,0 @@
-mouse clatter (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { x = mouseX kr 100 12000 Linear 0.1
->       ; y = mouseY kr 0.01 0.15 Linear 0.1 }
->   in do { n1 <- lfNoise0 kr (mce [3, 3.25])
->         ; let { t = impulse kr (n1 * 16 + 18) 0
->               ; s = do { 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) } }
->           in withSC3 (\fd -> do { async fd (b_alloc 10 2048 1)
->                                 ; play fd . out 0 =<< s }) }
-
-s.sendMsg('b_alloc', 10, 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 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
-
-(let* ((x (MouseX kr 100 12000 0 0.1))
-       (y (MouseY kr 0.01 0.15 0 0.1))
-       (n1 (LFNoise0 kr (mce2 3 3.25)))
-       (t (Impulse kr (MulAdd n1 16 18) 0))
-       (n2 (TRand 0.005 y t))
-       (n3 (WhiteNoise ar))
-       (n4 (TRand 10 x t))
-       (n5 (TRand 0.0 1.0 t))
-       (n6 (TExpRand 0.15 1.0 t))
-       (e (Decay2 t 0.01 n2))
-       (o (BPF (Mul n3 e) n4 n5))
-       (n7 (PV_RandComb (FFT* 10 o) n6 t))
-       (s (Add (Mul o 0.05) (IFFT* n7))))
-  (with-sc3
-   (lambda (fd)
-     (async fd (/b_alloc 10 2048 1))
-     (play fd (Out 0 s)))))
diff --git a/src/mouse-clatter.scd b/src/mouse-clatter.scd
new file mode 100644
--- /dev/null
+++ b/src/mouse-clatter.scd
@@ -0,0 +1,14 @@
+{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 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
diff --git a/src/mouse-clatter.scm b/src/mouse-clatter.scm
new file mode 100644
--- /dev/null
+++ b/src/mouse-clatter.scm
@@ -0,0 +1,17 @@
+(let* ((x (MouseX KR 100 12000 0 0.1))
+       (y (MouseY KR 0.01 0.15 0 0.1))
+       (n1 (LFNoise0 KR (mce2 3 3.25)))
+       (t (Impulse KR (MulAdd n1 16 18) 0))
+       (n2 (TRand 0.005 y t))
+       (n3 (WhiteNoise AR))
+       (n4 (TRand 10 x t))
+       (n5 (TRand 0.0 1.0 t))
+       (n6 (TExpRand 0.15 1.0 t))
+       (e (Decay2 t 0.01 n2))
+       (o (BPF (Mul n3 e) n4 n5))
+       (n7 (PV_RandComb (FFT* 10 o) n6 t))
+       (s (Add (Mul o 0.05) (IFFT* n7))))
+  (with-sc3
+   (lambda (fd)
+     (async fd (/b_alloc 10 2048 1))
+     (play fd (Out 0 s)))))
diff --git a/src/mridangam.hs b/src/mridangam.hs
new file mode 100644
--- /dev/null
+++ b/src/mridangam.hs
@@ -0,0 +1,60 @@
+-- mridangam (jmcc)
+
+import Sound.OpenSoundControl {- hosc -}
+import Sound.SC3.ID {- hsc3 -}
+import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+
+spe3_mridangam :: Synthdef
+spe3_mridangam =
+    let t_amp = tr_control "t_amp" 1
+        n = whiteNoise 'a' AR * 70
+        e = decay2 t_amp 0.002 0.1
+	o = distort (resonz (n * e) (midiCPS 60) 0.02 * 4) * 0.4
+    in synthdef "mridangam" (out 0 o)
+
+spe3_drone :: Synthdef
+spe3_drone =
+    let s1 = saw AR (midiCPS (mce2 60 60.04))
+        s2 = saw AR (midiCPS (mce2 67 67.04))
+        o = lpf (s1 + s2) (midiCPS 108)	* 0.007
+    in synthdef "drone" (out 0 o)
+
+p :: [P Double]
+p =
+    [pseq [0.0] 10
+    -- intro
+    ,pseq [0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] 2
+    ,pseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.0] 2
+    ,pseq [0.9,0.0,0.0,0.2,0.0,0.2,0.0,0.2,0.0,0.0] 2
+    ,pseq [0.9,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.2] 2
+    -- solo
+    ,prand 'a' [pseq [0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0] 1
+               ,pseq [0.9,0.2,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.0] 1
+	       ,pseq [0.9,0.0,0.0,0.7,0.0,0.2,0.0,0.7,0.0,0.2] 1
+	       ,pseq [0.9,0.0,0.0,0.7,0.2,0.2,0.0,0.7,0.0,0.0] 1
+	       ,pseq [0.9,0.0,0.0,0.7,0.0,0.2,0.2,0.7,0.2,0.0] 1
+	       ,pseq [0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.2,0.2] 1
+	       ,pseq [0.9,0.2,0.2,0.7,0.2,0.2,0.2,0.7,0.0,0.0] 1
+	       ,pseq [0.9,0.0,0.0,0.7,0.2,0.2,0.2,0.7,0.0,0.0] 1
+	       ,pseq [0.9,0.0,0.4,0.0,0.4,0.0,0.4,0.0,0.4,0.0] 1
+	       ,pseq [0.9,0.0,0.0,0.4,0.0,0.0,0.4,0.2,0.4,0.2] 1
+	       ,pseq [0.9,0.0,0.2,0.7,0.0,0.2,0.0,0.7,0.0,0.0] 1
+	       ,pseq [0.9,0.0,0.0,0.7,0.0,0.0,0.0,0.7,0.0,0.0] 1
+	       ,pseq [0.9,0.7,0.7,0.0,0.0,0.2,0.2,0.2,0.0,0.0] 1
+	       ,pseq [0.9,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] 1] 30
+    -- tehai
+    ,pseq [2.0,0.0,0.2,0.5,0.0,0.2,0.9
+	  ,1.5,0.0,0.2,0.5,0.0,0.2,0.9
+	  ,1.5,0.0,0.2,0.5,0.0,0.2] 3
+    -- sam
+    ,pseq [5] 1]
+
+act :: Transport t => t -> IO ()
+act fd = do
+  play fd spe3_drone
+  _ <- async fd (d_recv spe3_mridangam)
+  let p' = pmono_d spe3_mridangam 100 [("t_amp",pseq p 1),("dur",1/8)]
+  play fd p'
+
+main :: IO ()
+main = withSC3 act
diff --git a/src/nharm-p.hs b/src/nharm-p.hs
new file mode 100644
--- /dev/null
+++ b/src/nharm-p.hs
@@ -0,0 +1,37 @@
+-- nharm-p (rd)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.Event
+import Sound.SC3.Lang.Pattern.ID
+
+nharm :: Num n => Int -> n -> [n]
+nharm n f = map ((* f) . fromIntegral) [1..n]
+
+klg :: Int -> UGen
+klg n =
+    let f = control KR "freq" 440
+        d = rand 'a' 9 12
+        l = uclone' 'a' n (rand 'a' 0.01 0.02)
+        p = rand 'a' (-1.0) 1.0
+        a = 0.5
+        e = envGen KR 1 0.9 0 1 RemoveSynth (envSine d a)
+        nh = nharm n f
+        s = klangSpec nh l (replicate n 0.0)
+    in out 0 (pan2 (klang AR 1 0 s) p e)
+
+type Range = (Double,Double)
+
+{- Note that the dur key is used only to schedule the nodes. Both it
+and the gate message are ignored by the UGen graph, which manages
+duration internally.  -}
+
+pN :: Int -> Range -> Range -> P Event
+pN n (m0,m1) (d0,d1) =
+    let i = synthdef ("klg" ++ show n) (klg n)
+        p = pbind [("midinote",pwhite 'a' m0 m1 inf)
+                  ,("dur",pwhite 'b' d0 d1 inf)]
+    in pinstr_d (return i) p
+
+main :: IO ()
+main = audition (pmerge (pN 24 (90,92) (0.25,0.75))
+                        (pN 54 (12,14) (1.25,1.76)))
diff --git a/src/nharm.hs b/src/nharm.hs
new file mode 100644
--- /dev/null
+++ b/src/nharm.hs
@@ -0,0 +1,38 @@
+--nharm (rd)
+
+import Control.Concurrent
+import Control.Monad
+import Sound.OpenSoundControl
+import Sound.SC3.Monadic
+import System.Random
+
+rrand :: Random a => a -> a -> IO a
+rrand l r = getStdRandom (randomR (l,r))
+
+nharm :: (Num b, Integral a) => a -> b -> [b]
+nharm n f = map ((* f) . fromIntegral) [1..n]
+
+klg :: UGen -> Int -> IO UGen
+klg m u = do
+    n <- rrand 4 u
+    d <- iRand 9 12
+    f <- iRand m (m + 2)
+    l <- sequence (replicate n (rand 0.01 0.02))
+    p <- rand (-1.0) 1.0
+    let a = 0.5
+        e = envGen KR 1 0.9 0 1 RemoveSynth (envSine d a)
+        nh = nharm n (midiCPS f)
+        s = klangSpec nh l (replicate n 0.0)
+    return (pan2 (klang AR 1 0 s) p e)
+
+ply :: Int -> (Double,Double) -> UGen -> Int -> IO ()
+ply n (l,r) m u = do
+  let a = do pauseThread =<< rrand l r
+             audition . out 0 =<< klg m u
+  replicateM_ n a
+
+main :: IO ()
+main = do
+  _ <- forkIO (ply 32 (0.25,0.75) 92 24)
+  _ <- forkIO (ply 8 (1.25,1.75) 12 54)
+  return ()
diff --git a/src/nharm.lhs b/src/nharm.lhs
deleted file mode 100644
--- a/src/nharm.lhs
+++ /dev/null
@@ -1,26 +0,0 @@
-nharm (rd)
-
-> import Control.Concurrent
-> import Control.Monad
-> import Sound.SC3.Monadic
-> import System.Random
-
-> main =
->   let { nharm n f = map ((* f) . fromIntegral) [1..n]
->       ; rrand l r = getStdRandom (randomR (l, r))
->       ; threadPause n = when (n>0) (threadDelay (floor (n * 1e6)))
->       ; klg m u = do { n <- rrand 4 u
->                      ; d <- rrand 9 12
->                      ; f <- rrand m (m + 2)
->                      ; l <- sequence (replicate n (rrand 0.01 0.02))
->                      ; p <- rrand (-1.0) 1.0
->                      ; let { a = 0.5
->                            ; e = envGen kr 1 0.9 0 1 RemoveSynth (envSine d a)
->                            ; nh = nharm n (midiCPS f)
->                            ; s = klangSpec nh l (replicate n 0.0) }
->                        in return (pan2 (klang ar 1 0 s) p e) }
->       ; ply :: Int -> (Double, Double) -> UGen -> Int -> IO ()
->       ; ply n (l,r) m u = replicateM_ n (do { threadPause =<< rrand l r
->                                             ; audition . out 0 =<< klg m u }) }
->   in do { forkIO (ply 32 (0.25, 0.75) 92 24)
->         ; forkIO (ply 8 (1.25, 1.75) 12 54) }
diff --git a/src/noise-burst-sweep.hs b/src/noise-burst-sweep.hs
new file mode 100644
--- /dev/null
+++ b/src/noise-burst-sweep.hs
@@ -0,0 +1,20 @@
+-- noise burst sweep (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+nbs :: UGen
+nbs =
+  let n = udup 2 (whiteNoise 'a' AR)
+      lfoRate = mouseX' KR 10 60 Exponential 0.2
+      amp = max 0 (lfSaw KR lfoRate (-1))
+      cfreq = mouseY' KR 400 8000 Exponential 0.2
+      freq = sinOsc KR 0.2 0 * cfreq + (1.05 * cfreq)
+  in resonz (n * amp) freq 0.1
+
+main :: IO ()
+main = overlapTextureU (2,4,4,maxBound) nbs
+
+{-
+audition (out 0 nbs)
+-}
diff --git a/src/noise-burst-sweep.lhs b/src/noise-burst-sweep.lhs
deleted file mode 100644
--- a/src/noise-burst-sweep.lhs
+++ /dev/null
@@ -1,18 +0,0 @@
-noise burst sweep (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { n <- clone 2 (whiteNoise ar)
->      ; let { lfoRate = mouseX kr 10 60 Exponential 0.2
->            ; amp = max 0 (lfSaw kr lfoRate (-1))
->            ; cfreq = mouseY kr 400 8000 Exponential 0.2
->            ; freq = sinOsc kr 0.2 0 * cfreq + (1.05 * cfreq) }
->        in audition (out 0 (resonz (n * amp) freq 0.1)) }
-
-{ 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
diff --git a/src/noise-burst-sweep.scd b/src/noise-burst-sweep.scd
new file mode 100644
--- /dev/null
+++ b/src/noise-burst-sweep.scd
@@ -0,0 +1,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
diff --git a/src/noise-modulated-sines.hs b/src/noise-modulated-sines.hs
new file mode 100644
--- /dev/null
+++ b/src/noise-modulated-sines.hs
@@ -0,0 +1,17 @@
+-- noise modulated sines (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+nms :: UGen
+nms =
+    let f = midiCPS (rand 'a' 60 100)
+        o = fSinOsc AR (mce2 f (f + 0.2)) 0
+        a = lfNoise2 'b' 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/src/non-real-time.hs b/src/non-real-time.hs
--- a/src/non-real-time.hs
+++ b/src/non-real-time.hs
@@ -12,27 +12,24 @@
 
 score :: [OSC]
 score =
-    let at t m = Bundle (NTPr t) m
+    let at t = Bundle (NTPr t)
         mk_instr = d_recv (synthdef "test" graph)
         mk_group = g_new [(1, AddToTail, 0)]
         mk_node t f = at t [s_new "test" (-1) AddToTail 1 [("freq", f)]]
         notes = take 128 (zipWith mk_node [1.0, 1.05 ..] [330, 350 ..])
     in at 0.0 [mk_instr, mk_group] : notes
 
-perform :: [OSC] -> IO ()
-perform s = do
-  let f i fd x = do let (Bundle (NTPr t) x') = x
-                    pauseThreadUntil (i + t)
-                    send fd (Bundle immediately x')
-  withSC3 (\fd -> utcr >>= \i -> mapM_ (f i fd) s)
-
 render :: [OSC] -> IO ()
 render s = do
   writeNRT "/tmp/nrt.score" s
-  system "scsynth -N /tmp/nrt.score _ /tmp/nrt.wav 44100 WAVE float"
+  _ <- system "scsynth -N /tmp/nrt.score _ /tmp/nrt.wav 44100 WAVE float"
   return ()
 
 main :: IO ()
 main = do
   render score
   perform score
+
+{-
+perform score
+-}
diff --git a/src/nv-tw-1.hs b/src/nv-tw-1.hs
new file mode 100644
--- /dev/null
+++ b/src/nv-tw-1.hs
@@ -0,0 +1,16 @@
+-- nv-tw-1 (nv)
+-- http://sccode.org/1-V
+
+import Sound.SC3.ID
+
+nv_tw_1 :: UGen
+nv_tw_1 =
+    let a = udup 2 (pinkNoise 'a' AR)
+        nd z =
+            let n = lfNoise1 'a' KR (rand 'a' 0 0.05)
+                f = linExp n (-1) 1 40 15000
+            in bBandStop z f (expRand 'a' 0.1 2)
+    in lpf (useq 'a' 50 nd a) 1e5
+
+main :: IO ()
+main = audition (out 0 nv_tw_1)
diff --git a/src/nv-tw-1.scd b/src/nv-tw-1.scd
new file mode 100644
--- /dev/null
+++ b/src/nv-tw-1.scd
@@ -0,0 +1,6 @@
+{a=PinkNoise.ar(1!2)
+;50.do{
+    f=LFNoise1.kr(0.05.rand).exprange(40,15000)
+   ;a=BBandStop.ar(a,f,exprand(0.1,2))}
+;LPF.ar(a,1e5)
+}.play
diff --git a/src/nv-tw-41.hs b/src/nv-tw-41.hs
new file mode 100644
--- /dev/null
+++ b/src/nv-tw-41.hs
@@ -0,0 +1,17 @@
+-- nv-tw-41 (nv)
+-- http://sccode.org/1-V
+
+import Sound.SC3.ID
+
+nv_tw_41 :: UGen
+nv_tw_41 =
+    let nd i =
+            let t = (0.6 ** i) * 40 * impulse AR ((2 ** i) / 32) (1/2)
+                f = (4 ** lfNoise0 i KR (1/16)) * 300
+            in sin (rlpf t f 5e-3)
+        x = splay (mce (map nd [0..7])) 1 1 0 True
+        r u = let (p,q) = mce2c u in freeVerb2 p q 0.1 1 1
+    in r (r x)
+
+main :: IO ()
+main = audition (out 0 nv_tw_41)
diff --git a/src/nv-tw-41.scd b/src/nv-tw-41.scd
new file mode 100644
--- /dev/null
+++ b/src/nv-tw-41.scd
@@ -0,0 +1,7 @@
+play{
+x=Splay.ar({|i|
+t=0.6**i*40*Impulse.ar(2**i/32,1/2);
+f=4**LFNoise0.kr(1/16)*300;
+RLPF.ar(t,f,5e-3).sin}!8);
+2.do{x=FreeVerb2.ar(*x++[0.1,1,1])};
+x}
diff --git a/src/nv-tw-54.hs b/src/nv-tw-54.hs
new file mode 100644
--- /dev/null
+++ b/src/nv-tw-54.hs
@@ -0,0 +1,29 @@
+-- nv-tw-54 (nv)
+-- http://sccode.org/1-V
+
+import Sound.SC3
+import Sound.SC3.Lang.Pattern.ID
+
+fF :: Double -> Double -> Double
+fF i f =
+    let n = (((2 * i) `modE` 6 + 1) + ffloor f) / (i `modE` 5 + 1)
+    in (f + log2 n) `modE` 2
+
+fS :: [Double]
+fS =
+    let lp i f = let f' = fF i f in f' : lp (i + 1) f'
+    in lp 0 0
+
+nvi :: Synthdef
+nvi =
+    let i = control KR "i" 0
+        f = control KR "f" 0
+        p = (i `modE` 8 + 2) * 52
+        e = line KR 0.1 0 1 RemoveSynth
+        o = syncSaw AR ((2 ** f) * 99 + mce2 0 1) p * e
+    in synthdef "nvi" (out 0 o)
+
+main :: IO ()
+main = audition (nvi,pbind [("f",fromList fS)
+                           ,("i",pseries 0 1 inf)
+                           ,("dur",0.3)])
diff --git a/src/nv-tw-54.scd b/src/nv-tw-54.scd
new file mode 100644
--- /dev/null
+++ b/src/nv-tw-54.scd
@@ -0,0 +1,7 @@
+f=0;
+{inf.do{|i|
+n=((((2*i)%6)+1)+floor(f))/((i%5)+1);
+f=(f+log2(n))%2;
+e=Line.kr(0.1,0,1,1,0,2);
+play{SyncSaw.ar(2**f*99+[0,1],i%8+2*52)*e};
+0.3.wait}}.r.play
diff --git a/src/one-line.hs b/src/one-line.hs
new file mode 100644
--- /dev/null
+++ b/src/one-line.hs
@@ -0,0 +1,14 @@
+-- one-line (lance putnam)
+
+import Sound.SC3
+
+one_line :: UGen
+one_line =
+  let lfs = lfSaw AR (mce2 1 0.99) (mce2 0 0.6) * 2000 + 2000
+      lfs_t = trunc lfs (mce2 400 600) * mce2 1 (-1)
+      f = onePole (mix lfs_t) 0.98
+  in pan2 (sinOsc AR f 0) 0 0.1
+
+main :: IO ()
+main = audition (out 0 one_line)
+
diff --git a/src/one-line.lhs b/src/one-line.lhs
deleted file mode 100644
--- a/src/one-line.lhs
+++ /dev/null
@@ -1,14 +0,0 @@
-one-line (lance putnam)
-
-> import Sound.SC3
-
-> main =
->   let { lfs = lfSaw ar (mce2 1 0.99) (mce2 0 0.6) * 2000 + 2000
->       ; lfs_t = trunc lfs (mce2 400 600) * mce2 1 (-1)
->       ; f = onePole (mix lfs_t) 0.98 }
->   in audition (out 0 (pan2 (sinOsc ar f 0) 0 0.1))
-
-{ 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
diff --git a/src/one-line.scd b/src/one-line.scd
new file mode 100644
--- /dev/null
+++ b/src/one-line.scd
@@ -0,0 +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
diff --git a/src/oscillator-cluster.hs b/src/oscillator-cluster.hs
new file mode 100644
--- /dev/null
+++ b/src/oscillator-cluster.hs
@@ -0,0 +1,34 @@
+-- oscillator cluster (rd)
+
+import Sound.SC3.Lang.Pattern.ID
+import Sound.SC3.Monadic
+
+oscillator_cluster :: (Functor m,UId m) => m UGen
+oscillator_cluster = do
+  let ln a b d = line KR a b d RemoveSynth
+      rln r a b d = fmap (\n -> ln (a + n) b d) (rand 0 r)
+      prt d a cf = do r1 <- rand cf (cf + 2)
+                      r2 <- rln 1 5 0.01 d
+                      r3 <- rln 10 20 0 d
+                      r4 <- rand 0.1 0.2
+                      let f = mce2 cf r1 + sinOsc KR r2 0 * r3
+                          o = fSinOsc AR f 0
+                          e = decay2 (impulse AR 0 0) r4 d * a
+                      return (o * e)
+      np = 12
+      fp = sequence (replicate np (rand 220 660))
+  d <- rand 4 7
+  a <- rand 0.01 0.05
+  return.sum =<< mapM (prt d a) =<< fp
+
+main :: IO ()
+main = do
+  u <- oscillator_cluster
+  let s = synthdef "oscillator_cluster" (out 0 u)
+  audition (s,pbind [("dur",prand 'a' [0.25,0.5,1,3,5] inf)])
+
+{-
+audition . (out 0) =<< oscillator_cluster
+let otu = Sound.SC3.Lang.Control.OverlapTexture.overlapTextureU
+otu (0,6,3,maxBound) =<< oscillator_cluster
+-}
diff --git a/src/oscillator-cluster.lhs b/src/oscillator-cluster.lhs
deleted file mode 100644
--- a/src/oscillator-cluster.lhs
+++ /dev/null
@@ -1,46 +0,0 @@
-oscillator cluster (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { ln a b d = line kr a b d RemoveSynth
->       ; rln r a b d = fmap (\n -> ln (a + n) b d) (rand 0 r)
->       ; prt d a cf = do { r1 <- rand cf (cf + 2)
->                         ; r2 <- rln 1 5 0.01 d
->                         ; r3 <- rln 10 20 0 d
->                         ; r4 <- rand 0.1 0.2
->                         ; let { f = mce2 cf r1 + sinOsc kr r2 0 * r3
->                               ; o = fSinOsc ar f 0
->                               ; e = decay2 (impulse ar 0 0) r4 d * a }
->                          in return (o * e) }
->       ; np = 12
->       ; fp = sequence (replicate np (rand 220 660)) }
->   in do { d <- rand 4 7
->         ; a <- rand 0.01 0.05
->         ; audition . (out 0) . sum =<< mapM (prt d a) =<< fp }
-
-{ 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 rxln = { arg r, a, b, d
-             ; var n = Rand.new(0, r)
-             ; xln.value(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 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
diff --git a/src/oscillator-cluster.scd b/src/oscillator-cluster.scd
new file mode 100644
--- /dev/null
+++ b/src/oscillator-cluster.scd
@@ -0,0 +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 rxln = {arg r,a,b,d
+            ;var n = Rand.new(0,r)
+            ;xln.value(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 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
diff --git a/src/overlap-add.hs b/src/overlap-add.hs
new file mode 100644
--- /dev/null
+++ b/src/overlap-add.hs
@@ -0,0 +1,22 @@
+-- overlap-add (jmcc, rd)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.Lang.Pattern.ID
+
+sine :: UGen
+sine =
+    let r0 = expRand 'a' 500 1400
+        r1 = rand 'b' (-1) 1
+    in pan2 (sinOsc AR r0 0) r1 0.01
+
+noise :: UGen
+noise =
+    let n0 = whiteNoise 'a' AR
+        r0 = expRand 'b' 800 8400
+        r1 = rand 'c' (-1) 1
+    in pan2 (resonz (n0 * 0.1) r0 0.05) r1 0.25
+
+main :: IO ()
+main = audition (ppar [overlapTextureU' (4,4,6,maxBound) sine
+                      ,overlapTextureU' (4,4,6,maxBound) noise])
diff --git a/src/overlap-add.lhs b/src/overlap-add.lhs
deleted file mode 100644
--- a/src/overlap-add.lhs
+++ /dev/null
@@ -1,41 +0,0 @@
-overlap-add (jmcc, rd)
-
-> import Control.Concurrent
-> import Sound.OpenSoundControl
-> import Sound.SC3.Monadic
-
-> main =
->   let { at t f 
->         = let at' t' f' = do { n <- f' t'
->                              ; pauseThreadUntil (t' + n)
->                              ; at' (t' + n) f' }
->           in do { pauseThreadUntil t
->                 ; at' t f
->                 ; return () }
->       ; mk_env a s 
->         = let { c = EnvNum 4
->               ; p = envLinen' a s a 1 (c, c, c) }
->           in envGen KR 1 1 0 1 RemoveSynth p
->       ; with_env g a s 
->         = out 0 (g * (mk_env a s))
->       ; overlap_add fd n o a s g 
->         = do { t <- utcr
->              ; let { g' = with_env g (constant a) (constant s)
->                    ; dt = (a + s + a) / o 
->                    ; f _ = do { send fd (s_new n (-1) AddToTail 1 [])
->                               ; return dt } }
->                in do { async fd (d_recv (synthdef n g'))
->                      ; at t f } }
->       ; oSine fd 
->         = do { r0 <- expRand 500 1400
->              ; r1 <- rand (-1) 1
->              ; let g = pan2 (sinOsc AR r0 0) r1 0.01
->                in overlap_add fd "random-sines" 4 2 4 g }
->       ; oNoise fd 
->         = do { n0 <- whiteNoise AR
->              ; r0 <- expRand 800 8400
->              ; r1 <- rand (-1) 1
->              ; let g = pan2 (resonz (n0 * 0.1) r0 0.05) r1 0.25
->                in overlap_add fd "random-noise" 4 2 4 g } }
->   in do { forkIO (withSC3 (\fd -> oSine fd))
->         ; forkIO (withSC3 (\fd -> oNoise fd)) }
diff --git a/src/pattern-buffer.hs b/src/pattern-buffer.hs
new file mode 100644
--- /dev/null
+++ b/src/pattern-buffer.hs
@@ -0,0 +1,59 @@
+-- pattern buffer (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3.Monadic
+import System.Random
+
+tseq :: [UGen] -> UGen
+tseq l =
+    let n = fromIntegral (length l) / 2.0
+    in select (lfSaw KR 0.5 0 * n + n) (mce l)
+
+rrand :: Random a => a -> a -> IO a
+rrand l r = getStdRandom (randomR (l, r))
+
+pattern_buffer :: Int -> IO UGen
+pattern_buffer c = do
+  let p = phasor AR 0 (bufRateScale KR 10) 0 (bufFrames KR 10) 0
+      t = bufRdC 1 AR 10 p Loop
+  r1 <- sequence (replicate c (rrand 36 96))
+  r2 <- sequence (replicate c (rrand (-1.0) 1.0))
+  r3 <- rrand 0 1
+  n1 <- tRand 0.02 0.08 t
+  let e = decay2 t 0.01 n1
+      f = midiCPS (tseq r1)
+      l = tseq r2
+      o = [sinOsc AR f 0, saw AR f] !! r3
+  return (pan2 o l e)
+
+set_pattern :: Transport t => Int -> Int -> t -> IO ()
+set_pattern nf c fd = do
+  let rs = do r0 <- rrand 0 nf
+              r1 <- rrand 0.0 1.0
+              send fd (b_set1 10 r0 r1)
+  sequence_ (replicate c rs)
+
+fill_clr :: (Transport t) => Int -> Int -> Double -> Int -> t -> IO b
+fill_clr nf c dt n fd = do
+  let go i = if i == 0
+             then do print "clr"
+                     send fd (b_zero 10)
+                     go n
+             else do set_pattern nf c fd
+                     print ("fill",i)
+                     pauseThread dt
+                     go (i - 1)
+  go n
+
+run :: Transport t => t -> IO ()
+run fd = do
+  let nf = 2 * 48000
+      c = 24
+      n = 16
+      dt = 2.6
+  _ <- async fd (b_alloc 10 (nf * 2) 1)
+  play fd . out 0 =<< pattern_buffer c
+  fill_clr nf c dt n fd
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/pattern-buffer.lhs b/src/pattern-buffer.lhs
deleted file mode 100644
--- a/src/pattern-buffer.lhs
+++ /dev/null
@@ -1,27 +0,0 @@
-pattern buffer (rd)
-
-> import Sound.SC3.Monadic
-> import System.Random
-
-> main =
->   let { nf = 2 * 48000
->       ; c = 24
->       ; tseq l = let n = fromIntegral (length l) / 2.0
->                  in select (lfSaw kr 0.5 0 * n + n) (mce l)
->       ; rrand l r = getStdRandom (randomR (l, r))
->       ; p = phasor ar 0 (bufRateScale kr 10) 0 (bufFrames kr 10) 0
->       ; t = bufRdC 1 ar 10 p Loop 
->       ; rs h = do { r0 <- rrand 0 nf
->                   ; r1 <- rrand 0.0 1.0
->                   ; send h (b_set1 10 r0 r1) } }
->   in do { r1 <- sequence (replicate c (rrand 36 96))
->         ; r2 <- sequence (replicate c (rrand (-1.0) 1.0))
->         ; r3 <- rrand 0 1
->         ; n1 <- tRand 0.02 0.08 t
->         ; let { e = decay2 t 0.01 n1
->               ; f = midiCPS (tseq r1)
->               ; l = tseq r2
->               ; o = [sinOsc ar f 0, saw ar f] !! r3 }
->           in withSC3 (\fd -> do { async fd (b_alloc 10 (nf * 2) 1)
->                                 ; sequence (replicate c (rs fd))
->                                 ; play fd (out 0 (pan2 o l e)) }) }
diff --git a/src/pebble-beach.hs b/src/pebble-beach.hs
new file mode 100644
--- /dev/null
+++ b/src/pebble-beach.hs
@@ -0,0 +1,41 @@
+-- pebble beach (np)
+-- http://sccode.org/1-u
+-- requires 'scsynth -u 57110 -m 32768'
+
+import Sound.SC3.ID
+
+exprange :: UGen -> UGen -> UGen -> UGen
+exprange l r i = linExp i (-1) 1 l r
+
+bg_f :: UGen -> UGen
+bg_f k =
+    let sc = 0.4 + (k * 0.07)
+        fr = range 3100 4900 (lag (lfNoise0 'a' KR 21.8) 0.7) * sc
+        am = range 0 1 (lag (lfNoise1 'a' KR 5.227) 5.374)
+    in bpf (pinkNoise 'a' AR * 0.4) fr 0.1 * am
+
+fg_f :: UGen -> UGen -> UGen
+fg_f df tf =
+    let d = dust 'a' AR (df * rand 'a' 0.8 1.2) * 50
+	l = exprange 800 900 (sinOsc KR 2.2 0)
+	r = exprange 2600 2900 (sinOsc KR 5.228 0)
+	z = resonz d (tRand 'a' l r d) (tRand 'a' 0.03 0.08 d)
+        t = lagUD (range 2 0.5 (saw KR tf)) 0.6 2.8
+        o = z * t
+    in o + combL o 0.8 (rand 'a' 0.2 0.8) (iChoose 'a' (mce2 (-4) 4))
+
+pebble_beach' :: ID a => a -> UGen
+pebble_beach' j =
+    let bg' = let am = range 0 1 (lag (lfNoise0 'a' KR 34) 1.4)
+              in brownNoise 'a' AR * 0.06 * am
+        bg = bg' + sum (uprotect' j (map bg_f [0..19])) * 0.6
+        tf = range 0.122 0.24 (sinOsc KR 0.17 0)
+        df = exprange 1 700 (lfTri KR tf 0) * exprange 1 0.2 (lfTri KR tf 0)
+        fg = mix (uclone j 50 (fg_f df tf)) * 0.2
+    in (bg + fg) * line KR 0 1 1.2 DoNothing
+
+pebble_beach :: UGen
+pebble_beach = mce2 (pebble_beach' 'a') (pebble_beach' 'b')
+
+main :: IO ()
+main = audition (out 0 pebble_beach)
diff --git a/src/plucked-strings.hs b/src/plucked-strings.hs
new file mode 100644
--- /dev/null
+++ b/src/plucked-strings.hs
@@ -0,0 +1,27 @@
+-- plucked strings (jmcc)
+
+import Sound.SC3.Monadic
+
+plucked_strings :: UId m => m UGen
+plucked_strings = do
+  let dt = do r0 <- rand 60 90
+              return (1 / midiCPS (floorE r0))
+      i = do r0 <- rand 2 2.2
+             n0 <- dust AR 0.5
+             r1 <- rand 0.05 0.15
+             r2 <- rand 0 (pi * 2)
+             r3 <- iRand 0 2
+             let s0 = impulse AR r0 0.3
+                 s1 = n0 * 0.3
+                 s2 = impulse AR (sinOsc KR r1 r2 * 5 + 5.2) 0.3
+             return (select r3 (mce [s0,s1,s2]))
+      s = do n0 <- pinkNoise AR
+             r1 <- rand (-1) 1
+             im <- i
+             dt' <- dt
+             let t = decay im 0.1 * n0 * 0.1
+             return (pan2 (combL t dt' dt' 4) r1 1)
+  return.sum =<< sequence (replicate 5 s)
+
+main :: IO ()
+main = audition . out 0 =<< plucked_strings
diff --git a/src/plucked-strings.lhs b/src/plucked-strings.lhs
deleted file mode 100644
--- a/src/plucked-strings.lhs
+++ /dev/null
@@ -1,23 +0,0 @@
-plucked strings (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { s = do { n0 <- pinkNoise ar
->                ; r1 <- rand (-1) 1
->                ; im <- i
->                ; dt' <- dt
->                ; let t = decay im 0.1 * n0 * 0.1
->                  in return (pan2 (combL t dt' dt' 4) r1 1) }
->       ; i = do { r0 <- rand 2 2.2
->                ; n0 <- dust ar 0.5
->                ; r1 <- rand 0.05 0.15
->                ; r2 <- rand 0 (pi * 2)
->                ; r3 <- iRand 0 2
->                ; let { s0 = impulse ar r0 0.3
->                      ; s1 = n0 * 0.3
->                      ; s2 = impulse ar (sinOsc kr r1 r2 * 5 + 5.2) 0.3 }
->                  in return (select r3 (mce [s0, s1, s2])) }
->       ; dt = do { r0 <- rand 60 90
->                 ; return (1 / (midiCPS (floorE r0))) } }
->   in audition . out 0 . sum =<< sequence (replicate 5 s)
diff --git a/src/police-state.hs b/src/police-state.hs
new file mode 100644
--- /dev/null
+++ b/src/police-state.hs
@@ -0,0 +1,24 @@
+-- police state (jmcc)
+
+import Sound.SC3.Monadic
+
+police_state :: UId m => m UGen
+police_state = do
+  let nd = do r0 <- rand 0.02 0.12
+              r1 <- rand 0 (pi*2)
+              r2 <- rand 0 600
+              r3 <- rand 700 1300
+              r4 <- rand (-1) 1
+              r5 <- rand 80 120
+              n0 <- lfNoise2 AR r5
+              let f = sinOsc KR r0 r1 * r2 + r3
+              return (pan2 (sinOsc AR f 0 * n0 * 0.1) r4 1)
+  ns <- clone 4 nd
+  n0 <- clone 2 (lfNoise2 KR 0.4)
+  n1 <- lfNoise2 AR (n0 * 90 + 620)
+  n2 <- lfNoise2 KR (mce2 0.3 0.301)
+  let e = n1 * (n2 * 0.15 + 0.18)
+  return (combL (mix ns + e) 0.3 0.3 3)
+
+main :: IO ()
+main = audition . out 0 =<< police_state
diff --git a/src/police-state.lhs b/src/police-state.lhs
deleted file mode 100644
--- a/src/police-state.lhs
+++ /dev/null
@@ -1,35 +0,0 @@
-police state (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let node = do { r0 <- rand 0.02 0.12
->                 ; r1 <- rand 0 (pi*2)
->                 ; r2 <- rand 0 600
->                 ; r3 <- rand 700 1300
->                 ; r4 <- rand (-1) 1
->                 ; r5 <- rand 80 120
->                 ; n0 <- lfNoise2 ar r5
->                 ; let f = sinOsc kr r0 r1 * r2 + r3
->                   in return (pan2 (sinOsc ar f 0 * n0 * 0.1) r4 1) }
->   in do { nodes <- clone 4 node
->         ; n0 <- clone 2 (lfNoise2 kr 0.4)
->         ; n1 <- lfNoise2 ar (n0 * 90 + 620)
->         ; n2 <- lfNoise2 kr (mce2 0.3 0.301)
->         ; let e = n1 * (n2 * 0.15 + 0.18)
->           in audition (out 0 (combL (mix nodes + e) 0.3 0.3 3)) }
-
-{ 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)
-             ; var n0 = LFNoise2.ar(r5)
-             ; var f = SinOsc.kr(r0, r1, r2, r3)
-             ; Pan2.ar(SinOsc.ar(f, 0) * n0 * 0.1, r4, 1) }
-; var n0 = LFNoise2.kr([0.4, 0.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
diff --git a/src/police-state.scd b/src/police-state.scd
new file mode 100644
--- /dev/null
+++ b/src/police-state.scd
@@ -0,0 +1,14 @@
+{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)
+            ;var n0 = LFNoise2.ar(r5)
+            ;var f = SinOsc.kr(r0,r1,r2,r3)
+            ;Pan2.ar(SinOsc.ar(f,0) * n0 * 0.1,r4,1)}
+;var n0 = LFNoise2.kr([0.4,0.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
diff --git a/src/pond-life.scd b/src/pond-life.scd
new file mode 100644
--- /dev/null
+++ b/src/pond-life.scd
@@ -0,0 +1,3 @@
+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)
diff --git a/src/pulsing-bottles-m.hs b/src/pulsing-bottles-m.hs
new file mode 100644
--- /dev/null
+++ b/src/pulsing-bottles-m.hs
@@ -0,0 +1,21 @@
+-- pulsing bottles (jmcc)
+
+import Control.Monad
+import Sound.SC3.Monadic
+import Sound.SC3.Lang.Control.OverlapTexture
+
+pulsing_bottles :: UId m => m UGen
+pulsing_bottles = do
+  let r = do n <- whiteNoise AR
+             r0 <- rand 4 14
+             r1 <- rand 0 0.7
+             r2 <- rand 400 7400
+             return (resonz (n * lfPulse KR r0 0 0.25 * r1) r2 0.01)
+      s = do f <- rand 0.1 0.5
+             p <- rand 0 (pi * 2)
+             return (sinOsc KR f p)
+      u = liftM2 (\x y -> pan2 x y 1) r s
+  return.sum =<< sequence (replicate 6 u)
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) =<< pulsing_bottles
diff --git a/src/pulsing-bottles.hs b/src/pulsing-bottles.hs
new file mode 100644
--- /dev/null
+++ b/src/pulsing-bottles.hs
@@ -0,0 +1,23 @@
+-- pulsing bottles (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+pulsing_bottles :: UGen
+pulsing_bottles =
+    let r = let n = whiteNoise 'a' AR
+                r0 = rand 'a' 4 14
+                r1 = rand 'a' 0 0.7
+                r2 = rand 'a' 400 7400
+            in resonz (n * lfPulse KR r0 0 0.25 * r1) r2 0.01
+        s = let f = rand 'b' 0.1 0.5
+                p = rand 'b' 0 (pi * 2)
+             in sinOsc KR f p
+    in sum (zipWith3 pan2 (uclone' 'a' 6 r) (uclone' 'b' 6 s) (repeat 1))
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) pulsing_bottles
+
+{-
+audition (out 0 pulsing_bottles)
+-}
diff --git a/src/pulsing-bottles.lhs b/src/pulsing-bottles.lhs
deleted file mode 100644
--- a/src/pulsing-bottles.lhs
+++ /dev/null
@@ -1,16 +0,0 @@
-pulsing bottles (jmcc)
-
-> import Control.Monad
-> import Sound.SC3.Monadic
-
-> main =
->   let { r = do { n <- whiteNoise ar
->                ; r0 <- rand 4 14
->                ; r1 <- rand 0 0.7
->                ; r2 <- rand 400 7400
->                ; return (resonz (n * lfPulse kr r0 0 0.25 * r1) r2 0.01) }
->       ; s = do { f <- rand 0.1 0.5
->                ; p <- rand 0 (pi * 2)
->                ; return (sinOsc kr f p) }
->       ; u = liftM2 (\x y -> pan2 x y 1) r s }
->   in audition . out 0 . sum =<< sequence (replicate 6 u)
diff --git a/src/pwm-crossfade.scd b/src/pwm-crossfade.scd
new file mode 100644
--- /dev/null
+++ b/src/pwm-crossfade.scd
@@ -0,0 +1,5 @@
+{var n = [400,500,450,376,600]
+;var d = 1/20
+;var f = Demand.kr(Impulse.kr(d,[0,0.5]),0,Dseq(n,inf))
+;var f_ = LFPulse.kr(8,0,LFTri.kr(d,1).range(0,1)).range(*f)
+;LPF.ar(Saw.ar(f_.max(376) * [1,0.99],0.5),8000);}.play
diff --git a/src/rails.hs b/src/rails.hs
new file mode 100644
--- /dev/null
+++ b/src/rails.hs
@@ -0,0 +1,27 @@
+-- rails (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+rand2 :: ID a => a -> UGen -> UGen
+rand2 e n = rand e (-n) n
+
+rails :: UGen
+rails =
+    let n = 20 -- resonant modes
+        e = dust 'a' AR 100 * 0.04 -- excitation
+        f = xLine KR 3000 300 8 DoNothing -- sweep filter down
+        l = line KR (rand2 'b' 1) (rand2 'c' 1) 8 DoNothing -- sweep pan
+        r = uclone' 'a' n (200 + linRand 'd' 0 3000 0) -- resonant frequencies
+        a = replicate n 1
+        t = uclone' 'b' n (0.2 + rand 'e' 0 1) -- ring times
+        k = klank (resonz e f 0.2) 1 0 1 (klankSpec r a t)
+    in pan2 k l 1
+
+main :: IO ()
+main = overlapTextureU (2,3,4,maxBound) rails
+
+{-
+audition (out 0 rails)
+Sound.SC3.UGen.Dot.draw rps
+-}
diff --git a/src/rails.scd b/src/rails.scd
new file mode 100644
--- /dev/null
+++ b/src/rails.scd
@@ -0,0 +1,9 @@
+{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
diff --git a/src/rain-thunder.hs b/src/rain-thunder.hs
new file mode 100644
--- /dev/null
+++ b/src/rain-thunder.hs
@@ -0,0 +1,24 @@
+-- rain, thunder (jl)
+-- http://sccode.org/1-e
+
+import Sound.SC3.ID
+
+rain_thunder :: UGen
+rain_thunder =
+    let n0 = pinkNoise 'a' AR * (0.08 + lfNoise1 'a' KR 0.3 * 0.02)
+        d0 = lpf (dust2 'b' AR (range 40 50 (lfNoise1 'b' KR 0.2))) 7000
+        e0 = line KR 0 1 10 DoNothing
+        p0 = tanh (3 * gVerb (hpf (n0+d0) 400) 250 100 0.25 0.5 15 0.3 0.7 0.5 300 * e0)
+        lfNoise1C e r f = clip (lfNoise1 e r f) 0 1
+        n1 = pinkNoise 'c' AR * ((lfNoise1C 'c' KR 3 * lfNoise1C 'c' KR 2) ** 1.8)
+        f1 = linExp (lfNoise1 'd' KR 1) (-1) 1 100 2500
+        e1 = line KR 0 0.7 30 DoNothing
+        p1 = gVerb (tanh (lpf (10 * hpf n1 20) f1)) 270 30 0.7 0.5 15 0.5 0.7 0.5 300 * e1
+    in limiter (p0 + p1) 1 0.01
+
+main :: IO ()
+main = audition (out 0 rain_thunder)
+
+{-
+Sound.SC3.UGen.Dot.draw rain_thunder
+-}
diff --git a/src/rain-thunder.scd b/src/rain-thunder.scd
new file mode 100644
--- /dev/null
+++ b/src/rain-thunder.scd
@@ -0,0 +1,9 @@
+{var n0 = PinkNoise.ar(0.08 + LFNoise1.kr(0.3,0.02))
+;var d0 = LPF.ar(Dust2.ar(LFNoise1.kr(0.2).range(40,50)),7000)
+;var e0 = Line.kr(0,1,10)
+;var p0 = tanh(3 * GVerb.ar(HPF.ar(n0 + d0,400),250,100,0.25,drylevel:0.3) * e0)
+;var n1 = PinkNoise.ar(LFNoise1.kr(3).clip(0,1) * LFNoise1.kr(2).clip(0,1) ** 1.8)
+;var f1 = LFNoise1.kr(1).exprange(100,2500)
+;var e1 = Line.kr(0,0.7,30)
+;var p1 = GVerb.ar(LPF.ar(10 * HPF.ar(n1, 20),f1).tanh,270,30,0.7,drylevel:0.5) * e1
+;Limiter.ar(p0 + p1)}.play
diff --git a/src/random-panning-sines-m.hs b/src/random-panning-sines-m.hs
new file mode 100644
--- /dev/null
+++ b/src/random-panning-sines-m.hs
@@ -0,0 +1,22 @@
+-- random panning sines (jmcc)
+
+import Sound.SC3.Monadic
+import Sound.SC3.Lang.Control.OverlapTexture
+
+rps :: UId m => m UGen
+rps = do
+  let nd = do r0 <- linRand 80 2000 0
+              let o = fSinOsc AR r0 0
+              l <- lfNoise1 KR =<< rand 0.8 1.2
+              a <- lfNoise1 KR =<< rand 0.82 0.98
+              return (pan2 o l a)
+  r <- clone 8 nd
+  return (mix r * (0.4 / 8))
+
+main :: IO ()
+main = overlapTextureU (8,8,2,maxBound) =<< rps
+
+{-
+audition . out 0 =<< rps
+Sound.SC3.UGen.Dot.draw =<< rps
+-}
diff --git a/src/random-panning-sines.hs b/src/random-panning-sines.hs
new file mode 100644
--- /dev/null
+++ b/src/random-panning-sines.hs
@@ -0,0 +1,20 @@
+-- random panning sines (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+rps :: UGen
+rps =
+    let nd = let o = fSinOsc AR (linRand 'a' 80 2000 0) 0
+                 l = lfNoise1 'b' KR (rand 'b' 0.8 1.2)
+                 a = lfNoise1 'c' KR (rand 'c' 0.82 0.98)
+             in pan2 o l a
+    in mix (uclone 'a' 8 nd) * (0.4 / 8)
+
+main :: IO ()
+main = overlapTextureU (8,8,2,maxBound) rps
+
+{-
+audition (out 0 rps)
+Sound.SC3.UGen.Dot.draw rps
+-}
diff --git a/src/random-pulsations.hs b/src/random-pulsations.hs
new file mode 100644
--- /dev/null
+++ b/src/random-pulsations.hs
@@ -0,0 +1,14 @@
+-- random pulsations (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+rp :: UGen
+rp =
+    let o1 = fSinOsc AR (rand 'a' 0 2000) 0 * 0.02
+        o2 = sinOsc AR (linRand 'b' 8 88 0) 0
+        o3 = sinOsc KR (rand 'c' 0.3 0.8) (rand 'd' 0 (2 * pi)) * 0.7
+    in pan2 (o1 `amClip` o2) o3 1
+
+main :: IO ()
+main = overlapTextureU (2,5,8,maxBound) rp
diff --git a/src/random-sine-waves.hs b/src/random-sine-waves.hs
new file mode 100644
--- /dev/null
+++ b/src/random-sine-waves.hs
@@ -0,0 +1,13 @@
+-- random sine waves (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+rsw :: UGen
+rsw =
+    let f = rand 'a' 0 2000
+        o = fSinOsc AR f 0 * 0.02
+    in pan2 o (rand 'b' (-1) 1) 1
+
+main :: IO ()
+main = overlapTextureU (2,5,12,maxBound) rsw
diff --git a/src/random-sine-waves.scd b/src/random-sine-waves.scd
new file mode 100644
--- /dev/null
+++ b/src/random-sine-waves.scd
@@ -0,0 +1,3 @@
+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)})
diff --git a/src/record-scratcher.hs b/src/record-scratcher.hs
new file mode 100644
--- /dev/null
+++ b/src/record-scratcher.hs
@@ -0,0 +1,25 @@
+-- record scratcher (josh parmenter)
+
+import Sound.OpenSoundControl
+import Sound.SC3
+
+record_scratcher :: UGen
+record_scratcher =
+  let dup a = mce2 a a
+      d = env [0, 1, 0] [0.1, 0.1] [EnvSin] 1 0
+      e = envGen KR 1 0.5 0 1 RemoveSynth d
+      x = mouseX' KR (-10) 10 Linear 0.2
+      dx = x - delayN x 0.1 0.1
+      bdx = mouseButton' KR 1 0 0.3 + dx
+      bdxr = bdx * bufRateScale KR 0
+      scr = playBuf 1 AR 0 bdxr 0 0 Loop DoNothing
+  in dup (scr * e)
+
+run :: Transport t => t -> IO ()
+run fd = do
+  let fn = "/home/rohan/data/audio/pf-c5.snd"
+  _ <- async fd (b_allocRead 0 fn 0 0)
+  play fd (out 0 record_scratcher)
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/record-scratcher.lhs b/src/record-scratcher.lhs
deleted file mode 100644
--- a/src/record-scratcher.lhs
+++ /dev/null
@@ -1,30 +0,0 @@
-record scratcher (josh parmenter)
-
-> import Sound.SC3
-
-> main =
->   let { dup a = mce2 a a
->       ; fn = "/home/rohan/audio/metal.wav"
->       ; d = env [0, 1, 0] [0.1, 0.1] [EnvSin] 1 0
->       ; e = envGen kr 1 1 0 1 RemoveSynth d
->       ; x = mouseX kr (-10) 10 Linear 0.2
->       ; dx = x - delayN x 0.1 0.1
->       ; bdx = mouseButton kr 1 0 0.3 + dx
->       ; bdxr = bdx * bufRateScale kr 0
->       ; scr = playBuf 1 0 bdxr 0 0 Loop DoNothing }
->   in withSC3 (\fd -> do { async fd (b_allocRead 0 fn 0 0)
->                         ; play fd (out 0 (dup (scr * e))) })
-
-{ var fn = "/home/rohan/audio/metal.wav"
-; var b = 0
-; var gate = 1
-; var e = Env.new([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)
-; var bdx = MouseButton.kr(1, 0, 0.3) + dx
-; var bdxr = bdx * BufRateScale.kr(b)
-; 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
diff --git a/src/record-scratcher.scd b/src/record-scratcher.scd
new file mode 100644
--- /dev/null
+++ b/src/record-scratcher.scd
@@ -0,0 +1,13 @@
+{ var fn = "/home/rohan/audio/metal.wav"
+; var b = 0
+; var gate = 1
+; var e = Env.new([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)
+; var bdx = MouseButton.kr(1, 0, 0.3) + dx
+; var bdxr = bdx * BufRateScale.kr(b)
+; 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
diff --git a/src/red-frik.hs b/src/red-frik.hs
new file mode 100644
--- /dev/null
+++ b/src/red-frik.hs
@@ -0,0 +1,24 @@
+-- red_frik (f0)
+
+import Sound.SC3.Monadic
+
+red :: UId m => UGen -> UGen -> m UGen
+red tr n = do
+  r1 <- tRand 0.3 3 tr
+  r2 <- tRand 0.3 5 tr
+  r3 <- tRand 0 0.5 tr
+  r4 <- tRand 0.49 0.56 tr
+  r5 <- tRand 0.3 0.6 tr
+  r6 <- tRand 0.3 0.5 tr
+  let o1 = fSinOsc KR r2 0 * r3 + r4
+      o2 = fSinOsc KR o1 r5 * r6
+  return (rhpf n r1 o2)
+
+red_frik :: UId m => m UGen
+red_frik = do
+  n <- clone 2 (brownNoise AR)
+  let tr = impulse KR 0.1 0
+  red tr n
+
+main :: IO ()
+main = audition . out 0 =<< red_frik
diff --git a/src/red-frik.lhs b/src/red-frik.lhs
deleted file mode 100644
--- a/src/red-frik.lhs
+++ /dev/null
@@ -1,32 +0,0 @@
-red frik (f0)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let red tr n = 
->         do { r1 <- tRand 0.3 3 tr
->            ; r2 <- tRand 0.3 5 tr
->            ; r3 <- tRand 0 0.5 tr
->            ; r4 <- tRand 0.49 0.56 tr
->            ; r5 <- tRand 0.3 0.6 tr
->            ; r6 <- tRand 0.3 0.5 tr
->            ; let { o1 = fSinOsc kr r2 0 * r3 + r4
->                  ; o2 = fSinOsc kr o1 r5 * r6 }
->              in return (rhpf n r1 o2) }
->     in do { n <- clone 2 (brownNoise ar)
->           ; let tr = impulse kr 0.1 0
->             in audition . out 0 =<< red tr n }
-
-{ var red = { arg tr, n
-            ; var r1 = TRand.kr(0.3, 3, tr)
-            ; var r2 = TRand.kr(0.3, 5, tr)
-            ; var r3 = TRand.kr(0, 0.5, tr)
-            ; var r4 = TRand.kr(0.49, 0.56, tr)
-            ; 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)
-            ; 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
diff --git a/src/red-frik.scd b/src/red-frik.scd
new file mode 100644
--- /dev/null
+++ b/src/red-frik.scd
@@ -0,0 +1,13 @@
+{ var red = { arg tr, n
+            ; var r1 = TRand.kr(0.3, 3, tr)
+            ; var r2 = TRand.kr(0.3, 5, tr)
+            ; var r3 = TRand.kr(0, 0.5, tr)
+            ; var r4 = TRand.kr(0.49, 0.56, tr)
+            ; 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)
+            ; 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
diff --git a/src/resonant-dust.hs b/src/resonant-dust.hs
new file mode 100644
--- /dev/null
+++ b/src/resonant-dust.hs
@@ -0,0 +1,15 @@
+-- resonant dust (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+resonant_dust :: UGen
+resonant_dust =
+    let rf = let st = rand 'a' 80 2080
+                 en = st + (rand 'b' (-0.5) 0.5 * st)
+             in xLine KR st en 9 DoNothing
+        d = dust 'c' AR (rand 'd' 50 850) * 0.3
+    in pan2 (resonz d rf 0.1) (rand 'e' (-1) 1) 1
+
+main :: IO ()
+main = overlapTextureU (2,5,9,maxBound) resonant_dust
diff --git a/src/reverberated-sine-percussion.hs b/src/reverberated-sine-percussion.hs
new file mode 100644
--- /dev/null
+++ b/src/reverberated-sine-percussion.hs
@@ -0,0 +1,26 @@
+-- reverberated sine percussion (jmcc)
+
+import Sound.SC3.Monadic
+
+reverberated_sine_percussion :: (Functor m,UId m) => m UGen
+reverberated_sine_percussion = do
+  let d = 6
+      c = 5
+      a = 4
+      s_ = do n <- dust AR (2 / constant d)
+              r <- rand 0 3000
+              return (resonz (n * 50) (200 + r) 0.003)
+      x_ i = do r <- clone 2 (rand 0 0.05)
+                return (allpassN i 0.05 r 1)
+      (>=>) f g x = f x >>= g
+      chain n f = foldl (>=>) return (replicate n f)
+  s <- fmap sum (sequence (replicate d s_))
+  y <- do let z = delayN s 0.048 0.48
+          r <- clone c (rand 0 0.1)
+          n <- lfNoise1 KR r
+          return (mix (combL z 0.1 (n * 0.04 + 0.05) 15))
+  x <- chain a x_ y
+  return (s + x * 0.2)
+
+main :: IO ()
+main = audition . out 0 =<< reverberated_sine_percussion
diff --git a/src/reverberated-sine-percussion.lhs b/src/reverberated-sine-percussion.lhs
deleted file mode 100644
--- a/src/reverberated-sine-percussion.lhs
+++ /dev/null
@@ -1,38 +0,0 @@
-reverberated sine percussion (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { d = 6
->       ; c = 5
->       ; a = 4
->       ; s_ = do { n <- dust ar (2 / constant d)
->                 ; r <- rand 0 3000
->                 ; return (resonz (n * 50) (200 + r) 0.003) }
->       ; x_ i = do { r <- clone 2 (rand 0 0.05)
->                   ; return (allpassN i 0.05 r 1) } 
->       ; (>=>) f g = \x -> f x >>= g
->       ; chain n f = foldl (>=>) return (replicate n f) }
->   in do { s <- fmap sum (sequence (replicate d s_))
->         ; y <- let z = delayN s 0.048 0.48
->                in do { r <- clone c (rand 0 0.1)
->                      ; n <- lfNoise1 kr r
->                      ; return (mix (combL z 0.1 (n * 0.04 + 0.05) 15)) }
->         ; x <- chain a x_ y
->         ; audition (out 0 (s + x * 0.2)) }
-
-{ 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
diff --git a/src/reverberated-sine-percussion.scd b/src/reverberated-sine-percussion.scd
new file mode 100644
--- /dev/null
+++ b/src/reverberated-sine-percussion.scd
@@ -0,0 +1,15 @@
+{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
diff --git a/src/ring-modulated-klank.hs b/src/ring-modulated-klank.hs
new file mode 100644
--- /dev/null
+++ b/src/ring-modulated-klank.hs
@@ -0,0 +1,21 @@
+-- ring modulated klank (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+rmk :: UGen
+rmk =
+    let p = 8
+        k = let sp = klankSpec (udup' p (rand 'a' 100 10000))
+                               (replicate p 1)
+                               (udup' p (rand 'a' 0.2 1))
+            in klank (dust 'a' AR 20 * 0.02) 1 0 1 sp
+        f = lfNoise2 'a' KR (rand 'a' 0.1 0.4) * 200 + rand 'a' 350 400
+    in pan2 (sinOsc AR f 0 * k) (rand 'a' (-1) 1) 1
+
+main :: IO ()
+main = overlapTextureU (4,4,4,maxBound) rmk
+
+{-
+audition (out 0 rmk)
+-}
diff --git a/src/rm-octaver.lhs b/src/rm-octaver.lhs
deleted file mode 100644
--- a/src/rm-octaver.lhs
+++ /dev/null
@@ -1,10 +0,0 @@
-rm-octaver (andrea valle, miller puckette)
-
-> import Sound.SC3
-
-> main =
->   let { defaultPitch x = pitch x 440 60 4000 100 16 1 0.01 0.5 1
->       ; i = soundIn 0
->       ; p = defaultPitch i
->       ; f = mceChannel 0 p }
->   in audition (out 0 (sinOsc ar (f * 0.5) 0 * i + i))
diff --git a/src/rzblp.hs b/src/rzblp.hs
new file mode 100644
--- /dev/null
+++ b/src/rzblp.hs
@@ -0,0 +1,27 @@
+-- rzblp (rd)
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+
+rzblp :: UGen
+rzblp =
+  let wrp i l r = let m = (r - l) / 2
+                  in i * m + l + m
+      lfn f = wrp (lfNoise0 KR f)
+      hpb q = mixFill 2 (\_ -> let f = lfn q 1330 1395
+                                   a = lfn q 0.001 0.007
+                               in blip AR f 24 * a)
+      mk_f d = let q = lfn 5.2 5.2 5.21
+                   a = d dinf (mce [1,3,2,7,8])
+                   tr = impulse KR q 0
+                   freq = demand tr 0 a * 30 + 340
+               in sum [blip AR freq 3 * lfn q 0.001 0.01
+                      ,resonz (impulse AR q (mce2 0 0))
+                                  (lfn 5 30 640)
+                                  (lfn q 0.1 0.5) * lfn q 0.01 1.8
+                      ,hpb q * lfn q 1.2 1.8
+                      ,blip AR (lfn q 16 36) 3 * mce2 0.03 0.09]
+  in mk_f drand + mk_f dxrand
+
+main :: IO ()
+main = audition (out 0 rzblp)
diff --git a/src/s-chirp.hs b/src/s-chirp.hs
new file mode 100644
--- /dev/null
+++ b/src/s-chirp.hs
@@ -0,0 +1,31 @@
+-- s-chirp (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3.ID
+
+s_chirp :: UGen
+s_chirp =
+  let x = mouseX' KR 15 0 Linear 0.1
+      y = mouseY' KR 15 27 Linear 0.1
+      t = dust 'a' KR 9
+      b = tChoose 'a' t (mce [36,48,60,72])
+      n = lfNoise1 'a' KR (mce2 3 3.05) * 0.04
+      d = tIRand 'a' x y t
+      e = decay2 t 0.005 (tRand 'a' 0.02 0.15 t)
+      o = let k = degreeToKey 0 d 12
+              f = midiCPS (b + k + n)
+              m = e * sinOsc AR f 0 * 0.2
+              u = pulseDivider t 9 0
+              r0 = tRand 'a' 0.0075 0.125 u
+              r1 = tRand 'a' 0.05 0.15 u
+          in m * 0.5 + allpassC m 0.15 r0 r1
+  in out 0 o
+
+act :: Transport t => t -> IO ()
+act fd = do
+  let scl = [0,2,3.2,5,7,9,10]
+  _ <- async fd (b_alloc_setn1 0 0 scl)
+  play fd s_chirp
+
+main :: IO ()
+main = withSC3 act
diff --git a/src/s-chirp.lhs b/src/s-chirp.lhs
deleted file mode 100644
--- a/src/s-chirp.lhs
+++ /dev/null
@@ -1,26 +0,0 @@
-s-chirp (rd)
-
-> import Sound.SC3.Monadic
-> import qualified Sound.SC3.ID as I
-
-> main =
->   let { x = linLin (I.lfNoise0 'a' KR 1) (-1) 1 15 0
->    {- ; x = mouseX kr 15 0 Linear 0.1 -}
->       ; y = linLin (I.lfNoise0 'b' KR 1) (-1) 1 15 27
->    {- ; y = mouseY kr 15 27 Linear 0.1 -}
->       ; scl = [0, 2, 3.2, 5, 7, 9, 10] }
->   in do { t <- dust kr 9
->         ; b <- tChoose t (mce [36, 48, 60, 72])
->         ; n <- fmap (* 0.04) (lfNoise1 kr (mce2 3 3.05))
->         ; d <- tiRand x y t
->         ; e <- fmap (decay2 t 0.005) (tRand 0.02 0.15 t)
->         ; o <- let { k = degreeToKey 0 d 12
->                    ; f = midiCPS (b + k + n)
->                    ; m = e * sinOsc ar f 0 * 0.2
->                    ; u = pulseDivider t 9 0 }
->                in do { r0 <- tRand 0.0075 0.125 u
->                      ; r1 <- tRand 0.05 0.15 u
->                      ; return (m * 0.5 + allpassC m 0.15 r0 r1) }
->         ; withSC3 (\fd -> do { _ <- async fd (b_alloc 0 7 1)
->                              ; send fd (b_setn1 0 0 scl)
->                              ; play fd (out 0 o) }) }
diff --git a/src/sam-i-am.hs b/src/sam-i-am.hs
new file mode 100644
--- /dev/null
+++ b/src/sam-i-am.hs
@@ -0,0 +1,53 @@
+-- sam i am (jr)
+-- http://www.listarc.bham.ac.uk/lists/sc-users/msg00280.html
+
+import Control.Monad.Random
+import Data.List
+import Data.Maybe
+import Sound.SC3
+import Sound.SC3.Lang.Control.Event
+import Sound.SC3.Lang.Random.Monad
+import Sound.SC3.Lang.Pattern.ID
+
+text :: [String]
+text =
+    ["I could not would not in a house"
+    ,"I would not could not with a mouse"
+    ,"I would not eat them with a fox"
+    ,"I would not eat them in a box"
+    ,"I would not eat them here or there"
+    ,"I would not eat them anywhere"
+    ,"I would not eat green eggs and ham"
+    ,"I do not like them Sam-I-am"]
+
+x :: [[String]]
+x = map words text
+
+a :: [String]
+a = nub (concat x)
+
+sam :: Synthdef
+sam =
+    let f1 = control KR "freq1" 440
+        f2 = control KR "freq2" 440
+        f3 = control KR "freq3" 440
+        e = xLine KR 0.1 0.001 0.5 RemoveSynth
+        o = sinOsc AR f1 0 * pulse AR f2 0.5 * saw AR f3 * e
+    in synthdef "sam" (out 0 o)
+
+b :: RandomGen g => g -> [(String,[(String,Double)])]
+b g =
+    let mk w = do
+          f1 <- exprand 200 9000
+          f2 <- exprand 20 9000
+          f3 <- exprand 20 9000
+          let d = 0.1 * fromIntegral (length w)
+          return (w,[("freq1",f1),("freq2",f2),("freq3",f3),("dur",d)])
+    in evalRand (mapM mk a) g
+
+main :: IO ()
+main = do
+  g <- getStdGen
+  let t = b g
+      ae = mapMaybe (\w -> fmap event (lookup w t)) (concat x)
+  audition (sam,pseq (map return ae) 1)
diff --git a/src/sample-and-hold-liquidities.hs b/src/sample-and-hold-liquidities.hs
new file mode 100644
--- /dev/null
+++ b/src/sample-and-hold-liquidities.hs
@@ -0,0 +1,17 @@
+-- sample and hold liquidities (jmcc)
+
+import Sound.SC3.ID
+
+shl :: UGen
+shl =
+    let r = mouseX' KR 1 200 Exponential 0.1
+        t = recip r
+        c = impulse KR r 0.4
+        cf = mouseY' KR 100 8000 Exponential 0.1
+        f = latch (whiteNoise 'α' KR * cf * 0.5 + cf) c
+        p = latch (whiteNoise 'β' KR) c
+        i = pan2 (sinOsc AR f 0 * decay2 c (t * 0.1) (t * 0.9)) p 1
+    in combN i 0.3 0.3 2
+
+main :: IO ()
+main = audition (out 0 shl)
diff --git a/src/sample-and-hold-liquidities.lhs b/src/sample-and-hold-liquidities.lhs
deleted file mode 100644
--- a/src/sample-and-hold-liquidities.lhs
+++ /dev/null
@@ -1,22 +0,0 @@
-sample and hold liquidities (jmcc)
-
-> import Sound.SC3.ID
-
-> main =
->   let { r = mouseX kr 1 200 Exponential 0.1
->       ; t = recip r
->       ; c = impulse kr r 0.4
->       ; cf = mouseY kr 100 8000 Exponential 0.1
->       ; f = latch (whiteNoise 'α' kr * cf * 0.5 + cf) c
->       ; p = latch (whiteNoise 'β' kr) c
->       ; i = pan2 (sinOsc ar f 0 * decay2 c (t * 0.1) (t * 0.9)) p 1 }
->   in audition (out 0 (combN i 0.3 0.3 2))
-
-{ var r = MouseX.kr(1, 200, 'exponential', 0.1)
-; var t = r.reciprocal
-; var c = Impulse.kr(r, 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
diff --git a/src/sample-and-hold-liquidities.scd b/src/sample-and-hold-liquidities.scd
new file mode 100644
--- /dev/null
+++ b/src/sample-and-hold-liquidities.scd
@@ -0,0 +1,8 @@
+{var r = MouseX.kr(1,200,'exponential',0.1)
+;var t = r.reciprocal
+;var c = Impulse.kr(r,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
diff --git a/src/saucer-base.hs b/src/saucer-base.hs
new file mode 100644
--- /dev/null
+++ b/src/saucer-base.hs
@@ -0,0 +1,17 @@
+-- saucer base (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+saucer_base :: UGen
+saucer_base =
+    let a = rand 'a' 0 20
+        b = rand 'b' 0 1000
+        c = rand 'c' 0 5000
+        p = rand 'd' (-1) 1
+        o = sinOsc AR a 0 * b + (1.1 * b)
+        o' = sinOsc AR o 0 * c + (1.1 * c)
+    in pan2 (sinOsc AR o' 0 * 0.1) p 1
+
+main :: IO ()
+main = overlapTextureU (6,2,4,maxBound) saucer_base
diff --git a/src/sawed-cymbals.hs b/src/sawed-cymbals.hs
new file mode 100644
--- /dev/null
+++ b/src/sawed-cymbals.hs
@@ -0,0 +1,18 @@
+-- sawed cymbals (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+sawed_cymbals :: UGen
+sawed_cymbals =
+    let y = let f1 = rand 'a' 500 2500
+                f2 = rand 'a' 0 8000
+                f = udup' 15 (rand 'a' f1 (f1 + f2))
+                rt = udup' 15 (rand 'a' 2 6)
+          in klankSpec f (replicate 15 1) rt
+        z = uclone 'a' 2 y
+        fS = xLine KR (rand 'α' 0 600) (rand 'β' 0 600) 12 DoNothing
+    in klank (lfSaw AR fS 0 * 0.0005) 1 0 1 (mceTranspose z)
+
+main :: IO ()
+main = overlapTextureU (4,4,6,maxBound) sawed_cymbals
diff --git a/src/scratchy-m.hs b/src/scratchy-m.hs
new file mode 100644
--- /dev/null
+++ b/src/scratchy-m.hs
@@ -0,0 +1,12 @@
+-- scratchy-m (jmcc)
+
+import Sound.SC3.Monadic
+
+scratchy :: UId m => m UGen
+scratchy = do
+  n <- clone 2 (brownNoise AR)
+  let f = max (n * 0.5 - 0.49) 0 * 20
+  return (rhpf f 5000 1)
+
+main :: IO ()
+main = audition . out 0 =<< scratchy
diff --git a/src/scratchy-m.lhs b/src/scratchy-m.lhs
deleted file mode 100644
--- a/src/scratchy-m.lhs
+++ /dev/null
@@ -1,12 +0,0 @@
-scratchy-m (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { n <- clone 2 (brownNoise ar)
->      ; let f = max (n * 0.5 - 0.49) 0 * 20
->        in audition (out 0 (rhpf f 5000 1)) }
-
-{ 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
diff --git a/src/scratchy.hs b/src/scratchy.hs
new file mode 100644
--- /dev/null
+++ b/src/scratchy.hs
@@ -0,0 +1,12 @@
+-- scratchy (jmcc)
+
+import Sound.SC3.ID
+
+scratchy :: UGen
+scratchy =
+  let f m = brownNoise m AR * 0.5 - 0.49
+      n = mce2 (f 'α') (f 'β')
+  in rhpf (max n 0 * 20) 5000 1
+
+main :: IO ()
+main = audition (out 0 scratchy)
diff --git a/src/scratchy.lhs b/src/scratchy.lhs
deleted file mode 100644
--- a/src/scratchy.lhs
+++ /dev/null
@@ -1,12 +0,0 @@
-scratchy (jmcc)
-
-> import Sound.SC3.ID
-
-> main =
->   let { f m = brownNoise m ar * 0.5 - 0.49
->       ; n = mce2 (f 'α') (f 'β') }
->   in audition (out 0 (rhpf (max n 0 * 20) 5000 1))
-
-{ 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
diff --git a/src/scratchy.scd b/src/scratchy.scd
new file mode 100644
--- /dev/null
+++ b/src/scratchy.scd
@@ -0,0 +1,3 @@
+{ 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
diff --git a/src/scritto-m.hs b/src/scritto-m.hs
new file mode 100644
--- /dev/null
+++ b/src/scritto-m.hs
@@ -0,0 +1,28 @@
+-- scritto (rd)
+
+import Sound.SC3.Monadic
+import qualified Sound.SC3.Lang.Data.Vowel as V
+
+main :: IO ()
+main =
+  let s_msg n (_,_,f,a,b) = b_setn1 n 0 (f ++ a ++ b)
+      s_alloc fd (s,b) = do _ <- async fd (b_alloc b 15 1)
+                            send fd (s_msg b s)
+      buf_at b n = bufRd 1 KR b (mce [n .. n + 4]) NoLoop NoInterpolation
+      v_filter i f a b = resonz i f (b / f) * dbAmp a
+      v_filter_b bi i = v_filter i (buf_at bi 0) (buf_at bi 5) (buf_at bi 10)
+      mk_instr bx = do
+        n <- lfNoise2 KR 3
+        let t = impulse AR (n * 9 + 9) 0
+            i d = do n1 <- tRand 0.02 0.06 t
+                     n2 <- tIRand 30 52 t
+                     n3 <- tIRand 16 32 t
+                     let p = pulseDivider t d 0
+                         b = blip AR (midiCPS n2) n3
+                     return (decay2 p 0.01 n1 * b * 12)
+            bi = linLin n (-1) 1 0 bx
+            voice = mix . v_filter_b bi
+        return . out 0 . mce . map voice =<< mapM i [1,2]
+  in withSC3 (\fd-> do mapM_ (s_alloc fd) (zip V.fdata_table [0..])
+                       let n = constant (length V.fdata_table)
+                       audition =<< mk_instr n)
diff --git a/src/scritto.hs b/src/scritto.hs
new file mode 100644
--- /dev/null
+++ b/src/scritto.hs
@@ -0,0 +1,47 @@
+-- scritto (rd)
+
+import Control.Monad
+import Sound.OpenSoundControl
+import Sound.SC3.ID
+import qualified Sound.SC3.Lang.Data.Vowel as V
+
+scritto_i :: UGen -> UGen
+scritto_i bx =
+    let buf_at b n = bufRd 1 KR b (mce [n .. n + 4]) NoLoop NoInterpolation
+        v_filter i f a b = resonz i f (b / f) * dbAmp a
+        n0 = lfNoise2 'a' KR 3
+        v_filter_b i =
+            let bi = linLin n0 (-1) 1 0 bx
+                b = buf_at bi in v_filter i (b 0) (b 5) (b 10)
+        t = impulse AR (n0 * 9 + 9) 0
+        ble (e,d) =
+            let n1 = tRand e 0.02 0.06 t
+                n2 = tIRand e 30 52 t
+                n3 = tIRand e 16 32 t
+                p = pulseDivider t d 0
+                b = blip AR (midiCPS n2) n3
+            in (decay2 p 0.01 n1 * b * 12)
+        voice = mix . v_filter_b
+    in out 0 (mce (map (voice . ble) (zip "ab" [1,2])))
+
+s_alloc :: Transport t => t -> (V.Fdata Double,Int) -> IO ()
+s_alloc fd (s,b) = do
+  let s_msg n (_,_,fr,am,bw) = b_setn1 n 0 (fr ++ am ++ bw)
+  _ <- async fd (b_alloc b 15 1)
+  send fd (s_msg b s)
+
+s_init :: Transport t => t -> IO ()
+s_init fd = mapM_ (s_alloc fd) (zip V.fdata_table [0..])
+
+act :: Transport t => Bool -> t -> IO ()
+act i fd = do
+  when i (s_init fd)
+  let n = constant (length V.fdata_table)
+  play fd (scritto_i n)
+
+main :: IO ()
+main = withSC3 (act True)
+
+{-
+withSC3 (act False)
+-}
diff --git a/src/scritto.lhs b/src/scritto.lhs
deleted file mode 100644
--- a/src/scritto.lhs
+++ /dev/null
@@ -1,126 +0,0 @@
-scritto (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { scritto = [ ( "sA" 
->                     , [800, 1150, 2900, 3900, 4950]
->                     , [0, -6,  -32, -20, -50]
->                     , [80, 90,  120, 130, 140] )
->                   , ( "sE" 
->                     , [350, 2000, 2800, 3600, 4950]
->                     , [0, -20, -15, -40, -56]
->                     , [60, 100, 120, 150, 200] )
->                   , ( "sI" 
->                     , [270, 2140, 2950, 3900, 4950]
->                     , [0, -12 , -26 , -26 , -44]
->                     , [60, 90,  100, 120, 120] )
->                   , ( "sO" 
->                     , [450, 800,  2830, 3800, 4950]
->                     , [0, -11 , -22 , -22 , -50]
->                     , [70, 80,  100, 130, 135] )
->                   , ( "sU" 
->                     , [325, 700,  2700, 3800, 4950]
->                     , [0, -16, -35, -40, -60]
->                     , [50, 60,  170, 180, 200] )
->                   , ( "aA" 
->                     , [800, 1150, 2800, 3500, 4950]
->                     , [0, -4  , -20, -36 , -60]
->                     , [80, 90,  120, 130, 140] )
->                   , ( "aE" 
->                     , [400, 1600, 2700, 3300, 4950]
->                     , [0, -24 , -30, -35, -60]
->                     , [60, 80,  120, 150, 200] )
->                   , ( "aI" 
->                     , [350, 1700, 2700, 3700, 4950]
->                     , [0, -20, -30, -36 , -60]
->                     , [50, 100, 120, 150, 200] )
->                   , ( "aO" 
->                     , [450, 800,  2830, 3500, 4950]
->                     , [0, -9  , -16 , -28 , -55]
->                     , [70, 80,  100, 130, 135] )
->                   , ( "aU" 
->                     , [325, 700, 2530, 3500, 4950]
->                     , [0, -12 , -30, -40, -64]
->                     , [50, 60,  170, 180, 200] )
->                   , ( "ctA"
->                     , [660, 1120, 2750, 3000, 3350]
->                     , [0, -6  , -23 , -24 , -38]
->                     , [80, 90,  120, 130, 140] )
->                   , ( "ctE"
->                     , [440, 1800, 2700, 3000, 3300]
->                     , [0, -14 , -18 , -20, -20]
->                     , [70, 80,  100, 120, 120] )
->                   , ( "ctI"
->                     , [270, 1850, 2900, 3350, 3590]
->                     , [0, -24 , -24 , -36 , -36]
->                     , [40, 90,  100, 120, 120] )
->                   , ( "ctO"
->                     , [430, 820,  2700, 3000, 3300]
->                     , [0, -10, -26 , -22 , -34]
->                     , [40, 80,  100, 120, 120] )
->                   , ( "ctU"
->                     , [370, 630,  2750, 3000, 3400]
->                     , [0, -20, -23 , -30, -34]
->                     , [40, 60,  100, 120, 120] )
->                   , ( "tA" 
->                     , [650, 1080, 2650, 2900, 3250]
->                     , [0, -6   , -7  , -8 , -22]
->                     , [80, 90,  120, 130, 140] )
->                   , ( "tE" 
->                     , [400, 1700, 2600, 3200, 3580]
->                     , [0, -14 , -12 , -14 , -20]
->                     , [70, 80,  100, 120, 120] )
->                   , ( "tI" 
->                     , [290, 1870, 2800, 3250, 3540]
->                     , [0, -15, -18 , -20, -30]
->                     , [40, 90,  100, 120, 120] )
->                   , ( "tO" 
->                     , [400, 800,  2600, 2800, 3000]
->                     , [0, -10, -12 , -12 , -26]
->                     , [40, 80,  100, 120, 120] )
->                   , ( "tU" 
->                     , [350, 600,  2700, 2900, 3300]
->                     , [0, -20, -17 , -14 , -26]
->                     , [40, 60,  100, 120, 120] )
->                   , ( "bA" 
->                     , [600, 1040, 2250, 2450, 2750]
->                     , [0, -7   , -9  , -9 , -20]
->                     , [60, 70,  110, 120, 130] )
->                   , ( "bE" 
->                     , [400, 1620, 2400, 2800, 3100]
->                     , [0, -12  , -9 , -12 , -18]
->                     , [40, 80,  100, 120, 120] )
->                   , ( "bI" 
->                     , [250, 1750, 2600, 3050, 3340]
->                     , [0, -30, -16 , -22 , -28]
->                     , [60, 90,  100, 120, 120] )
->                   , ( "bO" 
->                     , [400, 750,  2400, 2600, 2900]
->                     , [0, -11 , -21 , -20, -40]
->                     , [40, 80,  100, 120, 120] )
->                   , ( "bU" 
->                     , [350, 600,  2400, 2675, 2950]
->                     , [0, -20, -32 , -28 , -36]
->                     , [40, 80,  100, 120, 120] ) ]
->       ; s_msg n (_, f, a, b) = b_setn1 n 0 (f ++ a ++ b)
->       ; s_alloc fd (s, b) = do { async fd (b_alloc b 15 1)
->                                ; send fd (s_msg b s) }
->       ; buf_at b n = bufRd 1 kr b (mce [n .. n + 4]) NoLoop NoInterpolation
->       ; v_filter i f a b = resonz i f (b / f) * dbAmp a
->       ; v_filter_b bi i = v_filter i (buf_at bi 0) (buf_at bi 5) (buf_at bi 10)
->       ; mk_instr bx = do 
->           { n <- lfNoise2 kr 3
->           ; let { t = impulse ar (n * 9 + 9) 0
->                 ; i d = do { n1 <- tRand 0.02 0.06 t
->                            ; n2 <- tiRand 30 52 t
->                            ; n3 <- tiRand 16 32 t
->                            ; let { p = pulseDivider t d 0
->                                  ; b = blip ar (midiCPS n2) n3 }
->                              in return (decay2 p 0.01 n1 * b * 12) }
->                 ; bi = linLin n (-1) 1 0 bx
->                 ; voice = mix . v_filter_b bi }
->             in return . out 0 . mce . map voice =<< mapM i [1, 2] } }
->   in withSC3 (\fd -> do { mapM_ (s_alloc fd) (zip scritto [0..])
->                         ; let n = constant (length scritto)
->                           in audition =<< mk_instr n })
diff --git a/src/seqr.hs b/src/seqr.hs
new file mode 100644
--- /dev/null
+++ b/src/seqr.hs
@@ -0,0 +1,27 @@
+-- seqr (rd)
+
+import Sound.SC3.ID
+
+nfreq :: ID a => a -> Int -> UGen -> UGen -> [UGen]
+nfreq z n l r = map (midiCPS . floorE) (uclone' z n (rand z l r))
+
+seqr_f :: UGen -> [UGen] -> UGen
+seqr_f f e =
+    let n = constant (length e `div` 2)
+    in select (lfSaw KR f 0 * n + n) (mce e)
+
+seqr :: Int -> UGen
+seqr n =
+  let f = rand 'a' 9 18 / constant n
+      b = blip AR (mce2 (seqr_f f (nfreq 'a' n 72 96))
+                        (seqr_f f (nfreq 'b' n 72 84)))
+                  (mce2 (seqr_f f (uclone' 'c' n (rand 'c' 1 3)))
+                        (seqr_f f (uclone' 'd' n (rand 'd' 3 6))))
+      a = mce2 (seqr_f f (uclone' 'e' n (rand 'e' 0.05 0.10)))
+               (seqr_f f (uclone' 'f' n (rand 'f' 0.05 0.15)))
+  in b * a
+
+
+-- n = rand 6 18
+main :: IO ()
+main = audition (out 0 (seqr 12))
diff --git a/src/shepard-tones.hs b/src/shepard-tones.hs
new file mode 100644
--- /dev/null
+++ b/src/shepard-tones.hs
@@ -0,0 +1,39 @@
+-- shepard tones (alberto de campo)
+
+import Sound.OpenSoundControl
+import Sound.SC3
+
+interp :: (Fractional t,Enum t) => t -> t -> t -> [t]
+interp n l r =
+    let i = (r - l) / n
+    in [l,l + i .. r - i]
+
+hanningWindow :: (Floating b,Enum b) => b -> [b]
+hanningWindow n =
+    let lp = pi * (-0.5)
+        rp = lp + 2 * pi
+        hf i = sin i * 0.5 + 0.5
+    in map hf (interp n lp rp)
+
+shepard_tones :: UGen
+shepard_tones =
+    let ratescale = 1024 / 44100 / 10
+        rate = 0.1
+        ph = phasor AR 0 (rate * ratescale) 0 1024 0
+        phases = mce (map (\n -> n * 0.1 * 1024 + ph) [0..9])
+        freqs = bufRdC 1 AR 1 phases Loop
+        amps = bufRdC 1 AR 2 phases Loop
+    in mix (sinOsc AR freqs 0 * amps) * 0.1
+
+run :: Transport t => t -> IO ()
+run fd = do
+  let square x = x * x
+      ampTable = map square (hanningWindow 1024)
+      amp_f i = (0.5 ** i) * 20000
+      freqTable = map amp_f (interp 1024 0 10)
+  _ <- async fd (b_alloc_setn1 1 0 freqTable)
+  _ <- async fd (b_alloc_setn1 2 0 ampTable)
+  audition (out 0 shepard_tones)
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/shepard-tones.lhs b/src/shepard-tones.lhs
deleted file mode 100644
--- a/src/shepard-tones.lhs
+++ /dev/null
@@ -1,42 +0,0 @@
-shepard tones (alberto de campo)
-
-> import Sound.SC3
-
-> main =
->   let { indxs n l r = let i = (r - l) / n 
->                       in [l, l + i .. r - i]
->       ; hanningWindow n = 
->             let { lp = pi * (-0.5)
->                 ; rp = lp + 2 * pi 
->                 ; hf i = sin i * 0.5 + 0.5 }
->             in map hf (indxs n lp rp)
->       ; square x = x * x
->       ; ampTable = map square (hanningWindow 1024) 
->       ; amp_f i = (0.5 ** i) * 20000
->       ; freqTable = map amp_f (indxs 1024 0 10)
->       ; ratescale = 1024 / 44100 / 10
->       ; rate = 0.1
->       ; ph = phasor ar 0 (rate * ratescale) 0 1024 0
->       ; phases = mce (map (\n -> n * 0.1 * 1024 + ph) [0..9])
->       ; freqs = bufRdC 1 ar 1 phases Loop
->       ; amps = bufRdC 1 ar 2 phases Loop
->       ; tone = mix (sinOsc ar freqs 0 * amps) * 0.1 }
->   in withSC3 (\fd -> do { async fd (b_alloc 1 1024 1)
->                         ; async fd (b_alloc 2 1024 1)
->                         ; send fd (b_setn1 1 0 freqTable)
->                         ; send fd (b_setn1 2 0 ampTable)
->                         ; audition (out 0 tone) })
-
-{ var ampTable = Signal.hanningWindow(1024).squared
-; var amp_f = { arg i; 0.5 ** i * 20000 }
-; var freqTable = Signal.newClear(1024).waveFill(amp_f, 0, 10)
-; var b1 = Buffer.loadCollection(s, freqTable)
-; var b2 = Buffer.loadCollection(s, ampTable)
-; var ratescale = 1024 / 44100 / 10
-; var rate = 0.1
-; var ph = Phasor.ar(0, rate * ratescale, 0, 1024, 0)
-; 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
diff --git a/src/shepard-tones.scd b/src/shepard-tones.scd
new file mode 100644
--- /dev/null
+++ b/src/shepard-tones.scd
@@ -0,0 +1,13 @@
+{var ampTable = Signal.hanningWindow(1024).squared
+;var amp_f = {arg i;0.5 ** i * 20000}
+;var freqTable = Signal.newClear(1024).waveFill(amp_f,0,10)
+;var b1 = Buffer.loadCollection(s,freqTable)
+;var b2 = Buffer.loadCollection(s,ampTable)
+;var ratescale = 1024 / 44100 / 10
+;var rate = 0.1
+;var ph = Phasor.ar(0,rate * ratescale,0,1024,0)
+;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
diff --git a/src/shifting-pulses.hs b/src/shifting-pulses.hs
new file mode 100644
--- /dev/null
+++ b/src/shifting-pulses.hs
@@ -0,0 +1,19 @@
+-- shifting pulses (rd)
+
+import Sound.SC3.Monadic
+
+shifting_pulses :: UId m => m UGen
+shifting_pulses = do
+  n0 <- clone 2 (brownNoise KR)
+  n1 <- clone 2 (brownNoise KR)
+  n2 <- clone 2 (brownNoise KR)
+  t <- dust KR 0.75
+  let warp i = linLin i (-1) 1
+      l = latch t t
+      p = pulse AR (warp n0 2 (mce2 11 15)) 0.01 * 0.1
+      f = warp n1 300 1800
+      rq = warp n2 0.01 2
+  return (l * rlpf p f rq)
+
+main :: IO ()
+main = audition . out 0 =<< shifting_pulses
diff --git a/src/shifting-pulses.lhs b/src/shifting-pulses.lhs
deleted file mode 100644
--- a/src/shifting-pulses.lhs
+++ /dev/null
@@ -1,23 +0,0 @@
-shifting pulses (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { [n0, n1, n2] <- sequence (replicate 3 (clone 2 (brownNoise kr)))
->      ; t <- dust kr 0.75
->      ; let { warp i = linLin i (-1) 1
->            ; l = latch t t
->            ; p = pulse ar (warp n0 2 (mce2 11 15)) 0.01 * 0.1 
->            ; f = warp n1 300 1800 
->            ; rq = warp n2 0.01 2 }
->        in audition (out 0 (l * rlpf p f rq)) }
-
-{ 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
diff --git a/src/shifting-pulses.scd b/src/shifting-pulses.scd
new file mode 100644
--- /dev/null
+++ b/src/shifting-pulses.scd
@@ -0,0 +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
diff --git a/src/sidereal-time.hs b/src/sidereal-time.hs
new file mode 100644
--- /dev/null
+++ b/src/sidereal-time.hs
@@ -0,0 +1,24 @@
+-- sidereal time (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+sidereal_time :: UGen
+sidereal_time =
+  let p = 15
+      z = let y = let fr = udup' p (expRand 'a' 100 6000)
+                      rt = udup' p (rand 'a' 2 6)
+                  in klankSpec fr (replicate p 1) rt
+          in uclone 'a' 2 y
+      f = xLine KR (expRand 'α' 40 300) (expRand 'β' 40 300) 12 DoNothing
+      t = let e = lfNoise2 'γ' KR (rand 'δ' 0 8)
+          in lfPulse AR f 0 (rand 'ε' 0.1 0.9) * 0.002 * max 0 e
+      o = distort (klank t 1 0 1 (mceTranspose z)) * 0.1
+  in combN o 0.6 (rand 'ζ' 0.1 0.6) 8 + mceReverse o
+
+main :: IO ()
+main = overlapTextureU (4,4,6,maxBound) sidereal_time
+
+{-
+audition (out 0 sidereal_time)
+-}
diff --git a/src/sidereal-time.scd b/src/sidereal-time.scd
new file mode 100644
--- /dev/null
+++ b/src/sidereal-time.scd
@@ -0,0 +1,9 @@
+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)}))
diff --git a/src/slow-beating-harmonic-sines.hs b/src/slow-beating-harmonic-sines.hs
new file mode 100644
--- /dev/null
+++ b/src/slow-beating-harmonic-sines.hs
@@ -0,0 +1,44 @@
+-- slow beating harmonic sines (jmcc)
+
+import Control.Monad
+import Control.Monad.Random
+import Sound.SC3
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.Lang.Random.Monad
+
+r_freq :: (RandomGen g) => Int -> Int -> Rand g [Double]
+r_freq k i = do
+  n <- nchoose i [0,2,4,5,7,9]
+  o <- nrand i 7
+  let f n' o' = midiCPS' (n' + (o' * 12) + fromIntegral k)
+  return (zipWith f n o)
+
+r_harmonics :: (RandomGen g) => Double -> Int -> Double -> Rand g [Double]
+r_harmonics d m f = do
+  d' <- nrand2 m d
+  return (zipWith (+) (map (* f) [1,2,4,5,6]) d')
+
+r_phase :: (RandomGen g) => Int -> Rand g [Double]
+r_phase m = nrrand m 0 (2 * pi)
+
+sbhs :: (RandomGen g) => Int -> Double -> Int -> Rand g UGen
+sbhs n d m = do
+  k' <- rand 12
+  let k = 24 + k'
+  f <- r_freq k n
+  p_fr <- mapM (r_harmonics d m) f
+  q_fr <- mapM (r_harmonics d m) f
+  p_ph <- replicateM n (r_phase m)
+  q_ph <- replicateM n (r_phase m)
+  let a = replicate n (replicate m 1)
+      p_sp = zipWith3 klangSpec' p_fr a p_ph
+      q_sp = zipWith3 klangSpec' q_fr a q_ph
+      mk_u s = klang AR 1 0 s * (0.1 / fromIntegral n)
+      p_u = sum (map mk_u p_sp)
+      q_u = sum (map mk_u q_sp)
+  return (mce2 p_u q_u)
+
+main :: IO ()
+main = do
+  g <- getStdGen
+  overlapTextureS (6,3,3,maxBound) (runRand (sbhs 8 0.4 5)) g
diff --git a/src/slow-beating-sines.hs b/src/slow-beating-sines.hs
new file mode 100644
--- /dev/null
+++ b/src/slow-beating-sines.hs
@@ -0,0 +1,41 @@
+-- slow beating sines (jmcc)
+
+import Control.Monad
+import Control.Monad.Random
+import Sound.SC3
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.Lang.Random.Monad
+
+r_freq :: (RandomGen g) => Int -> Rand g [Double]
+r_freq i = do
+  n <- nrrand i 24 84
+  return (map midiCPS' n)
+
+r_harmonics :: (RandomGen g) => Double -> Int -> Double -> Rand g [Double]
+r_harmonics d m f = fmap (map (+ f)) (nrand2 m d)
+
+r_harmonics' :: (RandomGen g) => Double -> Int -> Double -> Rand g [Double]
+r_harmonics' d m f = fmap ((f :)  . map (+ f)) (nrand2 (m - 1) d)
+
+r_phase :: (RandomGen g) => Int -> Rand g [Double]
+r_phase m = nrrand m 0 (2 * pi)
+
+sbs :: (RandomGen g) => Int -> Double -> Int -> Rand g UGen
+sbs n d m = do
+  f <- r_freq n
+  p_fr <- mapM (r_harmonics' d m) f
+  q_fr <- mapM (r_harmonics d m) f
+  p_ph <- replicateM n (r_phase m)
+  q_ph <- replicateM n (r_phase m)
+  let a = replicate n (replicate m 1)
+      p_sp = zipWith3 klangSpec' p_fr a p_ph
+      q_sp = zipWith3 klangSpec' q_fr a q_ph
+      mk_u s = klang AR 1 0 s * (0.1 / fromIntegral n)
+      p_u = sum (map mk_u p_sp)
+      q_u = sum (map mk_u q_sp)
+  return (mce2 p_u q_u)
+
+main :: IO ()
+main = do
+  g <- getStdGen
+  overlapTextureS (4,4,3,maxBound) (runRand (sbs 20 0.4 3)) g
diff --git a/src/snare-909.hs b/src/snare-909.hs
new file mode 100644
--- /dev/null
+++ b/src/snare-909.hs
@@ -0,0 +1,31 @@
+-- snare-909 (jmcc)
+
+import Sound.SC3.ID
+
+snare_909 :: UGen -> UGen
+snare_909 tr =
+  let n = whiteNoise 'a' AR
+      v = tRand 'a' 0.25 1.0 tr
+      e a b = envGen AR tr 1 0 1 DoNothing (envPerc a b)
+      e1 = e 0.0005 0.055
+      e2 = e 0.0005 0.075
+      e3 = e 0.0005 0.4
+      e4 = e 0.0005 0.283
+      t1 = lfTri AR 330 0
+      t2 = lfTri AR 185 0
+      x1 = lpf n 7040 * 0.1 + v
+      x2 = hpf x1 523
+      m1 = t1 * e1 * 0.25 + t2 * e2 * 0.25
+      m2 = x1 * e3 * 0.20 + x2 * e4 * 0.20
+  in m1 + m2
+
+snare_909_a :: UGen
+snare_909_a =
+    let x = mouseX' KR 1 4 Linear 0.2
+        y = mouseY' KR 0.25 0.75 Exponential 0.2
+        t = impulse KR (3 * x) 0
+    in pan2 (snare_909 t) 0 y
+
+main :: IO ()
+main = audition (out 0 snare_909_a)
+
diff --git a/src/snare-909.lhs b/src/snare-909.lhs
deleted file mode 100644
--- a/src/snare-909.lhs
+++ /dev/null
@@ -1,46 +0,0 @@
-snare-909 (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { snr tr n v =
->         let { e a b = envGen ar tr 1 0 1 DoNothing (envPerc a b)
->             ; e1 = e 0.0005 0.055
->             ; e2 = e 0.0005 0.075
->             ; e3 = e 0.0005 0.4
->             ; e4 = e 0.0005 0.283
->             ; t1 = lfTri ar 330 0
->             ; t2 = lfTri ar 185 0
->             ; x1 = lpf n 7040 * 0.1 + v
->             ; x2 = hpf x1 523
->             ; m1 = t1 * e1 * 0.25 + t2 * e2 * 0.25
->             ; m2 = x1 * e3 * 0.20 + x2 * e4 * 0.20 }
->         in m1 + m2
->       ; x = mouseX kr 1 4 Linear 0.2
->       ; y = mouseY kr 0.25 0.75 Exponential 0.2
->       ; t = impulse kr (3 * x) 0 }
->   in do { n <- whiteNoise ar
->         ; v <- tRand 0.25 1.0 t
->         ; audition (out 0 (pan2 (snr t n v) 0 y)) }
-
-{ 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 t1 = LFTri.ar(330, 0)
-      ; var t2 = LFTri.ar(185, 0)
-      ; var x1 = LPF.ar(n, 7040) * (0.1 + v)
-      ; var x2 = HPF.ar(x1, 523)
-      ; var m1 = (t1 * e1 * 0.25) + (t2 * e2 * 0.25)
-      ; var m2 = (x1 * e3 * 0.20) + (x2 * e4 * 0.20)
-      ; m1 + m2 }
-; 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 v = TRand.kr(0.25, 1.0, t)
-; Out.ar(0, Pan2.ar(snr.value(t, n, v), 0, y)) }.play
diff --git a/src/snare-909.scd b/src/snare-909.scd
new file mode 100644
--- /dev/null
+++ b/src/snare-909.scd
@@ -0,0 +1,21 @@
+{ 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 t1 = LFTri.ar(330, 0)
+      ; var t2 = LFTri.ar(185, 0)
+      ; var x1 = LPF.ar(n, 7040) * (0.1 + v)
+      ; var x2 = HPF.ar(x1, 523)
+      ; var m1 = (t1 * e1 * 0.25) + (t2 * e2 * 0.25)
+      ; var m2 = (x1 * e3 * 0.20) + (x2 * e4 * 0.20)
+      ; m1 + m2 }
+; 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 v = TRand.kr(0.25, 1.0, t)
+; Out.ar(0, Pan2.ar(snr.value(t, n, v), 0, y)) }.play
diff --git a/src/sosc-lp.lhs b/src/sosc-lp.lhs
deleted file mode 100644
--- a/src/sosc-lp.lhs
+++ /dev/null
@@ -1,34 +0,0 @@
-sosc-lp (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { dustR r lo hi = do { n1 <- dwhite 1 lo hi
->                            ; n2 <- whiteNoise r
->                            ; d <- dseq dinf n1
->                            ; return (tDuty r d 0 DoNothing (abs n2) 1) }
->       ; a = [60, 71, 89, 65, 36, 57, 92, 97, 92, 97]
->       ; b = [71, 89, 60, 57, 65, 36, 95, 92, 93, 97]
->       ; setup fd = do { async fd (b_alloc 10 9 1)
->                       ; async fd (b_alloc 11 9 1)
->                       ; send fd (b_setn1 10 0 a)
->                       ; send fd (b_setn1 11 0 b) }
->       ; d_env t = decay2 t 0.002 2.5
->       ; idx t = stepper t 0 0 15 1 0
->       ; f1 t = let { l = (bufRdL 1 kr 10 (idx t) Loop - 24)
->                    ; r = (bufRdL 1 kr 11 (idx t) Loop - 24) }
->                in midiCPS (mce2 l r)
->       ; f2 t n = f1 t + n * 1.2
->       ; o1 t = sinOsc ar (f1 t) 0 * d_env t
->       ; o2 t n = sinOsc ar (f2 t n) 0 * d_env t
->       ; sosc_lp t n = out 0 ((o1 t + o2 t n) * 0.2) }
->   in do { clk <- dustR kr 0.2 0.9
->         ; n <- lfNoise0 kr (mce2 1 3)
->         ; audition (sosc_lp clk n) }
-
-> resetter =
->   let { a = [71, 60, 65, 89, 36, 57, 95, 97, 92, 97]
->       ; b = [89, 71, 60, 65, 57, 36, 92, 95, 93, 97]
->       ; resetup fd = do { send fd (b_setn1 10 0 a)
->                         ; send fd (b_setn1 11 0 b) } }
->   in withSC3 resetup
diff --git a/src/spe-m.hs b/src/spe-m.hs
new file mode 100644
--- /dev/null
+++ b/src/spe-m.hs
@@ -0,0 +1,26 @@
+-- spe (jmcc)
+-- variant of graph in streams & patterns tutorial
+
+import Sound.SC3.Monadic
+
+spe :: UId m => m UGen
+spe = do
+  let (>=>) f g x = f x >>= g
+      chain n f = foldl (>=>) return (replicate n f)
+      rapf i = do r <- clone 2 (rand 0 0.05)
+                  return (allpassN i 0.05 r 4)
+      src = do let t = impulse KR 9 0
+                   e = envGen KR t 0.1 0 1 DoNothing (envPerc 0.1 1)
+                   s = mce [00,03,02,07
+                           ,08,32,16,18
+                           ,00,12,24,32]
+               n <- lfNoise1 KR 1
+               m <- dseq dinf s
+               let f = midiCPS (demand t 0 m + 32)
+                   o = lfSaw AR f 0 * e
+                   rq = midiCPS (n * 36 + 110)
+               return (rlpf o rq 0.1)
+  chain 4 rapf =<< src
+
+main :: IO ()
+main = audition . out 0 =<< spe
diff --git a/src/spe-p.hs b/src/spe-p.hs
new file mode 100644
--- /dev/null
+++ b/src/spe-p.hs
@@ -0,0 +1,30 @@
+-- spe-p (jmcc)
+
+import Sound.SC3.Monadic {- hsc3 -}
+import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+
+spe3_allpass6 :: IO Synthdef
+spe3_allpass6 = do
+  n <- lfNoise1 KR 1
+  let freq = control KR "freq" 440
+      (>=>) f g x = f x >>= g
+      chain i f = foldl (>=>) return (replicate i f)
+      rapf i = do r <- clone 2 (rand 0 0.05)
+                  return (allpassN i 0.05 r 4)
+      e = envGen KR 1 0.1 0 1 RemoveSynth (envPerc 0.1 1)
+      rq = midiCPS (n * 36 + 110)
+      o = rlpf (lfSaw AR freq 0 * e) rq 0.1
+  u <- fmap (out 0) (chain 4 rapf o)
+  return (synthdef "spe" u)
+
+notes :: P Double
+notes =
+    let n = [prand' 'a' [pempty,fromList [24,31,36,43,48,55]] inf
+            ,pflop [60,prand 'b' [63,65] inf,67,prand 'c' [70,72,74] inf]
+            ,psplitPlaces (pwhite 'd' 3 9 inf) (fromList [74,75,77,79,81])]
+    in pjoin (pseq1 n inf)
+
+main :: IO ()
+main = do
+  i <- spe3_allpass6
+  audition (i,pbind [("midinote",notes),("dur",0.13)])
diff --git a/src/spe.lhs b/src/spe.lhs
deleted file mode 100644
--- a/src/spe.lhs
+++ /dev/null
@@ -1,23 +0,0 @@
-spe (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { (>=>) f g = \x -> f x >>= g
->       ; chain n f = foldl (>=>) return (replicate n f)
->       ; rapf i = do { r <- clone 2 (rand 0 0.05)
->                     ; return (allpassN i 0.05 r 4) }
->       ; src = 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 ] }
->               in do { n <- lfNoise1 kr 1
->                     ; m <- dseq dinf s
->                     ; let { f = midiCPS (demand t 0 m + 32)
->                           ; o = lfSaw ar f 0 * e
->                           ; rq = midiCPS (n * 36 + 110) }
->                       in return (rlpf o rq 0.1) } }
->   in audition . (out 0) =<< chain 4 rapf =<< src
-
-[variant of graph in streams & patterns tutorial]
diff --git a/src/sprinkler-m.hs b/src/sprinkler-m.hs
new file mode 100644
--- /dev/null
+++ b/src/sprinkler-m.hs
@@ -0,0 +1,13 @@
+-- sprinkler-m (jmcc)
+
+import Sound.SC3.Monadic
+
+sprinkler_m :: UId m => m UGen
+sprinkler_m = do
+  n <- whiteNoise AR
+  let f = lfPulse KR 0.09 0 0.16 * 10 + 7
+      t = lfPulse KR f 0 0.25 * 0.1
+  return (bpz2 (n * t))
+
+main :: IO ()
+main = audition . out 0 =<< sprinkler_m
diff --git a/src/sprinkler-m.lhs b/src/sprinkler-m.lhs
deleted file mode 100644
--- a/src/sprinkler-m.lhs
+++ /dev/null
@@ -1,13 +0,0 @@
-sprinkler-m (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { n <- whiteNoise ar
->      ; let { f = lfPulse kr 0.09 0 0.16 * 10 + 7
->            ; t = lfPulse kr f 0 0.25 * 0.1 }
->        in audition (out 0 (bpz2 (n * t))) }
-
-{ 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
diff --git a/src/sprinkler.hs b/src/sprinkler.hs
new file mode 100644
--- /dev/null
+++ b/src/sprinkler.hs
@@ -0,0 +1,13 @@
+-- sprinkler (jmcc)
+
+import Sound.SC3.ID
+
+sprinkler :: UGen
+sprinkler =
+  let n = whiteNoise 'α' AR
+      f = lfPulse KR 0.09 0 0.16 * 10 + 7
+      t = lfPulse KR f 0 0.25 * 0.1
+  in bpz2 (n * t)
+
+main :: IO ()
+main = audition (out 0 sprinkler)
diff --git a/src/sprinkler.lhs b/src/sprinkler.lhs
deleted file mode 100644
--- a/src/sprinkler.lhs
+++ /dev/null
@@ -1,13 +0,0 @@
-sprinkler (jmcc)
-
-> import Sound.SC3.ID
-
-> main =
->   let { n = whiteNoise 'α' AR
->       ; f = lfPulse KR 0.09 0 0.16 * 10 + 7
->       ; t = lfPulse KR f 0 0.25 * 0.1 }
->   in audition (out 0 (bpz2 (n * t)))
-
-{ 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
diff --git a/src/sprinkler.scd b/src/sprinkler.scd
new file mode 100644
--- /dev/null
+++ b/src/sprinkler.scd
@@ -0,0 +1,3 @@
+{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
diff --git a/src/string-wander-cluster.hs b/src/string-wander-cluster.hs
new file mode 100644
--- /dev/null
+++ b/src/string-wander-cluster.hs
@@ -0,0 +1,23 @@
+-- string wander-cluster (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+import System.Random
+
+type ST = (Double,StdGen)
+
+wander :: ST -> ST
+wander (n,g) =
+    let (n',g') = randomR (-7,8) g
+    in (foldToRange 50 120 (n + n'),g')
+
+swc :: ST -> (UGen,ST)
+swc st =
+    let (n,g) = wander st
+        d = 1 / midiCPS (constant n)
+        w = whiteNoise 'c' AR * 0.008
+        o = combC w 0.01 d (d * 1000)
+    in (pan2 o (rand 'd' (-1) 1) 1,(n,g))
+
+main :: IO ()
+main = overlapTextureS (4/3,4/3,6,maxBound) swc (60,mkStdGen 0)
diff --git a/src/strummable-guitar.hs b/src/strummable-guitar.hs
new file mode 100644
--- /dev/null
+++ b/src/strummable-guitar.hs
@@ -0,0 +1,19 @@
+-- strummable guitar (jmcc)
+
+import Sound.SC3.ID
+
+strummable_guitar :: UGen
+strummable_guitar =
+    let scale = [52,57,62,67,71,76]
+        str i = let x = mouseX' KR 0 1 Linear 0.2
+                    t = abs (hpz1 (x >* (0.25 + constant i * 0.1)))
+                    e = decay t 0.05
+                    n = pinkNoise i AR * e
+                    dt = 1 / midiCPS (scale !! i)
+                    s = combL n dt dt 4
+                in pan2 s (constant i * 0.2 - 0.5) 1
+        strs = mixFill (length scale) str
+  in leakDC (lpf strs 12000) 0.995
+
+main :: IO ()
+main = audition (out 0 strummable_guitar)
diff --git a/src/strummable-guitar.lhs b/src/strummable-guitar.lhs
deleted file mode 100644
--- a/src/strummable-guitar.lhs
+++ /dev/null
@@ -1,27 +0,0 @@
-strummable guitar (jmcc)
-
-> import Sound.SC3.ID
-
-> main =
->   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 audition (out 0 (leakDC (lpf strs 12000) 0.995))
-
-{ var scale = [ 52, 57, 62, 67, 71, 76 ]
-; var str = { arg i
-            ; var x = MouseX.kr(0, 1, 'linear', 0.2)
-            ; var t = HPZ1.kr(x > (0.25 + (i * 0.1))).abs
-            ; var e = Decay.kr(t, 0.05)
-            ; var n = PinkNoise.ar * e
-            ; var dt = scale.at(i).midicps.reciprocal
-            ; 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
diff --git a/src/strummable-guitar.scd b/src/strummable-guitar.scd
new file mode 100644
--- /dev/null
+++ b/src/strummable-guitar.scd
@@ -0,0 +1,11 @@
+{var scale = [52,57,62,67,71,76]
+;var str = {arg i
+           ;var x = MouseX.kr(0,1,'linear',0.2)
+           ;var t = HPZ1.kr(x > (0.25 + (i * 0.1))).abs
+           ;var e = Decay.kr(t,0.05)
+           ;var n = PinkNoise.ar * e
+           ;var dt = scale.at(i).midicps.reciprocal
+           ;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
diff --git a/src/sweepy-noise.hs b/src/sweepy-noise.hs
new file mode 100644
--- /dev/null
+++ b/src/sweepy-noise.hs
@@ -0,0 +1,15 @@
+-- sweepy noise (jmcc)
+
+import Sound.SC3.ID
+
+sweepy_noise :: UGen
+sweepy_noise =
+    let n = udup 2 (whiteNoise 'a' AR)
+        lfoDepth = mouseY' KR 200 8000 Exponential 0.1
+        lfoRate = mouseX' KR 4 60 Exponential 0.1
+        freq = lfSaw KR lfoRate 0 * lfoDepth + (lfoDepth * 1.2)
+        filtered = rlpf (n * 0.03) freq 0.1
+    in combN filtered 0.3 0.3 2 + filtered
+
+main :: IO ()
+main = audition (out 0 sweepy_noise)
diff --git a/src/sweepy-noise.lhs b/src/sweepy-noise.lhs
deleted file mode 100644
--- a/src/sweepy-noise.lhs
+++ /dev/null
@@ -1,17 +0,0 @@
-sweepy noise (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { n <- clone 2 (whiteNoise ar)
->      ; let { lfoDepth = mouseY kr 200 8000 Exponential 0.1
->            ; lfoRate = mouseX kr 4 60 Exponential 0.1
->            ; freq = lfSaw kr lfoRate 0 * lfoDepth + (lfoDepth * 1.2)
->            ; filtered = rlpf (n * 0.03) freq 0.1 }
->        in audition (out 0 (combN filtered 0.3 0.3 2 + filtered)) }
-
-{ 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
diff --git a/src/sweepy-noise.scd b/src/sweepy-noise.scd
new file mode 100644
--- /dev/null
+++ b/src/sweepy-noise.scd
@@ -0,0 +1,5 @@
+{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
diff --git a/src/synthetic-piano-m.hs b/src/synthetic-piano-m.hs
new file mode 100644
--- /dev/null
+++ b/src/synthetic-piano-m.hs
@@ -0,0 +1,26 @@
+-- synthetic piano (jmcc)
+
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.Monadic
+
+synthetic_piano :: UId m => m UGen
+synthetic_piano = do
+  n <- iRand 36 90
+  f <- rand 0.1 0.5
+  ph <- rand 0 (pi * 2)
+  let s = impulse AR f ph * 0.1
+      e = decay2 s 0.008 0.04
+      c i = do n0 <- lfNoise2 AR 3000
+               let o = [-0.05,0,0.04] !! i
+                   dt = 1 / midiCPS (n + o)
+               return (combL (n0 * e) dt dt 6)
+      l = ((n - 36) / 27) - 1
+  c_ <- mixFillM 3 c
+  return (pan2 c_ l 1)
+
+main :: IO ()
+main = overlapTextureU (0,6,6,maxBound) =<< synthetic_piano
+
+{-
+audition . out 0 =<< mixFillM 6 (const synthetic_piano)
+-}
diff --git a/src/synthetic-piano.lhs b/src/synthetic-piano.lhs
deleted file mode 100644
--- a/src/synthetic-piano.lhs
+++ /dev/null
@@ -1,33 +0,0 @@
-synthetic piano (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let p = do { n <- iRand 36 90
->              ; f <- rand 0.1 0.5
->              ; ph <- rand 0 (pi * 2)
->              ; let { s = impulse ar f ph * 0.1
->                    ; e = decay2 s 0.008 0.04
->                    ; c i = do { n0 <- lfNoise2 ar 3000
->                               ; let { o = [-0.05, 0, 0.04] !! i
->                                     ; dt = 1 / (midiCPS (n + o)) }
->                                 in return (combL (n0 * e) dt dt 6) }
->                    ; l = ((n - 36) / 27) - 1 }
->                in do { c_ <- mixFillM 3 c
->                      ; return (pan2 c_ l 1) } }
->   in audition . out 0 =<< mixFillM 6 (const p)
-
-{ var p = { var n = IRand.new(36, 90)
-          ; var f = Rand.new(0.1, 0.5)
-          ; var ph = Rand.new(0, pi * 2)
-          ; var s = Impulse.ar(f, ph) * 0.1
-          ; var e = Decay2.ar(s, 0.008, 0.04)
-          ; var c = { arg i
-                    ; var n0 = LFNoise2.ar(3000)
-                    ; var o = [-0.05, 0, 0.04].at(i)
-                    ; var dt = 1 / (n + o).midicps
-                    ; CombL.ar(n0 * e, dt, dt, 6) }
-          ; 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
diff --git a/src/synthetic-piano.scd b/src/synthetic-piano.scd
new file mode 100644
--- /dev/null
+++ b/src/synthetic-piano.scd
@@ -0,0 +1,14 @@
+{var p = {var n = IRand.new(36,90)
+         ;var f = Rand.new(0.1,0.5)
+         ;var ph = Rand.new(0,pi * 2)
+         ;var s = Impulse.ar(f,ph) * 0.1
+         ;var e = Decay2.ar(s,0.008,0.04)
+         ;var c = {arg i
+                  ;var n0 = LFNoise2.ar(3000)
+                  ;var o = [-0.05,0,0.04].at(i)
+                  ;var dt = 1 / (n + o).midicps
+                  ;CombL.ar(n0 * e,dt,dt,6) }
+         ;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
diff --git a/src/tank-m.hs b/src/tank-m.hs
new file mode 100644
--- /dev/null
+++ b/src/tank-m.hs
@@ -0,0 +1,58 @@
+-- tank-m (jmcc)
+-- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html
+
+import Control.Monad
+import Sound.SC3.Monadic
+
+pling :: IO UGen
+pling = do
+  d <- dust AR 0.2
+  f <- expRand 300 2200
+  p <- rand (-1) 1
+  let s1 = cubed (fSinOsc AR f 0)
+      s2 = decay2 d 0.1 0.5 * 0.1 * s1
+  return (pan2 s2 p 1)
+
+bang :: IO UGen
+bang = do
+  d <- dust AR 0.01
+  n <- brownNoise AR
+  return (pan2 (decay2 d 0.04 0.3 * n) 0 1)
+
+chain :: Monad m => Int -> (b -> m b) -> b -> m b
+chain n f = foldl (>=>) return (replicate n f)
+
+r_allpass :: UId m => UGen -> m UGen
+r_allpass i = do
+  r <- clone 2 (rand 0.005 0.02)
+  return (allpassN i 0.03 r 1)
+
+tank_f :: UGen -> IO UGen
+tank_f i = do
+  r1 <- clone 2 (rand 0.01 0.05)
+  r2 <- clone 2 (rand 0.03 0.15)
+  let l0 = localIn 2 AR * 0.98
+      l1 = onePole l0 0.33
+      [l1l,l1r] = mceChannels l1
+      l2 = rotate2 l1l l1r 0.23
+      l3 = allpassN l2 0.05 r1 2
+      l4 = delayN l3 0.3 (mce [0.17,0.23])
+      l5 = allpassN l4 0.05 r2 2
+      l6 = leakDC l5 0.995
+      l7 = l6 + i
+  return (mrg [l7,localOut l7])
+
+tank :: IO UGen
+tank = do
+  s <- liftM2 (+) bang (mixFillM 8 (const pling))
+  s' <- chain 4 r_allpass s
+  tank_f s'
+
+main :: IO ()
+main = do
+  t <- tank
+  audition (out 0 t)
+
+{-
+tank >>= Sound.SC3.UGen.Dot.draw
+-}
diff --git a/src/tank.hs b/src/tank.hs
new file mode 100644
--- /dev/null
+++ b/src/tank.hs
@@ -0,0 +1,51 @@
+-- tank (jmcc)
+-- http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html
+
+import Sound.SC3.ID
+
+pling :: UGen
+pling =
+    let d = dust 'a' AR 0.2
+        f = expRand 'a' 300 2200
+        p = rand 'a' (-1) 1
+        s1 = cubed (fSinOsc AR f 0)
+        s2 = decay2 d 0.1 0.5 * 0.1 * s1
+    in pan2 s2 p 1
+
+bang :: UGen
+bang =
+    let d = dust 'b' AR 0.01
+        n = brownNoise 'b' AR
+    in pan2 (decay2 d 0.04 0.3 * n) 0 1
+
+r_allpass :: UGen -> UGen
+r_allpass i =
+    let r = udup 2 (rand 'c' 0.005 0.02)
+    in allpassN i 0.03 r 1
+
+tank_f :: UGen -> UGen
+tank_f i =
+    let r1 = udup 2 (rand 'd' 0.01 0.05)
+        r2 = udup 2 (rand 'd' 0.03 0.15)
+        l0 = localIn 2 AR * 0.98
+        l1 = onePole l0 0.33
+        (l1l,l1r) = mce2c l1
+        l2 = rotate2 l1l l1r 0.23
+        l3 = allpassN l2 0.05 r1 2
+        l4 = delayN l3 0.3 (mce2 0.17 0.23)
+        l5 = allpassN l4 0.05 r2 2
+        l6 = leakDC l5 0.995
+        l7 = l6 + i
+    in mrg [l7,localOut l7]
+
+tank :: UGen
+tank =
+  let s = bang + mix (uclone 'a' 8 pling)
+  in tank_f (useq 'a' 4 r_allpass s)
+
+main :: IO ()
+main = audition (out 0 tank)
+
+{-
+Sound.SC3.UGen.Dot.draw tank
+-}
diff --git a/src/tank.lhs b/src/tank.lhs
deleted file mode 100644
--- a/src/tank.lhs
+++ /dev/null
@@ -1,64 +0,0 @@
-tank (jmcc)
-
-> import Control.Monad
-> import Sound.SC3.Monadic
-
-> main =
->   let { r_allpass i = do { r <- clone 2 (rand 0.005 0.02)
->                          ; return (allpassN i 0.03 r 1) }
->       ; chain n f = foldl (>=>) return (replicate n f)
->       ; pling = do { d <- dust ar 0.2
->                    ; f <- expRand 300 2200
->                    ; p <- rand (-1) 1
->                    ; let { s1 = cubed (fSinOsc ar f 0)
->                          ; s2 = decay2 d 0.1 0.5 * 0.1 * s1 }
->                      in return (pan2 s2 p 1) }
->       ; bang = do { d <- dust ar 0.01
->                   ; n <- brownNoise ar
->                   ; return (pan2 (decay2 d 0.04 0.3 * n) 0 1) }
->       ; tank i = do { r1 <- clone 2 (rand 0.01 0.05)
->                     ; r2 <- clone 2 (rand 0.03 0.15)
->                     ; let { l0 = localIn 2 ar * 0.98
->                           ; l1 = onePole l0 0.33
->                           ; [l1l, l1r] = mceChannels l1
->                           ; l2 = rotate2 l1l l1r 0.23
->                           ; l3 = allpassN l2 0.05 r1 2
->                           ; l4 = delayN l3 0.3 (mce [0.17, 0.23])
->                           ; l5 = allpassN l4 0.05 r2 2
->                           ; l6 = leakDC l5 0.995
->                           ; l7 = l6 + i }
->                       in return (mrg [l7, localOut l7]) }
->       ; signal = do { s <- liftM2 (+) bang (mixFillM 8 (const pling))
->                     ; chain 4 r_allpass s } }
->   in audition . out 0 =<< tank =<< signal
-
-{ var r_allpass = { arg signal
-                  ; var r = { Rand.new(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 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
-             ; 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 l0 = LocalIn.ar(2) * 0.98
-             ; var l1 = OnePole.ar(l0, 0.33)
-             ; var l2 = Rotate2.ar(l1[0], l1[1], 0.23)
-             ; var l3 = AllpassN.ar(l2, 0.05, r1, 2)
-             ; var l4 = DelayN.ar(l3, 0.3, [0.17,0.23])
-             ; var l5 = AllpassN.ar(l4, 0.05, r2, 2)
-             ; var l6 = LeakDC.ar(l5, 0.995)
-             ; 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
-
-http://create.ucsb.edu/pipermail/sc-users/2004-April/009692.html
diff --git a/src/tank.scd b/src/tank.scd
new file mode 100644
--- /dev/null
+++ b/src/tank.scd
@@ -0,0 +1,28 @@
+{var r_allpass = {arg signal
+                 ;var r = {Rand.new(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 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
+            ;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 l0 = LocalIn.ar(2) * 0.98
+            ;var l1 = OnePole.ar(l0, 0.33)
+            ;var l2 = Rotate2.ar(l1[0], l1[1], 0.23)
+            ;var l3 = AllpassN.ar(l2, 0.05, r1, 2)
+            ;var l4 = DelayN.ar(l3, 0.3, [0.17,0.23])
+            ;var l5 = AllpassN.ar(l4, 0.05, r2, 2)
+            ;var l6 = LeakDC.ar(l5, 0.995)
+            ;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
diff --git a/src/tgb.hs b/src/tgb.hs
new file mode 100644
--- /dev/null
+++ b/src/tgb.hs
@@ -0,0 +1,40 @@
+-- tgb (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3.Monadic
+
+tgb :: UId m => UGen -> UGen -> m UGen
+tgb b d = do
+  let mkls bp t = envGen KR 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
+      pm_t l r du t = let le = mkls l du
+                          re = mkls r du
+                      in tRand le re t
+      wrp i = linLin i (-1) 1
+      pm_n rt l du = do let le = mkls l du
+                            re = mkls l du
+                        n <- whiteNoise rt
+                        return (wrp n le re)
+  gps <- pm_n AR [(0,400),(1,900)] d
+  let t = impulse AR gps 0
+      pm_f (l,r) = pm_t l r d t
+  du <- pm_f ([(0,0.005),(0.5,0.015),(1,0.005)]
+             ,[(0,0.009),(0.5,0.020),(1,0.009)])
+  pn <- pm_f ([(0,-1.0),(0.5,-0.5),(1,0.5)]
+             ,[(0,-0.5),(0.5,0.5),(1,1.0)])
+  rt <- pm_f ([(0,6),(0.5,12),(1,6)]
+             ,[(0,12),(0.5,12),(1,12)])
+  cs <- pm_f ([(0,0),(1,0.95)]
+             ,[(0,0),(1,1)])
+  am <- pm_f ([(0,0.25),(0.5,0.55),(1,0.15)]
+             ,[(0,0.5),(0.5,0.75),(1,0.25)])
+  let cs' = cs * bufDur KR b
+  return (tGrains 2 t b rt cs' du pn am 2)
+
+act :: Transport t => t -> IO ()
+act fd = do
+  let fn = "/home/rohan/data/audio/pf-c5.aif"
+  _ <- async fd (b_allocRead 10 fn 0 0)
+  play fd . out 0 =<< tgb 10 12
+
+main :: IO ()
+main = withSC3 act
diff --git a/src/tgb.lhs b/src/tgb.lhs
deleted file mode 100644
--- a/src/tgb.lhs
+++ /dev/null
@@ -1,33 +0,0 @@
-tgb (rd)
-
-> import Sound.SC3.Monadic
-> import System.Random
-
-> main =
->   let { mkls bp t = envGen kr 1 1 0 1 RemoveSynth (envCoord bp t 1 EnvLin)
->       ; pm_t l r d t = let { le = mkls l d
->                            ; re = mkls r d }
->                        in tRand le re t
->       ; wrp i l r = linLin i (-1) 1 l r
->       ; pm_n rt l d = let { le = mkls l d
->                           ; re = mkls l d }
->                       in do { n <- whiteNoise rt
->                             ; return (wrp n le re) }
->       ; gb b d = do { 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 }
->                       in do { du <- pm_f ([(0, 0.005), (0.5, 0.015), (1, 0.005)]
->                                          ,[(0, 0.009), (0.5, 0.020), (1, 0.009)])
->                             ; pn <- pm_f ([(0, -1.0), (0.5, -0.5), (1, 0.5)]
->                                          ,[(0, -0.5), (0.5, 0.5), (1, 1.0)])
->                             ; rt <- pm_f ([(0, 6), (0.5, 12), (1, 6)]
->                                          ,[(0, 12), (0.5, 12), (1, 12)])
->                             ; cs <- pm_f ([(0, 0), (1, 0.95)]
->                                          ,[(0, 0), (1, 1)])
->                             ; am <- pm_f ([(0, 0.25), (0.5, 0.55), (1, 0.15)]
->                                          ,[(0, 0.5), (0.5, 0.75), (1, 0.25)])
->                             ; let cs' = cs * (bufDur kr b)
->                               in return (tGrains 2 t b rt cs' du pn am 2) } }
->       ; fn = "/home/rohan/audio/text.snd" }
->   in withSC3 (\fd -> do { async fd (b_allocRead 10 fn 0 0)
->                         ; play fd . (out 0) =<< gb 10 12 })
diff --git a/src/tgr-rpr.hs b/src/tgr-rpr.hs
new file mode 100644
--- /dev/null
+++ b/src/tgr-rpr.hs
@@ -0,0 +1,65 @@
+-- tgr-rpr (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3.Monadic
+import System.Random
+
+dustR :: UId m => Rate -> UGen -> UGen -> m UGen
+dustR r lo hi = do
+  n1 <- dwhite 1 lo hi
+  n2 <- whiteNoise r
+  d <- dseq dinf n1
+  return (tDuty r d 0 DoNothing (abs n2) 1)
+
+rpr :: UId m => UGen -> UGen -> m UGen
+rpr n = tRand (in' 1 KR n) (in' 1 KR (n + 1))
+
+tgr_rpr :: (Functor m,UId m) => m UGen
+tgr_rpr = do
+  clk <- dustR AR (in' 1 KR 0) (in' 1 KR 1)
+  rat <- rpr 2 clk
+  dur <- rpr 4 clk
+  pos <- fmap (* bufDur KR 10) (rpr 8 clk)
+  pan <- rpr 10 clk
+  amp <- rpr 6 clk
+  return (tGrains 2 clk 10 rat pos dur pan amp 2)
+
+rrand :: Random a => a -> a -> IO a
+rrand l r = getStdRandom (randomR (l,r))
+
+preset :: [Double]
+preset =
+    [0.01,0.02
+    ,0.95,1.05
+    ,0.02,0.06
+    ,0.6,0.7
+    ,0.7,0.9
+    ,-1.0,1.0]
+
+rSet :: [(Double, Double)]
+rSet =
+    [(0.005,0.025),(0.05,0.25)
+    ,(0.75,0.95),(1.05,1.25)
+    ,(0.001,0.01),(0.02,0.04)
+    ,(0.4,0.5),(0.7,0.8)
+    ,(0.0,0.45),(0.55,1.0)
+    ,(-1.0,0.0),(0.0,1.0)]
+
+edit :: Transport t => t -> IO ()
+edit fd = do
+  s <- mapM (uncurry rrand) rSet
+  send fd (c_setn [(0,s)])
+  pauseThread 0.35
+
+run :: Transport t => t -> IO ()
+run fd = do
+  let sf = "/home/rohan/data/audio/pf-c5.snd"
+  _ <- async fd (b_allocRead 10 sf 0 0)
+  send fd (c_setn [(0,preset)])
+  play fd . out 0 =<< tgr_rpr
+  pauseThread 0.3
+  _ <- sequence (replicate 64 (edit fd))
+  reset fd
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/tgr-rpr.lhs b/src/tgr-rpr.lhs
deleted file mode 100644
--- a/src/tgr-rpr.lhs
+++ /dev/null
@@ -1,42 +0,0 @@
-tgr-rpr (rd)
-
-> import Sound.OpenSoundControl
-> import Sound.SC3.Monadic
-> import System.Random
-
-> main =
->   let { sf = "/home/rohan/audio/text.snd"
->       ; preset = [ 0.01, 0.02
->                  , 0.95, 1.05
->                  , 0.02, 0.06
->                  , 0.2, 0.3
->                  , 0.7, 0.9
->                  , -1.0, 1.0 ]
->       ; dustR r lo hi = do { n1 <- dwhite 1 lo hi
->                            ; n2 <- whiteNoise r
->                            ; d <- dseq dinf n1
->                            ; return (tDuty r d 0 DoNothing (abs n2) 1) }
->       ; rpr n t = tRand (in' 1 kr n) (in' 1 kr (n + 1)) t
->       ; rrand l r = getStdRandom (randomR (l, r))
->       ; rSet = [ (0.005, 0.025), (0.05, 0.25)
->                , (0.75,  0.95) , (1.05, 1.25)
->                , (0.001, 0.01) , (0.02, 0.04)
->                , (0.1,   0.2)  , (0.2, 0.4)
->                , (0.0,   0.45) , (0.55, 1.0)
->                , (-1.0,  0.0)  , (0.0, 1.0) ]
->       ; edit fd = do { s <- mapM (\(l,r) -> rrand l r) rSet
->                      ; send fd (c_setn [(0, s)])
->                      ; pauseThread 0.35 } }
->   in do { clk <- dustR ar (in' 1 kr 0) (in' 1 kr 1)
->         ; rat <- rpr 2 clk
->         ; dur <- rpr 4 clk
->         ; pos <- fmap (* (bufDur kr 10)) (rpr 8 clk)
->         ; pan <- rpr 10 clk
->         ; amp <- rpr 6 clk
->         ; withSC3 (\fd -> do { async fd (b_allocRead 10 sf 0 0)
->                              ; send fd (c_setn [(0, preset)])
->                              ; let o = tGrains 2 clk 10 rat pos dur pan amp 2
->                                in play fd (out 0 o)
->                              ; pauseThread 0.3
->                              ; sequence (replicate 16 (edit fd))
->                              ; reset fd }) }
diff --git a/src/tgrn.hs b/src/tgrn.hs
new file mode 100644
--- /dev/null
+++ b/src/tgrn.hs
@@ -0,0 +1,24 @@
+-- tgrn (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3.ID
+
+tgrn :: UGen -> UGen
+tgrn b =
+  let trate = mouseY' KR 2 120 Exponential 0.1
+      dur = 1.2 / trate
+      clk = impulse AR trate 0
+      pos = mouseX' KR 0 (bufDur KR b) Linear 0.1
+      pan = whiteNoise 'α' KR * 0.6
+      n = roundTo (whiteNoise 'β' KR * 3) 1
+      rate = shiftLeft 1.2 n
+  in tGrains 2 clk b rate pos dur pan 0.5 2
+
+run :: Transport t => t -> IO ()
+run fd = do
+  let fn = "/home/rohan/data/audio/pf-c5.snd"
+  _ <- async fd (b_allocRead 10 fn 0 0)
+  play fd (out 0 (tgrn 10))
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/tgrn.lhs b/src/tgrn.lhs
deleted file mode 100644
--- a/src/tgrn.lhs
+++ /dev/null
@@ -1,20 +0,0 @@
-tgrn (rd)
-ghci -e main tgrn.lhs
-C-cC-l C-cC-m
-
-> import Sound.SC3.ID
-
-> tgrn b =
->   let { trate = mouseY kr 2 120 Exponential 0.1
->       ; dur = 1.2 / trate
->       ; clk = impulse ar trate 0
->       ; pos = mouseX kr 0 (bufDur kr b) Linear 0.1
->       ; pan = whiteNoise 'α' kr * 0.6
->       ; n = roundE (whiteNoise 'β' kr * 3) 1
->       ; rate = shiftLeft 1.2 n }
->   in tGrains 2 clk b rate pos dur pan 0.25 2
-
-> main =
->   let fn = "/home/rohan/audio/text.snd"
->   in withSC3 (\fd -> do { async fd (b_allocRead 10 fn 0 0)
->                         ; audition (out 0 (tgrn 10)) })
diff --git a/src/theremin.hs b/src/theremin.hs
new file mode 100644
--- /dev/null
+++ b/src/theremin.hs
@@ -0,0 +1,18 @@
+-- theremin (jmcc)
+
+import Sound.SC3
+
+theremin :: UGen
+theremin =
+  let m = 7
+      detune = 0
+      x = mouseX' KR 0 0.6 Linear 0.2
+      y = mouseY' KR 4000 200 Exponential 0.8
+      f = y + detune
+      f' = f + f * sinOsc AR m 0 * 0.02
+      a = sinOsc AR f' 0 * x
+  in pan2 a 0 1
+
+main :: IO ()
+main = audition (out 0 theremin)
+
diff --git a/src/theremin.lhs b/src/theremin.lhs
deleted file mode 100644
--- a/src/theremin.lhs
+++ /dev/null
@@ -1,22 +0,0 @@
-theremin (jmcc)
-
-> import Sound.SC3
-
-> main =
->   let { m = 7
->       ; detune = 0
->       ; x = mouseX kr 0 0.9 Linear 0.2
->       ; y = mouseY kr 4000 200 Exponential 0.8
->       ; f = y + detune
->       ; f' = f + f * sinOsc ar m 0 * 0.02
->       ; a = sinOsc ar f' 0 * x }
->   in audition (out 0 (pan2 a 0 1))
-
-{ 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
diff --git a/src/theremin.scd b/src/theremin.scd
new file mode 100644
--- /dev/null
+++ b/src/theremin.scd
@@ -0,0 +1,8 @@
+{ 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
diff --git a/src/three-cpsw.hs b/src/three-cpsw.hs
new file mode 100644
--- /dev/null
+++ b/src/three-cpsw.hs
@@ -0,0 +1,18 @@
+-- three-cpsw (rd)
+
+import Sound.SC3.Monadic
+
+three_cpsw :: UId m => m UGen
+three_cpsw = do
+  t <- dust KR (mce2 12 18)
+  f0 <- tRand 1 64 t
+  f1 <- lfNoise0 KR f0
+  a <- tRand 0.0 0.5 t
+  dt <- tRand 0.975 1.025 t
+  dh <- tRand 0.750 0.7505 t
+  let f = f1 * mce2 9000 12000 + 9500
+      o = saw AR f + saw AR (f * dh) + saw AR (f * dt)
+  return (clip2 (o * a) 0.75)
+
+main :: IO ()
+main = audition . out 0 =<< three_cpsw
diff --git a/src/three-cpsw.lhs b/src/three-cpsw.lhs
deleted file mode 100644
--- a/src/three-cpsw.lhs
+++ /dev/null
@@ -1,24 +0,0 @@
-three-cpsw (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { t <- dust kr (mce2 12 18)
->      ; f0 <- tRand 1 64 t
->      ; f1 <- lfNoise0 kr f0
->      ; a <- tRand 0.0 0.5 t
->      ; dt <- tRand 0.975 1.025 t
->      ; dh <- tRand 0.750 0.7505 t
->      ; let { f = f1 * mce2 9000 12000 + 9500
->            ; o = saw ar f + saw ar (f * dh) + saw ar (f * dt) }
->        in audition (out 0 (clip2 (o * a) 0.75)) }
-
-{ var t = Dust.kr([12, 18])
-; var f0 = TRand.kr(1, 64, t)
-; var f1 = LFNoise0.kr(f0)
-; var a = TRand.kr(0.0, 0.5, t)
-; var dt = TRand.kr(0.975, 1.025, t)
-; 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
diff --git a/src/three-cpsw.scd b/src/three-cpsw.scd
new file mode 100644
--- /dev/null
+++ b/src/three-cpsw.scd
@@ -0,0 +1,9 @@
+{var t = Dust.kr([12,18])
+;var f0 = TRand.kr(1,64,t)
+;var f1 = LFNoise0.kr(f0)
+;var a = TRand.kr(0.0,0.5,t)
+;var dt = TRand.kr(0.975,1.025,t)
+;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
diff --git a/src/thx.hs b/src/thx.hs
new file mode 100644
--- /dev/null
+++ b/src/thx.hs
@@ -0,0 +1,47 @@
+-- thx (perry cook)
+-- http://ccrma-mail.stanford.edu/pipermail/stk/2007-January/000327.html
+
+import Sound.SC3
+import System.Random
+
+type R = Double
+
+rvb :: UGen -> R -> UGen
+rvb i rT =
+    let d = mce [0.0297,0.0371,0.0411,0.0437]
+        c = mix (combN i 0.05 d (constant rT) * 0.25)
+        f = (allpassN c 0.01 0.005 0.096835)
+    in allpassN f 0.01 0.0017 0.032924
+
+mk_env :: R -> R -> R -> R -> R -> R -> R -> EnvCurve -> UGen
+mk_env z0 t0 z1 t1 t2 z2 t3 c =
+    let z = map constant [z0,z1,z1,z2,z2]
+        t = map constant [t0,t1,t2,t3]
+        e = env z t [c,c,c] (-1.0) (-1.0)
+    in envGen KR 1 1 0 1 RemoveSynth e
+
+mk_node :: R -> R -> R -> UGen -> UGen
+mk_node t4 f0 f1 l =
+    let f = mk_env f0 t0 f0 t1 t2 f1 (t3 + t4 + t5 + t5) EnvLin
+        g = mk_env 0 t0 0.1 (t1 + t2 + t3) t4 0.0 (t5 + t5) EnvLin
+        s = saw AR f
+        t0 = 0.035
+        t1 = 0.2267573696
+        t2 = 2.2675736061
+        t3 = 6.8027210884
+        t5 = 1.75
+    in pan2 s l g
+
+thx :: UGen
+thx =
+    let t4 = 7.9365079365
+        s = sum (zipWith3 (mk_node t4) f0 f1 l)
+        n = 30
+        l = take n (randomRs (-1.0,1.0) (mkStdGen 1))
+        f = [29,87.5,116,175,233,350,524,880,1048,1760]
+        f0 = take n (randomRs (200.0,800.0) (mkStdGen 2))
+        f1 = take n (cycle f)
+    in rvb s t4
+
+main :: IO ()
+main = audition (out 0 thx)
diff --git a/src/thx.lhs b/src/thx.lhs
deleted file mode 100644
--- a/src/thx.lhs
+++ /dev/null
@@ -1,38 +0,0 @@
-thx (perry cook)
-
-> import Sound.SC3
-> import System.Random
-
-> main =
->   let { rvb i rT 
->           = let { d = mce [0.0297, 0.0371, 0.0411, 0.0437]
->                 ; c = mix (combN i 0.05 d rT * 0.25)
->                 ; f = (allpassN c 0.01 0.005 0.096835) }
->             in allpassN f 0.01 0.0017 0.032924
->       ; mk_env z0 t0 z1 t1 t2 z2 t3 c
->           = let { z = [z0, z1, z1, z2, z2]
->                 ; t = [t0, t1, t2, t3]
->                 ; e = env z t [c, c, c] (-1.0) (-1.0) }
->             in envGen KR 1 1 0 1 RemoveSynth e
->       ; mk_node t4 f0 f1 l 
->           = let { f = mk_env f0 t0 f0 t1 t2 f1 (t3 + t4 + t5 + t5) EnvLin
->                 ; g = mk_env 0 t0 0.1 (t1 + t2 + t3) t4 0.0 (t5 + t5) EnvLin
->                 ; s = saw AR f
->                 ; t0 = 0.035
->                 ; t1 = 0.2267573696
->                 ; t2 = 2.2675736061
->                 ; t3 = 6.8027210884
->                 ; t5 = 1.75 }
->             in pan2 s l g
->       ; thx 
->           = let { s = foldl1 (+) (zipWith3 (mk_node t4) f0 f1 l)
->                 ; t4 = 7.9365079365
->                 ; n = 30
->                 ; l = take n (randomRs (-1.0, 1.0) (mkStdGen 1))
->                 ; f = [29, 87.5, 116, 175, 233, 350, 524, 880, 1048, 1760]
->                 ; f0 = take n (randomRs (200.0, 800.0) (mkStdGen 2))
->                 ; f1 = take n (cycle f) }
->             in out 0 (rvb (mce [s]) t4) }
->   in audition thx
-
-http://ccrma-mail.stanford.edu/pipermail/stk/2007-January/000327.html
diff --git a/src/tipnso.hs b/src/tipnso.hs
new file mode 100644
--- /dev/null
+++ b/src/tipnso.hs
@@ -0,0 +1,19 @@
+-- tipnso (rd)
+
+import Sound.SC3.ID
+
+tipnso :: UGen
+tipnso =
+  let x = mouseX' KR 1 32 Linear 0.1
+      t = impulse AR x 0
+      n1 = tIRand 'a' 16 72 t
+      n2 = tIRand 'a' 0 1 t
+      n3 = pinkNoise 'a' AR
+      e = decay2 t 0.01 (mce2 0.1 0.15)
+      f = midiCPS (n1 + 36 + (12 * n2))
+      s = sinOsc AR f 0 * e
+      b = bpf (n3 * e) (36 + midiCPS n1) (175 / midiCPS n1)
+  in (s + b) * mce2 0.15 0.1
+
+main :: IO ()
+main = audition (out 0 tipnso)
diff --git a/src/tipnso.lhs b/src/tipnso.lhs
deleted file mode 100644
--- a/src/tipnso.lhs
+++ /dev/null
@@ -1,17 +0,0 @@
-tipnso (rd)
-
-> import Sound.SC3.Monadic
-> import qualified Sound.SC3.ID as I
-
-> main =
->   let { x = linLin (I.lfNoise0 'a' KR 3) (-1) 1 1 32
->    {- ; x = mouseX kr 1 32 Linear 0.1 -}
->       ; t = impulse ar x 0 }
->   in do { n1 <- tiRand 16 72 t
->         ; n2 <- tiRand 0 1 t
->         ; n3 <- pinkNoise ar
->         ; let { e = decay2 t 0.01 (mce2 0.1 0.15)
->               ; f = midiCPS (n1 + 36 + (12 * n2))
->               ; s = sinOsc ar f 0 * e
->               ; b = bpf (n3 * e) (36 + midiCPS n1) (175 / (midiCPS n1)) }
->           in audition (out 0 ((s + b) * mce2 0.15 0.1)) }
diff --git a/src/tr-out.hs b/src/tr-out.hs
new file mode 100644
--- /dev/null
+++ b/src/tr-out.hs
@@ -0,0 +1,32 @@
+-- tr-out (rd)
+
+import Sound.OpenSoundControl
+import Sound.SC3.Monadic
+
+tr_nd :: UId m => UGen -> m (UGen,UGen)
+tr_nd n = do
+  t <- dust KR 1.6
+  r1 <- tRand 0 6 t
+  r2 <- tRand 0 6 t
+  r3 <- tRand 0 6 t
+  let f = midiCPS (bufRdN 1 KR 0 r1 NoLoop)
+      p = bufRdN 1 KR 1 r2 NoLoop
+      a = bufRdN 1 KR 2 r3 NoLoop
+  return (pan2 (sinOsc AR f 0) p a
+         ,sendTrig t n (f / 660))
+
+tr_out :: UId m => m UGen
+tr_out = do
+  ns <- mapM tr_nd [1..4]
+  let o = sum (map fst ns)
+  return (mrg (o : map snd ns))
+
+act :: Transport t => t -> IO ()
+act fd = do
+  _ <- async fd (b_alloc_setn1 0 0 [60,62,64,65,67,69])
+  _ <- async fd (b_alloc_setn1 1 0 [-1,-0.5,0,0.25,0.75,1.0])
+  _ <- async fd (b_alloc_setn1 2 0 [0.01,0.05,0.1,0.15,0.25,0.35])
+  play fd . out 0 =<< tr_out
+
+main :: IO ()
+main = withSC3 act
diff --git a/src/tr-out.lhs b/src/tr-out.lhs
deleted file mode 100644
--- a/src/tr-out.lhs
+++ /dev/null
@@ -1,23 +0,0 @@
-tr-out (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let node n = do { t <- dust kr 1.6
->                   ; r1 <- tRand 0 6 t
->                   ; r2 <- tRand 0 6 t
->                   ; r3 <- tRand 0 6 t
->                   ; let { f = midiCPS (bufRdN 1 kr 0 r1 NoLoop)
->                         ; p = bufRdN 1 kr 1 r2 NoLoop
->                         ; a = bufRdN 1 kr 2 r3 NoLoop }
->                     in return ( pan2 (sinOsc ar f 0) p a
->                               , sendTrig t n (f / 660) ) }
->   in withSC3 (\fd -> do { async fd (b_alloc 0 6 1)
->                         ; send fd (b_setn1 0 0 [60, 62, 64, 65, 67, 69])
->                         ; async fd (b_alloc 1 6 1)
->                         ; send fd (b_setn1 1 0 [-1, -0.5, 0, 0.25, 0.75, 1.0])
->                         ; async fd (b_alloc 2 6 1)
->                         ; send fd (b_setn1 2 0 [0.01, 0.05, 0.1, 0.15, 0.25, 0.35])
->                         ; ns <- mapM node [1..4]
->                         ; let o = sum (map fst ns)
->                           in play fd (out 0 (mrg (o : map snd ns))) })
diff --git a/src/train.hs b/src/train.hs
new file mode 100644
--- /dev/null
+++ b/src/train.hs
@@ -0,0 +1,34 @@
+-- train (th.list at gmail.com)
+-- http://www.create.ucsb.edu/pipermail/sc-users/2007-August/035957.html
+
+import Sound.SC3.ID
+
+steam :: UGen -> UGen -> UGen -> UGen
+steam time n1 n2 =
+    let piston = lfSaw AR (xLine AR 1 7 time DoNothing) 0
+        air = lpf (n1 * piston + n2 * piston) 5000
+        e = envGen AR 1 1 0 1 DoNothing (envSine time 9)
+    in bpf air 600 (1 + e)
+
+whistle :: UGen -> UGen -> UGen
+whistle time n3 =
+    let f = [800,600,1200,990]
+        s = klankSpec f [1,1,1,1] [1,1,1,1]
+        t = [0,0,1,1,0,0,1,1,0,0,1,0]
+        l = [2,0,0.2,0,0.2,0,0.8,0,4,0,3]
+        d = env t l (repeat EnvLin) 0 0
+        e = envGen AR 1 1 0 (time/10) DoNothing d
+    in klank (n3 * 0.004) 1 0 1 s * e
+
+train :: UGen
+train =
+    let time = 24
+        loc = let e = env [-0.8,0.8] [time + 2] [EnvSin,EnvSin] 0 0
+              in envGen AR 1 1 0 1 RemoveSynth e
+        n1 = whiteNoise 'a' AR
+        n2 = pinkNoise 'b' AR
+        n3 = whiteNoise 'c' AR
+    in pan2 (steam time n1 n2 + whistle time n3) loc 1
+
+main :: IO ()
+main =  audition (out 0 train)
diff --git a/src/train.lhs b/src/train.lhs
deleted file mode 100644
--- a/src/train.lhs
+++ /dev/null
@@ -1,25 +0,0 @@
-train (th.list at gmail.com)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { time = 24
->       ; steam n1 n2 = let { piston = lfSaw AR (xLine AR 1 7 time DoNothing) 0
->                           ; air = lpf (n1 * piston + n2 * piston) 5000 
->                           ; e = envGen AR 1 1 0 1 DoNothing (envSine time 9) }
->                       in bpf air 600 (1 + e)
->       ; whistle n3 = let { f = [800, 600, 1200, 990]
->                          ; s = klankSpec f [1, 1, 1, 1] [1, 1, 1, 1]
->                          ; t = [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0]
->                          ; l = [2, 0, 0.2, 0, 0.2, 0, 0.8, 0, 4, 0, 3]
->                          ; d = env t l (repeat EnvLin) 0 0
->                          ; e = envGen AR 1 1 0 (time/10) DoNothing d }
->                      in klank (n3 * 0.004) 1 0 1 s * e
->       ; loc = let e = env [-0.8, 0.8] [time + 2] [EnvSin, EnvSin] 0 0
->               in envGen AR 1 1 0 1 RemoveSynth e }
->   in do { n1 <- whiteNoise AR
->         ; n2 <- pinkNoise AR
->         ; n3 <- whiteNoise AR
->         ; audition (out 0 (pan2 (steam n1 n2 + whistle n3) loc 1)) }
-
-http://www.create.ucsb.edu/pipermail/sc-users/2007-August/035957.html
diff --git a/src/tremulate-m.hs b/src/tremulate-m.hs
new file mode 100644
--- /dev/null
+++ b/src/tremulate-m.hs
@@ -0,0 +1,27 @@
+-- tremulate (jmcc)
+
+import Sound.SC3.Monadic
+import Sound.SC3.Lang.Control.OverlapTexture
+
+tremulate :: UId m => m UGen
+tremulate = do
+  f <- rand 500 900
+  let o = fSinOsc AR (f * mce [1,1.2,1.5,1.8]) 0
+  r <- rand 30 90
+  n <- clone 4 (lfNoise2 KR r)
+  let a = max 0 (n * 0.1)
+  l <- clone 4 (rand (-1) 1)
+  return (mix (pan2 o l a))
+
+tremulate_pp :: UGen -> UGen
+tremulate_pp i = combN i 0.1 0.1 1
+
+main :: IO ()
+main = do
+  t <- tremulate
+  xfadeTextureU_pp (2,0.5,maxBound) t 2 tremulate_pp
+
+{-
+audition . out 0 =<< tremulate
+Sound.SC3.UGen.Dot.draw =<< tremulate
+-}
diff --git a/src/tremulate.hs b/src/tremulate.hs
new file mode 100644
--- /dev/null
+++ b/src/tremulate.hs
@@ -0,0 +1,24 @@
+-- tremulate (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+tremulate :: UGen
+tremulate =
+    let f = rand 'a' 500 900
+        o = fSinOsc AR (f * mce [1,1.2,1.5,1.8]) 0
+        r = uprotect 'a' (rand 'a' 30 90)
+        a = max 0 (uclone 'a' 4 (lfNoise2 'a' KR r) * 0.1)
+        l = udup 4 (rand 'a' (-1) 1)
+    in mix (pan2 o l a)
+
+tremulate_pp :: UGen -> UGen
+tremulate_pp i = combN i 0.1 0.1 1
+
+main :: IO ()
+main = xfadeTextureU_pp (2,0.5,maxBound) tremulate 2 tremulate_pp
+
+{-
+audition (out 0 tremulate)
+Sound.SC3.UGen.Dot.draw tremulate
+-}
diff --git a/src/tremulate.scd b/src/tremulate.scd
new file mode 100644
--- /dev/null
+++ b/src/tremulate.scd
@@ -0,0 +1,7 @@
+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)})
diff --git a/src/trkl.lhs b/src/trkl.lhs
deleted file mode 100644
--- a/src/trkl.lhs
+++ /dev/null
@@ -1,27 +0,0 @@
-trkl (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let trkl d ul fu dy la fy =
->           let { tf = xLine kr 1 ul d RemoveSynth
->               ; st = impulse ar (tf * 8) 0
->               ; t = impulse ar tf 0 }
->           in do { r0 <- rand (-1) 1
->                 ; r1 <- rand (-1) 1
->                 ; r2 <- tRand 0.05 1.0 t
->                 ; r3 <- tExpRand 0.0 0.25 st 
->                 ; fh <- tRand 1.75 2.25 t 
->                 ; let { a = dbAmp (line kr 12 la d RemoveSynth)
->                       ; f = xLine kr fu 900 d RemoveSynth
->                       ; p = line kr r0 r1 d RemoveSynth
->                       ; o1 = mix (ringz (decay2 t 0.01 dy) (mce2 f (f * fh)) fy)
->                       ; o2 = mix (saw ar (mce2 f (f * fh))) }
->                  in return (pan2 (o1 + o2 * decay2 t 0.1 r2 * r3) p a) }
->   in 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
->         ; audition . (out 0) =<< trkl d ul fu dy la fy }
diff --git a/src/trmlo.hs b/src/trmlo.hs
new file mode 100644
--- /dev/null
+++ b/src/trmlo.hs
@@ -0,0 +1,52 @@
+-- trmlo (rd)
+
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+import Sound.SC3.Lang.Pattern.ID {- hsc3-lang -}
+
+trmlo :: UGen
+trmlo =
+    let mWrp i l r = linLin i (-1) 1 (midiCPS l) (midiCPS r)
+        mWrp1 i m = mWrp i m (m + 1)
+        mWrpN i m n = mWrp i m (m + n)
+        o1 = let f = 5
+                 d = 3
+                 s = envSine d 0.1
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = 65
+                 m = sinOsc KR f 0
+             in pan2 (sinOsc AR (mWrp1 m n) 0) m e
+        o2 = let f = iRand 5 9
+                 d = iRand 5 9
+                 s = envSine d (rand 0.1 0.2)
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = iRand 69 72
+                 m = sinOsc KR f 0
+             in pan2 (sinOsc AR (mWrp1 m n) 0) m e
+        o3 = let f = iRand 5 9
+                 d = iRand 9 12
+                 s = envSine d (rand 0.1 0.2)
+                 e = envGen KR 1 1 0 1 DoNothing s
+                 n = iRand 69 72
+                 m = sinOsc KR f 0
+                 l = line KR 0 (iRand 1 5) d DoNothing
+             in pan2 (blip AR (mWrp1 m (n + l)) (linLin m (-1) 1 1 2)) m e
+        o4 = let f = iRand 5 18
+                 d = iRand 12 15
+                 s = envSine d (rand 0.1 0.2)
+                 e = envGen KR 1 5e-2 0 1 DoNothing s
+                 n = iRand 69 72
+                 m = sinOsc KR f 0
+                 l = line KR 0 (iRand 1 5) d RemoveSynth
+                 fr = mWrpN m (n + l) (iRand 1 5)
+             in pan2 (blip AR fr (linLin m (-1) 1 1 (iRand 2 24))) m e
+    in o1 + o2 + o3 + o4
+
+main :: IO ()
+main = do
+  let s = synthdef "trmlo" (out 0 trmlo)
+  audition (s,pbind [("dur",pxrand 'a' [0.25,0.5,1,2,4] inf)])
+
+{-
+audition (out 0 trmlo)
+-}
diff --git a/src/tsort.lhs b/src/tsort.lhs
--- a/src/tsort.lhs
+++ b/src/tsort.lhs
@@ -3,7 +3,7 @@
 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'.  
+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
@@ -11,11 +11,12 @@
 
 > import Sound.SC3
 
+> main :: IO ()
 > main =
 >   let { n = 122
 >       ; c = envCoord [(0,0), (0.15, 1), (6, 0)] 1 1 EnvLin
->       ; e = envGen kr 1 1 0 1 RemoveSynth c
->       ; f o = sinOsc ar (440 + constant o) 0 * 0.001
+>       ; e = envGen KR 1 1 0 1 RemoveSynth c
+>       ; f o = sinOsc AR (440 + constant o) 0 * 0.001
 >       ; s = mixFill n f }
 >   in audition (out 0 (s * e))
 
diff --git a/src/uplink.hs b/src/uplink.hs
new file mode 100644
--- /dev/null
+++ b/src/uplink.hs
@@ -0,0 +1,22 @@
+-- uplink (jmcc)
+
+import Sound.SC3.ID
+import Sound.SC3.Lang.Control.OverlapTexture
+
+randz :: ID a => a -> UGen -> UGen
+randz e = rand e 0
+
+uplink :: UGen
+uplink =
+    let r = randz
+        p0 = lfPulse KR (r 'α' 20) 0 (r 'α' 1)
+	p1 = lfPulse KR (r 'β' 4) 0 (r 'β' 1) * r 'β' 8000 + r 'β' 2000
+        f = mix (uclone 'γ' 2 (p0 * p1))
+    in pan2 (lfPulse AR f 0 0.5 * 0.04) (rand 'δ' (-0.8) 0.8) 1
+
+main :: IO ()
+main = overlapTextureU (4,1,5,maxBound) uplink
+
+{-
+Sound.SC3.UGen.Dot.draw uplink
+-}
diff --git a/src/vla-addtn-sharc.hs b/src/vla-addtn-sharc.hs
new file mode 100644
--- /dev/null
+++ b/src/vla-addtn-sharc.hs
@@ -0,0 +1,76 @@
+-- vla-adttn-sharc (rd)
+
+import Data.List
+import Sound.Analysis.SHARC
+import Sound.OpenSoundControl
+import Sound.SC3.ID
+import Sound.SC3.Lang.Pattern.ID
+
+type R = Double
+type R3 = (R,R,R)
+
+spectra :: [Instrument] -> String -> Int -> [R3]
+spectra sh nm j =
+  let Just i = find ((== nm) . instrument_id) sh
+  in note_spectra (note_normalise (notes i !! j))
+
+vla :: FilePath -> IO [R3]
+vla fn = do
+  Right sh <- read_sharc fn
+  return (spectra sh "viola_vibrato" 0)
+
+unp :: R3 -> [R]
+unp (_,i,j) = [i,j]
+
+vla_prep :: [R3] -> [R]
+vla_prep = concatMap unp
+
+-- fr = freq,dt = detune
+vla_partial :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+vla_partial fr rise fall dt n =
+    let m = n * 2
+        ampl = bufRdN 1 KR 0 m NoLoop
+        ph = bufRdN 1 KR 0 (m + 1) NoLoop
+        o = let dt' = lfNoise1 'a' KR 1 * dt + 1.0
+            in fSinOsc AR (fr * (n + 1) * dt') ph
+        e = linen (impulse KR 0 0)
+                  (rise * rand 'a' 0.75 1.25)
+                  ampl
+                  (fall * rand 'b' 0.75 1.25)
+                  DoNothing
+    in o * e
+
+vla_plyr :: UGen -> UGen
+vla_plyr n =
+    let a = control KR "ampl" 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 :: [(String,P Double)]
+pattern =
+    [("loc",pwhite 'a' (-1) 1 inf)
+    ,("ampl",pwhite 'b' 0.05 0.1 inf)
+    ,("degree",prand 'c' [0,1,2,3,4,5,6,7,8] inf)
+    ,("octave",prand 'd' [2,3] inf)
+    ,("dt",pwhite 'e' 0.001 0.005 inf)
+    ,("rise",pwhite 'f' 1 2 inf)
+    ,("fall",pwhite 'g' 4 7 inf)
+    ,("dur",prand 'h' [3,5] inf)]
+
+act :: Transport t => FilePath -> t -> IO ()
+act fn fd = do
+  v <- vla fn
+  _ <- async fd (b_alloc_setn1 0 0 (vla_prep v))
+  play fd (plyr36,pbind pattern)
+
+main :: IO ()
+main = withSC3 (act "/home/rohan/data/sharc/sharc.xml")
diff --git a/src/vla-addtn.hs b/src/vla-addtn.hs
new file mode 100644
--- /dev/null
+++ b/src/vla-addtn.hs
@@ -0,0 +1,146 @@
+-- vla-adttn (rd)
+
+--import Sound.Analysis.SHARC
+import Sound.OpenSoundControl
+import Sound.SC3.ID
+import Sound.SC3.Lang.Pattern.ID
+
+type R = Double
+type R2 = (R,R)
+
+vla :: [R2]
+vla =
+    [(-49.43290,1.99165)
+    ,(0.00000,1.09187)
+    ,(-2.53835,-2.73340)
+    ,(-8.55317,0.73919)
+    ,(-7.58952,-0.75267)
+    ,(-8.48353,1.70372)
+    ,(-13.92700,1.64759)
+    ,(-39.93130,-2.25142)
+    ,(-19.87800,-3.12024)
+    ,(-34.19660,-1.58899)
+    ,(-18.82040,-1.39847)
+    ,(-21.22520,2.04672)
+    ,(-21.33070,-0.14754)
+    ,(-31.08620,2.05345)
+    ,(-42.51880,-0.55890)
+    ,(-41.19730,0.23896)
+    ,(-46.80570,1.71249)
+    ,(-47.17510,2.37942)
+    ,(-37.97520,-0.83005)
+    ,(-38.32750,-2.49358)
+    ,(-44.79280,-1.16301)
+    ,(-49.11850,1.33082)
+    ,(-45.26480,-0.45146)
+    ,(-46.27050,-0.15578)
+    ,(-63.14360,-3.13979)
+    ,(-44.27590,-2.59826)
+    ,(-40.19680,-2.16540)
+    ,(-56.83330,0.48774)
+    ,(-56.62160,-0.84155)
+    ,(-55.76370,1.59076)
+    ,(-59.36050,-0.99090)
+    ,(-55.42520,-0.58264)
+    ,(-64.99020,0.00110)
+    ,(-63.45910,1.55117)
+    ,(-64.77610,2.68228)
+    ,(-68.27080,-1.82120)
+    ,(-71.90240,1.80545)
+    ,(-79.13910,2.99369)
+    ,(-64.94640,-3.12388)
+    ,(-59.41810,1.84679)
+    ,(-86.33570,1.81713)
+    ,(-88.53500,1.01834)
+    ,(-64.17470,-1.52081)
+    ,(-61.24430,1.45757)
+    ,(-69.88980,-0.47708)
+    ,(-65.39420,0.82882)
+    ,(-73.84740,0.41623)
+    ,(-72.26330,0.31856)
+    ,(-73.88560,2.64035)
+    ,(-70.86610,-0.43802)
+    ,(-67.86130,-0.43389)
+    ,(-80.76020,-2.50016)
+    ,(-66.44520,2.26219)
+    ,(-83.49810,2.57825)
+    ,(-66.01220,-2.08254)
+    ,(-65.30220,-2.83644)
+    ,(-74.05780,0.21665)
+    ,(-72.69060,-2.78729)
+    ,(-75.49700,2.96210)
+    ,(-69.45200,0.72293)
+    ,(-75.36160,0.14687)
+    ,(-70.21110,1.42155)
+    ,(-79.34420,0.76044)
+    ,(-81.56200,2.16997)
+    ,(-84.20670,3.11095)
+    ,(-74.40450,-2.98094)
+    ,(-76.67820,1.96564)
+    ,(-79.95980,2.68183)
+    ,(-77.31420,-1.92260)
+    ,(-74.60450,-1.89189)
+    ,(-67.98670,1.99457)
+    ,(-80.17960,-1.95013)
+    ,(-79.44400,-2.70955)
+    ,(-81.89010,3.12971)
+    ,(-80.18220,1.76888)
+    ,(-82.94420,2.77531)]
+
+p_prep :: R2 -> R2
+p_prep (a,p) = (dbAmp a,p)
+
+unp :: R2 -> [R]
+unp (i,j) = [i,j]
+
+vla_prep :: [R]
+vla_prep = concatMap (unp . p_prep) vla
+
+-- fr = freq,dt = detune
+vla_partial :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen
+vla_partial fr rise fall dt n =
+    let m = n * 2
+        ampl = bufRdN 1 KR 0 m NoLoop
+        ph = bufRdN 1 KR 0 (m + 1) NoLoop
+        o = let dt' = lfNoise1 'a' KR 1 * dt + 1.0
+            in fSinOsc AR (fr * (n + 1) * dt') ph
+        e = linen (impulse KR 0 0)
+                  (rise * rand 'a' 0.75 1.25)
+                  ampl
+                  (fall * rand 'b' 0.75 1.25)
+                  DoNothing
+    in o * e
+
+vla_plyr :: UGen -> UGen
+vla_plyr n =
+    let a = control KR "ampl" 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 :: [(String,P Double)]
+pattern =
+    [("loc",pwhite 'a' (-1) 1 inf)
+    ,("ampl",pwhite 'b' 0.05 0.1 inf)
+    ,("degree",prand 'c' [0,1,2,3,4,5,6,7,8] inf)
+    ,("octave",prand 'd' [2,3] inf)
+    ,("dt",pwhite 'e' 0.001 0.005 inf)
+    ,("rise",pwhite 'f' 1 2 inf)
+    ,("fall",pwhite 'g' 4 7 inf)
+    ,("dur",5)]
+
+act :: Transport t => t -> IO ()
+act fd = do
+  _ <- async fd (b_alloc_setn1 0 0 vla_prep)
+  play fd (plyr36,pbind pattern)
+
+main :: IO ()
+main = withSC3 act
diff --git a/src/vlc-distrtn.lhs b/src/vlc-distrtn.lhs
deleted file mode 100644
--- a/src/vlc-distrtn.lhs
+++ /dev/null
@@ -1,133 +0,0 @@
-vlc-distrtn (rd)
-caution - audio feedback graph
-
-> import Sound.OpenSoundControl
-> import Sound.SC3.Monadic
-> import System.Random
-
-> main =
->   let { rrand l r = getStdRandom (randomR (l, r))
->       ; choose l = return . (l !!) =<< rrand 0 (length l - 1)
->       ; prep (ampl, phase) = [dbAmp ampl, phase]
->       ; vlc = [ (0.00000, 1.85550)
->               , (-9.92383, -0.65147)
->               , (-8.74205, -0.74728)
->               , (-3.70464, -1.39796)
->               , (-9.43435, -1.14812)
->               , (-25.84790, -1.03375)
->               , (-16.99500, -2.41724)
->               , (-29.17040, 2.67419)
->               , (-26.82750, -1.61810)
->               , (-18.59870, 1.34568)
->               , (-19.72160, -2.85972)
->               , (-29.43650, 0.54603)
->               , (-23.63120, -1.47813)
->               , (-28.20100, -1.98501)
->               , (-41.20700, -1.11808)
->               , (-33.14310, -2.19369)
->               , (-31.54010, 1.43134)
->               , (-47.62740, 1.28571)
->               , (-28.79740, -1.03754)
->               , (-34.97950, 0.37740)
->               , (-39.05770, -0.57557)
->               , (-38.84060, 2.34836)
->               , (-40.18090, -0.96978)
->               , (-47.32150, 2.14768)
->               , (-45.49290, 2.52100)
->               , (-40.57100, -1.39905)
->               , (-47.19530, -2.23994)
->               , (-50.80920, 2.97853)
->               , (-48.13640, 0.46815)
->               , (-58.56890, -1.01821)
->               , (-57.81200, -3.08971)
->               , (-47.96870, -0.48657)
->               , (-43.96100, -0.10311)
->               , (-50.49810, -2.80977)
->               , (-50.61640, -0.17212)
->               , (-60.64640, -1.02433)
->               , (-58.03410, 1.06921)
->               , (-55.46390, -2.04501)
->               , (-54.31000, -1.53512)
->               , (-52.78670, -1.49875)
->               , (-57.99380, 0.17697)
->               , (-56.76990, 2.28241)
->               , (-54.17450, -1.85553)
->               , (-62.58220, -2.40971)
->               , (-59.86460, 1.04782)
->               , (-61.58570, 1.56183)
->               , (-52.62080, 1.68360)
->               , (-49.82940, -1.11019)
->               , (-56.18160, -0.78538)
->               , (-57.73320, -2.23918)
->               , (-49.87560, 3.09604)
->               , (-51.00100, -0.53762)
->               , (-59.71530, 0.99017)
->               , (-65.73280, 2.43855)
->               , (-73.01270, -0.90664)
->               , (-61.81450, -0.53346)
->               , (-65.58980, 1.51174)
->               , (-75.94320, -3.06072)
->               , (-65.22210, -1.49937)
->               , (-70.79970, -2.96199)
->               , (-64.72450, 1.78172)
->               , (-73.24130, 0.26939)
->               , (-66.17110, -0.23305)
->               , (-61.32910, -3.12592)
->               , (-66.98180, 0.64700)
->               , (-65.23060, -2.94395)
->               , (-70.13430, 1.29805)
->               , (-68.43470, -1.35906)
->               , (-71.33000, -2.71582)
->               , (-86.90080, 2.11646)
->               , (-74.97450, 2.76118)
->               , (-68.02520, 0.94979)
->               , (-67.32960, 3.05994)
->               , (-67.32140, -2.79905)
->               , (-68.22010, -2.33831) ]
->       ; partial b i freq detune fall n =
->           do { n0 <- lfNoise1 kr 1
->              ; n1 <- rand 0.75 1.25
->              ; let { m = n * 2
->                    ; ampl = bufRdN 1 kr b m NoLoop
->                    ; f = freq * (n + 1) * (n0 * detune + 1) }
->                in return (ringz i f (fall * n1) * ampl) }
->       ; plyr n =
->           let { ctl j k = control kr j k
->               ; 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
->               ; i = soundIn 0 * iamp }
->           in do { s <- mapM (partial buf i freq detune fall) [0 .. n-1]
->                 ; return (out 0 (clip2 (pan2 (sum s) loc ampl) 0.1)) }
->       ; degree_to_key degree scale steps =
->           let scale_n = length scale
->           in (steps * (degree `div` scale_n)) + (scale !! (degree `mod` scale_n))
->       ; getCps b =
->           do { b_ <- choose b
->              ; d <- choose [0 .. 8]
->              ; let k = degree_to_key d [0, 2, 3, 5, 7, 8, 10] 12
->                in return (midiCPS (b_ + realToFrac k)) }
->       ; pattern fd =
->           do { f <- getCps [24, 36, 48, 55, 60]
->              ; ia <- rrand 0.05 0.75
->              ; l <- rrand (-1) 1
->              ; a <- rrand 0.05 0.1
->              ; d <- rrand 0.001 0.005
->              ; fl <- rrand 1 7
->              ; send fd (n_set 1002 [("freq", f)
->                                    ,("iamp", ia)
->                                    ,("buf", 0)
->                                    ,("loc", l)
->                                    ,("ampl", a)
->                                    ,("detune", d)
->                                    ,("fall", fl)])
->              ; pauseThread =<< choose [0.25, 0.5, 0.75, 1.5] } }
->   in withSC3 (\fd -> do { async fd (b_alloc 0 (length vlc * 2) 1)
->                         ; send fd (b_setn1 0 0 (concatMap prep vlc))
->                         ; async fd . d_recv . synthdef "plyr48" =<< plyr 48
->                         ; send fd (s_new "plyr48" 1002 AddToTail 1 [])
->                         ; sequence (replicate 32 (pattern fd)) })
diff --git a/src/voscil.hs b/src/voscil.hs
new file mode 100644
--- /dev/null
+++ b/src/voscil.hs
@@ -0,0 +1,38 @@
+-- voscil (rd)
+
+import Sound.OpenSoundControl {- hosc -}
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.Unsafe {- hsc3-unsafe -}
+import System.Random {- random -}
+
+voscil :: Real a => a -> UGen
+voscil b =
+  let lfn = lfNoise0 KR
+      hb = (constant b - 1) / 2
+      rt = 6
+      f = 600
+      v = vOsc AR (lfn rt * hb + hb) (f * 2) 0
+      o = let bf = lfn rt * 40 + 600
+              nh = lfn rt * 16 + 24
+          in blip AR bf nh * (lfn rt * 0.1 + 0.1)
+      p = pan2 (v + o) (lfn rt) (lfn rt * 0.5 + 0.5)
+      w = vOsc AR (lfSaw KR (1 / rt) 0 * hb + hb) f 0
+      q = pan2 w (lfn rt) (lfn rt * 0.5 + 0.5)
+  in p + q
+
+run :: Transport t => t -> IO ()
+run fd = do
+  let rrand l r = getStdRandom (randomR (l,r))
+      bn = 8192 * 4
+      b = 32
+      r_set i =
+          do m <- rrand 2 512
+             j <- sequence (replicate m (rrand 0 bn))
+             k <- sequence (replicate m (rrand (-1) 1))
+             _ <- async fd (b_alloc i bn 1)
+             send fd (b_set i (zip j k))
+  mapM_ r_set [0 .. (b - 1)]
+  play fd (out 0 (voscil b))
+
+main :: IO ()
+main = withSC3 run
diff --git a/src/waveset.hs b/src/waveset.hs
--- a/src/waveset.hs
+++ b/src/waveset.hs
@@ -1,6 +1,5 @@
 {- A simple waveset synthesiser (rd) -}
 
-import Control.Monad
 import qualified Data.Array as A {- array -}
 import Data.List
 import qualified Sound.File.NeXT as F {- hsc3-sf -}
@@ -18,22 +17,22 @@
 -- | Add t to timestamp.
 offset :: Double -> OSC -> OSC
 offset t (Bundle (UTCr t0) m) = Bundle (UTCr (t + t0)) m
-offset _ _ = undefined
+offset _ _ = error "offset:non-bundle"
 
 -- | Play non-empty set of osc bundles.
 play_set :: Transport t => t -> [OSC] -> IO ()
-play_set _ [] = undefined
+play_set _ [] = error "play_set:empty"
 play_set fd (x:xs) = do
   let (Bundle (UTCr t) _) = x
   pauseThreadUntil (t - latency)
-  mapM_ (\e -> send fd e) (x:xs)
+  mapM_ (send fd) (x:xs)
 
 -- | Play grouped score.
 play_sets :: Transport t => t -> [[OSC]] -> IO ()
 play_sets _ [] = return ()
 play_sets fd s = do
   t <- utcr
-  mapM_ (play_set fd) (map (\g -> map (offset t) g) s)
+  mapM_ (play_set fd . map (offset t)) s
 
 -- | Split l into chunks of at most n elements.
 form_sets :: Int -> [a] -> [[a]]
@@ -127,8 +126,9 @@
 --   analysis, generate & play scores.
 run_waveset :: Transport t => t -> String -> IO ()
 run_waveset fd fn = do
-  async fd (d_recv (synthdef "waveset" waveset))
-  async fd (b_allocRead 10 fn 0 0)
+  _ <- async fd (d_recv (synthdef "waveset" waveset))
+  _ <-
+      async fd (b_allocRead 10 fn 0 0)
   (hdr, cs) <- F.read fn
   let nc = F.channelCount hdr
       nf = F.frameCount hdr
@@ -147,9 +147,9 @@
 main = do
   a <- getArgs
   case a of
-    [fn] -> withSC3 (\fd -> run_waveset fd fn)
+    [fn] -> withSC3 (`run_waveset` fn)
     _ -> error "audio file?"
 
 {--
-withSC3 (\fd -> run_waveset fd "/home/rohan/audio/text.snd")
+withSC3 (\fd -> run_waveset fd "/home/rohan/data/audio/pf-c5.snd")
 --}
diff --git a/src/what-was-i-thinking.hs b/src/what-was-i-thinking.hs
new file mode 100644
--- /dev/null
+++ b/src/what-was-i-thinking.hs
@@ -0,0 +1,24 @@
+-- what was i thinking? (jmcc)
+
+import Sound.SC3.Monadic
+
+what_was_i_thinking :: UId m => m UGen
+what_was_i_thinking = do
+  n0 <- lfNoise1 KR 0.2
+  n1 <- lfNoise1 KR 0.157
+  let p = pulse AR f (n1 * 0.4 + 0.5) * 0.04
+      i = lfPulse AR 0.1 0 0.05 * impulse AR 8 0 * 500
+      d = decay i 2
+      f = max (sinOsc KR 4 0 + 80) d
+      z = rlpf p (n0 * 2000 + 2400) 0.2
+      c x = do r <- rand 0 0.3
+               n <- lfNoise1 KR r
+               return (combL x 0.06 (n * 0.025 + 0.035) 1)
+      y = z * 0.6
+  z0 <- clone 2 (c y)
+  z1 <- clone 2 (c y)
+  return (z + mce [mix z0,mix z1])
+
+main :: IO ()
+main = audition . out 0 =<< what_was_i_thinking
+
diff --git a/src/what-was-i-thinking.lhs b/src/what-was-i-thinking.lhs
deleted file mode 100644
--- a/src/what-was-i-thinking.lhs
+++ /dev/null
@@ -1,34 +0,0 @@
-what was i thinking? (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   do { n0 <- lfNoise1 kr 0.2
->      ; n1 <- lfNoise1 kr 0.157
->      ; let { p = pulse ar f (n1 * 0.4 + 0.5) * 0.04
->            ; i = lfPulse ar 0.1 0 0.05 * impulse ar 8 0 * 500
->            ; d = decay i 2
->            ; f = max (sinOsc kr 4 0 + 80) d
->            ; z = rlpf p (n0 * 2000 + 2400) 0.2
->            ; c x = do { r <- rand 0 0.3
->                       ; n <- lfNoise1 kr r
->                       ; return (combL x 0.06 (n * 0.025 + 0.035) 1) }
->            ; y = z * 0.6 }
->        in do { z0 <- clone 2 (c y)
->              ; z1 <- clone 2 (c y)
->              ; audition (out 0 (z + mce [mix z0, mix z1])) } }
-
-{ 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
-; var d = Decay.ar(i, 2)
-; var f = max(SinOsc.kr(4, 0) + 80, d)
-; 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 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
diff --git a/src/what-was-i-thinking.scd b/src/what-was-i-thinking.scd
new file mode 100644
--- /dev/null
+++ b/src/what-was-i-thinking.scd
@@ -0,0 +1,14 @@
+{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
+;var d = Decay.ar(i,2)
+;var f = max(SinOsc.kr(4,0) + 80,d)
+;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 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
diff --git a/src/why-supercollider.hs b/src/why-supercollider.hs
new file mode 100644
--- /dev/null
+++ b/src/why-supercollider.hs
@@ -0,0 +1,21 @@
+-- why supercollider (jmcc)
+
+import Sound.SC3.ID
+
+why_supercollider :: UGen
+why_supercollider =
+    let r = resonz (dust 'a' AR 0.2 * 50) (rand 'a' 200 3200) 0.003
+        s = mix (uclone 'a' 10 r)
+        z = delayN s 0.048 0.048
+        c = combL z 0.1 (lfNoise1 'a' KR (rand 'a' 0 0.1) * 0.04 + 0.05) 15
+        y = mix (uclone 'a' 7 c)
+        f i = allpassN i 0.050 (udup 2 (rand 'a' 0 0.05)) 1
+        x = useq 'a' 4 f y
+    in out 0 (s + 0.2 * x)
+
+main :: IO ()
+main = audition why_supercollider
+
+{-
+Sound.SC3.UGen.Dot.draw why_supercollider
+-}
diff --git a/src/why-supercollider.scd b/src/why-supercollider.scd
new file mode 100644
--- /dev/null
+++ b/src/why-supercollider.scd
@@ -0,0 +1,8 @@
+{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)
+;var c = {CombL.ar(z,0.1,LFNoise1.kr(0.1.rand,0.04,0.05),15)}
+;var y = Mix.ar(Array.fill(7,c))
+;4.do({x = AllpassN.ar(y,0.050,[0.050.rand,0.050.rand],1)})
+;s+(0.2*x)}.play
+
diff --git a/src/wial.hs b/src/wial.hs
new file mode 100644
--- /dev/null
+++ b/src/wial.hs
@@ -0,0 +1,26 @@
+-- wial (rd)
+
+import Sound.SC3.Monadic
+
+wial :: (Functor m,UId m) => m UGen
+wial = do
+  let pls c d f = do let t = pulseDivider c d 0
+                         e = decay2 t 0.05 0.75
+                         o = sinOsc AR (toggleFF t * f + f * 2) 0
+                     n0 <- tIRand 0 1 t
+                     return (o * e * n0 * 0.5)
+      smpl f = [(4,6,f,0.75)
+               ,(2,6,f * 2,0.75)
+               ,(1,2,f * 16,0.025)
+               ,(1,5,f * 64,0.005)
+               ,(1,4,f * 128,0.035)
+               ,(1,3,f * 256,0.15)
+               ,(2,3,f * 512,0.35)]
+      plss c (d0,d1,f,a) = fmap (* a) (pls c (mce2 d0 d1) f)
+      clk = impulse AR 16 0
+  n0 <- dust KR 2
+  f <- tWChoose n0 (mce2 (20 * 0.66) 20) (mce2 0.25 0.75) 0
+  return.sum =<< mapM (plss clk) (smpl f)
+
+main :: IO ()
+main = audition . out 0 =<< wial
diff --git a/src/wial.lhs b/src/wial.lhs
deleted file mode 100644
--- a/src/wial.lhs
+++ /dev/null
@@ -1,22 +0,0 @@
-wial (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { pls c d f = let { t = pulseDivider c d 0
->                         ; e = decay2 t 0.05 0.75
->                         ; o = sinOsc ar (toggleFF t * f + f * 2) 0 }
->                      in do { n0 <- tiRand 0 1 t
->                            ; return (o * e * n0 * 0.5) }
->       ; smpl f = [ (4, 6, f      , 0.75)
->                  , (2, 6, f *   2, 0.75)
->                  , (1, 2, f *  16, 0.025)
->                  , (1, 5, f *  64, 0.005)
->                  , (1, 4, f * 128, 0.035)
->                  , (1, 3, f * 256, 0.15)
->                  , (2, 3, f * 512, 0.35) ]
->       ; plss c (d0, d1, f, a) = fmap (* a) (pls c (mce2 d0 d1) f)
->       ; clk = impulse ar 16 0 }
->   in do { n0 <- dust kr 2
->         ; f <- twChoose n0 (mce2 (20 * 0.66) 20) (mce2 0.25 0.75) 0
->         ; audition . out 0 . sum =<< mapM (plss clk) (smpl f) }
diff --git a/src/wind-metals-m.hs b/src/wind-metals-m.hs
new file mode 100644
--- /dev/null
+++ b/src/wind-metals-m.hs
@@ -0,0 +1,26 @@
+-- wind metals (jmcc)
+
+import Sound.SC3.Lang.Control.OverlapTexture
+import Sound.SC3.Monadic
+
+wind_metals :: UId m => m UGen
+wind_metals = do
+  let n = 6
+  base <- expRand 60 4000
+  rng <- rand 500 8000
+  n0 <- clone 2 (brownNoise AR)
+  r0 <- expRand 0.125 0.5
+  n1 <- lfNoise1 KR r0
+  f <- sequence (replicate n (rand base (base + rng)))
+  dt <- sequence (replicate n (rand 0.1 2))
+  let exc = n0 * 0.007 * max 0 (n1 * 0.75 + 0.25)
+      k = klankSpec f (replicate n 1) dt
+      s = klank exc 1 0 1 k
+  return (softClip (s * 0.1))
+
+main :: IO ()
+main = overlapTextureU (2,5,12,maxBound) =<< wind_metals
+
+{-
+audition . out 0 =<< wind_metals
+-}
diff --git a/src/wind-metals.lhs b/src/wind-metals.lhs
deleted file mode 100644
--- a/src/wind-metals.lhs
+++ /dev/null
@@ -1,29 +0,0 @@
-wind metals (jmcc)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let n = 6
->   in do { base <- expRand 60 4000
->         ; range <- 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 + range)))
->         ; dt <- sequence (replicate n (rand 0.1 2))
->         ; let { exc = n0 * 0.007 * max 0 (n1 * 0.75 + 0.25)
->               ; k = klankSpec f (replicate n 1) dt
->               ; s = klank exc 1 0 1 k }
->           in audition (out 0 (softClip (s * 0.1))) }
-
-{ var n = 6
-; var base = ExpRand.new(60, 4000)
-; var range = Rand.new(500.0, 8000.0)
-; var n0 = BrownNoise.ar([0.007, 0.007])
-; var r0 = ExpRand.new(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, range) + base })
-; var dt = Array.fill(n, { Rand.new(0.1, 2.0) })
-; var s = Klank.ar(`[f, nil, dt], exc)
-; Out.ar(0, (s * 0.1).softclip) }.play
diff --git a/src/wind-metals.scd b/src/wind-metals.scd
new file mode 100644
--- /dev/null
+++ b/src/wind-metals.scd
@@ -0,0 +1,11 @@
+{var n = 6
+;var base = ExpRand.new(60,4000)
+;var rng = Rand.new(500.0,8000.0)
+;var n0 = BrownNoise.ar([0.007,0.007])
+;var r0 = ExpRand.new(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 s = Klank.ar(`[f,nil,dt],exc)
+;Out.ar(0,(s * 0.1).softclip)}.play
diff --git a/src/xy-interference-m.hs b/src/xy-interference-m.hs
new file mode 100644
--- /dev/null
+++ b/src/xy-interference-m.hs
@@ -0,0 +1,16 @@
+-- xy-interference-m (rd)
+
+import Sound.SC3.Monadic
+
+xy_interference :: UId m => m UGen
+xy_interference = do
+  let x = mouseX' KR 20 22000 Linear (mce2 0.005 0.025)
+      y = mouseY' KR 20 22000 Linear (mce2 0.005 0.075)
+      nd = do n <- lfNoise0 KR (mce2 5 9)
+              let a = sinOsc AR (x + n) 0
+                  b = sinOsc AR y 0
+              return (a * b)
+  return.sum =<< sequence (replicate 3 nd)
+
+main :: IO ()
+main = audition . out 0 =<< xy_interference
diff --git a/src/xy-interference-m.lhs b/src/xy-interference-m.lhs
deleted file mode 100644
--- a/src/xy-interference-m.lhs
+++ /dev/null
@@ -1,20 +0,0 @@
-xy-interference-m (rd)
-
-> import Sound.SC3.Monadic
-
-> main =
->   let { x = mouseX KR 20 22000 Linear (mce2 0.005 0.025)
->       ; y = mouseY KR 20 22000 Linear (mce2 0.005 0.075)
->       ; nd = do { n <- lfNoise0 KR (mce2 5 9)
->                 ; let { a = sinOsc AR (x + n) 0
->                       ; b = sinOsc AR y 0 }
->                   in return (a * b) } }
->   in audition . (out 0) . sum =<< sequence (replicate 3 nd)
-
-{ var x = MouseX.kr(20, 22000, 'linear', [0.005, 0.025])
-; var y = MouseY.kr(20, 22000, 'linear', [0.005, 0.075])
-; var nd = { var n = LFNoise0.kr([5, 9])
-           ; var a = SinOsc.ar(x + n, 0)
-           ; var b = SinOsc.ar(y, 0)
-           ; a * b }
-; Out.ar(0, Mix.fill(3, nd)) }.play
diff --git a/src/xy-interference.hs b/src/xy-interference.hs
new file mode 100644
--- /dev/null
+++ b/src/xy-interference.hs
@@ -0,0 +1,16 @@
+-- xy-interference (rd)
+
+import Sound.SC3.ID
+
+xy_interference :: UGen
+xy_interference =
+  let x = mouseX' KR 20 22000 Linear (mce2 0.005 0.025)
+      y = mouseY' KR 20 22000 Linear (mce2 0.005 0.075)
+      nd = let n = lfNoise0 'a' KR (mce2 5 9)
+               a = sinOsc AR (x + n) 0
+               b = sinOsc AR y 0
+           in a * b
+  in mix (uclone 'a' 3 nd)
+
+main :: IO ()
+main = audition (out 0 xy_interference)
diff --git a/src/xy-interference.lhs b/src/xy-interference.lhs
deleted file mode 100644
--- a/src/xy-interference.lhs
+++ /dev/null
@@ -1,20 +0,0 @@
-xy-interference (rd)
-
-> import Sound.SC3.ID
-
-> main =
->   let { x = mouseX KR 20 22000 Linear (mce2 0.005 0.025)
->       ; y = mouseY KR 20 22000 Linear (mce2 0.005 0.075)
->       ; nd k = let { n = lfNoise0 k KR (mce2 5 9)
->                    ; a = sinOsc AR (x + n) 0
->                    ; b = sinOsc AR y 0 }
->                in a * b }
->   in audition (out 0 (sum (map nd ['α'..'γ'])))
-
-{ var x = MouseX.kr(20, 22000, 'linear', [0.005, 0.025])
-; var y = MouseY.kr(20, 22000, 'linear', [0.005, 0.075])
-; var nd = { var n = LFNoise0.kr([5, 9])
-           ; var a = SinOsc.ar(x + n, 0)
-           ; var b = SinOsc.ar(y, 0)
-           ; a * b }
-; Out.ar(0, Mix.fill(3, nd)) }.play
diff --git a/src/xy-interference.scd b/src/xy-interference.scd
new file mode 100644
--- /dev/null
+++ b/src/xy-interference.scd
@@ -0,0 +1,7 @@
+{var x = MouseX.kr(20,22000,'linear',[0.005,0.025])
+;var y = MouseY.kr(20,22000,'linear',[0.005,0.075])
+;var nd = {var n = LFNoise0.kr([5,9])
+          ;var a = SinOsc.ar(x + n,0)
+          ;var b = SinOsc.ar(y,0)
+          ;a * b}
+;Out.ar(0,Mix.fill(3,nd))}.play
