//
// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Tue May 22 12:20:05 PDT 2001
// Last Modified: Tue May 22 12:20:08 PDT 2001
// Filename: ...sig/doc/examples/sig/sigfile/henonsnd/henonsnd.cpp
// Syntax: C++; sig
//
// Description: Generates Henon sequence for hearing by applying
// a filter to held values of the sequence.
//
#include "sigAudio.h"
void checkOptions(Options& opts, int argc, char* argv[]);
void example(void);
void usage(const char* command);
double henonseq(double a, double b);
// Option values
Options options;
double amp; // used with the -amp option
double k; // used with the -k option
double a; // used with the -a option
double b; // used with the -b option
double xstart; // used with the -x option
double ystart; // used with the -y option
int hrate; // used with the -r option
///////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[]) {
checkOptions(options, argc, argv);
// determine how many samples in the output based on the duration
int numSamples;
if (options.getInt("samples") > 0) {
numSamples = options.getInt("samples");
} else {
numSamples = (int)(options.getDouble("duration") * 44100 + 0.5);
}
// prepare for a monophonic output file
SoundHeader header;
header.setHighMono();
// Elements:
Constant henoninput;
Smoother smoother(k);
DCBlock nodc;
Scale scale(amp);
SoundFileOut outsound(options.getArg(1), header);
// Connections:
smoother.connect(henoninput, 0);
nodc.connect(smoother);
scale.connect(nodc);
outsound.connect(scale);
for (int i=0; i<numSamples; i++) {
if (i % hrate == 0) {
henoninput.setValue(henonseq(a, b));
}
Tick(outsound);
}
return 0;
}
///////////////////////////////////////////////////////////////////////////
//////////////////////////////
//
// henonseq -- generate a Henon sequence.
//
double henonseq(double a, double b) {
static double x = 0.0;
static double y = 0.0;
double newx, newy;
newx = 1 + a * x * x + b * y;
newy = x;
x = newx;
y = newy;
return x;
}
//////////////////////////////
//
// checkOptions -- handle command-line options.
//
void checkOptions(Options& opts, int argc, char** argv) {
opts.define("amp=d:1.0", "amplitude scalar");
opts.define("a|alpha|=d:-1.81496", "Henon sequence alpha parameter");
opts.define("b|beta|=d:-0.208661", "Henon sequence beta parameter");
opts.define("r|rate=i:100", "The number of samples to hold sequence");
opts.define("x=d:0.0", "Initial value of x in henon sequence");
opts.define("y=d:0.0", "Initial value of y in henon sequence");
opts.define("k|smooth=d:0.0005", "Filter factor for smoothing filter");
opts.define("d|dur|duration=d:1.0 second");
opts.define("s|samples=i");
opts.define("author=b");
opts.define("version=b");
opts.define("example=b");
opts.define("help=b");
opts.process(argc, argv);
if (opts.getBoolean("author")) {
cout << "Written by Craig Stuart Sapp, "
<< "craig@ccrma.stanford.edu, May 2001" << 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 output filename
if (opts.getArgCount() == 0) {
cout << "Error: need one output file name." << endl;
usage(opts.getCommand());
exit(1);
} else if (opts.getArgCount() > 1) {
cout << "Error: too many arguments. Given "
<< opts.getArgCount() << " but need only 1." << endl;
usage(opts.getCommand());
exit(1);
}
hrate = opts.getInteger("rate");
k = opts.getDouble("k");
amp = opts.getDouble("amp");
a = opts.getDouble("alpha");
b = opts.getDouble("beta");
xstart = opts.getDouble("x");
ystart = opts.getDouble("y");
}
//////////////////////////////
//
// example -- gives example calls to the osc program.
//
void example(void) {
cout <<
"# henonsnd examples: \n"
<< endl;
}
//////////////////////////////
//
// usage -- how to run the osc program on the command line.
//
void usage(const char* command) {
cout <<
" \n"
"Creates an audio rate version of the henon sequence. \n"
" \n"
"Usage: " << command << " [-d duration] outsound \n"
" \n"
"Options: \n"
" -d = duration of the oscillator in seconds (default 1.0). \n"
" -s = duration in samples. Overrides the -d option (default null) \n"
" --options = list of all options, aliases and default values. \n"
" \n"
" \n"
<< endl;
}
// md5sum: 8631f350f793e91aafa180b3be41ff76 henonsnd.cpp [20050403]