Goto: [ Program Documentation ]
// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Thu May 1 11:57:59 GMT-0800 1997 // Last Modified: Thu Apr 16 21:25:54 PDT 1998 // Filename: ...sig/doc/examples/sig/sigfile/concatenate/concatenate.cpp // Syntax: C++; sig // // Description: combine soundfiles serially into one output file. // Strings together any number of soundfiles sequentially into one output // file. Blank space can be specified between soundfiles in output. If // any input sound is a stereo file, then the output soundfile will be // stereo, and any mono files will duplicate their channels into both the // left and right of the output soundfile. // // Usage: concatenate [-q][-s samples | -t time] insound(s) outsound // // Options: // -s = the number of blank samples to add between input soundfiles // -t = the time in seconds of blank samples to add between input // soundfiles. Overrides the -s option. Sampling rate of the // first soundfile is used to calculate blank gap. // -q = quiet mode. Do not display message as each soundfile is read. // --options = list of all options, aliases and defaults // #include "sigAudio.h" #include <stdlib.h> #ifndef OLDCPP #include <iostream> using namespace std; #else #include <iostream.h> #endif void checkOptions(Options& opts); void example(void); void usage(const char* command); /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { Options options(argc, argv); checkOptions(options); // determine how many samples of silence to add between soundfiles int numBlankSamples; SoundHeader header; header.setHeader(options.getArg(1)); if (options.getInt("time") > 0) { numBlankSamples = (int)(options.getDouble("time") * header.getSrate() + 0.5); } else if (options.getInt("samples") > 0) { numBlankSamples = options.getInt("samples"); } else { numBlankSamples = 0; } int numInSounds = options.getArgCount() - 1; // check to see if there is a stereo file in the list of soundfiles int i; int chan = 1; for (i=0; i<numInSounds; i++) { header.setHeader(options.getArg(i+1)); if (header.getChannels() == 2) { chan = 2; break; } } header.setChannels(chan); // Elements SoundFileOut outsound(options.getArg(numInSounds + 1), header); SoundFileIn insound; Constant silence(0); Action action; for (i=0; i<numInSounds; i++) { insound.setFile(options.getArg(i+1)); outsound.connect(insound, 0); if (chan == 2) { if (insound.getChannels() == 2) { outsound.connect(insound, 1, 1); } else { // duplicate mono input channel if a stereo output outsound.connect(insound, 1, 0); } } if (!options.getBoolean("quiet")) { cout << "Reading sound " << options.getArg(i+1) << " which has " << insound.getSamples() << " samples." << endl; } // copy the soundfile to the output soundfile action.tick(outsound, insound.getSamples()); if (i < numInSounds-1) { outsound.connect(silence, 0); if (chan == 2) { outsound.connect(silence, 0, 1); } action.tick(outsound, numBlankSamples); } } return 0; } /////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // checkOptions -- handle command-line options. // void checkOptions(Options& opts) { opts.define("t|time=d"); opts.define("s|samples=i:0 samples"); opts.define("q|quiet=b"); opts.define("author=b"); opts.define("version=b"); opts.define("example=b"); opts.define("help=b"); opts.process(); if (opts.getBoolean("author")) { cout << "Written by Craig Stuart Sapp, " << "craig@ccrma.stanford.edu, May 1997" << endl; exit(0); } if (opts.getBoolean("version")) { cout << "compiled: " << __DATE__ << endl; cout << SIG_VERSION << endl; exit(0); } if (opts.getBoolean("help")) { usage(opts.getCommand()); exit(0); } if (opts.getBoolean("example")) { example(); exit(0); } // must have at least two sound filenames if (opts.getArgCount() < 2) { cout << "Error: need at least one input soundfile." << endl; usage(opts.getCommand()); exit(1); } } ////////////////////////////// // // example -- gives example calls to the concatenate program. // void example(void) { cout << " \n" "# concatenate examples: \n" "# Makes a soundfile with all of the system sounds (on a NeXT computer).\n" " concatenate -s 3000 /NextLibrary/Sounds/*.snd all.snd \n" << endl; } ////////////////////////////// // // usage -- how to run the concatenate program on the command line. // void usage(const char* command) { cout << " \n" "Strings together any number of soundfiles sequentially into one output \n" "file. Blank space can be specified between soundfiles in output. If \n" "any input sound is a stereo file, then the output soundfile will be \n" "stereo, and any mono files will duplicate their channels into both the \n" "left and right of the output soundfile. \n" " \n" "Usage: " << command << " [-q][-s samples | -t time] insound(s) outsound \n" " \n" "Options: \n" " -s = the number of blank samples to add between input soundfiles \n" " -t = the time in seconds of blank samples to add between input \n" " soundfiles. Overrides the -s option. Sampling rate of the \n" " first soundfile is used to calculate blank gap. \n" " -q = quiet mode. Do not display message as each soundfile is read. \n" " --options = list of all options, aliases and defaults \n" " \n" " \n" << endl; } // md5sum: 0e64e5127d8c75d7c4bb154ff99e290d concatenate.cpp [20050403]