diff --git a/src/Synthesizer/Dimensional/Amplitude/Control.hs b/src/Synthesizer/Dimensional/Amplitude/Control.hs
--- a/src/Synthesizer/Dimensional/Amplitude/Control.hs
+++ b/src/Synthesizer/Dimensional/Amplitude/Control.hs
@@ -13,13 +13,25 @@
 module Synthesizer.Dimensional.Amplitude.Control (
    -- * Primitives
    constant, constantVector,
+
+   -- * Piecewise constant
+   piecewiseConstantGeneric,
+   piecewiseConstantStorable,
    ) where
 
 import qualified Synthesizer.Dimensional.Signal.Private as SigA
 
+import qualified Synthesizer.PiecewiseConstant.Signal as PC
+import qualified Synthesizer.PiecewiseConstant.Generic as PCG
+import qualified Synthesizer.PiecewiseConstant.Storable as PCSt
+
 import qualified Synthesizer.State.Control as Ctrl
--- import qualified Synthesizer.State.Signal  as Sig
 
+import qualified Synthesizer.Generic.Signal as SigG
+
+import qualified Synthesizer.Storable.Signal as SigSt
+import Foreign.Storable (Storable)
+
 import qualified Number.DimensionTerm        as DN
 import qualified Algebra.DimensionTerm       as Dim
 
@@ -52,3 +64,20 @@
    -> SigA.R s u y yv
 constantVector y yv =
    SigA.fromBody y (Ctrl.constant yv)
+
+
+{-# INLINE piecewiseConstantGeneric #-}
+piecewiseConstantGeneric ::
+   (SigG.Write sig y) =>
+   SigA.T rate amp (PC.T y) ->
+   SigA.T rate amp (sig y)
+piecewiseConstantGeneric =
+   SigA.processBody PCG.toSignal
+
+{-# INLINE piecewiseConstantStorable #-}
+piecewiseConstantStorable ::
+   (Storable y) =>
+   SigA.T rate amp (PC.T y) ->
+   SigA.T rate amp (SigSt.T y)
+piecewiseConstantStorable =
+   SigA.processBody PCSt.toSignal
diff --git a/src/Synthesizer/Dimensional/Rate/Dirac.hs b/src/Synthesizer/Dimensional/Rate/Dirac.hs
--- a/src/Synthesizer/Dimensional/Rate/Dirac.hs
+++ b/src/Synthesizer/Dimensional/Rate/Dirac.hs
@@ -10,6 +10,7 @@
 import qualified Synthesizer.Dimensional.Rate as Rate
 
 import qualified Data.Monoid as Mn
+import qualified Data.Semigroup as Sg
 
 import qualified Number.DimensionTerm        as DN
 import qualified Algebra.DimensionTerm       as Dim
@@ -39,6 +40,9 @@
 This type is so level that it could be moved to Synthesizer.Generic.Dirac.
 -}
 newtype T s sig = Cons {decons :: sig Bool}
+
+instance Sg.Semigroup (sig Bool) => Sg.Semigroup (T s sig) where
+   Cons x <> Cons y = Cons (x Sg.<> y)
 
 instance Mn.Monoid (sig Bool) => Mn.Monoid (T s sig) where
    mempty = Cons Mn.mempty
diff --git a/synthesizer-dimensional.cabal b/synthesizer-dimensional.cabal
--- a/synthesizer-dimensional.cabal
+++ b/synthesizer-dimensional.cabal
@@ -1,5 +1,5 @@
 Name:           synthesizer-dimensional
-Version:        0.8.0.2
+Version:        0.8.1
 License:        GPL
 License-File:   LICENSE
 Author:         Henning Thielemann <haskell@henning-thielemann.de>
@@ -12,7 +12,7 @@
    abstract from the sample rate in a statically type safe way.
 Stability:      Experimental
 Tested-With:    GHC==6.10.4, GHC==6.12.1, GHC==7.0.4, GHC==7.2.1
-Cabal-Version:  >=1.14
+Cabal-Version:  1.14
 Build-Type:     Simple
 
 Extra-Source-Files:
@@ -33,7 +33,7 @@
   Location:    http://code.haskell.org/synthesizer/dimensional/
 
 Source-Repository this
-  Tag:         0.8.0.2
+  Tag:         0.8.1
   Type:        darcs
   Location:    http://code.haskell.org/synthesizer/dimensional/
 
@@ -41,6 +41,7 @@
   Build-Depends:
     synthesizer-core >=0.8.1 && <0.9,
     transformers >=0.2 && <0.6,
+    semigroups >=0.1 && <1.0,
     event-list >=0.1 && <0.2,
     non-negative >=0.1 && <0.2,
     numeric-prelude >=0.3 && <0.5,
@@ -152,6 +153,7 @@
       event-list,
       non-negative,
       transformers,
+      semigroups,
       utility-ht,
       random,
       base
