LinuxでMP3環境を整える

2003-08-01: 現在ここのページに書いてあるスクリプトは使ってません。その後いろいろ改良し、1年以上前になりますがaddid3というスクリプトを作りました。使い方はスクリプトの頭にEUC-JPでさっき書きました(自分でも忘れてたので)。CPANで見付けたMP3::Tagを用いてます。MP3::Tagのdebianパッケージも用意しました。

しかしこのスクリプトもいろいろ問題があるような気がして、ちょっと考え込んでます。そのうちこのページをまるまる書き直すかもしれませんがめんどくさいので書き直さない可能性も大です。


能書き

いまさらLinuxでMP3なんてあたりまえすぎるのは確かなんだけど、エンコードした後の管理なんかについては、ヨサゲなツールは無いんじゃないかと思う所存。んで、せっかくPerl覚えて来たんで、スクリプト書いて便利に使えるようにしてみた。うちはもっと便利だぞ!って人がいたらぜひ教えて欲しい。

環境

# apt-get install lame id3v2 cdparanoia libjcode-pm-perl
って感じでGo!
あー、でもlameはオフィシャルパッケージじゃないんだよな。どこで拾って来たかも忘れてしまった。ということで以降、lameはgogoにでも読みかえておいて欲しい。

リッピング

どーやらcdparanoiaはSCSIにしか対応してない模様。なのでIDEの人はSCSIエミュレーションか何かが必要かな。うちは幸いSCSIのCDドライブなので、

$ cdparanoia -B
とやれば全トラックを1トラック毎に*.wavなファイルで吸い出してくれる。/dev/sg?を読みに行くのでそこのパーミッション変えておくか、chmod u+sとかしてcdparanoiをsetuidするかしておくといちいちrootにならずにすんで便利。
$ cdpranoia -B 1-2
とやると、トラック1からトラック2まで吸い出してくれる。

エンコード

lameは一曲ずつずつしかエンコードできないので、

$ for wav in `ls *.wav`;do lame $wav; done
とかやって、一気にエンコードしてしまう。

しかし、これではビットレートが固定されてしまう。うちは何も考えずにエンコードする時はVBRの最大音質、あとは指定した数値での固定ビットレート、というやりかたが出来れば良かったので、

#!/bin/sh
if [ $1 = ""] ; then
    rate=320
    param="-v -V 0 -B $rate"
else
    rate=$1
    param="-b $rate"
fi

for list in `ls -1 *.wav` ; do
lame $param $list
done
と、まあこんな感じのスクリプトをwav2mp3という名前で ~/bin に保存してる。

ファイル名とid3tag付け

これがけっこう悩んだ。UNIX系の人間は日本語ファイル名を嫌う傾向にあるが、最近はファイル名の文字コードはsambaやらなにやら共有ツールなんかが勝手に変換してくれるので、気にしないで日本語ファイル名を付ける事にした。問題はRに焼く時だが、まあ自分で見る分には問題ないだろう。ということで、id3tagに付けるものから、ファイル名も抽出する事にした。この方が断然楽だしな。ということでできあがった物は以下。

#!/usr/bin/perl
use Jcode;
@files = `ls -1 *.mp3`;
@titles = `cat title.txt`;
$artist = `echo $ARGV[0]`;
$album = `echo $ARGV[1]`;
chop $artist;
chop $album;
$id3artist = jcode($artist)->sjis;
$id3album = jcode($album)->sjis;
$i=0;

foreach $titles (@titles){
    chop @titles[$i];
    chop @files[$i];
    $filename = sprintf("%s_%s-%02d_[%s].mp3",$artist,$album,$i+1,@titles[$i]);
    @titles[$i] = jcode(@titles[$i])->sjis;
    system("id3v2 -t \"@titles[$i]\" -a \"$id3artist\" -A \"$id3album\" -T $i+1 \"@files[$i]\"");
    system("mv \"@files[$i]\" \"$filename\"");
    printf("%s\n",$filename);
    $i++;
}

これをid3addという名前で ~/bin に置いてる。英語的にはaddid3かなあという気もするのだけど、それに気付いた時にはすでに付けちゃってたので、めんどくさくてそのままになってたりする。また、Shift_JISでid3を書き込まなければならない関係でjcode.pmを使ってる。id3v2に渡す関係でsystemは使わざるを得なかったので、めんどくさくてファイル名変更もsystemにしてしまった。wavがあるディレクトリと同じ場所にtitle.txtという、曲名を1行1曲ずつ書いたテキストを用意しておき、アーティスト名とアルバム名は引数で渡してやる。これで、
アーティスト名_アルバム名-トラック番号_[曲のタイトル].mp3
という感じのファイル名が出来上がる。しかし、これだとシングルの場合はいまいちおいしくないことに気付いて、
#!/usr/bin/perl
use Jcode;
@files = `ls -1 *.mp3`;
$i=0;

foreach $titles (@ARGV){
    if($i == 0) {
	$artist = $titles;
	$id3artist = jcode($artist)->sjis;
	$i++;
	next;
    }
    chop $files[$i-1];
    $filename = sprintf("%s_[%s].mp3",$artist,$titles);
    $id3titles = jcode($titles)->sjis;
    system("id3v2 -t \"$id3titles\" -a \"$id3artist\" \"$files[$i-1]\"");
    system("mv \"$files[$i-1]\" \"$filename\"");
    printf("%s\n",$filename);
    $i++;
}
というのも作ってみた。id3add-singlesという名前でやはり ~/bin に保存。最初の引数をアーティスト名として解釈し、残りは曲名になる。

ただ、こういうやり方だとSJISの文字コードをsystemに渡してしまう関係上か、うまく行かないことがある。「〜」なんて文字が入ってるとダメだったりする。どーしたもんかなあ。まあ、そんな数は多くないので、手動で何とかしてるけど。

まとめ

とまあ、ここまで揃ってちょっと考えてみるとだ、

$ cdparanoia -B && wav2mp3 && id3add "アーティスト名" "アルバム名"
としてやれば、CDいれて一発でリップしてエンコードしてファイル名もid3tagも付けてくれるじゃないかと。ついでに終ったら音声で知らせてくれたりしないかなとか思ったりして、
#!/bin/sh
cdparanoia -B && wav2mp3 && id3add $@ && esdplay $HOME/lib/sound/done.wav
なんてファイルを ~/bin に cd2mp3という名前で保存してたりする。esdplayはesoundのクライアントで、wavやらaiffやらをesdに送るクライアント。id3addの後ろの$@は説明するまでもないと思うけど、引数をまるっと渡す変数ですな。これでCDをいれたら、
$ cd2mp3 "アーティスト" "アルバム名"
としてやるだけであとはお任せコース。吸出しやエンコードしてる間にtitle.txtを用意してやればいい。

けっこう便利だと思って友人達に見せてみると、「そんなものよりGUIのツール作れ」とか言われてちょっとヘコんだ。GUI環境が苦手な俺としては、かなり満足の行く環境が出来たなーと思うのだが。

再生環境

ここではid3v2を使ってるが、日本語のid3v2を素のまんま扱えるMP3プレイヤーはまだ無い模様。うんうんうなってる時にタイミング良くdebian-develでxmmsの話が出てたので、図々しくも首を突っ込んでみた。するとxmmsにパッチを当てる方法を教えてくれた人がいて、現在実に快適なMP3再生環境を手に入れられた。詳細なやり方は、その時の投稿記事を読んだ方が早いだろう。実に詳しく丁寧に教わったおかげで、俺みたいな素人でもパッケージのリビルドができた。感謝感謝!


Sugano "狐志庵" Yoshihisa(E) <koshian@misao.gr.jp>
Back to HOME