心拍可触化アプリ「HeartBeatMaker」について再考する
はじめに
まずはこちらの記事からどうぞ。
上のnoteの内容をざっくりいうと、演者のリアルタイムの心拍を掌に感じながらパフォーマンスを鑑賞する体験を考えました、というようなことを書いております。この鑑賞体験のために制作したのが、心拍可触化アプリ「HeartBeatMaker」です。
まずはこの記事から通信方法やアプリケーションをアップデートしましたので、そちらについて触れておきます。
改良版「HeartBeatMaker」の仕様
同じものを作ろうとしたら作れるくらい詳しく説明してやろうと思います。別に難しいことはしておりませんので、道具と多少の知識があれば、簡単に作れるかと思います。
まず、耳につけたpulse sensor(これです↓)で心拍を測るのは変わりません。
そのデータを受け取り変換・通信するデバイスを、ArduinoからM5Stackに変更しました。
この変更による最大のメリットは、ルーターを設置すれば無線で通信できるということです。できれば卒展前にそうしたかったんですが。さらにブロードキャスト通信というのを覚えまして、送り先として設定するIPアドレスを◯.◯.◯.255という感じにすれば、任意の端末に送信できるみたいですね。早く教えて欲しかったです。
M5Stackから直接アプリケーション側に、OSC通信によって心拍の波が大きくなったタイミングで「1」を送り、バイブレーションが鳴るようにしました。NxPC.Live vol.53のときの反省を踏まえ、音響設備に依存しない仕様に変更しています。一応下にM5Stackのコードも載せておきますが、ちゃんと動くかは保証しません。中身もあまり覚えていないので下手に説明しませんが、途中の計算式は、移動平均を出すことで心拍の波が大きくなるタイミングをとっています。
#include<stdio.h>
#include <ArduinoOSCWiFi.h>
#include <M5Stack.h>
int sensorValue = 0;
const int num_smp = 15;
int mave = 0;
const int num_ave = 10; // 移動平均する数
int w[num_ave];
float mx = 0.; //定義した範囲の最大値
float mn = 255.; //定義した範囲の最小値
int count = 0; //0が送られてからのループ回数
float pv = 0; //過去の値(previous Value)
// Wi-Fiの設定
const String SSID = "各自のSSID";
const String PASSWORD = "WiFiのパスワード";
// OSCの設定
const String TARGEET_IP = "◯.◯.◯.255";
const int TARGET_PORT = 10000;
int HR_pin=35; // 心拍センサーの信号線をGPIO35につなぐ
void setup() {
M5.begin();
M5.Lcd.setTextSize(2);
// WiFi へ接続開始
WiFi.begin(SSID.c_str(), PASSWORD.c_str());
M5.Lcd.print("Connecting to the WiFi AP: " + SSID);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
M5.Lcd.print(".");
}
M5.Lcd.println(" connected.");
// 接続完了
delay(3000);
M5.Lcd.clear();
M5.Lcd.setCursor(0, 0);
M5.Lcd.print("IP address: ");
M5.Lcd.println(WiFi.localIP());
pinMode(HR_pin, INPUT);
}
void loop() {
OscWiFi.update(); // OSCを使うときは、この行を追加
sensorValue = analogRead(HR_pin);
//num_ave個のサンプルの移動平均を算出する
for ( int i = num_ave - 1; i >= 1; i-- ) {
w[i] = w[i - 1];
}
w[0] = sensorValue;
int sum = 0;
for ( int i = 0; i < num_ave; i++)
sum += w[i];
mave = sum / num_ave ; // 5つの移動平均を計算して、それを表示
float cv = mave / 4; //current Value
//buffer内の最大値と最小値を求める
//最大値と最小値の中間値を求める
//0.5秒経ったら、下記で求める上りの時の中間値を通過する瞬間に0をMaxに送る
if (cv > mx) {
mx = cv;
} else if (cv < mn) {
mn = cv;
}
count += 1;
if (count >= num_smp) {
float ave = (mx + mn) / 2; //中間値
if ( pv < cv && cv >= ave && pv < ave || count > num_smp*2 ) {
Serial.println(100);
OscWiFi.send(TARGEET_IP.c_str(), TARGET_PORT, "/HB", 1); // OSCデータを送信
count = 0;
mx = 0.;
mn = 255.;
}
}
pv = cv;
int ov = cv;
if (ov == 0) {
ov = 1;
}
Serial.println(0);
Serial.print(",");
// LCD 表示
M5.Lcd.setCursor(0, 50);
M5.Lcd.println("Send OSC");
M5.Lcd.print("Target IP: ");
M5.Lcd.println(TARGEET_IP.c_str());
M5.Lcd.print("Target Port: ");
M5.Lcd.println(TARGET_PORT);
M5.Lcd.print("BPM: ");
M5.Lcd.println(analogRead(HR_pin));
Serial.println(analogRead(HR_pin)); // 心拍センサーを読み、シリアルに出力
delay(1);
}
アプリの変更点としては、音の通信を使わなくなったのでマイク入力のFFTが必要なくなりました。よってシンプルにOSC通信するだけのUnityで開発する必要のないアプリケーションになりました。まあそれは最初からですが。OSC通信にはOSCJackを使用しています。以下の記事を参考にしました。
EventReceiverの設定は以下の通りです。ServerSample内のTextFrameはデバックに使っていたのが残っているだけなので気にしないでください。
また、バイブレーションの実装は以下の記事の短い振動の実装のところを参考にしています。
以上の情報でおそらく実装できるはずです。抜けているのに気づいたら適宜追加します。
しかしながら、今はちょっと違う方向性で研究を進めています。なのでここからは、実際に体験してもらった方からいただいたフィードバックをもとに、なぜ方向性を変えたのか、このアプリの是非について書いていきます。
フィードバックなど
まずはいただいたフィードバックをざっくりまとめて列挙します。
心拍のテンポとパフォーマンス・曲のテンポの違いにより、違和感が生じる/面白いと感じる
自分の心臓近くでスマホを握っていると、心拍が混ざり合うような感覚があった
パフォーマンスとスマホのどちらに集中したら良いかわからない
パフォーマンスに集中すると、バイブレーションがあまりわからなくなった
感情移入できる
息遣いと同期している
物理的な距離感に関わらず、演者の存在感を認識したままパフォーマンスを楽しむことができる
心拍をどう受け取れば良いのかわからない
生き物を持っている感じがする
観客の心拍も取ってはどうか?
心拍をスマホの振動に反映するのではなく、照明や音にしてはどうか?
そして自分も体験させていただいたので、そのときの感想です。
奇妙な体験だった
終わった後も何となく感触が残る
握っている心拍が本当にパフォーマーの心拍なのかわからない(繋がっていることを示すようなアクションが必要かもしれない)
1対1でしかなく、他の観客も同じものを感じていることがわからないのではないか
ただ緊張を追うだけのものになっているかもしれない(どう受け取れば良いかを説明すれば解決するのかもしれない)
身体的な負荷がかかる場面で明確に心拍が上がった
心拍のダイレクトな感じがパフォーマンスの抽象さとあまりあっていないかもしれない
専用のデバイスがあったほうが良いかもしれない
考えたこと ・ 今後のこと
以上がいただいたフィードバック・自分の感想でした。方向性を変えた大きな理由は、自分自身がこれは必要だ!と感じられなかったことが大きいです。誰のどんな演技をどんな環境で見ているかによって感想は変わる気がしますが、しかしその意味では、どんな場面でもあったほうが良いものではないのだと思います。手が塞がれることで体の動きが制限され、拍手をしたり思わず動いてしまったり、そういったアクションがしにくいのも難点です。また、違和感がある / 面白いというように感想が真っ二つに割れていることから、選択肢の一つにとどめるような扱いが妥当なのではないかという結論に至りました。ただ、全く使えない代物という風には思っておらず、テレビで言うところの副音声のような、聞きたい(感じたい)ニッチなファンにはうけるコンテンツとしての展開は考えられるなと思います。
まだまだ改良できる点はあるかと思いますが、ひとまずここまでで制作したものを一区切りとして、次のステップへ向かうことにしました。次のお話もnoteにまとめているところですので、ぜひそちらも合わせて読んでいただければと思います。
自分の活動にこのアプリを取り入れてみたい、というようなことがあれば、ぜひお声がけください!また、多少の知識と道具があれば作れるくらいには仕様をまとめているつもりですので、そちらもご自由にお使いください。
何かあればmnaga21@iamas.ac.jpまで。