W.Deeの2006年11月の日記

kikyou.info»日記
最新月 : 2008年10月
2003年 [             3    4    5    6    7    8    9   10   11   12  ] 月
2004年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2005年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2006年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2007年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2008年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2009年 [   1    2    3    4    5    6    7    8    9   10   11       ] 月
前月の日記  次月の日記

2006年11月15日

Risseの開発に戻ります

吉里吉里2が一段落ついたので、またRisseの開発に戻ります。

2006年11月9日

Phase Vocoderのwindowとoverlap指定にバグ

2.29-dev.20061107でWaveSoundBuffer.PhaseVocoder.windowやWaveSoundBuffer.PhaseVocoder.overlapに値を指定すると(それが正しい値でも)例外が出てしまうのを修正したのを、時間がないのでここに置いておきます(コアのみ)。

2006年11月6日

吉里吉里2にPhase Vocoderフィルタを追加

というわけで吉里吉里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しかないのですが。余力があればリバーブぐらいはつけるかもしれません。

2006年11月2日

gccで吐いたコードをbccでリンクする

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では動いていますが、いろいろ調整が必要で、開発版として出すにはもうしばらく時間が必要です。