shithub: leaf

ref: 64d544f911536439cbc718aeb3d46cc6ad2732cb
dir: /LEAF/Inc/leaf-oscillators.h/

View raw version
/*==============================================================================
 leaf-oscillators.h
 Created: 20 Jan 2017 12:00:58pm
 Author:  Michael R Mulshine
 ==============================================================================*/

#ifndef LEAF_OSCILLATORS_H_INCLUDED
#define LEAF_OSCILLATORS_H_INCLUDED

#ifdef __cplusplus
extern "C" {
#endif
    
    //==============================================================================
    
#include "leaf-math.h"
#include "leaf-mempool.h"
#include "leaf-tables.h"
#include "leaf-filters.h"
    
    /*!
     * Header.
     * @include basic-oscillators.h
     * @example basic-oscillators.c
     * An example.
     */
    
    //==============================================================================
    
    typedef struct _tCycle
    {
        // Underlying phasor
        float phase;
        float inc,freq;
    } _tCycle;
    
    typedef _tCycle* tCycle;
    
    /*!
     * @defgroup tcycle tCycle
     * @ingroup oscillators
     * @brief A cycle/sine waveform oscillator. Uses wavetable synthesis.
     * @{
     */
    
    //! Initialize a tCycle to the default LEAF mempool.
    /*!
     @param osc A pointer to the tCycle to be initialized.
     */
    void    tCycle_init         (tCycle* const osc);
    
    
    //! Free a tCycle from the default LEAF mempool.
    /*!
     @param osc A pointer to the tCycle to be freed.
     */
    void    tCycle_free         (tCycle* const osc);
    
    
    //! Initialize a tCycle to a specified mempool.
    /*!
     @param osc A pointer to the tCycle to be initialized.
     @param pool A pointer to the tMempool to which the tCycle should be initialized.
     */
    void    tCycle_initToPool   (tCycle* const osc, tMempool* const pool);
    
    
    //! Free a tCycle from a specified mempool.
    /*!
     @param osc A pointer to the tCycle to be freed.
     @param pool A pointer to the tMempool from which the tCycle should be freed.
     */
    void    tCycle_freeFromPool (tCycle* const osc, tMempool* const pool);
    
    
    //! Tick a tCycle oscillator.
    /*!
     @param osc A pointer to the relevant tCycle.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tCycle_tick         (tCycle* const osc);
    
    
    //! Set the frequency of a tCycle oscillator.
    /*!
     @param osc A pointer to the relevant tCycle.
     @param freq The frequency to set the oscillator to.
     */
    void    tCycle_setFreq      (tCycle* const osc, float freq);
    
    /*! @} */
    
    //==============================================================================
    
    /* tTriangle: Anti-aliased Triangle waveform using wavetable interpolation. Wavetables constructed from sine components. */
    typedef struct _tTriangle
    {
        // Underlying phasor
        float phase;
        float inc,freq;
        TableName oct;
        float w;
    } _tTriangle;
    
    typedef _tTriangle* tTriangle;
    
    /*!
     * @defgroup ttriangle tTriangle
     * @ingroup oscillators
     * @brief An anti-aliased triangle waveform oscillator. Uses wavetable synthesis.
     * @{
     */
    
    //! Initialize a tTriangle to the default LEAF mempool.
    /*!
     @param osc A pointer to the tTriangle to be initialized.
     */
    void    tTriangle_init          (tTriangle* const osc);
    
    
    //! Free a tTriangle from the default LEAF mempool.
    /*!
     @param osc A pointer to the tTriangle to be freed.
     */
    void    tTriangle_free          (tTriangle* const osc);
    
    
    //! Initialize a tTriangle to a specified mempool.
    /*!
     @param osc A pointer to the tTriangle to be initialized.
     @param pool A pointer to the tMempool to which the tTriangle should be initialized.
     */
    void    tTriangle_initToPool    (tTriangle* const osc, tMempool* const pool);
    
    
    //! Free a tTriangle from a specified mempool.
    /*!
     @param osc A pointer to the tTriangle to be freed.
     @param pool A pointer to the tMempool from which the tTriangle should be freed.
     */
    void    tTriangle_freeFromPool  (tTriangle* const osc, tMempool* const pool);
    
    
    //! Tick a tTriangle oscillator.
    /*!
     @param osc A pointer to the relevant tTriangle.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tTriangle_tick          (tTriangle* const osc);
    
    
    //! Set the frequency of a tTriangle oscillator.
    /*!
     @param osc A pointer to the relevant tTriangle.
     @param freq The frequency to set the oscillator to.
     */
    void    tTriangle_setFreq       (tTriangle* const osc, float freq);
    
    /*! @} */
    
    //==============================================================================
    
    /* tSquare: Anti-aliased Square waveform using wavetable interpolation. Wavetables constructed from sine components. */
    typedef struct _tSquare
    {
        // Underlying phasor
        float phase;
        float inc,freq;
        TableName oct;
        float w;
    } _tSquare;
    
    typedef _tSquare* tSquare;
    
    /*!
     * @defgroup tsquare tSquare
     * @ingroup oscillators
     * @brief An anti-aliased square waveform oscillator. Uses wavetable synthesis.
     * @{
     */
    
    //! Initialize a tSquare to the default LEAF mempool.
    /*!
     @param osc A pointer to the tSquare to be initialized.
     */
    void    tSquare_init        (tSquare* const osc);
    
    
    //! Free a tSquare from the default LEAF mempool.
    /*!
     @param osc A pointer to the tSquare to be freed.
     */
    void    tSquare_free        (tSquare* const osc);
    
    
    //! Initialize a tSquare to a specified mempool.
    /*!
     @param osc A pointer to the tSquare to be initialized.
     @param pool A pointer to the tMempool to which the tSquare should be initialized.
     */
    void    tSquare_initToPool  (tSquare* const osc, tMempool* const);
    
    
    //! Free a tSquare from a specified mempool.
    /*!
     @param osc A pointer to the tSquare to be freed.
     @param pool A pointer to the tMempool from which the tSquare should be freed.
     */
    void    tSquare_freeFromPool(tSquare* const osc, tMempool* const);
    
    
    //! Tick a tSquare oscillator.
    /*!
     @param osc A pointer to the relevant tSquare.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tSquare_tick        (tSquare* const osc);

    
    //! Set the frequency of a tSquare oscillator.
    /*!
     @param osc A pointer to the relevant tSquare.
     @param freq The frequency to set the oscillator to.
     */
    void    tSquare_setFreq     (tSquare* const osc, float freq);
    
    /*! @} */
    
    //==============================================================================
    
    /* tSawtooth: Anti-aliased Sawtooth waveform using wavetable interpolation. Wavetables constructed from sine components. */
    typedef struct _tSawtooth
    {
        // Underlying phasor
        float phase;
        float inc,freq;
        TableName oct;
        float w;
    } _tSawtooth;
    
    typedef _tSawtooth* tSawtooth;
    
    /*!
     * @defgroup tsawtooth tSawtooth
     * @ingroup oscillators
     * @brief An anti-aliased sawtooth waveform oscillator. Uses wavetable synthesis.
     * @{
     */
    
    //! Initialize a tSawtooth to the default LEAF mempool.
    /*!
     @param osc A pointer to the tSawtooth to be initialized.
     */
    void    tSawtooth_init          (tSawtooth* const osc);
    
    
    //! Free a tSawtooth from the default LEAF mempool.
    /*!
     @param osc A pointer to the tSawtooth to be freed.
     */
    void    tSawtooth_free          (tSawtooth* const osc);
    
    
    //! Initialize a tSawtooth to a specified mempool.
    /*!
     @param osc A pointer to the tSawtooth to be initialized.
     @param pool A pointer to the tMempool to which the tSawtooth should be initialized.
     */
    void    tSawtooth_initToPool    (tSawtooth* const osc, tMempool* const pool);
    
    
    //! Free a tSawtooth from a specified mempool.
    /*!
     @param osc A pointer to the tSawtooth to be freed.
     @param pool A pointer to the tMempool from which the tSawtooth should be freed.
     */
    void    tSawtooth_freeFromPool  (tSawtooth* const osc, tMempool* const pool);
    
    
    //! Tick a tSawtooth oscillator.
    /*!
     @param osc A pointer to the relevant tSawtooth.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tSawtooth_tick          (tSawtooth* const osc);
    
    
    //! Set the frequency of a tSawtooth oscillator.
    /*!
     @param osc A pointer to the relevant tSawtooth.
     @param freq The frequency to set the oscillator to.
     */
    void    tSawtooth_setFreq       (tSawtooth* const osc, float freq);
    
    /*! @} */
    
    //==============================================================================
    
    typedef struct _tSine
    {
        float* sine;
        int size;
        float phase;
        float inc,freq;
    } _tSine;
    
    typedef _tSine* tSine;
    
    /*!
     * @defgroup tsine tSine
     * @ingroup oscillators
     * @brief A cycle/sine waveform oscillator.
     * @{
     */
    
    //! Initialize a tSine to the default LEAF mempool.
    /*!
     @param osc A pointer to the tSine to be initialized.
     */
    void    tSine_init         (tSine* const osc, int size);
    
    
    //! Free a tSine from the default LEAF mempool.
    /*!
     @param osc A pointer to the tSine to be freed.
     */
    void    tSine_free         (tSine* const osc);
    
    
    //! Initialize a tSine to a specified mempool.
    /*!
     @param osc A pointer to the tSine to be initialized.
     @param pool A pointer to the tMempool to which the tSine should be initialized.
     */
    void    tSine_initToPool   (tSine* const osc, int size, tMempool* const pool);
    
    
    //! Free a tSine from a specified mempool.
    /*!
     @param osc A pointer to the tSine to be freed.
     @param pool A pointer to the tMempool from which the tSine should be freed.
     */
    void    tSine_freeFromPool (tSine* const osc, tMempool* const pool);
    
    
    //! Tick a tSine oscillator.
    /*!
     @param osc A pointer to the relevant tSine.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tSine_tick         (tSine* const osc);
    
    
    //! Set the frequency of a tSine oscillator.
    /*!
     @param osc A pointer to the relevant tSine.
     @param freq The frequency to set the oscillator to.
     */
    void    tSine_setFreq      (tSine* const osc, float freq);
    
    /*! @} */
    
    //==============================================================================
    
    /* tTri: Anti-aliased Triangle waveform using wavetable interpolation. */
    typedef struct _tTri
    {
        float phase;
        float inc,freq;
        float skew;
        float lastOut;
    } _tTri;
    
    typedef _tTri* tTri;
    
    /*!
     * @defgroup tTri tTri
     * @ingroup oscillators
     * @brief An anti-aliased triangle waveform oscillator.
     * @{
     */
    
    //! Initialize a tTri to the default LEAF mempool.
    /*!
     @param osc A pointer to the tTri to be initialized.
     */
    void    tTri_init          (tTri* const osc);
    
    
    //! Free a tTri from the default LEAF mempool.
    /*!
     @param osc A pointer to the tTri to be freed.
     */
    void    tTri_free          (tTri* const osc);
    
    
    //! Initialize a tTri to a specified mempool.
    /*!
     @param osc A pointer to the tTri to be initialized.
     @param pool A pointer to the tMempool to which the tTri should be initialized.
     */
    void    tTri_initToPool    (tTri* const osc, tMempool* const pool);
    
    
    //! Free a tTri from a specified mempool.
    /*!
     @param osc A pointer to the tTri to be freed.
     @param pool A pointer to the tMempool from which the tTri should be freed.
     */
    void    tTri_freeFromPool  (tTri* const osc, tMempool* const pool);
    
    
    //! Tick a tTri oscillator.
    /*!
     @param osc A pointer to the relevant tTri.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tTri_tick          (tTri* const osc);
    
    
    //! Set the frequency of a tTri oscillator.
    /*!
     @param osc A pointer to the relevant tTriangle.
     @param freq The frequency to set the oscillator to.
     */
    void    tTri_setFreq       (tTri* const osc, float freq);
    
    void    tTri_setSkew       (tTri* const osc, float skew);
    
    /*! @} */
    
    //==============================================================================
    
    /* tPulse: Anti-aliased Square waveform. */
    typedef struct _tPulse
    {
        float phase;
        float inc,freq;
        float width;
    } _tPulse;
    
    typedef _tPulse* tPulse;
    
    /*!
     * @defgroup tPulse tPulse
     * @ingroup oscillators
     * @brief An anti-aliased pulse waveform oscillator with changeable pulse width.
     * @{
     */
    
    //! Initialize a tPulse to the default LEAF mempool.
    /*!
     @param osc A pointer to the tPulse to be initialized.
     */
    void    tPulse_init        (tPulse* const osc);
    
    
    //! Free a tPulse from the default LEAF mempool.
    /*!
     @param osc A pointer to the tPulse to be freed.
     */
    void    tPulse_free        (tPulse* const osc);
    
    
    //! Initialize a tPulse to a specified mempool.
    /*!
     @param osc A pointer to the tPulse to be initialized.
     @param pool A pointer to the tMempool to which the tPulse should be initialized.
     */
    void    tPulse_initToPool  (tPulse* const osc, tMempool* const);
    
    
    //! Free a tPulse from a specified mempool.
    /*!
     @param osc A pointer to the tPulse to be freed.
     @param pool A pointer to the tMempool from which the tPulse should be freed.
     */
    void    tPulse_freeFromPool(tPulse* const osc, tMempool* const);
    
    
    //! Tick a tPulse oscillator.
    /*!
     @param osc A pointer to the relevant tPulse.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tPulse_tick        (tPulse* const osc);
    
    
    //! Set the frequency of a tPulse oscillator.
    /*!
     @param osc A pointer to the relevant tPulse.
     @param freq The frequency to set the oscillator to.
     */
    void    tPulse_setFreq     (tPulse* const osc, float freq);
    
    void    tPulse_setWidth    (tPulse* const osc, float width);
    
    /*! @} */
    
    //==============================================================================
    
    /* tSawtooth: Anti-aliased Sawtooth waveform. */
    typedef struct _tSaw
    {
        float phase;
        float inc,freq;
    } _tSaw;
    
    typedef _tSaw* tSaw;
    
    /*!
     * @defgroup tsaw tSaw
     * @ingroup oscillators
     * @brief An anti-aliased sawtooth waveform oscillator. Uses wavetable synthesis.
     * @{
     */
    
    //! Initialize a tSaw to the default LEAF mempool.
    /*!
     @param osc A pointer to the tSaw to be initialized.
     */
    void    tSaw_init          (tSaw* const osc);
    
    
    //! Free a tSaw from the default LEAF mempool.
    /*!
     @param osc A pointer to the tSaw to be freed.
     */
    void    tSaw_free          (tSaw* const osc);
    
    
    //! Initialize a tSaw to a specified mempool.
    /*!
     @param osc A pointer to the tSaw to be initialized.
     @param pool A pointer to the tMempool to which the tSaw should be initialized.
     */
    void    tSaw_initToPool    (tSaw* const osc, tMempool* const pool);
    
    
    //! Free a tSaw from a specified mempool.
    /*!
     @param osc A pointer to the tSaw to be freed.
     @param pool A pointer to the tMempool from which the tSaw should be freed.
     */
    void    tSaw_freeFromPool  (tSaw* const osc, tMempool* const pool);
    
    
    //! Tick a tSaw oscillator.
    /*!
     @param osc A pointer to the relevant tSaw.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tSaw_tick          (tSaw* const osc);
    
    
    //! Set the frequency of a tSaw oscillator.
    /*!
     @param osc A pointer to the relevant tSaw.
     @param freq The frequency to set the oscillator to.
     */
    void    tSaw_setFreq       (tSaw* const osc, float freq);
    
    /*! @} */
    
    //==============================================================================
    
    /* tPhasor: Aliasing phasor [0.0, 1.0) */
    typedef struct _tPhasor
    {
        float phase;
        float inc,freq;
        uint8_t phaseDidReset;
        
    } _tPhasor;
    
    typedef _tPhasor* tPhasor;
    
    /*!
     * @defgroup tphasor Phasor
     * @ingroup oscillators
     * @brief An aliasing phasor.
     * @{
     */
    
    //! Initialize a tPhasor to the default LEAF mempool.
    /*!
     @param osc A pointer to the tPhasor to be initialized.
     */
    void    tPhasor_init        (tPhasor* const osc);
    
    
    //! Free a tPhasor from the default LEAF mempool.
    /*!
     @param osc A pointer to the tPhasor to be freed.
     */
    void    tPhasor_free        (tPhasor* const osc);
    
    
    //! Initialize a tPhasor to a specified mempool.
    /*!
     @param osc A pointer to the tPhasor to be initialized.
     @param pool A pointer to the tMempool to which the tPhasor should be initialized.
     */
    void    tPhasor_initToPool  (tPhasor* const osc, tMempool* const);
    
    
    //! Free a tPhasor from a specified mempool.
    /*!
     @param osc A pointer to the tPhasor to be freed.
     @param pool A pointer to the tMempool from which the tPhasor should be freed.
     */
    void    tPhasor_freeFromPool(tPhasor* const osc, tMempool* const);
    
    
    //! Tick a tPhasor oscillator.
    /*!
     @param osc A pointer to the relevant tPhasor.
     @return The ticked sample as a float from 0 to 1.
     */
    float   tPhasor_tick        (tPhasor* const osc);
    
    
    //! Set the frequency of a tPhasor oscillator.
    /*!
     @param osc A pointer to the relevant tPhasor.
     @param freq The frequency to set the oscillator to.
     */
    void    tPhasor_setFreq     (tPhasor* const osc, float freq);
    
    /*! @} */
    
    //==============================================================================
    
    /*!
     * @defgroup tnoise tNoise
     * @ingroup oscillators
     * @brief A noise generator.
     * @{
     */
    
    /* tNoise. WhiteNoise, PinkNoise. */
    /*!
     * Noise types
     */
    enum NoiseType
    {
        WhiteNoise, //!< White noise. Full spectrum.
        PinkNoise, //!< Pink noise. Inverse frequency-proportional spectrum.
        NoiseTypeNil,
    };
    
    typedef enum NoiseType NoiseType;
    
    typedef struct _tNoise
    {
        NoiseType type;
        float pinkb0, pinkb1, pinkb2;
        float(*rand)(void);
        
    } _tNoise;
    
    typedef _tNoise* tNoise;
    
    //! Initialize a tNoise to the default LEAF mempool.
    /*!
     @param osc A pointer to the tNoise to be initialized.
     */
    void    tNoise_init         (tNoise* const noise, NoiseType type);
    
    
    //! Free a tNoise from the default LEAF mempool.
    /*!
     @param osc A pointer to the tNoise to be freed.
     */
    void    tNoise_free         (tNoise* const noise);
    
    
    //! Initialize a tNoise to a specified mempool.
    /*!
     @param osc A pointer to the tNoise to be initialized.
     @param pool A pointer to the tMempool to which the tNoise should be initialized.
     */
    void    tNoise_initToPool   (tNoise* const noise, NoiseType type, tMempool* const);
    
    
    //! Free a tNoise from a specified mempool.
    /*!
     @param osc A pointer to the tNoise to be freed.
     @param pool A pointer to the tMempool from which the tNoise should be freed.
     */
    void    tNoise_freeFromPool (tNoise* const noise, tMempool* const);
    
    
    //! Tick a tNoise oscillator.
    /*!
     @param osc A pointer to the relevant tNoise.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tNoise_tick         (tNoise* const noise);
    
    /*! @} */
    
    //==============================================================================
    
    /*!
     * @defgroup tneuron tNeuron
     * @ingroup oscillators
     * @brief A model of a neuron, adapted to act as an oscillator.
     * @{
     */
    
    /*!
     * Neuron modes
     */
    enum NeuronMode
    {
        NeuronNormal, //!< Normal operation
        NeuronTanh, //!< Tanh voltage shaping
        NeuronAaltoShaper, //!< Aalto voltage shaping
        NeuronModeNil
    };
    typedef enum NeuronMode NeuronMode;
    
    typedef struct _tNeuron
    {
        tPoleZero f;
        
        NeuronMode mode;
        
        float voltage, current;
        float timeStep;
        
        float alpha[3];
        float beta[3];
        float rate[3];
        float V[3];
        float P[3];
        float gK, gN, gL, C;
    } _tNeuron;
    
    typedef _tNeuron* tNeuron;
    
    //! Initialize a tNeuron to the default LEAF mempool.
    /*!
     @param neuron A pointer to the tNeuron to be initialized.
     */
    void    tNeuron_init        (tNeuron* const neuron);
    
    
    //! Free a tNeuron from the default LEAF mempool.
    /*!
     @param neuron A pointer to the tNeuron to be freed.
     */
    void    tNeuron_free        (tNeuron* const neuron);
    
    
    //! Initialize a tNeuron to a specified mempool.
    /*!
     @param neuron A pointer to the tNeuron to be initialized.
     @param pool A pointer to the tMempool to which the tNeuron should be initialized.
     */
    void    tNeuron_initToPool  (tNeuron* const neuron, tMempool* const pool);
    
    
    //! Free a tNeuron from a specified mempool.
    /*!
     @param neuron A pointer to the tNeuron to be freed.
     @param pool A pointer to the tMempool from which the tNeuron should be freed.
     */
    void    tNeuron_freeFromPool(tNeuron* const neuron, tMempool* const pool);
    
    
    //! Reset the neuron model.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     */
    void    tNeuron_reset       (tNeuron* const neuron);
    
    
    //! Tick a tNeuron oscillator.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tNeuron_tick        (tNeuron* const neuron);
    
    
    //! Set the tNeuron shaping mode.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param mode The mode to set the tNeuron to.
     */
    void    tNeuron_setMode     (tNeuron* const neuron, NeuronMode mode);
    
    
    //! Set the current.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param current The new current.
     */
    void    tNeuron_setCurrent  (tNeuron* const neuron, float current);
    
    
    //! Set the potassium value.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param K The new potassium.
     */
    void    tNeuron_setK        (tNeuron* const neuron, float K);
    
    
    //! Set the chloride value.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param L The new chloride value.
     */
    void    tNeuron_setL        (tNeuron* const neuron, float L);
    
    
    //! Set the sodium value.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param N The new sodium value.
     */
    void    tNeuron_setN        (tNeuron* const neuron, float N);
    
    
    //! Set the calcium value.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param C The new calcium.
     */
    void    tNeuron_setC        (tNeuron* const neuron, float C);
    
    
    //! Set the V1 value.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param V1 The new V1.
     */
    void    tNeuron_setV1       (tNeuron* const neuron, float V1);
    
    
    //! Set the V2 value.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param V2 The new V2.
     */
    void    tNeuron_setV2       (tNeuron* const neuron, float V2);
    
    
    //! Set the V3 value.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param V3 The new V3.
     */
    void    tNeuron_setV3       (tNeuron* const neuron, float V3);
    
    
    //! Set the time step.
    /*!
     @param neuron A pointer to the relevant tNeuron.
     @param timestep The new time step
     */
    void    tNeuron_setTimeStep (tNeuron* const neuron, float timestep);
    
    /*! @} */
    
    //==============================================================================
    
    typedef struct _tMinBLEP
    {
        float coeffs[6];
        
        // FilterState
        float* x1, x2, y1, y2;
        
        float ratio, lastRatio;
        
        float overSamplingRatio;
        int zeroCrossings;
        
        float lastValue;
        float lastDelta; // previous derivative ...
        
        // Tweaking the Blep F
        float proportionalBlepFreq;
        uint8_t returnDerivative; // set this to return the FIRST DERIVATIVE of the blep (for first der. discontinuities)
        
        int blepIndex;
        int numActiveBleps;
        //currentActiveBlepOffsets;
        float* offset;
        float* freqMultiple;
        float* pos_change_magnitude;
        float* vel_change_magnitude;
        
        int minBlepSize;
        float* minBlepArray;
        float* minBlepDerivArray;
    } _tMinBLEP;
    
    typedef _tMinBLEP* tMinBLEP;
    
    void    tMinBLEP_init           (tMinBLEP* const minblep, int zeroCrossings, int oversamplerRatio);
    void    tMinBLEP_free           (tMinBLEP* const minblep);
    void    tMinBLEP_initToPool     (tMinBLEP* const minblep, int zeroCrossings, int oversamplerRatio, tMempool* const pool);
    void    tMinBLEP_freeFromPool   (tMinBLEP* const minblep, tMempool* const pool);
    
    // pass in audio, identify discontinuities and return the audio with minbleps inserted
    float   tMinBLEP_tick           (tMinBLEP* const minblep, float input);
    void    tMinBLEP_buildBLEP      (tMinBLEP* const minblep);
    void    tMinBLEP_addBLEP        (tMinBLEP* const minblep, float offset, float posChange, float velChange);
    
    void    tMinBLEP_setOversamplingRatio   (tMinBLEP* const minblep, float ratio);
    void    tMinBLEP_setNumZeroCrossings    (tMinBLEP* const minblep, int numCrossings);
    
    //==============================================================================
    
    /* tMBTriangle: Anti-aliased Triangle waveform using wavetable interpolation. */
    typedef struct _tMBTriangle
    {
        float phase;
        float inc,freq;
        float skew;
        float lastOut;
        
        tMinBLEP minBlep;
        tHighpass dcBlock;
    } _tMBTriangle;
    
    typedef _tMBTriangle* tMBTriangle;
    
    /*!
     * @defgroup tMBTriangle tMBTriangle
     * @ingroup oscillators
     * @brief An anti-aliased triangle waveform oscillator.
     * @{
     */
    
    //! Initialize a tMBTriangle to the default LEAF mempool.
    /*!
     @param osc A pointer to the tMBTriangle to be initialized.
     */
    void    tMBTriangle_init          (tMBTriangle* const osc);
    
    
    //! Free a tMBTriangle from the default LEAF mempool.
    /*!
     @param osc A pointer to the tMBTriangle to be freed.
     */
    void    tMBTriangle_free          (tMBTriangle* const osc);
    
    
    //! Initialize a tMBTriangle to a specified mempool.
    /*!
     @param osc A pointer to the tMBTriangle to be initialized.
     @param pool A pointer to the tMempool to which the tMBTriangle should be initialized.
     */
    void    tMBTriangle_initToPool    (tMBTriangle* const osc, tMempool* const pool);
    
    
    //! Free a tMBTriangle from a specified mempool.
    /*!
     @param osc A pointer to the tMBTriangle to be freed.
     @param pool A pointer to the tMempool from which the tMBTriangle should be freed.
     */
    void    tMBTriangle_freeFromPool  (tMBTriangle* const osc, tMempool* const pool);
    
    
    //! Tick a tMBTriangle oscillator.
    /*!
     @param osc A pointer to the relevant tMBTriangle.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tMBTriangle_tick          (tMBTriangle* const osc);
    
    
    //! Set the frequency of a tMBTriangle oscillator.
    /*!
     @param osc A pointer to the relevant tMBTriangleangle.
     @param freq The frequency to set the oscillator to.
     */
    void    tMBTriangle_setFreq       (tMBTriangle* const osc, float freq);
    
    void    tMBTriangle_setSkew       (tMBTriangle* const osc, float skew);
    
    void    tMBTriangle_sync          (tMBTriangle* const osc, float phase);
    
    /*! @} */
    
    //==============================================================================
    
    /* tMBPulse: Anti-aliased Square waveform. */
    typedef struct _tMBPulse
    {
        float phase;
        float inc,freq;
        float width;
        
        tMinBLEP minBlep;
        tHighpass dcBlock;
    } _tMBPulse;
    
    typedef _tMBPulse* tMBPulse;
    
    /*!
     * @defgroup tMBPulse tMBPulse
     * @ingroup oscillators
     * @brief An anti-aliased pulse waveform oscillator with changeable pulse width.
     * @{
     */
    
    //! Initialize a tMBPulse to the default LEAF mempool.
    /*!
     @param osc A pointer to the tMBPulse to be initialized.
     */
    void    tMBPulse_init        (tMBPulse* const osc);
    
    
    //! Free a tMBPulse from the default LEAF mempool.
    /*!
     @param osc A pointer to the tMBPulse to be freed.
     */
    void    tMBPulse_free        (tMBPulse* const osc);
    
    
    //! Initialize a tMBPulse to a specified mempool.
    /*!
     @param osc A pointer to the tMBPulse to be initialized.
     @param pool A pointer to the tMempool to which the tMBPulse should be initialized.
     */
    void    tMBPulse_initToPool  (tMBPulse* const osc, tMempool* const);
    
    
    //! Free a tMBPulse from a specified mempool.
    /*!
     @param osc A pointer to the tMBPulse to be freed.
     @param pool A pointer to the tMempool from which the tMBPulse should be freed.
     */
    void    tMBPulse_freeFromPool(tMBPulse* const osc, tMempool* const);
    
    
    //! Tick a tMBPulse oscillator.
    /*!
     @param osc A pointer to the relevant tMBPulse.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tMBPulse_tick        (tMBPulse* const osc);
    
    
    //! Set the frequency of a tMBPulse oscillator.
    /*!
     @param osc A pointer to the relevant tMBPulse.
     @param freq The frequency to set the oscillator to.
     */
    void    tMBPulse_setFreq     (tMBPulse* const osc, float freq);
    
    void    tMBPulse_setWidth    (tMBPulse* const osc, float width);
    
    void    tMBPulse_sync          (tMBPulse* const osc, float phase);
    
    
    /*! @} */
    
    //==============================================================================
    
    /* tMBSawtooth: Anti-aliased Sawtooth waveform. */
    typedef struct _tMBSaw
    {
        float phase;
        float inc,freq;
        
        tMinBLEP minBlep;
        tHighpass dcBlock;
    } _tMBSaw;
    
    typedef _tMBSaw* tMBSaw;
    
    /*!
     * @defgroup tMBSaw tMBSaw
     * @ingroup oscillators
     * @brief An anti-aliased sawtooth waveform oscillator. Uses wavetable synthesis.
     * @{
     */
    
    //! Initialize a tMBSaw to the default LEAF mempool.
    /*!
     @param osc A pointer to the tMBSaw to be initialized.
     */
    void    tMBSaw_init          (tMBSaw* const osc);
    
    
    //! Free a tMBSaw from the default LEAF mempool.
    /*!
     @param osc A pointer to the tMBSaw to be freed.
     */
    void    tMBSaw_free          (tMBSaw* const osc);
    
    
    //! Initialize a tMBSaw to a specified mempool.
    /*!
     @param osc A pointer to the tMBSaw to be initialized.
     @param pool A pointer to the tMempool to which the tMBSaw should be initialized.
     */
    void    tMBSaw_initToPool    (tMBSaw* const osc, tMempool* const pool);
    
    
    //! Free a tMBSaw from a specified mempool.
    /*!
     @param osc A pointer to the tMBSaw to be freed.
     @param pool A pointer to the tMempool from which the tMBSaw should be freed.
     */
    void    tMBSaw_freeFromPool  (tMBSaw* const osc, tMempool* const pool);
    
    
    //! Tick a tMBSaw oscillator.
    /*!
     @param osc A pointer to the relevant tMBSaw.
     @return The ticked sample as a float from -1 to 1.
     */
    float   tMBSaw_tick          (tMBSaw* const osc);
    
    
    //! Set the frequency of a tMBSaw oscillator.
    /*!
     @param osc A pointer to the relevant tMBSaw.
     @param freq The frequency to set the oscillator to.
     */
    void    tMBSaw_setFreq       (tMBSaw* const osc, float freq);
    
    void    tMBSaw_sync          (tMBSaw* const osc, float phase);
    
    /*! @} */
    
#ifdef __cplusplus
}
#endif

#endif  // LEAF_OSCILLATORS_H_INCLUDED

//==============================================================================