💽

HDD/ステッピングモータでの演奏を自動録画・編集して投稿してくれるサービスを(大体)作成した話

に公開

事の発端と記事の概要

HDDやステッピングモーター、今はめったに使われていないフロッピーディスクといったハードウェア。これらが楽器として使われていることをご存じですか?これらは、実際に動作している際に、摩擦などといった理由からかすかに音がなっています。HDDなんかは、Read/Writeをしているときに鳴っているのを聞いている人も多いと思います。なんとこれら雑音を周波数で制御することにより、任意の音程を奏でることが実現できてしまいます!この原理で演奏したものを動画として投稿している方も多く、以下のように動画配信プラットホームにて投稿されています。(おすすめを貼っています)

https://youtu.be/lL3cv4NqNxc?si=YAhTRYjD6e7A48iF

https://youtu.be/vNvRhGksQ9A?si=OfJ7-nmMiWdO3lwt

今回は、これら作品に影響されて作成した、ハードウェア演奏を自動録画・編集し動画として見れるようにした方法について説明します。ハードウェアだけでなく、ソフトウェア的なバックエンドについてもまとめています。
また、技育CAMP vol4にてチーム開発で行っていたため、他チームメンバーが担当していた詳細については、各メンバーのZennに投稿されると思います。本記事では、作品の概要と自身が担当した部分について説明していますので是非最後まで読んでください!

書いて(書けて)ないもの

  • 各技術の詳細
  • 具体的なコード

作った作品

デモ(急いでデプロイしていたのでサイト名がまだ変わっていないかもしれない...)
https://jpm.mikuto.dev/
Github
https://github.com/lc-tut/hdd-music-web

技術スタック

  • React (フロント)
  • Go (バックエンド)
    • 主なpackage: gomidi, echo
  • PostgreSQL
  • Python (以下AIツールの使用)
    • Demucs, Basic Pitch
  • ESP32+Arduino (Midi演奏デバイスの制御)

ハードウェアの演奏が動画として投稿されるまで

本サービスは、作成したMidiファイル、もしくはwavファイルをアップロードすることで、その曲を演奏した動画を見ることができます。以下は動画になるまでを表したフローチャートです。

次に、基幹となる部分の概要をまとめます。

wav入力~midiへ変換

楽器を演奏するとき、普段皆さんが動画・音声として聞いているwavmp3 m4aという音声形式は、音の波を直接デジタル数値に変換した、PCM形式の波形データです。一方で、楽器を演奏するためのmidiには、どの音程がどれほどの長さで、いつからどのくらい鳴らすかというデータをまとめたものです。
Midiから音声波形を取得するのであれば、DAWやWindowsにも搭載されている出力ポートから簡単に音声にすることができますが。一方で精度よく音声波形をMidiにするには、いわゆる耳コピやスペクトル解析を見ながら人の手でMidiにする必要が有ります。この作業がどれほど難しいかといわれると、模写しながらイラストをきれいに描く難しさに近いです。このように、単純なアルゴリズムだけでは、エコーや歪み、人の声といった音程情報以外の要因が入っている音声ファイルから制御ファイルを作成することは困難であるといえます。
本サービスでは、この問題を解決して誰でも好きな音声を演奏できるようにする必要が有ります。そのため、Basic PitchというAI(機械学習)を利用した音声からMIDIへの変換技術と、Demucsという音声を「ボーカル」「ドラム」「ベース」「その他の楽器(メロディやコード進行を担当するそれ以外のもの)」に分離することができるAI音源分離技術を使用しています。

演奏・録画処理

作成されたデータをもとに、midiの演奏とその録画を行います。演奏を担当するMidi端末はESP32で制御し、サーバが送信するMidi信号を割り当てられた周波数・回転数に変換して演奏します。この演奏タイミングに合わせて、OBSへ録画開始の信号を送信しています。
演奏できる端末は1デバイス(最大2デバイス)となっており、1つのタイミングで1つのnote(音を鳴らす時間範囲とその音程)しか演奏することができません。この問題を解決するために、元のmidiデータ読み込み後、1トラックに和音(時間軸上に音が重ならない状態)がない状態に分離する処理をはさんでいます。また、演奏が分離されることにより、録画も複数回行っています。
最終的にはこれら動画ファイルを1つの動画ファイルへと統合する処理を行います。(こちらは現在作成中)

開発を振り返って

私は主に、プロジェクトの提案・設計と各それぞれの技術的補助やエラー対応、そして開発環境のセットアップとGo/DBを用いたデータ管理・サーバからの各レイヤー制御部を作成しました。それぞれの技術についてある程度の知識があるため、テックリードとしての役割もあったと思います。また、単純な実装力だけではなく、長期的なチームでの開発・運用を視野に入れた環境構築(miseの導入)やコード設計(クリーンアーキテクチャの導入)などといった、チームならではの開発体験と過去の開発・インターン経験もフルに活かせた開発だったと思っています。
最後に感想をまとめると、Webアプリケーションとしての開発と、AIモデルの調整・選定、それからハードウェア制御...さらにはチーム開発という非常に幅広い経験のできる作品だったと考えています。

是非、正式にリリースされたときに好きな音楽をハードウェアで演奏してみてください!

あとがき
私が作成していたmidiを何とかHDDで再生できないかと考えていましたが、こんなにも便利な形で実装することができるとは思ってなかった!いっぱい動画にしたいと思います。

Linux Club - 東京工科大学

Discussion