Skip to content

Commit 535b593

Browse files
committed
Selectable lyrics import
1 parent a7f5d0a commit 535b593

17 files changed

+401
-149
lines changed

mscore/importmidi.cpp

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -787,23 +787,17 @@ void createNotes(const ReducedFraction &lastTick, QList<MTrack> &tracks, MidiTyp
787787
}
788788
}
789789

790-
QList<TrackMeta> getTracksMeta(const std::multimap<int, MTrack> &tracks,
790+
QList<TrackMeta> getTracksMeta(const QList<MTrack> &tracks,
791791
const MidiFile *mf)
792792
{
793793
QList<TrackMeta> tracksMeta;
794-
int i = 0;
795-
for (auto it = tracks.begin(); it != tracks.end(); ++it, ++i) {
796-
if (i % 2) {
797-
auto prev = it;
798-
--prev;
799-
if (isSameChannel(prev->second, it->second)) {
800-
TrackMeta lastMeta = tracksMeta.back();
801-
tracksMeta.push_back(lastMeta);
802-
continue;
803-
}
794+
for (int i = 0; i < tracks.size(); ++i) {
795+
if (i % 2 && isSameChannel(tracks[i - 1], tracks[i])){
796+
TrackMeta lastMeta = tracksMeta.back();
797+
tracksMeta.push_back(lastMeta);
798+
continue;
804799
}
805-
806-
const MTrack &mt = it->second;
800+
const MTrack &mt = tracks[i];
807801
QString trackName;
808802
for (const auto &ie: mt.mtrack->events()) {
809803
const MidiEvent &e = ie.second;
@@ -817,7 +811,11 @@ QList<TrackMeta> getTracksMeta(const std::multimap<int, MTrack> &tracks,
817811
midiType = MT_GM;
818812
const QString instrName = instrumentName(midiType, mt.program,
819813
mt.mtrack->drumTrack());
820-
tracksMeta.push_back({trackName, instrName, mt.mtrack->drumTrack()});
814+
tracksMeta.push_back({trackName,
815+
instrName,
816+
mt.mtrack->drumTrack(),
817+
mt.initLyricTrackIndex
818+
});
821819
}
822820
return tracksMeta;
823821
}
@@ -844,7 +842,7 @@ void convertMidi(Score *score, const MidiFile *mf)
844842
createNotes(lastTick, trackList, mf->midiType());
845843
createTimeSignatures(score);
846844
score->connectTies();
847-
MidiLyrics::extractLyrics(trackList, mf);
845+
MidiLyrics::setLyrics(mf, trackList);
848846
}
849847

850848
void loadMidiData(MidiFile &mf)
@@ -882,9 +880,12 @@ QList<TrackMeta> extractMidiTracksMeta(const QString &fileName)
882880

883881
Score mockScore;
884882
ReducedFraction lastTick;
885-
const auto tracks = createMTrackList(lastTick, mockScore.sigmap(),
886-
midiData.midiFile(fileName));
887-
return getTracksMeta(tracks, midiData.midiFile(fileName));
883+
const MidiFile *mf = midiData.midiFile(fileName);
884+
const auto tracks = createMTrackList(lastTick, mockScore.sigmap(), mf);
885+
QList<MTrack> trackList = prepareTrackList(tracks);
886+
MidiLyrics::setInitialIndexes(trackList);
887+
888+
return getTracksMeta(trackList, mf);
888889
}
889890

890891
//---------------------------------------------------------

mscore/importmidi_data.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,19 @@ const MidiFile* MidiData::midiFile(const QString &fileName) const
7474
return &(it.value().midiFile);
7575
}
7676

77+
void MidiData::addTrackLyrics(const QString &fileName,
78+
const std::multimap<ReducedFraction, QString> &trackLyrics)
79+
{
80+
data[fileName].lyricTracks.push_back(trackLyrics);
81+
}
82+
83+
const QList<std::multimap<ReducedFraction, QString> >*
84+
MidiData::getLyrics(const QString &fileName)
85+
{
86+
const auto it = data.find(fileName);
87+
if (it == data.end())
88+
return nullptr;
89+
return &it.value().lyricTracks;
90+
}
91+
7792
} // namespace Ms

mscore/importmidi_data.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define IMPORTMIDI_DATA_H
33

44
#include "midi/midifile.h"
5+
#include "importmidi_fraction.h"
56

67

78
namespace Ms {
@@ -22,13 +23,19 @@ class MidiData
2223
void setSelectedRow(const QString &fileName, int row);
2324
void setMidiFile(const QString &fileName, const MidiFile &midiFile);
2425
const MidiFile *midiFile(const QString &fileName) const;
26+
// lyrics
27+
void addTrackLyrics(const QString &fileName,
28+
const std::multimap<ReducedFraction, QString> &trackLyrics);
29+
const QList<std::multimap<ReducedFraction, QString> >* getLyrics(const QString &fileName);
2530

2631
private:
2732
struct MidiDataStore
2833
{
2934
QByteArray HHeaderData;
3035
QByteArray VHeaderData;
3136
QList<TrackData> tracksData;
37+
// tracks of <tick, lyric fragment> from karaoke files
38+
QList<std::multimap<ReducedFraction, QString>> lyricTracks;
3239
int selectedRow = 0;
3340
MidiFile midiFile;
3441
};

mscore/importmidi_inner.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define IMPORTMIDI_INNER_H
33

44
#include "importmidi_fraction.h"
5+
#include "importmidi_tuplet.h"
56

67

78
// ---------------------------------------------------------------------------------------
@@ -42,10 +43,6 @@ enum class DurationType;
4243

4344
} // namespace Meter
4445

45-
namespace MidiTuplet {
46-
class TupletData;
47-
}
48-
4946
class Staff;
5047
class Score;
5148
class MidiTrack;
@@ -64,6 +61,7 @@ class MTrack {
6461
bool hasKey = false;
6562
int indexOfOperation = 0;
6663
int division = 0;
64+
int initLyricTrackIndex = -1;
6765

6866
std::multimap<ReducedFraction, MidiChord> chords;
6967
std::multimap<ReducedFraction, MidiTuplet::TupletData> tuplets; // <tupletOnTime, ...>

0 commit comments

Comments
 (0)