2007/05/15(火)mp3エンコードあれこれ

2007/05/14 27:18 PC(全般)
[エンコードtool]
CD->mp3 : Exact Audio Copy
CD->cue+wav, cue+ape : Exact Audio Copy
cue+wav, cue+ape->mp3 : acdir
エンコードエンジン : lame

でとりあえず良し。ただし、EACは時間がかかる(高速読みも出来るがそちらを基本設定とすべきでない)ので単にぱっとmp3にしたいだけならCDex+午後とか。

[EAC設定]
EACはV0.95b2を使う。現在入手可能な最新版V0.95b4は日本語入力すると二重化する問題有り。
とりあえずBenq DW1640を所有しているのでこれを読みドライブにする(CD-R実験室を信じるなら超優秀)。

http://homepage2.nifty.com/yss/eac/eac3.htm
http://musicpc.fc2web.com/eacoption.htm
を参考に、

・Error Recovery Quality : High
・Read sample offset correction : +588
・Write samples offset : +96
・Overread into Lead-In and Lead-Outのチェックを外す
くらいで調整すれば良し。あとはオプション項目でだいたい分かる。

APEにするときはMonkey's Audioをあらかじめインストールしておく。

cue+wav化はIMGアイコンを。
mp3化はMP3アイコンを。

cue+ape化はアクション -> イメージをコピーしCUEシートを作成 -> 圧縮。

[ACDIR]
cue+wav, cue+apeをmp3化するときはACDIRを使う。EACでも何でも手順を踏めば出来るのだが、ACDIRを使うのが一番簡単(?)。
http://nyaochi.sakura.ne.jp/xoops/modules/mysoftwares/tc_2.html
上記サイトからダウンロード。簡易チュートリアルしかないが、コマンドラインヘルプでだいたいわかる。acdir自身にcue+ape, cue+wavを読む力があるので、あとは出力の設定とlameに渡すオプションをbatなんかに書いてやるだけ。

自分の腕ではbatだけでやるのが苦しかったので今回はRubyを使った。エクスプローラ+D&Dでやらせたかったので、まずはRuby Script FileがD&Dを受け付けられるようにする。

http://homepage3.nifty.com/yamakox/DropOnScript/index.html
上記サイトのDrop on Scriptを使えば良し。何をやっているかは、

http://devadjust.exblog.jp/4673772/
に書いてある。

で、Rubyで以下のように書いた。
ENV['PATH'] = 'c:\online\lame;c:\online\acdir;' + ENV['PATH']

dir_name = File.dirname(ARGV[0]) + "\" + File.basename(ARGV[0], ".*")

`acdir.exe --output "#{dir_name}\$n.$t.mp3" --pipe "lame -b 256 --replaygain-accurate --clipdetect -T --tt $#t --ta $#a --tl $#T --tn $#n --tg $#r{GENRE} --ty $#r{DATE} $x - $#o" "#{ARGV}"

print "\a\a"
Rubyを使ってる理由はファイル名から書き出しディレクトリを作りたかったから。

lameとacdirにPATHを通す必要がある。Ruby上で環境変数をいじるなら、ENVオブジェクトを使えば良し。

最後のダブルBEEPはおまけ。なんか怪しいけどとりあえずこれでいいや。

最後にcueをD&Dしてmp3化することを確認。なおACDIRはcue+apeから直接wavの単曲切りも出来る。eacで解体した物と当然バイナリは一緒。やりたいことに合わせてbatなりrbなり作っておくも良し、簡易GUIを作るも良し。

[lameオプション]
オプションの機能は、

http://www001.upp.so-net.ne.jp/yama-k/codec/lame3.95option.html

ここら辺を参照。
3.97でいくつかオプションの挙動を知りたく調べてみた。

某所の推奨設定が、
 --clipdetect : LAMEタグに音量ピーク値を保存する。メッセージ表示。

 --replaygain-accurate : より正確にリプレイゲイン情報を計算する

 -T : lameタグを強制的に書き込む。
をつけることになっている。

さて調査結果。

CBR(-b 256)とVBR(-V 2)どちらでも結果が同じで、
・--clipdetectだけの場合

・--replaygain-accurateだけの場合

・--clipdetect, --replaygain-accurate両方つけた場合
の3パターンではバイナリが同一。

どちらもつけない場合のみ、lameタグと思われる部分に5バイト分相違あり

(最大音量が記録されてない?)。
 --clipdetect をつけると、このソースではエンコード後にこんな感じのメッセージが出た。
WARNING: clipping occurs at the current gain. Set your decoder to decrease
the gain by at least 0.8dB or encode again using --scale 0.91
or less (the value under --scale is approximate).
 -T の有無にかかわらず常にlameタグは書き込まれた。

ということで結論としては、ここら辺のオプションは全てlameタグにのみ影響を与えるような物であり、あってもなくても大して変わらないらしい。とりあえずつけておいて損はないし大きな問題もないようだが、調べている途中でこんなのを見つけた。

http://www.faireal.net/articles/9/18/#d51109
mp3作って動画と合成する場合は、-tをつけてlameタグを付加しないようにしないと音ズレが拡大する可能性があるという話。うわ知らなかった。

ところで個人的にはだが、lameはCBRのほうが間違いがないと思っている。自分で使うなら当面CBR 192kかCBR 256kの2択?

最近のlameは高めのbitrateだとpsytuneとかsafejointをデフォルトで入れてくるようだ(K5 MP3 lametag viewerで確認)。いちいちキラーソースを探すのも面倒だし、ここら辺はもうオフィシャル設定を信用するしかない。

2007/05/13(日)foobar2000でエンコードが出来ない問題

2007/05/13 21:27 PC(全般)
foobar2000からLameを使ってConvertする際に、
Error flushing file (Unsupported format or corrupted file) : ファイル名
というエラーが出るので困っていた。原因はlameのバージョン違いで一応解決。

最初はパラメータが怪しいのだと考えて、色々試してみたのだが上手くいかない。

parameters指定を入力ファイルと出力ファイルだけの、
%s %d
としても上記エラー。ということで、どうもパラメータが原因ではないらしい。

結局Lameが余りに古すぎたのがいけなかったようだ。
stable最新の3.97に入れ替えたら成功。

ちなみに失敗していたバージョンは、3.88 MMX (beta1 Mar 27, 2001)。
せいぜい受け入れられるオプションが変わる程度かと思っていたが、コンパイル方法が違うのか、はたまたfoobar2000が変なことをやっているのか(勝手に3.97でしかとおらないオプションを付加してる?)。

解決したけど釈然としない。

2007/03/16(金)スキャナビボタンに任意のアプリケーションを割り付ける→失敗

2007/03/16 23:51 PC(全般)
EPSONのGT-8300UFを手に入れたことは以前に書いた。

このスキャナはスキャナビボタンという物が4つついている。スキャナ側からの操作で任意のアプリケーションを起動し、ボタンごとに設定を変えておいたり、勝手に取り込んだりできたら便利なのではないかと考えた。

結論から言うと失敗したので誰の役に立つという情報でもないのだが、一応作業メモを残しておく。

さてスキャナビボタンで起動できるのはStillImage対応として登録されたソフトに限られるようだ(ドライバの制約)。レジストリは以下の場所にある。
HKEY_LOCAL_MACHINE\SYSTEM\使っているコントロールセット\Control\StillImage\Events\STIProxyEvent
登録したいアプリにGUIDがあれば、それを使いキーを作成。なければ、VisualStudioなり、Rubyのuuidtoolsなりで適当にGUIDをでっちあげればいい。

キーの中身は以下のようになる。
[HKEY_LOCAL_MACHINE\SYSTEM\使っているコントロールセット\Control\StillImage\Events\STIProxyEvent\{アプリのGUID}]
"CmdLine"="アプリケーションのパス" /StiDevice:%1 /StiEvent:%2"
"Name"="名前"
"Desc"="名前でいいと思う"
"Icon"="sti.dll,0"

場合によっては反映に再起動の必要があるかも。

この方法でBTScanを登録してみた。すると確かにスキャナビボタンの起動アプリとしてBTScanが表示された。やったと思ったのだが、/StiDeviceって何? と、BTScanから怒られる。

得心。

/StiDeviceとか/StiEventってのはまさしくコマンドラインのオプション指定に過ぎない。要するにstillimageってのはMSがインターフェースだけ決めて、実装するかどうかはアプリ任せっていうことだ。

オブジェクトや、テンポラリファイルがわたせるのではないかというイメージがあったため、思わず突っ走ってしまったがまるで無駄だった。結局アプリ側でTWAINを立ち上げるとかいうことなんだなあ。

ただこの方法で特定のスキャナビボタンに任意のコマンドを割り付けることは出来そうだ。たとえばuwscのスクリプトや、特定のショートカットボタンを各スキャナビボタンに割り当てるということは出来るだろう(もちろんその場合は/Sti****は不要)。

でも結局TWAIN経由になるなら、スキャナビボタンにショートカットを割り当てたところで手順の簡略化にはつながらない気もする。キーボードをスキャナの所まで引っ張ってくるのがめんどくさいということであれば、ジョイパッド+JoyToKeyをつかうとか、マウスにショートカット割り当てるとかその程度でいいかな。
OK キャンセル 確認 その他