|
Synthesizer.Plain.Control |
|
|
|
|
|
Synopsis |
|
constant :: y -> T y | | linear :: C y => y -> y -> T y | | linearMultiscale :: C y => y -> y -> T y | | linearMultiscaleNeutral :: C y => y -> T y | | linearStable :: C y => y -> y -> T y | | linearMean :: C y => y -> y -> T y | | linearSubdivision :: C y => T y -> T y | | line :: C y => Int -> (y, y) -> T y | | exponentialMultiscale :: C y => y -> y -> T y | | exponentialStable :: C y => y -> y -> T y | | exponential :: C y => y -> y -> T y | | exponentialMultiscaleNeutral :: C y => y -> T y | | exponential2Multiscale :: C y => y -> y -> T y | | exponential2Stable :: C y => y -> y -> T y | | exponential2 :: C y => y -> y -> T y | | exponential2MultiscaleNeutral :: C y => y -> T y | | exponentialFromToMultiscale :: C y => y -> y -> y -> T y | | exponentialFromTo :: C y => y -> y -> y -> T y | | exponentialStableGen :: (C y, C t) => (t -> y) -> t -> y -> T y | | vectorExponential :: (C y, C y v) => y -> v -> T v | | vectorExponential2 :: (C y, C y v) => y -> v -> T v | | cosineMultiscale :: C y => y -> y -> T y | | cosineSubdiv :: C y => y -> y -> T y | | cosineStable :: C y => y -> y -> T y | | cosine :: C y => y -> y -> T y | | cosineSubdivision :: C y => y -> T y -> T y | | cosineWithSlope :: C y => (y -> y -> signal) -> y -> y -> signal | | cubicHermite :: C y => (y, (y, y)) -> (y, (y, y)) -> T y | | cubicFunc :: C y => (y, (y, y)) -> (y, (y, y)) -> y -> y | | cubicHermiteStable :: C y => (y, (y, y)) -> (y, (y, y)) -> T y | | cubicSubdivision :: C y => T y -> T y | | | | data ControlPiece y = ControlPiece {} | | newtype PieceRightSingle y = PRS y | | newtype PieceRightDouble y = PRD y | | type ControlDist y = (y, Control y, y) | | (#|-) :: (y, Control y) -> (PieceRightSingle y, [ControlPiece y]) -> (ControlDist y, [ControlPiece y]) | | (-|#) :: y -> (ControlDist y, [ControlPiece y]) -> (PieceRightSingle y, [ControlPiece y]) | | (#|=) :: (y, Control y) -> (PieceRightDouble y, [ControlPiece y]) -> (ControlDist y, [ControlPiece y]) | | (=|#) :: (y, y) -> (ControlDist y, [ControlPiece y]) -> (PieceRightDouble y, [ControlPiece y]) | | (#|) :: (y, Control y) -> y -> (ControlDist y, [ControlPiece y]) | | (|#) :: y -> (ControlDist y, [ControlPiece y]) -> [ControlPiece y] | | piecewise :: (C y, C y) => [ControlPiece y] -> T y | | piecewisePart :: C y => y -> y -> y -> y -> Int -> Control y -> T y | | curveStable :: C t => (t -> y) -> (y -> y -> y) -> t -> y -> T y | | unreachable :: a | | double :: C t => t -> t | | concatMapPair :: (a -> (b, b)) -> T a -> T b | | flattenPairs :: T (a, a) -> T a | | subdivide :: (y -> y -> y) -> T y -> T y | | concatMapPair' :: (a -> (b, b)) -> T a -> T b | | curveMultiscale :: (y -> y -> y) -> y -> y -> T y | | curveMultiscaleNeutral :: (y -> y -> y) -> y -> y -> T y |
|
|
|
Control curve generation
|
|
|
|
|
:: C y | | => y | steepness
| -> y | initial value
| -> T y | linear progression
|
|
|
linearMultiscale :: C y => y -> y -> T y | Source |
|
Minimize rounding errors by reducing number of operations per element
to a logarithmuc number.
|
|
linearMultiscaleNeutral :: C y => y -> T y | Source |
|
Linear curve starting at zero.
|
|
linearStable :: C y => y -> y -> T y | Source |
|
As stable as the addition of time values.
|
|
linearMean :: C y => y -> y -> T y | Source |
|
It computes the same like linear but in a numerically more stable manner,
namely using a subdivision scheme.
The division needed is a division by two.
0 4 8
0 2 4 6 8
0 1 2 3 4 5 6 7 8
|
|
|
Intersperse linearly interpolated values.
|
|
|
:: C y | | => Int | length
| -> (y, y) | initial and final value
| -> T y | linear progression
| Linear curve of a fixed length.
The final value is not actually reached,
instead we stop one step before.
This way we can concatenate several lines
without duplicate adjacent values.
|
|
|
|
:: C y | | => y | time where the function reaches 1/e of the initial value
| -> y | initial value
| -> T y | exponential decay
|
|
|
|
:: C y | | => y | time where the function reaches 1/e of the initial value
| -> y | initial value
| -> T y | exponential decay
|
|
|
|
:: C y | | => y | time where the function reaches 1/e of the initial value
| -> y | initial value
| -> T y | exponential decay
|
|
|
exponentialMultiscaleNeutral | Source |
|
:: C y | | => y | time where the function reaches 1/e of the initial value
| -> T y | exponential decay
|
|
|
|
:: C y | | => y | half life
| -> y | initial value
| -> T y | exponential decay
|
|
|
|
:: C y | | => y | half life
| -> y | initial value
| -> T y | exponential decay
|
|
|
|
:: C y | | => y | half life
| -> y | initial value
| -> T y | exponential decay
|
|
|
exponential2MultiscaleNeutral | Source |
|
:: C y | | => y | half life
| -> T y | exponential decay
|
|
|
exponentialFromToMultiscale | Source |
|
:: C y | | => y | time where the function reaches 1/e of the initial value
| -> y | initial value
| -> y | value after given time
| -> T y | exponential decay
|
|
|
|
:: C y | | => y | time where the function reaches 1/e of the initial value
| -> y | initial value
| -> y | value after given time
| -> T y | exponential decay
|
|
|
exponentialStableGen :: (C y, C t) => (t -> y) -> t -> y -> T y | Source |
|
|
|
:: (C y, C y v) | | => y | time where the function reaches 1/e of the initial value
| -> v | initial value
| -> T v | exponential decay
| This is an extension of exponential to vectors
which is straight-forward but requires more explicit signatures.
But since it is needed rarely I setup a separate function.
|
|
|
|
:: (C y, C y v) | | => y | half life
| -> v | initial value
| -> T v | exponential decay
|
|
|
|
:: C y | | => y | time t0 where 1 is approached
| -> y | time t1 where -1 is approached
| -> T y | a cosine wave where one half wave is between t0 and t1
|
|
|
|
:: C y | | => y | time t0 where 1 is approached
| -> y | time t1 where -1 is approached
| -> T y | a cosine wave where one half wave is between t0 and t1
|
|
|
|
:: C y | | => y | time t0 where 1 is approached
| -> y | time t1 where -1 is approached
| -> T y | a cosine wave where one half wave is between t0 and t1
|
|
|
|
:: C y | | => y | time t0 where 1 is approached
| -> y | time t1 where -1 is approached
| -> T y | a cosine wave where one half wave is between t0 and t1
|
|
|
cosineSubdivision :: C y => y -> T y -> T y | Source |
|
|
cosineWithSlope :: C y => (y -> y -> signal) -> y -> y -> signal | Source |
|
|
cubicHermite :: C y => (y, (y, y)) -> (y, (y, y)) -> T y | Source |
|
|
cubicFunc :: C y => (y, (y, y)) -> (y, (y, y)) -> y -> y | Source |
|
0 16
0 8 16
0 4 8 12 16
0 2 4 6 8 10 12 14 16
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
|
cubicHermiteStable :: C y => (y, (y, y)) -> (y, (y, y)) -> T y | Source |
|
|
|
|
|
The curve type of a piece of a piecewise defined control curve.
| Constructors | CtrlStep | | CtrlLin | | CtrlExp | | | CtrlCos | | CtrlCubic | | ctrlCubicGradient0 :: y | | ctrlCubicGradient1 :: y | |
|
| Instances | |
|
|
|
The full description of a control curve piece.
| Constructors | ControlPiece | | pieceType :: Control y | | pieceY0 :: y | | pieceY1 :: y | | pieceDur :: y | |
|
| Instances | |
|
|
newtype PieceRightSingle y | Source |
|
|
|
newtype PieceRightDouble y | Source |
|
|
|
|
|
|
The 6 operators simplify constructing a list of ControlPiece a.
The description consists of nodes (namely the curve values at nodes)
and the connecting curve types.
The naming scheme is as follows:
In the middle there is a bar |.
With respect to the bar,
the pad symbol # is at the side of the curve type,
at the other side there is nothing, a minus sign -, or an equality sign =.
- Nothing means that here is the start or the end node of a curve.
- Minus means that here is a node where left and right curve meet at the same value.
The node description is thus one value.
- Equality sign means that here is a split node,
where left and right curve might have different ending and beginning values, respectively.
The node description consists of a pair of values.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Auxiliary functions
|
|
curveStable :: C t => (t -> y) -> (y -> y -> y) -> t -> y -> T y | Source |
|
|
|
|
|
|
concatMapPair :: (a -> (b, b)) -> T a -> T b | Source |
|
|
|
|
subdivide :: (y -> y -> y) -> T y -> T y | Source |
|
|
concatMapPair' :: (a -> (b, b)) -> T a -> T b | Source |
|
|
curveMultiscale :: (y -> y -> y) -> y -> y -> T y | Source |
|
|
curveMultiscaleNeutral :: (y -> y -> y) -> y -> y -> T y | Source |
|
|
Produced by Haddock version 2.4.2 |