shithub: leaf

Download patch

ref: 99c38ddf6e7f4a82136000f02c66b6b1219de031
parent: 58eff591e0a71b598eadb765fcef4500a349669a
author: spiricom <jeff@snyderphonics.com>
date: Tue Jun 9 14:10:04 EDT 2020

added more tSlide functions

--- a/leaf/Inc/leaf-envelopes.h
+++ b/leaf/Inc/leaf-envelopes.h
@@ -344,6 +344,7 @@
 		float prevIn;
 		float invUpSlide;
 		float invDownSlide;
+		float dest;
 
 	} _tSlide;
 
@@ -354,7 +355,17 @@
 	void    tSlide_initToPool    (tSlide* const, float upSlide, float downSlide, tMempool* const);
 	void    tSlide_freeFromPool  (tSlide* const, tMempool* const);
 
-	float   tSlide_tick          (tSlide* const, float in);
+	void 	tSlide_setUpSlide	(tSlide* const sl, float upSlide);
+
+	void 	tSlide_setDownSlide	(tSlide* const sl, float downSlide);
+
+
+	void 	tSlide_setDest		(tSlide* const sl, float dest);
+
+
+	float 	tSlide_tickNoInput	(tSlide* const sl);
+
+	float   tSlide_tick         (tSlide* const, float in);
 
 #ifdef __cplusplus
 }
--- a/leaf/Src/leaf-envelopes.c
+++ b/leaf/Src/leaf-envelopes.c
@@ -1506,6 +1506,7 @@
     s->prevIn = 0.0f;
     s->currentOut = 0.0f;
     s->prevOut = 0.0f;
+    s->dest = 0.0f;
     if (upSlide < 1.0f)
     {
     	upSlide = 1.0f;
@@ -1525,6 +1526,43 @@
 	    _tSlide* s = *sl;
 
 	    mpool_free((char*)s, m);
+}
+
+void tSlide_setUpSlide(tSlide* const sl, float upSlide)
+{
+	_tSlide* s = *sl;
+	s->invUpSlide = 1.0f / upSlide;
+}
+
+void tSlide_setDownSlide(tSlide* const sl, float downSlide)
+{
+	_tSlide* s = *sl;
+	s->invDownSlide = 1.0f / downSlide;
+}
+
+void tSlide_setDest(tSlide* const sl, float dest)
+{
+	_tSlide* s = *sl;
+	s->dest = dest;
+}
+
+float tSlide_tickNoInput(tSlide* const sl)
+{
+	_tSlide* s = *sl;
+	float in = s->dest;
+
+	if (in >= s->prevOut)
+	{
+		s->currentOut = s->prevOut + ((in - s->prevOut) * s->invUpSlide);
+	}
+	else
+	{
+		s->currentOut = s->prevOut + ((in - s->prevOut) * s->invDownSlide);
+	}
+	if (s->currentOut < VSF) s->currentOut = 0.0f;
+	s->prevIn = in;
+	s->prevOut = s->currentOut;
+	return s->currentOut;
 }
 
 float tSlide_tick(tSlide* const sl, float in)
--- /dev/null
+++ b/leaf/leaf-envelopes.h
@@ -1,0 +1,377 @@
+/*
+ ==============================================================================
+ 
+ leaf-envelopes.h
+ Created: 20 Jan 2017 12:02:17pm
+ Author:  Michael R Mulshine
+ 
+ ==============================================================================
+ */
+
+#ifndef LEAF_ENVELOPES_H_INCLUDED
+#define LEAF_ENVELOPES_H_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    
+    // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+    
+#include "leaf-math.h"
+#include "leaf-mempool.h"
+#include "leaf-filters.h"
+#include "leaf-delay.h"
+#include "leaf-analysis.h"
+#include "leaf-envelopes.h"
+    
+    /*!
+     * @internal
+     * Header.
+     * @include basic-oscillators.h
+     * @example basic-oscillators.c
+     * An example.
+     */
+
+    // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+    
+    /* Attack-Decay envelope */
+    typedef struct _tEnvelope {
+        
+       const float *exp_buff;
+       const float *inc_buff;
+        uint32_t buff_size;
+        
+        float next;
+        
+        float attackInc, decayInc, rampInc;
+        
+        int inAttack, inDecay, inRamp;
+        
+        int loop;
+        
+        float gain, rampPeak;
+        
+        float attackPhase, decayPhase, rampPhase;
+        
+    } _tEnvelope;
+    
+    typedef _tEnvelope* tEnvelope;
+    
+    void    tEnvelope_init          (tEnvelope* const, float attack, float decay, int loop);
+    void    tEnvelope_free          (tEnvelope* const);
+    void    tEnvelope_initToPool    (tEnvelope* const, float attack, float decay, int loop, tMempool* const);
+    void    tEnvelope_freeFromPool  (tEnvelope* const, tMempool* const);
+    
+    float   tEnvelope_tick          (tEnvelope* const);
+    void    tEnvelope_setAttack     (tEnvelope* const, float attack);
+    void    tEnvelope_setDecay      (tEnvelope* const, float decay);
+    void    tEnvelope_loop          (tEnvelope* const, int loop);
+    void    tEnvelope_on            (tEnvelope* const, float velocity);
+    
+    // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+    
+
+
+    /* Exponential Smoother */
+    typedef struct _tExpSmooth {
+        float factor, oneminusfactor;
+        float curr,dest;
+
+    } _tExpSmooth;
+
+    typedef _tExpSmooth* tExpSmooth;
+
+    void    tExpSmooth_init         (tExpSmooth* const, float val, float factor);
+    void    tExpSmooth_free         (tExpSmooth* const);
+    void    tExpSmooth_initToPool   (tExpSmooth* const, float val, float factor, tMempool* const);
+    void    tExpSmooth_freeFromPool (tExpSmooth* const, tMempool* const);
+
+    float   tExpSmooth_tick         (tExpSmooth* const);
+    float   tExpSmooth_sample       (tExpSmooth* const);
+    void    tExpSmooth_setFactor    (tExpSmooth* const, float factor);
+    void    tExpSmooth_setDest      (tExpSmooth* const, float dest);
+    void    tExpSmooth_setVal       (tExpSmooth* const, float val);
+    void    tExpSmooth_setValAndDest(tExpSmooth* const expsmooth, float val);
+
+    // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+
+
+    // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+
+
+    /* ADSR */
+        typedef struct _tADSR
+        {
+           const float *exp_buff;
+           const float *inc_buff;
+            uint32_t buff_size;
+
+            float next;
+
+            float attackInc, decayInc, releaseInc, rampInc;
+
+            oBool inAttack, inDecay, inSustain, inRelease, inRamp;
+
+            float sustain, gain, rampPeak, releasePeak;
+
+            float attackPhase, decayPhase, releasePhase, rampPhase;
+
+            float leakFactor;
+
+
+        } _tADSR;
+
+        typedef _tADSR* tADSR;
+
+        void    tADSR_init    (tADSR* const adsrenv, float attack, float decay, float sustain, float release);
+        void    tADSR_free          (tADSR* const);
+        void    tADSR_initToPool    (tADSR* const adsrenv, float attack, float decay, float sustain, float release, tMempool* const mp);
+        void    tADSR_freeFromPool  (tADSR* const, tMempool* const);
+
+        float   tADSR_tick          (tADSR* const);
+        void    tADSR_setAttack     (tADSR* const, float attack);
+        void    tADSR_setDecay      (tADSR* const, float decay);
+        void    tADSR_setSustain    (tADSR* const, float sustain);
+        void    tADSR_setRelease    (tADSR* const, float release);
+        void    tADSR_setLeakFactor (tADSR* const, float leakFactor);
+        void    tADSR_on            (tADSR* const, float velocity);
+        void    tADSR_off           (tADSR* const);
+
+
+    
+    
+    // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+    
+
+
+    /* ADSR2 */
+     typedef struct _tADSR2
+     {
+         float sampleRateInMs;
+         float attack;
+         float decay;
+         float release;
+         float attackLambda;
+         float decayLambda;
+         float releaseLambda;
+         float sustain;
+         float leakGain;
+         float leakFactor;
+         float targetGainSquared;
+         float factor;
+         float oneMinusFactor;
+         float gain;
+         uint8_t attacking;
+         uint8_t gate;
+         float env;
+         float envTarget;
+     } _tADSR2;
+
+     typedef _tADSR2* tADSR2;
+
+     void    tADSR2_init          (tADSR2* const, float attack, float decay, float sustain, float release);
+     void    tADSR2_free          (tADSR2* const);
+     void    tADSR2_initToPool    (tADSR2* const, float attack, float decay, float sustain, float release, tMempool* const);
+     void    tADSR2_freeFromPool  (tADSR2* const, tMempool* const);
+
+     float   tADSR2_tick          (tADSR2* const);
+     void    tADSR2_setAttack     (tADSR2* const, float attack);
+     void    tADSR2_setDecay      (tADSR2* const, float decay);
+     void    tADSR2_setSustain    (tADSR2* const, float sustain);
+     void    tADSR2_setRelease    (tADSR2* const, float release);
+     void    tADSR2_setLeakFactor (tADSR2* const, float leakFactor);
+     void    tADSR2_on            (tADSR2* const, float velocity);
+     void    tADSR2_off           (tADSR2* const);
+
+
+     // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+
+     // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+     enum envState {
+         env_idle = 0,
+         env_attack,
+         env_decay,
+         env_sustain,
+         env_release,
+         env_ramp
+     };
+
+     /* ADSR3 */
+     typedef struct _tADSR3
+     {
+         float sampleRateInMs;
+         int state;
+         float output;
+         float attackRate;
+         float decayRate;
+         float releaseRate;
+         float attackCoef;
+         float decayCoef;
+         float releaseCoef;
+         float sustainLevel;
+         float targetRatioA;
+         float targetRatioDR;
+         float attackBase;
+         float decayBase;
+         float releaseBase;
+         float leakFactor;
+         float targetGainSquared;
+         float factor;
+         float oneMinusFactor;
+         float gain;
+
+     } _tADSR3;
+
+     typedef _tADSR3* tADSR3;
+
+     void    tADSR3_init          (tADSR3* const, float attack, float decay, float sustain, float release);
+     void    tADSR3_free          (tADSR3* const);
+     void    tADSR3_initToPool    (tADSR3* const, float attack, float decay, float sustain, float release, tMempool* const);
+     void    tADSR3_freeFromPool  (tADSR3* const, tMempool* const);
+
+     float   tADSR3_tick          (tADSR3* const);
+     void    tADSR3_setAttack     (tADSR3* const, float attack);
+     void    tADSR3_setDecay      (tADSR3* const, float decay);
+     void    tADSR3_setSustain    (tADSR3* const, float sustain);
+     void    tADSR3_setRelease    (tADSR3* const, float release);
+     void    tADSR3_setLeakFactor (tADSR3* const, float leakFactor);
+     void    tADSR3_on            (tADSR3* const, float velocity);
+     void    tADSR3_off           (tADSR3* const);
+
+    // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+    
+    //ADSR4
+
+     
+     typedef struct _tADSR4
+         {
+            const float *exp_buff;
+             uint32_t buff_size;
+             uint32_t buff_sizeMinusOne;
+             float bufferSizeDividedBySampleRateInMs;
+             float next;
+
+             float attackInc, decayInc, releaseInc, rampInc;
+
+             uint32_t whichStage;
+
+             float sustain, gain, rampPeak, releasePeak;
+
+             float attackPhase, decayPhase, releasePhase, rampPhase;
+
+             float leakFactor;
+
+
+         } _tADSR4;
+
+         typedef _tADSR4* tADSR4;
+
+         void    tADSR4_init          (tADSR4* const, float attack, float decay, float sustain, float release, float* expBuffer, int bufferSize);
+         void    tADSR4_free          (tADSR4* const);
+         void    tADSR4_initToPool    (tADSR4* const, float attack, float decay, float sustain, float release, float* expBuffer, int bufferSize, tMempool* const);
+         void    tADSR4_freeFromPool  (tADSR4* const, tMempool* const);
+
+         float   tADSR4_tick          (tADSR4* const);
+         float   tADSR4_tickNoInterp  (tADSR4* const adsrenv);
+         void    tADSR4_setAttack     (tADSR4* const, float attack);
+         void    tADSR4_setDecay      (tADSR4* const, float decay);
+         void    tADSR4_setSustain    (tADSR4* const, float sustain);
+         void    tADSR4_setRelease    (tADSR4* const, float release);
+         void    tADSR4_setLeakFactor (tADSR4* const, float leakFactor);
+         void    tADSR4_on            (tADSR4* const, float velocity);
+         void    tADSR4_off           (tADSR4* const);
+     // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+
+    /* Ramp */
+    typedef struct _tRamp {
+        float inc;
+        float inv_sr_ms;
+        float minimum_time;
+        float curr,dest;
+        float time;
+        float factor;
+        int samples_per_tick;
+        
+    } _tRamp;
+    
+    typedef _tRamp* tRamp;
+    
+    void    tRamp_init          (tRamp* const, float time, int samplesPerTick);
+    void    tRamp_free          (tRamp* const);
+    void    tRamp_initToPool    (tRamp* const, float time, int samplesPerTick, tMempool* const);
+    void    tRamp_freeFromPool  (tRamp* const, tMempool* const);
+    
+    float   tRamp_tick          (tRamp* const);
+    float   tRamp_sample        (tRamp* const);
+    void    tRamp_setTime       (tRamp* const, float time);
+    void    tRamp_setDest       (tRamp* const, float dest);
+    void    tRamp_setVal        (tRamp* const, float val);
+
+    ///=============
+    /* Ramp Updown*/
+    typedef struct _tRampUpDown {
+        float upInc;
+        float downInc;
+        float inv_sr_ms;
+        float minimum_time;
+        float curr,dest;
+        float upTime;
+        float downTime;
+        int samples_per_tick;
+
+    } _tRampUpDown;
+
+    typedef _tRampUpDown* tRampUpDown;
+
+    void    tRampUpDown_init          (tRampUpDown* const, float upTime, float downTime, int samplesPerTick);
+    void    tRampUpDown_free          (tRampUpDown* const);
+    void    tRampUpDown_initToPool    (tRampUpDown* const, float upTime, float downTime, int samplesPerTick, tMempool* const);
+    void    tRampUpDown_freeFromPool  (tRampUpDown* const, tMempool* const);
+    
+    float   tRampUpDown_tick          (tRampUpDown* const);
+    float   tRampUpDown_sample        (tRampUpDown* const);
+    void    tRampUpDown_setUpTime       (tRampUpDown* const, float upTime);
+    void    tRampUpDown_setDownTime       (tRampUpDown* const, float downTime);
+    void    tRampUpDown_setDest       (tRampUpDown* const, float dest);
+    void    tRampUpDown_setVal        (tRampUpDown* const, float val);
+
+
+    ///=========================
+    //Slide (based on Max/MSP's slide~)
+	typedef struct _tSlide {
+		float prevOut;
+		float currentOut;
+		float prevIn;
+		float invUpSlide;
+		float invDownSlide;
+		float dest;
+
+	} _tSlide;
+
+	typedef _tSlide* tSlide;
+
+	void    tSlide_init          (tSlide* const, float upSlide, float downSlide);
+	void    tSlide_free          (tSlide* const);
+	void    tSlide_initToPool    (tSlide* const, float upSlide, float downSlide, tMempool* const);
+	void    tSlide_freeFromPool  (tSlide* const, tMempool* const);
+
+	void 	tSlide_setUpSlide	(tSlide* const sl, float upSlide);
+
+	void 	tSlide_setDownSlide	(tSlide* const sl, float downSlide);
+
+
+	void 	tSlide_setDest		(tSlide* const sl, float dest);
+
+
+	float 	tSlide_tickNoInput	(tSlide* const sl);
+
+	float   tSlide_tick         (tSlide* const, float in);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // LEAF_ENVELOPES_H_INCLUDED
+
+
+