shithub: leaf

ref: bc99f48aca15efd07cb81853172b95e83076314f
dir: /LEAF/Inc/leaf-sampling.h/

View raw version
/*==============================================================================
 
 leaf-sampling.h
 Created: 23 Jan 2019 11:22:09am
 Author:  Mike Mulshine
 
 ==============================================================================*/


#ifndef LEAF_SAMPLING_H_INCLUDED
#define LEAF_SAMPLING_H_INCLUDED

#ifdef __cplusplus
extern "C" {
#endif
    
    //==============================================================================
    
#include "leaf-global.h"
#include "leaf-math.h"
#include "leaf-envelopes.h"
#include "leaf-mempool.h"
    
    //==============================================================================
    
    typedef enum RecordMode
    {
        RecordOneShot = 0,
        RecordLoop,
        RecordModeNil
    } RecordMode;
    
    typedef struct _tBuffer
    {
        float* buff;
        
        uint32_t idx;
        uint32_t bufferLength;
        uint32_t recordedLength;
        RecordMode mode;
        
        int active;
        
    } _tBuffer;
    
    typedef _tBuffer* tBuffer;
    
    void  tBuffer_init (tBuffer* const, uint32_t length);
    void  tBuffer_init_locate (tBuffer* const sb, uint32_t length, mpool_t* pool);
    void  tBuffer_free (tBuffer* const);
    void  tBuffer_free_locate (tBuffer* const sb, mpool_t* pool);
    
    void  tBuffer_tick (tBuffer* const, float sample);
    
    void  tBuffer_read(tBuffer* const, float* buff, uint32_t len);
    
    float tBuffer_get (tBuffer* const, int idx);
    
    void  tBuffer_record (tBuffer* const);
    void  tBuffer_stop (tBuffer* const);
    int   tBuffer_getRecordPosition(tBuffer* const);
    
    void  tBuffer_setRecordMode (tBuffer* const, RecordMode mode);
    
    void  tBuffer_clear (tBuffer* const);
    
    uint32_t tBuffer_getBufferLength(tBuffer* const);
    uint32_t tBuffer_getRecordedLength(tBuffer* const sb);
    
    //==============================================================================
    
    typedef enum PlayMode
    {
        PlayNormal,
        PlayLoop,
        PlayBackAndForth,
        PlayModeNil
    } PlayMode;
    
    typedef struct _tSampler
    {
        tBuffer samp;
        
        tRamp gain;
        
        float idx;
        float inc;
        float last;
        float iinc;
        int8_t dir;
        int8_t flip;
        int8_t bnf;
        
        int32_t start, targetstart;
        int32_t end, targetend;

        uint32_t len;
        uint32_t cfxlen;
        float numticks;
        PlayMode mode;
        int retrigger;
        
        int active;
        
    } _tSampler;
    
    typedef _tSampler* tSampler;
    
    void    tSampler_init      (tSampler* const, tBuffer* const);
    void    tSampler_free      (tSampler* const);
    
    float   tSampler_tick      (tSampler* const);
    
    void    tSampler_setSample (tSampler* const, tBuffer* const);
    
    void    tSampler_setMode   (tSampler* const, PlayMode mode);
    
    void    tSampler_play      (tSampler* const);
    void    tSampler_stop      (tSampler* const);
    
    void    tSampler_setStart  (tSampler* const, int32_t start);
    void    tSampler_setEnd    (tSampler* const, int32_t end);

    static void handleStartEndChange(tSampler* const sp);

    void 	tSampler_setCrossfadeLength  (tSampler* const sp, uint32_t length);
    
    void    tSampler_setRate   (tSampler* const, float rate);
    
    //==============================================================================
    
#ifdef __cplusplus
}
#endif

#endif // LEAF_SAMPLING_H_INCLUDED

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