andrew@49: #include "testApp.h" andrew@51: const int totalNumberFiles = 61; andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::setup(){ andrew@49: //fixed stuff andrew@49: annotationRoot = "/Users/andrew/Documents/work/Alignment/MuseScore/RWC/ANNOTATION/RM-C0"; andrew@52: jnmrPlayerRoot = "/Users/andrew/Documents/work/programming/of_preRelease_v007_osx/apps/myOpenFrameworks007/JNMR_MidiFollower/bin/data/FilesOut/"; andrew@52: andrew@52: //set which parameter set to test andrew@52: jnmrPlayerRoot += "rwc_output_likelihood0pt6";//width 100ms andrew@52: // jnmrPlayerRoot += "rwcOutput_likelihood0pt8_width50"; andrew@52: // jnmrPlayerRoot += "completeTestsTempoMAPestimate_likelihood0pt2"; andrew@52: andrew@52: jnmrPlayerRoot += "/rwcOutputData_RM-C0"; andrew@51: // matchRoot = "/Users/andrew/Documents/work/programming/Shell Scripts/MatchAudioToMidiOutput/RWCmatch_RM-C";//ACTUAL AUDIO VERSION OF WARPED andrew@51: matchRoot = "/Users/andrew/Documents/work/programming/Shell Scripts/MatchMidiToMidiOutput/RWCmatch_RM-C";//MIDI VERSION OF WARPED andrew@51: andrew@49: createRWCfilenameStrings(); andrew@49: andrew@51: fileNumberToTest = 0; andrew@51: andrew@51: while (fileNumberToTest < totalNumberFiles){ andrew@51: loadAnnotation(fileNumberToTest); andrew@51: getResults(fileNumberToTest); andrew@51: fileNumberToTest++; andrew@51: } andrew@51: calculateOverallPercentiles(); andrew@51: calculateOverallMatchPercentiles(); andrew@51: } andrew@51: andrew@51: void testApp::calculateOverallPercentiles(){ andrew@51: andrew@51: int numberToCount = 61;//totalNumberFiles; andrew@51: printf("\nFINAL PERCENTILES for %i files\n", numberToCount); andrew@51: final_JNMR_Midi.count = 0; andrew@51: for (int i =0;i < numberToCount;i++){ andrew@51: for (int k = 0;k < 7;k++){ andrew@51: final_JNMR_Midi.percentileCount[k] += JNMR_MidiMatcher_results[i].percentileCount[k]; andrew@51: //printf("file %i, precentile count[%i] is %f\n", i, k, JNMR_MidiMatcher_results[i].percentileCount[k]); andrew@51: } andrew@51: final_JNMR_Midi.count += JNMR_MidiMatcher_results[i].count; andrew@51: } andrew@51: andrew@51: for (int p = 0;p < 7;p++){ andrew@51: final_JNMR_Midi.percentiles[p] = final_JNMR_Midi.percentileCount[p] / final_JNMR_Midi.count; andrew@51: printf("final JNMR percentile [%i] = %.2f, count %i, perc count %.1f\n", p, final_JNMR_Midi.percentiles[p]*100.0, final_JNMR_Midi.count, final_JNMR_Midi.percentileCount[p]); andrew@51: andrew@51: andrew@51: } andrew@51: andrew@51: for (int i = 0;i < 7;i++){ andrew@51: printf("%.1f &", final_JNMR_Midi.percentiles[i]*100.0); andrew@51: } andrew@51: } andrew@51: andrew@51: andrew@51: void testApp::calculateOverallMatchPercentiles(){ andrew@51: andrew@51: int numberToCount = 61;//totalNumberFiles; andrew@51: printf("\n FINAL MATCH FORWARDS PERCENTILES for %i files\n", numberToCount); andrew@51: final_Match_OF.count = 0; andrew@51: final_Match_OB.count = 0; andrew@51: andrew@51: for (int i =0;i < numberToCount;i++){ andrew@51: for (int k = 0;k < 7;k++){ andrew@51: final_Match_OF.percentileCount[k] += matchOF_results[i].percentileCount[k]; andrew@51: final_Match_OB.percentileCount[k] += matchOB_results[i].percentileCount[k]; andrew@51: } andrew@51: final_Match_OF.count += matchOF_results[i].count; andrew@51: final_Match_OB.count += matchOB_results[i].count; andrew@51: } andrew@51: andrew@51: for (int p = 0;p < 7;p++){ andrew@51: andrew@51: final_Match_OF.percentiles[p] = final_Match_OF.percentileCount[p] / final_Match_OF.count; andrew@51: final_Match_OB.percentiles[p] = final_Match_OB.percentileCount[p] / final_Match_OB.count; andrew@51: andrew@51: printf("final Match_OF percentile [%i] = %.2f, count %i, perc count %.1f\n", p, final_Match_OF.percentiles[p]*100., andrew@51: final_Match_OF.count, final_Match_OF.percentileCount[p]); andrew@51: } andrew@51: printf("\n FINAL MATCH BACKWARDS PERCENTILES for %i files\n", numberToCount); andrew@51: for (int p = 0;p < 7;p++){ andrew@51: printf("final Match_OB percentile [%i] = %.2f, count %i, perc count %.1f\n", p, final_Match_OB.percentiles[p]*100., andrew@51: final_Match_OB.count, final_Match_OB.percentileCount[p]); andrew@51: } andrew@51: printf("\nOB: "); andrew@51: for (int i = 0;i < 7;i++){ andrew@51: printf("%.1f &", final_Match_OB.percentiles[i]*100.0); andrew@51: } andrew@51: printf("\nOF: "); andrew@51: for (int i = 0;i < 7;i++){ andrew@51: printf("%.1f &", final_Match_OF.percentiles[i]*100.0); andrew@51: } andrew@50: } andrew@50: andrew@50: void testApp::getResults(const int& fileID){ andrew@49: andrew@49: std::string txtEnd = ".txt"; andrew@49: //naming convention andrew@49: //match output must also follow the RWC ID andrew@49: //01, 02, 03 etc andrew@49: andrew@50: std::string matchEnd = "_ob.out"; andrew@50: matchPath = makeMatchFilename(fileID, matchEnd);//makeRWCfilename(matchRoot, fileID, matchEnd); andrew@50: printf("MATCH PATH OB: %s\n", matchPath.c_str()); andrew@50: matchNotations.readInMatchFile(matchPath); andrew@50: TimingResult matchObResult; andrew@50: calculateMatchErrors(matchObResult); andrew@50: matchOB_results.push_back(matchObResult); andrew@49: andrew@50: matchEnd = "_of.out"; andrew@50: matchPath = makeMatchFilename(fileID, matchEnd);//makeRWCfilename(matchRoot, fileID, matchEnd); andrew@50: printf("MATCH PATH OF: %s\n", matchPath.c_str()); andrew@50: matchNotations.readInMatchFile(matchPath); andrew@50: TimingResult matchOfResult; andrew@50: calculateMatchForwardErrors(matchOfResult); andrew@50: matchOF_results.push_back(matchOfResult); andrew@49: andrew@49: andrew@49: jnmrPlayerPath = makeRWCfilename(jnmrPlayerRoot, fileID, txtEnd);//+ "rwcOutputData_RM-C003.txt"; andrew@49: jnmrPlayerAnnotations.readInjnmrMidiPlayerFile(jnmrPlayerPath); andrew@49: andrew@49: printf("JNMR DIFFERENCES\n"); andrew@50: TimingResult jnmrResult; andrew@50: sortDifferenceVector(jnmrPlayerAnnotations.differences, jnmrResult); andrew@50: JNMR_MidiMatcher_results.push_back(jnmrResult); andrew@50: andrew@50: printf("\n"); andrew@50: } andrew@50: andrew@50: andrew@50: std::string testApp::makeMatchFilename( const int& fileID, std::string matchEnd){ andrew@50: andrew@50: string rootToUse = matchRoot; andrew@50: if (fileID > 8){ andrew@50: rootToUse += "0"; andrew@50: } andrew@50: string matchName = makeRWCfilename(rootToUse, fileID, matchEnd); andrew@50: return matchName; andrew@49: } andrew@49: andrew@49: andrew@49: std::string testApp::makeRWCfilename(std::string& root, const int& fileID, std::string& endPart){ andrew@49: std::string pathName; andrew@49: if (fileID >= 0 && fileID <= 64){ andrew@49: andrew@49: pathName = root + rwcFileNameStrings[fileID]+endPart; andrew@49: /* andrew@49: if (fileID >= 10) andrew@49: pathName = root + ofToString(fileID)+endPart; andrew@49: else andrew@49: pathName = root + "0"+ofToString(fileID)+endPart; andrew@49: */ andrew@49: //printf("RWC PATH:%s\n", pathName.c_str()); andrew@49: } andrew@49: return pathName; andrew@49: } andrew@49: andrew@49: void testApp::createRWCfilenameStrings(){ andrew@49: rwcFileNameStrings.clear(); andrew@49: for (int i = 1;i< 10;i++){ andrew@49: rwcFileNameStrings.push_back("0"+ofToString(i)); andrew@49: } andrew@49: for (int i = 10;i< 23;i++){ andrew@49: rwcFileNameStrings.push_back(ofToString(i)); andrew@49: } andrew@49: rwcFileNameStrings.push_back("23A"); andrew@49: rwcFileNameStrings.push_back("23B"); andrew@49: rwcFileNameStrings.push_back("23C"); andrew@49: rwcFileNameStrings.push_back("23D"); andrew@49: rwcFileNameStrings.push_back("23E"); andrew@49: andrew@49: rwcFileNameStrings.push_back("24A"); andrew@49: rwcFileNameStrings.push_back("24B"); andrew@49: rwcFileNameStrings.push_back("24C"); andrew@49: andrew@49: rwcFileNameStrings.push_back("25A"); andrew@49: rwcFileNameStrings.push_back("25B"); andrew@49: rwcFileNameStrings.push_back("25C"); andrew@49: rwcFileNameStrings.push_back("25D"); andrew@49: andrew@49: for (int i = 26;i< 35;i++){ andrew@49: rwcFileNameStrings.push_back(ofToString(i)); andrew@49: } andrew@49: rwcFileNameStrings.push_back("35A"); andrew@49: rwcFileNameStrings.push_back("35B"); andrew@49: rwcFileNameStrings.push_back("35C"); andrew@49: for (int i = 36;i< 51;i++){ andrew@49: rwcFileNameStrings.push_back(ofToString(i)); andrew@49: } andrew@49: andrew@49: // for (int i = 0;i < rwcFileNameStrings.size();i++) { andrew@49: // printf("RWC{%i}:'%s'\n", i, rwcFileNameStrings[i].c_str()); andrew@49: // } andrew@49: andrew@49: } andrew@49: andrew@49: void testApp::loadAnnotation(const int& fileID){ andrew@49: andrew@49: string annotationEnding = "_annotation+WavPos.csv"; andrew@49: string path = makeRWCfilename(annotationRoot, fileID, annotationEnding ); andrew@49: //printf("read in annotations from\n%s\n", path.c_str()); andrew@49: rwcAnnotations.readInRWCfile(path); andrew@49: } andrew@49: andrew@49: andrew@50: void testApp::calculateMatchErrors(TimingResult& t){ andrew@49: int matchIndex = 0; andrew@49: andrew@49: vector matchDiffs; andrew@49: andrew@49: for (int i = 0;i < rwcAnnotations.rwcAnnotations.size();i++){ andrew@49: // printf("rwc time %f midi time %f\n", rwcAnnotations.rwcAnnotations[i].eventTime, rwcAnnotations.rwcAnnotations[i].midiTime); andrew@49: andrew@49: while (matchIndex < matchNotations.matchData.size() && matchNotations.matchData[matchIndex].midiTime < rwcAnnotations.rwcAnnotations[i].midiTime) andrew@49: matchIndex++; andrew@49: andrew@49: while (matchNotations.matchData[matchIndex].midiTime > rwcAnnotations.rwcAnnotations[i].midiTime) andrew@49: matchIndex--; andrew@49: andrew@49: // float matchFraction = (rwcAnnotations.rwcAnnotations[i].midiTime - matchNotations.matchData[matchIndex].midiTime)/(matchNotations.matchData[matchIndex+1].midiTime - matchNotations.matchData[matchIndex].midiTime); andrew@49: // matchFraction *= (matchNotations.matchData[matchIndex+1].audioTime - matchNotations.matchData[matchIndex].audioTime); andrew@49: float matchTime = matchNotations.matchData[matchIndex].audioTime;// +matchFraction ; andrew@49: andrew@49: // printf("matchTime %f gives event time %f from flat event time %f\n", matchNotations.matchData[matchIndex].midiTime, matchTime, matchNotations.matchData[matchIndex].audioTime); andrew@49: andrew@49: float matchDifference = 1000.0*(matchTime - rwcAnnotations.rwcAnnotations[i].eventTime); andrew@49: // printf("Match diff %f\n", matchDifference); andrew@49: andrew@49: matchDiffs.push_back(fabs(matchDifference)); andrew@49: } andrew@49: andrew@50: sortDifferenceVector(matchDiffs, t); andrew@49: andrew@49: } andrew@49: andrew@49: andrew@50: void testApp::calculateMatchForwardErrors(TimingResult& t){ andrew@50: int matchIndex = 0; andrew@50: andrew@50: vector matchDiffs; andrew@50: andrew@50: for (int i = 0;i < rwcAnnotations.rwcAnnotations.size();i++){ andrew@50: // printf("rwc time %f midi time %f\n", rwcAnnotations.rwcAnnotations[i].eventTime, rwcAnnotations.rwcAnnotations[i].midiTime); andrew@50: andrew@50: while (matchIndex < matchNotations.matchData.size() && matchNotations.matchData[matchIndex].midiTime > rwcAnnotations.rwcAnnotations[i].midiTime) andrew@50: matchIndex++; andrew@50: andrew@50: while (matchNotations.matchData[matchIndex].midiTime < rwcAnnotations.rwcAnnotations[i].midiTime) andrew@50: matchIndex--; andrew@50: andrew@50: // float matchFraction = (rwcAnnotations.rwcAnnotations[i].midiTime - matchNotations.matchData[matchIndex].midiTime)/(matchNotations.matchData[matchIndex+1].midiTime - matchNotations.matchData[matchIndex].midiTime); andrew@50: // matchFraction *= (matchNotations.matchData[matchIndex+1].audioTime - matchNotations.matchData[matchIndex].audioTime); andrew@50: float matchTime = matchNotations.matchData[matchIndex].audioTime;// +matchFraction ; andrew@50: andrew@50: // printf("matchTime %f gives event time %f from flat event time %f\n", matchNotations.matchData[matchIndex].midiTime, matchTime, matchNotations.matchData[matchIndex].audioTime); andrew@50: andrew@50: float matchDifference = 1000.0*(matchTime - rwcAnnotations.rwcAnnotations[i].eventTime); andrew@50: // printf("Match diff %f\n", matchDifference); andrew@50: andrew@50: matchDiffs.push_back(fabs(matchDifference)); andrew@50: } andrew@50: andrew@50: sortDifferenceVector(matchDiffs, t); andrew@50: andrew@50: } andrew@50: andrew@50: andrew@50: andrew@50: void testApp::sortDifferenceVector(vector diffVec, TimingResult& t){ andrew@49: andrew@49: //GETS MEAN AND MEDIAN andrew@49: int count = 0; andrew@49: float total = 0; andrew@49: andrew@49: for (int i = 0;i < diffVec.size();i++){ andrew@49: // printf("M[%i] : %f\n", i, matchDiffs[i]); andrew@49: andrew@49: count++; andrew@49: total += fabs(diffVec[i]); andrew@49: diffVec[i] = fabs(diffVec[i]);//replace with +ve value andrew@50: andrew@50: addToPercentiles(diffVec[i], t); andrew@49: } andrew@49: total /= count; andrew@49: andrew@49: std::sort(diffVec.begin(), diffVec.end());//sort vector andrew@50: t.median = diffVec[(int)(diffVec.size()/2)]; andrew@50: t.mean = total; andrew@50: t.count = count; andrew@52: printf("Count %i Median %3.1f, mean is %3.1f\n", count, diffVec[(int)(diffVec.size()/2)], total); andrew@49: andrew@50: for (int i = 0;i < 7;i++){ andrew@50: t.percentiles[i] = t.percentileCount[i] / count; andrew@50: printf("Perc[%i] = %2.1f, ", i, (t.percentiles[i]*100.0)); andrew@50: } andrew@50: printf("\n"); andrew@49: andrew@49: } andrew@49: andrew@50: void testApp::addToPercentiles(float value, TimingResult& t){ andrew@50: andrew@50: if (value <= 20){ andrew@50: t.percentileCount[0]++; andrew@50: } andrew@50: if (value <= 40){ andrew@50: t.percentileCount[1]++; andrew@50: } andrew@50: if (value <= 60){ andrew@50: t.percentileCount[2]++; andrew@50: } andrew@50: if (value <= 100){ andrew@50: t.percentileCount[3]++; andrew@50: } andrew@50: if (value <= 200){ andrew@50: t.percentileCount[4]++; andrew@50: } andrew@50: if (value <= 500){ andrew@50: t.percentileCount[5]++; andrew@50: } andrew@50: if (value <= 1000){ andrew@50: t.percentileCount[6]++; andrew@50: } andrew@50: andrew@50: andrew@50: } andrew@50: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::update(){ andrew@49: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::draw(){ andrew@49: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::keyPressed(int key){ andrew@49: andrew@50: if (key == ' '){ andrew@50: fileNumberToTest++; andrew@50: loadAnnotation(fileNumberToTest); andrew@50: getResults(fileNumberToTest); andrew@50: } andrew@50: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::keyReleased(int key){ andrew@49: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::mouseMoved(int x, int y ){ andrew@49: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::mouseDragged(int x, int y, int button){ andrew@49: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::mousePressed(int x, int y, int button){ andrew@49: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::mouseReleased(int x, int y, int button){ andrew@49: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::windowResized(int w, int h){ andrew@49: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::gotMessage(ofMessage msg){ andrew@49: andrew@49: } andrew@49: andrew@49: //-------------------------------------------------------------- andrew@49: void testApp::dragEvent(ofDragInfo dragInfo){ andrew@49: andrew@50: } andrew@50: andrew@50: /* andrew@50: //GETS MEAN AND MEDIAN andrew@50: int count = 0; andrew@50: float total = 0; andrew@50: andrew@50: for (int i = 0;i < matchDiffs.size();i++){ andrew@50: // printf("M[%i] : %f\n", i, matchDiffs[i]); andrew@50: andrew@50: count++; andrew@50: total += fabs(matchDiffs[i]); andrew@50: andrew@50: } andrew@50: total /= count; andrew@50: andrew@50: std::sort(matchDiffs.begin(), matchDiffs.end()); andrew@50: andrew@50: // printf("SORTED TWO HUNDRED\n"); andrew@50: andrew@50: // for (int i = 0;i < matchDiffs.size() ;i++){ andrew@50: // printf("M[%i] : %f\n", i, matchDiffs[i]); andrew@50: // } andrew@50: andrew@50: printf("MATCH median %f, mean is %f\n", matchDiffs[(int)(matchDiffs.size()/2)], total); andrew@50: */