Automatically assign a midi input device to the selected track (#5499)

This commit is contained in:
Luna Nooteboom
2020-06-21 04:17:05 +02:00
committed by GitHub
parent 82f413568d
commit 5d7e6720e1
8 changed files with 94 additions and 0 deletions

View File

@@ -673,10 +673,17 @@ void PianoView::focusOutEvent( QFocusEvent * )
m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, -1, i, 0 ) );
m_piano->setKeyState( i, false );
}
update();
}
void PianoView::focusInEvent( QFocusEvent * )
{
m_piano->instrumentTrack()->autoAssignMidiDevice(true);
}
/*! \brief update scrollbar range after resize

View File

@@ -677,9 +677,32 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) :
this, SLOT(midiInterfaceChanged(const QString &)));
// MIDI autoassign tab.
TabWidget * midiAutoAssign_tw = new TabWidget(
tr("Automatically assign MIDI controller to selected track"), midi_w);
midiAutoAssign_tw->setFixedHeight(56);
m_assignableMidiDevices = new QComboBox(midiAutoAssign_tw);
m_assignableMidiDevices->setGeometry(10, 20, 240, 28);
m_assignableMidiDevices->addItem("none");
if ( !Engine::mixer()->midiClient()->isRaw() )
{
m_assignableMidiDevices->addItems(Engine::mixer()->midiClient()->readablePorts());
}
else
{
m_assignableMidiDevices->addItem("all");
}
int current = m_assignableMidiDevices->findText(ConfigManager::inst()->value("midi", "midiautoassign"));
if (current >= 0)
{
m_assignableMidiDevices->setCurrentIndex(current);
}
// MIDI layout ordering.
midi_layout->addWidget(midiiface_tw);
midi_layout->addWidget(ms_w);
midi_layout->addWidget(midiAutoAssign_tw);
midi_layout->addStretch();
@@ -917,6 +940,8 @@ void SetupDialog::accept()
QString::number(m_bufferSize));
ConfigManager::inst()->setValue("mixer", "mididev",
m_midiIfaceNames[m_midiInterfaces->currentText()]);
ConfigManager::inst()->setValue("midi", "midiautoassign",
m_assignableMidiDevices->currentText());
ConfigManager::inst()->setWorkingDir(QDir::fromNativeSeparators(m_workingDir));

View File

@@ -3600,6 +3600,14 @@ void PianoRoll::focusOutEvent( QFocusEvent * )
update();
}
void PianoRoll::focusInEvent( QFocusEvent * )
{
if ( hasValidPattern() )
{
// Assign midi device
m_pattern->instrumentTrack()->autoAssignMidiDevice(true);
}
}

View File

@@ -97,6 +97,7 @@ InstrumentTrack::InstrumentTrack( TrackContainer* tc ) :
m_sustainPedalPressed( false ),
m_silentBuffersProcessed( false ),
m_previewMode( false ),
m_hasAutoMidiDev( false ),
m_baseNoteModel( 0, 0, KeysPerOctave * NumOctaves - 1, this,
tr( "Base note" ) ),
m_volumeModel( DefaultVolume, MinVolume, MaxVolume, 0.1f, this, tr( "Volume" ) ),
@@ -149,6 +150,13 @@ int InstrumentTrack::baseNote() const
InstrumentTrack::~InstrumentTrack()
{
// De-assign midi device
if (m_hasAutoMidiDev)
{
autoAssignMidiDevice(false);
s_autoAssignedTrack = NULL;
}
// kill all running notes and the iph
silenceAllNotes( true );
@@ -766,7 +774,13 @@ void InstrumentTrack::saveTrackSpecificSettings( QDomDocument& doc, QDomElement
if (Engine::getSong()->isSavingProject()
&& !Engine::getSong()->getSaveOptions().discardMIDIConnections.value())
{
// Don't save auto assigned midi device connection
bool hasAuto = m_hasAutoMidiDev;
autoAssignMidiDevice(false);
m_midiPort.saveState( doc, thisElement );
autoAssignMidiDevice(hasAuto);
}
m_audioPort.effects()->saveState( doc, thisElement );
@@ -914,6 +928,38 @@ Instrument * InstrumentTrack::loadInstrument(const QString & _plugin_name,
InstrumentTrack *InstrumentTrack::s_autoAssignedTrack = NULL;
/*! \brief Automatically assign a midi controller to this track, based on the midiautoassign setting
*
* \param assign set to true to connect the midi device, set to false to disconnect
*/
void InstrumentTrack::autoAssignMidiDevice(bool assign)
{
if (assign)
{
if (s_autoAssignedTrack)
{
s_autoAssignedTrack->autoAssignMidiDevice(false);
}
s_autoAssignedTrack = this;
}
const QString &device = ConfigManager::inst()->value("midi", "midiautoassign");
if ( Engine::mixer()->midiClient()->isRaw() && device != "none" )
{
m_midiPort.setReadable( assign );
return;
}
// Check if the device exists
if ( Engine::mixer()->midiClient()->readablePorts().indexOf(device) >= 0 )
{
m_midiPort.subscribeReadablePort(device, assign);
m_hasAutoMidiDev = assign;
}
}
// #### ITV: