// please keep this at the end of all the toy_with_ functions. // to use, copy this and paste it above, then modify as needed void toy_with_null(mrs_string sfname) { MarSystemManager mng; MarSystem *net = mng.create("Series", "net"); net->addMarSystem(mng.create("SoundFileSource", "src")); net->addMarSystem(mng.create("ShiftInput", "si")); // you probably want to add more here net->addMarSystem(mng.create("Spectrum", "spec")); net->addMarSystem(mng.create("PowerSpectrum", "pspec")); net->addMarSystem(mng.create("Spectrum2Chroma", "s2c")); net->addMarSystem(mng.create("PlotSink", "ps")); net->updControl("SoundFileSource/src/mrs_string/filename", sfname); net->updControl("mrs_natural/inSamples", 512); net->updControl("mrs_natural/inSamples", 1024); net->updControl("ShiftInput/si/mrs_natural/winSize", 512); while ( net->getctrl("SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>() ) { net->tick(); #if 0 mrs_realvec v = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); for (mrs_natural i = 0; i<v.getSize(); ++i) { printf("%.5g\t", v(i)); } cout<<endl; #endif } delete net; }
void toy_with_spectral_single(mrs_string sfname) { MarSystemManager mng; MarSystem *net = mng.create("Series", "net"); net->addMarSystem(mng.create("SoundFileSource", "src")); net->addMarSystem(mng.create("ShiftInput", "si")); net->addMarSystem(mng.create("Windowing", "win")); net->addMarSystem(mng.create("Spectrum", "spec")); net->addMarSystem(mng.create("PowerSpectrum", "pspec")); net->updControl("SoundFileSource/src/mrs_string/filename", sfname); net->updControl("mrs_natural/inSamples", 1024); net->updControl("ShiftInput/si/mrs_natural/winSize", 1024); net->updControl("Windowing/win/mrs_string/type", "Hanning"); MarSystem *fan = mng.create("Fanout", "fan"); net->addMarSystem(fan); fan->addMarSystem(mng.create("SpectralFlatnessAllBands", "sfab")); while ( net->getctrl("SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>() ) { net->tick(); mrs_realvec v = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); for (mrs_natural i = 0; i<v.getSize(); ++i) { printf("%.5g\t", v(i)); } cout<<endl; } delete net; }
void carfac_testing(string inAudioFileName) { cout << "carfac_testing" << endl; cout << "inAudioFileName=" << inAudioFileName << endl; MarSystemManager mng; // Create the network MarSystem* net = mng.create("Series", "net"); net->addMarSystem(mng.create("SoundFileSource", "src")); MarSystem* carfac = mng.create("CARFAC", "carfac"); net->addMarSystem(carfac); net->addMarSystem(mng.create("Gain", "gain")); net->updControl("SoundFileSource/src/mrs_string/filename",inAudioFileName); net->updControl("mrs_natural/inSamples",512); // Just print the coefficients carfac->updControl("mrs_bool/printcoeffs",true); carfac->updControl("mrs_bool/printstate",false); cout << carfac->toString(); // Just print the state carfac->updControl("mrs_bool/printcoeffs",false); carfac->updControl("mrs_bool/printstate",true); for (int i = 0; i < 5; i++) { net->tick(); cout << "@@@@@@@@@@@@@@@@@@@@@@@@ "<< i + 1 << " @@@@@@@@@@@@@@@@@@@@@@@@" << endl; cout << carfac->toString(); } }
MarSystem* TranscriberExtract::makePitchNet(const mrs_real srate, const mrs_real lowFreq, MarSystem* rvSink) { mrs_real highFreq = 5000.0; MarSystem *net = mng.create("Series", "pitchNet"); net->addMarSystem(mng.create("ShiftInput", "sfi")); net->addMarSystem(mng.create("PitchPraat", "pitch")); if (rvSink != NULL) net->addMarSystem(rvSink); // yes, this is the right way around (lowSamples<-highFreq) net->updControl("PitchPraat/pitch/mrs_natural/lowSamples", hertz2samples(highFreq, srate) ); net->updControl("PitchPraat/pitch/mrs_natural/highSamples", hertz2samples(lowFreq, srate) ); // The window should be just long enough to contain three periods // (for pitch detection) of MinimumPitch. mrs_real windowSize = 3.0/lowFreq*srate; net->updControl("mrs_natural/inSamples", 512); net->updControl("ShiftInput/sfi/mrs_natural/winSize", powerOfTwo(windowSize)); return net; }
void toy_with_arff_in_out(mrs_string in_name, mrs_string out_name) { MarSystemManager mng; MarSystem *net = mng.create("Series", "net"); net->addMarSystem(mng.create("WekaSource", "src")); net->addMarSystem(mng.create("WekaSink", "dest")); net->updControl("WekaSource/src/mrs_string/filename", in_name); net->updControl("WekaSink/dest/mrs_natural/nLabels", net->getControl("WekaSource/src/mrs_natural/nClasses")); net->updControl("WekaSink/dest/mrs_string/labelNames", net->getControl("WekaSource/src/mrs_string/classNames")); net->updControl("WekaSink/dest/mrs_bool/regression", net->getControl("WekaSource/src/mrs_bool/regression")); // must happen after setting the above controls net->updControl("WekaSink/dest/mrs_string/filename", out_name); while ( !net->getctrl("WekaSource/src/mrs_bool/done")->to<mrs_bool>() ) { net->tick(); } delete net; }
int getFileLengthForWaveform(string inFileName, int windowSize_, double& min, double& max) { MarSystemManager mng; // A series to contain everything MarSystem* net = mng.create("Series", "net"); // The sound file net->addMarSystem(mng.create("SoundFileSource", "src")); net->addMarSystem(mng.create("Stereo2Mono", "s2m")); net->addMarSystem(mng.create("ShiftInput", "si")); net->updControl("SoundFileSource/src/mrs_string/filename", inFileName); mrs_real srate = net->getControl("SoundFileSource/src/mrs_real/osrate")->to<mrs_real>(); if ((position_ == 0) && (start_ != 0.0)) position_ = (mrs_natural) (srate * start_); if ((ticks_ == -1) && (length_ != -1.0)) ticks_ = (mrs_natural) ((length_ * srate) / windowSize_); net->updControl("SoundFileSource/src/mrs_natural/pos", position_); net->updControl("SoundFileSource/src/mrs_natural/inSamples", hopSize_); net->updControl("ShiftInput/si/mrs_natural/winSize", windowSize_); // Compute the AbsMax of this window net->addMarSystem(mng.create("AbsMax","absmax")); realvec processedData; int length = 0; while (net->getctrl("SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>() && (ticks_ == -1 || length < ticks_)) { net->tick(); length++; processedData = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); if (processedData(0) < min) min = processedData(0); if (processedData(0) > max) max = processedData(0); } delete net; if (verboseopt_) { cout << "length=" << length << endl; cout << "max=" << max << endl; cout << "min=" << min << endl; } return length; }
void distance_matrix() { if (!wekafname_Set()) return; cout << "Distance matrix calculation using " << wekafname_ << endl; wekafname_ = inputdir_ + wekafname_; MarSystemManager mng; MarSystem* net = mng.create("Series", "net"); MarSystem* wsrc = mng.create("WekaSource", "wsrc"); net->addMarSystem(wsrc); //!!!: mode control net->updControl("WekaSource/wsrc/mrs_string/validationMode", "OutputInstancePair"); net->updControl("WekaSource/wsrc/mrs_bool/normMaxMin", true); net->updControl("WekaSource/wsrc/mrs_string/filename", wekafname_); MarSystem* dmatrix = mng.create("SelfSimilarityMatrix", "dmatrix"); dmatrix->addMarSystem(mng.create("Metric", "dmetric")); dmatrix->updControl("Metric/dmetric/mrs_string/metric", "euclideanDistance"); //!!!: lmartins: normalization can only be applied when we have all feature vectors in memory... //... which is what we are trying to avoid here (having big realvecs in memory)... //dmatrix->updControl("mrs_string/normalize", "MinMax"); net->addMarSystem(dmatrix); //!!!: mode control net->updControl("SelfSimilarityMatrix/dmatrix/mrs_natural/mode", 1); //FIXME: replace use of enum for strings? //link controls between WekaSource and SelfSimilarityMatrix net->linkControl("SelfSimilarityMatrix/dmatrix/mrs_natural/nInstances", "WekaSource/wsrc/mrs_natural/nInstances"); net->linkControl("WekaSource/wsrc/mrs_realvec/instanceIndexes", "SelfSimilarityMatrix/dmatrix/mrs_realvec/instanceIndexes"); ofstream oss; oss.open(distancematrix_.c_str()); oss << "Marsyas-kea distance matrix" << endl; while(!net->getctrl("SelfSimilarityMatrix/dmatrix/mrs_bool/done")->to<bool>()) { const mrs_realvec& idxs = net->getctrl("SelfSimilarityMatrix/dmatrix/mrs_realvec/instanceIndexes")->to<mrs_realvec>(); oss << "(" << mrs_natural(idxs(0)) << "," << mrs_natural(idxs(1)) << ") = "; net->tick(); const mrs_realvec& value = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); oss << value(0) << endl; } oss << endl; }
// ********************** start toys ********** void toy_with_harmonicStrength(mrs_string sfname) { MarSystemManager mng; MarSystem *net = mng.create("Series", "net"); net->addMarSystem(mng.create("SoundFileSource", "src")); net->addMarSystem(mng.create("ShiftInput", "si")); net->addMarSystem(mng.create("Windowing", "win")); net->addMarSystem(mng.create("Spectrum", "spec")); net->addMarSystem(mng.create("PowerSpectrum", "pspec")); net->addMarSystem(mng.create("HarmonicStrength", "harm")); net->updControl("SoundFileSource/src/mrs_string/filename", sfname); net->updControl("mrs_natural/inSamples", 512); net->updControl("ShiftInput/si/mrs_natural/winSize", 1024); net->updControl("Windowing/win/mrs_string/type", "Hanning"); mrs_natural num_harmonics = 30; realvec harmonics(num_harmonics); /* cout<<"---------------------------"<<endl; cout<<"Relative harmonic strengths"<<endl; for (mrs_natural h = 0; h<num_harmonics; ++h) { if (h==num_harmonics-1) { cout<<"0.5"<<"\t"; harmonics(h) = 0.5; } else { cout<<h<<"\t"; harmonics(h) = h+1; } } cout<<endl; */ //net->updControl("HarmonicStrength/harm/mrs_realvec/harmonics", harmonics); net->updControl("HarmonicStrength/harm/mrs_natural/harmonicsSize", num_harmonics); net->updControl("HarmonicStrength/harm/mrs_real/harmonicsWidth", 0.0); net->updControl("HarmonicStrength/harm/mrs_natural/type", 1); net->updControl("HarmonicStrength/harm/mrs_real/base_frequency", 200.0); // typical value for piano strings net->updControl("HarmonicStrength/harm/mrs_real/inharmonicity_B", 2e-5); while ( net->getctrl("SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>() ) { net->tick(); mrs_realvec v = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); for (mrs_natural h = 0; h<num_harmonics; ++h) { //printf("%.2f\t", v(h)); printf("%.8g\t", v(h)); } cout<<endl; } delete net; }
int main(int argc, const char **argv) { (void) argc; // tells the compiler that we know that we're not (void) argv; // using these two variables MRSDIAG("helloWorld.cpp - main"); // cout << "This is probably the simplest Marsyas example code: it simply // generates a sine wave with a frequency of 440Hz and send it to the audio // card output. Simple press CTRL+C to quit." << endl; //we usualy start by creating a MarSystem manager //to help us on MarSystem creation MarSystemManager mng; //create the network, which is a simple Series network with a sine wave //oscilator and a audio sink object to send the ausio data for playing //in the sound card MarSystem *network = mng.create("Series", "network"); network->addMarSystem(mng.create("SineSource", "src")); network->addMarSystem(mng.create("AudioSink", "dest")); network->addMarSystem(mng.create("SoundFileSink", "dest2")); //set the window (i.e. audio frame) size (in samples). Let's say, 256 samples. //This is done in the outmost MarSystem (i.e. the Series/network) because flow //controls (as is the case of inSamples) are propagated through the network. //Check the Marsyas documentation for mode details. network->updControl("mrs_natural/inSamples", 4096); //set oscilator frequency to 440Hz network->updControl("SineSource/src/mrs_real/frequency", 440.0); // set the sampling to 44100 - a safe choice in most configurations network->updControl("mrs_real/israte", 44100.0); network->updControl("AudioSink/dest/mrs_bool/initAudio", true); network->updControl("SoundFileSink/dest2/mrs_string/filename", "helloworld.wav"); //now it's time for ticking the network, //ad aeternum (i.e. until the user quits by CTRL+C) while (1) { network->tick(); } //ok, this is not really necessary because we are quiting by CTRL+C, //but it's a good habit anyway ;-) delete network; return(0); }
MarSystem* TranscriberExtract::makeAmplitudeNet(MarSystem* rvSink) { MarSystem *net = mng.create("Series", "amplitudeNet"); net->addMarSystem(mng.create("ShiftInput", "sfiAmp")); net->addMarSystem(mng.create("Rms", "rms")); if (rvSink != NULL) net->addMarSystem(rvSink); net->updControl("mrs_natural/inSamples", 512); net->updControl("ShiftInput/sfiAmp/mrs_natural/winSize", 512); return net; }
realvec TranscriberExtract::getAmpsFromAudio(const std::string audioFilename) { mrs_real normalize = getNormalizingGain(audioFilename); MarSystem* pnet = mng.create("Series", "pnet"); mrs_real srate; srate = addFileSource(pnet, audioFilename); pnet->addMarSystem(mng.create("Gain", "normalizing")); pnet->updControl("Gain/normalizing/mrs_real/gain",normalize); MarSystem* rvSink = mng.create("RealvecSink", "rvSink"); pnet->addMarSystem(makeAmplitudeNet(rvSink)); while ( pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>() ) pnet->tick(); realvec rmsList = getAmpsFromRealvecSink(rvSink); delete pnet; // normalize RMS rmsList -= rmsList.minval(); mrs_real maxRms = rmsList.maxval(); if (maxRms != 0) rmsList /= maxRms; return rmsList; }
int isClose(string infile1, string infile2) { MarSystemManager mng; MarSystem* pnet = mng.create("Series", "pnet"); MarSystem* invnet = mng.create("Series", "invnet"); invnet->addMarSystem(mng.create("SoundFileSource", "src2")); invnet->updControl("SoundFileSource/src2/mrs_string/filename", infile2); invnet->addMarSystem(mng.create("Negative", "neg")); MarSystem* fanout = mng.create("Fanout", "fanout"); fanout->addMarSystem(mng.create("SoundFileSource", "src1")); fanout->updControl("SoundFileSource/src1/mrs_string/filename", infile1); fanout->addMarSystem(invnet); pnet->addMarSystem(fanout); pnet->addMarSystem(mng.create("Sum", "sum")); pnet->linkControl("mrs_bool/hasData", "Fanout/fanout/SoundFileSource/src1/mrs_bool/hasData"); mrs_natural i; mrs_natural samples = pnet->getctrl("mrs_natural/inSamples")->to<mrs_natural>(); while ( pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>() ) { pnet->tick(); const realvec& processedData = pnet->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); for (i=0; i<samples; ++i) { // useful for tweaking CLOSE_ENOUGH //cout<<processedData(i)<<" "; if ( abs(processedData(i)) > CLOSE_ENOUGH ) { delete pnet; return(1); } } } delete pnet; return 0; }
void toy_with_csv_input(mrs_string sfname) { MarSystemManager mng; MarSystem *net = mng.create("Series", "net"); net->addMarSystem(mng.create("CsvFileSource", "src")); net->updControl("CsvFileSource/src/mrs_string/filename", sfname); net->updControl("mrs_natural/inSamples", 1); while ( net->getctrl("CsvFileSource/src/mrs_bool/hasData")->to<mrs_bool>() ) { net->tick(); mrs_realvec v = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); for (mrs_natural i = 0; i<v.getSize(); ++i) { printf("%.5g\t", v(i)); } cout<<endl; } delete net; }
// Variation that outputs RMS and Flux void output_rmsflux(string inFileName) { MarSystemManager mng; MarSystem* net = mng.create("Series", "net"); net->addMarSystem(mng.create("SoundFileSource", "src")); net->addMarSystem(mng.create("Stereo2Mono", "s2m")); // A fanout that will do both RMS and Flux calculations MarSystem* fanout = mng.create("Fanout","fanout"); net->addMarSystem(fanout); // The branch to do the RMS MarSystem* rms_series = mng.create("Series","rms_series"); rms_series->addMarSystem(mng.create("Rms", "rms")); fanout->addMarSystem(rms_series); // The branch to do the Flux MarSystem* flux_series = mng.create("Series","flux_series"); flux_series->addMarSystem(mng.create("ShiftInput", "si")); flux_series->addMarSystem(mng.create("Windowing", "win")); flux_series->addMarSystem(mng.create("Spectrum","spk")); flux_series->addMarSystem(mng.create("PowerSpectrum", "pspk")); flux_series->addMarSystem(mng.create("Flux", "flux")); fanout->addMarSystem(flux_series); // Update the controls with required values net->updControl("SoundFileSource/src/mrs_string/filename", inFileName); realvec processedData; float time = 0; mrs_natural samples_per_tick = net->getControl("SoundFileSource/src/mrs_natural/onSamples")->to<mrs_natural>(); mrs_real rate = net->getControl("SoundFileSource/src/mrs_real/osrate")->to<mrs_real>(); mrs_real sec_per_tick = samples_per_tick / rate; while (net->getctrl("SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>()) { net->tick(); processedData = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); cout << time << "," << processedData(0,0) << "," << processedData(1,0) << endl; time += sec_per_tick; } delete net; }
realvec TranscriberExtract::getPitchesFromAudio(const std::string audioFilename) { mrs_real normalize = getNormalizingGain(audioFilename); MarSystem* pnet = mng.create("Series", "pnet"); mrs_real srate = addFileSource(pnet, audioFilename); pnet->addMarSystem(mng.create("Gain", "normalizing")); pnet->updControl("Gain/normalizing/mrs_real/gain",normalize); MarSystem* rvSink = mng.create("RealvecSink", "rvSink"); pnet->addMarSystem(makePitchNet(srate, 100.0, rvSink)); while ( pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>() ) pnet->tick(); realvec pitchList = getPitchesFromRealvecSink(rvSink, srate); delete pnet; return pitchList; }
void WHaSp::createSimMatrixNet() { if(HWPSnet_) return; HWPSnet_ = new Series("HWPSnet"); //add a feat selector and //set the features needed for HWPS MarSystem* peFeatSelect = new PeakFeatureSelect("peFeatSelect"); peFeatSelect->updControl("mrs_natural/selectedFeatures", PeakFeatureSelect::pkFrequency | PeakFeatureSelect::pkSetFrequencies| PeakFeatureSelect::pkSetAmplitudes); HWPSnet_->addMarSystem(peFeatSelect); //create a similarityMatrix MarSystem that uses the HPWS metric SelfSimilarityMatrix* simMat = new SelfSimilarityMatrix("simMat"); simMat->addMarSystem(new HWPS("hwps")); HWPSnet_->addMarSystem(simMat); //link totalNumPeaks control to PeakFeatureSelect HWPSnet_->getctrl("PeakFeatureSelect/peFeatSelect/mrs_natural/totalNumPeaks")->linkTo(ctrl_totalNumPeaks_, NOUPDATE); HWPSnet_->update(); //only call update to HWPSnet_ since this is being called from WHaSp::update()! -> avoid potential infinite recursion! //link frameMaxNumPeaks control to PeakFeatureSelect HWPSnet_->getctrl("PeakFeatureSelect/peFeatSelect/mrs_natural/frameMaxNumPeaks")->linkTo(ctrl_frameMaxNumPeaks_, NOUPDATE); HWPSnet_->update(); //only call update to HWPSnet_ since this is being called from WHaSp::update()! -> avoid potential infinite recursion! //link histSize control to HWPS metric HWPSnet_->getctrl("SelfSimilarityMatrix/simMat/HWPS/hwps/mrs_natural/histSize")->linkTo(ctrl_histSize_, NOUPDATE); HWPSnet_->update(); //only call update to HWPSnet_ since this is being called from WHaSp::update()! -> avoid potential infinite recursion! HWPSnet_->setctrl("SelfSimilarityMatrix/simMat/HWPS/hwps/mrs_natural/histSize", 20); HWPSnet_->update(); //only call update to HWPSnet_ since this is being called from WHaSp::update()! -> avoid potential infinite recursion! HWPSnet_->updControl("SelfSimilarityMatrix/simMat/HWPS/hwps/mrs_bool/calcDistance", true); //HWPSnet_->setctrl("SelfSimilarityMatrix/simMat/HWPS/hwps/mrs_natural/histSize", 100); HWPSnet_->update(); //only call update to HWPSnet_ since this is being called from WHaSp::update()! -> avoid potential infinite recursion! }
void record(mrs_real length, mrs_real gain, string filename) { MarSystemManager mng; MarSystem* recordNet = mng.create("Series", "recordNet"); MarSystem* asrc = mng.create("AudioSource", "asrc"); MarSystem* dest = mng.create("SoundFileSink", "dest"); recordNet->addMarSystem(asrc); recordNet->addMarSystem(dest); recordNet->updControl("mrs_natural/inSamples", 4096); recordNet->updControl("mrs_real/israte", sropt); recordNet->updControl("AudioSource/asrc/mrs_natural/nChannels", copt); recordNet->updControl("AudioSource/asrc/mrs_real/gain", gain); // Ready to initialize audio device recordNet->updControl("AudioSource/asrc/mrs_bool/initAudio", true); recordNet->updControl("SoundFileSink/dest/mrs_string/filename", filename); mrs_real srate = recordNet->getctrl("mrs_real/israte")->to<mrs_real>(); mrs_natural nChannels = recordNet->getctrl("AudioSource/asrc/mrs_natural/nChannels")->to<mrs_natural>(); cout << "AudioSource srate = " << srate << endl; cout << "AudioSource nChannels = " << nChannels << endl; mrs_natural inSamples = recordNet->getctrl("mrs_natural/inSamples")->to<mrs_natural>(); mrs_natural iterations = (mrs_natural)((srate * length) / inSamples); cout << "Iterations = " << iterations << endl; for (mrs_natural t = 0; t < iterations; t++) { recordNet->tick(); } }
void fftHistogram(string inFileName) { double fftBins = windowSize_ / 2.0 + 1; // N/2 + 1 MarSystemManager mng; MarSystem* net = mng.create("Series", "net"); net->addMarSystem(mng.create("SoundFileSource", "src")); net->addMarSystem(mng.create("Stereo2Mono", "s2m")); net->addMarSystem(mng.create("ShiftInput", "si")); net->addMarSystem(mng.create("Spectrum","spk")); net->addMarSystem(mng.create("PowerSpectrum","pspk")); net->updControl("PowerSpectrum/pspk/mrs_string/spectrumType", "decibels"); net->updControl("SoundFileSource/src/mrs_string/filename", inFileName); net->updControl("SoundFileSource/src/mrs_natural/pos", position_); net->updControl("SoundFileSource/src/mrs_natural/inSamples", hopSize_); net->updControl("ShiftInput/si/mrs_natural/winSize", windowSize_); net->updControl("mrs_natural/inSamples", int(hopSize_)); mrs_real frequency = net->getctrl("SoundFileSource/src/mrs_real/osrate")->to<mrs_real>(); double pngHeight = fftBins * (highFreq_ / (frequency / 2.0)); realvec processedData; // Iterate over the whole input file by ticking, outputting columns // of data to the .png file with each tick double x = 0; while (net->getctrl("SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>() && (ticks_ == -1 || x < ticks_)) { net->tick(); processedData = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); for (int i = 0; i < pngHeight; ++i) { double data_y = i; double data = processedData(int(data_y),0); cout << "data=" << data << endl; } x++; } delete net; }
void peakClusteringEval(realvec &peakSet, string sfName, string outsfname, string noiseName, string mixName, string intervalFrequency, string panningInfo, mrs_real noiseDelay, string T, mrs_natural N, mrs_natural Nw, mrs_natural D, mrs_natural S, mrs_natural C, mrs_natural accSize, mrs_natural synthetize, mrs_real *snr0) { //FIXME: D is the same as hopSize_ -> fix to avoid confusion! MATLAB_EVAL("clear"); MarSystemManager mng; cout << "Extracting Peaks and Computing Clusters..." << endl; //************************************************** // create the peakClusteringEval network //************************************************** MarSystem* mainNet = mng.create("Series", "mainNet"); //************************************************************************** //create accumulator for the texture window and add it to the main network //************************************************************************** MarSystem* textWinNet = mng.create("Accumulator", "textWinNet"); mainNet->addMarSystem(textWinNet); //************************************************************************ //create Analysis Network and add it to the texture window accumulator //************************************************************************ MarSystem* analysisNet = mng.create("Series", "analysisNet"); textWinNet->addMarSystem(analysisNet); //************************************************************************ //create FanInOut for mixing with a noise source and add to Analysis Net //************************************************************************ MarSystem* mixer = mng.create("FanOutIn", "mixer"); //---- create original series and add it to mixer MarSystem* oriNet = mng.create("Series", "oriNet"); if (microphone_) oriNet->addMarSystem(mng.create("AudioSource", "src")); else { //oriNet->addMarSystem(mng.create("SoundFileSource", "src")); oriNet->addMarSystem(mng.create("MidiFileSynthSource", "src")); //[!] } oriNet->addMarSystem(mng.create("Gain", "oriGain")); mixer->addMarSystem(oriNet); //---- create a series for the noiseSource if(noiseName != EMPTYSTRING) { MarSystem* mixseries = mng.create("Series", "mixseries"); if(noiseName == "white") mixseries->addMarSystem(mng.create("NoiseSource", "noise")); else mixseries->addMarSystem(mng.create("SoundFileSource", "noise")); mixseries->addMarSystem(mng.create("Delay", "noiseDelay")); MarSystem* noiseGain = mng.create("Gain", "noiseGain"); mixseries->addMarSystem(noiseGain); // add this series in the fanout mixer->addMarSystem(mixseries); } //add Mixer to analysis network analysisNet->addMarSystem(mixer); //******************************************************** // create SoundFileSink and add it to the analysis net //******************************************************** if(noiseName != EMPTYSTRING) analysisNet->addMarSystem(mng.create("SoundFileSink", "mixSink")); //*********************************************************** // create peakExtract network and add it to the analysis net //*********************************************************** MarSystem* peakExtract = mng.create("Series","peakExtract"); peakExtract->addMarSystem(mng.create("ShiftInput", "si")); //[?] MarSystem* stereoFo = mng.create("Fanout","stereoFo"); // create Spectrum Network and add it to the analysis net MarSystem* spectrumNet = mng.create("Series", "spectrumNet"); spectrumNet->addMarSystem(mng.create("Stereo2Mono","s2m")); //onset detector MarSystem* onsetdetector = mng.create("FlowThru", "onsetdetector"); //onsetdetector->addMarSystem(mng.create("ShiftInput", "si")); onsetdetector->addMarSystem(mng.create("Windowing", "win")); onsetdetector->addMarSystem(mng.create("Spectrum","spk")); onsetdetector->addMarSystem(mng.create("PowerSpectrum", "pspk")); onsetdetector->addMarSystem(mng.create("Flux", "flux")); onsetdetector->addMarSystem(mng.create("ShiftInput","sif")); onsetdetector->addMarSystem(mng.create("Filter","filt1")); onsetdetector->addMarSystem(mng.create("Reverse","rev1")); onsetdetector->addMarSystem(mng.create("Filter","filt2")); onsetdetector->addMarSystem(mng.create("Reverse","rev2")); onsetdetector->addMarSystem(mng.create("PeakerOnset","peaker")); spectrumNet->addMarSystem(onsetdetector); spectrumNet->addMarSystem(mng.create("Shifter", "sh")); spectrumNet->addMarSystem(mng.create("Windowing", "wi")); MarSystem* parallel = mng.create("Parallel", "par"); parallel->addMarSystem(mng.create("Spectrum", "spk1")); parallel->addMarSystem(mng.create("Spectrum", "spk2")); spectrumNet->addMarSystem(parallel); // add spectrumNet to stereo fanout stereoFo->addMarSystem(spectrumNet); // //create stereo spectrum net MarSystem* stereoSpkNet = mng.create("Series","stereoSpkNet"); MarSystem* LRnet = mng.create("Parallel","LRnet"); // MarSystem* spkL = mng.create("Series","spkL"); spkL->addMarSystem(mng.create("Windowing","win")); spkL->addMarSystem(mng.create("Spectrum","spk")); LRnet->addMarSystem(spkL); // MarSystem* spkR = mng.create("Series","spkR"); spkR->addMarSystem(mng.create("Windowing","win")); spkR->addMarSystem(mng.create("Spectrum","spk")); LRnet->addMarSystem(spkR); // //add it to the stereo spectrum net series stereoSpkNet->addMarSystem(LRnet); // //add stereo spectrum object to stereo spectrum net //stereoSpkNet->addMarSystem(mng.create("StereoSpectrum","stereoSpk")); //AVENDANO stereoSpkNet->addMarSystem(mng.create("EnhADRess","ADRess"));//enhADRess_1 stereoSpkNet->addMarSystem(mng.create("EnhADRessStereoSpectrum","stereoSpk")); //enhADRess_2 // // add the stereo Spectrum net to the Fanout stereoFo->addMarSystem(stereoSpkNet); // // add the fanout to the peakExtract net peakExtract->addMarSystem(stereoFo); // //add peakExtract net to analysis net analysisNet->addMarSystem(peakExtract); //*************************************************************** //add PeakConvert to main SERIES for processing texture windows //*************************************************************** mainNet->addMarSystem(mng.create("PeakConvert", "conv")); mainNet->linkControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_natural/winSize", "Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/ShiftInput/si/mrs_natural/winSize"); //*************************************************************** //create a FlowThru for the Clustering Network and add to main net //*************************************************************** MarSystem* clustNet = mng.create("FlowThru", "clustNet"); mainNet->addMarSystem(clustNet); //*************************************************************** // create Similarities Network and add it to ClustNet //*************************************************************** MarSystem* simNet = mng.create("FanOutIn", "simNet"); simNet->updControl("mrs_string/combinator", "*"); // //create Frequency similarity net and add it to simNet // MarSystem* freqSim = mng.create("Series","freqSim"); //-------- freqSim->addMarSystem(mng.create("PeakFeatureSelect","FREQfeatSelect")); freqSim->updControl("PeakFeatureSelect/FREQfeatSelect/mrs_natural/selectedFeatures", PeakFeatureSelect::pkFrequency | PeakFeatureSelect::barkPkFreq); //-------- MarSystem* fsimMat = mng.create("SelfSimilarityMatrix","FREQsimMat"); fsimMat->addMarSystem(mng.create("Metric","FreqL2Norm")); fsimMat->updControl("Metric/FreqL2Norm/mrs_string/metric","euclideanDistance"); fsimMat->updControl("mrs_natural/calcCovMatrix", SelfSimilarityMatrix::diagCovMatrix); //fsimMat->updControl("mrs_string/normalize", "MinMax"); //fsimMat->linkControl("mrs_realvec/covMatrix", "Metric/FreqL2Norm/mrs_realvec/covMatrix"); freqSim->addMarSystem(fsimMat); //-------- freqSim->addMarSystem(mng.create("RBF","FREQrbf")); freqSim->updControl("RBF/FREQrbf/mrs_string/RBFtype","Gaussian"); freqSim->updControl("RBF/FREQrbf/mrs_bool/symmetricIn",true); //-------- simNet->addMarSystem(freqSim); // //create Amplitude similarity net and add it to simNet // MarSystem* ampSim = mng.create("Series","ampSim"); //-------- ampSim->addMarSystem(mng.create("PeakFeatureSelect","AMPfeatSelect")); ampSim->updControl("PeakFeatureSelect/AMPfeatSelect/mrs_natural/selectedFeatures", PeakFeatureSelect::pkAmplitude | PeakFeatureSelect::dBPkAmp); //-------- MarSystem* asimMat = mng.create("SelfSimilarityMatrix","AMPsimMat"); asimMat->addMarSystem(mng.create("Metric","AmpL2Norm")); asimMat->updControl("Metric/AmpL2Norm/mrs_string/metric","euclideanDistance"); asimMat->updControl("mrs_natural/calcCovMatrix", SelfSimilarityMatrix::diagCovMatrix); //asimMat->updControl("mrs_string/normalize", "MinMax"); //asimMat->linkControl("mrs_realvec/covMatrix", "Metric/AmpL2Norm/mrs_realvec/covMatrix"); ampSim->addMarSystem(asimMat); //-------- ampSim->addMarSystem(mng.create("RBF","AMPrbf")); ampSim->updControl("RBF/AMPrbf/mrs_string/RBFtype","Gaussian"); ampSim->updControl("RBF/AMPrbf/mrs_bool/symmetricIn",true); //-------- simNet->addMarSystem(ampSim); // //create HWPS similarity net and add it to simNet // MarSystem* HWPSim = mng.create("Series","HWPSim"); //-------- HWPSim->addMarSystem(mng.create("PeakFeatureSelect","HWPSfeatSelect")); HWPSim->updControl("PeakFeatureSelect/HWPSfeatSelect/mrs_natural/selectedFeatures", PeakFeatureSelect::pkFrequency | PeakFeatureSelect::pkSetFrequencies | PeakFeatureSelect::pkSetAmplitudes); //-------- MarSystem* HWPSsimMat = mng.create("SelfSimilarityMatrix","HWPSsimMat"); HWPSsimMat->addMarSystem(mng.create("HWPS","hwps")); HWPSsimMat->updControl("HWPS/hwps/mrs_bool/calcDistance", true); HWPSim->addMarSystem(HWPSsimMat); //-------- HWPSim->addMarSystem(mng.create("RBF","HWPSrbf")); HWPSim->updControl("RBF/HWPSrbf/mrs_string/RBFtype","Gaussian"); HWPSim->updControl("RBF/HWPSrbf/mrs_bool/symmetricIn",true); //-------- simNet->addMarSystem(HWPSim); // //create Panning similarity net and add it to simNet // MarSystem* panSim = mng.create("Series","panSim"); //-------- panSim->addMarSystem(mng.create("PeakFeatureSelect","PANfeatSelect")); panSim->updControl("PeakFeatureSelect/PANfeatSelect/mrs_natural/selectedFeatures", PeakFeatureSelect::pkPan); //-------- MarSystem* psimMat = mng.create("SelfSimilarityMatrix","PANsimMat"); psimMat->addMarSystem(mng.create("Metric","PanL2Norm")); psimMat->updControl("Metric/PanL2Norm/mrs_string/metric","euclideanDistance"); psimMat->updControl("mrs_natural/calcCovMatrix", SelfSimilarityMatrix::diagCovMatrix); //psimMat->updControl("mrs_string/normalize", "MinMax"); //psimMat->linkControl("mrs_realvec/covMatrix", "Metric/PanL2Norm/mrs_realvec/covMatrix"); panSim->addMarSystem(psimMat); //-------- panSim->addMarSystem(mng.create("RBF","PANrbf")); panSim->updControl("RBF/PANrbf/mrs_string/RBFtype","Gaussian"); panSim->updControl("RBF/PANrbf/mrs_bool/symmetricIn",true); //-------- simNet->addMarSystem(panSim); // // LINK controls of PeakFeatureSelects in each similarity branch // simNet->linkControl("Series/ampSim/PeakFeatureSelect/AMPfeatSelect/mrs_natural/totalNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/totalNumPeaks"); simNet->linkControl("Series/HWPSim/PeakFeatureSelect/HWPSfeatSelect/mrs_natural/totalNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/totalNumPeaks"); simNet->linkControl("Series/panSim/PeakFeatureSelect/PANfeatSelect/mrs_natural/totalNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/totalNumPeaks"); //------ simNet->linkControl("Series/ampSim/PeakFeatureSelect/AMPfeatSelect/mrs_natural/frameMaxNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/frameMaxNumPeaks"); simNet->linkControl("Series/HWPSim/PeakFeatureSelect/HWPSfeatSelect/mrs_natural/frameMaxNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/frameMaxNumPeaks"); simNet->linkControl("Series/panSim/PeakFeatureSelect/PANfeatSelect/mrs_natural/frameMaxNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/frameMaxNumPeaks"); //++++++++++++++++++++++++++++++++++++++++++++++++++++++ //add simNet to clustNet clustNet->addMarSystem(simNet); // // LINK controls related to variable number of peak from PeakConvert to simNet // mainNet->linkControl("FlowThru/clustNet/FanOutIn/simNet/Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/totalNumPeaks", "PeakConvert/conv/mrs_natural/totalNumPeaks"); mainNet->linkControl("FlowThru/clustNet/FanOutIn/simNet/Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/frameMaxNumPeaks", "PeakConvert/conv/mrs_natural/frameMaxNumPeaks"); //*************************************************************** // create NCutNet MarSystem and add it to clustNet //*************************************************************** // MarSystem* NCutNet = mng.create("Series","NCutNet"); // clustNet->addMarSystem(NCutNet); // //---add NCutNet components // // add a stack to stack the // MarSystem* stack = mng.create("Fanout","stack"); // NCutNet->addMarSystem(stack); // stack->addMarSystem(mng.create("NormCut","NCut")); // stack->addMarSystem(mng.create("Gain", "ID")); // // add the cluster selection module // NCutNet->addMarSystem(mng.create("PeakClusterSelect","clusterSelect")); // Do not select most prominent clusters anymore clustNet->addMarSystem(mng.create("NormCut","NCut")); //[!] //*************************************************************** // create PeakLabeler MarSystem and add it to mainNet //*************************************************************** MarSystem* labeler = mng.create("PeakLabeler","labeler"); mainNet->addMarSystem(labeler); //---- link labeler label control to the NCut output control mainNet->linkControl("PeakLabeler/labeler/mrs_realvec/peakLabels", "FlowThru/clustNet/mrs_realvec/innerOut"); //*************************************************************** // create PeakViewSink MarSystem and add it to mainNet //*************************************************************** if(peakStore_) { mainNet->addMarSystem(mng.create("PeakViewSink", "peSink")); mainNet->updControl("PeakViewSink/peSink/mrs_string/filename", filePeakName); } //**************************************************************** // Create Synthesis Network //**************************************************************** MarSystem* postNet = mng.create("Series", "postNet"); // Create Peak Synth //////////////////////////////////// MarSystem* peakSynth = mng.create("Series", "peakSynth"); peakSynth->addMarSystem(mng.create("PeakSynthOsc", "pso")); peakSynth->addMarSystem(mng.create("Windowing", "wiSyn")); peakSynth->addMarSystem(mng.create("OverlapAdd", "ov")); peakSynth->addMarSystem(mng.create("Gain", "outGain")); // MarSystem *dest; // dest = new SoundFileSink("dest"); // //dest->updControl("mrs_string/filename", outsfname); // peakSynth->addMarSystem(dest); mng.registerPrototype("PeakSynth", peakSynth); // Create Bank of Synths //////////////////////////////////////////////// MarSystem* synthBank = mng.create("Fanout","synthBank"); mrs_natural numSynths = 10; // HARDCODED FOR NOW [!] synthBank->addMarSystem(mng.create("PeakSynth", "synthCluster_0")); synthBank->updControl("PeakSynth/synthCluster_0/PeakSynthOsc/pso/mrs_natural/peakGroup2Synth", 0); for(mrs_natural s=1; s < numSynths; ++s) { ostringstream oss; oss << "synthCluster_" << s; synthBank->addMarSystem(mng.create("PeakSynth", oss.str())); //link controls between branches synthBank->linkControl("PeakSynth/"+oss.str()+"/PeakSynthOsc/pso/mrs_real/samplingFreq", "PeakSynth/synthCluster_0/PeakSynthOsc/pso/mrs_real/samplingFreq"); synthBank->linkControl("PeakSynth/"+oss.str()+"/PeakSynthOsc/pso/mrs_natural/delay", "PeakSynth/synthCluster_0/PeakSynthOsc/pso/mrs_natural/delay"); synthBank->linkControl("PeakSynth/"+oss.str()+"/PeakSynthOsc/pso/mrs_natural/synSize", "PeakSynth/synthCluster_0/PeakSynthOsc/pso/mrs_natural/synSize"); synthBank->linkControl("PeakSynth/"+oss.str()+"/Windowing/wiSyn/mrs_string/type", "PeakSynth/synthCluster_0/Windowing/wiSyn/mrs_string/type"); synthBank->updControl("PeakSynth/"+oss.str()+"/PeakSynthOsc/pso/mrs_natural/peakGroup2Synth", s); } postNet->addMarSystem(synthBank); // SHREDDER ///////////////////////////////////////////////// MarSystem* synthNet = mng.create("Shredder", "synthNet"); synthNet->addMarSystem(postNet); synthNet->updControl("mrs_bool/accumulate", true); //accumulate output mainNet->addMarSystem(synthNet); //link Shredder nTimes to Accumulator nTimes mainNet->linkControl("Shredder/synthNet/mrs_natural/nTimes", "Accumulator/textWinNet/mrs_natural/nTimes"); // add a MATLAB sink at the very end of the network! mainNet->addMarSystem(mng.create("PlotSink", "send2MATLAB")); mainNet->updControl("PlotSink/send2MATLAB/mrs_bool/sequence", false); mainNet->updControl("PlotSink/send2MATLAB/mrs_bool/messages", false); mainNet->updControl("PlotSink/send2MATLAB/mrs_bool/matlab", true); mainNet->updControl("PlotSink/send2MATLAB/mrs_string/matlabCommand", "evaluateTextWin;"); //**************************************************************** //////////////////////////////////////////////////////////////// // update the controls //////////////////////////////////////////////////////////////// //mainNet->updControl("Accumulator/textWinNet/mrs_natural/nTimes", accSize); if (microphone_) { mainNet->updControl("mrs_natural/inSamples", D); mainNet->updControl("mrs_natural/inObservations", 1); } else { cout << ">> Loading MIDI file and synthetizing audio data..." << endl; mainNet->updControl("mrs_natural/inSamples", D); mainNet->updControl("mrs_real/israte", samplingFrequency_); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_real/start", 10.0); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_real/end", 20.0); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_string/filename", sfName); //mainNet->updControl("mrs_natural/inObservations", 1); //samplingFrequency_ = mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_real/osrate")->to<mrs_real>(); } if(noiseName != EMPTYSTRING) { mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/mixseries/SoundFileSource/noise/mrs_string/filename", noiseName); mainNet->updControl("mrs_natural/inSamples", D); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/mixseries/NoiseSource/noise/mrs_string/mode", "rand"); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Seriesmixseries/Delay/noiseDelay/mrs_real/delaySeconds", noiseDelay); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/mixseries/Gain/noiseGain/mrs_real/gain", noiseGain_); } mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/ShiftInput/si/mrs_natural/winSize", Nw+1); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Shifter/sh/mrs_natural/shift", 1); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Windowing/wi/mrs_natural/size", N); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Windowing/wi/mrs_string/type", "Hanning"); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Windowing/wi/mrs_bool/zeroPhasing", true); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkL/Windowing/win/mrs_natural/size", N); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkL/Windowing/win/mrs_string/type", "Hanning"); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkL/Windowing/win/mrs_bool/zeroPhasing", true); // mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkR/Windowing/win/mrs_natural/size", N); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkR/Windowing/win/mrs_string/type", "Hanning"); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkR/Windowing/win/mrs_bool/zeroPhasing", true); if(unprecise_) mainNet->updControl("PeakConvert/conv/mrs_bool/improvedPrecision", false); else mainNet->updControl("PeakConvert/conv/mrs_bool/improvedPrecision", true); if(noPeakPicking_) mainNet->updControl("PeakConvert/conv/mrs_bool/picking", false); mainNet->updControl("PeakConvert/conv/mrs_natural/frameMaxNumPeaks", S); mainNet->updControl("PeakConvert/conv/mrs_string/frequencyInterval", intervalFrequency); mainNet->updControl("PeakConvert/conv/mrs_natural/nbFramesSkipped", 0);//(N/D)); //mainNet->updControl("FlowThru/clustNet/Series/NCutNet/Fanout/stack/NormCut/NCut/mrs_natural/numClusters", C); [!] //mainNet->updControl("FlowThru/clustNet/Series/NCutNet/PeakClusterSelect/clusterSelect/mrs_natural/numClustersToKeep", nbSelectedClusters_);//[!] // if(C > 0) //use fixed and manually set number of clusters { cout << ">> Using fixed number of clusters: " << C << " clusters." << endl; mainNet->updControl("FlowThru/clustNet/NormCut/NCut/mrs_natural/numClusters", C); //[!] } else if(C==0) //use GT number of clusters { cout << "** Using GT number of clusters." << endl; mainNet->linkControl("FlowThru/clustNet/NormCut/NCut/mrs_natural/numClusters", "Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_natural/numActiveNotes"); } else if(C==-1) //automatically estimate number of clusters { cout << "Automatic Estimation of number of clusters: NOT YET IMPLEMENTED! Exiting..."; exit(0); } // //[TODO] // mainNet->setctrl("PeClust/peClust/mrs_natural/selectedClusters", nbSelectedClusters_); // mainNet->setctrl("PeClust/peClust/mrs_natural/hopSize", D); // mainNet->setctrl("PeClust/peClust/mrs_natural/storePeaks", (mrs_natural) peakStore_); // mainNet->updControl("PeClust/peClust/mrs_string/similarityType", T); // // similarityWeight_.stretch(3); // similarityWeight_(0) = 1; // similarityWeight_(1) = 10; //[WTF] // similarityWeight_(2) = 1; // mainNet->updControl("PeClust/peClust/mrs_realvec/similarityWeight", similarityWeight_); if(noiseName != EMPTYSTRING) mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/SoundFileSink/mixSink/mrs_string/filename", mixName); mainNet->update(); //check if input is a stereo signal if(mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/mrs_natural/onObservations")->to<mrs_natural>() == 1) { //if a not a stereo signal, we must set the Stereo2Mono weight to 1.0 (i.e. do no mixing)! mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Stereo2Mono/s2m/mrs_real/weight", 1.0); } //------------------------------------------------------------------------ //check which similarity computations should be disabled (if any) //------------------------------------------------------------------------ // Frequency Similarity if(ignoreFrequency) { cout << "** Frequency Similarity Computation disabled!" << endl; mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/disableChild", "Series/freqSim"); } else cout << "** Frequency Similarity Computation enabled!" << endl; // amplitude similarity if(ignoreAmplitude) { cout << "** Amplitude Similarity Computation disabled!" << endl; mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/disableChild", "Series/ampSim"); } else cout << "** Amplitude Similarity Computation enabled!" << endl; // HWPS similarity if(ignoreHWPS) { cout << "** HWPS (harmonicity) Similarity Computation disabled!" << endl; mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/disableChild", "Series/HWPSim"); } else cout << "** HWPS (harmonicity) Similarity Computation enabled!" << endl; // //Panning Similarity if(mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/mrs_natural/onObservations")->to<mrs_natural>() == 2 && !ignorePan) { cout << "** Panning Similarity Computation enabled!" << endl; mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/mrs_string/enableChild", "Series/stereoSpkNet"); mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/enableChild", "Series/panSim"); } else //if not stereo or if stereo to be ignored, disable some branches { cout << "** Panning Similarity Computation disabled!" << endl; mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/mrs_string/disableChild", "Series/stereoSpkNet"); mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/disableChild", "Series/panSim"); } // mainNet->update(); //probably not necessary... [!] //------------------------------------------------------------------------ if(noiseDuration_) //[WTF] { ostringstream ossi; ossi << ((noiseDelay_+noiseDuration_)) << "s"; cout << ossi.str() << endl; // touch the gain directly // noiseGain->updControl("0.1s", Repeat("0.1s", 1), new EvValUpd(noiseGain,"mrs_real/gain", 0.0)); } //ONSET DETECTION CONFIGURATION (if enabled) if(useOnsets) { cout << "** Onset detector enabled -> using dynamically adjusted texture windows!" << endl; cout << "WinSize = " << winSize_ << endl; cout << "N = " << N << endl; cout << "Nw = " << Nw << endl; cout << "hopSize = " << hopSize_ << endl; cout << "D = " << D << endl; cout << "fs = " << samplingFrequency_ << endl; //link controls for onset detector onsetdetector->linkControl("Filter/filt2/mrs_realvec/ncoeffs", "Filter/filt1/mrs_realvec/ncoeffs"); onsetdetector->linkControl("Filter/filt2/mrs_realvec/dcoeffs", "Filter/filt1/mrs_realvec/dcoeffs"); //link onset detector to accumulator and if onsets enabled, set "explicitFlush" mode textWinNet->linkControl("mrs_bool/flush", "Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/FlowThru/onsetdetector/PeakerOnset/peaker/mrs_bool/onsetDetected"); //update onset detector controls onsetdetector->updControl("PowerSpectrum/pspk/mrs_string/spectrumType", "wrongdBonsets"); onsetdetector->updControl("Flux/flux/mrs_string/mode", "DixonDAFX06"); realvec bcoeffs(1,3);//configure zero-phase Butterworth filter of Flux time series -> butter(2, 0.28) bcoeffs(0) = 0.1174; bcoeffs(1) = 0.2347; bcoeffs(2) = 0.1174; realvec acoeffs(1,3); acoeffs(0) = 1.0; acoeffs(1) = -0.8252; acoeffs(2) = 0.2946; onsetdetector->updControl("Filter/filt1/mrs_realvec/ncoeffs", bcoeffs); onsetdetector->updControl("Filter/filt1/mrs_realvec/dcoeffs", acoeffs); mrs_natural lookAheadSamples = 6; onsetdetector->updControl("PeakerOnset/peaker/mrs_natural/lookAheadSamples", lookAheadSamples); //!! onsetdetector->updControl("PeakerOnset/peaker/mrs_real/threshold", 1.5); //!!! onsetdetector->updControl("ShiftInput/sif/mrs_natural/winSize", 4*lookAheadSamples+1); //set Accumulator controls for explicit flush mode mrs_natural winds = 1+lookAheadSamples+mrs_natural(ceil(mrs_real(winSize_)/hopSize_/2.0)); cout << "Accumulator/textWinNet timesToKeep = " << winds << endl; mrs_real textureWinMinLen = 0.050; //secs mrs_real textureWinMaxLen = 1.0; //secs mrs_natural minTimes = (mrs_natural)(textureWinMinLen*samplingFrequency_/hopSize_); mrs_natural maxTimes = (mrs_natural)(textureWinMaxLen*samplingFrequency_/hopSize_); cout << "Accumulator/textWinNet MinTimes = " << minTimes << " (i.e. " << textureWinMinLen << " secs)" << endl; cout << "Accumulator/textWinNet MaxTimes = " << maxTimes << " (i.e. " << textureWinMaxLen << " secs)" <<endl; textWinNet->updControl("mrs_string/mode", "explicitFlush"); textWinNet->updControl("mrs_natural/timesToKeep", winds); //textWinNet->updControl("mrs_string/mode","explicitFlush"); textWinNet->updControl("mrs_natural/maxTimes", maxTimes); textWinNet->updControl("mrs_natural/minTimes", minTimes); //set MidiFileSynthSource to receive a signal for each texture window mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/sigNewTextWin", false); mainNet->linkControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/newTextWin", "Accumulator/textWinNet/mrs_bool/flush"); } else { cout << "** Onset detector disabled ->"; if(accSize_>0)//manually set texture window length { cout << " using fixed length texture windows" << endl; cout << "Accumulator/textWinNet nTimes = " << accSize << " (i.e. " << accSize*hopSize_/samplingFrequency_ << " secs)" << endl; mainNet->updControl("Accumulator/textWinNet/mrs_natural/nTimes", accSize); //set MidiFileSynthSource to receive a signal for each texture window mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/sigNewTextWin", false); mainNet->linkControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/newTextWin", "Accumulator/textWinNet/mrs_bool/flush"); } else //use GT for texture window length { cout << " using GT length texture windows" << endl; //set texture window mainNet->updControl("Accumulator/textWinNet/mrs_string/mode", "explicitFlush"); mrs_real textureWinMinLen = 0.0; //secs - let GT take care of this... mrs_real textureWinMaxLen = 15.0; //secs - just a majorant... mrs_natural minTimes = (mrs_natural)(textureWinMinLen*samplingFrequency_/hopSize_); mrs_natural maxTimes = (mrs_natural)(textureWinMaxLen*samplingFrequency_/hopSize_); cout << "Accumulator/textWinNet MinTimes = " << minTimes << " (i.e. " << textureWinMinLen << " secs)" << endl; cout << "Accumulator/textWinNet MaxTimes = " << maxTimes << " (i.e. " << textureWinMaxLen << " secs)" <<endl; mainNet->updControl("Accumulator/textWinNet/mrs_natural/maxTimes", maxTimes); mainNet->updControl("Accumulator/textWinNet/mrs_natural/minTimes", minTimes); //set MidiFileSynthSource to send a signal for each texture window mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/sigNewTextWin", true); mainNet->linkControl("Accumulator/textWinNet/mrs_bool/flush", "Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/newTextWin"); } } mrs_natural delay = -(winSize_/2 - hopSize_); mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/synthBank/PeakSynth/synthCluster_0/PeakSynthOsc/pso/mrs_real/samplingFreq", samplingFrequency_); mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/synthBank/PeakSynth/synthCluster_0/PeakSynthOsc/pso/mrs_natural/delay", delay); // Nw/2+1 mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/synthBank/PeakSynth/synthCluster_0/PeakSynthOsc/pso/mrs_natural/synSize", hopSize_*2); mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/synthBank/PeakSynth/synthCluster_0/Windowing/wiSyn/mrs_string/type", "Hanning"); //[!] //if (outsfname == "MARSYAS_EMPTY") // mainNet->updControl("Shredder/synthNet/Series/postNet/AudioSink/dest/mrs_natural/bufferSize", bopt_); // else // mainNet->updControl("Shredder/synthNet/Series/postNet/SoundFileSink/dest/mrs_string/filename", outsfname);//[!] //*************************************************************************************************************** // MAIN TICKING LOOP //*************************************************************************************************************** cout <<">> Start processing..." << endl; //ofstream cfile("density.txt", ios::app); //[WTF] [TODO] mrs_real globalSnr = 0; mrs_natural frameCount = 0; // mrs_real time=0; mrs_natural numTextWinds = 0; while(analysisNet->getctrl("FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/hasData")->to<mrs_bool>())//(1) { mainNet->tick(); numTextWinds++; //if(numTextWinds == 63) //{ // cout << "!!!!" << endl; //} if (!microphone_) { //bool temp = mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/hasData")->to<mrs_bool>(); //bool temp1 = textWinNet->getctrl("Series/analysisNet/FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/hasData")->to<mrs_bool>(); //bool temp2 = analysisNet->getctrl("FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_bool/hasData")->to<mrs_bool>(); mrs_real timeRead = analysisNet->getctrl("FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_natural/pos")->to<mrs_natural>()/samplingFrequency_; mrs_real timeLeft; //if(!stopAnalyse_) timeLeft = analysisNet->getctrl("FanOutIn/mixer/Series/oriNet/MidiFileSynthSource/src/mrs_natural/size")->to<mrs_natural>()/samplingFrequency_; //else // timeLeft = stopAnalyse_; // string fname = mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/SoundFileSource/src/mrs_string/filename")->to<mrs_string>(); printf("Processed texture window %d : %.2f / %.2f \r", (int)numTextWinds, timeRead, timeLeft); fflush(stdout); //cout << fixed << setprecision(2) << timeRead << "/" << setprecision(2) << timeLeft; ///*bool*/ temp = mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>(); //[TODO] // mrs_real density = mainNet->getctrl("PeClust/peClust/mrs_real/clusterDensity")->to<mrs_real>(); // cfile << density << " " << oriGain << endl; // //cout << oriGain << endl; //if (temp2 == false || (stopAnalyse_ !=0 && stopAnalyse_<timeRead)) // break; } } if(synthetize_ > -1 && residual_ && frameCount != 0) { cout << "Global SNR : " << globalSnr/frameCount << endl; *snr0 = globalSnr/frameCount; } if(peakStore_) { // mainNet->updControl("PeakViewSink/peSink/mrs_real/fs", samplingFrequency_); // mainNet->updControl("PeakViewSink/peSink/mrs_natural/frameSize", D); // mainNet->updControl("PeakViewSink/peSink/mrs_string/filename", filePeakName); // mainNet->updControl("PeakViewSink/peSink/mrs_bool/done", true); } //cout << ">> Saving .mat file with results so they can be opened in MATLAB in: " << fileMatName << endl; //MATLAB_EVAL("save " + fileMatName); if(numTextWinds > 0) { cout << ">> Saving SDR results to SDR.mat" << endl; MATLAB_EVAL("saveSDRresults"); } cout << endl << ">> End of processing. Bye!" << endl; //cfile.close(); [TODO] }
void tags() { if (!wekafname_Set()) return; if (!twekafname_Set()) return; // The file paths we will be reading/writing to. string testing_arff = inputdir_ + twekafname_; string training_arff = inputdir_ + wekafname_; string testing_predictions = outputdir_ + predictcollectionfname_; string testing_predictions_arff = outputdir_ + twekafname_ + ".affinities.arff"; string training_predictions_arff = outputdir_ + wekafname_ + ".affinities.arff"; // Initialize the network, classifier, and weka source through which // we will read our .arff files MarSystemManager mng; MarSystem* net = mng.create("Series", "series"); net->addMarSystem(mng.create("WekaSource", "wsrc")); MarSystem* classifier = mng.create("Classifier", "cl"); net->addMarSystem(classifier); net->addMarSystem(mng.create("Gain/gain")); // Instantiate the correct classifier: cout << "Selected classifier type = " << classifier_ << endl; if (classifier_ == "GS") { net->updControl("Classifier/cl/mrs_string/enableChild", "GaussianClassifier/gaussiancl"); } else if (classifier_ == "ZEROR") { net->updControl("Classifier/cl/mrs_string/enableChild", "ZeroRClassifier/zerorcl"); } else if (classifier_ == "SVM") { net->updControl("Classifier/cl/mrs_string/enableChild", "SVMClassifier/svmcl"); } else { // TODO: ERROR CONDITION; ADD ERROR HANDLING HERE } /** * TRAINING * * Read in the training arff data, and train the classifier. **/ // Set up the weka source to read the training .arff // and hook together some controls. cout << "Training Filename = " << training_arff << endl; net->updControl("WekaSource/wsrc/mrs_string/filename", training_arff); net->updControl("mrs_natural/inSamples", 1); net->updControl("Classifier/cl/mrs_natural/nClasses", net->getctrl("WekaSource/wsrc/mrs_natural/nClasses")); net->linkControl("Classifier/cl/mrs_string/mode", "mrs_string/train"); // Tick over the training WekaSource until all lines in the training file have been read. // FIXME: Remove the mode updates, unless someone can justify their existence. // The mode is not switched to 'predict' until further down. cout << "Reading features" << endl; while (!net->getctrl("WekaSource/wsrc/mrs_bool/done")->to<mrs_bool>()) { string mode = net->getctrl("WekaSource/wsrc/mrs_string/mode")->to<mrs_string>(); net->tick(); net->updControl("Classifier/cl/mrs_string/mode", mode); } // Switch the Classifier's mode to predict: // This causes the classifier to train itself on all input data so far. cout << "Training" << endl; net->updControl("Classifier/cl/mrs_string/mode", "predict"); // Collect information about the labels (classes) in this dataset mrs_natural nLabels = net->getctrl("WekaSource/wsrc/mrs_natural/nClasses")->to<mrs_natural>(); mrs_string labelNames = net->getctrl("WekaSource/wsrc/mrs_string/classNames")->to<mrs_string>(); vector<string> classNames; // TODO: you could probably replace "s = ..." with "s = labelNames" string s = net->getctrl("WekaSource/wsrc/mrs_string/classNames")->to<mrs_string>(); for (int i=0; i < nLabels; ++i) { string className; string temp; className = s.substr(0, s.find(",")); temp = s.substr(s.find(",") + 1, s.length()); s = temp; classNames.push_back(className); } /** * PREDICT STEP 1 * * Predictions for the testing arff data. **/ // Initialize the weka sink that we will use to write an .arff file // for the testing dataset, where the features are the predicted // probabilities from our classifier MarSystem* testpSink = mng.create("WekaSink/testpSink"); testpSink->updControl("mrs_natural/inSamples", 1); testpSink->updControl("mrs_natural/inObservations", nLabels+1); testpSink->updControl("mrs_natural/nLabels", nLabels); testpSink->updControl("mrs_string/labelNames", labelNames); testpSink->updControl("mrs_string/inObsNames", labelNames); testpSink->updControl("mrs_string/filename", testing_predictions_arff); // Set up the weka source to read the testing data cout << "Testing Filename = " << testing_arff << endl; net->updControl("WekaSource/wsrc/mrs_string/filename", testing_arff); cout << "Starting Prediction for Testing Collection" << endl; cout << "Writing .mf style predictions to " << testing_predictions << endl; cout << "The following output file can serve as a stacked testing .arff" << endl; cout << "Writing .arff style predictions to " << testing_predictions_arff << endl; mrs_realvec probs; mrs_realvec testpSinkOut; mrs_string currentlyPlaying; realvec data; realvec wsourcedata; vector<string> previouslySeenFilenames; // Open the non-stacked predictions output file to write to. ofstream prout; prout.open(testing_predictions.c_str()); // Tick over the test WekaSource, saving our predictions for each line, // until all lines in the test file have been read. testpSinkOut.create(nLabels+1,1); while (!net->getctrl("WekaSource/wsrc/mrs_bool/done")->to<mrs_bool>()) { net->tick(); wsourcedata = net->getctrl("WekaSource/wsrc/mrs_realvec/processedData")->to<mrs_realvec>(); data = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); currentlyPlaying = net->getctrl("WekaSource/wsrc/mrs_string/currentFilename")->to<mrs_string>(); if (!alreadySeen(currentlyPlaying, previouslySeenFilenames)) { probs = net->getctrl("Classifier/cl/mrs_realvec/processedData")->to<mrs_realvec>(); for (mrs_natural i=0; i < probs.getSize()-2; i++) { testpSinkOut(i,0) = probs(2+i); prout << currentlyPlaying << "\t" << classNames[i] << "\t" << probs(2+i) << endl; } testpSinkOut(probs.getSize()-2,0) = probs(0); testpSink->updControl("mrs_string/currentlyPlaying", currentlyPlaying); testpSink->process(testpSinkOut, testpSinkOut); // Mark this filename as seen! previouslySeenFilenames.push_back(currentlyPlaying); } } // Close the non-stacked predictions; they are written! prout.close(); /** * PREDICT STEP 2 * * Predictions for the training arff data **/ // Initialize the weka sink that we will use to write an .arff file // for the training dataset, where the features are the predicted // probabilities from our classifier MarSystem* trainpSink = mng.create("WekaSink/trainpSink"); trainpSink->updControl("mrs_natural/inSamples", 1); trainpSink->updControl("mrs_natural/inObservations", nLabels+1); trainpSink->updControl("mrs_natural/nLabels", nLabels); trainpSink->updControl("mrs_string/labelNames", labelNames); trainpSink->updControl("mrs_string/inObsNames", labelNames); trainpSink->updControl("mrs_string/filename", training_predictions_arff); cout << "Starting prediction for training collection (for stacked generalization)" << endl; cout << "The following output file can serve as a stacked training .arff" << endl; cout << "Writing .arff style predictions to " << training_predictions_arff << endl; // Empty our list of previously seen filenames; we will reuse it. previouslySeenFilenames.clear(); mrs_realvec trainpSinkOut; trainpSinkOut.create(nLabels+1,1); mrs_natural label; net->updControl("WekaSource/wsrc/mrs_string/filename", training_arff); // Tick over the test WekaSource, saving our predictions for each line in // the training file until all lines in the training file have been read. while (!net->getctrl("WekaSource/wsrc/mrs_bool/done")->to<mrs_bool>()) { net->tick(); currentlyPlaying = net->getctrl("WekaSource/wsrc/mrs_string/currentFilename")->to<mrs_string>(); wsourcedata = net->getctrl("WekaSource/wsrc/mrs_realvec/processedData")->to<mrs_realvec>(); label = wsourcedata(wsourcedata.getSize()-1,0); probs = net->getctrl("Classifier/cl/mrs_realvec/processedData")->to<mrs_realvec>(); if (!alreadySeen(currentlyPlaying, previouslySeenFilenames)) { // Store the predicted probabilities for this file and mark the file as seen! for (mrs_natural i=0; i < probs.getSize()-2; i++) { trainpSinkOut(i,0) = probs(2+i); } previouslySeenFilenames.push_back(currentlyPlaying); } // Write out a line in the arff file. trainpSinkOut(probs.getSize()-2,0) = label; trainpSink->updControl("mrs_string/currentlyPlaying", currentlyPlaying); trainpSink->process(trainpSinkOut, trainpSinkOut); } cout << "DONE" << endl; }
void distance_matrix_MIREX() { if (!wekafname_Set()) return; cout << "Distance matrix calculation using " << wekafname_ << endl; wekafname_ = inputdir_ + wekafname_; MarSystemManager mng; MarSystem* net = mng.create("Series", "net"); MarSystem* accum = mng.create("Accumulator", "accum"); MarSystem* wsrc = mng.create("WekaSource", "wsrc"); accum->addMarSystem(wsrc); accum->updControl("WekaSource/wsrc/mrs_bool/normMaxMin", true); accum->updControl("WekaSource/wsrc/mrs_string/filename", wekafname_); mrs_natural nInstances = accum->getctrl("WekaSource/wsrc/mrs_natural/nInstances")->to<mrs_natural>(); accum->updControl("mrs_natural/nTimes", nInstances); MarSystem* dmatrix = mng.create("SelfSimilarityMatrix", "dmatrix"); dmatrix->addMarSystem(mng.create("Metric", "dmetric")); dmatrix->updControl("Metric/dmetric/mrs_string/metric", "euclideanDistance"); net->addMarSystem(accum); net->addMarSystem(dmatrix); net->tick(); ofstream oss; oss.open(distancematrix_.c_str()); oss << "Marsyas-kea distance matrix for MIREX 2007 Audio Similarity Exchange " << endl; // collection simply for naming the entries Collection l; l.read(inputdir_ + predictcollectionfname_); for (size_t i=1; i <= l.size(); ++i) { oss << i << "\t" << l.entry(i-1) << endl; } oss << "Q/R"; const mrs_realvec& dmx = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); for (int i=1; i <= nInstances; ++i) { oss << "\t" << i; } oss << endl; for (int i=1; i <= nInstances; ++i) { oss << i; for (int j=0; j < nInstances; j++) oss <<"\t" << dmx(i-1, j); oss << endl; } oss << endl; }
void train_predict(mrs_string mode) { if (!wekafname_Set()) return; if (!twekafname_Set()) return; wekafname_ = inputdir_ + wekafname_; cout << "Training classifier using .arff file: " << wekafname_ << endl; cout << "Classifier type : " << classifier_ << endl; cout << "Predicting classes for .arff file: " << twekafname_ << endl; MarSystemManager mng; //////////////////////////////////////////////////////////// // // The network that we will use to train and predict // MarSystem* net = mng.create("Series", "series"); //////////////////////////////////////////////////////////// // // The WekaSource we read the train and test .arf files into // net->addMarSystem(mng.create("WekaSource", "wsrc")); //////////////////////////////////////////////////////////// // // The classifier // MarSystem* classifier = mng.create("Classifier", "cl"); net->addMarSystem(classifier); //////////////////////////////////////////////////////////// // // Which classifier function to use // if (classifier_ == "GS") net->updControl("Classifier/cl/mrs_string/enableChild", "GaussianClassifier/gaussiancl"); if (classifier_ == "ZEROR") net->updControl("Classifier/cl/mrs_string/enableChild", "ZeroRClassifier/zerorcl"); if (classifier_ == "SVM") net->updControl("Classifier/cl/mrs_string/enableChild", "SVMClassifier/svmcl"); //////////////////////////////////////////////////////////// // // The training file we are feeding into the WekaSource // net->updControl("WekaSource/wsrc/mrs_string/filename", wekafname_); net->updControl("mrs_natural/inSamples", 1); //////////////////////////////////////////////////////////// // // Set the classes of the Summary and Classifier to be // the same as the WekaSource // net->updControl("Classifier/cl/mrs_natural/nClasses", net->getctrl("WekaSource/wsrc/mrs_natural/nClasses")); net->updControl("Classifier/cl/mrs_string/mode", "train"); //////////////////////////////////////////////////////////// // // Tick over the training WekaSource until all lines in the // training file have been read. // while (!net->getctrl("WekaSource/wsrc/mrs_bool/done")->to<mrs_bool>()) { string mode = net->getctrl("WekaSource/wsrc/mrs_string/mode")->to<mrs_string>(); net->tick(); net->updControl("Classifier/cl/mrs_string/mode", mode); } cout << "Done training " << endl; // cout << "------------------------------" << endl; // cout << "Class names" << endl; // cout << net->getctrl("WekaSource/wsrc/mrs_string/classNames") << endl; // cout << "------------------------------\n" << endl; vector<string> classNames; string s = net->getctrl("WekaSource/wsrc/mrs_string/classNames")->to<mrs_string>(); char *str = (char *)s.c_str(); char * pch; pch = strtok (str,","); classNames.push_back(pch); while (pch != NULL) { pch = strtok (NULL, ","); if (pch != NULL) classNames.push_back(pch); } //////////////////////////////////////////////////////////// // // Predict the classes of the test data // net->updControl("WekaSource/wsrc/mrs_string/filename", twekafname_); net->updControl("Classifier/cl/mrs_string/mode", "predict"); //////////////////////////////////////////////////////////// // // Tick over the test WekaSource until all lines in the // test file have been read. // ofstream prout; prout.open(predictcollectionfname_.c_str()); ofstream prtout; prtout.open(predicttimeline_.c_str()); realvec data; int end=0; int start=0; mrs_string prev_name = ""; mrs_string output_name = ""; mrs_string name; mrs_real srate; while (!net->getctrl("WekaSource/wsrc/mrs_bool/done")->to<mrs_bool>()) { net->tick(); data = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); srate = net->getctrl("WekaSource/wsrc/mrs_real/currentSrate")->to<mrs_real>(); if (mode == "default") { cout << net->getctrl("WekaSource/wsrc/mrs_string/currentFilename")->to<mrs_string>() << "\t"; cout << classNames[(int)data(0,0)] << endl; prout << net->getctrl("WekaSource/wsrc/mrs_string/currentFilename")->to<mrs_string>() << "\t"; prout << classNames[(int)data(0,0)] << endl; } else if (mode == "timeline") { mrs_real srate = net->getctrl("WekaSource/wsrc/mrs_real/currentSrate")->to<mrs_real>(); name = classNames[(int)data(0,0)];\ // cout << name << endl; if (name != prev_name) { if (end * (1.0/srate)-start*(1.0 / srate) <= minspan_) // not background { } else { if (predicttimeline_ == EMPTYSTRING) { if (label_ == EMPTYSTRING) { cout << start*(1.0 / srate) << "\t" << end*(1.0 / srate) << "\t"; cout << prev_name << endl; } else { if (label_ == prev_name) { cout << start*(1.0 / srate) << "\t" << end*(1.0 / srate) << "\t"; cout << prev_name << endl; } } output_name = prev_name; } else { if (label_ == EMPTYSTRING) { prtout << start*(1.0 / srate) << "\t" << end*(1.0 / srate) << "\t"; prtout << prev_name << endl; } else { if (label_ == prev_name) { prtout << start*(1.0 / srate) << "\t" << end*(1.0 / srate) << "\t"; prtout << prev_name << endl; } } output_name = prev_name; } } start = end; } // else // { // } prev_name = name; } else cout << "Unsupported mode" << endl; // cout << data(0,0) << endl; end++; } prout.close(); cout << "DONE" << endl; delete net; }
void train_evaluate() { if (!wekafname_Set()) return; wekafname_ = inputdir_ + wekafname_; cout << "Training classifier using .arff file: " << wekafname_ << endl; cout << "Classifier type : " << classifier_ << endl; MarSystemManager mng; MarSystem* net; net = mng.create("Series", "net"); net->addMarSystem(mng.create("WekaSource", "wsrc")); net->addMarSystem(mng.create("Classifier", "cl")); net->addMarSystem(mng.create("ClassificationReport", "summary")); if (classifier_ == "GS") net->updControl("Classifier/cl/mrs_string/enableChild", "GaussianClassifier/gaussiancl"); if (classifier_ == "ZEROR") net->updControl("Classifier/cl/mrs_string/enableChild", "ZeroRClassifier/zerorcl"); if (classifier_ == "SVM") net->updControl("Classifier/cl/mrs_string/enableChild", "SVMClassifier/svmcl"); // net->updControl("WekaSource/wsrc/mrs_string/attributesToInclude", "1,2,3"); // net->updControl("WekaSource/wsrc/mrs_string/validationMode", "PercentageSplit,50%"); net->updControl("WekaSource/wsrc/mrs_string/validationMode", "kFold,NS,10"); // net->updControl("WekaSource/wsrc/mrs_string/validationMode", "UseTestSet,lg.arff"); net->updControl("WekaSource/wsrc/mrs_string/filename", wekafname_); net->updControl("mrs_natural/inSamples", 1); if (classifier_ == "SVM") { if (svm_svm_ != EMPTYSTRING) { net->updControl("Classifier/cl/SVMClassifier/svmcl/mrs_string/svm", svm_svm_); } if (svm_kernel_ != EMPTYSTRING) { net->updControl("Classifier/cl/SVMClassifier/svmcl/mrs_string/kernel", svm_kernel_); } } if (net->getctrl("WekaSource/wsrc/mrs_bool/regression")->isTrue()) { // TODO: enable regression for ZeroRClassifier and GaussianClassifier, // and don't assume we're only dealing with svm net->updControl("Classifier/cl/SVMClassifier/svmcl/mrs_bool/output_classPerms", false); net->updControl("Classifier/cl/mrs_natural/nClasses", 1); net->updControl("ClassificationReport/summary/mrs_natural/nClasses", 1); net->updControl("ClassificationReport/summary/mrs_bool/regression", true); } else { net->updControl("ClassificationReport/summary/mrs_natural/nClasses", net->getctrl("WekaSource/wsrc/mrs_natural/nClasses")); net->updControl("ClassificationReport/summary/mrs_string/classNames", net->getctrl("WekaSource/wsrc/mrs_string/classNames")); net->updControl("Classifier/cl/mrs_natural/nClasses", net->getctrl("WekaSource/wsrc/mrs_natural/nClasses")); } net->linkControl("Classifier/cl/mrs_string/mode", "ClassificationReport/summary/mrs_string/mode"); int i = 0; while(net->getctrl("WekaSource/wsrc/mrs_bool/done")->to<mrs_bool>() == false) { net->tick(); // cout << net->getControl("WekaSource/wsrc/mrs_realvec/processedData")->to<mrs_realvec>() << endl; string mode = net->getctrl("WekaSource/wsrc/mrs_string/mode")->to<mrs_string>(); net->updControl("Classifier/cl/mrs_string/mode", mode); ++i; } net->updControl("Classifier/cl/mrs_string/mode", "predict"); net->updControl("ClassificationReport/summary/mrs_bool/done", true); net->tick(); delete net; }
void train_classifier() { if (!wekafname_Set()) return; wekafname_ = inputdir_ + wekafname_; cout << "Training classifier using .arff file: " << wekafname_ << endl; cout << "Classifier type : " << classifier_ << endl; MarSystemManager mng; //////////////////////////////////////////////////////////// // // The network that we will use to train and predict // MarSystem* net = mng.create("Series", "series"); //////////////////////////////////////////////////////////// // // The WekaSource we read the train and test .arf files into // net->addMarSystem(mng.create("WekaSource", "wsrc")); //////////////////////////////////////////////////////////// // // The classifier // MarSystem* classifier = mng.create("Classifier", "cl"); net->addMarSystem(classifier); //////////////////////////////////////////////////////////// // // Which classifier function to use // if (classifier_ == "GS") net->updControl("Classifier/cl/mrs_string/enableChild", "GaussianClassifier/gaussiancl"); if (classifier_ == "ZEROR") net->updControl("Classifier/cl/mrs_string/enableChild", "ZeroRClassifier/zerorcl"); if (classifier_ == "SVM") net->updControl("Classifier/cl/mrs_string/enableChild", "SVMClassifier/svmcl"); //////////////////////////////////////////////////////////// // // The training file we are feeding into the WekaSource // net->updControl("WekaSource/wsrc/mrs_string/filename", wekafname_); net->updControl("mrs_natural/inSamples", 1); //////////////////////////////////////////////////////////// // // Set the classes of the Summary and Classifier to be // the same as the WekaSource // net->updControl("Classifier/cl/mrs_natural/nClasses", net->getctrl("WekaSource/wsrc/mrs_natural/nClasses")); net->updControl("Classifier/cl/mrs_string/mode", "train"); //////////////////////////////////////////////////////////// // // Tick over the training WekaSource until all lines in the // training file have been read. // while (!net->getctrl("WekaSource/wsrc/mrs_bool/done")->to<mrs_bool>()) { string mode = net->getctrl("WekaSource/wsrc/mrs_string/mode")->to<mrs_string>(); net->tick(); net->updControl("Classifier/cl/mrs_string/mode", mode); } ofstream clout; clout.open(trainedclassifier_.c_str()); net->updControl("Classifier/cl/mrs_string/mode", "predict"); clout << *net << endl; cout << "Done training " << endl; }
void predict(mrs_string mode) { MarSystemManager mng; cout << "Predicting using " << trainedclassifier_ << endl; ifstream pluginStream(trainedclassifier_.c_str()); MRS_WARNINGS_OFF; MarSystem* net = mng.getMarSystem(pluginStream); MRS_WARNINGS_ON; if (!twekafname_Set()) return; vector<string> classNames; string s = net->getctrl("WekaSource/wsrc/mrs_string/classNames")->to<mrs_string>(); char *str = (char *)s.c_str(); char * pch; pch = strtok (str,","); classNames.push_back(pch); while (pch != NULL) { pch = strtok (NULL, ","); if (pch != NULL) classNames.push_back(pch); } //////////////////////////////////////////////////////////// // // Predict the classes of the test data // net->updControl("WekaSource/wsrc/mrs_string/filename", twekafname_); net->updControl("Classifier/cl/mrs_string/mode", "predict"); //////////////////////////////////////////////////////////// // // Tick over the test WekaSource until all lines in the // test file have been read. // ofstream prout; prout.open(predictcollectionfname_.c_str()); ofstream prtout; prtout.open(predicttimeline_.c_str()); realvec data; int end=0; int start=0; mrs_string prev_name = ""; mrs_string name; mrs_real srate; while (!net->getctrl("WekaSource/wsrc/mrs_bool/done")->to<mrs_bool>()) { net->tick(); data = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); srate = net->getctrl("WekaSource/wsrc/mrs_real/currentSrate")->to<mrs_real>(); if (mode == "default") { cout << net->getctrl("WekaSource/wsrc/mrs_string/currentFilename")->to<mrs_string>() << "\t"; cout << classNames[(int)data(0,0)] << endl; prout << net->getctrl("WekaSource/wsrc/mrs_string/currentFilename")->to<mrs_string>() << "\t"; prout << classNames[(int)data(0,0)] << endl; } else if (mode == "timeline") { name = classNames[(int)data(0,0)]; if (name != prev_name) { if ((end * (1.0/srate)-start*(1.0 / srate) > minspan_)) { if (predicttimeline_ == EMPTYSTRING) { cout << start*(1.0 / srate) << "\t" << end*(1.0 / srate) << "\t"; cout << prev_name << endl; } else { prtout << start*(1.0 / srate) << "\t" << end*(1.0 / srate) << "\t"; prtout << prev_name << endl; } } start = end; } else { } prev_name = name; } else cout << "Unsupported mode" << endl; // cout << data(0,0) << endl; end++; } prout.close(); // cout << "DONE" << endl; // sness - hmm, I really should be able to delete net, but I get a // coredump when I do. Maybe I need to destroy something else first? // delete net; }
void pca() { cout << "Principal Component Analysis of .arff file" << endl; if (!wekafname_Set()) return; wekafname_ = inputdir_ + wekafname_; cout << "PCA using .arff file: " << wekafname_ << endl; MarSystemManager mng; MarSystem* net = mng.create("Series", "net"); MarSystem* accum = mng.create("Accumulator", "accum"); MarSystem* wsrc = mng.create("WekaSource", "wsrc"); accum->addMarSystem(wsrc); accum->updControl("WekaSource/wsrc/mrs_string/filename", wekafname_); mrs_natural nInstances = accum->getctrl("WekaSource/wsrc/mrs_natural/nInstances")->to<mrs_natural>(); cout << "nInstances = " << nInstances << endl; accum->updControl("mrs_natural/nTimes", nInstances); net->addMarSystem(accum); net->addMarSystem(mng.create("PCA", "pca")); net->addMarSystem(mng.create("NormMaxMin", "norm")); net->addMarSystem(mng.create("WekaSink", "wsink")); net->updControl("PCA/pca/mrs_natural/npc", 2); net->updControl("NormMaxMin/norm/mrs_natural/ignoreLast", 1); net->updControl("NormMaxMin/norm/mrs_string/mode", "twopass"); net->updControl("NormMaxMin/norm/mrs_real/lower", 0.0); net->updControl("NormMaxMin/norm/mrs_real/upper", 11.0); net->updControl("WekaSink/wsink/mrs_natural/nLabels", net->getctrl("Accumulator/accum/WekaSource/wsrc/mrs_natural/nClasses")); net->updControl("WekaSink/wsink/mrs_string/labelNames", net->getctrl("Accumulator/accum/WekaSource/wsrc/mrs_string/classNames")); net->updControl("WekaSink/wsink/mrs_string/filename", "pca_out.arff"); net->tick(); // the output of the PCA const mrs_realvec& pca_transformed_data = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); cout << "Output transformed features using PCA" << endl; string classNames = net->getctrl("Accumulator/accum/WekaSource/wsrc/mrs_string/classNames")->to<mrs_string>(); vector<string> labelNames; labelNames.clear(); for (int i = 0; i < net->getctrl("Accumulator/accum/WekaSource/wsrc/mrs_natural/nClasses")->to<mrs_natural>(); ++i) { string labelName; string temp; labelName = classNames.substr(0, classNames.find(",")); temp = classNames.substr(classNames.find(",")+1, classNames.length()); classNames = temp; labelNames.push_back(labelName); } cout << "12" << endl; cout << "12" << endl; for (int t=0; t < pca_transformed_data.getCols(); t++) { cout << (int)pca_transformed_data(0,t) * 12 + (int)pca_transformed_data(1,t) << ","; cout << labelNames[(int)pca_transformed_data(2,t)]; cout << endl; // cout << (int)pca_transformed_data(0,t) << "\t"; // cout << (int)pca_transformed_data(1,t) << "\t"; // cout << (int)pca_transformed_data(2,t) << "\t"; // cout << pca_transformed_data(3,t) << "\t"; // cout << endl; } }
// Play a collection l of soundfiles void speakerSeg(vector<string> soundfiles) { MRSDIAG("speakerSeg.cpp - speakerSeg"); MarSystemManager mng; string sfName; //create main processing network MarSystem* pnet = mng.create("Series", "pnet"); // // Output destination is either audio or soundfile // MarSystem* dest; // if (fileName == EMPTYSTRING) // audio output // dest = mng.create("AudioSink", "dest"); // else // filename output // { // dest = mng.create("SoundFileSink", "dest"); // } MarSystem* lspSeries = mng.create("Series","lspSeries"); MarSystem* mfccSeries = mng.create("Series","mfccSeries"); MarSystem* lspFeatSeries = mng.create("Series","lspFeatSeries"); MarSystem* mfccFeatSeries = mng.create("Series","mfccFeatSeries"); MarSystem* pitchSeries = mng.create("Series","pitchSeries"); MarSystem* features = mng.create("Fanout","features"); MarSystem* parallel = mng.create("Parallel","parallel"); mfccFeatSeries->addMarSystem(mng.create("Windowing", "hammfccFeatSeries")); mfccFeatSeries->addMarSystem(mng.create("Spectrum", "spkmfccFeatSeries")); mfccFeatSeries->addMarSystem(mng.create("PowerSpectrum", "mfccFeatSeriespspk")); mfccFeatSeries->addMarSystem(mng.create("MFCC", "mfcca")); mfccFeatSeries->updControl("MFCC/mfcca/mrs_natural/coefficients", 16); // MarControlPtr((mrs_natural)16)); // based on the nr of features (in this case, the LSP order = 10), // calculate the minimum number of frames each speech segment should have // in order to avoid ill calculation of the corresponding covariance matrices. // To have a good estimation of the covariance matrices // the number of data points (i.e. feature vectors) should be at least // equal or bigger than d(d+1)/2, where d = cov matrix dimension. mrs_real d = (mrs_real)mfccFeatSeries->getctrl("MFCC/mfcca/mrs_natural/coefficients")->to<mrs_natural>(); mrs_natural minSegFrames = (mrs_natural)ceil(0.5*d*(d+1.0)); //0.5*d*(d+1.0) or 0.5*d*(d-1.0) [?] // make sure it's even // cout << "d = " << d << endl; //exit(0); lspFeatSeries->addMarSystem(mng.create("LPCnet", "lpc")); lspFeatSeries->addMarSystem(mng.create("LSP", "lsp")); lspFeatSeries->updControl("LPCnet/lpc/mrs_natural/order", 10); //hardcoded [!] features->addMarSystem(mfccFeatSeries); features->addMarSystem(lspFeatSeries); //speakerSeg processes data at each tick as depicted bellow, //which includes 4 speech sub-segments (C1, C2, C3, C4) that will be used for detecting //speaker changes: // // data processed at each tick // |------------------------| // C1 C2 // |----+----|----+----| // |----+----|----+----| // C3 C4 // |--->| // hop // // So, the speech segments C1, C2, C3 and C4 should have a minimum of minSegFrames in order // to avoid cov ill-calculation. Consequently, at each tick, at least 5/2*minSegFrames should // be processed, with a hop set to 1/2*minSegFrames (which could be changed, but for now is fixed). //create an accumulator for creating hopsize new feature vectors at each tick MarSystem* accum = mng.create("Accumulator", "accum"); // accum->addMarSystem(features); // MarSystem* accum2 = mng.create("Accumulator", "accum2"); // accum2->addMarSystem(mfccFeatSeries); // accum2->updControl("mrs_natural/nTimes", minSegFrames/2); //accum->updControl("mrs_natural/nTimes", ceil(minSegFrames/2.0)); //add accumuated feature extraction to main processing network // lspSeries->addMarSystem(accum); //mfccSeries->addMarSystem(accum2); //create a circular buffer for storing most recent LSP10 speech data //lspSeries->addMarSystem(mng.create("Memory", "mem")); // mfccSeries->addMarSystem(mng.create("Memory", "mem2")); mfccSeries->updControl("mrs_natural/inObservations",16); lspSeries->updControl("mrs_natural/inObservations",10); // lspSeries->updControl("Memory/mem/mrs_natural/memSize", 5); //see above for an explanation why we use memSize = 5 // mfccSeries->updControl("Memory/mem2/mrs_natural/memSize", 5); //see above for an explanation why we use memSize = 5 //add a BIC change detector lspSeries->addMarSystem(mng.create("BICchangeDetector", "BICdet")); mfccSeries->addMarSystem(mng.create("BICchangeDetector", "BICdet2")); // link top-level controls // parallel->addMarSystem(lspSeries); // parallel->addMarSystem(mfccSeries); //create feature extraction network for calculating LSP-10 MarSystem* featExtractor = mng.create("Series", "featExtractor"); featExtractor->addMarSystem(mng.create("SoundFileSource", "src")); featExtractor->addMarSystem(features); accum->addMarSystem(featExtractor); accum->updControl("mrs_natural/nTimes", minSegFrames/2); pnet->addMarSystem(accum); // pnet->addMarSystem(parallel); pnet->addMarSystem(mng.create("ShiftInput", "si")); pnet->updControl("ShiftInput/si/mrs_natural/winSize", 135); pnet->linkControl("mrs_string/filename","Accumulator/accum/Series/featExtractor/SoundFileSource/src/mrs_string/filename"); pnet->linkControl("Accumulator/accum/mrs_natural/inSamples","mrs_natural/inSamples"); pnet->linkControl("Accumulator/accum/Series/featExtractor/mrs_natural/inSamples","mrs_natural/inSamples"); pnet->linkControl("Accumulator/accum/Series/featExtractor/SoundFileSource/src/mrs_natural/inSamples","mrs_natural/inSamples"); pnet->linkControl("Accumulator/accum/Series/featExtractor/Fanout/features/Series/lspFeatSeries/LPCnet/lpc/mrs_natural/inSamples","mrs_natural/inSamples"); pnet->linkControl("mrs_real/israte", "Accumulator/accum/Series/featExtractor/SoundFileSource/src/mrs_real/israte"); pnet->linkControl("mrs_natural/pos", "Accumulator/accum/Series/featExtractor/SoundFileSource/src/mrs_natural/pos"); // pnet->linkControl("mrs_bool/hasData", "Accumulator/accum/Series/featExtractor/SoundFileSource/src/mrs_bool/hasData"); pnet->linkControl("Accumulator/accum/Series/featExtractor/SoundFileSource/src/mrs_bool/hasData","mrs_bool/hasData"); pnet->linkControl("mrs_bool/MFCCMemreset", "Parallel/parallel/Series/mfccSeries/Memory/mem2/mrs_bool/reset"); pnet->linkControl("mrs_bool/LSPMemreset", "Parallel/parallel/Series/lspSeries/Memory/mem/mrs_bool/reset"); pnet->linkControl("mrs_bool/MFCCBICreset", "Parallel/parallel/Series/mfccSeries/BICchangeDetector/BICdet2/mrs_bool/reset"); pnet->linkControl("mrs_bool/LSPBICreset", "Parallel/parallel/Series/lspSeries/BICchangeDetector/BICdet/mrs_bool/reset"); //featExtractor->updControl("mrs_natural/inSamples", 125); //hardcoded for fs=8khz [!] // play each collection or soundfile vector<string>::iterator sfi; for (sfi = soundfiles.begin(); sfi != soundfiles.end(); ++sfi) { string fname = *sfi; //clear any memory data and any stored models pnet->updControl("mrs_bool/LSPMemreset", true); pnet->updControl("mrs_bool/LSPBICreset", true); pnet->updControl("mrs_bool/MFCCMemreset", true); pnet->updControl("mrs_bool/MFCCBICreset", true); //set new file name pnet->updControl("mrs_string/filename", fname); // need to override the control to be 25 ms every time the file is read in. pnet->updControl("mrs_natural/inSamples",200); // if (fileName != EMPTYSTRING) // soundfile output instead of audio output // pnet->updControl("SoundFileSink/dest/mrs_string/filename", fileName); // // if (fileName == EMPTYSTRING) // audio output // { // pnet->updControl("AudioSink/dest/mrs_natural/bufferSize", 256); // pnet->updControl("AudioSink/dest/mrs_bool/initAudio", true); // } // output network description to cout if ((pluginName == EMPTYSTRING) && (verboseopt)) // output to stdout { cout << (*pnet) << endl; } else if (pluginName != EMPTYSTRING) // output to plugin { ofstream oss(pluginName.c_str()); oss << (*pnet) << endl; } MarControlPtr hasDataPtr_ = pnet->getctrl("mrs_bool/hasData"); while (hasDataPtr_->isTrue()) { pnet->tick(); } } delete pnet; }
void distance_matrix_MIREX() { if (!wekafname_Set()) return; string train_file_path = FileName(inputdir_).append(train_weka_fname_).fullname(); string predict_collection_path = FileName(inputdir_).append(predictcollectionfname_).fullname(); cout << "Distance matrix calculation using " << train_file_path << endl; MarSystemManager mng; MarSystem* net = mng.create("Series", "net"); MarSystem* accum = mng.create("Accumulator", "accum"); MarSystem* wsrc = mng.create("WekaSource", "wsrc"); accum->addMarSystem(wsrc); accum->updControl("WekaSource/wsrc/mrs_bool/normMaxMin", true); accum->updControl("WekaSource/wsrc/mrs_string/filename", train_file_path); mrs_natural nInstances = accum->getctrl("WekaSource/wsrc/mrs_natural/nInstances")->to<mrs_natural>(); accum->updControl("mrs_natural/nTimes", nInstances); MarSystem* dmatrix = mng.create("SelfSimilarityMatrix", "dmatrix"); dmatrix->addMarSystem(mng.create("Metric", "dmetric")); dmatrix->updControl("Metric/dmetric/mrs_string/metric", "euclideanDistance"); net->addMarSystem(accum); net->addMarSystem(dmatrix); net->tick(); string out_file_name = FileName(outputdir_).append(distancematrix_).fullname(); ofstream oss(out_file_name.c_str()); if (!oss.is_open()) { MRSERR("Failed to open output file: " << out_file_name); return; } oss << "Marsyas-kea distance matrix for MIREX 2007 Audio Similarity Exchange " << endl; // collection simply for naming the entries Collection l; l.read(predict_collection_path); for (mrs_natural i=1; i <= l.size(); ++i) { oss << i << "\t" << l.entry(i-1) << endl; } oss << "Q/R"; const mrs_realvec& dmx = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); for (int i=1; i <= nInstances; ++i) { oss << "\t" << i; } oss << endl; for (int i=1; i <= nInstances; ++i) { oss << i; for (int j=0; j < nInstances; j++) oss <<"\t" << dmx(i-1, j); oss << endl; } oss << endl; }
void MarGrid::setupTrain(QString fname) { // Build network for feature extraction MarSystem* extractNet = mng.create("Series", "extractNet"); extractNet->addMarSystem(mng.create("SoundFileSource", "src")); extractNet->addMarSystem(mng.create("Stereo2Mono", "s2m")); // extractNet->addMarSystem(mng.create("AudioSink", "dest")); MarSystem* spectralNet = mng.create("Series", "spectralNet"); spectralNet->addMarSystem(mng.create("Windowing", "ham")); spectralNet->addMarSystem(mng.create("Spectrum", "spk")); spectralNet->addMarSystem(mng.create("PowerSpectrum", "pspk")); MarSystem* featureFanout = mng.create("Fanout", "featureFanout"); featureFanout->addMarSystem(mng.create("Centroid", "centroid")); featureFanout->addMarSystem(mng.create("Rolloff", "rolloff")); featureFanout->addMarSystem(mng.create("Flux", "flux")); featureFanout->addMarSystem(mng.create("MFCC", "mfcc")); spectralNet->addMarSystem(featureFanout); extractNet->addMarSystem(spectralNet); extractNet->addMarSystem(mng.create("Memory", "mem")); MarSystem* stats = mng.create("Fanout", "stats"); stats->addMarSystem(mng.create("Mean", "mn1")); stats->addMarSystem(mng.create("StandardDeviation", "std1")); extractNet->addMarSystem(stats); MarSystem* acc = mng.create("Accumulator", "acc"); acc->updControl("mrs_natural/nTimes", 1200); acc->addMarSystem(extractNet); total_ = mng.create("Series", "total"); total_->addMarSystem(acc); MarSystem* stats2 = mng.create("Fanout", "stats2"); stats2->addMarSystem(mng.create("Mean", "mn2")); stats2->addMarSystem(mng.create("StandardDeviation", "std2")); total_->addMarSystem(stats2); total_->addMarSystem(mng.create("Annotator", "ann")); // total_->updControl("Accumulator/acc/Series/extractNet/AudioSink/dest/mrs_bool/initAudio", true); total_->linkControl("mrs_string/filename", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_string/filename"); total_->linkControl("mrs_string/currentlyPlaying", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_string/currentlyPlaying"); total_->linkControl("mrs_bool/shuffle", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_bool/shuffle"); total_->linkControl("mrs_natural/pos", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_natural/pos"); total_->linkControl("mrs_real/repetitions", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_real/repetitions"); total_->linkControl("mrs_natural/cindex", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_natural/cindex"); total_->linkControl("mrs_natural/numFiles", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_natural/numFiles"); total_->linkControl("mrs_string/allfilenames", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_string/allfilenames"); total_->linkControl("mrs_natural/numFiles", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_natural/numFiles"); total_->linkControl("mrs_bool/hasData", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_bool/hasData"); total_->linkControl("mrs_natural/advance", "Accumulator/acc/Series/extractNet/SoundFileSource/src/mrs_natural/advance"); total_->linkControl("mrs_bool/memReset", "Accumulator/acc/Series/extractNet/Memory/mem/mrs_bool/reset"); total_->linkControl("mrs_natural/label", "Annotator/ann/mrs_natural/label"); total_->updControl("mrs_natural/inSamples", 512); trainFname = fname; predictFname = "margrid_train.mf"; total_->updControl("mrs_string/filename", trainFname.toStdString()); total_->updControl("mrs_real/repetitions", 1.0); }
void peakClustering(realvec &peakSet, string sfName, string outsfname, string noiseName, string mixName, string intervalFrequency, string panningInfo, mrs_real noiseDelay, string T, mrs_natural N, mrs_natural Nw, mrs_natural D, mrs_natural S, mrs_natural C, mrs_natural accSize, mrs_natural synthetize, mrs_real *snr0) { MarSystemManager mng; cout << "Extracting Peaks and Computing Clusters..." << endl; cout << "Nw = " << Nw << endl; cout << "N = " << N << endl; cout << "winSize_ = " << winSize_ << endl; cout << "D = " << D << endl; cout << "hopSize_ = " << hopSize_ << endl; //************************************************** // create the peakClustering network //************************************************** MarSystem* mainNet = mng.create("Series", "mainNet"); //************************************************************************** //create accumulator for the texture window and add it to the main network //************************************************************************** MarSystem* textWinNet = mng.create("Accumulator", "textWinNet"); mainNet->addMarSystem(textWinNet); //************************************************************************ //create Analysis Network and add it to the texture window accumulator //************************************************************************ MarSystem* analysisNet = mng.create("Series", "analysisNet"); textWinNet->addMarSystem(analysisNet); //************************************************************************ //create FanInOut for mixing with a noise source and add to Analysis Net //************************************************************************ MarSystem* mixer = mng.create("FanOutIn", "mixer"); //---- create original series and add it to mixer MarSystem* oriNet = mng.create("Series", "oriNet"); if (microphone_) oriNet->addMarSystem(mng.create("AudioSource", "src")); else oriNet->addMarSystem(mng.create("SoundFileSource", "src")); oriNet->addMarSystem(mng.create("Gain", "oriGain")); mixer->addMarSystem(oriNet); //---- create a series for the noiseSource if(noiseName != EMPTYSTRING) { MarSystem* mixseries = mng.create("Series", "mixseries"); if(noiseName == "white") mixseries->addMarSystem(mng.create("NoiseSource", "noise")); else mixseries->addMarSystem(mng.create("SoundFileSource", "noise")); mixseries->addMarSystem(mng.create("Delay", "noiseDelay")); MarSystem* noiseGain = mng.create("Gain", "noiseGain"); mixseries->addMarSystem(noiseGain); // add this series in the fanout mixer->addMarSystem(mixseries); } //add Mixer to analysis network analysisNet->addMarSystem(mixer); //******************************************************** // create SoundFileSink and add it to the analysis net //******************************************************** if(noiseName != EMPTYSTRING) analysisNet->addMarSystem(mng.create("SoundFileSink", "mixSink")); //*********************************************************** // create peakExtract network and add it to the analysis net //*********************************************************** MarSystem* peakExtract = mng.create("Series","peakExtract"); peakExtract->addMarSystem(mng.create("ShiftInput", "si")); MarSystem* stereoFo = mng.create("Fanout","stereoFo"); // create Spectrum Network and add it to the analysis net MarSystem* spectrumNet = mng.create("Series", "spectrumNet"); spectrumNet->addMarSystem(mng.create("Stereo2Mono","s2m")); //onset detector MarSystem* onsetdetector = mng.create("FlowThru", "onsetdetector"); //onsetdetector->addMarSystem(mng.create("ShiftInput", "si")); onsetdetector->addMarSystem(mng.create("Windowing", "win")); onsetdetector->addMarSystem(mng.create("Spectrum","spk")); onsetdetector->addMarSystem(mng.create("PowerSpectrum", "pspk")); onsetdetector->addMarSystem(mng.create("Flux", "flux")); onsetdetector->addMarSystem(mng.create("ShiftInput","sif")); onsetdetector->addMarSystem(mng.create("Filter","filt1")); onsetdetector->addMarSystem(mng.create("Reverse","rev1")); onsetdetector->addMarSystem(mng.create("Filter","filt2")); onsetdetector->addMarSystem(mng.create("Reverse","rev2")); onsetdetector->addMarSystem(mng.create("PeakerOnset","peaker")); spectrumNet->addMarSystem(onsetdetector); spectrumNet->addMarSystem(mng.create("Shifter", "sh")); spectrumNet->addMarSystem(mng.create("Windowing", "wi")); MarSystem* parallel = mng.create("Parallel", "par"); parallel->addMarSystem(mng.create("Spectrum", "spk1")); parallel->addMarSystem(mng.create("Spectrum", "spk2")); spectrumNet->addMarSystem(parallel); // add spectrumNet to stereo fanout stereoFo->addMarSystem(spectrumNet); // //create stereo spectrum net MarSystem* stereoSpkNet = mng.create("Series","stereoSpkNet"); MarSystem* LRnet = mng.create("Parallel","LRnet"); // MarSystem* spkL = mng.create("Series","spkL"); spkL->addMarSystem(mng.create("Windowing","win")); spkL->addMarSystem(mng.create("Spectrum","spk")); LRnet->addMarSystem(spkL); // MarSystem* spkR = mng.create("Series","spkR"); spkR->addMarSystem(mng.create("Windowing","win")); spkR->addMarSystem(mng.create("Spectrum","spk")); LRnet->addMarSystem(spkR); // //add it to the stereo spectrum net series stereoSpkNet->addMarSystem(LRnet); // //add stereo spectrum object to stereo spectrum net //stereoSpkNet->addMarSystem(mng.create("StereoSpectrum","stereoSpk")); //AVENDANO stereoSpkNet->addMarSystem(mng.create("EnhADRess","ADRess"));//enhADRess_1 stereoSpkNet->addMarSystem(mng.create("EnhADRessStereoSpectrum","stereoSpk")); //enhADRess_2 // // add the stereo Spectrum net to the Fanout stereoFo->addMarSystem(stereoSpkNet); // // add the fanout to the peakExtract net peakExtract->addMarSystem(stereoFo); // //add peakExtract net to analysis net analysisNet->addMarSystem(peakExtract); //*************************************************************** //add PeakConvert to main SERIES for processing texture windows //*************************************************************** mainNet->addMarSystem(mng.create("PeakConvert", "conv")); //*************************************************************** //create a FlowThru for the Clustering Network and add to main net //*************************************************************** MarSystem* clustNet = mng.create("FlowThru", "clustNet"); if (!disableClustering) mainNet->addMarSystem(clustNet); //*************************************************************** // create Similarities Network and add it to ClustNet //*************************************************************** MarSystem* simNet = mng.create("FanOutIn", "simNet"); simNet->updControl("mrs_string/combinator", "*"); // //create Frequency similarity net and add it to simNet // MarSystem* freqSim = mng.create("Series","freqSim"); //-------- freqSim->addMarSystem(mng.create("PeakFeatureSelect","FREQfeatSelect")); freqSim->updControl("PeakFeatureSelect/FREQfeatSelect/mrs_natural/selectedFeatures", PeakFeatureSelect::pkFrequency | PeakFeatureSelect::barkPkFreq); //-------- MarSystem* fsimMat = mng.create("SelfSimilarityMatrix","FREQsimMat"); fsimMat->addMarSystem(mng.create("Metric","FreqL2Norm")); fsimMat->updControl("Metric/FreqL2Norm/mrs_string/metric","euclideanDistance"); fsimMat->updControl("mrs_natural/calcCovMatrix", SelfSimilarityMatrix::diagCovMatrix); //fsimMat->updControl("mrs_string/normalize", "MinMax"); //fsimMat->linkControl("mrs_realvec/covMatrix", "Metric/FreqL2Norm/mrs_realvec/covMatrix"); freqSim->addMarSystem(fsimMat); //-------- freqSim->addMarSystem(mng.create("RBF","FREQrbf")); freqSim->updControl("RBF/FREQrbf/mrs_string/RBFtype","Gaussian"); freqSim->updControl("RBF/FREQrbf/mrs_bool/symmetricIn",true); //-------- simNet->addMarSystem(freqSim); // //create Amplitude similarity net and add it to simNet // MarSystem* ampSim = mng.create("Series","ampSim"); //-------- ampSim->addMarSystem(mng.create("PeakFeatureSelect","AMPfeatSelect")); ampSim->updControl("PeakFeatureSelect/AMPfeatSelect/mrs_natural/selectedFeatures", PeakFeatureSelect::pkAmplitude | PeakFeatureSelect::dBPkAmp); //-------- MarSystem* asimMat = mng.create("SelfSimilarityMatrix","AMPsimMat"); asimMat->addMarSystem(mng.create("Metric","AmpL2Norm")); asimMat->updControl("Metric/AmpL2Norm/mrs_string/metric","euclideanDistance"); asimMat->updControl("mrs_natural/calcCovMatrix", SelfSimilarityMatrix::diagCovMatrix); //asimMat->updControl("mrs_string/normalize", "MinMax"); //asimMat->linkControl("mrs_realvec/covMatrix", "Metric/AmpL2Norm/mrs_realvec/covMatrix"); ampSim->addMarSystem(asimMat); //-------- ampSim->addMarSystem(mng.create("RBF","AMPrbf")); ampSim->updControl("RBF/AMPrbf/mrs_string/RBFtype","Gaussian"); ampSim->updControl("RBF/AMPrbf/mrs_bool/symmetricIn",true); //-------- simNet->addMarSystem(ampSim); // //create HWPS similarity net and add it to simNet // MarSystem* HWPSim = mng.create("Series","HWPSim"); //-------- HWPSim->addMarSystem(mng.create("PeakFeatureSelect","HWPSfeatSelect")); HWPSim->updControl("PeakFeatureSelect/HWPSfeatSelect/mrs_natural/selectedFeatures", PeakFeatureSelect::pkFrequency | PeakFeatureSelect::pkSetFrequencies | PeakFeatureSelect::pkSetAmplitudes); //-------- MarSystem* HWPSsimMat = mng.create("SelfSimilarityMatrix","HWPSsimMat"); HWPSsimMat->addMarSystem(mng.create("HWPS","hwps")); HWPSsimMat->updControl("HWPS/hwps/mrs_bool/calcDistance", true); HWPSim->addMarSystem(HWPSsimMat); //-------- HWPSim->addMarSystem(mng.create("RBF","HWPSrbf")); HWPSim->updControl("RBF/HWPSrbf/mrs_string/RBFtype","Gaussian"); HWPSim->updControl("RBF/HWPSrbf/mrs_bool/symmetricIn",true); //-------- simNet->addMarSystem(HWPSim); // //create Panning similarity net and add it to simNet // MarSystem* panSim = mng.create("Series","panSim"); //-------- panSim->addMarSystem(mng.create("PeakFeatureSelect","PANfeatSelect")); panSim->updControl("PeakFeatureSelect/PANfeatSelect/mrs_natural/selectedFeatures", PeakFeatureSelect::pkPan); //-------- MarSystem* psimMat = mng.create("SelfSimilarityMatrix","PANsimMat"); psimMat->addMarSystem(mng.create("Metric","PanL2Norm")); psimMat->updControl("Metric/PanL2Norm/mrs_string/metric","euclideanDistance"); psimMat->updControl("mrs_natural/calcCovMatrix", SelfSimilarityMatrix::diagCovMatrix); //psimMat->updControl("mrs_string/normalize", "MinMax"); //psimMat->linkControl("mrs_realvec/covMatrix", "Metric/PanL2Norm/mrs_realvec/covMatrix"); panSim->addMarSystem(psimMat); //-------- panSim->addMarSystem(mng.create("RBF","PANrbf")); panSim->updControl("RBF/PANrbf/mrs_string/RBFtype","Gaussian"); panSim->updControl("RBF/PANrbf/mrs_bool/symmetricIn",true); //-------- simNet->addMarSystem(panSim); // // LINK controls of PeakFeatureSelects in each similarity branch // simNet->linkControl("Series/ampSim/PeakFeatureSelect/AMPfeatSelect/mrs_natural/totalNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/totalNumPeaks"); simNet->linkControl("Series/HWPSim/PeakFeatureSelect/HWPSfeatSelect/mrs_natural/totalNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/totalNumPeaks"); simNet->linkControl("Series/panSim/PeakFeatureSelect/PANfeatSelect/mrs_natural/totalNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/totalNumPeaks"); //------ simNet->linkControl("Series/ampSim/PeakFeatureSelect/AMPfeatSelect/mrs_natural/frameMaxNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/frameMaxNumPeaks"); simNet->linkControl("Series/HWPSim/PeakFeatureSelect/HWPSfeatSelect/mrs_natural/frameMaxNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/frameMaxNumPeaks"); simNet->linkControl("Series/panSim/PeakFeatureSelect/PANfeatSelect/mrs_natural/frameMaxNumPeaks", "Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/frameMaxNumPeaks"); //++++++++++++++++++++++++++++++++++++++++++++++++++++++ //add simNet to clustNet clustNet->addMarSystem(simNet); // // LINK controls related to variable number of peak from PeakConvert to simNet // if (!disableClustering) { mainNet->linkControl("FlowThru/clustNet/FanOutIn/simNet/Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/totalNumPeaks", "PeakConvert/conv/mrs_natural/totalNumPeaks"); mainNet->linkControl("FlowThru/clustNet/FanOutIn/simNet/Series/freqSim/PeakFeatureSelect/FREQfeatSelect/mrs_natural/frameMaxNumPeaks", "PeakConvert/conv/mrs_natural/frameMaxNumPeaks"); } //*************************************************************** // create NCutNet MarSystem and add it to clustNet //*************************************************************** MarSystem* NCutNet = mng.create("Series","NCutNet"); clustNet->addMarSystem(NCutNet); //---add NCutNet components // add a stack to stack the MarSystem* stack = mng.create("Fanout","stack"); NCutNet->addMarSystem(stack); stack->addMarSystem(mng.create("NormCut","NCut")); stack->addMarSystem(mng.create("Gain", "ID")); // add the cluster selection module NCutNet->addMarSystem(mng.create("PeakClusterSelect","clusterSelect")); //*************************************************************** // create PeakLabeler MarSystem and add it to mainNet //*************************************************************** MarSystem* labeler = mng.create("PeakLabeler","labeler"); mainNet->addMarSystem(labeler); if (!disableClustering) { //---- link labeler label control to the NCut output control mainNet->linkControl("PeakLabeler/labeler/mrs_realvec/peakLabels", "FlowThru/clustNet/mrs_realvec/innerOut"); } //*************************************************************** // create PeakViewSink MarSystem and add it to mainNet //*************************************************************** if(peakStore_) { mainNet->addMarSystem(mng.create("PeakViewSink", "peSink")); mainNet->updControl("PeakViewSink/peSink/mrs_string/filename", filePeakName); } //**************************************************************** // Create Synthesis Network //**************************************************************** if(synthetize >-1) { //create Shredder series MarSystem* postNet = mng.create("Series", "postNet"); // postNet->addMarSystem(mng->create("PeOverlapadd", "ob")); if (synthetize < 3) { if(synthetize == 0) { postNet->addMarSystem(mng.create("PeakSynthOsc", "pso")); postNet->addMarSystem(mng.create("Windowing", "wiSyn")); } else { // put a fake object for probing the series postNet->addMarSystem(mng.create("Gain", "fakeGain")); postNet->addMarSystem(mng.create("FlowCutSource", "fcs")); // put the original source if (microphone_) postNet->addMarSystem(mng.create("AudioSource", "srcSyn")); else postNet->addMarSystem(mng.create("SoundFileSource", "srcSyn")); // set the correct buffer size postNet->addMarSystem(mng.create("ShiftInput", "siSyn")); // perform an FFT postNet->addMarSystem(mng.create("Spectrum", "specSyn")); // convert to polar postNet->addMarSystem(mng.create("Cartesian2Polar", "c2p")); // perform amplitude and panning change postNet->addMarSystem(mng.create("PeakSynthFFT", "psf")); // convert back to cartesian postNet->addMarSystem(mng.create("Polar2Cartesian", "p2c")); // perform an IFFT // postNet->addMarSystem(mng.create("PlotSink", "plot")); postNet->addMarSystem(mng.create("InvSpectrum", "invSpecSyn")); // postNet->addMarSystem(mng.create("PlotSink", "plot2")); postNet->addMarSystem(mng.create("Windowing", "wiSyn")); } postNet->addMarSystem(mng.create("OverlapAdd", "ov")); } else { postNet->addMarSystem(mng.create("PeakSynthOscBank", "pso")); // postNet->addMarSystem(mng.create("ShiftOutput", "so")); } postNet->addMarSystem(mng.create("Gain", "outGain")); MarSystem *dest; if (outsfname == "MARSYAS_EMPTY") dest = mng.create("AudioSink/dest"); else { dest = mng.create("SoundFileSink/dest"); //dest->updControl("mrs_string/filename", outsfname); } if(residual_) { MarSystem* fanout = mng.create("Fanout", "fano"); fanout->addMarSystem(dest); MarSystem* fanSeries = mng.create("Series", "fanSeries"); if (microphone_) fanSeries->addMarSystem(mng.create("AudioSource", "src2")); else fanSeries->addMarSystem(mng.create("SoundFileSource", "src2")); fanSeries->addMarSystem(mng.create("Delay", "delay")); fanout->addMarSystem(fanSeries); postNet->addMarSystem(fanout); postNet->addMarSystem(mng.create("PeakResidual", "res")); MarSystem *destRes; if (outsfname == "MARSYAS_EMPTY") destRes = mng.create("AudioSink/destRes"); else { destRes = mng.create("SoundFileSink/destRes"); //dest->updControl("mrs_string/filename", outsfname); } postNet->addMarSystem(destRes); } else postNet->addMarSystem(dest); MarSystem* synthNet = mng.create("Shredder", "synthNet"); synthNet->addMarSystem(postNet); mainNet->addMarSystem(synthNet); //link Shredder nTimes to Accumulator nTimes mainNet->linkControl("Shredder/synthNet/mrs_natural/nTimes", "Accumulator/textWinNet/mrs_natural/nTimes"); } //**************************************************************** //////////////////////////////////////////////////////////////// // update the controls //////////////////////////////////////////////////////////////// //mainNet->updControl("Accumulator/textWinNet/mrs_natural/nTimes", accSize); if (microphone_) { mainNet->updControl("mrs_natural/inSamples", D); mainNet->updControl("mrs_natural/inObservations", 1); } else { mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/SoundFileSource/src/mrs_string/filename", sfName); mainNet->updControl("mrs_natural/inSamples", D); mainNet->updControl("mrs_natural/inObservations", 1); samplingFrequency_ = mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/SoundFileSource/src/mrs_real/osrate")->to<mrs_real>(); } if(noiseName != EMPTYSTRING) { mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/mixseries/SoundFileSource/noise/mrs_string/filename", noiseName); mainNet->updControl("mrs_natural/inSamples", D); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/mixseries/NoiseSource/noise/mrs_string/mode", "rand"); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Seriesmixseries/Delay/noiseDelay/mrs_real/delaySeconds", noiseDelay); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/mixseries/Gain/noiseGain/mrs_real/gain", noiseGain_); } mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/ShiftInput/si/mrs_natural/winSize", Nw+1); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Shifter/sh/mrs_natural/shift", 1); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Windowing/wi/mrs_natural/size", N); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Windowing/wi/mrs_string/type", "Hanning"); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Windowing/wi/mrs_bool/zeroPhasing", true); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkL/Windowing/win/mrs_natural/size", N); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkL/Windowing/win/mrs_string/type", "Hanning"); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkL/Windowing/win/mrs_bool/zeroPhasing", true); // mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkR/Windowing/win/mrs_natural/size", N); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkR/Windowing/win/mrs_string/type", "Hanning"); mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/stereoSpkNet/Parallel/LRnet/Series/spkR/Windowing/win/mrs_bool/zeroPhasing", true); if(unprecise_) mainNet->updControl("PeakConvert/conv/mrs_bool/improvedPrecision", false); else mainNet->updControl("PeakConvert/conv/mrs_bool/improvedPrecision", true); if(noPeakPicking_) mainNet->updControl("PeakConvert/conv/mrs_bool/picking", false); mainNet->updControl("PeakConvert/conv/mrs_natural/frameMaxNumPeaks", S); mainNet->updControl("PeakConvert/conv/mrs_string/frequencyInterval", intervalFrequency); mainNet->updControl("PeakConvert/conv/mrs_natural/nbFramesSkipped", 0);//(N/D)); if (!disableClustering) { mainNet->updControl("FlowThru/clustNet/Series/NCutNet/Fanout/stack/NormCut/NCut/mrs_natural/numClusters", C); mainNet->updControl("FlowThru/clustNet/Series/NCutNet/PeakClusterSelect/clusterSelect/mrs_natural/numClustersToKeep", nbSelectedClusters_); } // //[TODO] // mainNet->setctrl("PeClust/peClust/mrs_natural/selectedClusters", nbSelectedClusters_); // mainNet->setctrl("PeClust/peClust/mrs_natural/hopSize", D); // mainNet->setctrl("PeClust/peClust/mrs_natural/storePeaks", (mrs_natural) peakStore_); // mainNet->updControl("PeClust/peClust/mrs_string/similarityType", T); // // similarityWeight_.stretch(3); // similarityWeight_(0) = 1; // similarityWeight_(1) = 10; //[WTF] // similarityWeight_(2) = 1; // mainNet->updControl("PeClust/peClust/mrs_realvec/similarityWeight", similarityWeight_); if(noiseName != EMPTYSTRING) mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/SoundFileSink/mixSink/mrs_string/filename", mixName); mainNet->update(); //check if input is a stereo signal if(mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/mrs_natural/onObservations")->to<mrs_natural>() == 1) { //if a not a stereo signal, we must set the Stereo2Mono weight to 1.0 (i.e. do no mixing)! mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/Stereo2Mono/s2m/mrs_real/weight", 1.0); } //------------------------------------------------------------------------ //check which similarity computations should be disabled (if any) //------------------------------------------------------------------------ if (!disableClustering) { // Frequency Similarity if(ignoreFrequency) { cout << "** Frequency Similarity Computation disabled!" << endl; mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/disableChild", "Series/freqSim"); } else cout << "** Frequency Similarity Computation enabled!" << endl; // amplitude similarity if(ignoreAmplitude) { cout << "** Amplitude Similarity Computation disabled!" << endl; mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/disableChild", "Series/ampSim"); } else cout << "** Amplitude Similarity Computation enabled!" << endl; // HWPS similarity if(ignoreHWPS) { cout << "** HWPS (harmonicity) Similarity Computation disabled!" << endl; mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/disableChild", "Series/HWPSim"); } else cout << "** HWPS (harmonicity) Similarity Computation enabled!" << endl; // //Panning Similarity if(mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/mrs_natural/onObservations")->to<mrs_natural>() == 2 && !ignorePan) { cout << "** Panning Similarity Computation enabled!" << endl; mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/mrs_string/enableChild", "Series/stereoSpkNet"); mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/enableChild", "Series/panSim"); } else //if not stereo or if stereo to be ignored, disable some branches { cout << "** Panning Similarity Computation disabled!" << endl; mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/mrs_string/disableChild", "Series/stereoSpkNet"); mainNet->updControl("FlowThru/clustNet/FanOutIn/simNet/mrs_string/disableChild", "Series/panSim"); } } else { mainNet->updControl("Accumulator/textWinNet/Series/analysisNet/Series/peakExtract/Fanout/stereoFo/mrs_string/disableChild", "Series/stereoSpkNet"); } // mainNet->update(); //probably not necessary... [!] //------------------------------------------------------------------------ if(noiseDuration_) //[WTF] { ostringstream ossi; ossi << ((noiseDelay_+noiseDuration_)) << "s"; cout << ossi.str() << endl; // touch the gain directly // noiseGain->updControl("0.1s", Repeat("0.1s", 1), new EvValUpd(noiseGain,"mrs_real/gain", 0.0)); } //ONSET DETECTION CONFIGURATION (if enabled) if(useOnsets) { cout << "** Onset detector enabled -> using dynamically adjusted texture windows!" << endl; cout << "WinSize = " << winSize_ << endl; cout << "N = " << N << endl; cout << "Nw = " << Nw << endl; cout << "hopSize = " << hopSize_ << endl; cout << "D = " << D << endl; cout << "fs = " << samplingFrequency_ << endl; //link controls for onset detector onsetdetector->linkControl("Filter/filt2/mrs_realvec/ncoeffs", "Filter/filt1/mrs_realvec/ncoeffs"); onsetdetector->linkControl("Filter/filt2/mrs_realvec/dcoeffs", "Filter/filt1/mrs_realvec/dcoeffs"); //link onset detector to accumulator and if onsets enabled, set "explicitFlush" mode textWinNet->linkControl("mrs_bool/flush", "Series/analysisNet/Series/peakExtract/Fanout/stereoFo/Series/spectrumNet/FlowThru/onsetdetector/PeakerOnset/peaker/mrs_bool/onsetDetected"); //update onset detector controls onsetdetector->updControl("PowerSpectrum/pspk/mrs_string/spectrumType", "wrongdBonsets"); onsetdetector->updControl("Flux/flux/mrs_string/mode", "DixonDAFX06"); realvec bcoeffs(1,3);//configure zero-phase Butterworth filter of Flux time series -> butter(2, 0.28) bcoeffs(0) = 0.1174; bcoeffs(1) = 0.2347; bcoeffs(2) = 0.1174; realvec acoeffs(1,3); acoeffs(0) = 1.0; acoeffs(1) = -0.8252; acoeffs(2) = 0.2946; onsetdetector->updControl("Filter/filt1/mrs_realvec/ncoeffs", bcoeffs); onsetdetector->updControl("Filter/filt1/mrs_realvec/dcoeffs", acoeffs); mrs_natural lookAheadSamples = 6; onsetdetector->updControl("PeakerOnset/peaker/mrs_natural/lookAheadSamples", lookAheadSamples); //!! onsetdetector->updControl("PeakerOnset/peaker/mrs_real/threshold", 1.5); //!!! onsetdetector->updControl("ShiftInput/sif/mrs_natural/winSize", 4*lookAheadSamples+1); //set Accumulator controls for explicit flush mode mrs_natural winds = 1+lookAheadSamples+mrs_natural(ceil(mrs_real(winSize_)/hopSize_/2.0)); cout << "Accumulator/textWinNet timesToKeep = " << winds << endl; mrs_real textureWinMinLen = 0.050; //secs mrs_real textureWinMaxLen = 1.0; //secs mrs_natural minTimes = (mrs_natural)(textureWinMinLen*samplingFrequency_/hopSize_); mrs_natural maxTimes = (mrs_natural)(textureWinMaxLen*samplingFrequency_/hopSize_); cout << "Accumulator/textWinNet MinTimes = " << minTimes << " (i.e. " << textureWinMinLen << " secs)" << endl; cout << "Accumulator/textWinNet MaxTimes = " << maxTimes << " (i.e. " << textureWinMaxLen << " secs)" <<endl; textWinNet->updControl("mrs_string/mode", "explicitFlush"); textWinNet->updControl("mrs_natural/timesToKeep", winds); textWinNet->updControl("mrs_string/mode","explicitFlush"); textWinNet->updControl("mrs_natural/maxTimes", maxTimes); textWinNet->updControl("mrs_natural/minTimes", minTimes); } else { cout << "** Onset detector disabled -> using fixed length texture windows" << endl; cout << "Accumulator/textWinNet nTimes = " << accSize << " (i.e. " << accSize*hopSize_/samplingFrequency_ << " secs)" << endl; mainNet->updControl("Accumulator/textWinNet/mrs_natural/nTimes", accSize); } if(synthetize>-1) { mrs_natural delay = -(winSize_/2 - hopSize_); cout << "Delay = " << delay << endl; if (synthetize < 3) { if(synthetize==0) { mainNet->updControl("Shredder/synthNet/Series/postNet/PeakSynthOsc/pso/mrs_real/samplingFreq", samplingFrequency_); mainNet->updControl("Shredder/synthNet/Series/postNet/PeakSynthOsc/pso/mrs_natural/delay", delay); // Nw/2+1 mainNet->updControl("Shredder/synthNet/Series/postNet/PeakSynthOsc/pso/mrs_natural/synSize", hopSize_*2);//D*2); mainNet->updControl("Shredder/synthNet/Series/postNet/Windowing/wiSyn/mrs_string/type", "Hanning"); // changed the cluster labeling from -1 (don't use) and 0 (use) to negative (don't use) and positive (use) indices mainNet->updControl("Shredder/synthNet/Series/postNet/PeakSynthOsc/pso/mrs_natural/peakGroup2Synth", -1); } else { // linking between the first slice and the psf mainNet->linkControl("Shredder/synthNet/Series/postNet/mrs_realvec/input0", "PeSynthetize/synthNet/Series/postNet/PeakSynthFFT/psf/mrs_realvec/peaks"); // mainNet->updControl("Shredder/synthNet/Series/postNet/Windowing/wiSyn/mrs_string/type", "Hanning"); mainNet->updControl("Shredder/synthNet/Series/postNet/FlowCutSource/fcs/mrs_natural/setSamples", D); mainNet->updControl("Shredder/synthNet/Series/postNet/FlowCutSource/fcs/mrs_natural/setObservations", 1); // setting the panning mode mono/stereo mainNet->updControl("Shredder/synthNet/Series/postNet/PeakSynthFFT/psf/mrs_natural/nbChannels", synthetize_); mainNet->updControl("Shredder/synthNet/Series/postNet/PeakSynthFFT/psf/mrs_string/panning", panningInfo); // setting the FFT size mainNet->updControl("Shredder/synthNet/Series/postNet/ShiftInput/siSyn/mrs_natural/winSize", D*2); // setting the name of the original file if (microphone_) { mainNet->updControl("Shredder/synthNet/Series/postNet/AudioSource/srcSyn/mrs_natural/inSamples", D); mainNet->updControl("Shredder/synthNet/Series/postNet/AudioSource/srcSyn/mrs_natural/inObservations", 1); } else { mainNet->updControl("Shredder/synthNet/Series/postNet/SoundFileSource/srcSyn/mrs_string/filename", sfName); // pvseries->updControl("Shredder/synthNet/Series/postNet/SoundFileSource/srcSyn/mrs_natural/pos", 0); mainNet->updControl("Shredder/synthNet/Series/postNet/SoundFileSource/srcSyn/mrs_natural/onSamples", D); mainNet->updControl("Shredder/synthNet/Series/postNet/SoundFileSource/srcSyn/mrs_natural/onObservations", 1); } // setting the synthesis starting time (default 0) } } //else // mainNet->updControl("Shredder/synthNet/Series/postNet/PeakSynthOscBank/pso/mrs_natural/Interpolation", D); //this control exists?!? [WTF] //mainNet->updControl("Shredder/synthNet/Series/postNet/ShiftOutput/so/mrs_natural/Interpolation", D); //[WTF] if (outsfname == "MARSYAS_EMPTY") mainNet->updControl("Shredder/synthNet/Series/postNet/AudioSink/dest/mrs_natural/bufferSize", bopt_); if(residual_) { mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/fano/Series/fanSeries/Delay/delay/mrs_natural/delay", delay); // Nw+1-D if (microphone_) { mainNet->updControl("PeSynthetize/synthNet/Series/postNet/Fanout/fano/Series/fanSeries/AudioSource/src2/mrs_natural/inSamples", D); mainNet->updControl("PeSynthetize/synthNet/Series/postNet/Fanout/fano/Series/fanSeries/AudioSource/src2/mrs_natural/inObservations", 1); } else { mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/fano/Series/fanSeries/SoundFileSource/src2/mrs_string/filename", sfName); mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/fano/Series/fanSeries/SoundFileSource/src2/mrs_natural/pos", 0); mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/fano/Series/fanSeries/SoundFileSource/src2/mrs_natural/inSamples", D); mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/fano/Series/fanSeries/SoundFileSource/src2/mrs_natural/inObservations", 1); } mainNet->updControl("Shredder/synthNet/Series/postNet/Fanout/fano/SoundFileSink/dest/mrs_string/filename", outsfname);//[!] mainNet->updControl("Shredder/synthNet/Series/postNet/SoundFileSink/destRes/mrs_string/filename", fileResName);//[!] } else mainNet->updControl("Shredder/synthNet/Series/postNet/SoundFileSink/dest/mrs_string/filename", outsfname);//[!] } //*************************************************************************************************************** // MAIN TICKING LOOP //*************************************************************************************************************** //ofstream cfile("density.txt", ios::app); //[WTF] [TODO] mrs_real globalSnr = 0; mrs_natural frameCount = 0; // mrs_real time=0; while(1) { mainNet->tick(); if(synthetize > -1 && residual_) { mrs_real snr = mainNet->getctrl("PeSynthetize/synthNet/Series/postNet/PeakResidual/res/mrs_real/SNR")->to<mrs_real>(); globalSnr += snr; frameCount++; // cout << "Frame " << frameCount << " SNR : "<< snr << endl; } if (!microphone_) { bool temp2 = analysisNet->getctrl("FanOutIn/mixer/Series/oriNet/SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>(); mrs_real timeRead = analysisNet->getctrl("FanOutIn/mixer/Series/oriNet/SoundFileSource/src/mrs_natural/pos")->to<mrs_natural>()/samplingFrequency_; mrs_real timeLeft; if(!stopAnalyse_) timeLeft = analysisNet->getctrl("FanOutIn/mixer/Series/oriNet/SoundFileSource/src/mrs_natural/size")->to<mrs_natural>()/samplingFrequency_; else timeLeft = stopAnalyse_; // string fname = mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/FanOutIn/mixer/Series/oriNet/SoundFileSource/src/mrs_string/filename")->to<mrs_string>(); printf(" %.2f / %.2f \r", timeRead, timeLeft); fflush(stdout); //cout << fixed << setprecision(2) << timeRead << "/" << setprecision(2) << timeLeft; ///*bool*/ temp = mainNet->getctrl("Accumulator/textWinNet/Series/analysisNet/SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>(); //[TODO] // mrs_real density = mainNet->getctrl("PeClust/peClust/mrs_real/clusterDensity")->to<mrs_real>(); // cfile << density << " " << oriGain << endl; // //cout << oriGain << endl; if (temp2 == false || (stopAnalyse_ !=0 && stopAnalyse_<timeRead)) break; } } if(synthetize_ > -1 && residual_) { cout << "Global SNR : " << globalSnr/frameCount << endl; *snr0 = globalSnr/frameCount; } if(peakStore_) { mainNet->updControl("PeakViewSink/peSink/mrs_real/fs", samplingFrequency_); mainNet->updControl("PeakViewSink/peSink/mrs_natural/frameSize", D); mainNet->updControl("PeakViewSink/peSink/mrs_string/filename", filePeakName); mainNet->updControl("PeakViewSink/peSink/mrs_bool/done", true); } //cfile.close(); [TODO] delete mainNet; }