00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "common.h"
00020 #include "PeakSynthFFT.h"
00021 #include "peakView.h"
00022
00023 using std::ostringstream;
00024 using namespace Marsyas;
00025
00026
00027
00028 PeakSynthFFT::PeakSynthFFT(mrs_string name):MarSystem("PeakSynthFFT", name)
00029 {
00030
00031 addControls();
00032 }
00033
00034 PeakSynthFFT::PeakSynthFFT(const PeakSynthFFT& a) : MarSystem(a)
00035 {
00036 ctrl_Peaks_ = getctrl("mrs_realvec/peaks");
00037 ctrl_NbChannels_ = getctrl("mrs_natural/nbChannels");
00038 }
00039
00040 PeakSynthFFT::~PeakSynthFFT()
00041 {
00042 }
00043
00044 MarSystem*
00045 PeakSynthFFT::clone() const
00046 {
00047 return new PeakSynthFFT(*this);
00048 }
00049
00050 void
00051 PeakSynthFFT::addControls()
00052 {
00053 addctrl("mrs_realvec/peaks", realvec(), ctrl_Peaks_);
00054 addctrl("mrs_natural/nbChannels", 1, ctrl_NbChannels_);
00055 setctrlState("mrs_natural/nbChannels", true);
00056 addctrl("mrs_string/panning", "MARSYAS_EMPTY");
00057 setctrlState("mrs_string/panning", true);
00058 }
00059
00060 void
00061 PeakSynthFFT::myUpdate(MarControlPtr sender)
00062 {
00063 MarSystem::myUpdate(sender);
00064 setctrl("mrs_natural/onSamples", getctrl("mrs_natural/inSamples")->to<mrs_natural>()*getctrl("mrs_natural/nbChannels")->to<mrs_natural>());
00065
00066 realvec conv(4);
00067 conv.setval(-1);
00068 if(getctrl("mrs_string/panning")->to<mrs_string>() != "MARSYAS_EMPTY")
00069 {
00070 string2parameters(getctrl("mrs_string/panning")->to<mrs_string>(), conv, '_');
00071 }
00072 fgVolume_ = conv(0);
00073 fgPanning_ = conv(1);
00074 bgVolume_ = conv(2);
00075 bgPanning_ = conv(3);
00076
00077 mask_.create(getctrl("mrs_natural/inObservations")->to<mrs_natural>()/2+1);
00078 lastMask_.create(getctrl("mrs_natural/inObservations")->to<mrs_natural>()/2+1);
00079 lastMask_.setval(0);
00080 }
00081
00082 void
00083 PeakSynthFFT::generateMask(mrs_natural type)
00084 {
00085 mrs_natural i, j;
00086 realvec peaks = ctrl_Peaks_->to<mrs_realvec>();
00087
00088
00089 mrs_natural nbPeaks = peaks.getSize()/peakView::nbPkParameters;
00090
00091
00092 if(bgVolume_ != -1)
00093 {
00094 mask_.setval(bgVolume_);
00095 if(type == 1)
00096 mask_*=(1-bgPanning_)/2;
00097 if(type == 2)
00098 mask_*=(1+bgPanning_)/2;
00099 }
00100 else
00101 mask_.setval(0);
00102
00103
00104 for (i=0 ; i<onObservations_/2 + 1; ++i)
00105 {
00106 for(j=0 ; j<nbPeaks; j++)
00107 {
00108 if(peaks(j+peakView::pkGroup*nbPeaks) <= -1)
00109 continue;
00110 if (i>=peaks(j+nbPeaks*peakView::pkBinLow)*onObservations_ && i<=peaks(j+nbPeaks*peakView::pkBinHigh)*onObservations_)
00111 {
00112 mrs_real vol, pan;
00113 if(fgVolume_ != -1)
00114 {
00115
00116 vol = fgVolume_;
00117 pan = fgPanning_;
00118 }
00119 else
00120 {
00121
00122 vol = peaks(j+nbPeaks*peakView::pkVolume);
00123 pan = peaks(j+nbPeaks*peakView::pkPan);
00124 }
00125
00126 mask_(i) = vol;
00127
00128 if(type == 1)
00129 mask_(i) *= (1-pan)/2;
00130
00131 if(type == 2)
00132 mask_(i) *= (1+pan)/2;
00133 break;
00134 }
00135 }
00136 }
00137
00138 }
00139
00140 void
00141 PeakSynthFFT::lpfMask()
00142 {
00143 mrs_real gain = 0.8, deltaGain=.3;
00144
00145 for (mrs_natural i=0 ; i<mask_.getSize() ; ++i)
00146 {
00147 mrs_real g=gain-deltaGain*(mask_.getSize()-i)/mask_.getSize();
00148 mask_(i) = g*mask_(i)+(1-g)*lastMask_(i);
00149 }
00150 lastMask_ = mask_;
00151 }
00152
00153 void
00154 PeakSynthFFT::myProcess(realvec& in, realvec& out)
00155 {
00156 mrs_natural nbChannels = ctrl_NbChannels_->to<mrs_natural>();
00157 mrs_natural t,o;
00158
00159 for (t = 0; t < onSamples_; t++)
00160 {
00161 generateMask(t+(nbChannels-1));
00162
00163 #ifdef MARSYAS_MATLAB
00164 #ifdef MTLB_DBG_LOG
00165 MATLAB_PUT(mask_, "mask");
00166 MATLAB_EVAL("figure(71),plot(mask),axis('tight'),grid on");
00167 #endif
00168 #endif
00169 lpfMask();
00170 for (o=0; o < onObservations_/2+1; o++)
00171 {
00172
00173 out(o,t) = mask_(o) * in(o, 0);
00174 }
00175 for (o=onObservations_/2+1; o < onObservations_; o++)
00176 {
00177
00178 out(o,t) = in(o, 0);
00179 }
00180 }
00181
00182 }
00183
00184
00185
00186
00187
00188
00189
00190