void Beam::FilterList( ListOfObjects *childList ) { bool firstNoteGrace = false; // We want to keep only notes and rest // Eventually, we also need to filter out grace notes properly (e.g., with sub-beams) ListOfObjects::iterator iter = childList->begin(); while ( iter != childList->end()) { LayerElement *currentElement = dynamic_cast<LayerElement*>(*iter); if ( !currentElement ) { // remove anything that is not an LayerElement (e.g. Verse, Syl, etc) iter = childList->erase( iter ); } else if ( !currentElement->HasDurationInterface() ) { // remove anything that has not a DurationInterface iter = childList->erase( iter ); } else { // Drop notes that are signaled as grace notes Note *n = dynamic_cast<Note*>(currentElement); if (n) { // if we are at the beginning of the beam // and the note is cueSize // assume all the beam is of grace notes if (childList->begin() == iter) { if (n->m_cueSize) firstNoteGrace = true; } // if the first note in beam was NOT a grace // we have grace notes embedded in a beam // drop them if ( !firstNoteGrace && n->m_cueSize == true) iter = childList->erase( iter ); else iter++; } else { // if it is a Rest, do not drop iter++; } } } InitCoords( childList ); }
void Tuplet::FilterList() { // We want to keep only notes and rest // Eventually, we also need to filter out grace notes properly (e.g., with sub-beams) ListOfObjects::iterator iter = m_list.begin(); while ( iter != m_list.end()) { LayerElement *currentElement = dynamic_cast<LayerElement*>(*iter); if ( currentElement && !currentElement->HasDurationInterface() ) { iter = m_list.erase( iter ); } else { iter++; } } }
void Chord::FilterList( ListOfObjects *childList ) { // Retain only note children of chords ListOfObjects::iterator iter = childList->begin(); while ( iter != childList->end()) { LayerElement *currentElement = dynamic_cast<LayerElement*>(*iter); if ( !currentElement ) { // remove anything that is not an LayerElement iter = childList->erase( iter ); } else if ( !currentElement->HasDurationInterface() ) { iter = childList->erase( iter ); } else /*if ( dynamic_cast<EditorialElement*>(currentElement)) { Object* object = currentElement->GetFirstChild(&typeid(Note)); if (dynamic_cast<Note*>(object)) { iter++; } } else */{ Note *n = dynamic_cast<Note*>(currentElement); if (n) { iter++; } else { // if it is not a note, drop it iter = childList->erase( iter ); } } } childList->sort(compare_pitch); iter = childList->begin(); this->ClearClusters(); Note *curNote, *lastNote = dynamic_cast<Note*>(*iter); int curPitch, lastPitch = lastNote->GetDiatonicPitch(); ChordCluster* curCluster = NULL; iter++; while ( iter != childList->end()) { curNote = dynamic_cast<Note*>(*iter); curPitch = curNote->GetDiatonicPitch(); if (curPitch - lastPitch == 1) { if(!lastNote->m_cluster) { curCluster = new ChordCluster(); m_clusters.push_back(curCluster); curCluster->push_back(lastNote); lastNote->m_cluster = curCluster; lastNote->m_clusterPosition = (int)curCluster->size(); } curCluster->push_back(curNote); curNote->m_cluster = curCluster; curNote->m_clusterPosition = (int)curCluster->size(); } lastNote = curNote; lastPitch = curPitch; iter++; } }