diff examples/d-box/ADSR.cpp @ 300:dbeed520b014 prerelease

Renamed projects to examples
author Giulio Moro <giuliomoro@yahoo.it>
date Fri, 27 May 2016 13:58:20 +0100
parents projects/d-box/ADSR.cpp@8a575ba3ab52
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/d-box/ADSR.cpp	Fri May 27 13:58:20 2016 +0100
@@ -0,0 +1,76 @@
+//
+//  ADSR.cpp
+//
+//  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.
+//
+
+#include "ADSR.h"
+#include <math.h>
+
+
+ADSR::ADSR(void) {
+    reset();
+    setAttackRate(0);
+    setDecayRate(0);
+    setReleaseRate(0);
+    setSustainLevel(1.0);
+    setTargetRatioA(0.3);
+    setTargetRatioDR(0.0001);
+}
+
+ADSR::~ADSR(void) {
+}
+
+void ADSR::setAttackRate(float rate) {
+    attackRate = rate;
+    attackCoef = calcCoef(rate, targetRatioA);
+    attackBase = (1.0 + targetRatioA) * (1.0 - attackCoef);
+}
+
+void ADSR::setDecayRate(float rate) {
+    decayRate = rate;
+    decayCoef = calcCoef(rate, targetRatioDR);
+    decayBase = (sustainLevel - targetRatioDR) * (1.0 - decayCoef);
+}
+
+void ADSR::setReleaseRate(float rate) {
+    releaseRate = rate;
+    releaseCoef = calcCoef(rate, targetRatioDR);
+    releaseBase = -targetRatioDR * (1.0 - releaseCoef);
+}
+
+float ADSR::calcCoef(float rate, float targetRatio) {
+    return exp(-log((1.0 + targetRatio) / targetRatio) / rate);
+}
+
+void ADSR::setSustainLevel(float level) {
+    sustainLevel = level;
+    decayBase = (sustainLevel - targetRatioDR) * (1.0 - decayCoef);
+}
+
+void ADSR::setTargetRatioA(float targetRatio) {
+    if (targetRatio < 0.000000001)
+        targetRatio = 0.000000001;  // -180 dB
+    targetRatioA = targetRatio;
+    attackBase = (1.0 + targetRatioA) * (1.0 - attackCoef);
+}
+
+void ADSR::setTargetRatioDR(float targetRatio) {
+    if (targetRatio < 0.000000001)
+        targetRatio = 0.000000001;  // -180 dB
+    targetRatioDR = targetRatio;
+    decayBase = (sustainLevel - targetRatioDR) * (1.0 - decayCoef);
+    releaseBase = -targetRatioDR * (1.0 - releaseCoef);
+}