MappedInstrument::MappedInstrument(const Instrument &instr): m_type(instr.getType()), m_id(instr.getId()), m_name(instr.getName()), m_device((instr.getDevice())->getId()), m_audioChannels(instr.getAudioChannels()) {}
bool RG21Loader::parseStaveType() { //!!! tags & connected are not yet implemented if (m_tokens.count() < 9) return false; if (!m_composition) return false; bool isNumeric = false; int staffNo = m_tokens[1].toInt(&isNumeric); if (!isNumeric) return false; int programNo = m_tokens[8].toInt(); if (staffNo >= (int)m_composition->getMinTrackId() && staffNo <= (int)m_composition->getMaxTrackId()) { Track *track = m_composition->getTrackById(staffNo); if (track) { Instrument *instr = m_studio->assignMidiProgramToInstrument(programNo, false); if (instr) track->setInstrument(instr->getId()); } } return true; }
void ModifyDeviceMappingCommand::execute() { Composition::trackcontainer &tracks = m_composition->getTracks(); Composition::trackcontainer::iterator it = tracks.begin(); Instrument *instr = 0; int index = 0; for (; it != tracks.end(); ++it) { instr = m_studio->getInstrumentById(it->second->getInstrument()); if (!instr || !instr->getDevice()) continue; if (instr->getDevice()->getId() == m_fromDevice) { // if source and target are MIDI if (m_studio->getDevice(m_fromDevice)->getType() == Device::Midi && m_studio->getDevice(m_toDevice)->getType() == Device::Midi) { // Try to match channels on the target device // MidiByte channel = instr->getNaturalChannel(); InstrumentList destList = m_studio-> getDevice(m_toDevice)->getPresentationInstruments(); InstrumentList::iterator dIt = destList.begin(); for (; dIt != destList.end(); ++dIt) { if ((*dIt)->getNaturalChannel() == channel) { break; } } // Failure to match anything and there's no Instruments // at all in the destination. Skip to next source Instrument. // if (dIt == destList.end() || destList.size() == 0) continue; RG_DEBUG << " Track " << it->first << ", setting Instrument to " << (*dIt)->getId() << endl; // store "to" and "from" values // m_mapping.push_back( std::pair < TrackId, InstrumentId > (it->first, instr->getId())); it->second->setInstrument((*dIt)->getId()); } else // audio is involved in the mapping - use indexes { // assign by index numbers InstrumentList destList = m_studio-> getDevice(m_toDevice)->getPresentationInstruments(); // skip if we can't match // if (index > (int)(destList.size() - 1)) continue; m_mapping.push_back( std::pair < TrackId, InstrumentId > (it->first, instr->getId())); it->second->setInstrument(destList[index]->getId()); } index++; } } }
void MidiMixerWindow::sendControllerRefresh() { //!!! need to know if we have a current external controller device, // as this is expensive int tabIndex = m_tabWidget->currentIndex(); RG_DEBUG << "MidiMixerWindow::slotCurrentTabChanged: current is " << tabIndex << endl; if (tabIndex < 0) return ; int i = 0; for (DeviceList::const_iterator dit = m_studio->begin(); dit != m_studio->end(); ++dit) { MidiDevice *dev = dynamic_cast<MidiDevice*>(*dit); RG_DEBUG << "device is " << (*dit)->getId() << ", dev " << dev << endl; if (!dev) continue; if (i != tabIndex) { ++i; continue; } InstrumentList instruments = dev->getPresentationInstruments(); ControlList controls = getIPBForMidiMixer(dev); RG_DEBUG << "device has " << instruments.size() << " presentation instruments, " << dev->getAllInstruments().size() << " instruments " << endl; for (InstrumentList::const_iterator iIt = instruments.begin(); iIt != instruments.end(); ++iIt) { Instrument *instrument = *iIt; if (!instrument->hasFixedChannel()) { continue; } int channel = instrument->getNaturalChannel(); RG_DEBUG << "instrument is " << instrument->getId() << endl; for (ControlList::const_iterator cIt = controls.begin(); cIt != controls.end(); ++cIt) { int controller = (*cIt).getControllerValue(); int value; try { value = instrument->getControllerValue(controller); } catch (std::string s) { std::cerr << "Exception in MidiMixerWindow::currentChanged: " << s << " (controller " << controller << ", instrument " << instrument->getId() << ")" << std::endl; value = 0; } MappedEvent mE(instrument->getId(), MappedEvent::MidiController, controller, value); mE.setRecordedChannel(channel); mE.setRecordedDevice(Device::CONTROL_DEVICE); StudioControl::sendMappedEvent(mE); } MappedEvent mE(instrument->getId(), MappedEvent::MidiController, MIDI_CONTROLLER_VOLUME, instrument->getVolume()); mE.setRecordedChannel(channel); mE.setRecordedDevice(Device::CONTROL_DEVICE); RG_DEBUG << "sending controller mapped event for channel " << channel << ", volume " << instrument->getVolume() << endl; StudioControl::sendMappedEvent(mE); } break; } }
void MidiMixerWindow::slotControllerDeviceEventReceived(MappedEvent *e, const void *preferredCustomer) { if (preferredCustomer != this) return ; RG_DEBUG << "MidiMixerWindow::slotControllerDeviceEventReceived: this one's for me" << endl; raise(); // get channel number n from event // get nth instrument on current tab if (e->getType() != MappedEvent::MidiController) return ; unsigned int channel = e->getRecordedChannel(); MidiByte controller = e->getData1(); MidiByte value = e->getData2(); int tabIndex = m_tabWidget->currentIndex(); int i = 0; for (DeviceList::const_iterator it = m_studio->begin(); it != m_studio->end(); ++it) { MidiDevice *dev = dynamic_cast<MidiDevice*>(*it); if (!dev) continue; if (i != tabIndex) { ++i; continue; } InstrumentList instruments = dev->getPresentationInstruments(); for (InstrumentList::const_iterator iIt = instruments.begin(); iIt != instruments.end(); ++iIt) { Instrument *instrument = *iIt; if (instrument->getNaturalChannel() != channel) continue; ControlList cl = dev->getIPBControlParameters(); for (ControlList::const_iterator i = cl.begin(); i != cl.end(); ++i) { if ((*i).getControllerValue() == controller) { RG_DEBUG << "Setting controller " << controller << " for instrument " << instrument->getId() << " to " << value << endl; instrument->setControllerValue(controller, value); break; } } slotUpdateInstrument(instrument->getId()); emit instrumentParametersChanged(instrument->getId()); } break; } }
void ManageMetronomeDialog::slotApply() { Studio &studio = m_doc->getStudio(); DeviceList *devices = m_doc->getStudio().getDevices(); DeviceListConstIterator it; int count = 0; Device *dev = 0; for (it = devices->begin(); it != devices->end(); it++) { dev = *it; if (!isSuitable(dev)) continue; if (count == m_metronomeDevice->currentIndex()) break; count++; } if (!dev || !isSuitable(dev)) { RG_WARNING << "Warning: ManageMetronomeDialog::slotApply: no " << m_metronomeDevice->currentIndex() << "th device"; return ; } DeviceId deviceId = dev->getId(); studio.setMetronomeDevice(deviceId); if (getMetronome(dev) == 0) { RG_WARNING << "Warning: ManageMetronomeDialog::slotApply: unable to extract metronome from device " << deviceId; return ; } MidiMetronome metronome(*getMetronome(dev)); // get instrument InstrumentList list = dev->getPresentationInstruments(); Instrument *inst = list[m_metronomeInstrument->currentIndex()]; if (inst) { metronome.setInstrument(inst->getId()); } metronome.setBarPitch(m_barPitch); metronome.setBeatPitch(m_beatPitch); metronome.setSubBeatPitch(m_subBeatPitch); metronome.setDepth( m_metronomeResolution->currentIndex()); metronome.setBarVelocity( MidiByte(m_metronomeBarVely->value())); metronome.setBeatVelocity( MidiByte(m_metronomeBeatVely->value())); metronome.setSubBeatVelocity( MidiByte(m_metronomeSubBeatVely->value())); setMetronome(dev, metronome); m_doc->getComposition().setPlayMetronome(m_playEnabled->isChecked()); m_doc->getComposition().setRecordMetronome(m_recordEnabled->isChecked()); m_doc->getSequenceManager()->metronomeChanged(inst->getId(), true); m_doc->slotDocumentModified(); setModified(false); }