From: werner s. <wsc...@us...> - 2005-05-26 10:52:37
|
Update of /cvsroot/lmuse/muse/muse/instruments In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18064/muse/instruments Modified Files: minstrument.cpp minstrument.h Log Message: drum maps Index: minstrument.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/instruments/minstrument.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** minstrument.cpp 23 May 2005 14:18:18 -0000 1.18 --- minstrument.cpp 26 May 2005 10:52:20 -0000 1.19 *************** *** 14,23 **** #include "midictrl.h" #include "gconfig.h" MidiInstrumentList midiInstruments; MidiInstrument* genericMidiInstrument; - // static char* gmdrumname = "GM-drums"; - //--------------------------------------------------------- // loadIDF --- 14,22 ---- #include "midictrl.h" #include "gconfig.h" + #include "midiedit/drummap.h" MidiInstrumentList midiInstruments; MidiInstrument* genericMidiInstrument; //--------------------------------------------------------- // loadIDF *************** *** 207,218 **** for (; !node.isNull(); node = node.nextSibling()) { QDomElement e = node.toElement(); ! if (e.tagName().isEmpty()) ! continue; ! if (e.tagName() == "Patch") { Patch patch; ! patch.read(node); patches.push_back(patch); } ! else printf("MusE:PatchGroup(): unknown tag %s in group %s\n", e.tagName().latin1(), name.latin1()); --- 206,222 ---- for (; !node.isNull(); node = node.nextSibling()) { QDomElement e = node.toElement(); ! QString tag(e.tagName()); ! ! if (tag == "Patch") { Patch patch; ! patch.read(node, false); patches.push_back(patch); } ! else if (tag == "drummap") { ! Patch patch; ! patch.read(node, true); ! patches.push_back(patch); ! } ! else if (!tag.isEmpty()) printf("MusE:PatchGroup(): unknown tag %s in group %s\n", e.tagName().latin1(), name.latin1()); *************** *** 224,228 **** //--------------------------------------------------------- ! void Patch::read(QDomNode node) { QDomElement e = node.toElement(); --- 228,232 ---- //--------------------------------------------------------- ! void Patch::read(QDomNode node, bool dr) { QDomElement e = node.toElement(); *************** *** 232,236 **** lbank = e.attribute(QString("lbank"), "-1").toInt(); prog = e.attribute(QString("prog"), "0").toInt(); ! drum = e.attribute(QString("drum"), "0").toInt(); } --- 236,270 ---- lbank = e.attribute(QString("lbank"), "-1").toInt(); prog = e.attribute(QString("prog"), "0").toInt(); ! drumMap = 0; ! if (!dr) ! return; ! drumMap = new DrumMap(); ! int idx = 0; ! for (node = node.firstChild(); !node.isNull(); node = node.nextSibling()) { ! e = node.toElement(); ! QString tag(e.tagName()); ! if (tag == "entry") { ! DrumMapEntry* de = drumMap->entry(idx); ! for (QDomNode n = node.firstChild(); !n.isNull(); n = n.nextSibling()) { ! e = n.toElement(); ! QString tag(e.tagName()); ! QString s(e.text()); ! int i = s.toInt(); ! if (tag == "name") ! de->name = s; ! else if (tag == "enote") ! de->enote = i; ! else if (tag == "anote") ! de->anote = i; ! else if (!tag.isEmpty()) ! printf("Patch:drummap:entry: unknown tag %s\n", tag.latin1()); ! } ! ++idx; ! } ! else if (!tag.isEmpty()) { ! printf("Patch: read drummap: unknown tag %s\n", tag.latin1()); ! } ! } ! drumMap->init(); } *************** *** 259,263 **** if (tag == "Patch") { Patch patch; ! patch.read(node); if (pg.empty()) { PatchGroup p; --- 293,308 ---- if (tag == "Patch") { Patch patch; ! patch.read(node, false); ! if (pg.empty()) { ! PatchGroup p; ! p.patches.push_back(patch); ! pg.push_back(p); ! } ! else ! pg[0].patches.push_back(patch); ! } ! else if (tag == "drummap") { ! Patch patch; ! patch.read(node, true); if (pg.empty()) { PatchGroup p; *************** *** 309,313 **** //--------------------------------------------------------- ! const char* MidiInstrument::getPatchName(int channel, int prog) { int hbank = (prog >> 16) & 0xff; --- 354,358 ---- //--------------------------------------------------------- ! const char* MidiInstrument::getPatchName(int /*channel*/, int prog) { int hbank = (prog >> 16) & 0xff; *************** *** 318,322 **** int tmask = 1; - int drum = channel == 9; bool hb = hbank == 0xff; bool lb = lbank == 0xff; --- 363,366 ---- *************** *** 328,332 **** if ((mp.typ & tmask) && (prog == mp.prog) - && (mp.drum == drum) && (hbank == mp.hbank || hb || mp.hbank == -1) && (lbank == mp.lbank || lb || mp.lbank == -1)) --- 372,375 ---- *************** *** 338,341 **** --- 381,415 ---- //--------------------------------------------------------- + // getDrumMap + //--------------------------------------------------------- + + DrumMap* MidiInstrument::getDrumMap(int prog) + { + int hbank = (prog >> 16) & 0xff; + int lbank = (prog >> 8) & 0xff; + prog &= 0xff; + if (prog == 0xff) + return 0; + + int tmask = 1; + bool hb = hbank == 0xff; + bool lb = lbank == 0xff; + + for (std::vector<PatchGroup>::iterator i = pg.begin(); i != pg.end(); ++i) { + PatchList& pl = i->patches; + for (PatchList::const_iterator ipl = pl.begin(); ipl != pl.end(); ++ipl) { + const Patch& mp = *ipl; + if ((mp.typ & tmask) + && (prog == mp.prog) + && (hbank == mp.hbank || hb || mp.hbank == -1) + && (lbank == mp.lbank || lb || mp.lbank == -1)) { + return mp.drumMap; + } + } + } + return 0; + } + + //--------------------------------------------------------- // populatePatchPopup //--------------------------------------------------------- Index: minstrument.h =================================================================== RCS file: /cvsroot/lmuse/muse/muse/instruments/minstrument.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** minstrument.h 23 May 2005 14:18:19 -0000 1.8 --- minstrument.h 26 May 2005 10:52:20 -0000 1.9 *************** *** 17,20 **** --- 17,21 ---- class MidiController; class MidiEvent; + class DrumMap; //--------------------------------------------------------- *************** *** 26,31 **** signed char hbank, lbank, prog; QString name; ! bool drum; ! void read(QDomNode); }; --- 27,32 ---- signed char hbank, lbank, prog; QString name; ! DrumMap* drumMap; ! void read(QDomNode, bool); }; *************** *** 86,89 **** --- 87,92 ---- virtual const char* getPatchName(int,int); + virtual DrumMap* getDrumMap(int); + virtual void populatePatchPopup(QPopupMenu*, int); void read(QDomNode); |