void MidiProgramsEditor::modifyCurrentPrograms(const MidiBank &oldBank, const MidiBank &newBank) { ProgramList::iterator it; for (it = m_programList.begin(); it != m_programList.end(); ++it) { if (it->getBank() == oldBank) { *it = MidiProgram(newBank, it->getProgram(), it->getName()); } } }
void MidiDevice::setKeyMappingForProgram(const MidiProgram &program, std::string mapping) { ProgramList::iterator it; for (it = m_programList.begin(); it != m_programList.end(); ++it) { if (*it == program) { it->setKeyMapping(mapping); } } }
ProgramList MidiProgramsEditor::getBankSubset(const MidiBank &bank) { ProgramList program; ProgramList::iterator it; for (it = m_programList.begin(); it != m_programList.end(); ++it) { if (it->getBank() == bank) program.push_back(*it); } return program; }
MidiProgram* MidiProgramsEditor::getProgram(const MidiBank &bank, int programNo) { ProgramList::iterator it = m_programList.begin(); for (; it != m_programList.end(); ++it) { if (it->getBank() == bank && it->getProgram() == programNo) { //Only show hits to avoid overflow of console. RG_DEBUG << "it->getBank() " << "== bank" << endl; return &(*it); } } return 0; }
void MidiProgramsEditor::slotNameChanged(const QString& programName) { const LineEdit* lineEdit = dynamic_cast<const LineEdit*>(sender()); if (!lineEdit) { RG_DEBUG << "MidiProgramsEditor::slotNameChanged() : %%% ERROR - signal sender is not a Rosegarden::LineEdit\n"; return ; } QString senderName = sender()->objectName(); // "Harpsichord" in default GM bank 1:0, "Coupled Harpsichord" in bank 8:0 // if (senderName == "7") std::cout << "senderName is: " << senderName.toStdString() // << " programName is: " << programName.toStdString() << std::endl; // Adjust value back to zero rated // unsigned int id = senderName.toUInt() - 1; // std::cout << "id is: " << id << std::endl; RG_DEBUG << "MidiProgramsEditor::slotNameChanged(" << programName << ") : id = " << id << endl; MidiBank* currBank; currBank = getCurrentBank(); if (!currBank) { RG_DEBUG << "Error: currBank is NULL in MidiProgramsEditor::slotNameChanged() " << endl; return; } else { RG_DEBUG << "currBank: " << currBank << endl; } RG_DEBUG << "current bank name: " << currBank->getName() << endl; MidiProgram *program = getProgram(*currBank, id); // MidiProgram *program = getProgram(*currBank, id); if (program == 0) { // Do nothing if program name is empty if (programName.isEmpty()) return ; program = new MidiProgram(*getCurrentBank(), id); m_programList.push_back(*program); // Sort the program list by id std::sort(m_programList.begin(), m_programList.end(), ProgramCmp()); // Now, get with the program // program = getProgram(*getCurrentBank(), id); } else { // If we've found a program and the label is now empty // then remove it from the program list. // if (programName.isEmpty()) { ProgramList::iterator it = m_programList.begin(); ProgramList tmpProg; for (; it != m_programList.end(); ++it) { if (((unsigned int)it->getProgram()) == id) { m_programList.erase(it); m_bankEditor->slotApply(); RG_DEBUG << "deleting empty program (" << id << ")" << endl; return ; } } } } if (!program) { RG_DEBUG << "Error: program is NULL in MidiProgramsEditor::slotNameChanged() " << endl; return; } else { RG_DEBUG << "program: " << program << endl; } if (qstrtostr(programName) != program->getName()) { program->setName(qstrtostr(programName)); m_bankEditor->slotApply(); } }
void MidiProgramsEditor::populate(QTreeWidgetItem* item) { RG_DEBUG << "MidiProgramsEditor::populate\n"; MidiBankTreeWidgetItem* bankItem = dynamic_cast<MidiBankTreeWidgetItem*>(item); if (!bankItem) { RG_DEBUG << "MidiProgramsEditor::populate : not a bank item - returning\n"; return ; } DeviceId deviceId = bankItem->getDeviceId(); m_device = m_bankEditor->getMidiDevice(deviceId); if (!m_device) return ; setEnabled(true); setBankName(item->text(0)); RG_DEBUG << "MidiProgramsEditor::populate : bankItem->getBank = " << bankItem->getBank() << endl; m_currentBank = &(m_bankList[bankItem->getBank()]); // m_device->getBankByIndex(bankItem->getBank()); blockAllSignals(true); // set the bank values m_percussion->setChecked(m_currentBank->isPercussion()); m_msb->setValue(m_currentBank->getMSB()); m_lsb->setValue(m_currentBank->getLSB()); m_oldBank = *m_currentBank; // Librarian details // m_librarian->setText(strtoqstr(m_device->getLibrarianName())); m_librarianEmail->setText(strtoqstr(m_device->getLibrarianEmail())); ProgramList programSubset = getBankSubset(*m_currentBank); ProgramList::iterator it; QPixmap noKeyPixmap, keyPixmap; IconLoader il; noKeyPixmap = il.loadPixmap("key-white"); keyPixmap = il.loadPixmap("key-green"); bool haveKeyMappings = m_device->getKeyMappings().size() > 0; for (unsigned int i = 0; i < (unsigned int)m_names.size(); i++) { m_names[i]->clear(); getKeyMapButton(i)->setEnabled(haveKeyMappings); getKeyMapButton(i)->setIcon(QIcon(noKeyPixmap)); // QToolTip::remove // ( getKeyMapButton(i) ); getKeyMapButton(i)->setToolTip(QString("")); //@@@ Usefull ? getKeyMapButton(i)->setMaximumHeight( 12 ); for (it = programSubset.begin(); it != programSubset.end(); ++it) { if (it->getProgram() == i) { // zero in on "Harpsichord" vs. "Coupled Harpsichord to cut down // on noise (0-based) // if (i == 6) std::cout << "it->getName(): " << it->getName() << std::endl; QString programName = strtoqstr(it->getName()); m_completions << programName; m_names[i]->setText(programName); if (m_device->getKeyMappingForProgram(*it)) { getKeyMapButton(i)->setIcon(QIcon(keyPixmap)); getKeyMapButton(i)->setToolTip (tr("Key Mapping: %1") .arg(strtoqstr(m_device->getKeyMappingForProgram(*it)->getName()))); } break; } } // show start of label m_names[i]->setCursorPosition(0); } blockAllSignals(false); }
std::string MidiDevice::toXmlString() { std::stringstream midiDevice; midiDevice << " <device id=\"" << m_id << "\" name=\"" << m_name << "\" direction=\"" << (m_direction == Play ? "play" : "record") << "\" variation=\"" << (m_variationType == VariationFromLSB ? "LSB" : m_variationType == VariationFromMSB ? "MSB" : "") << "\" connection=\"" << encode(m_connection) << "\" type=\"midi\">" << std::endl << std::endl; midiDevice << " <librarian name=\"" << encode(m_librarian.first) << "\" email=\"" << encode(m_librarian.second) << "\"/>" << std::endl; if (m_metronome) { // Write out the metronome - watch the MidiBytes // when using the stringstream // midiDevice << " <metronome " << "instrument=\"" << m_metronome->getInstrument() << "\" " << "barpitch=\"" << (int)m_metronome->getBarPitch() << "\" " << "beatpitch=\"" << (int)m_metronome->getBeatPitch() << "\" " << "subbeatpitch=\"" << (int)m_metronome->getSubBeatPitch() << "\" " << "depth=\"" << (int)m_metronome->getDepth() << "\" " << "barvelocity=\"" << (int)m_metronome->getBarVelocity() << "\" " << "beatvelocity=\"" << (int)m_metronome->getBeatVelocity() << "\" " << "subbeatvelocity=\"" << (int)m_metronome->getSubBeatVelocity() << "\"/>" << std::endl << std::endl; } // and now bank information // BankList::iterator it; InstrumentList::iterator iit; ProgramList::iterator pt; for (it = m_bankList.begin(); it != m_bankList.end(); ++it) { midiDevice << " <bank " << "name=\"" << encode(it->getName()) << "\" " << "percussion=\"" << (it->isPercussion() ? "true" : "false") << "\" " << "msb=\"" << (int)it->getMSB() << "\" " << "lsb=\"" << (int)it->getLSB() << "\">" << std::endl; // Not terribly efficient // for (pt = m_programList.begin(); pt != m_programList.end(); ++pt) { if (pt->getBank() == *it) { midiDevice << " <program " << "id=\"" << (int)pt->getProgram() << "\" " << "name=\"" << encode(pt->getName()) << "\" "; if (!pt->getKeyMapping().empty()) { midiDevice << "keymapping=\"" << encode(pt->getKeyMapping()) << "\" "; } midiDevice << "/>" << std::endl; } } midiDevice << " </bank>" << std::endl << std::endl; } // Now controllers (before Instruments, which can depend on // Controller colours) // midiDevice << " <controls>" << std::endl; ControlList::iterator cIt; for (cIt = m_controlList.begin(); cIt != m_controlList.end() ; ++cIt) midiDevice << cIt->toXmlString(); midiDevice << " </controls>" << std::endl << std::endl; // Add instruments // for (iit = m_instruments.begin(); iit != m_instruments.end(); ++iit) midiDevice << (*iit)->toXmlString(); KeyMappingList::iterator kit; for (kit = m_keyMappingList.begin(); kit != m_keyMappingList.end(); ++kit) { midiDevice << " <keymapping " << "name=\"" << encode(kit->getName()) << "\">\n"; for (MidiKeyMapping::KeyNameMap::const_iterator nmi = kit->getMap().begin(); nmi != kit->getMap().end(); ++nmi) { midiDevice << " <key number=\"" << (int)nmi->first << "\" name=\"" << encode(nmi->second) << "\"/>\n"; } midiDevice << " </keymapping>\n"; } midiDevice << " </device>" << std::endl; return midiDevice.str(); }