Mercurial > hg > beaglert
diff examples/10-Instruments/d-box/ADSR.cpp @ 464:8fcfbfb32aa0 prerelease
Examples reorder with subdirectories. Added header to each project. Moved Doxygen to bottom of render.cpp.
author | Robert Jack <robert.h.jack@gmail.com> |
---|---|
date | Mon, 20 Jun 2016 16:20:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/10-Instruments/d-box/ADSR.cpp Mon Jun 20 16:20:38 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); +}