FPGA & Verilog入門本『TANG PriMERで始める FPGA & Verilog入門』頒布中!

レーザーハープを自作する。(Part 3 : プログラム編)

スポンサーリンク
Arduino

前回の記事では、レーザーハープの電子回路を考えました。

また前回の記事からだいぶ時間が経過してしまいましたが…、
今回はArduinoに接続した電子回路を使用した上で、
ArduinoからPCにMIDI信号を送るプログラムについて書きたいと思います。

[前回の記事]レーザーハープを自作する。(Part 2 : 回路編)

レーザーハープを自作する。(Part 2 : 回路編)
前回の記事では、レーザーハープを製作する上での指針を考えました。前回の記事から半年以上経過してしまいましたが、今回からレーザーハープの設計を行います!(・・;)レーザーハープを製作する上での指針を踏まえ、いよいよ電子回路を考...
スポンサーリンク

1. MIDI信号を出力するプログラムを用意する

1.1. 参考となるプログラム

MIDI信号を出力するためのプログラムを考えます。
今回は以下の記事を参考にさせていただきました。

参考:【DJ】Arduinoで自作MIDIコントローラーを作ってみる【VJ】,
http://teruaki-tsubokura.com/Lab/arduino_midi_controller/

こちらの記事に掲載されているソースコードを流用させていただくことで、
PCにMIDI信号を送ることができます!

ところで、自分はMIDI信号の規格について何もわからない状態で、
最初このソースコードを読んでも、どんな意味のコードなのか
全然わかりませんでした。

ノートオン?コントロールチェンジ??
ということで、インターネット上で色々と調べました。
以下の記事がとても参考になると思います。

参考:MIDIの学習, http://www1.plala.or.jp/yuuto/midi/

1.2. プログラムを考える

自分が調べたMIDIの情報を合わせながら、プログラムを考えていきます。

レーザーハープでは、レーザー光をCdSセルに当てて、
その光の有無をArduinoで認識することがポイントになります。

参考にさせていただいたプログラムは、
ボタンでArduinoに信号を送るものだったので、
CdSを使用する仕様に変更を加えます。

そして、変更を加えたプログラムは以下のようになりました。

#define NOTE_ON 144        //ノートオン(0x90)
#define CONTROL_CHANGE 176 //コントロールチェンジ(0xB0)
#define ALL_SOUND_OFF 120  //オールサウンドオフ

#define CDS_NUMBER 1       //CdSセルの使用数

int note_no[] = {60,62,64,65};  //CdSごとのノートナンバー

int CdS_val[] = {0,0,0,0};        //CdSの値格納用変数の初期化
int CdS_state[] = {0,0,0,0};      //CdSの状態(ON,OFF)格納用変数の初期化
int CdS_state_past[] = {0,0,0,0}; //CdSの過去状態格納用変数の初期化

void setup() {
  //MIDI開始
  Serial.begin(31250);
  sendMidi(CONTROL_CHANGE, ALL_SOUND_OFF, 0); //コントロールチェンジ,オールサウンドオフ
}


void loop() {  
  //CdSの値及び状態の読み取り
  for(int i=0; i < CDS_NUMBER; i++){
    CdS_val[i] = analogRead(i);
    if(CdS_val[i] < 800){            //CdSの閾値(0~1023)
      CdS_state[i] = 1;               //CdSの閾値未満:ON
    }else{
      CdS_state[i] = 0;               //CdSの閾値以上:OFF
    }
  }
  
  for(int i=0; i < CDS_NUMBER; i++){
    if(CdS_state_past[i] != CdS_state[i]){ //CdSの現在状態が過去状態と違ったら
      CdS_state_past[i] = CdS_state[i];    //CdSの過去状態を現在状態で更新
      sendMidi(NOTE_ON, note_no[i], CdS_state[i] * 127); //MIDI信号送信
    }
  }
}

void sendMidi(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

はじめに、define文でノートオン等を示すデータを予め設定しています。
ここでは、CdSセルの使用数の項目を加えました。
今回はCdSセルを1個使うので、「1」としています。

次に、ノートナンバーを配列に格納しています。
ここでは、C4の「ド(60)」から順に、「レ(62)」,「ミ(64)」,「ファ(65)」と4音を設定しました。

次に、CdSの値(電圧値)をArduinoで読み取ったあとに格納しておく配列(CdS_val)、
CdSに光が当たっているかの状態(ON,OFF)を格納する変数(CdS_state)、
そしてCdSの過去のON,OFF状態を格納しておく変数(CdS_state_past)を用意しました。

さて、loop関数の中では、実際にCdSの状態を読み取ります。
22行目から始まるfor文では、CdSセルの個数だけ繰り返し処理を行います。
その中では、analogRead関数によってCdSの電圧値を読み取り、
その値を閾値と比較し、CdSの閾値未満であればON(1)、
CdSの閾値以上であればOFF(0)と値を設定します。
今回は閾値を800としていますが、それぞれの環境によって変更が必要です。

次に、31行目から始まるfor文では、MIDI信号を送信する処理を行います。
CdSの現在状態が過去状態と違ったら
つまりCdSに当たるレーザー光が遮られたり、光がまた当てられたりしたら、
その時だけMIDI信号を送信するようになっています。

以上、プログラムの内容を簡単に説明しました。

このプログラムでレーザーハープが動くはずです。
きっと…。

しかし、プログラムをArduinoに書き込んでも、
まだMIDIコントローラーとしては動きません…。

2. ArduinoにMocoを導入する

レーザーハープを自作する。(Part 1 : 準備編)にて書きましたが、
Mocoというソフトが必要になります。

レーザーハープを自作する。(Part 1 : 準備編)
楽しいArduino Lifeを送っていますでしょうか。今回、僕はArduinoをMIDIコントローラーとして使ったレーザーハープを作ります!この記事は、ArduinoをMIDIコントローラーとして使う方法や、レーザー光を遮った...

(参考: morecat_lab – Midi Firmware for Arduino Uno (Moco) , http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/ )

このソフトによって、ArduinoをUSBケーブルによってPCに接続し、
MIDIコントローラーとして認識させることができます。

このMocoですが、残念ながらArduinoのIDEでは
Arduinoに書き込むことができません。
プログラムを書き込むチップが違うからです。

このため、Moco導入のために、一手間かけます。

普段Arduinoを使用するときに、Arduino IDEしか使ったことがない人にとっては
少しだけハードルが上がるかもしれません。
自分は最初よくわかりませんでした(・_・;)

今回の記事ではArduinoのプログラムを中心として書きましたので、
次回はMocoの導入について書きたいと思います!

レーザーハープに使っているArduino UNOはネットで購入できます。

Arduinoをはじめようキット
スイッチサイエンス
¥4,400(2021/01/16 10:04時点)
オライリージャパン刊行「Arduinoをはじめよう 第2版」に掲載の実験ができるキットです。

次回もどうぞよろしくお願いしますm(_ _)m


[次回の記事はこちら]

レーザーハープを自作する。(Part 4 : Moco導入編)
前回の記事では、ArduinoからPCへMIDI信号を送信するプログラムを考えました。今回は、ArduinoをMIDIコントローラーに変えるために必要となるMocoの導入方法について書きたいと思います。

コメント

タイトルとURLをコピーしました