Skip to content

Commit bb05100

Browse files
MIDI import: don't round tempo
Resolves: #14349 Closes #15115 Co-authored-by: shachiang428 <shachiang428@gmail.com>
1 parent 993c798 commit bb05100

File tree

1 file changed

+5
-16
lines changed

1 file changed

+5
-16
lines changed

src/importexport/midi/internal/midiimport/importmidi_tempo.cpp

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -78,39 +78,28 @@ void setTempoToScore(Score* score, int tick, double beatsPerSecond)
7878

7979
auto* data = midiImportOperations.data();
8080
if (data->trackOpers.showTempoText.value()) {
81-
const int tempoInBpm = qRound(beatsPerSecond * 60.0);
82-
8381
Measure* measure = score->tick2measure(Fraction::fromTicks(tick));
8482
if (!measure) {
8583
LOGD("MidiTempo::setTempoToScore: no measure for tick %d", tick);
8684
return;
8785
}
88-
Segment* segment = measure->getSegment(SegmentType::ChordRest, Fraction::fromTicks(tick));
89-
if (!segment) {
90-
LOGD("MidiTempo::setTempoToScore: no chord/rest segment for tempo at %d", tick);
91-
return;
92-
}
86+
Segment* segment = measure->getChordRestOrTimeTickSegment(Fraction::fromTicks(tick));
9387

9488
TempoText* tempoText = mu::engraving::Factory::createTempoText(segment);
9589
tempoText->setTempo(beatsPerSecond);
96-
tempoText->setXmlText(QString("<sym>metNoteQuarterUp</sym> = %1").arg(tempoInBpm));
90+
tempoText->setXmlText(String(u"<sym>metNoteQuarterUp</sym> = %1").arg(beatsPerSecond * 60.0));
9791
tempoText->setTrack(0);
9892
segment->add(tempoText);
9993
data->hasTempoText = true; // to show tempo text column in the MIDI import panel
10094
}
10195
}
10296

103-
double roundToBpm(double beatsPerSecond)
104-
{
105-
return qRound(beatsPerSecond * 60.0) / 60.0;
106-
}
107-
10897
void applyAllTempoEvents(const std::multimap<int, MTrack>& tracks, Score* score)
10998
{
11099
for (const auto& track: tracks) {
111100
if (track.second.isDivisionInTps) { // ticks per second
112101
const double ticksPerBeat = Constants::DIVISION;
113-
const double beatsPerSecond = roundToBpm(track.second.division / ticksPerBeat);
102+
const double beatsPerSecond = track.second.division / ticksPerBeat;
114103
setTempoToScore(score, 0, beatsPerSecond);
115104
} else { // beats per second
116105
for (const auto& ie : track.second.mtrack->events()) {
@@ -120,7 +109,7 @@ void applyAllTempoEvents(const std::multimap<int, MTrack>& tracks, Score* score)
120109
ie.first, track.second.division, false);
121110
const uchar* data = (uchar*)e.edata();
122111
const unsigned tempo = data[2] + (data[1] << 8) + (data[0] << 16);
123-
const double beatsPerSecond = roundToBpm(1000000.0 / tempo);
112+
const double beatsPerSecond = 1000000.0 / tempo;
124113
setTempoToScore(score, tick.ticks(), beatsPerSecond);
125114
}
126115
}
@@ -164,7 +153,7 @@ void setTempo(const std::multimap<int, MTrack>& tracks, Score* score)
164153
averageTempoFactor /= counter;
165154

166155
const double basicTempo = MidiTempo::findBasicTempo(tracks, true);
167-
const double tempo = roundToBpm(basicTempo * averageTempoFactor);
156+
const double tempo = basicTempo * averageTempoFactor;
168157

169158
score->tempomap()->clear(); // use only one tempo marking for all score
170159
setTempoToScore(score, 0, tempo);

0 commit comments

Comments
 (0)