CUEファイルを作成するスクリプトを紹介します。
作成した/収集した音声ファイルを音楽CD(CDDA)に焼きたいときや、CDからお気に入り曲を集めて1枚のCDにまとめたいときに使います。cueやtocファイルがない場合でも、Linux環境で音楽CDを簡単に焼くことができます。
Windows環境では、WindowsのツールやneroやB's recorderなどの商用アプリを使うことになるのでしょうが、私はもっぱらLinuxで焼いています。理由は単純で、東アジアンな安物のCD/DVDメディアを使ったときに、Windowsでは頻繁に失敗してしまうのに対し、Linuxでは失敗することはほぼありません。少し観察した限りでは、Windowsのソフトはメディアがサポートする最大速で書きに行ってしまい品質が悪くて失敗しているようで、Linuxでは初めにテストしてスピードを決めているようです。(なので仕様よりも遅いスピードで焼かれることが多い)。いずれにしても、メディアが無駄になるのは地球に優しくありませんし、だからと言って5倍も値段がする高品質なメディアを買う気にもなれません。
Linuxで音楽CDを焼くには、cdrdaoを使います。これはトラック情報にTOCファイルを使います。TOCはWindows環境で使われている?CUEファイルとはフォーマットが異なり、また、手動で作り難くなっています。
このため、以下の手順で行います。
- CUEファイルを作り、 % cue_make.pl *.wav
- cue2tocで変換し、 % cue2toc.pl cd.cue
- cdrdaoで焼く。 % cdrdao write cd.toc
そのcue_make.plです。WAVファイルを引数に取り、その順番通りのトラックを持つCDDAのcd.cueを生成します。
#!/usr/bin/perl
$Usage = "$0 [-o CueFile] [-t title] [-p performer]
[-g genre] [-d date] [-i discId] [-c comment] WAV_files\n";
$CueFile = "cd.cue";
#--- interpret the command-line arguments
while (defined($ARGV[0])) {
if ($ARGV[0] =~ /^-D.*/) {
$Debug = 1;
} elsif ($ARGV[0] =~ /^-o/) {
shift(@ARGV);
$CueFile = $ARGV[0];
} elsif ($ARGV[0] =~ /^-t/) {
shift(@ARGV);
$Title = ub2sp($ARGV[0]);
} elsif ($ARGV[0] =~ /^-p/) {
shift(@ARGV);
$Performer = ub2sp($ARGV[0]);
} elsif ($ARGV[0] =~ /^-g/) {
shift(@ARGV);
$Genre = ub2sp($ARGV[0]);
} elsif ($ARGV[0] =~ /^-d/) {
shift(@ARGV);
$Date = ub2sp($ARGV[0]);
} elsif ($ARGV[0] =~ /^-i/) {
shift(@ARGV);
$Discid = ub2sp($ARGV[0]);
} elsif ($ARGV[0] =~ /^-[tT]/) {
shift(@ARGV);
$Title = ub2sp($ARGV[0]);
} elsif ($ARGV[0] =~ /^-c/) {
shift(@ARGV);
$Comment = ub2sp($ARGV[0]);
} elsif ($ARGV[0] =~ /^-.*/) {
print STDERR "$Usage";
exit 0;
} else {
last;
}
shift(@ARGV);
}
#--- DebugPrint function
$Debug = 0;
sub Dprint {
if ($Debug) {
printf STDERR "DBG: LINE @";
}
return 0;
}
#--- checking to set the necessary variables.
if (!defined(@ARGV)) {
print STDERR "$Usage";
exit 0;
}
#--- write to CUE file
$s = "";
if (defined($Title)) {
$s .= "TITLE \"$Title\"\n";
} else {
$s .= "REM TITLE \"\"\n";
}
if (defined($Performer)) {
$s .= "PERFORMER \"$Performer\"\n";
} else {
$s .= "REM PERFORMER \"\"\n";
}
if (defined($Genre)) {
$s .= "GENRE $Genre\n";
}
if (defined($Date)) {
$s .= "DATE $Date\n";
}
if (defined($Discid)) {
$s .= "DISCID $Discid\n";
} else {
$s .= "REM DISCID \n";
}
if (defined($Comment)) {
$s .= "COMMENT \"$Comment\"\n";
}
#--- write a header
$nTrack = 1;
foreach $wf (@ARGV) {
$fn = $wf;
$s .= "FILE \"$wf\" WAVE\n";
$n = sprintf "%02d", $nTrack;
$s .= " TRACK $n AUDIO\n";
$Title = ub2sp($wf);
$Title =~ s/\.wav$/./;
$s .= " TITLE \"$Title\"\n";
$s .= " FLAGS DCP\n";
$s .= " PREGAP 00:00:00\n";
# $s .= " INDEX 00 00:00:00\n";
$s .= " INDEX 01 00:00:00\n";
$nTrack += 1;
}
printf "$s\n";
if (open(OUT, ">$CueFile")) {
printf OUT "$s\n";
}
exit 0;
sub ub2sp {
$[0] =~ s// /g;
return($[0]);
}