そーまの電子工作 Blog

制作物一覧

以下に、これまでに作ってきた電子音楽用途に使えるデバイスのプロトタイプの紹介をしたいと思う。現存の電子楽器の表現方法やサウンドをさらにアップデートさせることができるといいなと思っている。

目次

[ モーショントラッキングmidiコントローラ ]

概要

dawで使用するためのハンドトラッキング、ヘッドトラッキングシステム。手や頭の動きでシンセのあれこれを操作しようという試みだ。

専用のデバイスでトラッキングし、シンセのパラメーターや音響エフェクト、ステージ上の照明や映像なども演者が直感的に操作できるステージシステムを目指している。リアルタイムでモーショントラッキングをする上で、操作性が非常に重要になってくる。指に装着したタッチセンサー、感圧センサー、物理ロータリーエンコーダを用いる、操作が反映されたと伝えるためのバイブレーションはプティクスなど、試作モデルでは、より直感的な操作が可能なウェアラブルmidiコントローラーとして制作を進めた。 

 

機能

プロトタイプとしては二つのモデルを作成した。一つ目は、手の甲にデバイスをつけるタイプ、二つ目は、スマートウォッチのような手首につけるタイプのものである。双方とも四端子2.5mmジャック(イヤホンジャックのちょっと小さい版)を刺せるポートを作成し、指につけるセンサー部の接続が可能である。

指先のセンサータッチ、押し込み、回転の三種類の動作が可能である。タッチはesp32内蔵静電容量タッチセンサー、圧力は10mm径の薄膜型圧力センサー、回転はb103ロータリーポテンショメータ、を組み合わせたものを作成した。

モーターはハプティクスのような振動が理想的だったので、瞬時に逆回転をかけて歯切れの良い振動にしている。モーターには片方だけ欠けた形の重りがついた偏心回転モーターを使用し、hブリッジ(TB67H450FNG)を用いて正回転、逆回転を制御している。たとえば正回転:逆回転で強い振動は9:5、弱い振動は4:3などの比率のようにしている。少しだけ逆回転をかけることで、モーターの回転をストップさせているようなイメージだ。

タッチセンサーはesp32内蔵のものを使用しているのだが、静電容量値のグラフの値が暴れ狂ってしまう。その値は環境による数値の変動やノイズが激しく、単純な閾値設定だといきなり出てきたノイズがその値を超えて誤検出になりかねない。よって移動平均法を使った適応型閾値処理を作ることにした。右往左往するタッチセンサーのグラフの値に、閾値がある程度仲良く着いてゆき、かなり大きく値が変動した時のみ閾値を越えられるといった感じなので、誤検出が出にくい。具体的には、元のアナログ値にサンプル数10の移動平均をかけ、値を2割増幅させた値を閾値として設定し、元の値がそれを超えたらタッチイベント発生といったような処理である。

二代目のデバイスでは、esp32 um TinyPICOを使用している。

  • ジャイロセンサー:WitMotion wt901B
  • ディスプレイ:128x32oled
  • ポート:2.5mm4pinジャックポートを二つ
  • モータードラバー:hブリッジのTB67H450FNG。esp32のgpioを2ch使って制御
  • バッテリー:502030のlipoバッテリー(250mAh)。バッテリーの充電保護回路はesp内蔵の物を使用。
  • タクトスイッチx2、用途未定の赤外線受信センサー

である。ソフトウェアはほとんどarduinoを使って組んだ。

デバイスで録音とmidiコントロールチェンジを操作し、maxmspで音声を操作している。

両手とメガネ型のデバイス(ハンズフリーマウスのもの)の三つのデバイスを用いて、ジャイロセンサー、加速度、また加速度を元にした相対的な左右向き、などの値をmidiコントロールチェンジとしてlogicのソフトシンセにマッピングし、EQやリバーブ、パンやLFOの速度のなどの値を体の動きを使って操作している。

両手とメガネ型のデバイス(ハンズフリーマウスのもの)の三つのデバイスを用いて、ジャイロセンサー、加速度、また加速度を元にした相対的な左右向き、などの値をmidiコントロールチェンジとしてlogicのソフトシンセにマッピングし、EQやリバーブ、パンやLFOの速度のなどの値を体の動きを使って操作している。

IMG_0229_1920

両手とメガネ型のデバイス(ハンズフリーマウスのもの)の三つのデバイスを用いて、ジャイロセンサー、加速度、また加速度を元にした相対的な左右向き、などの値をmidiコントロールチェンジとしてlogicのソフトシンセにマッピングし、EQやリバーブ、パンやLFOの速度のなどの値を体の動きを使って操作している。

screen_recording_800px

[ ハンズフリーBLEマウス ]

概要

先述のメガネ型デバイスを少し改良し、目のまばたきを検出できるようにした。加えてカーソルの動きを操作できるようにすることで、簡易的なマウスの完成。実際のところ意識的な瞬きと無意識的な瞬きが判別できないが、操作性は高い。

機能

瞬きの検出は主にフォトリフレクターというものを使っている。これは赤外線を照射し、跳ね返ってきた赤外線の量を測ることによって、そのセンサーの前の物体の変化をパラメータで見ることができる。(マインクラフトでいうとかぼちゃ収穫の時に使うオブサーバーみたいなやつ。)目の前にそれをつけ、目を閉じるとまぶたによって赤外線反射量が増えるのでそれを瞬きとして検出する。瞬きをすると、その瞬間に短いバイブレーションが起こる。

一回の瞬きでクリック、2回の瞬きでスクロールモードに入りカーソルの動きが止まり、その状態で上下左右のスクロールが可能となる。

フォトリフレクターもタッチセンサーと同様ノイズに弱いため、移動平均法を使った適応型閾値処理を組んだ。加えてこれは赤外線センサーのため環境光、特に日光の影響を強く受ける。そのため、カーソル操作時の頭を動かした際の流入日光量の変化も平滑化させた。

元はaliexpressで入手したイヤホン付きサングラスを分解したフレームを筐体としている。当時作った時はもっと小型のesp32モジュールがあると知らなかったので、巨大なesp32 devkit v4というモデルがメガネのフレームに収まるようにビットルーター等で血眼で削った覚えがある。当初はセンサーなどの値を直接macに送信する方式の通信方法(bletoothSerial)を使い、受信した値をmac側でSwiftとpythonで記述したプログラムでカーソルの動きやクリックに変換していた。タイムラグが問題となっていたが、のちにarduino ide側でblemouseのライブラリを発見したのでそれを拝借した。これはesp32本体側をbluetoothマウスデバイスとして認識させるライブラリで、カーソルの動きやスクロール操作を本体側で記述できてしまうのでかなり助かった。

このデバイス単体でネットサーフィンが可能だ。手につけるものと組み合わせてソフトウェアシンセの画面を操作するような機能として使いたい。

[ 瞳孔トラッキング ]

概要

座ってるだけで、その人に合った曲が生まれるという仕組みを作ってみたかった。

バイタルデータを元にした簡易的なリアルタイム自動作曲システム。瞳孔の大きさ、変化率、目の動き、瞬き、心拍数などの生体データを取得し、MaxMspを用いた作った自動作曲システムのパラメータとして用いる。

友達三人でとある作品展に応募した時のものだ。後ろのモニターに写っている映像は、デバイスから計測されたデータをリアルタイムで反映させている。友達二人がそれぞれ作ってくれた。片方はsiv3Dを使った、パラメータをわかりやすく表示させるもの。もう片方touchdesinerを用いて、送信したカメラ入力の映像にバイタルデータに連動したエフェクトをかけてくれるものである。落選したが。

機能

人の心理状態は目によく現れると言われる。緊張すると目が泳いたり、瞬きが減ったり、瞳孔が開いたり(リラックス状態はその逆)、といったような感じだ。このデバイスでそれら目の状態、心拍数をデータ化する。

デバイスは二種類試作し、一代目は100均老眼鏡のフレームにwebカメラの中身を取り付けたタイプ、2台目はメガネ型ルーペの筐体を用い、目に当てるカメラ部分が覆われているため精度が増している(1代目はミスでショートさせてカメラが壊れた)。

カメラはOv5640というものを使用し、レンズ部分の赤外線フィルターを取り除くことで、環境光の赤外線を受容することができるようになる。レンズの隣に赤外線ledを置き、目の前で照射することによって、黒目の内側にあるさらに黒い瞳孔の部分が鮮明に見えるようになる。画像検出処理をpythonで作り、瞳孔のトラッキングが可能になった。心拍センサーは耳たぶに装着する。

作曲システムはmaxmspを用い、コード進行やシンセの音響パラメータ、アルペジオパターンやテンポ、転調などをリアルタイムで変化させるようにした。例えば、瞳孔が開き、心拍数の上昇や目の動きの多さなどを検知し、生成されるコード進行やarpパターンなどがより緊張したものになるといった具合だ。転調やコード進行などは自身の独自の解釈で作成した。

pythonによる画像検出機能は主にopenCVを使用し、カメラから取得した映像に、段階的な画像処理を施すことで瞳孔データを抽出している。ざっくりいうと、白黒にして、露出を調整して、白い部分を抽出する、といったような処理だ。まずカメラ映像をグレースケールに変換してモノクロに、次にバイラテラルフィルタをかけることで、輪郭のエッジはそのままノイズだけを滑らかに除去することができる。一般的なぼかし処理と異なり、バイラテラルフィルタは瞳孔のくっきりした境界線を保つことができる。瞳孔は周囲より暗い領域なので、一定の明るさより暗いピクセルを白く反転させることで、瞳孔部分だけを白い塊として浮かび上がらせる。この閾値は照明環境の変化に合わせてプログラムが自動調整する。

最後に白いエリアの輪郭を検出し、その形状に楕円をフィッティングし、検出された楕円の縦横比が0.51.5の範囲に収まっていれば「円に近い=瞳孔」、大きく崩れていれば「瞬き」と判定するといったような感じだ。これにより、まばたき、瞳孔の大きさ、座標を取得することができる。

[ 基板 ]

概要

前で紹介してきたプロトタイプはけっこう作る労力が必要だ。kicadを利用し、モーショントラッキング系のデバイスを現在新しい機能を盛り込んだもの制作している。プロトタイプでは不可能だった、指先に六軸ジャイロセンサーを入れること、ハプティックを偏心回転のバイブレーションモーターから「power hap」というリニアタイプのアクチュエータにすることなどを盛り込んでいる。現在、各チップの動作確認を含めた様々なテストをしている。

作成するにあたって必要な回路は、

  • 58個neopixelが乗ったフレキシブル基板リング:1ミリ四方の小型RGBledを58個、リング上に設け、タッチロータリーエンコーダーやその他UIに合わせてledアニメーションをつける。
  • 5v、3v3昇圧回路:5vはneopixelリング用、3.3vの昇圧は各センサー類の給電用として、lipoバッテリーから昇圧する。
  • 8ch自己容量式ロータリータッチエンコーダ:基板テストでは、qt1244というチップを用いて相互容量式のタッチセンサーを試した。細かな値を取ることはできるがノイズや環境変化に弱いため、このプロジェクトではより単純な自己容量式のタッチセンサーに変更したいと思っている。
  • 指先用3ch自己容量式タッチエンコーダーバーとジャイロセンサー:電極が三つの自己容量式タッチバーを使い、指先でモジュレーションホイールのような操作をできるように作成中。また、指先の動きをジャイロセンサーで捉えることが可能。
  • powerHap駆動リニアアクチュエータドライバー回路:TDK power hapを動かすための交流100v昇圧チップ回路。プロトタイプでは偏心回転モーターを使用していたが、歯切れや感触のスピード感、感覚の種類を増やすためにこのリニアアクチュエータを採用したい。
 

[ その他 ]

概要

一つの項目にするまでもない小さなプロジェクトを紹介する。

evドラム

roland v-drumを無線midiデバイス化させた。lipoバッテリー給電のesp32で元の電子ドラムのpiezoセンサー部を読み取り、midiノートとして扱う。arduinoライブラリのblemidiを用いてmacmidiデバイスとして認識させている。またneopixelテープライトを用いてアニメーションをつけた。

カメラハンドトラッキング

OpenCVライブラリを用いた画像認識ハンドトラッキングを用いて、手の位置の相対的な移動距離や形などをmidiデータに起こす。使用カメラはov5640の120°広角レンズ、フレーム両サイドに配置してステレオで組んだ。

ディスプレイマトリックス

256×256ledマトリクスを用いて、ライブ用の大型のディスプレイを作成した。裏についているネジ穴で連結するのだがそれらしきキットは付属していないので、ネジから見つけに行かなくてはならなかった。ホームセンターの店員の方が親身になって一緒に探してくれた。

おともだち

マネキンの両目にwebカメラを仕込み、raspberry pi 3Bを用いて、python画像検出ライブラリを用いて人物検出を行い、人の顔を認識して追従させるようにした。両目カメラなので、ステレオカメラによる奥行き検出もできるようにした。が、raspiの処理速度が問題だ。あと重さで首がよく落ちる。

パーリンノイズアート

(画面内をタップするとパターンがリセットされます。)

パーリンノイズを用いたprocessingの作品。web上の動作はp5.jsが便利なので、生成AIに書き直してもらった。パーリンノイズとはいわば「動く等高線」のようなもので、画面上に置いたピクセルをその上でころがし、動いた軌道を線で残しておいているといったような感じだ。さらにスピードの変化や色の変化などを付け加えて完成。スマホ版では、Androidとiphoneでグラフィック形式が違く、両方をうまく動せるようにするのが大変だった。p5.jsのコードはこちら

ライブ

友達の和田神威くんとの共作。ledマトリックスディスプレイ、照明と合わせたライブパフォーマンス。一連のセットを組むのに時間がかかり、午後から準備を始め、夜のうちに撮ろうとしたら日が開けてしまった。撮影したのは午前6時ごろ。

[ 今後の展望 ]

ここまで、現在まで作ってきたものたちを紹介した。ウェアラブルなシンセサイザーコントローラーとしてさまざまな方面のプロトタイプを作ったが、それらを組み合わせた上でこれからやりたいことを挙げていく

dawソフトとのリアルタイム同期演奏の最適化

今までのライブパフォーマンスでは、dawソフトとの同期は演奏者がdawの再生音源などに合わせる形で行われてきたと思う。これにより一人演奏などでのクオリティーが上がるわけだが、いかなる場合でも事前に用意した音源の小節やテンポなどに合わせた演奏をしなくてはならない。</p><p>しかしこれらのウェアラブルデバイスなどを用いることで、コンピュータ側が演奏者の動きを読み取り、実際に演奏しているテンポなどに合わせた演奏者時間軸主体のdaw音源同期システムを作ることができるのではと思っている。

ステージシステム全体のリアルタイム化

先述のようなデバイスを用いることで、演奏者が演奏、daw同期、音響エフェクト、照明、映像などを直感的に操ることができる。これは現在一般的に行われている、照明や映像などの曲のシーンに合わせたプリセットの垂れ流しではなく、全て演奏者の直感的な意思によって動かすことができると考えている。

無意識パラメータの反映

シンセサイザーなどのツマミなどによるパラメーターのコントロールは、現在ほぼ全てユーザーの「意識的な操作」によってなされている。これを、うでや頭の動きなど、演奏している手などの部位以外の動きを捉えること、さらに演奏者の心拍や瞳孔などのバイタルデータから読み取った「無意識のパラメータ」を使うことで、音や照明、音響効果や映像に反映させ、より興味深いライブ演奏になるのではないかと考えている。

生成AIへの身体データの入力

自分は音楽は今後、よりタイムリーで「動的」なコンテンツになるのではないかと考えている。取得した演奏者自身のデータは、今後発展するであろう、リアルタイムでのAI生成音楽に適応させることで、その人の現在の心理状況や生体状況に応じた音楽を生成する、またはそういった生成音楽とリアルタイムでセッションすることが可能になるかもしれない。

作成したものは今後も書き足していく予定だ。