// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Wed Oct 16 20:20:04 PDT 2002 // Last Modified: Wed Oct 16 20:20:08 PDT 2002 // Filename: ...sig/doc/examples/sig/sigfile/wavetrans/wavetrans.cpp // Syntax: C++; sig // // Description: Transpose a soundfile by wavetable interpolation. // #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); // command line variables: double transpose = 0; // used with the -t option double repeat = 1; // used with the -r option double backwardQ = 0; // used with the -b option /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { Options options(argc, argv); checkOptions(options); SoundHeader header(options.getArg(1)); header.setChannels(1); // only producing mono wavefile outputs // Elements: WaveTable wavetable; SoundFileOut outsound(options.getArg(2), header); Constant transvaal(transpose); Multiply multiply; if (backwardQ) { wavetable.reverse(); repeat += 1; // first reversal will add 1 to repeat } wavetable.setTableFromFile(options.getArg(1)); if (options.getBoolean("constant")) { wavetable.setConstantInterp(); } else { wavetable.setLinearInterp(); } // Connections: wavetable.connect(transvaal); outsound.connect(wavetable); int i; for (i=0; i<2000000000; i++) { outsound.tick(i); if (wavetable.getRepeat() >= repeat) { break; } } return 0; } /////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // checkOptions -- handle command-line options. // void checkOptions(Options& opts) { opts.define("t|transpose=d:0", "transposition in semitones"); opts.define("c|constant=b", "constant or linear interpretation"); opts.define("r|repeat=i:1", "number of repetitions of input soundfile"); opts.define("b|backwards|backward|reverse=b", "reverse soundfile"); 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, Oct 2002" << 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); } // can only have one input and one output filename if (opts.getArgCount() > 2 || opts.getArgCount() < 2) { cout << "Error: need exactly 2 arguments, but got " << opts.getArgCount() << " arguments." << endl; usage(opts.getCommand()); exit(1); } transpose = opts.getDouble("transpose"); repeat = opts.getInteger("repeat"); backwardQ = opts.getBoolean("backwards"); } ////////////////////////////// // // example -- gives example calls to the osc program. // void example(void) { cout << "# wavetrans examples: \n" << endl; } ////////////////////////////// // // usage -- how to run the osc program on the command line. // void usage(const char* command) { cout << " \n" "Simple transposition of a soundfile. \n" " \n" "Usage: " << command << " [-t transpose][-r repeat][-b] insound outsound \n" " \n" "Options: \n" " -s = duration in samples. Overrides the -d option (default null) \n" " -t = transposition in semitones \n" " -b = play sound backwards \n" " --options = list of all options, aliases and default values. \n" " \n" " \n" << endl; } // md5sum: ade42b3e38780623f2bc2601e0b01626 wavetrans.cpp [20050403]