Infinite Songs in Your Pocket。無限音楽機関を20グラムの手のひらサイズに押し込んだ(CloseBox)

テクノロジー AI
松尾公也

テクノエッジ編集部 シニアエディター / コミュニティストラテジスト @mazzo

特集

初代iPodから25年ということで、iPodの父(の一人)であるトニー・ファデルがXに当時の話を投稿していて、スティーブ・ジョブズにモックプレゼンしたときのエピソードが面白かったです。

さて、この初代iPodの売り文句が「1,000 Songs in Your Pocket」、あなたのポケットに1000曲が入ってる、というもの。これに対抗するわけではないですが、無限の音楽をさらにさらに小さなプレイヤーで再生できるようにするというのが今回の趣旨です。

InfinitePodとでも名付けましょうか。

Claude Codeで作ったアプリをPC以外にも組み込んでいくプロジェクト、前回は5インチのRISC-Vタブレット、M5Stack Tab5でした。今回は、同じものをどこまで小さくできるかというのがチャレンジポイントです。

ターゲットは、前回の記事の最後で「注文した」と書いたM5Stackの「AtomS3R」です。本体は2.4cm角のサイコロ状。帰省していた長崎の実家にスイッチサイエンスから届きました。

AtomS3Rとはどんなもの?

AtomS3Rは、EspressifのESP32-S3を積んだ超小型の開発ボードです。Tab5のESP32-P4がRISC-Vだったのに対して、こちらはXtensa(RISCベースのCPU/DSPコア)のデュアルコアで240MHz。PSRAMが8MB、フラッシュが8MB。

同じM5Stackの製品だから同じプロセッサかと思ったらぜんぜん違うんですね(今知った)。しかも、ArmでもなければRISC-Vでもない独自IPだというのです。

AtomS3Rはこれに加えて0.85インチの128×128ピクセル液晶が正面についていて、その画面自体がボタンになっています。9軸のIMU(BMI270とBMM150)と赤外線LEDも入って、筐体は24×24×13mm、Tab5の1280×720と比べると、画面の面積は50分の1以下です。そして6.8gという圧倒的な軽さ。

音を出す部分は本体にはありません。その代わり、底面の端子に「Atomic Base」と呼ばれる拡張基板を差して足します。

拡張基盤として標準で付属するのはスピーカーだけのユニット。もう一つ購入したのが、Atomic Audio-3.5 Baseで、ES8311のコーデック、NS4150Bの1Wアンプ、8Ωの小さなスピーカー、MEMSマイク、それに3.5mmのヘッドフォンジャックが載っています。

基板は24×48mmで、本体を乗せると高さ3cmほどのブロックになります。ポケットに入ります。イヤフォンジャックがついてるので、ここにワイヤードのヘッドフォンを挿せば、InfinitePodになるという仕組みです。

ギターはここには載せません。画面がないので弾けないから(テルミンみたいにやればできるけど)。載せるのは、Tab5に入れた3つの自動演奏アプリ、「Emerson Moog Infinity」「Bach Perpetuum Mobile」「Satie Infinity」です。電源を入れるとバッハ、サティ、ELPっぽい音楽が鳴り続ける箱。

届く前に移植は終わっていた

AtomS3Rが届く前に、Claude Codeに「この3つをAtomS3Rで動かしたい」と伝えておきました。

Tab5版のアプリは、音源と作曲のロジックと、1280×720の画面描画が同じファイルに入っています。Claude Codeがやったのは、画面の部分を「INFINITY_HEADLESS」というスイッチでコンパイルから外し、残った音の部分をそのままAtomS3Rでビルドすることでした。Tab5側のソースファイルをコピーせず、シンボリックリンクで参照しているので、Tab5版を直せばAtom版も直ります。

問題はフラッシュです。Satieのピアノのサンプルは3.4MBあり、Tab5の16MBには余裕で入りましたが、AtomS3Rは8MB。Arduinoの標準の配置だとアプリ領域は3MB少々なので入りません。Claude Codeはアプリ領域を7.9MBまで広げた独自のパーティション表を用意し、ファームウェア全体で5.7MB、7割弱というところに収めました。

コンパイルは通っているが、鳴るかどうかは分からない。そういう状態で、サイコロ(AtomS3R)が届きました。

48kHzでは落ちる

USBケーブルをつないで、書き込んで、Emersonを鳴らします。

ちゃんと音が出ました。Tab5と同じMoogのソロが、2.4cm角から出てきます。ただし、Claude Codeがシリアル経由で読んでいた統計値は芳しくありませんでした。

Tab5版と同じ48kHz、256サンプルずつの計算で、1ブロックの締め切りは5.3ms。Emersonはこれに対して平均5~7msかかっていました。間に合わないブロックが毎秒数十個、曲が盛り上がるとさらに増えます。そして20秒ほどで、ESP32-S3のウォッチドッグが「CPU 0のアイドルタスクが動けない」と判断して本体を再起動しました。再起動しては鳴り、また20秒で落ちるのです。

計算が間に合わないのは当然で、Tab5のESP32-P4は400MHzのRISC-V、AtomS3RのESP32-S3は240MHzのXtensaです。Tab5で片方のコアの4割だったEmersonは、ここでは130%です。

Claude Codeは3つの手を打ちました。

1つ目は、サンプリングレートを32kHzに落とすこと。1ブロックの締め切りが5.3msから8msに伸び、計算量は3分の2になります。1Wのスピーカーから聞く分には、16kHzまで出ていれば十分という判断です。共通のDSP部品はすべてサンプリングレートを定数で参照していたので、Atom版のスケッチの先頭で定義を変えるだけで、リバーブの遅延線の長さまで追従しました。

2つ目は、音声計算のタスクをコア1に移すこと。M5Unifiedのスピーカー出力のタスクがコア0にいるので、同じコアに重い計算を置くとアイドルタスクが動けなくなり、ウォッチドッグが発火します。

3つ目は内蔵RAMの使い方です。Tab5版では、リバーブの遅延線を帯域の速い内蔵RAMに優先して置いていました。これをそのままAtomでやると、Bachを起動した時点で内蔵RAMの空きが3KBになっていました。Wi-FiもUSBも使えない水準です。空きが64KBを切る分はPSRAMに回すよう変えて、90KBほど残るようになりました。

この3つで、Emersonは8msの締め切りに対して平均6~6.7ms。75~85%のところで安定しました。間に合わないブロックは数分でゼロか数個、再起動はなし。Bachは2.1ms、Satieは2.5msで、こちらは余裕です。本体の温度センサーは54℃で落ち着いています。

Emersonの内訳も出してもらいました。1秒あたりの計算時間で、Hammondオルガンが8ボイスで200~300ms、リバーブと歪みなどのエフェクトが200ms、Moogのリードが150ms、ベースが100ms、ドラムが65ms。オルガンとエフェクトで半分以上を食っています。もしこれでも足りなくなったら、次の手は24kHzに下げるか、ドラム用のリバーブを外すかです。

128×128の画面と、ひとつのボタン

画面は小さいので、情報だけを出します。アプリ名、今の様式、Emersonなら曲の段階とテンポ、Bachならピッチ(a′=415か440)とテンポ、再生中か一時停止か、音量。その下にCPU負荷のバーと温度。負荷のバーは65%を超えると橙、85%を超えると赤になるので、Emersonを鳴らしていると常に橙色です。

操作はボタンひとつです。クリックで様式を切り替え(Bachは7つの様式、Satieは生成エンジン、Emersonは強度)、ダブルクリックで次のアプリ、1秒長押しで再生と一時停止。最後に鳴らしていたアプリと音量は不揮発メモリに覚えておき、電源を入れたらそこから勝手に再生が始まります。

「電源を入れたら楽器」というTab5の手触りは、さらに研ぎ澄まされました。USBケーブルを挿した瞬間に、バッハのパッサカリアが始まります。

モバイルバッテリーで動かす

ポケットに入るなら、ケーブルから切り離したい。

AtomS3Rには充電回路も電池もないので、外から5Vを入れる必要があります。消費電流は、S3がほぼフル稼働で、Audio Baseが最大音量で26mA(公称値)、合わせておおよそ150mAと見込んでいます。この条件で、Claude Codeに「最も小さい構成」を調べてもらいました。

最小は、M5Stack純正の「ATOM TailBat」でした。190mAhの電池が、Atomのお尻のGroveコネクタに差さる形で付きます。15gで、動作時間は1時間前後。ただし対応表に載っているのは旧世代のATOMとM5Stick系で、AtomS3Rは書かれていません。筐体とコネクタ位置は同じなので差さるはずですが、Audio Baseを付けた状態でGroveが塞がれないかは、実機で確かめる必要があります。

次が、USB-Cに直接挿すタイプのモバイルバッテリーです。AnkerのNano Power BankやAUKEYのSpark Miniのような5000mAh、100g前後のものを挿すと、バッテリーが台座になってサイコロが上に乗る形になります。15時間ほど鳴り続けます。もっと小さくするなら、キーホルダー型の2000mAh級、50g前後で6時間。これはAmazonですぐに買えるものは見つけられませんでした。

結局購入したのはAnker Nano Power Bank。5000mAhあるだけあって、102gと、本体よりはるかに重いです。あっても困らないだろうということで、とりあえず購入して試してみました。

ちょっと失敗したなと思ったのは、底辺が丸みを帯びているため、立てておくことができないというところですね。

これで動かしてみます。できるだけコンパクトに、という要求からはだいぶ外れてしまっていますが、動作はしました。

Tab5との使い分け

Tab5版と比べて落ちたのは、サンプリングレート(48kHz→32kHz)と、画面で見える情報の量です。音源と作曲のロジックは同じファイルを参照しているので、音の出方そのものは同じです。小さなスピーカーの分だけ低音は薄いですが、3.5mmジャックからミキサーやヘッドフォンに出せば、Tab5との違いは分かりません。

ギターを弾くならTab5、置いておくだけならAtom。デモのときは、Tab5でFretCasterを弾き、横でAtomS3Rがバッハを鳴らしている、という絵になります。

清水亮さんのMeOSを快適に動かすための外付けキーボードも導入し、いっぱしの超小型コンピュータとなりました。この状態で、自宅のWi-Fiネットワークに接続し、DGX Spark、Mac、NVIDIA GPU搭載PCたちとTailscaleで繋がります。

Tab5×3台の実物ギタースケールに

Tab5についてはもう一つ、話も進めています。Tab5を2台、3台と横に並べてネックを伸ばし、24フレットを実物に近い幅で表示する構想です。小さくする話と大きくする話が同じソースから出てくるのが、この移植の面白いところ。

なんとか、3台を連結して音を鳴らせるところまでは来ました。スピーカーから音が出ているのはマスターの1台のみで、残りの2台はタッチ信号をマスターに送っています。

現在、3Dプリンタで専用の筐体(ネック)を作っているところです。

20グラムの無限音楽機関

スイッチサイエンスの購入サイトを見ていると、興味深いものにいきあたりました。「M5StickS3 - ESP32S3 小型IoT開発キット」という製品。

このM5StickS3ですが、240 MHz Xtensaプロセッサを積んでおり、スピーカーとバッテリーを内蔵していて20gという軽量さなので、単独で無限音楽機関を鳴らせるという意味だと最小構成となります。

こちらにも無限音楽機関を移植しました。バッテリーで動作するので、ポケットに忍ばせておいて、気軽にデモできます。

ただ、音がちょっと小さいので、耳まで近づけないと音がよく聴こえない。

こんな感じで行き当たりばったりですが、自前のアプリなので、いろいろ試せるのも面白いです。

《松尾公也》

Amazon売れ筋ランキング

松尾公也

テクノエッジ編集部 シニアエディター / コミュニティストラテジスト @mazzo

特集

BECOME A MEMBER

『テクノエッジ アルファ』会員募集中

最新テック・ガジェット情報コミュニティ『テクノエッジ アルファ』を開設しました。会員専用Discrodサーバ参加権やイベント招待、会員限定コンテンツなど特典多数です。