本文整理汇总了C++中MidiDevice::getPrograms方法的典型用法代码示例。如果您正苦于以下问题:C++ MidiDevice::getPrograms方法的具体用法?C++ MidiDevice::getPrograms怎么用?C++ MidiDevice::getPrograms使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MidiDevice
的用法示例。
在下文中一共展示了MidiDevice::getPrograms方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
void
ModifyDeviceCommand::execute()
{
Device *device = m_studio->getDevice(m_device);
if (!device) {
std::cerr << "ERROR: ModifyDeviceCommand::execute(): no such device as " << m_device << std::endl;
return;
}
MidiDevice *midiDevice = dynamic_cast<MidiDevice *>(device);
if (!midiDevice) {
std::cerr << "ERROR: ModifyDeviceCommand::execute(): device " << m_device << " is not a MIDI device" << std::endl;
return;
}
// Save Original Values for Undo
// ??? Really wish we could just m_oldDevice = *(midiDevice). See below.
m_oldName = midiDevice->getName();
m_oldBankList = midiDevice->getBanks();
m_oldProgramList = midiDevice->getPrograms();
m_oldControlList = midiDevice->getControlParameters();
m_oldKeyMappingList = midiDevice->getKeyMappings();
m_oldLibrarianName = midiDevice->getLibrarianName();
m_oldLibrarianEmail = midiDevice->getLibrarianEmail();
m_oldVariationType = midiDevice->getVariationType();
InstrumentList instruments = midiDevice->getAllInstruments();
for (size_t i = 0; i < instruments.size(); ++i) {
// ??? Preserving just the programs isn't enough. We need
// to preserve the rest of the Instrument as well. However,
// the auto/fixed channel feature has made it impossible
// to safely make copies of Instrument objects. Also, Instrument
// has an ID. How should that be handled for undo? ISTM
// that we either need to introduce some sort of copyForUndo()
// hack to each object, or develop a set of standards for coding
// objects that are undo-safe. Sounds like a pretty big project.
m_oldInstrumentPrograms.push_back(instruments[i]->getProgram());
}
// Make the Changes
if (m_changeVariation)
midiDevice->setVariationType(m_variationType);
if (m_overwrite) {
if (m_clearBankAndProgramList) {
midiDevice->clearBankList();
midiDevice->clearProgramList();
midiDevice->clearKeyMappingList();
} else {
if (m_changeBanks)
midiDevice->replaceBankList(m_bankList);
if (m_changePrograms)
midiDevice->replaceProgramList(m_programList);
if (m_changeBanks || m_changePrograms) {
// Make sure the instruments make sense.
for (size_t i = 0; i < instruments.size(); ++i) {
instruments[i]->pickFirstProgram(
midiDevice->isPercussionNumber(i));
}
}
}
if (m_changeKeyMappings) {
midiDevice->replaceKeyMappingList(m_keyMappingList);
}
if (m_rename)
midiDevice->setName(m_name);
midiDevice->setLibrarian(m_librarianName, m_librarianEmail);
} else {
if (m_clearBankAndProgramList) {
midiDevice->clearBankList();
midiDevice->clearProgramList();
} else {
if (m_changeBanks)
midiDevice->mergeBankList(m_bankList);
if (m_changePrograms)
midiDevice->mergeProgramList(m_programList);
}
if (m_changeKeyMappings) {
midiDevice->mergeKeyMappingList(m_keyMappingList);
}
if (m_rename) {
std::string mergeName = midiDevice->getName() +
std::string("/") + m_name;
midiDevice->setName(mergeName);
}
}
//!!! merge option?
if (m_changeControls) {
midiDevice->replaceControlParameters(m_controlList);
}
// ??? Instead of this kludge, we should be calling a Studio::hasChanged()
// which would then notify all observers (e.g. MIPP) who, in turn,
// would update themselves.
//.........这里部分代码省略.........
示例2: getSelectedInstrument
void
MIDIInstrumentParameterPanel::slotSelectBank(int index)
{
RG_DEBUG << "slotSelectBank() begin...";
if (!getSelectedInstrument())
return;
MidiDevice *md =
dynamic_cast<MidiDevice *>(getSelectedInstrument()->getDevice());
if (!md) {
std::cerr << "WARNING: MIDIInstrumentParameterPanel::slotSelectBank(): No MidiDevice for Instrument " << getSelectedInstrument()->getId() << '\n';
return;
}
const MidiBank &bank = m_banks[index];
bool change = false;
if (md->getVariationType() != MidiDevice::VariationFromLSB) {
if (getSelectedInstrument()->getLSB() != bank.getLSB()) {
getSelectedInstrument()->setLSB(bank.getLSB());
change = true;
}
}
if (md->getVariationType() != MidiDevice::VariationFromMSB) {
if (getSelectedInstrument()->getMSB() != bank.getMSB()) {
getSelectedInstrument()->setMSB(bank.getMSB());
change = true;
}
}
// If no change, bail.
if (!change)
return;
// Make sure the Instrument is valid WRT the Device.
// If the current bank/program is not valid for this device, fix it.
if (!getSelectedInstrument()->isProgramValid()) {
// If we're not in variations mode...
if (md->getVariationType() == MidiDevice::NoVariations) {
// ...go with the first program
ProgramList programList = md->getPrograms(bank);
if (!programList.empty()) {
// Switch to the first program in this bank.
getSelectedInstrument()->setProgram(programList.front());
} else {
// No programs for this bank. Just go with 0.
getSelectedInstrument()->setProgramChange(0);
}
} else { // We're in variations mode...
// This is the three-comboboxes (bank/program/variation) case.
// It's an extremely difficult case to handle, so we're just
// going to punt and give them the first program/variation in
// the bank they just selected.
// Get the variation bank list for this bank
BankList bankList;
if (md->getVariationType() == MidiDevice::VariationFromMSB) {
bankList = md->getBanksByLSB(
getSelectedInstrument()->isPercussion(), bank.getLSB());
} else {
bankList = md->getBanksByMSB(
getSelectedInstrument()->isPercussion(), bank.getMSB());
}
if (!bankList.empty()) {
// Pick the first bank
MidiBank firstBank = bankList.front();
// Get the program list
ProgramList programList = md->getPrograms(firstBank);
if (!programList.empty()) {
// Pick the first program
getSelectedInstrument()->setProgram(programList.front());
}
}
// To make the above more complex, we could consider the
// case where the Program Change happens to be valid for
// some variation bank in the newly selected bank. Then
// go with the 0th variation bank that has that program
// change. But I think this is complicated enough.
}
}
getSelectedInstrument()->sendChannelSetup();
// This is why changed() isn't called within
// the setters. If it were, then each of the above changes would
// result in a change notification going out. Worst case, that
// would be three change notifications and the first two would be
// sent when the Instrument was in an inconsistent state.
// Rule: Avoid sending change notifications from setters.
// Why? It reduces the number of notifications which improves
// performance. It avoids sending notifications when an object's
//.........这里部分代码省略.........