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

Safe HaskellNone

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

(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) 

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 alSource

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 bSource

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

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 cSource

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

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 alSource

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

timeline edit

tail :: T p a -> T p aSource

tail empty generates the empty signal.

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

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

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 aSource

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 b, IsSized (Stored b)) => T p b -> T p a -> T p aSource

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.

mix :: Additive a => T p a -> T p a -> T p aSource

envelope :: PseudoRing a => T p a -> T p a -> T p aSource

envelopeStereo :: PseudoRing a => T p a -> T p (T a) -> T p (T a)Source

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

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

signal generators

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

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

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 alSource

exponentialBounded2 :: (C a, Storable a, MakeValueTuple a, ValueTuple a ~ Value a, FirstClass a, IsSized 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 tlSource

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 ySource

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 ySource

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

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

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 alSource

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

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

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

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

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

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

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

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

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

noise :: (C a, IsFloating a, IsConst a, NumberOfElements a ~ D1, C (Value a), IsSized 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 valueSource

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

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

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 aSource

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 aSource

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.