int Measure::ConvertToCastOffMensural(FunctorParams *functorParams) { ConvertToCastOffMensuralParams *params = dynamic_cast<ConvertToCastOffMensuralParams *>(functorParams); assert(params); // We are processing by staff/layer from the call below - we obviously do not want to loop... if (params->m_targetMeasure) { return FUNCTOR_CONTINUE; } bool convertToMeasured = params->m_doc->GetOptions()->m_mensuralToMeasure.GetValue(); assert(params->m_targetSystem); assert(params->m_layerTree); // Create a temporary subsystem for receiving the measure segments System targetSubSystem; params->m_targetSubSystem = &targetSubSystem; // Create the first measure segment - problem: we are dropping the section element - we should create a score-based // MEI file instead Measure *measure = new Measure(convertToMeasured); if (convertToMeasured) { measure->SetN(StringFormat("%d", params->m_segmentTotal + 1)); } params->m_targetSubSystem->AddChild(measure); ArrayOfComparisons filters; // Now we can process by layer and move their content to (measure) segments for (auto const &staves : params->m_layerTree->child) { for (auto const &layers : staves.second.child) { // Create ad comparison object for each type / @n AttNIntegerComparison matchStaff(STAFF, staves.first); AttNIntegerComparison matchLayer(LAYER, layers.first); filters = { &matchStaff, &matchLayer }; params->m_segmentIdx = 1; params->m_targetMeasure = measure; Functor convertToCastOffMensural(&Object::ConvertToCastOffMensural); this->Process(&convertToCastOffMensural, params, NULL, &filters); } } params->m_targetMeasure = NULL; params->m_targetSubSystem = NULL; params->m_segmentTotal = targetSubSystem.GetChildCount(); // Copy the measure segments to the final target segment params->m_targetSystem->MoveChildrenFrom(&targetSubSystem); return FUNCTOR_SIBLINGS; }