// // Programmer: Craig Stuart Sapp // Creation Date: Sat Nov 18 13:11:13 PST 2000 // Last Modified: Sat Nov 18 13:11:17 PST 2000 // Filename: ...sig/examples/all/atttacks.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/attacks.cpp // Syntax: C++; museinfo // // Description: Counts attack notes for every position in the input score. // Examines **kern spines and ignores all other spines. // #include "humdrum.h" #include #include #include // function declarations void checkOptions (Options& opts, int argc, char* argv[]); int countAttacks (HumdrumRecord& record); int doublecompare (const void* a, const void* b); void example (void); void generateAnalysis (HumdrumFile& infile, vector& attacks); void generateSummary (HumdrumFile& infile, vector& attacks); void generateSubSummary (HumdrumFile& infile, vector& attacks, const string& metricmarker, int start, int stop); void printAnalysis (HumdrumFile& infile, vector&metric); void usage (const string& command); // global variables Options options; // database for command-line arguments int debugQ = 0; // used with the --debug option int appendQ = 0; // used with the -a option int summaryQ = 0; // used with the -c option int densityQ = 0; // used with the -d option /////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { HumdrumFile infile; vector attacks; // 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& attacks) { attacks.resize(infile.getNumLines()); for (int i=0; i& attacks) { int start = 0; int stop = 0; int i=0; int m=0; int datatrigger = 0; int metertrigger = 0; int summarytrigger = 0; int length; string metricmarker; cout << "**takt\t**attack\t**avg\t**fract\n"; while (i 2) && isdigit(infile[i][m][2]) && (strchr(infile[i][m], '/') != NULL)) { metertrigger = 1; metricmarker = infile[i][m]; if (datatrigger) { summarytrigger = 1; stop = i-1; } else { start = i; } break; } else if (strncmp(infile[i][m], "*MM", 3) == 0) { cout << infile[i][m] << "\t"; cout << infile[i][m] << "\t"; cout << infile[i][m] << "\n"; break; } } } } if (strcmp(infile[i][0], "*-") == 0) { summarytrigger = 1; stop = i; } if (datatrigger == 1 && metertrigger == 0) { generateSubSummary(infile, attacks, "*MX", 0, infile.getNumLines()); break; } if (summarytrigger) { generateSubSummary(infile, attacks, metricmarker, start, stop); summarytrigger = 0; datatrigger = 0; metricmarker = ""; start = stop + 1; } i++; } cout << "*-\t*-\t*-\t*-\n"; } ////////////////////////////// // // generateSubSummary -- // void generateSubSummary(HumdrumFile& infile, vector& attacks, const string& metricmarker, int start, int stop) { infile.analyzeRhythm(); vector metposition; vector count; vector data; double current; int one = 1; string metermarker; int sumcount = 0; int attackcount = 0; int k; int sindex; for (int i=start; i= 0) { count[sindex]++; data[sindex] += attacks[i]; sumcount++; attackcount += attacks[i]; } else { current = infile[i].getBeat(); metposition.push_back(current); count.push_back(one); data.push_back(attacks[i]); sumcount++; attackcount +=attacks[i]; } } } vector sortmet = metposition; qsort(sortmet.data(), sortmet.size(), sizeof(double), doublecompare); vector average; vector fraction; average.resize(metposition.size()); fraction.resize(metposition.size()); for (int i=0; i<(int)average.size(); i++) { average[i] = (double)data[i]/count[i]; fraction[i] = (double)data[i]/attackcount; } cout << metermarker << "\t*lines=" << start+1 << ":" << stop+1 << "\t*cnt=" << attackcount << "\t*\n"; for (int i=0; i<(int)metposition.size(); i++) { k = 0; while (k < (int)metposition.size()) { if (metposition[k] == sortmet[i]) { break; } k++; } if (k > (int)metposition.size()) { continue; } cout << sortmet[i] << "\t" << data[k] << "\t" << average[k] << "\t" << fraction[k] << "\n"; } } ////////////////////////////// // // countAttacks -- count the number of notes that are struck // at each moment in the score. // int countAttacks(HumdrumRecord& record) { int i, j; int count = 0; int tcount; char buffer[128] = {0}; for (i=0; i& attacks) { int lastAttack = -1; int i; if (appendQ) { for (i=0; i *((double*)b)) { return 1; } else { return 0; } } // md5sum: cada1ee239bb1f3bc9fb947d281c9d45 attacks.cpp [20160320]