// // Copyright 2002 by Craig Stuart Sapp, All Rights Reserved. // Programmer: Craig Stuart Sapp // Creation Date: Sun Jul 29 18:09:38 PDT 2012 // Last Modified: Sun Jul 29 18:09:42 PDT 2012 // Filename: ...sig/src/sigInfo/ScorePageSet.h // Web Address: http://sig.sapp.org/include/sigInfo/ScorePageSet.h // Syntax: C++ // // Description: Data structure for storing mulitiple pages of SCORE // data which represents one movement of a work. // (or one work if it only has one movement). // #include "ScorePageSet.h" #include "Convert.h" #include "PerlRegularExpression.h" #include #ifndef OLDCPP using namespace std; #endif /* ////////////////////////////// // // ScorePageSet::ScorePageSet -- // ScorePageSet::ScorePageSet(void) { pages.setSize(1000); pages.setAll(NULL); pages.setSize(0); pages.setGrowth(1000); verseCount.setSize(1000); verseCount.setSize(0); } ////////////////////////////// // // ScorePageSet::~ScorePageSet -- // ScorePageSet::~ScorePageSet() { int i; for (i=0; ireadFile(filename, verboseQ); pages.append(newpage); return pages.getSize(); } ////////////////////////////// // // ScorePageSet::analyzeContent -- // void ScorePageSet::analyzeContent(void) { int i, j, k; for (i=0; ianalyzeContent(); } int sysCount; int sysObjCount = 0; // presuming a constant staff count per system for the // following code. // store durations of pages and absBeat data workDuration = 0.0; double sysBeat; double absBeat; for (i=0; igetSystemCount(); for (j=0; jgetSystemItemCount(j); } for (j=0; jgetSystemCount(); j++) { for (k=0; kgetSystemItemCount(j); k++) { sysBeat = pages[i]->getSystemItem(j, k).getSystemBeat(); absBeat = sysBeat + workDuration; pages[i]->getSystemItem(j,k).setAbsBeat(absBeat); } workDuration += pages[i]->getSystemDuration(j); } } // store a single stream of score items which are time sorted. systemItems.setSize(int(sysObjCount*1.1)); systemItems.setGrowth(systemItems.getSize()); systemItems.setSize(0); int systemCount; int itemcount; PageItem item; for (i=0; igetSystemCount(); for (j=0; jgetSystemItemCount(j); for (k=0; kgetSystemItemNumber(j, k); systemItems.append(item); } } } // set the page index value within each ScoreRecord: for (i=0; igetSystemCount(); j++) { for (k=0; kgetSystemStaffCount(j); k++) { lcount = pages[i]->getSystemStaffLyricCount(k); if (lcount > verseCount[k]) { verseCount[k] = lcount; } } } } // adjust lyrics hyphenation across pages for (i=0; i 0) && (vpos < 12)) { getItem(i).setKeyValue("partname", 1); } } } ////////////////////////////// // // ScorePageSet::getVerseCount -- // int ScorePageSet::getVerseCount(int staffidx) { return verseCount[staffidx]; } ////////////////////////////// // // ScorePageSet::getPartVerseCount -- // int ScorePageSet::getPartVerseCount(int staffidx) { return getVerseCount(staffidx); } ////////////////////////////// // // ScorePageSet::getSystemStaffCount -- // int ScorePageSet::getSystemStaffCount(void) { if (pages.getSize() == 0) { return 0; } return pages[0]->getSystemStaffCount(0); } ////////////////////////////// // // ScorePageSet::getPartCount -- // int ScorePageSet::getPartCount(void) { return getSystemStaffCount(); } ////////////////////////////// // // ScorePageSet::getPageCount -- // int ScorePageSet::getPageCount(void) { return pages.getSize(); } ////////////////////////////// // // ScorePageSet::operator[] -- // ScorePage& ScorePageSet::operator[](int pageidx) { return *(pages[pageidx]); } ////////////////////////////// // // ScorePageSet::getPage -- // ScorePage& ScorePageSet::getPage(int pageidx) { return *(pages[pageidx]); } ////////////////////////////// // // ScorePageSet::getDuration -- return the duration in quarter notes. // double ScorePageSet::getDuration(void) { return workDuration; } ////////////////////////////// // // ScorePageSet::getItem -- // ScoreRecord& ScorePageSet::getItem(int objidx) { int page = systemItems[objidx].page; int num = systemItems[objidx].obj; return pages[page]->getItem(num); } ////////////////////////////// // // ScorePageSet::getItemCount -- // int ScorePageSet::getItemCount(void) { return systemItems.getSize(); } ////////////////////////////// // // ScorePageSet::isAtEnd -- Returns true if the object is after the // last duration object (note or rests) in the work (set of pages). // int ScorePageSet::isAtEnd(int objidx) { int i; for (i=objidx; i& title) { title.setSize(1); title[0] = '\0'; int highestidx = -1; int biggestidx = -1; double highestval = -1.0; double biggestval = -1.0; int targetidx = -1; double p3; double p4; double p6; int staffidx = getSystemStaffCount()-1; int i; ScorePage& firstpage = getPage(0); int itemcount = firstpage.getItemCount(0,staffidx); for (i=0; i 150) { // don't look for title in top left corner of page. continue; } if (p4 < 12) { // don't look for title in/under staff. continue; } if (p4 > highestval) { highestval = p4; highestidx = i; } if (p6 > biggestval) { biggestval = p6; biggestidx = i; } } if (biggestval > 1) { targetidx = biggestidx; } else if (highestidx > 15) { targetidx = highestidx; } if (targetidx < 0) { return 0; } int len = strlen(firstpage.getItem(0,staffidx,targetidx).getTextData()); title.setSize(len+1); strcpy(title.getBase(), firstpage.getItem(0,staffidx,targetidx).getTextData()); return 1; } ////////////////////////////// // // ScorePageSet::getComposer -- // int ScorePageSet::getComposer(Array& composer) { composer.setSize(1); composer[0] = '\0'; int highestidx = -1; int highestval = -1; int targetidx = -1; double p3; double p4; int staffidx = getSystemStaffCount()-1; int i; ScorePage& firstpage = getPage(0); int itemcount = firstpage.getItemCount(0,staffidx); for (i=0; i 40) { // don't look for composer too high continue; } if (p4 > highestval) { highestval = p4; highestidx = i; } } if (highestidx > 12) { targetidx = highestidx; } if (targetidx < 0) { return 0; } int len = strlen(firstpage.getItem(0,staffidx,targetidx).getTextData()); composer.setSize(len+1); strcpy(composer.getBase(), firstpage.getItem(0,staffidx,targetidx).getTextData()); return 1; } ////////////////////////////// // // ScorePageSet::getInstrumentName -- // int ScorePageSet::getInstrumentName(int staffidx, Array& name) { name.setSize(1); name[0] = '\0'; double p3; double p4; int i; double indent = getInitialStaffIndent(); ScorePage& firstpage = getPage(0); int itemcount = firstpage.getItemCount(0,staffidx); int foundindex = -1; for (i=0; i indent-3) { // only look for instrument name to the left of the staff. continue; } if (p4 < 3) { // don't look for name too low. continue; } if (p4 > 11) { // don't look for name too high continue; } foundindex = i; break; } PerlRegularExpression pre; if (foundindex >= 0) { int len = strlen(firstpage.getItem(0,staffidx,foundindex).getTextData()); name.setSize(len+1); strcpy(name.getBase(), firstpage.getItem(0,staffidx,foundindex).getTextData()); pre.sar(name, "_\\d\\d", "", "g"); } return foundindex? 1 : 0; } ////////////////////////////// // // ScorePageSet::getInitialStaffIndent -- // int ScorePageSet::getInitialStaffIndent(void) { int i; for (i=0; i syllables(maxverse); syllables.setAll(-1); // find the first lyric syllable for each verse on the second line int total = 0; int verse; ScoreRecord* srecord; int i; for (i=0; iisTextItem()) { continue; } verse = srecord->getVerseIndex(); if (verse < 0) { continue; } // found a verse syllable, add it to the list if the verse has not // yet been processed if (syllables[verse] < 0) { syllables[verse] = i; total++; } // stop looking for syllables if all verses have been accounted for if (total >= maxverse) { break; } } // find the last lyric or hyphen for each verse on the first line Array proceeding(maxverse); proceeding.setAll(-1); total = 0; for (i=getPage(page1).getSystemStaffItemCount(sys1idx, staffidx)-1; i>=0; i--) { srecord = &(getPage(page1).getItem(sys1idx, staffidx, i));; verse = srecord->getVerseIndex(); if (verse < 0) { continue; } if ((verse < proceeding.getSize()) && (proceeding[verse] < 0)) { proceeding[verse] = i; total++; } if (total >= maxverse) { break; } } // for each verse, add a "hyphenbefore" to syllables on the second staff // if the last item in the verse on the previous line as a hyphen. ScoreRecord* srecord1; ScoreRecord* srecord2; for (i=0; iisHyphen()) { srecord2->setNumKeyValue("hyphenbefore", 1); } } } ////////////////////////////// // // ScorePageSet::getAbsBeat -- // double ScorePageSet::getAbsBeat(int objidx) { return getItem(objidx).getAbsBeat(); } ////////////////////////////// // // ScorePageSet::getSystemStaffIndex -- // int ScorePageSet::getSystemStaffIndex(int objidx) { return pages[getItemPage(objidx)]->getSystemStaffIndex(getItemPageIndex(objidx)); // int page = systemItems[objidx].page; // int num = systemItems[objidx].obj; // return pages[page]->getItem(num).getSystemStaffIndex(); } ////////////////////////////// // // ScorePageSet::getItemPage -- return the page to which the indexed item belongs. // int ScorePageSet::getItemPage(int objidx) { return systemItems[objidx].page; } ////////////////////////////// // // ScorePageSet::getItemPageIndex -- return the page index of the pageset indexed // item. // int ScorePageSet::getItemPageIndex(int objidx) { return systemItems[objidx].obj; } */ // md5sum: 097b1076b87b8b25465be795f377816f ScorePageSet.cpp [20050403]