Control Surfaceについてはこちらの記事もどうぞ。
https://qiita.com/paraixo/items/7f13caed8bce368404be
今回は解説といよりかは紹介という形になります。
Control SurfaceにはBank機能というものがあるのですが、これを特定の機能に対して複数のBankを付けたかったのですが、ドキュメント上にそのようなやり方を説明している部分がなくどうしようかと思っていたところDiscussionに同じような質問スレッドが立っておりその中にある回答で実現できました。
この質問者の方はCCPotentiometerに対して2つのBankを設定し、一方にはChannelをもう一方のAddressを変えられるようにしたかったみたいでした。
回答としては↓のクラスを自作し、それを適応させるということでした。
class DualBankCCPotentiometer : public Bankable::MIDIFilteredAnalog<Bankable::SingleAddressMultipleBanks<2>, ContinuousCCSender> {
public:
DualBankCCPotentiometer(const Array<OutputBankableMIDIAddress, 2> &banks, pin_t pin, MIDIAddress address)
: Bankable::MIDIFilteredAnalog<Bankable::SingleAddressMultipleBanks<2>, ContinuousCCSender>({banks, address}, pin, {}) {}
};
Bank<3> channelbank(1); // 3 modes which offset the channel by +1
Bank<3> addressbank(5); // 3 modes which offset the address by +5
DualBankCCPotentiometer pot {
{{
{channelbank, BankType::CHANGE_CHANNEL},
{addressbank, BankType::CHANGE_ADDRESS},
}}, // Banks and types
A0, // analog input pin
{0x07, CHANNEL_1}, // base address
};
こうすることで、potというCCPotentiometerにchannelbankというBankとaddressbankというBankの2つを適応させることができるみたいでした。
自分の開発の方では特定のCCButtonに対して同様にやりたかったので上記にあるクラスを書き換え↓のようにしました。
class DualBankButtons : public Bankable::MIDIButton<Bankable::SingleAddressMultipleBanks<2>, DigitalCCSender> {
public:
DualBankButtons (const Array<OutputBankableMIDIAddress, 2> &banks, pin_t pin, MIDIAddress address)
: Bankable::MIDIButton<Bankable::SingleAddressMultipleBanks<2>, DigitalCCSender>( {banks, address,}, pin, {}) {}
};
Bank<2> deckBank(1);
Bank<2> shiftKeyBank(10);
// 複数個のボタンに適応したので配列にしている
DualBankButtons dbButton[] = {
{
{{
{deckBank, BankType::CHANGE_CHANNEL},
{shiftKeyBank, BankType::CHANGE_ADDRESS},
}
},
7,
{66, CHANNEL_1}, //Aボタン
},
{
{{
{deckBank, BankType::CHANGE_CHANNEL},
{shiftKeyBank, BankType::CHANGE_ADDRESS},
}
},
6,
{65, CHANNEL_1}, //Bボタン
},
};
これでA,Bボタンに対してdeckBankが適応されればChannel+1、shiftKeyBankが適応されればAddress+10となるようにできました。
コード自体の解説はちょっと理解度が足りてなくてできないのですが、とりあえずこれで実現できたという感じになります。
参考になれば幸いです。