Merge pull request #2064 from Igevorse/bugs1

fix #64961 + checking MIDI port ranges in MIDI and MusicXML export
This commit is contained in:
Nicolas Froment 2015-06-13 14:29:10 +02:00
commit de3a7c2608
10 changed files with 45719 additions and 14 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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);
}
}

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -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"

View file

@ -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>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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"); }