diff --git a/README b/README
--- a/README
+++ b/README
@@ -17,5 +17,5 @@
 analog-bubbles.hs, where explicit bus numbering is
 required.
 
-(c) rohan drape and others, 2008-2010
+(c) rohan drape and others, 2008-2011
     gpl, http://gnu.org/copyleft/
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+import Distribution.Simple
+main = defaultMain
diff --git a/Setup.lhs b/Setup.lhs
deleted file mode 100644
--- a/Setup.lhs
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env runhaskell
-> import Distribution.Simple
-> main = defaultMain
diff --git a/Sound/SC3/UGen/Record/Blip.hs b/Sound/SC3/UGen/Record/Blip.hs
--- a/Sound/SC3/UGen/Record/Blip.hs
+++ b/Sound/SC3/UGen/Record/Blip.hs
@@ -2,15 +2,17 @@
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data Blip = Blip {
+  rate :: S.Rate,
   freq :: S.UGen,
   numharm :: S.UGen
   } deriving (Show)
 blip :: Blip
 blip = Blip {
+  rate = S.AR,
   freq = 440.0,
   numharm = 200.0
   }
 mkBlip :: Blip -> S.UGen
-mkBlip (Blip  a' b') = S.mkOsc S.AR "Blip" [a',b'] 1
+mkBlip (Blip r a' b') = S.mkOsc r "Blip" [a',b'] 1
 instance Make Blip where
   ugen = mkBlip
diff --git a/Sound/SC3/UGen/Record/Changed.hs b/Sound/SC3/UGen/Record/Changed.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Changed.hs
@@ -0,0 +1,18 @@
+module Sound.SC3.UGen.Record.Changed where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Changed = Changed {
+  rate :: S.Rate,
+  input :: S.UGen,
+  threshold :: S.UGen
+  } deriving (Show)
+changed :: Changed
+changed = Changed {
+  rate = S.AR,
+  input = 0.0,
+  threshold = 0.0
+  }
+mkChanged :: Changed -> S.UGen
+mkChanged (Changed r a' b') = S.mkOsc r "Changed" [a',b'] 1
+instance Make Changed where
+  ugen = mkChanged
diff --git a/Sound/SC3/UGen/Record/Convolution2.hs b/Sound/SC3/UGen/Record/Convolution2.hs
--- a/Sound/SC3/UGen/Record/Convolution2.hs
+++ b/Sound/SC3/UGen/Record/Convolution2.hs
@@ -12,7 +12,7 @@
   input = 0.0,
   kernel = 0.0,
   trigger = 0.0,
-  framesize = 0.0
+  framesize = 2048.0
   }
 mkConvolution2 :: Convolution2 -> S.UGen
 mkConvolution2 (Convolution2  a' b' c' d') = S.mkOsc S.AR "Convolution2" [a',b',c',d'] 1
diff --git a/Sound/SC3/UGen/Record/Convolution2L.hs b/Sound/SC3/UGen/Record/Convolution2L.hs
--- a/Sound/SC3/UGen/Record/Convolution2L.hs
+++ b/Sound/SC3/UGen/Record/Convolution2L.hs
@@ -13,7 +13,7 @@
   input = 0.0,
   kernel = 0.0,
   trigger = 0.0,
-  framesize = 0.0,
+  framesize = 2048.0,
   crossfade = 1.0
   }
 mkConvolution2L :: Convolution2L -> S.UGen
diff --git a/Sound/SC3/UGen/Record/Convolution3.hs b/Sound/SC3/UGen/Record/Convolution3.hs
--- a/Sound/SC3/UGen/Record/Convolution3.hs
+++ b/Sound/SC3/UGen/Record/Convolution3.hs
@@ -14,7 +14,7 @@
   input = 0.0,
   kernel = 0.0,
   trigger = 0.0,
-  framesize = 0.0
+  framesize = 2048.0
   }
 mkConvolution3 :: Convolution3 -> S.UGen
 mkConvolution3 (Convolution3 r a' b' c' d') = S.mkOsc r "Convolution3" [a',b',c',d'] 1
diff --git a/Sound/SC3/UGen/Record/DelTapRd.hs b/Sound/SC3/UGen/Record/DelTapRd.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DelTapRd.hs
@@ -0,0 +1,22 @@
+module Sound.SC3.UGen.Record.DelTapRd where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DelTapRd = DelTapRd {
+  rate :: S.Rate,
+  buffer :: S.UGen,
+  phase :: S.UGen,
+  delTime :: S.UGen,
+  interp :: S.UGen
+  } deriving (Show)
+delTapRd :: DelTapRd
+delTapRd = DelTapRd {
+  rate = S.AR,
+  buffer = 0.0,
+  phase = 0.0,
+  delTime = 0.0,
+  interp = 1.0
+  }
+mkDelTapRd :: DelTapRd -> S.UGen
+mkDelTapRd (DelTapRd r a' b' c' d') = S.mkOsc r "DelTapRd" [a',b',c',d'] 1
+instance Make DelTapRd where
+  ugen = mkDelTapRd
diff --git a/Sound/SC3/UGen/Record/DelTapWr.hs b/Sound/SC3/UGen/Record/DelTapWr.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DelTapWr.hs
@@ -0,0 +1,18 @@
+module Sound.SC3.UGen.Record.DelTapWr where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DelTapWr = DelTapWr {
+  rate :: S.Rate,
+  buffer :: S.UGen,
+  input :: S.UGen
+  } deriving (Show)
+delTapWr :: DelTapWr
+delTapWr = DelTapWr {
+  rate = S.AR,
+  buffer = 0.0,
+  input = 0.0
+  }
+mkDelTapWr :: DelTapWr -> S.UGen
+mkDelTapWr (DelTapWr r a' b') = S.mkOsc r "DelTapWr" [a',b'] 1
+instance Make DelTapWr where
+  ugen = mkDelTapWr
diff --git a/Sound/SC3/UGen/Record/Dreset.hs b/Sound/SC3/UGen/Record/Dreset.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Dreset.hs
@@ -0,0 +1,16 @@
+module Sound.SC3.UGen.Record.Dreset where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Dreset = Dreset {
+  input :: S.UGen,
+  reset :: S.UGen
+  } deriving (Show)
+dreset :: Dreset
+dreset = Dreset {
+  input = 0.0,
+  reset = 0.0
+  }
+mkDreset :: Dreset -> S.UGen
+mkDreset (Dreset  a' b') = S.mkOsc S.DR "Dreset" [a',b'] 1
+instance Make Dreset where
+  ugen = mkDreset
diff --git a/Sound/SC3/UGen/Record/Dunique.hs b/Sound/SC3/UGen/Record/Dunique.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Dunique.hs
@@ -0,0 +1,14 @@
+module Sound.SC3.UGen.Record.Dunique where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Dunique = Dunique {
+  source :: S.UGen
+  } deriving (Show)
+dunique :: Dunique
+dunique = Dunique {
+  source = 0.0
+  }
+mkDunique :: Dunique -> S.UGen
+mkDunique (Dunique  a') = S.mkOsc S.AR "Dunique" [a'] 1
+instance Make Dunique where
+  ugen = mkDunique
diff --git a/Sound/SC3/UGen/Record/Dwrand.hs b/Sound/SC3/UGen/Record/Dwrand.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Dwrand.hs
@@ -0,0 +1,18 @@
+module Sound.SC3.UGen.Record.Dwrand where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Dwrand = Dwrand {
+  list :: S.UGen,
+  weights :: S.UGen,
+  repeats :: S.UGen
+  } deriving (Show)
+dwrand :: Dwrand
+dwrand = Dwrand {
+  list = 0.0,
+  weights = 0.0,
+  repeats = 1.0
+  }
+mkDwrand :: Dwrand -> S.UGen
+mkDwrand (Dwrand  a' b' c') = S.mkOsc S.DR "Dwrand" [a',b',c'] 1
+instance Make Dwrand where
+  ugen = mkDwrand
diff --git a/Sound/SC3/UGen/Record/DynKlang.hs b/Sound/SC3/UGen/Record/DynKlang.hs
--- a/Sound/SC3/UGen/Record/DynKlang.hs
+++ b/Sound/SC3/UGen/Record/DynKlang.hs
@@ -2,17 +2,19 @@
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data DynKlang = DynKlang {
+  rate :: S.Rate,
   specificationsArrayRef :: S.UGen,
   freqscale :: S.UGen,
   freqoffset :: S.UGen
   } deriving (Show)
 dynKlang :: DynKlang
 dynKlang = DynKlang {
+  rate = S.AR,
   specificationsArrayRef = 0.0,
   freqscale = 1.0,
   freqoffset = 0.0
   }
 mkDynKlang :: DynKlang -> S.UGen
-mkDynKlang (DynKlang  a' b' c') = S.mkOsc S.AR "DynKlang" [a',b',c'] 1
+mkDynKlang (DynKlang r a' b' c') = S.mkOsc r "DynKlang" [a',b',c'] 1
 instance Make DynKlang where
   ugen = mkDynKlang
diff --git a/Sound/SC3/UGen/Record/DynKlank.hs b/Sound/SC3/UGen/Record/DynKlank.hs
--- a/Sound/SC3/UGen/Record/DynKlank.hs
+++ b/Sound/SC3/UGen/Record/DynKlank.hs
@@ -2,6 +2,7 @@
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data DynKlank = DynKlank {
+  rate :: S.Rate,
   specificationsArrayRef :: S.UGen,
   input :: S.UGen,
   freqscale :: S.UGen,
@@ -10,6 +11,7 @@
   } deriving (Show)
 dynKlank :: DynKlank
 dynKlank = DynKlank {
+  rate = S.AR,
   specificationsArrayRef = 0.0,
   input = 0.0,
   freqscale = 1.0,
@@ -17,6 +19,6 @@
   decayscale = 1.0
   }
 mkDynKlank :: DynKlank -> S.UGen
-mkDynKlank (DynKlank  a' b' c' d' e') = S.mkOsc S.AR "DynKlank" [a',b',c',d',e'] 1
+mkDynKlank (DynKlank r a' b' c' d' e') = S.mkOsc r "DynKlank" [a',b',c',d',e'] 1
 instance Make DynKlank where
   ugen = mkDynKlank
diff --git a/Sound/SC3/UGen/Record/GrainBuf.hs b/Sound/SC3/UGen/Record/GrainBuf.hs
--- a/Sound/SC3/UGen/Record/GrainBuf.hs
+++ b/Sound/SC3/UGen/Record/GrainBuf.hs
@@ -10,7 +10,8 @@
   pos :: S.UGen,
   interp :: S.UGen,
   pan :: S.UGen,
-  envbufnum :: S.UGen
+  envbufnum :: S.UGen,
+  maxGrains :: S.UGen
   } deriving (Show)
 grainBuf :: GrainBuf
 grainBuf = GrainBuf {
@@ -22,9 +23,10 @@
   pos = 0.0,
   interp = 2.0,
   pan = 0.0,
-  envbufnum = -1.0
+  envbufnum = -1.0,
+  maxGrains = 512.0
   }
 mkGrainBuf :: GrainBuf -> S.UGen
-mkGrainBuf (GrainBuf  a' b' c' d' e' f' g' h' i') = S.mkOsc S.AR "GrainBuf" [a',b',c',d',e',f',g',h',i'] 1
+mkGrainBuf (GrainBuf  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "GrainBuf" [a',b',c',d',e',f',g',h',i',j'] 1
 instance Make GrainBuf where
   ugen = mkGrainBuf
diff --git a/Sound/SC3/UGen/Record/GrainFM.hs b/Sound/SC3/UGen/Record/GrainFM.hs
--- a/Sound/SC3/UGen/Record/GrainFM.hs
+++ b/Sound/SC3/UGen/Record/GrainFM.hs
@@ -9,7 +9,8 @@
   modfreq :: S.UGen,
   index :: S.UGen,
   pan :: S.UGen,
-  envbufnum :: S.UGen
+  envbufnum :: S.UGen,
+  maxGrains :: S.UGen
   } deriving (Show)
 grainFM :: GrainFM
 grainFM = GrainFM {
@@ -20,9 +21,10 @@
   modfreq = 200.0,
   index = 1.0,
   pan = 0.0,
-  envbufnum = -1.0
+  envbufnum = -1.0,
+  maxGrains = 512.0
   }
 mkGrainFM :: GrainFM -> S.UGen
-mkGrainFM (GrainFM  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "GrainFM" [a',b',c',d',e',f',g',h'] 1
+mkGrainFM (GrainFM  a' b' c' d' e' f' g' h' i') = S.mkOsc S.AR "GrainFM" [a',b',c',d',e',f',g',h',i'] 1
 instance Make GrainFM where
   ugen = mkGrainFM
diff --git a/Sound/SC3/UGen/Record/GrainIn.hs b/Sound/SC3/UGen/Record/GrainIn.hs
--- a/Sound/SC3/UGen/Record/GrainIn.hs
+++ b/Sound/SC3/UGen/Record/GrainIn.hs
@@ -7,7 +7,8 @@
   dur :: S.UGen,
   input :: S.UGen,
   pan :: S.UGen,
-  envbufnum :: S.UGen
+  envbufnum :: S.UGen,
+  maxGrains :: S.UGen
   } deriving (Show)
 grainIn :: GrainIn
 grainIn = GrainIn {
@@ -16,9 +17,10 @@
   dur = 1.0,
   input = 0.0,
   pan = 0.0,
-  envbufnum = -1.0
+  envbufnum = -1.0,
+  maxGrains = 512.0
   }
 mkGrainIn :: GrainIn -> S.UGen
-mkGrainIn (GrainIn  a' b' c' d' e' f') = S.mkOsc S.AR "GrainIn" [a',b',c',d',e',f'] 1
+mkGrainIn (GrainIn  a' b' c' d' e' f' g') = S.mkOsc S.AR "GrainIn" [a',b',c',d',e',f',g'] 1
 instance Make GrainIn where
   ugen = mkGrainIn
diff --git a/Sound/SC3/UGen/Record/GrainSin.hs b/Sound/SC3/UGen/Record/GrainSin.hs
--- a/Sound/SC3/UGen/Record/GrainSin.hs
+++ b/Sound/SC3/UGen/Record/GrainSin.hs
@@ -7,7 +7,8 @@
   dur :: S.UGen,
   freq :: S.UGen,
   pan :: S.UGen,
-  envbufnum :: S.UGen
+  envbufnum :: S.UGen,
+  maxGrains :: S.UGen
   } deriving (Show)
 grainSin :: GrainSin
 grainSin = GrainSin {
@@ -16,9 +17,10 @@
   dur = 1.0,
   freq = 440.0,
   pan = 0.0,
-  envbufnum = -1.0
+  envbufnum = -1.0,
+  maxGrains = 512.0
   }
 mkGrainSin :: GrainSin -> S.UGen
-mkGrainSin (GrainSin  a' b' c' d' e' f') = S.mkOsc S.AR "GrainSin" [a',b',c',d',e',f'] 1
+mkGrainSin (GrainSin  a' b' c' d' e' f' g') = S.mkOsc S.AR "GrainSin" [a',b',c',d',e',f',g'] 1
 instance Make GrainSin where
   ugen = mkGrainSin
diff --git a/Sound/SC3/UGen/Record/IndexL.hs b/Sound/SC3/UGen/Record/IndexL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/IndexL.hs
@@ -0,0 +1,18 @@
+module Sound.SC3.UGen.Record.IndexL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data IndexL = IndexL {
+  rate :: S.Rate,
+  bufnum :: S.UGen,
+  input :: S.UGen
+  } deriving (Show)
+indexL :: IndexL
+indexL = IndexL {
+  rate = S.AR,
+  bufnum = 0.0,
+  input = 0.0
+  }
+mkIndexL :: IndexL -> S.UGen
+mkIndexL (IndexL r a' b') = S.mkOsc r "IndexL" [a',b'] 1
+instance Make IndexL where
+  ugen = mkIndexL
diff --git a/Sound/SC3/UGen/Record/LocalIn.hs b/Sound/SC3/UGen/Record/LocalIn.hs
--- a/Sound/SC3/UGen/Record/LocalIn.hs
+++ b/Sound/SC3/UGen/Record/LocalIn.hs
@@ -3,14 +3,16 @@
 import Sound.SC3.UGen.Record
 data LocalIn = LocalIn {
   rate :: S.Rate,
-  numChannels :: S.UGen
+  numChannels :: S.UGen,
+  default_ :: S.UGen
   } deriving (Show)
 localIn :: LocalIn
 localIn = LocalIn {
   rate = S.AR,
-  numChannels = 1.0
+  numChannels = 1.0,
+  default_ = 0.0
   }
 mkLocalIn :: LocalIn -> S.UGen
-mkLocalIn (LocalIn r a') = S.mkOsc r "LocalIn" [a'] 1
+mkLocalIn (LocalIn r a' b') = S.mkOsc r "LocalIn" [a',b'] 1
 instance Make LocalIn where
   ugen = mkLocalIn
diff --git a/Sound/SC3/UGen/Record/Peak.hs b/Sound/SC3/UGen/Record/Peak.hs
--- a/Sound/SC3/UGen/Record/Peak.hs
+++ b/Sound/SC3/UGen/Record/Peak.hs
@@ -3,14 +3,14 @@
 import Sound.SC3.UGen.Record
 data Peak = Peak {
   rate :: S.Rate,
-  trig :: S.UGen,
-  reset :: S.UGen
+  input :: S.UGen,
+  trig :: S.UGen
   } deriving (Show)
 peak :: Peak
 peak = Peak {
   rate = S.AR,
-  trig = 0.0,
-  reset = 0.0
+  input = 0.0,
+  trig = 0.0
   }
 mkPeak :: Peak -> S.UGen
 mkPeak (Peak r a' b') = S.mkOsc r "Peak" [a',b'] 1
diff --git a/Sound/SC3/UGen/Record/Pitch.hs b/Sound/SC3/UGen/Record/Pitch.hs
--- a/Sound/SC3/UGen/Record/Pitch.hs
+++ b/Sound/SC3/UGen/Record/Pitch.hs
@@ -11,7 +11,8 @@
   median :: S.UGen,
   ampThreshold :: S.UGen,
   peakThreshold :: S.UGen,
-  downSample :: S.UGen
+  downSample :: S.UGen,
+  clar :: S.UGen
   } deriving (Show)
 pitch :: Pitch
 pitch = Pitch {
@@ -24,9 +25,10 @@
   median = 1.0,
   ampThreshold = 0.01,
   peakThreshold = 0.5,
-  downSample = 1.0
+  downSample = 1.0,
+  clar = 0.0
   }
 mkPitch :: Pitch -> S.UGen
-mkPitch (Pitch  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.KR "Pitch" [a',b',c',d',e',f',g',h',i',j'] 2
+mkPitch (Pitch  a' b' c' d' e' f' g' h' i' j' k') = S.mkOsc S.KR "Pitch" [a',b',c',d',e',f',g',h',i',j',k'] 2
 instance Make Pitch where
   ugen = mkPitch
diff --git a/Sound/SC3/UGen/Record/Pulse.hs b/Sound/SC3/UGen/Record/Pulse.hs
--- a/Sound/SC3/UGen/Record/Pulse.hs
+++ b/Sound/SC3/UGen/Record/Pulse.hs
@@ -2,15 +2,17 @@
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data Pulse = Pulse {
+  rate :: S.Rate,
   freq :: S.UGen,
   width :: S.UGen
   } deriving (Show)
 pulse :: Pulse
 pulse = Pulse {
+  rate = S.AR,
   freq = 440.0,
   width = 0.5
   }
 mkPulse :: Pulse -> S.UGen
-mkPulse (Pulse  a' b') = S.mkOsc S.AR "Pulse" [a',b'] 1
+mkPulse (Pulse r a' b') = S.mkOsc r "Pulse" [a',b'] 1
 instance Make Pulse where
   ugen = mkPulse
diff --git a/Sound/SC3/UGen/Record/RunningMax.hs b/Sound/SC3/UGen/Record/RunningMax.hs
--- a/Sound/SC3/UGen/Record/RunningMax.hs
+++ b/Sound/SC3/UGen/Record/RunningMax.hs
@@ -3,14 +3,14 @@
 import Sound.SC3.UGen.Record
 data RunningMax = RunningMax {
   rate :: S.Rate,
-  trig :: S.UGen,
-  reset :: S.UGen
+  input :: S.UGen,
+  trig :: S.UGen
   } deriving (Show)
 runningMax :: RunningMax
 runningMax = RunningMax {
   rate = S.AR,
-  trig = 0.0,
-  reset = 0.0
+  input = 0.0,
+  trig = 0.0
   }
 mkRunningMax :: RunningMax -> S.UGen
 mkRunningMax (RunningMax r a' b') = S.mkOsc r "RunningMax" [a',b'] 1
diff --git a/Sound/SC3/UGen/Record/RunningMin.hs b/Sound/SC3/UGen/Record/RunningMin.hs
--- a/Sound/SC3/UGen/Record/RunningMin.hs
+++ b/Sound/SC3/UGen/Record/RunningMin.hs
@@ -3,14 +3,14 @@
 import Sound.SC3.UGen.Record
 data RunningMin = RunningMin {
   rate :: S.Rate,
-  trig :: S.UGen,
-  reset :: S.UGen
+  input :: S.UGen,
+  trig :: S.UGen
   } deriving (Show)
 runningMin :: RunningMin
 runningMin = RunningMin {
   rate = S.AR,
-  trig = 0.0,
-  reset = 0.0
+  input = 0.0,
+  trig = 0.0
   }
 mkRunningMin :: RunningMin -> S.UGen
 mkRunningMin (RunningMin r a' b') = S.mkOsc r "RunningMin" [a',b'] 1
diff --git a/Sound/SC3/UGen/Record/Saw.hs b/Sound/SC3/UGen/Record/Saw.hs
--- a/Sound/SC3/UGen/Record/Saw.hs
+++ b/Sound/SC3/UGen/Record/Saw.hs
@@ -2,13 +2,15 @@
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data Saw = Saw {
+  rate :: S.Rate,
   freq :: S.UGen
   } deriving (Show)
 saw :: Saw
 saw = Saw {
+  rate = S.AR,
   freq = 440.0
   }
 mkSaw :: Saw -> S.UGen
-mkSaw (Saw  a') = S.mkOsc S.AR "Saw" [a'] 1
+mkSaw (Saw r a') = S.mkOsc r "Saw" [a'] 1
 instance Make Saw where
   ugen = mkSaw
diff --git a/Sound/SC3/UGen/Record/StereoConvolution2L.hs b/Sound/SC3/UGen/Record/StereoConvolution2L.hs
--- a/Sound/SC3/UGen/Record/StereoConvolution2L.hs
+++ b/Sound/SC3/UGen/Record/StereoConvolution2L.hs
@@ -15,7 +15,7 @@
   kernelL = 0.0,
   kernelR = 0.0,
   trigger = 0.0,
-  framesize = 0.0,
+  framesize = 2048.0,
   crossfade = 1.0
   }
 mkStereoConvolution2L :: StereoConvolution2L -> S.UGen
diff --git a/hsc3-rec.cabal b/hsc3-rec.cabal
--- a/hsc3-rec.cabal
+++ b/hsc3-rec.cabal
@@ -1,27 +1,28 @@
 Name:              hsc3-rec
-Version:           0.8
+Version:           0.9
 Synopsis:          Haskell SuperCollider Record Variants
 Description:       hsc3-rec provides record variants of the
                    unit generator constructors at hsc3.
 License:           GPL
 Category:          Sound
-Copyright:         (c) Rohan Drape and others, 2008-2010
+Copyright:         (c) Rohan Drape and others, 2008-2011
 Author:            Rohan Drape
 Maintainer:        rd@slavepianos.org
 Stability:         Experimental
 Homepage:          http://slavepianos.org/rd/?t=hsc3-rec
-Tested-With:       GHC == 6.10.3
+Tested-With:       GHC == 6.12.1
 Build-Type:        Simple
 Cabal-Version:     >= 1.6
 
 Data-files:        README
                    Makefile
+                   mk/build.hs
                    Help/analog-bubbles.hs
                    Help/pitch.hs
 
 Library
   Build-Depends:   base == 4.*,
-                   hsc3 == 0.8
+                   hsc3 == 0.9
   GHC-Options:     -Wall -fwarn-tabs
   Exposed-modules: Sound.SC3.UGen.Record
                    -- the lines below are generate by running
@@ -74,6 +75,7 @@
                    Sound.SC3.UGen.Record.BufSampleRate
                    Sound.SC3.UGen.Record.BufSamples
                    Sound.SC3.UGen.Record.BufWr
+                   Sound.SC3.UGen.Record.Changed
                    Sound.SC3.UGen.Record.ChaosGen
                    Sound.SC3.UGen.Record.CheckBadValues
                    Sound.SC3.UGen.Record.ClearBuf
@@ -106,6 +108,8 @@
                    Sound.SC3.UGen.Record.DelayC
                    Sound.SC3.UGen.Record.DelayL
                    Sound.SC3.UGen.Record.DelayN
+                   Sound.SC3.UGen.Record.DelTapRd
+                   Sound.SC3.UGen.Record.DelTapWr
                    Sound.SC3.UGen.Record.DemandEnvGen
                    Sound.SC3.UGen.Record.Demand
                    Sound.SC3.UGen.Record.DetectIndex
@@ -119,6 +123,7 @@
                    Sound.SC3.UGen.Record.Done
                    Sound.SC3.UGen.Record.Dpoll
                    Sound.SC3.UGen.Record.Drand
+                   Sound.SC3.UGen.Record.Dreset
                    Sound.SC3.UGen.Record.Dseq
                    Sound.SC3.UGen.Record.Dser
                    Sound.SC3.UGen.Record.Dseries
@@ -127,10 +132,12 @@
                    Sound.SC3.UGen.Record.Dswitch1
                    Sound.SC3.UGen.Record.Dswitch
                    Sound.SC3.UGen.Record.DUGen
+                   Sound.SC3.UGen.Record.Dunique
                    Sound.SC3.UGen.Record.Dust2
                    Sound.SC3.UGen.Record.Dust
                    Sound.SC3.UGen.Record.Duty
                    Sound.SC3.UGen.Record.Dwhite
+                   Sound.SC3.UGen.Record.Dwrand
                    Sound.SC3.UGen.Record.Dxrand
                    Sound.SC3.UGen.Record.DynKlang
                    Sound.SC3.UGen.Record.DynKlank
@@ -178,6 +185,7 @@
                    Sound.SC3.UGen.Record.Impulse
                    Sound.SC3.UGen.Record.Index
                    Sound.SC3.UGen.Record.IndexInBetween
+                   Sound.SC3.UGen.Record.IndexL
                    Sound.SC3.UGen.Record.InFeedback
                    Sound.SC3.UGen.Record.In
                    Sound.SC3.UGen.Record.InRange
@@ -390,3 +398,7 @@
                    Sound.SC3.UGen.Record.XLine
                    Sound.SC3.UGen.Record.XOut
                    Sound.SC3.UGen.Record.ZeroCrossing
+
+Source-Repository  head
+  Type:            darcs
+  Location:        http://slavepianos.org/rd/sw/hsc3-rec/
diff --git a/mk/build.hs b/mk/build.hs
new file mode 100644
--- /dev/null
+++ b/mk/build.hs
@@ -0,0 +1,160 @@
+import Data.Char
+import Sound.SC3.UGen.Rate
+import qualified Sound.SC3.UGen.DB.Data as D
+import System.FilePath
+import Text.Printf
+
+-- Rename parameters that conflict with keywords or prelude functions,
+-- or which have otherwise unwieldy names.
+rename_input :: String -> String
+rename_input "in" = "input"
+rename_input "channelsArray" = "input"
+rename_input "exp" = "exp_"
+rename_input "id" = "id_"
+rename_input "length" = "length_"
+rename_input "init" = "init_"
+rename_input "floor" = "floor_"
+rename_input "div" = "div_"
+rename_input "max" = "max_"
+rename_input "min" = "min_"
+rename_input "spring" = "spring_"
+rename_input "rate" = "rate_"
+rename_input "default" = "default_"
+rename_input s = s
+
+-- Rename unit generators that conflict with keywords or prelude
+-- functions.
+rename_ugen :: String -> String
+rename_ugen "in" = "in'"
+rename_ugen s = s
+
+input_name :: D.I -> String
+input_name = rename_input . D.input_name
+
+-- True if the unit generator can operate at multiple rates, in which
+-- case the record will require a rate field.
+needs_rate :: D.U -> Bool
+needs_rate u = length (D.ugen_operating_rates u) > 1
+
+-- In the case of one input rate use that instead of default rate,
+-- which can be innacurate (see pitch for example).
+fixed_rate :: D.U -> Rate
+fixed_rate (D.U _ [r] _ _ _) = r
+fixed_rate (D.U _ [] r _ _) = r
+fixed_rate _ = undefined
+
+-- List of field names and types.
+inputs_of :: D.U -> [(String, String)]
+inputs_of u =
+    let is = D.ugen_inputs u
+        bs = zip (map input_name is) (repeat "S.UGen")
+    in if needs_rate u
+       then ("rate", "S.Rate") : bs
+       else bs
+
+-- Append a character to each but the last string.
+with_char :: Char -> [String] -> [String]
+with_char c (x:y:xs) = (x ++ [c]) : with_char c (y:xs)
+with_char _ xs = xs
+
+with_comma :: [String] -> [String]
+with_comma = with_char ','
+
+with_space :: [String] -> [String]
+with_space = with_char ' '
+
+downcase_first_char :: String -> String
+downcase_first_char [] = []
+downcase_first_char (x:xs) = toLower x : xs
+
+-- Construct the parameter record.
+gen_param :: D.U -> [String]
+gen_param u =
+    let n = D.ugen_name u
+        pre = [printf "data %s = %s {" n n]
+        post = ["  } deriving (Show)"]
+        f (nm, ty) = printf "  %s :: %s" nm ty
+    in pre ++ with_comma (map f (inputs_of u)) ++ post
+
+-- Construct a default instance of the parameter structure.
+gen_defaults :: D.U -> [String]
+gen_defaults u@(D.U n _ r is _) =
+    let nm = rename_ugen (downcase_first_char n)
+        pre = [ printf "%s :: %s" nm n
+              , printf "%s = %s {" nm n]
+        post = [ "  }" ]
+        opt = if needs_rate u then [printf "  rate = S.%s," (show r)] else []
+        f i = printf "  %s = %f" (input_name i) (D.input_default i)
+    in pre ++ opt ++ with_comma (map f is) ++ post
+
+-- Generate a list of variable names (a,b..)
+var_names :: Int -> [String]
+var_names n = map (\x -> x : "'") (take n ['a'..])
+
+-- Generate the constructor for the unit generator.
+gen_cons :: D.U -> [String]
+gen_cons u@(D.U n _ _ is o) = 
+    let xs = var_names (length is)
+        nr = needs_rate u
+        l_opt = if nr then "r" else ""
+        r_opt = if nr then "r" else printf "S.%s" (show (fixed_rate u))
+    in [ printf "mk%s :: %s -> S.UGen" n n
+       , printf "mk%s (%s %s %s) = S.mkOsc %s \"%s\" [%s] %d" 
+                n
+                n
+                l_opt
+                (concat (with_space xs))
+                r_opt
+                n 
+                (concat (with_comma xs))
+                o]
+
+-- Generate instance of the Make class.
+gen_make :: D.U -> [String]
+gen_make u =
+    let n = D.ugen_name u
+    in [ printf "instance Make %s where" n
+       , printf "  ugen = mk%s" n ]
+
+-- Path to write files to.
+sc3_ugen_dir :: FilePath
+sc3_ugen_dir = "Sound" </> "SC3" </> "UGen"
+
+-- Write module for a unit generator.
+write_module :: D.U -> IO ()
+write_module u =
+    let n = D.ugen_name u
+        m = [ printf "module Sound.SC3.UGen.Record.%s where" n
+            , "import qualified Sound.SC3.UGen as S"
+            , "import Sound.SC3.UGen.Record" ]
+        p = gen_param u
+        d = gen_defaults u
+        c = gen_cons u
+        i = gen_make u
+        fn = sc3_ugen_dir </> "Record" </> n <.> ".hs"
+    in writeFile fn (unlines (m ++ p ++ d ++ c ++ i))
+
+main :: IO ()
+main = do
+  let us = filter (\u -> not (null (D.ugen_inputs u))) D.ugenDB
+  mapM_ write_module us
+
+{-
+gen_module_clause :: [D.U] -> [String]
+gen_module_clause us =
+    let f u = printf "  module Sound.SC3.UGen.Record.%s" (D.ugen_name u)
+        pre = ["{-# LANGUAGE DisambiguateRecordFields #-}"
+              ,"module Sound.SC3.UGen.Record.All ("]
+        post = ["  ) where"]
+    in pre ++ with_comma (map f us) ++ post
+
+gen_imports :: [D.U] -> [String]
+gen_imports = 
+    let f u = printf "import Sound.SC3.UGen.Record.%s" (D.ugen_name u)
+    in map f
+
+write_records :: [D.U] -> IO ()
+write_records us = 
+    let s = unlines (gen_module_clause us ++ gen_imports us)
+    in writeFile (sc3_ugen_dir </> "Record" </> "All" <.> "hs") s
+-}
