ArduinoでMIDI信号を使って6ポート同時にPWM制御せよ!

思いのほか簡単に制御ができたので、
Arduino UNOで使えるPWM出力6つを全部使ってみよう。


ってできたー!

2015-10-07_15-35-41
後ろの画面が6ポート分のMIDI信号で、
一番上の信号が一番左のLEDに対応、
よく見るとそれぞれのカーブとLEDの光りが
一致していることがわかる。
回路はLED(と抵抗)を6つつないだだけ。
以下コード。

#include <MIDI.h>                //MIDIライブラリ読み込み
MIDI_CREATE_DEFAULT_INSTANCE();

#define P3 17
#define P5 18
#define P6 19
#define P9 20
#define P10 21
#define P11 22

void setup() {
MIDI.begin(); //MIDIライブラリを使う
MIDI.turnThruOff(); //MIDI IN-OUTのループ防止
pinMode(3,OUTPUT); //ポートの設定
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}

void loop() 
{
  uint8_t data1,data2;
  if (MIDI.read() and MIDI.getType() == midi::ControlChange) //MIDIコントロールチェンジを受信したら
  {
    data1 = MIDI.getData1(); //CC No取得
    data2 = MIDI.getData2(); //CC 値を取得
    switch(data1) 
    { //CC Noに応じたポートにPWM送信
      case P3: //CC No
      data2 = data2*2; //CCの値を2倍(0-254)に変換
      analogWrite(3,data2); //ポートに送る
      break;
      case P5:
      data2 = data2*2;
      analogWrite(5,data2);
      break;
      case P6:
      data2 = data2*2;
      analogWrite(6,data2);
      break;
      case P9:
      data2 = data2*2;
      analogWrite(9,data2);
      break;
      case P10:
      data2 = data2*2;
      analogWrite(10,data2); 
      break;
      case P11:
      data2 = data2*2;
      analogWrite(11,data2);
      break;
    }
  }
}

3ポートからはCC17で…えーと5は18で…
といちいち考えるのは面倒なので、#defineで
ポート(Pいくつ)に応じたコントロールナンバーを定義。
あとはコードに解説してある通り。
caseのところもdefineをうまく使えば簡単に書けそうな気もするけど
まあそこは今後の成長に期待するとして今回は縦にズラーっと。

13行目のMIDI.turnThruOff();
これが前回ちょっとトラブったMIDI信号のループを防止する
命令らしい。今回の発見。

ついでなので5Vのリレーをつないで早めのオンオフを
してみたが、追従性に問題なし。
(音声をオンにするとリレーのカチカチが聞こえる)

できればもっとたくさんのポートを制御したいんだけど、
Arduinoを何台も並べないとだめかなー、
という調査を次回する。

〈Arduino関連〉Arduino UNO

〈Arduino関連〉Arduino UNO
価格:3,326円(税込、送料別)

作成者: necobit(ねこびっと)

音楽と電子工作でMIDI寄りものづくりをするユニット。MIDI制御基板の開発・販売、製品作例として自動演奏化楽器の展示・音とメカのパフォーマンスを行なっています。

1件のコメント

  1. はじめまして。
    MIDI信号を電圧に変換させるということは、半導体式駆動テスラコイルなどにも応用が可能でしょうか?

Yellow へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください