MidiControllerList::MidiControllerList(const MidiControllerList& mcl) : std::map<int, MidiController*>() { for(ciMidiController i = mcl.begin(); i != mcl.end(); ++i) { MidiController* mc = i->second; add(new MidiController(*mc)); } }
MidiController* MidiPort::midiController(int num) const { if (_instrument && _device && _device->isSynthPlugin() == false) { MidiControllerList* mcl = _instrument->controller(); for (iMidiController i = mcl->begin(); i != mcl->end(); ++i) { int cn = i->second->num(); if (cn == num) return i->second; // wildcard? if (((cn & 0xff) == 0xff) && ((cn & ~0xff) == (num & ~0xff))) return i->second; } } for (iMidiController i = defaultMidiController.begin(); i != defaultMidiController.end(); ++i) { int cn = i->second->num(); if (cn == num) return i->second; // wildcard? if (((cn & 0xff) == 0xff) && ((cn & ~0xff) == (num & ~0xff))) return i->second; } QString name = midiCtrlName(num); int min = 0; int max = 127; MidiController::ControllerType t = midiControllerType(num); switch (t) { case MidiController::RPN: case MidiController::NRPN: case MidiController::Controller7: max = 127; break; case MidiController::Controller14: case MidiController::RPN14: case MidiController::NRPN14: max = 16383; break; case MidiController::Program: max = 0xffffff; break; case MidiController::Pitch: max = 8191; min = -8192; break; case MidiController::Velo: // cannot happen break; } MidiController* c = new MidiController(name, num, min, max, 0); defaultMidiController.add(c); return c; }
void LOS::importController(int channel, MidiPort* mport, int n) { MidiInstrument* instr = mport->instrument(); MidiCtrlValListList* vll = mport->controller(); iMidiCtrlValList i = vll->find(channel, n); if (i != vll->end()) return; // controller does already exist MidiController* ctrl = 0; MidiControllerList* mcl = instr->controller(); // printf("import Ctrl\n"); for (iMidiController i = mcl->begin(); i != mcl->end(); ++i) { MidiController* mc = i->second; int cn = mc->num(); // printf(" %x %x\n", n, cn); if (cn == n) { ctrl = mc; break; } // wildcard? if (((cn & 0xff) == 0xff) && ((cn & ~0xff) == (n & ~0xff))) { ctrl = i->second; break; } } if (ctrl == 0) { printf("controller 0x%x not defined for instrument %s, channel %d\n", n, instr->iname().toLatin1().constData(), channel); // TODO: register default Controller // MidiController* MidiPort::midiController(int num) const } MidiCtrlValList* newValList = new MidiCtrlValList(n); vll->add(channel, newValList); }