主要使用モジュール
- Audio::Wave
- Audio::Cuefile::Parser
#!/path/to/perl
#
use Audio::Cuefile::Parser;
use Audio::Wav;
use File::Basename;
use File::Spec;
sub index2second($);
my $cue = Audio::Cuefile::Parser->new(cue_filename.cue);
my $path = $cue->file;
my $name = $cue->title or basename($path, qw(.wav));
my $wav = Audio::Wav->new;
my $r_wav = $wav->read($path);
my $samples_per_seconds = $r_wav->length_samples / $r_wav->length_seconds;
print "Samples/Second (Bit-Rate): ", $samples_per_seconds, "\n";
my @data;
foreach ( $cue->tracks ) {
my ($idx, $pos) = ($_->index, $_->position);
my $filename = $name . '_' . $pos;
$filename .= '_' . $_->title if ($_->title);
$filename .= '.wav';
print sprintf("Position: %s, Index: %s\n", $pos, $idx);
my ($sec, $frm) = index2second($idx);
my $smp = int(($sec + ($frm / 75.0)) * $samples_per_seconds);
print sprintf("from %U secs, %U frames (%U samples)\n", $sec, $frm, $smp);
push @data, [ $filename, $smp ];
}
push @data, [ undef, $r_wav->length_samples ];
foreach ( 0 .. $#data - 1) {
my ($file, $s_idx, $s_idx_next) =
($data[$_][0], $data[$_][1], $data[$_+1][1]);
my $smp_length = $s_idx_next - $s_idx;
if ( $file ) {
$r_wav->move_to_sample( $s_idx );
my $w_wav = $wav->write( $file, $r_wav->details() );
my $written_smp =
$w_wav->write_raw_samples(
$r_wav->read_raw_samples( $smp_length ) );
print sprintf("File: %s, %U samples written\n", $file, $written_smp );
$w_wav->finish;
}
}
sub index2second($)
{
$_ = shift;
/(\d+):(\d+):(\d+)/ || die "$_ is not time index";
(($1 * 60) + $2, $3);
}
後は適当なエンコーダで圧縮とか。




