diff --git a/Help/analog-bubbles.hs b/Help/analog-bubbles.hs
--- a/Help/analog-bubbles.hs
+++ b/Help/analog-bubbles.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE DisambiguateRecordFields #-}
 
-import Sound.SC3
-import Sound.SC3.UGen.Record
+import Sound.SC3 {- hsc3 -}
+import Sound.SC3.UGen.Record {- hsc3-rec -}
 import Sound.SC3.UGen.Record.CombN
 import Sound.SC3.UGen.Record.LFSaw
 import Sound.SC3.UGen.Record.Out
diff --git a/Help/pitch.hs b/Help/pitch.hs
--- a/Help/pitch.hs
+++ b/Help/pitch.hs
@@ -1,11 +1,11 @@
-import Sound.SC3
-import qualified Sound.SC3.UGen.Record as R
+import Sound.SC3 {- hsc3 -}
+import qualified Sound.SC3.UGen.Record as R {- hsc3-rec -}
 import qualified Sound.SC3.UGen.Record.Pitch as P
 
 main :: IO ()
 main =
-    let x = mouseX' KR 220 660 Linear 0.1
-        y = mouseY' KR 0.05 0.25 Linear 0.1
+    let x = mouseX KR 220 660 Linear 0.1
+        y = mouseY KR 0.05 0.25 Linear 0.1
         s = saw AR x * y
         a = amplitude KR s 0.05 0.05
         MCE [f,_] = R.ugen P.pitch {P.input = s}
diff --git a/README b/README
--- a/README
+++ b/README
@@ -1,4 +1,12 @@
-hsc3-rec - haskell supercollider record variants
+hsc3-rec
+--------
 
-(c) rohan drape and others, 2008-2011
-    gpl, http://gnu.org/copyleft/
+[Haskell][hs] [SuperCollider][sc3] record variants (see [hsc3](?t=hsc3)).
+
+[hs]: http://haskell.org/
+[sc3]: http://audiosynth.com/
+
+© [rohan drape][rd] and others, 2008-2012, [gpl][gpl].
+
+[rd]: http://rd.slavepianos.org/
+[gpl]: http://gnu.org/copyleft/
diff --git a/Sound/SC3/UGen/Record.hs b/Sound/SC3/UGen/Record.hs
--- a/Sound/SC3/UGen/Record.hs
+++ b/Sound/SC3/UGen/Record.hs
@@ -26,7 +26,7 @@
 -- numbering is required.
 module Sound.SC3.UGen.Record where
 
-import Sound.SC3.UGen.UGen
+import Sound.SC3.UGen.Type
 
 class Make a where
     ugen :: a -> UGen
diff --git a/Sound/SC3/UGen/Record/A2B.hs b/Sound/SC3/UGen/Record/A2B.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/A2B.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.A2B where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data A2B = A2B {
+  a :: S.UGen,
+  b :: S.UGen,
+  c :: S.UGen,
+  d :: S.UGen
+  } deriving (Show)
+a2B :: A2B
+a2B = A2B {
+  a = 0.0,
+  b = 0.0,
+  c = 0.0,
+  d = 0.0
+  }
+mkA2B :: A2B -> S.UGen
+mkA2B (A2B  a' b' c' d') = S.mkOsc S.AR "A2B" [a',b',c',d'] 4
+instance Make A2B where
+  ugen = mkA2B
diff --git a/Sound/SC3/UGen/Record/A2K.hs b/Sound/SC3/UGen/Record/A2K.hs
--- a/Sound/SC3/UGen/Record/A2K.hs
+++ b/Sound/SC3/UGen/Record/A2K.hs
@@ -1,3 +1,4 @@
+-- | Audio to control rate converter.
 module Sound.SC3.UGen.Record.A2K where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/APF.hs b/Sound/SC3/UGen/Record/APF.hs
--- a/Sound/SC3/UGen/Record/APF.hs
+++ b/Sound/SC3/UGen/Record/APF.hs
@@ -1,3 +1,4 @@
+-- | FIXME: APF purpose.
 module Sound.SC3.UGen.Record.APF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/AY.hs b/Sound/SC3/UGen/Record/AY.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AY.hs
@@ -0,0 +1,35 @@
+-- | Emulator of the AY (aka YM) soundchip, used in Spectrum/Atari
+module Sound.SC3.UGen.Record.AY where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AY = AY {
+  tonea :: S.UGen,
+  toneb :: S.UGen,
+  tonec :: S.UGen,
+  noise :: S.UGen,
+  control :: S.UGen,
+  vola :: S.UGen,
+  volb :: S.UGen,
+  volc :: S.UGen,
+  envfreq :: S.UGen,
+  envstyle :: S.UGen,
+  chiptype :: S.UGen
+  } deriving (Show)
+aY :: AY
+aY = AY {
+  tonea = 1777.0,
+  toneb = 1666.0,
+  tonec = 1555.0,
+  noise = 1.0,
+  control = 7.0,
+  vola = 15.0,
+  volb = 15.0,
+  volc = 15.0,
+  envfreq = 4.0,
+  envstyle = 1.0,
+  chiptype = 0.0
+  }
+mkAY :: AY -> S.UGen
+mkAY (AY  a' b' c' d' e' f' g' h' i' j' k') = S.mkOsc S.AR "AY" [a',b',c',d',e',f',g',h',i',j',k'] 1
+instance Make AY where
+  ugen = mkAY
diff --git a/Sound/SC3/UGen/Record/AbstractIn.hs b/Sound/SC3/UGen/Record/AbstractIn.hs
--- a/Sound/SC3/UGen/Record/AbstractIn.hs
+++ b/Sound/SC3/UGen/Record/AbstractIn.hs
@@ -1,3 +1,4 @@
+-- | Abstract class for in ugens
 module Sound.SC3.UGen.Record.AbstractIn where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/AbstractOut.hs b/Sound/SC3/UGen/Record/AbstractOut.hs
--- a/Sound/SC3/UGen/Record/AbstractOut.hs
+++ b/Sound/SC3/UGen/Record/AbstractOut.hs
@@ -1,3 +1,4 @@
+-- | Abstract class for out ugens
 module Sound.SC3.UGen.Record.AbstractOut where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Allpass1.hs b/Sound/SC3/UGen/Record/Allpass1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Allpass1.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Allpass1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Allpass1 = Allpass1 {
+  input :: S.UGen,
+  freq :: S.UGen
+  } deriving (Show)
+allpass1 :: Allpass1
+allpass1 = Allpass1 {
+  input = 0.0,
+  freq = 1200.0
+  }
+mkAllpass1 :: Allpass1 -> S.UGen
+mkAllpass1 (Allpass1  a' b') = S.mkOsc S.AR "Allpass1" [a',b'] 1
+instance Make Allpass1 where
+  ugen = mkAllpass1
diff --git a/Sound/SC3/UGen/Record/Allpass2.hs b/Sound/SC3/UGen/Record/Allpass2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Allpass2.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Allpass2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Allpass2 = Allpass2 {
+  input :: S.UGen,
+  freq :: S.UGen,
+  rq :: S.UGen
+  } deriving (Show)
+allpass2 :: Allpass2
+allpass2 = Allpass2 {
+  input = 0.0,
+  freq = 1200.0,
+  rq = 1.0
+  }
+mkAllpass2 :: Allpass2 -> S.UGen
+mkAllpass2 (Allpass2  a' b' c') = S.mkOsc S.AR "Allpass2" [a',b',c'] 1
+instance Make Allpass2 where
+  ugen = mkAllpass2
diff --git a/Sound/SC3/UGen/Record/AllpassC.hs b/Sound/SC3/UGen/Record/AllpassC.hs
--- a/Sound/SC3/UGen/Record/AllpassC.hs
+++ b/Sound/SC3/UGen/Record/AllpassC.hs
@@ -1,3 +1,4 @@
+-- | All pass delay line with cubic interpolation.
 module Sound.SC3.UGen.Record.AllpassC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/AllpassL.hs b/Sound/SC3/UGen/Record/AllpassL.hs
--- a/Sound/SC3/UGen/Record/AllpassL.hs
+++ b/Sound/SC3/UGen/Record/AllpassL.hs
@@ -1,3 +1,4 @@
+-- | All pass delay line with linear interpolation.
 module Sound.SC3.UGen.Record.AllpassL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/AllpassN.hs b/Sound/SC3/UGen/Record/AllpassN.hs
--- a/Sound/SC3/UGen/Record/AllpassN.hs
+++ b/Sound/SC3/UGen/Record/AllpassN.hs
@@ -1,3 +1,4 @@
+-- | All pass delay line with no interpolation.
 module Sound.SC3.UGen.Record.AllpassN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/AmpComp.hs b/Sound/SC3/UGen/Record/AmpComp.hs
--- a/Sound/SC3/UGen/Record/AmpComp.hs
+++ b/Sound/SC3/UGen/Record/AmpComp.hs
@@ -1,3 +1,4 @@
+-- | Basic psychoacoustic amplitude compensation.
 module Sound.SC3.UGen.Record.AmpComp where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/AmpCompA.hs b/Sound/SC3/UGen/Record/AmpCompA.hs
--- a/Sound/SC3/UGen/Record/AmpCompA.hs
+++ b/Sound/SC3/UGen/Record/AmpCompA.hs
@@ -1,3 +1,4 @@
+-- | Basic psychoacoustic amplitude compensation (ANSI A-weighting curve).
 module Sound.SC3.UGen.Record.AmpCompA where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Amplitude.hs b/Sound/SC3/UGen/Record/Amplitude.hs
--- a/Sound/SC3/UGen/Record/Amplitude.hs
+++ b/Sound/SC3/UGen/Record/Amplitude.hs
@@ -1,3 +1,4 @@
+-- | Amplitude follower
 module Sound.SC3.UGen.Record.Amplitude where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/AmplitudeMod.hs b/Sound/SC3/UGen/Record/AmplitudeMod.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AmplitudeMod.hs
@@ -0,0 +1,21 @@
+-- | amplitude follower
+module Sound.SC3.UGen.Record.AmplitudeMod where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AmplitudeMod = AmplitudeMod {
+  rate :: S.Rate,
+  input :: S.UGen,
+  attackTime :: S.UGen,
+  releaseTime :: S.UGen
+  } deriving (Show)
+amplitudeMod :: AmplitudeMod
+amplitudeMod = AmplitudeMod {
+  rate = S.AR,
+  input = 0.0,
+  attackTime = 0.01,
+  releaseTime = 0.01
+  }
+mkAmplitudeMod :: AmplitudeMod -> S.UGen
+mkAmplitudeMod (AmplitudeMod r a' b' c') = S.mkOsc r "AmplitudeMod" [a',b',c'] 1
+instance Make AmplitudeMod where
+  ugen = mkAmplitudeMod
diff --git a/Sound/SC3/UGen/Record/AnalyseEvents2.hs b/Sound/SC3/UGen/Record/AnalyseEvents2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AnalyseEvents2.hs
@@ -0,0 +1,25 @@
+-- | event analyser (BBCut)
+module Sound.SC3.UGen.Record.AnalyseEvents2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AnalyseEvents2 = AnalyseEvents2 {
+  input :: S.UGen,
+  bufnum :: S.UGen,
+  threshold :: S.UGen,
+  triggerid :: S.UGen,
+  circular :: S.UGen,
+  pitch :: S.UGen
+  } deriving (Show)
+analyseEvents2 :: AnalyseEvents2
+analyseEvents2 = AnalyseEvents2 {
+  input = 0.0,
+  bufnum = 0.0,
+  threshold = 0.34,
+  triggerid = 101.0,
+  circular = 0.0,
+  pitch = 0.0
+  }
+mkAnalyseEvents2 :: AnalyseEvents2 -> S.UGen
+mkAnalyseEvents2 (AnalyseEvents2  a' b' c' d' e' f') = S.mkOsc S.AR "AnalyseEvents2" [a',b',c',d',e',f'] 1
+instance Make AnalyseEvents2 where
+  ugen = mkAnalyseEvents2
diff --git a/Sound/SC3/UGen/Record/ArrayMax.hs b/Sound/SC3/UGen/Record/ArrayMax.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/ArrayMax.hs
@@ -0,0 +1,17 @@
+-- | detect the largest value (and its position) in an array of UGens
+module Sound.SC3.UGen.Record.ArrayMax where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data ArrayMax = ArrayMax {
+  rate :: S.Rate,
+  array :: S.UGen
+  } deriving (Show)
+arrayMax :: ArrayMax
+arrayMax = ArrayMax {
+  rate = S.AR,
+  array = 0.0
+  }
+mkArrayMax :: ArrayMax -> S.UGen
+mkArrayMax (ArrayMax r a') = S.mkOsc r "ArrayMax" [a'] 2
+instance Make ArrayMax where
+  ugen = mkArrayMax
diff --git a/Sound/SC3/UGen/Record/ArrayMin.hs b/Sound/SC3/UGen/Record/ArrayMin.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/ArrayMin.hs
@@ -0,0 +1,17 @@
+-- | detect the smallest value (and its position) in an array of UGens
+module Sound.SC3.UGen.Record.ArrayMin where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data ArrayMin = ArrayMin {
+  rate :: S.Rate,
+  array :: S.UGen
+  } deriving (Show)
+arrayMin :: ArrayMin
+arrayMin = ArrayMin {
+  rate = S.AR,
+  array = 0.0
+  }
+mkArrayMin :: ArrayMin -> S.UGen
+mkArrayMin (ArrayMin r a') = S.mkOsc r "ArrayMin" [a'] 2
+instance Make ArrayMin where
+  ugen = mkArrayMin
diff --git a/Sound/SC3/UGen/Record/AtsAmp.hs b/Sound/SC3/UGen/Record/AtsAmp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AtsAmp.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AtsAmp where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AtsAmp = AtsAmp {
+  rate :: S.Rate,
+  atsbuffer :: S.UGen,
+  partialNum :: S.UGen,
+  filePointer :: S.UGen
+  } deriving (Show)
+atsAmp :: AtsAmp
+atsAmp = AtsAmp {
+  rate = S.AR,
+  atsbuffer = 0.0,
+  partialNum = 0.0,
+  filePointer = 0.0
+  }
+mkAtsAmp :: AtsAmp -> S.UGen
+mkAtsAmp (AtsAmp r a' b' c') = S.mkOsc r "AtsAmp" [a',b',c'] 1
+instance Make AtsAmp where
+  ugen = mkAtsAmp
diff --git a/Sound/SC3/UGen/Record/AtsBand.hs b/Sound/SC3/UGen/Record/AtsBand.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AtsBand.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AtsBand where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AtsBand = AtsBand {
+  atsbuffer :: S.UGen,
+  band :: S.UGen,
+  filePointer :: S.UGen
+  } deriving (Show)
+atsBand :: AtsBand
+atsBand = AtsBand {
+  atsbuffer = 0.0,
+  band = 0.0,
+  filePointer = 0.0
+  }
+mkAtsBand :: AtsBand -> S.UGen
+mkAtsBand (AtsBand  a' b' c') = S.mkOsc S.AR "AtsBand" [a',b',c'] 1
+instance Make AtsBand where
+  ugen = mkAtsBand
diff --git a/Sound/SC3/UGen/Record/AtsFreq.hs b/Sound/SC3/UGen/Record/AtsFreq.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AtsFreq.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AtsFreq where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AtsFreq = AtsFreq {
+  rate :: S.Rate,
+  atsbuffer :: S.UGen,
+  partialNum :: S.UGen,
+  filePointer :: S.UGen
+  } deriving (Show)
+atsFreq :: AtsFreq
+atsFreq = AtsFreq {
+  rate = S.AR,
+  atsbuffer = 0.0,
+  partialNum = 0.0,
+  filePointer = 0.0
+  }
+mkAtsFreq :: AtsFreq -> S.UGen
+mkAtsFreq (AtsFreq r a' b' c') = S.mkOsc r "AtsFreq" [a',b',c'] 1
+instance Make AtsFreq where
+  ugen = mkAtsFreq
diff --git a/Sound/SC3/UGen/Record/AtsNoiSynth.hs b/Sound/SC3/UGen/Record/AtsNoiSynth.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AtsNoiSynth.hs
@@ -0,0 +1,37 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AtsNoiSynth where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AtsNoiSynth = AtsNoiSynth {
+  atsbuffer :: S.UGen,
+  numPartials :: S.UGen,
+  partialStart :: S.UGen,
+  partialSkip :: S.UGen,
+  filePointer :: S.UGen,
+  sinePct :: S.UGen,
+  noisePct :: S.UGen,
+  freqMul :: S.UGen,
+  freqAdd :: S.UGen,
+  numBands :: S.UGen,
+  bandStart :: S.UGen,
+  bandSkip :: S.UGen
+  } deriving (Show)
+atsNoiSynth :: AtsNoiSynth
+atsNoiSynth = AtsNoiSynth {
+  atsbuffer = 0.0,
+  numPartials = 0.0,
+  partialStart = 0.0,
+  partialSkip = 1.0,
+  filePointer = 0.0,
+  sinePct = 1.0,
+  noisePct = 1.0,
+  freqMul = 1.0,
+  freqAdd = 0.0,
+  numBands = 25.0,
+  bandStart = 0.0,
+  bandSkip = 1.0
+  }
+mkAtsNoiSynth :: AtsNoiSynth -> S.UGen
+mkAtsNoiSynth (AtsNoiSynth  a' b' c' d' e' f' g' h' i' j' k' l') = S.mkOsc S.AR "AtsNoiSynth" [a',b',c',d',e',f',g',h',i',j',k',l'] 1
+instance Make AtsNoiSynth where
+  ugen = mkAtsNoiSynth
diff --git a/Sound/SC3/UGen/Record/AtsNoise.hs b/Sound/SC3/UGen/Record/AtsNoise.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AtsNoise.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AtsNoise where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AtsNoise = AtsNoise {
+  rate :: S.Rate,
+  atsbuffer :: S.UGen,
+  bandNum :: S.UGen,
+  filePointer :: S.UGen
+  } deriving (Show)
+atsNoise :: AtsNoise
+atsNoise = AtsNoise {
+  rate = S.AR,
+  atsbuffer = 0.0,
+  bandNum = 0.0,
+  filePointer = 0.0
+  }
+mkAtsNoise :: AtsNoise -> S.UGen
+mkAtsNoise (AtsNoise r a' b' c') = S.mkOsc r "AtsNoise" [a',b',c'] 1
+instance Make AtsNoise where
+  ugen = mkAtsNoise
diff --git a/Sound/SC3/UGen/Record/AtsParInfo.hs b/Sound/SC3/UGen/Record/AtsParInfo.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AtsParInfo.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AtsParInfo where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AtsParInfo = AtsParInfo {
+  rate :: S.Rate,
+  atsbuffer :: S.UGen,
+  partialNum :: S.UGen,
+  filePointer :: S.UGen
+  } deriving (Show)
+atsParInfo :: AtsParInfo
+atsParInfo = AtsParInfo {
+  rate = S.AR,
+  atsbuffer = 0.0,
+  partialNum = 0.0,
+  filePointer = 0.0
+  }
+mkAtsParInfo :: AtsParInfo -> S.UGen
+mkAtsParInfo (AtsParInfo r a' b' c') = S.mkOsc r "AtsParInfo" [a',b',c'] 2
+instance Make AtsParInfo where
+  ugen = mkAtsParInfo
diff --git a/Sound/SC3/UGen/Record/AtsPartial.hs b/Sound/SC3/UGen/Record/AtsPartial.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AtsPartial.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AtsPartial where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AtsPartial = AtsPartial {
+  atsbuffer :: S.UGen,
+  partial :: S.UGen,
+  filePointer :: S.UGen,
+  freqMul :: S.UGen,
+  freqAdd :: S.UGen
+  } deriving (Show)
+atsPartial :: AtsPartial
+atsPartial = AtsPartial {
+  atsbuffer = 0.0,
+  partial = 0.0,
+  filePointer = 0.0,
+  freqMul = 1.0,
+  freqAdd = 0.0
+  }
+mkAtsPartial :: AtsPartial -> S.UGen
+mkAtsPartial (AtsPartial  a' b' c' d' e') = S.mkOsc S.AR "AtsPartial" [a',b',c',d',e'] 1
+instance Make AtsPartial where
+  ugen = mkAtsPartial
diff --git a/Sound/SC3/UGen/Record/AtsSynth.hs b/Sound/SC3/UGen/Record/AtsSynth.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AtsSynth.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AtsSynth where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AtsSynth = AtsSynth {
+  atsbuffer :: S.UGen,
+  numPartials :: S.UGen,
+  partialStart :: S.UGen,
+  partialSkip :: S.UGen,
+  filePointer :: S.UGen,
+  freqMul :: S.UGen,
+  freqAdd :: S.UGen
+  } deriving (Show)
+atsSynth :: AtsSynth
+atsSynth = AtsSynth {
+  atsbuffer = 0.0,
+  numPartials = 0.0,
+  partialStart = 0.0,
+  partialSkip = 1.0,
+  filePointer = 0.0,
+  freqMul = 1.0,
+  freqAdd = 0.0
+  }
+mkAtsSynth :: AtsSynth -> S.UGen
+mkAtsSynth (AtsSynth  a' b' c' d' e' f' g') = S.mkOsc S.AR "AtsSynth" [a',b',c',d',e',f',g'] 1
+instance Make AtsSynth where
+  ugen = mkAtsSynth
diff --git a/Sound/SC3/UGen/Record/AtsUGen.hs b/Sound/SC3/UGen/Record/AtsUGen.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AtsUGen.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AtsUGen where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AtsUGen = AtsUGen {
+  maxSize :: S.UGen
+  } deriving (Show)
+atsUGen :: AtsUGen
+atsUGen = AtsUGen {
+  maxSize = 0.0
+  }
+mkAtsUGen :: AtsUGen -> S.UGen
+mkAtsUGen (AtsUGen  a') = S.mkOsc S.AR "AtsUGen" [a'] 1
+instance Make AtsUGen where
+  ugen = mkAtsUGen
diff --git a/Sound/SC3/UGen/Record/AudioControl.hs b/Sound/SC3/UGen/Record/AudioControl.hs
--- a/Sound/SC3/UGen/Record/AudioControl.hs
+++ b/Sound/SC3/UGen/Record/AudioControl.hs
@@ -1,3 +1,4 @@
+-- | (not documented)
 module Sound.SC3.UGen.Record.AudioControl where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/AudioMSG.hs b/Sound/SC3/UGen/Record/AudioMSG.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AudioMSG.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.AudioMSG where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AudioMSG = AudioMSG {
+  input :: S.UGen,
+  index :: S.UGen
+  } deriving (Show)
+audioMSG :: AudioMSG
+audioMSG = AudioMSG {
+  input = 0.0,
+  index = 0.0
+  }
+mkAudioMSG :: AudioMSG -> S.UGen
+mkAudioMSG (AudioMSG  a' b') = S.mkOsc S.AR "AudioMSG" [a',b'] 1
+instance Make AudioMSG where
+  ugen = mkAudioMSG
diff --git a/Sound/SC3/UGen/Record/AverageOutput.hs b/Sound/SC3/UGen/Record/AverageOutput.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/AverageOutput.hs
@@ -0,0 +1,19 @@
+-- | calculates mean average of audio or control rate signal
+module Sound.SC3.UGen.Record.AverageOutput where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data AverageOutput = AverageOutput {
+  rate :: S.Rate,
+  input :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+averageOutput :: AverageOutput
+averageOutput = AverageOutput {
+  rate = S.AR,
+  input = 0.0,
+  trig = 0.0
+  }
+mkAverageOutput :: AverageOutput -> S.UGen
+mkAverageOutput (AverageOutput r a' b') = S.mkOsc r "AverageOutput" [a',b'] 1
+instance Make AverageOutput where
+  ugen = mkAverageOutput
diff --git a/Sound/SC3/UGen/Record/B2A.hs b/Sound/SC3/UGen/Record/B2A.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/B2A.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.B2A where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data B2A = B2A {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen
+  } deriving (Show)
+b2A :: B2A
+b2A = B2A {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0
+  }
+mkB2A :: B2A -> S.UGen
+mkB2A (B2A  a' b' c' d') = S.mkOsc S.AR "B2A" [a',b',c',d'] 4
+instance Make B2A where
+  ugen = mkB2A
diff --git a/Sound/SC3/UGen/Record/B2Ster.hs b/Sound/SC3/UGen/Record/B2Ster.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/B2Ster.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.B2Ster where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data B2Ster = B2Ster {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen
+  } deriving (Show)
+b2Ster :: B2Ster
+b2Ster = B2Ster {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0
+  }
+mkB2Ster :: B2Ster -> S.UGen
+mkB2Ster (B2Ster  a' b' c') = S.mkOsc S.AR "B2Ster" [a',b',c'] 2
+instance Make B2Ster where
+  ugen = mkB2Ster
diff --git a/Sound/SC3/UGen/Record/B2UHJ.hs b/Sound/SC3/UGen/Record/B2UHJ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/B2UHJ.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.B2UHJ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data B2UHJ = B2UHJ {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen
+  } deriving (Show)
+b2UHJ :: B2UHJ
+b2UHJ = B2UHJ {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0
+  }
+mkB2UHJ :: B2UHJ -> S.UGen
+mkB2UHJ (B2UHJ  a' b' c') = S.mkOsc S.AR "B2UHJ" [a',b',c'] 2
+instance Make B2UHJ where
+  ugen = mkB2UHJ
diff --git a/Sound/SC3/UGen/Record/BAllPass.hs b/Sound/SC3/UGen/Record/BAllPass.hs
--- a/Sound/SC3/UGen/Record/BAllPass.hs
+++ b/Sound/SC3/UGen/Record/BAllPass.hs
@@ -1,3 +1,4 @@
+-- | All Pass Filter
 module Sound.SC3.UGen.Record.BAllPass where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BBandPass.hs b/Sound/SC3/UGen/Record/BBandPass.hs
--- a/Sound/SC3/UGen/Record/BBandPass.hs
+++ b/Sound/SC3/UGen/Record/BBandPass.hs
@@ -1,3 +1,4 @@
+-- | Band Pass Filter
 module Sound.SC3.UGen.Record.BBandPass where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BBandStop.hs b/Sound/SC3/UGen/Record/BBandStop.hs
--- a/Sound/SC3/UGen/Record/BBandStop.hs
+++ b/Sound/SC3/UGen/Record/BBandStop.hs
@@ -1,3 +1,4 @@
+-- | Band reject filter
 module Sound.SC3.UGen.Record.BBandStop where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BBlockerBuf.hs b/Sound/SC3/UGen/Record/BBlockerBuf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BBlockerBuf.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BBlockerBuf where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BBlockerBuf = BBlockerBuf {
+  freq :: S.UGen,
+  bufnum :: S.UGen,
+  startpoint :: S.UGen
+  } deriving (Show)
+bBlockerBuf :: BBlockerBuf
+bBlockerBuf = BBlockerBuf {
+  freq = 0.0,
+  bufnum = 0.0,
+  startpoint = 0.0
+  }
+mkBBlockerBuf :: BBlockerBuf -> S.UGen
+mkBBlockerBuf (BBlockerBuf  a' b' c') = S.mkOsc S.AR "BBlockerBuf" [a',b',c'] 9
+instance Make BBlockerBuf where
+  ugen = mkBBlockerBuf
diff --git a/Sound/SC3/UGen/Record/BEQSuite.hs b/Sound/SC3/UGen/Record/BEQSuite.hs
--- a/Sound/SC3/UGen/Record/BEQSuite.hs
+++ b/Sound/SC3/UGen/Record/BEQSuite.hs
@@ -1,3 +1,4 @@
+-- | Base class for B Equalization Suite
 module Sound.SC3.UGen.Record.BEQSuite where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BFDecode1.hs b/Sound/SC3/UGen/Record/BFDecode1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BFDecode1.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BFDecode1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BFDecode1 = BFDecode1 {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+bFDecode1 :: BFDecode1
+bFDecode1 = BFDecode1 {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  wComp = 0.0
+  }
+mkBFDecode1 :: BFDecode1 -> S.UGen
+mkBFDecode1 (BFDecode1  a' b' c' d' e' f' g') = S.mkOsc S.AR "BFDecode1" [a',b',c',d',e',f',g'] 1
+instance Make BFDecode1 where
+  ugen = mkBFDecode1
diff --git a/Sound/SC3/UGen/Record/BFDecoder.hs b/Sound/SC3/UGen/Record/BFDecoder.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BFDecoder.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BFDecoder where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BFDecoder = BFDecoder {
+  maxSize :: S.UGen
+  } deriving (Show)
+bFDecoder :: BFDecoder
+bFDecoder = BFDecoder {
+  maxSize = 0.0
+  }
+mkBFDecoder :: BFDecoder -> S.UGen
+mkBFDecoder (BFDecoder  a') = S.mkOsc S.AR "BFDecoder" [a'] 1
+instance Make BFDecoder where
+  ugen = mkBFDecoder
diff --git a/Sound/SC3/UGen/Record/BFEncode1.hs b/Sound/SC3/UGen/Record/BFEncode1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BFEncode1.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BFEncode1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BFEncode1 = BFEncode1 {
+  input :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  gain :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+bFEncode1 :: BFEncode1
+bFEncode1 = BFEncode1 {
+  input = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  gain = 1.0,
+  wComp = 0.0
+  }
+mkBFEncode1 :: BFEncode1 -> S.UGen
+mkBFEncode1 (BFEncode1  a' b' c' d' e' f') = S.mkOsc S.AR "BFEncode1" [a',b',c',d',e',f'] 4
+instance Make BFEncode1 where
+  ugen = mkBFEncode1
diff --git a/Sound/SC3/UGen/Record/BFEncode2.hs b/Sound/SC3/UGen/Record/BFEncode2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BFEncode2.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BFEncode2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BFEncode2 = BFEncode2 {
+  input :: S.UGen,
+  point_x :: S.UGen,
+  point_y :: S.UGen,
+  elevation :: S.UGen,
+  gain :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+bFEncode2 :: BFEncode2
+bFEncode2 = BFEncode2 {
+  input = 0.0,
+  point_x = 1.0,
+  point_y = 1.0,
+  elevation = 0.0,
+  gain = 1.0,
+  wComp = 0.0
+  }
+mkBFEncode2 :: BFEncode2 -> S.UGen
+mkBFEncode2 (BFEncode2  a' b' c' d' e' f') = S.mkOsc S.AR "BFEncode2" [a',b',c',d',e',f'] 4
+instance Make BFEncode2 where
+  ugen = mkBFEncode2
diff --git a/Sound/SC3/UGen/Record/BFEncodeSter.hs b/Sound/SC3/UGen/Record/BFEncodeSter.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BFEncodeSter.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BFEncodeSter where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BFEncodeSter = BFEncodeSter {
+  l :: S.UGen,
+  r :: S.UGen,
+  azimuth :: S.UGen,
+  width :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  gain :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+bFEncodeSter :: BFEncodeSter
+bFEncodeSter = BFEncodeSter {
+  l = 0.0,
+  r = 0.0,
+  azimuth = 0.0,
+  width = 1.5707963267949,
+  elevation = 0.0,
+  rho = 1.0,
+  gain = 1.0,
+  wComp = 0.0
+  }
+mkBFEncodeSter :: BFEncodeSter -> S.UGen
+mkBFEncodeSter (BFEncodeSter  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "BFEncodeSter" [a',b',c',d',e',f',g',h'] 4
+instance Make BFEncodeSter where
+  ugen = mkBFEncodeSter
diff --git a/Sound/SC3/UGen/Record/BFGrainPanner.hs b/Sound/SC3/UGen/Record/BFGrainPanner.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BFGrainPanner.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BFGrainPanner where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BFGrainPanner = BFGrainPanner {
+  maxSize :: S.UGen
+  } deriving (Show)
+bFGrainPanner :: BFGrainPanner
+bFGrainPanner = BFGrainPanner {
+  maxSize = 0.0
+  }
+mkBFGrainPanner :: BFGrainPanner -> S.UGen
+mkBFGrainPanner (BFGrainPanner  a') = S.mkOsc S.AR "BFGrainPanner" [a'] 1
+instance Make BFGrainPanner where
+  ugen = mkBFGrainPanner
diff --git a/Sound/SC3/UGen/Record/BFManipulate.hs b/Sound/SC3/UGen/Record/BFManipulate.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BFManipulate.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BFManipulate where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BFManipulate = BFManipulate {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  rotate :: S.UGen,
+  tilt :: S.UGen,
+  tumble :: S.UGen
+  } deriving (Show)
+bFManipulate :: BFManipulate
+bFManipulate = BFManipulate {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  rotate = 0.0,
+  tilt = 0.0,
+  tumble = 0.0
+  }
+mkBFManipulate :: BFManipulate -> S.UGen
+mkBFManipulate (BFManipulate  a' b' c' d' e' f' g') = S.mkOsc S.AR "BFManipulate" [a',b',c',d',e',f',g'] 4
+instance Make BFManipulate where
+  ugen = mkBFManipulate
diff --git a/Sound/SC3/UGen/Record/BHiPass.hs b/Sound/SC3/UGen/Record/BHiPass.hs
--- a/Sound/SC3/UGen/Record/BHiPass.hs
+++ b/Sound/SC3/UGen/Record/BHiPass.hs
@@ -1,3 +1,4 @@
+-- | 12db/oct rolloff - 2nd order resonant  Hi Pass Filter
 module Sound.SC3.UGen.Record.BHiPass where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BHiShelf.hs b/Sound/SC3/UGen/Record/BHiShelf.hs
--- a/Sound/SC3/UGen/Record/BHiShelf.hs
+++ b/Sound/SC3/UGen/Record/BHiShelf.hs
@@ -1,3 +1,4 @@
+-- | Hi Shelf
 module Sound.SC3.UGen.Record.BHiShelf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BLBufRd.hs b/Sound/SC3/UGen/Record/BLBufRd.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BLBufRd.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BLBufRd where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BLBufRd = BLBufRd {
+  rate :: S.Rate,
+  bufnum :: S.UGen,
+  phase :: S.UGen,
+  ratio :: S.UGen
+  } deriving (Show)
+bLBufRd :: BLBufRd
+bLBufRd = BLBufRd {
+  rate = S.AR,
+  bufnum = 0.0,
+  phase = 0.0,
+  ratio = 1.0
+  }
+mkBLBufRd :: BLBufRd -> S.UGen
+mkBLBufRd (BLBufRd r a' b' c') = S.mkOsc r "BLBufRd" [a',b',c'] 1
+instance Make BLBufRd where
+  ugen = mkBLBufRd
diff --git a/Sound/SC3/UGen/Record/BLowPass.hs b/Sound/SC3/UGen/Record/BLowPass.hs
--- a/Sound/SC3/UGen/Record/BLowPass.hs
+++ b/Sound/SC3/UGen/Record/BLowPass.hs
@@ -1,3 +1,4 @@
+-- | 12db/oct rolloff - 2nd order resonant Low Pass Filter
 module Sound.SC3.UGen.Record.BLowPass where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BLowShelf.hs b/Sound/SC3/UGen/Record/BLowShelf.hs
--- a/Sound/SC3/UGen/Record/BLowShelf.hs
+++ b/Sound/SC3/UGen/Record/BLowShelf.hs
@@ -1,3 +1,4 @@
+-- | Low Shelf
 module Sound.SC3.UGen.Record.BLowShelf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BMoog.hs b/Sound/SC3/UGen/Record/BMoog.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BMoog.hs
@@ -0,0 +1,23 @@
+-- | 24db/oct rolloff - 4nd order resonant Low/High/Band Pass Filter
+module Sound.SC3.UGen.Record.BMoog where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BMoog = BMoog {
+  input :: S.UGen,
+  freq :: S.UGen,
+  q :: S.UGen,
+  mode :: S.UGen,
+  saturation :: S.UGen
+  } deriving (Show)
+bMoog :: BMoog
+bMoog = BMoog {
+  input = 0.0,
+  freq = 440.0,
+  q = 0.2,
+  mode = 0.0,
+  saturation = 0.95
+  }
+mkBMoog :: BMoog -> S.UGen
+mkBMoog (BMoog  a' b' c' d' e') = S.mkOsc S.AR "BMoog" [a',b',c',d',e'] 1
+instance Make BMoog where
+  ugen = mkBMoog
diff --git a/Sound/SC3/UGen/Record/BPF.hs b/Sound/SC3/UGen/Record/BPF.hs
--- a/Sound/SC3/UGen/Record/BPF.hs
+++ b/Sound/SC3/UGen/Record/BPF.hs
@@ -1,3 +1,4 @@
+-- | 2nd order Butterworth bandpass filter.
 module Sound.SC3.UGen.Record.BPF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BPZ2.hs b/Sound/SC3/UGen/Record/BPZ2.hs
--- a/Sound/SC3/UGen/Record/BPZ2.hs
+++ b/Sound/SC3/UGen/Record/BPZ2.hs
@@ -1,3 +1,4 @@
+-- | Two zero fixed midpass.
 module Sound.SC3.UGen.Record.BPZ2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BPeakEQ.hs b/Sound/SC3/UGen/Record/BPeakEQ.hs
--- a/Sound/SC3/UGen/Record/BPeakEQ.hs
+++ b/Sound/SC3/UGen/Record/BPeakEQ.hs
@@ -1,3 +1,4 @@
+-- | Parametric equalizer
 module Sound.SC3.UGen.Record.BPeakEQ where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BRF.hs b/Sound/SC3/UGen/Record/BRF.hs
--- a/Sound/SC3/UGen/Record/BRF.hs
+++ b/Sound/SC3/UGen/Record/BRF.hs
@@ -1,3 +1,4 @@
+-- | 2nd order Butterworth band reject filter.
 module Sound.SC3.UGen.Record.BRF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BRZ2.hs b/Sound/SC3/UGen/Record/BRZ2.hs
--- a/Sound/SC3/UGen/Record/BRZ2.hs
+++ b/Sound/SC3/UGen/Record/BRZ2.hs
@@ -1,3 +1,4 @@
+-- | Two zero fixed midcut.
 module Sound.SC3.UGen.Record.BRZ2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Balance.hs b/Sound/SC3/UGen/Record/Balance.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Balance.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Balance where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Balance = Balance {
+  input :: S.UGen,
+  test :: S.UGen,
+  hp :: S.UGen,
+  stor :: S.UGen
+  } deriving (Show)
+balance :: Balance
+balance = Balance {
+  input = 0.0,
+  test = 0.0,
+  hp = 10.0,
+  stor = 0.0
+  }
+mkBalance :: Balance -> S.UGen
+mkBalance (Balance  a' b' c' d') = S.mkOsc S.AR "Balance" [a',b',c',d'] 1
+instance Make Balance where
+  ugen = mkBalance
diff --git a/Sound/SC3/UGen/Record/Balance2.hs b/Sound/SC3/UGen/Record/Balance2.hs
--- a/Sound/SC3/UGen/Record/Balance2.hs
+++ b/Sound/SC3/UGen/Record/Balance2.hs
@@ -1,3 +1,4 @@
+-- | Stereo signal balancer
 module Sound.SC3.UGen.Record.Balance2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Ball.hs b/Sound/SC3/UGen/Record/Ball.hs
--- a/Sound/SC3/UGen/Record/Ball.hs
+++ b/Sound/SC3/UGen/Record/Ball.hs
@@ -1,3 +1,4 @@
+-- | physical model of bouncing object
 module Sound.SC3.UGen.Record.Ball where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BeatTrack.hs b/Sound/SC3/UGen/Record/BeatTrack.hs
--- a/Sound/SC3/UGen/Record/BeatTrack.hs
+++ b/Sound/SC3/UGen/Record/BeatTrack.hs
@@ -1,3 +1,4 @@
+-- | Autocorrelation beat tracker
 module Sound.SC3.UGen.Record.BeatTrack where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BeatTrack2.hs b/Sound/SC3/UGen/Record/BeatTrack2.hs
--- a/Sound/SC3/UGen/Record/BeatTrack2.hs
+++ b/Sound/SC3/UGen/Record/BeatTrack2.hs
@@ -1,3 +1,4 @@
+-- | Template matching beat tracker
 module Sound.SC3.UGen.Record.BeatTrack2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BiPanB2.hs b/Sound/SC3/UGen/Record/BiPanB2.hs
--- a/Sound/SC3/UGen/Record/BiPanB2.hs
+++ b/Sound/SC3/UGen/Record/BiPanB2.hs
@@ -1,3 +1,4 @@
+-- | 2D Ambisonic B-format panner.
 module Sound.SC3.UGen.Record.BiPanB2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BinData.hs b/Sound/SC3/UGen/Record/BinData.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BinData.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BinData where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BinData = BinData {
+  rate :: S.Rate,
+  buffer :: S.UGen,
+  bin :: S.UGen,
+  overlaps :: S.UGen
+  } deriving (Show)
+binData :: BinData
+binData = BinData {
+  rate = S.AR,
+  buffer = 0.0,
+  bin = 0.0,
+  overlaps = 0.5
+  }
+mkBinData :: BinData -> S.UGen
+mkBinData (BinData r a' b' c') = S.mkOsc r "BinData" [a',b',c'] 2
+instance Make BinData where
+  ugen = mkBinData
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
@@ -1,3 +1,4 @@
+-- | Band limited impulse oscillator.
 module Sound.SC3.UGen.Record.Blip where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Breakcore.hs b/Sound/SC3/UGen/Record/Breakcore.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Breakcore.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Breakcore where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Breakcore = Breakcore {
+  bufnum :: S.UGen,
+  capturein :: S.UGen,
+  capturetrigger :: S.UGen,
+  duration :: S.UGen,
+  ampdropout :: S.UGen
+  } deriving (Show)
+breakcore :: Breakcore
+breakcore = Breakcore {
+  bufnum = 0.0,
+  capturein = 0.0,
+  capturetrigger = 0.0,
+  duration = 0.1,
+  ampdropout = 0.0
+  }
+mkBreakcore :: Breakcore -> S.UGen
+mkBreakcore (Breakcore  a' b' c' d' e') = S.mkOsc S.AR "Breakcore" [a',b',c',d',e'] 1
+instance Make Breakcore where
+  ugen = mkBreakcore
diff --git a/Sound/SC3/UGen/Record/Brusselator.hs b/Sound/SC3/UGen/Record/Brusselator.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Brusselator.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Brusselator where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Brusselator = Brusselator {
+  reset :: S.UGen,
+  rate_ :: S.UGen,
+  mu :: S.UGen,
+  gamma :: S.UGen,
+  initx :: S.UGen,
+  inity :: S.UGen
+  } deriving (Show)
+brusselator :: Brusselator
+brusselator = Brusselator {
+  reset = 0.0,
+  rate_ = 0.01,
+  mu = 1.0,
+  gamma = 1.0,
+  initx = 0.5,
+  inity = 0.5
+  }
+mkBrusselator :: Brusselator -> S.UGen
+mkBrusselator (Brusselator  a' b' c' d' e' f') = S.mkOsc S.AR "Brusselator" [a',b',c',d',e',f'] 2
+instance Make Brusselator where
+  ugen = mkBrusselator
diff --git a/Sound/SC3/UGen/Record/BufAllpassC.hs b/Sound/SC3/UGen/Record/BufAllpassC.hs
--- a/Sound/SC3/UGen/Record/BufAllpassC.hs
+++ b/Sound/SC3/UGen/Record/BufAllpassC.hs
@@ -1,3 +1,4 @@
+-- | Buffer based all pass delay line with cubic interpolation.
 module Sound.SC3.UGen.Record.BufAllpassC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufAllpassL.hs b/Sound/SC3/UGen/Record/BufAllpassL.hs
--- a/Sound/SC3/UGen/Record/BufAllpassL.hs
+++ b/Sound/SC3/UGen/Record/BufAllpassL.hs
@@ -1,3 +1,4 @@
+-- | Buffer based all pass delay line with linear interpolation.
 module Sound.SC3.UGen.Record.BufAllpassL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufAllpassN.hs b/Sound/SC3/UGen/Record/BufAllpassN.hs
--- a/Sound/SC3/UGen/Record/BufAllpassN.hs
+++ b/Sound/SC3/UGen/Record/BufAllpassN.hs
@@ -1,3 +1,4 @@
+-- | Buffer based all pass delay line with no interpolation.
 module Sound.SC3.UGen.Record.BufAllpassN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufChannels.hs b/Sound/SC3/UGen/Record/BufChannels.hs
--- a/Sound/SC3/UGen/Record/BufChannels.hs
+++ b/Sound/SC3/UGen/Record/BufChannels.hs
@@ -1,3 +1,4 @@
+-- | Current number of channels of soundfile in buffer.
 module Sound.SC3.UGen.Record.BufChannels where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufCombC.hs b/Sound/SC3/UGen/Record/BufCombC.hs
--- a/Sound/SC3/UGen/Record/BufCombC.hs
+++ b/Sound/SC3/UGen/Record/BufCombC.hs
@@ -1,3 +1,4 @@
+-- | Buffer based comb delay line with cubic interpolation.
 module Sound.SC3.UGen.Record.BufCombC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufCombL.hs b/Sound/SC3/UGen/Record/BufCombL.hs
--- a/Sound/SC3/UGen/Record/BufCombL.hs
+++ b/Sound/SC3/UGen/Record/BufCombL.hs
@@ -1,3 +1,4 @@
+-- | Buffer based comb delay line with linear interpolation.
 module Sound.SC3.UGen.Record.BufCombL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufCombN.hs b/Sound/SC3/UGen/Record/BufCombN.hs
--- a/Sound/SC3/UGen/Record/BufCombN.hs
+++ b/Sound/SC3/UGen/Record/BufCombN.hs
@@ -1,3 +1,4 @@
+-- | Buffer based comb delay line with no interpolation.
 module Sound.SC3.UGen.Record.BufCombN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufDelayC.hs b/Sound/SC3/UGen/Record/BufDelayC.hs
--- a/Sound/SC3/UGen/Record/BufDelayC.hs
+++ b/Sound/SC3/UGen/Record/BufDelayC.hs
@@ -1,3 +1,4 @@
+-- | Buffer based simple delay line with cubic interpolation.
 module Sound.SC3.UGen.Record.BufDelayC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufDelayL.hs b/Sound/SC3/UGen/Record/BufDelayL.hs
--- a/Sound/SC3/UGen/Record/BufDelayL.hs
+++ b/Sound/SC3/UGen/Record/BufDelayL.hs
@@ -1,3 +1,4 @@
+-- | Buffer based simple delay line with linear interpolation.
 module Sound.SC3.UGen.Record.BufDelayL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufDelayN.hs b/Sound/SC3/UGen/Record/BufDelayN.hs
--- a/Sound/SC3/UGen/Record/BufDelayN.hs
+++ b/Sound/SC3/UGen/Record/BufDelayN.hs
@@ -1,3 +1,4 @@
+-- | Buffer based simple delay line with no interpolation.
 module Sound.SC3.UGen.Record.BufDelayN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufDur.hs b/Sound/SC3/UGen/Record/BufDur.hs
--- a/Sound/SC3/UGen/Record/BufDur.hs
+++ b/Sound/SC3/UGen/Record/BufDur.hs
@@ -1,3 +1,4 @@
+-- | Current duration of soundfile in buffer.
 module Sound.SC3.UGen.Record.BufDur where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufFrames.hs b/Sound/SC3/UGen/Record/BufFrames.hs
--- a/Sound/SC3/UGen/Record/BufFrames.hs
+++ b/Sound/SC3/UGen/Record/BufFrames.hs
@@ -1,3 +1,4 @@
+-- | Current number of frames allocated in the buffer.
 module Sound.SC3.UGen.Record.BufFrames where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufGrain.hs b/Sound/SC3/UGen/Record/BufGrain.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BufGrain.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BufGrain where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BufGrain = BufGrain {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  sndbuf :: S.UGen,
+  rate_ :: S.UGen,
+  pos :: S.UGen,
+  interp :: S.UGen
+  } deriving (Show)
+bufGrain :: BufGrain
+bufGrain = BufGrain {
+  trigger = 0.0,
+  dur = 1.0,
+  sndbuf = 0.0,
+  rate_ = 1.0,
+  pos = 0.0,
+  interp = 2.0
+  }
+mkBufGrain :: BufGrain -> S.UGen
+mkBufGrain (BufGrain  a' b' c' d' e' f') = S.mkOsc S.AR "BufGrain" [a',b',c',d',e',f'] 1
+instance Make BufGrain where
+  ugen = mkBufGrain
diff --git a/Sound/SC3/UGen/Record/BufGrainB.hs b/Sound/SC3/UGen/Record/BufGrainB.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BufGrainB.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BufGrainB where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BufGrainB = BufGrainB {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  sndbuf :: S.UGen,
+  rate_ :: S.UGen,
+  pos :: S.UGen,
+  envbuf :: S.UGen,
+  interp :: S.UGen
+  } deriving (Show)
+bufGrainB :: BufGrainB
+bufGrainB = BufGrainB {
+  trigger = 0.0,
+  dur = 1.0,
+  sndbuf = 0.0,
+  rate_ = 1.0,
+  pos = 0.0,
+  envbuf = 0.0,
+  interp = 2.0
+  }
+mkBufGrainB :: BufGrainB -> S.UGen
+mkBufGrainB (BufGrainB  a' b' c' d' e' f' g') = S.mkOsc S.AR "BufGrainB" [a',b',c',d',e',f',g'] 1
+instance Make BufGrainB where
+  ugen = mkBufGrainB
diff --git a/Sound/SC3/UGen/Record/BufGrainBBF.hs b/Sound/SC3/UGen/Record/BufGrainBBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BufGrainBBF.hs
@@ -0,0 +1,35 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BufGrainBBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BufGrainBBF = BufGrainBBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  sndbuf :: S.UGen,
+  rate_ :: S.UGen,
+  pos :: S.UGen,
+  envbuf :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  interp :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+bufGrainBBF :: BufGrainBBF
+bufGrainBBF = BufGrainBBF {
+  trigger = 0.0,
+  dur = 1.0,
+  sndbuf = 0.0,
+  rate_ = 1.0,
+  pos = 0.0,
+  envbuf = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  interp = 2.0,
+  wComp = 0.0
+  }
+mkBufGrainBBF :: BufGrainBBF -> S.UGen
+mkBufGrainBBF (BufGrainBBF  a' b' c' d' e' f' g' h' i' j' k') = S.mkOsc S.AR "BufGrainBBF" [a',b',c',d',e',f',g',h',i',j',k'] 4
+instance Make BufGrainBBF where
+  ugen = mkBufGrainBBF
diff --git a/Sound/SC3/UGen/Record/BufGrainBF.hs b/Sound/SC3/UGen/Record/BufGrainBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BufGrainBF.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BufGrainBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BufGrainBF = BufGrainBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  sndbuf :: S.UGen,
+  rate_ :: S.UGen,
+  pos :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  interp :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+bufGrainBF :: BufGrainBF
+bufGrainBF = BufGrainBF {
+  trigger = 0.0,
+  dur = 1.0,
+  sndbuf = 0.0,
+  rate_ = 1.0,
+  pos = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  interp = 2.0,
+  wComp = 0.0
+  }
+mkBufGrainBF :: BufGrainBF -> S.UGen
+mkBufGrainBF (BufGrainBF  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "BufGrainBF" [a',b',c',d',e',f',g',h',i',j'] 4
+instance Make BufGrainBF where
+  ugen = mkBufGrainBF
diff --git a/Sound/SC3/UGen/Record/BufGrainI.hs b/Sound/SC3/UGen/Record/BufGrainI.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BufGrainI.hs
@@ -0,0 +1,31 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BufGrainI where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BufGrainI = BufGrainI {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  sndbuf :: S.UGen,
+  rate_ :: S.UGen,
+  pos :: S.UGen,
+  envbuf1 :: S.UGen,
+  envbuf2 :: S.UGen,
+  ifac :: S.UGen,
+  interp :: S.UGen
+  } deriving (Show)
+bufGrainI :: BufGrainI
+bufGrainI = BufGrainI {
+  trigger = 0.0,
+  dur = 1.0,
+  sndbuf = 0.0,
+  rate_ = 1.0,
+  pos = 0.0,
+  envbuf1 = 0.0,
+  envbuf2 = 0.0,
+  ifac = 0.5,
+  interp = 2.0
+  }
+mkBufGrainI :: BufGrainI -> S.UGen
+mkBufGrainI (BufGrainI  a' b' c' d' e' f' g' h' i') = S.mkOsc S.AR "BufGrainI" [a',b',c',d',e',f',g',h',i'] 1
+instance Make BufGrainI where
+  ugen = mkBufGrainI
diff --git a/Sound/SC3/UGen/Record/BufGrainIBF.hs b/Sound/SC3/UGen/Record/BufGrainIBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BufGrainIBF.hs
@@ -0,0 +1,39 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.BufGrainIBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BufGrainIBF = BufGrainIBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  sndbuf :: S.UGen,
+  rate_ :: S.UGen,
+  pos :: S.UGen,
+  envbuf1 :: S.UGen,
+  envbuf2 :: S.UGen,
+  ifac :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  interp :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+bufGrainIBF :: BufGrainIBF
+bufGrainIBF = BufGrainIBF {
+  trigger = 0.0,
+  dur = 1.0,
+  sndbuf = 0.0,
+  rate_ = 1.0,
+  pos = 0.0,
+  envbuf1 = 0.0,
+  envbuf2 = 0.0,
+  ifac = 0.5,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  interp = 2.0,
+  wComp = 0.0
+  }
+mkBufGrainIBF :: BufGrainIBF -> S.UGen
+mkBufGrainIBF (BufGrainIBF  a' b' c' d' e' f' g' h' i' j' k' l' m') = S.mkOsc S.AR "BufGrainIBF" [a',b',c',d',e',f',g',h',i',j',k',l',m'] 4
+instance Make BufGrainIBF where
+  ugen = mkBufGrainIBF
diff --git a/Sound/SC3/UGen/Record/BufInfoUGenBase.hs b/Sound/SC3/UGen/Record/BufInfoUGenBase.hs
--- a/Sound/SC3/UGen/Record/BufInfoUGenBase.hs
+++ b/Sound/SC3/UGen/Record/BufInfoUGenBase.hs
@@ -1,3 +1,4 @@
+-- | Base class for buffer info ugens
 module Sound.SC3.UGen.Record.BufInfoUGenBase where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufMax.hs b/Sound/SC3/UGen/Record/BufMax.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BufMax.hs
@@ -0,0 +1,17 @@
+-- | detect the largest value (and its position) in an array of UGens
+module Sound.SC3.UGen.Record.BufMax where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BufMax = BufMax {
+  bufnum :: S.UGen,
+  gate :: S.UGen
+  } deriving (Show)
+bufMax :: BufMax
+bufMax = BufMax {
+  bufnum = 0.0,
+  gate = 1.0
+  }
+mkBufMax :: BufMax -> S.UGen
+mkBufMax (BufMax  a' b') = S.mkOsc S.KR "BufMax" [a',b'] 2
+instance Make BufMax where
+  ugen = mkBufMax
diff --git a/Sound/SC3/UGen/Record/BufMin.hs b/Sound/SC3/UGen/Record/BufMin.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/BufMin.hs
@@ -0,0 +1,17 @@
+-- | detect the largest value (and its position) in an array of UGens
+module Sound.SC3.UGen.Record.BufMin where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data BufMin = BufMin {
+  bufnum :: S.UGen,
+  gate :: S.UGen
+  } deriving (Show)
+bufMin :: BufMin
+bufMin = BufMin {
+  bufnum = 0.0,
+  gate = 1.0
+  }
+mkBufMin :: BufMin -> S.UGen
+mkBufMin (BufMin  a' b') = S.mkOsc S.KR "BufMin" [a',b'] 2
+instance Make BufMin where
+  ugen = mkBufMin
diff --git a/Sound/SC3/UGen/Record/BufRateScale.hs b/Sound/SC3/UGen/Record/BufRateScale.hs
--- a/Sound/SC3/UGen/Record/BufRateScale.hs
+++ b/Sound/SC3/UGen/Record/BufRateScale.hs
@@ -1,3 +1,4 @@
+-- | Buffer rate scaling in respect to server samplerate.
 module Sound.SC3.UGen.Record.BufRateScale where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufRd.hs b/Sound/SC3/UGen/Record/BufRd.hs
--- a/Sound/SC3/UGen/Record/BufRd.hs
+++ b/Sound/SC3/UGen/Record/BufRd.hs
@@ -1,9 +1,9 @@
+-- | Buffer reading oscillator.
 module Sound.SC3.UGen.Record.BufRd where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data BufRd = BufRd {
   rate :: S.Rate,
-  numChannels :: S.UGen,
   bufnum :: S.UGen,
   phase :: S.UGen,
   loop :: S.UGen,
@@ -12,13 +12,12 @@
 bufRd :: BufRd
 bufRd = BufRd {
   rate = S.AR,
-  numChannels = 0.0,
   bufnum = 0.0,
   phase = 0.0,
   loop = 1.0,
   interpolation = 2.0
   }
 mkBufRd :: BufRd -> S.UGen
-mkBufRd (BufRd r a' b' c' d' e') = S.mkOsc r "BufRd" [a',b',c',d',e'] 1
+mkBufRd (BufRd r a' b' c' d') = S.mkOsc r "BufRd" [a',b',c',d'] undefined
 instance Make BufRd where
   ugen = mkBufRd
diff --git a/Sound/SC3/UGen/Record/BufSampleRate.hs b/Sound/SC3/UGen/Record/BufSampleRate.hs
--- a/Sound/SC3/UGen/Record/BufSampleRate.hs
+++ b/Sound/SC3/UGen/Record/BufSampleRate.hs
@@ -1,3 +1,4 @@
+-- | Buffer sample rate.
 module Sound.SC3.UGen.Record.BufSampleRate where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufSamples.hs b/Sound/SC3/UGen/Record/BufSamples.hs
--- a/Sound/SC3/UGen/Record/BufSamples.hs
+++ b/Sound/SC3/UGen/Record/BufSamples.hs
@@ -1,3 +1,4 @@
+-- | Current number of samples in buffer.
 module Sound.SC3.UGen.Record.BufSamples where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/BufWr.hs b/Sound/SC3/UGen/Record/BufWr.hs
--- a/Sound/SC3/UGen/Record/BufWr.hs
+++ b/Sound/SC3/UGen/Record/BufWr.hs
@@ -1,3 +1,4 @@
+-- | Buffer writing oscillator.
 module Sound.SC3.UGen.Record.BufWr where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/COsc.hs b/Sound/SC3/UGen/Record/COsc.hs
--- a/Sound/SC3/UGen/Record/COsc.hs
+++ b/Sound/SC3/UGen/Record/COsc.hs
@@ -1,3 +1,4 @@
+-- | Chorusing wavetable oscillator.
 module Sound.SC3.UGen.Record.COsc where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/CQ_Diff.hs b/Sound/SC3/UGen/Record/CQ_Diff.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/CQ_Diff.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.CQ_Diff where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data CQ_Diff = CQ_Diff {
+  in1 :: S.UGen,
+  in2 :: S.UGen,
+  databufnum :: S.UGen
+  } deriving (Show)
+cQ_Diff :: CQ_Diff
+cQ_Diff = CQ_Diff {
+  in1 = 0.0,
+  in2 = 0.0,
+  databufnum = 0.0
+  }
+mkCQ_Diff :: CQ_Diff -> S.UGen
+mkCQ_Diff (CQ_Diff  a' b' c') = S.mkOsc S.KR "CQ_Diff" [a',b',c'] 1
+instance Make CQ_Diff where
+  ugen = mkCQ_Diff
diff --git a/Sound/SC3/UGen/Record/Cepstrum.hs b/Sound/SC3/UGen/Record/Cepstrum.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Cepstrum.hs
@@ -0,0 +1,17 @@
+-- | Quefrency analysis and liftering
+module Sound.SC3.UGen.Record.Cepstrum where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Cepstrum = Cepstrum {
+  cepbuf :: S.UGen,
+  fftchain :: S.UGen
+  } deriving (Show)
+cepstrum :: Cepstrum
+cepstrum = Cepstrum {
+  cepbuf = 0.0,
+  fftchain = 0.0
+  }
+mkCepstrum :: Cepstrum -> S.UGen
+mkCepstrum (Cepstrum  a' b') = S.mkOsc S.KR "Cepstrum" [a',b'] 1
+instance Make Cepstrum where
+  ugen = mkCepstrum
diff --git a/Sound/SC3/UGen/Record/Changed.hs b/Sound/SC3/UGen/Record/Changed.hs
--- a/Sound/SC3/UGen/Record/Changed.hs
+++ b/Sound/SC3/UGen/Record/Changed.hs
@@ -1,3 +1,4 @@
+-- | Triggers when a value changes
 module Sound.SC3.UGen.Record.Changed where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ChaosGen.hs b/Sound/SC3/UGen/Record/ChaosGen.hs
--- a/Sound/SC3/UGen/Record/ChaosGen.hs
+++ b/Sound/SC3/UGen/Record/ChaosGen.hs
@@ -1,3 +1,4 @@
+-- | UGens that cause chaos
 module Sound.SC3.UGen.Record.ChaosGen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/CheckBadValues.hs b/Sound/SC3/UGen/Record/CheckBadValues.hs
--- a/Sound/SC3/UGen/Record/CheckBadValues.hs
+++ b/Sound/SC3/UGen/Record/CheckBadValues.hs
@@ -1,3 +1,4 @@
+-- | Test for infinity, not-a-number, and denormals
 module Sound.SC3.UGen.Record.CheckBadValues where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ChuaL.hs b/Sound/SC3/UGen/Record/ChuaL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/ChuaL.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.ChuaL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data ChuaL = ChuaL {
+  freq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  c :: S.UGen,
+  d :: S.UGen,
+  rr :: S.UGen,
+  h :: S.UGen,
+  xi :: S.UGen,
+  yi :: S.UGen,
+  zi :: S.UGen
+  } deriving (Show)
+chuaL :: ChuaL
+chuaL = ChuaL {
+  freq = 22050.0,
+  a = 0.3286,
+  b = 0.9336,
+  c = -0.8126,
+  d = 0.399,
+  rr = 0.0,
+  h = 0.05,
+  xi = 0.1,
+  yi = 0.0,
+  zi = 0.0
+  }
+mkChuaL :: ChuaL -> S.UGen
+mkChuaL (ChuaL  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "ChuaL" [a',b',c',d',e',f',g',h',i',j'] 1
+instance Make ChuaL where
+  ugen = mkChuaL
diff --git a/Sound/SC3/UGen/Record/CircleRamp.hs b/Sound/SC3/UGen/Record/CircleRamp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/CircleRamp.hs
@@ -0,0 +1,23 @@
+-- | circular linear lag
+module Sound.SC3.UGen.Record.CircleRamp where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data CircleRamp = CircleRamp {
+  rate :: S.Rate,
+  input :: S.UGen,
+  lagTime :: S.UGen,
+  circmin :: S.UGen,
+  circmax :: S.UGen
+  } deriving (Show)
+circleRamp :: CircleRamp
+circleRamp = CircleRamp {
+  rate = S.AR,
+  input = 0.0,
+  lagTime = 0.1,
+  circmin = -180.0,
+  circmax = 180.0
+  }
+mkCircleRamp :: CircleRamp -> S.UGen
+mkCircleRamp (CircleRamp r a' b' c' d') = S.mkOsc r "CircleRamp" [a',b',c',d'] 1
+instance Make CircleRamp where
+  ugen = mkCircleRamp
diff --git a/Sound/SC3/UGen/Record/ClearBuf.hs b/Sound/SC3/UGen/Record/ClearBuf.hs
--- a/Sound/SC3/UGen/Record/ClearBuf.hs
+++ b/Sound/SC3/UGen/Record/ClearBuf.hs
@@ -1,3 +1,4 @@
+-- | (not documented)
 module Sound.SC3.UGen.Record.ClearBuf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Clip.hs b/Sound/SC3/UGen/Record/Clip.hs
--- a/Sound/SC3/UGen/Record/Clip.hs
+++ b/Sound/SC3/UGen/Record/Clip.hs
@@ -1,3 +1,4 @@
+-- | Clip a signal outside given thresholds.
 module Sound.SC3.UGen.Record.Clip where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Clipper32.hs b/Sound/SC3/UGen/Record/Clipper32.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Clipper32.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Clipper32 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Clipper32 = Clipper32 {
+  input :: S.UGen,
+  lo :: S.UGen,
+  hi :: S.UGen
+  } deriving (Show)
+clipper32 :: Clipper32
+clipper32 = Clipper32 {
+  input = 0.0,
+  lo = -0.8,
+  hi = 0.8
+  }
+mkClipper32 :: Clipper32 -> S.UGen
+mkClipper32 (Clipper32  a' b' c') = S.mkOsc S.AR "Clipper32" [a',b',c'] 1
+instance Make Clipper32 where
+  ugen = mkClipper32
diff --git a/Sound/SC3/UGen/Record/Clipper4.hs b/Sound/SC3/UGen/Record/Clipper4.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Clipper4.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Clipper4 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Clipper4 = Clipper4 {
+  input :: S.UGen,
+  lo :: S.UGen,
+  hi :: S.UGen
+  } deriving (Show)
+clipper4 :: Clipper4
+clipper4 = Clipper4 {
+  input = 0.0,
+  lo = -0.8,
+  hi = 0.8
+  }
+mkClipper4 :: Clipper4 -> S.UGen
+mkClipper4 (Clipper4  a' b' c') = S.mkOsc S.AR "Clipper4" [a',b',c'] 1
+instance Make Clipper4 where
+  ugen = mkClipper4
diff --git a/Sound/SC3/UGen/Record/Clipper8.hs b/Sound/SC3/UGen/Record/Clipper8.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Clipper8.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Clipper8 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Clipper8 = Clipper8 {
+  input :: S.UGen,
+  lo :: S.UGen,
+  hi :: S.UGen
+  } deriving (Show)
+clipper8 :: Clipper8
+clipper8 = Clipper8 {
+  input = 0.0,
+  lo = -0.8,
+  hi = 0.8
+  }
+mkClipper8 :: Clipper8 -> S.UGen
+mkClipper8 (Clipper8  a' b' c') = S.mkOsc S.AR "Clipper8" [a',b',c'] 1
+instance Make Clipper8 where
+  ugen = mkClipper8
diff --git a/Sound/SC3/UGen/Record/CoinGate.hs b/Sound/SC3/UGen/Record/CoinGate.hs
--- a/Sound/SC3/UGen/Record/CoinGate.hs
+++ b/Sound/SC3/UGen/Record/CoinGate.hs
@@ -1,3 +1,4 @@
+-- | Statistical gate.
 module Sound.SC3.UGen.Record.CoinGate where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/CombC.hs b/Sound/SC3/UGen/Record/CombC.hs
--- a/Sound/SC3/UGen/Record/CombC.hs
+++ b/Sound/SC3/UGen/Record/CombC.hs
@@ -1,3 +1,4 @@
+-- | Comb delay line with cubic interpolation.
 module Sound.SC3.UGen.Record.CombC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/CombL.hs b/Sound/SC3/UGen/Record/CombL.hs
--- a/Sound/SC3/UGen/Record/CombL.hs
+++ b/Sound/SC3/UGen/Record/CombL.hs
@@ -1,3 +1,4 @@
+-- | Comb delay line with linear interpolation.
 module Sound.SC3.UGen.Record.CombL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/CombLP.hs b/Sound/SC3/UGen/Record/CombLP.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/CombLP.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.CombLP where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data CombLP = CombLP {
+  input :: S.UGen,
+  gate :: S.UGen,
+  maxdelaytime :: S.UGen,
+  delaytime :: S.UGen,
+  decaytime :: S.UGen,
+  coef :: S.UGen
+  } deriving (Show)
+combLP :: CombLP
+combLP = CombLP {
+  input = 0.0,
+  gate = 1.0,
+  maxdelaytime = 0.2,
+  delaytime = 0.2,
+  decaytime = 1.0,
+  coef = 0.5
+  }
+mkCombLP :: CombLP -> S.UGen
+mkCombLP (CombLP  a' b' c' d' e' f') = S.mkOsc S.AR "CombLP" [a',b',c',d',e',f'] 1
+instance Make CombLP where
+  ugen = mkCombLP
diff --git a/Sound/SC3/UGen/Record/CombN.hs b/Sound/SC3/UGen/Record/CombN.hs
--- a/Sound/SC3/UGen/Record/CombN.hs
+++ b/Sound/SC3/UGen/Record/CombN.hs
@@ -1,3 +1,4 @@
+-- | Comb delay line with no interpolation.
 module Sound.SC3.UGen.Record.CombN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Compander.hs b/Sound/SC3/UGen/Record/Compander.hs
--- a/Sound/SC3/UGen/Record/Compander.hs
+++ b/Sound/SC3/UGen/Record/Compander.hs
@@ -1,3 +1,4 @@
+-- | Compressor, expander, limiter, gate, ducker
 module Sound.SC3.UGen.Record.Compander where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/CompanderD.hs b/Sound/SC3/UGen/Record/CompanderD.hs
--- a/Sound/SC3/UGen/Record/CompanderD.hs
+++ b/Sound/SC3/UGen/Record/CompanderD.hs
@@ -1,3 +1,4 @@
+-- | Compressor, expander, limiter, gate, ducker.
 module Sound.SC3.UGen.Record.CompanderD where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Concat.hs b/Sound/SC3/UGen/Record/Concat.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Concat.hs
@@ -0,0 +1,37 @@
+-- | Concatenative Cross-Synthesis on Live Streams
+module Sound.SC3.UGen.Record.Concat where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Concat = Concat {
+  control :: S.UGen,
+  source :: S.UGen,
+  storesize :: S.UGen,
+  seektime :: S.UGen,
+  seekdur :: S.UGen,
+  matchlength :: S.UGen,
+  freezestore :: S.UGen,
+  zcr :: S.UGen,
+  lms :: S.UGen,
+  sc :: S.UGen,
+  st :: S.UGen,
+  randscore :: S.UGen
+  } deriving (Show)
+concat :: Concat
+concat = Concat {
+  control = 0.0,
+  source = 0.0,
+  storesize = 1.0,
+  seektime = 1.0,
+  seekdur = 1.0,
+  matchlength = 0.05,
+  freezestore = 0.0,
+  zcr = 1.0,
+  lms = 1.0,
+  sc = 1.0,
+  st = 0.0,
+  randscore = 0.0
+  }
+mkConcat :: Concat -> S.UGen
+mkConcat (Concat  a' b' c' d' e' f' g' h' i' j' k' l') = S.mkOsc S.AR "Concat" [a',b',c',d',e',f',g',h',i',j',k',l'] 1
+instance Make Concat where
+  ugen = mkConcat
diff --git a/Sound/SC3/UGen/Record/Concat2.hs b/Sound/SC3/UGen/Record/Concat2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Concat2.hs
@@ -0,0 +1,39 @@
+-- | Concatenative Cross-Synthesis on Live Streams
+module Sound.SC3.UGen.Record.Concat2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Concat2 = Concat2 {
+  control :: S.UGen,
+  source :: S.UGen,
+  storesize :: S.UGen,
+  seektime :: S.UGen,
+  seekdur :: S.UGen,
+  matchlength :: S.UGen,
+  freezestore :: S.UGen,
+  zcr :: S.UGen,
+  lms :: S.UGen,
+  sc :: S.UGen,
+  st :: S.UGen,
+  randscore :: S.UGen,
+  threshold :: S.UGen
+  } deriving (Show)
+concat2 :: Concat2
+concat2 = Concat2 {
+  control = 0.0,
+  source = 0.0,
+  storesize = 1.0,
+  seektime = 1.0,
+  seekdur = 1.0,
+  matchlength = 0.05,
+  freezestore = 0.0,
+  zcr = 1.0,
+  lms = 1.0,
+  sc = 1.0,
+  st = 0.0,
+  randscore = 0.0,
+  threshold = 0.01
+  }
+mkConcat2 :: Concat2 -> S.UGen
+mkConcat2 (Concat2  a' b' c' d' e' f' g' h' i' j' k' l' m') = S.mkOsc S.AR "Concat2" [a',b',c',d',e',f',g',h',i',j',k',l',m'] 1
+instance Make Concat2 where
+  ugen = mkConcat2
diff --git a/Sound/SC3/UGen/Record/Control.hs b/Sound/SC3/UGen/Record/Control.hs
--- a/Sound/SC3/UGen/Record/Control.hs
+++ b/Sound/SC3/UGen/Record/Control.hs
@@ -1,3 +1,4 @@
+-- | Bring signals and floats into the ugenGraph function of a SynthDef.
 module Sound.SC3.UGen.Record.Control where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Convolution.hs b/Sound/SC3/UGen/Record/Convolution.hs
--- a/Sound/SC3/UGen/Record/Convolution.hs
+++ b/Sound/SC3/UGen/Record/Convolution.hs
@@ -1,3 +1,4 @@
+-- | Real-time convolver.
 module Sound.SC3.UGen.Record.Convolution where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Real-time fixed kernel convolver.
 module Sound.SC3.UGen.Record.Convolution2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Real-time convolver with linear interpolation
 module Sound.SC3.UGen.Record.Convolution2L where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Time based convolver.
 module Sound.SC3.UGen.Record.Convolution3 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Coyote.hs b/Sound/SC3/UGen/Record/Coyote.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Coyote.hs
@@ -0,0 +1,27 @@
+-- | an amplitude tracking based onset detector
+module Sound.SC3.UGen.Record.Coyote where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Coyote = Coyote {
+  input :: S.UGen,
+  trackFall :: S.UGen,
+  slowLag :: S.UGen,
+  fastLag :: S.UGen,
+  fastMul :: S.UGen,
+  thresh :: S.UGen,
+  minDur :: S.UGen
+  } deriving (Show)
+coyote :: Coyote
+coyote = Coyote {
+  input = 0.0,
+  trackFall = 0.2,
+  slowLag = 0.2,
+  fastLag = 0.01,
+  fastMul = 0.5,
+  thresh = 0.05,
+  minDur = 0.1
+  }
+mkCoyote :: Coyote -> S.UGen
+mkCoyote (Coyote  a' b' c' d' e' f' g') = S.mkOsc S.KR "Coyote" [a',b',c',d',e',f',g'] 1
+instance Make Coyote where
+  ugen = mkCoyote
diff --git a/Sound/SC3/UGen/Record/Crackle.hs b/Sound/SC3/UGen/Record/Crackle.hs
--- a/Sound/SC3/UGen/Record/Crackle.hs
+++ b/Sound/SC3/UGen/Record/Crackle.hs
@@ -1,3 +1,4 @@
+-- | Chaotic noise function.
 module Sound.SC3.UGen.Record.Crackle where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Crest.hs b/Sound/SC3/UGen/Record/Crest.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Crest.hs
@@ -0,0 +1,19 @@
+-- | Measure the temporal crest factor of a signal
+module Sound.SC3.UGen.Record.Crest where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Crest = Crest {
+  input :: S.UGen,
+  numsamps :: S.UGen,
+  gate :: S.UGen
+  } deriving (Show)
+crest :: Crest
+crest = Crest {
+  input = 0.0,
+  numsamps = 400.0,
+  gate = 1.0
+  }
+mkCrest :: Crest -> S.UGen
+mkCrest (Crest  a' b' c') = S.mkOsc S.KR "Crest" [a',b',c'] 1
+instance Make Crest where
+  ugen = mkCrest
diff --git a/Sound/SC3/UGen/Record/CrossoverDistortion.hs b/Sound/SC3/UGen/Record/CrossoverDistortion.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/CrossoverDistortion.hs
@@ -0,0 +1,19 @@
+-- | port of some ladspa plugins
+module Sound.SC3.UGen.Record.CrossoverDistortion where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data CrossoverDistortion = CrossoverDistortion {
+  input :: S.UGen,
+  amp :: S.UGen,
+  smooth :: S.UGen
+  } deriving (Show)
+crossoverDistortion :: CrossoverDistortion
+crossoverDistortion = CrossoverDistortion {
+  input = 0.0,
+  amp = 0.5,
+  smooth = 0.5
+  }
+mkCrossoverDistortion :: CrossoverDistortion -> S.UGen
+mkCrossoverDistortion (CrossoverDistortion  a' b' c') = S.mkOsc S.AR "CrossoverDistortion" [a',b',c'] 1
+instance Make CrossoverDistortion where
+  ugen = mkCrossoverDistortion
diff --git a/Sound/SC3/UGen/Record/CuspL.hs b/Sound/SC3/UGen/Record/CuspL.hs
--- a/Sound/SC3/UGen/Record/CuspL.hs
+++ b/Sound/SC3/UGen/Record/CuspL.hs
@@ -1,3 +1,4 @@
+-- | Cusp map chaotic generator
 module Sound.SC3.UGen.Record.CuspL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/CuspN.hs b/Sound/SC3/UGen/Record/CuspN.hs
--- a/Sound/SC3/UGen/Record/CuspN.hs
+++ b/Sound/SC3/UGen/Record/CuspN.hs
@@ -1,3 +1,4 @@
+-- | Cusp map chaotic generator
 module Sound.SC3.UGen.Record.CuspN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DC.hs b/Sound/SC3/UGen/Record/DC.hs
--- a/Sound/SC3/UGen/Record/DC.hs
+++ b/Sound/SC3/UGen/Record/DC.hs
@@ -1,3 +1,4 @@
+-- | Create a constant amplitude signal
 module Sound.SC3.UGen.Record.DC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DFM1.hs b/Sound/SC3/UGen/Record/DFM1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DFM1.hs
@@ -0,0 +1,25 @@
+-- | Digitally modelled analog filter
+module Sound.SC3.UGen.Record.DFM1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DFM1 = DFM1 {
+  input :: S.UGen,
+  freq :: S.UGen,
+  res :: S.UGen,
+  inputgain :: S.UGen,
+  type_ :: S.UGen,
+  noiselevel :: S.UGen
+  } deriving (Show)
+dFM1 :: DFM1
+dFM1 = DFM1 {
+  input = 0.0,
+  freq = 1000.0,
+  res = 0.1,
+  inputgain = 1.0,
+  type_ = 0.0,
+  noiselevel = 0.0003
+  }
+mkDFM1 :: DFM1 -> S.UGen
+mkDFM1 (DFM1  a' b' c' d' e' f') = S.mkOsc S.AR "DFM1" [a',b',c',d',e',f'] 1
+instance Make DFM1 where
+  ugen = mkDFM1
diff --git a/Sound/SC3/UGen/Record/DUGen.hs b/Sound/SC3/UGen/Record/DUGen.hs
--- a/Sound/SC3/UGen/Record/DUGen.hs
+++ b/Sound/SC3/UGen/Record/DUGen.hs
@@ -1,3 +1,4 @@
+-- | (not documented)
 module Sound.SC3.UGen.Record.DUGen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dbrown.hs b/Sound/SC3/UGen/Record/Dbrown.hs
--- a/Sound/SC3/UGen/Record/Dbrown.hs
+++ b/Sound/SC3/UGen/Record/Dbrown.hs
@@ -1,3 +1,4 @@
+-- | Demand rate brownian movement generator.
 module Sound.SC3.UGen.Record.Dbrown where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dbrown2.hs b/Sound/SC3/UGen/Record/Dbrown2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Dbrown2.hs
@@ -0,0 +1,23 @@
+-- | demand rate brownian movement with Gendyn distributions
+module Sound.SC3.UGen.Record.Dbrown2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Dbrown2 = Dbrown2 {
+  lo :: S.UGen,
+  hi :: S.UGen,
+  step :: S.UGen,
+  dist :: S.UGen,
+  length_ :: S.UGen
+  } deriving (Show)
+dbrown2 :: Dbrown2
+dbrown2 = Dbrown2 {
+  lo = 0.0,
+  hi = 0.0,
+  step = 0.0,
+  dist = 0.0,
+  length_ = 100000000.0
+  }
+mkDbrown2 :: Dbrown2 -> S.UGen
+mkDbrown2 (Dbrown2  a' b' c' d' e') = S.mkOsc S.DR "Dbrown2" [a',b',c',d',e'] 1
+instance Make Dbrown2 where
+  ugen = mkDbrown2
diff --git a/Sound/SC3/UGen/Record/Dbufrd.hs b/Sound/SC3/UGen/Record/Dbufrd.hs
--- a/Sound/SC3/UGen/Record/Dbufrd.hs
+++ b/Sound/SC3/UGen/Record/Dbufrd.hs
@@ -1,3 +1,4 @@
+-- | Buffer read demand ugen
 module Sound.SC3.UGen.Record.Dbufrd where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dbufwr.hs b/Sound/SC3/UGen/Record/Dbufwr.hs
--- a/Sound/SC3/UGen/Record/Dbufwr.hs
+++ b/Sound/SC3/UGen/Record/Dbufwr.hs
@@ -1,3 +1,4 @@
+-- | Buffer write demand ugen
 module Sound.SC3.UGen.Record.Dbufwr where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Decay.hs b/Sound/SC3/UGen/Record/Decay.hs
--- a/Sound/SC3/UGen/Record/Decay.hs
+++ b/Sound/SC3/UGen/Record/Decay.hs
@@ -1,3 +1,4 @@
+-- | Exponential decay
 module Sound.SC3.UGen.Record.Decay where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Decay2.hs b/Sound/SC3/UGen/Record/Decay2.hs
--- a/Sound/SC3/UGen/Record/Decay2.hs
+++ b/Sound/SC3/UGen/Record/Decay2.hs
@@ -1,3 +1,4 @@
+-- | Exponential decay.
 module Sound.SC3.UGen.Record.Decay2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Decimator.hs b/Sound/SC3/UGen/Record/Decimator.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Decimator.hs
@@ -0,0 +1,19 @@
+-- | port of some ladspa plugins
+module Sound.SC3.UGen.Record.Decimator where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Decimator = Decimator {
+  input :: S.UGen,
+  rate_ :: S.UGen,
+  bits :: S.UGen
+  } deriving (Show)
+decimator :: Decimator
+decimator = Decimator {
+  input = 0.0,
+  rate_ = 44100.0,
+  bits = 24.0
+  }
+mkDecimator :: Decimator -> S.UGen
+mkDecimator (Decimator  a' b' c') = S.mkOsc S.AR "Decimator" [a',b',c'] 1
+instance Make Decimator where
+  ugen = mkDecimator
diff --git a/Sound/SC3/UGen/Record/DecodeB2.hs b/Sound/SC3/UGen/Record/DecodeB2.hs
--- a/Sound/SC3/UGen/Record/DecodeB2.hs
+++ b/Sound/SC3/UGen/Record/DecodeB2.hs
@@ -1,9 +1,9 @@
+-- | 2D Ambisonic B-format decoder.
 module Sound.SC3.UGen.Record.DecodeB2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data DecodeB2 = DecodeB2 {
   rate :: S.Rate,
-  numChans :: S.UGen,
   w :: S.UGen,
   x :: S.UGen,
   y :: S.UGen,
@@ -12,13 +12,12 @@
 decodeB2 :: DecodeB2
 decodeB2 = DecodeB2 {
   rate = S.AR,
-  numChans = 0.0,
   w = 0.0,
   x = 0.0,
   y = 0.0,
   orientation = 0.5
   }
 mkDecodeB2 :: DecodeB2 -> S.UGen
-mkDecodeB2 (DecodeB2 r a' b' c' d' e') = S.mkOsc r "DecodeB2" [a',b',c',d',e'] 1
+mkDecodeB2 (DecodeB2 r a' b' c' d') = S.mkOsc r "DecodeB2" [a',b',c',d'] undefined
 instance Make DecodeB2 where
   ugen = mkDecodeB2
diff --git a/Sound/SC3/UGen/Record/DegreeToKey.hs b/Sound/SC3/UGen/Record/DegreeToKey.hs
--- a/Sound/SC3/UGen/Record/DegreeToKey.hs
+++ b/Sound/SC3/UGen/Record/DegreeToKey.hs
@@ -1,3 +1,4 @@
+-- | Convert signal to modal pitch.
 module Sound.SC3.UGen.Record.DegreeToKey where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DelTapRd.hs b/Sound/SC3/UGen/Record/DelTapRd.hs
--- a/Sound/SC3/UGen/Record/DelTapRd.hs
+++ b/Sound/SC3/UGen/Record/DelTapRd.hs
@@ -1,3 +1,4 @@
+-- | Tap a delay line from a DelTapWr UGen
 module Sound.SC3.UGen.Record.DelTapRd where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DelTapWr.hs b/Sound/SC3/UGen/Record/DelTapWr.hs
--- a/Sound/SC3/UGen/Record/DelTapWr.hs
+++ b/Sound/SC3/UGen/Record/DelTapWr.hs
@@ -1,3 +1,4 @@
+-- | Write to a buffer for a DelTapRd UGen
 module Sound.SC3.UGen.Record.DelTapWr where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Delay1.hs b/Sound/SC3/UGen/Record/Delay1.hs
--- a/Sound/SC3/UGen/Record/Delay1.hs
+++ b/Sound/SC3/UGen/Record/Delay1.hs
@@ -1,3 +1,4 @@
+-- | Single sample delay.
 module Sound.SC3.UGen.Record.Delay1 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Delay2.hs b/Sound/SC3/UGen/Record/Delay2.hs
--- a/Sound/SC3/UGen/Record/Delay2.hs
+++ b/Sound/SC3/UGen/Record/Delay2.hs
@@ -1,3 +1,4 @@
+-- | Two sample delay.
 module Sound.SC3.UGen.Record.Delay2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DelayC.hs b/Sound/SC3/UGen/Record/DelayC.hs
--- a/Sound/SC3/UGen/Record/DelayC.hs
+++ b/Sound/SC3/UGen/Record/DelayC.hs
@@ -1,3 +1,4 @@
+-- | Simple delay line with cubic interpolation.
 module Sound.SC3.UGen.Record.DelayC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DelayL.hs b/Sound/SC3/UGen/Record/DelayL.hs
--- a/Sound/SC3/UGen/Record/DelayL.hs
+++ b/Sound/SC3/UGen/Record/DelayL.hs
@@ -1,3 +1,4 @@
+-- | Simple delay line with linear interpolation.
 module Sound.SC3.UGen.Record.DelayL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DelayN.hs b/Sound/SC3/UGen/Record/DelayN.hs
--- a/Sound/SC3/UGen/Record/DelayN.hs
+++ b/Sound/SC3/UGen/Record/DelayN.hs
@@ -1,3 +1,4 @@
+-- | Simple delay line with no interpolation.
 module Sound.SC3.UGen.Record.DelayN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Demand.hs b/Sound/SC3/UGen/Record/Demand.hs
--- a/Sound/SC3/UGen/Record/Demand.hs
+++ b/Sound/SC3/UGen/Record/Demand.hs
@@ -1,3 +1,4 @@
+-- | Demand results from demand rate UGens.
 module Sound.SC3.UGen.Record.Demand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DemandEnvGen.hs b/Sound/SC3/UGen/Record/DemandEnvGen.hs
--- a/Sound/SC3/UGen/Record/DemandEnvGen.hs
+++ b/Sound/SC3/UGen/Record/DemandEnvGen.hs
@@ -1,3 +1,4 @@
+-- | Demand rate envelope generator
 module Sound.SC3.UGen.Record.DemandEnvGen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DetaBlockerBuf.hs b/Sound/SC3/UGen/Record/DetaBlockerBuf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DetaBlockerBuf.hs
@@ -0,0 +1,17 @@
+-- | A Demand UGen running an adapted BetaBlocker VChip
+module Sound.SC3.UGen.Record.DetaBlockerBuf where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DetaBlockerBuf = DetaBlockerBuf {
+  bufnum :: S.UGen,
+  startpoint :: S.UGen
+  } deriving (Show)
+detaBlockerBuf :: DetaBlockerBuf
+detaBlockerBuf = DetaBlockerBuf {
+  bufnum = 0.0,
+  startpoint = 0.0
+  }
+mkDetaBlockerBuf :: DetaBlockerBuf -> S.UGen
+mkDetaBlockerBuf (DetaBlockerBuf  a' b') = S.mkOsc S.DR "DetaBlockerBuf" [a',b'] 1
+instance Make DetaBlockerBuf where
+  ugen = mkDetaBlockerBuf
diff --git a/Sound/SC3/UGen/Record/DetectIndex.hs b/Sound/SC3/UGen/Record/DetectIndex.hs
--- a/Sound/SC3/UGen/Record/DetectIndex.hs
+++ b/Sound/SC3/UGen/Record/DetectIndex.hs
@@ -1,3 +1,4 @@
+-- | Search a buffer for a value
 module Sound.SC3.UGen.Record.DetectIndex where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DetectSilence.hs b/Sound/SC3/UGen/Record/DetectSilence.hs
--- a/Sound/SC3/UGen/Record/DetectSilence.hs
+++ b/Sound/SC3/UGen/Record/DetectSilence.hs
@@ -1,3 +1,4 @@
+-- | When input falls below a threshhold, evaluate doneAction.
 module Sound.SC3.UGen.Record.DetectSilence where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dgauss.hs b/Sound/SC3/UGen/Record/Dgauss.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Dgauss.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Dgauss where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Dgauss = Dgauss {
+  lo :: S.UGen,
+  hi :: S.UGen,
+  length_ :: S.UGen
+  } deriving (Show)
+dgauss :: Dgauss
+dgauss = Dgauss {
+  lo = 0.0,
+  hi = 0.0,
+  length_ = 100000000.0
+  }
+mkDgauss :: Dgauss -> S.UGen
+mkDgauss (Dgauss  a' b' c') = S.mkOsc S.DR "Dgauss" [a',b',c'] 1
+instance Make Dgauss where
+  ugen = mkDgauss
diff --git a/Sound/SC3/UGen/Record/Dgeom.hs b/Sound/SC3/UGen/Record/Dgeom.hs
--- a/Sound/SC3/UGen/Record/Dgeom.hs
+++ b/Sound/SC3/UGen/Record/Dgeom.hs
@@ -1,3 +1,4 @@
+-- | Demand rate geometric series UGen.
 module Sound.SC3.UGen.Record.Dgeom where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dibrown.hs b/Sound/SC3/UGen/Record/Dibrown.hs
--- a/Sound/SC3/UGen/Record/Dibrown.hs
+++ b/Sound/SC3/UGen/Record/Dibrown.hs
@@ -1,3 +1,4 @@
+-- | Demand rate brownian movement generator.
 module Sound.SC3.UGen.Record.Dibrown where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Disintegrator.hs b/Sound/SC3/UGen/Record/Disintegrator.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Disintegrator.hs
@@ -0,0 +1,19 @@
+-- | port of some ladspa plugins
+module Sound.SC3.UGen.Record.Disintegrator where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Disintegrator = Disintegrator {
+  input :: S.UGen,
+  probability :: S.UGen,
+  multiplier :: S.UGen
+  } deriving (Show)
+disintegrator :: Disintegrator
+disintegrator = Disintegrator {
+  input = 0.0,
+  probability = 0.5,
+  multiplier = 0.0
+  }
+mkDisintegrator :: Disintegrator -> S.UGen
+mkDisintegrator (Disintegrator  a' b' c') = S.mkOsc S.AR "Disintegrator" [a',b',c'] 1
+instance Make Disintegrator where
+  ugen = mkDisintegrator
diff --git a/Sound/SC3/UGen/Record/DiskIn.hs b/Sound/SC3/UGen/Record/DiskIn.hs
--- a/Sound/SC3/UGen/Record/DiskIn.hs
+++ b/Sound/SC3/UGen/Record/DiskIn.hs
@@ -1,18 +1,17 @@
+-- | Stream in audio from a file.
 module Sound.SC3.UGen.Record.DiskIn where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data DiskIn = DiskIn {
-  numChannels :: S.UGen,
   bufnum :: S.UGen,
   loop :: S.UGen
   } deriving (Show)
 diskIn :: DiskIn
 diskIn = DiskIn {
-  numChannels = 0.0,
   bufnum = 0.0,
   loop = 0.0
   }
 mkDiskIn :: DiskIn -> S.UGen
-mkDiskIn (DiskIn  a' b' c') = S.mkOsc S.AR "DiskIn" [a',b',c'] 1
+mkDiskIn (DiskIn  a' b') = S.mkOsc S.AR "DiskIn" [a',b'] undefined
 instance Make DiskIn where
   ugen = mkDiskIn
diff --git a/Sound/SC3/UGen/Record/DiskOut.hs b/Sound/SC3/UGen/Record/DiskOut.hs
--- a/Sound/SC3/UGen/Record/DiskOut.hs
+++ b/Sound/SC3/UGen/Record/DiskOut.hs
@@ -1,3 +1,4 @@
+-- | Record to a soundfile to disk.
 module Sound.SC3.UGen.Record.DiskOut where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Diwhite.hs b/Sound/SC3/UGen/Record/Diwhite.hs
--- a/Sound/SC3/UGen/Record/Diwhite.hs
+++ b/Sound/SC3/UGen/Record/Diwhite.hs
@@ -1,3 +1,4 @@
+-- | Demand rate white noise random generator.
 module Sound.SC3.UGen.Record.Diwhite where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Donce.hs b/Sound/SC3/UGen/Record/Donce.hs
--- a/Sound/SC3/UGen/Record/Donce.hs
+++ b/Sound/SC3/UGen/Record/Donce.hs
@@ -1,3 +1,4 @@
+-- | (not documented)
 module Sound.SC3.UGen.Record.Donce where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Done.hs b/Sound/SC3/UGen/Record/Done.hs
--- a/Sound/SC3/UGen/Record/Done.hs
+++ b/Sound/SC3/UGen/Record/Done.hs
@@ -1,3 +1,4 @@
+-- | Monitors another UGen to see when it is finished
 module Sound.SC3.UGen.Record.Done where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DoubleNestedAllpassC.hs b/Sound/SC3/UGen/Record/DoubleNestedAllpassC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DoubleNestedAllpassC.hs
@@ -0,0 +1,33 @@
+-- | Nested Allpass filters as proposed by Vercoe and Pluckett
+module Sound.SC3.UGen.Record.DoubleNestedAllpassC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DoubleNestedAllpassC = DoubleNestedAllpassC {
+  input :: S.UGen,
+  maxdelay1 :: S.UGen,
+  delay1 :: S.UGen,
+  gain1 :: S.UGen,
+  maxdelay2 :: S.UGen,
+  delay2 :: S.UGen,
+  gain2 :: S.UGen,
+  maxdelay3 :: S.UGen,
+  delay3 :: S.UGen,
+  gain3 :: S.UGen
+  } deriving (Show)
+doubleNestedAllpassC :: DoubleNestedAllpassC
+doubleNestedAllpassC = DoubleNestedAllpassC {
+  input = 0.0,
+  maxdelay1 = 0.0047,
+  delay1 = 0.0047,
+  gain1 = 0.15,
+  maxdelay2 = 0.022,
+  delay2 = 0.022,
+  gain2 = 0.25,
+  maxdelay3 = 0.0083,
+  delay3 = 0.0083,
+  gain3 = 0.3
+  }
+mkDoubleNestedAllpassC :: DoubleNestedAllpassC -> S.UGen
+mkDoubleNestedAllpassC (DoubleNestedAllpassC  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "DoubleNestedAllpassC" [a',b',c',d',e',f',g',h',i',j'] 1
+instance Make DoubleNestedAllpassC where
+  ugen = mkDoubleNestedAllpassC
diff --git a/Sound/SC3/UGen/Record/DoubleNestedAllpassL.hs b/Sound/SC3/UGen/Record/DoubleNestedAllpassL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DoubleNestedAllpassL.hs
@@ -0,0 +1,33 @@
+-- | Nested Allpass filters as proposed by Vercoe and Pluckett
+module Sound.SC3.UGen.Record.DoubleNestedAllpassL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DoubleNestedAllpassL = DoubleNestedAllpassL {
+  input :: S.UGen,
+  maxdelay1 :: S.UGen,
+  delay1 :: S.UGen,
+  gain1 :: S.UGen,
+  maxdelay2 :: S.UGen,
+  delay2 :: S.UGen,
+  gain2 :: S.UGen,
+  maxdelay3 :: S.UGen,
+  delay3 :: S.UGen,
+  gain3 :: S.UGen
+  } deriving (Show)
+doubleNestedAllpassL :: DoubleNestedAllpassL
+doubleNestedAllpassL = DoubleNestedAllpassL {
+  input = 0.0,
+  maxdelay1 = 0.0047,
+  delay1 = 0.0047,
+  gain1 = 0.15,
+  maxdelay2 = 0.022,
+  delay2 = 0.022,
+  gain2 = 0.25,
+  maxdelay3 = 0.0083,
+  delay3 = 0.0083,
+  gain3 = 0.3
+  }
+mkDoubleNestedAllpassL :: DoubleNestedAllpassL -> S.UGen
+mkDoubleNestedAllpassL (DoubleNestedAllpassL  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "DoubleNestedAllpassL" [a',b',c',d',e',f',g',h',i',j'] 1
+instance Make DoubleNestedAllpassL where
+  ugen = mkDoubleNestedAllpassL
diff --git a/Sound/SC3/UGen/Record/DoubleNestedAllpassN.hs b/Sound/SC3/UGen/Record/DoubleNestedAllpassN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DoubleNestedAllpassN.hs
@@ -0,0 +1,33 @@
+-- | Nested Allpass filters as proposed by Vercoe and Pluckett
+module Sound.SC3.UGen.Record.DoubleNestedAllpassN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DoubleNestedAllpassN = DoubleNestedAllpassN {
+  input :: S.UGen,
+  maxdelay1 :: S.UGen,
+  delay1 :: S.UGen,
+  gain1 :: S.UGen,
+  maxdelay2 :: S.UGen,
+  delay2 :: S.UGen,
+  gain2 :: S.UGen,
+  maxdelay3 :: S.UGen,
+  delay3 :: S.UGen,
+  gain3 :: S.UGen
+  } deriving (Show)
+doubleNestedAllpassN :: DoubleNestedAllpassN
+doubleNestedAllpassN = DoubleNestedAllpassN {
+  input = 0.0,
+  maxdelay1 = 0.0047,
+  delay1 = 0.0047,
+  gain1 = 0.15,
+  maxdelay2 = 0.022,
+  delay2 = 0.022,
+  gain2 = 0.25,
+  maxdelay3 = 0.0083,
+  delay3 = 0.0083,
+  gain3 = 0.3
+  }
+mkDoubleNestedAllpassN :: DoubleNestedAllpassN -> S.UGen
+mkDoubleNestedAllpassN (DoubleNestedAllpassN  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "DoubleNestedAllpassN" [a',b',c',d',e',f',g',h',i',j'] 1
+instance Make DoubleNestedAllpassN where
+  ugen = mkDoubleNestedAllpassN
diff --git a/Sound/SC3/UGen/Record/DoubleWell.hs b/Sound/SC3/UGen/Record/DoubleWell.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DoubleWell.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.DoubleWell where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DoubleWell = DoubleWell {
+  reset :: S.UGen,
+  ratex :: S.UGen,
+  ratey :: S.UGen,
+  f :: S.UGen,
+  w :: S.UGen,
+  delta :: S.UGen,
+  initx :: S.UGen,
+  inity :: S.UGen
+  } deriving (Show)
+doubleWell :: DoubleWell
+doubleWell = DoubleWell {
+  reset = 0.0,
+  ratex = 0.01,
+  ratey = 0.01,
+  f = 1.0,
+  w = 0.001,
+  delta = 1.0,
+  initx = 0.0,
+  inity = 0.0
+  }
+mkDoubleWell :: DoubleWell -> S.UGen
+mkDoubleWell (DoubleWell  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "DoubleWell" [a',b',c',d',e',f',g',h'] 1
+instance Make DoubleWell where
+  ugen = mkDoubleWell
diff --git a/Sound/SC3/UGen/Record/DoubleWell2.hs b/Sound/SC3/UGen/Record/DoubleWell2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DoubleWell2.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.DoubleWell2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DoubleWell2 = DoubleWell2 {
+  reset :: S.UGen,
+  ratex :: S.UGen,
+  ratey :: S.UGen,
+  f :: S.UGen,
+  w :: S.UGen,
+  delta :: S.UGen,
+  initx :: S.UGen,
+  inity :: S.UGen
+  } deriving (Show)
+doubleWell2 :: DoubleWell2
+doubleWell2 = DoubleWell2 {
+  reset = 0.0,
+  ratex = 0.01,
+  ratey = 0.01,
+  f = 1.0,
+  w = 0.001,
+  delta = 1.0,
+  initx = 0.0,
+  inity = 0.0
+  }
+mkDoubleWell2 :: DoubleWell2 -> S.UGen
+mkDoubleWell2 (DoubleWell2  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "DoubleWell2" [a',b',c',d',e',f',g',h'] 1
+instance Make DoubleWell2 where
+  ugen = mkDoubleWell2
diff --git a/Sound/SC3/UGen/Record/DoubleWell3.hs b/Sound/SC3/UGen/Record/DoubleWell3.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DoubleWell3.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.DoubleWell3 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DoubleWell3 = DoubleWell3 {
+  reset :: S.UGen,
+  rate_ :: S.UGen,
+  f :: S.UGen,
+  delta :: S.UGen,
+  initx :: S.UGen,
+  inity :: S.UGen
+  } deriving (Show)
+doubleWell3 :: DoubleWell3
+doubleWell3 = DoubleWell3 {
+  reset = 0.0,
+  rate_ = 0.01,
+  f = 0.0,
+  delta = 0.25,
+  initx = 0.0,
+  inity = 0.0
+  }
+mkDoubleWell3 :: DoubleWell3 -> S.UGen
+mkDoubleWell3 (DoubleWell3  a' b' c' d' e' f') = S.mkOsc S.AR "DoubleWell3" [a',b',c',d',e',f'] 1
+instance Make DoubleWell3 where
+  ugen = mkDoubleWell3
diff --git a/Sound/SC3/UGen/Record/Dpoll.hs b/Sound/SC3/UGen/Record/Dpoll.hs
--- a/Sound/SC3/UGen/Record/Dpoll.hs
+++ b/Sound/SC3/UGen/Record/Dpoll.hs
@@ -1,3 +1,4 @@
+-- | Print the current output value of a demand rate UGen
 module Sound.SC3.UGen.Record.Dpoll where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Drand.hs b/Sound/SC3/UGen/Record/Drand.hs
--- a/Sound/SC3/UGen/Record/Drand.hs
+++ b/Sound/SC3/UGen/Record/Drand.hs
@@ -1,3 +1,4 @@
+-- | Demand rate random sequence generator.
 module Sound.SC3.UGen.Record.Drand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dreset.hs b/Sound/SC3/UGen/Record/Dreset.hs
--- a/Sound/SC3/UGen/Record/Dreset.hs
+++ b/Sound/SC3/UGen/Record/Dreset.hs
@@ -1,3 +1,4 @@
+-- | demand rate reset
 module Sound.SC3.UGen.Record.Dreset where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/DriveNoise.hs b/Sound/SC3/UGen/Record/DriveNoise.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/DriveNoise.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.DriveNoise where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data DriveNoise = DriveNoise {
+  input :: S.UGen,
+  amount :: S.UGen,
+  multi :: S.UGen
+  } deriving (Show)
+driveNoise :: DriveNoise
+driveNoise = DriveNoise {
+  input = 0.0,
+  amount = 1.0,
+  multi = 5.0
+  }
+mkDriveNoise :: DriveNoise -> S.UGen
+mkDriveNoise (DriveNoise  a' b' c') = S.mkOsc S.AR "DriveNoise" [a',b',c'] 1
+instance Make DriveNoise where
+  ugen = mkDriveNoise
diff --git a/Sound/SC3/UGen/Record/Dseq.hs b/Sound/SC3/UGen/Record/Dseq.hs
--- a/Sound/SC3/UGen/Record/Dseq.hs
+++ b/Sound/SC3/UGen/Record/Dseq.hs
@@ -1,3 +1,4 @@
+-- | Demand rate sequence generator.
 module Sound.SC3.UGen.Record.Dseq where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dser.hs b/Sound/SC3/UGen/Record/Dser.hs
--- a/Sound/SC3/UGen/Record/Dser.hs
+++ b/Sound/SC3/UGen/Record/Dser.hs
@@ -1,3 +1,4 @@
+-- | Demand rate sequence generator.
 module Sound.SC3.UGen.Record.Dser where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dseries.hs b/Sound/SC3/UGen/Record/Dseries.hs
--- a/Sound/SC3/UGen/Record/Dseries.hs
+++ b/Sound/SC3/UGen/Record/Dseries.hs
@@ -1,3 +1,4 @@
+-- | Demand rate arithmetic series UGen.
 module Sound.SC3.UGen.Record.Dseries where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dshuf.hs b/Sound/SC3/UGen/Record/Dshuf.hs
--- a/Sound/SC3/UGen/Record/Dshuf.hs
+++ b/Sound/SC3/UGen/Record/Dshuf.hs
@@ -1,3 +1,4 @@
+-- | Demand rate random sequence generator
 module Sound.SC3.UGen.Record.Dshuf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dstutter.hs b/Sound/SC3/UGen/Record/Dstutter.hs
--- a/Sound/SC3/UGen/Record/Dstutter.hs
+++ b/Sound/SC3/UGen/Record/Dstutter.hs
@@ -1,3 +1,4 @@
+-- | Demand rate input replicator
 module Sound.SC3.UGen.Record.Dstutter where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dswitch.hs b/Sound/SC3/UGen/Record/Dswitch.hs
--- a/Sound/SC3/UGen/Record/Dswitch.hs
+++ b/Sound/SC3/UGen/Record/Dswitch.hs
@@ -1,3 +1,4 @@
+-- | Demand rate generator for embedding different inputs
 module Sound.SC3.UGen.Record.Dswitch where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dswitch1.hs b/Sound/SC3/UGen/Record/Dswitch1.hs
--- a/Sound/SC3/UGen/Record/Dswitch1.hs
+++ b/Sound/SC3/UGen/Record/Dswitch1.hs
@@ -1,3 +1,4 @@
+-- | Demand rate generator for switching between inputs.
 module Sound.SC3.UGen.Record.Dswitch1 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dunique.hs b/Sound/SC3/UGen/Record/Dunique.hs
--- a/Sound/SC3/UGen/Record/Dunique.hs
+++ b/Sound/SC3/UGen/Record/Dunique.hs
@@ -1,3 +1,4 @@
+-- | (not documented)
 module Sound.SC3.UGen.Record.Dunique where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dust.hs b/Sound/SC3/UGen/Record/Dust.hs
--- a/Sound/SC3/UGen/Record/Dust.hs
+++ b/Sound/SC3/UGen/Record/Dust.hs
@@ -1,3 +1,4 @@
+-- | Random impulses.
 module Sound.SC3.UGen.Record.Dust where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dust2.hs b/Sound/SC3/UGen/Record/Dust2.hs
--- a/Sound/SC3/UGen/Record/Dust2.hs
+++ b/Sound/SC3/UGen/Record/Dust2.hs
@@ -1,3 +1,4 @@
+-- | Random impulses.
 module Sound.SC3.UGen.Record.Dust2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Duty.hs b/Sound/SC3/UGen/Record/Duty.hs
--- a/Sound/SC3/UGen/Record/Duty.hs
+++ b/Sound/SC3/UGen/Record/Duty.hs
@@ -1,3 +1,4 @@
+-- | Demand results from demand rate UGens.
 module Sound.SC3.UGen.Record.Duty where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dwhite.hs b/Sound/SC3/UGen/Record/Dwhite.hs
--- a/Sound/SC3/UGen/Record/Dwhite.hs
+++ b/Sound/SC3/UGen/Record/Dwhite.hs
@@ -1,3 +1,4 @@
+-- | Demand rate white noise random generator.
 module Sound.SC3.UGen.Record.Dwhite where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Dxrand.hs b/Sound/SC3/UGen/Record/Dxrand.hs
--- a/Sound/SC3/UGen/Record/Dxrand.hs
+++ b/Sound/SC3/UGen/Record/Dxrand.hs
@@ -1,3 +1,4 @@
+-- | Demand rate random sequence generator.
 module Sound.SC3.UGen.Record.Dxrand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Dynamic sine oscillator bank
 module Sound.SC3.UGen.Record.DynKlang where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Bank of resonators.
 module Sound.SC3.UGen.Record.DynKlank where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/EnvDetect.hs b/Sound/SC3/UGen/Record/EnvDetect.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/EnvDetect.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.EnvDetect where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data EnvDetect = EnvDetect {
+  input :: S.UGen,
+  attack :: S.UGen,
+  release :: S.UGen
+  } deriving (Show)
+envDetect :: EnvDetect
+envDetect = EnvDetect {
+  input = 0.0,
+  attack = 100.0,
+  release = 0.0
+  }
+mkEnvDetect :: EnvDetect -> S.UGen
+mkEnvDetect (EnvDetect  a' b' c') = S.mkOsc S.AR "EnvDetect" [a',b',c'] 1
+instance Make EnvDetect where
+  ugen = mkEnvDetect
diff --git a/Sound/SC3/UGen/Record/EnvFollow.hs b/Sound/SC3/UGen/Record/EnvFollow.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/EnvFollow.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.EnvFollow where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data EnvFollow = EnvFollow {
+  rate :: S.Rate,
+  input :: S.UGen,
+  decaycoeff :: S.UGen
+  } deriving (Show)
+envFollow :: EnvFollow
+envFollow = EnvFollow {
+  rate = S.AR,
+  input = 0.0,
+  decaycoeff = 0.99
+  }
+mkEnvFollow :: EnvFollow -> S.UGen
+mkEnvFollow (EnvFollow r a' b') = S.mkOsc r "EnvFollow" [a',b'] 1
+instance Make EnvFollow where
+  ugen = mkEnvFollow
diff --git a/Sound/SC3/UGen/Record/EnvGen.hs b/Sound/SC3/UGen/Record/EnvGen.hs
--- a/Sound/SC3/UGen/Record/EnvGen.hs
+++ b/Sound/SC3/UGen/Record/EnvGen.hs
@@ -1,3 +1,4 @@
+-- | Envelope generator
 module Sound.SC3.UGen.Record.EnvGen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ExpRand.hs b/Sound/SC3/UGen/Record/ExpRand.hs
--- a/Sound/SC3/UGen/Record/ExpRand.hs
+++ b/Sound/SC3/UGen/Record/ExpRand.hs
@@ -1,3 +1,4 @@
+-- | Exponential single random number generator.
 module Sound.SC3.UGen.Record.ExpRand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FBSineC.hs b/Sound/SC3/UGen/Record/FBSineC.hs
--- a/Sound/SC3/UGen/Record/FBSineC.hs
+++ b/Sound/SC3/UGen/Record/FBSineC.hs
@@ -1,3 +1,4 @@
+-- | Feedback sine with chaotic phase indexing
 module Sound.SC3.UGen.Record.FBSineC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FBSineL.hs b/Sound/SC3/UGen/Record/FBSineL.hs
--- a/Sound/SC3/UGen/Record/FBSineL.hs
+++ b/Sound/SC3/UGen/Record/FBSineL.hs
@@ -1,3 +1,4 @@
+-- | Feedback sine with chaotic phase indexing
 module Sound.SC3.UGen.Record.FBSineL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FBSineN.hs b/Sound/SC3/UGen/Record/FBSineN.hs
--- a/Sound/SC3/UGen/Record/FBSineN.hs
+++ b/Sound/SC3/UGen/Record/FBSineN.hs
@@ -1,3 +1,4 @@
+-- | Feedback sine with chaotic phase indexing
 module Sound.SC3.UGen.Record.FBSineN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FFT.hs b/Sound/SC3/UGen/Record/FFT.hs
--- a/Sound/SC3/UGen/Record/FFT.hs
+++ b/Sound/SC3/UGen/Record/FFT.hs
@@ -1,3 +1,4 @@
+-- | Fast Fourier Transform
 module Sound.SC3.UGen.Record.FFT where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FFTCentroid.hs b/Sound/SC3/UGen/Record/FFTCentroid.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTCentroid.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FFTCentroid where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTCentroid = FFTCentroid {
+  buffer :: S.UGen
+  } deriving (Show)
+fFTCentroid :: FFTCentroid
+fFTCentroid = FFTCentroid {
+  buffer = 0.0
+  }
+mkFFTCentroid :: FFTCentroid -> S.UGen
+mkFFTCentroid (FFTCentroid  a') = S.mkOsc S.KR "FFTCentroid" [a'] 1
+instance Make FFTCentroid where
+  ugen = mkFFTCentroid
diff --git a/Sound/SC3/UGen/Record/FFTComplexDev.hs b/Sound/SC3/UGen/Record/FFTComplexDev.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTComplexDev.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FFTComplexDev where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTComplexDev = FFTComplexDev {
+  buffer :: S.UGen,
+  rectify :: S.UGen,
+  powthresh :: S.UGen
+  } deriving (Show)
+fFTComplexDev :: FFTComplexDev
+fFTComplexDev = FFTComplexDev {
+  buffer = 0.0,
+  rectify = 0.0,
+  powthresh = 0.1
+  }
+mkFFTComplexDev :: FFTComplexDev -> S.UGen
+mkFFTComplexDev (FFTComplexDev  a' b' c') = S.mkOsc S.KR "FFTComplexDev" [a',b',c'] 1
+instance Make FFTComplexDev where
+  ugen = mkFFTComplexDev
diff --git a/Sound/SC3/UGen/Record/FFTCrest.hs b/Sound/SC3/UGen/Record/FFTCrest.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTCrest.hs
@@ -0,0 +1,19 @@
+-- | Spectral crest measure
+module Sound.SC3.UGen.Record.FFTCrest where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTCrest = FFTCrest {
+  buffer :: S.UGen,
+  freqlo :: S.UGen,
+  freqhi :: S.UGen
+  } deriving (Show)
+fFTCrest :: FFTCrest
+fFTCrest = FFTCrest {
+  buffer = 0.0,
+  freqlo = 0.0,
+  freqhi = 50000.0
+  }
+mkFFTCrest :: FFTCrest -> S.UGen
+mkFFTCrest (FFTCrest  a' b' c') = S.mkOsc S.KR "FFTCrest" [a',b',c'] 1
+instance Make FFTCrest where
+  ugen = mkFFTCrest
diff --git a/Sound/SC3/UGen/Record/FFTDiffMags.hs b/Sound/SC3/UGen/Record/FFTDiffMags.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTDiffMags.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FFTDiffMags where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTDiffMags = FFTDiffMags {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen
+  } deriving (Show)
+fFTDiffMags :: FFTDiffMags
+fFTDiffMags = FFTDiffMags {
+  bufferA = 0.0,
+  bufferB = 0.0
+  }
+mkFFTDiffMags :: FFTDiffMags -> S.UGen
+mkFFTDiffMags (FFTDiffMags  a' b') = S.mkOsc S.KR "FFTDiffMags" [a',b'] 1
+instance Make FFTDiffMags where
+  ugen = mkFFTDiffMags
diff --git a/Sound/SC3/UGen/Record/FFTFlux.hs b/Sound/SC3/UGen/Record/FFTFlux.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTFlux.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FFTFlux where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTFlux = FFTFlux {
+  buffer :: S.UGen,
+  normalise :: S.UGen
+  } deriving (Show)
+fFTFlux :: FFTFlux
+fFTFlux = FFTFlux {
+  buffer = 0.0,
+  normalise = 1.0
+  }
+mkFFTFlux :: FFTFlux -> S.UGen
+mkFFTFlux (FFTFlux  a' b') = S.mkOsc S.KR "FFTFlux" [a',b'] 1
+instance Make FFTFlux where
+  ugen = mkFFTFlux
diff --git a/Sound/SC3/UGen/Record/FFTFluxPos.hs b/Sound/SC3/UGen/Record/FFTFluxPos.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTFluxPos.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FFTFluxPos where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTFluxPos = FFTFluxPos {
+  buffer :: S.UGen,
+  normalise :: S.UGen
+  } deriving (Show)
+fFTFluxPos :: FFTFluxPos
+fFTFluxPos = FFTFluxPos {
+  buffer = 0.0,
+  normalise = 1.0
+  }
+mkFFTFluxPos :: FFTFluxPos -> S.UGen
+mkFFTFluxPos (FFTFluxPos  a' b') = S.mkOsc S.KR "FFTFluxPos" [a',b'] 1
+instance Make FFTFluxPos where
+  ugen = mkFFTFluxPos
diff --git a/Sound/SC3/UGen/Record/FFTInterleave.hs b/Sound/SC3/UGen/Record/FFTInterleave.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTInterleave.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FFTInterleave where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTInterleave = FFTInterleave {
+  chain1 :: S.UGen,
+  chain2 :: S.UGen
+  } deriving (Show)
+fFTInterleave :: FFTInterleave
+fFTInterleave = FFTInterleave {
+  chain1 = 0.0,
+  chain2 = 0.0
+  }
+mkFFTInterleave :: FFTInterleave -> S.UGen
+mkFFTInterleave (FFTInterleave  a' b') = S.mkOsc S.KR "FFTInterleave" [a',b'] 1
+instance Make FFTInterleave where
+  ugen = mkFFTInterleave
diff --git a/Sound/SC3/UGen/Record/FFTMKL.hs b/Sound/SC3/UGen/Record/FFTMKL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTMKL.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FFTMKL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTMKL = FFTMKL {
+  buffer :: S.UGen,
+  epsilon :: S.UGen
+  } deriving (Show)
+fFTMKL :: FFTMKL
+fFTMKL = FFTMKL {
+  buffer = 0.0,
+  epsilon = 0.000001
+  }
+mkFFTMKL :: FFTMKL -> S.UGen
+mkFFTMKL (FFTMKL  a' b') = S.mkOsc S.KR "FFTMKL" [a',b'] 1
+instance Make FFTMKL where
+  ugen = mkFFTMKL
diff --git a/Sound/SC3/UGen/Record/FFTPeak.hs b/Sound/SC3/UGen/Record/FFTPeak.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTPeak.hs
@@ -0,0 +1,19 @@
+-- | Find peak value in an FFT frame
+module Sound.SC3.UGen.Record.FFTPeak where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTPeak = FFTPeak {
+  buffer :: S.UGen,
+  freqlo :: S.UGen,
+  freqhi :: S.UGen
+  } deriving (Show)
+fFTPeak :: FFTPeak
+fFTPeak = FFTPeak {
+  buffer = 0.0,
+  freqlo = 0.0,
+  freqhi = 50000.0
+  }
+mkFFTPeak :: FFTPeak -> S.UGen
+mkFFTPeak (FFTPeak  a' b' c') = S.mkOsc S.KR "FFTPeak" [a',b',c'] 2
+instance Make FFTPeak where
+  ugen = mkFFTPeak
diff --git a/Sound/SC3/UGen/Record/FFTPhaseDev.hs b/Sound/SC3/UGen/Record/FFTPhaseDev.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTPhaseDev.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FFTPhaseDev where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTPhaseDev = FFTPhaseDev {
+  buffer :: S.UGen,
+  weight :: S.UGen,
+  powthresh :: S.UGen
+  } deriving (Show)
+fFTPhaseDev :: FFTPhaseDev
+fFTPhaseDev = FFTPhaseDev {
+  buffer = 0.0,
+  weight = 0.0,
+  powthresh = 0.1
+  }
+mkFFTPhaseDev :: FFTPhaseDev -> S.UGen
+mkFFTPhaseDev (FFTPhaseDev  a' b' c') = S.mkOsc S.KR "FFTPhaseDev" [a',b',c'] 1
+instance Make FFTPhaseDev where
+  ugen = mkFFTPhaseDev
diff --git a/Sound/SC3/UGen/Record/FFTPower.hs b/Sound/SC3/UGen/Record/FFTPower.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTPower.hs
@@ -0,0 +1,17 @@
+-- | Instantaneous spectral power
+module Sound.SC3.UGen.Record.FFTPower where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTPower = FFTPower {
+  buffer :: S.UGen,
+  square :: S.UGen
+  } deriving (Show)
+fFTPower :: FFTPower
+fFTPower = FFTPower {
+  buffer = 0.0,
+  square = 1.0
+  }
+mkFFTPower :: FFTPower -> S.UGen
+mkFFTPower (FFTPower  a' b') = S.mkOsc S.KR "FFTPower" [a',b'] 1
+instance Make FFTPower where
+  ugen = mkFFTPower
diff --git a/Sound/SC3/UGen/Record/FFTSlope.hs b/Sound/SC3/UGen/Record/FFTSlope.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTSlope.hs
@@ -0,0 +1,15 @@
+-- | Spectral slope
+module Sound.SC3.UGen.Record.FFTSlope where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTSlope = FFTSlope {
+  buffer :: S.UGen
+  } deriving (Show)
+fFTSlope :: FFTSlope
+fFTSlope = FFTSlope {
+  buffer = 0.0
+  }
+mkFFTSlope :: FFTSlope -> S.UGen
+mkFFTSlope (FFTSlope  a') = S.mkOsc S.KR "FFTSlope" [a'] 1
+instance Make FFTSlope where
+  ugen = mkFFTSlope
diff --git a/Sound/SC3/UGen/Record/FFTSpread.hs b/Sound/SC3/UGen/Record/FFTSpread.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTSpread.hs
@@ -0,0 +1,17 @@
+-- | Spectral spread
+module Sound.SC3.UGen.Record.FFTSpread where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTSpread = FFTSpread {
+  buffer :: S.UGen,
+  centroid :: S.UGen
+  } deriving (Show)
+fFTSpread :: FFTSpread
+fFTSpread = FFTSpread {
+  buffer = 0.0,
+  centroid = 0.0
+  }
+mkFFTSpread :: FFTSpread -> S.UGen
+mkFFTSpread (FFTSpread  a' b') = S.mkOsc S.KR "FFTSpread" [a',b'] 1
+instance Make FFTSpread where
+  ugen = mkFFTSpread
diff --git a/Sound/SC3/UGen/Record/FFTTrigger.hs b/Sound/SC3/UGen/Record/FFTTrigger.hs
--- a/Sound/SC3/UGen/Record/FFTTrigger.hs
+++ b/Sound/SC3/UGen/Record/FFTTrigger.hs
@@ -1,3 +1,4 @@
+-- | Outputs the necessary signal for FFT chains, without doing an FFT on a signal
 module Sound.SC3.UGen.Record.FFTTrigger where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FFTTriggered.hs b/Sound/SC3/UGen/Record/FFTTriggered.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FFTTriggered.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FFTTriggered where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FFTTriggered = FFTTriggered {
+  buffer :: S.UGen,
+  input :: S.UGen,
+  trig :: S.UGen,
+  overlaplimit :: S.UGen
+  } deriving (Show)
+fFTTriggered :: FFTTriggered
+fFTTriggered = FFTTriggered {
+  buffer = 0.0,
+  input = 0.0,
+  trig = 0.0,
+  overlaplimit = 0.5
+  }
+mkFFTTriggered :: FFTTriggered -> S.UGen
+mkFFTTriggered (FFTTriggered  a' b' c' d') = S.mkOsc S.KR "FFTTriggered" [a',b',c',d'] 1
+instance Make FFTTriggered where
+  ugen = mkFFTTriggered
diff --git a/Sound/SC3/UGen/Record/FMGrain.hs b/Sound/SC3/UGen/Record/FMGrain.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMGrain.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMGrain where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMGrain = FMGrain {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  carfreq :: S.UGen,
+  modfreq :: S.UGen,
+  index :: S.UGen
+  } deriving (Show)
+fMGrain :: FMGrain
+fMGrain = FMGrain {
+  trigger = 0.0,
+  dur = 1.0,
+  carfreq = 440.0,
+  modfreq = 200.0,
+  index = 1.0
+  }
+mkFMGrain :: FMGrain -> S.UGen
+mkFMGrain (FMGrain  a' b' c' d' e') = S.mkOsc S.AR "FMGrain" [a',b',c',d',e'] 1
+instance Make FMGrain where
+  ugen = mkFMGrain
diff --git a/Sound/SC3/UGen/Record/FMGrainB.hs b/Sound/SC3/UGen/Record/FMGrainB.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMGrainB.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMGrainB where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMGrainB = FMGrainB {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  carfreq :: S.UGen,
+  modfreq :: S.UGen,
+  index :: S.UGen,
+  envbuf :: S.UGen
+  } deriving (Show)
+fMGrainB :: FMGrainB
+fMGrainB = FMGrainB {
+  trigger = 0.0,
+  dur = 1.0,
+  carfreq = 440.0,
+  modfreq = 200.0,
+  index = 1.0,
+  envbuf = 0.0
+  }
+mkFMGrainB :: FMGrainB -> S.UGen
+mkFMGrainB (FMGrainB  a' b' c' d' e' f') = S.mkOsc S.AR "FMGrainB" [a',b',c',d',e',f'] 1
+instance Make FMGrainB where
+  ugen = mkFMGrainB
diff --git a/Sound/SC3/UGen/Record/FMGrainBBF.hs b/Sound/SC3/UGen/Record/FMGrainBBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMGrainBBF.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMGrainBBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMGrainBBF = FMGrainBBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  carfreq :: S.UGen,
+  modfreq :: S.UGen,
+  index :: S.UGen,
+  envbuf :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+fMGrainBBF :: FMGrainBBF
+fMGrainBBF = FMGrainBBF {
+  trigger = 0.0,
+  dur = 1.0,
+  carfreq = 440.0,
+  modfreq = 200.0,
+  index = 1.0,
+  envbuf = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  wComp = 0.0
+  }
+mkFMGrainBBF :: FMGrainBBF -> S.UGen
+mkFMGrainBBF (FMGrainBBF  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "FMGrainBBF" [a',b',c',d',e',f',g',h',i',j'] 4
+instance Make FMGrainBBF where
+  ugen = mkFMGrainBBF
diff --git a/Sound/SC3/UGen/Record/FMGrainBF.hs b/Sound/SC3/UGen/Record/FMGrainBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMGrainBF.hs
@@ -0,0 +1,31 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMGrainBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMGrainBF = FMGrainBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  carfreq :: S.UGen,
+  modfreq :: S.UGen,
+  index :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+fMGrainBF :: FMGrainBF
+fMGrainBF = FMGrainBF {
+  trigger = 0.0,
+  dur = 1.0,
+  carfreq = 440.0,
+  modfreq = 200.0,
+  index = 1.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  wComp = 0.0
+  }
+mkFMGrainBF :: FMGrainBF -> S.UGen
+mkFMGrainBF (FMGrainBF  a' b' c' d' e' f' g' h' i') = S.mkOsc S.AR "FMGrainBF" [a',b',c',d',e',f',g',h',i'] 4
+instance Make FMGrainBF where
+  ugen = mkFMGrainBF
diff --git a/Sound/SC3/UGen/Record/FMGrainI.hs b/Sound/SC3/UGen/Record/FMGrainI.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMGrainI.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMGrainI where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMGrainI = FMGrainI {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  carfreq :: S.UGen,
+  modfreq :: S.UGen,
+  index :: S.UGen,
+  envbuf1 :: S.UGen,
+  envbuf2 :: S.UGen,
+  ifac :: S.UGen
+  } deriving (Show)
+fMGrainI :: FMGrainI
+fMGrainI = FMGrainI {
+  trigger = 0.0,
+  dur = 1.0,
+  carfreq = 440.0,
+  modfreq = 200.0,
+  index = 1.0,
+  envbuf1 = 0.0,
+  envbuf2 = 0.0,
+  ifac = 0.5
+  }
+mkFMGrainI :: FMGrainI -> S.UGen
+mkFMGrainI (FMGrainI  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "FMGrainI" [a',b',c',d',e',f',g',h'] 1
+instance Make FMGrainI where
+  ugen = mkFMGrainI
diff --git a/Sound/SC3/UGen/Record/FMGrainIBF.hs b/Sound/SC3/UGen/Record/FMGrainIBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMGrainIBF.hs
@@ -0,0 +1,37 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMGrainIBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMGrainIBF = FMGrainIBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  carfreq :: S.UGen,
+  modfreq :: S.UGen,
+  index :: S.UGen,
+  envbuf1 :: S.UGen,
+  envbuf2 :: S.UGen,
+  ifac :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+fMGrainIBF :: FMGrainIBF
+fMGrainIBF = FMGrainIBF {
+  trigger = 0.0,
+  dur = 1.0,
+  carfreq = 440.0,
+  modfreq = 200.0,
+  index = 1.0,
+  envbuf1 = 0.0,
+  envbuf2 = 0.0,
+  ifac = 0.5,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  wComp = 0.0
+  }
+mkFMGrainIBF :: FMGrainIBF -> S.UGen
+mkFMGrainIBF (FMGrainIBF  a' b' c' d' e' f' g' h' i' j' k' l') = S.mkOsc S.AR "FMGrainIBF" [a',b',c',d',e',f',g',h',i',j',k',l'] 4
+instance Make FMGrainIBF where
+  ugen = mkFMGrainIBF
diff --git a/Sound/SC3/UGen/Record/FMHDecode1.hs b/Sound/SC3/UGen/Record/FMHDecode1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMHDecode1.hs
@@ -0,0 +1,35 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMHDecode1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMHDecode1 = FMHDecode1 {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  r :: S.UGen,
+  s :: S.UGen,
+  t :: S.UGen,
+  u :: S.UGen,
+  v :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen
+  } deriving (Show)
+fMHDecode1 :: FMHDecode1
+fMHDecode1 = FMHDecode1 {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  r = 0.0,
+  s = 0.0,
+  t = 0.0,
+  u = 0.0,
+  v = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0
+  }
+mkFMHDecode1 :: FMHDecode1 -> S.UGen
+mkFMHDecode1 (FMHDecode1  a' b' c' d' e' f' g' h' i' j' k') = S.mkOsc S.AR "FMHDecode1" [a',b',c',d',e',f',g',h',i',j',k'] 1
+instance Make FMHDecode1 where
+  ugen = mkFMHDecode1
diff --git a/Sound/SC3/UGen/Record/FMHEncode0.hs b/Sound/SC3/UGen/Record/FMHEncode0.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMHEncode0.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMHEncode0 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMHEncode0 = FMHEncode0 {
+  input :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  gain :: S.UGen
+  } deriving (Show)
+fMHEncode0 :: FMHEncode0
+fMHEncode0 = FMHEncode0 {
+  input = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  gain = 1.0
+  }
+mkFMHEncode0 :: FMHEncode0 -> S.UGen
+mkFMHEncode0 (FMHEncode0  a' b' c' d') = S.mkOsc S.AR "FMHEncode0" [a',b',c',d'] 9
+instance Make FMHEncode0 where
+  ugen = mkFMHEncode0
diff --git a/Sound/SC3/UGen/Record/FMHEncode1.hs b/Sound/SC3/UGen/Record/FMHEncode1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMHEncode1.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMHEncode1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMHEncode1 = FMHEncode1 {
+  input :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  gain :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+fMHEncode1 :: FMHEncode1
+fMHEncode1 = FMHEncode1 {
+  input = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  gain = 1.0,
+  wComp = 0.0
+  }
+mkFMHEncode1 :: FMHEncode1 -> S.UGen
+mkFMHEncode1 (FMHEncode1  a' b' c' d' e' f') = S.mkOsc S.AR "FMHEncode1" [a',b',c',d',e',f'] 9
+instance Make FMHEncode1 where
+  ugen = mkFMHEncode1
diff --git a/Sound/SC3/UGen/Record/FMHEncode2.hs b/Sound/SC3/UGen/Record/FMHEncode2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FMHEncode2.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FMHEncode2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FMHEncode2 = FMHEncode2 {
+  input :: S.UGen,
+  point_x :: S.UGen,
+  point_y :: S.UGen,
+  elevation :: S.UGen,
+  gain :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+fMHEncode2 :: FMHEncode2
+fMHEncode2 = FMHEncode2 {
+  input = 0.0,
+  point_x = 0.0,
+  point_y = 0.0,
+  elevation = 0.0,
+  gain = 1.0,
+  wComp = 0.0
+  }
+mkFMHEncode2 :: FMHEncode2 -> S.UGen
+mkFMHEncode2 (FMHEncode2  a' b' c' d' e' f') = S.mkOsc S.AR "FMHEncode2" [a',b',c',d',e',f'] 9
+instance Make FMHEncode2 where
+  ugen = mkFMHEncode2
diff --git a/Sound/SC3/UGen/Record/FOS.hs b/Sound/SC3/UGen/Record/FOS.hs
--- a/Sound/SC3/UGen/Record/FOS.hs
+++ b/Sound/SC3/UGen/Record/FOS.hs
@@ -1,3 +1,4 @@
+-- | First order filter section.
 module Sound.SC3.UGen.Record.FOS where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FSinOsc.hs b/Sound/SC3/UGen/Record/FSinOsc.hs
--- a/Sound/SC3/UGen/Record/FSinOsc.hs
+++ b/Sound/SC3/UGen/Record/FSinOsc.hs
@@ -1,3 +1,4 @@
+-- | Fast sine oscillator.
 module Sound.SC3.UGen.Record.FSinOsc where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Fhn2DC.hs b/Sound/SC3/UGen/Record/Fhn2DC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Fhn2DC.hs
@@ -0,0 +1,33 @@
+-- | FitzHughNagumo Neuron Firing Oscillator
+module Sound.SC3.UGen.Record.Fhn2DC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Fhn2DC = Fhn2DC {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  urate :: S.UGen,
+  wrate :: S.UGen,
+  b0 :: S.UGen,
+  b1 :: S.UGen,
+  i :: S.UGen,
+  u0 :: S.UGen,
+  w0 :: S.UGen
+  } deriving (Show)
+fhn2DC :: Fhn2DC
+fhn2DC = Fhn2DC {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  urate = 0.1,
+  wrate = 0.1,
+  b0 = 0.6,
+  b1 = 0.8,
+  i = 0.0,
+  u0 = 0.0,
+  w0 = 0.0
+  }
+mkFhn2DC :: Fhn2DC -> S.UGen
+mkFhn2DC (Fhn2DC r a' b' c' d' e' f' g' h' i') = S.mkOsc r "Fhn2DC" [a',b',c',d',e',f',g',h',i'] 1
+instance Make Fhn2DC where
+  ugen = mkFhn2DC
diff --git a/Sound/SC3/UGen/Record/Fhn2DL.hs b/Sound/SC3/UGen/Record/Fhn2DL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Fhn2DL.hs
@@ -0,0 +1,33 @@
+-- | FitzHughNagumo Neuron Firing Oscillator
+module Sound.SC3.UGen.Record.Fhn2DL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Fhn2DL = Fhn2DL {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  urate :: S.UGen,
+  wrate :: S.UGen,
+  b0 :: S.UGen,
+  b1 :: S.UGen,
+  i :: S.UGen,
+  u0 :: S.UGen,
+  w0 :: S.UGen
+  } deriving (Show)
+fhn2DL :: Fhn2DL
+fhn2DL = Fhn2DL {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  urate = 0.1,
+  wrate = 0.1,
+  b0 = 0.6,
+  b1 = 0.8,
+  i = 0.0,
+  u0 = 0.0,
+  w0 = 0.0
+  }
+mkFhn2DL :: Fhn2DL -> S.UGen
+mkFhn2DL (Fhn2DL r a' b' c' d' e' f' g' h' i') = S.mkOsc r "Fhn2DL" [a',b',c',d',e',f',g',h',i'] 1
+instance Make Fhn2DL where
+  ugen = mkFhn2DL
diff --git a/Sound/SC3/UGen/Record/Fhn2DN.hs b/Sound/SC3/UGen/Record/Fhn2DN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Fhn2DN.hs
@@ -0,0 +1,33 @@
+-- | FitzHughNagumo Neuron Firing Oscillator
+module Sound.SC3.UGen.Record.Fhn2DN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Fhn2DN = Fhn2DN {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  urate :: S.UGen,
+  wrate :: S.UGen,
+  b0 :: S.UGen,
+  b1 :: S.UGen,
+  i :: S.UGen,
+  u0 :: S.UGen,
+  w0 :: S.UGen
+  } deriving (Show)
+fhn2DN :: Fhn2DN
+fhn2DN = Fhn2DN {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  urate = 0.1,
+  wrate = 0.1,
+  b0 = 0.6,
+  b1 = 0.8,
+  i = 0.0,
+  u0 = 0.0,
+  w0 = 0.0
+  }
+mkFhn2DN :: Fhn2DN -> S.UGen
+mkFhn2DN (Fhn2DN r a' b' c' d' e' f' g' h' i') = S.mkOsc r "Fhn2DN" [a',b',c',d',e',f',g',h',i'] 1
+instance Make Fhn2DN where
+  ugen = mkFhn2DN
diff --git a/Sound/SC3/UGen/Record/FhnTrig.hs b/Sound/SC3/UGen/Record/FhnTrig.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FhnTrig.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FhnTrig where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FhnTrig = FhnTrig {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  urate :: S.UGen,
+  wrate :: S.UGen,
+  b0 :: S.UGen,
+  b1 :: S.UGen,
+  i :: S.UGen,
+  u0 :: S.UGen,
+  w0 :: S.UGen
+  } deriving (Show)
+fhnTrig :: FhnTrig
+fhnTrig = FhnTrig {
+  rate = S.AR,
+  minfreq = 4.0,
+  maxfreq = 10.0,
+  urate = 0.1,
+  wrate = 0.1,
+  b0 = 0.6,
+  b1 = 0.8,
+  i = 0.0,
+  u0 = 0.0,
+  w0 = 0.0
+  }
+mkFhnTrig :: FhnTrig -> S.UGen
+mkFhnTrig (FhnTrig r a' b' c' d' e' f' g' h' i') = S.mkOsc r "FhnTrig" [a',b',c',d',e',f',g',h',i'] 1
+instance Make FhnTrig where
+  ugen = mkFhnTrig
diff --git a/Sound/SC3/UGen/Record/Filter.hs b/Sound/SC3/UGen/Record/Filter.hs
--- a/Sound/SC3/UGen/Record/Filter.hs
+++ b/Sound/SC3/UGen/Record/Filter.hs
@@ -1,3 +1,4 @@
+-- | Base class for filter UGens
 module Sound.SC3.UGen.Record.Filter where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FincoSprottL.hs b/Sound/SC3/UGen/Record/FincoSprottL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FincoSprottL.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FincoSprottL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FincoSprottL = FincoSprottL {
+  freq :: S.UGen,
+  a :: S.UGen,
+  h :: S.UGen,
+  xi :: S.UGen,
+  yi :: S.UGen,
+  zi :: S.UGen
+  } deriving (Show)
+fincoSprottL :: FincoSprottL
+fincoSprottL = FincoSprottL {
+  freq = 22050.0,
+  a = 2.45,
+  h = 0.05,
+  xi = 0.0,
+  yi = 0.0,
+  zi = 0.0
+  }
+mkFincoSprottL :: FincoSprottL -> S.UGen
+mkFincoSprottL (FincoSprottL  a' b' c' d' e' f') = S.mkOsc S.AR "FincoSprottL" [a',b',c',d',e',f'] 3
+instance Make FincoSprottL where
+  ugen = mkFincoSprottL
diff --git a/Sound/SC3/UGen/Record/FincoSprottM.hs b/Sound/SC3/UGen/Record/FincoSprottM.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FincoSprottM.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FincoSprottM where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FincoSprottM = FincoSprottM {
+  freq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  h :: S.UGen,
+  xi :: S.UGen,
+  yi :: S.UGen,
+  zi :: S.UGen
+  } deriving (Show)
+fincoSprottM :: FincoSprottM
+fincoSprottM = FincoSprottM {
+  freq = 22050.0,
+  a = -7.0,
+  b = 4.0,
+  h = 0.05,
+  xi = 0.0,
+  yi = 0.0,
+  zi = 0.0
+  }
+mkFincoSprottM :: FincoSprottM -> S.UGen
+mkFincoSprottM (FincoSprottM  a' b' c' d' e' f' g') = S.mkOsc S.AR "FincoSprottM" [a',b',c',d',e',f',g'] 3
+instance Make FincoSprottM where
+  ugen = mkFincoSprottM
diff --git a/Sound/SC3/UGen/Record/FincoSprottS.hs b/Sound/SC3/UGen/Record/FincoSprottS.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FincoSprottS.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FincoSprottS where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FincoSprottS = FincoSprottS {
+  freq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  h :: S.UGen,
+  xi :: S.UGen,
+  yi :: S.UGen,
+  zi :: S.UGen
+  } deriving (Show)
+fincoSprottS :: FincoSprottS
+fincoSprottS = FincoSprottS {
+  freq = 22050.0,
+  a = 8.0,
+  b = 2.0,
+  h = 0.05,
+  xi = 0.0,
+  yi = 0.0,
+  zi = 0.0
+  }
+mkFincoSprottS :: FincoSprottS -> S.UGen
+mkFincoSprottS (FincoSprottS  a' b' c' d' e' f' g') = S.mkOsc S.AR "FincoSprottS" [a',b',c',d',e',f',g'] 3
+instance Make FincoSprottS where
+  ugen = mkFincoSprottS
diff --git a/Sound/SC3/UGen/Record/FitzHughNagumo.hs b/Sound/SC3/UGen/Record/FitzHughNagumo.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FitzHughNagumo.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.FitzHughNagumo where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FitzHughNagumo = FitzHughNagumo {
+  reset :: S.UGen,
+  rateu :: S.UGen,
+  ratew :: S.UGen,
+  b0 :: S.UGen,
+  b1 :: S.UGen,
+  initu :: S.UGen,
+  initw :: S.UGen
+  } deriving (Show)
+fitzHughNagumo :: FitzHughNagumo
+fitzHughNagumo = FitzHughNagumo {
+  reset = 0.0,
+  rateu = 0.01,
+  ratew = 0.01,
+  b0 = 1.0,
+  b1 = 1.0,
+  initu = 0.0,
+  initw = 0.0
+  }
+mkFitzHughNagumo :: FitzHughNagumo -> S.UGen
+mkFitzHughNagumo (FitzHughNagumo  a' b' c' d' e' f' g') = S.mkOsc S.AR "FitzHughNagumo" [a',b',c',d',e',f',g'] 1
+instance Make FitzHughNagumo where
+  ugen = mkFitzHughNagumo
diff --git a/Sound/SC3/UGen/Record/FoaAsymmetry.hs b/Sound/SC3/UGen/Record/FoaAsymmetry.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaAsymmetry.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) asymmetry transformer
+module Sound.SC3.UGen.Record.FoaAsymmetry where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaAsymmetry = FoaAsymmetry {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaAsymmetry :: FoaAsymmetry
+foaAsymmetry = FoaAsymmetry {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaAsymmetry :: FoaAsymmetry -> S.UGen
+mkFoaAsymmetry (FoaAsymmetry  a' b' c' d' e') = S.mkOsc S.AR "FoaAsymmetry" [a',b',c',d',e'] 4
+instance Make FoaAsymmetry where
+  ugen = mkFoaAsymmetry
diff --git a/Sound/SC3/UGen/Record/FoaDirectO.hs b/Sound/SC3/UGen/Record/FoaDirectO.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaDirectO.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) directivity transformer
+module Sound.SC3.UGen.Record.FoaDirectO where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaDirectO = FoaDirectO {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaDirectO :: FoaDirectO
+foaDirectO = FoaDirectO {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaDirectO :: FoaDirectO -> S.UGen
+mkFoaDirectO (FoaDirectO  a' b' c' d' e') = S.mkOsc S.AR "FoaDirectO" [a',b',c',d',e'] 4
+instance Make FoaDirectO where
+  ugen = mkFoaDirectO
diff --git a/Sound/SC3/UGen/Record/FoaDirectX.hs b/Sound/SC3/UGen/Record/FoaDirectX.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaDirectX.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) directivity transformer
+module Sound.SC3.UGen.Record.FoaDirectX where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaDirectX = FoaDirectX {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaDirectX :: FoaDirectX
+foaDirectX = FoaDirectX {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaDirectX :: FoaDirectX -> S.UGen
+mkFoaDirectX (FoaDirectX  a' b' c' d' e') = S.mkOsc S.AR "FoaDirectX" [a',b',c',d',e'] 4
+instance Make FoaDirectX where
+  ugen = mkFoaDirectX
diff --git a/Sound/SC3/UGen/Record/FoaDirectY.hs b/Sound/SC3/UGen/Record/FoaDirectY.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaDirectY.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) directivity transformer
+module Sound.SC3.UGen.Record.FoaDirectY where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaDirectY = FoaDirectY {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaDirectY :: FoaDirectY
+foaDirectY = FoaDirectY {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaDirectY :: FoaDirectY -> S.UGen
+mkFoaDirectY (FoaDirectY  a' b' c' d' e') = S.mkOsc S.AR "FoaDirectY" [a',b',c',d',e'] 4
+instance Make FoaDirectY where
+  ugen = mkFoaDirectY
diff --git a/Sound/SC3/UGen/Record/FoaDirectZ.hs b/Sound/SC3/UGen/Record/FoaDirectZ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaDirectZ.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) directivity transformer
+module Sound.SC3.UGen.Record.FoaDirectZ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaDirectZ = FoaDirectZ {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaDirectZ :: FoaDirectZ
+foaDirectZ = FoaDirectZ {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaDirectZ :: FoaDirectZ -> S.UGen
+mkFoaDirectZ (FoaDirectZ  a' b' c' d' e') = S.mkOsc S.AR "FoaDirectZ" [a',b',c',d',e'] 4
+instance Make FoaDirectZ where
+  ugen = mkFoaDirectZ
diff --git a/Sound/SC3/UGen/Record/FoaDominateX.hs b/Sound/SC3/UGen/Record/FoaDominateX.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaDominateX.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) dominance transformer
+module Sound.SC3.UGen.Record.FoaDominateX where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaDominateX = FoaDominateX {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  gain :: S.UGen
+  } deriving (Show)
+foaDominateX :: FoaDominateX
+foaDominateX = FoaDominateX {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  gain = 0.0
+  }
+mkFoaDominateX :: FoaDominateX -> S.UGen
+mkFoaDominateX (FoaDominateX  a' b' c' d' e') = S.mkOsc S.AR "FoaDominateX" [a',b',c',d',e'] 4
+instance Make FoaDominateX where
+  ugen = mkFoaDominateX
diff --git a/Sound/SC3/UGen/Record/FoaDominateY.hs b/Sound/SC3/UGen/Record/FoaDominateY.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaDominateY.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) dominance transformer
+module Sound.SC3.UGen.Record.FoaDominateY where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaDominateY = FoaDominateY {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  gain :: S.UGen
+  } deriving (Show)
+foaDominateY :: FoaDominateY
+foaDominateY = FoaDominateY {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  gain = 0.0
+  }
+mkFoaDominateY :: FoaDominateY -> S.UGen
+mkFoaDominateY (FoaDominateY  a' b' c' d' e') = S.mkOsc S.AR "FoaDominateY" [a',b',c',d',e'] 4
+instance Make FoaDominateY where
+  ugen = mkFoaDominateY
diff --git a/Sound/SC3/UGen/Record/FoaDominateZ.hs b/Sound/SC3/UGen/Record/FoaDominateZ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaDominateZ.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) dominance transformer
+module Sound.SC3.UGen.Record.FoaDominateZ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaDominateZ = FoaDominateZ {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  gain :: S.UGen
+  } deriving (Show)
+foaDominateZ :: FoaDominateZ
+foaDominateZ = FoaDominateZ {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  gain = 0.0
+  }
+mkFoaDominateZ :: FoaDominateZ -> S.UGen
+mkFoaDominateZ (FoaDominateZ  a' b' c' d' e') = S.mkOsc S.AR "FoaDominateZ" [a',b',c',d',e'] 4
+instance Make FoaDominateZ where
+  ugen = mkFoaDominateZ
diff --git a/Sound/SC3/UGen/Record/FoaFocusX.hs b/Sound/SC3/UGen/Record/FoaFocusX.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaFocusX.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) focus transformer
+module Sound.SC3.UGen.Record.FoaFocusX where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaFocusX = FoaFocusX {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaFocusX :: FoaFocusX
+foaFocusX = FoaFocusX {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaFocusX :: FoaFocusX -> S.UGen
+mkFoaFocusX (FoaFocusX  a' b' c' d' e') = S.mkOsc S.AR "FoaFocusX" [a',b',c',d',e'] 4
+instance Make FoaFocusX where
+  ugen = mkFoaFocusX
diff --git a/Sound/SC3/UGen/Record/FoaFocusY.hs b/Sound/SC3/UGen/Record/FoaFocusY.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaFocusY.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) focus transformer
+module Sound.SC3.UGen.Record.FoaFocusY where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaFocusY = FoaFocusY {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaFocusY :: FoaFocusY
+foaFocusY = FoaFocusY {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaFocusY :: FoaFocusY -> S.UGen
+mkFoaFocusY (FoaFocusY  a' b' c' d' e') = S.mkOsc S.AR "FoaFocusY" [a',b',c',d',e'] 4
+instance Make FoaFocusY where
+  ugen = mkFoaFocusY
diff --git a/Sound/SC3/UGen/Record/FoaFocusZ.hs b/Sound/SC3/UGen/Record/FoaFocusZ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaFocusZ.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) focus transformer
+module Sound.SC3.UGen.Record.FoaFocusZ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaFocusZ = FoaFocusZ {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaFocusZ :: FoaFocusZ
+foaFocusZ = FoaFocusZ {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaFocusZ :: FoaFocusZ -> S.UGen
+mkFoaFocusZ (FoaFocusZ  a' b' c' d' e') = S.mkOsc S.AR "FoaFocusZ" [a',b',c',d',e'] 4
+instance Make FoaFocusZ where
+  ugen = mkFoaFocusZ
diff --git a/Sound/SC3/UGen/Record/FoaNFC.hs b/Sound/SC3/UGen/Record/FoaNFC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaNFC.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) nearfield compensation filter
+module Sound.SC3.UGen.Record.FoaNFC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaNFC = FoaNFC {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  distance :: S.UGen
+  } deriving (Show)
+foaNFC :: FoaNFC
+foaNFC = FoaNFC {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  distance = 1.0
+  }
+mkFoaNFC :: FoaNFC -> S.UGen
+mkFoaNFC (FoaNFC  a' b' c' d' e') = S.mkOsc S.AR "FoaNFC" [a',b',c',d',e'] 4
+instance Make FoaNFC where
+  ugen = mkFoaNFC
diff --git a/Sound/SC3/UGen/Record/FoaPanB.hs b/Sound/SC3/UGen/Record/FoaPanB.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaPanB.hs
@@ -0,0 +1,19 @@
+-- | First Order Ambisonic (FOA) panner
+module Sound.SC3.UGen.Record.FoaPanB where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaPanB = FoaPanB {
+  input :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen
+  } deriving (Show)
+foaPanB :: FoaPanB
+foaPanB = FoaPanB {
+  input = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0
+  }
+mkFoaPanB :: FoaPanB -> S.UGen
+mkFoaPanB (FoaPanB  a' b' c') = S.mkOsc S.AR "FoaPanB" [a',b',c'] 4
+instance Make FoaPanB where
+  ugen = mkFoaPanB
diff --git a/Sound/SC3/UGen/Record/FoaPressX.hs b/Sound/SC3/UGen/Record/FoaPressX.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaPressX.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) press transformer
+module Sound.SC3.UGen.Record.FoaPressX where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaPressX = FoaPressX {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaPressX :: FoaPressX
+foaPressX = FoaPressX {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaPressX :: FoaPressX -> S.UGen
+mkFoaPressX (FoaPressX  a' b' c' d' e') = S.mkOsc S.AR "FoaPressX" [a',b',c',d',e'] 4
+instance Make FoaPressX where
+  ugen = mkFoaPressX
diff --git a/Sound/SC3/UGen/Record/FoaPressY.hs b/Sound/SC3/UGen/Record/FoaPressY.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaPressY.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) press transformer
+module Sound.SC3.UGen.Record.FoaPressY where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaPressY = FoaPressY {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaPressY :: FoaPressY
+foaPressY = FoaPressY {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaPressY :: FoaPressY -> S.UGen
+mkFoaPressY (FoaPressY  a' b' c' d' e') = S.mkOsc S.AR "FoaPressY" [a',b',c',d',e'] 4
+instance Make FoaPressY where
+  ugen = mkFoaPressY
diff --git a/Sound/SC3/UGen/Record/FoaPressZ.hs b/Sound/SC3/UGen/Record/FoaPressZ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaPressZ.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) press transformer
+module Sound.SC3.UGen.Record.FoaPressZ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaPressZ = FoaPressZ {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaPressZ :: FoaPressZ
+foaPressZ = FoaPressZ {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaPressZ :: FoaPressZ -> S.UGen
+mkFoaPressZ (FoaPressZ  a' b' c' d' e') = S.mkOsc S.AR "FoaPressZ" [a',b',c',d',e'] 4
+instance Make FoaPressZ where
+  ugen = mkFoaPressZ
diff --git a/Sound/SC3/UGen/Record/FoaProximity.hs b/Sound/SC3/UGen/Record/FoaProximity.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaProximity.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) proximity effect filter
+module Sound.SC3.UGen.Record.FoaProximity where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaProximity = FoaProximity {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  distance :: S.UGen
+  } deriving (Show)
+foaProximity :: FoaProximity
+foaProximity = FoaProximity {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  distance = 1.0
+  }
+mkFoaProximity :: FoaProximity -> S.UGen
+mkFoaProximity (FoaProximity  a' b' c' d' e') = S.mkOsc S.AR "FoaProximity" [a',b',c',d',e'] 4
+instance Make FoaProximity where
+  ugen = mkFoaProximity
diff --git a/Sound/SC3/UGen/Record/FoaPsychoShelf.hs b/Sound/SC3/UGen/Record/FoaPsychoShelf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaPsychoShelf.hs
@@ -0,0 +1,27 @@
+-- | First Order Ambisonic (FOA) psychoacoustic shelf filter
+module Sound.SC3.UGen.Record.FoaPsychoShelf where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaPsychoShelf = FoaPsychoShelf {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  freq :: S.UGen,
+  k0 :: S.UGen,
+  k1 :: S.UGen
+  } deriving (Show)
+foaPsychoShelf :: FoaPsychoShelf
+foaPsychoShelf = FoaPsychoShelf {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  freq = 400.0,
+  k0 = 0.0,
+  k1 = 0.0
+  }
+mkFoaPsychoShelf :: FoaPsychoShelf -> S.UGen
+mkFoaPsychoShelf (FoaPsychoShelf  a' b' c' d' e' f' g') = S.mkOsc S.AR "FoaPsychoShelf" [a',b',c',d',e',f',g'] 4
+instance Make FoaPsychoShelf where
+  ugen = mkFoaPsychoShelf
diff --git a/Sound/SC3/UGen/Record/FoaPushX.hs b/Sound/SC3/UGen/Record/FoaPushX.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaPushX.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) push transformer
+module Sound.SC3.UGen.Record.FoaPushX where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaPushX = FoaPushX {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaPushX :: FoaPushX
+foaPushX = FoaPushX {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaPushX :: FoaPushX -> S.UGen
+mkFoaPushX (FoaPushX  a' b' c' d' e') = S.mkOsc S.AR "FoaPushX" [a',b',c',d',e'] 4
+instance Make FoaPushX where
+  ugen = mkFoaPushX
diff --git a/Sound/SC3/UGen/Record/FoaPushY.hs b/Sound/SC3/UGen/Record/FoaPushY.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaPushY.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) push transformer
+module Sound.SC3.UGen.Record.FoaPushY where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaPushY = FoaPushY {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaPushY :: FoaPushY
+foaPushY = FoaPushY {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaPushY :: FoaPushY -> S.UGen
+mkFoaPushY (FoaPushY  a' b' c' d' e') = S.mkOsc S.AR "FoaPushY" [a',b',c',d',e'] 4
+instance Make FoaPushY where
+  ugen = mkFoaPushY
diff --git a/Sound/SC3/UGen/Record/FoaPushZ.hs b/Sound/SC3/UGen/Record/FoaPushZ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaPushZ.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) push transformer
+module Sound.SC3.UGen.Record.FoaPushZ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaPushZ = FoaPushZ {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaPushZ :: FoaPushZ
+foaPushZ = FoaPushZ {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaPushZ :: FoaPushZ -> S.UGen
+mkFoaPushZ (FoaPushZ  a' b' c' d' e') = S.mkOsc S.AR "FoaPushZ" [a',b',c',d',e'] 4
+instance Make FoaPushZ where
+  ugen = mkFoaPushZ
diff --git a/Sound/SC3/UGen/Record/FoaRotate.hs b/Sound/SC3/UGen/Record/FoaRotate.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaRotate.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) rotation transformer
+module Sound.SC3.UGen.Record.FoaRotate where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaRotate = FoaRotate {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaRotate :: FoaRotate
+foaRotate = FoaRotate {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaRotate :: FoaRotate -> S.UGen
+mkFoaRotate (FoaRotate  a' b' c' d' e') = S.mkOsc S.AR "FoaRotate" [a',b',c',d',e'] 4
+instance Make FoaRotate where
+  ugen = mkFoaRotate
diff --git a/Sound/SC3/UGen/Record/FoaTilt.hs b/Sound/SC3/UGen/Record/FoaTilt.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaTilt.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) rotation transformer
+module Sound.SC3.UGen.Record.FoaTilt where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaTilt = FoaTilt {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaTilt :: FoaTilt
+foaTilt = FoaTilt {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaTilt :: FoaTilt -> S.UGen
+mkFoaTilt (FoaTilt  a' b' c' d' e') = S.mkOsc S.AR "FoaTilt" [a',b',c',d',e'] 4
+instance Make FoaTilt where
+  ugen = mkFoaTilt
diff --git a/Sound/SC3/UGen/Record/FoaTumble.hs b/Sound/SC3/UGen/Record/FoaTumble.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaTumble.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) rotation transformer
+module Sound.SC3.UGen.Record.FoaTumble where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaTumble = FoaTumble {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaTumble :: FoaTumble
+foaTumble = FoaTumble {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaTumble :: FoaTumble -> S.UGen
+mkFoaTumble (FoaTumble  a' b' c' d' e') = S.mkOsc S.AR "FoaTumble" [a',b',c',d',e'] 4
+instance Make FoaTumble where
+  ugen = mkFoaTumble
diff --git a/Sound/SC3/UGen/Record/FoaZoomX.hs b/Sound/SC3/UGen/Record/FoaZoomX.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaZoomX.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) zoom transformer
+module Sound.SC3.UGen.Record.FoaZoomX where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaZoomX = FoaZoomX {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaZoomX :: FoaZoomX
+foaZoomX = FoaZoomX {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaZoomX :: FoaZoomX -> S.UGen
+mkFoaZoomX (FoaZoomX  a' b' c' d' e') = S.mkOsc S.AR "FoaZoomX" [a',b',c',d',e'] 4
+instance Make FoaZoomX where
+  ugen = mkFoaZoomX
diff --git a/Sound/SC3/UGen/Record/FoaZoomY.hs b/Sound/SC3/UGen/Record/FoaZoomY.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaZoomY.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) zoom transformer
+module Sound.SC3.UGen.Record.FoaZoomY where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaZoomY = FoaZoomY {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaZoomY :: FoaZoomY
+foaZoomY = FoaZoomY {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaZoomY :: FoaZoomY -> S.UGen
+mkFoaZoomY (FoaZoomY  a' b' c' d' e') = S.mkOsc S.AR "FoaZoomY" [a',b',c',d',e'] 4
+instance Make FoaZoomY where
+  ugen = mkFoaZoomY
diff --git a/Sound/SC3/UGen/Record/FoaZoomZ.hs b/Sound/SC3/UGen/Record/FoaZoomZ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FoaZoomZ.hs
@@ -0,0 +1,23 @@
+-- | First Order Ambisonic (FOA) zoom transformer
+module Sound.SC3.UGen.Record.FoaZoomZ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FoaZoomZ = FoaZoomZ {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  angle :: S.UGen
+  } deriving (Show)
+foaZoomZ :: FoaZoomZ
+foaZoomZ = FoaZoomZ {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  angle = 0.0
+  }
+mkFoaZoomZ :: FoaZoomZ -> S.UGen
+mkFoaZoomZ (FoaZoomZ  a' b' c' d' e') = S.mkOsc S.AR "FoaZoomZ" [a',b',c',d',e'] 4
+instance Make FoaZoomZ where
+  ugen = mkFoaZoomZ
diff --git a/Sound/SC3/UGen/Record/Fold.hs b/Sound/SC3/UGen/Record/Fold.hs
--- a/Sound/SC3/UGen/Record/Fold.hs
+++ b/Sound/SC3/UGen/Record/Fold.hs
@@ -1,3 +1,4 @@
+-- | Fold a signal outside given thresholds.
 module Sound.SC3.UGen.Record.Fold where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Formant.hs b/Sound/SC3/UGen/Record/Formant.hs
--- a/Sound/SC3/UGen/Record/Formant.hs
+++ b/Sound/SC3/UGen/Record/Formant.hs
@@ -1,3 +1,4 @@
+-- | Formant oscillator
 module Sound.SC3.UGen.Record.Formant where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Formlet.hs b/Sound/SC3/UGen/Record/Formlet.hs
--- a/Sound/SC3/UGen/Record/Formlet.hs
+++ b/Sound/SC3/UGen/Record/Formlet.hs
@@ -1,3 +1,4 @@
+-- | FOF-like filter.
 module Sound.SC3.UGen.Record.Formlet where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FrameCompare.hs b/Sound/SC3/UGen/Record/FrameCompare.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/FrameCompare.hs
@@ -0,0 +1,19 @@
+-- | calculates spectral MSE distance of two fft chains
+module Sound.SC3.UGen.Record.FrameCompare where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data FrameCompare = FrameCompare {
+  buffer1 :: S.UGen,
+  buffer2 :: S.UGen,
+  wAmount :: S.UGen
+  } deriving (Show)
+frameCompare :: FrameCompare
+frameCompare = FrameCompare {
+  buffer1 = 0.0,
+  buffer2 = 0.0,
+  wAmount = 0.5
+  }
+mkFrameCompare :: FrameCompare -> S.UGen
+mkFrameCompare (FrameCompare  a' b' c') = S.mkOsc S.KR "FrameCompare" [a',b',c'] 1
+instance Make FrameCompare where
+  ugen = mkFrameCompare
diff --git a/Sound/SC3/UGen/Record/Free.hs b/Sound/SC3/UGen/Record/Free.hs
--- a/Sound/SC3/UGen/Record/Free.hs
+++ b/Sound/SC3/UGen/Record/Free.hs
@@ -1,3 +1,4 @@
+-- | When triggered, frees a node.
 module Sound.SC3.UGen.Record.Free where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FreeSelf.hs b/Sound/SC3/UGen/Record/FreeSelf.hs
--- a/Sound/SC3/UGen/Record/FreeSelf.hs
+++ b/Sound/SC3/UGen/Record/FreeSelf.hs
@@ -1,3 +1,4 @@
+-- | When triggered, free enclosing synth.
 module Sound.SC3.UGen.Record.FreeSelf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FreeSelfWhenDone.hs b/Sound/SC3/UGen/Record/FreeSelfWhenDone.hs
--- a/Sound/SC3/UGen/Record/FreeSelfWhenDone.hs
+++ b/Sound/SC3/UGen/Record/FreeSelfWhenDone.hs
@@ -1,3 +1,4 @@
+-- | Free the enclosing synth when a UGen is finished
 module Sound.SC3.UGen.Record.FreeSelfWhenDone where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FreeVerb.hs b/Sound/SC3/UGen/Record/FreeVerb.hs
--- a/Sound/SC3/UGen/Record/FreeVerb.hs
+++ b/Sound/SC3/UGen/Record/FreeVerb.hs
@@ -1,3 +1,4 @@
+-- | A reverb
 module Sound.SC3.UGen.Record.FreeVerb where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FreeVerb2.hs b/Sound/SC3/UGen/Record/FreeVerb2.hs
--- a/Sound/SC3/UGen/Record/FreeVerb2.hs
+++ b/Sound/SC3/UGen/Record/FreeVerb2.hs
@@ -1,3 +1,4 @@
+-- | A two-channel reverb
 module Sound.SC3.UGen.Record.FreeVerb2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/FreqShift.hs b/Sound/SC3/UGen/Record/FreqShift.hs
--- a/Sound/SC3/UGen/Record/FreqShift.hs
+++ b/Sound/SC3/UGen/Record/FreqShift.hs
@@ -1,3 +1,4 @@
+-- | Frequency Shifter.
 module Sound.SC3.UGen.Record.FreqShift where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Friction.hs b/Sound/SC3/UGen/Record/Friction.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Friction.hs
@@ -0,0 +1,27 @@
+-- | A physical model of a system with dry-friction. A chaotic filter.
+module Sound.SC3.UGen.Record.Friction where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Friction = Friction {
+  rate :: S.Rate,
+  input :: S.UGen,
+  friction_ :: S.UGen,
+  spring :: S.UGen,
+  damp :: S.UGen,
+  mass :: S.UGen,
+  beltmass :: S.UGen
+  } deriving (Show)
+friction :: Friction
+friction = Friction {
+  rate = S.AR,
+  input = 0.0,
+  friction_ = 0.5,
+  spring = 0.414,
+  damp = 0.313,
+  mass = 0.1,
+  beltmass = 1.0
+  }
+mkFriction :: Friction -> S.UGen
+mkFriction (Friction r a' b' c' d' e' f') = S.mkOsc r "Friction" [a',b',c',d',e',f'] 1
+instance Make Friction where
+  ugen = mkFriction
diff --git a/Sound/SC3/UGen/Record/GVerb.hs b/Sound/SC3/UGen/Record/GVerb.hs
--- a/Sound/SC3/UGen/Record/GVerb.hs
+++ b/Sound/SC3/UGen/Record/GVerb.hs
@@ -1,3 +1,4 @@
+-- | A two-channel reverb
 module Sound.SC3.UGen.Record.GVerb where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Gate.hs b/Sound/SC3/UGen/Record/Gate.hs
--- a/Sound/SC3/UGen/Record/Gate.hs
+++ b/Sound/SC3/UGen/Record/Gate.hs
@@ -1,3 +1,4 @@
+-- | Gate or hold.
 module Sound.SC3.UGen.Record.Gate where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/GaussClass.hs b/Sound/SC3/UGen/Record/GaussClass.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/GaussClass.hs
@@ -0,0 +1,19 @@
+-- | Gaussian classifier
+module Sound.SC3.UGen.Record.GaussClass where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data GaussClass = GaussClass {
+  input :: S.UGen,
+  bufnum :: S.UGen,
+  gate :: S.UGen
+  } deriving (Show)
+gaussClass :: GaussClass
+gaussClass = GaussClass {
+  input = 0.0,
+  bufnum = 0.0,
+  gate = 0.0
+  }
+mkGaussClass :: GaussClass -> S.UGen
+mkGaussClass (GaussClass  a' b' c') = S.mkOsc S.KR "GaussClass" [a',b',c'] 1
+instance Make GaussClass where
+  ugen = mkGaussClass
diff --git a/Sound/SC3/UGen/Record/GaussTrig.hs b/Sound/SC3/UGen/Record/GaussTrig.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/GaussTrig.hs
@@ -0,0 +1,19 @@
+-- | impulses around a certain frequency
+module Sound.SC3.UGen.Record.GaussTrig where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data GaussTrig = GaussTrig {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  dev :: S.UGen
+  } deriving (Show)
+gaussTrig :: GaussTrig
+gaussTrig = GaussTrig {
+  rate = S.AR,
+  freq = 440.0,
+  dev = 0.3
+  }
+mkGaussTrig :: GaussTrig -> S.UGen
+mkGaussTrig (GaussTrig r a' b') = S.mkOsc r "GaussTrig" [a',b'] 1
+instance Make GaussTrig where
+  ugen = mkGaussTrig
diff --git a/Sound/SC3/UGen/Record/Gbman2DC.hs b/Sound/SC3/UGen/Record/Gbman2DC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Gbman2DC.hs
@@ -0,0 +1,23 @@
+-- | gingerbreadman map 2D chaotic generator
+module Sound.SC3.UGen.Record.Gbman2DC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Gbman2DC = Gbman2DC {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+gbman2DC :: Gbman2DC
+gbman2DC = Gbman2DC {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  x0 = 1.2,
+  y0 = 2.1
+  }
+mkGbman2DC :: Gbman2DC -> S.UGen
+mkGbman2DC (Gbman2DC r a' b' c' d') = S.mkOsc r "Gbman2DC" [a',b',c',d'] 1
+instance Make Gbman2DC where
+  ugen = mkGbman2DC
diff --git a/Sound/SC3/UGen/Record/Gbman2DL.hs b/Sound/SC3/UGen/Record/Gbman2DL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Gbman2DL.hs
@@ -0,0 +1,23 @@
+-- | gingerbreadman map 2D chaotic generator
+module Sound.SC3.UGen.Record.Gbman2DL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Gbman2DL = Gbman2DL {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+gbman2DL :: Gbman2DL
+gbman2DL = Gbman2DL {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  x0 = 1.2,
+  y0 = 2.1
+  }
+mkGbman2DL :: Gbman2DL -> S.UGen
+mkGbman2DL (Gbman2DL r a' b' c' d') = S.mkOsc r "Gbman2DL" [a',b',c',d'] 1
+instance Make Gbman2DL where
+  ugen = mkGbman2DL
diff --git a/Sound/SC3/UGen/Record/Gbman2DN.hs b/Sound/SC3/UGen/Record/Gbman2DN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Gbman2DN.hs
@@ -0,0 +1,23 @@
+-- | gingerbreadman map 2D chaotic generator
+module Sound.SC3.UGen.Record.Gbman2DN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Gbman2DN = Gbman2DN {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+gbman2DN :: Gbman2DN
+gbman2DN = Gbman2DN {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  x0 = 1.2,
+  y0 = 2.1
+  }
+mkGbman2DN :: Gbman2DN -> S.UGen
+mkGbman2DN (Gbman2DN r a' b' c' d') = S.mkOsc r "Gbman2DN" [a',b',c',d'] 1
+instance Make Gbman2DN where
+  ugen = mkGbman2DN
diff --git a/Sound/SC3/UGen/Record/GbmanL.hs b/Sound/SC3/UGen/Record/GbmanL.hs
--- a/Sound/SC3/UGen/Record/GbmanL.hs
+++ b/Sound/SC3/UGen/Record/GbmanL.hs
@@ -1,3 +1,4 @@
+-- | Gingerbreadman map chaotic generator
 module Sound.SC3.UGen.Record.GbmanL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/GbmanN.hs b/Sound/SC3/UGen/Record/GbmanN.hs
--- a/Sound/SC3/UGen/Record/GbmanN.hs
+++ b/Sound/SC3/UGen/Record/GbmanN.hs
@@ -1,3 +1,4 @@
+-- | Gingerbreadman map chaotic generator
 module Sound.SC3.UGen.Record.GbmanN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/GbmanTrig.hs b/Sound/SC3/UGen/Record/GbmanTrig.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/GbmanTrig.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.GbmanTrig where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data GbmanTrig = GbmanTrig {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+gbmanTrig :: GbmanTrig
+gbmanTrig = GbmanTrig {
+  rate = S.AR,
+  minfreq = 5.0,
+  maxfreq = 10.0,
+  x0 = 1.2,
+  y0 = 2.1
+  }
+mkGbmanTrig :: GbmanTrig -> S.UGen
+mkGbmanTrig (GbmanTrig r a' b' c' d') = S.mkOsc r "GbmanTrig" [a',b',c',d'] 1
+instance Make GbmanTrig where
+  ugen = mkGbmanTrig
diff --git a/Sound/SC3/UGen/Record/Gendy1.hs b/Sound/SC3/UGen/Record/Gendy1.hs
--- a/Sound/SC3/UGen/Record/Gendy1.hs
+++ b/Sound/SC3/UGen/Record/Gendy1.hs
@@ -1,3 +1,4 @@
+-- | Dynamic stochastic synthesis generator.
 module Sound.SC3.UGen.Record.Gendy1 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Gendy2.hs b/Sound/SC3/UGen/Record/Gendy2.hs
--- a/Sound/SC3/UGen/Record/Gendy2.hs
+++ b/Sound/SC3/UGen/Record/Gendy2.hs
@@ -1,3 +1,4 @@
+-- | Dynamic stochastic synthesis generator.
 module Sound.SC3.UGen.Record.Gendy2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Gendy3.hs b/Sound/SC3/UGen/Record/Gendy3.hs
--- a/Sound/SC3/UGen/Record/Gendy3.hs
+++ b/Sound/SC3/UGen/Record/Gendy3.hs
@@ -1,3 +1,4 @@
+-- | Dynamic stochastic synthesis generator.
 module Sound.SC3.UGen.Record.Gendy3 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Gendy4.hs b/Sound/SC3/UGen/Record/Gendy4.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Gendy4.hs
@@ -0,0 +1,35 @@
+-- | Dynamic stochastic synthesis generator
+module Sound.SC3.UGen.Record.Gendy4 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Gendy4 = Gendy4 {
+  rate :: S.Rate,
+  ampdist :: S.UGen,
+  durdist :: S.UGen,
+  adparam :: S.UGen,
+  ddparam :: S.UGen,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  ampscale :: S.UGen,
+  durscale :: S.UGen,
+  initCPs :: S.UGen,
+  knum :: S.UGen
+  } deriving (Show)
+gendy4 :: Gendy4
+gendy4 = Gendy4 {
+  rate = S.AR,
+  ampdist = 1.0,
+  durdist = 1.0,
+  adparam = 1.0,
+  ddparam = 1.0,
+  minfreq = 440.0,
+  maxfreq = 660.0,
+  ampscale = 0.5,
+  durscale = 0.5,
+  initCPs = 12.0,
+  knum = 0.0
+  }
+mkGendy4 :: Gendy4 -> S.UGen
+mkGendy4 (Gendy4 r a' b' c' d' e' f' g' h' i' j') = S.mkOsc r "Gendy4" [a',b',c',d',e',f',g',h',i',j'] 1
+instance Make Gendy4 where
+  ugen = mkGendy4
diff --git a/Sound/SC3/UGen/Record/Gendy5.hs b/Sound/SC3/UGen/Record/Gendy5.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Gendy5.hs
@@ -0,0 +1,35 @@
+-- | Dynamic stochastic synthesis generator
+module Sound.SC3.UGen.Record.Gendy5 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Gendy5 = Gendy5 {
+  rate :: S.Rate,
+  ampdist :: S.UGen,
+  durdist :: S.UGen,
+  adparam :: S.UGen,
+  ddparam :: S.UGen,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  ampscale :: S.UGen,
+  durscale :: S.UGen,
+  initCPs :: S.UGen,
+  knum :: S.UGen
+  } deriving (Show)
+gendy5 :: Gendy5
+gendy5 = Gendy5 {
+  rate = S.AR,
+  ampdist = 1.0,
+  durdist = 1.0,
+  adparam = 1.0,
+  ddparam = 1.0,
+  minfreq = 440.0,
+  maxfreq = 660.0,
+  ampscale = 0.5,
+  durscale = 0.5,
+  initCPs = 12.0,
+  knum = 0.0
+  }
+mkGendy5 :: Gendy5 -> S.UGen
+mkGendy5 (Gendy5 r a' b' c' d' e' f' g' h' i' j') = S.mkOsc r "Gendy5" [a',b',c',d',e',f',g',h',i',j'] 1
+instance Make Gendy5 where
+  ugen = mkGendy5
diff --git a/Sound/SC3/UGen/Record/Getenv.hs b/Sound/SC3/UGen/Record/Getenv.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Getenv.hs
@@ -0,0 +1,17 @@
+-- | Read (numeric) shell environment variables into a synth
+module Sound.SC3.UGen.Record.Getenv where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Getenv = Getenv {
+  key :: S.UGen,
+  defaultval :: S.UGen
+  } deriving (Show)
+getenv :: Getenv
+getenv = Getenv {
+  key = 0.0,
+  defaultval = 0.0
+  }
+mkGetenv :: Getenv -> S.UGen
+mkGetenv (Getenv  a' b') = S.mkOsc S.IR "Getenv" [a',b'] 1
+instance Make Getenv where
+  ugen = mkGetenv
diff --git a/Sound/SC3/UGen/Record/GlitchHPF.hs b/Sound/SC3/UGen/Record/GlitchHPF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/GlitchHPF.hs
@@ -0,0 +1,19 @@
+-- | backward compatibility
+module Sound.SC3.UGen.Record.GlitchHPF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data GlitchHPF = GlitchHPF {
+  rate :: S.Rate,
+  input :: S.UGen,
+  freq :: S.UGen
+  } deriving (Show)
+glitchHPF :: GlitchHPF
+glitchHPF = GlitchHPF {
+  rate = S.AR,
+  input = 0.0,
+  freq = 440.0
+  }
+mkGlitchHPF :: GlitchHPF -> S.UGen
+mkGlitchHPF (GlitchHPF r a' b') = S.mkOsc r "GlitchHPF" [a',b'] 1
+instance Make GlitchHPF where
+  ugen = mkGlitchHPF
diff --git a/Sound/SC3/UGen/Record/GlitchRHPF.hs b/Sound/SC3/UGen/Record/GlitchRHPF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/GlitchRHPF.hs
@@ -0,0 +1,21 @@
+-- | backward compatibility
+module Sound.SC3.UGen.Record.GlitchRHPF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data GlitchRHPF = GlitchRHPF {
+  rate :: S.Rate,
+  input :: S.UGen,
+  freq :: S.UGen,
+  rq :: S.UGen
+  } deriving (Show)
+glitchRHPF :: GlitchRHPF
+glitchRHPF = GlitchRHPF {
+  rate = S.AR,
+  input = 0.0,
+  freq = 440.0,
+  rq = 1.0
+  }
+mkGlitchRHPF :: GlitchRHPF -> S.UGen
+mkGlitchRHPF (GlitchRHPF r a' b' c') = S.mkOsc r "GlitchRHPF" [a',b',c'] 1
+instance Make GlitchRHPF where
+  ugen = mkGlitchRHPF
diff --git a/Sound/SC3/UGen/Record/Goertzel.hs b/Sound/SC3/UGen/Record/Goertzel.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Goertzel.hs
@@ -0,0 +1,21 @@
+-- | Calculate a single DFT bin, to detect presence of a frequency
+module Sound.SC3.UGen.Record.Goertzel where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Goertzel = Goertzel {
+  input :: S.UGen,
+  bufsize :: S.UGen,
+  freq :: S.UGen,
+  hop :: S.UGen
+  } deriving (Show)
+goertzel :: Goertzel
+goertzel = Goertzel {
+  input = 0.0,
+  bufsize = 1024.0,
+  freq = 0.0,
+  hop = 1.0
+  }
+mkGoertzel :: Goertzel -> S.UGen
+mkGoertzel (Goertzel  a' b' c' d') = S.mkOsc S.KR "Goertzel" [a',b',c',d'] 2
+instance Make Goertzel where
+  ugen = mkGoertzel
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
@@ -1,8 +1,8 @@
+-- | Granular synthesis with sound stored in a buffer
 module Sound.SC3.UGen.Record.GrainBuf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data GrainBuf = GrainBuf {
-  numChannels :: S.UGen,
   trigger :: S.UGen,
   dur :: S.UGen,
   sndbuf :: S.UGen,
@@ -15,7 +15,6 @@
   } deriving (Show)
 grainBuf :: GrainBuf
 grainBuf = GrainBuf {
-  numChannels = 1.0,
   trigger = 0.0,
   dur = 1.0,
   sndbuf = 0.0,
@@ -27,6 +26,6 @@
   maxGrains = 512.0
   }
 mkGrainBuf :: GrainBuf -> S.UGen
-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
+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'] undefined
 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
@@ -1,8 +1,8 @@
+-- | Granular synthesis with frequency modulated sine tones
 module Sound.SC3.UGen.Record.GrainFM where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data GrainFM = GrainFM {
-  numChannels :: S.UGen,
   trigger :: S.UGen,
   dur :: S.UGen,
   carfreq :: S.UGen,
@@ -14,7 +14,6 @@
   } deriving (Show)
 grainFM :: GrainFM
 grainFM = GrainFM {
-  numChannels = 1.0,
   trigger = 0.0,
   dur = 1.0,
   carfreq = 440.0,
@@ -25,6 +24,6 @@
   maxGrains = 512.0
   }
 mkGrainFM :: GrainFM -> S.UGen
-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
+mkGrainFM (GrainFM  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "GrainFM" [a',b',c',d',e',f',g',h'] undefined
 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
@@ -1,8 +1,8 @@
+-- | Granulate an input signal
 module Sound.SC3.UGen.Record.GrainIn where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data GrainIn = GrainIn {
-  numChannels :: S.UGen,
   trigger :: S.UGen,
   dur :: S.UGen,
   input :: S.UGen,
@@ -12,7 +12,6 @@
   } deriving (Show)
 grainIn :: GrainIn
 grainIn = GrainIn {
-  numChannels = 1.0,
   trigger = 0.0,
   dur = 1.0,
   input = 0.0,
@@ -21,6 +20,6 @@
   maxGrains = 512.0
   }
 mkGrainIn :: GrainIn -> S.UGen
-mkGrainIn (GrainIn  a' b' c' d' e' f' g') = S.mkOsc S.AR "GrainIn" [a',b',c',d',e',f',g'] 1
+mkGrainIn (GrainIn  a' b' c' d' e' f') = S.mkOsc S.AR "GrainIn" [a',b',c',d',e',f'] undefined
 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
@@ -1,8 +1,8 @@
+-- | Granular synthesis with sine tones
 module Sound.SC3.UGen.Record.GrainSin where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data GrainSin = GrainSin {
-  numChannels :: S.UGen,
   trigger :: S.UGen,
   dur :: S.UGen,
   freq :: S.UGen,
@@ -12,7 +12,6 @@
   } deriving (Show)
 grainSin :: GrainSin
 grainSin = GrainSin {
-  numChannels = 1.0,
   trigger = 0.0,
   dur = 1.0,
   freq = 440.0,
@@ -21,6 +20,6 @@
   maxGrains = 512.0
   }
 mkGrainSin :: GrainSin -> S.UGen
-mkGrainSin (GrainSin  a' b' c' d' e' f' g') = S.mkOsc S.AR "GrainSin" [a',b',c',d',e',f',g'] 1
+mkGrainSin (GrainSin  a' b' c' d' e' f') = S.mkOsc S.AR "GrainSin" [a',b',c',d',e',f'] undefined
 instance Make GrainSin where
   ugen = mkGrainSin
diff --git a/Sound/SC3/UGen/Record/GravityGrid.hs b/Sound/SC3/UGen/Record/GravityGrid.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/GravityGrid.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.GravityGrid where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data GravityGrid = GravityGrid {
+  reset :: S.UGen,
+  rate_ :: S.UGen,
+  newx :: S.UGen,
+  newy :: S.UGen,
+  bufnum :: S.UGen
+  } deriving (Show)
+gravityGrid :: GravityGrid
+gravityGrid = GravityGrid {
+  reset = 0.0,
+  rate_ = 0.1,
+  newx = 0.0,
+  newy = 0.0,
+  bufnum = 0.0
+  }
+mkGravityGrid :: GravityGrid -> S.UGen
+mkGravityGrid (GravityGrid  a' b' c' d' e') = S.mkOsc S.AR "GravityGrid" [a',b',c',d',e'] 1
+instance Make GravityGrid where
+  ugen = mkGravityGrid
diff --git a/Sound/SC3/UGen/Record/GravityGrid2.hs b/Sound/SC3/UGen/Record/GravityGrid2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/GravityGrid2.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.GravityGrid2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data GravityGrid2 = GravityGrid2 {
+  reset :: S.UGen,
+  rate_ :: S.UGen,
+  newx :: S.UGen,
+  newy :: S.UGen,
+  bufnum :: S.UGen
+  } deriving (Show)
+gravityGrid2 :: GravityGrid2
+gravityGrid2 = GravityGrid2 {
+  reset = 0.0,
+  rate_ = 0.1,
+  newx = 0.0,
+  newy = 0.0,
+  bufnum = 0.0
+  }
+mkGravityGrid2 :: GravityGrid2 -> S.UGen
+mkGravityGrid2 (GravityGrid2  a' b' c' d' e') = S.mkOsc S.AR "GravityGrid2" [a',b',c',d',e'] 1
+instance Make GravityGrid2 where
+  ugen = mkGravityGrid2
diff --git a/Sound/SC3/UGen/Record/HPF.hs b/Sound/SC3/UGen/Record/HPF.hs
--- a/Sound/SC3/UGen/Record/HPF.hs
+++ b/Sound/SC3/UGen/Record/HPF.hs
@@ -1,3 +1,4 @@
+-- | 2nd order Butterworth highpass filter.
 module Sound.SC3.UGen.Record.HPF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/HPZ1.hs b/Sound/SC3/UGen/Record/HPZ1.hs
--- a/Sound/SC3/UGen/Record/HPZ1.hs
+++ b/Sound/SC3/UGen/Record/HPZ1.hs
@@ -1,3 +1,4 @@
+-- | Two point difference filter
 module Sound.SC3.UGen.Record.HPZ1 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/HPZ2.hs b/Sound/SC3/UGen/Record/HPZ2.hs
--- a/Sound/SC3/UGen/Record/HPZ2.hs
+++ b/Sound/SC3/UGen/Record/HPZ2.hs
@@ -1,3 +1,4 @@
+-- | Two zero fixed midcut.
 module Sound.SC3.UGen.Record.HPZ2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Hasher.hs b/Sound/SC3/UGen/Record/Hasher.hs
--- a/Sound/SC3/UGen/Record/Hasher.hs
+++ b/Sound/SC3/UGen/Record/Hasher.hs
@@ -1,3 +1,4 @@
+-- | Randomized value.
 module Sound.SC3.UGen.Record.Hasher where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Henon2DC.hs b/Sound/SC3/UGen/Record/Henon2DC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Henon2DC.hs
@@ -0,0 +1,27 @@
+-- | henon map 2D chaotic generator
+module Sound.SC3.UGen.Record.Henon2DC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Henon2DC = Henon2DC {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+henon2DC :: Henon2DC
+henon2DC = Henon2DC {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  a = 1.4,
+  b = 0.3,
+  x0 = 0.30501993062401,
+  y0 = 0.20938865431933
+  }
+mkHenon2DC :: Henon2DC -> S.UGen
+mkHenon2DC (Henon2DC r a' b' c' d' e' f') = S.mkOsc r "Henon2DC" [a',b',c',d',e',f'] 1
+instance Make Henon2DC where
+  ugen = mkHenon2DC
diff --git a/Sound/SC3/UGen/Record/Henon2DL.hs b/Sound/SC3/UGen/Record/Henon2DL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Henon2DL.hs
@@ -0,0 +1,27 @@
+-- | henon map 2D chaotic generator
+module Sound.SC3.UGen.Record.Henon2DL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Henon2DL = Henon2DL {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+henon2DL :: Henon2DL
+henon2DL = Henon2DL {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  a = 1.4,
+  b = 0.3,
+  x0 = 0.30501993062401,
+  y0 = 0.20938865431933
+  }
+mkHenon2DL :: Henon2DL -> S.UGen
+mkHenon2DL (Henon2DL r a' b' c' d' e' f') = S.mkOsc r "Henon2DL" [a',b',c',d',e',f'] 1
+instance Make Henon2DL where
+  ugen = mkHenon2DL
diff --git a/Sound/SC3/UGen/Record/Henon2DN.hs b/Sound/SC3/UGen/Record/Henon2DN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Henon2DN.hs
@@ -0,0 +1,27 @@
+-- | henon map 2D chaotic generator
+module Sound.SC3.UGen.Record.Henon2DN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Henon2DN = Henon2DN {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+henon2DN :: Henon2DN
+henon2DN = Henon2DN {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  a = 1.4,
+  b = 0.3,
+  x0 = 0.30501993062401,
+  y0 = 0.20938865431933
+  }
+mkHenon2DN :: Henon2DN -> S.UGen
+mkHenon2DN (Henon2DN r a' b' c' d' e' f') = S.mkOsc r "Henon2DN" [a',b',c',d',e',f'] 1
+instance Make Henon2DN where
+  ugen = mkHenon2DN
diff --git a/Sound/SC3/UGen/Record/HenonC.hs b/Sound/SC3/UGen/Record/HenonC.hs
--- a/Sound/SC3/UGen/Record/HenonC.hs
+++ b/Sound/SC3/UGen/Record/HenonC.hs
@@ -1,3 +1,4 @@
+-- | Henon map chaotic generator
 module Sound.SC3.UGen.Record.HenonC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/HenonL.hs b/Sound/SC3/UGen/Record/HenonL.hs
--- a/Sound/SC3/UGen/Record/HenonL.hs
+++ b/Sound/SC3/UGen/Record/HenonL.hs
@@ -1,3 +1,4 @@
+-- | Henon map chaotic generator
 module Sound.SC3.UGen.Record.HenonL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/HenonN.hs b/Sound/SC3/UGen/Record/HenonN.hs
--- a/Sound/SC3/UGen/Record/HenonN.hs
+++ b/Sound/SC3/UGen/Record/HenonN.hs
@@ -1,3 +1,4 @@
+-- | Henon map chaotic generator
 module Sound.SC3.UGen.Record.HenonN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/HenonTrig.hs b/Sound/SC3/UGen/Record/HenonTrig.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/HenonTrig.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.HenonTrig where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data HenonTrig = HenonTrig {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+henonTrig :: HenonTrig
+henonTrig = HenonTrig {
+  rate = S.AR,
+  minfreq = 5.0,
+  maxfreq = 10.0,
+  a = 1.4,
+  b = 0.3,
+  x0 = 0.30501993062401,
+  y0 = 0.20938865431933
+  }
+mkHenonTrig :: HenonTrig -> S.UGen
+mkHenonTrig (HenonTrig r a' b' c' d' e' f') = S.mkOsc r "HenonTrig" [a',b',c',d',e',f'] 1
+instance Make HenonTrig where
+  ugen = mkHenonTrig
diff --git a/Sound/SC3/UGen/Record/Hilbert.hs b/Sound/SC3/UGen/Record/Hilbert.hs
--- a/Sound/SC3/UGen/Record/Hilbert.hs
+++ b/Sound/SC3/UGen/Record/Hilbert.hs
@@ -1,3 +1,4 @@
+-- | Applies the Hilbert transform to an input signal.
 module Sound.SC3.UGen.Record.Hilbert where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/HilbertFIR.hs b/Sound/SC3/UGen/Record/HilbertFIR.hs
--- a/Sound/SC3/UGen/Record/HilbertFIR.hs
+++ b/Sound/SC3/UGen/Record/HilbertFIR.hs
@@ -1,3 +1,4 @@
+-- | Applies the Hilbert transform to an input signal.
 module Sound.SC3.UGen.Record.HilbertFIR where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ICepstrum.hs b/Sound/SC3/UGen/Record/ICepstrum.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/ICepstrum.hs
@@ -0,0 +1,17 @@
+-- | Transform a cepstrum back to a spectrum
+module Sound.SC3.UGen.Record.ICepstrum where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data ICepstrum = ICepstrum {
+  cepchain :: S.UGen,
+  fftbuf :: S.UGen
+  } deriving (Show)
+iCepstrum :: ICepstrum
+iCepstrum = ICepstrum {
+  cepchain = 0.0,
+  fftbuf = 0.0
+  }
+mkICepstrum :: ICepstrum -> S.UGen
+mkICepstrum (ICepstrum  a' b') = S.mkOsc S.KR "ICepstrum" [a',b'] 1
+instance Make ICepstrum where
+  ugen = mkICepstrum
diff --git a/Sound/SC3/UGen/Record/IEnvGen.hs b/Sound/SC3/UGen/Record/IEnvGen.hs
--- a/Sound/SC3/UGen/Record/IEnvGen.hs
+++ b/Sound/SC3/UGen/Record/IEnvGen.hs
@@ -1,3 +1,4 @@
+-- | Envelope generator for polling values from an InterplEnv
 module Sound.SC3.UGen.Record.IEnvGen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/IFFT.hs b/Sound/SC3/UGen/Record/IFFT.hs
--- a/Sound/SC3/UGen/Record/IFFT.hs
+++ b/Sound/SC3/UGen/Record/IFFT.hs
@@ -1,3 +1,4 @@
+-- | Inverse Fast Fourier Transform
 module Sound.SC3.UGen.Record.IFFT where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/IIRFilter.hs b/Sound/SC3/UGen/Record/IIRFilter.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/IIRFilter.hs
@@ -0,0 +1,19 @@
+-- | 24db/oct rolloff, 4nd order resonant Low Pass Filter
+module Sound.SC3.UGen.Record.IIRFilter where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data IIRFilter = IIRFilter {
+  input :: S.UGen,
+  freq :: S.UGen,
+  rq :: S.UGen
+  } deriving (Show)
+iIRFilter :: IIRFilter
+iIRFilter = IIRFilter {
+  input = 0.0,
+  freq = 440.0,
+  rq = 1.0
+  }
+mkIIRFilter :: IIRFilter -> S.UGen
+mkIIRFilter (IIRFilter  a' b' c') = S.mkOsc S.AR "IIRFilter" [a',b',c'] 1
+instance Make IIRFilter where
+  ugen = mkIIRFilter
diff --git a/Sound/SC3/UGen/Record/IRand.hs b/Sound/SC3/UGen/Record/IRand.hs
--- a/Sound/SC3/UGen/Record/IRand.hs
+++ b/Sound/SC3/UGen/Record/IRand.hs
@@ -1,3 +1,4 @@
+-- | Single integer random number generator.
 module Sound.SC3.UGen.Record.IRand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Impulse.hs b/Sound/SC3/UGen/Record/Impulse.hs
--- a/Sound/SC3/UGen/Record/Impulse.hs
+++ b/Sound/SC3/UGen/Record/Impulse.hs
@@ -1,3 +1,4 @@
+-- | Impulse oscillator.
 module Sound.SC3.UGen.Record.Impulse where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/In.hs b/Sound/SC3/UGen/Record/In.hs
--- a/Sound/SC3/UGen/Record/In.hs
+++ b/Sound/SC3/UGen/Record/In.hs
@@ -1,18 +1,17 @@
+-- | Read a signal from a bus.
 module Sound.SC3.UGen.Record.In where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data In = In {
   rate :: S.Rate,
-  bus :: S.UGen,
-  numChannels :: S.UGen
+  bus :: S.UGen
   } deriving (Show)
 in' :: In
 in' = In {
   rate = S.AR,
-  bus = 0.0,
-  numChannels = 1.0
+  bus = 0.0
   }
 mkIn :: In -> S.UGen
-mkIn (In r a' b') = S.mkOsc r "In" [a',b'] 1
+mkIn (In r a') = S.mkOsc r "In" [a'] undefined
 instance Make In where
   ugen = mkIn
diff --git a/Sound/SC3/UGen/Record/InFeedback.hs b/Sound/SC3/UGen/Record/InFeedback.hs
--- a/Sound/SC3/UGen/Record/InFeedback.hs
+++ b/Sound/SC3/UGen/Record/InFeedback.hs
@@ -1,16 +1,15 @@
+-- | Read signal from a bus with a current or one cycle old timestamp.
 module Sound.SC3.UGen.Record.InFeedback where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data InFeedback = InFeedback {
-  bus :: S.UGen,
-  numChannels :: S.UGen
+  bus :: S.UGen
   } deriving (Show)
 inFeedback :: InFeedback
 inFeedback = InFeedback {
-  bus = 0.0,
-  numChannels = 1.0
+  bus = 0.0
   }
 mkInFeedback :: InFeedback -> S.UGen
-mkInFeedback (InFeedback  a' b') = S.mkOsc S.AR "InFeedback" [a',b'] 1
+mkInFeedback (InFeedback  a') = S.mkOsc S.AR "InFeedback" [a'] undefined
 instance Make InFeedback where
   ugen = mkInFeedback
diff --git a/Sound/SC3/UGen/Record/InGrain.hs b/Sound/SC3/UGen/Record/InGrain.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/InGrain.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.InGrain where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data InGrain = InGrain {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  input :: S.UGen
+  } deriving (Show)
+inGrain :: InGrain
+inGrain = InGrain {
+  trigger = 0.0,
+  dur = 1.0,
+  input = 0.0
+  }
+mkInGrain :: InGrain -> S.UGen
+mkInGrain (InGrain  a' b' c') = S.mkOsc S.AR "InGrain" [a',b',c'] 1
+instance Make InGrain where
+  ugen = mkInGrain
diff --git a/Sound/SC3/UGen/Record/InGrainB.hs b/Sound/SC3/UGen/Record/InGrainB.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/InGrainB.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.InGrainB where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data InGrainB = InGrainB {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  input :: S.UGen,
+  envbuf :: S.UGen
+  } deriving (Show)
+inGrainB :: InGrainB
+inGrainB = InGrainB {
+  trigger = 0.0,
+  dur = 1.0,
+  input = 0.0,
+  envbuf = 0.0
+  }
+mkInGrainB :: InGrainB -> S.UGen
+mkInGrainB (InGrainB  a' b' c' d') = S.mkOsc S.AR "InGrainB" [a',b',c',d'] 1
+instance Make InGrainB where
+  ugen = mkInGrainB
diff --git a/Sound/SC3/UGen/Record/InGrainBBF.hs b/Sound/SC3/UGen/Record/InGrainBBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/InGrainBBF.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.InGrainBBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data InGrainBBF = InGrainBBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  input :: S.UGen,
+  envbuf :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+inGrainBBF :: InGrainBBF
+inGrainBBF = InGrainBBF {
+  trigger = 0.0,
+  dur = 1.0,
+  input = 0.0,
+  envbuf = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  wComp = 0.0
+  }
+mkInGrainBBF :: InGrainBBF -> S.UGen
+mkInGrainBBF (InGrainBBF  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "InGrainBBF" [a',b',c',d',e',f',g',h'] 4
+instance Make InGrainBBF where
+  ugen = mkInGrainBBF
diff --git a/Sound/SC3/UGen/Record/InGrainBF.hs b/Sound/SC3/UGen/Record/InGrainBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/InGrainBF.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.InGrainBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data InGrainBF = InGrainBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  input :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+inGrainBF :: InGrainBF
+inGrainBF = InGrainBF {
+  trigger = 0.0,
+  dur = 1.0,
+  input = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  wComp = 0.0
+  }
+mkInGrainBF :: InGrainBF -> S.UGen
+mkInGrainBF (InGrainBF  a' b' c' d' e' f' g') = S.mkOsc S.AR "InGrainBF" [a',b',c',d',e',f',g'] 4
+instance Make InGrainBF where
+  ugen = mkInGrainBF
diff --git a/Sound/SC3/UGen/Record/InGrainI.hs b/Sound/SC3/UGen/Record/InGrainI.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/InGrainI.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.InGrainI where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data InGrainI = InGrainI {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  input :: S.UGen,
+  envbuf1 :: S.UGen,
+  envbuf2 :: S.UGen,
+  ifac :: S.UGen
+  } deriving (Show)
+inGrainI :: InGrainI
+inGrainI = InGrainI {
+  trigger = 0.0,
+  dur = 1.0,
+  input = 0.0,
+  envbuf1 = 0.0,
+  envbuf2 = 0.0,
+  ifac = 0.5
+  }
+mkInGrainI :: InGrainI -> S.UGen
+mkInGrainI (InGrainI  a' b' c' d' e' f') = S.mkOsc S.AR "InGrainI" [a',b',c',d',e',f'] 1
+instance Make InGrainI where
+  ugen = mkInGrainI
diff --git a/Sound/SC3/UGen/Record/InGrainIBF.hs b/Sound/SC3/UGen/Record/InGrainIBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/InGrainIBF.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.InGrainIBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data InGrainIBF = InGrainIBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  input :: S.UGen,
+  envbuf1 :: S.UGen,
+  envbuf2 :: S.UGen,
+  ifac :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+inGrainIBF :: InGrainIBF
+inGrainIBF = InGrainIBF {
+  trigger = 0.0,
+  dur = 1.0,
+  input = 0.0,
+  envbuf1 = 0.0,
+  envbuf2 = 0.0,
+  ifac = 0.5,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  wComp = 0.0
+  }
+mkInGrainIBF :: InGrainIBF -> S.UGen
+mkInGrainIBF (InGrainIBF  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "InGrainIBF" [a',b',c',d',e',f',g',h',i',j'] 4
+instance Make InGrainIBF where
+  ugen = mkInGrainIBF
diff --git a/Sound/SC3/UGen/Record/InRange.hs b/Sound/SC3/UGen/Record/InRange.hs
--- a/Sound/SC3/UGen/Record/InRange.hs
+++ b/Sound/SC3/UGen/Record/InRange.hs
@@ -1,3 +1,4 @@
+-- | Tests if a signal is within a given range.
 module Sound.SC3.UGen.Record.InRange where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/InRect.hs b/Sound/SC3/UGen/Record/InRect.hs
--- a/Sound/SC3/UGen/Record/InRect.hs
+++ b/Sound/SC3/UGen/Record/InRect.hs
@@ -1,3 +1,4 @@
+-- | Test if a point is within a given rectangle.
 module Sound.SC3.UGen.Record.InRect where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/InTrig.hs b/Sound/SC3/UGen/Record/InTrig.hs
--- a/Sound/SC3/UGen/Record/InTrig.hs
+++ b/Sound/SC3/UGen/Record/InTrig.hs
@@ -1,16 +1,15 @@
+-- | Generate a trigger anytime a bus is set.
 module Sound.SC3.UGen.Record.InTrig where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data InTrig = InTrig {
-  bus :: S.UGen,
-  numChannels :: S.UGen
+  bus :: S.UGen
   } deriving (Show)
 inTrig :: InTrig
 inTrig = InTrig {
-  bus = 0.0,
-  numChannels = 1.0
+  bus = 0.0
   }
 mkInTrig :: InTrig -> S.UGen
-mkInTrig (InTrig  a' b') = S.mkOsc S.KR "InTrig" [a',b'] 1
+mkInTrig (InTrig  a') = S.mkOsc S.KR "InTrig" [a'] undefined
 instance Make InTrig where
   ugen = mkInTrig
diff --git a/Sound/SC3/UGen/Record/Index.hs b/Sound/SC3/UGen/Record/Index.hs
--- a/Sound/SC3/UGen/Record/Index.hs
+++ b/Sound/SC3/UGen/Record/Index.hs
@@ -1,3 +1,4 @@
+-- | Index into a table with a signal
 module Sound.SC3.UGen.Record.Index where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/IndexInBetween.hs b/Sound/SC3/UGen/Record/IndexInBetween.hs
--- a/Sound/SC3/UGen/Record/IndexInBetween.hs
+++ b/Sound/SC3/UGen/Record/IndexInBetween.hs
@@ -1,3 +1,4 @@
+-- | Finds the (lowest) point in the Buffer at which the input signal lies in-between the two values
 module Sound.SC3.UGen.Record.IndexInBetween where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/IndexL.hs b/Sound/SC3/UGen/Record/IndexL.hs
--- a/Sound/SC3/UGen/Record/IndexL.hs
+++ b/Sound/SC3/UGen/Record/IndexL.hs
@@ -1,3 +1,4 @@
+-- | Index into a table with a signal, linear interpolated
 module Sound.SC3.UGen.Record.IndexL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/InsideOut.hs b/Sound/SC3/UGen/Record/InsideOut.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/InsideOut.hs
@@ -0,0 +1,17 @@
+-- | Distortion by subtracting magnitude from 1
+module Sound.SC3.UGen.Record.InsideOut where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data InsideOut = InsideOut {
+  rate :: S.Rate,
+  input :: S.UGen
+  } deriving (Show)
+insideOut :: InsideOut
+insideOut = InsideOut {
+  rate = S.AR,
+  input = 0.0
+  }
+mkInsideOut :: InsideOut -> S.UGen
+mkInsideOut (InsideOut r a') = S.mkOsc r "InsideOut" [a'] 1
+instance Make InsideOut where
+  ugen = mkInsideOut
diff --git a/Sound/SC3/UGen/Record/Instruction.hs b/Sound/SC3/UGen/Record/Instruction.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Instruction.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Instruction where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Instruction = Instruction {
+  bufnum :: S.UGen
+  } deriving (Show)
+instruction :: Instruction
+instruction = Instruction {
+  bufnum = 0.0
+  }
+mkInstruction :: Instruction -> S.UGen
+mkInstruction (Instruction  a') = S.mkOsc S.AR "Instruction" [a'] 1
+instance Make Instruction where
+  ugen = mkInstruction
diff --git a/Sound/SC3/UGen/Record/Integrator.hs b/Sound/SC3/UGen/Record/Integrator.hs
--- a/Sound/SC3/UGen/Record/Integrator.hs
+++ b/Sound/SC3/UGen/Record/Integrator.hs
@@ -1,3 +1,4 @@
+-- | A leaky integrator.
 module Sound.SC3.UGen.Record.Integrator where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/JoshGrain.hs b/Sound/SC3/UGen/Record/JoshGrain.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/JoshGrain.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.JoshGrain where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data JoshGrain = JoshGrain {
+  maxSize :: S.UGen
+  } deriving (Show)
+joshGrain :: JoshGrain
+joshGrain = JoshGrain {
+  maxSize = 0.0
+  }
+mkJoshGrain :: JoshGrain -> S.UGen
+mkJoshGrain (JoshGrain  a') = S.mkOsc S.AR "JoshGrain" [a'] 1
+instance Make JoshGrain where
+  ugen = mkJoshGrain
diff --git a/Sound/SC3/UGen/Record/JoshMultiOutGrain.hs b/Sound/SC3/UGen/Record/JoshMultiOutGrain.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/JoshMultiOutGrain.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.JoshMultiOutGrain where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data JoshMultiOutGrain = JoshMultiOutGrain {
+  maxSize :: S.UGen
+  } deriving (Show)
+joshMultiOutGrain :: JoshMultiOutGrain
+joshMultiOutGrain = JoshMultiOutGrain {
+  maxSize = 0.0
+  }
+mkJoshMultiOutGrain :: JoshMultiOutGrain -> S.UGen
+mkJoshMultiOutGrain (JoshMultiOutGrain  a') = S.mkOsc S.AR "JoshMultiOutGrain" [a'] 1
+instance Make JoshMultiOutGrain where
+  ugen = mkJoshMultiOutGrain
diff --git a/Sound/SC3/UGen/Record/K2A.hs b/Sound/SC3/UGen/Record/K2A.hs
--- a/Sound/SC3/UGen/Record/K2A.hs
+++ b/Sound/SC3/UGen/Record/K2A.hs
@@ -1,3 +1,4 @@
+-- | Control to audio rate converter.
 module Sound.SC3.UGen.Record.K2A where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/KeyState.hs b/Sound/SC3/UGen/Record/KeyState.hs
--- a/Sound/SC3/UGen/Record/KeyState.hs
+++ b/Sound/SC3/UGen/Record/KeyState.hs
@@ -1,3 +1,4 @@
+-- | Respond to the state of a key
 module Sound.SC3.UGen.Record.KeyState where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/KeyTrack.hs b/Sound/SC3/UGen/Record/KeyTrack.hs
--- a/Sound/SC3/UGen/Record/KeyTrack.hs
+++ b/Sound/SC3/UGen/Record/KeyTrack.hs
@@ -1,3 +1,4 @@
+-- | Key tracker
 module Sound.SC3.UGen.Record.KeyTrack where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Klang.hs b/Sound/SC3/UGen/Record/Klang.hs
--- a/Sound/SC3/UGen/Record/Klang.hs
+++ b/Sound/SC3/UGen/Record/Klang.hs
@@ -1,3 +1,4 @@
+-- | Sine oscillator bank
 module Sound.SC3.UGen.Record.Klang where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Klank.hs b/Sound/SC3/UGen/Record/Klank.hs
--- a/Sound/SC3/UGen/Record/Klank.hs
+++ b/Sound/SC3/UGen/Record/Klank.hs
@@ -1,3 +1,4 @@
+-- | Bank of resonators
 module Sound.SC3.UGen.Record.Klank where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/KmeansToBPSet1.hs b/Sound/SC3/UGen/Record/KmeansToBPSet1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/KmeansToBPSet1.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.KmeansToBPSet1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data KmeansToBPSet1 = KmeansToBPSet1 {
+  freq :: S.UGen,
+  numdatapoints :: S.UGen,
+  maxnummeans :: S.UGen,
+  nummeans :: S.UGen,
+  tnewdata :: S.UGen,
+  tnewmeans :: S.UGen,
+  soft :: S.UGen,
+  bufnum :: S.UGen
+  } deriving (Show)
+kmeansToBPSet1 :: KmeansToBPSet1
+kmeansToBPSet1 = KmeansToBPSet1 {
+  freq = 440.0,
+  numdatapoints = 20.0,
+  maxnummeans = 4.0,
+  nummeans = 4.0,
+  tnewdata = 1.0,
+  tnewmeans = 1.0,
+  soft = 1.0,
+  bufnum = 0.0
+  }
+mkKmeansToBPSet1 :: KmeansToBPSet1 -> S.UGen
+mkKmeansToBPSet1 (KmeansToBPSet1  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "KmeansToBPSet1" [a',b',c',d',e',f',g',h'] 1
+instance Make KmeansToBPSet1 where
+  ugen = mkKmeansToBPSet1
diff --git a/Sound/SC3/UGen/Record/LFBrownNoise0.hs b/Sound/SC3/UGen/Record/LFBrownNoise0.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LFBrownNoise0.hs
@@ -0,0 +1,21 @@
+-- | random walk step
+module Sound.SC3.UGen.Record.LFBrownNoise0 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LFBrownNoise0 = LFBrownNoise0 {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  dev :: S.UGen,
+  dist :: S.UGen
+  } deriving (Show)
+lFBrownNoise0 :: LFBrownNoise0
+lFBrownNoise0 = LFBrownNoise0 {
+  rate = S.AR,
+  freq = 20.0,
+  dev = 1.0,
+  dist = 0.0
+  }
+mkLFBrownNoise0 :: LFBrownNoise0 -> S.UGen
+mkLFBrownNoise0 (LFBrownNoise0 r a' b' c') = S.mkOsc r "LFBrownNoise0" [a',b',c'] 1
+instance Make LFBrownNoise0 where
+  ugen = mkLFBrownNoise0
diff --git a/Sound/SC3/UGen/Record/LFBrownNoise1.hs b/Sound/SC3/UGen/Record/LFBrownNoise1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LFBrownNoise1.hs
@@ -0,0 +1,21 @@
+-- | random walk linear interp
+module Sound.SC3.UGen.Record.LFBrownNoise1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LFBrownNoise1 = LFBrownNoise1 {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  dev :: S.UGen,
+  dist :: S.UGen
+  } deriving (Show)
+lFBrownNoise1 :: LFBrownNoise1
+lFBrownNoise1 = LFBrownNoise1 {
+  rate = S.AR,
+  freq = 20.0,
+  dev = 1.0,
+  dist = 0.0
+  }
+mkLFBrownNoise1 :: LFBrownNoise1 -> S.UGen
+mkLFBrownNoise1 (LFBrownNoise1 r a' b' c') = S.mkOsc r "LFBrownNoise1" [a',b',c'] 1
+instance Make LFBrownNoise1 where
+  ugen = mkLFBrownNoise1
diff --git a/Sound/SC3/UGen/Record/LFBrownNoise2.hs b/Sound/SC3/UGen/Record/LFBrownNoise2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LFBrownNoise2.hs
@@ -0,0 +1,21 @@
+-- | random walk cubic interp
+module Sound.SC3.UGen.Record.LFBrownNoise2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LFBrownNoise2 = LFBrownNoise2 {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  dev :: S.UGen,
+  dist :: S.UGen
+  } deriving (Show)
+lFBrownNoise2 :: LFBrownNoise2
+lFBrownNoise2 = LFBrownNoise2 {
+  rate = S.AR,
+  freq = 20.0,
+  dev = 1.0,
+  dist = 0.0
+  }
+mkLFBrownNoise2 :: LFBrownNoise2 -> S.UGen
+mkLFBrownNoise2 (LFBrownNoise2 r a' b' c') = S.mkOsc r "LFBrownNoise2" [a',b',c'] 1
+instance Make LFBrownNoise2 where
+  ugen = mkLFBrownNoise2
diff --git a/Sound/SC3/UGen/Record/LFClipNoise.hs b/Sound/SC3/UGen/Record/LFClipNoise.hs
--- a/Sound/SC3/UGen/Record/LFClipNoise.hs
+++ b/Sound/SC3/UGen/Record/LFClipNoise.hs
@@ -1,3 +1,4 @@
+-- | Clipped noise
 module Sound.SC3.UGen.Record.LFClipNoise where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFCub.hs b/Sound/SC3/UGen/Record/LFCub.hs
--- a/Sound/SC3/UGen/Record/LFCub.hs
+++ b/Sound/SC3/UGen/Record/LFCub.hs
@@ -1,3 +1,4 @@
+-- | A sine like shape made of two cubic pieces
 module Sound.SC3.UGen.Record.LFCub where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFDClipNoise.hs b/Sound/SC3/UGen/Record/LFDClipNoise.hs
--- a/Sound/SC3/UGen/Record/LFDClipNoise.hs
+++ b/Sound/SC3/UGen/Record/LFDClipNoise.hs
@@ -1,3 +1,4 @@
+-- | Dynamic clipped noise
 module Sound.SC3.UGen.Record.LFDClipNoise where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFDNoise0.hs b/Sound/SC3/UGen/Record/LFDNoise0.hs
--- a/Sound/SC3/UGen/Record/LFDNoise0.hs
+++ b/Sound/SC3/UGen/Record/LFDNoise0.hs
@@ -1,3 +1,4 @@
+-- | Dynamic step noise
 module Sound.SC3.UGen.Record.LFDNoise0 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFDNoise1.hs b/Sound/SC3/UGen/Record/LFDNoise1.hs
--- a/Sound/SC3/UGen/Record/LFDNoise1.hs
+++ b/Sound/SC3/UGen/Record/LFDNoise1.hs
@@ -1,3 +1,4 @@
+-- | Dynamic ramp noise
 module Sound.SC3.UGen.Record.LFDNoise1 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFDNoise3.hs b/Sound/SC3/UGen/Record/LFDNoise3.hs
--- a/Sound/SC3/UGen/Record/LFDNoise3.hs
+++ b/Sound/SC3/UGen/Record/LFDNoise3.hs
@@ -1,3 +1,4 @@
+-- | Dynamic cubic noise
 module Sound.SC3.UGen.Record.LFDNoise3 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFGauss.hs b/Sound/SC3/UGen/Record/LFGauss.hs
--- a/Sound/SC3/UGen/Record/LFGauss.hs
+++ b/Sound/SC3/UGen/Record/LFGauss.hs
@@ -1,3 +1,4 @@
+-- | Gaussian function oscillator
 module Sound.SC3.UGen.Record.LFGauss where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFNoise0.hs b/Sound/SC3/UGen/Record/LFNoise0.hs
--- a/Sound/SC3/UGen/Record/LFNoise0.hs
+++ b/Sound/SC3/UGen/Record/LFNoise0.hs
@@ -1,3 +1,4 @@
+-- | Step noise
 module Sound.SC3.UGen.Record.LFNoise0 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFNoise1.hs b/Sound/SC3/UGen/Record/LFNoise1.hs
--- a/Sound/SC3/UGen/Record/LFNoise1.hs
+++ b/Sound/SC3/UGen/Record/LFNoise1.hs
@@ -1,3 +1,4 @@
+-- | Ramp noise
 module Sound.SC3.UGen.Record.LFNoise1 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFNoise2.hs b/Sound/SC3/UGen/Record/LFNoise2.hs
--- a/Sound/SC3/UGen/Record/LFNoise2.hs
+++ b/Sound/SC3/UGen/Record/LFNoise2.hs
@@ -1,3 +1,4 @@
+-- | Quadratic noise.
 module Sound.SC3.UGen.Record.LFNoise2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFPar.hs b/Sound/SC3/UGen/Record/LFPar.hs
--- a/Sound/SC3/UGen/Record/LFPar.hs
+++ b/Sound/SC3/UGen/Record/LFPar.hs
@@ -1,3 +1,4 @@
+-- | Parabolic oscillator
 module Sound.SC3.UGen.Record.LFPar where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFPulse.hs b/Sound/SC3/UGen/Record/LFPulse.hs
--- a/Sound/SC3/UGen/Record/LFPulse.hs
+++ b/Sound/SC3/UGen/Record/LFPulse.hs
@@ -1,3 +1,4 @@
+-- | pulse oscillator
 module Sound.SC3.UGen.Record.LFPulse where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFSaw.hs b/Sound/SC3/UGen/Record/LFSaw.hs
--- a/Sound/SC3/UGen/Record/LFSaw.hs
+++ b/Sound/SC3/UGen/Record/LFSaw.hs
@@ -1,3 +1,4 @@
+-- | Sawtooth oscillator
 module Sound.SC3.UGen.Record.LFSaw where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LFTri.hs b/Sound/SC3/UGen/Record/LFTri.hs
--- a/Sound/SC3/UGen/Record/LFTri.hs
+++ b/Sound/SC3/UGen/Record/LFTri.hs
@@ -1,3 +1,4 @@
+-- | Triangle oscillator
 module Sound.SC3.UGen.Record.LFTri where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LPCAnalyzer.hs b/Sound/SC3/UGen/Record/LPCAnalyzer.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LPCAnalyzer.hs
@@ -0,0 +1,27 @@
+-- | Live Linear Predictive Coding Analysis and Resynthesis
+module Sound.SC3.UGen.Record.LPCAnalyzer where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LPCAnalyzer = LPCAnalyzer {
+  input :: S.UGen,
+  source :: S.UGen,
+  n :: S.UGen,
+  p :: S.UGen,
+  testE :: S.UGen,
+  delta :: S.UGen,
+  windowtype :: S.UGen
+  } deriving (Show)
+lPCAnalyzer :: LPCAnalyzer
+lPCAnalyzer = LPCAnalyzer {
+  input = 0.0,
+  source = 0.01,
+  n = 256.0,
+  p = 10.0,
+  testE = 0.0,
+  delta = 0.999,
+  windowtype = 0.0
+  }
+mkLPCAnalyzer :: LPCAnalyzer -> S.UGen
+mkLPCAnalyzer (LPCAnalyzer  a' b' c' d' e' f' g') = S.mkOsc S.AR "LPCAnalyzer" [a',b',c',d',e',f',g'] 1
+instance Make LPCAnalyzer where
+  ugen = mkLPCAnalyzer
diff --git a/Sound/SC3/UGen/Record/LPCError.hs b/Sound/SC3/UGen/Record/LPCError.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LPCError.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.LPCError where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LPCError = LPCError {
+  input :: S.UGen,
+  p :: S.UGen
+  } deriving (Show)
+lPCError :: LPCError
+lPCError = LPCError {
+  input = 0.0,
+  p = 10.0
+  }
+mkLPCError :: LPCError -> S.UGen
+mkLPCError (LPCError  a' b') = S.mkOsc S.AR "LPCError" [a',b'] 1
+instance Make LPCError where
+  ugen = mkLPCError
diff --git a/Sound/SC3/UGen/Record/LPCSynth.hs b/Sound/SC3/UGen/Record/LPCSynth.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LPCSynth.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.LPCSynth where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LPCSynth = LPCSynth {
+  buffer :: S.UGen,
+  signal :: S.UGen,
+  pointer :: S.UGen
+  } deriving (Show)
+lPCSynth :: LPCSynth
+lPCSynth = LPCSynth {
+  buffer = 0.0,
+  signal = 0.0,
+  pointer = 0.0
+  }
+mkLPCSynth :: LPCSynth -> S.UGen
+mkLPCSynth (LPCSynth  a' b' c') = S.mkOsc S.AR "LPCSynth" [a',b',c'] 1
+instance Make LPCSynth where
+  ugen = mkLPCSynth
diff --git a/Sound/SC3/UGen/Record/LPCVals.hs b/Sound/SC3/UGen/Record/LPCVals.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LPCVals.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.LPCVals where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LPCVals = LPCVals {
+  rate :: S.Rate,
+  buffer :: S.UGen,
+  pointer :: S.UGen
+  } deriving (Show)
+lPCVals :: LPCVals
+lPCVals = LPCVals {
+  rate = S.AR,
+  buffer = 0.0,
+  pointer = 0.0
+  }
+mkLPCVals :: LPCVals -> S.UGen
+mkLPCVals (LPCVals r a' b') = S.mkOsc r "LPCVals" [a',b'] 3
+instance Make LPCVals where
+  ugen = mkLPCVals
diff --git a/Sound/SC3/UGen/Record/LPF.hs b/Sound/SC3/UGen/Record/LPF.hs
--- a/Sound/SC3/UGen/Record/LPF.hs
+++ b/Sound/SC3/UGen/Record/LPF.hs
@@ -1,3 +1,4 @@
+-- | 2nd order Butterworth lowpass filter
 module Sound.SC3.UGen.Record.LPF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LPF1.hs b/Sound/SC3/UGen/Record/LPF1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LPF1.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.LPF1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LPF1 = LPF1 {
+  rate :: S.Rate,
+  input :: S.UGen,
+  freq :: S.UGen
+  } deriving (Show)
+lPF1 :: LPF1
+lPF1 = LPF1 {
+  rate = S.AR,
+  input = 0.0,
+  freq = 1000.0
+  }
+mkLPF1 :: LPF1 -> S.UGen
+mkLPF1 (LPF1 r a' b') = S.mkOsc r "LPF1" [a',b'] 1
+instance Make LPF1 where
+  ugen = mkLPF1
diff --git a/Sound/SC3/UGen/Record/LPF18.hs b/Sound/SC3/UGen/Record/LPF18.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LPF18.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.LPF18 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LPF18 = LPF18 {
+  input :: S.UGen,
+  freq :: S.UGen,
+  res :: S.UGen,
+  dist :: S.UGen
+  } deriving (Show)
+lPF18 :: LPF18
+lPF18 = LPF18 {
+  input = 0.0,
+  freq = 100.0,
+  res = 1.0,
+  dist = 0.4
+  }
+mkLPF18 :: LPF18 -> S.UGen
+mkLPF18 (LPF18  a' b' c' d') = S.mkOsc S.AR "LPF18" [a',b',c',d'] 1
+instance Make LPF18 where
+  ugen = mkLPF18
diff --git a/Sound/SC3/UGen/Record/LPFVS6.hs b/Sound/SC3/UGen/Record/LPFVS6.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LPFVS6.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.LPFVS6 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LPFVS6 = LPFVS6 {
+  rate :: S.Rate,
+  input :: S.UGen,
+  freq :: S.UGen,
+  slope :: S.UGen
+  } deriving (Show)
+lPFVS6 :: LPFVS6
+lPFVS6 = LPFVS6 {
+  rate = S.AR,
+  input = 0.0,
+  freq = 1000.0,
+  slope = 0.5
+  }
+mkLPFVS6 :: LPFVS6 -> S.UGen
+mkLPFVS6 (LPFVS6 r a' b' c') = S.mkOsc r "LPFVS6" [a',b',c'] 1
+instance Make LPFVS6 where
+  ugen = mkLPFVS6
diff --git a/Sound/SC3/UGen/Record/LPZ1.hs b/Sound/SC3/UGen/Record/LPZ1.hs
--- a/Sound/SC3/UGen/Record/LPZ1.hs
+++ b/Sound/SC3/UGen/Record/LPZ1.hs
@@ -1,3 +1,4 @@
+-- | Two point average filter
 module Sound.SC3.UGen.Record.LPZ1 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LPZ2.hs b/Sound/SC3/UGen/Record/LPZ2.hs
--- a/Sound/SC3/UGen/Record/LPZ2.hs
+++ b/Sound/SC3/UGen/Record/LPZ2.hs
@@ -1,3 +1,4 @@
+-- | Two zero fixed lowpass
 module Sound.SC3.UGen.Record.LPZ2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LTI.hs b/Sound/SC3/UGen/Record/LTI.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LTI.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.LTI where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LTI = LTI {
+  input :: S.UGen,
+  bufnuma :: S.UGen,
+  bufnumb :: S.UGen
+  } deriving (Show)
+lTI :: LTI
+lTI = LTI {
+  input = 0.0,
+  bufnuma = 0.0,
+  bufnumb = 1.0
+  }
+mkLTI :: LTI -> S.UGen
+mkLTI (LTI  a' b' c') = S.mkOsc S.AR "LTI" [a',b',c'] 1
+instance Make LTI where
+  ugen = mkLTI
diff --git a/Sound/SC3/UGen/Record/Lag.hs b/Sound/SC3/UGen/Record/Lag.hs
--- a/Sound/SC3/UGen/Record/Lag.hs
+++ b/Sound/SC3/UGen/Record/Lag.hs
@@ -1,3 +1,4 @@
+-- | Exponential lag
 module Sound.SC3.UGen.Record.Lag where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Lag2.hs b/Sound/SC3/UGen/Record/Lag2.hs
--- a/Sound/SC3/UGen/Record/Lag2.hs
+++ b/Sound/SC3/UGen/Record/Lag2.hs
@@ -1,3 +1,4 @@
+-- | Exponential lag
 module Sound.SC3.UGen.Record.Lag2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Lag2UD.hs b/Sound/SC3/UGen/Record/Lag2UD.hs
--- a/Sound/SC3/UGen/Record/Lag2UD.hs
+++ b/Sound/SC3/UGen/Record/Lag2UD.hs
@@ -1,3 +1,4 @@
+-- | Exponential lag
 module Sound.SC3.UGen.Record.Lag2UD where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Lag3.hs b/Sound/SC3/UGen/Record/Lag3.hs
--- a/Sound/SC3/UGen/Record/Lag3.hs
+++ b/Sound/SC3/UGen/Record/Lag3.hs
@@ -1,3 +1,4 @@
+-- | Exponential lag
 module Sound.SC3.UGen.Record.Lag3 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Lag3UD.hs b/Sound/SC3/UGen/Record/Lag3UD.hs
--- a/Sound/SC3/UGen/Record/Lag3UD.hs
+++ b/Sound/SC3/UGen/Record/Lag3UD.hs
@@ -1,3 +1,4 @@
+-- | Exponential lag
 module Sound.SC3.UGen.Record.Lag3UD where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LagControl.hs b/Sound/SC3/UGen/Record/LagControl.hs
--- a/Sound/SC3/UGen/Record/LagControl.hs
+++ b/Sound/SC3/UGen/Record/LagControl.hs
@@ -1,3 +1,4 @@
+-- | Lagged control input
 module Sound.SC3.UGen.Record.LagControl where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LagIn.hs b/Sound/SC3/UGen/Record/LagIn.hs
--- a/Sound/SC3/UGen/Record/LagIn.hs
+++ b/Sound/SC3/UGen/Record/LagIn.hs
@@ -1,18 +1,17 @@
+-- | Read a control signal from a bus with a lag
 module Sound.SC3.UGen.Record.LagIn where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data LagIn = LagIn {
   bus :: S.UGen,
-  numChannels :: S.UGen,
   lag :: S.UGen
   } deriving (Show)
 lagIn :: LagIn
 lagIn = LagIn {
   bus = 0.0,
-  numChannels = 1.0,
   lag = 0.1
   }
 mkLagIn :: LagIn -> S.UGen
-mkLagIn (LagIn  a' b' c') = S.mkOsc S.KR "LagIn" [a',b',c'] 1
+mkLagIn (LagIn  a' b') = S.mkOsc S.KR "LagIn" [a',b'] undefined
 instance Make LagIn where
   ugen = mkLagIn
diff --git a/Sound/SC3/UGen/Record/LagUD.hs b/Sound/SC3/UGen/Record/LagUD.hs
--- a/Sound/SC3/UGen/Record/LagUD.hs
+++ b/Sound/SC3/UGen/Record/LagUD.hs
@@ -1,3 +1,4 @@
+-- | Exponential lag
 module Sound.SC3.UGen.Record.LagUD where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LastValue.hs b/Sound/SC3/UGen/Record/LastValue.hs
--- a/Sound/SC3/UGen/Record/LastValue.hs
+++ b/Sound/SC3/UGen/Record/LastValue.hs
@@ -1,3 +1,4 @@
+-- | Output the last value before the input changed
 module Sound.SC3.UGen.Record.LastValue where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Latch.hs b/Sound/SC3/UGen/Record/Latch.hs
--- a/Sound/SC3/UGen/Record/Latch.hs
+++ b/Sound/SC3/UGen/Record/Latch.hs
@@ -1,3 +1,4 @@
+-- | Sample and hold
 module Sound.SC3.UGen.Record.Latch where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Latoocarfian2DC.hs b/Sound/SC3/UGen/Record/Latoocarfian2DC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Latoocarfian2DC.hs
@@ -0,0 +1,31 @@
+-- | latoocarfian 2D chaotic generator
+module Sound.SC3.UGen.Record.Latoocarfian2DC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Latoocarfian2DC = Latoocarfian2DC {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  c :: S.UGen,
+  d :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+latoocarfian2DC :: Latoocarfian2DC
+latoocarfian2DC = Latoocarfian2DC {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  a = 1.0,
+  b = 3.0,
+  c = 0.5,
+  d = 0.5,
+  x0 = 0.34082301375036,
+  y0 = -0.38270086971332
+  }
+mkLatoocarfian2DC :: Latoocarfian2DC -> S.UGen
+mkLatoocarfian2DC (Latoocarfian2DC r a' b' c' d' e' f' g' h') = S.mkOsc r "Latoocarfian2DC" [a',b',c',d',e',f',g',h'] 1
+instance Make Latoocarfian2DC where
+  ugen = mkLatoocarfian2DC
diff --git a/Sound/SC3/UGen/Record/Latoocarfian2DL.hs b/Sound/SC3/UGen/Record/Latoocarfian2DL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Latoocarfian2DL.hs
@@ -0,0 +1,31 @@
+-- | latoocarfian 2D chaotic generator
+module Sound.SC3.UGen.Record.Latoocarfian2DL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Latoocarfian2DL = Latoocarfian2DL {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  c :: S.UGen,
+  d :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+latoocarfian2DL :: Latoocarfian2DL
+latoocarfian2DL = Latoocarfian2DL {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  a = 1.0,
+  b = 3.0,
+  c = 0.5,
+  d = 0.5,
+  x0 = 0.34082301375036,
+  y0 = -0.38270086971332
+  }
+mkLatoocarfian2DL :: Latoocarfian2DL -> S.UGen
+mkLatoocarfian2DL (Latoocarfian2DL r a' b' c' d' e' f' g' h') = S.mkOsc r "Latoocarfian2DL" [a',b',c',d',e',f',g',h'] 1
+instance Make Latoocarfian2DL where
+  ugen = mkLatoocarfian2DL
diff --git a/Sound/SC3/UGen/Record/Latoocarfian2DN.hs b/Sound/SC3/UGen/Record/Latoocarfian2DN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Latoocarfian2DN.hs
@@ -0,0 +1,31 @@
+-- | latoocarfian 2D chaotic generator
+module Sound.SC3.UGen.Record.Latoocarfian2DN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Latoocarfian2DN = Latoocarfian2DN {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  c :: S.UGen,
+  d :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+latoocarfian2DN :: Latoocarfian2DN
+latoocarfian2DN = Latoocarfian2DN {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  a = 1.0,
+  b = 3.0,
+  c = 0.5,
+  d = 0.5,
+  x0 = 0.34082301375036,
+  y0 = -0.38270086971332
+  }
+mkLatoocarfian2DN :: Latoocarfian2DN -> S.UGen
+mkLatoocarfian2DN (Latoocarfian2DN r a' b' c' d' e' f' g' h') = S.mkOsc r "Latoocarfian2DN" [a',b',c',d',e',f',g',h'] 1
+instance Make Latoocarfian2DN where
+  ugen = mkLatoocarfian2DN
diff --git a/Sound/SC3/UGen/Record/LatoocarfianC.hs b/Sound/SC3/UGen/Record/LatoocarfianC.hs
--- a/Sound/SC3/UGen/Record/LatoocarfianC.hs
+++ b/Sound/SC3/UGen/Record/LatoocarfianC.hs
@@ -1,3 +1,4 @@
+-- | Latoocarfian chaotic generator
 module Sound.SC3.UGen.Record.LatoocarfianC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LatoocarfianL.hs b/Sound/SC3/UGen/Record/LatoocarfianL.hs
--- a/Sound/SC3/UGen/Record/LatoocarfianL.hs
+++ b/Sound/SC3/UGen/Record/LatoocarfianL.hs
@@ -1,3 +1,4 @@
+-- | Latoocarfian chaotic generator
 module Sound.SC3.UGen.Record.LatoocarfianL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LatoocarfianN.hs b/Sound/SC3/UGen/Record/LatoocarfianN.hs
--- a/Sound/SC3/UGen/Record/LatoocarfianN.hs
+++ b/Sound/SC3/UGen/Record/LatoocarfianN.hs
@@ -1,3 +1,4 @@
+-- | Latoocarfian chaotic generator
 module Sound.SC3.UGen.Record.LatoocarfianN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LatoocarfianTrig.hs b/Sound/SC3/UGen/Record/LatoocarfianTrig.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LatoocarfianTrig.hs
@@ -0,0 +1,31 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.LatoocarfianTrig where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LatoocarfianTrig = LatoocarfianTrig {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  c :: S.UGen,
+  d :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+latoocarfianTrig :: LatoocarfianTrig
+latoocarfianTrig = LatoocarfianTrig {
+  rate = S.AR,
+  minfreq = 5.0,
+  maxfreq = 10.0,
+  a = 1.0,
+  b = 3.0,
+  c = 0.5,
+  d = 0.5,
+  x0 = 0.34082301375036,
+  y0 = -0.38270086971332
+  }
+mkLatoocarfianTrig :: LatoocarfianTrig -> S.UGen
+mkLatoocarfianTrig (LatoocarfianTrig r a' b' c' d' e' f' g' h') = S.mkOsc r "LatoocarfianTrig" [a',b',c',d',e',f',g',h'] 1
+instance Make LatoocarfianTrig where
+  ugen = mkLatoocarfianTrig
diff --git a/Sound/SC3/UGen/Record/LeakDC.hs b/Sound/SC3/UGen/Record/LeakDC.hs
--- a/Sound/SC3/UGen/Record/LeakDC.hs
+++ b/Sound/SC3/UGen/Record/LeakDC.hs
@@ -1,3 +1,4 @@
+-- | Remove DC
 module Sound.SC3.UGen.Record.LeakDC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LeastChange.hs b/Sound/SC3/UGen/Record/LeastChange.hs
--- a/Sound/SC3/UGen/Record/LeastChange.hs
+++ b/Sound/SC3/UGen/Record/LeastChange.hs
@@ -1,3 +1,4 @@
+-- | Output least changed
 module Sound.SC3.UGen.Record.LeastChange where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Limiter.hs b/Sound/SC3/UGen/Record/Limiter.hs
--- a/Sound/SC3/UGen/Record/Limiter.hs
+++ b/Sound/SC3/UGen/Record/Limiter.hs
@@ -1,3 +1,4 @@
+-- | Peak limiter
 module Sound.SC3.UGen.Record.Limiter where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LinCongC.hs b/Sound/SC3/UGen/Record/LinCongC.hs
--- a/Sound/SC3/UGen/Record/LinCongC.hs
+++ b/Sound/SC3/UGen/Record/LinCongC.hs
@@ -1,3 +1,4 @@
+-- | Linear congruential chaotic generator
 module Sound.SC3.UGen.Record.LinCongC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LinCongL.hs b/Sound/SC3/UGen/Record/LinCongL.hs
--- a/Sound/SC3/UGen/Record/LinCongL.hs
+++ b/Sound/SC3/UGen/Record/LinCongL.hs
@@ -1,3 +1,4 @@
+-- | Linear congruential chaotic generator
 module Sound.SC3.UGen.Record.LinCongL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LinCongN.hs b/Sound/SC3/UGen/Record/LinCongN.hs
--- a/Sound/SC3/UGen/Record/LinCongN.hs
+++ b/Sound/SC3/UGen/Record/LinCongN.hs
@@ -1,3 +1,4 @@
+-- | Linear congruential chaotic generator
 module Sound.SC3.UGen.Record.LinCongN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LinExp.hs b/Sound/SC3/UGen/Record/LinExp.hs
--- a/Sound/SC3/UGen/Record/LinExp.hs
+++ b/Sound/SC3/UGen/Record/LinExp.hs
@@ -1,3 +1,4 @@
+-- | Map a linear range to an exponential range
 module Sound.SC3.UGen.Record.LinExp where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LinPan2.hs b/Sound/SC3/UGen/Record/LinPan2.hs
--- a/Sound/SC3/UGen/Record/LinPan2.hs
+++ b/Sound/SC3/UGen/Record/LinPan2.hs
@@ -1,3 +1,4 @@
+-- | Two channel linear pan.
 module Sound.SC3.UGen.Record.LinPan2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LinRand.hs b/Sound/SC3/UGen/Record/LinRand.hs
--- a/Sound/SC3/UGen/Record/LinRand.hs
+++ b/Sound/SC3/UGen/Record/LinRand.hs
@@ -1,3 +1,4 @@
+-- | Skewed random number generator.
 module Sound.SC3.UGen.Record.LinRand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LinXFade2.hs b/Sound/SC3/UGen/Record/LinXFade2.hs
--- a/Sound/SC3/UGen/Record/LinXFade2.hs
+++ b/Sound/SC3/UGen/Record/LinXFade2.hs
@@ -1,3 +1,4 @@
+-- | Two channel linear crossfade.
 module Sound.SC3.UGen.Record.LinXFade2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Line.hs b/Sound/SC3/UGen/Record/Line.hs
--- a/Sound/SC3/UGen/Record/Line.hs
+++ b/Sound/SC3/UGen/Record/Line.hs
@@ -1,3 +1,4 @@
+-- | Line generator.
 module Sound.SC3.UGen.Record.Line where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Linen.hs b/Sound/SC3/UGen/Record/Linen.hs
--- a/Sound/SC3/UGen/Record/Linen.hs
+++ b/Sound/SC3/UGen/Record/Linen.hs
@@ -1,3 +1,4 @@
+-- | Simple linear envelope generator.
 module Sound.SC3.UGen.Record.Linen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ListDUGen.hs b/Sound/SC3/UGen/Record/ListDUGen.hs
--- a/Sound/SC3/UGen/Record/ListDUGen.hs
+++ b/Sound/SC3/UGen/Record/ListDUGen.hs
@@ -1,3 +1,4 @@
+-- | (not documented)
 module Sound.SC3.UGen.Record.ListDUGen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ListTrig.hs b/Sound/SC3/UGen/Record/ListTrig.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/ListTrig.hs
@@ -0,0 +1,21 @@
+-- | Emit a sequence of triggers at specified time offsets
+module Sound.SC3.UGen.Record.ListTrig where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data ListTrig = ListTrig {
+  bufnum :: S.UGen,
+  reset :: S.UGen,
+  offset :: S.UGen,
+  numframes :: S.UGen
+  } deriving (Show)
+listTrig :: ListTrig
+listTrig = ListTrig {
+  bufnum = 0.0,
+  reset = 0.0,
+  offset = 0.0,
+  numframes = 0.0
+  }
+mkListTrig :: ListTrig -> S.UGen
+mkListTrig (ListTrig  a' b' c' d') = S.mkOsc S.KR "ListTrig" [a',b',c',d'] 1
+instance Make ListTrig where
+  ugen = mkListTrig
diff --git a/Sound/SC3/UGen/Record/ListTrig2.hs b/Sound/SC3/UGen/Record/ListTrig2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/ListTrig2.hs
@@ -0,0 +1,19 @@
+-- | Emit a sequence of triggers at specified time offsets
+module Sound.SC3.UGen.Record.ListTrig2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data ListTrig2 = ListTrig2 {
+  bufnum :: S.UGen,
+  reset :: S.UGen,
+  numframes :: S.UGen
+  } deriving (Show)
+listTrig2 :: ListTrig2
+listTrig2 = ListTrig2 {
+  bufnum = 0.0,
+  reset = 0.0,
+  numframes = 0.0
+  }
+mkListTrig2 :: ListTrig2 -> S.UGen
+mkListTrig2 (ListTrig2  a' b' c') = S.mkOsc S.KR "ListTrig2" [a',b',c'] 1
+instance Make ListTrig2 where
+  ugen = mkListTrig2
diff --git a/Sound/SC3/UGen/Record/LocalOut.hs b/Sound/SC3/UGen/Record/LocalOut.hs
--- a/Sound/SC3/UGen/Record/LocalOut.hs
+++ b/Sound/SC3/UGen/Record/LocalOut.hs
@@ -1,3 +1,4 @@
+-- | Write to buses local to a synth.
 module Sound.SC3.UGen.Record.LocalOut where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Logger.hs b/Sound/SC3/UGen/Record/Logger.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Logger.hs
@@ -0,0 +1,21 @@
+-- | Store values to a buffer, whenever triggered
+module Sound.SC3.UGen.Record.Logger where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Logger = Logger {
+  inputArray :: S.UGen,
+  trig :: S.UGen,
+  bufnum :: S.UGen,
+  reset :: S.UGen
+  } deriving (Show)
+logger :: Logger
+logger = Logger {
+  inputArray = 0.0,
+  trig = 0.0,
+  bufnum = 0.0,
+  reset = 0.0
+  }
+mkLogger :: Logger -> S.UGen
+mkLogger (Logger  a' b' c' d') = S.mkOsc S.KR "Logger" [a',b',c',d'] 1
+instance Make Logger where
+  ugen = mkLogger
diff --git a/Sound/SC3/UGen/Record/Logistic.hs b/Sound/SC3/UGen/Record/Logistic.hs
--- a/Sound/SC3/UGen/Record/Logistic.hs
+++ b/Sound/SC3/UGen/Record/Logistic.hs
@@ -1,3 +1,4 @@
+-- | Chaotic noise function
 module Sound.SC3.UGen.Record.Logistic where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LoopBuf.hs b/Sound/SC3/UGen/Record/LoopBuf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LoopBuf.hs
@@ -0,0 +1,27 @@
+-- | sample looping oscillator
+module Sound.SC3.UGen.Record.LoopBuf where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LoopBuf = LoopBuf {
+  bufnum :: S.UGen,
+  rate_ :: S.UGen,
+  gate :: S.UGen,
+  startPos :: S.UGen,
+  startLoop :: S.UGen,
+  endLoop :: S.UGen,
+  interpolation :: S.UGen
+  } deriving (Show)
+loopBuf :: LoopBuf
+loopBuf = LoopBuf {
+  bufnum = 0.0,
+  rate_ = 1.0,
+  gate = 1.0,
+  startPos = 0.0,
+  startLoop = 0.0,
+  endLoop = 0.0,
+  interpolation = 2.0
+  }
+mkLoopBuf :: LoopBuf -> S.UGen
+mkLoopBuf (LoopBuf  a' b' c' d' e' f' g') = S.mkOsc S.AR "LoopBuf" [a',b',c',d',e',f',g'] undefined
+instance Make LoopBuf where
+  ugen = mkLoopBuf
diff --git a/Sound/SC3/UGen/Record/Lorenz2DC.hs b/Sound/SC3/UGen/Record/Lorenz2DC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Lorenz2DC.hs
@@ -0,0 +1,33 @@
+-- | lorenz 2D chaotic generator
+module Sound.SC3.UGen.Record.Lorenz2DC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Lorenz2DC = Lorenz2DC {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  s :: S.UGen,
+  r :: S.UGen,
+  b :: S.UGen,
+  h :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen,
+  z0 :: S.UGen
+  } deriving (Show)
+lorenz2DC :: Lorenz2DC
+lorenz2DC = Lorenz2DC {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  s = 10.0,
+  r = 28.0,
+  b = 2.6666667,
+  h = 0.02,
+  x0 = 0.090879182417163,
+  y0 = 2.97077458055,
+  z0 = 24.282041054363
+  }
+mkLorenz2DC :: Lorenz2DC -> S.UGen
+mkLorenz2DC (Lorenz2DC r a' b' c' d' e' f' g' h' i') = S.mkOsc r "Lorenz2DC" [a',b',c',d',e',f',g',h',i'] 1
+instance Make Lorenz2DC where
+  ugen = mkLorenz2DC
diff --git a/Sound/SC3/UGen/Record/Lorenz2DL.hs b/Sound/SC3/UGen/Record/Lorenz2DL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Lorenz2DL.hs
@@ -0,0 +1,33 @@
+-- | lorenz 2D chaotic generator
+module Sound.SC3.UGen.Record.Lorenz2DL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Lorenz2DL = Lorenz2DL {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  s :: S.UGen,
+  r :: S.UGen,
+  b :: S.UGen,
+  h :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen,
+  z0 :: S.UGen
+  } deriving (Show)
+lorenz2DL :: Lorenz2DL
+lorenz2DL = Lorenz2DL {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  s = 10.0,
+  r = 28.0,
+  b = 2.6666667,
+  h = 0.02,
+  x0 = 0.090879182417163,
+  y0 = 2.97077458055,
+  z0 = 24.282041054363
+  }
+mkLorenz2DL :: Lorenz2DL -> S.UGen
+mkLorenz2DL (Lorenz2DL r a' b' c' d' e' f' g' h' i') = S.mkOsc r "Lorenz2DL" [a',b',c',d',e',f',g',h',i'] 1
+instance Make Lorenz2DL where
+  ugen = mkLorenz2DL
diff --git a/Sound/SC3/UGen/Record/Lorenz2DN.hs b/Sound/SC3/UGen/Record/Lorenz2DN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Lorenz2DN.hs
@@ -0,0 +1,33 @@
+-- | lorenz 2D chaotic generator
+module Sound.SC3.UGen.Record.Lorenz2DN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Lorenz2DN = Lorenz2DN {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  s :: S.UGen,
+  r :: S.UGen,
+  b :: S.UGen,
+  h :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen,
+  z0 :: S.UGen
+  } deriving (Show)
+lorenz2DN :: Lorenz2DN
+lorenz2DN = Lorenz2DN {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  s = 10.0,
+  r = 28.0,
+  b = 2.6666667,
+  h = 0.02,
+  x0 = 0.090879182417163,
+  y0 = 2.97077458055,
+  z0 = 24.282041054363
+  }
+mkLorenz2DN :: Lorenz2DN -> S.UGen
+mkLorenz2DN (Lorenz2DN r a' b' c' d' e' f' g' h' i') = S.mkOsc r "Lorenz2DN" [a',b',c',d',e',f',g',h',i'] 1
+instance Make Lorenz2DN where
+  ugen = mkLorenz2DN
diff --git a/Sound/SC3/UGen/Record/LorenzL.hs b/Sound/SC3/UGen/Record/LorenzL.hs
--- a/Sound/SC3/UGen/Record/LorenzL.hs
+++ b/Sound/SC3/UGen/Record/LorenzL.hs
@@ -1,3 +1,4 @@
+-- | Lorenz chaotic generator
 module Sound.SC3.UGen.Record.LorenzL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/LorenzTrig.hs b/Sound/SC3/UGen/Record/LorenzTrig.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/LorenzTrig.hs
@@ -0,0 +1,33 @@
+-- | lorenz chaotic trigger generator
+module Sound.SC3.UGen.Record.LorenzTrig where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data LorenzTrig = LorenzTrig {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  s :: S.UGen,
+  r :: S.UGen,
+  b :: S.UGen,
+  h :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen,
+  z0 :: S.UGen
+  } deriving (Show)
+lorenzTrig :: LorenzTrig
+lorenzTrig = LorenzTrig {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  s = 10.0,
+  r = 28.0,
+  b = 2.6666667,
+  h = 0.02,
+  x0 = 0.090879182417163,
+  y0 = 2.97077458055,
+  z0 = 24.282041054363
+  }
+mkLorenzTrig :: LorenzTrig -> S.UGen
+mkLorenzTrig (LorenzTrig r a' b' c' d' e' f' g' h' i') = S.mkOsc r "LorenzTrig" [a',b',c',d',e',f',g',h',i'] 1
+instance Make LorenzTrig where
+  ugen = mkLorenzTrig
diff --git a/Sound/SC3/UGen/Record/Loudness.hs b/Sound/SC3/UGen/Record/Loudness.hs
--- a/Sound/SC3/UGen/Record/Loudness.hs
+++ b/Sound/SC3/UGen/Record/Loudness.hs
@@ -1,3 +1,4 @@
+-- | Extraction of instantaneous loudness in sones
 module Sound.SC3.UGen.Record.Loudness where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MCLDChaosGen.hs b/Sound/SC3/UGen/Record/MCLDChaosGen.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MCLDChaosGen.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.MCLDChaosGen where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MCLDChaosGen = MCLDChaosGen {
+  maxSize :: S.UGen
+  } deriving (Show)
+mCLDChaosGen :: MCLDChaosGen
+mCLDChaosGen = MCLDChaosGen {
+  maxSize = 0.0
+  }
+mkMCLDChaosGen :: MCLDChaosGen -> S.UGen
+mkMCLDChaosGen (MCLDChaosGen  a') = S.mkOsc S.AR "MCLDChaosGen" [a'] 1
+instance Make MCLDChaosGen where
+  ugen = mkMCLDChaosGen
diff --git a/Sound/SC3/UGen/Record/MFCC.hs b/Sound/SC3/UGen/Record/MFCC.hs
--- a/Sound/SC3/UGen/Record/MFCC.hs
+++ b/Sound/SC3/UGen/Record/MFCC.hs
@@ -1,3 +1,4 @@
+-- | Mel frequency cepstral coefficients
 module Sound.SC3.UGen.Record.MFCC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MantissaMask.hs b/Sound/SC3/UGen/Record/MantissaMask.hs
--- a/Sound/SC3/UGen/Record/MantissaMask.hs
+++ b/Sound/SC3/UGen/Record/MantissaMask.hs
@@ -1,3 +1,4 @@
+-- | Reduce precision.
 module Sound.SC3.UGen.Record.MantissaMask where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MarkovSynth.hs b/Sound/SC3/UGen/Record/MarkovSynth.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MarkovSynth.hs
@@ -0,0 +1,21 @@
+-- | First order Markov Chain implementation for audio signals
+module Sound.SC3.UGen.Record.MarkovSynth where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MarkovSynth = MarkovSynth {
+  input :: S.UGen,
+  isRecording :: S.UGen,
+  waitTime :: S.UGen,
+  tableSize :: S.UGen
+  } deriving (Show)
+markovSynth :: MarkovSynth
+markovSynth = MarkovSynth {
+  input = 0.0,
+  isRecording = 1.0,
+  waitTime = 2.0,
+  tableSize = 10.0
+  }
+mkMarkovSynth :: MarkovSynth -> S.UGen
+mkMarkovSynth (MarkovSynth  a' b' c' d') = S.mkOsc S.AR "MarkovSynth" [a',b',c',d'] 1
+instance Make MarkovSynth where
+  ugen = mkMarkovSynth
diff --git a/Sound/SC3/UGen/Record/Max.hs b/Sound/SC3/UGen/Record/Max.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Max.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Max where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Max = Max {
+  input :: S.UGen,
+  numsamp :: S.UGen
+  } deriving (Show)
+max :: Max
+max = Max {
+  input = 0.0,
+  numsamp = 64.0
+  }
+mkMax :: Max -> S.UGen
+mkMax (Max  a' b') = S.mkOsc S.KR "Max" [a',b'] 1
+instance Make Max where
+  ugen = mkMax
diff --git a/Sound/SC3/UGen/Record/Maxamp.hs b/Sound/SC3/UGen/Record/Maxamp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Maxamp.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Maxamp where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Maxamp = Maxamp {
+  input :: S.UGen,
+  numSamps :: S.UGen
+  } deriving (Show)
+maxamp :: Maxamp
+maxamp = Maxamp {
+  input = 0.0,
+  numSamps = 1000.0
+  }
+mkMaxamp :: Maxamp -> S.UGen
+mkMaxamp (Maxamp  a' b') = S.mkOsc S.AR "Maxamp" [a',b'] 1
+instance Make Maxamp where
+  ugen = mkMaxamp
diff --git a/Sound/SC3/UGen/Record/MdaPiano.hs b/Sound/SC3/UGen/Record/MdaPiano.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MdaPiano.hs
@@ -0,0 +1,43 @@
+-- | Piano synthesiser
+module Sound.SC3.UGen.Record.MdaPiano where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MdaPiano = MdaPiano {
+  freq :: S.UGen,
+  gate :: S.UGen,
+  vel :: S.UGen,
+  decay :: S.UGen,
+  release :: S.UGen,
+  hard :: S.UGen,
+  velhard :: S.UGen,
+  muffle :: S.UGen,
+  velmuff :: S.UGen,
+  velcurve :: S.UGen,
+  stereo :: S.UGen,
+  tune :: S.UGen,
+  random :: S.UGen,
+  stretch :: S.UGen,
+  sustain :: S.UGen
+  } deriving (Show)
+mdaPiano :: MdaPiano
+mdaPiano = MdaPiano {
+  freq = 440.0,
+  gate = 1.0,
+  vel = 100.0,
+  decay = 0.8,
+  release = 0.8,
+  hard = 0.8,
+  velhard = 0.8,
+  muffle = 0.8,
+  velmuff = 0.8,
+  velcurve = 0.8,
+  stereo = 0.2,
+  tune = 0.5,
+  random = 0.1,
+  stretch = 0.1,
+  sustain = 0.0
+  }
+mkMdaPiano :: MdaPiano -> S.UGen
+mkMdaPiano (MdaPiano  a' b' c' d' e' f' g' h' i' j' k' l' m' n' o') = S.mkOsc S.AR "MdaPiano" [a',b',c',d',e',f',g',h',i',j',k',l',m',n',o'] 2
+instance Make MdaPiano where
+  ugen = mkMdaPiano
diff --git a/Sound/SC3/UGen/Record/MeanTriggered.hs b/Sound/SC3/UGen/Record/MeanTriggered.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MeanTriggered.hs
@@ -0,0 +1,21 @@
+-- | Mean of recent values, triggered
+module Sound.SC3.UGen.Record.MeanTriggered where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MeanTriggered = MeanTriggered {
+  rate :: S.Rate,
+  input :: S.UGen,
+  trig :: S.UGen,
+  length_ :: S.UGen
+  } deriving (Show)
+meanTriggered :: MeanTriggered
+meanTriggered = MeanTriggered {
+  rate = S.AR,
+  input = 0.0,
+  trig = 0.0,
+  length_ = 10.0
+  }
+mkMeanTriggered :: MeanTriggered -> S.UGen
+mkMeanTriggered (MeanTriggered r a' b' c') = S.mkOsc r "MeanTriggered" [a',b',c'] 1
+instance Make MeanTriggered where
+  ugen = mkMeanTriggered
diff --git a/Sound/SC3/UGen/Record/Median.hs b/Sound/SC3/UGen/Record/Median.hs
--- a/Sound/SC3/UGen/Record/Median.hs
+++ b/Sound/SC3/UGen/Record/Median.hs
@@ -1,3 +1,4 @@
+-- | Median filter.
 module Sound.SC3.UGen.Record.Median where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MedianTriggered.hs b/Sound/SC3/UGen/Record/MedianTriggered.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MedianTriggered.hs
@@ -0,0 +1,21 @@
+-- | Median of recent values, triggered
+module Sound.SC3.UGen.Record.MedianTriggered where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MedianTriggered = MedianTriggered {
+  rate :: S.Rate,
+  input :: S.UGen,
+  trig :: S.UGen,
+  length_ :: S.UGen
+  } deriving (Show)
+medianTriggered :: MedianTriggered
+medianTriggered = MedianTriggered {
+  rate = S.AR,
+  input = 0.0,
+  trig = 0.0,
+  length_ = 10.0
+  }
+mkMedianTriggered :: MedianTriggered -> S.UGen
+mkMedianTriggered (MedianTriggered r a' b' c') = S.mkOsc r "MedianTriggered" [a',b',c'] 1
+instance Make MedianTriggered where
+  ugen = mkMedianTriggered
diff --git a/Sound/SC3/UGen/Record/MembraneCircle.hs b/Sound/SC3/UGen/Record/MembraneCircle.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MembraneCircle.hs
@@ -0,0 +1,19 @@
+-- | Waveguide mesh physical models of drum membranes
+module Sound.SC3.UGen.Record.MembraneCircle where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MembraneCircle = MembraneCircle {
+  excitation :: S.UGen,
+  tension :: S.UGen,
+  loss :: S.UGen
+  } deriving (Show)
+membraneCircle :: MembraneCircle
+membraneCircle = MembraneCircle {
+  excitation = 0.0,
+  tension = 0.05,
+  loss = 0.99999
+  }
+mkMembraneCircle :: MembraneCircle -> S.UGen
+mkMembraneCircle (MembraneCircle  a' b' c') = S.mkOsc S.AR "MembraneCircle" [a',b',c'] 1
+instance Make MembraneCircle where
+  ugen = mkMembraneCircle
diff --git a/Sound/SC3/UGen/Record/MembraneHexagon.hs b/Sound/SC3/UGen/Record/MembraneHexagon.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MembraneHexagon.hs
@@ -0,0 +1,19 @@
+-- | Waveguide mesh physical models of drum membranes
+module Sound.SC3.UGen.Record.MembraneHexagon where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MembraneHexagon = MembraneHexagon {
+  excitation :: S.UGen,
+  tension :: S.UGen,
+  loss :: S.UGen
+  } deriving (Show)
+membraneHexagon :: MembraneHexagon
+membraneHexagon = MembraneHexagon {
+  excitation = 0.0,
+  tension = 0.05,
+  loss = 0.99999
+  }
+mkMembraneHexagon :: MembraneHexagon -> S.UGen
+mkMembraneHexagon (MembraneHexagon  a' b' c') = S.mkOsc S.AR "MembraneHexagon" [a',b',c'] 1
+instance Make MembraneHexagon where
+  ugen = mkMembraneHexagon
diff --git a/Sound/SC3/UGen/Record/Metro.hs b/Sound/SC3/UGen/Record/Metro.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Metro.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Metro where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Metro = Metro {
+  rate :: S.Rate,
+  bpm :: S.UGen,
+  numBeats :: S.UGen
+  } deriving (Show)
+metro :: Metro
+metro = Metro {
+  rate = S.AR,
+  bpm = 0.0,
+  numBeats = 0.0
+  }
+mkMetro :: Metro -> S.UGen
+mkMetro (Metro r a' b') = S.mkOsc r "Metro" [a',b'] 1
+instance Make Metro where
+  ugen = mkMetro
diff --git a/Sound/SC3/UGen/Record/MidEQ.hs b/Sound/SC3/UGen/Record/MidEQ.hs
--- a/Sound/SC3/UGen/Record/MidEQ.hs
+++ b/Sound/SC3/UGen/Record/MidEQ.hs
@@ -1,3 +1,4 @@
+-- | Parametric filter.
 module Sound.SC3.UGen.Record.MidEQ where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MonoGrain.hs b/Sound/SC3/UGen/Record/MonoGrain.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MonoGrain.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.MonoGrain where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MonoGrain = MonoGrain {
+  input :: S.UGen,
+  winsize :: S.UGen,
+  grainrate :: S.UGen,
+  winrandpct :: S.UGen
+  } deriving (Show)
+monoGrain :: MonoGrain
+monoGrain = MonoGrain {
+  input = 0.0,
+  winsize = 0.1,
+  grainrate = 10.0,
+  winrandpct = 0.0
+  }
+mkMonoGrain :: MonoGrain -> S.UGen
+mkMonoGrain (MonoGrain  a' b' c' d') = S.mkOsc S.AR "MonoGrain" [a',b',c',d'] 1
+instance Make MonoGrain where
+  ugen = mkMonoGrain
diff --git a/Sound/SC3/UGen/Record/MonoGrainBF.hs b/Sound/SC3/UGen/Record/MonoGrainBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MonoGrainBF.hs
@@ -0,0 +1,31 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.MonoGrainBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MonoGrainBF = MonoGrainBF {
+  input :: S.UGen,
+  winsize :: S.UGen,
+  grainrate :: S.UGen,
+  winrandpct :: S.UGen,
+  azimuth :: S.UGen,
+  azrand :: S.UGen,
+  elevation :: S.UGen,
+  elrand :: S.UGen,
+  rho :: S.UGen
+  } deriving (Show)
+monoGrainBF :: MonoGrainBF
+monoGrainBF = MonoGrainBF {
+  input = 0.0,
+  winsize = 0.1,
+  grainrate = 10.0,
+  winrandpct = 0.0,
+  azimuth = 0.0,
+  azrand = 0.0,
+  elevation = 0.0,
+  elrand = 0.0,
+  rho = 1.0
+  }
+mkMonoGrainBF :: MonoGrainBF -> S.UGen
+mkMonoGrainBF (MonoGrainBF  a' b' c' d' e' f' g' h' i') = S.mkOsc S.AR "MonoGrainBF" [a',b',c',d',e',f',g',h',i'] 4
+instance Make MonoGrainBF where
+  ugen = mkMonoGrainBF
diff --git a/Sound/SC3/UGen/Record/MoogFF.hs b/Sound/SC3/UGen/Record/MoogFF.hs
--- a/Sound/SC3/UGen/Record/MoogFF.hs
+++ b/Sound/SC3/UGen/Record/MoogFF.hs
@@ -1,3 +1,4 @@
+-- | Moog VCF implementation, designed by Federico Fontana
 module Sound.SC3.UGen.Record.MoogFF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MoogLadder.hs b/Sound/SC3/UGen/Record/MoogLadder.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MoogLadder.hs
@@ -0,0 +1,21 @@
+-- | Moog Filter Emulation
+module Sound.SC3.UGen.Record.MoogLadder where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MoogLadder = MoogLadder {
+  rate :: S.Rate,
+  input :: S.UGen,
+  ffreq :: S.UGen,
+  res :: S.UGen
+  } deriving (Show)
+moogLadder :: MoogLadder
+moogLadder = MoogLadder {
+  rate = S.AR,
+  input = 0.0,
+  ffreq = 440.0,
+  res = 0.0
+  }
+mkMoogLadder :: MoogLadder -> S.UGen
+mkMoogLadder (MoogLadder r a' b' c') = S.mkOsc r "MoogLadder" [a',b',c'] 1
+instance Make MoogLadder where
+  ugen = mkMoogLadder
diff --git a/Sound/SC3/UGen/Record/MoogVCF.hs b/Sound/SC3/UGen/Record/MoogVCF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/MoogVCF.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.MoogVCF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data MoogVCF = MoogVCF {
+  input :: S.UGen,
+  fco :: S.UGen,
+  res :: S.UGen
+  } deriving (Show)
+moogVCF :: MoogVCF
+moogVCF = MoogVCF {
+  input = 0.0,
+  fco = 0.0,
+  res = 0.0
+  }
+mkMoogVCF :: MoogVCF -> S.UGen
+mkMoogVCF (MoogVCF  a' b' c') = S.mkOsc S.AR "MoogVCF" [a',b',c'] 1
+instance Make MoogVCF where
+  ugen = mkMoogVCF
diff --git a/Sound/SC3/UGen/Record/MostChange.hs b/Sound/SC3/UGen/Record/MostChange.hs
--- a/Sound/SC3/UGen/Record/MostChange.hs
+++ b/Sound/SC3/UGen/Record/MostChange.hs
@@ -1,3 +1,4 @@
+-- | Output most changed.
 module Sound.SC3.UGen.Record.MostChange where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MouseButton.hs b/Sound/SC3/UGen/Record/MouseButton.hs
--- a/Sound/SC3/UGen/Record/MouseButton.hs
+++ b/Sound/SC3/UGen/Record/MouseButton.hs
@@ -1,3 +1,4 @@
+-- | Mouse button UGen.
 module Sound.SC3.UGen.Record.MouseButton where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MouseX.hs b/Sound/SC3/UGen/Record/MouseX.hs
--- a/Sound/SC3/UGen/Record/MouseX.hs
+++ b/Sound/SC3/UGen/Record/MouseX.hs
@@ -1,3 +1,4 @@
+-- | Cursor tracking UGen.
 module Sound.SC3.UGen.Record.MouseX where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MouseY.hs b/Sound/SC3/UGen/Record/MouseY.hs
--- a/Sound/SC3/UGen/Record/MouseY.hs
+++ b/Sound/SC3/UGen/Record/MouseY.hs
@@ -1,3 +1,4 @@
+-- | Cursor tracking UGen.
 module Sound.SC3.UGen.Record.MouseY where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/MultiOutUGen.hs b/Sound/SC3/UGen/Record/MultiOutUGen.hs
--- a/Sound/SC3/UGen/Record/MultiOutUGen.hs
+++ b/Sound/SC3/UGen/Record/MultiOutUGen.hs
@@ -1,3 +1,4 @@
+-- | Superclass for all UGens with multiple outputs
 module Sound.SC3.UGen.Record.MultiOutUGen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/NL.hs b/Sound/SC3/UGen/Record/NL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NL.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.NL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NL = NL {
+  input :: S.UGen,
+  bufnuma :: S.UGen,
+  bufnumb :: S.UGen,
+  guard1 :: S.UGen,
+  guard2 :: S.UGen
+  } deriving (Show)
+nL :: NL
+nL = NL {
+  input = 0.0,
+  bufnuma = 0.0,
+  bufnumb = 1.0,
+  guard1 = 1000.0,
+  guard2 = 100.0
+  }
+mkNL :: NL -> S.UGen
+mkNL (NL  a' b' c' d' e') = S.mkOsc S.AR "NL" [a',b',c',d',e'] 1
+instance Make NL where
+  ugen = mkNL
diff --git a/Sound/SC3/UGen/Record/NL2.hs b/Sound/SC3/UGen/Record/NL2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NL2.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.NL2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NL2 = NL2 {
+  input :: S.UGen,
+  bufnum :: S.UGen,
+  maxsizea :: S.UGen,
+  maxsizeb :: S.UGen,
+  guard1 :: S.UGen,
+  guard2 :: S.UGen
+  } deriving (Show)
+nL2 :: NL2
+nL2 = NL2 {
+  input = 0.0,
+  bufnum = 0.0,
+  maxsizea = 10.0,
+  maxsizeb = 10.0,
+  guard1 = 1000.0,
+  guard2 = 100.0
+  }
+mkNL2 :: NL2 -> S.UGen
+mkNL2 (NL2  a' b' c' d' e' f') = S.mkOsc S.AR "NL2" [a',b',c',d',e',f'] 1
+instance Make NL2 where
+  ugen = mkNL2
diff --git a/Sound/SC3/UGen/Record/NLFiltC.hs b/Sound/SC3/UGen/Record/NLFiltC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NLFiltC.hs
@@ -0,0 +1,27 @@
+-- | Non-linear Filter
+module Sound.SC3.UGen.Record.NLFiltC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NLFiltC = NLFiltC {
+  rate :: S.Rate,
+  input :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  d :: S.UGen,
+  c :: S.UGen,
+  l :: S.UGen
+  } deriving (Show)
+nLFiltC :: NLFiltC
+nLFiltC = NLFiltC {
+  rate = S.AR,
+  input = 0.0,
+  a = 0.0,
+  b = 0.0,
+  d = 0.0,
+  c = 0.0,
+  l = 0.0
+  }
+mkNLFiltC :: NLFiltC -> S.UGen
+mkNLFiltC (NLFiltC r a' b' c' d' e' f') = S.mkOsc r "NLFiltC" [a',b',c',d',e',f'] 1
+instance Make NLFiltC where
+  ugen = mkNLFiltC
diff --git a/Sound/SC3/UGen/Record/NLFiltL.hs b/Sound/SC3/UGen/Record/NLFiltL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NLFiltL.hs
@@ -0,0 +1,27 @@
+-- | Non-linear Filter
+module Sound.SC3.UGen.Record.NLFiltL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NLFiltL = NLFiltL {
+  rate :: S.Rate,
+  input :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  d :: S.UGen,
+  c :: S.UGen,
+  l :: S.UGen
+  } deriving (Show)
+nLFiltL :: NLFiltL
+nLFiltL = NLFiltL {
+  rate = S.AR,
+  input = 0.0,
+  a = 0.0,
+  b = 0.0,
+  d = 0.0,
+  c = 0.0,
+  l = 0.0
+  }
+mkNLFiltL :: NLFiltL -> S.UGen
+mkNLFiltL (NLFiltL r a' b' c' d' e' f') = S.mkOsc r "NLFiltL" [a',b',c',d',e',f'] 1
+instance Make NLFiltL where
+  ugen = mkNLFiltL
diff --git a/Sound/SC3/UGen/Record/NLFiltN.hs b/Sound/SC3/UGen/Record/NLFiltN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NLFiltN.hs
@@ -0,0 +1,27 @@
+-- | Non-linear Filter
+module Sound.SC3.UGen.Record.NLFiltN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NLFiltN = NLFiltN {
+  rate :: S.Rate,
+  input :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  d :: S.UGen,
+  c :: S.UGen,
+  l :: S.UGen
+  } deriving (Show)
+nLFiltN :: NLFiltN
+nLFiltN = NLFiltN {
+  rate = S.AR,
+  input = 0.0,
+  a = 0.0,
+  b = 0.0,
+  d = 0.0,
+  c = 0.0,
+  l = 0.0
+  }
+mkNLFiltN :: NLFiltN -> S.UGen
+mkNLFiltN (NLFiltN r a' b' c' d' e' f') = S.mkOsc r "NLFiltN" [a',b',c',d',e',f'] 1
+instance Make NLFiltN where
+  ugen = mkNLFiltN
diff --git a/Sound/SC3/UGen/Record/NRand.hs b/Sound/SC3/UGen/Record/NRand.hs
--- a/Sound/SC3/UGen/Record/NRand.hs
+++ b/Sound/SC3/UGen/Record/NRand.hs
@@ -1,3 +1,4 @@
+-- | Sum of uniform distributions.
 module Sound.SC3.UGen.Record.NRand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/NTube.hs b/Sound/SC3/UGen/Record/NTube.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NTube.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.NTube where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NTube = NTube {
+  input :: S.UGen,
+  lossarray :: S.UGen,
+  karray :: S.UGen,
+  delaylengtharray :: S.UGen
+  } deriving (Show)
+nTube :: NTube
+nTube = NTube {
+  input = 0.0,
+  lossarray = 1.0,
+  karray = 0.0,
+  delaylengtharray = 0.0
+  }
+mkNTube :: NTube -> S.UGen
+mkNTube (NTube  a' b' c' d') = S.mkOsc S.AR "NTube" [a',b',c',d'] 1
+instance Make NTube where
+  ugen = mkNTube
diff --git a/Sound/SC3/UGen/Record/NeedleRect.hs b/Sound/SC3/UGen/Record/NeedleRect.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NeedleRect.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.NeedleRect where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NeedleRect = NeedleRect {
+  rate_ :: S.UGen,
+  imgWidth :: S.UGen,
+  imgHeight :: S.UGen,
+  rectX :: S.UGen,
+  rectY :: S.UGen,
+  rectW :: S.UGen,
+  rectH :: S.UGen
+  } deriving (Show)
+needleRect :: NeedleRect
+needleRect = NeedleRect {
+  rate_ = 1.0,
+  imgWidth = 100.0,
+  imgHeight = 100.0,
+  rectX = 0.0,
+  rectY = 0.0,
+  rectW = 100.0,
+  rectH = 100.0
+  }
+mkNeedleRect :: NeedleRect -> S.UGen
+mkNeedleRect (NeedleRect  a' b' c' d' e' f' g') = S.mkOsc S.AR "NeedleRect" [a',b',c',d',e',f',g'] 1
+instance Make NeedleRect where
+  ugen = mkNeedleRect
diff --git a/Sound/SC3/UGen/Record/NestedAllpassC.hs b/Sound/SC3/UGen/Record/NestedAllpassC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NestedAllpassC.hs
@@ -0,0 +1,27 @@
+-- | Nested Allpass filters as proposed by Vercoe and Pluckett
+module Sound.SC3.UGen.Record.NestedAllpassC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NestedAllpassC = NestedAllpassC {
+  input :: S.UGen,
+  maxdelay1 :: S.UGen,
+  delay1 :: S.UGen,
+  gain1 :: S.UGen,
+  maxdelay2 :: S.UGen,
+  delay2 :: S.UGen,
+  gain2 :: S.UGen
+  } deriving (Show)
+nestedAllpassC :: NestedAllpassC
+nestedAllpassC = NestedAllpassC {
+  input = 0.0,
+  maxdelay1 = 0.036,
+  delay1 = 0.036,
+  gain1 = 0.08,
+  maxdelay2 = 0.03,
+  delay2 = 0.03,
+  gain2 = 0.3
+  }
+mkNestedAllpassC :: NestedAllpassC -> S.UGen
+mkNestedAllpassC (NestedAllpassC  a' b' c' d' e' f' g') = S.mkOsc S.AR "NestedAllpassC" [a',b',c',d',e',f',g'] 1
+instance Make NestedAllpassC where
+  ugen = mkNestedAllpassC
diff --git a/Sound/SC3/UGen/Record/NestedAllpassL.hs b/Sound/SC3/UGen/Record/NestedAllpassL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NestedAllpassL.hs
@@ -0,0 +1,27 @@
+-- | Nested Allpass filters as proposed by Vercoe and Pluckett
+module Sound.SC3.UGen.Record.NestedAllpassL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NestedAllpassL = NestedAllpassL {
+  input :: S.UGen,
+  maxdelay1 :: S.UGen,
+  delay1 :: S.UGen,
+  gain1 :: S.UGen,
+  maxdelay2 :: S.UGen,
+  delay2 :: S.UGen,
+  gain2 :: S.UGen
+  } deriving (Show)
+nestedAllpassL :: NestedAllpassL
+nestedAllpassL = NestedAllpassL {
+  input = 0.0,
+  maxdelay1 = 0.036,
+  delay1 = 0.036,
+  gain1 = 0.08,
+  maxdelay2 = 0.03,
+  delay2 = 0.03,
+  gain2 = 0.3
+  }
+mkNestedAllpassL :: NestedAllpassL -> S.UGen
+mkNestedAllpassL (NestedAllpassL  a' b' c' d' e' f' g') = S.mkOsc S.AR "NestedAllpassL" [a',b',c',d',e',f',g'] 1
+instance Make NestedAllpassL where
+  ugen = mkNestedAllpassL
diff --git a/Sound/SC3/UGen/Record/NestedAllpassN.hs b/Sound/SC3/UGen/Record/NestedAllpassN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/NestedAllpassN.hs
@@ -0,0 +1,27 @@
+-- | Nested Allpass filters as proposed by Vercoe and Pluckett
+module Sound.SC3.UGen.Record.NestedAllpassN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data NestedAllpassN = NestedAllpassN {
+  input :: S.UGen,
+  maxdelay1 :: S.UGen,
+  delay1 :: S.UGen,
+  gain1 :: S.UGen,
+  maxdelay2 :: S.UGen,
+  delay2 :: S.UGen,
+  gain2 :: S.UGen
+  } deriving (Show)
+nestedAllpassN :: NestedAllpassN
+nestedAllpassN = NestedAllpassN {
+  input = 0.0,
+  maxdelay1 = 0.036,
+  delay1 = 0.036,
+  gain1 = 0.08,
+  maxdelay2 = 0.03,
+  delay2 = 0.03,
+  gain2 = 0.3
+  }
+mkNestedAllpassN :: NestedAllpassN -> S.UGen
+mkNestedAllpassN (NestedAllpassN  a' b' c' d' e' f' g') = S.mkOsc S.AR "NestedAllpassN" [a',b',c',d',e',f',g'] 1
+instance Make NestedAllpassN where
+  ugen = mkNestedAllpassN
diff --git a/Sound/SC3/UGen/Record/Normalizer.hs b/Sound/SC3/UGen/Record/Normalizer.hs
--- a/Sound/SC3/UGen/Record/Normalizer.hs
+++ b/Sound/SC3/UGen/Record/Normalizer.hs
@@ -1,3 +1,4 @@
+-- | Flattens dynamics.
 module Sound.SC3.UGen.Record.Normalizer where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/OSFold4.hs b/Sound/SC3/UGen/Record/OSFold4.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/OSFold4.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.OSFold4 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data OSFold4 = OSFold4 {
+  input :: S.UGen,
+  lo :: S.UGen,
+  hi :: S.UGen
+  } deriving (Show)
+oSFold4 :: OSFold4
+oSFold4 = OSFold4 {
+  input = 0.0,
+  lo = 0.0,
+  hi = 0.0
+  }
+mkOSFold4 :: OSFold4 -> S.UGen
+mkOSFold4 (OSFold4  a' b' c') = S.mkOsc S.AR "OSFold4" [a',b',c'] 1
+instance Make OSFold4 where
+  ugen = mkOSFold4
diff --git a/Sound/SC3/UGen/Record/OSFold8.hs b/Sound/SC3/UGen/Record/OSFold8.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/OSFold8.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.OSFold8 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data OSFold8 = OSFold8 {
+  input :: S.UGen,
+  lo :: S.UGen,
+  hi :: S.UGen
+  } deriving (Show)
+oSFold8 :: OSFold8
+oSFold8 = OSFold8 {
+  input = 0.0,
+  lo = 0.0,
+  hi = 0.0
+  }
+mkOSFold8 :: OSFold8 -> S.UGen
+mkOSFold8 (OSFold8  a' b' c') = S.mkOsc S.AR "OSFold8" [a',b',c'] 1
+instance Make OSFold8 where
+  ugen = mkOSFold8
diff --git a/Sound/SC3/UGen/Record/OSTrunc4.hs b/Sound/SC3/UGen/Record/OSTrunc4.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/OSTrunc4.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.OSTrunc4 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data OSTrunc4 = OSTrunc4 {
+  input :: S.UGen,
+  quant :: S.UGen
+  } deriving (Show)
+oSTrunc4 :: OSTrunc4
+oSTrunc4 = OSTrunc4 {
+  input = 0.0,
+  quant = 0.5
+  }
+mkOSTrunc4 :: OSTrunc4 -> S.UGen
+mkOSTrunc4 (OSTrunc4  a' b') = S.mkOsc S.AR "OSTrunc4" [a',b'] 1
+instance Make OSTrunc4 where
+  ugen = mkOSTrunc4
diff --git a/Sound/SC3/UGen/Record/OSTrunc8.hs b/Sound/SC3/UGen/Record/OSTrunc8.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/OSTrunc8.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.OSTrunc8 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data OSTrunc8 = OSTrunc8 {
+  input :: S.UGen,
+  quant :: S.UGen
+  } deriving (Show)
+oSTrunc8 :: OSTrunc8
+oSTrunc8 = OSTrunc8 {
+  input = 0.0,
+  quant = 0.5
+  }
+mkOSTrunc8 :: OSTrunc8 -> S.UGen
+mkOSTrunc8 (OSTrunc8  a' b') = S.mkOsc S.AR "OSTrunc8" [a',b'] 1
+instance Make OSTrunc8 where
+  ugen = mkOSTrunc8
diff --git a/Sound/SC3/UGen/Record/OSWrap4.hs b/Sound/SC3/UGen/Record/OSWrap4.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/OSWrap4.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.OSWrap4 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data OSWrap4 = OSWrap4 {
+  input :: S.UGen,
+  lo :: S.UGen,
+  hi :: S.UGen
+  } deriving (Show)
+oSWrap4 :: OSWrap4
+oSWrap4 = OSWrap4 {
+  input = 0.0,
+  lo = 0.0,
+  hi = 0.0
+  }
+mkOSWrap4 :: OSWrap4 -> S.UGen
+mkOSWrap4 (OSWrap4  a' b' c') = S.mkOsc S.AR "OSWrap4" [a',b',c'] 1
+instance Make OSWrap4 where
+  ugen = mkOSWrap4
diff --git a/Sound/SC3/UGen/Record/OSWrap8.hs b/Sound/SC3/UGen/Record/OSWrap8.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/OSWrap8.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.OSWrap8 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data OSWrap8 = OSWrap8 {
+  input :: S.UGen,
+  lo :: S.UGen,
+  hi :: S.UGen
+  } deriving (Show)
+oSWrap8 :: OSWrap8
+oSWrap8 = OSWrap8 {
+  input = 0.0,
+  lo = 0.0,
+  hi = 0.0
+  }
+mkOSWrap8 :: OSWrap8 -> S.UGen
+mkOSWrap8 (OSWrap8  a' b' c') = S.mkOsc S.AR "OSWrap8" [a',b',c'] 1
+instance Make OSWrap8 where
+  ugen = mkOSWrap8
diff --git a/Sound/SC3/UGen/Record/OffsetOut.hs b/Sound/SC3/UGen/Record/OffsetOut.hs
--- a/Sound/SC3/UGen/Record/OffsetOut.hs
+++ b/Sound/SC3/UGen/Record/OffsetOut.hs
@@ -1,3 +1,4 @@
+-- | Write a signal to a bus with sample accurate timing.
 module Sound.SC3.UGen.Record.OffsetOut where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/OnePole.hs b/Sound/SC3/UGen/Record/OnePole.hs
--- a/Sound/SC3/UGen/Record/OnePole.hs
+++ b/Sound/SC3/UGen/Record/OnePole.hs
@@ -1,3 +1,4 @@
+-- | One pole filter.
 module Sound.SC3.UGen.Record.OnePole where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/OneZero.hs b/Sound/SC3/UGen/Record/OneZero.hs
--- a/Sound/SC3/UGen/Record/OneZero.hs
+++ b/Sound/SC3/UGen/Record/OneZero.hs
@@ -1,3 +1,4 @@
+-- | One zero filter.
 module Sound.SC3.UGen.Record.OneZero where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Onsets.hs b/Sound/SC3/UGen/Record/Onsets.hs
--- a/Sound/SC3/UGen/Record/Onsets.hs
+++ b/Sound/SC3/UGen/Record/Onsets.hs
@@ -1,3 +1,4 @@
+-- | Onset detector
 module Sound.SC3.UGen.Record.Onsets where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Oregonator.hs b/Sound/SC3/UGen/Record/Oregonator.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Oregonator.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Oregonator where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Oregonator = Oregonator {
+  reset :: S.UGen,
+  rate_ :: S.UGen,
+  epsilon :: S.UGen,
+  mu :: S.UGen,
+  q :: S.UGen,
+  initx :: S.UGen,
+  inity :: S.UGen,
+  initz :: S.UGen
+  } deriving (Show)
+oregonator :: Oregonator
+oregonator = Oregonator {
+  reset = 0.0,
+  rate_ = 0.01,
+  epsilon = 1.0,
+  mu = 1.0,
+  q = 1.0,
+  initx = 0.5,
+  inity = 0.5,
+  initz = 0.5
+  }
+mkOregonator :: Oregonator -> S.UGen
+mkOregonator (Oregonator  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "Oregonator" [a',b',c',d',e',f',g',h'] 3
+instance Make Oregonator where
+  ugen = mkOregonator
diff --git a/Sound/SC3/UGen/Record/Osc.hs b/Sound/SC3/UGen/Record/Osc.hs
--- a/Sound/SC3/UGen/Record/Osc.hs
+++ b/Sound/SC3/UGen/Record/Osc.hs
@@ -1,3 +1,4 @@
+-- | Interpolating wavetable oscillator.
 module Sound.SC3.UGen.Record.Osc where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/OscN.hs b/Sound/SC3/UGen/Record/OscN.hs
--- a/Sound/SC3/UGen/Record/OscN.hs
+++ b/Sound/SC3/UGen/Record/OscN.hs
@@ -1,3 +1,4 @@
+-- | Noninterpolating wavetable oscillator.
 module Sound.SC3.UGen.Record.OscN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Out.hs b/Sound/SC3/UGen/Record/Out.hs
--- a/Sound/SC3/UGen/Record/Out.hs
+++ b/Sound/SC3/UGen/Record/Out.hs
@@ -1,3 +1,4 @@
+-- | Write a signal to a bus.
 module Sound.SC3.UGen.Record.Out where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PSinGrain.hs b/Sound/SC3/UGen/Record/PSinGrain.hs
--- a/Sound/SC3/UGen/Record/PSinGrain.hs
+++ b/Sound/SC3/UGen/Record/PSinGrain.hs
@@ -1,3 +1,4 @@
+-- | Very fast sine grain with a parabolic envelope
 module Sound.SC3.UGen.Record.PSinGrain where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PVInfo.hs b/Sound/SC3/UGen/Record/PVInfo.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PVInfo.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PVInfo where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PVInfo = PVInfo {
+  rate :: S.Rate,
+  pvbuffer :: S.UGen,
+  binNum :: S.UGen,
+  filePointer :: S.UGen
+  } deriving (Show)
+pVInfo :: PVInfo
+pVInfo = PVInfo {
+  rate = S.AR,
+  pvbuffer = 0.0,
+  binNum = 0.0,
+  filePointer = 0.0
+  }
+mkPVInfo :: PVInfo -> S.UGen
+mkPVInfo (PVInfo r a' b' c') = S.mkOsc r "PVInfo" [a',b',c'] 2
+instance Make PVInfo where
+  ugen = mkPVInfo
diff --git a/Sound/SC3/UGen/Record/PVSynth.hs b/Sound/SC3/UGen/Record/PVSynth.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PVSynth.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PVSynth where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PVSynth = PVSynth {
+  pvbuffer :: S.UGen,
+  numBins :: S.UGen,
+  binStart :: S.UGen,
+  binSkip :: S.UGen,
+  filePointer :: S.UGen,
+  freqMul :: S.UGen,
+  freqAdd :: S.UGen
+  } deriving (Show)
+pVSynth :: PVSynth
+pVSynth = PVSynth {
+  pvbuffer = 0.0,
+  numBins = 0.0,
+  binStart = 0.0,
+  binSkip = 1.0,
+  filePointer = 0.0,
+  freqMul = 1.0,
+  freqAdd = 0.0
+  }
+mkPVSynth :: PVSynth -> S.UGen
+mkPVSynth (PVSynth  a' b' c' d' e' f' g') = S.mkOsc S.AR "PVSynth" [a',b',c',d',e',f',g'] 1
+instance Make PVSynth where
+  ugen = mkPVSynth
diff --git a/Sound/SC3/UGen/Record/PV_Add.hs b/Sound/SC3/UGen/Record/PV_Add.hs
--- a/Sound/SC3/UGen/Record/PV_Add.hs
+++ b/Sound/SC3/UGen/Record/PV_Add.hs
@@ -1,3 +1,4 @@
+-- | Complex addition.
 module Sound.SC3.UGen.Record.PV_Add where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_BinBufRd.hs b/Sound/SC3/UGen/Record/PV_BinBufRd.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_BinBufRd.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_BinBufRd where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_BinBufRd = PV_BinBufRd {
+  buffer :: S.UGen,
+  playbuf :: S.UGen,
+  point :: S.UGen,
+  binStart :: S.UGen,
+  binSkip :: S.UGen,
+  numBins :: S.UGen,
+  clear :: S.UGen
+  } deriving (Show)
+pV_BinBufRd :: PV_BinBufRd
+pV_BinBufRd = PV_BinBufRd {
+  buffer = 0.0,
+  playbuf = 0.0,
+  point = 1.0,
+  binStart = 0.0,
+  binSkip = 1.0,
+  numBins = 1.0,
+  clear = 0.0
+  }
+mkPV_BinBufRd :: PV_BinBufRd -> S.UGen
+mkPV_BinBufRd (PV_BinBufRd  a' b' c' d' e' f' g') = S.mkOsc S.KR "PV_BinBufRd" [a',b',c',d',e',f',g'] 1
+instance Make PV_BinBufRd where
+  ugen = mkPV_BinBufRd
diff --git a/Sound/SC3/UGen/Record/PV_BinDelay.hs b/Sound/SC3/UGen/Record/PV_BinDelay.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_BinDelay.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_BinDelay where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_BinDelay = PV_BinDelay {
+  buffer :: S.UGen,
+  maxdelay :: S.UGen,
+  delaybuf :: S.UGen,
+  fbbuf :: S.UGen,
+  hop :: S.UGen
+  } deriving (Show)
+pV_BinDelay :: PV_BinDelay
+pV_BinDelay = PV_BinDelay {
+  buffer = 0.0,
+  maxdelay = 0.0,
+  delaybuf = 0.0,
+  fbbuf = 0.0,
+  hop = 0.5
+  }
+mkPV_BinDelay :: PV_BinDelay -> S.UGen
+mkPV_BinDelay (PV_BinDelay  a' b' c' d' e') = S.mkOsc S.KR "PV_BinDelay" [a',b',c',d',e'] 1
+instance Make PV_BinDelay where
+  ugen = mkPV_BinDelay
diff --git a/Sound/SC3/UGen/Record/PV_BinFilter.hs b/Sound/SC3/UGen/Record/PV_BinFilter.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_BinFilter.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_BinFilter where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_BinFilter = PV_BinFilter {
+  buffer :: S.UGen,
+  start :: S.UGen,
+  end :: S.UGen
+  } deriving (Show)
+pV_BinFilter :: PV_BinFilter
+pV_BinFilter = PV_BinFilter {
+  buffer = 0.0,
+  start = 0.0,
+  end = 0.0
+  }
+mkPV_BinFilter :: PV_BinFilter -> S.UGen
+mkPV_BinFilter (PV_BinFilter  a' b' c') = S.mkOsc S.KR "PV_BinFilter" [a',b',c'] 1
+instance Make PV_BinFilter where
+  ugen = mkPV_BinFilter
diff --git a/Sound/SC3/UGen/Record/PV_BinPlayBuf.hs b/Sound/SC3/UGen/Record/PV_BinPlayBuf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_BinPlayBuf.hs
@@ -0,0 +1,31 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_BinPlayBuf where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_BinPlayBuf = PV_BinPlayBuf {
+  buffer :: S.UGen,
+  playbuf :: S.UGen,
+  rate_ :: S.UGen,
+  offset :: S.UGen,
+  binStart :: S.UGen,
+  binSkip :: S.UGen,
+  numBins :: S.UGen,
+  loop :: S.UGen,
+  clear :: S.UGen
+  } deriving (Show)
+pV_BinPlayBuf :: PV_BinPlayBuf
+pV_BinPlayBuf = PV_BinPlayBuf {
+  buffer = 0.0,
+  playbuf = 0.0,
+  rate_ = 1.0,
+  offset = 0.0,
+  binStart = 0.0,
+  binSkip = 1.0,
+  numBins = 1.0,
+  loop = 0.0,
+  clear = 0.0
+  }
+mkPV_BinPlayBuf :: PV_BinPlayBuf -> S.UGen
+mkPV_BinPlayBuf (PV_BinPlayBuf  a' b' c' d' e' f' g' h' i') = S.mkOsc S.KR "PV_BinPlayBuf" [a',b',c',d',e',f',g',h',i'] 1
+instance Make PV_BinPlayBuf where
+  ugen = mkPV_BinPlayBuf
diff --git a/Sound/SC3/UGen/Record/PV_BinScramble.hs b/Sound/SC3/UGen/Record/PV_BinScramble.hs
--- a/Sound/SC3/UGen/Record/PV_BinScramble.hs
+++ b/Sound/SC3/UGen/Record/PV_BinScramble.hs
@@ -1,3 +1,4 @@
+-- | Scramble bins.
 module Sound.SC3.UGen.Record.PV_BinScramble where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_BinShift.hs b/Sound/SC3/UGen/Record/PV_BinShift.hs
--- a/Sound/SC3/UGen/Record/PV_BinShift.hs
+++ b/Sound/SC3/UGen/Record/PV_BinShift.hs
@@ -1,3 +1,4 @@
+-- | Shift and stretch bin position.
 module Sound.SC3.UGen.Record.PV_BinShift where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_BinWipe.hs b/Sound/SC3/UGen/Record/PV_BinWipe.hs
--- a/Sound/SC3/UGen/Record/PV_BinWipe.hs
+++ b/Sound/SC3/UGen/Record/PV_BinWipe.hs
@@ -1,3 +1,4 @@
+-- | Combine low and high bins from two inputs.
 module Sound.SC3.UGen.Record.PV_BinWipe where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_BrickWall.hs b/Sound/SC3/UGen/Record/PV_BrickWall.hs
--- a/Sound/SC3/UGen/Record/PV_BrickWall.hs
+++ b/Sound/SC3/UGen/Record/PV_BrickWall.hs
@@ -1,3 +1,4 @@
+-- | Zero bins.
 module Sound.SC3.UGen.Record.PV_BrickWall where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_BufRd.hs b/Sound/SC3/UGen/Record/PV_BufRd.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_BufRd.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_BufRd where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_BufRd = PV_BufRd {
+  buffer :: S.UGen,
+  playbuf :: S.UGen,
+  point :: S.UGen
+  } deriving (Show)
+pV_BufRd :: PV_BufRd
+pV_BufRd = PV_BufRd {
+  buffer = 0.0,
+  playbuf = 0.0,
+  point = 1.0
+  }
+mkPV_BufRd :: PV_BufRd -> S.UGen
+mkPV_BufRd (PV_BufRd  a' b' c') = S.mkOsc S.KR "PV_BufRd" [a',b',c'] 1
+instance Make PV_BufRd where
+  ugen = mkPV_BufRd
diff --git a/Sound/SC3/UGen/Record/PV_ChainUGen.hs b/Sound/SC3/UGen/Record/PV_ChainUGen.hs
--- a/Sound/SC3/UGen/Record/PV_ChainUGen.hs
+++ b/Sound/SC3/UGen/Record/PV_ChainUGen.hs
@@ -1,3 +1,4 @@
+-- | Base class for UGens that alter FFT chains
 module Sound.SC3.UGen.Record.PV_ChainUGen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_CommonMag.hs b/Sound/SC3/UGen/Record/PV_CommonMag.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_CommonMag.hs
@@ -0,0 +1,21 @@
+-- | returns common magnitudes
+module Sound.SC3.UGen.Record.PV_CommonMag where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_CommonMag = PV_CommonMag {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen,
+  tolerance :: S.UGen,
+  remove :: S.UGen
+  } deriving (Show)
+pV_CommonMag :: PV_CommonMag
+pV_CommonMag = PV_CommonMag {
+  bufferA = 0.0,
+  bufferB = 0.0,
+  tolerance = 0.0,
+  remove = 0.0
+  }
+mkPV_CommonMag :: PV_CommonMag -> S.UGen
+mkPV_CommonMag (PV_CommonMag  a' b' c' d') = S.mkOsc S.KR "PV_CommonMag" [a',b',c',d'] 1
+instance Make PV_CommonMag where
+  ugen = mkPV_CommonMag
diff --git a/Sound/SC3/UGen/Record/PV_CommonMul.hs b/Sound/SC3/UGen/Record/PV_CommonMul.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_CommonMul.hs
@@ -0,0 +1,21 @@
+-- | multiplies common magnitudes
+module Sound.SC3.UGen.Record.PV_CommonMul where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_CommonMul = PV_CommonMul {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen,
+  tolerance :: S.UGen,
+  remove :: S.UGen
+  } deriving (Show)
+pV_CommonMul :: PV_CommonMul
+pV_CommonMul = PV_CommonMul {
+  bufferA = 0.0,
+  bufferB = 0.0,
+  tolerance = 0.0,
+  remove = 0.0
+  }
+mkPV_CommonMul :: PV_CommonMul -> S.UGen
+mkPV_CommonMul (PV_CommonMul  a' b' c' d') = S.mkOsc S.KR "PV_CommonMul" [a',b',c',d'] 1
+instance Make PV_CommonMul where
+  ugen = mkPV_CommonMul
diff --git a/Sound/SC3/UGen/Record/PV_Compander.hs b/Sound/SC3/UGen/Record/PV_Compander.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_Compander.hs
@@ -0,0 +1,21 @@
+-- | simple spectral compression/expansion
+module Sound.SC3.UGen.Record.PV_Compander where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_Compander = PV_Compander {
+  buffer :: S.UGen,
+  thresh :: S.UGen,
+  slopeBelow :: S.UGen,
+  slopeAbove :: S.UGen
+  } deriving (Show)
+pV_Compander :: PV_Compander
+pV_Compander = PV_Compander {
+  buffer = 0.0,
+  thresh = 50.0,
+  slopeBelow = 1.0,
+  slopeAbove = 1.0
+  }
+mkPV_Compander :: PV_Compander -> S.UGen
+mkPV_Compander (PV_Compander  a' b' c' d') = S.mkOsc S.KR "PV_Compander" [a',b',c',d'] 1
+instance Make PV_Compander where
+  ugen = mkPV_Compander
diff --git a/Sound/SC3/UGen/Record/PV_ConformalMap.hs b/Sound/SC3/UGen/Record/PV_ConformalMap.hs
--- a/Sound/SC3/UGen/Record/PV_ConformalMap.hs
+++ b/Sound/SC3/UGen/Record/PV_ConformalMap.hs
@@ -1,3 +1,4 @@
+-- | Complex plane attack.
 module Sound.SC3.UGen.Record.PV_ConformalMap where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_Conj.hs b/Sound/SC3/UGen/Record/PV_Conj.hs
--- a/Sound/SC3/UGen/Record/PV_Conj.hs
+++ b/Sound/SC3/UGen/Record/PV_Conj.hs
@@ -1,3 +1,4 @@
+-- | Complex conjugate
 module Sound.SC3.UGen.Record.PV_Conj where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_Copy.hs b/Sound/SC3/UGen/Record/PV_Copy.hs
--- a/Sound/SC3/UGen/Record/PV_Copy.hs
+++ b/Sound/SC3/UGen/Record/PV_Copy.hs
@@ -1,3 +1,4 @@
+-- | Copy an FFT buffer
 module Sound.SC3.UGen.Record.PV_Copy where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_CopyPhase.hs b/Sound/SC3/UGen/Record/PV_CopyPhase.hs
--- a/Sound/SC3/UGen/Record/PV_CopyPhase.hs
+++ b/Sound/SC3/UGen/Record/PV_CopyPhase.hs
@@ -1,3 +1,4 @@
+-- | Copy magnitudes and phases.
 module Sound.SC3.UGen.Record.PV_CopyPhase where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_Cutoff.hs b/Sound/SC3/UGen/Record/PV_Cutoff.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_Cutoff.hs
@@ -0,0 +1,19 @@
+-- | zero bins with interpolation
+module Sound.SC3.UGen.Record.PV_Cutoff where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_Cutoff = PV_Cutoff {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen,
+  wipe :: S.UGen
+  } deriving (Show)
+pV_Cutoff :: PV_Cutoff
+pV_Cutoff = PV_Cutoff {
+  bufferA = 0.0,
+  bufferB = 0.0,
+  wipe = 0.0
+  }
+mkPV_Cutoff :: PV_Cutoff -> S.UGen
+mkPV_Cutoff (PV_Cutoff  a' b' c') = S.mkOsc S.KR "PV_Cutoff" [a',b',c'] 1
+instance Make PV_Cutoff where
+  ugen = mkPV_Cutoff
diff --git a/Sound/SC3/UGen/Record/PV_DiffMags.hs b/Sound/SC3/UGen/Record/PV_DiffMags.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_DiffMags.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_DiffMags where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_DiffMags = PV_DiffMags {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen
+  } deriving (Show)
+pV_DiffMags :: PV_DiffMags
+pV_DiffMags = PV_DiffMags {
+  bufferA = 0.0,
+  bufferB = 0.0
+  }
+mkPV_DiffMags :: PV_DiffMags -> S.UGen
+mkPV_DiffMags (PV_DiffMags  a' b') = S.mkOsc S.KR "PV_DiffMags" [a',b'] 1
+instance Make PV_DiffMags where
+  ugen = mkPV_DiffMags
diff --git a/Sound/SC3/UGen/Record/PV_Diffuser.hs b/Sound/SC3/UGen/Record/PV_Diffuser.hs
--- a/Sound/SC3/UGen/Record/PV_Diffuser.hs
+++ b/Sound/SC3/UGen/Record/PV_Diffuser.hs
@@ -1,3 +1,4 @@
+-- | Random phase shifting.
 module Sound.SC3.UGen.Record.PV_Diffuser where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_Div.hs b/Sound/SC3/UGen/Record/PV_Div.hs
--- a/Sound/SC3/UGen/Record/PV_Div.hs
+++ b/Sound/SC3/UGen/Record/PV_Div.hs
@@ -1,3 +1,4 @@
+-- | Complex division
 module Sound.SC3.UGen.Record.PV_Div where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_EvenBin.hs b/Sound/SC3/UGen/Record/PV_EvenBin.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_EvenBin.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_EvenBin where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_EvenBin = PV_EvenBin {
+  buffer :: S.UGen
+  } deriving (Show)
+pV_EvenBin :: PV_EvenBin
+pV_EvenBin = PV_EvenBin {
+  buffer = 0.0
+  }
+mkPV_EvenBin :: PV_EvenBin -> S.UGen
+mkPV_EvenBin (PV_EvenBin  a') = S.mkOsc S.KR "PV_EvenBin" [a'] 1
+instance Make PV_EvenBin where
+  ugen = mkPV_EvenBin
diff --git a/Sound/SC3/UGen/Record/PV_ExtractRepeat.hs b/Sound/SC3/UGen/Record/PV_ExtractRepeat.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_ExtractRepeat.hs
@@ -0,0 +1,27 @@
+-- | extract a repeating loop out from audio
+module Sound.SC3.UGen.Record.PV_ExtractRepeat where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_ExtractRepeat = PV_ExtractRepeat {
+  buffer :: S.UGen,
+  loopbuf :: S.UGen,
+  loopdur :: S.UGen,
+  memorytime :: S.UGen,
+  which :: S.UGen,
+  ffthop :: S.UGen,
+  thresh :: S.UGen
+  } deriving (Show)
+pV_ExtractRepeat :: PV_ExtractRepeat
+pV_ExtractRepeat = PV_ExtractRepeat {
+  buffer = 0.0,
+  loopbuf = 0.0,
+  loopdur = 0.0,
+  memorytime = 30.0,
+  which = 0.0,
+  ffthop = 0.5,
+  thresh = 1.0
+  }
+mkPV_ExtractRepeat :: PV_ExtractRepeat -> S.UGen
+mkPV_ExtractRepeat (PV_ExtractRepeat  a' b' c' d' e' f' g') = S.mkOsc S.KR "PV_ExtractRepeat" [a',b',c',d',e',f',g'] 1
+instance Make PV_ExtractRepeat where
+  ugen = mkPV_ExtractRepeat
diff --git a/Sound/SC3/UGen/Record/PV_Freeze.hs b/Sound/SC3/UGen/Record/PV_Freeze.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_Freeze.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_Freeze where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_Freeze = PV_Freeze {
+  buffer :: S.UGen,
+  freeze :: S.UGen
+  } deriving (Show)
+pV_Freeze :: PV_Freeze
+pV_Freeze = PV_Freeze {
+  buffer = 0.0,
+  freeze = 0.0
+  }
+mkPV_Freeze :: PV_Freeze -> S.UGen
+mkPV_Freeze (PV_Freeze  a' b') = S.mkOsc S.KR "PV_Freeze" [a',b'] 1
+instance Make PV_Freeze where
+  ugen = mkPV_Freeze
diff --git a/Sound/SC3/UGen/Record/PV_FreqBuffer.hs b/Sound/SC3/UGen/Record/PV_FreqBuffer.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_FreqBuffer.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_FreqBuffer where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_FreqBuffer = PV_FreqBuffer {
+  buffer :: S.UGen,
+  databuffer :: S.UGen
+  } deriving (Show)
+pV_FreqBuffer :: PV_FreqBuffer
+pV_FreqBuffer = PV_FreqBuffer {
+  buffer = 0.0,
+  databuffer = 0.0
+  }
+mkPV_FreqBuffer :: PV_FreqBuffer -> S.UGen
+mkPV_FreqBuffer (PV_FreqBuffer  a' b') = S.mkOsc S.KR "PV_FreqBuffer" [a',b'] 1
+instance Make PV_FreqBuffer where
+  ugen = mkPV_FreqBuffer
diff --git a/Sound/SC3/UGen/Record/PV_HainsworthFoote.hs b/Sound/SC3/UGen/Record/PV_HainsworthFoote.hs
--- a/Sound/SC3/UGen/Record/PV_HainsworthFoote.hs
+++ b/Sound/SC3/UGen/Record/PV_HainsworthFoote.hs
@@ -1,3 +1,4 @@
+-- | FFT onset detector.
 module Sound.SC3.UGen.Record.PV_HainsworthFoote where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_Invert.hs b/Sound/SC3/UGen/Record/PV_Invert.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_Invert.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_Invert where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_Invert = PV_Invert {
+  buffer :: S.UGen
+  } deriving (Show)
+pV_Invert :: PV_Invert
+pV_Invert = PV_Invert {
+  buffer = 0.0
+  }
+mkPV_Invert :: PV_Invert -> S.UGen
+mkPV_Invert (PV_Invert  a') = S.mkOsc S.KR "PV_Invert" [a'] 1
+instance Make PV_Invert where
+  ugen = mkPV_Invert
diff --git a/Sound/SC3/UGen/Record/PV_JensenAndersen.hs b/Sound/SC3/UGen/Record/PV_JensenAndersen.hs
--- a/Sound/SC3/UGen/Record/PV_JensenAndersen.hs
+++ b/Sound/SC3/UGen/Record/PV_JensenAndersen.hs
@@ -1,3 +1,4 @@
+-- | FFT feature detector for onset detection.
 module Sound.SC3.UGen.Record.PV_JensenAndersen where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_LocalMax.hs b/Sound/SC3/UGen/Record/PV_LocalMax.hs
--- a/Sound/SC3/UGen/Record/PV_LocalMax.hs
+++ b/Sound/SC3/UGen/Record/PV_LocalMax.hs
@@ -1,3 +1,4 @@
+-- | Pass bins which are a local maximum.
 module Sound.SC3.UGen.Record.PV_LocalMax where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagAbove.hs b/Sound/SC3/UGen/Record/PV_MagAbove.hs
--- a/Sound/SC3/UGen/Record/PV_MagAbove.hs
+++ b/Sound/SC3/UGen/Record/PV_MagAbove.hs
@@ -1,3 +1,4 @@
+-- | Pass bins above a threshold.
 module Sound.SC3.UGen.Record.PV_MagAbove where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagBelow.hs b/Sound/SC3/UGen/Record/PV_MagBelow.hs
--- a/Sound/SC3/UGen/Record/PV_MagBelow.hs
+++ b/Sound/SC3/UGen/Record/PV_MagBelow.hs
@@ -1,3 +1,4 @@
+-- | Pass bins below a threshold.
 module Sound.SC3.UGen.Record.PV_MagBelow where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagBuffer.hs b/Sound/SC3/UGen/Record/PV_MagBuffer.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagBuffer.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MagBuffer where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagBuffer = PV_MagBuffer {
+  buffer :: S.UGen,
+  databuffer :: S.UGen
+  } deriving (Show)
+pV_MagBuffer :: PV_MagBuffer
+pV_MagBuffer = PV_MagBuffer {
+  buffer = 0.0,
+  databuffer = 0.0
+  }
+mkPV_MagBuffer :: PV_MagBuffer -> S.UGen
+mkPV_MagBuffer (PV_MagBuffer  a' b') = S.mkOsc S.KR "PV_MagBuffer" [a',b'] 1
+instance Make PV_MagBuffer where
+  ugen = mkPV_MagBuffer
diff --git a/Sound/SC3/UGen/Record/PV_MagClip.hs b/Sound/SC3/UGen/Record/PV_MagClip.hs
--- a/Sound/SC3/UGen/Record/PV_MagClip.hs
+++ b/Sound/SC3/UGen/Record/PV_MagClip.hs
@@ -1,3 +1,4 @@
+-- | Clip bins to a threshold.
 module Sound.SC3.UGen.Record.PV_MagClip where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagDiv.hs b/Sound/SC3/UGen/Record/PV_MagDiv.hs
--- a/Sound/SC3/UGen/Record/PV_MagDiv.hs
+++ b/Sound/SC3/UGen/Record/PV_MagDiv.hs
@@ -1,3 +1,4 @@
+-- | Division of magnitudes
 module Sound.SC3.UGen.Record.PV_MagDiv where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagExp.hs b/Sound/SC3/UGen/Record/PV_MagExp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagExp.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MagExp where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagExp = PV_MagExp {
+  buffer :: S.UGen
+  } deriving (Show)
+pV_MagExp :: PV_MagExp
+pV_MagExp = PV_MagExp {
+  buffer = 0.0
+  }
+mkPV_MagExp :: PV_MagExp -> S.UGen
+mkPV_MagExp (PV_MagExp  a') = S.mkOsc S.KR "PV_MagExp" [a'] 1
+instance Make PV_MagExp where
+  ugen = mkPV_MagExp
diff --git a/Sound/SC3/UGen/Record/PV_MagFreeze.hs b/Sound/SC3/UGen/Record/PV_MagFreeze.hs
--- a/Sound/SC3/UGen/Record/PV_MagFreeze.hs
+++ b/Sound/SC3/UGen/Record/PV_MagFreeze.hs
@@ -1,3 +1,4 @@
+-- | Freeze magnitudes.
 module Sound.SC3.UGen.Record.PV_MagFreeze where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagGate.hs b/Sound/SC3/UGen/Record/PV_MagGate.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagGate.hs
@@ -0,0 +1,19 @@
+-- | reduces magnitudes above or below thresh
+module Sound.SC3.UGen.Record.PV_MagGate where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagGate = PV_MagGate {
+  buffer :: S.UGen,
+  thresh :: S.UGen,
+  remove :: S.UGen
+  } deriving (Show)
+pV_MagGate :: PV_MagGate
+pV_MagGate = PV_MagGate {
+  buffer = 0.0,
+  thresh = 1.0,
+  remove = 0.0
+  }
+mkPV_MagGate :: PV_MagGate -> S.UGen
+mkPV_MagGate (PV_MagGate  a' b' c') = S.mkOsc S.KR "PV_MagGate" [a',b',c'] 1
+instance Make PV_MagGate where
+  ugen = mkPV_MagGate
diff --git a/Sound/SC3/UGen/Record/PV_MagLog.hs b/Sound/SC3/UGen/Record/PV_MagLog.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagLog.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MagLog where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagLog = PV_MagLog {
+  buffer :: S.UGen
+  } deriving (Show)
+pV_MagLog :: PV_MagLog
+pV_MagLog = PV_MagLog {
+  buffer = 0.0
+  }
+mkPV_MagLog :: PV_MagLog -> S.UGen
+mkPV_MagLog (PV_MagLog  a') = S.mkOsc S.KR "PV_MagLog" [a'] 1
+instance Make PV_MagLog where
+  ugen = mkPV_MagLog
diff --git a/Sound/SC3/UGen/Record/PV_MagMap.hs b/Sound/SC3/UGen/Record/PV_MagMap.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagMap.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MagMap where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagMap = PV_MagMap {
+  buffer :: S.UGen,
+  mapbuf :: S.UGen
+  } deriving (Show)
+pV_MagMap :: PV_MagMap
+pV_MagMap = PV_MagMap {
+  buffer = 0.0,
+  mapbuf = 0.0
+  }
+mkPV_MagMap :: PV_MagMap -> S.UGen
+mkPV_MagMap (PV_MagMap  a' b') = S.mkOsc S.KR "PV_MagMap" [a',b'] 1
+instance Make PV_MagMap where
+  ugen = mkPV_MagMap
diff --git a/Sound/SC3/UGen/Record/PV_MagMinus.hs b/Sound/SC3/UGen/Record/PV_MagMinus.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagMinus.hs
@@ -0,0 +1,19 @@
+-- | subtract spectral energy
+module Sound.SC3.UGen.Record.PV_MagMinus where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagMinus = PV_MagMinus {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen,
+  remove :: S.UGen
+  } deriving (Show)
+pV_MagMinus :: PV_MagMinus
+pV_MagMinus = PV_MagMinus {
+  bufferA = 0.0,
+  bufferB = 0.0,
+  remove = 1.0
+  }
+mkPV_MagMinus :: PV_MagMinus -> S.UGen
+mkPV_MagMinus (PV_MagMinus  a' b' c') = S.mkOsc S.KR "PV_MagMinus" [a',b',c'] 1
+instance Make PV_MagMinus where
+  ugen = mkPV_MagMinus
diff --git a/Sound/SC3/UGen/Record/PV_MagMul.hs b/Sound/SC3/UGen/Record/PV_MagMul.hs
--- a/Sound/SC3/UGen/Record/PV_MagMul.hs
+++ b/Sound/SC3/UGen/Record/PV_MagMul.hs
@@ -1,3 +1,4 @@
+-- | Multiply magnitudes.
 module Sound.SC3.UGen.Record.PV_MagMul where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagMulAdd.hs b/Sound/SC3/UGen/Record/PV_MagMulAdd.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagMulAdd.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MagMulAdd where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagMulAdd = PV_MagMulAdd {
+  buffer :: S.UGen
+  } deriving (Show)
+pV_MagMulAdd :: PV_MagMulAdd
+pV_MagMulAdd = PV_MagMulAdd {
+  buffer = 0.0
+  }
+mkPV_MagMulAdd :: PV_MagMulAdd -> S.UGen
+mkPV_MagMulAdd (PV_MagMulAdd  a') = S.mkOsc S.KR "PV_MagMulAdd" [a'] 1
+instance Make PV_MagMulAdd where
+  ugen = mkPV_MagMulAdd
diff --git a/Sound/SC3/UGen/Record/PV_MagNoise.hs b/Sound/SC3/UGen/Record/PV_MagNoise.hs
--- a/Sound/SC3/UGen/Record/PV_MagNoise.hs
+++ b/Sound/SC3/UGen/Record/PV_MagNoise.hs
@@ -1,3 +1,4 @@
+-- | Multiply magnitudes by noise.
 module Sound.SC3.UGen.Record.PV_MagNoise where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagScale.hs b/Sound/SC3/UGen/Record/PV_MagScale.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagScale.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MagScale where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagScale = PV_MagScale {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen
+  } deriving (Show)
+pV_MagScale :: PV_MagScale
+pV_MagScale = PV_MagScale {
+  bufferA = 0.0,
+  bufferB = 0.0
+  }
+mkPV_MagScale :: PV_MagScale -> S.UGen
+mkPV_MagScale (PV_MagScale  a' b') = S.mkOsc S.KR "PV_MagScale" [a',b'] 1
+instance Make PV_MagScale where
+  ugen = mkPV_MagScale
diff --git a/Sound/SC3/UGen/Record/PV_MagShift.hs b/Sound/SC3/UGen/Record/PV_MagShift.hs
--- a/Sound/SC3/UGen/Record/PV_MagShift.hs
+++ b/Sound/SC3/UGen/Record/PV_MagShift.hs
@@ -1,3 +1,4 @@
+-- | shift and stretch magnitude bin position.
 module Sound.SC3.UGen.Record.PV_MagShift where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagSmear.hs b/Sound/SC3/UGen/Record/PV_MagSmear.hs
--- a/Sound/SC3/UGen/Record/PV_MagSmear.hs
+++ b/Sound/SC3/UGen/Record/PV_MagSmear.hs
@@ -1,3 +1,4 @@
+-- | Average magnitudes across bins.
 module Sound.SC3.UGen.Record.PV_MagSmear where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagSmooth.hs b/Sound/SC3/UGen/Record/PV_MagSmooth.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagSmooth.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MagSmooth where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagSmooth = PV_MagSmooth {
+  buffer :: S.UGen,
+  factor :: S.UGen
+  } deriving (Show)
+pV_MagSmooth :: PV_MagSmooth
+pV_MagSmooth = PV_MagSmooth {
+  buffer = 0.0,
+  factor = 0.1
+  }
+mkPV_MagSmooth :: PV_MagSmooth -> S.UGen
+mkPV_MagSmooth (PV_MagSmooth  a' b') = S.mkOsc S.KR "PV_MagSmooth" [a',b'] 1
+instance Make PV_MagSmooth where
+  ugen = mkPV_MagSmooth
diff --git a/Sound/SC3/UGen/Record/PV_MagSquared.hs b/Sound/SC3/UGen/Record/PV_MagSquared.hs
--- a/Sound/SC3/UGen/Record/PV_MagSquared.hs
+++ b/Sound/SC3/UGen/Record/PV_MagSquared.hs
@@ -1,3 +1,4 @@
+-- | Square magnitudes.
 module Sound.SC3.UGen.Record.PV_MagSquared where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MagSubtract.hs b/Sound/SC3/UGen/Record/PV_MagSubtract.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MagSubtract.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MagSubtract where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MagSubtract = PV_MagSubtract {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen,
+  zerolimit :: S.UGen
+  } deriving (Show)
+pV_MagSubtract :: PV_MagSubtract
+pV_MagSubtract = PV_MagSubtract {
+  bufferA = 0.0,
+  bufferB = 0.0,
+  zerolimit = 0.0
+  }
+mkPV_MagSubtract :: PV_MagSubtract -> S.UGen
+mkPV_MagSubtract (PV_MagSubtract  a' b' c') = S.mkOsc S.KR "PV_MagSubtract" [a',b',c'] 1
+instance Make PV_MagSubtract where
+  ugen = mkPV_MagSubtract
diff --git a/Sound/SC3/UGen/Record/PV_Max.hs b/Sound/SC3/UGen/Record/PV_Max.hs
--- a/Sound/SC3/UGen/Record/PV_Max.hs
+++ b/Sound/SC3/UGen/Record/PV_Max.hs
@@ -1,3 +1,4 @@
+-- | Maximum magnitude.
 module Sound.SC3.UGen.Record.PV_Max where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MaxMagN.hs b/Sound/SC3/UGen/Record/PV_MaxMagN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MaxMagN.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MaxMagN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MaxMagN = PV_MaxMagN {
+  buffer :: S.UGen,
+  numbins :: S.UGen
+  } deriving (Show)
+pV_MaxMagN :: PV_MaxMagN
+pV_MaxMagN = PV_MaxMagN {
+  buffer = 0.0,
+  numbins = 0.0
+  }
+mkPV_MaxMagN :: PV_MaxMagN -> S.UGen
+mkPV_MaxMagN (PV_MaxMagN  a' b') = S.mkOsc S.KR "PV_MaxMagN" [a',b'] 1
+instance Make PV_MaxMagN where
+  ugen = mkPV_MaxMagN
diff --git a/Sound/SC3/UGen/Record/PV_Min.hs b/Sound/SC3/UGen/Record/PV_Min.hs
--- a/Sound/SC3/UGen/Record/PV_Min.hs
+++ b/Sound/SC3/UGen/Record/PV_Min.hs
@@ -1,3 +1,4 @@
+-- | Minimum magnitude.
 module Sound.SC3.UGen.Record.PV_Min where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_MinMagN.hs b/Sound/SC3/UGen/Record/PV_MinMagN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_MinMagN.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_MinMagN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_MinMagN = PV_MinMagN {
+  buffer :: S.UGen,
+  numbins :: S.UGen
+  } deriving (Show)
+pV_MinMagN :: PV_MinMagN
+pV_MinMagN = PV_MinMagN {
+  buffer = 0.0,
+  numbins = 0.0
+  }
+mkPV_MinMagN :: PV_MinMagN -> S.UGen
+mkPV_MinMagN (PV_MinMagN  a' b') = S.mkOsc S.KR "PV_MinMagN" [a',b'] 1
+instance Make PV_MinMagN where
+  ugen = mkPV_MinMagN
diff --git a/Sound/SC3/UGen/Record/PV_Morph.hs b/Sound/SC3/UGen/Record/PV_Morph.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_Morph.hs
@@ -0,0 +1,19 @@
+-- | one kind of spectral morphing
+module Sound.SC3.UGen.Record.PV_Morph where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_Morph = PV_Morph {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen,
+  morph :: S.UGen
+  } deriving (Show)
+pV_Morph :: PV_Morph
+pV_Morph = PV_Morph {
+  bufferA = 0.0,
+  bufferB = 0.0,
+  morph = 0.0
+  }
+mkPV_Morph :: PV_Morph -> S.UGen
+mkPV_Morph (PV_Morph  a' b' c') = S.mkOsc S.KR "PV_Morph" [a',b',c'] 1
+instance Make PV_Morph where
+  ugen = mkPV_Morph
diff --git a/Sound/SC3/UGen/Record/PV_Mul.hs b/Sound/SC3/UGen/Record/PV_Mul.hs
--- a/Sound/SC3/UGen/Record/PV_Mul.hs
+++ b/Sound/SC3/UGen/Record/PV_Mul.hs
@@ -1,3 +1,4 @@
+-- | Complex multiply.
 module Sound.SC3.UGen.Record.PV_Mul where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_NoiseSynthF.hs b/Sound/SC3/UGen/Record/PV_NoiseSynthF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_NoiseSynthF.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_NoiseSynthF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_NoiseSynthF = PV_NoiseSynthF {
+  buffer :: S.UGen,
+  threshold :: S.UGen,
+  numFrames :: S.UGen,
+  initflag :: S.UGen
+  } deriving (Show)
+pV_NoiseSynthF :: PV_NoiseSynthF
+pV_NoiseSynthF = PV_NoiseSynthF {
+  buffer = 0.0,
+  threshold = 0.1,
+  numFrames = 2.0,
+  initflag = 0.0
+  }
+mkPV_NoiseSynthF :: PV_NoiseSynthF -> S.UGen
+mkPV_NoiseSynthF (PV_NoiseSynthF  a' b' c' d') = S.mkOsc S.KR "PV_NoiseSynthF" [a',b',c',d'] 1
+instance Make PV_NoiseSynthF where
+  ugen = mkPV_NoiseSynthF
diff --git a/Sound/SC3/UGen/Record/PV_NoiseSynthP.hs b/Sound/SC3/UGen/Record/PV_NoiseSynthP.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_NoiseSynthP.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_NoiseSynthP where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_NoiseSynthP = PV_NoiseSynthP {
+  buffer :: S.UGen,
+  threshold :: S.UGen,
+  numFrames :: S.UGen,
+  initflag :: S.UGen
+  } deriving (Show)
+pV_NoiseSynthP :: PV_NoiseSynthP
+pV_NoiseSynthP = PV_NoiseSynthP {
+  buffer = 0.0,
+  threshold = 0.1,
+  numFrames = 2.0,
+  initflag = 0.0
+  }
+mkPV_NoiseSynthP :: PV_NoiseSynthP -> S.UGen
+mkPV_NoiseSynthP (PV_NoiseSynthP  a' b' c' d') = S.mkOsc S.KR "PV_NoiseSynthP" [a',b',c',d'] 1
+instance Make PV_NoiseSynthP where
+  ugen = mkPV_NoiseSynthP
diff --git a/Sound/SC3/UGen/Record/PV_OddBin.hs b/Sound/SC3/UGen/Record/PV_OddBin.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_OddBin.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_OddBin where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_OddBin = PV_OddBin {
+  buffer :: S.UGen
+  } deriving (Show)
+pV_OddBin :: PV_OddBin
+pV_OddBin = PV_OddBin {
+  buffer = 0.0
+  }
+mkPV_OddBin :: PV_OddBin -> S.UGen
+mkPV_OddBin (PV_OddBin  a') = S.mkOsc S.KR "PV_OddBin" [a'] 1
+instance Make PV_OddBin where
+  ugen = mkPV_OddBin
diff --git a/Sound/SC3/UGen/Record/PV_PartialSynthF.hs b/Sound/SC3/UGen/Record/PV_PartialSynthF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_PartialSynthF.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_PartialSynthF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_PartialSynthF = PV_PartialSynthF {
+  buffer :: S.UGen,
+  threshold :: S.UGen,
+  numFrames :: S.UGen,
+  initflag :: S.UGen
+  } deriving (Show)
+pV_PartialSynthF :: PV_PartialSynthF
+pV_PartialSynthF = PV_PartialSynthF {
+  buffer = 0.0,
+  threshold = 0.1,
+  numFrames = 2.0,
+  initflag = 0.0
+  }
+mkPV_PartialSynthF :: PV_PartialSynthF -> S.UGen
+mkPV_PartialSynthF (PV_PartialSynthF  a' b' c' d') = S.mkOsc S.KR "PV_PartialSynthF" [a',b',c',d'] 1
+instance Make PV_PartialSynthF where
+  ugen = mkPV_PartialSynthF
diff --git a/Sound/SC3/UGen/Record/PV_PartialSynthP.hs b/Sound/SC3/UGen/Record/PV_PartialSynthP.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_PartialSynthP.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_PartialSynthP where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_PartialSynthP = PV_PartialSynthP {
+  buffer :: S.UGen,
+  threshold :: S.UGen,
+  numFrames :: S.UGen,
+  initflag :: S.UGen
+  } deriving (Show)
+pV_PartialSynthP :: PV_PartialSynthP
+pV_PartialSynthP = PV_PartialSynthP {
+  buffer = 0.0,
+  threshold = 0.1,
+  numFrames = 2.0,
+  initflag = 0.0
+  }
+mkPV_PartialSynthP :: PV_PartialSynthP -> S.UGen
+mkPV_PartialSynthP (PV_PartialSynthP  a' b' c' d') = S.mkOsc S.KR "PV_PartialSynthP" [a',b',c',d'] 1
+instance Make PV_PartialSynthP where
+  ugen = mkPV_PartialSynthP
diff --git a/Sound/SC3/UGen/Record/PV_PhaseShift.hs b/Sound/SC3/UGen/Record/PV_PhaseShift.hs
--- a/Sound/SC3/UGen/Record/PV_PhaseShift.hs
+++ b/Sound/SC3/UGen/Record/PV_PhaseShift.hs
@@ -1,3 +1,4 @@
+-- | Shift phase.
 module Sound.SC3.UGen.Record.PV_PhaseShift where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_PhaseShift270.hs b/Sound/SC3/UGen/Record/PV_PhaseShift270.hs
--- a/Sound/SC3/UGen/Record/PV_PhaseShift270.hs
+++ b/Sound/SC3/UGen/Record/PV_PhaseShift270.hs
@@ -1,3 +1,4 @@
+-- | Shift phase by 270 degrees.
 module Sound.SC3.UGen.Record.PV_PhaseShift270 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_PhaseShift90.hs b/Sound/SC3/UGen/Record/PV_PhaseShift90.hs
--- a/Sound/SC3/UGen/Record/PV_PhaseShift90.hs
+++ b/Sound/SC3/UGen/Record/PV_PhaseShift90.hs
@@ -1,3 +1,4 @@
+-- | Shift phase by 90 degrees.
 module Sound.SC3.UGen.Record.PV_PhaseShift90 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_PitchShift.hs b/Sound/SC3/UGen/Record/PV_PitchShift.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_PitchShift.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_PitchShift where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_PitchShift = PV_PitchShift {
+  buffer :: S.UGen,
+  ratio :: S.UGen
+  } deriving (Show)
+pV_PitchShift :: PV_PitchShift
+pV_PitchShift = PV_PitchShift {
+  buffer = 0.0,
+  ratio = 0.0
+  }
+mkPV_PitchShift :: PV_PitchShift -> S.UGen
+mkPV_PitchShift (PV_PitchShift  a' b') = S.mkOsc S.KR "PV_PitchShift" [a',b'] 1
+instance Make PV_PitchShift where
+  ugen = mkPV_PitchShift
diff --git a/Sound/SC3/UGen/Record/PV_PlayBuf.hs b/Sound/SC3/UGen/Record/PV_PlayBuf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_PlayBuf.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_PlayBuf where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_PlayBuf = PV_PlayBuf {
+  buffer :: S.UGen,
+  playbuf :: S.UGen,
+  rate_ :: S.UGen,
+  offset :: S.UGen,
+  loop :: S.UGen
+  } deriving (Show)
+pV_PlayBuf :: PV_PlayBuf
+pV_PlayBuf = PV_PlayBuf {
+  buffer = 0.0,
+  playbuf = 0.0,
+  rate_ = 1.0,
+  offset = 0.0,
+  loop = 0.0
+  }
+mkPV_PlayBuf :: PV_PlayBuf -> S.UGen
+mkPV_PlayBuf (PV_PlayBuf  a' b' c' d' e') = S.mkOsc S.KR "PV_PlayBuf" [a',b',c',d',e'] 1
+instance Make PV_PlayBuf where
+  ugen = mkPV_PlayBuf
diff --git a/Sound/SC3/UGen/Record/PV_RandComb.hs b/Sound/SC3/UGen/Record/PV_RandComb.hs
--- a/Sound/SC3/UGen/Record/PV_RandComb.hs
+++ b/Sound/SC3/UGen/Record/PV_RandComb.hs
@@ -1,3 +1,4 @@
+-- | Pass random bins.
 module Sound.SC3.UGen.Record.PV_RandComb where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_RandWipe.hs b/Sound/SC3/UGen/Record/PV_RandWipe.hs
--- a/Sound/SC3/UGen/Record/PV_RandWipe.hs
+++ b/Sound/SC3/UGen/Record/PV_RandWipe.hs
@@ -1,3 +1,4 @@
+-- | Crossfade in random bin order.
 module Sound.SC3.UGen.Record.PV_RandWipe where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_RecordBuf.hs b/Sound/SC3/UGen/Record/PV_RecordBuf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_RecordBuf.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_RecordBuf where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_RecordBuf = PV_RecordBuf {
+  buffer :: S.UGen,
+  recbuf :: S.UGen,
+  offset :: S.UGen,
+  run :: S.UGen,
+  loop :: S.UGen,
+  hop :: S.UGen,
+  wintype :: S.UGen
+  } deriving (Show)
+pV_RecordBuf :: PV_RecordBuf
+pV_RecordBuf = PV_RecordBuf {
+  buffer = 0.0,
+  recbuf = 0.0,
+  offset = 0.0,
+  run = 0.0,
+  loop = 0.0,
+  hop = 0.5,
+  wintype = 0.0
+  }
+mkPV_RecordBuf :: PV_RecordBuf -> S.UGen
+mkPV_RecordBuf (PV_RecordBuf  a' b' c' d' e' f' g') = S.mkOsc S.KR "PV_RecordBuf" [a',b',c',d',e',f',g'] 1
+instance Make PV_RecordBuf where
+  ugen = mkPV_RecordBuf
diff --git a/Sound/SC3/UGen/Record/PV_RectComb.hs b/Sound/SC3/UGen/Record/PV_RectComb.hs
--- a/Sound/SC3/UGen/Record/PV_RectComb.hs
+++ b/Sound/SC3/UGen/Record/PV_RectComb.hs
@@ -1,3 +1,4 @@
+-- | Make gaps in spectrum.
 module Sound.SC3.UGen.Record.PV_RectComb where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_RectComb2.hs b/Sound/SC3/UGen/Record/PV_RectComb2.hs
--- a/Sound/SC3/UGen/Record/PV_RectComb2.hs
+++ b/Sound/SC3/UGen/Record/PV_RectComb2.hs
@@ -1,3 +1,4 @@
+-- | Make gaps in spectrum.
 module Sound.SC3.UGen.Record.PV_RectComb2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PV_SoftWipe.hs b/Sound/SC3/UGen/Record/PV_SoftWipe.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_SoftWipe.hs
@@ -0,0 +1,19 @@
+-- | combine low and high bins from two inputs with interpolation
+module Sound.SC3.UGen.Record.PV_SoftWipe where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_SoftWipe = PV_SoftWipe {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen,
+  wipe :: S.UGen
+  } deriving (Show)
+pV_SoftWipe :: PV_SoftWipe
+pV_SoftWipe = PV_SoftWipe {
+  bufferA = 0.0,
+  bufferB = 0.0,
+  wipe = 0.0
+  }
+mkPV_SoftWipe :: PV_SoftWipe -> S.UGen
+mkPV_SoftWipe (PV_SoftWipe  a' b' c') = S.mkOsc S.KR "PV_SoftWipe" [a',b',c'] 1
+instance Make PV_SoftWipe where
+  ugen = mkPV_SoftWipe
diff --git a/Sound/SC3/UGen/Record/PV_SpectralEnhance.hs b/Sound/SC3/UGen/Record/PV_SpectralEnhance.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_SpectralEnhance.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_SpectralEnhance where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_SpectralEnhance = PV_SpectralEnhance {
+  buffer :: S.UGen,
+  numPartials :: S.UGen,
+  ratio :: S.UGen,
+  strength :: S.UGen
+  } deriving (Show)
+pV_SpectralEnhance :: PV_SpectralEnhance
+pV_SpectralEnhance = PV_SpectralEnhance {
+  buffer = 0.0,
+  numPartials = 8.0,
+  ratio = 2.0,
+  strength = 0.1
+  }
+mkPV_SpectralEnhance :: PV_SpectralEnhance -> S.UGen
+mkPV_SpectralEnhance (PV_SpectralEnhance  a' b' c' d') = S.mkOsc S.KR "PV_SpectralEnhance" [a',b',c',d'] 1
+instance Make PV_SpectralEnhance where
+  ugen = mkPV_SpectralEnhance
diff --git a/Sound/SC3/UGen/Record/PV_SpectralMap.hs b/Sound/SC3/UGen/Record/PV_SpectralMap.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_SpectralMap.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_SpectralMap where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_SpectralMap = PV_SpectralMap {
+  buffer :: S.UGen,
+  specBuffer :: S.UGen,
+  floor_ :: S.UGen,
+  freeze :: S.UGen,
+  mode :: S.UGen,
+  norm :: S.UGen,
+  window :: S.UGen
+  } deriving (Show)
+pV_SpectralMap :: PV_SpectralMap
+pV_SpectralMap = PV_SpectralMap {
+  buffer = 0.0,
+  specBuffer = 0.0,
+  floor_ = 0.0,
+  freeze = 0.0,
+  mode = 0.0,
+  norm = 0.0,
+  window = 0.0
+  }
+mkPV_SpectralMap :: PV_SpectralMap -> S.UGen
+mkPV_SpectralMap (PV_SpectralMap  a' b' c' d' e' f' g') = S.mkOsc S.KR "PV_SpectralMap" [a',b',c',d',e',f',g'] 1
+instance Make PV_SpectralMap where
+  ugen = mkPV_SpectralMap
diff --git a/Sound/SC3/UGen/Record/PV_Whiten.hs b/Sound/SC3/UGen/Record/PV_Whiten.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_Whiten.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PV_Whiten where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_Whiten = PV_Whiten {
+  chain :: S.UGen,
+  trackbufnum :: S.UGen,
+  relaxtime :: S.UGen,
+  floor_ :: S.UGen,
+  smear :: S.UGen,
+  bindownsample :: S.UGen
+  } deriving (Show)
+pV_Whiten :: PV_Whiten
+pV_Whiten = PV_Whiten {
+  chain = 0.0,
+  trackbufnum = 0.0,
+  relaxtime = 2.0,
+  floor_ = 0.1,
+  smear = 0.0,
+  bindownsample = 0.0
+  }
+mkPV_Whiten :: PV_Whiten -> S.UGen
+mkPV_Whiten (PV_Whiten  a' b' c' d' e' f') = S.mkOsc S.KR "PV_Whiten" [a',b',c',d',e',f'] 1
+instance Make PV_Whiten where
+  ugen = mkPV_Whiten
diff --git a/Sound/SC3/UGen/Record/PV_XFade.hs b/Sound/SC3/UGen/Record/PV_XFade.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PV_XFade.hs
@@ -0,0 +1,19 @@
+-- | one kind of spectral morphing
+module Sound.SC3.UGen.Record.PV_XFade where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PV_XFade = PV_XFade {
+  bufferA :: S.UGen,
+  bufferB :: S.UGen,
+  fade :: S.UGen
+  } deriving (Show)
+pV_XFade :: PV_XFade
+pV_XFade = PV_XFade {
+  bufferA = 0.0,
+  bufferB = 0.0,
+  fade = 0.0
+  }
+mkPV_XFade :: PV_XFade -> S.UGen
+mkPV_XFade (PV_XFade  a' b' c') = S.mkOsc S.KR "PV_XFade" [a',b',c'] 1
+instance Make PV_XFade where
+  ugen = mkPV_XFade
diff --git a/Sound/SC3/UGen/Record/Pan2.hs b/Sound/SC3/UGen/Record/Pan2.hs
--- a/Sound/SC3/UGen/Record/Pan2.hs
+++ b/Sound/SC3/UGen/Record/Pan2.hs
@@ -1,3 +1,4 @@
+-- | Two channel equal power pan.
 module Sound.SC3.UGen.Record.Pan2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Pan4.hs b/Sound/SC3/UGen/Record/Pan4.hs
--- a/Sound/SC3/UGen/Record/Pan4.hs
+++ b/Sound/SC3/UGen/Record/Pan4.hs
@@ -1,3 +1,4 @@
+-- | Four channel equal power pan.
 module Sound.SC3.UGen.Record.Pan4 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PanAz.hs b/Sound/SC3/UGen/Record/PanAz.hs
--- a/Sound/SC3/UGen/Record/PanAz.hs
+++ b/Sound/SC3/UGen/Record/PanAz.hs
@@ -1,9 +1,9 @@
+-- | Azimuth panner
 module Sound.SC3.UGen.Record.PanAz where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data PanAz = PanAz {
   rate :: S.Rate,
-  numChans :: S.UGen,
   input :: S.UGen,
   pos :: S.UGen,
   level :: S.UGen,
@@ -13,7 +13,6 @@
 panAz :: PanAz
 panAz = PanAz {
   rate = S.AR,
-  numChans = 0.0,
   input = 0.0,
   pos = 0.0,
   level = 1.0,
@@ -21,6 +20,6 @@
   orientation = 0.5
   }
 mkPanAz :: PanAz -> S.UGen
-mkPanAz (PanAz r a' b' c' d' e' f') = S.mkOsc r "PanAz" [a',b',c',d',e',f'] 1
+mkPanAz (PanAz r a' b' c' d' e') = S.mkOsc r "PanAz" [a',b',c',d',e'] undefined
 instance Make PanAz where
   ugen = mkPanAz
diff --git a/Sound/SC3/UGen/Record/PanB.hs b/Sound/SC3/UGen/Record/PanB.hs
--- a/Sound/SC3/UGen/Record/PanB.hs
+++ b/Sound/SC3/UGen/Record/PanB.hs
@@ -1,3 +1,4 @@
+-- | Ambisonic B-format panner.
 module Sound.SC3.UGen.Record.PanB where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PanB2.hs b/Sound/SC3/UGen/Record/PanB2.hs
--- a/Sound/SC3/UGen/Record/PanB2.hs
+++ b/Sound/SC3/UGen/Record/PanB2.hs
@@ -1,3 +1,4 @@
+-- | 2D Ambisonic B-format panner.
 module Sound.SC3.UGen.Record.PanB2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PanX.hs b/Sound/SC3/UGen/Record/PanX.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PanX.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PanX where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PanX = PanX {
+  rate :: S.Rate,
+  input :: S.UGen,
+  pos :: S.UGen,
+  level :: S.UGen,
+  width :: S.UGen
+  } deriving (Show)
+panX :: PanX
+panX = PanX {
+  rate = S.AR,
+  input = 0.0,
+  pos = 0.0,
+  level = 1.0,
+  width = 2.0
+  }
+mkPanX :: PanX -> S.UGen
+mkPanX (PanX r a' b' c' d') = S.mkOsc r "PanX" [a',b',c',d'] 1
+instance Make PanX where
+  ugen = mkPanX
diff --git a/Sound/SC3/UGen/Record/PanX2D.hs b/Sound/SC3/UGen/Record/PanX2D.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PanX2D.hs
@@ -0,0 +1,31 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PanX2D where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PanX2D = PanX2D {
+  rate :: S.Rate,
+  numChansX :: S.UGen,
+  numChansY :: S.UGen,
+  input :: S.UGen,
+  posX :: S.UGen,
+  posY :: S.UGen,
+  level :: S.UGen,
+  widthX :: S.UGen,
+  widthY :: S.UGen
+  } deriving (Show)
+panX2D :: PanX2D
+panX2D = PanX2D {
+  rate = S.AR,
+  numChansX = 0.0,
+  numChansY = 0.0,
+  input = 0.0,
+  posX = 0.0,
+  posY = 0.0,
+  level = 1.0,
+  widthX = 2.0,
+  widthY = 2.0
+  }
+mkPanX2D :: PanX2D -> S.UGen
+mkPanX2D (PanX2D r a' b' c' d' e' f' g' h') = S.mkOsc r "PanX2D" [a',b',c',d',e',f',g',h'] 1
+instance Make PanX2D where
+  ugen = mkPanX2D
diff --git a/Sound/SC3/UGen/Record/PartConv.hs b/Sound/SC3/UGen/Record/PartConv.hs
--- a/Sound/SC3/UGen/Record/PartConv.hs
+++ b/Sound/SC3/UGen/Record/PartConv.hs
@@ -1,3 +1,4 @@
+-- | Real-time partitioned convolution
 module Sound.SC3.UGen.Record.PartConv where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Pause.hs b/Sound/SC3/UGen/Record/Pause.hs
--- a/Sound/SC3/UGen/Record/Pause.hs
+++ b/Sound/SC3/UGen/Record/Pause.hs
@@ -1,3 +1,4 @@
+-- | When triggered, pauses a node.
 module Sound.SC3.UGen.Record.Pause where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PauseSelf.hs b/Sound/SC3/UGen/Record/PauseSelf.hs
--- a/Sound/SC3/UGen/Record/PauseSelf.hs
+++ b/Sound/SC3/UGen/Record/PauseSelf.hs
@@ -1,3 +1,4 @@
+-- | When triggered, pause enclosing synth.
 module Sound.SC3.UGen.Record.PauseSelf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PauseSelfWhenDone.hs b/Sound/SC3/UGen/Record/PauseSelfWhenDone.hs
--- a/Sound/SC3/UGen/Record/PauseSelfWhenDone.hs
+++ b/Sound/SC3/UGen/Record/PauseSelfWhenDone.hs
@@ -1,3 +1,4 @@
+-- | FIXME: PauseSelfWhenDone purpose.
 module Sound.SC3.UGen.Record.PauseSelfWhenDone where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Track peak signal amplitude.
 module Sound.SC3.UGen.Record.Peak where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PeakEQ2.hs b/Sound/SC3/UGen/Record/PeakEQ2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PeakEQ2.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PeakEQ2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PeakEQ2 = PeakEQ2 {
+  input :: S.UGen,
+  freq :: S.UGen,
+  rs :: S.UGen,
+  db :: S.UGen
+  } deriving (Show)
+peakEQ2 :: PeakEQ2
+peakEQ2 = PeakEQ2 {
+  input = 0.0,
+  freq = 1200.0,
+  rs = 1.0,
+  db = 0.0
+  }
+mkPeakEQ2 :: PeakEQ2 -> S.UGen
+mkPeakEQ2 (PeakEQ2  a' b' c' d') = S.mkOsc S.AR "PeakEQ2" [a',b',c',d'] 1
+instance Make PeakEQ2 where
+  ugen = mkPeakEQ2
diff --git a/Sound/SC3/UGen/Record/PeakEQ4.hs b/Sound/SC3/UGen/Record/PeakEQ4.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PeakEQ4.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PeakEQ4 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PeakEQ4 = PeakEQ4 {
+  input :: S.UGen,
+  freq :: S.UGen,
+  rs :: S.UGen,
+  db :: S.UGen
+  } deriving (Show)
+peakEQ4 :: PeakEQ4
+peakEQ4 = PeakEQ4 {
+  input = 0.0,
+  freq = 1200.0,
+  rs = 1.0,
+  db = 0.0
+  }
+mkPeakEQ4 :: PeakEQ4 -> S.UGen
+mkPeakEQ4 (PeakEQ4  a' b' c' d') = S.mkOsc S.AR "PeakEQ4" [a',b',c',d'] 1
+instance Make PeakEQ4 where
+  ugen = mkPeakEQ4
diff --git a/Sound/SC3/UGen/Record/PeakFollower.hs b/Sound/SC3/UGen/Record/PeakFollower.hs
--- a/Sound/SC3/UGen/Record/PeakFollower.hs
+++ b/Sound/SC3/UGen/Record/PeakFollower.hs
@@ -1,3 +1,4 @@
+-- | Track peak signal amplitude.
 module Sound.SC3.UGen.Record.PeakFollower where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Perlin3.hs b/Sound/SC3/UGen/Record/Perlin3.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Perlin3.hs
@@ -0,0 +1,21 @@
+-- | 3D Perlin Noise
+module Sound.SC3.UGen.Record.Perlin3 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Perlin3 = Perlin3 {
+  rate :: S.Rate,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen
+  } deriving (Show)
+perlin3 :: Perlin3
+perlin3 = Perlin3 {
+  rate = S.AR,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0
+  }
+mkPerlin3 :: Perlin3 -> S.UGen
+mkPerlin3 (Perlin3 r a' b' c') = S.mkOsc r "Perlin3" [a',b',c'] 1
+instance Make Perlin3 where
+  ugen = mkPerlin3
diff --git a/Sound/SC3/UGen/Record/Phasor.hs b/Sound/SC3/UGen/Record/Phasor.hs
--- a/Sound/SC3/UGen/Record/Phasor.hs
+++ b/Sound/SC3/UGen/Record/Phasor.hs
@@ -1,3 +1,4 @@
+-- | A resettable linear ramp between two levels.
 module Sound.SC3.UGen.Record.Phasor where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Autocorrelation pitch follower
 module Sound.SC3.UGen.Record.Pitch where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PitchShift.hs b/Sound/SC3/UGen/Record/PitchShift.hs
--- a/Sound/SC3/UGen/Record/PitchShift.hs
+++ b/Sound/SC3/UGen/Record/PitchShift.hs
@@ -1,3 +1,4 @@
+-- | Time domain pitch shifter.
 module Sound.SC3.UGen.Record.PitchShift where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PlaneTree.hs b/Sound/SC3/UGen/Record/PlaneTree.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PlaneTree.hs
@@ -0,0 +1,19 @@
+-- | Tree classifier using (hyper)planes – UGen or language-side
+module Sound.SC3.UGen.Record.PlaneTree where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PlaneTree = PlaneTree {
+  treebuf :: S.UGen,
+  input :: S.UGen,
+  gate :: S.UGen
+  } deriving (Show)
+planeTree :: PlaneTree
+planeTree = PlaneTree {
+  treebuf = 0.0,
+  input = 0.0,
+  gate = 1.0
+  }
+mkPlaneTree :: PlaneTree -> S.UGen
+mkPlaneTree (PlaneTree  a' b' c') = S.mkOsc S.KR "PlaneTree" [a',b',c'] 1
+instance Make PlaneTree where
+  ugen = mkPlaneTree
diff --git a/Sound/SC3/UGen/Record/PlayBuf.hs b/Sound/SC3/UGen/Record/PlayBuf.hs
--- a/Sound/SC3/UGen/Record/PlayBuf.hs
+++ b/Sound/SC3/UGen/Record/PlayBuf.hs
@@ -1,9 +1,9 @@
+-- | Sample playback oscillator.
 module Sound.SC3.UGen.Record.PlayBuf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data PlayBuf = PlayBuf {
   rate :: S.Rate,
-  numChannels :: S.UGen,
   bufnum :: S.UGen,
   rate_ :: S.UGen,
   trigger :: S.UGen,
@@ -14,7 +14,6 @@
 playBuf :: PlayBuf
 playBuf = PlayBuf {
   rate = S.AR,
-  numChannels = 0.0,
   bufnum = 0.0,
   rate_ = 1.0,
   trigger = 1.0,
@@ -23,6 +22,6 @@
   doneAction = 0.0
   }
 mkPlayBuf :: PlayBuf -> S.UGen
-mkPlayBuf (PlayBuf r a' b' c' d' e' f' g') = S.mkOsc r "PlayBuf" [a',b',c',d',e',f',g'] 1
+mkPlayBuf (PlayBuf r a' b' c' d' e' f') = S.mkOsc r "PlayBuf" [a',b',c',d',e',f'] 1
 instance Make PlayBuf where
   ugen = mkPlayBuf
diff --git a/Sound/SC3/UGen/Record/Pluck.hs b/Sound/SC3/UGen/Record/Pluck.hs
--- a/Sound/SC3/UGen/Record/Pluck.hs
+++ b/Sound/SC3/UGen/Record/Pluck.hs
@@ -1,3 +1,4 @@
+-- | A Karplus-Strong UGen
 module Sound.SC3.UGen.Record.Pluck where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PosRatio.hs b/Sound/SC3/UGen/Record/PosRatio.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PosRatio.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PosRatio where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PosRatio = PosRatio {
+  input :: S.UGen,
+  period :: S.UGen,
+  thresh :: S.UGen
+  } deriving (Show)
+posRatio :: PosRatio
+posRatio = PosRatio {
+  input = 0.0,
+  period = 100.0,
+  thresh = 0.1
+  }
+mkPosRatio :: PosRatio -> S.UGen
+mkPosRatio (PosRatio  a' b' c') = S.mkOsc S.AR "PosRatio" [a',b',c'] 1
+instance Make PosRatio where
+  ugen = mkPosRatio
diff --git a/Sound/SC3/UGen/Record/PrintVal.hs b/Sound/SC3/UGen/Record/PrintVal.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/PrintVal.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.PrintVal where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data PrintVal = PrintVal {
+  input :: S.UGen,
+  numblocks :: S.UGen,
+  id_ :: S.UGen
+  } deriving (Show)
+printVal :: PrintVal
+printVal = PrintVal {
+  input = 0.0,
+  numblocks = 100.0,
+  id_ = 0.0
+  }
+mkPrintVal :: PrintVal -> S.UGen
+mkPrintVal (PrintVal  a' b' c') = S.mkOsc S.KR "PrintVal" [a',b',c'] 1
+instance Make PrintVal where
+  ugen = mkPrintVal
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
@@ -1,3 +1,4 @@
+-- | Band limited pulse wave.
 module Sound.SC3.UGen.Record.Pulse where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PulseCount.hs b/Sound/SC3/UGen/Record/PulseCount.hs
--- a/Sound/SC3/UGen/Record/PulseCount.hs
+++ b/Sound/SC3/UGen/Record/PulseCount.hs
@@ -1,3 +1,4 @@
+-- | Pulse counter.
 module Sound.SC3.UGen.Record.PulseCount where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/PulseDivider.hs b/Sound/SC3/UGen/Record/PulseDivider.hs
--- a/Sound/SC3/UGen/Record/PulseDivider.hs
+++ b/Sound/SC3/UGen/Record/PulseDivider.hs
@@ -1,3 +1,4 @@
+-- | Pulse divider.
 module Sound.SC3.UGen.Record.PulseDivider where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Qitch.hs b/Sound/SC3/UGen/Record/Qitch.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Qitch.hs
@@ -0,0 +1,27 @@
+-- | constant Q transform pitch follower
+module Sound.SC3.UGen.Record.Qitch where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Qitch = Qitch {
+  input :: S.UGen,
+  databufnum :: S.UGen,
+  ampThreshold :: S.UGen,
+  algoflag :: S.UGen,
+  ampbufnum :: S.UGen,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen
+  } deriving (Show)
+qitch :: Qitch
+qitch = Qitch {
+  input = 0.0,
+  databufnum = 0.0,
+  ampThreshold = 0.01,
+  algoflag = 1.0,
+  ampbufnum = 0.0,
+  minfreq = 0.0,
+  maxfreq = 2500.0
+  }
+mkQitch :: Qitch -> S.UGen
+mkQitch (Qitch  a' b' c' d' e' f' g') = S.mkOsc S.KR "Qitch" [a',b',c',d',e',f',g'] 2
+instance Make Qitch where
+  ugen = mkQitch
diff --git a/Sound/SC3/UGen/Record/QuadC.hs b/Sound/SC3/UGen/Record/QuadC.hs
--- a/Sound/SC3/UGen/Record/QuadC.hs
+++ b/Sound/SC3/UGen/Record/QuadC.hs
@@ -1,3 +1,4 @@
+-- | General quadratic map chaotic generator
 module Sound.SC3.UGen.Record.QuadC where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/QuadL.hs b/Sound/SC3/UGen/Record/QuadL.hs
--- a/Sound/SC3/UGen/Record/QuadL.hs
+++ b/Sound/SC3/UGen/Record/QuadL.hs
@@ -1,3 +1,4 @@
+-- | General quadratic map chaotic generator
 module Sound.SC3.UGen.Record.QuadL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/QuadN.hs b/Sound/SC3/UGen/Record/QuadN.hs
--- a/Sound/SC3/UGen/Record/QuadN.hs
+++ b/Sound/SC3/UGen/Record/QuadN.hs
@@ -1,3 +1,4 @@
+-- | General quadratic map chaotic generator
 module Sound.SC3.UGen.Record.QuadN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/RHPF.hs b/Sound/SC3/UGen/Record/RHPF.hs
--- a/Sound/SC3/UGen/Record/RHPF.hs
+++ b/Sound/SC3/UGen/Record/RHPF.hs
@@ -1,3 +1,4 @@
+-- | A resonant high pass filter.
 module Sound.SC3.UGen.Record.RHPF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/RLPF.hs b/Sound/SC3/UGen/Record/RLPF.hs
--- a/Sound/SC3/UGen/Record/RLPF.hs
+++ b/Sound/SC3/UGen/Record/RLPF.hs
@@ -1,3 +1,4 @@
+-- | A resonant low pass filter.
 module Sound.SC3.UGen.Record.RLPF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/RLPFD.hs b/Sound/SC3/UGen/Record/RLPFD.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/RLPFD.hs
@@ -0,0 +1,23 @@
+-- | TB303 Filter Emulation
+module Sound.SC3.UGen.Record.RLPFD where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data RLPFD = RLPFD {
+  rate :: S.Rate,
+  input :: S.UGen,
+  ffreq :: S.UGen,
+  res :: S.UGen,
+  dist :: S.UGen
+  } deriving (Show)
+rLPFD :: RLPFD
+rLPFD = RLPFD {
+  rate = S.AR,
+  input = 0.0,
+  ffreq = 440.0,
+  res = 0.0,
+  dist = 0.0
+  }
+mkRLPFD :: RLPFD -> S.UGen
+mkRLPFD (RLPFD r a' b' c' d') = S.mkOsc r "RLPFD" [a',b',c',d'] 1
+instance Make RLPFD where
+  ugen = mkRLPFD
diff --git a/Sound/SC3/UGen/Record/RMAFoodChainL.hs b/Sound/SC3/UGen/Record/RMAFoodChainL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/RMAFoodChainL.hs
@@ -0,0 +1,39 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.RMAFoodChainL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data RMAFoodChainL = RMAFoodChainL {
+  freq :: S.UGen,
+  a1 :: S.UGen,
+  b1 :: S.UGen,
+  d1 :: S.UGen,
+  a2 :: S.UGen,
+  b2 :: S.UGen,
+  d2 :: S.UGen,
+  k :: S.UGen,
+  r :: S.UGen,
+  h :: S.UGen,
+  xi :: S.UGen,
+  yi :: S.UGen,
+  zi :: S.UGen
+  } deriving (Show)
+rMAFoodChainL :: RMAFoodChainL
+rMAFoodChainL = RMAFoodChainL {
+  freq = 22050.0,
+  a1 = 5.0,
+  b1 = 3.0,
+  d1 = 0.4,
+  a2 = 0.1,
+  b2 = 2.0,
+  d2 = 0.01,
+  k = 1.0943,
+  r = 0.8904,
+  h = 0.05,
+  xi = 0.1,
+  yi = 0.0,
+  zi = 0.0
+  }
+mkRMAFoodChainL :: RMAFoodChainL -> S.UGen
+mkRMAFoodChainL (RMAFoodChainL  a' b' c' d' e' f' g' h' i' j' k' l' m') = S.mkOsc S.AR "RMAFoodChainL" [a',b',c',d',e',f',g',h',i',j',k',l',m'] 3
+instance Make RMAFoodChainL where
+  ugen = mkRMAFoodChainL
diff --git a/Sound/SC3/UGen/Record/RMEQ.hs b/Sound/SC3/UGen/Record/RMEQ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/RMEQ.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.RMEQ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data RMEQ = RMEQ {
+  input :: S.UGen,
+  freq :: S.UGen,
+  rq :: S.UGen,
+  k :: S.UGen
+  } deriving (Show)
+rMEQ :: RMEQ
+rMEQ = RMEQ {
+  input = 0.0,
+  freq = 440.0,
+  rq = 0.1,
+  k = 0.0
+  }
+mkRMEQ :: RMEQ -> S.UGen
+mkRMEQ (RMEQ  a' b' c' d') = S.mkOsc S.AR "RMEQ" [a',b',c',d'] 1
+instance Make RMEQ where
+  ugen = mkRMEQ
diff --git a/Sound/SC3/UGen/Record/RMEQSuite.hs b/Sound/SC3/UGen/Record/RMEQSuite.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/RMEQSuite.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.RMEQSuite where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data RMEQSuite = RMEQSuite {
+  maxSize :: S.UGen
+  } deriving (Show)
+rMEQSuite :: RMEQSuite
+rMEQSuite = RMEQSuite {
+  maxSize = 0.0
+  }
+mkRMEQSuite :: RMEQSuite -> S.UGen
+mkRMEQSuite (RMEQSuite  a') = S.mkOsc S.AR "RMEQSuite" [a'] 1
+instance Make RMEQSuite where
+  ugen = mkRMEQSuite
diff --git a/Sound/SC3/UGen/Record/RMShelf.hs b/Sound/SC3/UGen/Record/RMShelf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/RMShelf.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.RMShelf where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data RMShelf = RMShelf {
+  input :: S.UGen,
+  freq :: S.UGen,
+  k :: S.UGen
+  } deriving (Show)
+rMShelf :: RMShelf
+rMShelf = RMShelf {
+  input = 0.0,
+  freq = 440.0,
+  k = 0.0
+  }
+mkRMShelf :: RMShelf -> S.UGen
+mkRMShelf (RMShelf  a' b' c') = S.mkOsc S.AR "RMShelf" [a',b',c'] 1
+instance Make RMShelf where
+  ugen = mkRMShelf
diff --git a/Sound/SC3/UGen/Record/RMShelf2.hs b/Sound/SC3/UGen/Record/RMShelf2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/RMShelf2.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.RMShelf2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data RMShelf2 = RMShelf2 {
+  input :: S.UGen,
+  freq :: S.UGen,
+  k :: S.UGen
+  } deriving (Show)
+rMShelf2 :: RMShelf2
+rMShelf2 = RMShelf2 {
+  input = 0.0,
+  freq = 440.0,
+  k = 0.0
+  }
+mkRMShelf2 :: RMShelf2 -> S.UGen
+mkRMShelf2 (RMShelf2  a' b' c') = S.mkOsc S.AR "RMShelf2" [a',b',c'] 1
+instance Make RMShelf2 where
+  ugen = mkRMShelf2
diff --git a/Sound/SC3/UGen/Record/Ramp.hs b/Sound/SC3/UGen/Record/Ramp.hs
--- a/Sound/SC3/UGen/Record/Ramp.hs
+++ b/Sound/SC3/UGen/Record/Ramp.hs
@@ -1,3 +1,4 @@
+-- | Break a continuous signal into line segments
 module Sound.SC3.UGen.Record.Ramp where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Rand.hs b/Sound/SC3/UGen/Record/Rand.hs
--- a/Sound/SC3/UGen/Record/Rand.hs
+++ b/Sound/SC3/UGen/Record/Rand.hs
@@ -1,3 +1,4 @@
+-- | Single random number generator.
 module Sound.SC3.UGen.Record.Rand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/RandID.hs b/Sound/SC3/UGen/Record/RandID.hs
--- a/Sound/SC3/UGen/Record/RandID.hs
+++ b/Sound/SC3/UGen/Record/RandID.hs
@@ -1,3 +1,4 @@
+-- | Set the synth's random generator ID.
 module Sound.SC3.UGen.Record.RandID where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/RandSeed.hs b/Sound/SC3/UGen/Record/RandSeed.hs
--- a/Sound/SC3/UGen/Record/RandSeed.hs
+++ b/Sound/SC3/UGen/Record/RandSeed.hs
@@ -1,3 +1,4 @@
+-- | Sets the synth's random generator seed.
 module Sound.SC3.UGen.Record.RandSeed where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/RecordBuf.hs b/Sound/SC3/UGen/Record/RecordBuf.hs
--- a/Sound/SC3/UGen/Record/RecordBuf.hs
+++ b/Sound/SC3/UGen/Record/RecordBuf.hs
@@ -1,3 +1,4 @@
+-- | Record or overdub into a Buffer.
 module Sound.SC3.UGen.Record.RecordBuf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/RegaliaMitraEQ.hs b/Sound/SC3/UGen/Record/RegaliaMitraEQ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/RegaliaMitraEQ.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.RegaliaMitraEQ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data RegaliaMitraEQ = RegaliaMitraEQ {
+  input :: S.UGen,
+  freq :: S.UGen,
+  rq :: S.UGen,
+  k :: S.UGen
+  } deriving (Show)
+regaliaMitraEQ :: RegaliaMitraEQ
+regaliaMitraEQ = RegaliaMitraEQ {
+  input = 0.0,
+  freq = 440.0,
+  rq = 0.1,
+  k = 0.0
+  }
+mkRegaliaMitraEQ :: RegaliaMitraEQ -> S.UGen
+mkRegaliaMitraEQ (RegaliaMitraEQ  a' b' c' d') = S.mkOsc S.AR "RegaliaMitraEQ" [a',b',c',d'] 1
+instance Make RegaliaMitraEQ where
+  ugen = mkRegaliaMitraEQ
diff --git a/Sound/SC3/UGen/Record/ReplaceOut.hs b/Sound/SC3/UGen/Record/ReplaceOut.hs
--- a/Sound/SC3/UGen/Record/ReplaceOut.hs
+++ b/Sound/SC3/UGen/Record/ReplaceOut.hs
@@ -1,3 +1,4 @@
+-- | Send signal to a bus, overwriting previous contents.
 module Sound.SC3.UGen.Record.ReplaceOut where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Resonz.hs b/Sound/SC3/UGen/Record/Resonz.hs
--- a/Sound/SC3/UGen/Record/Resonz.hs
+++ b/Sound/SC3/UGen/Record/Resonz.hs
@@ -1,3 +1,4 @@
+-- | Resonant filter.
 module Sound.SC3.UGen.Record.Resonz where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Ringz.hs b/Sound/SC3/UGen/Record/Ringz.hs
--- a/Sound/SC3/UGen/Record/Ringz.hs
+++ b/Sound/SC3/UGen/Record/Ringz.hs
@@ -1,3 +1,4 @@
+-- | Ringing filter.
 module Sound.SC3.UGen.Record.Ringz where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/RosslerL.hs b/Sound/SC3/UGen/Record/RosslerL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/RosslerL.hs
@@ -0,0 +1,29 @@
+-- | Rossler chaotic generator
+module Sound.SC3.UGen.Record.RosslerL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data RosslerL = RosslerL {
+  freq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  c :: S.UGen,
+  h :: S.UGen,
+  xi :: S.UGen,
+  yi :: S.UGen,
+  zi :: S.UGen
+  } deriving (Show)
+rosslerL :: RosslerL
+rosslerL = RosslerL {
+  freq = 22050.0,
+  a = 0.2,
+  b = 0.2,
+  c = 5.7,
+  h = 0.05,
+  xi = 0.1,
+  yi = 0.0,
+  zi = 0.0
+  }
+mkRosslerL :: RosslerL -> S.UGen
+mkRosslerL (RosslerL  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "RosslerL" [a',b',c',d',e',f',g',h'] 3
+instance Make RosslerL where
+  ugen = mkRosslerL
diff --git a/Sound/SC3/UGen/Record/RosslerResL.hs b/Sound/SC3/UGen/Record/RosslerResL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/RosslerResL.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.RosslerResL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data RosslerResL = RosslerResL {
+  input :: S.UGen,
+  stiff :: S.UGen,
+  freq :: S.UGen,
+  a :: S.UGen,
+  b :: S.UGen,
+  c :: S.UGen,
+  h :: S.UGen,
+  xi :: S.UGen,
+  yi :: S.UGen,
+  zi :: S.UGen
+  } deriving (Show)
+rosslerResL :: RosslerResL
+rosslerResL = RosslerResL {
+  input = 0.0,
+  stiff = 1.0,
+  freq = 22050.0,
+  a = 0.2,
+  b = 0.2,
+  c = 5.7,
+  h = 0.05,
+  xi = 0.1,
+  yi = 0.0,
+  zi = 0.0
+  }
+mkRosslerResL :: RosslerResL -> S.UGen
+mkRosslerResL (RosslerResL  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "RosslerResL" [a',b',c',d',e',f',g',h',i',j'] 1
+instance Make RosslerResL where
+  ugen = mkRosslerResL
diff --git a/Sound/SC3/UGen/Record/Rotate.hs b/Sound/SC3/UGen/Record/Rotate.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Rotate.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Rotate where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Rotate = Rotate {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  rotate_ :: S.UGen
+  } deriving (Show)
+rotate :: Rotate
+rotate = Rotate {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  rotate_ = 0.0
+  }
+mkRotate :: Rotate -> S.UGen
+mkRotate (Rotate  a' b' c' d' e') = S.mkOsc S.AR "Rotate" [a',b',c',d',e'] 4
+instance Make Rotate where
+  ugen = mkRotate
diff --git a/Sound/SC3/UGen/Record/Rotate2.hs b/Sound/SC3/UGen/Record/Rotate2.hs
--- a/Sound/SC3/UGen/Record/Rotate2.hs
+++ b/Sound/SC3/UGen/Record/Rotate2.hs
@@ -1,3 +1,4 @@
+-- | Rotate a sound field.
 module Sound.SC3.UGen.Record.Rotate2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Track maximum level.
 module Sound.SC3.UGen.Record.RunningMax where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Track minimum level.
 module Sound.SC3.UGen.Record.RunningMin where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/RunningSum.hs b/Sound/SC3/UGen/Record/RunningSum.hs
--- a/Sound/SC3/UGen/Record/RunningSum.hs
+++ b/Sound/SC3/UGen/Record/RunningSum.hs
@@ -1,3 +1,4 @@
+-- | Running sum over n frames
 module Sound.SC3.UGen.Record.RunningSum where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SLOnset.hs b/Sound/SC3/UGen/Record/SLOnset.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SLOnset.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SLOnset where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SLOnset = SLOnset {
+  input :: S.UGen,
+  memorysize1 :: S.UGen,
+  before :: S.UGen,
+  after :: S.UGen,
+  threshold :: S.UGen,
+  hysteresis :: S.UGen
+  } deriving (Show)
+sLOnset :: SLOnset
+sLOnset = SLOnset {
+  input = 0.0,
+  memorysize1 = 20.0,
+  before = 5.0,
+  after = 5.0,
+  threshold = 10.0,
+  hysteresis = 10.0
+  }
+mkSLOnset :: SLOnset -> S.UGen
+mkSLOnset (SLOnset  a' b' c' d' e' f') = S.mkOsc S.KR "SLOnset" [a',b',c',d',e',f'] 1
+instance Make SLOnset where
+  ugen = mkSLOnset
diff --git a/Sound/SC3/UGen/Record/SMS.hs b/Sound/SC3/UGen/Record/SMS.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SMS.hs
@@ -0,0 +1,35 @@
+-- | Spectral Modeling Synthesis
+module Sound.SC3.UGen.Record.SMS where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SMS = SMS {
+  input :: S.UGen,
+  maxpeaks :: S.UGen,
+  currentpeaks :: S.UGen,
+  tolerance :: S.UGen,
+  noisefloor :: S.UGen,
+  freqmult :: S.UGen,
+  freqadd :: S.UGen,
+  formantpreserve :: S.UGen,
+  useifft :: S.UGen,
+  ampmult :: S.UGen,
+  graphicsbufnum :: S.UGen
+  } deriving (Show)
+sMS :: SMS
+sMS = SMS {
+  input = 0.0,
+  maxpeaks = 80.0,
+  currentpeaks = 80.0,
+  tolerance = 4.0,
+  noisefloor = 0.2,
+  freqmult = 1.0,
+  freqadd = 0.0,
+  formantpreserve = 0.0,
+  useifft = 0.0,
+  ampmult = 1.0,
+  graphicsbufnum = 0.0
+  }
+mkSMS :: SMS -> S.UGen
+mkSMS (SMS  a' b' c' d' e' f' g' h' i' j' k') = S.mkOsc S.AR "SMS" [a',b',c',d',e',f',g',h',i',j',k'] 2
+instance Make SMS where
+  ugen = mkSMS
diff --git a/Sound/SC3/UGen/Record/SOMAreaWr.hs b/Sound/SC3/UGen/Record/SOMAreaWr.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SOMAreaWr.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SOMAreaWr where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SOMAreaWr = SOMAreaWr {
+  bufnum :: S.UGen,
+  inputdata :: S.UGen,
+  coords :: S.UGen,
+  netsize :: S.UGen,
+  numdims :: S.UGen,
+  nhood :: S.UGen,
+  gate :: S.UGen
+  } deriving (Show)
+sOMAreaWr :: SOMAreaWr
+sOMAreaWr = SOMAreaWr {
+  bufnum = 0.0,
+  inputdata = 0.0,
+  coords = 0.0,
+  netsize = 10.0,
+  numdims = 2.0,
+  nhood = 0.5,
+  gate = 1.0
+  }
+mkSOMAreaWr :: SOMAreaWr -> S.UGen
+mkSOMAreaWr (SOMAreaWr  a' b' c' d' e' f' g') = S.mkOsc S.KR "SOMAreaWr" [a',b',c',d',e',f',g'] 1
+instance Make SOMAreaWr where
+  ugen = mkSOMAreaWr
diff --git a/Sound/SC3/UGen/Record/SOMRd.hs b/Sound/SC3/UGen/Record/SOMRd.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SOMRd.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SOMRd where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SOMRd = SOMRd {
+  rate :: S.Rate,
+  bufnum :: S.UGen,
+  inputdata :: S.UGen,
+  netsize :: S.UGen,
+  numdims :: S.UGen,
+  gate :: S.UGen
+  } deriving (Show)
+sOMRd :: SOMRd
+sOMRd = SOMRd {
+  rate = S.AR,
+  bufnum = 0.0,
+  inputdata = 0.0,
+  netsize = 10.0,
+  numdims = 2.0,
+  gate = 1.0
+  }
+mkSOMRd :: SOMRd -> S.UGen
+mkSOMRd (SOMRd r a' b' c' d' e') = S.mkOsc r "SOMRd" [a',b',c',d',e'] 1
+instance Make SOMRd where
+  ugen = mkSOMRd
diff --git a/Sound/SC3/UGen/Record/SOMTrain.hs b/Sound/SC3/UGen/Record/SOMTrain.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SOMTrain.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SOMTrain where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SOMTrain = SOMTrain {
+  bufnum :: S.UGen,
+  inputdata :: S.UGen,
+  netsize :: S.UGen,
+  numdims :: S.UGen,
+  traindur :: S.UGen,
+  nhood :: S.UGen,
+  gate :: S.UGen,
+  initweight :: S.UGen
+  } deriving (Show)
+sOMTrain :: SOMTrain
+sOMTrain = SOMTrain {
+  bufnum = 0.0,
+  inputdata = 0.0,
+  netsize = 10.0,
+  numdims = 2.0,
+  traindur = 5000.0,
+  nhood = 0.5,
+  gate = 1.0,
+  initweight = 1.0
+  }
+mkSOMTrain :: SOMTrain -> S.UGen
+mkSOMTrain (SOMTrain  a' b' c' d' e' f' g' h') = S.mkOsc S.KR "SOMTrain" [a',b',c',d',e',f',g',h'] 3
+instance Make SOMTrain where
+  ugen = mkSOMTrain
diff --git a/Sound/SC3/UGen/Record/SOS.hs b/Sound/SC3/UGen/Record/SOS.hs
--- a/Sound/SC3/UGen/Record/SOS.hs
+++ b/Sound/SC3/UGen/Record/SOS.hs
@@ -1,3 +1,4 @@
+-- | Second order filter section (biquad).
 module Sound.SC3.UGen.Record.SOS where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SVF.hs b/Sound/SC3/UGen/Record/SVF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SVF.hs
@@ -0,0 +1,31 @@
+-- | 12db/Oct State Variable Filter
+module Sound.SC3.UGen.Record.SVF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SVF = SVF {
+  rate :: S.Rate,
+  signal :: S.UGen,
+  cutoff :: S.UGen,
+  res :: S.UGen,
+  lowpass :: S.UGen,
+  bandpass :: S.UGen,
+  highpass :: S.UGen,
+  notch :: S.UGen,
+  peak :: S.UGen
+  } deriving (Show)
+sVF :: SVF
+sVF = SVF {
+  rate = S.AR,
+  signal = 0.0,
+  cutoff = 2200.0,
+  res = 0.1,
+  lowpass = 1.0,
+  bandpass = 0.0,
+  highpass = 0.0,
+  notch = 0.0,
+  peak = 0.0
+  }
+mkSVF :: SVF -> S.UGen
+mkSVF (SVF r a' b' c' d' e' f' g' h') = S.mkOsc r "SVF" [a',b',c',d',e',f',g',h'] 1
+instance Make SVF where
+  ugen = mkSVF
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
@@ -1,3 +1,4 @@
+-- | Band limited sawtooth.
 module Sound.SC3.UGen.Record.Saw where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SawDPW.hs b/Sound/SC3/UGen/Record/SawDPW.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SawDPW.hs
@@ -0,0 +1,19 @@
+-- | super-efficient sawtooth oscillator with low aliasing
+module Sound.SC3.UGen.Record.SawDPW where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SawDPW = SawDPW {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  iphase :: S.UGen
+  } deriving (Show)
+sawDPW :: SawDPW
+sawDPW = SawDPW {
+  rate = S.AR,
+  freq = 440.0,
+  iphase = 0.0
+  }
+mkSawDPW :: SawDPW -> S.UGen
+mkSawDPW (SawDPW r a' b') = S.mkOsc r "SawDPW" [a',b'] 1
+instance Make SawDPW where
+  ugen = mkSawDPW
diff --git a/Sound/SC3/UGen/Record/Schmidt.hs b/Sound/SC3/UGen/Record/Schmidt.hs
--- a/Sound/SC3/UGen/Record/Schmidt.hs
+++ b/Sound/SC3/UGen/Record/Schmidt.hs
@@ -1,3 +1,4 @@
+-- | Schmidt trigger.
 module Sound.SC3.UGen.Record.Schmidt where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ScopeOut.hs b/Sound/SC3/UGen/Record/ScopeOut.hs
--- a/Sound/SC3/UGen/Record/ScopeOut.hs
+++ b/Sound/SC3/UGen/Record/ScopeOut.hs
@@ -1,3 +1,4 @@
+-- | FIXME: ScopeOut purpose.
 module Sound.SC3.UGen.Record.ScopeOut where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ScopeOut2.hs b/Sound/SC3/UGen/Record/ScopeOut2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/ScopeOut2.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.ScopeOut2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data ScopeOut2 = ScopeOut2 {
+  rate :: S.Rate,
+  inputArray :: S.UGen,
+  scopeNum :: S.UGen,
+  maxFrames :: S.UGen,
+  scopeFrames :: S.UGen
+  } deriving (Show)
+scopeOut2 :: ScopeOut2
+scopeOut2 = ScopeOut2 {
+  rate = S.AR,
+  inputArray = 0.0,
+  scopeNum = 0.0,
+  maxFrames = 4096.0,
+  scopeFrames = 0.0
+  }
+mkScopeOut2 :: ScopeOut2 -> S.UGen
+mkScopeOut2 (ScopeOut2 r a' b' c' d') = S.mkOsc r "ScopeOut2" [a',b',c',d'] 1
+instance Make ScopeOut2 where
+  ugen = mkScopeOut2
diff --git a/Sound/SC3/UGen/Record/Select.hs b/Sound/SC3/UGen/Record/Select.hs
--- a/Sound/SC3/UGen/Record/Select.hs
+++ b/Sound/SC3/UGen/Record/Select.hs
@@ -1,3 +1,4 @@
+-- | Select output from an array of inputs.
 module Sound.SC3.UGen.Record.Select where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SendTrig.hs b/Sound/SC3/UGen/Record/SendTrig.hs
--- a/Sound/SC3/UGen/Record/SendTrig.hs
+++ b/Sound/SC3/UGen/Record/SendTrig.hs
@@ -1,3 +1,4 @@
+-- | Send a trigger message from the server back to the client.
 module Sound.SC3.UGen.Record.SendTrig where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SetBuf.hs b/Sound/SC3/UGen/Record/SetBuf.hs
--- a/Sound/SC3/UGen/Record/SetBuf.hs
+++ b/Sound/SC3/UGen/Record/SetBuf.hs
@@ -1,3 +1,4 @@
+-- | (not documented)
 module Sound.SC3.UGen.Record.SetBuf where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SetResetFF.hs b/Sound/SC3/UGen/Record/SetResetFF.hs
--- a/Sound/SC3/UGen/Record/SetResetFF.hs
+++ b/Sound/SC3/UGen/Record/SetResetFF.hs
@@ -1,3 +1,4 @@
+-- | Set-reset flip flop.
 module Sound.SC3.UGen.Record.SetResetFF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Shaper.hs b/Sound/SC3/UGen/Record/Shaper.hs
--- a/Sound/SC3/UGen/Record/Shaper.hs
+++ b/Sound/SC3/UGen/Record/Shaper.hs
@@ -1,3 +1,4 @@
+-- | Wave shaper.
 module Sound.SC3.UGen.Record.Shaper where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Sieve1.hs b/Sound/SC3/UGen/Record/Sieve1.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Sieve1.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Sieve1 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Sieve1 = Sieve1 {
+  rate :: S.Rate,
+  bufnum :: S.UGen,
+  gap :: S.UGen,
+  alternate :: S.UGen
+  } deriving (Show)
+sieve1 :: Sieve1
+sieve1 = Sieve1 {
+  rate = S.AR,
+  bufnum = 0.0,
+  gap = 2.0,
+  alternate = 1.0
+  }
+mkSieve1 :: Sieve1 -> S.UGen
+mkSieve1 (Sieve1 r a' b' c') = S.mkOsc r "Sieve1" [a',b',c'] 1
+instance Make Sieve1 where
+  ugen = mkSieve1
diff --git a/Sound/SC3/UGen/Record/SinGrain.hs b/Sound/SC3/UGen/Record/SinGrain.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SinGrain.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SinGrain where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SinGrain = SinGrain {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  freq :: S.UGen
+  } deriving (Show)
+sinGrain :: SinGrain
+sinGrain = SinGrain {
+  trigger = 0.0,
+  dur = 1.0,
+  freq = 440.0
+  }
+mkSinGrain :: SinGrain -> S.UGen
+mkSinGrain (SinGrain  a' b' c') = S.mkOsc S.AR "SinGrain" [a',b',c'] 1
+instance Make SinGrain where
+  ugen = mkSinGrain
diff --git a/Sound/SC3/UGen/Record/SinGrainB.hs b/Sound/SC3/UGen/Record/SinGrainB.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SinGrainB.hs
@@ -0,0 +1,21 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SinGrainB where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SinGrainB = SinGrainB {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  freq :: S.UGen,
+  envbuf :: S.UGen
+  } deriving (Show)
+sinGrainB :: SinGrainB
+sinGrainB = SinGrainB {
+  trigger = 0.0,
+  dur = 1.0,
+  freq = 440.0,
+  envbuf = 0.0
+  }
+mkSinGrainB :: SinGrainB -> S.UGen
+mkSinGrainB (SinGrainB  a' b' c' d') = S.mkOsc S.AR "SinGrainB" [a',b',c',d'] 1
+instance Make SinGrainB where
+  ugen = mkSinGrainB
diff --git a/Sound/SC3/UGen/Record/SinGrainBBF.hs b/Sound/SC3/UGen/Record/SinGrainBBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SinGrainBBF.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SinGrainBBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SinGrainBBF = SinGrainBBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  freq :: S.UGen,
+  envbuf :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+sinGrainBBF :: SinGrainBBF
+sinGrainBBF = SinGrainBBF {
+  trigger = 0.0,
+  dur = 1.0,
+  freq = 440.0,
+  envbuf = 0.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  wComp = 0.0
+  }
+mkSinGrainBBF :: SinGrainBBF -> S.UGen
+mkSinGrainBBF (SinGrainBBF  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "SinGrainBBF" [a',b',c',d',e',f',g',h'] 4
+instance Make SinGrainBBF where
+  ugen = mkSinGrainBBF
diff --git a/Sound/SC3/UGen/Record/SinGrainBF.hs b/Sound/SC3/UGen/Record/SinGrainBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SinGrainBF.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SinGrainBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SinGrainBF = SinGrainBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  freq :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+sinGrainBF :: SinGrainBF
+sinGrainBF = SinGrainBF {
+  trigger = 0.0,
+  dur = 1.0,
+  freq = 440.0,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  wComp = 0.0
+  }
+mkSinGrainBF :: SinGrainBF -> S.UGen
+mkSinGrainBF (SinGrainBF  a' b' c' d' e' f' g') = S.mkOsc S.AR "SinGrainBF" [a',b',c',d',e',f',g'] 4
+instance Make SinGrainBF where
+  ugen = mkSinGrainBF
diff --git a/Sound/SC3/UGen/Record/SinGrainI.hs b/Sound/SC3/UGen/Record/SinGrainI.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SinGrainI.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SinGrainI where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SinGrainI = SinGrainI {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  freq :: S.UGen,
+  envbuf1 :: S.UGen,
+  envbuf2 :: S.UGen,
+  ifac :: S.UGen
+  } deriving (Show)
+sinGrainI :: SinGrainI
+sinGrainI = SinGrainI {
+  trigger = 0.0,
+  dur = 1.0,
+  freq = 440.0,
+  envbuf1 = 0.0,
+  envbuf2 = 0.0,
+  ifac = 0.5
+  }
+mkSinGrainI :: SinGrainI -> S.UGen
+mkSinGrainI (SinGrainI  a' b' c' d' e' f') = S.mkOsc S.AR "SinGrainI" [a',b',c',d',e',f'] 1
+instance Make SinGrainI where
+  ugen = mkSinGrainI
diff --git a/Sound/SC3/UGen/Record/SinGrainIBF.hs b/Sound/SC3/UGen/Record/SinGrainIBF.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SinGrainIBF.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SinGrainIBF where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SinGrainIBF = SinGrainIBF {
+  trigger :: S.UGen,
+  dur :: S.UGen,
+  freq :: S.UGen,
+  envbuf1 :: S.UGen,
+  envbuf2 :: S.UGen,
+  ifac :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  rho :: S.UGen,
+  wComp :: S.UGen
+  } deriving (Show)
+sinGrainIBF :: SinGrainIBF
+sinGrainIBF = SinGrainIBF {
+  trigger = 0.0,
+  dur = 1.0,
+  freq = 440.0,
+  envbuf1 = 0.0,
+  envbuf2 = 0.0,
+  ifac = 0.5,
+  azimuth = 0.0,
+  elevation = 0.0,
+  rho = 1.0,
+  wComp = 0.0
+  }
+mkSinGrainIBF :: SinGrainIBF -> S.UGen
+mkSinGrainIBF (SinGrainIBF  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "SinGrainIBF" [a',b',c',d',e',f',g',h',i',j'] 4
+instance Make SinGrainIBF where
+  ugen = mkSinGrainIBF
diff --git a/Sound/SC3/UGen/Record/SinOsc.hs b/Sound/SC3/UGen/Record/SinOsc.hs
--- a/Sound/SC3/UGen/Record/SinOsc.hs
+++ b/Sound/SC3/UGen/Record/SinOsc.hs
@@ -1,3 +1,4 @@
+-- | Interpolating sine wavetable oscillator.
 module Sound.SC3.UGen.Record.SinOsc where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SinOscFB.hs b/Sound/SC3/UGen/Record/SinOscFB.hs
--- a/Sound/SC3/UGen/Record/SinOscFB.hs
+++ b/Sound/SC3/UGen/Record/SinOscFB.hs
@@ -1,3 +1,4 @@
+-- | Feedback FM oscillator
 module Sound.SC3.UGen.Record.SinOscFB where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SinTone.hs b/Sound/SC3/UGen/Record/SinTone.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SinTone.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SinTone where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SinTone = SinTone {
+  freq :: S.UGen,
+  phase :: S.UGen
+  } deriving (Show)
+sinTone :: SinTone
+sinTone = SinTone {
+  freq = 440.0,
+  phase = 0.0
+  }
+mkSinTone :: SinTone -> S.UGen
+mkSinTone (SinTone  a' b') = S.mkOsc S.AR "SinTone" [a',b'] 1
+instance Make SinTone where
+  ugen = mkSinTone
diff --git a/Sound/SC3/UGen/Record/SineShaper.hs b/Sound/SC3/UGen/Record/SineShaper.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SineShaper.hs
@@ -0,0 +1,17 @@
+-- | port of some ladspa plugins
+module Sound.SC3.UGen.Record.SineShaper where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SineShaper = SineShaper {
+  input :: S.UGen,
+  limit :: S.UGen
+  } deriving (Show)
+sineShaper :: SineShaper
+sineShaper = SineShaper {
+  input = 0.0,
+  limit = 1.0
+  }
+mkSineShaper :: SineShaper -> S.UGen
+mkSineShaper (SineShaper  a' b') = S.mkOsc S.AR "SineShaper" [a',b'] 1
+instance Make SineShaper where
+  ugen = mkSineShaper
diff --git a/Sound/SC3/UGen/Record/SkipNeedle.hs b/Sound/SC3/UGen/Record/SkipNeedle.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SkipNeedle.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SkipNeedle where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SkipNeedle = SkipNeedle {
+  range :: S.UGen,
+  rate_ :: S.UGen,
+  offset :: S.UGen
+  } deriving (Show)
+skipNeedle :: SkipNeedle
+skipNeedle = SkipNeedle {
+  range = 44100.0,
+  rate_ = 10.0,
+  offset = 0.0
+  }
+mkSkipNeedle :: SkipNeedle -> S.UGen
+mkSkipNeedle (SkipNeedle  a' b' c') = S.mkOsc S.AR "SkipNeedle" [a',b',c'] 1
+instance Make SkipNeedle where
+  ugen = mkSkipNeedle
diff --git a/Sound/SC3/UGen/Record/Slew.hs b/Sound/SC3/UGen/Record/Slew.hs
--- a/Sound/SC3/UGen/Record/Slew.hs
+++ b/Sound/SC3/UGen/Record/Slew.hs
@@ -1,3 +1,4 @@
+-- | Slew rate limiter.
 module Sound.SC3.UGen.Record.Slew where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Slope.hs b/Sound/SC3/UGen/Record/Slope.hs
--- a/Sound/SC3/UGen/Record/Slope.hs
+++ b/Sound/SC3/UGen/Record/Slope.hs
@@ -1,3 +1,4 @@
+-- | Slope of signal
 module Sound.SC3.UGen.Record.Slope where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SmoothDecimator.hs b/Sound/SC3/UGen/Record/SmoothDecimator.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SmoothDecimator.hs
@@ -0,0 +1,19 @@
+-- | port of some ladspa plugins
+module Sound.SC3.UGen.Record.SmoothDecimator where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SmoothDecimator = SmoothDecimator {
+  input :: S.UGen,
+  rate_ :: S.UGen,
+  smoothing :: S.UGen
+  } deriving (Show)
+smoothDecimator :: SmoothDecimator
+smoothDecimator = SmoothDecimator {
+  input = 0.0,
+  rate_ = 44100.0,
+  smoothing = 0.5
+  }
+mkSmoothDecimator :: SmoothDecimator -> S.UGen
+mkSmoothDecimator (SmoothDecimator  a' b' c') = S.mkOsc S.AR "SmoothDecimator" [a',b',c'] 1
+instance Make SmoothDecimator where
+  ugen = mkSmoothDecimator
diff --git a/Sound/SC3/UGen/Record/SoftClipAmp.hs b/Sound/SC3/UGen/Record/SoftClipAmp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SoftClipAmp.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SoftClipAmp where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SoftClipAmp = SoftClipAmp {
+  input :: S.UGen,
+  pregain :: S.UGen
+  } deriving (Show)
+softClipAmp :: SoftClipAmp
+softClipAmp = SoftClipAmp {
+  input = 0.0,
+  pregain = 1.0
+  }
+mkSoftClipAmp :: SoftClipAmp -> S.UGen
+mkSoftClipAmp (SoftClipAmp  a' b') = S.mkOsc S.AR "SoftClipAmp" [a',b'] 1
+instance Make SoftClipAmp where
+  ugen = mkSoftClipAmp
diff --git a/Sound/SC3/UGen/Record/SoftClipAmp4.hs b/Sound/SC3/UGen/Record/SoftClipAmp4.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SoftClipAmp4.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SoftClipAmp4 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SoftClipAmp4 = SoftClipAmp4 {
+  input :: S.UGen,
+  pregain :: S.UGen
+  } deriving (Show)
+softClipAmp4 :: SoftClipAmp4
+softClipAmp4 = SoftClipAmp4 {
+  input = 0.0,
+  pregain = 1.0
+  }
+mkSoftClipAmp4 :: SoftClipAmp4 -> S.UGen
+mkSoftClipAmp4 (SoftClipAmp4  a' b') = S.mkOsc S.AR "SoftClipAmp4" [a',b'] 1
+instance Make SoftClipAmp4 where
+  ugen = mkSoftClipAmp4
diff --git a/Sound/SC3/UGen/Record/SoftClipAmp8.hs b/Sound/SC3/UGen/Record/SoftClipAmp8.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SoftClipAmp8.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SoftClipAmp8 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SoftClipAmp8 = SoftClipAmp8 {
+  input :: S.UGen,
+  pregain :: S.UGen
+  } deriving (Show)
+softClipAmp8 :: SoftClipAmp8
+softClipAmp8 = SoftClipAmp8 {
+  input = 0.0,
+  pregain = 1.0
+  }
+mkSoftClipAmp8 :: SoftClipAmp8 -> S.UGen
+mkSoftClipAmp8 (SoftClipAmp8  a' b') = S.mkOsc S.AR "SoftClipAmp8" [a',b'] 1
+instance Make SoftClipAmp8 where
+  ugen = mkSoftClipAmp8
diff --git a/Sound/SC3/UGen/Record/SoftClipper4.hs b/Sound/SC3/UGen/Record/SoftClipper4.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SoftClipper4.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SoftClipper4 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SoftClipper4 = SoftClipper4 {
+  input :: S.UGen
+  } deriving (Show)
+softClipper4 :: SoftClipper4
+softClipper4 = SoftClipper4 {
+  input = 0.0
+  }
+mkSoftClipper4 :: SoftClipper4 -> S.UGen
+mkSoftClipper4 (SoftClipper4  a') = S.mkOsc S.AR "SoftClipper4" [a'] 1
+instance Make SoftClipper4 where
+  ugen = mkSoftClipper4
diff --git a/Sound/SC3/UGen/Record/SoftClipper8.hs b/Sound/SC3/UGen/Record/SoftClipper8.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SoftClipper8.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SoftClipper8 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SoftClipper8 = SoftClipper8 {
+  input :: S.UGen
+  } deriving (Show)
+softClipper8 :: SoftClipper8
+softClipper8 = SoftClipper8 {
+  input = 0.0
+  }
+mkSoftClipper8 :: SoftClipper8 -> S.UGen
+mkSoftClipper8 (SoftClipper8  a') = S.mkOsc S.AR "SoftClipper8" [a'] 1
+instance Make SoftClipper8 where
+  ugen = mkSoftClipper8
diff --git a/Sound/SC3/UGen/Record/SortBuf.hs b/Sound/SC3/UGen/Record/SortBuf.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SortBuf.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SortBuf where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SortBuf = SortBuf {
+  bufnum :: S.UGen,
+  sortrate :: S.UGen,
+  reset :: S.UGen
+  } deriving (Show)
+sortBuf :: SortBuf
+sortBuf = SortBuf {
+  bufnum = 0.0,
+  sortrate = 10.0,
+  reset = 0.0
+  }
+mkSortBuf :: SortBuf -> S.UGen
+mkSortBuf (SortBuf  a' b' c') = S.mkOsc S.AR "SortBuf" [a',b',c'] 1
+instance Make SortBuf where
+  ugen = mkSortBuf
diff --git a/Sound/SC3/UGen/Record/SpecCentroid.hs b/Sound/SC3/UGen/Record/SpecCentroid.hs
--- a/Sound/SC3/UGen/Record/SpecCentroid.hs
+++ b/Sound/SC3/UGen/Record/SpecCentroid.hs
@@ -1,3 +1,4 @@
+-- | Spectral centroid
 module Sound.SC3.UGen.Record.SpecCentroid where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SpecFlatness.hs b/Sound/SC3/UGen/Record/SpecFlatness.hs
--- a/Sound/SC3/UGen/Record/SpecFlatness.hs
+++ b/Sound/SC3/UGen/Record/SpecFlatness.hs
@@ -1,3 +1,4 @@
+-- | Spectral Flatness measure
 module Sound.SC3.UGen.Record.SpecFlatness where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SpecPcile.hs b/Sound/SC3/UGen/Record/SpecPcile.hs
--- a/Sound/SC3/UGen/Record/SpecPcile.hs
+++ b/Sound/SC3/UGen/Record/SpecPcile.hs
@@ -1,3 +1,4 @@
+-- | Find a percentile of FFT magnitude spectrum
 module Sound.SC3.UGen.Record.SpecPcile where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Spreader.hs b/Sound/SC3/UGen/Record/Spreader.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Spreader.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Spreader where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Spreader = Spreader {
+  input :: S.UGen,
+  theta :: S.UGen,
+  filtsPerOctave :: S.UGen
+  } deriving (Show)
+spreader :: Spreader
+spreader = Spreader {
+  input = 0.0,
+  theta = 1.5707963267949,
+  filtsPerOctave = 8.0
+  }
+mkSpreader :: Spreader -> S.UGen
+mkSpreader (Spreader  a' b' c') = S.mkOsc S.AR "Spreader" [a',b',c'] 2
+instance Make Spreader where
+  ugen = mkSpreader
diff --git a/Sound/SC3/UGen/Record/Spring.hs b/Sound/SC3/UGen/Record/Spring.hs
--- a/Sound/SC3/UGen/Record/Spring.hs
+++ b/Sound/SC3/UGen/Record/Spring.hs
@@ -1,3 +1,4 @@
+-- | physical model of resonating spring
 module Sound.SC3.UGen.Record.Spring where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SpruceBudworm.hs b/Sound/SC3/UGen/Record/SpruceBudworm.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SpruceBudworm.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.SpruceBudworm where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SpruceBudworm = SpruceBudworm {
+  reset :: S.UGen,
+  rate_ :: S.UGen,
+  k1 :: S.UGen,
+  k2 :: S.UGen,
+  alpha :: S.UGen,
+  beta :: S.UGen,
+  mu :: S.UGen,
+  rho :: S.UGen,
+  initx :: S.UGen,
+  inity :: S.UGen
+  } deriving (Show)
+spruceBudworm :: SpruceBudworm
+spruceBudworm = SpruceBudworm {
+  reset = 0.0,
+  rate_ = 0.1,
+  k1 = 27.9,
+  k2 = 1.5,
+  alpha = 0.1,
+  beta = 10.1,
+  mu = 0.3,
+  rho = 10.1,
+  initx = 0.9,
+  inity = 0.1
+  }
+mkSpruceBudworm :: SpruceBudworm -> S.UGen
+mkSpruceBudworm (SpruceBudworm  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "SpruceBudworm" [a',b',c',d',e',f',g',h',i',j'] 2
+instance Make SpruceBudworm where
+  ugen = mkSpruceBudworm
diff --git a/Sound/SC3/UGen/Record/Squiz.hs b/Sound/SC3/UGen/Record/Squiz.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Squiz.hs
@@ -0,0 +1,23 @@
+-- | Wave squeezer. Maybe a kind of pitch shifter.
+module Sound.SC3.UGen.Record.Squiz where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Squiz = Squiz {
+  rate :: S.Rate,
+  input :: S.UGen,
+  pitchratio :: S.UGen,
+  zcperchunk :: S.UGen,
+  memlen :: S.UGen
+  } deriving (Show)
+squiz :: Squiz
+squiz = Squiz {
+  rate = S.AR,
+  input = 0.0,
+  pitchratio = 2.0,
+  zcperchunk = 1.0,
+  memlen = 0.1
+  }
+mkSquiz :: Squiz -> S.UGen
+mkSquiz (Squiz r a' b' c' d') = S.mkOsc r "Squiz" [a',b',c',d'] 1
+instance Make Squiz where
+  ugen = mkSquiz
diff --git a/Sound/SC3/UGen/Record/Standard2DC.hs b/Sound/SC3/UGen/Record/Standard2DC.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Standard2DC.hs
@@ -0,0 +1,25 @@
+-- | standard map 2D chaotic generator
+module Sound.SC3.UGen.Record.Standard2DC where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Standard2DC = Standard2DC {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  k :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+standard2DC :: Standard2DC
+standard2DC = Standard2DC {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  k = 1.4,
+  x0 = 4.9789799812499,
+  y0 = 5.7473416156381
+  }
+mkStandard2DC :: Standard2DC -> S.UGen
+mkStandard2DC (Standard2DC r a' b' c' d' e') = S.mkOsc r "Standard2DC" [a',b',c',d',e'] 1
+instance Make Standard2DC where
+  ugen = mkStandard2DC
diff --git a/Sound/SC3/UGen/Record/Standard2DL.hs b/Sound/SC3/UGen/Record/Standard2DL.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Standard2DL.hs
@@ -0,0 +1,25 @@
+-- | standard map 2D chaotic generator
+module Sound.SC3.UGen.Record.Standard2DL where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Standard2DL = Standard2DL {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  k :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+standard2DL :: Standard2DL
+standard2DL = Standard2DL {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  k = 1.4,
+  x0 = 4.9789799812499,
+  y0 = 5.7473416156381
+  }
+mkStandard2DL :: Standard2DL -> S.UGen
+mkStandard2DL (Standard2DL r a' b' c' d' e') = S.mkOsc r "Standard2DL" [a',b',c',d',e'] 1
+instance Make Standard2DL where
+  ugen = mkStandard2DL
diff --git a/Sound/SC3/UGen/Record/Standard2DN.hs b/Sound/SC3/UGen/Record/Standard2DN.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Standard2DN.hs
@@ -0,0 +1,25 @@
+-- | standard map 2D chaotic generator
+module Sound.SC3.UGen.Record.Standard2DN where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Standard2DN = Standard2DN {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  k :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+standard2DN :: Standard2DN
+standard2DN = Standard2DN {
+  rate = S.AR,
+  minfreq = 11025.0,
+  maxfreq = 22050.0,
+  k = 1.4,
+  x0 = 4.9789799812499,
+  y0 = 5.7473416156381
+  }
+mkStandard2DN :: Standard2DN -> S.UGen
+mkStandard2DN (Standard2DN r a' b' c' d' e') = S.mkOsc r "Standard2DN" [a',b',c',d',e'] 1
+instance Make Standard2DN where
+  ugen = mkStandard2DN
diff --git a/Sound/SC3/UGen/Record/StandardL.hs b/Sound/SC3/UGen/Record/StandardL.hs
--- a/Sound/SC3/UGen/Record/StandardL.hs
+++ b/Sound/SC3/UGen/Record/StandardL.hs
@@ -1,3 +1,4 @@
+-- | Standard map chaotic generator
 module Sound.SC3.UGen.Record.StandardL where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/StandardN.hs b/Sound/SC3/UGen/Record/StandardN.hs
--- a/Sound/SC3/UGen/Record/StandardN.hs
+++ b/Sound/SC3/UGen/Record/StandardN.hs
@@ -1,3 +1,4 @@
+-- | Standard map chaotic generator
 module Sound.SC3.UGen.Record.StandardN where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/StandardTrig.hs b/Sound/SC3/UGen/Record/StandardTrig.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StandardTrig.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StandardTrig where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StandardTrig = StandardTrig {
+  rate :: S.Rate,
+  minfreq :: S.UGen,
+  maxfreq :: S.UGen,
+  k :: S.UGen,
+  x0 :: S.UGen,
+  y0 :: S.UGen
+  } deriving (Show)
+standardTrig :: StandardTrig
+standardTrig = StandardTrig {
+  rate = S.AR,
+  minfreq = 5.0,
+  maxfreq = 10.0,
+  k = 1.4,
+  x0 = 4.9789799812499,
+  y0 = 5.7473416156381
+  }
+mkStandardTrig :: StandardTrig -> S.UGen
+mkStandardTrig (StandardTrig r a' b' c' d' e') = S.mkOsc r "StandardTrig" [a',b',c',d',e'] 1
+instance Make StandardTrig where
+  ugen = mkStandardTrig
diff --git a/Sound/SC3/UGen/Record/Stepper.hs b/Sound/SC3/UGen/Record/Stepper.hs
--- a/Sound/SC3/UGen/Record/Stepper.hs
+++ b/Sound/SC3/UGen/Record/Stepper.hs
@@ -1,3 +1,4 @@
+-- | Pulse counter.
 module Sound.SC3.UGen.Record.Stepper where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
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
@@ -1,3 +1,4 @@
+-- | Stereo real-time convolver with linear interpolation
 module Sound.SC3.UGen.Record.StereoConvolution2L where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/StkBandedWG.hs b/Sound/SC3/UGen/Record/StkBandedWG.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkBandedWG.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkBandedWG where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkBandedWG = StkBandedWG {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  instr :: S.UGen,
+  bowpressure :: S.UGen,
+  bowmotion :: S.UGen,
+  integration :: S.UGen,
+  modalresonance :: S.UGen,
+  bowvelocity :: S.UGen,
+  setstriking :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+stkBandedWG :: StkBandedWG
+stkBandedWG = StkBandedWG {
+  rate = S.AR,
+  freq = 440.0,
+  instr = 0.0,
+  bowpressure = 0.0,
+  bowmotion = 0.0,
+  integration = 0.0,
+  modalresonance = 64.0,
+  bowvelocity = 0.0,
+  setstriking = 0.0,
+  trig = 1.0
+  }
+mkStkBandedWG :: StkBandedWG -> S.UGen
+mkStkBandedWG (StkBandedWG r a' b' c' d' e' f' g' h' i') = S.mkOsc r "StkBandedWG" [a',b',c',d',e',f',g',h',i'] 1
+instance Make StkBandedWG where
+  ugen = mkStkBandedWG
diff --git a/Sound/SC3/UGen/Record/StkBeeThree.hs b/Sound/SC3/UGen/Record/StkBeeThree.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkBeeThree.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkBeeThree where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkBeeThree = StkBeeThree {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  op4gain :: S.UGen,
+  op3gain :: S.UGen,
+  lfospeed :: S.UGen,
+  lfodepth :: S.UGen,
+  adsrtarget :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+stkBeeThree :: StkBeeThree
+stkBeeThree = StkBeeThree {
+  rate = S.AR,
+  freq = 440.0,
+  op4gain = 10.0,
+  op3gain = 20.0,
+  lfospeed = 64.0,
+  lfodepth = 0.0,
+  adsrtarget = 64.0,
+  trig = 1.0
+  }
+mkStkBeeThree :: StkBeeThree -> S.UGen
+mkStkBeeThree (StkBeeThree r a' b' c' d' e' f' g') = S.mkOsc r "StkBeeThree" [a',b',c',d',e',f',g'] 1
+instance Make StkBeeThree where
+  ugen = mkStkBeeThree
diff --git a/Sound/SC3/UGen/Record/StkBlowHole.hs b/Sound/SC3/UGen/Record/StkBlowHole.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkBlowHole.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkBlowHole where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkBlowHole = StkBlowHole {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  reedstiffness :: S.UGen,
+  noisegain :: S.UGen,
+  tonehole :: S.UGen,
+  register :: S.UGen,
+  breathpressure :: S.UGen
+  } deriving (Show)
+stkBlowHole :: StkBlowHole
+stkBlowHole = StkBlowHole {
+  rate = S.AR,
+  freq = 440.0,
+  reedstiffness = 64.0,
+  noisegain = 20.0,
+  tonehole = 64.0,
+  register = 11.0,
+  breathpressure = 64.0
+  }
+mkStkBlowHole :: StkBlowHole -> S.UGen
+mkStkBlowHole (StkBlowHole r a' b' c' d' e' f') = S.mkOsc r "StkBlowHole" [a',b',c',d',e',f'] 1
+instance Make StkBlowHole where
+  ugen = mkStkBlowHole
diff --git a/Sound/SC3/UGen/Record/StkBowed.hs b/Sound/SC3/UGen/Record/StkBowed.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkBowed.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkBowed where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkBowed = StkBowed {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  bowpressure :: S.UGen,
+  bowposition :: S.UGen,
+  vibfreq :: S.UGen,
+  vibgain :: S.UGen,
+  loudness :: S.UGen,
+  gate :: S.UGen,
+  attackrate :: S.UGen,
+  decayrate :: S.UGen
+  } deriving (Show)
+stkBowed :: StkBowed
+stkBowed = StkBowed {
+  rate = S.AR,
+  freq = 220.0,
+  bowpressure = 64.0,
+  bowposition = 64.0,
+  vibfreq = 64.0,
+  vibgain = 64.0,
+  loudness = 64.0,
+  gate = 1.0,
+  attackrate = 1.0,
+  decayrate = 1.0
+  }
+mkStkBowed :: StkBowed -> S.UGen
+mkStkBowed (StkBowed r a' b' c' d' e' f' g' h' i') = S.mkOsc r "StkBowed" [a',b',c',d',e',f',g',h',i'] 1
+instance Make StkBowed where
+  ugen = mkStkBowed
diff --git a/Sound/SC3/UGen/Record/StkClarinet.hs b/Sound/SC3/UGen/Record/StkClarinet.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkClarinet.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkClarinet where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkClarinet = StkClarinet {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  reedstiffness :: S.UGen,
+  noisegain :: S.UGen,
+  vibfreq :: S.UGen,
+  vibgain :: S.UGen,
+  breathpressure :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+stkClarinet :: StkClarinet
+stkClarinet = StkClarinet {
+  rate = S.AR,
+  freq = 440.0,
+  reedstiffness = 64.0,
+  noisegain = 4.0,
+  vibfreq = 64.0,
+  vibgain = 11.0,
+  breathpressure = 64.0,
+  trig = 1.0
+  }
+mkStkClarinet :: StkClarinet -> S.UGen
+mkStkClarinet (StkClarinet r a' b' c' d' e' f' g') = S.mkOsc r "StkClarinet" [a',b',c',d',e',f',g'] 1
+instance Make StkClarinet where
+  ugen = mkStkClarinet
diff --git a/Sound/SC3/UGen/Record/StkFlute.hs b/Sound/SC3/UGen/Record/StkFlute.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkFlute.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkFlute where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkFlute = StkFlute {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  jetDelay :: S.UGen,
+  noisegain :: S.UGen,
+  jetRatio :: S.UGen
+  } deriving (Show)
+stkFlute :: StkFlute
+stkFlute = StkFlute {
+  rate = S.AR,
+  freq = 440.0,
+  jetDelay = 49.0,
+  noisegain = 0.15,
+  jetRatio = 0.32
+  }
+mkStkFlute :: StkFlute -> S.UGen
+mkStkFlute (StkFlute r a' b' c' d') = S.mkOsc r "StkFlute" [a',b',c',d'] 1
+instance Make StkFlute where
+  ugen = mkStkFlute
diff --git a/Sound/SC3/UGen/Record/StkMandolin.hs b/Sound/SC3/UGen/Record/StkMandolin.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkMandolin.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkMandolin where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkMandolin = StkMandolin {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  bodysize :: S.UGen,
+  pickposition :: S.UGen,
+  stringdamping :: S.UGen,
+  stringdetune :: S.UGen,
+  aftertouch :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+stkMandolin :: StkMandolin
+stkMandolin = StkMandolin {
+  rate = S.AR,
+  freq = 520.0,
+  bodysize = 64.0,
+  pickposition = 64.0,
+  stringdamping = 69.0,
+  stringdetune = 10.0,
+  aftertouch = 64.0,
+  trig = 1.0
+  }
+mkStkMandolin :: StkMandolin -> S.UGen
+mkStkMandolin (StkMandolin r a' b' c' d' e' f' g') = S.mkOsc r "StkMandolin" [a',b',c',d',e',f',g'] 1
+instance Make StkMandolin where
+  ugen = mkStkMandolin
diff --git a/Sound/SC3/UGen/Record/StkModalBar.hs b/Sound/SC3/UGen/Record/StkModalBar.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkModalBar.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkModalBar where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkModalBar = StkModalBar {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  instrument :: S.UGen,
+  stickhardness :: S.UGen,
+  stickposition :: S.UGen,
+  vibratogain :: S.UGen,
+  vibratofreq :: S.UGen,
+  directstickmix :: S.UGen,
+  volume :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+stkModalBar :: StkModalBar
+stkModalBar = StkModalBar {
+  rate = S.AR,
+  freq = 440.0,
+  instrument = 0.0,
+  stickhardness = 64.0,
+  stickposition = 64.0,
+  vibratogain = 20.0,
+  vibratofreq = 20.0,
+  directstickmix = 64.0,
+  volume = 64.0,
+  trig = 1.0
+  }
+mkStkModalBar :: StkModalBar -> S.UGen
+mkStkModalBar (StkModalBar r a' b' c' d' e' f' g' h' i') = S.mkOsc r "StkModalBar" [a',b',c',d',e',f',g',h',i'] 1
+instance Make StkModalBar where
+  ugen = mkStkModalBar
diff --git a/Sound/SC3/UGen/Record/StkMoog.hs b/Sound/SC3/UGen/Record/StkMoog.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkMoog.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkMoog where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkMoog = StkMoog {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  filterQ :: S.UGen,
+  sweeprate :: S.UGen,
+  vibfreq :: S.UGen,
+  vibgain :: S.UGen,
+  gain :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+stkMoog :: StkMoog
+stkMoog = StkMoog {
+  rate = S.AR,
+  freq = 440.0,
+  filterQ = 10.0,
+  sweeprate = 20.0,
+  vibfreq = 64.0,
+  vibgain = 0.0,
+  gain = 64.0,
+  trig = 1.0
+  }
+mkStkMoog :: StkMoog -> S.UGen
+mkStkMoog (StkMoog r a' b' c' d' e' f' g') = S.mkOsc r "StkMoog" [a',b',c',d',e',f',g'] 1
+instance Make StkMoog where
+  ugen = mkStkMoog
diff --git a/Sound/SC3/UGen/Record/StkPluck.hs b/Sound/SC3/UGen/Record/StkPluck.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkPluck.hs
@@ -0,0 +1,19 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkPluck where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkPluck = StkPluck {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  decay :: S.UGen
+  } deriving (Show)
+stkPluck :: StkPluck
+stkPluck = StkPluck {
+  rate = S.AR,
+  freq = 440.0,
+  decay = 0.99
+  }
+mkStkPluck :: StkPluck -> S.UGen
+mkStkPluck (StkPluck r a' b') = S.mkOsc r "StkPluck" [a',b'] 1
+instance Make StkPluck where
+  ugen = mkStkPluck
diff --git a/Sound/SC3/UGen/Record/StkSaxofony.hs b/Sound/SC3/UGen/Record/StkSaxofony.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkSaxofony.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkSaxofony where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkSaxofony = StkSaxofony {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  reedstiffness :: S.UGen,
+  reedaperture :: S.UGen,
+  noisegain :: S.UGen,
+  blowposition :: S.UGen,
+  vibratofrequency :: S.UGen,
+  vibratogain :: S.UGen,
+  breathpressure :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+stkSaxofony :: StkSaxofony
+stkSaxofony = StkSaxofony {
+  rate = S.AR,
+  freq = 220.0,
+  reedstiffness = 64.0,
+  reedaperture = 64.0,
+  noisegain = 20.0,
+  blowposition = 26.0,
+  vibratofrequency = 20.0,
+  vibratogain = 20.0,
+  breathpressure = 128.0,
+  trig = 1.0
+  }
+mkStkSaxofony :: StkSaxofony -> S.UGen
+mkStkSaxofony (StkSaxofony r a' b' c' d' e' f' g' h' i') = S.mkOsc r "StkSaxofony" [a',b',c',d',e',f',g',h',i'] 1
+instance Make StkSaxofony where
+  ugen = mkStkSaxofony
diff --git a/Sound/SC3/UGen/Record/StkShakers.hs b/Sound/SC3/UGen/Record/StkShakers.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkShakers.hs
@@ -0,0 +1,25 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkShakers where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkShakers = StkShakers {
+  rate :: S.Rate,
+  instr :: S.UGen,
+  energy :: S.UGen,
+  decay :: S.UGen,
+  objects :: S.UGen,
+  resfreq :: S.UGen
+  } deriving (Show)
+stkShakers :: StkShakers
+stkShakers = StkShakers {
+  rate = S.AR,
+  instr = 0.0,
+  energy = 64.0,
+  decay = 64.0,
+  objects = 64.0,
+  resfreq = 64.0
+  }
+mkStkShakers :: StkShakers -> S.UGen
+mkStkShakers (StkShakers r a' b' c' d' e') = S.mkOsc r "StkShakers" [a',b',c',d',e'] 1
+instance Make StkShakers where
+  ugen = mkStkShakers
diff --git a/Sound/SC3/UGen/Record/StkVoicForm.hs b/Sound/SC3/UGen/Record/StkVoicForm.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/StkVoicForm.hs
@@ -0,0 +1,29 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.StkVoicForm where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data StkVoicForm = StkVoicForm {
+  rate :: S.Rate,
+  freq :: S.UGen,
+  vuvmix :: S.UGen,
+  vowelphon :: S.UGen,
+  vibfreq :: S.UGen,
+  vibgain :: S.UGen,
+  loudness :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+stkVoicForm :: StkVoicForm
+stkVoicForm = StkVoicForm {
+  rate = S.AR,
+  freq = 440.0,
+  vuvmix = 64.0,
+  vowelphon = 64.0,
+  vibfreq = 64.0,
+  vibgain = 20.0,
+  loudness = 64.0,
+  trig = 1.0
+  }
+mkStkVoicForm :: StkVoicForm -> S.UGen
+mkStkVoicForm (StkVoicForm r a' b' c' d' e' f' g') = S.mkOsc r "StkVoicForm" [a',b',c',d',e',f',g'] 1
+instance Make StkVoicForm where
+  ugen = mkStkVoicForm
diff --git a/Sound/SC3/UGen/Record/Streson.hs b/Sound/SC3/UGen/Record/Streson.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Streson.hs
@@ -0,0 +1,21 @@
+-- | String resonance filter
+module Sound.SC3.UGen.Record.Streson where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Streson = Streson {
+  rate :: S.Rate,
+  input :: S.UGen,
+  delayTime :: S.UGen,
+  res :: S.UGen
+  } deriving (Show)
+streson :: Streson
+streson = Streson {
+  rate = S.AR,
+  input = 0.0,
+  delayTime = 0.003,
+  res = 0.9
+  }
+mkStreson :: Streson -> S.UGen
+mkStreson (Streson r a' b' c') = S.mkOsc r "Streson" [a',b',c'] 1
+instance Make Streson where
+  ugen = mkStreson
diff --git a/Sound/SC3/UGen/Record/Summer.hs b/Sound/SC3/UGen/Record/Summer.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Summer.hs
@@ -0,0 +1,23 @@
+-- | Pulse counter with floating point steps
+module Sound.SC3.UGen.Record.Summer where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Summer = Summer {
+  rate :: S.Rate,
+  trig :: S.UGen,
+  step :: S.UGen,
+  reset :: S.UGen,
+  resetval :: S.UGen
+  } deriving (Show)
+summer :: Summer
+summer = Summer {
+  rate = S.AR,
+  trig = 0.0,
+  step = 1.0,
+  reset = 0.0,
+  resetval = 0.0
+  }
+mkSummer :: Summer -> S.UGen
+mkSummer (Summer r a' b' c' d') = S.mkOsc r "Summer" [a',b',c',d'] 1
+instance Make Summer where
+  ugen = mkSummer
diff --git a/Sound/SC3/UGen/Record/Sweep.hs b/Sound/SC3/UGen/Record/Sweep.hs
--- a/Sound/SC3/UGen/Record/Sweep.hs
+++ b/Sound/SC3/UGen/Record/Sweep.hs
@@ -1,3 +1,4 @@
+-- | Triggered linear ramp
 module Sound.SC3.UGen.Record.Sweep where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/SwitchDelay.hs b/Sound/SC3/UGen/Record/SwitchDelay.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/SwitchDelay.hs
@@ -0,0 +1,25 @@
+-- | feedback delay line implementing switch-and-ramp buffer jumping
+module Sound.SC3.UGen.Record.SwitchDelay where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data SwitchDelay = SwitchDelay {
+  input :: S.UGen,
+  drylevel :: S.UGen,
+  wetlevel :: S.UGen,
+  delaytime :: S.UGen,
+  delayfactor :: S.UGen,
+  maxdelaytime :: S.UGen
+  } deriving (Show)
+switchDelay :: SwitchDelay
+switchDelay = SwitchDelay {
+  input = 0.0,
+  drylevel = 1.0,
+  wetlevel = 1.0,
+  delaytime = 1.0,
+  delayfactor = 0.7,
+  maxdelaytime = 20.0
+  }
+mkSwitchDelay :: SwitchDelay -> S.UGen
+mkSwitchDelay (SwitchDelay  a' b' c' d' e' f') = S.mkOsc S.AR "SwitchDelay" [a',b',c',d',e',f'] 1
+instance Make SwitchDelay where
+  ugen = mkSwitchDelay
diff --git a/Sound/SC3/UGen/Record/SyncSaw.hs b/Sound/SC3/UGen/Record/SyncSaw.hs
--- a/Sound/SC3/UGen/Record/SyncSaw.hs
+++ b/Sound/SC3/UGen/Record/SyncSaw.hs
@@ -1,3 +1,4 @@
+-- | Hard sync sawtooth wave.
 module Sound.SC3.UGen.Record.SyncSaw where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/T2A.hs b/Sound/SC3/UGen/Record/T2A.hs
--- a/Sound/SC3/UGen/Record/T2A.hs
+++ b/Sound/SC3/UGen/Record/T2A.hs
@@ -1,3 +1,4 @@
+-- | Control rate trigger to audio rate trigger converter
 module Sound.SC3.UGen.Record.T2A where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/T2K.hs b/Sound/SC3/UGen/Record/T2K.hs
--- a/Sound/SC3/UGen/Record/T2K.hs
+++ b/Sound/SC3/UGen/Record/T2K.hs
@@ -1,3 +1,4 @@
+-- | Audio rate trigger to control rate trigger converter
 module Sound.SC3.UGen.Record.T2K where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TBall.hs b/Sound/SC3/UGen/Record/TBall.hs
--- a/Sound/SC3/UGen/Record/TBall.hs
+++ b/Sound/SC3/UGen/Record/TBall.hs
@@ -1,3 +1,4 @@
+-- | physical model of bouncing object
 module Sound.SC3.UGen.Record.TBall where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TBetaRand.hs b/Sound/SC3/UGen/Record/TBetaRand.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TBetaRand.hs
@@ -0,0 +1,25 @@
+-- | triggered beta random distribution
+module Sound.SC3.UGen.Record.TBetaRand where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TBetaRand = TBetaRand {
+  rate :: S.Rate,
+  lo :: S.UGen,
+  hi :: S.UGen,
+  prob1 :: S.UGen,
+  prob2 :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+tBetaRand :: TBetaRand
+tBetaRand = TBetaRand {
+  rate = S.AR,
+  lo = 0.0,
+  hi = 1.0,
+  prob1 = 0.0,
+  prob2 = 0.0,
+  trig = 0.0
+  }
+mkTBetaRand :: TBetaRand -> S.UGen
+mkTBetaRand (TBetaRand r a' b' c' d' e') = S.mkOsc r "TBetaRand" [a',b',c',d',e'] 1
+instance Make TBetaRand where
+  ugen = mkTBetaRand
diff --git a/Sound/SC3/UGen/Record/TBrownRand.hs b/Sound/SC3/UGen/Record/TBrownRand.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TBrownRand.hs
@@ -0,0 +1,25 @@
+-- | triggered random walk generator
+module Sound.SC3.UGen.Record.TBrownRand where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TBrownRand = TBrownRand {
+  rate :: S.Rate,
+  lo :: S.UGen,
+  hi :: S.UGen,
+  dev :: S.UGen,
+  dist :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+tBrownRand :: TBrownRand
+tBrownRand = TBrownRand {
+  rate = S.AR,
+  lo = 0.0,
+  hi = 1.0,
+  dev = 1.0,
+  dist = 0.0,
+  trig = 0.0
+  }
+mkTBrownRand :: TBrownRand -> S.UGen
+mkTBrownRand (TBrownRand r a' b' c' d' e') = S.mkOsc r "TBrownRand" [a',b',c',d',e'] 1
+instance Make TBrownRand where
+  ugen = mkTBrownRand
diff --git a/Sound/SC3/UGen/Record/TDelay.hs b/Sound/SC3/UGen/Record/TDelay.hs
--- a/Sound/SC3/UGen/Record/TDelay.hs
+++ b/Sound/SC3/UGen/Record/TDelay.hs
@@ -1,3 +1,4 @@
+-- | Trigger delay.
 module Sound.SC3.UGen.Record.TDelay where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TDuty.hs b/Sound/SC3/UGen/Record/TDuty.hs
--- a/Sound/SC3/UGen/Record/TDuty.hs
+++ b/Sound/SC3/UGen/Record/TDuty.hs
@@ -1,3 +1,4 @@
+-- | Demand results as trigger from demand rate UGens.
 module Sound.SC3.UGen.Record.TDuty where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TExpRand.hs b/Sound/SC3/UGen/Record/TExpRand.hs
--- a/Sound/SC3/UGen/Record/TExpRand.hs
+++ b/Sound/SC3/UGen/Record/TExpRand.hs
@@ -1,3 +1,4 @@
+-- | Triggered exponential random number generator.
 module Sound.SC3.UGen.Record.TExpRand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TGaussRand.hs b/Sound/SC3/UGen/Record/TGaussRand.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TGaussRand.hs
@@ -0,0 +1,21 @@
+-- | triggered gaussian random distribution
+module Sound.SC3.UGen.Record.TGaussRand where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TGaussRand = TGaussRand {
+  rate :: S.Rate,
+  lo :: S.UGen,
+  hi :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+tGaussRand :: TGaussRand
+tGaussRand = TGaussRand {
+  rate = S.AR,
+  lo = 0.0,
+  hi = 1.0,
+  trig = 0.0
+  }
+mkTGaussRand :: TGaussRand -> S.UGen
+mkTGaussRand (TGaussRand r a' b' c') = S.mkOsc r "TGaussRand" [a',b',c'] 1
+instance Make TGaussRand where
+  ugen = mkTGaussRand
diff --git a/Sound/SC3/UGen/Record/TGrains.hs b/Sound/SC3/UGen/Record/TGrains.hs
--- a/Sound/SC3/UGen/Record/TGrains.hs
+++ b/Sound/SC3/UGen/Record/TGrains.hs
@@ -1,8 +1,8 @@
+-- | Buffer granulator.
 module Sound.SC3.UGen.Record.TGrains where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data TGrains = TGrains {
-  numChannels :: S.UGen,
   trigger :: S.UGen,
   bufnum :: S.UGen,
   rate_ :: S.UGen,
@@ -14,7 +14,6 @@
   } deriving (Show)
 tGrains :: TGrains
 tGrains = TGrains {
-  numChannels = 0.0,
   trigger = 0.0,
   bufnum = 0.0,
   rate_ = 1.0,
@@ -25,6 +24,6 @@
   interp = 4.0
   }
 mkTGrains :: TGrains -> S.UGen
-mkTGrains (TGrains  a' b' c' d' e' f' g' h' i') = S.mkOsc S.AR "TGrains" [a',b',c',d',e',f',g',h',i'] 1
+mkTGrains (TGrains  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "TGrains" [a',b',c',d',e',f',g',h'] undefined
 instance Make TGrains where
   ugen = mkTGrains
diff --git a/Sound/SC3/UGen/Record/TGrains2.hs b/Sound/SC3/UGen/Record/TGrains2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TGrains2.hs
@@ -0,0 +1,33 @@
+-- | buffer granulator with linear att/dec
+module Sound.SC3.UGen.Record.TGrains2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TGrains2 = TGrains2 {
+  trigger :: S.UGen,
+  bufnum :: S.UGen,
+  rate_ :: S.UGen,
+  centerPos :: S.UGen,
+  dur :: S.UGen,
+  pan :: S.UGen,
+  amp :: S.UGen,
+  att :: S.UGen,
+  dec :: S.UGen,
+  interp :: S.UGen
+  } deriving (Show)
+tGrains2 :: TGrains2
+tGrains2 = TGrains2 {
+  trigger = 0.0,
+  bufnum = 0.0,
+  rate_ = 1.0,
+  centerPos = 0.0,
+  dur = 0.1,
+  pan = 0.0,
+  amp = 0.1,
+  att = 0.5,
+  dec = 0.5,
+  interp = 4.0
+  }
+mkTGrains2 :: TGrains2 -> S.UGen
+mkTGrains2 (TGrains2  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "TGrains2" [a',b',c',d',e',f',g',h',i',j'] undefined
+instance Make TGrains2 where
+  ugen = mkTGrains2
diff --git a/Sound/SC3/UGen/Record/TGrains3.hs b/Sound/SC3/UGen/Record/TGrains3.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TGrains3.hs
@@ -0,0 +1,35 @@
+-- | buffer granulator with user envelope
+module Sound.SC3.UGen.Record.TGrains3 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TGrains3 = TGrains3 {
+  trigger :: S.UGen,
+  bufnum :: S.UGen,
+  rate_ :: S.UGen,
+  centerPos :: S.UGen,
+  dur :: S.UGen,
+  pan :: S.UGen,
+  amp :: S.UGen,
+  att :: S.UGen,
+  dec :: S.UGen,
+  window :: S.UGen,
+  interp :: S.UGen
+  } deriving (Show)
+tGrains3 :: TGrains3
+tGrains3 = TGrains3 {
+  trigger = 0.0,
+  bufnum = 0.0,
+  rate_ = 1.0,
+  centerPos = 0.0,
+  dur = 0.1,
+  pan = 0.0,
+  amp = 0.1,
+  att = 0.5,
+  dec = 0.5,
+  window = 1.0,
+  interp = 4.0
+  }
+mkTGrains3 :: TGrains3 -> S.UGen
+mkTGrains3 (TGrains3  a' b' c' d' e' f' g' h' i' j' k') = S.mkOsc S.AR "TGrains3" [a',b',c',d',e',f',g',h',i',j',k'] undefined
+instance Make TGrains3 where
+  ugen = mkTGrains3
diff --git a/Sound/SC3/UGen/Record/TIRand.hs b/Sound/SC3/UGen/Record/TIRand.hs
--- a/Sound/SC3/UGen/Record/TIRand.hs
+++ b/Sound/SC3/UGen/Record/TIRand.hs
@@ -1,3 +1,4 @@
+-- | Triggered integer random number generator.
 module Sound.SC3.UGen.Record.TIRand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TPV.hs b/Sound/SC3/UGen/Record/TPV.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TPV.hs
@@ -0,0 +1,29 @@
+-- | Tracking Phase Vocoder
+module Sound.SC3.UGen.Record.TPV where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TPV = TPV {
+  chain :: S.UGen,
+  windowsize :: S.UGen,
+  hopsize :: S.UGen,
+  maxpeaks :: S.UGen,
+  currentpeaks :: S.UGen,
+  freqmult :: S.UGen,
+  tolerance :: S.UGen,
+  noisefloor :: S.UGen
+  } deriving (Show)
+tPV :: TPV
+tPV = TPV {
+  chain = 0.0,
+  windowsize = 1024.0,
+  hopsize = 512.0,
+  maxpeaks = 80.0,
+  currentpeaks = 0.0,
+  freqmult = 1.0,
+  tolerance = 4.0,
+  noisefloor = 0.2
+  }
+mkTPV :: TPV -> S.UGen
+mkTPV (TPV  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "TPV" [a',b',c',d',e',f',g',h'] 1
+instance Make TPV where
+  ugen = mkTPV
diff --git a/Sound/SC3/UGen/Record/TRand.hs b/Sound/SC3/UGen/Record/TRand.hs
--- a/Sound/SC3/UGen/Record/TRand.hs
+++ b/Sound/SC3/UGen/Record/TRand.hs
@@ -1,3 +1,4 @@
+-- | Triggered random number generator.
 module Sound.SC3.UGen.Record.TRand where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TTendency.hs b/Sound/SC3/UGen/Record/TTendency.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TTendency.hs
@@ -0,0 +1,27 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.TTendency where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TTendency = TTendency {
+  rate :: S.Rate,
+  trigger :: S.UGen,
+  dist :: S.UGen,
+  parX :: S.UGen,
+  parY :: S.UGen,
+  parA :: S.UGen,
+  parB :: S.UGen
+  } deriving (Show)
+tTendency :: TTendency
+tTendency = TTendency {
+  rate = S.AR,
+  trigger = 0.0,
+  dist = 0.0,
+  parX = 0.0,
+  parY = 1.0,
+  parA = 0.0,
+  parB = 0.0
+  }
+mkTTendency :: TTendency -> S.UGen
+mkTTendency (TTendency r a' b' c' d' e' f') = S.mkOsc r "TTendency" [a',b',c',d',e',f'] 1
+instance Make TTendency where
+  ugen = mkTTendency
diff --git a/Sound/SC3/UGen/Record/TWChoose.hs b/Sound/SC3/UGen/Record/TWChoose.hs
--- a/Sound/SC3/UGen/Record/TWChoose.hs
+++ b/Sound/SC3/UGen/Record/TWChoose.hs
@@ -1,3 +1,4 @@
+-- | Randomly select one of several inputs
 module Sound.SC3.UGen.Record.TWChoose where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TWindex.hs b/Sound/SC3/UGen/Record/TWindex.hs
--- a/Sound/SC3/UGen/Record/TWindex.hs
+++ b/Sound/SC3/UGen/Record/TWindex.hs
@@ -1,3 +1,4 @@
+-- | Triggered windex.
 module Sound.SC3.UGen.Record.TWindex where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Tap.hs b/Sound/SC3/UGen/Record/Tap.hs
--- a/Sound/SC3/UGen/Record/Tap.hs
+++ b/Sound/SC3/UGen/Record/Tap.hs
@@ -1,18 +1,17 @@
+-- | Single tap into a delayline
 module Sound.SC3.UGen.Record.Tap where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data Tap = Tap {
   bufnum :: S.UGen,
-  numChannels :: S.UGen,
   delaytime :: S.UGen
   } deriving (Show)
 tap :: Tap
 tap = Tap {
   bufnum = 0.0,
-  numChannels = 1.0,
   delaytime = 0.2
   }
 mkTap :: Tap -> S.UGen
-mkTap (Tap  a' b' c') = S.mkOsc S.AR "Tap" [a',b',c'] 1
+mkTap (Tap  a' b') = S.mkOsc S.AR "Tap" [a',b'] undefined
 instance Make Tap where
   ugen = mkTap
diff --git a/Sound/SC3/UGen/Record/Tartini.hs b/Sound/SC3/UGen/Record/Tartini.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Tartini.hs
@@ -0,0 +1,25 @@
+-- | pitch tracker
+module Sound.SC3.UGen.Record.Tartini where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Tartini = Tartini {
+  input :: S.UGen,
+  threshold :: S.UGen,
+  n :: S.UGen,
+  k :: S.UGen,
+  overlap :: S.UGen,
+  smallCutoff :: S.UGen
+  } deriving (Show)
+tartini :: Tartini
+tartini = Tartini {
+  input = 0.0,
+  threshold = 0.93,
+  n = 2048.0,
+  k = 0.0,
+  overlap = 1024.0,
+  smallCutoff = 0.5
+  }
+mkTartini :: Tartini -> S.UGen
+mkTartini (Tartini  a' b' c' d' e' f') = S.mkOsc S.KR "Tartini" [a',b',c',d',e',f'] 2
+instance Make Tartini where
+  ugen = mkTartini
diff --git a/Sound/SC3/UGen/Record/TermanWang.hs b/Sound/SC3/UGen/Record/TermanWang.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TermanWang.hs
@@ -0,0 +1,31 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.TermanWang where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TermanWang = TermanWang {
+  input :: S.UGen,
+  reset :: S.UGen,
+  ratex :: S.UGen,
+  ratey :: S.UGen,
+  alpha :: S.UGen,
+  beta :: S.UGen,
+  eta :: S.UGen,
+  initx :: S.UGen,
+  inity :: S.UGen
+  } deriving (Show)
+termanWang :: TermanWang
+termanWang = TermanWang {
+  input = 0.0,
+  reset = 0.0,
+  ratex = 0.01,
+  ratey = 0.01,
+  alpha = 1.0,
+  beta = 1.0,
+  eta = 1.0,
+  initx = 0.0,
+  inity = 0.0
+  }
+mkTermanWang :: TermanWang -> S.UGen
+mkTermanWang (TermanWang  a' b' c' d' e' f' g' h' i') = S.mkOsc S.AR "TermanWang" [a',b',c',d',e',f',g',h',i'] 1
+instance Make TermanWang where
+  ugen = mkTermanWang
diff --git a/Sound/SC3/UGen/Record/Tilt.hs b/Sound/SC3/UGen/Record/Tilt.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Tilt.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Tilt where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Tilt = Tilt {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  tilt_ :: S.UGen
+  } deriving (Show)
+tilt :: Tilt
+tilt = Tilt {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  tilt_ = 0.0
+  }
+mkTilt :: Tilt -> S.UGen
+mkTilt (Tilt  a' b' c' d' e') = S.mkOsc S.AR "Tilt" [a',b',c',d',e'] 4
+instance Make Tilt where
+  ugen = mkTilt
diff --git a/Sound/SC3/UGen/Record/Timer.hs b/Sound/SC3/UGen/Record/Timer.hs
--- a/Sound/SC3/UGen/Record/Timer.hs
+++ b/Sound/SC3/UGen/Record/Timer.hs
@@ -1,3 +1,4 @@
+-- | Returns time since last triggered.
 module Sound.SC3.UGen.Record.Timer where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ToggleFF.hs b/Sound/SC3/UGen/Record/ToggleFF.hs
--- a/Sound/SC3/UGen/Record/ToggleFF.hs
+++ b/Sound/SC3/UGen/Record/ToggleFF.hs
@@ -1,3 +1,4 @@
+-- | Toggle flip flop.
 module Sound.SC3.UGen.Record.ToggleFF where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Trig.hs b/Sound/SC3/UGen/Record/Trig.hs
--- a/Sound/SC3/UGen/Record/Trig.hs
+++ b/Sound/SC3/UGen/Record/Trig.hs
@@ -1,3 +1,4 @@
+-- | Timed trigger.
 module Sound.SC3.UGen.Record.Trig where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Trig1.hs b/Sound/SC3/UGen/Record/Trig1.hs
--- a/Sound/SC3/UGen/Record/Trig1.hs
+++ b/Sound/SC3/UGen/Record/Trig1.hs
@@ -1,3 +1,4 @@
+-- | Timed trigger.
 module Sound.SC3.UGen.Record.Trig1 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TrigAvg.hs b/Sound/SC3/UGen/Record/TrigAvg.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TrigAvg.hs
@@ -0,0 +1,17 @@
+-- | triggered signal averager
+module Sound.SC3.UGen.Record.TrigAvg where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TrigAvg = TrigAvg {
+  input :: S.UGen,
+  trig :: S.UGen
+  } deriving (Show)
+trigAvg :: TrigAvg
+trigAvg = TrigAvg {
+  input = 0.0,
+  trig = 0.0
+  }
+mkTrigAvg :: TrigAvg -> S.UGen
+mkTrigAvg (TrigAvg  a' b') = S.mkOsc S.KR "TrigAvg" [a',b'] 1
+instance Make TrigAvg where
+  ugen = mkTrigAvg
diff --git a/Sound/SC3/UGen/Record/TrigControl.hs b/Sound/SC3/UGen/Record/TrigControl.hs
--- a/Sound/SC3/UGen/Record/TrigControl.hs
+++ b/Sound/SC3/UGen/Record/TrigControl.hs
@@ -1,3 +1,4 @@
+-- | FIXME: TrigControl purpose.
 module Sound.SC3.UGen.Record.TrigControl where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Tumble.hs b/Sound/SC3/UGen/Record/Tumble.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/Tumble.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.Tumble where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data Tumble = Tumble {
+  w :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  z :: S.UGen,
+  tilt :: S.UGen
+  } deriving (Show)
+tumble :: Tumble
+tumble = Tumble {
+  w = 0.0,
+  x = 0.0,
+  y = 0.0,
+  z = 0.0,
+  tilt = 0.0
+  }
+mkTumble :: Tumble -> S.UGen
+mkTumble (Tumble  a' b' c' d' e') = S.mkOsc S.AR "Tumble" [a',b',c',d',e'] 4
+instance Make Tumble where
+  ugen = mkTumble
diff --git a/Sound/SC3/UGen/Record/TwoPole.hs b/Sound/SC3/UGen/Record/TwoPole.hs
--- a/Sound/SC3/UGen/Record/TwoPole.hs
+++ b/Sound/SC3/UGen/Record/TwoPole.hs
@@ -1,3 +1,4 @@
+-- | Two pole filter.
 module Sound.SC3.UGen.Record.TwoPole where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/TwoTube.hs b/Sound/SC3/UGen/Record/TwoTube.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/TwoTube.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.TwoTube where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data TwoTube = TwoTube {
+  input :: S.UGen,
+  k :: S.UGen,
+  loss :: S.UGen,
+  d1length :: S.UGen,
+  d2length :: S.UGen
+  } deriving (Show)
+twoTube :: TwoTube
+twoTube = TwoTube {
+  input = 0.0,
+  k = 0.01,
+  loss = 1.0,
+  d1length = 100.0,
+  d2length = 100.0
+  }
+mkTwoTube :: TwoTube -> S.UGen
+mkTwoTube (TwoTube  a' b' c' d' e') = S.mkOsc S.AR "TwoTube" [a',b',c',d',e'] 1
+instance Make TwoTube where
+  ugen = mkTwoTube
diff --git a/Sound/SC3/UGen/Record/TwoZero.hs b/Sound/SC3/UGen/Record/TwoZero.hs
--- a/Sound/SC3/UGen/Record/TwoZero.hs
+++ b/Sound/SC3/UGen/Record/TwoZero.hs
@@ -1,3 +1,4 @@
+-- | Two zero filter.
 module Sound.SC3.UGen.Record.TwoZero where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/UHJ2B.hs b/Sound/SC3/UGen/Record/UHJ2B.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/UHJ2B.hs
@@ -0,0 +1,17 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.UHJ2B where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data UHJ2B = UHJ2B {
+  ls :: S.UGen,
+  rs :: S.UGen
+  } deriving (Show)
+uHJ2B :: UHJ2B
+uHJ2B = UHJ2B {
+  ls = 0.0,
+  rs = 0.0
+  }
+mkUHJ2B :: UHJ2B -> S.UGen
+mkUHJ2B (UHJ2B  a' b') = S.mkOsc S.AR "UHJ2B" [a',b'] 3
+instance Make UHJ2B where
+  ugen = mkUHJ2B
diff --git a/Sound/SC3/UGen/Record/Unpack1FFT.hs b/Sound/SC3/UGen/Record/Unpack1FFT.hs
--- a/Sound/SC3/UGen/Record/Unpack1FFT.hs
+++ b/Sound/SC3/UGen/Record/Unpack1FFT.hs
@@ -1,3 +1,4 @@
+-- | Unpack a single value (magnitude or phase) from an FFT chain
 module Sound.SC3.UGen.Record.Unpack1FFT where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/VBAP.hs b/Sound/SC3/UGen/Record/VBAP.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/VBAP.hs
@@ -0,0 +1,25 @@
+-- | Vector Base Amplitude Panner
+module Sound.SC3.UGen.Record.VBAP where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data VBAP = VBAP {
+  rate :: S.Rate,
+  input :: S.UGen,
+  bufnum :: S.UGen,
+  azimuth :: S.UGen,
+  elevation :: S.UGen,
+  spread :: S.UGen
+  } deriving (Show)
+vBAP :: VBAP
+vBAP = VBAP {
+  rate = S.AR,
+  input = 0.0,
+  bufnum = 0.0,
+  azimuth = 0.0,
+  elevation = 1.0,
+  spread = 0.0
+  }
+mkVBAP :: VBAP -> S.UGen
+mkVBAP (VBAP r a' b' c' d' e') = S.mkOsc r "VBAP" [a',b',c',d',e'] undefined
+instance Make VBAP where
+  ugen = mkVBAP
diff --git a/Sound/SC3/UGen/Record/VDiskIn.hs b/Sound/SC3/UGen/Record/VDiskIn.hs
--- a/Sound/SC3/UGen/Record/VDiskIn.hs
+++ b/Sound/SC3/UGen/Record/VDiskIn.hs
@@ -1,8 +1,8 @@
+-- | Stream in audio from a file, with variable rate
 module Sound.SC3.UGen.Record.VDiskIn where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data VDiskIn = VDiskIn {
-  numChannels :: S.UGen,
   bufnum :: S.UGen,
   rate_ :: S.UGen,
   loop :: S.UGen,
@@ -10,13 +10,12 @@
   } deriving (Show)
 vDiskIn :: VDiskIn
 vDiskIn = VDiskIn {
-  numChannels = 0.0,
   bufnum = 0.0,
   rate_ = 1.0,
   loop = 0.0,
   sendID = 0.0
   }
 mkVDiskIn :: VDiskIn -> S.UGen
-mkVDiskIn (VDiskIn  a' b' c' d' e') = S.mkOsc S.AR "VDiskIn" [a',b',c',d',e'] 1
+mkVDiskIn (VDiskIn  a' b' c' d') = S.mkOsc S.AR "VDiskIn" [a',b',c',d'] undefined
 instance Make VDiskIn where
   ugen = mkVDiskIn
diff --git a/Sound/SC3/UGen/Record/VMScan2D.hs b/Sound/SC3/UGen/Record/VMScan2D.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/VMScan2D.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.VMScan2D where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data VMScan2D = VMScan2D {
+  bufnum :: S.UGen
+  } deriving (Show)
+vMScan2D :: VMScan2D
+vMScan2D = VMScan2D {
+  bufnum = 0.0
+  }
+mkVMScan2D :: VMScan2D -> S.UGen
+mkVMScan2D (VMScan2D  a') = S.mkOsc S.AR "VMScan2D" [a'] 2
+instance Make VMScan2D where
+  ugen = mkVMScan2D
diff --git a/Sound/SC3/UGen/Record/VOSIM.hs b/Sound/SC3/UGen/Record/VOSIM.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/VOSIM.hs
@@ -0,0 +1,21 @@
+-- | vosim pulse generator
+module Sound.SC3.UGen.Record.VOSIM where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data VOSIM = VOSIM {
+  trig :: S.UGen,
+  freq :: S.UGen,
+  nCycles :: S.UGen,
+  decay :: S.UGen
+  } deriving (Show)
+vOSIM :: VOSIM
+vOSIM = VOSIM {
+  trig = 0.1,
+  freq = 400.0,
+  nCycles = 1.0,
+  decay = 0.9
+  }
+mkVOSIM :: VOSIM -> S.UGen
+mkVOSIM (VOSIM  a' b' c' d') = S.mkOsc S.AR "VOSIM" [a',b',c',d'] 1
+instance Make VOSIM where
+  ugen = mkVOSIM
diff --git a/Sound/SC3/UGen/Record/VOsc.hs b/Sound/SC3/UGen/Record/VOsc.hs
--- a/Sound/SC3/UGen/Record/VOsc.hs
+++ b/Sound/SC3/UGen/Record/VOsc.hs
@@ -1,3 +1,4 @@
+-- | Variable wavetable oscillator.
 module Sound.SC3.UGen.Record.VOsc where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/VOsc3.hs b/Sound/SC3/UGen/Record/VOsc3.hs
--- a/Sound/SC3/UGen/Record/VOsc3.hs
+++ b/Sound/SC3/UGen/Record/VOsc3.hs
@@ -1,3 +1,4 @@
+-- | Three variable wavetable oscillators.
 module Sound.SC3.UGen.Record.VOsc3 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/VarLag.hs b/Sound/SC3/UGen/Record/VarLag.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/VarLag.hs
@@ -0,0 +1,25 @@
+-- | Variable shaped lag
+module Sound.SC3.UGen.Record.VarLag where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data VarLag = VarLag {
+  rate :: S.Rate,
+  input :: S.UGen,
+  time :: S.UGen,
+  curvature :: S.UGen,
+  warp :: S.UGen,
+  start :: S.UGen
+  } deriving (Show)
+varLag :: VarLag
+varLag = VarLag {
+  rate = S.AR,
+  input = 0.0,
+  time = 0.1,
+  curvature = 0.0,
+  warp = 5.0,
+  start = 0.0
+  }
+mkVarLag :: VarLag -> S.UGen
+mkVarLag (VarLag r a' b' c' d' e') = S.mkOsc r "VarLag" [a',b',c',d',e'] 1
+instance Make VarLag where
+  ugen = mkVarLag
diff --git a/Sound/SC3/UGen/Record/VarSaw.hs b/Sound/SC3/UGen/Record/VarSaw.hs
--- a/Sound/SC3/UGen/Record/VarSaw.hs
+++ b/Sound/SC3/UGen/Record/VarSaw.hs
@@ -1,3 +1,4 @@
+-- | Variable duty saw
 module Sound.SC3.UGen.Record.VarSaw where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/Vibrato.hs b/Sound/SC3/UGen/Record/Vibrato.hs
--- a/Sound/SC3/UGen/Record/Vibrato.hs
+++ b/Sound/SC3/UGen/Record/Vibrato.hs
@@ -1,3 +1,4 @@
+-- | The Vibrato oscillator models a slow frequency modulation.
 module Sound.SC3.UGen.Record.Vibrato where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/WAmp.hs b/Sound/SC3/UGen/Record/WAmp.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WAmp.hs
@@ -0,0 +1,17 @@
+-- | windowed amplitude follower
+module Sound.SC3.UGen.Record.WAmp where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WAmp = WAmp {
+  input :: S.UGen,
+  winSize :: S.UGen
+  } deriving (Show)
+wAmp :: WAmp
+wAmp = WAmp {
+  input = 0.0,
+  winSize = 0.1
+  }
+mkWAmp :: WAmp -> S.UGen
+mkWAmp (WAmp  a' b') = S.mkOsc S.KR "WAmp" [a',b'] 1
+instance Make WAmp where
+  ugen = mkWAmp
diff --git a/Sound/SC3/UGen/Record/WalshHadamard.hs b/Sound/SC3/UGen/Record/WalshHadamard.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WalshHadamard.hs
@@ -0,0 +1,17 @@
+-- | decomposition into square waves, and reconstruction
+module Sound.SC3.UGen.Record.WalshHadamard where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WalshHadamard = WalshHadamard {
+  input :: S.UGen,
+  which :: S.UGen
+  } deriving (Show)
+walshHadamard :: WalshHadamard
+walshHadamard = WalshHadamard {
+  input = 0.0,
+  which = 0.0
+  }
+mkWalshHadamard :: WalshHadamard -> S.UGen
+mkWalshHadamard (WalshHadamard  a' b') = S.mkOsc S.AR "WalshHadamard" [a',b'] 1
+instance Make WalshHadamard where
+  ugen = mkWalshHadamard
diff --git a/Sound/SC3/UGen/Record/Warp1.hs b/Sound/SC3/UGen/Record/Warp1.hs
--- a/Sound/SC3/UGen/Record/Warp1.hs
+++ b/Sound/SC3/UGen/Record/Warp1.hs
@@ -1,8 +1,8 @@
+-- | Warp a buffer with a time pointer
 module Sound.SC3.UGen.Record.Warp1 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
 data Warp1 = Warp1 {
-  numChannels :: S.UGen,
   bufnum :: S.UGen,
   pointer :: S.UGen,
   freqScale :: S.UGen,
@@ -14,7 +14,6 @@
   } deriving (Show)
 warp1 :: Warp1
 warp1 = Warp1 {
-  numChannels = 1.0,
   bufnum = 0.0,
   pointer = 0.0,
   freqScale = 1.0,
@@ -25,6 +24,6 @@
   interp = 1.0
   }
 mkWarp1 :: Warp1 -> S.UGen
-mkWarp1 (Warp1  a' b' c' d' e' f' g' h' i') = S.mkOsc S.AR "Warp1" [a',b',c',d',e',f',g',h',i'] 1
+mkWarp1 (Warp1  a' b' c' d' e' f' g' h') = S.mkOsc S.AR "Warp1" [a',b',c',d',e',f',g',h'] undefined
 instance Make Warp1 where
   ugen = mkWarp1
diff --git a/Sound/SC3/UGen/Record/WarpZ.hs b/Sound/SC3/UGen/Record/WarpZ.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WarpZ.hs
@@ -0,0 +1,33 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.WarpZ where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WarpZ = WarpZ {
+  bufnum :: S.UGen,
+  pointer :: S.UGen,
+  freqScale :: S.UGen,
+  windowSize :: S.UGen,
+  envbufnum :: S.UGen,
+  overlaps :: S.UGen,
+  windowRandRatio :: S.UGen,
+  interp :: S.UGen,
+  zeroSearch :: S.UGen,
+  zeroStart :: S.UGen
+  } deriving (Show)
+warpZ :: WarpZ
+warpZ = WarpZ {
+  bufnum = 0.0,
+  pointer = 0.0,
+  freqScale = 1.0,
+  windowSize = 0.2,
+  envbufnum = -1.0,
+  overlaps = 8.0,
+  windowRandRatio = 0.0,
+  interp = 1.0,
+  zeroSearch = 0.0,
+  zeroStart = 0.0
+  }
+mkWarpZ :: WarpZ -> S.UGen
+mkWarpZ (WarpZ  a' b' c' d' e' f' g' h' i' j') = S.mkOsc S.AR "WarpZ" [a',b',c',d',e',f',g',h',i',j'] undefined
+instance Make WarpZ where
+  ugen = mkWarpZ
diff --git a/Sound/SC3/UGen/Record/WaveLoss.hs b/Sound/SC3/UGen/Record/WaveLoss.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WaveLoss.hs
@@ -0,0 +1,23 @@
+-- | Lose bits of your waves
+module Sound.SC3.UGen.Record.WaveLoss where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WaveLoss = WaveLoss {
+  rate :: S.Rate,
+  input :: S.UGen,
+  drop_ :: S.UGen,
+  outof :: S.UGen,
+  mode :: S.UGen
+  } deriving (Show)
+waveLoss :: WaveLoss
+waveLoss = WaveLoss {
+  rate = S.AR,
+  input = 0.0,
+  drop_ = 20.0,
+  outof = 40.0,
+  mode = 1.0
+  }
+mkWaveLoss :: WaveLoss -> S.UGen
+mkWaveLoss (WaveLoss r a' b' c' d') = S.mkOsc r "WaveLoss" [a',b',c',d'] 1
+instance Make WaveLoss where
+  ugen = mkWaveLoss
diff --git a/Sound/SC3/UGen/Record/WaveTerrain.hs b/Sound/SC3/UGen/Record/WaveTerrain.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WaveTerrain.hs
@@ -0,0 +1,23 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.WaveTerrain where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WaveTerrain = WaveTerrain {
+  bufnum :: S.UGen,
+  x :: S.UGen,
+  y :: S.UGen,
+  xsize :: S.UGen,
+  ysize :: S.UGen
+  } deriving (Show)
+waveTerrain :: WaveTerrain
+waveTerrain = WaveTerrain {
+  bufnum = 0.0,
+  x = 0.0,
+  y = 0.0,
+  xsize = 100.0,
+  ysize = 100.0
+  }
+mkWaveTerrain :: WaveTerrain -> S.UGen
+mkWaveTerrain (WaveTerrain  a' b' c' d' e') = S.mkOsc S.AR "WaveTerrain" [a',b',c',d',e'] 1
+instance Make WaveTerrain where
+  ugen = mkWaveTerrain
diff --git a/Sound/SC3/UGen/Record/WaveletDaub.hs b/Sound/SC3/UGen/Record/WaveletDaub.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WaveletDaub.hs
@@ -0,0 +1,19 @@
+-- | decomposition into Daub4 wavelets, and reconstruction
+module Sound.SC3.UGen.Record.WaveletDaub where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WaveletDaub = WaveletDaub {
+  input :: S.UGen,
+  n :: S.UGen,
+  which :: S.UGen
+  } deriving (Show)
+waveletDaub :: WaveletDaub
+waveletDaub = WaveletDaub {
+  input = 0.0,
+  n = 64.0,
+  which = 0.0
+  }
+mkWaveletDaub :: WaveletDaub -> S.UGen
+mkWaveletDaub (WaveletDaub  a' b' c') = S.mkOsc S.AR "WaveletDaub" [a',b',c'] 1
+instance Make WaveletDaub where
+  ugen = mkWaveletDaub
diff --git a/Sound/SC3/UGen/Record/WeaklyNonlinear.hs b/Sound/SC3/UGen/Record/WeaklyNonlinear.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WeaklyNonlinear.hs
@@ -0,0 +1,35 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.WeaklyNonlinear where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WeaklyNonlinear = WeaklyNonlinear {
+  input :: S.UGen,
+  reset :: S.UGen,
+  ratex :: S.UGen,
+  ratey :: S.UGen,
+  freq :: S.UGen,
+  initx :: S.UGen,
+  inity :: S.UGen,
+  alpha :: S.UGen,
+  xexponent :: S.UGen,
+  beta :: S.UGen,
+  yexponent :: S.UGen
+  } deriving (Show)
+weaklyNonlinear :: WeaklyNonlinear
+weaklyNonlinear = WeaklyNonlinear {
+  input = 0.0,
+  reset = 0.0,
+  ratex = 1.0,
+  ratey = 1.0,
+  freq = 440.0,
+  initx = 0.0,
+  inity = 0.0,
+  alpha = 0.0,
+  xexponent = 0.0,
+  beta = 0.0,
+  yexponent = 0.0
+  }
+mkWeaklyNonlinear :: WeaklyNonlinear -> S.UGen
+mkWeaklyNonlinear (WeaklyNonlinear  a' b' c' d' e' f' g' h' i' j' k') = S.mkOsc S.AR "WeaklyNonlinear" [a',b',c',d',e',f',g',h',i',j',k'] 1
+instance Make WeaklyNonlinear where
+  ugen = mkWeaklyNonlinear
diff --git a/Sound/SC3/UGen/Record/WeaklyNonlinear2.hs b/Sound/SC3/UGen/Record/WeaklyNonlinear2.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WeaklyNonlinear2.hs
@@ -0,0 +1,35 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.WeaklyNonlinear2 where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WeaklyNonlinear2 = WeaklyNonlinear2 {
+  input :: S.UGen,
+  reset :: S.UGen,
+  ratex :: S.UGen,
+  ratey :: S.UGen,
+  freq :: S.UGen,
+  initx :: S.UGen,
+  inity :: S.UGen,
+  alpha :: S.UGen,
+  xexponent :: S.UGen,
+  beta :: S.UGen,
+  yexponent :: S.UGen
+  } deriving (Show)
+weaklyNonlinear2 :: WeaklyNonlinear2
+weaklyNonlinear2 = WeaklyNonlinear2 {
+  input = 0.0,
+  reset = 0.0,
+  ratex = 1.0,
+  ratey = 1.0,
+  freq = 440.0,
+  initx = 0.0,
+  inity = 0.0,
+  alpha = 0.0,
+  xexponent = 0.0,
+  beta = 0.0,
+  yexponent = 0.0
+  }
+mkWeaklyNonlinear2 :: WeaklyNonlinear2 -> S.UGen
+mkWeaklyNonlinear2 (WeaklyNonlinear2  a' b' c' d' e' f' g' h' i' j' k') = S.mkOsc S.AR "WeaklyNonlinear2" [a',b',c',d',e',f',g',h',i',j',k'] 1
+instance Make WeaklyNonlinear2 where
+  ugen = mkWeaklyNonlinear2
diff --git a/Sound/SC3/UGen/Record/WidthFirstUGen.hs b/Sound/SC3/UGen/Record/WidthFirstUGen.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WidthFirstUGen.hs
@@ -0,0 +1,15 @@
+-- | (not documented)
+module Sound.SC3.UGen.Record.WidthFirstUGen where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WidthFirstUGen = WidthFirstUGen {
+  maxSize :: S.UGen
+  } deriving (Show)
+widthFirstUGen :: WidthFirstUGen
+widthFirstUGen = WidthFirstUGen {
+  maxSize = 0.0
+  }
+mkWidthFirstUGen :: WidthFirstUGen -> S.UGen
+mkWidthFirstUGen (WidthFirstUGen  a') = S.mkOsc S.AR "WidthFirstUGen" [a'] 1
+instance Make WidthFirstUGen where
+  ugen = mkWidthFirstUGen
diff --git a/Sound/SC3/UGen/Record/Wrap.hs b/Sound/SC3/UGen/Record/Wrap.hs
--- a/Sound/SC3/UGen/Record/Wrap.hs
+++ b/Sound/SC3/UGen/Record/Wrap.hs
@@ -1,3 +1,4 @@
+-- | Wrap a signal outside given thresholds.
 module Sound.SC3.UGen.Record.Wrap where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/WrapIndex.hs b/Sound/SC3/UGen/Record/WrapIndex.hs
--- a/Sound/SC3/UGen/Record/WrapIndex.hs
+++ b/Sound/SC3/UGen/Record/WrapIndex.hs
@@ -1,3 +1,4 @@
+-- | Index into a table with a signal.
 module Sound.SC3.UGen.Record.WrapIndex where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/WrapSummer.hs b/Sound/SC3/UGen/Record/WrapSummer.hs
new file mode 100644
--- /dev/null
+++ b/Sound/SC3/UGen/Record/WrapSummer.hs
@@ -0,0 +1,27 @@
+-- | Pulse counter with floating point steps
+module Sound.SC3.UGen.Record.WrapSummer where
+import qualified Sound.SC3.UGen as S
+import Sound.SC3.UGen.Record
+data WrapSummer = WrapSummer {
+  rate :: S.Rate,
+  trig :: S.UGen,
+  step :: S.UGen,
+  min_ :: S.UGen,
+  max_ :: S.UGen,
+  reset :: S.UGen,
+  resetval :: S.UGen
+  } deriving (Show)
+wrapSummer :: WrapSummer
+wrapSummer = WrapSummer {
+  rate = S.AR,
+  trig = 0.0,
+  step = 1.0,
+  min_ = 0.0,
+  max_ = 1.0,
+  reset = 0.0,
+  resetval = 0.0
+  }
+mkWrapSummer :: WrapSummer -> S.UGen
+mkWrapSummer (WrapSummer r a' b' c' d' e' f') = S.mkOsc r "WrapSummer" [a',b',c',d',e',f'] 1
+instance Make WrapSummer where
+  ugen = mkWrapSummer
diff --git a/Sound/SC3/UGen/Record/XFade2.hs b/Sound/SC3/UGen/Record/XFade2.hs
--- a/Sound/SC3/UGen/Record/XFade2.hs
+++ b/Sound/SC3/UGen/Record/XFade2.hs
@@ -1,3 +1,4 @@
+-- | Equal power two channel cross fade.
 module Sound.SC3.UGen.Record.XFade2 where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/XLine.hs b/Sound/SC3/UGen/Record/XLine.hs
--- a/Sound/SC3/UGen/Record/XLine.hs
+++ b/Sound/SC3/UGen/Record/XLine.hs
@@ -1,3 +1,4 @@
+-- | Exponential line generator.
 module Sound.SC3.UGen.Record.XLine where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/XOut.hs b/Sound/SC3/UGen/Record/XOut.hs
--- a/Sound/SC3/UGen/Record/XOut.hs
+++ b/Sound/SC3/UGen/Record/XOut.hs
@@ -1,3 +1,4 @@
+-- | Send signal to a bus, crossfading with previous contents.
 module Sound.SC3.UGen.Record.XOut where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/Sound/SC3/UGen/Record/ZeroCrossing.hs b/Sound/SC3/UGen/Record/ZeroCrossing.hs
--- a/Sound/SC3/UGen/Record/ZeroCrossing.hs
+++ b/Sound/SC3/UGen/Record/ZeroCrossing.hs
@@ -1,3 +1,4 @@
+-- | Zero crossing frequency follower
 module Sound.SC3.UGen.Record.ZeroCrossing where
 import qualified Sound.SC3.UGen as S
 import Sound.SC3.UGen.Record
diff --git a/hsc3-rec.cabal b/hsc3-rec.cabal
--- a/hsc3-rec.cabal
+++ b/hsc3-rec.cabal
@@ -1,16 +1,16 @@
 Name:              hsc3-rec
-Version:           0.11
+Version:           0.12
 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-2011
+Copyright:         (c) Rohan Drape and others, 2008-2012
 Author:            Rohan Drape
 Maintainer:        rd@slavepianos.org
 Stability:         Experimental
 Homepage:          http://slavepianos.org/rd/?t=hsc3-rec
-Tested-With:       GHC == 7.2.2
+Tested-With:       GHC == 7.0.4
 Build-Type:        Simple
 Cabal-Version:     >= 1.8
 
@@ -22,40 +22,76 @@
 
 Library
   Build-Depends:   base == 4.*,
-                   hsc3 == 0.11.*
+                   hsc3 == 0.12.*
   GHC-Options:     -Wall -fwarn-tabs
   Exposed-modules: Sound.SC3.UGen.Record
-                   -- the lines below are generate by running
+                   -- the lines below are generated by running
                    -- make module_list
+                   Sound.SC3.UGen.Record.A2B
                    Sound.SC3.UGen.Record.A2K
                    Sound.SC3.UGen.Record.AbstractIn
                    Sound.SC3.UGen.Record.AbstractOut
+                   Sound.SC3.UGen.Record.Allpass1
+                   Sound.SC3.UGen.Record.Allpass2
                    Sound.SC3.UGen.Record.AllpassC
                    Sound.SC3.UGen.Record.AllpassL
                    Sound.SC3.UGen.Record.AllpassN
                    Sound.SC3.UGen.Record.AmpCompA
                    Sound.SC3.UGen.Record.AmpComp
                    Sound.SC3.UGen.Record.Amplitude
+                   Sound.SC3.UGen.Record.AmplitudeMod
+                   Sound.SC3.UGen.Record.AnalyseEvents2
                    Sound.SC3.UGen.Record.APF
+                   Sound.SC3.UGen.Record.ArrayMax
+                   Sound.SC3.UGen.Record.ArrayMin
+                   Sound.SC3.UGen.Record.AtsAmp
+                   Sound.SC3.UGen.Record.AtsBand
+                   Sound.SC3.UGen.Record.AtsFreq
+                   Sound.SC3.UGen.Record.AtsNoise
+                   Sound.SC3.UGen.Record.AtsNoiSynth
+                   Sound.SC3.UGen.Record.AtsParInfo
+                   Sound.SC3.UGen.Record.AtsPartial
+                   Sound.SC3.UGen.Record.AtsSynth
+                   Sound.SC3.UGen.Record.AtsUGen
                    Sound.SC3.UGen.Record.AudioControl
+                   Sound.SC3.UGen.Record.AudioMSG
+                   Sound.SC3.UGen.Record.AverageOutput
+                   Sound.SC3.UGen.Record.AY
+                   Sound.SC3.UGen.Record.B2A
+                   Sound.SC3.UGen.Record.B2Ster
+                   Sound.SC3.UGen.Record.B2UHJ
                    Sound.SC3.UGen.Record.Balance2
+                   Sound.SC3.UGen.Record.Balance
                    Sound.SC3.UGen.Record.Ball
                    Sound.SC3.UGen.Record.BAllPass
                    Sound.SC3.UGen.Record.BBandPass
                    Sound.SC3.UGen.Record.BBandStop
+                   Sound.SC3.UGen.Record.BBlockerBuf
                    Sound.SC3.UGen.Record.BeatTrack2
                    Sound.SC3.UGen.Record.BeatTrack
                    Sound.SC3.UGen.Record.BEQSuite
+                   Sound.SC3.UGen.Record.BFDecode1
+                   Sound.SC3.UGen.Record.BFDecoder
+                   Sound.SC3.UGen.Record.BFEncode1
+                   Sound.SC3.UGen.Record.BFEncode2
+                   Sound.SC3.UGen.Record.BFEncodeSter
+                   Sound.SC3.UGen.Record.BFGrainPanner
+                   Sound.SC3.UGen.Record.BFManipulate
                    Sound.SC3.UGen.Record.BHiPass
                    Sound.SC3.UGen.Record.BHiShelf
+                   Sound.SC3.UGen.Record.BinData
                    Sound.SC3.UGen.Record.BiPanB2
+                   Sound.SC3.UGen.Record.BLBufRd
                    Sound.SC3.UGen.Record.Blip
                    Sound.SC3.UGen.Record.BLowPass
                    Sound.SC3.UGen.Record.BLowShelf
+                   Sound.SC3.UGen.Record.BMoog
                    Sound.SC3.UGen.Record.BPeakEQ
                    Sound.SC3.UGen.Record.BPF
                    Sound.SC3.UGen.Record.BPZ2
+                   Sound.SC3.UGen.Record.Breakcore
                    Sound.SC3.UGen.Record.BRF
+                   Sound.SC3.UGen.Record.Brusselator
                    Sound.SC3.UGen.Record.BRZ2
                    Sound.SC3.UGen.Record.BufAllpassC
                    Sound.SC3.UGen.Record.BufAllpassL
@@ -69,38 +105,61 @@
                    Sound.SC3.UGen.Record.BufDelayN
                    Sound.SC3.UGen.Record.BufDur
                    Sound.SC3.UGen.Record.BufFrames
+                   Sound.SC3.UGen.Record.BufGrainBBF
+                   Sound.SC3.UGen.Record.BufGrainBF
+                   Sound.SC3.UGen.Record.BufGrainB
+                   Sound.SC3.UGen.Record.BufGrain
+                   Sound.SC3.UGen.Record.BufGrainIBF
+                   Sound.SC3.UGen.Record.BufGrainI
                    Sound.SC3.UGen.Record.BufInfoUGenBase
+                   Sound.SC3.UGen.Record.BufMax
+                   Sound.SC3.UGen.Record.BufMin
                    Sound.SC3.UGen.Record.BufRateScale
                    Sound.SC3.UGen.Record.BufRd
                    Sound.SC3.UGen.Record.BufSampleRate
                    Sound.SC3.UGen.Record.BufSamples
                    Sound.SC3.UGen.Record.BufWr
+                   Sound.SC3.UGen.Record.Cepstrum
                    Sound.SC3.UGen.Record.Changed
                    Sound.SC3.UGen.Record.ChaosGen
                    Sound.SC3.UGen.Record.CheckBadValues
+                   Sound.SC3.UGen.Record.ChuaL
+                   Sound.SC3.UGen.Record.CircleRamp
                    Sound.SC3.UGen.Record.ClearBuf
                    Sound.SC3.UGen.Record.Clip
+                   Sound.SC3.UGen.Record.Clipper32
+                   Sound.SC3.UGen.Record.Clipper4
+                   Sound.SC3.UGen.Record.Clipper8
                    Sound.SC3.UGen.Record.CoinGate
                    Sound.SC3.UGen.Record.CombC
                    Sound.SC3.UGen.Record.CombL
+                   Sound.SC3.UGen.Record.CombLP
                    Sound.SC3.UGen.Record.CombN
                    Sound.SC3.UGen.Record.CompanderD
                    Sound.SC3.UGen.Record.Compander
+                   Sound.SC3.UGen.Record.Concat2
+                   Sound.SC3.UGen.Record.Concat
                    Sound.SC3.UGen.Record.Control
                    Sound.SC3.UGen.Record.Convolution2
                    Sound.SC3.UGen.Record.Convolution2L
                    Sound.SC3.UGen.Record.Convolution3
                    Sound.SC3.UGen.Record.Convolution
                    Sound.SC3.UGen.Record.COsc
+                   Sound.SC3.UGen.Record.Coyote
+                   Sound.SC3.UGen.Record.CQ_Diff
                    Sound.SC3.UGen.Record.Crackle
+                   Sound.SC3.UGen.Record.Crest
+                   Sound.SC3.UGen.Record.CrossoverDistortion
                    Sound.SC3.UGen.Record.CuspL
                    Sound.SC3.UGen.Record.CuspN
+                   Sound.SC3.UGen.Record.Dbrown2
                    Sound.SC3.UGen.Record.Dbrown
                    Sound.SC3.UGen.Record.Dbufrd
                    Sound.SC3.UGen.Record.Dbufwr
                    Sound.SC3.UGen.Record.DC
                    Sound.SC3.UGen.Record.Decay2
                    Sound.SC3.UGen.Record.Decay
+                   Sound.SC3.UGen.Record.Decimator
                    Sound.SC3.UGen.Record.DecodeB2
                    Sound.SC3.UGen.Record.DegreeToKey
                    Sound.SC3.UGen.Record.Delay1
@@ -112,18 +171,29 @@
                    Sound.SC3.UGen.Record.DelTapWr
                    Sound.SC3.UGen.Record.DemandEnvGen
                    Sound.SC3.UGen.Record.Demand
+                   Sound.SC3.UGen.Record.DetaBlockerBuf
                    Sound.SC3.UGen.Record.DetectIndex
                    Sound.SC3.UGen.Record.DetectSilence
+                   Sound.SC3.UGen.Record.DFM1
+                   Sound.SC3.UGen.Record.Dgauss
                    Sound.SC3.UGen.Record.Dgeom
                    Sound.SC3.UGen.Record.Dibrown
+                   Sound.SC3.UGen.Record.Disintegrator
                    Sound.SC3.UGen.Record.DiskIn
                    Sound.SC3.UGen.Record.DiskOut
                    Sound.SC3.UGen.Record.Diwhite
                    Sound.SC3.UGen.Record.Donce
                    Sound.SC3.UGen.Record.Done
+                   Sound.SC3.UGen.Record.DoubleNestedAllpassC
+                   Sound.SC3.UGen.Record.DoubleNestedAllpassL
+                   Sound.SC3.UGen.Record.DoubleNestedAllpassN
+                   Sound.SC3.UGen.Record.DoubleWell2
+                   Sound.SC3.UGen.Record.DoubleWell3
+                   Sound.SC3.UGen.Record.DoubleWell
                    Sound.SC3.UGen.Record.Dpoll
                    Sound.SC3.UGen.Record.Drand
                    Sound.SC3.UGen.Record.Dreset
+                   Sound.SC3.UGen.Record.DriveNoise
                    Sound.SC3.UGen.Record.Dseq
                    Sound.SC3.UGen.Record.Dser
                    Sound.SC3.UGen.Record.Dseries
@@ -141,63 +211,157 @@
                    Sound.SC3.UGen.Record.Dxrand
                    Sound.SC3.UGen.Record.DynKlang
                    Sound.SC3.UGen.Record.DynKlank
+                   Sound.SC3.UGen.Record.EnvDetect
+                   Sound.SC3.UGen.Record.EnvFollow
                    Sound.SC3.UGen.Record.EnvGen
                    Sound.SC3.UGen.Record.ExpRand
                    Sound.SC3.UGen.Record.FBSineC
                    Sound.SC3.UGen.Record.FBSineL
                    Sound.SC3.UGen.Record.FBSineN
+                   Sound.SC3.UGen.Record.FFTCentroid
+                   Sound.SC3.UGen.Record.FFTComplexDev
+                   Sound.SC3.UGen.Record.FFTCrest
+                   Sound.SC3.UGen.Record.FFTDiffMags
+                   Sound.SC3.UGen.Record.FFTFlux
+                   Sound.SC3.UGen.Record.FFTFluxPos
                    Sound.SC3.UGen.Record.FFT
+                   Sound.SC3.UGen.Record.FFTInterleave
+                   Sound.SC3.UGen.Record.FFTMKL
+                   Sound.SC3.UGen.Record.FFTPeak
+                   Sound.SC3.UGen.Record.FFTPhaseDev
+                   Sound.SC3.UGen.Record.FFTPower
+                   Sound.SC3.UGen.Record.FFTSlope
+                   Sound.SC3.UGen.Record.FFTSpread
+                   Sound.SC3.UGen.Record.FFTTriggered
                    Sound.SC3.UGen.Record.FFTTrigger
+                   Sound.SC3.UGen.Record.Fhn2DC
+                   Sound.SC3.UGen.Record.Fhn2DL
+                   Sound.SC3.UGen.Record.Fhn2DN
+                   Sound.SC3.UGen.Record.FhnTrig
                    Sound.SC3.UGen.Record.Filter
+                   Sound.SC3.UGen.Record.FincoSprottL
+                   Sound.SC3.UGen.Record.FincoSprottM
+                   Sound.SC3.UGen.Record.FincoSprottS
+                   Sound.SC3.UGen.Record.FitzHughNagumo
+                   Sound.SC3.UGen.Record.FMGrainBBF
+                   Sound.SC3.UGen.Record.FMGrainBF
+                   Sound.SC3.UGen.Record.FMGrainB
+                   Sound.SC3.UGen.Record.FMGrain
+                   Sound.SC3.UGen.Record.FMGrainIBF
+                   Sound.SC3.UGen.Record.FMGrainI
+                   Sound.SC3.UGen.Record.FMHDecode1
+                   Sound.SC3.UGen.Record.FMHEncode0
+                   Sound.SC3.UGen.Record.FMHEncode1
+                   Sound.SC3.UGen.Record.FMHEncode2
+                   Sound.SC3.UGen.Record.FoaAsymmetry
+                   Sound.SC3.UGen.Record.FoaDirectO
+                   Sound.SC3.UGen.Record.FoaDirectX
+                   Sound.SC3.UGen.Record.FoaDirectY
+                   Sound.SC3.UGen.Record.FoaDirectZ
+                   Sound.SC3.UGen.Record.FoaDominateX
+                   Sound.SC3.UGen.Record.FoaDominateY
+                   Sound.SC3.UGen.Record.FoaDominateZ
+                   Sound.SC3.UGen.Record.FoaFocusX
+                   Sound.SC3.UGen.Record.FoaFocusY
+                   Sound.SC3.UGen.Record.FoaFocusZ
+                   Sound.SC3.UGen.Record.FoaNFC
+                   Sound.SC3.UGen.Record.FoaPanB
+                   Sound.SC3.UGen.Record.FoaPressX
+                   Sound.SC3.UGen.Record.FoaPressY
+                   Sound.SC3.UGen.Record.FoaPressZ
+                   Sound.SC3.UGen.Record.FoaProximity
+                   Sound.SC3.UGen.Record.FoaPsychoShelf
+                   Sound.SC3.UGen.Record.FoaPushX
+                   Sound.SC3.UGen.Record.FoaPushY
+                   Sound.SC3.UGen.Record.FoaPushZ
+                   Sound.SC3.UGen.Record.FoaRotate
+                   Sound.SC3.UGen.Record.FoaTilt
+                   Sound.SC3.UGen.Record.FoaTumble
+                   Sound.SC3.UGen.Record.FoaZoomX
+                   Sound.SC3.UGen.Record.FoaZoomY
+                   Sound.SC3.UGen.Record.FoaZoomZ
                    Sound.SC3.UGen.Record.Fold
                    Sound.SC3.UGen.Record.Formant
                    Sound.SC3.UGen.Record.Formlet
                    Sound.SC3.UGen.Record.FOS
+                   Sound.SC3.UGen.Record.FrameCompare
                    Sound.SC3.UGen.Record.Free
                    Sound.SC3.UGen.Record.FreeSelf
                    Sound.SC3.UGen.Record.FreeSelfWhenDone
                    Sound.SC3.UGen.Record.FreeVerb2
                    Sound.SC3.UGen.Record.FreeVerb
                    Sound.SC3.UGen.Record.FreqShift
+                   Sound.SC3.UGen.Record.Friction
                    Sound.SC3.UGen.Record.FSinOsc
                    Sound.SC3.UGen.Record.Gate
+                   Sound.SC3.UGen.Record.GaussClass
+                   Sound.SC3.UGen.Record.GaussTrig
+                   Sound.SC3.UGen.Record.Gbman2DC
+                   Sound.SC3.UGen.Record.Gbman2DL
+                   Sound.SC3.UGen.Record.Gbman2DN
                    Sound.SC3.UGen.Record.GbmanL
                    Sound.SC3.UGen.Record.GbmanN
+                   Sound.SC3.UGen.Record.GbmanTrig
                    Sound.SC3.UGen.Record.Gendy1
                    Sound.SC3.UGen.Record.Gendy2
                    Sound.SC3.UGen.Record.Gendy3
+                   Sound.SC3.UGen.Record.Gendy4
+                   Sound.SC3.UGen.Record.Gendy5
+                   Sound.SC3.UGen.Record.Getenv
+                   Sound.SC3.UGen.Record.GlitchHPF
+                   Sound.SC3.UGen.Record.GlitchRHPF
+                   Sound.SC3.UGen.Record.Goertzel
                    Sound.SC3.UGen.Record.GrainBuf
                    Sound.SC3.UGen.Record.GrainFM
                    Sound.SC3.UGen.Record.GrainIn
                    Sound.SC3.UGen.Record.GrainSin
+                   Sound.SC3.UGen.Record.GravityGrid2
+                   Sound.SC3.UGen.Record.GravityGrid
                    Sound.SC3.UGen.Record.GVerb
                    Sound.SC3.UGen.Record.Hasher
+                   Sound.SC3.UGen.Record.Henon2DC
+                   Sound.SC3.UGen.Record.Henon2DL
+                   Sound.SC3.UGen.Record.Henon2DN
                    Sound.SC3.UGen.Record.HenonC
                    Sound.SC3.UGen.Record.HenonL
                    Sound.SC3.UGen.Record.HenonN
+                   Sound.SC3.UGen.Record.HenonTrig
                    Sound.SC3.UGen.Record.HilbertFIR
                    Sound.SC3.UGen.Record.Hilbert
                    Sound.SC3.UGen.Record.HPF
                    Sound.SC3.UGen.Record.HPZ1
                    Sound.SC3.UGen.Record.HPZ2
+                   Sound.SC3.UGen.Record.ICepstrum
                    Sound.SC3.UGen.Record.IEnvGen
                    Sound.SC3.UGen.Record.IFFT
+                   Sound.SC3.UGen.Record.IIRFilter
                    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.InGrainBBF
+                   Sound.SC3.UGen.Record.InGrainBF
+                   Sound.SC3.UGen.Record.InGrainB
+                   Sound.SC3.UGen.Record.InGrain
+                   Sound.SC3.UGen.Record.InGrainIBF
+                   Sound.SC3.UGen.Record.InGrainI
                    Sound.SC3.UGen.Record.In
                    Sound.SC3.UGen.Record.InRange
                    Sound.SC3.UGen.Record.InRect
+                   Sound.SC3.UGen.Record.InsideOut
+                   Sound.SC3.UGen.Record.Instruction
                    Sound.SC3.UGen.Record.Integrator
                    Sound.SC3.UGen.Record.InTrig
                    Sound.SC3.UGen.Record.IRand
+                   Sound.SC3.UGen.Record.JoshGrain
+                   Sound.SC3.UGen.Record.JoshMultiOutGrain
                    Sound.SC3.UGen.Record.K2A
                    Sound.SC3.UGen.Record.KeyState
                    Sound.SC3.UGen.Record.KeyTrack
                    Sound.SC3.UGen.Record.Klang
                    Sound.SC3.UGen.Record.Klank
+                   Sound.SC3.UGen.Record.KmeansToBPSet1
                    Sound.SC3.UGen.Record.Lag2
                    Sound.SC3.UGen.Record.Lag2UD
                    Sound.SC3.UGen.Record.Lag3
@@ -208,11 +372,18 @@
                    Sound.SC3.UGen.Record.LagUD
                    Sound.SC3.UGen.Record.LastValue
                    Sound.SC3.UGen.Record.Latch
+                   Sound.SC3.UGen.Record.Latoocarfian2DC
+                   Sound.SC3.UGen.Record.Latoocarfian2DL
+                   Sound.SC3.UGen.Record.Latoocarfian2DN
                    Sound.SC3.UGen.Record.LatoocarfianC
                    Sound.SC3.UGen.Record.LatoocarfianL
                    Sound.SC3.UGen.Record.LatoocarfianN
+                   Sound.SC3.UGen.Record.LatoocarfianTrig
                    Sound.SC3.UGen.Record.LeakDC
                    Sound.SC3.UGen.Record.LeastChange
+                   Sound.SC3.UGen.Record.LFBrownNoise0
+                   Sound.SC3.UGen.Record.LFBrownNoise1
+                   Sound.SC3.UGen.Record.LFBrownNoise2
                    Sound.SC3.UGen.Record.LFClipNoise
                    Sound.SC3.UGen.Record.LFCub
                    Sound.SC3.UGen.Record.LFDClipNoise
@@ -239,32 +410,79 @@
                    Sound.SC3.UGen.Record.LinRand
                    Sound.SC3.UGen.Record.LinXFade2
                    Sound.SC3.UGen.Record.ListDUGen
+                   Sound.SC3.UGen.Record.ListTrig2
+                   Sound.SC3.UGen.Record.ListTrig
                    Sound.SC3.UGen.Record.LocalIn
                    Sound.SC3.UGen.Record.LocalOut
+                   Sound.SC3.UGen.Record.Logger
                    Sound.SC3.UGen.Record.Logistic
+                   Sound.SC3.UGen.Record.LoopBuf
+                   Sound.SC3.UGen.Record.Lorenz2DC
+                   Sound.SC3.UGen.Record.Lorenz2DL
+                   Sound.SC3.UGen.Record.Lorenz2DN
                    Sound.SC3.UGen.Record.LorenzL
+                   Sound.SC3.UGen.Record.LorenzTrig
                    Sound.SC3.UGen.Record.Loudness
+                   Sound.SC3.UGen.Record.LPCAnalyzer
+                   Sound.SC3.UGen.Record.LPCError
+                   Sound.SC3.UGen.Record.LPCSynth
+                   Sound.SC3.UGen.Record.LPCVals
+                   Sound.SC3.UGen.Record.LPF18
+                   Sound.SC3.UGen.Record.LPF1
                    Sound.SC3.UGen.Record.LPF
+                   Sound.SC3.UGen.Record.LPFVS6
                    Sound.SC3.UGen.Record.LPZ1
                    Sound.SC3.UGen.Record.LPZ2
+                   Sound.SC3.UGen.Record.LTI
                    Sound.SC3.UGen.Record.MantissaMask
+                   Sound.SC3.UGen.Record.MarkovSynth
+                   Sound.SC3.UGen.Record.Maxamp
+                   Sound.SC3.UGen.Record.Max
+                   Sound.SC3.UGen.Record.MCLDChaosGen
+                   Sound.SC3.UGen.Record.MdaPiano
+                   Sound.SC3.UGen.Record.MeanTriggered
                    Sound.SC3.UGen.Record.Median
+                   Sound.SC3.UGen.Record.MedianTriggered
+                   Sound.SC3.UGen.Record.MembraneCircle
+                   Sound.SC3.UGen.Record.MembraneHexagon
+                   Sound.SC3.UGen.Record.Metro
                    Sound.SC3.UGen.Record.MFCC
                    Sound.SC3.UGen.Record.MidEQ
+                   Sound.SC3.UGen.Record.MonoGrainBF
+                   Sound.SC3.UGen.Record.MonoGrain
                    Sound.SC3.UGen.Record.MoogFF
+                   Sound.SC3.UGen.Record.MoogLadder
+                   Sound.SC3.UGen.Record.MoogVCF
                    Sound.SC3.UGen.Record.MostChange
                    Sound.SC3.UGen.Record.MouseButton
                    Sound.SC3.UGen.Record.MouseX
                    Sound.SC3.UGen.Record.MouseY
                    Sound.SC3.UGen.Record.MultiOutUGen
+                   Sound.SC3.UGen.Record.NeedleRect
+                   Sound.SC3.UGen.Record.NestedAllpassC
+                   Sound.SC3.UGen.Record.NestedAllpassL
+                   Sound.SC3.UGen.Record.NestedAllpassN
+                   Sound.SC3.UGen.Record.NL2
+                   Sound.SC3.UGen.Record.NLFiltC
+                   Sound.SC3.UGen.Record.NLFiltL
+                   Sound.SC3.UGen.Record.NLFiltN
+                   Sound.SC3.UGen.Record.NL
                    Sound.SC3.UGen.Record.Normalizer
                    Sound.SC3.UGen.Record.NRand
+                   Sound.SC3.UGen.Record.NTube
                    Sound.SC3.UGen.Record.OffsetOut
                    Sound.SC3.UGen.Record.OnePole
                    Sound.SC3.UGen.Record.OneZero
                    Sound.SC3.UGen.Record.Onsets
+                   Sound.SC3.UGen.Record.Oregonator
                    Sound.SC3.UGen.Record.Osc
                    Sound.SC3.UGen.Record.OscN
+                   Sound.SC3.UGen.Record.OSFold4
+                   Sound.SC3.UGen.Record.OSFold8
+                   Sound.SC3.UGen.Record.OSTrunc4
+                   Sound.SC3.UGen.Record.OSTrunc8
+                   Sound.SC3.UGen.Record.OSWrap4
+                   Sound.SC3.UGen.Record.OSWrap8
                    Sound.SC3.UGen.Record.Out
                    Sound.SC3.UGen.Record.Pan2
                    Sound.SC3.UGen.Record.Pan4
@@ -272,56 +490,108 @@
                    Sound.SC3.UGen.Record.PanB2
                    Sound.SC3.UGen.Record.PanB
                    Sound.SC3.UGen.Record.Panner
+                   Sound.SC3.UGen.Record.PanX2D
+                   Sound.SC3.UGen.Record.PanX
                    Sound.SC3.UGen.Record.PartConv
                    Sound.SC3.UGen.Record.Pause
                    Sound.SC3.UGen.Record.PauseSelf
                    Sound.SC3.UGen.Record.PauseSelfWhenDone
+                   Sound.SC3.UGen.Record.PeakEQ2
+                   Sound.SC3.UGen.Record.PeakEQ4
                    Sound.SC3.UGen.Record.PeakFollower
                    Sound.SC3.UGen.Record.Peak
+                   Sound.SC3.UGen.Record.Perlin3
                    Sound.SC3.UGen.Record.Phasor
                    Sound.SC3.UGen.Record.Pitch
                    Sound.SC3.UGen.Record.PitchShift
+                   Sound.SC3.UGen.Record.PlaneTree
                    Sound.SC3.UGen.Record.PlayBuf
                    Sound.SC3.UGen.Record.Pluck
+                   Sound.SC3.UGen.Record.PosRatio
+                   Sound.SC3.UGen.Record.PrintVal
                    Sound.SC3.UGen.Record.PSinGrain
                    Sound.SC3.UGen.Record.PulseCount
                    Sound.SC3.UGen.Record.PulseDivider
                    Sound.SC3.UGen.Record.Pulse
                    Sound.SC3.UGen.Record.PV_Add
+                   Sound.SC3.UGen.Record.PV_BinBufRd
+                   Sound.SC3.UGen.Record.PV_BinDelay
+                   Sound.SC3.UGen.Record.PV_BinFilter
+                   Sound.SC3.UGen.Record.PV_BinPlayBuf
                    Sound.SC3.UGen.Record.PV_BinScramble
                    Sound.SC3.UGen.Record.PV_BinShift
                    Sound.SC3.UGen.Record.PV_BinWipe
                    Sound.SC3.UGen.Record.PV_BrickWall
+                   Sound.SC3.UGen.Record.PV_BufRd
                    Sound.SC3.UGen.Record.PV_ChainUGen
+                   Sound.SC3.UGen.Record.PV_CommonMag
+                   Sound.SC3.UGen.Record.PV_CommonMul
+                   Sound.SC3.UGen.Record.PV_Compander
                    Sound.SC3.UGen.Record.PV_ConformalMap
                    Sound.SC3.UGen.Record.PV_Conj
                    Sound.SC3.UGen.Record.PV_Copy
                    Sound.SC3.UGen.Record.PV_CopyPhase
+                   Sound.SC3.UGen.Record.PV_Cutoff
+                   Sound.SC3.UGen.Record.PV_DiffMags
                    Sound.SC3.UGen.Record.PV_Diffuser
                    Sound.SC3.UGen.Record.PV_Div
+                   Sound.SC3.UGen.Record.PV_EvenBin
+                   Sound.SC3.UGen.Record.PV_ExtractRepeat
+                   Sound.SC3.UGen.Record.PV_Freeze
+                   Sound.SC3.UGen.Record.PV_FreqBuffer
                    Sound.SC3.UGen.Record.PV_HainsworthFoote
+                   Sound.SC3.UGen.Record.PVInfo
+                   Sound.SC3.UGen.Record.PV_Invert
                    Sound.SC3.UGen.Record.PV_JensenAndersen
                    Sound.SC3.UGen.Record.PV_LocalMax
                    Sound.SC3.UGen.Record.PV_MagAbove
                    Sound.SC3.UGen.Record.PV_MagBelow
+                   Sound.SC3.UGen.Record.PV_MagBuffer
                    Sound.SC3.UGen.Record.PV_MagClip
                    Sound.SC3.UGen.Record.PV_MagDiv
+                   Sound.SC3.UGen.Record.PV_MagExp
                    Sound.SC3.UGen.Record.PV_MagFreeze
+                   Sound.SC3.UGen.Record.PV_MagGate
+                   Sound.SC3.UGen.Record.PV_MagLog
+                   Sound.SC3.UGen.Record.PV_MagMap
+                   Sound.SC3.UGen.Record.PV_MagMinus
+                   Sound.SC3.UGen.Record.PV_MagMulAdd
                    Sound.SC3.UGen.Record.PV_MagMul
                    Sound.SC3.UGen.Record.PV_MagNoise
+                   Sound.SC3.UGen.Record.PV_MagScale
                    Sound.SC3.UGen.Record.PV_MagShift
                    Sound.SC3.UGen.Record.PV_MagSmear
+                   Sound.SC3.UGen.Record.PV_MagSmooth
                    Sound.SC3.UGen.Record.PV_MagSquared
+                   Sound.SC3.UGen.Record.PV_MagSubtract
                    Sound.SC3.UGen.Record.PV_Max
+                   Sound.SC3.UGen.Record.PV_MaxMagN
                    Sound.SC3.UGen.Record.PV_Min
+                   Sound.SC3.UGen.Record.PV_MinMagN
+                   Sound.SC3.UGen.Record.PV_Morph
                    Sound.SC3.UGen.Record.PV_Mul
+                   Sound.SC3.UGen.Record.PV_NoiseSynthF
+                   Sound.SC3.UGen.Record.PV_NoiseSynthP
+                   Sound.SC3.UGen.Record.PV_OddBin
+                   Sound.SC3.UGen.Record.PV_PartialSynthF
+                   Sound.SC3.UGen.Record.PV_PartialSynthP
                    Sound.SC3.UGen.Record.PV_PhaseShift270
                    Sound.SC3.UGen.Record.PV_PhaseShift90
                    Sound.SC3.UGen.Record.PV_PhaseShift
+                   Sound.SC3.UGen.Record.PV_PitchShift
+                   Sound.SC3.UGen.Record.PV_PlayBuf
                    Sound.SC3.UGen.Record.PV_RandComb
                    Sound.SC3.UGen.Record.PV_RandWipe
+                   Sound.SC3.UGen.Record.PV_RecordBuf
                    Sound.SC3.UGen.Record.PV_RectComb2
                    Sound.SC3.UGen.Record.PV_RectComb
+                   Sound.SC3.UGen.Record.PV_SoftWipe
+                   Sound.SC3.UGen.Record.PV_SpectralEnhance
+                   Sound.SC3.UGen.Record.PV_SpectralMap
+                   Sound.SC3.UGen.Record.PVSynth
+                   Sound.SC3.UGen.Record.PV_Whiten
+                   Sound.SC3.UGen.Record.PV_XFade
+                   Sound.SC3.UGen.Record.Qitch
                    Sound.SC3.UGen.Record.QuadC
                    Sound.SC3.UGen.Record.QuadL
                    Sound.SC3.UGen.Record.QuadN
@@ -330,17 +600,29 @@
                    Sound.SC3.UGen.Record.RandID
                    Sound.SC3.UGen.Record.RandSeed
                    Sound.SC3.UGen.Record.RecordBuf
+                   Sound.SC3.UGen.Record.RegaliaMitraEQ
                    Sound.SC3.UGen.Record.ReplaceOut
                    Sound.SC3.UGen.Record.Resonz
                    Sound.SC3.UGen.Record.RHPF
                    Sound.SC3.UGen.Record.Ringz
+                   Sound.SC3.UGen.Record.RLPFD
                    Sound.SC3.UGen.Record.RLPF
+                   Sound.SC3.UGen.Record.RMAFoodChainL
+                   Sound.SC3.UGen.Record.RMEQ
+                   Sound.SC3.UGen.Record.RMEQSuite
+                   Sound.SC3.UGen.Record.RMShelf2
+                   Sound.SC3.UGen.Record.RMShelf
+                   Sound.SC3.UGen.Record.RosslerL
+                   Sound.SC3.UGen.Record.RosslerResL
                    Sound.SC3.UGen.Record.Rotate2
+                   Sound.SC3.UGen.Record.Rotate
                    Sound.SC3.UGen.Record.RunningMax
                    Sound.SC3.UGen.Record.RunningMin
                    Sound.SC3.UGen.Record.RunningSum
+                   Sound.SC3.UGen.Record.SawDPW
                    Sound.SC3.UGen.Record.Saw
                    Sound.SC3.UGen.Record.Schmidt
+                   Sound.SC3.UGen.Record.ScopeOut2
                    Sound.SC3.UGen.Record.ScopeOut
                    Sound.SC3.UGen.Record.Select
                    Sound.SC3.UGen.Record.SendTrig
@@ -349,50 +631,124 @@
                    Sound.SC3.UGen.Record.Shaper
                    Sound.SC3.UGen.Record.SharedIn
                    Sound.SC3.UGen.Record.SharedOut
+                   Sound.SC3.UGen.Record.Sieve1
                    Sound.SC3.UGen.Record.Silent
+                   Sound.SC3.UGen.Record.SineShaper
+                   Sound.SC3.UGen.Record.SinGrainBBF
+                   Sound.SC3.UGen.Record.SinGrainBF
+                   Sound.SC3.UGen.Record.SinGrainB
+                   Sound.SC3.UGen.Record.SinGrain
+                   Sound.SC3.UGen.Record.SinGrainIBF
+                   Sound.SC3.UGen.Record.SinGrainI
                    Sound.SC3.UGen.Record.SinOscFB
                    Sound.SC3.UGen.Record.SinOsc
+                   Sound.SC3.UGen.Record.SinTone
+                   Sound.SC3.UGen.Record.SkipNeedle
                    Sound.SC3.UGen.Record.Slew
+                   Sound.SC3.UGen.Record.SLOnset
                    Sound.SC3.UGen.Record.Slope
+                   Sound.SC3.UGen.Record.SmoothDecimator
+                   Sound.SC3.UGen.Record.SMS
+                   Sound.SC3.UGen.Record.SoftClipAmp4
+                   Sound.SC3.UGen.Record.SoftClipAmp8
+                   Sound.SC3.UGen.Record.SoftClipAmp
+                   Sound.SC3.UGen.Record.SoftClipper4
+                   Sound.SC3.UGen.Record.SoftClipper8
+                   Sound.SC3.UGen.Record.SOMAreaWr
+                   Sound.SC3.UGen.Record.SOMRd
+                   Sound.SC3.UGen.Record.SOMTrain
+                   Sound.SC3.UGen.Record.SortBuf
                    Sound.SC3.UGen.Record.SOS
                    Sound.SC3.UGen.Record.SpecCentroid
                    Sound.SC3.UGen.Record.SpecFlatness
                    Sound.SC3.UGen.Record.SpecPcile
+                   Sound.SC3.UGen.Record.Spreader
                    Sound.SC3.UGen.Record.Spring
+                   Sound.SC3.UGen.Record.SpruceBudworm
+                   Sound.SC3.UGen.Record.Squiz
+                   Sound.SC3.UGen.Record.Standard2DC
+                   Sound.SC3.UGen.Record.Standard2DL
+                   Sound.SC3.UGen.Record.Standard2DN
                    Sound.SC3.UGen.Record.StandardL
                    Sound.SC3.UGen.Record.StandardN
+                   Sound.SC3.UGen.Record.StandardTrig
                    Sound.SC3.UGen.Record.Stepper
                    Sound.SC3.UGen.Record.StereoConvolution2L
+                   Sound.SC3.UGen.Record.StkBandedWG
+                   Sound.SC3.UGen.Record.StkBeeThree
+                   Sound.SC3.UGen.Record.StkBlowHole
+                   Sound.SC3.UGen.Record.StkBowed
+                   Sound.SC3.UGen.Record.StkClarinet
+                   Sound.SC3.UGen.Record.StkFlute
+                   Sound.SC3.UGen.Record.StkMandolin
+                   Sound.SC3.UGen.Record.StkModalBar
+                   Sound.SC3.UGen.Record.StkMoog
+                   Sound.SC3.UGen.Record.StkPluck
+                   Sound.SC3.UGen.Record.StkSaxofony
+                   Sound.SC3.UGen.Record.StkShakers
+                   Sound.SC3.UGen.Record.StkVoicForm
+                   Sound.SC3.UGen.Record.Streson
+                   Sound.SC3.UGen.Record.Summer
+                   Sound.SC3.UGen.Record.SVF
                    Sound.SC3.UGen.Record.Sweep
+                   Sound.SC3.UGen.Record.SwitchDelay
                    Sound.SC3.UGen.Record.SyncSaw
                    Sound.SC3.UGen.Record.T2A
                    Sound.SC3.UGen.Record.T2K
                    Sound.SC3.UGen.Record.Tap
+                   Sound.SC3.UGen.Record.Tartini
                    Sound.SC3.UGen.Record.TBall
+                   Sound.SC3.UGen.Record.TBetaRand
+                   Sound.SC3.UGen.Record.TBrownRand
                    Sound.SC3.UGen.Record.TDelay
                    Sound.SC3.UGen.Record.TDuty
+                   Sound.SC3.UGen.Record.TermanWang
                    Sound.SC3.UGen.Record.TExpRand
+                   Sound.SC3.UGen.Record.TGaussRand
+                   Sound.SC3.UGen.Record.TGrains2
+                   Sound.SC3.UGen.Record.TGrains3
                    Sound.SC3.UGen.Record.TGrains
+                   Sound.SC3.UGen.Record.Tilt
                    Sound.SC3.UGen.Record.Timer
                    Sound.SC3.UGen.Record.TIRand
                    Sound.SC3.UGen.Record.ToggleFF
+                   Sound.SC3.UGen.Record.TPV
                    Sound.SC3.UGen.Record.TRand
                    Sound.SC3.UGen.Record.Trig1
+                   Sound.SC3.UGen.Record.TrigAvg
                    Sound.SC3.UGen.Record.TrigControl
                    Sound.SC3.UGen.Record.Trig
+                   Sound.SC3.UGen.Record.TTendency
+                   Sound.SC3.UGen.Record.Tumble
                    Sound.SC3.UGen.Record.TWChoose
                    Sound.SC3.UGen.Record.TWindex
                    Sound.SC3.UGen.Record.TwoPole
+                   Sound.SC3.UGen.Record.TwoTube
                    Sound.SC3.UGen.Record.TwoZero
+                   Sound.SC3.UGen.Record.UHJ2B
                    Sound.SC3.UGen.Record.Unpack1FFT
+                   Sound.SC3.UGen.Record.VarLag
                    Sound.SC3.UGen.Record.VarSaw
+                   Sound.SC3.UGen.Record.VBAP
                    Sound.SC3.UGen.Record.VDiskIn
                    Sound.SC3.UGen.Record.Vibrato
+                   Sound.SC3.UGen.Record.VMScan2D
                    Sound.SC3.UGen.Record.VOsc3
                    Sound.SC3.UGen.Record.VOsc
+                   Sound.SC3.UGen.Record.VOSIM
+                   Sound.SC3.UGen.Record.WalshHadamard
+                   Sound.SC3.UGen.Record.WAmp
                    Sound.SC3.UGen.Record.Warp1
+                   Sound.SC3.UGen.Record.WarpZ
+                   Sound.SC3.UGen.Record.WaveletDaub
+                   Sound.SC3.UGen.Record.WaveLoss
+                   Sound.SC3.UGen.Record.WaveTerrain
+                   Sound.SC3.UGen.Record.WeaklyNonlinear2
+                   Sound.SC3.UGen.Record.WeaklyNonlinear
+                   Sound.SC3.UGen.Record.WidthFirstUGen
                    Sound.SC3.UGen.Record.Wrap
                    Sound.SC3.UGen.Record.WrapIndex
+                   Sound.SC3.UGen.Record.WrapSummer
                    Sound.SC3.UGen.Record.XFade2
                    Sound.SC3.UGen.Record.XFade
                    Sound.SC3.UGen.Record.XLine
diff --git a/mk/build.hs b/mk/build.hs
--- a/mk/build.hs
+++ b/mk/build.hs
@@ -1,40 +1,10 @@
 import Data.Char
-import Sound.SC3.UGen.Rate
-import qualified Sound.SC3.UGen.DB.Data as D
-import System.FilePath
+import Sound.SC3.UGen.Rate {- hsc3 -}
+import qualified Sound.SC3.UGen.DB.Data as D {- hsc3-db -}
+import qualified Sound.SC3.UGen.DB.Record as D
+import System.FilePath {- 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 p =
-    case p of
-      "in" -> "input"
-      "channelsArray" -> "input"
-      "exp" -> "exp_"
-      "id" -> "id_"
-      "length" -> "length_"
-      "init" -> "init_"
-      "floor" -> "floor_"
-      "div" -> "div_"
-      "max" -> "max_"
-      "min" -> "min_"
-      "spring" -> "spring_"
-      "rate" -> "rate_"
-      "default" -> "default_"
-      _ -> p
-
--- Rename unit generators that conflict with keywords or prelude
--- functions.
-rename_ugen :: String -> String
-rename_ugen u =
-    case u of
-      "in" -> "in'"
-      _ -> u
-
-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
@@ -44,16 +14,16 @@
 -- which can be innacurate (see pitch for example).
 fixed_rate :: D.U -> Rate
 fixed_rate u =
-    case u of
-      D.U _ [r] _ _ _ -> r
-      D.U _ [] r _ _ -> r
+    case D.ugen_operating_rates u of
+      [r] -> r
+      [] -> D.ugen_default_rate u
       _ -> 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")
+        bs = zip (map (input_name u) is) (repeat "S.UGen")
     in if needs_rate u
        then ("rate", "S.Rate") : bs
        else bs
@@ -88,13 +58,14 @@
 
 -- 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)
+gen_defaults u =
+    let (D.U n _ r _ is _ _ _) = u
+        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)
+        f i = printf "  %s = %f" (input_name u i) (D.input_default i)
     in pre ++ opt ++ with_comma (map f is) ++ post
 
 -- Generate a list of variable names (a,b..)
@@ -103,13 +74,17 @@
 
 -- 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)
+gen_cons u =
+    let (D.U n _ _ _ is _ o _) = u
+        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))
+        o' = case o of
+               Left x -> show x
+               Right _ -> "undefined"
     in [ printf "mk%s :: %s -> S.UGen" n n
-       , printf "mk%s (%s %s %s) = S.mkOsc %s \"%s\" [%s] %d"
+       , printf "mk%s (%s %s %s) = S.mkOsc %s \"%s\" [%s] %s"
                 n
                 n
                 l_opt
@@ -117,7 +92,7 @@
                 r_opt
                 n
                 (concat (with_comma xs))
-                o]
+                o']
 
 -- Generate instance of the Make class.
 gen_make :: D.U -> [String]
@@ -134,7 +109,8 @@
 write_module :: D.U -> IO ()
 write_module u =
     let n = D.ugen_name u
-        m = [ printf "module Sound.SC3.UGen.Record.%s where" n
+        m = [ printf "-- | %s" (D.ugen_summary u)
+            , 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
