//
// Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Mon Oct 14 23:58:44 2002
// Last Modified: Mon Apr 25 11:30:20 PDT 2005
// Filename: ...sig/examples/all/jointextract.cpp
// Web Address: http://sig.sapp.org/examples/museinfo/humdrum/jointextract.cpp
// Syntax: C++; museinfo
//
// Description: Extract joint information from a spine related to multiple
// **kern data spines.
//
#include "humdrum.h"
#include <string.h>
#include <stdio.h>
#ifndef OLDCPP
using namespace std;
#include <iostream>
#else
#include <iostream.h>
#endif
// function declarations:
void checkOptions(Options& opts, int argc, char** argv);
void example(void);
void usage(const char* command);
void processFile(HumdrumFile& infile);
int findTargetSpine(HumdrumFile& infile, const char* targetstr);
void printExtractedJointInfo(HumdrumFile& infile, int line,
int targetspine);
const char* interp = "**kern";
const char* target = "";
// User interface variables:
Options options;
int jointspine = 1; // used with -j option
int inlineq = 0; // used with -i option
//////////////////////////////////////////////////////////////////////////
int main(int argc, char** argv) {
// process the command-line options
checkOptions(options, argc, argv);
HumdrumFile infile;
int i;
for (i=1; i<=options.getArgCount(); i++) {
infile.clear();
infile.read(options.getArg(i));
processFile(infile);
}
return 0;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////
//
// findTargetSpine --
//
int findTargetSpine(HumdrumFile& infile, const char* targetstr) {
int i, j;
for (i=0; i<infile.getNumLines(); i++) {
if (strncmp(infile[i][0], "**", 2) != 0) {
continue;
}
for (j=0; j<infile[i].getFieldCount(); j++) {
if (strcmp(targetstr, infile[i][j]) == 0) {
return infile[i].getPrimaryTrack(j);
}
}
break;
}
return -1;
}
//////////////////////////////
//
// countNotes --
//
int countNotes(HumdrumRecord& dataline, int field) {
if (strcmp(dataline[field], ".") == 0) {
return 0;
}
int notecount = 0;
int len = strlen(dataline[field]);
char tempstr[len*2+1];
int i;
int tokencount = dataline.getTokenCount(field);
for (i=0; i<tokencount; i++) {
dataline.getToken(tempstr, field, i);
if (strcmp(tempstr, ".") == 0) {
continue;
}
if (strchr(tempstr, '_') != NULL) { // ignore tied notes
continue;
}
if (strchr(tempstr, ']') != NULL) { // ignore tied notes
continue;
}
if (strchr(tempstr, 'r') != NULL) { // ignore rests
continue;
}
if (strchr(tempstr, 'a') != NULL) { // count an a note
notecount++;
continue;
}
if (strchr(tempstr, 'b') != NULL) { // count a b note
notecount++;
continue;
}
if (strchr(tempstr, 'c') != NULL) { // count a c note
notecount++;
continue;
}
if (strchr(tempstr, 'd') != NULL) { // count a d note
notecount++;
continue;
}
if (strchr(tempstr, 'e') != NULL) { // count an e note
notecount++;
continue;
}
if (strchr(tempstr, 'f') != NULL) { // count an f note
notecount++;
continue;
}
if (strchr(tempstr, 'g') != NULL) { // count a g note
notecount++;
continue;
}
if (strchr(tempstr, 'A') != NULL) { // count an A note
notecount++;
continue;
}
if (strchr(tempstr, 'B') != NULL) { // count a B note
notecount++;
continue;
}
if (strchr(tempstr, 'C') != NULL) { // count a C note
notecount++;
continue;
}
if (strchr(tempstr, 'D') != NULL) { // count a D note
notecount++;
continue;
}
if (strchr(tempstr, 'E') != NULL) { // count an E note
notecount++;
continue;
}
if (strchr(tempstr, 'F') != NULL) { // count an F note
notecount++;
continue;
}
if (strchr(tempstr, 'G') != NULL) { // count a G note
notecount++;
continue;
}
cerr << "Warning: don't understand: " << dataline[field] << endl;
}
return notecount;
}
//////////////////////////////
//
// printExtractedJointInfo --
//
void printExtractedJointInfo(HumdrumFile& infile, int line, int targettrack) {
Array<int> basecounts;
basecounts.setSize(infile.getMaxTracks());
basecounts.setSize(0);
int count = 0;
int targetindex = -1;
int i, j;
for (i=0; i<infile[line].getFieldCount(); i++) {
if (infile[line].getExInterpNum(i) == E_KERN_EXINT) {
count = countNotes(infile[line], i);
basecounts.append(count);
}
if (strcmp(infile[line].getExInterp(i), target) == 0) {
targetindex = i;
}
}
int before = 0;
for (i=0; i<jointspine; i++) {
before += basecounts[i];
}
int len = strlen(infile[line][targetindex]);
char tmpstr[len+1];
if (inlineq) {
for (i=0; i<infile[line].getFieldCount(); i++) {
if (i != targetindex) {
cout << infile[line][i];
} else {
if (basecounts[jointspine] <= 0) {
cout << ".";
} else {
for (j=0; j<basecounts[jointspine]; j++) {
infile[line].getToken(tmpstr, targetindex, j + before);
cout << tmpstr;
if (j<basecounts[jointspine]-1) {
cout << " ";
}
}
}
}
if (i < infile[line].getFieldCount()-1) {
cout << "\t";
}
}
} else {
if (basecounts[jointspine] <= 0) {
cout << ".";
} else {
for (i=0; i<basecounts[jointspine]; i++) {
infile[line].getToken(tmpstr, targetindex, i + before);
cout << tmpstr;
if (i<basecounts[jointspine]-1) {
cout << " ";
}
}
}
}
}
//////////////////////////////
//
// processFile --
//
void processFile(HumdrumFile& infile) {
int i, j;
int counter = 0;
int targetspine = findTargetSpine(infile, target);
for (i=0; i<infile.getNumLines(); i++) {
counter = 0;
switch (infile.getType(i)) {
case E_humrec_data_comment:
case E_humrec_data_kern_measure:
case E_humrec_interpretation:
if (!inlineq) {
for (j=0; j<infile[i].getFieldCount(); j++) {
if (infile[i].getPrimaryTrack(j) == targetspine) {
counter++;
if (counter > 1) {
cout << "\t";
}
cout << infile[i][j];
}
}
} else {
cout << infile[i];
}
cout << "\n";
break;
case E_humrec_data:
printExtractedJointInfo(infile, i, targetspine);
cout << "\n";
break;
case E_humrec_none:
case E_humrec_empty:
case E_humrec_global_comment:
case E_humrec_bibliography:
default:
cout << infile[i] << "\n";
}
}
}
//////////////////////////////
//
// checkOptions --
//
void checkOptions(Options& opts, int argc, char* argv[]) {
opts.define("joint|j=i:1", "the joint spine to extract, starting at 1");
opts.define("target|t=s", "the target interpretation to extract from");
opts.define("inline|i=b", "extract the data inline with original input");
opts.define("author=b", "author of program");
opts.define("version=b", "compilation info");
opts.define("example=b", "example usages");
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, Sep 2006" << endl;
exit(0);
} else if (opts.getBoolean("version")) {
cout << argv[0] << ", version: 12 Sep 2006" << 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);
}
jointspine = opts.getInteger("joint") - 1;
if (jointspine < 0) {
jointspine = 0;
}
target = opts.getString("target");
inlineq = opts.getBoolean("inline");
}
//////////////////////////////
//
// example --
//
void example(void) {
}
//////////////////////////////
//
// usage --
//
void usage(const char* command) {
}
// md5sum: b65954c7296d58a653820dd756cc20eb jointextract.cpp [20060915]