diff --git a/README b/README
--- a/README
+++ b/README
@@ -3,5 +3,5 @@
 hsc3-db provides Sound.SC3.UGen.DB.Data, a Haskell module that
 contains a database of SC3 UGens.
 
-(c) rohan drape, 2006-2010
+(c) rohan drape, 2006-2011
     gpl, http://gnu.org/copyleft/
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+import Distribution.Simple
+main = defaultMain
diff --git a/Setup.lhs b/Setup.lhs
deleted file mode 100644
--- a/Setup.lhs
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env runhaskell
-> import Distribution.Simple
-> main = defaultMain
diff --git a/Sound/SC3/UGen/DB/Data.hs b/Sound/SC3/UGen/DB/Data.hs
--- a/Sound/SC3/UGen/DB/Data.hs
+++ b/Sound/SC3/UGen/DB/Data.hs
@@ -1,4 +1,4 @@
--- AUTOGENERATED: 2009-06-20-13h07
+-- AUTOGENERATED: 2011-03-09-10h59
 module Sound.SC3.UGen.DB.Data where
 import Sound.SC3.UGen.Rate
 data I = I { input_name :: String, input_default :: Double } deriving (Eq, Show)
@@ -37,7 +37,7 @@
          , U "BeatTrack" [ KR ] AR [ I "chain" (0), I "lock" (0) ] 4
          , U "BeatTrack2" [ KR ] AR [ I "busindex" (0), I "numfeatures" (0), I "windowsize" (2), I "phaseaccuracy" (0.02), I "lock" (0), I "weightingscheme" (0) ] 6
          , U "BiPanB2" [ AR, KR ] AR [ I "inA" (0), I "inB" (0), I "azimuth" (0), I "gain" (1) ] 3
-         , U "Blip" [ AR ] AR [ I "freq" (440), I "numharm" (200) ] 1
+         , U "Blip" [ AR, KR ] AR [ I "freq" (440), I "numharm" (200) ] 1
          , U "BrownNoise" [ AR, KR ] AR [  ] 1
          , U "BufAllpassC" [ AR ] AR [ I "buf" (0), I "in" (0), I "delaytime" (0.2), I "decaytime" (1) ] 1
          , U "BufAllpassL" [ AR ] AR [ I "buf" (0), I "in" (0), I "delaytime" (0.2), I "decaytime" (1) ] 1
@@ -58,10 +58,11 @@
          , U "BufSamples" [ KR, IR ] AR [ I "bufnum" (0) ] 1
          , U "BufWr" [ AR, KR ] AR [ I "inputArray" (0), I "bufnum" (0), I "phase" (0), I "loop" (1) ] 1
          , U "COsc" [ AR, KR ] AR [ I "bufnum" (0), I "freq" (440), I "beats" (0.5) ] 1
+         , U "Changed" [ AR, KR ] AR [ I "input" (0), I "threshold" (0) ] 1
          , U "ChaosGen" [  ] AR [ I "maxSize" (0) ] 1
          , U "CheckBadValues" [ AR, KR ] AR [ I "in" (0), I "id" (0), I "post" (2) ] 1
          , U "ClearBuf" [  ] IR [ I "buf" (0) ] 1
-         , U "Clip" [ AR, KR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
+         , U "Clip" [ AR, KR, IR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
          , U "ClipNoise" [ AR, KR ] AR [  ] 1
          , U "CoinGate" [ AR, KR ] AR [ I "prob" (0), I "in" (0) ] 1
          , U "CombC" [ AR, KR ] AR [ I "in" (0), I "maxdelaytime" (0.2), I "delaytime" (0.2), I "decaytime" (1) ] 1
@@ -73,9 +74,9 @@
          , U "ControlDur" [ IR ] AR [  ] 1
          , U "ControlRate" [ IR ] AR [  ] 1
          , U "Convolution" [ AR ] AR [ I "in" (0), I "kernel" (0), I "framesize" (512) ] 1
-         , U "Convolution2" [ AR ] AR [ I "in" (0), I "kernel" (0), I "trigger" (0), I "framesize" (0) ] 1
-         , U "Convolution2L" [ AR ] AR [ I "in" (0), I "kernel" (0), I "trigger" (0), I "framesize" (0), I "crossfade" (1) ] 1
-         , U "Convolution3" [ AR, KR ] AR [ I "in" (0), I "kernel" (0), I "trigger" (0), I "framesize" (0) ] 1
+         , U "Convolution2" [ AR ] AR [ I "in" (0), I "kernel" (0), I "trigger" (0), I "framesize" (2048) ] 1
+         , U "Convolution2L" [ AR ] AR [ I "in" (0), I "kernel" (0), I "trigger" (0), I "framesize" (2048), I "crossfade" (1) ] 1
+         , U "Convolution3" [ AR, KR ] AR [ I "in" (0), I "kernel" (0), I "trigger" (0), I "framesize" (2048) ] 1
          , U "Crackle" [ AR, KR ] AR [ I "chaosParam" (1.5) ] 1
          , U "CuspL" [ AR ] AR [ I "freq" (22050), I "a" (1), I "b" (1.9), I "xi" (0) ] 1
          , U "CuspN" [ AR ] AR [ I "freq" (22050), I "a" (1), I "b" (1.9), I "xi" (0) ] 1
@@ -88,6 +89,8 @@
          , U "Decay2" [ AR, KR ] AR [ I "in" (0), I "attackTime" (0.01), I "decayTime" (1) ] 1
          , U "DecodeB2" [ AR, KR ] AR [ I "numChans" (0), I "w" (0), I "x" (0), I "y" (0), I "orientation" (0.5) ] 1
          , U "DegreeToKey" [ AR, KR ] AR [ I "bufnum" (0), I "in" (0), I "octave" (12) ] 1
+         , U "DelTapRd" [ AR, KR ] AR [ I "buffer" (0), I "phase" (0), I "delTime" (0), I "interp" (1) ] 1
+         , U "DelTapWr" [ AR, KR ] AR [ I "buffer" (0), I "in" (0) ] 1
          , U "Delay1" [ AR, KR ] AR [ I "in" (0) ] 1
          , U "Delay2" [ AR, KR ] AR [ I "in" (0) ] 1
          , U "DelayC" [ AR, KR ] AR [ I "in" (0), I "maxdelaytime" (0.2), I "delaytime" (0.2) ] 1
@@ -106,6 +109,7 @@
          , U "Done" [ KR ] AR [ I "src" (0) ] 1
          , U "Dpoll" [  ] DR [ I "in" (0), I "label" (0), I "run" (1), I "trigid" (-1) ] 1
          , U "Drand" [  ] DR [ I "list" (0), I "repeats" (1) ] 1
+         , U "Dreset" [  ] DR [ I "in" (0), I "reset" (0) ] 1
          , U "Dseq" [  ] DR [ I "list" (0), I "repeats" (1) ] 1
          , U "Dser" [  ] DR [ I "list" (0), I "repeats" (1) ] 1
          , U "Dseries" [  ] DR [ I "start" (1), I "step" (1), I "length" (inf) ] 1
@@ -113,13 +117,15 @@
          , U "Dstutter" [  ] DR [ I "n" (0), I "in" (0) ] 1
          , U "Dswitch" [  ] DR [ I "list" (0), I "index" (0) ] 1
          , U "Dswitch1" [  ] DR [ I "list" (0), I "index" (0) ] 1
+         , U "Dunique" [  ] AR [ I "source" (0) ] 1
          , U "Dust" [ AR, KR ] AR [ I "density" (0) ] 1
          , U "Dust2" [ AR, KR ] AR [ I "density" (0) ] 1
          , U "Duty" [ AR, KR ] AR [ I "dur" (1), I "reset" (0), I "level" (1), I "doneAction" (0) ] 1
          , U "Dwhite" [  ] DR [ I "lo" (0), I "hi" (1), I "length" (inf) ] 1
+         , U "Dwrand" [  ] DR [ I "list" (0), I "weights" (0), I "repeats" (1) ] 1
          , U "Dxrand" [  ] DR [ I "list" (0), I "repeats" (1) ] 1
-         , U "DynKlang" [ AR ] AR [ I "specificationsArrayRef" (0), I "freqscale" (1), I "freqoffset" (0) ] 1
-         , U "DynKlank" [ AR ] AR [ I "specificationsArrayRef" (0), I "input" (0), I "freqscale" (1), I "freqoffset" (0), I "decayscale" (1) ] 1
+         , U "DynKlang" [ AR, KR ] AR [ I "specificationsArrayRef" (0), I "freqscale" (1), I "freqoffset" (0) ] 1
+         , U "DynKlank" [ AR, KR ] AR [ I "specificationsArrayRef" (0), I "input" (0), I "freqscale" (1), I "freqoffset" (0), I "decayscale" (1) ] 1
          , U "EnvGen" [ AR, KR ] AR [ I "envelope" (0), I "gate" (1), I "levelScale" (1), I "levelBias" (0), I "timeScale" (1), I "doneAction" (0) ] 1
          , U "ExpRand" [  ] IR [ I "lo" (0.01), I "hi" (1) ] 1
          , U "FBSineC" [ AR ] AR [ I "freq" (22050), I "im" (1), I "fb" (0.1), I "a" (1.1), I "c" (0.5), I "xi" (0.1), I "yi" (0.1) ] 1
@@ -130,7 +136,7 @@
          , U "FOS" [ AR, KR ] AR [ I "in" (0), I "a0" (0), I "a1" (0), I "b1" (0) ] 1
          , U "FSinOsc" [ AR, KR ] AR [ I "freq" (440), I "iphase" (0) ] 1
          , U "Filter" [  ] AR [ I "maxSize" (0) ] 1
-         , U "Fold" [ AR, KR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
+         , U "Fold" [ AR, KR, IR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
          , U "Formant" [ AR ] AR [ I "fundfreq" (440), I "formfreq" (1760), I "bwfreq" (880) ] 1
          , U "Formlet" [ AR, KR ] AR [ I "in" (0), I "freq" (440), I "attacktime" (1), I "decaytime" (1) ] 1
          , U "Free" [ KR ] AR [ I "trig" (0), I "id" (0) ] 1
@@ -146,10 +152,10 @@
          , U "Gendy1" [ AR, KR ] AR [ I "ampdist" (1), I "durdist" (1), I "adparam" (1), I "ddparam" (1), I "minfreq" (440), I "maxfreq" (660), I "ampscale" (0.5), I "durscale" (0.5), I "initCPs" (12), I "knum" (0) ] 1
          , U "Gendy2" [ AR, KR ] AR [ I "ampdist" (1), I "durdist" (1), I "adparam" (1), I "ddparam" (1), I "minfreq" (440), I "maxfreq" (660), I "ampscale" (0.5), I "durscale" (0.5), I "initCPs" (12), I "knum" (0), I "a" (1.17), I "c" (0.31) ] 1
          , U "Gendy3" [ AR, KR ] AR [ I "ampdist" (1), I "durdist" (1), I "adparam" (1), I "ddparam" (1), I "freq" (440), I "ampscale" (0.5), I "durscale" (0.5), I "initCPs" (12), I "knum" (0) ] 1
-         , U "GrainBuf" [ AR ] AR [ I "numChannels" (1), I "trigger" (0), I "dur" (1), I "sndbuf" (0), I "rate" (1), I "pos" (0), I "interp" (2), I "pan" (0), I "envbufnum" (-1) ] 1
-         , U "GrainFM" [ AR ] AR [ I "numChannels" (1), I "trigger" (0), I "dur" (1), I "carfreq" (440), I "modfreq" (200), I "index" (1), I "pan" (0), I "envbufnum" (-1) ] 1
-         , U "GrainIn" [ AR ] AR [ I "numChannels" (1), I "trigger" (0), I "dur" (1), I "in" (0), I "pan" (0), I "envbufnum" (-1) ] 1
-         , U "GrainSin" [ AR ] AR [ I "numChannels" (1), I "trigger" (0), I "dur" (1), I "freq" (440), I "pan" (0), I "envbufnum" (-1) ] 1
+         , U "GrainBuf" [ AR ] AR [ I "numChannels" (1), I "trigger" (0), I "dur" (1), I "sndbuf" (0), I "rate" (1), I "pos" (0), I "interp" (2), I "pan" (0), I "envbufnum" (-1), I "maxGrains" (512) ] 1
+         , U "GrainFM" [ AR ] AR [ I "numChannels" (1), I "trigger" (0), I "dur" (1), I "carfreq" (440), I "modfreq" (200), I "index" (1), I "pan" (0), I "envbufnum" (-1), I "maxGrains" (512) ] 1
+         , U "GrainIn" [ AR ] AR [ I "numChannels" (1), I "trigger" (0), I "dur" (1), I "in" (0), I "pan" (0), I "envbufnum" (-1), I "maxGrains" (512) ] 1
+         , U "GrainSin" [ AR ] AR [ I "numChannels" (1), I "trigger" (0), I "dur" (1), I "freq" (440), I "pan" (0), I "envbufnum" (-1), I "maxGrains" (512) ] 1
          , U "GrayNoise" [ AR, KR ] AR [  ] 1
          , U "HPF" [ AR, KR ] AR [ I "in" (0), I "freq" (440) ] 1
          , U "HPZ1" [ AR, KR ] AR [ I "in" (0) ] 1
@@ -166,11 +172,12 @@
          , U "Impulse" [ AR, KR ] AR [ I "freq" (440), I "phase" (0) ] 1
          , U "In" [ AR, KR ] AR [ I "bus" (0), I "numChannels" (1) ] 1
          , U "InFeedback" [ AR ] AR [ I "bus" (0), I "numChannels" (1) ] 1
-         , U "InRange" [ AR, KR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
+         , U "InRange" [ AR, KR, IR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
          , U "InRect" [ AR, KR ] AR [ I "x" (0), I "y" (0), I "rect" (0) ] 1
          , U "InTrig" [ KR ] AR [ I "bus" (0), I "numChannels" (1) ] 1
          , U "Index" [ AR, KR ] AR [ I "bufnum" (0), I "in" (0) ] 1
          , U "IndexInBetween" [ AR, KR ] AR [ I "bufnum" (0), I "in" (0) ] 1
+         , U "IndexL" [ AR, KR ] AR [ I "bufnum" (0), I "in" (0) ] 1
          , U "InfoUGenBase" [ IR ] AR [  ] 1
          , U "Integrator" [ AR, KR ] AR [ I "in" (0), I "coef" (1) ] 1
          , U "K2A" [ AR ] AR [ I "in" (0) ] 1
@@ -222,7 +229,7 @@
          , U "Line" [ AR, KR ] AR [ I "start" (0), I "end" (1), I "dur" (1), I "doneAction" (0) ] 1
          , U "Linen" [ KR ] AR [ I "gate" (1), I "attackTime" (0.01), I "susLevel" (1), I "releaseTime" (1), I "doneAction" (0) ] 1
          , U "ListDUGen" [  ] DR [ I "list" (0), I "repeats" (1) ] 1
-         , U "LocalIn" [ AR, KR ] AR [ I "numChannels" (1) ] 1
+         , U "LocalIn" [ AR, KR ] AR [ I "numChannels" (1), I "default" (0) ] 1
          , U "LocalOut" [ AR, KR ] AR [ I "channelsArray" (0) ] 1
          , U "Logistic" [ AR, KR ] AR [ I "chaosParam" (3), I "freq" (1000), I "init" (0.5) ] 1
          , U "LorenzL" [ AR ] AR [ I "freq" (22050), I "s" (10), I "r" (28), I "b" (2.667), I "h" (0.05), I "xi" (0.1), I "yi" (0), I "zi" (0) ] 1
@@ -299,15 +306,15 @@
          , U "Pause" [ KR ] AR [ I "gate" (0), I "id" (0) ] 1
          , U "PauseSelf" [ KR ] AR [ I "in" (0) ] 1
          , U "PauseSelfWhenDone" [ KR ] AR [ I "src" (0) ] 1
-         , U "Peak" [ AR, KR ] AR [ I "trig" (0), I "reset" (0) ] 1
+         , U "Peak" [ AR, KR ] AR [ I "in" (0), I "trig" (0) ] 1
          , U "PeakFollower" [ AR, KR ] AR [ I "in" (0), I "decay" (0.999) ] 1
          , U "Phasor" [ AR, KR ] AR [ I "trig" (0), I "rate" (1), I "start" (0), I "end" (1), I "resetPos" (0) ] 1
          , U "PinkNoise" [ AR, KR ] AR [  ] 1
-         , U "Pitch" [ KR ] AR [ I "in" (0), I "initFreq" (440), I "minFreq" (60), I "maxFreq" (4000), I "execFreq" (100), I "maxBinsPerOctave" (16), I "median" (1), I "ampThreshold" (0.01), I "peakThreshold" (0.5), I "downSample" (1) ] 2
+         , U "Pitch" [ KR ] AR [ I "in" (0), I "initFreq" (440), I "minFreq" (60), I "maxFreq" (4000), I "execFreq" (100), I "maxBinsPerOctave" (16), I "median" (1), I "ampThreshold" (0.01), I "peakThreshold" (0.5), I "downSample" (1), I "clar" (0) ] 2
          , U "PitchShift" [ AR ] AR [ I "in" (0), I "windowSize" (0.2), I "pitchRatio" (1), I "pitchDispersion" (0), I "timeDispersion" (0) ] 1
          , U "PlayBuf" [ AR, KR ] AR [ I "numChannels" (0), I "bufnum" (0), I "rate" (1), I "trigger" (1), I "startPos" (0), I "loop" (0), I "doneAction" (0) ] 1
          , U "Pluck" [ AR ] AR [ I "in" (0), I "trig" (1), I "maxdelaytime" (0.2), I "delaytime" (0.2), I "decaytime" (1), I "coef" (0.5) ] 1
-         , U "Pulse" [ AR ] AR [ I "freq" (440), I "width" (0.5) ] 1
+         , U "Pulse" [ AR, KR ] AR [ I "freq" (440), I "width" (0.5) ] 1
          , U "PulseCount" [ AR, KR ] AR [ I "trig" (0), I "reset" (0) ] 1
          , U "PulseDivider" [ AR, KR ] AR [ I "trig" (0), I "div" (2), I "start" (0) ] 1
          , U "QuadC" [ AR ] AR [ I "freq" (22050), I "a" (1), I "b" (-1), I "c" (-0.75), I "xi" (0) ] 1
@@ -319,20 +326,20 @@
          , U "Ramp" [ AR, KR ] AR [ I "in" (0), I "lagTime" (0.1) ] 1
          , U "Rand" [  ] IR [ I "lo" (0), I "hi" (1) ] 1
          , U "RandID" [ KR, IR ] AR [ I "id" (0) ] 1
-         , U "RandSeed" [ KR, IR ] AR [ I "trig" (0), I "seed" (56789) ] 1
+         , U "RandSeed" [ AR, KR, IR ] AR [ I "trig" (0), I "seed" (56789) ] 1
          , U "RecordBuf" [ AR, KR ] AR [ I "inputArray" (0), I "bufnum" (0), I "offset" (0), I "recLevel" (1), I "preLevel" (0), I "run" (1), I "loop" (1), I "trigger" (1), I "doneAction" (0) ] 1
          , U "ReplaceOut" [ AR, KR ] AR [ I "bus" (0), I "channelsArray" (0) ] 1
          , U "Resonz" [ AR, KR ] AR [ I "in" (0), I "freq" (440), I "bwr" (1) ] 1
          , U "Ringz" [ AR, KR ] AR [ I "in" (0), I "freq" (440), I "decaytime" (1) ] 1
          , U "Rotate2" [ AR, KR ] AR [ I "x" (0), I "y" (0), I "pos" (0) ] 2
-         , U "RunningMax" [ AR, KR ] AR [ I "trig" (0), I "reset" (0) ] 1
-         , U "RunningMin" [ AR, KR ] AR [ I "trig" (0), I "reset" (0) ] 1
+         , U "RunningMax" [ AR, KR ] AR [ I "in" (0), I "trig" (0) ] 1
+         , U "RunningMin" [ AR, KR ] AR [ I "in" (0), I "trig" (0) ] 1
          , U "RunningSum" [ AR, KR ] AR [ I "in" (0), I "numsamp" (40) ] 1
          , U "SOS" [ AR, KR ] AR [ I "in" (0), I "a0" (0), I "a1" (0), I "a2" (0), I "b1" (0), I "b2" (0) ] 1
          , U "SampleDur" [ IR ] AR [  ] 1
          , U "SampleRate" [ IR ] AR [  ] 1
-         , U "Saw" [ AR ] AR [ I "freq" (440) ] 1
-         , U "Schmidt" [ AR, KR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
+         , U "Saw" [ AR, KR ] AR [ I "freq" (440) ] 1
+         , U "Schmidt" [ AR, KR, IR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
          , U "ScopeOut" [ AR, KR ] AR [ I "inputArray" (0), I "bufnum" (0) ] 1
          , U "Select" [ AR, KR ] AR [ I "which" (0), I "array" (0) ] 1
          , U "SendTrig" [ AR, KR ] AR [ I "in" (0), I "id" (0), I "value" (0) ] 1
@@ -353,7 +360,7 @@
          , U "StandardL" [ AR ] AR [ I "freq" (22050), I "k" (1), I "xi" (0.5), I "yi" (0) ] 1
          , U "StandardN" [ AR ] AR [ I "freq" (22050), I "k" (1), I "xi" (0.5), I "yi" (0) ] 1
          , U "Stepper" [ AR, KR ] AR [ I "trig" (0), I "reset" (0), I "min" (0), I "max" (7), I "step" (1), I "resetval" (0) ] 1
-         , U "StereoConvolution2L" [ AR ] AR [ I "in" (0), I "kernelL" (0), I "kernelR" (0), I "trigger" (0), I "framesize" (0), I "crossfade" (1) ] 2
+         , U "StereoConvolution2L" [ AR ] AR [ I "in" (0), I "kernelL" (0), I "kernelR" (0), I "trigger" (0), I "framesize" (2048), I "crossfade" (1) ] 2
          , U "SubsampleOffset" [ IR ] AR [  ] 1
          , U "Sweep" [ AR, KR ] AR [ I "trig" (0), I "rate" (1) ] 1
          , U "SyncSaw" [ AR, KR ] AR [ I "syncFreq" (440), I "sawFreq" (440) ] 1
@@ -384,7 +391,7 @@
          , U "Vibrato" [ AR, KR ] AR [ I "freq" (440), I "rate" (6), I "depth" (0.02), I "delay" (0), I "onset" (0), I "rateVariation" (0.04), I "depthVariation" (0.1), I "iphase" (0) ] 1
          , U "Warp1" [ AR ] AR [ I "numChannels" (1), I "bufnum" (0), I "pointer" (0), I "freqScale" (1), I "windowSize" (0.2), I "envbufnum" (-1), I "overlaps" (8), I "windowRandRatio" (0), I "interp" (1) ] 1
          , U "WhiteNoise" [ AR, KR ] AR [  ] 1
-         , U "Wrap" [ AR, KR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
+         , U "Wrap" [ AR, KR, IR ] AR [ I "in" (0), I "lo" (0), I "hi" (1) ] 1
          , U "WrapIndex" [ AR, KR ] AR [ I "bufnum" (0), I "in" (0) ] 1
          , U "XFade" [  ] AR [ I "maxSize" (0) ] 1
          , U "XFade2" [ AR, KR ] AR [ I "inA" (0), I "inB" (0), I "pan" (0), I "level" (1) ] 1
diff --git a/hsc3-db.cabal b/hsc3-db.cabal
--- a/hsc3-db.cabal
+++ b/hsc3-db.cabal
@@ -1,22 +1,30 @@
 Name:              hsc3-db
-Version:           0.8
+Version:           0.9
 Synopsis:          Haskell SuperCollider Unit Generator Database
 Description:       Database of SuperCollider Unit Generators
 License:           GPL
 Category:          Sound
-Copyright:         (c) Rohan Drape, 2006-2010
+Copyright:         (c) Rohan Drape, 2006-2011
 Author:            Rohan Drape
 Maintainer:        rd@slavepianos.org
 Stability:         Experimental
 Homepage:          http://slavepianos.org/rd/?t=hsc3-db
-Tested-With:       GHC == 6.10.3
+Tested-With:       GHC == 6.12.1
 Build-Type:        Simple
 Cabal-Version:     >= 1.6
 
 Data-files:        README
+                   mk/config
+                   mk/mk.sc
+                   sclang/UGenDB.sc
+                   sclang/Utilities.sc
 
 Library
   Build-Depends:   base == 4.*,
-                   hsc3 == 0.8
+                   hsc3 == 0.9
   GHC-Options:     -Wall -fwarn-tabs
   Exposed-modules: Sound.SC3.UGen.DB.Data
+
+Source-Repository  head
+  Type:            darcs
+  Location:        http://slavepianos.org/rd/sw/hsc3-db/
diff --git a/mk/config b/mk/config
new file mode 100644
--- /dev/null
+++ b/mk/config
@@ -0,0 +1,2 @@
++/home/rohan/share/SuperCollider/SCClassLibrary
++/home/rohan/sw/hsc3-db/sclang
diff --git a/mk/mk.sc b/mk/mk.sc
new file mode 100644
--- /dev/null
+++ b/mk/mk.sc
@@ -0,0 +1,2 @@
+UGenDB.haskell;
+thisProcess.shutdown;
diff --git a/sclang/UGenDB.sc b/sclang/UGenDB.sc
new file mode 100644
--- /dev/null
+++ b/sclang/UGenDB.sc
@@ -0,0 +1,28 @@
+UGenDB {
+	*haskell {
+		var uu_a = UGen.allSubClassesOf.sort({|a, b| a.name < b.name;});
+		var ignoring = ['BasicOpUGen', 'BinaryOpUGen', 'MulAdd', 'OutputProxy', 'PackFFT', 'Poll', 'UnaryOpUGen', 'UnpackFFT', 'LocalBuf', 'SendReply'];
+		var uu = uu_a.reject({|u| ignoring.includes(u.name.asSymbol); });
+		Date.getDate.format("-- AUTOGENERATED: %Y-%m-%d-%Hh%M").postln;
+		"module Sound.SC3.UGen.DB.Data where".postln;
+		"import Sound.SC3.UGen.Rate".postln;
+		"data I = I { input_name :: String, input_default :: Double } deriving (Eq, Show)".postln;
+		"data U = U { ugen_name :: String, ugen_operating_rates :: [Rate], ugen_default_rate :: Rate, ugen_inputs :: [I], ugen_outputs :: Integer } deriving (Eq, Show)".postln;
+		"inf :: Double".postln;
+		"inf = 10 ** 8".postln;
+		"rcomplex :: Double".postln;
+		"rcomplex = 3".postln;
+		"ugenDB :: [U]".postln;
+		"ugenDB = [ ".post;
+		uu[0].ugenDBHaskell.postln;
+		uu.drop(1).collect({|e| 
+			/*e.name.asSymbol.postln;*/
+			"         , ".post;
+			e.ugenDBHaskell.postln;
+		});
+		"         ]".postln;
+		"-- Local Variables:".postln;
+		"-- truncate-lines:t".postln;
+		"-- End:".postln;
+	}
+}
diff --git a/sclang/Utilities.sc b/sclang/Utilities.sc
new file mode 100644
--- /dev/null
+++ b/sclang/Utilities.sc
@@ -0,0 +1,78 @@
++ String {
+	toUpper {
+		^this.collect({|c| c.toUpper});
+	}
+}
+
++ Symbol {
+	toUpper {
+		^this.asString.toUpper.asSymbol;
+	}
+}
+
++ Object {
+	findMethodR { |n|
+		/* ^this.class.findMethod(n); */
+		var m = this.findMethod(n);
+		if (m.notNil, {
+			^m;
+		}, {
+			var p = this.superclass;
+			if (p.notNil, {
+				^p.findMethodR(n);
+			}, {
+				^nil
+			});
+		});
+	}
+	supportsRate { |r|
+		^(this.class.findMethodR(r) != nil);
+	}
+	supportedRates {
+		^['ar', 'kr', 'dr', 'ir', 'new'].select({|r| this.supportsRate(r)});
+	}
+	inputNames { |r|
+		var n = this.class.findMethodR(r).argNames;
+		^n.reject({|e| ['this','mul','add'].includes(e)});
+	}
+	inputDefault { |r, nm|
+		var m = this.class.findMethodR(r);
+		var n = m.argNames;
+		var i = n.detectIndex({|e| e == nm});
+		^m.prototypeFrame[i];
+	}
+	inputDefaults { |r|
+		var n = this.inputNames(r);
+		^n.collect({|e| e.inputDefault});
+	}
+	numberOfOutputs { |r|
+		var n = this.new.init.size;
+		if(n==0) {^1} {^n};
+	}
+	ugenDB {
+		var nm = this.name.asString;
+		var rr = this.supportedRates;
+		var dr = (audio: 'AR', control: 'KR', scalar: 'IR', demand: 'DR').at(this.new.rate);
+		var r  = rr[0];
+		var n  = this.inputNames(r);
+		var o  = this.numberOfOutputs;
+		^[nm, rr, dr, n.collect({|e| [e.asString, this.inputDefault(r,e)]}), o]
+	}
+	ugenDBHaskell {
+		var db = this.ugenDB;
+		var rr = db[1].reject({|e| e == 'new'}).collect({|e| e.toUpper});
+		var ii = db[3].collect({|e| 
+			var nm = e[0];
+			var df = if (e[1] == nil) {0.0} {e[1]};
+			"I " ++ nm.asCompileString ++ " (" ++ df ++ ")";
+		});
+		^"U " ++ db[0].asCompileString ++ " " ++ rr.asString ++ " " ++ db[2].asString ++ " " ++ ii.asString ++ " " ++ db[4].asString;
+	}
+}
+
++ Object {
+	allSubClassesOf {
+		var u = this.subclasses;
+		if(u.size == 0) {^[]} {^u ++ u.collect({|e| e.allSubClassesOf}).flatten}
+	}
+}
