// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Fri Mar 29 14:36:58 PDT 2013 // Last Modified: Fri Mar 29 14:37:00 PDT 2013 // Filename: ...museinfo/examples/all/marksim.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/marksim.cpp // Syntax: C++; museinfo // // Description: calculates the minimum timebase which is the least common // multiple of all rhythms in the file. // // Todo: some things to clean up in rhythmic representation due to conversions // from ints to RationalNumber class for rhythms/durations... #include "humdrum.h" /////////////////////////////////////////////////////////////////////////// // function declarations void checkOptions(Options& opts, int argc, char* argv[]); void example(void); void usage(const char* command); void loadInputData(const char* filename, HumdrumFileSet& controlset, HumdrumFileSet& testset); void loadInputData(istream& input, HumdrumFileSet& controlset, HumdrumFileSet& testset); // global variables Options options; // database for command-line arguments int debugQ = 0; /////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { checkOptions(options, argc, argv); HumdrumFileSet controlset; HumdrumFileSet testset; if (options.getArgCount() == 0) { loadInputData(cin, controlset, testset); } else { loadInputData(options.getArg(1), controlset, testset); } cout << "The test set contains: " << testset.getCount() << endl; cout << "The control set contains: " << controlset.getCount() << endl; } /////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // loadInputData -- // void loadInputData(const char* filename, HumdrumFileSet& controlset, HumdrumFileSet& testset) { ifstream input; input.open(filename); if (!input.is_open()) { cerr << "Error: Cannot read input file: " << filename << endl; exit(1); } loadInputData(input, controlset, testset); } void loadInputData(istream& input, HumdrumFileSet& controlset, HumdrumFileSet& testset) { #define READ_CONTROL_SET 0 #define READ_TEST_SET 1 int state = READ_CONTROL_SET; char line[123123] = {0}; input.getline(line, 123123); PerlRegularExpression pre; while (!input.eof()) { if (pre.search(line, "^\\s*#.*control", "i")) { state = READ_CONTROL_SET; input.getline(line, 123123); continue; } if (pre.search(line, "^\\s*#.*test", "i")) { state = READ_TEST_SET; input.getline(line, 123123); continue; } if (pre.search(line, "^\\s*#")) { // ignore comment line. input.getline(line, 123123); continue; } if (pre.search(line, "^\\s*$")) { // ignore blank lines input.getline(line, 123123); continue; } if (state == READ_CONTROL_SET) { controlset.readAppend(line); } else { testset.readAppend(line); } input.getline(line, 123123); } } ////////////////////////////// // // checkOptions -- validate and process command-line options. // void checkOptions(Options& opts, int argc, char* argv[]) { opts.define("debug=b"); // determine bad input line num opts.define("author=b"); // author of program opts.define("version=b"); // compilation info opts.define("example=b"); // example usages 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, April 2011" << endl; exit(0); } else if (opts.getBoolean("version")) { cout << argv[0] << ", version: 22 April 2010" << 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"); } ////////////////////////////// // // 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: 5508455aacf1a63b1fd2370a561645ca marksim.cpp [20130404]