std::multimap<ReducedFraction, std::string> extractLyricsFromTrack(const MidiTrack &lyricsTrack, int division) { std::multimap<ReducedFraction, std::string> lyrics; for (const auto &i: lyricsTrack.events()) { const auto& e = i.second; if (isLyricEvent(e)) { const uchar* data = (uchar*)e.edata(); std::string text = MidiCharset::fromUchar(data); if (isLyricText(text)) { const auto tick = toMuseScoreTicks(i.first, division); // no charset handling here lyrics.insert({tick, text}); } } } return lyrics; }
void applyAllTempoEvents(const std::multimap<int, MTrack> &tracks, Score *score) { for (const auto &track: tracks) { if (track.second.isDivisionInTps) { // ticks per second const double ticksPerBeat = MScore::division; const double beatsPerSecond = roundToBpm(track.second.division / ticksPerBeat); setTempoToScore(score, 0, beatsPerSecond); } else { // beats per second for (const auto &ie : track.second.mtrack->events()) { const MidiEvent &e = ie.second; if (e.type() == ME_META && e.metaType() == META_TEMPO) { const auto tick = toMuseScoreTicks( 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); setTempoToScore(score, tick.ticks(), beatsPerSecond); } } } } }