diff --git a/vivid.cabal b/vivid.cabal
--- a/vivid.cabal
+++ b/vivid.cabal
@@ -1,240 +1,242 @@
-name:                vivid
-version:             0.2.0.4
-synopsis:            Sound synthesis with SuperCollider
-description:         
-  Music and sound synthesis with SuperCollider.
-  .
-  Example usage:
-  .
-  @
-  &#123;&#45;\# LANGUAGE DataKinds \#&#45;&#125;
-  @
-  > import Vivid
-  >
-  > theSound = sd (0 ::I "note") $ do
-  >    wobble <- sinOsc (freq_ 5) ? KR ~* 10 ~+ 10
-  >    s <- 0.1 ~* sinOsc (freq_ $ midiCPS (V::V "note") ~+ wobble)
-  >    out 0 [s,s]
-  >
-  > playSong = do
-  >    fork $ do
-  >       s0 <- synth theSound (36 ::I "note")
-  >       wait 1
-  >       free s0
-  >    s1 <- synth theSound (60 ::I "note")
-  >    forM_ [62,66,64] $ \note -> do
-  >       wait (1/4)
-  >       set s1 (note ::I "note")
-  >    wait (1/4)
-  >    free s1
-  >
-  > main = do
-  >    putStrLn "Simplest:"
-  >    playSong
-  >
-  >    putStrLn "With precise timing:"
-  >    doScheduledIn 0.1 playSong
-  >    wait 1
-  >
-  >    putStrLn "Written to a file, non-realtime synthesis:"
-  >    putStrLn "(Need to quit the running server for NRT)"
-  >    quitSCServer
-  >    writeNRT "/tmp/song.wav" playSong
-author:              Tom Murphy
-maintainer:          Tom Murphy
-category:            Audio, Music, Sound
-build-type:          Simple
-cabal-version:       >=1.8
-stability:           experimental
-license:             GPL
-
-library
-  exposed-modules:
-      Vivid
-    , Vivid.Actions
-    , Vivid.Actions.Class
-    , Vivid.Actions.IO
-    , Vivid.Actions.NRT
-    , Vivid.Actions.Scheduled
-    , Vivid.ByteBeat
-    , Vivid.Envelopes
-    , Vivid.NoPlugins
-    , Vivid.OSC
-    , Vivid.OSC.Util
-    , Vivid.Randomness
-    , Vivid.SCServer
-    , Vivid.SCServer.Connection
-    , Vivid.SCServer.State
-    , Vivid.SCServer.Types
-    , Vivid.SynthDef
-    , Vivid.SynthDef.FromUA
-    , Vivid.SynthDef.Literally
-    , Vivid.SynthDef.ToSig
-    , Vivid.SynthDef.Types
-    , Vivid.SynthDef.TypesafeArgs
-    , Vivid.UGens
-    , Vivid.UGens.Algebraic
-    , Vivid.UGens.Analysis
-    , Vivid.UGens.Args
-    , Vivid.UGens.Buffer
-    , Vivid.UGens.Conversion
-    , Vivid.UGens.Convolution
-    , Vivid.UGens.Delays
-    , Vivid.UGens.Demand
-    , Vivid.UGens.Dynamics
-    , Vivid.UGens.Envelopes
-    , Vivid.UGens.Examples
-    , Vivid.UGens.FFT
-    , Vivid.UGens.Filters
-    , Vivid.UGens.Filters.BEQSuite
-    , Vivid.UGens.Filters.Linear
-    , Vivid.UGens.Filters.Nonlinear
-    , Vivid.UGens.Filters.Pitch
-    , Vivid.UGens.Generators.Chaotic
-    , Vivid.UGens.Generators.Deterministic
-    , Vivid.UGens.Generators.Granular
-    , Vivid.UGens.Generators.SingleValue
-    , Vivid.UGens.Generators.Stochastic
-    , Vivid.UGens.Info
-    , Vivid.UGens.InOut
-    , Vivid.UGens.Maths
-    , Vivid.UGens.Multichannel
-    , Vivid.UGens.Random
-    , Vivid.UGens.Reverbs
-    , Vivid.UGens.SynthControl
-    , Vivid.UGens.Triggers
-    , Vivid.UGens.Undocumented
-    , Vivid.UGens.UserInteraction
-  -- other-modules:       
-  build-depends:
-   -- These package bounds are to comply with the PVP
-   -- (https://wiki.haskell.org/Package_versioning_policy).
-   -- Most/all of these upper bounds will be able to be bumped
-   -- forevermore: if you're having trouble building this because
-   -- of an upper bound, you can probably just bump it up.
-   -- I'll try to bump version bounds whenever new compatible
-   -- versions come out.
-
-      -- Auto bounds from 'cabal init':
-      base > 3 && < 5
-
-      -- Lower bound:
-      --    Just a guess -- 0.5.0.2 is >5 years old
-      --    I don't have a reason to think it needs a lower bound
-      --    0.2 is the oldest version on Hackage
-      -- Upper bound:
-      --    0.9 doesn't exist yet
-    , binary > 0.5.0.2 && < 0.9
-
-      -- Lower bound:
-      --    Just a guess -- 0.9.1.8 is >5 years old
-      --    I don't have a reason to think it needs a lower bound
-      --    0.9 is the oldest version on Hackage
-      -- Upper bound:
-      --    0.11 doesn't exist yet
-    , bytestring > 0.9.1.8 && < 0.11
-
-      -- Lower bound:
-      --    Just a guess -- 0.4.0.0 is >5 years old
-      --    I don't have a reason to think it needs a lower bound
-      --    0.1.0.0 is the oldest version on Hackage
-      -- Upper bound:
-      --    0.6 doesn't exist yet
-    , containers > 0.4.0.0 && < 0.6
-
-      -- Lower bound:
-      --    1.0 is the oldest version with 'takeExtension'
-      --    (It's from 2007-05)
-      -- Upper bound:
-      --    1.5 doesn't exist yet
-    , filepath >= 1.0 && < 1.5
-
-     -- Lower bound:
-     --    1.1.1.0 is the first version with 'hashWithSalt'
-     --    (It's from 2011-02)
-     --    (Also betw 1.2 and 1.2.0.5 are marked as broken!)
-     -- Upper bound:
-     --    1.3 doesn't exist yet
-    , hashable >= 1.2.0.6 && < 1.3
-
-      -- Lower bound:
-      --    0.1 is the oldest version on Hackage
-      -- Upper bound:
-      --    0.5 doesn't exist yet
-    , MonadRandom >= 0.1 && < 0.5
-
-      -- Lower bound:
-      --    Just a guess -- 0.2.0.0 is >5 years old
-      --    I don't have a reason to think it needs a lower bound
-      --    1.0 is the oldest version on Hackage
-      -- Upper bound:
-      --    2.3 doesn't exist yet
-    , mtl >= 2.0.0.0 && < 2.3
-
-      -- Lower bound:
-      --    Just a guess -- 2.3 is >5 years old
-      --    I don't have a reason to think it needs a lower bound
-      --    2.0 is the oldest version on Hackage
-      -- Upper bound:
-      --    2.7 doesn't exist yet
-    , network >= 2.3 && < 2.7
-
-
-      -- Lower bound:
-      --    Just a guess -- 1.0.1.4 is >5 years old
-      --    I don't have a reason to think it needs a lower bound
-      --    1.0.0.0 is the oldest version on Hackage
-      -- Upper bound:
-      --    1.5 doesn't exist yet
-    , process >= 1.0.1.4 && < 1.5
-
-      -- Lower bound:
-      --    Just a guess -- 1.0.0.3 is >5 years old
-      --    I don't have a reason to think it needs a lower bound
-      --    1.0.0.0 is the oldest version on Hackage
-      -- Upper bound:
-      --    1.2 doesn't exist yet
-      -- /= :  1.0.1.3 is deprecated
-    , random (>= 1.0.0.3 && <= 1.0.1.1) || (>= 1.1 && < 1.2)
-
-      -- Lower bound:
-      --    0.0.3 is the first version with 'shuffleM'
-      -- Upper bound:
-      --    0.1 doesn't exist yet (will it ever?)
-    , random-shuffle >= 0.0.3 && < 0.1
-
-      -- Lower bound:
-      --    0.2.0.0 is the first version with 'chunksOf'
-      -- Upper bound:
-      --    0.3 doesn't exist yet
-    , split >= 0.2.0.0 && < 0.3
-
-      -- Lower bound:
-      --    Just a guess -- 2.2.0.1 is >5 years old
-      --    I don't have a reason to think it needs a lower bound
-      --    2.1 is the oldest version on Hackage
-      -- Upper bound:
-      --    2.5 doesn't exist yet
-    , stm >= 2.2.0.1 && < 2.5
-
-      -- Lower bound:
-      --    Just a guess -- 1.2 is >5 years old
-      --    I don't have a reason to think it needs a lower bound
-      --    (Although check out 'old-time' and those changes -- but
-      --    that's before 1.2)
-      --    1.0 is the oldest version on Hackage
-      -- Upper bound:
-      --    1.7 doesn't exist yet
-    , time >= 1.2 && < 1.7
-
-      -- Lower bound:
-      --    Only need it for 'MonadIO' which came in 0.2.0.0
-      --    (0.2.0.0 is from 2010-03)
-      -- Upper bound:
-      --    0.6 doesn't exist yet
-      -- Note there are lots of deprecated versions but I'm taking
-      -- a guess for now that 'liftIO' is fine in all of them
-    , transformers >= 0.2.0.0 && < 0.6
-
-  ghc-options:
-    -O2
+name:                vivid
+version:             0.2.0.5
+homepage:            http://vivid-synth.com
+synopsis:            Sound synthesis with SuperCollider
+description:         
+  Music and sound synthesis with SuperCollider.
+  .
+  Example usage:
+  .
+  @
+  &#123;&#45;\# LANGUAGE DataKinds \#&#45;&#125;
+  @
+  .
+  > import Vivid
+  >
+  > theSound = sd (0 ::I "note") $ do
+  >    wobble <- sinOsc (freq_ 5) ? KR ~* 10 ~+ 10
+  >    s <- 0.1 ~* sinOsc (freq_ $ midiCPS (V::V "note") ~+ wobble)
+  >    out 0 [s,s]
+  >
+  > playSong = do
+  >    fork $ do
+  >       s0 <- synth theSound (36 ::I "note")
+  >       wait 1
+  >       free s0
+  >    s1 <- synth theSound (60 ::I "note")
+  >    forM_ [62,66,64] $ \note -> do
+  >       wait (1/4)
+  >       set s1 (note ::I "note")
+  >    wait (1/4)
+  >    free s1
+  >
+  > main = do
+  >    putStrLn "Simplest:"
+  >    playSong
+  >
+  >    putStrLn "With precise timing:"
+  >    doScheduledIn 0.1 playSong
+  >    wait 1
+  >
+  >    putStrLn "Written to a file, non-realtime synthesis:"
+  >    putStrLn "(Need to quit the running server for NRT)"
+  >    quitSCServer
+  >    writeNRT "/tmp/song.wav" playSong
+author:              Tom Murphy
+maintainer:          Tom Murphy
+category:            Audio, Music, Sound
+build-type:          Simple
+cabal-version:       >=1.8
+stability:           experimental
+license:             GPL
+
+library
+  exposed-modules:
+      Vivid
+    , Vivid.Actions
+    , Vivid.Actions.Class
+    , Vivid.Actions.IO
+    , Vivid.Actions.NRT
+    , Vivid.Actions.Scheduled
+    , Vivid.ByteBeat
+    , Vivid.Envelopes
+    , Vivid.NoPlugins
+    , Vivid.OSC
+    , Vivid.OSC.Util
+    , Vivid.Randomness
+    , Vivid.SCServer
+    , Vivid.SCServer.Connection
+    , Vivid.SCServer.State
+    , Vivid.SCServer.Types
+    , Vivid.SynthDef
+    , Vivid.SynthDef.FromUA
+    , Vivid.SynthDef.Literally
+    , Vivid.SynthDef.ToSig
+    , Vivid.SynthDef.Types
+    , Vivid.SynthDef.TypesafeArgs
+    , Vivid.UGens
+    , Vivid.UGens.Algebraic
+    , Vivid.UGens.Analysis
+    , Vivid.UGens.Args
+    , Vivid.UGens.Buffer
+    , Vivid.UGens.Conversion
+    , Vivid.UGens.Convolution
+    , Vivid.UGens.Delays
+    , Vivid.UGens.Demand
+    , Vivid.UGens.Dynamics
+    , Vivid.UGens.Envelopes
+    , Vivid.UGens.Examples
+    , Vivid.UGens.FFT
+    , Vivid.UGens.Filters
+    , Vivid.UGens.Filters.BEQSuite
+    , Vivid.UGens.Filters.Linear
+    , Vivid.UGens.Filters.Nonlinear
+    , Vivid.UGens.Filters.Pitch
+    , Vivid.UGens.Generators.Chaotic
+    , Vivid.UGens.Generators.Deterministic
+    , Vivid.UGens.Generators.Granular
+    , Vivid.UGens.Generators.SingleValue
+    , Vivid.UGens.Generators.Stochastic
+    , Vivid.UGens.Info
+    , Vivid.UGens.InOut
+    , Vivid.UGens.Maths
+    , Vivid.UGens.Multichannel
+    , Vivid.UGens.Random
+    , Vivid.UGens.Reverbs
+    , Vivid.UGens.SynthControl
+    , Vivid.UGens.Triggers
+    , Vivid.UGens.Undocumented
+    , Vivid.UGens.UserInteraction
+  -- other-modules:       
+  build-depends:
+   -- These package bounds are to comply with the PVP
+   -- (https://wiki.haskell.org/Package_versioning_policy).
+   -- Most/all of these upper bounds will be able to be bumped
+   -- forevermore: if you're having trouble building this because
+   -- of an upper bound, you can probably just bump it up.
+   -- I'll try to bump version bounds whenever new compatible
+   -- versions come out.
+
+      -- Auto bounds from 'cabal init':
+      base > 3 && < 5
+
+      -- Lower bound:
+      --    Just a guess -- 0.5.0.2 is >5 years old
+      --    I don't have a reason to think it needs a lower bound
+      --    0.2 is the oldest version on Hackage
+      -- Upper bound:
+      --    0.9 doesn't exist yet
+    , binary > 0.5.0.2 && < 0.9
+
+      -- Lower bound:
+      --    Just a guess -- 0.9.1.8 is >5 years old
+      --    I don't have a reason to think it needs a lower bound
+      --    0.9 is the oldest version on Hackage
+      -- Upper bound:
+      --    0.11 doesn't exist yet
+    , bytestring > 0.9.1.8 && < 0.11
+
+      -- Lower bound:
+      --    Just a guess -- 0.4.0.0 is >5 years old
+      --    I don't have a reason to think it needs a lower bound
+      --    0.1.0.0 is the oldest version on Hackage
+      -- Upper bound:
+      --    0.6 doesn't exist yet
+    , containers > 0.4.0.0 && < 0.6
+
+      -- Lower bound:
+      --    1.0 is the oldest version with 'takeExtension'
+      --    (It's from 2007-05)
+      -- Upper bound:
+      --    1.5 doesn't exist yet
+    , filepath >= 1.0 && < 1.5
+
+     -- Lower bound:
+     --    1.1.1.0 is the first version with 'hashWithSalt'
+     --    (It's from 2011-02)
+     --    (Also betw 1.2 and 1.2.0.5 are marked as broken!)
+     -- Upper bound:
+     --    1.3 doesn't exist yet
+    , hashable >= 1.2.0.6 && < 1.3
+
+      -- Lower bound:
+      --    0.1 is the oldest version on Hackage
+      -- Upper bound:
+      --    0.5 doesn't exist yet
+    , MonadRandom >= 0.1 && < 0.5
+
+      -- Lower bound:
+      --    Just a guess -- 0.2.0.0 is >5 years old
+      --    I don't have a reason to think it needs a lower bound
+      --    1.0 is the oldest version on Hackage
+      -- Upper bound:
+      --    2.3 doesn't exist yet
+    , mtl >= 2.0.0.0 && < 2.3
+
+      -- Lower bound:
+      --    Just a guess -- 2.3 is >5 years old
+      --    I don't have a reason to think it needs a lower bound
+      --    2.0 is the oldest version on Hackage
+      -- Upper bound:
+      --    2.7 doesn't exist yet
+    , network >= 2.3 && < 2.7
+
+
+      -- Lower bound:
+      --    Just a guess -- 1.0.1.4 is >5 years old
+      --    I don't have a reason to think it needs a lower bound
+      --    1.0.0.0 is the oldest version on Hackage
+      -- Upper bound:
+      --    1.5 doesn't exist yet
+    , process >= 1.0.1.4 && < 1.5
+
+      -- Lower bound:
+      --    Just a guess -- 1.0.0.3 is >5 years old
+      --    I don't have a reason to think it needs a lower bound
+      --    1.0.0.0 is the oldest version on Hackage
+      -- Upper bound:
+      --    1.2 doesn't exist yet
+      -- /= :  1.0.1.3 is deprecated
+    , random (>= 1.0.0.3 && <= 1.0.1.1) || (>= 1.1 && < 1.2)
+
+      -- Lower bound:
+      --    0.0.3 is the first version with 'shuffleM'
+      -- Upper bound:
+      --    0.1 doesn't exist yet (will it ever?)
+    , random-shuffle >= 0.0.3 && < 0.1
+
+      -- Lower bound:
+      --    0.2.0.0 is the first version with 'chunksOf'
+      -- Upper bound:
+      --    0.3 doesn't exist yet
+    , split >= 0.2.0.0 && < 0.3
+
+      -- Lower bound:
+      --    Just a guess -- 2.2.0.1 is >5 years old
+      --    I don't have a reason to think it needs a lower bound
+      --    2.1 is the oldest version on Hackage
+      -- Upper bound:
+      --    2.5 doesn't exist yet
+    , stm >= 2.2.0.1 && < 2.5
+
+      -- Lower bound:
+      --    Just a guess -- 1.2 is >5 years old
+      --    I don't have a reason to think it needs a lower bound
+      --    (Although check out 'old-time' and those changes -- but
+      --    that's before 1.2)
+      --    1.0 is the oldest version on Hackage
+      -- Upper bound:
+      --    1.7 doesn't exist yet
+    , time >= 1.2 && < 1.7
+
+      -- Lower bound:
+      --    Only need it for 'MonadIO' which came in 0.2.0.0
+      --    (0.2.0.0 is from 2010-03)
+      -- Upper bound:
+      --    0.6 doesn't exist yet
+      -- Note there are lots of deprecated versions but I'm taking
+      -- a guess for now that 'liftIO' is fine in all of them
+    , transformers >= 0.2.0.0 && < 0.6
+
+  ghc-options:
+    -O2
