吉里吉里2が一段落ついたので、またRisseの開発に戻ります。
2.29-dev.20061107でWaveSoundBuffer.PhaseVocoder.windowやWaveSoundBuffer.PhaseVocoder.overlapに値を指定すると(それが正しい値でも)例外が出てしまうのを修正したのを、時間がないのでここに置いておきます(コアのみ)。
というわけで吉里吉里2にPhase Vocoderフィルタを追加しました。
実のところ、吉里吉里3から実装しようとおもってたインサーションフィルタは吉里吉里2でも実装してしまいました。WaveSoundBufferにfiltersという配列があって、ここにフィルタを登録すると、サウンドが順にそれらのフィルタを通って処理され、再生されるといった具合です。複数のフィルタを登録してチェーンとして使うことができます。
こんなかんじで:
var buf = new WaveSoundBuffer(window); ...snip... buf.filters.clear(); // フィルタ配列をクリア buf.filters.add(new WaveSoundBuffer.PhaseVocoder()); // PhaseVocoderフィルタを追加 // この時点で buf.filters[0]=上の行で登録したPhaseVocoderのインスタンス buf.filters[0].time = 0.5; // 倍速再生
といっても今のところPhase Vocoderしかないのですが。余力があればリバーブぐらいはつけるかもしれません。
Phase Vocoder+吉里吉里2のエントリで書いたとおり、gccが吐くオブジェクトコードはCOFFなので、OMFなbccではそのままではリンクできないのですが、gccが吐くアセンブリ言語ソースを適当に変換してnasmでアセンブルしてbccでリンクして動作させることに成功しました。
gccはデフォルトでAT&T系アセンブリ言語ソースを吐きますが、nasmはこれを受け取ってくれないのでintel系アセンブリ言語ソースにする必要があります。これはgccに-S -masm=intelのオプションをつけてやればいいのですが、そうとは言っても同じintel系アセンブリ言語ソースでも方言があるようで、いくつかの文法の変換が必要になります。メタ指令なんかは全然互換性ないし。しかもgccは、インラインアセンブリで書いた部分はそのまま出力でもAT&T系アセンブリ言語で出てくる始末。やっぱり結構面倒くさいです。
Yasmはgas用 (gccが吐くソースはgas/as用ソースです) アセンブリ言語を受け付けることができ、次バージョンではOMFでの出力に対応するようですが、ちょっと待っていられませんでした。
SSE最適化版Phase Vocoderも手元の吉里吉里2では動いていますが、いろいろ調整が必要で、開発版として出すにはもうしばらく時間が必要です。