File indexing completed on 2024-04-28 15:08:06

0001 /* miniSynth - A Simple Software Synthesizer
0002    SPDX-FileCopyrightText: 2015 Ville Räisänen <vsr at vsr.name>
0003 
0004    SPDX-License-Identifier: GPL-3.0-or-later
0005 */
0006 
0007 
0008 #include "ADSRenvelope.h"
0009 //#include <QDebug>
0010 
0011 ADSREnvelope::ADSREnvelope() : ADSREnvelope(0, 0, 0, 0.f, 0.f, 0.f) {
0012 }
0013 
0014 ADSREnvelope::ADSREnvelope(unsigned int _attackTime,
0015                            unsigned int _decayTime,
0016                            unsigned int _releaseTime,
0017                            qreal _initialAmpl,
0018                            qreal _peakAmpl,
0019                            qreal _sustainAmpl) : initialAmpl(_initialAmpl),
0020                                                  peakAmpl(_peakAmpl),
0021                                                  sustainAmpl(_sustainAmpl),
0022                                                  attackTime(_attackTime),
0023                                                  decayTime(_decayTime),
0024                                                  releaseTime(_releaseTime) {
0025 }
0026 
0027 qreal
0028 ADSREnvelope::eval(qreal t, unsigned char state) const {
0029     qreal attackTimeF  = ((qreal)attackTime)/1000;
0030     qreal decayTimeF   = ((qreal)decayTime)/1000;
0031     qreal releaseTimeF = ((qreal)releaseTime)/1000;
0032 
0033     switch (state) {
0034     case STATE_ATTACK:
0035         if (t < attackTimeF) {
0036             return initialAmpl*(attackTimeF - t)/attackTimeF +  peakAmpl*t/attackTimeF;
0037         } else {
0038             //qWarning() << "ADSREnvelope::eval - attack outside range";
0039             return peakAmpl;
0040         }
0041         break;
0042     case STATE_DECAY:
0043         if (t < decayTimeF) {
0044             return peakAmpl*(decayTimeF-t)/decayTimeF + sustainAmpl*t/decayTimeF;
0045         } else {
0046             return sustainAmpl;
0047         }
0048         break;
0049     case STATE_RELEASE:
0050         if (t < releaseTimeF) {
0051             return sustainAmpl*(1 - t/releaseTimeF);
0052         } else {
0053             //qWarning() << "ADSREnvelope::eval - release outside range";
0054             return 0;
0055         }
0056         break;
0057     }
0058 
0059     //qWarning() << "ADSREnvelope::eval - invalid state";
0060     return 0;
0061 }