Entry

MP3 を吸い出すぞ

2004年04月15日

PC-UNIX はマルチメディアに弱いといわれているけれど,CDDA から MP3 を吸い出すことくらいは朝飯前です。もちろん,聴くこともできます。

MP3 というと,ついこの前までアングラな響きがあったけれど,Apple iPod さまさまの功績で,だいぶ市民権を得るに至ったようです。そんなわけで,ここはひとつ手持ちの CD から MP3 ファイルを作ってみようと思います。

ちなみに AIAN は MP3 プレーヤーを持っていないので,ファイルを作ってもパソコンで聞くしかありません。ですから,音楽を聴きたいなら単純にパソコンの CD で聴けば済む話だったりもします。MP3 プレーヤーも最近になってお手頃になってきたみたいなので,うまくいったらプレーヤーを買おうと思います。本末転倒ですが。

段取り

CD から音楽ファイルを作るには,概ね次のような手順を踏みます。

  1. CD-ROM から音楽データ(PCM データ)を読み取る
  2. (読み取ったファイルを WAV ファイルに変換する)
  3. MP3 エンコーダを使って MP3 ファイルを作る
  4. MP3 に情報(タイトル,アーティスト名等々)を登録する

WAV ファイルのような中間ファイルを作るのは,エンコーダに対応させるためです。以下の手順では,WAV ファイルが無くても MP3 ファイルを作れるので,括弧書きにしておきました。

それでは,上の順番に従って MP3 ファイルを作ってみます。

リッピング

リッピングっていうのは,CD から音楽データ(PCM データ)を抜き出すことです。PCM データはレッドブック(CDDA)というフォーマットで CD-ROM に収まっているので,これを抜き出すわけです。

ちなみに,リッピングというと,CD-ROM から WAV ファイルを作ること(上記手順1・2)をいったり,これに加えて MP3 を作ることまで含めてしまう(上記手順1・2・3)こともあるみたいですけど,ここでは CD-ROM に収まっている PCM データを読み取ることをいうことにします。

なお,以下の説明は,「How to rip a audio CD」(中村和志のFreeBSDページ)を参考にさせていただきました。

FreeBSD でリッピングするには,特別なツールは要りません。ディスクダンプを取るだけです。まず,CD の中身を見ることにします。以下のようにすると,トラックの中身を見ることができます。

% cdcontrol -f /dev/acd0c info

devfs を 採用している FreeBSD(5.x 以降ではデフォルト)では,cdcontrol info すると /dev 以下に /dev/acd0t?? というトラック毎のデバイスが作成されるので,これをダンプすればいいわけです。UN*X には dd というディスクダンプを取るツールが標準でついてきます。よくバックアップに使う道具ですね。

% dd if=/dev/acd0t01 of=track01.raw bs=2352

dd を使ってる方はお分かりでしょうけど,"if=/dev/acd0t01" というのはコピー元のファイル名(CD-ROM のデバイス名)で,"of=track01.raw" というのは出力するファイル名です。

また,"bs=2352" というオプションは,ブロックサイズを 2352byte にするという意味です。これは,音楽CDが 2352byte を1セクタにしていることから,ダンプしたファイルも 2352byte で1ブロックにするようにしていしているわけです。

実行してしばらくすると,track01.raw というファイルができます。このファイルは PCM データそのままなので,適当なプログラムで聴くことができます。

WAV ファイルを作る

後で紹介する MP3 エンコーダ(午後のコーダ)が PCM フォーマットも理解できるから,あまり必要ないんですけど,一応 WAV ファイルの作り方も紹介しておきます。

WAV ファイルを作るには,世の中に出回っているツールを使うのが手っ取り早いです。ここらへんを使うといいかもしれません。ここでは紹介にとどめておきます。

もっとも,これらは後で説明するフロントエンドツールのバックエンドになっていたりするので,インストールしておくといいかもしれません(Ports に入っています)。

MP3 にエンコーディングする

MP3 のエンコーダには,

なんかがあります。使いやすいのを使うといいと思いますけど,「午後のコーダ」は国産ですし評判も上々なのでおすすめです。Ports に入っているのでインストールしましょう。

オプションがたくさんあって使い切れてないんですけど,さっきの PCM ファイルをエンコードするなら,次のようにするといいようです。

% gogo -delete -offset 0 track01.raw 

"-delete" オプションを付けると,入力ファイル(ここでは track01.raw)を削除してくれるので便利だと思います。

うまくできたでしょうか。できあがったら,XMMS で聴くなり,iPod で聴くなりしてみましょう。

MP3 タグを入力する

このままでも十分めでたしめでたしなんですけど,近頃の MP3 プレーヤーは,ファイルに音楽データ以外の情報(タグ)を表示する機能が充実しているので,入れておくと便利かもしれません。

やり方はいくつかあるけれど,一番牧歌的な方法が「手打ち」です。XMMS にタグ編集機能が付いているので,これを使うといいと思います(下図参照)。頑張って手で打ち込んでください。もっとも,日本語を入力する場合,大部分の MP3 プレイヤーは文字コードに Shift_JIS を使っているので,EUC-JP を標準で使っている FreeBSD では,少し工夫する必要がありそうです(手持ちのCDが洋楽ばかりだから,あまり困ってなかったりする)。

XMMS でタグ手打ちの図

この他の洗練された方法としては,freedb.org のような CDDB にアクセスして,タグ情報を引っ張ってくる方法があります。様々な言語でライブラリが用意されているので,自前で実装することもさほど難しくないんですけど,とりあえずは出来合いのフロントエンドツールを使うのが近道だと思います(後述)。

自動化なんかしてみる

さてさて。以上で MP3 ファイルができるようになりました。できるにはできました……。

ただ……正直,面倒くさいです。

Windows のツールは使ったことがないけれど,おそらくこんなに面倒くさくはないでしょう。マウスをカチカチすればできあがりだと思います。対抗するわけじゃないんですけど,こっちでも少しは自動化してみたいものです。

決まった仕事が多いので,スクリプトの類で作るのが一番お手軽です。やっつけ仕事ですけど,一応 Ruby で作ってみました。外部プログラムをまとめ上げただけなので,使う場合は,cd-discid(CD-ROM の情報を得る)と,午後のコーダ(MP3 ファイルを作る)をインストールしておいてください(どっちも Ports になっています)。

#!/usr/bin/env ruby

# external application requirements:
#    - cd-discid
#    - gogo (gogo no coder)
#    - cdcontrol [default]
#    - dd        [default]

device = "/dev/acd0"

disc = `cd-discid #{device}`.split
disc_title = disc[0]
disc_track = disc[1].to_i

`cdcontrol -f #{device} info`

1.step(disc_track, 1) do |n|
  track = sprintf("%#02d", n)
  basename = "#{disc[0]}-#{track}"
  rawfile  = basename + ".raw"
  # processing ...
  `dd if=#{device}t#{track} of=#{rawfile} bs=2352`
  `gogo -delete -offset 0 #{rawfile}`
end

へなちょこスクリプトだけど,結構使えています。適当なファイルに保存して実行すると,CD-ROM から PCM データを読み取って,MP3 ファイルを吐き出します。

タグを付ける機能はないけれど,Ruby RAA に freedb.rb というのがあるので,組み合わせたら案外簡単に実装できると思います。

フロントエンドツールを使ってみる

今更いうのもなんですけど,上記の作業はほとんどバックエンドプログラムを使って作っています。たくさんの CD-ROM を MP3 にする場合は,上の方法だと難儀すると思うので,これらの機能をまとめ上げたフロントエンドツールを適宜利用するのがいいと思います。

フロントエンドには,

あたりがあるようです。一般には,Gnome と相性がいい Grip が使われているようですけど,Gnome を使ってないせいか,うちの環境でうまく動きませんでした(Xft2 あたりの挙動が芳しくない)。

そんなわけで,ここでは MP3c を使ってみます。これは,(n)cursese で動くコンソールアプリケーションです。コンソールアプリケーションですから,X がなくても動きます。CCDB からタグデータを引っ張ってくることもできるけれど,日本語は通らないようです。バックエンドにはいろいろ使えるみたいですけど,デフォルトは午後のコーダと cdgrab になっています(うちでは cdgrab の代わりに cdpranoia を使っています)。Ports になっているので,インストールも簡単です。

MP3c は,最初の設定に難儀すると思います。とりあえず,初めて起動するときは,CD-ROM のデバイスファイル(デフォルトは /dev/cdrom)を変更しておくといいでしょう。ここでは,デバイスファイル名を /dev/acd0 にすることにします。次のようにして起動します。

% mp3c -d /dev/acd0

ただ,これで起動しても,「CDDB データベースをキャッシュするためのディレクトリ(デフォルトは /root/cddb)が無い」とか言われます。一般ユーザで起動していたら当然,デフォルトの位置にディレクトリを作ることはできないので,変更する必要があります。

ここらへんの詳しい設定は,起動後 [F2] または [2] でできるので,Manpage を読みながら設定してください。キャッシュディレクトリの他には,non-fly で作らない場合のために,テンポラリファイルの格納場所(デフォルトは,/tmp/ WSPse-MP3Creat.wav)を変えておいた方がいいと思います。/tmp 以下に置くと,すぐ disc full になっちゃいますから。

設定の結果は,~/.mp3crc に保存されます。

設定がうまくいけば [F3] を叩くだけで使えます。WAV ファイルを作って,MP3 ファイルにエンコード,さらにはタグ付けまで自動的にやってくれます。さらに詳しい使い方は,Manpage があるので適宜参照にしてください(手抜き)。使っている様子は,こんな感じ。

MP3c 初期状態

MP3c でWAV ファイルを作るの図

MP3c で MP3 ファイルを作るの図

最後に,我が家の .mp3crc を載せておきます。先述の通り,このファイルは直接編集するもんじゃありません(しちゃいけないわけじゃないと思うけど)。

# WSPse's MP3-Creator (Configfile)
# automaticly created, but you may edit this file manually.
# [14.04.2004 19:11] - program version: 0.27
# {mp3c-0.27 (NLS) - ENGLISH (Apr 14 2004)}

# version number (to detect updates and inform about news)
mp3c_version = "0.27"

# cdrom-device
cd_dev = "/dev/acd0"

# CDDB-server [host:port] (more servers maybe seperated by commas)
# use "0" to disable server-access
# note: cddb.cddb.com:8880 is not longer usable
cddb_serv = "freedb.freedb.org:8880"

# local CDDB database
cddb_loc = "~/cddb"

# if remote CDDB access is allowed
rem_cddb = 1

# mailadress to which CDDB should be sent (more addresses maybe seperated
# by commas)
cddb_email = "freedb-submit@freedb.org"

# relaying smtp-server who handle my emails [host:port]
smtp_serv = "localhost:smtp"

# my email adress for authorizing [user@host]
my_email = "aian@localhost"

# directory for mp3-files
mp3_dir = "./"

# program for ripping cd-tracks (to file)
#  %1 = cdrom device
#  %2 = track (numeric)
#  %3 = outputfile
rip_nf_prg = "cdparanoia %2 %3"

# program for ripping cd-tracks (to stdout)
#  %1 = cdrom device
#  %2 = track (numeric)
rip_of_prg = "cdrip.sh %1 %2"

# program for encoding wav->mp3 (from file to file)
#   %1 = inputfile
#   %2 = outputfile
#   %3 = albumname
#   %4 = MP3 genre by number
#   %5 = year
#   %6 = comment
#   %7 = filename
#   %8 = MP3 genre by name
#   %a = tracknumber
#   %b = tracknumber (with leading zeros)
#   %c = artistname
#   %d = title
enc_nf_prg = "gogo  %1 %2"

# program for encoding wav->mp3 (from stdin to file)
#  %1 = outputfile
#  %3 = albumname
#  %4 = MP3 genre by number
#  %5 = year
#  %6 = comment
#  %7 = filename
#  %8 = MP3 genre by name
#  %a = tracknumber
#  %b = tracknumber (with leading zeros)
#  %c = artistname
#  %d = title
enc_of_prg = "gogo /tmp/mp3 "%1" -b 160"

# program for creating mp3 info
#  use mp3_info_prg = "0" to disable usage of tagprogram
#  %1 = artistname
#  %2 = title
#  %3 = albumname
#  %4 = genre (by number)
#  %5 = year
#  %6 = comment
#  %7 = filename
#  %8 = genre (by name)
#  %a = tracknumber
#  %b = tracknumber (with leading zeros)
mp3_info_prg = "id3tool -r "%1" -t "%2" -a "%3" -y "%5" -g %4 -n "%6" "%7""

# string which replaced %8 in mp3_info_prg, if genre is unknown
unknown_genre = "Unknown"

# size of fifo-buffer for on the fly encoding (KB)
of_fifo = 512

# pattern for mp3-filename-creation
#  %1 = artistname
#  %2 = title
#  %3 = albumname
#  %4 = genrestring
#  %5 = year
#  %6 = tracknumber
#  %7 = tracknumber (with leading zeros)
#  %8 = cddb-id
mp3_pattern = "%7-%2.mp3"

# pattern fro mp3-filename-creation for sampler cds
#  same pattern like in mp3_pattern
mp3_pattern_mix = "%7-%2.mp3"

# mode for handling spaces in filenames
#  0: spaces allowed, 1: spaces will be converted to underscores
#  2: spaces will be killed
pat_mode = 1

# appereance of filename case
#  0: as it is in CDDB entry
#  1: convert to lowercase (first letter will be uppercase if pat_upc = 1
#  2: convert to uppercase
case_chg = 0

# convert first letter of filename to uppercase
#  0: no, 1: yes
pat_upc = 1

# illegal characters which aren't allowed in filenames
# (converted to '_' if mode != 2, else killed
ill_chars = "~[]()!*?""

# what to do with illegal characters, should they be removed?
# (otherwise convert to '_' or space, depending on pat_mode)
#  0: no, use pat_mode, 1: yes, remove
rem_ill_char = 1

# protect pattern from substitution operations?
#  0: no, 1: yes
pattern_protect = 1

# character which should replace slashes in album, artist, title
# (only one character allowed, use "0" to accept slashes in these
   fields, which causes strange directory creation)
slash_rep_char = "-"

# non-strict character handling
# 0: only printable chars allowed, 1: eased allowed chars
eased_char_hand = 0

# default comment for mp3-files
#  %1 = artistname
#  %2 = title
#  %3 = albumname
#  %4 = genrestring
#  %5 = year
#  %6 = tracknumber
#  %7 = tracknumber (with leading zeros)
#  %8 = version-string of MP3c
#  %9 = cddb-id
#  %a = actual day (is set when encoding starts, or batchfile created)
#  %b = actual month
#  %c = actual year (2 digits)
#  %d = actual year (4 digits)
#  %e = weekday (3 letters)
#  %f = month (3 letters)
#  %g = actual hour
#  %h = actual minute
#  %i = minute-part of track-length
#  %j = second-part of track-length
mp3_comment = "gen by WSPse-MP3c %8 [%b/%c]"

# fancy color for windows (0: never, 1: sometimes, 2: ever)
fancy_color = 0

# autosave configuration on exit (0: no, 1: yes)
auto_save = 1

# default flag (0: default non-fly, 1: default on-fly)
def_on_fly = 0

# rip-encode order (0: rip one track, then encode; 1: rip all tracks,
#                   then encode)
rip_enc_ord = 1

# open tray after encoding (0: no, 1:yes)
open_tray = 1

# tmpfile (for non-on-the-fly convert)
tmp_file = "/usr/home/aian/tmp/WSPse-MP3Creat.wav"

# what to do with tempfiles on exits
# 0: nothing, 1: delete marked, 2: delete all
del_tmp_on_exit = 1

# default exportfile for ripped tracks
def_exp_file = "./.mp3c-exported"

# if deleteflag should cleared on export (0: no, 1: yes)
clear_del_on_exp = 1

# framemultiplikator (to calculate size)
frame_mult = 214

# pattern for m3u-playlist, use "0" to disable
#  %1 = artistname
#  %2 = title
#  %3 = albumname
#  %4 = genrestring
#  %5 = year
#  %6 = tracknumber
#  %7 = tracknumber (with leading zeros)
#  %8 = cddb-id
m3u_pattern = "%1-%3.m3u"

# pattern for m3u-playlist for sampler cds, use "0" to disable
#  same pattern like in m3u_pattern
m3u_patmix = "%3.m3u"

# 
Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN