Mercurial > hg > beaglert
view projects/d-box/ADSR.cpp @ 256:3e93d9793da3 aux_task_args
Overload BeagleRT_createAuxiliaryTask so tasks can be created with or without arguments
author | Liam Donovan <l.b.donovan@qmul.ac.uk> |
---|---|
date | Fri, 06 May 2016 21:36:27 +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); }