// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Wed Oct 22 16:33:21 PDT 2008 // Last Modified: Wed Oct 22 16:33:25 PDT 2008 // Filename: ...sig/examples/all/hum2allegro.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/hum2allegro.cpp // Syntax: C++; museinfo // // Description: Converts a Humdrum file into Allegro data. // #include "humdrum.h" #include <string.h> #include <ctype.h> #include <stdio.h> #ifndef OLDCPP #include <iostream> #else #include <iostream.h> #endif #ifndef VISUAL #include <time.h> #endif #define TOLERANCE 0.00001 // function declarations: void checkOptions(Options& opts, int argc, char** argv); void example(void); void usage(const char* command); void convertToAllegro(ostream& out, HumdrumFile& infile); void printKernTokenData(ostream& out, HumdrumFile& infile, int row, int col, int& outputcounter, int& currentbeat, int measurenum); // User interface variables: Options options; int beatQ = 0; // used with -b option double beatduration = 1.0; // used with -b option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { checkOptions(options, argc, argv); // process the command-line options HumdrumFile infile(options.getArg(1)); infile.analyzeRhythm("4"); convertToAllegro(std::cout, infile); return 0; } ////////////////////////////////////////////////////////////////////////// /////////////////////////////// // // convertToAllegro -- // void convertToAllegro(ostream& out, HumdrumFile& infile) { int i, j; int measurenum = -1; int outputcounter = 0; int currentbeat = -100; for (i=0; i<infile.getNumLines(); i++) { if (infile[i].getType() == E_humrec_data_measure) { sscanf(infile[i][0], "=%d", &measurenum); } if (infile[i].getType() != E_humrec_data) { continue; } for (j=0; j<infile[i].getFieldCount(); j++) { if (infile[i].getExInterpNum(j) != E_KERN_EXINT) { continue; } printKernTokenData(out, infile, i, j, outputcounter, currentbeat, measurenum); } } } /////////////////////////////// // // printKernTokenData -- // void printKernTokenData(ostream& out, HumdrumFile& infile, int row, int col, int& outputcounter, int& currentbeat, int measurenum) { if (strcmp(infile[row][col], ".") == 0) { // ignore null tokens return; } if (strchr(infile[row][col], 'r') != NULL) { // ignore rests return; } double startbeat = infile[row].getAbsBeat(); double duration; double beatnum = startbeat / beatduration; double fraction = beatnum - (int)beatnum; char buffer[1024] = {0}; int track = infile[row].getPrimaryTrack(col); int count = infile[row].getTokenCount(col); int midinote; int i; int tempbeat; for (i=0; i<count; i++) { infile[row].getToken(buffer, col, i); if (strchr(buffer, '_') != NULL) { // ignore middles of tied note groups continue; } if (strchr(buffer, ']') != NULL) { // ignore ends of tied note groups continue; } if (strchr(buffer, '[') != NULL) { duration = infile.getTiedDuration(row, col, i); } else { duration = Convert::kernToDuration(buffer); } outputcounter++; if (!beatQ) { out << outputcounter; out << " " << track; midinote = Convert::kernToMidiNoteNumber(buffer); out << " " << midinote; out << " " << 64; out << " " << int(startbeat * 1000.0 + 0.5)/1000.0; out << " " << int(duration * 1000.0 + 0.5)/1000.0; out << endl; } else { if ((fraction < TOLERANCE) || (1-fraction < TOLERANCE)) { tempbeat = int(beatnum + 0.5); if (tempbeat != currentbeat) { currentbeat = tempbeat; out << outputcounter; out << " " << currentbeat; out << " " << measurenum; out << " " << (infile.getBeat(row)-1) / beatduration + 1; out << endl; } } } } } /////////////////////////////// // // checkOptions -- // void checkOptions(Options& opts, int argc, char* argv[]) { opts.define("b|beat=s:4", "extract list of notes which occur at beat times"); 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, Oct 2008" << endl; exit(0); } else if (opts.getBoolean("version")) { cout << argv[0] << ", version: 22 Oct 2008" << 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); } beatQ = opts.getBoolean("beat"); beatduration = Convert::kernToDuration(opts.getString("beat")); } ////////////////////////////// // // example -- // void example(void) { } ////////////////////////////// // // usage -- // void usage(const char* command) { } // md5sum: 8f7e2ed4ebe7da117e0dff81cd339459 hum2allegro.cpp [20081027]