diff options
-rw-r--r-- | muse2/muse/instruments/minstrument.cpp | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/muse2/muse/instruments/minstrument.cpp b/muse2/muse/instruments/minstrument.cpp index bd4b3bd4..1349c9c9 100644 --- a/muse2/muse/instruments/minstrument.cpp +++ b/muse2/muse/instruments/minstrument.cpp @@ -49,6 +49,8 @@ namespace MusECore { MidiInstrumentList midiInstruments; MidiInstrument* genericMidiInstrument; +static const char* gmdrumname = "GM-drums"; + //--------------------------------------------------------- // string2sysex //--------------------------------------------------------- @@ -1075,6 +1077,8 @@ QString MidiInstrument::getPatchName(int channel, int prog, MType mode, bool dru tmask = 4; break; case MT_GM: + if(drumchan) + return gmdrumname; tmask = 1; break; default: @@ -1086,8 +1090,10 @@ QString MidiInstrument::getPatchName(int channel, int prog, MType mode, bool dru const PatchList& pl = (*i)->patches; for (ciPatch ipl = pl.begin(); ipl != pl.end(); ++ipl) { const Patch* mp = *ipl; - if ( (pr == mp->prog) - && (mp->drum == drum) + if ((mp->typ & tmask) + && (pr == mp->prog) + && ((drum && mode != MT_GM) || + (mp->drum == drumchan)) && (hbank == mp->hbank || !hb || mp->hbank == -1) && (lbank == mp->lbank || !lb || mp->lbank == -1)) @@ -1101,35 +1107,49 @@ QString MidiInstrument::getPatchName(int channel, int prog, MType mode, bool dru // populatePatchPopup //--------------------------------------------------------- -void MidiInstrument::populatePatchPopup(MusEGui::PopupMenu* menu, int, MType, bool drum) +void MidiInstrument::populatePatchPopup(MusEGui::PopupMenu* menu, int chan, MType songType, bool drum) { menu->clear(); - + int mask = 0; + bool drumchan = chan == 9; + switch (songType) { + case MT_XG: mask = 4; break; + case MT_GS: mask = 2; break; + case MT_GM: + if(drumchan) + { + int id = (0xff << 16) + (0xff << 8) + 0x00; // First patch + QAction* act = menu->addAction(gmdrumname); + //act->setCheckable(true); + act->setData(id); + return; + } + mask = 1; + break; + case MT_UNKNOWN: mask = 7; break; + } if (pg.size() > 1) { for (ciPatchGroup i = pg.begin(); i != pg.end(); ++i) { PatchGroup* pgp = *i; + //QMenu* pm = menu->addMenu(pgp->name); MusEGui::PopupMenu* pm = new MusEGui::PopupMenu(pgp->name, menu, menu->stayOpen()); // Use the parent stayOpen here. + menu->addMenu(pm); + pm->setFont(MusEGlobal::config.fonts[0]); const PatchList& pl = pgp->patches; - bool added=false; for (ciPatch ipl = pl.begin(); ipl != pl.end(); ++ipl) { const Patch* mp = *ipl; - if (mp->drum == drum) + if ((mp->typ & mask) && + ((drum && songType != MT_GM) || + (mp->drum == drumchan)) ) { int id = ((mp->hbank & 0xff) << 16) + ((mp->lbank & 0xff) << 8) + (mp->prog & 0xff); QAction* act = pm->addAction(mp->name); + //act->setCheckable(true); act->setData(id); - added=true; } + } - if (added) - { - menu->addMenu(pm); - pm->setFont(MusEGlobal::config.fonts[0]); - } - else - delete pm; - } } else if (pg.size() == 1 ){ @@ -1137,10 +1157,11 @@ void MidiInstrument::populatePatchPopup(MusEGui::PopupMenu* menu, int, MType, bo const PatchList& pl = pg.front()->patches; for (ciPatch ipl = pl.begin(); ipl != pl.end(); ++ipl) { const Patch* mp = *ipl; - if (mp->drum == drum) { + if (mp->typ & mask) { int id = ((mp->hbank & 0xff) << 16) + ((mp->lbank & 0xff) << 8) + (mp->prog & 0xff); QAction* act = menu->addAction(mp->name); + //act->setCheckable(true); act->setData(id); } } |