예제 #1
0
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;
}
예제 #2
0
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;
}