// Allocate a channel for thru MIDI events to play on. // @author Tom Breton (Tehom) void TrackInfo::allocateThruChannel(Studio &studio) { Instrument *instrument = studio.getInstrumentById(m_instrumentId); // If we have deleted a device, we may get a NULL instrument. In // that case, we can't do much. if (!instrument) { return; } // This value of fixity holds until releaseThruChannel is called. m_useFixedChannel = instrument->hasFixedChannel(); if (m_useFixedChannel) { m_thruChannel = instrument->getNaturalChannel(); m_hasThruChannel = true; m_isThruChannelReady = true; return; } Device* device = instrument->getDevice(); Q_CHECK_PTR(device); AllocateChannels *allocator = device->getAllocator(); #ifdef DEBUG_CONTROL_BLOCK RG_DEBUG << "TrackInfo::allocateThruChannel() " << (allocator ? "got an allocator" : "didn't get an allocator") << endl; #endif // Device is not a channel-managing device, so instrument's // natural channel is correct and requires no further setup. if (!allocator) { m_thruChannel = instrument->getNaturalChannel(); m_isThruChannelReady = true; m_hasThruChannel = true; return; } // Get a suitable channel. m_thruChannel = allocator->allocateThruChannel(*instrument); #ifdef DEBUG_CONTROL_BLOCK RG_DEBUG << "TrackInfo::allocateThruChannel() got channel" << (int)m_thruChannel << endl; #endif // Right now the channel is probably playing the wrong program. m_isThruChannelReady = false; m_hasThruChannel = true; }
void MidiMixerWindow::slotFaderLevelChanged(float value) { const QObject *s = sender(); for (FaderVector::const_iterator it = m_faders.begin(); it != m_faders.end(); ++it) { if ((*it)->m_volumeFader == s) { Instrument *instr = m_studio-> getInstrumentById((*it)->m_id); if (instr) { instr->setControllerValue(MIDI_CONTROLLER_VOLUME, MidiByte(value)); if (instr->hasFixedChannel()) { // send out to external controllers as well if the // affected instrument is on a fixed channel. //!!! really want some notification of whether we have any! int tabIndex = m_tabWidget->currentIndex(); if (tabIndex < 0) tabIndex = 0; int i = 0; for (DeviceList::const_iterator dit = m_studio->begin(); dit != m_studio->end(); ++dit) { RG_DEBUG << "slotFaderLevelChanged: i = " << i << ", tabIndex " << tabIndex << endl; if (!dynamic_cast<MidiDevice*>(*dit)) continue; if (i != tabIndex) { ++i; continue; } RG_DEBUG << "slotFaderLevelChanged: device id = " << instr->getDevice()->getId() << ", visible device id " << (*dit)->getId() << endl; if (instr->getDevice()->getId() == (*dit)->getId()) { RG_DEBUG << "slotFaderLevelChanged: sending control device mapped event for channel " << instr->getNaturalChannel() << endl; MappedEvent mE((*it)->m_id, MappedEvent::MidiController, MIDI_CONTROLLER_VOLUME, MidiByte(value)); mE.setRecordedChannel(instr->getNaturalChannel()); mE.setRecordedDevice(Device::CONTROL_DEVICE); StudioControl::sendMappedEvent(mE); } break; } } } emit instrumentParametersChanged((*it)->m_id); return ; } } }
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::slotControllerChanged(float value) { const QObject *s = sender(); size_t 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; instr->setControllerValue(m_faders[i]-> m_controllerRotaries[j].first, MidiByte(value)); if (instr->hasFixedChannel()) { int tabIndex = m_tabWidget->currentIndex(); if (tabIndex < 0) tabIndex = 0; int k = 0; for (DeviceList::const_iterator dit = m_studio->begin(); dit != m_studio->end(); ++dit) { RG_DEBUG << "slotControllerChanged: k = " << k << ", tabIndex " << tabIndex << endl; if (!dynamic_cast<MidiDevice*>(*dit)) continue; if (k != tabIndex) { ++k; 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->getNaturalChannel() << endl; // send out to external controllers as well. //!!! really want some notification of whether we have any! MappedEvent mE(m_faders[i]->m_id, MappedEvent::MidiController, m_faders[i]->m_controllerRotaries[j].first, MidiByte(value)); mE.setRecordedChannel(instr->getNaturalChannel()); mE.setRecordedDevice(Device::CONTROL_DEVICE); StudioControl::sendMappedEvent(mE); } } } emit instrumentParametersChanged(m_faders[i]->m_id); } }