2011-02-22 火曜日
WAVEファイルをピコカキコのPCM形式に変換する「FlPCM.lua」
ニコニコ大百科のピコカキコに使われているFlMMLでは仕組み上、特殊なMMLを書くことで無圧縮PCMの再生が行えます。その特殊なMMLをWAVEファイルから作成するLuaスクリプトを作ってみました、2日かけて。
- PCM再生例いろいろ:ピコカキコ、楽しいよとは - ニコニコ大百科
- PCM再生の仕組み:ニコニコ大百科: 「けいおん!」について語るスレ 1741番目から30個の書き込み - ニコニコ大百科
ツール概要
- 入力フォーマット: RIFF WAVE リニアPCM
- 変換後フォーマット: 7 ビット PCM
- 音量記述を、@vXXX、( )、マクロを組み合わせてそれなりに圧縮
- 音長記述を、付点、tick指定、マクロを組み合わせてそれなりに圧縮
- 変換時の処理速度やメモリ消費量はあまり考えられておらず、適当
ダウンロード & インストール
FlPCM.lua をダウンロードします。
動作には Lua 5.1 が必要です。Windows であれば Lua for Windows にあるインストーラで簡単に導入ができます。
ファイルの変換方法
変換前の準備
長いサンプルだとMMLが64000字以内に収まらないので、先にいくつか処理を適当に行っておきます。
サンプルレートを下げると同時に、ノイズ防止目的でサンプルレート/2の周波数以上の帯域をLPFでばっさりと切ってしまいましょう。詳しくは「ナイキスト周波数」などで検索するとよいです。
FlPCM.lua で変換する
コマンドラインツールです。ピンとこない人は「コマンドライン 使い方」でぐぐるなどして、基本をおべんきょしましょう。
典型的な使い方は、FlPCM.lua と変換したいWAVEファイルを同じディレクトリに置いて、
FlPCM.lua 入力ファイル名.wav 出力ファイル名.txt
とするだけです。簡単ですね、以上。
おやくそく
このツールを利用してなにかあっても、わたし知りません!
ソースコードの観察、改変、飼育、愛撫、調教等は自由、自分流に染め変えたものをどこかで公開するのも自由です。その際直売野菜みたいに「この人がつくりました」っていうメッセージに「ごちゃたん」アイコンとか添えてあると、すてき? 義務ではないので、なんでもよいです。
技術情報:圧縮について
ツールを作る際の課題は「いかにして変換後サイズを小さくするか」でした。せっかくなので、圧縮に関して書き残しておきます。
音量圧縮の仕組みは単純です。3以上の音量変化を小さいものから順に $A=(((; のようなマクロにしているだけです((開発当初は 3, 4, 5... よりも 3, 6, 9... のように3の倍数の音量変化をマクロで定義するほうが、変化の激しい波形にも対応できると考えていたのですが、実際には前後のサンプルがそこまで激しく変化する波形がありませんでした。))。ただし @v コマンドを直接書いたほうが短い場合は直接書きます。
音長圧縮にあたっては、事前にサンプル数からMMLへの変換テーブルを作成しています。テーブルは全音符2個分まで表現できる大きさです。
テーブルはなりふり構わず適当に構築しました。よいこのみんなが唖然とするレベルです。 (・○・*)
- tick指定で埋める c%4
- 単一ノート+付点の方が短くなる箇所を更新 c4...
- ノートを連続させる方が短くなる箇所を更新 cccccc
- 全音符より長いものが 全音符+別の表現 で短くできるか試行(ここまでの構築結果を利用)
- テーブル内の2つの表現の組み合わせで小さくできるものを探す (全パターン試行、元から短いものは適当に除外)
- サンプル数 3, 4, 5... と短いものから順にマクロ割り当て
ひどいね!
せっかくヒストグラムまで内部で取ってるので、マクロの割り当てをもっと動的にやってもいいんじゃないかと思いました。でもめんどくさいので、このままお蔵入りしそうな気配が濃厚です。
- vとか--histogramとかのオプションをつけて起動すると、ちょっぴり変換に関わる情報を出してくれます。意味が読み解ければ、マクロの割り当てを変えたりするのに役立つかもしれません。
そんじゃーね。 +.(ノ◡=*)+
