diff --git a/src/soundbase.cpp b/src/soundbase.cpp index cbc6ec7ac4..28c6ffe3a4 100755 --- a/src/soundbase.cpp +++ b/src/soundbase.cpp @@ -24,6 +24,15 @@ #include "soundbase.h" +char const sMidiCtlChar[] = +{ + [EMidiCtlType::Fader] = 'f', + [EMidiCtlType::Pan] = 'p', + [EMidiCtlType::Solo] = 's', + [EMidiCtlType::Mute] = 'm', + [EMidiCtlType::None] = '\0' +}; + /* Implementation *************************************************************/ CSoundBase::CSoundBase ( const QString& strNewSystemDriverTechniqueName, @@ -248,17 +257,51 @@ void CSoundBase::ParseCommandLineArgument ( const QString& strMIDISetup ) iCtrlMIDIChannel = slMIDIParams[0].toUInt(); } + bool bSimple = true; + // [offset for level] if ( slMIDIParams.count() >= 2 ) { - iMIDIOffsetFader = slMIDIParams[1].toUInt(); + int i = slMIDIParams[1].toUInt (&bSimple); + if (bSimple) + iMIDIOffsetFader = i; } - for (int i = 0; i < MAX_NUM_CHANNELS; i++) + if (bSimple) { - if (i + iMIDIOffsetFader > 127) - break; - aMidiCtls[i + iMIDIOffsetFader] = { EMidiCtlType::Fader, i }; + for (int i = 0; i < MAX_NUM_CHANNELS; i++) + { + if (i + iMIDIOffsetFader > 127) + break; + aMidiCtls[i + iMIDIOffsetFader] = { EMidiCtlType::Fader, i }; + } + return; + } + + // We have named controllers + + for (int i = 1; i < slMIDIParams.count(); i++) + { + QString sParm = slMIDIParams[i].toLower ().remove ( ' ' ); + if ( sParm.isEmpty() ) + continue; + + int iCtrl = QString ( sMidiCtlChar ).indexOf ( sParm[0] ); + if (iCtrl < 0) + continue; + EMidiCtlType eTyp = static_cast( iCtrl ); + + const QStringList slP = sParm.mid ( 1 ).split ( '*' ); + int iFirst = slP[0].toUInt (); + int iNum = ( slP.count() > 1 ) ? slP[1].toUInt () : 1; + for (int iOff = 0; iOff < iNum; iOff++) + { + if (iOff >= MAX_NUM_CHANNELS) + break; + if (iFirst + iOff >= 128) + break; + aMidiCtls[iFirst + iOff] = { eTyp, iOff }; + } } } }