0
2

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 5 years have passed since last update.

MIDIスイッチをリファクタリングしてみた

Last updated at Posted at 2017-08-26

Ableton Liveのトランスポート用のスイッチ。
P_20170817_210543.jpg
ボタンを押すと、決められたコントロールチェンジを送信します。それだけです。
いくつか作っていますが、これは一番古いタイプ。Arduino duemilanoveがはいっています。

特に動作に不満はないのですが、新しいっぽい書き方を試してみました。

こんなプログラムにしたい

ボタンが四つあるので、これをなにかオブジェクトの配列にして、


void loop() {
  // forループ。BUTTONSの要素 b について:
  for (auto&& b : BUTTONS ){
 // データによって何かする <- デバウンスする <- bのピンを読む 
    doByData( b     ,     debounce( b ,   digitalRead( b.PIN ) 
    ) );
  }
  delay( 1 );
}

もしくは:

void loop() {
  // forループ。BUTTONSの要素 b について:
  for (auto&& b : BUTTONS ){
 // データが上がったときに何かする <- データが下がったときに何かする <- デバウンスする <- bのピンを読む
    doWhenRaised( b      ,       doWhenDropped( b      ,      b.debounce(    digitalRead( b.PIN ) 
    ) ) );
  }
  delay( 1 );
}

みたいな感じにしたいな...

選択肢...

関数をラムダ式で作る

メリット:書きやすい。
デメリット: オブジェクトのメンバにできない。

スケッチの全体はこうなりました。
クロージャをバラして履歴の変数だけオブジェクトに持たせているのでちょっと変な感じです。

関数を関数オブジェクトで作る

メリット:メンバにできる
デメリット:書くのが面倒。

スケッチの全体はこうなりました。

どちらもちゃんと動きました。

最終調整

これに使ってるスイッチは安物で結構チャタリングが酷いので、delayとdebounceのRATEで調整。
チャタリングは抑えるけど、動作にはついてくるギリギリを狙います。
delay( 2 )、RATE = 12でいい感じになりました。

0
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?