//
// Programmer:    Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Mon Feb  7 20:57:12 PST 2005
// Last Modified: Mon Feb  7 20:57:15 PST 2005
// Filename:      ...sig/examples/all/iweight.cpp
// Web Address:   http://sig.sapp.org/examples/museinfo/humdrum/iweight.cpp
// Syntax:        C++; museinfo
//
// Description:   Generate a set of interval weights from a parameterize
//                spatial configuration of pitches.
//
// Models:      * Diatonic (slightly chromatic) the default method
//              * Single-Angle chromatic --  -t option ranges from 0 degrees
//                to 90 degrees.  0 degrees is equivalent to diatonic model.
//              * Double-Angle chromatic -- -t options is the same as before,
//                --t2 is the secondary angle from -45 to +45 degrees.
//
// 

#include "humdrum.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 the --debug option
double       theta1     = 0.0;  // used with the -t option
double       theta2     = 0.0;  // used with the -u option
int          theta1Q    = 0;    // used with the -t option
int          theta2Q    = 0;    // used with the -u option
double       radius     = 1.0;  // used with the -r option
double       height     = 1.0;  // used with the -h option
int          radiusQ    = 0;    // used with the -r option
int          heightQ    = 0;    // used with the -h option



///////////////////////////////////////////////////////////////////////////

int main(int argc, char* argv[]) {
   // process the command-line options
   checkOptions(options, argc, argv);
   IntervalWeight  iweights;
   if (radiusQ && heightQ) {
      iweights.setSpiral(radius, height);
      cout << "!!!model: Spiral: radius = " << radius;
      cout << " height = " << height << "\n";
   } else if (!theta1Q && !theta2Q) {
      iweights.setDiatonic();
      cout << "!!!model: Diatonic\n";
   } else if (theta1Q && !theta2Q) {
      cout << "!!!model: Chromatic-1: theta = " << theta1;
      cout << "\n";
      iweights.setChromatic1(theta1);
   } else if (theta1Q && theta2Q) {
      cout << "!!!model: Chromatic-2: theta1 = " << theta1;
      cout << " theta2 = " << theta2;
      cout << "\n";
      iweights.setChromatic2(theta1, theta2);
   }
   

   iweights.newprint(cout);

   return 0;
}


///////////////////////////////////////////////////////////////////////////



//////////////////////////////
//
// checkOptions -- validate and process command-line options.
//

void checkOptions(Options& opts, int argc, char* argv[]) {
   opts.define("t|theta|theta1=d:0.0", "theta1 for interval weight cals.");
   opts.define("u|t2|theta2=d:0.0", "theta2 for interval weight calculations");
   opts.define("r|radius=d:1.0", "radius of the Spiral Array");
   opts.define("h|height=d:1.0", "quarter-height of the Spiral Array");

   opts.define("debug=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("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, Feb 2004" << endl;
      exit(0);
   } else if (opts.getBoolean("version")) {
      cout << argv[0] << ", version: 7 Feb 2004" << 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);
   }


   theta1  = opts.getDouble("theta1");
   theta2  = opts.getDouble("theta2");
   theta1Q = opts.getBoolean("theta1");
   theta2Q = opts.getBoolean("theta2");
   radius  = opts.getDouble("radius");
   height  = opts.getDouble("height");
   radiusQ = opts.getBoolean("radius");
   heightQ = opts.getBoolean("height");

}



//////////////////////////////
//
// example -- example usage of the program
//

void example(void) {
   cout <<
   "                                                                        \n"
   << endl;
}



//////////////////////////////
//
// usage -- gives the usage statement for the program
//

void usage(const char* command) {
   cout <<
   "                                                                        \n"
   << endl;
}


// md5sum: 9203439bed9e5f2a0b12c0943d4ce1dd iweights.cpp [20050403]