00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "common.h"
00020 #include "MidiFileSynthSource.h"
00021
00022 using std::ostringstream;
00023 using namespace Marsyas;
00024
00025 MidiFileSynthSource::MidiFileSynthSource(mrs_string name):MarSystem("MidiFileSynthSource",name)
00026 {
00027 addControls();
00028 filename_ = "defaultfile";
00029 nChannels_ = 0;
00030 size_ = 0;
00031 }
00032
00033 MidiFileSynthSource::~MidiFileSynthSource()
00034 {
00035
00036 }
00037
00038 MarSystem*
00039 MidiFileSynthSource::clone() const
00040 {
00041 return new MidiFileSynthSource(*this);
00042 }
00043
00044 MidiFileSynthSource::MidiFileSynthSource(const MidiFileSynthSource& a):MarSystem(a)
00045 {
00046 filename_ = a.filename_;
00047 nChannels_ = a.nChannels_;
00048 size_ = a.size_;
00049
00050 ctrl_filename_ = getctrl("mrs_string/filename");
00051 ctrl_numActiveNotes_ = getctrl("mrs_natural/numActiveNotes");
00052 ctrl_nChannels_ = getctrl("mrs_natural/nChannels");
00053 ctrl_pos_ = getctrl("mrs_natural/pos");
00054 ctrl_hasData_ = getctrl("mrs_bool/hasData");
00055
00056 ctrl_start_ = getctrl("mrs_real/start");
00057 ctrl_end_ = getctrl("mrs_real/end");
00058
00059 ctrl_winSize_ = getctrl("mrs_natural/winSize");
00060
00061 ctrl_sigNewTextWin_ = getctrl("mrs_bool/sigNewTextWin");
00062 ctrl_newTextWin_ = getctrl("mrs_bool/newTextWin");
00063
00064 ctrl_size_ = getctrl("mrs_natural/size");
00065 }
00066
00067 void
00068 MidiFileSynthSource::addControls()
00069 {
00070 addctrl("mrs_string/filename", "defaultfile", ctrl_filename_);
00071 setctrlState("mrs_string/filename", true);
00072
00073 addctrl("mrs_natural/numActiveNotes", 0, ctrl_numActiveNotes_);
00074
00075 addctrl("mrs_natural/nChannels", 0, ctrl_nChannels_);
00076
00077 addctrl("mrs_natural/pos", 0, ctrl_pos_);
00078
00079 addctrl("mrs_bool/hasData", true, ctrl_hasData_);
00080
00081 addctrl("mrs_real/start", 0.0, ctrl_start_);
00082 addctrl("mrs_real/end", 0.0, ctrl_end_);
00083
00084 addctrl("mrs_natural/winSize", MRS_DEFAULT_SLICE_NSAMPLES, ctrl_winSize_);
00085 ctrl_winSize_->setState(true);
00086
00087 addctrl("mrs_bool/sigNewTextWin", true, ctrl_sigNewTextWin_);
00088 ctrl_sigNewTextWin_->setState(true);
00089
00090 addctrl("mrs_bool/newTextWin", false, ctrl_newTextWin_);
00091 ctrl_newTextWin_->setState(true);
00092
00093 addctrl("mrs_natural/size", 0, ctrl_size_);
00094 }
00095
00096 void
00097 MidiFileSynthSource::myUpdate(MarControlPtr sender)
00098 {
00099 (void) sender;
00100 MRSDIAG("MidiFileSynthSource::myUpdate");
00101
00102 MATLAB_PUT(ctrl_winSize_->to<mrs_natural>(), "winSize");
00103 MATLAB_PUT(inSamples_, "hopSize");
00104
00105 mrs_bool sigNewTextWin = ctrl_sigNewTextWin_->to<mrs_bool>();
00106 MATLAB_PUT((mrs_natural)sigNewTextWin, "sigNewTextWin");
00107
00108 if(!sigNewTextWin)
00109 {
00110 if(ctrl_newTextWin_->isTrue())
00111 {
00112
00113 mrs_natural numActiveNotes;
00114 MATLAB_GET("numActiveNotes", numActiveNotes);
00115 ctrl_numActiveNotes_->setValue(numActiveNotes);
00116
00117 MATLAB_EVAL("textWinStart = textWinEnd+1;textWinEnd = endPos2;");
00118
00119
00120
00121
00122
00123 ctrl_newTextWin_->setValue(false, NOUPDATE);
00124 }
00125 }
00126
00127 if(filename_ != ctrl_filename_->to<mrs_string>())
00128 {
00129 filename_ = ctrl_filename_->to<mrs_string>();
00130 MATLAB_PUT(filename_, "filename");
00131 MATLAB_PUT(israte_, "fs");
00132 MATLAB_PUT(ctrl_start_->to<mrs_real>(), "startSeg");
00133 MATLAB_PUT(ctrl_end_->to<mrs_real>(), "endSeg");
00134
00135
00136 MATLAB_EVAL("synthetizeMIDI;");
00137
00138 MATLAB_GET("numChannels", nChannels_);
00139 ctrl_nChannels_->setValue(nChannels_, NOUPDATE);
00140
00141 MATLAB_GET("audioLength", size_);
00142 ctrl_size_->setValue(size_, NOUPDATE);
00143
00144 ctrl_pos_->setValue(0, NOUPDATE);
00145 if(size_>0)
00146 ctrl_hasData_->setValue(true, NOUPDATE);
00147 else
00148 ctrl_hasData_->setValue(false, NOUPDATE);
00149 }
00150
00151 ctrl_onSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00152 ctrl_onObservations_->setValue(1, NOUPDATE);
00153 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00154 ctrl_onObsNames_->setValue("MIDIaudio", NOUPDATE);
00155 }
00156
00157 void
00158 MidiFileSynthSource::myProcess(realvec& in, realvec &out)
00159 {
00160 if(size_ == 0)
00161 return;
00162
00163 mrs_natural pos = ctrl_pos_->to<mrs_natural>();
00164
00165
00166 if(pos > size_)
00167 {
00168 out.setval(0.0);
00169
00170 if(!ctrl_hasData_->isTrue())
00171 return;
00172
00173 ctrl_hasData_->setValue(false);
00174
00175
00176 if(ctrl_sigNewTextWin_->isTrue())
00177 {
00178 mrs_natural numActiveNotes;
00179 MATLAB_GET("numActiveNotes", numActiveNotes);
00180 ctrl_numActiveNotes_->setValue(numActiveNotes);
00181 ctrl_newTextWin_->setValue(true, NOUPDATE);
00182 }
00183
00184 return;
00185 }
00186
00187 MATLAB_PUT(pos+1, "pos");
00188 MATLAB_EVAL("computeAudioFrame;");
00189 MATLAB_GET("audioFrame", out);
00190
00191 ctrl_pos_->setValue(pos+onSamples_);
00192
00193
00194
00195 if(ctrl_sigNewTextWin_->isTrue())
00196 {
00197 mrs_natural newTextWin = 0;
00198 MATLAB_GET("newTextWin", newTextWin);
00199 if(newTextWin!=0)
00200 {
00201 mrs_natural numActiveNotes;
00202 MATLAB_GET("numActiveNotes", numActiveNotes);
00203 ctrl_numActiveNotes_->setValue(numActiveNotes);
00204
00205 }
00206 ctrl_newTextWin_->setValue(newTextWin!=0, NOUPDATE);
00207 }
00208 }