$inf='TLV_MONO.WAV'; $outf='WLK23900.WAV'; $n=3; #周波数を1/nに $j=0; #タイマー #$s=128/8; #精度 #$s=1; #$inf=$ARGV[0]; #$outf=$inf; #$outf=~s/[.]wav$/_.WAV/i; $headsize=0x2c; #$RECSIZE = 0x100; # バイトで表した レコードのサイズ #$RECSIZE = 0x1000; # バイトで表した レコードのサイズ $RECSIZE = 128*1024; # バイトで表した レコードのサイズ $recno = 0; # 更新すべきレコード open(FH, "<$inf") || die "can't update somewhere: $!"; binmode(FH); seek(FH, $hedsize , 0); use Win32::Sound; ($hz, $bits, $channels) = Win32::Sound::Format($inf); print "file:$inf " . $hz . "Hz " . $bits . "bits " . $channels . "ch.\n" ; if($bits != 8) { print "This is not 8bits data. \n"; exit; } $bits=8;$hz=$hz/$n; $WAV = new Win32::Sound::WaveOut($hz, $bits, $channels); # $WAV = new Win32::Sound::WaveOut($hz * 2, 16, $channels); #データ読み込み処理 $sz=1; until(eof FH) { $sz=read(FH, $record, $RECSIZE); &setdata($record); # $WAV->Load($data); # get it # $data = ""; # print "$sz\n"; print "."; } print "ok\n"; # munge the record #seek(FH, -$RECSIZE, 1); #print FH $record; close FH; # $WAV->Load($data); # get it print "file:$outf " . $hz . "Hz " . $bits . "bits " . $channels . "ch.\n" ; $WAV->Save($outf,$data); # write to disk # $WAV->Write(); # hear it # 1 until $WAV->Status(); # wait for completion # $WAV->Unload(); # drop it sleep(5); exit; #出力周波数、時間(1ms) sub setdata { my($idata)=@_; foreach $v (unpack("C*",$idata)) { # v ... l-short # n ... b-short # $data .= pack("v", $v); #mono 16bit if($j%$n == 0) { $d = $v - 0x80; $v = 2 * $d * abs($d); $v=int($v/256); # $v=int($v/$s); # $v=$v*$s; $v=$v + 0x80; # $h=$v; $data .= pack("C", $v); #mono 8bit #$data .= pack("c", $v); #mono 8bit } $j++; } # print " $h "; }