Goto: [ Program Documentation ]
//
// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Sat Jul 26 16:39:36 GMT-0800 1997
// Last Modified: Sat Jul 26 16:39:39 GMT-0800 1997
// Filename: ...sig/doc/examples/sig/sigfile/disperse/disperse.cpp
// Syntax: C++; sig
//
// Description: Disperses frequencies with a cascade of Allpass1 filters
//
#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[]) {
SoundHeader header;
long numSamples = 0;
char* infilename = "";
char* outfilename = NULL;
float noiseAmp = 0.0;
if (argc == 2) { // no input sound
header.setHighMono();
outfilename = argv[1];
cout << "What amplitude for the noise: [0 .. 1] ";
cin >> noiseAmp;
cout << "How many seconds of noise to use: ";
float temp;
cin >> temp;
numSamples = (long)(temp * 44100);
} else if (argc == 3) { // input file specified
header.setHeader(argv[1]);
header.setChannels(1);
numSamples = header.getSamples() + 10;
outfilename = argv[2];
infilename = argv[1];
} else {
exitUsage(argv[0]);
}
double gain;
cout << "Enter the gain of the allpass filters [-1 .. 1]: ";
cin >> gain;
int numFilters;
cout << "Enter the number of first-order allpass filters to use: ";
cin >> numFilters;
if (numFilters <= 0) {
cerr << "Error: must use a positive number of filters." << endl;
exitUsage(argv[0]);
}
// Elements:
SoundFileIn insound(infilename);
SoundFileOut outsound(outfilename, header);
WhiteNoise noise(noiseAmp);
Allpass1 *filters;
filters = new Allpass1[numFilters];
// Connections:
if (strlen(infilename) == 0) { // use noise
filters[0].setInput(noise);
} else { // use input file
filters[0].setInput(insound);
}
for (int i=1; i<numFilters; i++) {
filters[i].setInput(filters[i-1]);
filters[i].setGain(gain);
}
outsound.connect(filters[numFilters-1]);
int addSamples;
cout << "How many samples to add to at end of input: ";
cin >> addSamples;
int disconnectSample = numSamples;
numSamples += addSamples;
for (int j=0; j<numSamples; j++) {
Tick(outsound);
if (disconnectSample == j) {
filters[0].disconnect(noise);
}
}
return 0;
}
void exitUsage(const char* command) {
cout << endl;
cout <<
"A cascade of first-order allpass filters. Uses whitenoise if no" <<endl;
cout << "input soundfile is specified." << endl;
cout << endl;
cout << "Usage: " << command << " [insound] outsound" << endl;
cout << endl;
cout << "Program input: " << endl;
cout << " (a) amplitude of input noise (if no input sound)" << endl;
cout << " (b) duration of noise in samples (if no input sound)" << endl;
cout << " (c) gain of the first-order allpass filters" << endl;
cout << " (d) number of filters to use" << endl;
cout << " (e) samples to add after input for ringing" << endl;
cout << endl;
exit(1);
}
// md5sum: ff0f425cb822f6efced7339b1c049b74 dispersion.cpp [20050403]