00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "ADSR.h"
00020
00021
00022 using namespace Marsyas;
00023
00024
00025 ADSR::ADSR(mrs_string name):MarSystem("ADSR", name)
00026 {
00027 addControls();
00028 }
00029
00030 ADSR::~ADSR()
00031 {
00032 }
00033
00034 MarSystem*
00035 ADSR::clone() const
00036 {
00037 return new ADSR(*this);
00038 }
00039
00040 void
00041 ADSR::addControls()
00042 {
00043
00044 addctrl("mrs_real/aTime", 0.2);
00045 addctrl("mrs_real/aTarget", 1.0);
00046
00047 addctrl("mrs_real/dTime", 0.1);
00048 addctrl("mrs_real/susLevel", 0.85);
00049
00050 addctrl("mrs_real/rTime", 0.2);
00051
00052 addctrl("mrs_natural/state", 1);
00053
00054 addctrl("mrs_real/nton", 0.0);
00055 addctrl("mrs_real/ntoff", 0.0);
00056
00057
00058 setctrlState("mrs_real/aTime", true);
00059 setctrlState("mrs_real/aTarget", true);
00060
00061 setctrlState("mrs_real/dTime", true);
00062 setctrlState("mrs_real/susLevel", true);
00063
00064 setctrlState("mrs_real/rTime", true);
00065 setctrlState("mrs_real/nton", true);
00066 setctrlState("mrs_real/ntoff", true);
00067 }
00068
00069 void
00070 ADSR::myUpdate(MarControlPtr sender)
00071 {
00072 MRSDIAG("ADSR.cpp - ADSR:myUpdate");
00073
00074
00075
00076
00077
00078 MarSystem::myUpdate(sender);
00079
00080
00081 aTime_ = getctrl("mrs_real/aTime")->to<mrs_real>();
00082 aTarget_ = getctrl("mrs_real/aTarget")->to<mrs_real>();
00083
00084 dTime_ = getctrl("mrs_real/dTime")->to<mrs_real>();
00085 susLevel_ = getctrl("mrs_real/susLevel")->to<mrs_real>();
00086
00087 rTime_ = getctrl("mrs_real/rTime")->to<mrs_real>();
00088
00089 sampleRate_= getctrl("mrs_real/israte")->to<mrs_real>();
00090
00091 aRate_ = 1.0 / (aTime_ * sampleRate_);
00092 dRate_ = 1.0 / (dTime_ * sampleRate_);
00093 rRate_ = 1.0 / (rTime_ * sampleRate_);
00094 noteon_ = getctrl("mrs_real/nton")->to<mrs_real>();
00095 noteoff_ = getctrl("mrs_real/ntoff")->to<mrs_real>();
00096
00097 if(noteon_)
00098 {
00099 this->setctrl("mrs_real/nton",0.0);
00100 value_=0.0;
00101 target_ = aTarget_;
00102 state_ = 1;
00103 }
00104
00105 if(noteoff_)
00106 {
00107 this->setctrl("mrs_real/ntoff",0.0);
00108 target_ = 0.0;
00109 state_ = 4;
00110 }
00111 }
00112
00113 void
00114 ADSR::myProcess(realvec& in, realvec& out)
00115 {
00116 mrs_natural o,t;
00117 for (o=0; o < inObservations_; o++)
00118 for (t = 0; t < inSamples_; t++)
00119 {
00120 switch (state_)
00121 {
00122 case 1:
00123 value_ += aRate_;
00124 if (value_ >= target_)
00125 {
00126 value_ = target_;
00127 rate_ = dRate_;
00128 target_ = susLevel_;
00129 state_ = 2;
00130 }
00131 break;
00132 case 2:
00133 value_ -= dRate_;
00134 if (value_ <= susLevel_)
00135 {
00136 value_ = susLevel_;
00137 rate_ = 0.0;
00138 state_ = 3;
00139 }
00140 break;
00141 case 4:
00142 value_ -= rRate_;
00143 if (value_ <= 0.0)
00144 {
00145 value_ = 0.0;
00146 state_ = 5;
00147 }
00148 }
00149
00150 out(o,t) = value_* in(o,t);
00151 }
00152
00153
00154
00155
00156
00157
00158 }