00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "PeakSynthOsc.h"
00020 #include "peakView.h"
00021
00022 using std::ostringstream;
00023 using namespace Marsyas;
00024
00025 PeakSynthOsc::PeakSynthOsc(mrs_string name):MarSystem("PeakSynthOsc",name)
00026 {
00027 addControls();
00028 }
00029
00030 PeakSynthOsc::PeakSynthOsc(const PeakSynthOsc& a):MarSystem(a)
00031 {
00032 ctrl_samplingFreq_ = getctrl("mrs_real/samplingFreq");
00033 ctrl_peakGroup2Synth_ = getctrl("mrs_natural/peakGroup2Synth");
00034 ctrl_isSilence_ = getctrl("mrs_bool/isSilence");
00035 ctrl_synSize_ = getctrl("mrs_natural/synSize");
00036 ctrl_delay_ = getctrl("mrs_natural/delay");
00037 ctrl_harmonize_ = getctrl("mrs_realvec/harmonize");
00038 }
00039
00040 PeakSynthOsc::~PeakSynthOsc()
00041 {
00042 }
00043
00044 MarSystem*
00045 PeakSynthOsc::clone() const
00046 {
00047 return new PeakSynthOsc(*this);
00048 }
00049
00050 void
00051 PeakSynthOsc::addControls()
00052 {
00053 addctrl("mrs_real/samplingFreq", MRS_DEFAULT_SLICE_SRATE, ctrl_samplingFreq_);
00054 ctrl_samplingFreq_->setState(true);
00055
00056 addctrl("mrs_natural/peakGroup2Synth", 0, ctrl_peakGroup2Synth_);
00057 addctrl("mrs_bool/isSilence", true, ctrl_isSilence_);
00058
00059 addctrl("mrs_natural/synSize", MRS_DEFAULT_SLICE_NSAMPLES, ctrl_synSize_);
00060 ctrl_synSize_->setState(true);
00061
00062 addctrl("mrs_natural/delay", 0, ctrl_delay_);
00063 ctrl_delay_->setState(true);
00064
00065 addctrl("mrs_realvec/harmonize", realvec(), ctrl_harmonize_);
00066 }
00067
00068 void
00069 PeakSynthOsc::myUpdate(MarControlPtr sender)
00070 {
00071 (void) sender;
00072 ctrl_onSamples_->setValue(ctrl_synSize_, NOUPDATE);
00073 ctrl_onObservations_->setValue(1, NOUPDATE);
00074 ctrl_osrate_->setValue(ctrl_samplingFreq_, NOUPDATE);
00075 ctrl_onObsNames_->setValue("audio,", NOUPDATE);
00076
00077 delay_ = ctrl_delay_->to<mrs_natural>();
00078 factor_ = TWOPI/ctrl_samplingFreq_->to<mrs_real>();
00079 }
00080
00081 void
00082 PeakSynthOsc::sine(realvec& out, mrs_real f, mrs_real a, mrs_real p)
00083 {
00084 if(f > 0.0 && a > 0.0)
00085 {
00086 for (mrs_natural i=0 ; i < onSamples_ ; ++i)
00087 out(i) += a*cos(factor_*f*(i-delay_)+p);
00088 }
00089 }
00090
00091 void
00092 PeakSynthOsc::myProcess(realvec& in, realvec& out)
00093 {
00094 out.setval(0);
00095 silence_ = true;
00096
00097 pkGrp2Synth_ = ctrl_peakGroup2Synth_->to<mrs_natural>();
00098 Nb_ = in.getSize()/peakView::nbPkParameters ;
00099 nbH_ = ctrl_harmonize_->to<mrs_realvec>().getSize();
00100
00101 if(nbH_)
00102 for(mrs_natural j=0 ; j<(nbH_-1)/2 ; j++)
00103 {
00104 mulF_ = ctrl_harmonize_->to<mrs_realvec>()(1+j*2);
00105 mulA_ = ctrl_harmonize_->to<mrs_realvec>()(2+j*2);
00106
00107 for (mrs_natural i=0; i < Nb_; ++i)
00108 {
00109
00110 mrs_bool synthMe = (pkGrp2Synth_ < 0)? (in(i+peakView::pkGroup*Nb_) >= 0) : (in(i+peakView::pkGroup*Nb_) == pkGrp2Synth_);
00111 if( synthMe )
00112 {
00113 sine(out, in(i)*mulF_, in(i+Nb_)*mulA_, in(i+2*Nb_));
00114 silence_ = false;
00115 }
00116 }
00117 }
00118 else
00119 for (mrs_natural i=0; i < Nb_; ++i)
00120 {
00121
00122 mrs_bool synthMe = (pkGrp2Synth_ < 0)? (in(i+peakView::pkGroup*Nb_) >= 0) : (in(i+peakView::pkGroup*Nb_) == pkGrp2Synth_);
00123 if( synthMe )
00124 {
00125 sine(out, in(i), in(i+Nb_), in(i+2*Nb_));
00126 silence_ = false;
00127 }
00128 }
00129
00130
00131 ctrl_isSilence_->setValue(silence_);
00132 }