// // Programmer: Craig Stuart Sapp // Creation Date: Sat Sep 20 06:35:45 PDT 2008 // Last Modified: Sat Sep 20 06:36:19 PDT 2008 // Filename: ...museinfo/examples/all/koto2xml.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/koto2xml.cpp // Syntax: C++; museinfo // // Description: Convert **koto data into MEI XML and MusicXML. // #include "humdrum.h" #define MEIXML 1 #define MUSICXML 2 // function declarations void printTabs (ostream& outstream, int count); void example (void); void usage (const char* command); void checkOptions (Options& opts, int argc, char* argv[]); void processHumdrumFile (HumdrumFile& infile, int outputType); // MEI XML functions: void printMeiXml (ostream& outstream, HumdrumFile& infile); void printMeiHeader (ostream& outstream, HumdrumFile& infile, int level); void printMeiWork (ostream& outstream, HumdrumFile& infile, int level); void printMeiKotoPart (ostream& outstream, HumdrumFile& infile, int spine, int level); void printMeiMeasure (ostream& outstream, HumdrumFile& infile, int spine, int start, int level); void printMeiNoteData (ostream& outstream, const char* string, int level); void printMeiChordData (ostream& outstream, HumdrumFile& infile, int spine, int line, int level); void printMeiPitch (ostream& outstream, int pitch); void printMeiRhythm (ostream& outstream, const char* data); // MusicXML functions: void printMusicXml (ostream& outstream, HumdrumFile& infile); // Shared functions: char* getTitle (char* buffer, int buffsize, HumdrumFile& infile); void printEncodedString (ostream& outstream, char* buffer); int checkForTune (int* mapping, HumdrumRecord& arecord, int spine); int getKotoString (const char* data); int getRhythm (const char* data); int getDots (const char* data); // User interface variables: Options options; int meiQ = 1; // default behavior int musicxmlQ = 0; // convert to MusicXML int STRINGMAPPING[21] = {0}; int main(int argc, char** argv) { HumdrumFile infile; // process the command-line options checkOptions(options, argc, argv); // figure out the number of input files to process int numinputs = options.getArgCount(); for (int i=0; i" << "\n"; outstream << "' << '\n'; outstream << "\n"; int level = 1; printMeiHeader(outstream, infile, level); printMeiWork(outstream, infile, level); outstream << "\n"; } ////////////////////////////// // // printMeiHeader -- // void printMeiHeader(ostream& outstream, HumdrumFile& infile, int level) { #define BUFFSIZE 10000 char buffer[BUFFSIZE]; printTabs(outstream, level); outstream << "" << "\n"; printTabs(outstream, level+1); outstream << "" << "\n"; printTabs(outstream, level+2); outstream << "" << "\n"; getTitle(buffer, BUFFSIZE, infile); if (strlen(buffer) == 0) { printTabs(outstream, level+3); outstream << "\n"; } else { printTabs(outstream, level+3); outstream << "<title>"; printEncodedString(outstream, buffer); outstream << "\n"; } printTabs(outstream, level+2); outstream << "" << "\n"; printTabs(outstream, level+2); outstream << "" << "\n"; printTabs(outstream, level+1); outstream << "" << "\n"; printTabs(outstream, level); outstream << "" << "\n"; } ////////////////////////////// // // printMeiWork -- // void printMeiWork(ostream& outstream, HumdrumFile& infile, int level) { printTabs(outstream, level ); outstream << "" << "\n"; printTabs(outstream, level+1); outstream << "" << "\n"; printTabs(outstream, level+2); outstream << "" << "\n"; printTabs(outstream, level+3); outstream << "" << "\n"; printTabs(outstream, level+4); outstream << "" << "\n"; printTabs(outstream, level+5); outstream << "" << "\n"; printTabs(outstream, level+4); outstream << "" << "\n"; printMeiKotoPart(outstream, infile, 0, level+4); printTabs(outstream, level+3); outstream << "" << "\n"; printTabs(outstream, level+2); outstream << "" << "\n"; printTabs(outstream, level+1); outstream << "" << "\n"; printTabs(outstream, level ); outstream << "" << "\n"; } ////////////////////////////// // // printMeiKotoPart -- // void printMeiKotoPart(ostream& outstream, HumdrumFile& infile, int spine, int level) { int i; for (i=0; i" << "\n"; printTabs(outstream, level+1); outstream << "" << "\n"; start++; for (i=start; i" << "\n"; printTabs(outstream, level); outstream << "" << "\n"; // perhaps return the new line here for processing next measure } ////////////////////////////// // // printMeiChordData -- // void printMeiChordData(ostream& outstream, HumdrumFile& infile, int spine, int line, int level) { int tokencount = infile[line].getTokenCount(spine); if (tokencount < 1) { return; } if (tokencount == 1) { // a single note printMeiNoteData(outstream, infile[line][spine], level); return; } // print chord printTabs(outstream, level); outstream << "" << "\n"; char buffer[1024]; int i; for (i=0; i" << "\n"; } ////////////////////////////// // // printMeiNoteData -- // void printMeiNoteData(ostream& outstream, const char* data, int level) { if (strcmp(data, ".") == 0) { // nothing to print return; } // WARNING: Have to deal with chords int string = getKotoString(data); printTabs(outstream, level); if (string == 0) { outstream << "\n"; } else if (string == 14) { outstream << "\n"; } else if (string > 0) { outstream << "" << "\n"; } } ////////////////////////////// // // printMeiRhythm -- // void printMeiRhythm(ostream& outstream, const char* data) { int rhythm = getRhythm(data); int dots = getDots(data); outstream << " dur='" << rhythm << "'"; if (dots > 0) { outstream << " dots='" << dots << "'"; } } ////////////////////////////// // // printMeiPitch -- // void printMeiPitch(ostream& outstream, int pitch) { int octave = pitch / 40; int accidental = Convert::base40ToAccidental(pitch); int diatonic = Convert::base40ToDiatonic(pitch) % 7; if (diatonic < 0 || diatonic > 6) { std::cerr << "ERROR: invalid diatonic number: " << diatonic << " (" << pitch << ")" << endl; exit(1); } char Diatonic[7] = {'c', 'd', 'e', 'f', 'g', 'a', 'b'}; outstream << " pname='" << Diatonic[diatonic] << "'"; outstream << " oct='" << octave << "'"; if (accidental != 0) { outstream << " accid.ges='"; switch (accidental) { case 2: outstream << "ss"; break; case 1: outstream << "s"; break; case -1: outstream << "f"; break; case -2: outstream << "ff"; break; } outstream << "'"; } } /////////////////////////////////////////////////////////////////////////// // // MusicXML functions // void printMusicXml(ostream& outstream, HumdrumFile& infile) { // do nothing for now } /////////////////////////////////////////////////////////////////////////// // // Shared functions // ////////////////////////////// // // printEncodedString -- escape quote output string // < = < // > = > // & = & // ' = ' // " = " // void printEncodedString(ostream& outstream, char* buffer) { int i; int length = strlen(buffer); for (i=0; i': outstream << ">"; break; case '&': outstream << "&"; break; case '\'': outstream << "&"; break; case '\"': outstream << "&"; break; default: outstream << buffer[i]; } } } ////////////////////////////// // // getTitle -- Return the first !!!OTL record in the file. // char* getTitle(char* buffer, int buffsize, HumdrumFile& infile) { int i, j; int length; int colon = -1; buffer[0] = 0; for (i=0; i