// // Programmer: Craig Stuart Sapp // Creation Date: Sun Feb 3 12:03:18 PST 2002 // Last Modified: Sun Aug 29 03:29:24 PDT 2004 (updated for compiling in GCC3) // Filename: ...soundfile/examples/badsplice.cpp // Syntax: C++ // // Description: Demonstration of the SoundFileRead::gotoSample(). // Chops up an input soundfile into little pieces and // splices them together in a random sequence in the // output file. // #include "soundfile.h" #include #ifndef OLDCPP #include using namespace std; #else #include #endif #ifndef VISUAL #include #endif int getRandomInt(int minvalue, int maxvalue); ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { Options options; options.define("n|min=d:0.1 sec", "minimum duration of a splice"); options.define("x|max=d:1.0 sec", "maximum duration of a splice"); options.define("d|duration=d:5.0 sec", "duration of output file"); options.define("q|quiet=b", "supress printed information"); options.process(argc, argv); if (options.getArgCount() != 2) { cout << "Usage: " << options.getCommand() << " [-n min-splice][-x max-splice][-d duration] insound outsound" << endl; exit(1); } SoundFileRead insound(options.getArg(1)); insound.setLoopOn(); SoundFileWrite outsound(options.getArg(2), insound); int channels = insound.getChannels(); int minsamples = (int)(options.getDouble("min") * insound.getSrate() + 0.5); if (minsamples < 1) minsamples = 1; int maxsamples = (int)(options.getDouble("max") * insound.getSrate() + 0.5); if (maxsamples < 1) maxsamples = 1; if (minsamples > maxsamples) { int tempnum = minsamples; minsamples = maxsamples; maxsamples = tempnum; } int totalsamples = (int)(options.getDouble("duration") * insound.getSrate() + 0.5); int quiet = options.getBoolean("quiet"); int i, j; int samplecount = 0; int startsample = 0; int duration = 0; int splice = 0; while (samplecount < totalsamples) { startsample = getRandomInt(0, insound.getSamples()); insound.gotoSample(startsample); duration = getRandomInt(minsamples, maxsamples); if (samplecount + duration > totalsamples) { duration = totalsamples - samplecount; } if (!quiet) { cout << splice++ << '\t' << startsample << '\t' << duration << '\n'; } for (i=0; i