Mercurial > hg > beaglert
view projects/d-box/ADSR.cpp @ 39:638bc1ae2500 staging
Improved readibility of the DIGITAL code in the PRU, using register names instead of aliases and expanding some of the macros, removing unused macros. Binaries were not modified
author | Giulio Moro <giuliomoro@yahoo.it> |
---|---|
date | Wed, 13 May 2015 12:18:10 +0100 |
parents | 8a575ba3ab52 |
children |
line wrap: on
line source
// // 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); }