shingoushori's dialy

音信号処理を専ら研究していた元博士後期課程の学生によるメモ

Web Audio API で、the sliding Goertzel DFT filter のパラメータを弄ってみる、... + 残差信号(簡易)

今回は、前回の記事↓に残差信号を追加してみました。ただし、簡易。

Web Audio API で、the sliding Goertzel DFT filter のパラメータを弄ってみる、とりあえず最大16バンド - shingoushori's dialy

gが、the sliding Goertzel DFT filterでパラメータを表示しているバンドのゲイン一括変更。
g_Residualが、残差信号のゲイン。

 

残差信号を作るべく、the sliding Goertzel DFT filter の各ノードに並列でノードを用意しています。
位相特性をきちんと揃えないと、今回のように残差信号でアタックが分離しますな。
今回は簡単に、遅延を差し込んでいます。遅延量も手探り、アテが外れたため。

ところがどうも、パフォーマンスによって遅延量がブレているようです。
このあたりは、Web Audio API の限界なのかもしれません。
ちゃんとオールパスフィルタを配しても、常にはうまくいかない悪寒がします。

さあ、どうしたものか。

Simutransで, "日本の役場セット"の問題を無理やり直す

<欲望>
筆者は, 鉄道経営シミュレーションが好きである.
Simutrans(http://japanese.simutrans.com)は, 素晴らしい.

"日本の役場セット" ( アドオン/建物2 - Simutrans日本語化・解説 ) は, 
なかなかニヤける.
しかし, 一番大きい庁舎(building.05_CITY.pak)に変わった後に, 一段階小さい庁舎(building.04_CITY.pak)に建て戻しされるという悲しい問題がある.

筆者の使っているバージョンは古く(pak64 112.3), 気がついたら新しいバージョンでは治っていそうだ. ただし, 新しいバージョンでは筆者の使っているバージョンのデータが開けず, もっと悲しい...

そこで, 古いバージョン(pak64 112.3)を延命すべく, 無理やりにでも弄れるようになりたいと思っておるわけです...

 

<原因の所見>

一番大きい庁舎(building.05_CITY.pak)と一段階小さい庁舎(building.04_CITY.pak)とで, 
建て替え判定に用いられていると思われる人口の数字が逆転している.
前者が34464人, 後者が50000人だと思う.

 

<無理やり直し手法>

バイナリエディタで, 該当箇所を書き換える.

pakを作り直せればよいのですが, 筆者はmacがメインであったりなんなりでそれが難しかったのです...
バイナリエディタには 0xED ( http://www.suavetech.com/0xed/0xed.html ) を使いました.

該当箇所は, 0すたーとの16進数で 00053 ~ 00056 byte までの 4 byte だと思われます.
ここの数字が先述の 34464 (A0 86 00 00), 50000 (50 C3 00 00) だったわけです.

そして, この数字を弄ることで, 無事問題を回避することに成功しました.

 

<発展>

さらに発展した使い方として, ここの数字を 0 (00 00 00 00) にしたものを用意し, 適宜置き換えるというのを考えました.

元々の問題を逆手に取り ... 建て替え判定をバカにしてしまうことで, 建て替えを手動で制御できます.

Web Audio API で、the sliding Goertzel DFT filter のパラメータを弄ってみる、とりあえず最大16バンド

今回は、以下の記事の流れをマージしてみたというわけです。

マージするにあたってあれこれ書き換えた結果、
これまでuploadしていたjsdo.itだと動かない、示されたerrorを全部直しても動かない。

仕方がないので、今回は新たにCodePenなるサイトを導入してみました。
調べたページ : 

www.webcreatorbox.com


それでも、Firefoxでしか動かない。
元々のhtmlファイルではSafariでもChromeでも動いたので、困惑しています。

とりあえず最大16バンドとして、fとrとgを変えれるようにしました。
変数Bでバンド数を指定します。ただし、html上に作るフォームの数だけを変えます。
nodeの抜き差しは、また今度。

fとrについて、2系統フォームがでます。
これらの使い方次第で、
1.パラメータの設定方法が多様になる、
2.イレギュラーなパラメータ設定を楽しめる、ようになります。

上段にBと並んでいるfとrは、回路全体のデフォルトの値とでも言いましょう。
設定すると、下段のfとrを一挙に上書きします。
fについては、fを初項とするDFTの中心周波数の刻み
(今回は サンプリング周波数 Fs : 44100, DFT点数 : 1024で, 43.06640625 Hz)で、
等差数列にします。

下段のfとrとgについては、各バンドごとの個別の設定です。
フォームが作られていないバンドについては、gが0で無音化しています。

ここで、下段でいう各バンド個別というのは、
the sliding Goertzel DFT filter の2段構えのフィルタのうち、
後段の極を作る方のみです。
前段の零点を単位円上に等間隔で配置するフィルタは全バンドで共有させている都合、
後段に連動させるのが億劫だったために、このような構成になりました。

これによって、極と零点の位置がずれている
不完全なthe sliding Goertzel DFT filterを楽しめるわけです。

フィルタの特性を確認していないですけども、
耳で聞く分には個人的には中々気に入っています。

Web Speech API の Speech synthesis を試してみた

Web Speech API というものがあるんですね。
とりあえず google chrome, firefox, safari で動き、
Internet Explorerでは動かない、edgeでは対応検討中...だそうです。

Speech synthesis , Speech recognition があるらしい。
とりあえず 今回はsynthesisしてみました。

ただ読み上げるだけでは参考文献そのもので残念なので、
前回の記事の流れで複数のフォームを次々に読み上げるようにしてみました。

簡単、手軽で素敵です。

しかし、Web Audio API とは全然別物らしく、全然繋がらないんだとか。
似ている名前をしているのに、なんとも嘆かわしい ...
なんとかできないか検討していく所存でございます ...

 

<参考文献>

ブラウザのみで音声認識とテキスト読み上げを実現する Web Speech API | CYOKODOG

 

lealog.hateblo.jp

htmlの入力フォームの数をjavascriptで可変にしてみた

マルチバンドでなにやらしたいわけです。
ならば、バンド数に応じた数の、各バンドのパラメータやらを操作する入力フォームが欲しい。
バンド数を変えた時に、合わせて変わってしまえばいい。
まず、そんな入力フォームが作れるのかやってみました。

とりあえず、できました。
読み込み時はフォーム4つ。

増減するフォームごとに、いちいち関数を書くのも面倒です。
そこで、onInputの関数に引数でidを渡してみました。
勝手に関数内部でとれなかったので、引数の登場です。

Web Audio API で、Multi-tap Delay (3 tap feedforward and 3 tap feedback)

Web Audio APIで、ディレイを組んでみました。
ただ、1本だけディレイのラインを出すだけならば、Web Audio APIにあったはず。
マルチタップで混沌とするには、1本だけのを組み合わせるのはメモリが勿体無い。
ちょっとだけ頭を捻って、1本だけのを組み合わせるよりはエコなものを組みました。

図などは、また時間があるときに描くことにいたしまして ... 

核心は、Web Audio API のフレームの倍サイズのメモリを1本用意し、
各サンプルでの数値をそのメモリ内の2箇所ずつに書き込んでいくこと。
リングバッファの実装で行われている技法です。
さっと探して参考文献が見当たらなかったので、こちらも後日。

計算量を検討したわけじゃないですが、
Web Audio APIのようにザクザクとブロック処理する場合は、
毎サンプルごとにリードライトを繰り返すくらいなら、
2箇所に書いてしまって、ポインタだけを動かした方が、たぶんシンプルです。

 

そんなMulti-tapなDelayを、feedforwardを3 tap と feedbackを3 tap 持たせまして、
前回( Web Audio API で、内蔵マイクで録音、ただしFirefox - shingoushori's dialy )
... のやつに繋いでみました。
内蔵マイクにDelay, wavを2つ同時再生してそちらにもDelay、ただしFirefox

 

実装してみて気づいたのが、3 tapのfeedbackのゲイン係数の発振条件。
1本だけなら、絶対値を1未満にしておけばいいわけです。
今回は3 tapが並列になるわけで、
遅延量が整数比の時には、倍数の経路でのゲイン係数が、
実際には約数の経路のゲイン係数との和になるわけですな。
条件を計算するのは後回しとしまして、
今回はとりあえず絶対値を0.33以下にしておきました。

Canvasで、はてなブログに回路図を直接描いてみるテスト(Diode Clipping)

はてなブログにできるだけ写真を投稿したくない!容量が気になるから.
でも、図やグラフを貼り付けたい!わかりやすいし、格好いいから.
この相反する気持ちの矛先として、Canvasに目をつけたわけです.

とりあえず最近のマイブーム、Diode clipperを描いてみました.

CanvasJavaScriptで関数化できるので、
巧くやればSVGファイルを頑張って貼るより色々楽しい予感がします.
Canvas要素の英語版wikiには、SVGとの比較が言及されていますな.