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

Safe HaskellNone
LanguageHaskell98

Synthesizer.LLVM.Parameterized.Signal

Contents

Synopsis

Documentation

data T p a Source

Constructors

forall context state ioContext parameters . (Storable parameters, MakeValueTuple parameters, C (ValueTuple parameters), C context, C state) => Cons (forall r c. Phi c => context -> state -> T r c (a, state)) (forall r. ValueTuple parameters -> CodeGenFunction r (context, state)) (forall r. context -> state -> CodeGenFunction r ()) (p -> IO (ioContext, parameters)) (ioContext -> IO ()) 

Instances

Functor (T p) 
Applicative (T p)

ZipList semantics

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

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

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

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

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

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

mix :: (C signal, Additive a) => signal a -> signal a -> signal a 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

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

timeline edit

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

tail empty generates the empty signal.

drop :: T p Int -> T p a -> T p a 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

signal modifiers

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.

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

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

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

signal generators

exponentialCore :: (Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al) => T p a -> T p a -> T p al 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

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

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.

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

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

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

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

rampCore :: (Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, Additive al, IntegerConstant al) => T p a -> T p a -> T p al 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

rampInf :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, Additive 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

parabolaFadeInInf :: (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

ramp :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing 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

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

parabolaFadeIn :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ al, C al, PseudoRing al, IntegerConstant al) => T p a -> T p al 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.

conversion from and to storable vectors

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

piecewiseConstant :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => T p (T Int a) -> T p value 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.

derefFillPtr :: Importer (Ptr param -> Word32 -> Ptr a -> IO Word32) Source

run :: (Storable a, MakeValueTuple a, ValueTuple a ~ value, C value) => T p value -> IO (Int -> p -> Vector a) 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.

derefChunkPtr :: Importer (Ptr contextStateStruct -> Word32 -> Ptr struct -> IO Word32) Source

moduleChunky :: (C value, Struct value ~ struct, C parameters, Struct parameters ~ paramStruct, C context, C state, Struct (context, T state) ~ contextStateStruct) => (forall r z. Phi z => context -> state -> T r z (value, state)) -> (forall r. parameters -> CodeGenFunction r (context, state)) -> (forall r. context -> state -> CodeGenFunction r ()) -> CodeGenModule (Function (Ptr paramStruct -> IO (Ptr contextStateStruct)), Function (Ptr contextStateStruct -> IO ()), Function (Ptr contextStateStruct -> Word32 -> Ptr struct -> IO Word32)) Source

compileChunky :: (C value, Struct value ~ struct, C parameters, Struct parameters ~ paramStruct, C context, C state, Struct (context, T state) ~ contextStateStruct) => (forall r z. Phi z => context -> state -> T r z (value, state)) -> (forall r. parameters -> CodeGenFunction r (context, state)) -> (forall r. context -> state -> CodeGenFunction r ()) -> IO (FunPtr (Ptr paramStruct -> IO (Ptr contextStateStruct)), FunPtr (Ptr contextStateStruct -> IO ()), FunPtr (Ptr contextStateStruct -> Word32 -> Ptr struct -> IO Word32)) Source

debugMain :: forall parameters struct paramStruct contextStateStruct. (Storable parameters, IsType struct, IsType contextStateStruct, IsType paramStruct, IsSized paramStruct) => CodeGenModule (Function (Ptr paramStruct -> IO (Ptr contextStateStruct)), Function (Ptr contextStateStruct -> IO ()), Function (Ptr contextStateStruct -> Word32 -> Ptr struct -> IO Word32)) -> parameters -> IO (Function (Word32 -> Ptr (Ptr Word8) -> IO Word32)) 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.

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

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.