Skip to content

Commit f4b9318

Browse files
committed
Merge pull request #1372 from Igevorse/import-export
Export port information to MIDI and MusicXML
2 parents 1ffb9f3 + c148f49 commit f4b9318

File tree

93 files changed

+144
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+144
-1
lines changed

libmscore/part.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,15 @@ int Part::midiChannel() const
237237
return score()->midiChannel(instr(0)->channel(0).channel);
238238
}
239239

240+
//---------------------------------------------------------
241+
// midiPort
242+
//---------------------------------------------------------
243+
244+
int Part::midiPort() const
245+
{
246+
return score()->midiPort(instr(0)->channel(0).channel);
247+
}
248+
240249
//---------------------------------------------------------
241250
// setMidiChannel
242251
// called from importmusicxml

libmscore/part.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class Part : public QObject {
103103
void setMidiProgram(int, int bank = 0);
104104

105105
int midiChannel() const;
106+
int midiPort() const;
106107
void setMidiChannel(int) const;
107108

108109
void insertStaff(Staff*, int idx);

mscore/exportmidi.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ bool ExportMidi::write(const QString& name, bool midiExpandRepeats)
230230
Staff* staff = cs->staff(staffIdx);
231231
Part* part = staff->part();
232232
int channel = part->midiChannel();
233-
track.setOutPort(0);
233+
track.setOutPort(part->midiPort());
234234
track.setOutChannel(channel);
235235

236236
if (staff->isTop()) {
@@ -260,6 +260,16 @@ bool ExportMidi::write(const QString& name, bool midiExpandRepeats)
260260
EventMap events;
261261
cs->renderStaff(&events, staff);
262262

263+
// Export port to MIDI META event
264+
MidiEvent ev;
265+
ev.setType(ME_META);
266+
ev.setMetaType(META_PORT_CHANGE);
267+
ev.setLen(1);
268+
unsigned char* data = new unsigned char[1];
269+
data[0] = int(track.outPort());
270+
ev.setEData(data);
271+
track.insert(0, ev);
272+
263273
for (auto i = events.begin(); i != events.end(); ++i) {
264274
NPlayEvent event(i->second);
265275
int eventChannel = cs->midiChannel(event.channel());

mscore/exportxml.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4069,6 +4069,8 @@ void ExportMusicXml::write(QIODevice* dev)
40694069
xml.etag();
40704070
}
40714071
}
4072+
xml.tag(QString("midi-device port=\"%1\"").arg(part->midiPort() + 1), "");
4073+
40724074
for (int i = 0; i < 128; ++i) {
40734075
DrumInstrument di = drumset->drum(i);
40744076
if (di.notehead != NoteHead::Group::HEAD_INVALID) {
@@ -4089,6 +4091,8 @@ void ExportMusicXml::write(QIODevice* dev)
40894091
xml.tag("instrument-name", MScoreTextToMXML::toPlainText(part->longName()));
40904092
xml.etag();
40914093

4094+
xml.tag(QString("midi-device id=\"P%1-I%2\" port=\"%3\"").arg(idx+1).arg(3).arg(part->midiPort() + 1), "");
4095+
40924096
xml.stag(QString("midi-instrument id=\"P%1-I%2\"").arg(idx+1).arg(3));
40934097
if (part->midiChannel() >= 0) // <0 is not valid
40944098
xml.tag("midi-channel", part->midiChannel() + 1);

mscore/importmidi.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,9 @@ void MTrack::processMeta(int tick, const MidiEvent& mm)
269269
break;
270270
case META_TIME_SIGNATURE:
271271
break; // added earlier
272+
case META_PORT_CHANGE:
273+
// TODO
274+
break;
272275
default:
273276
if (MScore::debugMode)
274277
qDebug("unknown meta type 0x%02x", mm.metaType());

mscore/importxml.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,6 +1558,10 @@ void MusicXml::xmlScorePart(QDomElement e, QString id, int& parts)
15581558
domError(ee);
15591559
}
15601560
}
1561+
else if (e.tagName() == "midi-device") {
1562+
// TODO
1563+
domNotImplemented(e);
1564+
}
15611565
else
15621566
domError(e);
15631567
}

mtest/musicxml/io/testAccidentals1.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<score-instrument id="P1-I3">
1919
<instrument-name>Staff 1</instrument-name>
2020
</score-instrument>
21+
<midi-device id="P1-I3" port="1"></midi-device>
2122
<midi-instrument id="P1-I3">
2223
<midi-channel>1</midi-channel>
2324
<midi-program>1</midi-program>

mtest/musicxml/io/testAccidentals2.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<score-instrument id="P1-I3">
1919
<instrument-name>Staff 1</instrument-name>
2020
</score-instrument>
21+
<midi-device id="P1-I3" port="1"></midi-device>
2122
<midi-instrument id="P1-I3">
2223
<midi-channel>1</midi-channel>
2324
<midi-program>1</midi-program>

mtest/musicxml/io/testAccidentals3.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<score-instrument id="P1-I3">
1717
<instrument-name></instrument-name>
1818
</score-instrument>
19+
<midi-device id="P1-I3" port="1"></midi-device>
1920
<midi-instrument id="P1-I3">
2021
<midi-channel>1</midi-channel>
2122
<midi-program>74</midi-program>

mtest/musicxml/io/testArpGliss1.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<score-instrument id="P1-I3">
1919
<instrument-name>Voice</instrument-name>
2020
</score-instrument>
21+
<midi-device id="P1-I3" port="1"></midi-device>
2122
<midi-instrument id="P1-I3">
2223
<midi-channel>1</midi-channel>
2324
<midi-program>53</midi-program>

0 commit comments

Comments
 (0)