SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|08|09|10|11|12|
2026|01|02|03|04|05|06|07|

2026-07-15(Wed) 空間音響を目視する

  というわけで、引き続き絶賛入院中なのだが、入院直後の怒涛の検査祭りが落ち着き、午前中のリハビリくらいしかやることがなくなってきた今日この頃である。

  ここでいうリハビリとは、脳梗塞による影響の大小を問わず行われるものであるから、ほとんど影響がなかった(少なくとも自覚はゼロ)自分の場合には、子供向けの知能/体力テストでしかなく、毎日のプログラミング、筋トレ、ジョギングにより、常人より脳も体も鍛え上げまくっている自分には退屈な内容……といいたいところなのだが、愛想のいい女性の看護師さんと取り組むそれは実に楽しく、まるで竜宮城に来たような気分でもあったりする……これ、退院したらスゴい時間が経ってたりしないよなぁ。乙姫に玉手箱をもらっても絶対に開けないようにしないと。

  で、仕事もないので山ほど時間はある……はずなのだが、思った以上に普通である。

  いつも切れ切れの時間を使って進めている読書は切れ切れだし、この機にまとめて動画やマンガを観るかと思えばさして観る気にならないし、スイッチを持ってきてもらって大作ゲームに取り組もうかと思えばこれもさしてヤル気が出ない。持ってきてもらったらヤルかもしれないが、それよりその他のことをしたい気分。

  結局、病室でできる軽い自重筋トレと、プログラミングする時間くらいか、増えたのは。それもドカンとではなく、多少は増えたな程度の印象。

  というわけで、本題である。入院前から、少しづつ取り組んでいたのだが、例の「空間音響シミュレータ」のリアルタイム版を作っていた。最終的には「TopDrivin'」に組み込みたいので、CoffeeScript(JavaScript)で記述し、ブラウザで発声させるものである。

  空間音響機能は標準のものがあるようではあるが、それを言ったら画像回転機能だって標準のものがある。でも、そこをワザワザ自作するのが楽しいんでゲスよ、ヤボはなしでっせ旦那、ゲヘヘヘヘ。

  で、それらしい動作はするまでにはなったのだが、どうも動作が安定しない。ノイズが混じることがあるのだ。条件は判然としないが、ある程度ランダムに現象が発生するので、ロジックだけの問題ではなさそうだ。んが、そもそもスクリプト言語で1/60FPS、48kHzだと1フレームあたり800サンプルを正確に生成するなんて、あまりマトモな取り組みではない。ブラウザ依存もあり、Chromeだと動作するが、FireFoxだとダメっぽいし。

  そこでふと思いついた。ブラウザの音声出力をPC自らにデジタル録音させ、出力波形から原因を探ってはどうか。PC自らでデジタル録音する方法は、以前にLinuxのサウンドシステムの概要を調べた時に確立済みである。サウンド機構であるPipeWireの稼働状況を「pw-top」で表示させ、サウンドの出力先ハードウェア、大概は「alsa_output」のIDで「pw-record --target 56pcm.wav」を実行するだけである。

  あとは20年以上前に自作して愛用しているcccdctで波形をチェック……しようと思ったら、出力される波形がヘンだ。尻みたいな形が散発的に存在していて、サインカーブを描いていない。

  画像の説明

  これ、もともとcccdctの用途が「コピー・コントール・コンパクト・ディスク・カッタ」だったことに由来する。そもそも細かい波形の形状をチェックするためのツールではなく、録音音源を効率的に分割するためのツールであり、ステレオ音源の場合には、左右のチャネルの絶対値の大きい方を表示する、というアルゴリズムのためだ。

  普通の音源エディタであれば、各チャネルは上下に別に分けて表示するところであるが、テキストコンソールでそんな表示をしたらただでさえ少ない情報量がさらに減ってしまうから、別に間違った設計をしたわけではない。

  んが、これでは使えない。使えないが、ワザワザその用途のために機能追加するか? ……いや、いっそそれも楽んでしまえばいいか。というわけで、現状の表示に加え、左チャンネル、右チャンネルの表示を独立してオン/オフできる機能を追加してみた。久々にコードをイジるので、自ら書いたコードではあるが、コードを追加すべき場所を特定するまでに時間を要した。が、やりはじめるとこれまた楽し。入院中だから、時間に余裕もあり、あまり焦る気持ちにならないというのもある。

  で、バカ丁寧にコードを追加して、以下のような表示ができるようになった。

  画像の説明

  まぁ、どういうセンスなんだよ、というのはあるが、実にキャラグラっぽいではないか。しかし、十分すぎるほどに目的を果たせた。まず、右チャンネルと左チャンネルの位相のズレが18サンプリングであること。18/48000(smp/s)*340.29(m/s)=0.128(m)であるから、耳の間の距離である17cmにナナメに到達した場合の時間差として妥当な結果が得られている。

  そして振幅の大きさの差。耳は音量の変化には鈍感であると仮定して、都度の計算をやめ、事前計算で求めたテーブルから概略の距離に応じた値を拾うようにしているのだが、その境界を目視することができた。右耳のほうが音源に近いので振幅に差が出ているが、左端の波では差が出ていない。これはテーブルの同じ部分から値を拾っているということで、期待した結果である。

  最後に波長。この部分は、440Hzの音を発する物体が向かってきているのだが、測定すると約453Hzであった。逆に物体が去っている部分では約421Hz。期待したとおりにドップラー効果が発生していることが確認できた。

  というわけで、例によって本来の目的とは大いにズレた「ヤクの毛刈り」であったが、今回も実に楽しく「毛刈り」ができてしまった。

  本来の目的の方も、ロジック的には正しく動作していることが確認できたので、引き続き開発を続けられそうだ。しかし、こんなオシロスコープレベルでしか確認できないような位相の差を元にどっちから音が来ているか判別できるなんて、人間の脳っつうのは実によくできているものよのう。

  それはそうと成果物は例によって、https://itline.jp/git/cccdctに置いておく。