From bb051000dffccd7e959188f2d7069bc71e325ea0 Mon Sep 17 00:00:00 2001 From: Casper Jeukendrup <48658420+cbjeukendrup@users.noreply.github.com> Date: Fri, 17 Oct 2025 22:32:33 +0200 Subject: [PATCH 1/2] MIDI import: don't round tempo Resolves: https://github.com/musescore/MuseScore/issues/14349 Closes https://github.com/musescore/MuseScore/pull/15115 Co-authored-by: shachiang428 --- .../internal/midiimport/importmidi_tempo.cpp | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/importexport/midi/internal/midiimport/importmidi_tempo.cpp b/src/importexport/midi/internal/midiimport/importmidi_tempo.cpp index e4e2b7618646d..4408701ea4258 100644 --- a/src/importexport/midi/internal/midiimport/importmidi_tempo.cpp +++ b/src/importexport/midi/internal/midiimport/importmidi_tempo.cpp @@ -78,39 +78,28 @@ void setTempoToScore(Score* score, int tick, double beatsPerSecond) auto* data = midiImportOperations.data(); if (data->trackOpers.showTempoText.value()) { - const int tempoInBpm = qRound(beatsPerSecond * 60.0); - Measure* measure = score->tick2measure(Fraction::fromTicks(tick)); if (!measure) { LOGD("MidiTempo::setTempoToScore: no measure for tick %d", tick); return; } - Segment* segment = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(tick)); - if (!segment) { - LOGD("MidiTempo::setTempoToScore: no chord/rest segment for tempo at %d", tick); - return; - } + Segment* segment = measure->getChordRestOrTimeTickSegment(Fraction::fromTicks(tick)); TempoText* tempoText = mu::engraving::Factory::createTempoText(segment); tempoText->setTempo(beatsPerSecond); - tempoText->setXmlText(QString("metNoteQuarterUp = %1").arg(tempoInBpm)); + tempoText->setXmlText(String(u"metNoteQuarterUp = %1").arg(beatsPerSecond * 60.0)); tempoText->setTrack(0); segment->add(tempoText); data->hasTempoText = true; // to show tempo text column in the MIDI import panel } } -double roundToBpm(double beatsPerSecond) -{ - return qRound(beatsPerSecond * 60.0) / 60.0; -} - void applyAllTempoEvents(const std::multimap& tracks, Score* score) { for (const auto& track: tracks) { if (track.second.isDivisionInTps) { // ticks per second const double ticksPerBeat = Constants::DIVISION; - const double beatsPerSecond = roundToBpm(track.second.division / ticksPerBeat); + const double beatsPerSecond = track.second.division / ticksPerBeat; setTempoToScore(score, 0, beatsPerSecond); } else { // beats per second for (const auto& ie : track.second.mtrack->events()) { @@ -120,7 +109,7 @@ void applyAllTempoEvents(const std::multimap& tracks, Score* score) ie.first, track.second.division, false); const uchar* data = (uchar*)e.edata(); const unsigned tempo = data[2] + (data[1] << 8) + (data[0] << 16); - const double beatsPerSecond = roundToBpm(1000000.0 / tempo); + const double beatsPerSecond = 1000000.0 / tempo; setTempoToScore(score, tick.ticks(), beatsPerSecond); } } @@ -164,7 +153,7 @@ void setTempo(const std::multimap& tracks, Score* score) averageTempoFactor /= counter; const double basicTempo = MidiTempo::findBasicTempo(tracks, true); - const double tempo = roundToBpm(basicTempo * averageTempoFactor); + const double tempo = basicTempo * averageTempoFactor; score->tempomap()->clear(); // use only one tempo marking for all score setTempoToScore(score, 0, tempo); From b74a20849d49b6f84413d0b575891e5aa67f80b2 Mon Sep 17 00:00:00 2001 From: Calum Matheson Date: Mon, 20 Oct 2025 13:10:55 +0200 Subject: [PATCH 2/2] Update midi import test --- .../midi/tests/midiimport_data/human_tempo-ref.mscx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/importexport/midi/tests/midiimport_data/human_tempo-ref.mscx b/src/importexport/midi/tests/midiimport_data/human_tempo-ref.mscx index c559b65fd1fe7..4a172bcaca7a5 100644 --- a/src/importexport/midi/tests/midiimport_data/human_tempo-ref.mscx +++ b/src/importexport/midi/tests/midiimport_data/human_tempo-ref.mscx @@ -101,9 +101,9 @@ 4 - 2.2 + 2.19233 G_G - metNoteQuarterUp = 132 + metNoteQuarterUp = 131.539816 H_H