diff --git a/include/vrv/metersig.h b/include/vrv/metersig.h index 4e3363e486..ae5304a713 100644 --- a/include/vrv/metersig.h +++ b/include/vrv/metersig.h @@ -54,6 +54,9 @@ class MeterSig : public LayerElement, /** Evaluate additive meter counts */ int GetTotalCount() const; + /** Return the implicit unit according to the sym (if any, return 0 otherwise) */ + int GetSymImplicitUnit() const; + /** * Return the unit (int) as data_DURATION (up to 32). * Return DURATION_4 if no match. diff --git a/src/doc.cpp b/src/doc.cpp index b123741b1c..8d1f276e60 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -503,6 +503,9 @@ void Doc::ExportMIDI(smf::MidiFile *midiFile) if (meterSig && meterSig->HasCount() && meterSig->HasUnit()) { midiFile->addTimeSignature(midiTrack, 0, meterSig->GetTotalCount(), meterSig->GetUnit()); } + else if (meterSig && meterSig->HasSym()) { + midiFile->addTimeSignature(midiTrack, 0, meterSig->GetTotalCount(), meterSig->GetSymImplicitUnit()); + } } // Set initial scoreDef values for tuning diff --git a/src/metersig.cpp b/src/metersig.cpp index 8ff16ecf70..43a4c9228c 100644 --- a/src/metersig.cpp +++ b/src/metersig.cpp @@ -70,7 +70,7 @@ int MeterSig::GetTotalCount() const // If @count is empty, look at the sym to return a resonable value if (counts.empty()) { if (this->HasSym()) { - return (this->GetSym() == METERSIGN_common) ? 4 : 2; + return (this->GetSym() == METERSIGN_cut) ? 2 : 4; } else { return 0; @@ -108,6 +108,16 @@ int MeterSig::GetTotalCount() const return counts.front(); } +int MeterSig::GetSymImplicitUnit() const +{ + if (this->HasSym()) { + return (this->GetSym() == METERSIGN_cut) ? 2 : 4; + } + else { + return 0; + } +} + data_DURATION MeterSig::GetUnitAsDur() const { switch (this->GetUnit()) { diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index c05965ae93..1677485613 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -776,6 +776,10 @@ FunctorCode GenerateMIDIFunctor::VisitScoreDef(const ScoreDef *scoreDef) if (meterSig && meterSig->HasCount() && meterSig->HasUnit()) { m_midiFile->addTimeSignature(m_midiTrack, currentTick, meterSig->GetTotalCount(), meterSig->GetUnit()); } + else if (meterSig && meterSig->HasUnit()) { + m_midiFile->addTimeSignature( + m_midiTrack, currentTick, meterSig->GetTotalCount(), meterSig->GetSymImplicitUnit()); + } } return FUNCTOR_CONTINUE;