Goto: [ Program Documentation ]
// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Sun Jan 18 20:37:07 GMT-0800 1998 // Last Modified: Sun Jan 18 20:37:13 GMT-0800 1998 // Filename: ...sig/doc/examples/sig/sigfile/normalize/normalize.cpp // Syntax: C++; sig // // Description: Normalize a soundfile to a given maximum, where 1.0 // is absolute maximum possible without overloading the // sound. // #include "sigAudio.h" #ifndef OLDCPP #include <iostream> using namespace std; #else #include <iostream.h> #endif void exitUsage(const char* command); int main(int argc, char* argv[]) { char *inputfilename = NULL; char *outputfilename = NULL; double newmax = 1.0; int i, j; double max = 0; if (argc == 4) { newmax = atof(argv[1]); inputfilename = argv[2]; outputfilename = argv[3]; } else if (argc == 3) { inputfilename = argv[1]; outputfilename = argv[2]; } else { exitUsage(argv[0]); } SoundHeader header(inputfilename); SoundFileIn findmax(inputfilename); for (i=0; i<header.getSamples(); i++) { for (j=0; j<header.getChannels(); j++) { findmax.action(); if (findmax.output(j) < 0) { if (max < -findmax.output(j)) { max = -findmax.output(j); } } else { if (max < findmax.output(j)) { max = findmax.output(j); } } } } cout << "Maximum amplitude was: " << max << endl; cout << "Rescaling to: " << newmax << endl; if (max == 0) max = 1; // Elements: SoundFileIn insound(inputfilename); Scale scale[insound.getChannels()]; SoundFileOut outsound(outputfilename, header); // Connections: for (i=0; i<insound.getChannels(); i++) { scale[i].setScale(newmax/max); scale[i].connect(insound, 0, i); outsound.connect(scale[i], i, 0); } Action action; action.tick(outsound, header.getSamples()); return 0; } void exitUsage(const char* command) { cout << endl; cout << "Scales a soundfile in relation to its maximum amplitude. Handles an" << endl; cout << "arbitrary number of channels." << endl; cout << endl; cout << "Usage: " << command << " [newMax] insound outsound" << endl; cout << endl; cout << " newMax = floating point value for new maximum sample "<< endl; cout << " value, where 1.0 is maximum for linear samples." << endl; cout << endl; exit(1); } // md5sum: c544259429ca137cb7b6726cb851055e normalize.cpp [20050403]