高感度光センサ MAX30105 で心拍数と音楽を同期
おもしろいセンサを手に入れたので心拍数を測って曲のBPMを変えてみました♪
ArduinoをUSB-MIDIコントローラ化して心拍数と曲のBPMをリンクさせる リアルタイムヒューマン同期システムです!w
目次
構成
部品
- マイコンArduino UNO
ファームウェア書き換えてUSB-MIDIデバイス化してます。
- MAX30105搭載 粒子センサモジュール
赤外線で指先の血流みて心拍数導出してるっぽい。
前に長男くんが気管支炎で入院したときも同じようなセンサを
足の指につけて心拍数と血流酸素濃度測ってたなぁ。。。Arduino用ライブラリは以下
https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library
Arduino USB-MIDIデバイス化
上記の作品と同様に以下のサイトのとおりにArduinoのファームウェアを書き換えてMIDIデバイス化しました。
これにセンサを接続し測定した心拍数をMIDI信号に変換して送信するコントローラが実現します!
Arduino IDEコード
MAX30105のライブラリExampleのExample5_HeartRate.inoをベースに作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#include <Wire.h> #include "MAX30105.h" #include "heartRate.h" #include <MIDI.h> MIDI_CREATE_DEFAULT_INSTANCE(); MAX30105 particleSensor; const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good. byte rates[RATE_SIZE]; //Array of heart rates byte rateSpot = 0; long lastBeat = 0; //Time at which the last beat occurred float beatsPerMinute; int beatAvg; void setup() { MIDI.begin(); // Initialize sensor if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed { while (1); } particleSensor.setup(); //Configure sensor with default settings particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED } void loop() { long irValue = particleSensor.getIR(); if (checkForBeat(irValue) == true) { //We sensed a beat! long delta = millis() - lastBeat; lastBeat = millis(); beatsPerMinute = 60 / (delta / 1000.0); if (beatsPerMinute < 255 && beatsPerMinute > 20) { rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array rateSpot %= RATE_SIZE; //Wrap variable //Take average of readings beatAvg = 0; for (byte x = 0 ; x < RATE_SIZE ; x++) beatAvg += rates[x]; beatAvg /= RATE_SIZE; } } //心拍数の平均値をControlChangeとしてMIDI送信 int bpm = map(beatAvg, 1, 999, 0, 127); MIDI.sendControlChange(0, bpm, 1); // inControlNumber, inControlValue, inChannel } |
DAWソフトReasonの設定
DAWソフトにはReasonを使用しました。
コントローラ設定(手動)
- [Reason] -> [環境設定] -> [コントローラ]タブ -> [追加]で以下設定
メーカー:<Other>
モデル:MIDI Control Surface
MIDI入力:MocoLUFA
DAWテンポとコントローラをリンク
- テンポ表示部を右クリック -> [リモートオーバーライドマップを編集]で以下設定
コントローラ:<Other> MIDI Control Surface
コントロール:CC 00
以上で心拍数とDAWのテンポがリンクできます。
動作
このセンサは瞬きもセンシングできるらしいので色々試してみます!!
とても参考になる記事を有難うございます。
心拍センサー(この記事で紹介されているものとは違う)を購入して、
REASONもダウンロードして実装を進めているのですが、
最後の最後のREASONでのリモートオーバータイムラップの段階で信号を検出して貰えません。。
//心拍数の平均値をControlChangeとしてMIDI送信
int bpm = map(beatAvg, 1, 999, 0, 127);
MIDI.sendControlChange(0, bpm, 1); // inControlNumber, inControlValue, inChannel
この部分以外で信号を検出するために必要な条件はありますでしょうか。(MIDIデバイスとして検出自体はしてくれます)
コメントありがとうございます!
//心拍数の平均値をControlChangeとしてMIDI送信
int bpm = map(beatAvg, 1, 999, 0, 127);
MIDI.sendControlChange(0, bpm, 1); // inControlNumber, inControlValue, inChannel
MIDI信号を出力するためのコードはここの部分のみです。
以下、確認必要かと思います。
・ご使用のセンサはMAX30105でしょうか?
・センシングした心拍数のデータ出力は確認できてますでしょうか?
たとえばライブラリのプログラム例で動作確認できていますでしょうか?
・MIDIの出力先は正しいでしょうか?
このプログラムではコントロール値は0でチャンネル1に出力しています。