diff --git a/Sound/Tidal/Parse.hs b/Sound/Tidal/Parse.hs
--- a/Sound/Tidal/Parse.hs
+++ b/Sound/Tidal/Parse.hs
@@ -12,6 +12,8 @@
 import GHC.Exts( IsString(..) )
 import Data.Monoid
 import Control.Exception as E
+import Control.Applicative ((<$>), (<*>))
+import Data.Maybe
 
 import Sound.Tidal.Pattern
 
@@ -100,13 +102,13 @@
                  return p
 
 pSingle :: Parser (Pattern a) -> Parser (Pattern a)
-pSingle f = do part <- f
-               pMult part
+pSingle f = f >>= pRand >>= pMult
 
 pPart :: Parser (Pattern a) -> Parser ([Pattern a])
 pPart f = do part <- parens (pSequence f) <|> pSingle f <|> pPolyIn f <|> pPolyOut f
+             part' <- pRand part
              spaces
-             parts <- pReplicate part
+             parts <- pReplicate part'
              spaces
              return $ parts
 
@@ -165,13 +167,19 @@
               <|>
               return thing
 
+
+
+pRand :: Pattern a -> Parser (Pattern a)
+pRand thing = do char '?'
+                 spaces
+                 return $ degrade thing
+              <|> return thing
+
 pReplicate :: Pattern a -> Parser ([Pattern a])
-pReplicate thing = do is <- many1 $ do char '!'
-                                       spaces
-                                       return 1
-                      let i = sum is
-                      return $ replicate (1 + fromIntegral i) thing
-                   <|> return [thing]
+pReplicate thing = do extras <- many $ do char '!'
+                                          spaces
+                                          pRand thing
+                      return (thing:extras)
 
 pRatio :: Parser (Rational)
 pRatio = do n <- natural <?> "numerator"
diff --git a/Sound/Tidal/Pattern.hs b/Sound/Tidal/Pattern.hs
--- a/Sound/Tidal/Pattern.hs
+++ b/Sound/Tidal/Pattern.hs
@@ -321,6 +321,9 @@
 envL :: Pattern Double
 envL = sig $ \t -> max 0 $ min (fromRational t) 1
 
+filterValues :: (a -> Bool) -> Pattern a -> Pattern a
+filterValues f (Pattern x) = Pattern $ (filter (f . thd')) . x
+
 -- Filter out events that have had their onsets cut off
 filterOnsets :: Pattern a -> Pattern a
 filterOnsets (Pattern f) = 
@@ -364,9 +367,18 @@
 rand :: Pattern Double
 rand = Pattern $ \a -> [(a, a, fst $ randomDouble $ pureMT $ floor $ (*1000000) $ (midPoint a))]
 
+
 irand :: Double -> Pattern Int
 irand i = (floor . (*i)) <$> rand
 
+degradeBy :: Double -> Pattern a -> Pattern a
+degradeBy x p = unMaybe $ (\a f -> toMaybe (f > x) a) <$> p <*> rand
+    where toMaybe False _ = Nothing
+          toMaybe True a  = Just a
+          unMaybe = (fromJust <$>) . filterValues isJust
+
+degrade :: Pattern a -> Pattern a
+degrade = degradeBy 0.5
 
 -- | @wedge t p p'@ combines patterns @p@ and @p'@ by squashing the
 -- @p@ into the portion of each cycle given by @t@, and @p'@ into the
diff --git a/Sound/Tidal/Stream.hs b/Sound/Tidal/Stream.hs
--- a/Sound/Tidal/Stream.hs
+++ b/Sound/Tidal/Stream.hs
@@ -39,7 +39,7 @@
 
 type OscPattern = Pattern OscMap
 
-latency = 0.04
+latency = 0.1
 
 defaultDatum :: Param -> Maybe Datum
 defaultDatum (S _ (Just x)) = Just $ string x
diff --git a/tidal.cabal b/tidal.cabal
--- a/tidal.cabal
+++ b/tidal.cabal
@@ -1,5 +1,5 @@
 name:                tidal
-version:             0.4.3
+version:             0.4.4
 synopsis:            Pattern language for improvised music
 -- description:         
 homepage:            http://yaxu.org/tidal/
