0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Control Surface]ひとつの機能に複数のBankを設定したい

Posted at

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となるようにできました。

コード自体の解説はちょっと理解度が足りてなくてできないのですが、とりあえずこれで実現できたという感じになります。
参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?