前回の記事では、レーザーハープの電子回路を考えました。
また前回の記事からだいぶ時間が経過してしまいましたが…、
今回はArduinoに接続した電子回路を使用した上で、
ArduinoからPCにMIDI信号を送るプログラムについて書きたいと思います。
[前回の記事]レーザーハープを自作する。(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というソフトが必要になります。
(参考: 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はネットで購入できます。
次回もどうぞよろしくお願いしますm(_ _)m
[次回の記事はこちら]
コメント