// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Thu Oct 13 01:31:38 PDT 2005 // Last Modified: Thu Oct 13 01:31:44 PDT 2005 // Filename: ...soundfile/examples/extractclick.cpp // Syntax: C++ // // Description: Creates a list of times in milliseconds at which // times the program finds a click in a click track channel. // The click-track channel has digital silence between // the clicks, and the click time is aligned to the // nearest millisecond of the start of the click. // #include "soundfile.h" #include <stdlib.h> #ifndef OLDCPP #include <iostream> #include <fstream> using namespace std; #else #include <iostream.h> #include <fstream.h> #endif void getClickTimes(Array<long>& clicktimes, const char* filename); ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { Options options; options.define("c|channel=i:0","the click track channel"); options.define("r|refraction-time=d:10.0","minimum time btwn clicks in ms"); options.process(argc, argv); int channel = options.getInteger("channel"); const char* inputname = options.getArg(1); SoundFileRead insound(inputname); SoundHeader header = insound; int refraction = (int)(header.getSrate() * options.getDouble("refraction-time") / 1000.0 + 0.5); int i; int rstatus = 0; for (i=0; i<insound.getSamples(); i++) { if (rstatus >= refraction) { rstatus = 0; } if (rstatus) { rstatus++; } else { if (insound.getCurrentSampleDouble(channel) != 0.0) { rstatus = 1; cout << (int)(1000.0 * i / header.getSrate() + 0.5) << "\n"; } } insound.incrementSample(); } return 0; }