synthesizer-llvm-0.8.1.1: Efficient signal processing using runtime compilation

Safe HaskellNone
LanguageHaskell98

Synthesizer.LLVM.Parameterized.Signal

Synopsis

Documentation

data T p a Source

Instances

Functor (T p) Source 
Applicative (T p) Source

ZipList semantics

C (T p) Source 
(Field a, Real a, RationalConstant a) => Fractional (T p a) Source 
(PseudoRing a, Real a, IntegerConstant a) => Num (T p a) Source 
(Field a, RationalConstant a) => C (T p a) Source 
(PseudoRing a, IntegerConstant a) => C (T p a) Source 
Additive a => C (T p a) Source 
type ProcessOf (T p) = T p 

adjacentNodes02 :: (C a, Undefined a) => T p a -> T p (Nodes02 a) Source

adjacentNodes13 :: (MakeValueTuple ah, Storable ah, ValueTuple ah ~ a, C a, Undefined a) => T p ah -> T p a -> T p (Nodes13 a) Source

amplify :: (PseudoRing al, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al) => T p a -> T p al -> T p al Source

amplifyStereo :: (PseudoRing al, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al) => T p a -> T p (T al) -> T p (T al) Source

append :: (Phi a, Undefined a) => T p a -> T p a -> T p a Source

Appending many signals is inefficient, since in cascadingly appended signals the parts are counted in an unary way. Concatenating infinitely many signals is impossible. If you want to concatenate a lot of signals, please render them to lazy storable vectors first.

cycle :: (Phi a, Undefined a) => T p a -> T p a Source

drop :: T p Int -> T p a -> T p a Source

exponential2 :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ Value a, FirstClass a, IsSized (Stored a), IsArithmetic a, IsConst a) => T p a -> T p a -> T p (Value a) Source

exponentialCore :: (Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al) => T p a -> T p a -> T p al Source

exponentialBounded2 :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ Value a, FirstClass a, IsSized (Stored a), Real a, IsConst a) => T p a -> T p a -> T p a -> T p (Value a) Source

Exponential curve that remains at the bound value if it would fall below otherwise. This way you can avoid extremal values, e.g. denormalized ones. The initial value and the bound value must be positive.

exponentialBoundedCore :: (Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al, Real al) => T p a -> T p a -> T p a -> T p al Source

interpolateConstant :: (C a, IsFloating b, IntegerConstant b, CmpRet b, CmpResult b ~ Bool, Storable b, MakeValueTuple b, ValueTuple b ~ Value b, FirstClass b, IsSized (Stored b)) => T p b -> T p a -> T p a Source

Stretch signal in time by a certain factor.

This can be used for doing expensive computations of filter parameters at a lower rate. Alternatively, we could provide an adaptive map that recomputes output values only if the input value changes, or if the input value differs from the last processed one by a certain amount.

iterate :: (Storable ph, MakeValueTuple ph, ValueTuple ph ~ pl, C pl, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al) => (forall r. pl -> al -> CodeGenFunction r al) -> T p ph -> T p a -> T p al Source

lazySize :: T p LazySize -> T p () Source

Turns a lazy chunky size into a signal generator with unit element type. The signal length is the only information that the generator provides. Using zipWith you can use this signal as a lazy take.

map :: (Storable ph, MakeValueTuple ph, ValueTuple ph ~ pl, C pl) => (forall r. pl -> a -> CodeGenFunction r b) -> T p ph -> T p a -> T p b Source

mapSimple :: (forall r. a -> CodeGenFunction r b) -> T p a -> T p b Source

mapAccum :: (Storable pnh, MakeValueTuple pnh, ValueTuple pnh ~ pnl, C pnl, Storable psh, MakeValueTuple psh, ValueTuple psh ~ psl, C psl, C s) => (forall r. pnl -> a -> s -> CodeGenFunction r (b, s)) -> (forall r. psl -> CodeGenFunction r s) -> T p pnh -> T p psh -> T p a -> T p b Source

mix :: (C signal, Additive a) => signal a -> signal a -> signal a Source

noise :: (C a, IsFloating a, IsConst a, NumberOfElements a ~ D1, C (Value a), MakeValueTuple a, ValueTuple a ~ Value a, Storable a) => T p Word32 -> T p a -> T p (Value a) Source

noise seed rate

The rate parameter is for adjusting the amplitude such that it is uniform across different sample rates and after frequency filters. The rate is the ratio of the current sample rate to the default sample rate, where the variance of the samples would be one. If you want that at sample rate 22050 the variance is 1, then in order to get a consistent volume at sample rate 44100 you have to set rate = 2.

I use the variance as quantity and not the amplitude, because the amplitude makes only sense for uniformly distributed samples. However, frequency filters transform the probabilistic density of the samples towards the normal distribution according to the central limit theorem.

osci :: (Storable t, MakeValueTuple t, ValueTuple t ~ tl, Storable c, MakeValueTuple c, ValueTuple c ~ cl, C cl, C tl, Fraction tl, IntegerConstant tl) => (forall r. cl -> tl -> CodeGenFunction r y) -> T p c -> T p t -> T p t -> T p y Source

osciCore :: (Storable t, MakeValueTuple t, ValueTuple t ~ tl, C tl, Fraction tl) => T p t -> T p t -> T p tl Source

osciSaw :: (Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al, Fraction al, IntegerConstant al) => T p a -> T p a -> T p al Source

osciSimple :: (Storable t, MakeValueTuple t, ValueTuple t ~ tl, C tl, Fraction tl, IntegerConstant tl) => (forall r. tl -> CodeGenFunction r y) -> T p t -> T p t -> T p y Source

parabolaCore :: (Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, Additive al, IntegerConstant al) => T p a -> T p a -> T p a -> T p al Source

parabolaFadeIn :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al, IntegerConstant al) => T p a -> T p al Source

parabolaFadeInInf :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, Additive al, IntegerConstant al) => T p a -> T p al Source

parabolaFadeInMap :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al, IntegerConstant al) => T p a -> T p al Source

parabolaFadeOut :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al, IntegerConstant al) => T p a -> T p al Source

parabolaFadeOutInf :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, Additive al, IntegerConstant al) => T p a -> T p al Source

parabolaFadeOutMap :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al, IntegerConstant al) => T p a -> T p al Source

piecewiseConstant :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => T p (T Int a) -> T p value Source

ramp :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al, IntegerConstant al) => T p a -> T p al Source

rampCore :: (Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, Additive al, IntegerConstant al) => T p a -> T p a -> T p al Source

rampInf :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, Additive al, IntegerConstant al) => T p a -> T p al Source

rampSlope :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, Additive al, IntegerConstant al) => T p a -> T p al Source

reparameterize :: T q p -> T p a -> T q a Source

tail :: T p a -> T p a Source

tail empty generates the empty signal.

constant :: (Storable a, MakeValueTuple a, ValueTuple a ~ al, C al) => T p a -> T p al Source

envelope :: (C signal, PseudoRing a) => signal a -> signal a -> signal a Source

envelopeStereo :: (C signal, PseudoRing a) => signal a -> signal (T a) -> signal (T a) Source

simple :: (Storable parameters, MakeValueTuple parameters, C (ValueTuple parameters), C context, C state) => (forall r c. Phi c => context -> state -> T r c (al, state)) -> (forall r. ValueTuple parameters -> CodeGenFunction r (context, state)) -> T p parameters -> T p al Source

zip :: T p a -> T p b -> T p (a, b) Source

zipWith :: (Storable ph, MakeValueTuple ph, ValueTuple ph ~ pl, C pl) => (forall r. pl -> a -> b -> CodeGenFunction r c) -> T p ph -> T p a -> T p b -> T p c Source

zipWithSimple :: (forall r. a -> b -> CodeGenFunction r c) -> T p a -> T p b -> T p c Source

fromStorableVector :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => T p (Vector a) -> T p value Source

fromStorableVectorLazy :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => T p (Vector a) -> T p value Source

render :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => T p value -> Int -> p -> Vector a Source

This is not really a function, see renderChunky.

renderChunky :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => ChunkSize -> T p value -> p -> Vector a Source

This looks like a function, but it is not a function since it depends on LLVM being initialized with LLVM.initializeNativeTarget before. It is also problematic since you cannot control when and how often the underlying LLVM code is compiled. The compilation cannot be observed, thus it is referential transparent. But this influences performance considerably and I assume that you use this package exclusively for performance reasons.

run :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => T p value -> IO (Int -> p -> Vector a) Source

runChunky :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => T p value -> IO (ChunkSize -> p -> Vector a) Source

runChunkyPattern :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => T p value -> IO (LazySize -> p -> Vector a) Source

Renders a signal generator to a chunky storable vector with given pattern. If the pattern is shorter than the generated signal this means that the signal is shortened.