diff projects/d-box/ADSR.h @ 0:8a575ba3ab52

Initial commit.
author andrewm
date Fri, 31 Oct 2014 19:10:17 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/projects/d-box/ADSR.h	Fri Oct 31 19:10:17 2014 +0100
@@ -0,0 +1,137 @@
+//
+//  ADRS.h
+//
+//  Created by Nigel Redmon on 12/18/12.
+//  EarLevel Engineering: earlevel.com
+//  Copyright 2012 Nigel Redmon
+//
+//  For a complete explanation of the ADSR envelope generator and code,
+//  read the series of articles by the author, starting here:
+//  http://www.earlevel.com/main/2013/06/01/envelope-generators/
+//
+//  License:
+//
+//  This source code is provided as is, without warranty.
+//  You may copy and distribute verbatim copies of this document.
+//  You may modify and use this source code to create binary code for your own purposes, free or commercial.
+//
+
+#ifndef ADRS_h
+#define ADRS_h
+
+#include <stdio.h>
+#include <string>
+
+using namespace std;
+
+enum envState {
+	env_idle = 0,
+	env_attack,
+	env_decay,
+	env_sustain,
+	env_release
+};
+
+class ADSR {
+public:
+	ADSR(void);
+	~ADSR(void);
+	float process(void);
+	float process(int sampleCount);
+    float getOutput(void);
+    int getState(void);
+	void gate(int on);
+    void setAttackRate(float rate);
+    void setDecayRate(float rate);
+    void setReleaseRate(float rate);
+	void setSustainLevel(float level);
+    void setTargetRatioA(float targetRatio);
+    void setTargetRatioDR(float targetRatio);
+    void reset(void);
+
+protected:
+	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;
+	string name;
+    float calcCoef(float rate, float targetRatio);
+};
+
+inline float ADSR::process() {
+	switch (state) {
+        case env_idle:
+            break;
+        case env_attack:
+            output = attackBase + output * attackCoef;
+            if (output >= 1.0) {
+                output = 1.0;
+                state = env_decay;
+            }
+            break;
+        case env_decay:
+            output = decayBase + output * decayCoef;
+            if (output <= sustainLevel) {
+                output = sustainLevel;
+                state = env_sustain;
+            }
+            break;
+        case env_sustain:
+            break;
+        case env_release:
+            output = releaseBase + output * releaseCoef;
+            if (output <= 0.0) {
+                output = 0.0;
+                state = env_idle;
+            }
+            break;
+	}
+	return output;
+}
+
+inline float ADSR::process(int sampleCount)
+{
+	float retVal = 0;
+
+	if(state != env_idle)
+	{
+		for(int i=0; i<sampleCount; i++)
+			retVal = process();
+	}
+
+	return retVal;
+}
+
+inline void ADSR::gate(int gate) {
+
+	if (gate)
+		state = env_attack;
+	else if (state != env_idle)
+        state = env_release;
+}
+
+inline int ADSR::getState() {
+    return state;
+}
+
+inline void ADSR::reset() {
+    state = env_idle;
+    output = 0.0;
+}
+
+inline float ADSR::getOutput() {
+	return output;
+}
+
+
+#endif