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; }
// thread code void* run(void * arg) { thread_data* data = (thread_data*) arg; MarSystemManager mng; NetworkTCPSource* src = new NetworkTCPSource("src"); MarSystem* featureNetwork = mng.create("Series", "featureNetwork"); featureNetwork->addMarSystem(src); featureNetwork->addMarSystem(mng.create("AudioSink", "sink")); // featureNetwork->addMarSystem(mng.create("PlotSink", "psink")); featureNetwork->updctrl("NetworkTCPSource/src/mrs_natural/dataPort", data->dataPort); featureNetwork->updctrl("NetworkTCPSource/src/mrs_natural/controlsPort", data->controlsPort); featureNetwork->linkctrl("mrs_bool/hasData", "NetworkTCPSource/src/mrs_bool/hasData"); src->refresh(); mrs_natural wc = 0; mrs_real* controls = 0; mrs_natural onSamples = featureNetwork->getctrl("mrs_natural/onSamples")->to<mrs_natural>(); // start the network while ( featureNetwork->getctrl("mrs_bool/hasData")->to<mrs_bool>() ) { try { controls = featureNetwork->recvControls(); if ( controls != 0 ) { // get some reference controls, so if they have changed we update them mrs_natural inSamples = featureNetwork->getctrl("mrs_natural/inSamples")->to<mrs_natural>(); mrs_natural inObservations = featureNetwork->getctrl("mrs_natural/inObservations")->to<mrs_natural>(); mrs_real israte = featureNetwork->getctrl("mrs_real/israte")->to<mrs_real>(); if ( (mrs_natural)controls[1] != inSamples || (mrs_natural)controls[2] != inObservations || controls[3] != israte ) { featureNetwork->updctrl("mrs_natural/inSamples", (mrs_natural)controls[1]); featureNetwork->updctrl("mrs_natural/inObservations", (mrs_natural)controls[2]); featureNetwork->updctrl("mrs_real/israte", controls[3]); } } featureNetwork->tick(); // everything happens here } catch ( SocketException e ) { cerr << "Played " << wc << " slices of " << onSamples << " samples" << endl; pthread_exit(NULL); } wc++; } cout << "played - " << wc << " slices of " << onSamples << " samples" << endl; pthread_exit( NULL ); }
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; }
void TranscriberExtract::getAllFromAudio(const std::string audioFilename, realvec& pitchList, realvec& ampList, realvec& boundaries) { MarSystem* pitchSink = mng.create("RealvecSink", "pitchSink"); MarSystem* ampSink = mng.create("RealvecSink", "ampSink"); MarSystem* pnet = mng.create("Series", "pnet"); mrs_real srate = addFileSource(pnet, audioFilename); // TODO: double the number of observations? // pnet->updControl("SoundFileSource/src/mrs_natural/inSamples",256); // pnet->addMarSystem(mng.create("ShiftInput", "shift")); // pnet->updControl("ShiftInput/shift/mrs_natural/winSize",512); MarSystem* fanout = mng.create("Fanout", "fanout"); fanout->addMarSystem(makePitchNet(srate, 100.0, pitchSink)); fanout->addMarSystem(makeAmplitudeNet(ampSink)); pnet->addMarSystem(fanout); while ( pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>() ) pnet->tick(); pitchList = getPitchesFromRealvecSink(pitchSink, srate); ampList = getAmpsFromRealvecSink(ampSink); boundaries.create(2); boundaries(0) = 0; boundaries(1) = pitchList.getSize(); delete pnet; }
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(); } }
// 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; }
MarsyasBExtractRolloff::MarsyasBExtractRolloff(float inputSampleRate) : Plugin(inputSampleRate), m_stepSize(0), m_previousSample(0.f), m_network(0) { MarSystemManager mng; // Overall extraction and classification network m_network = mng.create("Series", "mainNetwork"); // Build the overall feature calculation network MarSystem *featureNetwork = mng.create("Series", "featureNetwork"); // Add a realvec as the source featureNetwork->addMarSystem(mng.create("RealvecSource", "src")); // Convert the data to mono featureNetwork->addMarSystem(mng.create("Stereo2Mono", "m2s")); // Setup the feature extractor MarSystem* featExtractor = mng.create("TimbreFeatures", "featExtractor"); featExtractor->updctrl("mrs_string/enableSPChild", "Rolloff/rlf"); featureNetwork->addMarSystem(featExtractor); // Add the featureNetwork to the main network m_network->addMarSystem(featureNetwork); }
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; }
void newMidiInfo() { /* This function describes using the MidiInput object and MarControlPointers to read midi controls in a loop. The disadvantage of this approach is that MidiINput will only return the last midi value between buffers. Change the buffer size you would like more precision and throughput for midi messages. */ MarSystemManager mng; MarSystem* series = mng.create("Series", "series"); series->addMarSystem(mng.create("AudioSource","src")); series->addMarSystem(mng.create("MidiInput","midiin")); series->updctrl("mrs_real/israte", 44100.0); series->updctrl("mrs_real/osrate", 44100.0); // to change how often marsyas grabs messages change the buffersize series->updctrl("AudioSource/src/mrs_natural/bufferSize", 64); series->updctrl("AudioSource/src/mrs_bool/initAudio",true); series->updctrl("MidiInput/midiin/mrs_bool/initmidi",true); MarControlPtr b1 = series->getctrl("MidiInput/midiin/mrs_natural/byte1"); MarControlPtr b2 = series->getctrl("MidiInput/midiin/mrs_natural/byte2"); MarControlPtr b3 = series->getctrl("MidiInput/midiin/mrs_natural/byte3"); while(1) { const mrs_natural& byte1 = b1->to<mrs_natural>(); const mrs_natural& byte2 = b2->to<mrs_natural>(); const mrs_natural& byte3 = b3->to<mrs_natural>(); std::cout << "Byte 1: " << byte1 << " Byte 2: " << byte2 << " Byte 3: " << byte3 << endl; series->tick(); } }
// ********************** 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 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; }
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); }
void MarOscMultiGainWindow::createNetwork(string fileName1,string fileName2,string fileName3) { MarSystemManager mng; // create the overall network net_ = mng.create("Series", "net"); MarSystem* fanout = mng.create("Fanout", "fanout"); net_->addMarSystem(fanout); MarSystem* series1 = mng.create("Series", "series1"); MarSystem* series2 = mng.create("Series", "series2"); MarSystem* series3 = mng.create("Series", "series3"); series1->addMarSystem(mng.create("SoundFileSource", "src")); series1->addMarSystem(mng.create("Gain", "gain")); series2->addMarSystem(mng.create("SoundFileSource", "src")); series2->addMarSystem(mng.create("Gain", "gain")); series3->addMarSystem(mng.create("SoundFileSource", "src")); series3->addMarSystem(mng.create("Gain", "gain")); fanout->addMarSystem(series1); fanout->addMarSystem(series2); fanout->addMarSystem(series3); net_->addMarSystem(mng.create("Sum", "sum")); MarSystem* dest = mng.create("AudioSink", "dest"); net_->addMarSystem(dest); mwr_ = new MarSystemQtWrapper(net_, true); initPtr_ = mwr_->getctrl("AudioSink/dest/mrs_bool/initAudio"); fname1Ptr_ = mwr_->getctrl("Fanout/fanout/Series/series1/SoundFileSource/src/mrs_string/filename"); fname2Ptr_ = mwr_->getctrl("Fanout/fanout/Series/series2/SoundFileSource/src/mrs_string/filename"); fname3Ptr_ = mwr_->getctrl("Fanout/fanout/Series/series3/SoundFileSource/src/mrs_string/filename"); gain1Ptr_ = mwr_->getctrl("Fanout/fanout/Series/series1/Gain/gain/mrs_real/gain"); gain2Ptr_ = mwr_->getctrl("Fanout/fanout/Series/series2/Gain/gain/mrs_real/gain"); gain3Ptr_ = mwr_->getctrl("Fanout/fanout/Series/series3/Gain/gain/mrs_real/gain"); mwr_->updctrl("Fanout/fanout/Series/series1/Gain/gain/mrs_real/gain",0.0); mwr_->updctrl("Fanout/fanout/Series/series2/Gain/gain/mrs_real/gain",0.0); mwr_->updctrl("Fanout/fanout/Series/series3/Gain/gain/mrs_real/gain",0.0); mwr_->updctrl("Fanout/fanout/Series/series1/SoundFileSource/src/mrs_real/repetitions",-1.0); mwr_->updctrl("Fanout/fanout/Series/series2/SoundFileSource/src/mrs_real/repetitions",-1.0); mwr_->updctrl("Fanout/fanout/Series/series3/SoundFileSource/src/mrs_real/repetitions",-1.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; }
mrs_real TranscriberExtract::getNormalizingGain(const std::string audioFilename) { mrs_real maxVal = 0.0; MarSystem* pnet = mng.create("Series", "pnet"); addFileSource(pnet, audioFilename); // forces Marsyas to write to processedData pnet->addMarSystem(mng.create("Gain", "null")); while ( pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>() ) { pnet->tick(); const realvec& processedData = pnet->getctrl("SoundFileSource/src/mrs_realvec/processedData")->to<mrs_realvec>(); for (mrs_natural i=0; i< processedData.getSize(); ++i) { mrs_real val = fabs(processedData(i)); if (val > maxVal) maxVal = val; } } delete pnet; return 1.0/maxVal; }
// 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 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; }
// take advantage of MarSystemManager void tempotest_sfplay(string sfName) { cout << "Playing " << sfName << endl; MarSystemManager mng; // Create a series Composite MarSystem* series = mng.create("Series", "series"); series->addMarSystem(mng.create("SoundFileSource", "src")); series->addMarSystem(mng.create("AudioSink", "dest")); // only update controls from Composite level series->updctrl("mrs_natural/inSamples", 128); series->updctrl("SoundFileSource/src/mrs_string/filename", sfName); while (series->getctrl("SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>()) series->tick(); delete series; }
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 basic_negative(string infile, string outfile) { MarSystem* pnet = mng.create("Series", "pnet"); addSource( pnet, infile ); pnet->addMarSystem(mng.create("Negative", "inv")); addDest( pnet, outfile); while (pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>()) { pnet->tick(); } delete pnet; }
void basic_shifter(string infile, string outfile) { MarSystem* pnet = mng.create("Series", "pnet"); addSource( pnet, infile ); pnet->addMarSystem(mng.create("Shifter", "shift")); pnet->updctrl("Shifter/shift/mrs_natural/shift", 16); addDest( pnet, outfile); while (pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>()) { pnet->tick(); } delete pnet; }
// TODO: move void basic_vibrato(string infile, string outfile) { MarSystem* pnet = mng.create("Series", "pnet"); addSource( pnet, infile ); pnet->addMarSystem(mng.create("Vibrato", "vib")); addDest( pnet, outfile); pnet->updctrl("Vibrato/vib/mrs_real/mod_freq", 10.0); while (pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>()) { pnet->tick(); } delete pnet; }
void basic_windowing(string infile, string outfile) { MarSystem* pnet = mng.create("Series", "pnet"); addSource( pnet, infile ); pnet->addMarSystem(mng.create("Windowing", "win")); pnet->updctrl("Windowing/win/mrs_string/type", "Hanning"); addDest( pnet, outfile); while (pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>()) { pnet->tick(); } delete pnet; }
void basic_delay(string infile, string outfile) { MarSystem* pnet = mng.create("Series", "pnet"); addSource( pnet, infile ); pnet->addMarSystem(mng.create("Delay", "delay")); pnet->updctrl("Delay/delay/mrs_natural/delaySamples", 16); pnet->updctrl("Delay/delay/mrs_real/feedback", (mrs_real) 0.5); addDest( pnet, outfile); while (pnet->getctrl("mrs_bool/hasData")->to<mrs_bool>()) { pnet->tick(); } delete pnet; }
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 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; }
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 centroidToTxt(string sfName1) { cout << "Toy with centroid " << sfName1 << endl; MarSystemManager mng; MarSystem* net = mng.create("Series/net"); net->addMarSystem(mng.create("SoundFileSource/src")); net->addMarSystem(mng.create("Windowing/ham")); net->addMarSystem(mng.create("Spectrum/spk")); net->addMarSystem(mng.create("PowerSpectrum/pspk")); net->addMarSystem(mng.create("Centroid/cntrd")); net->addMarSystem(mng.create("Memory/mem")); net->addMarSystem(mng.create("Mean/mean")); net->linkctrl("mrs_string/filename", "SoundFileSource/src/mrs_string/filename"); net->updctrl("mrs_string/filename", sfName1); mrs_real val = 0.0; ofstream ofs; ofs.open("centroid.mpl"); ofs << *net << endl; ofs.close(); ofstream text; text.open("centroid.txt"); while (net->getctrl("SoundFileSource/src/mrs_bool/hasData")->to<mrs_bool>()) { net->tick(); const mrs_realvec& src_data = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>(); val = src_data(0,0); text << val << endl; //cout << val << endl; } text.close(); }