//
// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Wed Dec 25 13:27:50 PST 2002
// Last Modified: Sun Dec 29 20:36:05 PST 2002
// Filename: ...sig/examples/all/rootspectrum.cpp
// Web Address: http://sig.sapp.org/examples/museinfo/humdrum/rootspectrum.cpp
// Syntax: C++; museinfo
//
// Description: Determine the root of a pitch set according to
// different root-interval class sizes.
//
#include "humdrum.h"
#include <stdio.h>
// function declarations
void checkOptions(Options& opts, int argc, char* argv[]);
void example(void);
void usage(const char* command);
// global variables
Options options; // database for command-line arguments
int debugQ = 0; // used with --debug option
int normQ = 0; // used to print norm scores (1.0 = best)
const char* label = ""; // used for uniq MMA variable names
int functionQ = 1; // used for MMA printing of functions
double theta1 = 55.0; // used for calculating interval weights
int mmaQ = 0; // used with -m option
int invQ = 1; // used with -I option
int xfigQ = 0; // used with -x option
int plotQ = 0; // used with -X option
int displaytype = 0; // used with -5 and -b options
int firstline = -1; // used with -r option
int lastline = -1; // used with -r option
int dataQ = 0; // used with --data option
double dweight = 0.25; // duration weight from -d option
double lweight = 0.25; // metric level weight from -l option
int durationQ = 1; // used with -D option
int levelQ = 1; // used with -M, -L option
int melodyQ = 1; // used with -H option
const char* plottitle = "Root Spectrum"; // used with -t option
IntervalWeight iweights;
RootSpectrum spectrum;
///////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[]) {
// process the command-line options
checkOptions(options, argc, argv);
HumdrumFile infile;
// if no command-line arguments read data file from standard input
if (options.getArgCount() < 1) {
infile.read(cin);
} else {
infile.read(options.getArg(1));
}
if (firstline < 0) {
firstline = 0;
} else if (firstline > infile.getNumLines() - 1) {
firstline = infile.getNumLines() - 1;
}
if ((lastline < 0) || (lastline > infile.getNumLines() - 1)) {
lastline = infile.getNumLines() - 1;
}
spectrum.calculate(iweights, infile, firstline, lastline, debugQ);
if (dataQ) {
exit(0);
}
if (mmaQ) {
spectrum.printMMA(label, cout, functionQ, normQ);
} else if (xfigQ) {
spectrum.printXfig(cout, plottitle, displaytype);
} else if (plotQ) {
spectrum.printPlot(cout, displaytype);
} else {
spectrum.printHumdrum(cout, displaytype, invQ, normQ);
}
return 0;
}
///////////////////////////////////////////////////////////////////////////
//////////////////////////////
//
// checkOptions -- validate and process command-line options.
//
void checkOptions(Options& opts, int argc, char* argv[]) {
opts.define("n|norm=b", "normalize root scores so that best is 1.0");
opts.define("l|label=s", "variable label");
opts.define("t|theta=d:55.0", "theta1 for interval weight calculations");
opts.define("F|no-functions=b", "do not display MMA functions for plotting");
opts.define("w|weightfile=s", "interval weight file");
opts.define("W|display-weights=b", "display interval weights and exit");
opts.define("H|no-non-harmonic=b", "don't do non-harmonic note id");
opts.define("mma=b", "display spectrum as Mathematica plot");
opts.define("x|xfig=b", "display spectrum in xfig format");
opts.define("X|plot=b", "display spectrum in plot (pre-xfig) format");
opts.define("5|fifths=b", "display 2D plots by 5ths");
opts.define("b|best=b", "display 2D plots by best score ordering");
opts.define("I|no-invert=b", "don't invert root scores");
opts.define("T|plot-title|title=s:Root Spectrum", "Title on plot outputs");
opts.define("d|duration-weight=d:0.25", "duration weighting factor");
opts.define("m|metric-weight=d:0.25", "metric level weighting factor");
opts.define("D|duration-weighting-off=b", "turn off duration weighting");
opts.define("M|L|metric-weighting-off=b", "turn off metric weighting");
opts.define("R|rhythm-weighting-off=b", "turn off duration and metric weighting");
opts.define("r|range|lines=s:-1:-1", "range of lines offset from 1 to analyze in file");
opts.define("debug=b", "trace input parsing");
opts.define("data=b", "trace input parsing");
opts.define("author=b", "author of the program");
opts.define("version=b", "compilation information");
opts.define("example=b", "example usage");
opts.define("h|help=b", "short description");
opts.process(argc, argv);
// handle basic options:
if (opts.getBoolean("author")) {
cout << "Written by Craig Stuart Sapp, "
<< "craig@ccrma.stanford.edu, December 2002" << endl;
exit(0);
} else if (opts.getBoolean("version")) {
cout << argv[0] << ", version: 25 December 2002" << endl;
cout << "compiled: " << __DATE__ << endl;
cout << MUSEINFO_VERSION << endl;
exit(0);
} else if (opts.getBoolean("help")) {
usage(opts.getCommand());
exit(0);
} else if (opts.getBoolean("example")) {
example();
exit(0);
}
debugQ = opts.getBoolean("debug");
dataQ = opts.getBoolean("data");
debugQ = debugQ | dataQ;
normQ = opts.getBoolean("norm");
functionQ = !opts.getBoolean("no-functions");
label = opts.getString("label");
theta1 = opts.getDouble("theta");
mmaQ = opts.getBoolean("mma");
plottitle = opts.getString("plot-title");
invQ = !opts.getBoolean("no-invert");
xfigQ = opts.getBoolean("xfig");
plotQ = opts.getBoolean("plot");
lweight = opts.getDouble("metric-weight");
dweight = opts.getDouble("duration-weight");
durationQ = !opts.getBoolean("duration-weighting-off");
levelQ = !opts.getBoolean("metric-weighting-off");
melodyQ = !opts.getBoolean("no-non-harmonic");
if (opts.getBoolean("rhythm-weighting-off")) {
durationQ = 0;
levelQ = 0;
}
// set the spectrum analysis values
spectrum.setDuration(durationQ);
spectrum.setMetricLevel(levelQ);
spectrum.setDurationWeight(dweight);
spectrum.setMetricLevelWeight(lweight);
if (melodyQ) {
spectrum.melodyOn(); // do non-harmonic tone estimation
} else {
spectrum.melodyOff(); // do not do non-harmonic tone estimation
}
if (opts.getBoolean("fifths")) {
displaytype = DISPLAY_CHROMATIC;
} else if (opts.getBoolean("best")) {
displaytype = DISPLAY_BEST;
} else {
displaytype = DISPLAY_DIATONIC;
}
if (opts.getBoolean("weightfile")) {
iweights.setFromFile(opts.getString("weightfile"));
} else {
iweights.setChromatic1(theta1);
}
if (opts.getBoolean("display-weights")) {
cout << iweights;
exit(0);
}
if (opts.getBoolean("range")) {
sscanf(opts.getString("range"), "%d:%d", &firstline, &lastline);
firstline -= 1;
lastline -= 1;
}
}
//////////////////////////////
//
// example -- example usage of the rootspectrum program
//
void example(void) {
cout <<
" \n"
<< endl;
}
//////////////////////////////
//
// usage -- gives the usage statement for the rootspectrum program
//
void usage(const char* command) {
cout <<
" \n"
<< endl;
}
// md5sum: e396096eac176accbe0d550abb22ad5c rootspectrum.cpp [20050403]