diff --git a/Sourcecode/mx/api/BarlineData.h b/Sourcecode/mx/api/BarlineData.h index 749cfc5df..2d4833afb 100644 --- a/Sourcecode/mx/api/BarlineData.h +++ b/Sourcecode/mx/api/BarlineData.h @@ -20,28 +20,46 @@ namespace mx normal, lightLight, lightHeavy, - heavyLight + heavyLight, + dotted, + dashed, + heavy, + heavyHeavy }; + + enum class EndingType + { + none, + start, + stop, + discontinue + }; + class BarlineData { public: int tickTimePosition; BarlineType barlineType; + EndingType endingType; + int endingNumber; HorizontalAlignment location; BarlineData() : tickTimePosition{ 0 } , barlineType{ BarlineType::normal } + , endingType{ EndingType::none } + , endingNumber { 0 } , location{ HorizontalAlignment::right } { - } }; MXAPI_EQUALS_BEGIN( BarlineData ) MXAPI_EQUALS_MEMBER( tickTimePosition ) MXAPI_EQUALS_MEMBER( barlineType ) + MXAPI_EQUALS_MEMBER( endingType ) + MXAPI_EQUALS_MEMBER( endingNumber ) MXAPI_EQUALS_MEMBER( location ) MXAPI_EQUALS_END; MXAPI_NOT_EQUALS_AND_VECTORS( BarlineData ); diff --git a/Sourcecode/mx/core/elements/MeasureAttributes.h b/Sourcecode/mx/core/elements/MeasureAttributes.h index 9ec808f79..7cbe66794 100755 --- a/Sourcecode/mx/core/elements/MeasureAttributes.h +++ b/Sourcecode/mx/core/elements/MeasureAttributes.h @@ -31,7 +31,7 @@ namespace mx YesNo implicit; YesNo nonControlling; TenthsValue width; - const bool hasNumber; + const bool hasNumber; bool hasImplicit; bool hasNonControlling; bool hasWidth; diff --git a/Sourcecode/mx/impl/Converter.cpp b/Sourcecode/mx/impl/Converter.cpp index ccb76015f..47b5caf87 100644 --- a/Sourcecode/mx/impl/Converter.cpp +++ b/Sourcecode/mx/impl/Converter.cpp @@ -331,18 +331,18 @@ namespace mx const std::map Converter::barlineMap = { std::pair{ core::BarStyleEnum::regular, api::BarlineType::normal }, - std::pair{ core::BarStyleEnum::dotted, api::BarlineType::unsupported }, - std::pair{ core::BarStyleEnum::dashed, api::BarlineType::unsupported }, - std::pair{ core::BarStyleEnum::heavy, api::BarlineType::unsupported }, + std::pair{ core::BarStyleEnum::dotted, api::BarlineType::dotted }, + std::pair{ core::BarStyleEnum::dashed, api::BarlineType::dashed }, + std::pair{ core::BarStyleEnum::heavy, api::BarlineType::heavy }, std::pair{ core::BarStyleEnum::lightLight, api::BarlineType::lightLight }, std::pair{ core::BarStyleEnum::lightHeavy, api::BarlineType::lightHeavy }, std::pair{ core::BarStyleEnum::heavyLight, api::BarlineType::heavyLight }, - std::pair{ core::BarStyleEnum::heavyHeavy, api::BarlineType::unsupported }, + std::pair{ core::BarStyleEnum::heavyHeavy, api::BarlineType::heavyHeavy }, std::pair{ core::BarStyleEnum::tick, api::BarlineType::unsupported }, std::pair{ core::BarStyleEnum::short_, api::BarlineType::unsupported }, std::pair{ core::BarStyleEnum::none, api::BarlineType::none }, }; - + const std::map Converter::lineStopMap = { @@ -372,6 +372,14 @@ namespace mx }; + const std::map Converter::endingMap = + { + std::pair{ core::StartStopDiscontinue::start, api::EndingType::start }, + std::pair{ core::StartStopDiscontinue::stop, api::EndingType::stop }, + std::pair{ core::StartStopDiscontinue::discontinue, api::EndingType::discontinue } + }; + + const std::map Converter::fermataMap = { std::pair{ core::FermataShape::normal, api::MarkType::fermataNormal }, @@ -1655,6 +1663,12 @@ namespace mx { return findCoreItem( barlineMap, core::BarStyleEnum::regular, value ); } + + + core::StartStopDiscontinue Converter::convert( api::EndingType value ) const + { + return findCoreItem( endingMap, core::StartStopDiscontinue::start, value ); + } api::BarlineType Converter::convert( core::BarStyleEnum value ) const diff --git a/Sourcecode/mx/impl/Converter.h b/Sourcecode/mx/impl/Converter.h index 42aacd047..299b6fb0d 100644 --- a/Sourcecode/mx/impl/Converter.h +++ b/Sourcecode/mx/impl/Converter.h @@ -91,7 +91,9 @@ namespace mx core::BarStyleEnum convert( api::BarlineType value ) const; api::BarlineType convert( core::BarStyleEnum value ) const; - + + core::StartStopDiscontinue convert( api::EndingType value ) const; + core::RightLeftMiddle convertBarlinePlacement( api::HorizontalAlignment value ) const; api::HorizontalAlignment convertBarlinePlacement( core::RightLeftMiddle value ) const; @@ -133,6 +135,7 @@ namespace mx const static std::map wedgeMap; const static std::map barlineMap; const static std::map barlinePlacementMap; + const static std::map endingMap; const static std::map lineStopMap; const static std::map bracketMap; const static std::map fermataMap; diff --git a/Sourcecode/mx/impl/MeasureReader.cpp b/Sourcecode/mx/impl/MeasureReader.cpp index ba46b528a..003c46748 100644 --- a/Sourcecode/mx/impl/MeasureReader.cpp +++ b/Sourcecode/mx/impl/MeasureReader.cpp @@ -25,6 +25,7 @@ #include "mx/core/elements/Divisions.h" #include "mx/core/elements/Duration.h" #include "mx/core/elements/EditorialVoiceGroup.h" +#include "mx/core/elements/Ending.h" #include "mx/core/elements/Fifths.h" #include "mx/core/elements/Fifths.h" #include "mx/core/elements/FiguredBass.h" @@ -526,6 +527,8 @@ namespace mx const auto& attr = *inMxBarline.getAttributes(); auto loc = api::HorizontalAlignment::unspecified; auto style = api::BarlineType::unspecified; + auto endingType = api::EndingType::none; + auto endingNumber = 0; if( attr.hasLocation ) { @@ -547,8 +550,38 @@ namespace mx barline.tickTimePosition = myCurrentCursor.tickTimePosition; } + if( inMxBarline.getHasEnding() ) + { + const auto& ending = inMxBarline.getEnding(); + const auto& endingAttributes = ending->getAttributes(); + + switch (endingAttributes->type) + { + case core::StartStopDiscontinue::start: + endingType = api::EndingType::start; + break; + + case core::StartStopDiscontinue::stop: + endingType = api::EndingType::stop; + break; + + case core::StartStopDiscontinue::discontinue: + endingType = api::EndingType::discontinue; + break; + }; + + const auto& number = endingAttributes->number; + const auto& numValues = number.getValues(); + if (!numValues.empty()) { + const auto iter = numValues.begin(); + endingNumber = *iter; + } + } + barline.barlineType = style; barline.location = loc; + barline.endingType = endingType; + barline.endingNumber = endingNumber; myOutMeasureData.barlines.emplace_back( std::move( barline ) ); } diff --git a/Sourcecode/mx/impl/MeasureWriter.cpp b/Sourcecode/mx/impl/MeasureWriter.cpp index c5f51f40b..cfa2f19d8 100644 --- a/Sourcecode/mx/impl/MeasureWriter.cpp +++ b/Sourcecode/mx/impl/MeasureWriter.cpp @@ -601,6 +601,7 @@ namespace mx } } + void MeasureWriter::writeDirection( const api::DirectionData& inDirectionData ) { if( myPropertiesWriter ) @@ -632,16 +633,29 @@ namespace mx barlineElement->setHasBarStyle( true ); barlineElement->getBarStyle()->setValue( myConverter.convert( myBarlinesIter->barlineType ) ); } + if( myBarlinesIter->endingType != api::EndingType::none ) + { + barlineElement->setHasEnding( true ); + auto ending = barlineElement->getEnding(); + ending->getAttributes()->type = myConverter.convert( myBarlinesIter->endingType ); + + if( myBarlinesIter->endingNumber > 0 ) + { + ending->getAttributes()->number = std::to_string( myBarlinesIter->endingNumber ); + } + } if( myBarlinesIter->location != api::HorizontalAlignment::unspecified ) { barlineElement->getAttributes()->hasLocation = true; barlineElement->getAttributes()->location = myConverter.convertBarlinePlacement( myBarlinesIter->location ); } + myOutMeasure->getMusicDataGroup()->addMusicDataChoice( mdc ); myHistory.log( "writeBarline" ); } } + void MeasureWriter::History::advanceTickTimePosition( int amount, std::string reason ) { HistoryRecord record; diff --git a/Xcode/Mx.xcodeproj/xcshareddata/xcschemes/Mx.xcscheme b/Xcode/Mx.xcodeproj/xcshareddata/xcschemes/Mx.xcscheme deleted file mode 100644 index cbb672493..000000000 --- a/Xcode/Mx.xcodeproj/xcshareddata/xcschemes/Mx.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Xcode/Mx.xcodeproj/xcshareddata/xcschemes/dylib-iOS.xcscheme b/Xcode/Mx.xcodeproj/xcshareddata/xcschemes/dylib-iOS.xcscheme deleted file mode 100644 index f2791fe43..000000000 --- a/Xcode/Mx.xcodeproj/xcshareddata/xcschemes/dylib-iOS.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Xcode/Mx.xcodeproj/xcshareddata/xcschemes/dylib-macOS.xcscheme b/Xcode/Mx.xcodeproj/xcshareddata/xcschemes/dylib-macOS.xcscheme deleted file mode 100644 index 34bda479e..000000000 --- a/Xcode/Mx.xcodeproj/xcshareddata/xcschemes/dylib-macOS.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -