bool MslCommandCurrent::execute() { map<string, MarSystem *>::const_iterator iter; cout << endl; cout << "Working set" << endl; cout << "===========" << endl; for (iter=workingSet.begin(); iter != workingSet.end(); ++iter) { MarSystem* tmp = (MarSystem*)iter->second; cout << "MarSystem: \"" << iter->first << "\"" << " of type: " << tmp->getType() << endl; } cout << endl; return true; }
MslModel::~MslModel() { map<string, MarSystem *>::const_iterator iter; for (iter=workingSet.begin(); iter != workingSet.end(); ++iter) { // we actually should only have to delete the most top // level composite marsystem as they take care of // deleting their internal marsystems... here we assume // that there is only one type Series and its the top level. MarSystem* tmp = (MarSystem*)iter->second; string type = tmp->getType(); if (type.compare("Series") == 0) { delete iter->second; } } }
void textract_trainAccumulator(string sfName, mrs_natural offset, mrs_natural duration, mrs_real start, mrs_real length, mrs_real gain, mrs_natural label, string pluginName, string wekafname, mrs_natural memSize, string extractorStr, TimeLine& tline) { MarSystemManager mng; MRSDIAG("sfplay.cpp - sfplay"); // default if (extractorStr == EMPTYSTRING) extractorStr = "STFT"; // Find proper soundfile format and create SignalSource MarSystem *src = mng.create("SoundFileSource", "src"); src->updctrl("mrs_string/filename", sfName); src->updctrl("mrs_natural/inSamples", MRS_DEFAULT_SLICE_NSAMPLES); if (tlineName == EMPTYSTRING) { mrs_natural hops = src->getctrl("mrs_natural/size")->to<mrs_natural>() * src->getctrl("mrs_natural/nChannels")->to<mrs_natural>() / 2048 + 1; tline.regular(100, hops); } MarSystem *dest_; dest_ = mng.create("AudioSink", "dest"); MarSystem *series = mng.create("Series", "playbacknet"); series->addMarSystem(src); series->addMarSystem(dest_); series->updctrl("AudioSink/dest/mrs_natural/nChannels", series->getctrl("SoundFileSource/src/mrs_natural/nChannels")->to<mrs_natural>()); // Calculate duration, offset parameters if necessary if (start > 0.0f) offset = (mrs_natural) (start * src->getctrl("mrs_real/israte")->to<mrs_real>() * src->getctrl("mrs_natural/nChannels")->to<mrs_natural>()); if (length != 30.0f) duration = (mrs_natural) (length * src->getctrl("mrs_real/israte")->to<mrs_real>() * src->getctrl("mrs_natural/nChannels")->to<mrs_natural>()); // accumulate feature vectors over 30 seconds MarSystem* acc = mng.create("Accumulator", "acc"); acc->updctrl("mrs_natural/nTimes", 100); // Calculate windowed power spectrum and then // calculate specific feature sets MarSystem* spectralShape = mng.create("Series", "spectralShape"); spectralShape->addMarSystem(mng.create("Windowing", "hamming")); spectralShape->addMarSystem(mng.create("Spectrum","spk")); spectralShape->addMarSystem(mng.create("PowerSpectrum", "pspk")); spectralShape->updctrl("PowerSpectrum/pspk/mrs_string/spectrumType","power"); // Spectrum Shape descriptors MarSystem* spectrumFeatures = mng.create("Fanout", "spectrumFeatures"); if (extractorStr == "STFT") { spectrumFeatures->addMarSystem(mng.create("Centroid", "cntrd")); spectrumFeatures->addMarSystem(mng.create("Rolloff", "rlf")); spectrumFeatures->addMarSystem(mng.create("Flux", "flux")); } else if (extractorStr == "STFTMFCC") { spectrumFeatures->addMarSystem(mng.create("Centroid", "cntrd")); spectrumFeatures->addMarSystem(mng.create("Rolloff", "rlf")); spectrumFeatures->addMarSystem(mng.create("Flux", "flux")); spectrumFeatures->addMarSystem(mng.create("MFCC", "mfcc")); } else if (extractorStr == "MFCC") spectrumFeatures->addMarSystem(mng.create("MFCC", "mfcc")); else if (extractorStr == "SCF") spectrumFeatures->addMarSystem(mng.create("SCF", "scf")); else if (extractorStr == "SFM") spectrumFeatures->addMarSystem(mng.create("SFM", "sfm")); mng.registerPrototype("SpectrumFeatures", spectrumFeatures->clone()); spectralShape->addMarSystem(mng.create("SpectrumFeatures", "spectrumFeatures")); mng.registerPrototype("SpectralShape", spectralShape->clone()); // add time-domain zerocrossings MarSystem* features = mng.create("Fanout", "features"); features->addMarSystem(mng.create("SpectralShape", "SpectralShape")); if (extractorStr == "STFT") features->addMarSystem(mng.create("ZeroCrossings", "zcrs")); mng.registerPrototype("Features", features->clone()); // Means and standard deviation (statistics) for texture analysis MarSystem* statistics = mng.create("Fanout","statistics"); statistics->addMarSystem(mng.create("Mean", "mn")); statistics->addMarSystem(mng.create("StandardDeviation", "std")); mng.registerPrototype("Statistics", statistics->clone()); // weka output MarSystem *wsink = mng.create("WekaSink","wsink"); // Build the overall feature calculation network MarSystem* featureNetwork = mng.create("Series", "featureNetwork"); featureNetwork->addMarSystem(src->clone()); featureNetwork->addMarSystem(mng.create("Features", "features")); featureNetwork->addMarSystem(mng.create("Memory", "memory")); featureNetwork->updctrl("Memory/memory/mrs_natural/memSize", memSize); featureNetwork->addMarSystem(mng.create("Statistics", "statistics")); // add network to accumulator acc->addMarSystem(featureNetwork->clone()); // Final network compute 30-second statistics MarSystem* total = mng.create("Series", "total"); total->addMarSystem(acc->clone()); total->addMarSystem(mng.create("Statistics", "statistics2")); // total->addMarSystem(mng.create("Mean", "mn2")); total->addMarSystem(wsink->clone()); // update controls total->updctrl("mrs_natural/inSamples", MRS_DEFAULT_SLICE_NSAMPLES); total->updctrl("Accumulator/acc/Series/featureNetwork/" + src->getType() + "/src/mrs_natural/pos", offset); mrs_natural wc = 0; mrs_natural samplesPlayed =0; // main loop for extracting the features string className = ""; total->updctrl("Accumulator/acc/Series/featureNetwork/SoundFileSource/src/mrs_string/filename", sfName); wc = 0; samplesPlayed = 0; total->updctrl("WekaSink/wsink/mrs_natural/nLabels", (mrs_natural)3); if (wekafname == EMPTYSTRING) total->updctrl("WekaSink/wsink/mrs_string/filename", "weka2.arff"); else total->updctrl("WekaSink/wsink/mrs_string/filename", wekafname); // total->tick(); for (int r = 0; r < tline.numRegions(); r++) { cout << "start = " << tline.regionStart(r) << endl; cout << "end = " << tline.regionEnd(r) << endl; total->updctrl("Accumulator/acc/Series/featureNetwork/SoundFileSource/src/mrs_natural/pos", (mrs_natural)tline.regionStart(r) * tline.lineSize()); total->updctrl("mrs_natural/inSamples", tline.lineSize()); if (tlineName == EMPTYSTRING) { if ((tline.regionClass(r) > 0) && (tline.regionClass(r) != 4))//[?] { total->updctrl("WekaSink/wsink/mrs_natural/label", tline.regionClass(r)-1); } } else total->tick(); } if (pluginName == EMPTYSTRING) // output to stdout cout << (*total) << endl; else { ofstream oss(pluginName.c_str()); oss << (*total) << endl; } }
void sfplaygui(Collection l, mrs_natural offset, mrs_natural duration, mrs_real start, mrs_real length, mrs_real gain, string outName) { MarSystemManager mng; string sfName = l.entry(0); MarSystem* src = mng.create("SoundFileSource", "src"); src->updctrl("mrs_string/filename", sfName); Messager* messager =0; messager = new Messager(2,2001); MarSystem *dest; MarSystem *playbacknet = mng.create("Series", "playbacknet"); if (src == NULL) { string errmsg = "Skipping file: " + sfName + " (problem with reading)"; MRSWARN(errmsg); } else { if (outName == EMPTYSTRING) // audio output dest = mng.create("AudioSink", "dest"); else // filename output { dest = mng.create("SoundFileSink", "dest"); dest->updctrl("mrs_string/filename", outName); } // create playback network playbacknet->addMarSystem(src); playbacknet->addMarSystem(mng.create("Gain", "gt")); playbacknet->addMarSystem(dest); int type; mrs_natural i; mrs_natural nChannels = playbacknet->getctrl("SoundFileSource/src/mrs_natural/nChannels")->to<mrs_natural>(); mrs_real srate = playbacknet->getctrl("SoundFileSource/src/mrs_real/israte")->to<mrs_real>(); // playback offset & duration offset = (mrs_natural) (start * srate * nChannels); duration = (mrs_natural) (length * srate * nChannels); for (i=0; i < l.size(); i++) { sfName = l.entry(i); cerr << "[" << start << ":" << (start + length) << "] - [" << offset << ":" << (offset + duration) << "] - " << sfName << "-" << endl; playbacknet->updctrl("SoundFileSource/src/mrs_string/filename", sfName); mrs_natural nChannels = src->getctrl("mrs_natural/nChannels")->to<mrs_natural>(); mrs_real srate = src->getctrl("mrs_real/israte")->to<mrs_real>(); // playback offset & duration offset = (mrs_natural) (start * srate * nChannels); duration = (mrs_natural) (length * srate * nChannels); // udpate controls // playbacknet.updctrl("mrs_natural/inSamples", MRS_DEFAULT_SLICE_NSAMPLES/64); playbacknet->updctrl("mrs_natural/inSamples", 256); playbacknet->updctrl("Gain/gt/mrs_real/gain", gain); playbacknet->updctrl("SoundFileSource/src/mrs_natural/pos", offset); playbacknet->updctrl(dest->getType() + "/dest/mrs_natural/nChannels", src->getctrl("mrs_natural/nChannels")->to<mrs_natural>()); mrs_natural wc=0; mrs_natural samplesPlayed = 0; mrs_natural onSamples = playbacknet->getctrl("mrs_natural/onSamples")->to<mrs_natural>(); string message; bool done = false; while ((playbacknet->getctrl("SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>()) && (duration > samplesPlayed) && !done) { type = messager->nextMessage(); if (type < 0) done = true; else { message = messager->getMessage(); stringstream inss(message); string cname = ""; mrs_real dur; mrs_real val; inss >> cname >> dur >> val; val = val / 100.0; if (cname != "") playbacknet->updctrl(cname,val); } playbacknet->tick(); wc ++; samplesPlayed += onSamples; } cerr << "Played " << wc << " slices of " << onSamples << " samples" << endl; } } // delete messager; }