summaryrefslogtreecommitdiff
path: root/muse2/muse/midi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse/midi.cpp')
-rw-r--r--muse2/muse/midi.cpp97
1 files changed, 76 insertions, 21 deletions
diff --git a/muse2/muse/midi.cpp b/muse2/muse/midi.cpp
index d70b132c..24876813 100644
--- a/muse2/muse/midi.cpp
+++ b/muse2/muse/midi.cpp
@@ -33,6 +33,7 @@
#include "midictrl.h"
#include "marker/marker.h"
#include "midiport.h"
+#include "minstrument.h"
#include "midictrl.h"
#include "sync.h"
#include "audio.h"
@@ -52,11 +53,15 @@ extern void dump(const unsigned char* p, int n);
const unsigned char gmOnMsg[] = { 0x7e, 0x7f, 0x09, 0x01 };
+const unsigned char gm2OnMsg[] = { 0x7e, 0x7f, 0x09, 0x03 };
+const unsigned char gmOffMsg[] = { 0x7e, 0x7f, 0x09, 0x02 };
const unsigned char gsOnMsg[] = { 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7f, 0x00, 0x41 };
const unsigned char gsOnMsg2[] = { 0x41, 0x10, 0x42, 0x12, 0x40, 0x01, 0x33, 0x50, 0x3c };
const unsigned char gsOnMsg3[] = { 0x41, 0x10, 0x42, 0x12, 0x40, 0x01, 0x34, 0x50, 0x3b };
const unsigned char xgOnMsg[] = { 0x43, 0x10, 0x4c, 0x00, 0x00, 0x7e, 0x00 };
const unsigned int gmOnMsgLen = sizeof(gmOnMsg);
+const unsigned int gm2OnMsgLen = sizeof(gm2OnMsg);
+const unsigned int gmOffMsgLen = sizeof(gmOffMsg);
const unsigned int gsOnMsgLen = sizeof(gsOnMsg);
const unsigned int gsOnMsg2Len = sizeof(gsOnMsg2);
const unsigned int gsOnMsg3Len = sizeof(gsOnMsg3);
@@ -115,11 +120,12 @@ QString midiMetaName(int meta)
// QString nameSysex
//---------------------------------------------------------
-QString nameSysex(unsigned int len, const unsigned char* buf)
+QString nameSysex(unsigned int len, const unsigned char* buf, MidiInstrument* instr)
{
QString s;
if(len == 0)
return s;
+
switch(buf[0]) {
case 0x00:
if(len < 3)
@@ -127,12 +133,12 @@ QString nameSysex(unsigned int len, const unsigned char* buf)
if (buf[1] == 0 && buf[2] == 0x41)
s = "Microsoft";
break;
- case 0x01: s = "Sequential Circuits: "; break;
- case 0x02: s = "Big Briar: "; break;
- case 0x03: s = "Octave / Plateau: "; break;
- case 0x04: s = "Moog: "; break;
- case 0x05: s = "Passport Designs: "; break;
- case 0x06: s = "Lexicon: "; break;
+ case 0x01: s = "Sequential Circuits"; break;
+ case 0x02: s = "Big Briar"; break;
+ case 0x03: s = "Octave / Plateau"; break;
+ case 0x04: s = "Moog"; break;
+ case 0x05: s = "Passport Designs"; break;
+ case 0x06: s = "Lexicon"; break;
case 0x07: s = "Kurzweil"; break;
case 0x08: s = "Fender"; break;
case 0x09: s = "Gulbransen"; break;
@@ -142,18 +148,18 @@ QString nameSysex(unsigned int len, const unsigned char* buf)
case 0x0d: s = "Techmar"; break;
case 0x0e: s = "Matthews Research"; break;
case 0x10: s = "Oberheim"; break;
- case 0x11: s = "PAIA: "; break;
- case 0x12: s = "Simmons: "; break;
+ case 0x11: s = "PAIA"; break;
+ case 0x12: s = "Simmons"; break;
case 0x13: s = "DigiDesign"; break;
- case 0x14: s = "Fairlight: "; break;
+ case 0x14: s = "Fairlight"; break;
case 0x15: s = "JL Cooper"; break;
case 0x16: s = "Lowery"; break;
case 0x17: s = "Lin"; break;
case 0x18: s = "Emu"; break;
case 0x1b: s = "Peavy"; break;
- case 0x20: s = "Bon Tempi: "; break;
- case 0x21: s = "S.I.E.L: "; break;
- case 0x23: s = "SyntheAxe: "; break;
+ case 0x20: s = "Bon Tempi"; break;
+ case 0x21: s = "S.I.E.L"; break;
+ case 0x23: s = "SyntheAxe"; break;
case 0x24: s = "Hohner"; break;
case 0x25: s = "Crumar"; break;
case 0x26: s = "Solton"; break;
@@ -163,28 +169,77 @@ QString nameSysex(unsigned int len, const unsigned char* buf)
case 0x2f: s = "Elka"; break;
case 0x36: s = "Cheetah"; break;
case 0x3e: s = "Waldorf"; break;
- case 0x40: s = "Kawai: "; break;
- case 0x41: s = "Roland: "; break;
- case 0x42: s = "Korg: "; break;
- case 0x43: s = "Yamaha: "; break;
+ case 0x40: s = "Kawai"; break;
+ case 0x41: s = "Roland"; break;
+ case 0x42: s = "Korg"; break;
+ case 0x43: s = "Yamaha"; break;
case 0x44: s = "Casio"; break;
case 0x45: s = "Akai"; break;
case MUSE_SYNTH_SYSEX_MFG_ID: s = "MusE Soft Synth"; break;
case 0x7d: s = "Educational Use"; break;
case 0x7e: s = "Universal: Non Real Time"; break;
case 0x7f: s = "Universal: Real Time"; break;
- default: s = "??: "; break;
+ default: s = "??"; break;
}
+
+ if(instr)
+ {
+ // Check for user-defined sysex in instrument...
+ foreach(const MusECore::SysEx* sx, instr->sysex())
+ {
+ if(len == sx->dataLen && memcmp(buf, sx->data, len) == 0)
+ return s + QString(": ") + sx->name;
+ }
+ }
+
//
// following messages should not show up in event list
// they are filtered while importing midi files
//
if ((len == gmOnMsgLen) && memcmp(buf, gmOnMsg, gmOnMsgLen) == 0)
- s += "GM-ON";
+ s += ": GM-ON";
+ else if ((len == gm2OnMsgLen) && memcmp(buf, gm2OnMsg, gm2OnMsgLen) == 0)
+ s += ": GM2-ON";
+ else if ((len == gmOffMsgLen) && memcmp(buf, gmOffMsg, gmOffMsgLen) == 0)
+ s += ": GM-OFF";
+ else if ((len == gsOnMsgLen) && memcmp(buf, gsOnMsg, gsOnMsgLen) == 0)
+ s += ": GS-ON";
+ else if ((len == xgOnMsgLen) && memcmp(buf, xgOnMsg, xgOnMsgLen) == 0)
+ s += ": XG-ON";
+ return s;
+ }
+
+//---------------------------------------------------------
+// QString sysexComment
+//---------------------------------------------------------
+
+QString sysexComment(unsigned int len, const unsigned char* buf, MidiInstrument* instr)
+ {
+ QString s;
+ if(len == 0)
+ return s;
+
+ if(instr)
+ {
+ // Check for user-defined sysex in instrument...
+ foreach(const MusECore::SysEx* sx, instr->sysex())
+ {
+ if(len == sx->dataLen && memcmp(buf, sx->data, len) == 0)
+ return sx->comment;
+ }
+ }
+
+ // These are the common ones we know about so far...
+ if ((len == gmOnMsgLen) && memcmp(buf, gmOnMsg, gmOnMsgLen) == 0)
+ s = QObject::tr("Switch on General Midi Level 1 mode");
+ else if ((len == gm2OnMsgLen) && memcmp(buf, gm2OnMsg, gm2OnMsgLen) == 0)
+ s = QObject::tr("Switch on General Midi Level 2 mode");
+ else if ((len == gmOffMsgLen) && memcmp(buf, gmOffMsg, gmOffMsgLen) == 0)
+ s = QObject::tr("Switch off General Midi Level 1 or 2");
else if ((len == gsOnMsgLen) && memcmp(buf, gsOnMsg, gsOnMsgLen) == 0)
- s += "GS-ON";
+ s = QObject::tr("Switch on Roland GS mode");
else if ((len == xgOnMsgLen) && memcmp(buf, xgOnMsg, xgOnMsgLen) == 0)
- s += "XG-ON";
+ s = QObject::tr("Switch on Yamaha XG mode");
return s;
}