//
// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Sat Mar 13 21:37:28 PST 2004
// Last Modified: Sat Mar 13 21:37:30 PST 2004
// Last Modified: Thu May 6 00:42:02 PDT 2004 (added measure renumbering)
// Last Modified: Thu Jun 3 18:01:43 PDT 2004 (added -p option)
// Last Modified: Sat Jun 26 16:49:06 PDT 2010 (added middle syllable markers)
// Filename: ...sig/examples/all/xml2hum.cpp
// Web Address: http://sig.sapp.org/examples/museinfo/humdrum/xml2hum.cpp
// Syntax: C++; museinfo
//
// Description: Converts a MusicXML 1.0 file into a Humdrum file.
//
#include "humdrum.h"
#include "MusicXmlFile.h"
#include "Options.h"
#include "PerlRegularExpression.h"
#include <iostream>
// user interface variables
Options options;
int debugQ = 0; // used with --debug option
int infoQ = 0; // used with -i option
int midifixQ = 0; // used with -x option
int staff = -1; // used with -t option
int stemQ = 1; // used with -S option
int beamQ = 1; // used with -B option
int dynamicsQ= 1; // used with -D option
int mfixQ = 1; // used with -M option
int printQ = 0; // used with -p option
int textQ = 1; // used with -T option
// function declarations:
void checkOptions(Options& opts, int argc, char** argv);
void example(void);
void usage(const char* command);
void printTextString(const char* string);
//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[]) {
checkOptions(options, argc, argv);
MusicXmlFile xmlfile(options.getArg(1));
if (printQ) {
xmlfile.print();
exit(0);
}
if (debugQ) {
xmlfile.info();
}
xmlfile.setOption("stem", stemQ); // set stem encoding option
xmlfile.setOption("beam", beamQ); // set beam encoding option
xmlfile.setOption("lyric", textQ); // set text encoding option
xmlfile.setOption("dynamics", dynamicsQ); // set dynamics encoding option
HumdrumFile hfile;
if (debugQ) {
cout << "====================================================\n" << endl;
}
if (infoQ) {
//cout << "Filename: " << options.getArg(1) << endl;
//cout << "Parts: " << xmlfile.getPartCount() << endl;
xmlfile.info(cout);
exit(0);
}
if (midifixQ) {
xmlfile.fixMidiAccidentals();
}
if (mfixQ) {
xmlfile.fixMeasureNumbers();
}
if (staff <= 0) {
xmlfile.createHumdrumFile(hfile);
} else if (staff <= xmlfile.getStaffCount()) {
xmlfile.humdrumPart(hfile, staff-1, debugQ);
}
int i, j;
for (i=0; i<hfile.getNumLines(); i++) {
// prevent blank lines from occuring:
if (hfile[i].getFieldCount() > 0) {
if (hfile[i].getType() != E_humrec_empty) {
for (j=0; j<hfile[i].getFieldCount(); j++) {
// cout << hfile[i] << '\n';
if (strlen(hfile[i][j]) == 0) {
cout << '.';
} else {
printTextString(hfile[i][j]);
}
if (j<hfile[i].getFieldCount()-1) {
cout << '\t';
}
}
cout << '\n';
}
}
}
// cout << hfile << flush;
return 0;
}
//////////////////////////////
//
// printTextString -- do some conversions from UTF-8.
//
void printTextString(const char* string) {
Array<char> newstring;
newstring.setSize(strlen(string)+1);
strcpy(newstring.getBase(), string);
//PerlRegularExpression pre;
//pre.sar(newstring, "\xc3\xa9", "é", "g");
//cout << string;
int i;
for (i=0; i<(int)strlen(string); i++) {
if (string[i] == '\xC3') {
if (string[i+1] == '\xA0') { cout << "à"; i+=1; continue; }
if (string[i+1] == '\xA1') { cout << "á"; i+=1; continue; }
if (string[i+1] == '\xA2') { cout << "â"; i+=1; continue; }
if (string[i+1] == '\xA3') { cout << "ã"; i+=1; continue; }
if (string[i+1] == '\xA4') { cout << "ä"; i+=1; continue; }
if (string[i+1] == '\xA5') { cout << "å"; i+=1; continue; }
if (string[i+1] == '\xA7') { cout << "ç"; i+=1; continue; }
if (string[i+1] == '\xA8') { cout << "è"; i+=1; continue; }
if (string[i+1] == '\xA9') { cout << "é"; i+=1; continue; }
if (string[i+1] == '\xAA') { cout << "ê"; i+=1; continue; }
if (string[i+1] == '\xAB') { cout << "ë"; i+=1; continue; }
if (string[i+1] == '\xAC') { cout << "ì"; i+=1; continue; }
if (string[i+1] == '\xAD') { cout << "í"; i+=1; continue; }
if (string[i+1] == '\xAE') { cout << "î"; i+=1; continue; }
if (string[i+1] == '\xAF') { cout << "ï"; i+=1; continue; }
if (string[i+1] == '\xB1') { cout << "ñ"; i+=1; continue; }
if (string[i+1] == '\xB2') { cout << "ò"; i+=1; continue; }
if (string[i+1] == '\xB3') { cout << "ó"; i+=1; continue; }
if (string[i+1] == '\xB4') { cout << "ô"; i+=1; continue; }
if (string[i+1] == '\xB5') { cout << "õ"; i+=1; continue; }
if (string[i+1] == '\xB6') { cout << "ö"; i+=1; continue; }
if (string[i+1] == '\xB9') { cout << "ù"; i+=1; continue; }
if (string[i+1] == '\xBA') { cout << "ú"; i+=1; continue; }
if (string[i+1] == '\xBB') { cout << "û"; i+=1; continue; }
if (string[i+1] == '\xBB') { cout << "ü"; i+=1; continue; }
}
cout << string[i];
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////
//
// checkOptions --
//
void checkOptions(Options& opts, int argc, char* argv[]) {
opts.define("debug=b", "print debugging information program");
opts.define("x|midifix|accidentals=b", "fix accidentals from MIDI file");
opts.define("s|staff=i:-1", "extract a particular staff");
opts.define("i|info=b", "print information about the MusicXML file");
opts.define("p|print=b", "print original file and exit");
opts.define("S|no-stems=b", "do not print stem information of notes");
opts.define("B|no-beams=b", "do not print beam information of notes");
opts.define("D|no-dynamics=b", "do not print dynamics information");
opts.define("N|no-notation=b", "do not print notation-specific information");
opts.define("M|no-measure-number-fix=b", "do not renumber measures");
opts.define("T|no-text=b", "do not convert lyrics to humdrum spines");
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, 10 March 2004" << endl;
exit(0);
} else if (opts.getBoolean("version")) {
cout << argv[0] << ", version: May 2004" << endl;
cout << "compiled: " << __DATE__ << endl;
exit(0);
} else if (opts.getBoolean("help")) {
usage(opts.getCommand());
exit(0);
} else if (opts.getBoolean("example")) {
example();
exit(0);
}
if (opts.getArgCount() != 1) {
cout << "Error: need one filename specified" << endl;
exit(1);
}
debugQ = opts.getBoolean("debug");
infoQ = opts.getBoolean("info");
stemQ = !opts.getBoolean("no-stems");
beamQ = !opts.getBoolean("no-beams");
dynamicsQ = !opts.getBoolean("no-dynamics");
staff = opts.getInteger("staff");
midifixQ = opts.getBoolean("midifix");
mfixQ = !opts.getBoolean("no-measure-number-fix");
printQ = opts.getBoolean("print");
textQ = !opts.getBoolean("no-text");
if (opts.getBoolean("no-notation")) {
stemQ = 0;
beamQ = 0;
dynamicsQ = 0;
}
}
//////////////////////////////
//
// example --
//
void example(void) {
}
//////////////////////////////
//
// usage --
//
void usage(const char* command) {
}
// md5sum: 355276b61985f1c5dc1f2d6a0268dc30 xml2hum.cpp [20111215]