00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "SineSource.h"
00020
00021 using namespace std;
00022 using namespace Marsyas;
00023
00024 SineSource::SineSource(mrs_string name):MarSystem("SineSource",name)
00025 {
00026
00027
00028
00029 addControls();
00030 index_ = 0;
00031 }
00032
00033 SineSource::~SineSource()
00034 {
00035 }
00036
00037 MarSystem*
00038 SineSource::clone() const
00039 {
00040 return new SineSource(*this);
00041 }
00042
00043 void
00044 SineSource::addControls()
00045 {
00046 addctrl("mrs_real/frequency", 440.0);
00047 }
00048
00049 void
00050 SineSource::myUpdate(MarControlPtr sender)
00051 {
00052
00053
00054
00055
00056 MarSystem::myUpdate(sender);
00057
00058 wavetableSize_ = 8192;
00059 wavetable_.create((mrs_natural)wavetableSize_);
00060
00061 mrs_real incr = TWOPI / wavetableSize_;
00062 for (mrs_natural t=0; t < wavetableSize_; t++)
00063 wavetable_(t) = (mrs_real)(0.5 * sin(incr * t));
00064
00065 }
00066
00067 void
00068 SineSource::myProcess(realvec &in, realvec &out)
00069 {
00070 (void) in;
00071
00072
00073
00074 if(getctrl("mrs_bool/mute")->to<mrs_bool>())
00075 {
00076 out.setval(0.0);
00077 return;
00078 }
00079
00080 mrs_real incr = (getctrl("mrs_real/frequency")->to<mrs_real>() * wavetableSize_) / (getctrl("mrs_real/israte")->to<mrs_real>());
00081 mrs_natural inSamples = getctrl("mrs_natural/inSamples")->to<mrs_natural>();
00082
00083
00084
00085
00086
00087 for (mrs_natural t=0; t < inSamples; t++)
00088 {
00089 out(0,t) = wavetable_((mrs_natural)index_);
00090 index_ += incr;
00091 while (index_ >= wavetableSize_)
00092 index_ -= wavetableSize_;
00093 while (index_ < 0)
00094 index_ += wavetableSize_;
00095 }
00096 }
00097
00098
00099
00100
00101