📄 midimixerwindow.cpp
字号:
voidMidiMixerWindow::slotControllerChanged(float value){ const QObject *s = sender(); unsigned int i = 0, j = 0; for (i = 0; i < m_faders.size(); ++i) { for (j = 0; j < m_faders[i]->m_controllerRotaries.size(); ++j) { if (m_faders[i]->m_controllerRotaries[j].second == s) break; } // break out on match if (j != m_faders[i]->m_controllerRotaries.size()) break; } // Don't do anything if we've not matched and got solid values // for i and j // if (i == m_faders.size() || j == m_faders[i]->m_controllerRotaries.size()) return ; //RG_DEBUG << "MidiMixerWindow::slotControllerChanged - found a controller" //<< endl; Instrument *instr = m_studio->getInstrumentById( m_faders[i]->m_id); if (instr) { //RG_DEBUG << "MidiMixerWindow::slotControllerChanged - " //<< "got instrument to change" << endl; if (m_faders[i]->m_controllerRotaries[j].first == MIDI_CONTROLLER_PAN) instr->setPan(MidiByte(value)); else { instr->setControllerValue(m_faders[i]-> m_controllerRotaries[j].first, MidiByte(value)); } MappedEvent mE(m_faders[i]->m_id, MappedEvent::MidiController, m_faders[i]->m_controllerRotaries[j].first, MidiByte(value)); StudioControl::sendMappedEvent(mE); int tabIndex = m_tabWidget->currentPageIndex(); if (tabIndex < 0) tabIndex = 0; int i = 0; for (DeviceList::const_iterator dit = m_studio->begin(); dit != m_studio->end(); ++dit) { RG_DEBUG << "slotControllerChanged: i = " << i << ", tabIndex " << tabIndex << endl; if (!dynamic_cast<MidiDevice*>(*dit)) continue; if (i != tabIndex) { ++i; continue; } RG_DEBUG << "slotControllerChanged: device id = " << instr->getDevice()->getId() << ", visible device id " << (*dit)->getId() << endl; if (instr->getDevice()->getId() == (*dit)->getId()) { RG_DEBUG << "slotControllerChanged: sending control device mapped event for channel " << instr->getMidiChannel() << endl; // send out to external controllers as well. //!!! really want some notification of whether we have any! mE.setRecordedChannel(instr->getMidiChannel()); mE.setRecordedDevice(Device::CONTROL_DEVICE); StudioControl::sendMappedEvent(mE); } } emit instrumentParametersChanged(m_faders[i]->m_id); }}voidMidiMixerWindow::slotUpdateInstrument(InstrumentId id){ //RG_DEBUG << "MidiMixerWindow::slotUpdateInstrument - id = " << id << endl; DeviceListConstIterator it; MidiDevice *dev = 0; InstrumentList instruments; InstrumentList::const_iterator iIt; int count = 0; blockSignals(true); for (it = m_studio->begin(); it != m_studio->end(); ++it) { dev = dynamic_cast<MidiDevice*>(*it); if (dev) { instruments = dev->getPresentationInstruments(); ControlList controls = dev->getIPBControlParameters(); for (iIt = instruments.begin(); iIt != instruments.end(); ++iIt) { // Match and set // if ((*iIt)->getId() == id) { // Set Volume fader // m_faders[count]->m_volumeFader->blockSignals(true); m_faders[count]->m_volumeFader-> setFader(float((*iIt)->getVolume())); m_faders[count]->m_volumeFader->blockSignals(false); /* StaticControllers &staticControls = (*iIt)->getStaticControllers(); RG_DEBUG << "STATIC CONTROLS SIZE = " << staticControls.size() << endl; */ // Set all controllers for this Instrument // for (unsigned int i = 0; i < controls.size(); ++i) { float value = 0.0; m_faders[count]->m_controllerRotaries[i].second->blockSignals(true); if (controls[i].getControllerValue() == MIDI_CONTROLLER_PAN) { m_faders[count]->m_controllerRotaries[i]. second->setPosition((*iIt)->getPan()); } else { // The ControllerValues might not yet be set on // the actual Instrument so don't always expect // to find one. There might be a hole here for // deleted Controllers to hang around on // Instruments.. // try { value = float((*iIt)->getControllerValue (controls[i].getControllerValue())); } catch (std::string s) { /* RG_DEBUG << "MidiMixerWindow::slotUpdateInstrument - " << "can't match controller " << int(controls[i]. getControllerValue()) << " - \"" << s << "\"" << endl; */ continue; } /* RG_DEBUG << "MidiMixerWindow::slotUpdateInstrument" << " - MATCHED " << int(controls[i].getControllerValue()) << endl; */ m_faders[count]->m_controllerRotaries[i]. second->setPosition(value); } m_faders[count]->m_controllerRotaries[i].second->blockSignals(false); } } count++; } } } blockSignals(false);}voidMidiMixerWindow::updateMeters(SequencerMapper *mapper){ for (unsigned int i = 0; i != m_faders.size(); ++i) { LevelInfo info; if (!mapper-> getInstrumentLevelForMixer(m_faders[i]->m_id, info)) continue; m_faders[i]->m_vuMeter->setLevel(double(info.level / 127.0)); RG_DEBUG << "MidiMixerWindow::updateMeters - level " << info.level << endl; }}voidMidiMixerWindow::updateMonitorMeter(SequencerMapper *){ // none here}voidMidiMixerWindow::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->currentPageIndex(); 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->getMidiChannel() != channel) continue; switch (controller) { case MIDI_CONTROLLER_VOLUME: RG_DEBUG << "Setting volume for instrument " << instrument->getId() << " to " << value << endl; instrument->setVolume(value); break; case MIDI_CONTROLLER_PAN: RG_DEBUG << "Setting pan for instrument " << instrument->getId() << " to " << value << endl; instrument->setPan(value); break; default: { 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; } } break; } } MappedEvent mE(instrument->getId(), MappedEvent::MidiController, MidiByte(controller), MidiByte(value)); StudioControl::sendMappedEvent(mE); slotUpdateInstrument(instrument->getId()); emit instrumentParametersChanged(instrument->getId()); } break; }}voidMidiMixerWindow::slotCurrentTabChanged(QWidget *){ sendControllerRefresh();}voidMidiMixerWindow::sendControllerRefresh(){ //!!! need to know if we have a current external controller device, // as this is expensive int tabIndex = m_tabWidget->currentPageIndex(); 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 = dev->getIPBControlParameters(); 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; int channel = instrument->getMidiChannel(); RG_DEBUG << "instrument is " << instrument->getId() << endl; for (ControlList::const_iterator cIt = controls.begin(); cIt != controls.end(); ++cIt) { int controller = (*cIt).getControllerValue(); int value; if (controller == MIDI_CONTROLLER_PAN) { value = instrument->getPan(); } else { 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; }}voidMidiMixerWindow::slotSynchronise(){ RG_DEBUG << "MidiMixer::slotSynchronise" << endl; //setupTabs();}}#include "MidiMixerWindow.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -