diff --git a/src/Synthesizer/Dimensional/Amplitude/Analysis.hs b/src/Synthesizer/Dimensional/Amplitude/Analysis.hs
--- a/src/Synthesizer/Dimensional/Amplitude/Analysis.hs
+++ b/src/Synthesizer/Dimensional/Amplitude/Analysis.hs
@@ -53,7 +53,7 @@
 import qualified Algebra.Additive            as Additive
 
 
-import NumericPrelude.Base (Ord, Bool, (<=), ($), (.), uncurry, error, )
+import NumericPrelude.Base (Ord, Bool, (<=), ($), uncurry, )
 -- import NumericPrelude.Numeric
 import qualified Prelude as P
 
diff --git a/src/Synthesizer/Dimensional/Amplitude/Displacement.hs b/src/Synthesizer/Dimensional/Amplitude/Displacement.hs
--- a/src/Synthesizer/Dimensional/Amplitude/Displacement.hs
+++ b/src/Synthesizer/Dimensional/Amplitude/Displacement.hs
@@ -34,11 +34,8 @@
 import qualified Algebra.Transcendental as Trans
 import qualified Algebra.Module         as Module
 import qualified Algebra.Field          as Field
-import qualified Algebra.Absolute           as Absolute
+import qualified Algebra.Absolute       as Absolute
 import qualified Algebra.Ring           as Ring
-import qualified Algebra.Additive       as Additive
-
-import Algebra.Module ((*>))
 
 import qualified Data.List as List
 
diff --git a/src/Synthesizer/Dimensional/Causal/Analysis.hs b/src/Synthesizer/Dimensional/Causal/Analysis.hs
new file mode 100644
--- /dev/null
+++ b/src/Synthesizer/Dimensional/Causal/Analysis.hs
@@ -0,0 +1,56 @@
+{- |
+Copyright   :  (c) Henning Thielemann 2011
+License     :  GPL
+
+Maintainer  :  synthesizer@henning-thielemann.de
+Stability   :  provisional
+Portability :  requires multi-parameter type classes
+-}
+module Synthesizer.Dimensional.Causal.Analysis (
+   deltaSigmaModulationPositive,
+   ) where
+
+import qualified Synthesizer.Causal.Analysis as Ana
+import qualified Synthesizer.Causal.Filter.NonRecursive as FiltNR
+
+import qualified Synthesizer.Dimensional.Process as Proc
+import qualified Synthesizer.Dimensional.Sample as Sample
+import qualified Synthesizer.Dimensional.Amplitude as Amp
+
+import qualified Synthesizer.Dimensional.Causal.Process as CausalD
+
+import qualified Number.DimensionTerm        as DN
+import qualified Algebra.DimensionTerm       as Dim
+import Number.DimensionTerm ((&*&), )
+
+import qualified Algebra.Field          as Field
+import qualified Algebra.RealRing       as RealRing
+
+import Control.Arrow (second, (<<<), )
+
+import NumericPrelude.Base
+-- import NumericPrelude.Numeric
+import Prelude ()
+
+
+type DNS v y yv = Sample.Dimensional v y yv
+
+
+
+deltaSigmaModulationPositive ::
+   (RealRing.C a, Field.C a, Dim.C u, Dim.C v) =>
+   Proc.T s u a (CausalD.T s (DNS (Dim.Mul u v) a a, DNS v a a) (DNS v a a))
+deltaSigmaModulationPositive =
+   flip fmap Proc.getSampleRate $ \rate ->
+      CausalD.consFlip $ \ (Amp.Numeric thresholdAmp, Amp.Numeric inputAmp) ->
+         let targetAmp =
+                DN.rewriteDimension
+                   (Dim.identityLeft .
+                    Dim.applyLeftMul Dim.cancelLeft .
+                    Dim.associateLeft) $
+                rate &*& thresholdAmp
+             ampRatio = DN.divToScalar inputAmp targetAmp
+         in  (Amp.Numeric targetAmp,
+              Ana.deltaSigmaModulationPositive
+              <<<
+              second (FiltNR.amplify ampRatio))
diff --git a/src/Synthesizer/Dimensional/Causal/ControlledProcess.hs b/src/Synthesizer/Dimensional/Causal/ControlledProcess.hs
--- a/src/Synthesizer/Dimensional/Causal/ControlledProcess.hs
+++ b/src/Synthesizer/Dimensional/Causal/ControlledProcess.hs
@@ -53,7 +53,6 @@
 module Synthesizer.Dimensional.Causal.ControlledProcess where
 
 import qualified Synthesizer.Dimensional.Sample as Sample
-import Synthesizer.Dimensional.Sample (Amplitude, Displacement, )
 import Synthesizer.Dimensional.Causal.Process ((<<<), )
 
 import qualified Synthesizer.Dimensional.Process as Proc
@@ -76,9 +75,6 @@
 -- import Number.DimensionTerm ((*&), ) -- ((&*&), (&/&))
 
 import qualified Algebra.RealField      as RealField
--- import qualified Algebra.Field          as Field
--- import qualified Algebra.Ring           as Ring
-import qualified Algebra.Additive       as Additive
 
 import Data.Tuple.HT (swap, )
 import Control.Applicative (liftA2, )
diff --git a/src/Synthesizer/Dimensional/Causal/Filter.hs b/src/Synthesizer/Dimensional/Causal/Filter.hs
--- a/src/Synthesizer/Dimensional/Causal/Filter.hs
+++ b/src/Synthesizer/Dimensional/Causal/Filter.hs
@@ -128,7 +128,7 @@
 import qualified Number.DimensionTerm        as DN
 import qualified Algebra.DimensionTerm       as Dim
 
-import Number.DimensionTerm ((&*&), (&/&))
+import Number.DimensionTerm ((&*&), )
 
 import qualified Number.NonNegative     as NonNeg
 
@@ -733,7 +733,5 @@
    flip fmap Proc.getSampleRate $ \rate ->
       CausalD.consFlip $ \ (Amp.Numeric amp) ->
          (Amp.Numeric $
-          DN.rewriteDimension
-              (Dim.commute . Dim.applyRightMul Dim.invertRecip) $
-          amp &/& rate,
+          DN.unrecip rate &*& amp,
           Integrate.causal)
diff --git a/src/Synthesizer/Dimensional/Causal/Oscillator.hs b/src/Synthesizer/Dimensional/Causal/Oscillator.hs
--- a/src/Synthesizer/Dimensional/Causal/Oscillator.hs
+++ b/src/Synthesizer/Dimensional/Causal/Oscillator.hs
@@ -58,10 +58,8 @@
 
 import qualified Number.DimensionTerm        as DN
 import qualified Algebra.DimensionTerm       as Dim
--- import Number.DimensionTerm ((&*&))
 
 import qualified Algebra.RealField          as RealField
-import qualified Algebra.Ring               as Ring
 
 import NumericPrelude.Numeric
 import NumericPrelude.Base as P
diff --git a/src/Synthesizer/Dimensional/Causal/Oscillator/Core.hs b/src/Synthesizer/Dimensional/Causal/Oscillator/Core.hs
--- a/src/Synthesizer/Dimensional/Causal/Oscillator/Core.hs
+++ b/src/Synthesizer/Dimensional/Causal/Oscillator/Core.hs
@@ -31,7 +31,7 @@
 -- import qualified Algebra.Ring               as Ring
 
 -- import NumericPrelude.Numeric
-import NumericPrelude.Base as P
+-- import NumericPrelude.Base as P
 
 
 type Frequency u t = Amp.Numeric (DN.T (Dim.Recip u) t)
diff --git a/src/Synthesizer/Dimensional/ChunkySize/Signal.hs b/src/Synthesizer/Dimensional/ChunkySize/Signal.hs
--- a/src/Synthesizer/Dimensional/ChunkySize/Signal.hs
+++ b/src/Synthesizer/Dimensional/ChunkySize/Signal.hs
@@ -11,7 +11,6 @@
    store, length,
    ) where
 
--- import qualified Synthesizer.Dimensional.Process as Proc
 import qualified Synthesizer.Dimensional.Rate as Rate
 import qualified Synthesizer.Dimensional.Amplitude as Amp
 import qualified Synthesizer.Dimensional.Signal.Private as SigA
@@ -21,19 +20,6 @@
 import qualified Synthesizer.ChunkySize.Signal as SigC
 
 import qualified Synthesizer.State.Signal as Sig
-
--- import qualified Number.DimensionTerm        as DN
--- import qualified Algebra.DimensionTerm       as Dim
-
--- import qualified Number.NonNegative     as NonNeg
-
--- import qualified Algebra.RealRing      as RealRing
--- import qualified Algebra.Field          as Field
-
-
--- import NumericPrelude.Numeric hiding (negate)
--- import NumericPrelude.Base as P
-import Prelude hiding (splitAt, take, drop, length, )
 
 
 type Signal s amp sig =
diff --git a/src/Synthesizer/Dimensional/Cyclic/Analysis.hs b/src/Synthesizer/Dimensional/Cyclic/Analysis.hs
--- a/src/Synthesizer/Dimensional/Cyclic/Analysis.hs
+++ b/src/Synthesizer/Dimensional/Cyclic/Analysis.hs
@@ -1,5 +1,6 @@
+{-# LANGUAGE FlexibleContexts #-}
 {- |
-Copyright   :  (c) Henning Thielemann 2008-2009
+Copyright   :  (c) Henning Thielemann 2008-2011
 License     :  GPL
 
 Maintainer  :  synthesizer@henning-thielemann.de
@@ -10,11 +11,10 @@
     toFrequencySpectrum, fromFrequencySpectrum,
   ) where
 
+import qualified Synthesizer.Generic.Fourier as FourierG
+import qualified Synthesizer.Generic.Signal as SigG
 import qualified Synthesizer.Generic.Cut as CutG
 
-import qualified Synthesizer.State.Analysis as Ana
-import qualified Synthesizer.State.Signal   as Sig
-
 import qualified Synthesizer.Dimensional.Rate                 as Rate
 import qualified Synthesizer.Dimensional.Amplitude            as Amp
 import qualified Synthesizer.Dimensional.Signal.Private       as SigA
@@ -31,9 +31,9 @@
 import qualified Algebra.Field               as Field
 
 
-import NumericPrelude.Base ((.), )
-import NumericPrelude.Numeric ((+), negate, (/), fromIntegral, pi, )
-import Prelude (Int, )
+import NumericPrelude.Base ((.), ($), )
+import NumericPrelude.Numeric (fromIntegral, )
+import Prelude ()
 
 
 {- * Positions -}
@@ -58,20 +58,19 @@
 Fourier analysis
 -}
 {-# INLINE toFrequencySpectrum #-}
-toFrequencySpectrum :: (Trans.C q, Dim.C u, Dim.C v) =>
-   SigA.T (Rate.Dimensional u q) (Amp.Dimensional v q) (SigC.T (Sig.T (Complex.T q))) ->
-   SigA.T (Rate.Dimensional (Dim.Recip u) q) (Amp.Dimensional (Dim.Mul u v) q) (SigC.T (Sig.T (Complex.T q)))
+toFrequencySpectrum ::
+   (Trans.C q, Dim.C u, Dim.C v,
+    SigG.Transform sig (Complex.T q)) =>
+   SigA.T (Rate.Dimensional u q) (Amp.Dimensional v q) (SigC.T (sig (Complex.T q))) ->
+   SigA.T (Rate.Dimensional (Dim.Recip u) q) (Amp.Dimensional (Dim.Mul u v) q) (SigC.T (sig (Complex.T q)))
 toFrequencySpectrum x =
    let len = DN.rewriteDimension Dim.doubleRecip (period x)
        amp = SigA.actualAmplitude x
-       ss  = SigC.toPeriod (SigA.body x)
-       n   = Sig.length ss
-       z = Complex.cis (negate (pi+pi) / fromIntegral n)
        newAmp = DN.unrecip (SigA.actualSampleRate x) &*& amp
    in  SigA.Cons
           (Rate.Actual len)
           (Amp.Numeric newAmp)
-          (SigC.Cons (Sig.take n (Ana.chirpTransform z ss)))
+          (SigC.Cons $ FourierG.transformBackward $ SigC.toPeriod $ SigA.body x)
 {-
 toFrequencySpectrum $ SigP.Cons (DN.frequency (4::Prelude.Double)) (SigA.Cons (DN.voltage (1::Prelude.Double)) (SigC.Cons [1, 0 Number.Complex.+: (1::Prelude.Double), -1, 0 Number.Complex.+: (-1)]))
 toFrequencySpectrum $ SigP.Cons (DN.frequency (4::Prelude.Double)) (SigA.Cons (DN.voltage (1::Prelude.Double)) (SigC.Cons [0 Number.Complex.+: (1::Prelude.Double), -1, 0 Number.Complex.+: (-1), 1]))
@@ -83,20 +82,20 @@
 Fourier synthesis
 -}
 {-# INLINE fromFrequencySpectrum #-}
-fromFrequencySpectrum :: (Trans.C q, Dim.C u, Dim.C v) =>
-   SigA.T (Rate.Dimensional (Dim.Recip u) q) (Amp.Dimensional (Dim.Mul u v) q) (SigC.T (Sig.T (Complex.T q))) ->
-   SigA.T (Rate.Dimensional u q) (Amp.Dimensional v q) (SigC.T (Sig.T (Complex.T q)))
+fromFrequencySpectrum ::
+   (Trans.C q, Dim.C u, Dim.C v,
+    SigG.Transform sig (Complex.T q)) =>
+   SigA.T (Rate.Dimensional (Dim.Recip u) q) (Amp.Dimensional (Dim.Mul u v) q) (SigC.T (sig (Complex.T q))) ->
+   SigA.T (Rate.Dimensional u q) (Amp.Dimensional v q) (SigC.T (sig (Complex.T q)))
 fromFrequencySpectrum x =
    let len = period x
        amp = SigA.actualAmplitude x
-       ss  = SigC.toPeriod (SigA.body x)
-       n   = Sig.length ss
-       z = Complex.cis ((pi+pi) / fromIntegral n)
        newAmp =
           DN.rewriteDimension
-             (Dim.identityLeft . Dim.applyLeftMul Dim.cancelLeft . Dim.associateLeft)
+             (Dim.identityLeft .
+              Dim.applyLeftMul Dim.cancelLeft . Dim.associateLeft)
              (DN.unrecip (SigA.actualSampleRate x) &*& amp)
    in  SigA.Cons
           (Rate.Actual len)
           (Amp.Numeric newAmp)
-          (SigC.Cons (Sig.take n (Ana.chirpTransform z ss)))
+          (SigC.Cons $ FourierG.transformForward $ SigC.toPeriod $ SigA.body x)
diff --git a/src/Synthesizer/Dimensional/Cyclic/Signal.hs b/src/Synthesizer/Dimensional/Cyclic/Signal.hs
--- a/src/Synthesizer/Dimensional/Cyclic/Signal.hs
+++ b/src/Synthesizer/Dimensional/Cyclic/Signal.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2008-2009
+Copyright   :  (c) Henning Thielemann 2008-2011
 License     :  GPL
 
 Maintainer  :  synthesizer@henning-thielemann.de
@@ -16,12 +16,9 @@
 
 -- import qualified Synthesizer.Format as Format
 
--- import qualified Synthesizer.Generic.Cut as CutG
+import qualified Synthesizer.Generic.Cyclic as Cyclic
 import qualified Synthesizer.Generic.Signal as SigG
-import qualified Synthesizer.State.Signal as Sig
-
--- import qualified Number.DimensionTerm        as DN
--- import qualified Algebra.DimensionTerm       as Dim
+-- import qualified Synthesizer.State.Signal as Sig
 
 {-
 import qualified Algebra.Module         as Module
@@ -30,8 +27,6 @@
 -}
 import qualified Algebra.Additive       as Additive
 
--- import Number.DimensionTerm ((&/&))
-
 import Data.Monoid (Monoid, )
 
 
@@ -82,12 +77,10 @@
 -}
 {-# INLINE fromSignal #-}
 fromSignal ::
-   (Additive.C yv, SigG.Transform sig yv) =>
+   (Additive.C yv, SigG.Write sig yv) =>
    Int -> sig yv -> T (sig yv)
 fromSignal n  =
-   fromPeriod .
-   Sig.foldL SigG.mix SigG.empty {- Sig.sum -} .
-   SigG.sliceVertical n
+   fromPeriod . Cyclic.fromSignal SigG.defaultLazySize n
 
 {- |
 Convert a cyclic signal to a straight signal containing a loop.
diff --git a/src/Synthesizer/Dimensional/Map.hs b/src/Synthesizer/Dimensional/Map.hs
--- a/src/Synthesizer/Dimensional/Map.hs
+++ b/src/Synthesizer/Dimensional/Map.hs
@@ -5,7 +5,6 @@
 module Synthesizer.Dimensional.Map where
 
 import qualified Synthesizer.Dimensional.Sample as Sample
-import Synthesizer.Dimensional.Sample (Amplitude, Displacement, )
 
 import qualified Synthesizer.Dimensional.Arrow as ArrowD
 
@@ -13,7 +12,6 @@
 import qualified Synthesizer.Dimensional.Amplitude.Flat as Flat
 import qualified Synthesizer.Dimensional.Amplitude as Amp
 
-import qualified Control.Arrow as Arrow
 import Control.Arrow (Arrow, )
 import Control.Category (Category, )
 
diff --git a/src/Synthesizer/Dimensional/Map/Displacement.hs b/src/Synthesizer/Dimensional/Map/Displacement.hs
--- a/src/Synthesizer/Dimensional/Map/Displacement.hs
+++ b/src/Synthesizer/Dimensional/Map/Displacement.hs
@@ -2,24 +2,27 @@
    mix, mixVolume,
    fanoutAndMixMulti, fanoutAndMixMultiVolume,
    raise, distort,
+   mapLinear, mapExponential, mapLinearDimension,
    ) where
 
+import qualified Synthesizer.Dimensional.Amplitude.Flat as Flat
 import qualified Synthesizer.Dimensional.Amplitude as Amp
 import qualified Synthesizer.Dimensional.Sample as Sample
 
 import qualified Synthesizer.Dimensional.Arrow as ArrowD
 
-import qualified Control.Arrow as Arrow
-import Control.Arrow (Arrow, arr, (^<<), (&&&), )
+import Control.Arrow (Arrow, arr, (<<<), (^<<), (&&&), )
 
 import qualified Number.DimensionTerm        as DN
 import qualified Algebra.DimensionTerm       as Dim
+import Number.DimensionTerm ((&*&))
 
+import qualified Algebra.Transcendental as Trans
 import qualified Algebra.Module         as Module
 import qualified Algebra.RealField      as RealField
 import qualified Algebra.Field          as Field
 import qualified Algebra.Absolute       as Absolute
--- import qualified Algebra.Ring           as Ring
+import qualified Algebra.Ring           as Ring
 -- import qualified Algebra.Additive       as Additive
 
 -- import Algebra.Module ((*>))
@@ -156,6 +159,63 @@
           (toAmplitudeScalar ampCtrl))
 
 
+
+{- |
+Map a control curve without amplitude unit
+by a linear (affine) function with a unit.
+This is a combination of 'raise' and 'amplify'.
+
+It is not quite correct in the sense,
+that it does not produce low-level sample values in the range (-1,1).
+Instead it generates values around 1.
+-}
+{-# INLINE mapLinear #-}
+mapLinear ::
+   (Flat.C y flat, Ring.C y, Dim.C u, Arrow arrow) =>
+   y ->
+   DN.T u y ->
+   ArrowD.T arrow (Sample.T flat y) (DNS u y y)
+mapLinear depth center =
+   ArrowD.Cons (\Amp.Flat ->
+      (arr (\x -> one+x*depth), Amp.Numeric center))
+   <<<
+   ArrowD.canonicalizeFlat
+
+{-# INLINE mapExponential #-}
+mapExponential ::
+   (Flat.C y flat, Trans.C y, Dim.C u, Arrow arrow) =>
+   y ->
+   DN.T u q ->
+   ArrowD.T arrow (Sample.T flat y) (DNS u q y)
+mapExponential depth center =
+   {-
+   X86 processors only have (logBase 2) and (2**).
+   Thus on those machines computing with respect to base 2
+   can be more efficient and more precise.
+   -}
+   let logDepth = log depth
+   in  ArrowD.Cons (\Amp.Flat ->
+          (arr (exp . (logDepth*)), Amp.Numeric center))
+   <<<
+   ArrowD.canonicalizeFlat
+
+{-# INLINE mapLinearDimension #-}
+mapLinearDimension ::
+   (Field.C y, Absolute.C y, Dim.C u, Dim.C v, Arrow arrow) =>
+      DN.T v y              {- ^ range: one is mapped to @center + range * ampX@ -}
+   -> DN.T (Dim.Mul v u) y  {- ^ center: zero is mapped to @center@ -}
+   -> ArrowD.T arrow (DNS u y y) (DNS (Dim.Mul v u) y y)
+mapLinearDimension range center =
+   ArrowD.Cons $ \(Amp.Numeric ampIn) ->
+      let absRange  = DN.abs range &*& ampIn
+          absCenter = DN.abs center
+          ampOut = absRange + absCenter
+          rng = DN.divToScalar absRange  ampOut
+          cnt = DN.divToScalar absCenter ampOut
+      in  (arr (\y -> cnt + rng*y), Amp.Numeric ampOut)
+
+
+-- auxiliary functions
 
 {-# INLINE toAmplitudeScalar #-}
 toAmplitudeScalar ::
diff --git a/src/Synthesizer/Dimensional/Rate/Cut.hs b/src/Synthesizer/Dimensional/Rate/Cut.hs
--- a/src/Synthesizer/Dimensional/Rate/Cut.hs
+++ b/src/Synthesizer/Dimensional/Rate/Cut.hs
@@ -29,7 +29,7 @@
 import Data.Monoid (Monoid, mappend, mconcat, )
 
 
-import NumericPrelude.Numeric hiding (negate)
+-- import NumericPrelude.Numeric hiding (negate)
 -- import NumericPrelude.Base as P
 import Prelude hiding (splitAt, take, drop, concat, )
 
diff --git a/src/Synthesizer/Dimensional/Rate/Oscillator.hs b/src/Synthesizer/Dimensional/Rate/Oscillator.hs
--- a/src/Synthesizer/Dimensional/Rate/Oscillator.hs
+++ b/src/Synthesizer/Dimensional/Rate/Oscillator.hs
@@ -42,7 +42,6 @@
 
 import qualified Synthesizer.Dimensional.Causal.Process as CausalD
 import qualified Synthesizer.Dimensional.Causal.Oscillator.Core as OsciCore
-import qualified Synthesizer.Dimensional.Causal.Oscillator as OsciC
 import qualified Synthesizer.Dimensional.Map as MapD
 
 import qualified Synthesizer.Dimensional.Sample as Sample
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/Control.hs b/src/Synthesizer/Dimensional/RateAmplitude/Control.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/Control.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/Control.hs
@@ -29,24 +29,16 @@
 import Synthesizer.Dimensional.Signal.Private
           (toAmplitudeScalar, )
 
--- import qualified Synthesizer.Dimensional.Amplitude as Amp
--- import qualified Synthesizer.Dimensional.Rate as Rate
-
 import qualified Synthesizer.State.Signal as Sig
 
 import qualified Number.DimensionTerm        as DN
 import qualified Algebra.DimensionTerm       as Dim
 
--- import Number.DimensionTerm ((&*&))
-
--- import qualified Algebra.Module             as Module
 import qualified Algebra.Transcendental     as Trans
 import qualified Algebra.RealField          as RealField
 import qualified Algebra.Field              as Field
 import qualified Algebra.RealRing           as RealRing
--- import qualified Algebra.Ring               as Ring
 import qualified Algebra.Absolute           as Absolute
-import qualified Algebra.Additive           as Additive
 
 import NumericPrelude.Numeric
 import NumericPrelude.Base
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/Cut.hs b/src/Synthesizer/Dimensional/RateAmplitude/Cut.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/Cut.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/Cut.hs
@@ -61,7 +61,7 @@
 
 import qualified Data.List as List
 
-import NumericPrelude.Base ((.), ($), Ord, (<=), map, return, error, )
+import NumericPrelude.Base ((.), ($), Ord, (<=), map, return, )
 -- import NumericPrelude.Numeric
 import Prelude (RealFrac, )
 
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/Demonstration.hs b/src/Synthesizer/Dimensional/RateAmplitude/Demonstration.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/Demonstration.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/Demonstration.hs
@@ -59,12 +59,12 @@
 import qualified Algebra.Transcendental as Trans
 import qualified Algebra.Module         as Module
 import qualified Algebra.RealField      as RealField
-import qualified Algebra.Field          as Field
 import qualified Algebra.Ring           as Ring
 
 import System.Time (getClockTime, diffClockTimes, tdSec, tdPicosec, )
 import System.IO (hFlush, stdout, )
-import System.Exit (ExitCode)
+import System.Exit (ExitCode(ExitFailure), exitWith, )
+import qualified Control.Monad.Exception.Synchronous as Exc
 
 import System.Random (Random, randomRs, mkStdGen, )
 
@@ -115,20 +115,27 @@
       $: exponential
       $: sineLow
 
+{-# INLINE pingSaw #-}
+pingSaw ::
+   (RealField.C q, Trans.C q, Module.C q q, Random q, Storable q) =>
+   Proc.T s Dim.Time q (SigA.R s Dim.Voltage q q)
+pingSaw =
+   Filt.envelope
+      $: exponential
+      $: saw
 
 
+
 {-# INLINE sawWave #-}
 sawWave :: (RealField.C a) => Wave.T a a
 sawWave = Wave.triangleAsymmetric (-0.9)
 
-{-
 {-# INLINE saw #-}
 saw ::
    (RealField.C q, Trans.C q, Module.C q q, Random q, Storable q) =>
    Proc.T s Dim.Time q (SigA.R s Dim.Voltage q q)
 saw =
    Osci.static (DN.voltage 1 &*~ sawWave) zero (DN.frequency 440)
--}
 
 {-# INLINE sawVibrato #-}
 sawVibrato ::
@@ -600,29 +607,31 @@
 -}
 
 
-measureTime :: String -> IO ExitCode -> IO ()
+measureTime :: String -> IO a -> IO a
 measureTime name act =
    do putStr (name++": ")
       hFlush stdout
       timeA <- getClockTime
-      act
+      res <- act
       timeB <- getClockTime
       let td = diffClockTimes timeB timeA
       print (fromIntegral (tdSec td) +
              fromInteger (tdPicosec td) * 1e-12 :: Double)
+      return res
 
 renderToAIFF :: (Ring.C a) =>
    (DN.Frequency a -> String -> t -> IO ExitCode) ->
    String ->
    t ->
-   IO ()
+   Exc.ExceptionalT Int IO ()
 renderToAIFF render name sound =
+   Exc.fromExitCodeT $
    measureTime name $
    render (DN.frequency 44100) (name++".aiff") sound
 
 
 main :: IO ()
-main =
+main = Exc.resolveT (exitWith . ExitFailure) $
    do
 {-
       Play.timeVoltageMonoDoubleR (DN.frequency 44100) bubbles
@@ -646,7 +655,7 @@
 
       mapM_
          (\(name, filt@(Filter _filtResonance _filtDirect filtCausal)) ->
-              let render :: String -> (forall s. Proc.T s Dim.Time Double (SigA.R s Dim.Voltage Double Double)) -> IO ()
+              let render :: String -> (forall s. Proc.T s Dim.Time Double (SigA.R s Dim.Voltage Double Double)) -> Exc.ExceptionalT Int IO ()
                   render ext sound =
                      let subName = name ++ "-" ++ ext
                      in  renderToAIFF
@@ -751,6 +760,7 @@
          ("sine-mix",    Sound (Cut.take (DN.time 1) $: sineMix)) :
          ("exponential", Sound (Cut.take (DN.time 1) $: DN.voltage 1 &*^ exponential)) :
          ("ping",        Sound (Cut.take (DN.time 1) $: ping)) :
+         ("ping-saw",    Sound (Cut.take (DN.time 1) $: pingSaw)) :
 
 --         ("saw",         Sound (Cut.take (DN.time 2) $: saw)) :
          ("saw-vibrato", Sound (Cut.take (DN.time 2) $: sawVibrato)) :
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/File.hs b/src/Synthesizer/Dimensional/RateAmplitude/File.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/File.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/File.hs
@@ -26,16 +26,12 @@
 
 import qualified Synthesizer.Storable.Signal as SigSt
 
--- import qualified Synthesizer.Dimensional.Straight.Signal as SigS
 import qualified Synthesizer.State.Signal as Sig
 
 import qualified Algebra.ToInteger      as ToInteger
--- import qualified Algebra.Transcendental as Trans
 import qualified Algebra.Module         as Module
 import qualified Algebra.RealField      as RealField
 import qualified Algebra.Field          as Field
-import qualified Algebra.RealRing       as RealRing
--- import qualified Algebra.Ring           as Ring
 
 import qualified Algebra.DimensionTerm as Dim
 import qualified Number.DimensionTerm  as DN
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/Instrument.hs b/src/Synthesizer/Dimensional/RateAmplitude/Instrument.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/Instrument.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/Instrument.hs
@@ -24,8 +24,7 @@
 
 import Synthesizer.Dimensional.Signal (($-), ($&), (&*^), (&*>^), )
 import Synthesizer.Dimensional.RateAmplitude.Piece ((-|#), ( #|-), (|#), ( #|), )
-import Synthesizer.Dimensional.Wave
-          ((&*~), mapLinear, mapExponential, )
+import Synthesizer.Dimensional.Wave ((&*~), )
 
 import Synthesizer.Dimensional.Process (($:), ($::), ($^), (.^), ($#), )
 import qualified Synthesizer.Dimensional.Amplitude.Displacement as DispA
@@ -55,7 +54,6 @@
 import qualified Algebra.Transcendental as Trans
 import qualified Algebra.Module         as Module
 import qualified Algebra.RealField      as RealField
-import qualified Algebra.Field          as Field
 import qualified Algebra.Ring           as Ring
 
 import System.Random (Random, randoms, randomRs, mkStdGen, )
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/Noise.hs b/src/Synthesizer/Dimensional/RateAmplitude/Noise.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/Noise.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/Noise.hs
@@ -31,7 +31,6 @@
 
 import qualified Algebra.Algebraic          as Algebraic
 import qualified Algebra.Field              as Field
-import qualified Algebra.Ring               as Ring
 
 import System.Random (Random, RandomGen, mkStdGen)
 
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/Piece.hs b/src/Synthesizer/Dimensional/RateAmplitude/Piece.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/Piece.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/Piece.hs
@@ -8,7 +8,6 @@
 
 import qualified Synthesizer.Generic.Piece as Piece
 import qualified Synthesizer.Generic.Signal as SigG
-import qualified Synthesizer.Generic.Cut as CutG
 import qualified Synthesizer.State.Control as Ctrl
 
 import qualified Synthesizer.Piecewise as Piecewise
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/Play.hs b/src/Synthesizer/Dimensional/RateAmplitude/Play.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/Play.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/Play.hs
@@ -32,12 +32,9 @@
 import qualified Number.DimensionTerm  as DN
 
 import qualified Algebra.ToInteger      as ToInteger
--- import qualified Algebra.Transcendental as Trans
 import qualified Algebra.Module         as Module
 import qualified Algebra.RealField      as RealField
 import qualified Algebra.Field          as Field
-import qualified Algebra.RealRing       as RealRing
--- import qualified Algebra.Ring           as Ring
 
 import System.Exit(ExitCode)
 
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/Rain.hs b/src/Synthesizer/Dimensional/RateAmplitude/Rain.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/Rain.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/Rain.hs
@@ -29,7 +29,7 @@
 import qualified Synthesizer.Dimensional.Signal as SigA
 
 import qualified Synthesizer.Dimensional.RateAmplitude.File as File
-import qualified Synthesizer.Dimensional.RateAmplitude.Play as Play
+-- import qualified Synthesizer.Dimensional.RateAmplitude.Play as Play
 
 import Synthesizer.Dimensional.Signal ((&*^), (&*>^), )
 import Synthesizer.Dimensional.Process (($:), ($::), ($^), (.:), (.^), )
@@ -67,12 +67,7 @@
 
 import qualified Number.NonNegative     as NonNeg
 
-import qualified Algebra.Transcendental as Trans
--- import qualified Algebra.Module         as Module
-import qualified Algebra.RealField      as RealField
-import qualified Algebra.Field          as Field
 import qualified Algebra.Ring           as Ring
-import qualified Algebra.Additive       as Additive
 
 import qualified Data.EventList.Relative.TimeBody as EventList
 
diff --git a/src/Synthesizer/Dimensional/RateAmplitude/Traumzauberbaum.hs b/src/Synthesizer/Dimensional/RateAmplitude/Traumzauberbaum.hs
--- a/src/Synthesizer/Dimensional/RateAmplitude/Traumzauberbaum.hs
+++ b/src/Synthesizer/Dimensional/RateAmplitude/Traumzauberbaum.hs
@@ -44,16 +44,6 @@
 
 import Number.DimensionTerm ((*&))
 
--- import qualified Number.NonNegative     as NonNeg
-
--- import qualified Algebra.Transcendental as Trans
--- import qualified Algebra.Module         as Module
--- import qualified Algebra.RealField      as RealField
-import qualified Algebra.Field          as Field
-import qualified Algebra.Ring           as Ring
-
--- import System.Random (Random, randomRs, mkStdGen)
-
 import NumericPrelude.Base
 import NumericPrelude.Numeric
 
diff --git a/src/Synthesizer/Dimensional/Signal.hs b/src/Synthesizer/Dimensional/Signal.hs
--- a/src/Synthesizer/Dimensional/Signal.hs
+++ b/src/Synthesizer/Dimensional/Signal.hs
@@ -5,6 +5,7 @@
 module Synthesizer.Dimensional.Signal (
    T, R,
    asTypeOfAmplitude,
+   render, apply,
    cache, bindCached, share,
    store, restore,
    ($-),  ($&),
diff --git a/src/Synthesizer/Dimensional/Signal/Private.hs b/src/Synthesizer/Dimensional/Signal/Private.hs
--- a/src/Synthesizer/Dimensional/Signal/Private.hs
+++ b/src/Synthesizer/Dimensional/Signal/Private.hs
@@ -9,6 +9,7 @@
 import qualified Synthesizer.Dimensional.Rate as Rate
 
 import qualified Synthesizer.Dimensional.Process as Proc
+import Synthesizer.Dimensional.Process (($#), )
 
 import qualified Synthesizer.Generic.Filter.NonRecursive as FiltG
 import qualified Synthesizer.Generic.Signal as SigG
@@ -135,6 +136,15 @@
    T (Rate.Dimensional u t) amp sig
 render rate signal =
    Proc.run rate (embedSampleRate Proc.$: signal)
+
+{-# INLINE apply #-}
+apply :: (Dim.C u) =>
+   (forall s. Proc.T s u t (T (Rate.Phantom s) amp0 sig0 -> T (Rate.Phantom s) amp1 sig1)) ->
+   T (Rate.Dimensional u t) amp0 sig0 -> T (Rate.Dimensional u t) amp1 sig1
+apply p x =
+   render
+      (actualSampleRate x)
+      (p $# Cons Rate.Phantom (amplitude x) (body x))
 
 
 {-# INLINE processBody #-}
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.5
+Version:        0.5.1
 License:        GPL
 License-File:   LICENSE
 Author:         Henning Thielemann <haskell@henning-thielemann.de>
@@ -28,7 +28,7 @@
 
 
 Source-Repository this
-  Tag:         0.5
+  Tag:         0.5.1
   Type:        darcs
   Location:    http://code.haskell.org/synthesizer/dimensional/
 
@@ -43,18 +43,13 @@
     event-list >=0.1 && <0.2,
     non-negative >=0.1 && <0.2,
     numeric-prelude >=0.2 && <0.3,
-    utility-ht >=0.0.5 && <0.1,
     storable-record >=0.0.1 && <0.1,
     sox >=0.2 && <0.3,
     storablevector >=0.2.3 && <0.3,
-    binary >=0.1 && <1,
-    bytestring >= 0.9 && <0.10
-
-  Build-Depends:
-    base >= 4 && <5,
+    bytestring >= 0.9 && <0.10,
     random >=1.0 && <2.0,
-    old-time >=1.0 && <2,
-    process >=1.0 && <1.1
+    utility-ht >=0.0.5 && <0.1,
+    base >= 4 && <5
 
   GHC-Options:    -Wall
   Hs-source-dirs: src
@@ -76,6 +71,7 @@
     Synthesizer.Dimensional.Amplitude.Control
     Synthesizer.Dimensional.Amplitude.Displacement
     Synthesizer.Dimensional.Amplitude.Filter
+    Synthesizer.Dimensional.Causal.Analysis
     Synthesizer.Dimensional.Causal.ControlledProcess
     Synthesizer.Dimensional.Causal.Displacement
     Synthesizer.Dimensional.Causal.Filter
@@ -106,7 +102,7 @@
     Synthesizer.Dimensional.Wave.Controlled
 
 --  Other-Modules:
--- we need this in synthesizer-alsa for implementation of low-level functions
+-- we need this in synthesizer-alsa and noisegenerator for implementation of low-level functions
     Synthesizer.Dimensional.Signal.Private
 --    Synthesizer.Dimensional.Utility
 
@@ -121,8 +117,13 @@
   Main-Is: Synthesizer/Dimensional/RateAmplitude/Rain.hs
 
 Executable demonstration
-  If !flag(buildExamples)
+  If flag(buildExamples)
+    Build-Depends:
+      explicit-exception >=0.1.6 && <0.2,
+      old-time >=1.0 && <2
+  Else
     Buildable: False
+
   GHC-Options: -Wall -fexcess-precision
   If flag(optimizeAdvanced)
     GHC-Options: -O2 -fvia-C -optc-O2
