Updated MIDI CC handling not to count from 1 (#6774)

This commit is contained in:
Artur-Twardowski-Mobica
2023-09-22 21:07:25 +02:00
committed by GitHub
parent 0576f9daa6
commit f0aa2862d7
6 changed files with 36 additions and 13 deletions

View File

@@ -127,6 +127,7 @@ private:
void upgrade_mixerRename();
void upgrade_bbTcoRename();
void upgrade_sampleAndHold();
void upgrade_midiCCIndexing();
// List of all upgrade methods
static const std::vector<UpgradeMethod> UPGRADE_METHODS;

View File

@@ -48,6 +48,7 @@ class MidiController : public Controller, public MidiEventProcessor
{
Q_OBJECT
public:
static constexpr int NONE = -1;
MidiController( Model * _parent );
~MidiController() override = default;

View File

@@ -79,7 +79,7 @@ const std::vector<DataFile::UpgradeMethod> DataFile::UPGRADE_METHODS = {
&DataFile::upgrade_automationNodes , &DataFile::upgrade_extendedNoteRange,
&DataFile::upgrade_defaultTripleOscillatorHQ,
&DataFile::upgrade_mixerRename , &DataFile::upgrade_bbTcoRename,
&DataFile::upgrade_sampleAndHold ,
&DataFile::upgrade_sampleAndHold , &DataFile::upgrade_midiCCIndexing
};
// Vector of all versions that have upgrade routines.
@@ -1809,6 +1809,27 @@ void DataFile::upgrade_sampleAndHold()
}
}
//! Update MIDI CC indexes, so that they are counted from 0. Older releases of LMMS
//! count the CCs from 1.
void DataFile::upgrade_midiCCIndexing()
{
static constexpr std::array attributesToUpdate{"inputcontroller", "outputcontroller"};
QDomNodeList elements = elementsByTagName("Midicontroller");
for(int i = 0; i < elements.length(); i++)
{
if (elements.item(i).isNull()) { continue; }
auto element = elements.item(i).toElement();
for (const char* attrName : attributesToUpdate)
{
if (element.hasAttribute(attrName))
{
int cc = element.attribute(attrName).toInt();
element.setAttribute(attrName, cc - 1);
}
}
}
}
void DataFile::upgrade()
{

View File

@@ -72,21 +72,20 @@ void MidiController::updateName()
void MidiController::processInEvent( const MidiEvent& event, const TimePos& time, f_cnt_t offset )
void MidiController::processInEvent(const MidiEvent& event, const TimePos& time, f_cnt_t offset)
{
unsigned char controllerNum;
switch( event.type() )
switch(event.type())
{
case MidiControlChange:
controllerNum = event.controllerNumber();
if( m_midiPort.inputController() == controllerNum + 1 &&
( m_midiPort.inputChannel() == event.channel() + 1 ||
m_midiPort.inputChannel() == 0 ) )
if (m_midiPort.inputController() == controllerNum &&
(m_midiPort.inputChannel() == event.channel() + 1 || m_midiPort.inputChannel() == 0))
{
unsigned char val = event.controllerValue();
m_previousValue = m_lastValue;
m_lastValue = (float)( val ) / 127.0f;
m_lastValue = static_cast<float>(val) / 127.0f;
emit valueChanged();
}
break;

View File

@@ -31,6 +31,7 @@
#include "MidiEventProcessor.h"
#include "Note.h"
#include "Song.h"
#include "MidiController.h"
namespace lmms
@@ -54,8 +55,8 @@ MidiPort::MidiPort( const QString& name,
m_mode( mode ),
m_inputChannelModel( 0, 0, MidiChannelCount, this, tr( "Input channel" ) ),
m_outputChannelModel( 1, 0, MidiChannelCount, this, tr( "Output channel" ) ),
m_inputControllerModel( 0, 0, MidiControllerCount, this, tr( "Input controller" ) ),
m_outputControllerModel( 0, 0, MidiControllerCount, this, tr( "Output controller" ) ),
m_inputControllerModel(MidiController::NONE, MidiController::NONE, MidiControllerCount - 1, this, tr( "Input controller" )),
m_outputControllerModel(MidiController::NONE, MidiController::NONE, MidiControllerCount - 1, this, tr( "Output controller" )),
m_fixedInputVelocityModel( -1, -1, MidiMaxVelocity, this, tr( "Fixed input velocity" ) ),
m_fixedOutputVelocityModel( -1, -1, MidiMaxVelocity, this, tr( "Fixed output velocity" ) ),
m_fixedOutputNoteModel( -1, -1, MidiMaxKey, this, tr( "Fixed output note" ) ),
@@ -436,4 +437,4 @@ void MidiPort::invalidateCilent()
}
} // namespace lmms
} // namespace lmms

View File

@@ -54,7 +54,7 @@ public:
AutoDetectMidiController( Model* parent ) :
MidiController( parent ),
m_detectedMidiChannel( 0 ),
m_detectedMidiController( 0 )
m_detectedMidiController(NONE)
{
updateName();
}
@@ -69,7 +69,7 @@ public:
( m_midiPort.inputChannel() == 0 || m_midiPort.inputChannel() == event.channel() + 1 ) )
{
m_detectedMidiChannel = event.channel() + 1;
m_detectedMidiController = event.controllerNumber() + 1;
m_detectedMidiController = event.controllerNumber();
m_detectedMidiPort = Engine::audioEngine()->midiClient()->sourcePortName( event );
emit valueChanged();
@@ -152,7 +152,7 @@ ControllerConnectionDialog::ControllerConnectionDialog( QWidget * _parent,
m_midiControllerSpinBox = new LcdSpinBox( 3, m_midiGroupBox,
tr( "Input controller" ) );
m_midiControllerSpinBox->addTextForValue( 0, "---" );
m_midiControllerSpinBox->addTextForValue(MidiController::NONE, "---" );
m_midiControllerSpinBox->setLabel( tr( "CONTROLLER" ) );
m_midiControllerSpinBox->move( 68, 24 );