
Synthesizer.Basic.Wave  Portability  requires multiparameter type classes  Stability  provisional  Maintainer  synthesizer@henningthielemann.de 





Description 
Basic waveforms
If you want to use parametrized waves with two parameters
then zip your parameter signals and apply uncurry to the wave function.


Synopsis 

newtype T t y = Cons {}   fromFunction :: (t > y) > T t y   raise :: C y => y > T t y > T t y   amplify :: C y => y > T t y > T t y   distort :: (y > z) > T t y > T t z   apply :: T t y > T t > y   phaseOffset :: C a => T a b > a > T a b   sine :: C a => T a a   cosine :: C a => T a a   helix :: C a => T a (T a)   fastSine2 :: (Ord a, C a) => T a a   fastSine4 :: (Ord a, C a) => T a a   saw :: C a => T a a   sawCos :: (C a, C a) => T a a   sawComplex :: (Power a, C a) => T a (T a)   square :: (Ord a, C a) => T a a   squareCos :: (C a, C a) => T a a   squareComplex :: (Power a, C a) => T a (T a)   triangle :: (Ord a, C a) => T a a   sample :: C a => T a v > [v] > T a v   truncOddCosine :: C a => Int > T a a   truncOddTriangle :: C a => Int > T a a   truncCosine :: C a => a > T a a   truncTriangle :: C a => a > T a a   powerNormed :: (C a, C a) => a > T a a   power01Normed :: (C a, C a) => a > a > a   powerSigned :: (C a, C a) => a > a > a   logitSaw :: C a => a > T a a   logitSine :: C a => a > T a a   sineSquare :: (C a, C a) => a > T a a   piecewiseParabolaSaw :: (C a, Ord a) => a > T a a   piecewiseSineSaw :: (C a, Ord a) => a > T a a   sineSawSmooth :: C a => a > T a a   sineSawSharp :: C a => a > T a a   affineComb :: C a => a > (a, a) > a   sawPike :: (Ord a, C a) => a > T a a   trianglePike :: (C a, C a) => a > T a a   trianglePikeShift :: (C a, C a) => a > a > T a a   squarePike :: C a => a > T a a   squarePikeShift :: C a => a > a > T a a   squareAsymmetric :: (Ord a, C a) => a > T a a   squareBalanced :: (Ord a, C a) => a > T a a   triangleAsymmetric :: (Ord a, C a) => a > T a a   trapezoid :: (C a, C a) => a > T a a   trapezoidAsymmetric :: (C a, C a) => a > a > T a a   trapezoidBalanced :: (C a, C a) => a > a > T a a   sampledTone :: C a => T a v > T a v > a > [v] > a > T a v   sampledToneAlt :: C a => T a v > T a v > a > [v] > a > T a v   data Harmonic a = Harmonic {}   harmonic :: T a > a > Harmonic a   composedHarmonics :: C a => [Harmonic a] > T a a 



Definition and construction



Constructors   Instances  C a y => C a (T t y)  C y => C (T t y) 



fromFunction :: (t > y) > T t y  Source 


Operations on waves






distort :: (y > z) > T t y > T t z  Source 




phaseOffset :: C a => T a b > a > T a b  Source 


Examples


unparameterized




























discretely parameterized



A truncated cosine. This has rich overtones.



For parameter zero this is saw.


continuously parameterized



A truncated cosine plus a ramp that guarantees a bump of high 2 at the boundaries.
It is truncCosine (2 * fromIntegral n + 0.5) == truncOddCosine (2*n)


truncTriangle :: C a => a > T a a  Source 


powerNormed :: (C a, C a) => a > T a a  Source 


power01Normed :: (C a, C a) => a > a > a  Source 


powerSigned :: (C a, C a) => a > a > a  Source 



Tangens hyperbolicus allows interpolation
between some kind of saw tooth and square wave.
In principle it is not necessary
because you can distort a saw tooth oscillation by map tanh.



Tangens hyperbolicus of a sine allows interpolation
between some kind of sine and square wave.
In principle it is not necessary
because you can distort a square oscillation by map tanh.

















affineComb :: C a => a > (a, a) > a  Source 



:: (Ord a, C a)   => a  pike width ranging from 0 to 1, 1 yields saw
 > T a a  



:: (C a, C a)   => a  pike width ranging from 0 to 1, 1 yields triangle
 > T a a  



:: (C a, C a)   => a  pike width ranging from 0 to 1
 > a  shift ranges from 1 to 1; 0 yields trianglePike
 > T a a  



:: C a   => a  pike width ranging from 0 to 1, 1 yields square
 > T a a  



:: C a   => a  pike width ranging from 0 to 1
 > a  shift ranges from 1 to 1; 0 yields squarePike
 > T a a  



:: (Ord a, C a)   => a  value between 1 and 1 controlling the ratio of high and low time:
1 turns the high time to zero,
1 makes the low time zero,
0 yields square
 > T a a  





:: (Ord a, C a)   => a  asymmetry parameter ranging from 1 to 1:
For 0 you obtain the usual triangle.
For 1 you obtain a falling saw tooth starting with its maximum.
For 1 you obtain a rising saw tooth starting with a zero.
 > T a a  



:: (C a, C a)   => a  width of the plateau ranging from 0 to 1:
0 yields triangle, 1 yields square
 > T a a  





trapezoidBalanced :: (C a, C a) => a > a > T a a  Source 


sampledTone :: C a => T a v > T a v > a > [v] > a > T a v  Source 

We assume that a tone was generated by a shape modulated oscillator.
We try to reconstruct the wave function
(with parameters shape control and phase)
from a tone by interpolation.
The unit for the shape control parameter is the sampling period.
That is the shape parameter is a time parameter
pointing to a momentary shape of the prototype signal.
Of course this momentary shape does not exist
and we can only guess it using interpolation.
At the boundaries we repeat the outermost shapes
that can be reconstructed entirely from interpolated data
(that is, no extrapolation is needed).
This way we cannot reproduce the shape at the boundaries
because we have no data for cyclically extending it.
On the other hand this method guarantees a nice wave shape
with the required fractional period.
It must be
length tone >=
Interpolation.number ipStep +
Interpolation.number ipLeap * ceiling period.


sampledToneAlt :: C a => T a v > T a v > a > [v] > a > T a v  Source 

Interpolate first within waves and then across waves,
which is simpler but maybe less efficient.



This is similar to Polar coordinates,
but the range of the phase is from 0 to 1, 0 to 2*pi.
 Constructors  Harmonic   harmonicPhase :: T a   harmonicAmplitude :: a  








Produced by Haddock version 2.3.0 