sv.kikyou.info に正式な SSL サーバ証明書を導入しました。
音程を保ったまま再生速度を変えたり、再生速度を保ったまま音程を変えたりできる(使い方によってはもっといろいろできる) Phase Vocoder ですが、あまり使い勝手のよいものが無かったので結局自分で吉里吉里3用に書きました。
これで「ボイスを倍速で再生」とかの機能がつけられます。
演算内容が演算内容なので、相当CPUへの負荷が重たいです。ボイスに適用する分にはさほどではないのですが、音楽に対してやろうとすると結構つらいかもしれません。
吉里吉里3ではやっとインサーションエフェクト(Waveフィルタ)を導入します。
手っ取り早くいろいろエフェクトを追加するならば sox から引っ張ってくるのがいいかなとか。ちなみに吉里吉里2用だとごうさんがこんなものを作っていたりします。
ただsoxのリバーブとかはあまり好きではないし、いろいろな所から使えるフィルタを引っ張ってこないといけないかなとか考えています。
実装できたらおもしろそうだという物の中に「音程を変えずに再生速度を変える」(time stretching などと呼ばれている物) があります。たとえばボイスを倍速で再生できるとおもしろそうだな、と。
とりあえず time stretching ではなくて pitch shift (再生速度を変えずに音程を変える) をフィルタとして試しに実装してみました。実装は DSPdimension.com においてあった物で、FFT で一度周波数成分に分解してからシフトし(周波数をずらし)、再構成するタイプのものです(Phase Vocoder)。time stretching についても原理は同じはずなので、自分でいじってみるか、他の実装を探すつもりです。
ただ pitch shifter のように時間軸方向が変わらないフィルタは実装が簡単なのですが、time stretch のように時間軸方向が変わるフィルタは実装が厄介です。サウンド関連のデータの流れは、デコーダ → WaveLoopManager → フィルタ → OpenALバッファとなってるのですが、WaveLoopManager がラベルイベントなどのタイミング情報を生成する関係で、タイミングに影響する情報はフィルタ側でもタイミングを修正してやらなければなりません。ここら辺をどう簡単に書ける構造にするかですね。。。
2006年1月15日 の日記で書いた「正確なサウンドの再生位置の取得が出来るか」については、うーん、実用上はたぶん差し支えない精度かなという感じです。
「8/16bit 整数 PCM しかサポートしてない」のは少なくともバージョン1.1のAPIではその通りの様子です。まあ今のところ必要ならば自力で変換する方向で。
あとOpenALではあとステレオとモノラルのソースしか対応してないようです。前もって3つ以上の複数のチャンネルをエンコーディングしておくことが出来ないので、「虫の音の草原に立つ」とかいう演出をやりたかったらリスナの周辺に虫を複数配置するという形になると思います。
いまちょっと気になってるのは、MinGWでテストを続けているのですが、デフォルトのデバイス(たぶんwaveOut系を使った自力ミキシングデバイス) だと、ミキシングのスレッドの優先度が足りないのか、再生中に重たい処理をさせると(あるいはさせなくてもまれに) 音飛びやクラックノイズが入ります。もしかしたらOpenALライブラリに手を入れないとならないのかなとか思っています。
吉里吉里3のサウンド関連の実装に着手しました。
吉里吉里3では前にも書いたとおりサウンド関連は PCM 系しか実装しません。
バックエンドには OpenAL を使う方向でいきます。OpenAL は様々なプラットフォームで動作し、Mac では Mac OS X Tiger から標準装備になっていたり、Quake 4 や Unreal エンジンなどでも使われているサウンドライブラリです。
ちょっと OpenAL を使って正確なサウンドの再生位置の取得が出来るかが心配 (これが出来ないとムービーやループチューナ2のラベルイベントとの同期などが出来ない) なのと 8/16bit 整数 PCM しかサポートしてないのかどうかが (他のフォーマットはどうなのか) がよくわからないので早急に調査したいですが、他の機能にはまったく不足はないです。
タイトルの通りですが、吉里吉里3に関していくつかのコンポーネントの名称を変更しました。
TJS3 の名称を Risse [りせ] にして、吉里吉里3 core の内部名称を TVP から Risa [りさ] にします。
いきなり何!?と思われる方もいらっしゃるかとは思いますが、TJS と TVP については前から呼びやすく、愛着のある名前にしたいな、とは思っていました。結果、2004年4月22日の日記で書いたような「無駄に女の子の名前をつけて」を実践する戦略です。
ちなみに TJS3 はほんとうに Risse [りせ] と呼ぶようになる(したい)と思いますが、吉里吉里3を Risa [りさ] と呼ぶようにはならないと思います (名称変更による影響が大きすぎるので)。Risa の方はいままで吉里吉里がその内部名称である TVP と呼ばれていなかったように、やはり内部名称であり続けると思います。吉里吉里2関連の名称については変更の予定はありません。
The LLVM Compiler Infrastructure
おもしろそうですね。まだ何が出来るかは良く読んでないですが、単一のマシン非依存なオブジェクトコードからマシン依存のネイティブなコードをJITを通して実行するとか、TJSとかの中間コードをネイティブコードに変換するためのバックエンドとして使ってみるとか。いろいろ妄想がふくらみます。
あけましておめでとうございます。今年もよろしくお願い致します。
今年の抱負はなんといっても吉里吉里3の開発を進めることですね。
簡単にサクっと作れるような代物ではないので年内に正式版をリリースできるかは微妙ですが、一歩一歩進めていきたいと思います。