Goto: [ Program Documentation ]
// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Thu May 1 22:57:20 GMT-0800 1997 // Last Modified: Sun May 25 01:24:54 GMT-0800 1997 // Filename: ...sig/doc/examples/sig/sigfile/mix/mix.cpp // Syntax: C++; sig // // Description: mixes two soundfiles together // #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[]) { if (argc != 4) exitUsage(argv[0]); SoundHeader header(argv[1]); float s1, s2, offset; long offsetSamples; cout << "Enter amplitude scaling of file 1: "; cin >> s1; cout << "Enter amplitude scaling of file 2: "; cin >> s2; cout << "Enter the time in seconds of offset of 2nd file: "; cin >> offset; offsetSamples = (long)(offset * header.getSrate() + 0.5); // Elements: SoundFileIn insound1(argv[1]); SoundFileIn insound2(argv[2]); if (insound2.getChannels() == 2) { header.setChannels(2); } SoundFileOut outsound(argv[3], header); Delayline leftDelay(offsetSamples); Delayline rightDelay; Add addLeft; Add addRight; Scale leftScale1(s1); Scale rightScale1(s1); Scale leftScale2(s2); Scale rightScale2(s2); // Connections: leftScale1.connect(insound1); leftScale2.connect(insound2); leftDelay.connect(leftScale2); addLeft.connect(leftScale1); addLeft.connect(leftDelay); outsound.connect(addLeft); if (header.getChannels() == 2) { rightDelay.setDelay(offsetSamples); rightScale1.connect(insound1, 0, 1); rightScale2.connect(insound2, 0, 1); rightDelay.connect(rightScale2); addRight.connect(rightDelay); addRight.connect(rightScale1); outsound.connect(addRight); } long samples1, samples2; samples1 = insound1.getSamples(); samples2 = insound2.getSamples() + offsetSamples; int numSamples = samples1 > samples2 ? samples1 : samples2; Action action; action.tick(outsound, numSamples); return 0; } void exitUsage(const char* command) { cout << endl; cout << "Mixes two soundfiles together. You can adjust the amplitude" << endl; cout << "of each input and the starting time of the second file in" << endl; cout << "the output. If either of the soundfiles is stereo, then the" << endl; cout << "the output will be stereo, and the mono channel will become" << endl; cout << "the left channel." << endl; cout << endl; cout << "Usage: " << command << " insound1 insound2 outsound" << endl; cout << endl; cout << "Program input: " << endl; cout << " (a) amplitude scaling of file 1" << endl; cout << " (b) amplitude scaling of file 2" << endl; cout << " (c) offset time in seconds of second sound file" << endl; cout << endl; exit(1); } // md5sum: 47cae95b3436aaaffc855592faa79c6f mix.cpp [20050403]