Merge pull request #2064 from Igevorse/bugs1
fix #64961 + checking MIDI port ranges in MIDI and MusicXML export
This commit is contained in:
commit
de3a7c2608
10 changed files with 45719 additions and 14 deletions
|
@ -894,6 +894,7 @@ void Score::rebuildMidiMapping()
|
|||
{
|
||||
_midiMapping.clear();
|
||||
int port = 0;
|
||||
int drumPort = 0;
|
||||
int midiChannel = 0;
|
||||
int idx = 0;
|
||||
int maxport = 0;
|
||||
|
@ -907,9 +908,12 @@ void Score::rebuildMidiMapping()
|
|||
MidiMapping mm;
|
||||
if (port > maxport)
|
||||
maxport = port;
|
||||
if (drumPort > maxport)
|
||||
maxport = drumPort;
|
||||
if (drum) {
|
||||
mm.port = port;
|
||||
mm.port = drumPort;
|
||||
mm.channel = 9;
|
||||
drumPort++;
|
||||
}
|
||||
else {
|
||||
mm.port = port;
|
||||
|
|
|
@ -281,14 +281,16 @@ bool ExportMidi::write(const QString& name, bool midiExpandRepeats)
|
|||
}
|
||||
|
||||
// Export port to MIDI META event
|
||||
MidiEvent ev;
|
||||
ev.setType(ME_META);
|
||||
ev.setMetaType(META_PORT_CHANGE);
|
||||
ev.setLen(1);
|
||||
unsigned char* data = new unsigned char[1];
|
||||
data[0] = int(track.outPort());
|
||||
ev.setEData(data);
|
||||
track.insert(0, ev);
|
||||
if (track.outPort() >= 0 && track.outPort() <= 127) {
|
||||
MidiEvent ev;
|
||||
ev.setType(ME_META);
|
||||
ev.setMetaType(META_PORT_CHANGE);
|
||||
ev.setLen(1);
|
||||
unsigned char* data = new unsigned char[1];
|
||||
data[0] = int(track.outPort());
|
||||
ev.setEData(data);
|
||||
track.insert(0, ev);
|
||||
}
|
||||
|
||||
for (auto i = events.begin(); i != events.end(); ++i) {
|
||||
NPlayEvent event(i->second);
|
||||
|
|
|
@ -4451,7 +4451,9 @@ void ExportMusicXml::write(QIODevice* dev)
|
|||
if (di.notehead != NoteHead::Group::HEAD_INVALID)
|
||||
scoreInstrument(xml, idx + 1, i + 1, di.name);
|
||||
}
|
||||
xml.tag(QString("midi-device port=\"%1\"").arg(part->midiPort() + 1), "");
|
||||
int midiPort = part->midiPort() + 1;
|
||||
if (midiPort >= 1 && midiPort <= 16)
|
||||
xml.tag(QString("midi-device port=\"%1\"").arg(midiPort), "");
|
||||
|
||||
for (int i = 0; i < 128; ++i) {
|
||||
DrumInstrument di = drumset->drum(i);
|
||||
|
@ -4470,8 +4472,10 @@ void ExportMusicXml::write(QIODevice* dev)
|
|||
int midiPort = part->midiPort() + 1;
|
||||
if (ii.value()->channel().size() > 0)
|
||||
midiPort = score()->midiMapping(ii.value()->channel(0)->channel)->port + 1;
|
||||
|
||||
xml.tag(QString("midi-device %1 port=\"%2\"").arg(instrId(idx+1, instNr + 1)).arg(midiPort), "");
|
||||
if (midiPort >= 1 && midiPort <= 16)
|
||||
xml.tag(QString("midi-device %1 port=\"%2\"").arg(instrId(idx+1, instNr + 1)).arg(midiPort), "");
|
||||
else
|
||||
xml.tag(QString("midi-device %1").arg(instrId(idx+1, instNr + 1)), "");
|
||||
midiInstrument(xml, idx + 1, instNr + 1, rim.value(instNr), _score);
|
||||
}
|
||||
}
|
||||
|
|
BIN
mtest/libmscore/midi/testMidiPort-ref.mid
Normal file
BIN
mtest/libmscore/midi/testMidiPort-ref.mid
Normal file
Binary file not shown.
36710
mtest/libmscore/midi/testMidiPort.mscx
Normal file
36710
mtest/libmscore/midi/testMidiPort.mscx
Normal file
File diff suppressed because it is too large
Load diff
|
@ -24,6 +24,7 @@
|
|||
#include "libmscore/note.h"
|
||||
#include "libmscore/keysig.h"
|
||||
#include "mscore/exportmidi.h"
|
||||
#include "mscore/preferences.h"
|
||||
#include <QIODevice>
|
||||
|
||||
#include "libmscore/mcursor.h"
|
||||
|
@ -43,6 +44,7 @@ using namespace Ms;
|
|||
class TestMidi : public QObject, public MTest
|
||||
{
|
||||
Q_OBJECT
|
||||
void midiExportTestRef(const QString& file);
|
||||
|
||||
private slots:
|
||||
void initTestCase();
|
||||
|
@ -51,6 +53,7 @@ class TestMidi : public QObject, public MTest
|
|||
void midi03();
|
||||
void events_data();
|
||||
void events();
|
||||
void midiPortExport() { midiExportTestRef("testMidiPort"); }
|
||||
};
|
||||
|
||||
//---------------------------------------------------------
|
||||
|
@ -371,6 +374,24 @@ void TestMidi::events()
|
|||
// QVERIFY(saveCompareScore(score, writeFile, reference));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// midiExportTest
|
||||
// read a MuseScore mscx file, write to a MIDI file and verify against reference
|
||||
//---------------------------------------------------------
|
||||
|
||||
void TestMidi::midiExportTestRef(const QString& file)
|
||||
{
|
||||
MScore::debugMode = true;
|
||||
preferences.midiExportRPNs = true;
|
||||
Score* score = readScore(DIR + file + ".mscx");
|
||||
QVERIFY(score);
|
||||
score->doLayout();
|
||||
score->rebuildMidiMapping();
|
||||
QVERIFY(saveMidi(score, QString(file) + ".mid"));
|
||||
QVERIFY(compareFiles(QString(file) + ".mid", DIR + QString(file) + "-ref.mid"));
|
||||
delete score;
|
||||
}
|
||||
|
||||
QTEST_MAIN(TestMidi)
|
||||
|
||||
#include "tst_midi.moc"
|
||||
|
|
|
@ -69,7 +69,7 @@
|
|||
<score-instrument id="P2-I64">
|
||||
<instrument-name>open high conga</instrument-name>
|
||||
</score-instrument>
|
||||
<midi-device port="1"></midi-device>
|
||||
<midi-device port="2"></midi-device>
|
||||
<midi-instrument id="P2-I64">
|
||||
<midi-channel>10</midi-channel>
|
||||
<midi-program>1</midi-program>
|
||||
|
@ -84,7 +84,7 @@
|
|||
<score-instrument id="P3-I39">
|
||||
<instrument-name>Acoustic Snare</instrument-name>
|
||||
</score-instrument>
|
||||
<midi-device port="1"></midi-device>
|
||||
<midi-device port="3"></midi-device>
|
||||
<midi-instrument id="P3-I39">
|
||||
<midi-channel>10</midi-channel>
|
||||
<midi-program>1</midi-program>
|
||||
|
|
4238
mtest/musicxml/io/testMidiPortExport.mscx
Normal file
4238
mtest/musicxml/io/testMidiPortExport.mscx
Normal file
File diff suppressed because it is too large
Load diff
4725
mtest/musicxml/io/testMidiPortExport_ref.xml
Normal file
4725
mtest/musicxml/io/testMidiPortExport_ref.xml
Normal file
File diff suppressed because it is too large
Load diff
|
@ -103,6 +103,7 @@ private slots:
|
|||
void lyricsVoice2b() { mxmlIoTestRef("testLyricsVoice2b"); }
|
||||
void manualBreaks() { mxmlIoTest("testManualBreaks"); }
|
||||
void measureLength() { mxmlIoTestRef("testMeasureLength"); }
|
||||
void midiPortExport() { mxmlMscxExportTestRef("testMidiPortExport"); }
|
||||
void multiInstrumentPart1() { mxmlIoTest("testMultiInstrumentPart1"); }
|
||||
//void multiInstrumentPart2() { mxmlIoTest("testMultiInstrumentPart2"); } must also fix exportxml.cpp
|
||||
void multiMeasureRest1() { mxmlIoTestRef("testMultiMeasureRest1"); }
|
||||
|
|
Loading…
Reference in a new issue