@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#! perl
#line 15
Usage: mz2wav M12file.M12 [M12file.M12 ..]
To convert MZ
-80K emulator files to WAV
format.
my($rate, $blanc1, $blanc2) = (44100, .5, 2);
my($hi, $lo) = ("\x88", "\x00");
my($hi1, $lo1) = (464, 494); #usec
my($hi0, $lo0) = (240, 264); #usec
my($wFormatTag) = 1; # WAVE_FORMAT_PCM;
my($nChannels) = 1; # monaural
my($nSamplesPerSec) = $rate;
my($nBlockAlign) = 1;
my($wBitsPerSample) = 8; # 8 bits per sample
my($nAvgBytesPerSec) = $rate * $nChannels * int(($wBitsPerSample + 7) / 8);
my($d1) = $hi x
int($hi1 * $rate / 1e6 + .5) . $lo x int($lo1 * $rate / 1e6
+ .5
); my($d0) = $hi x
int($hi0 * $rate / 1e6 + .5) . $lo x int($lo0 * $rate / 1e6
+ .5
);
for $i ( 0 .. 0xff ) {
$bd[$i] = join '', $d1, map { $_ ? $d1 : $d0 } unpack 'AAAAAAAA', $bp; $bn[$i] = @bp = ( $bp =~ /(1)/g );
}
for $fname ( @ARGV ) {
($bname = $fname) =~ s/\.[^\.]*$// ;
if( -e ($oname = "$bname.wav") ) {
for($i = 2; -e ($oname = "$bname($i).wav") ;$i ++) { }
}
$fmtdata = pack 'vvVVvv', $wFormatTag, $nChannels, $nSamplesPerSec, $nAvgBytesPerSec, $nBlockAlign, $wBitsPerSample;
$sum = 0;
for $d ( @head ) { $sum += $bn[$d]; }
$ed = join '', map { $bd[$_] } @head, $sum >> 8 & 0xff
, $sum & 0xff
;
$pcmdata = $d0 x 22000 . $d1 x 40 . $d0 x 40 . "$d1$ed$d1" . $d0 x 256 . "$ed$d1";
$pcmdata .= $lo x ($rate * $blanc1);
$sum = 0;
for $d ( @body ) { $sum += $bn[$d]; }
$ed = join '', map { $bd[$_] } @body, $sum >> 8 & 0xff
, $sum & 0xff
;
$pcmdata .= $d0 x 11000 . $d1 x 20 . $d0 x 20 . "$d1$ed$d1" . $d0 x 256 . "$ed$d1";
$pcmdata .= $lo x ($rate * $blanc2);
$fmt = pack 'a4Va*', 'fmt ', length $fmtdata, $fmtdata; $data = pack 'a4Va*', 'data', length $pcmdata, $pcmdata;
$WAVE = pack 'a4a*a*', 'WAVE', $fmt, $data; $RIFF = pack 'a4Va*', 'RIFF', length $WAVE, $WAVE;
}
__END__
:endofperl
QHJlbSA9ICctLSotUGVybC0qLS0KQGVjaG8gb2ZmCmlmICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byBXaW5OVApwZXJsIC14IC1TICIlMCIgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKZ290byBlbmRvZnBlcmwKOldpbk5UCnBlcmwgLXggLVMgJTAgJSoKaWYgTk9UICIlQ09NU1BFQyUiID09ICIlU3lzdGVtUm9vdCVcc3lzdGVtMzJcY21kLmV4ZSIgZ290byBlbmRvZnBlcmwKaWYgJWVycm9ybGV2ZWwlID09IDkwMDkgZWNobyBZb3UgZG8gbm90IGhhdmUgUGVybCBpbiB5b3VyIFBBVEguCmlmIGVycm9ybGV2ZWwgMSBnb3RvIHNjcmlwdF9mYWlsZWRfc29fZXhpdF93aXRoX25vbl96ZXJvX3ZhbCAyPm51bApnb3RvIGVuZG9mcGVybApAcmVtICc7CiMhIHBlcmwKI2xpbmUgMTUKCmRpZSA8PCIiIHVubGVzcyBAQVJHVjsKVXNhZ2U6IG16MndhdiBNMTJmaWxlLk0xMiBbTTEyZmlsZS5NMTIgLi5dClRvIGNvbnZlcnQgTVotODBLIGVtdWxhdG9yIGZpbGVzIHRvIFdBViBmb3JtYXQuCgpteSgkcmF0ZSwgJGJsYW5jMSwgJGJsYW5jMikgPSAoNDQxMDAsIC41LCAyKTsKbXkoJGhpLCAkbG8pID0gKCJceDg4IiwgIlx4MDAiKTsKbXkoJGhpMSwgJGxvMSkgPSAoNDY0LCA0OTQpOwkjdXNlYwpteSgkaGkwLCAkbG8wKSA9ICgyNDAsIDI2NCk7CSN1c2VjCgpteSgkd0Zvcm1hdFRhZykgPSAxOwkJCSMgV0FWRV9GT1JNQVRfUENNOwpteSgkbkNoYW5uZWxzKSA9IDE7CQkJCSMgbW9uYXVyYWwKbXkoJG5TYW1wbGVzUGVyU2VjKSA9ICRyYXRlOwpteSgkbkJsb2NrQWxpZ24pID0gMTsKbXkoJHdCaXRzUGVyU2FtcGxlKSA9IDg7CQkjIDggYml0cyBwZXIgc2FtcGxlCgpteSgkbkF2Z0J5dGVzUGVyU2VjKSA9ICRyYXRlICogJG5DaGFubmVscyAqIGludCgoJHdCaXRzUGVyU2FtcGxlICsgNykgLyA4KTsKICAgIApteSgkZDEpID0gJGhpIHggaW50KCRoaTEgKiAkcmF0ZSAvIDFlNiArIC41KSAuICRsbyB4IGludCgkbG8xICogJHJhdGUgLyAxZTYgKyAuNSk7Cm15KCRkMCkgPSAkaGkgeCBpbnQoJGhpMCAqICRyYXRlIC8gMWU2ICsgLjUpIC4gJGxvIHggaW50KCRsbzAgKiAkcmF0ZSAvIDFlNiArIC41KTsKCmZvciAkaSAoIDAgLi4gMHhmZiApIHsKCSRicCA9IHNwcmludGYgJyUwOGInLCAkaTsKCSRiZFskaV0gPSBqb2luICcnLCAkZDEsIG1hcCB7ICRfID8gJGQxIDogJGQwIH0gdW5wYWNrICdBQUFBQUFBQScsICRicDsKCSRiblskaV0gPSBAYnAgPSAoICRicCA9fiAvKDEpL2cgKTsKfQoKZm9yICRmbmFtZSAoIEBBUkdWICkgewoJKCRibmFtZSA9ICRmbmFtZSkgPX4gcy9cLlteXC5dKiQvLyA7CglpZiggLWUgKCRvbmFtZSA9ICIkYm5hbWUud2F2IikgKSB7CgkJZm9yKCRpID0gMjsgLWUgKCRvbmFtZSA9ICIkYm5hbWUoJGkpLndhdiIpIDskaSArKykgeyB9Cgl9CgoJb3BlbiBJTiwgJzwnLCAkZm5hbWU7CgliaW5tb2RlIElOOwoJcmVhZCBJTiwgJGhlYWQsIDB4ODA7CgkkbGVuID0gdW5wYWNrICd2Jywgc3Vic3RyKCRoZWFkLCAxOCwgMik7CglyZWFkIElOLCAkYm9keSwgJGxlbjsKCWNsb3NlIElOOwoKCUBoZWFkID0gdW5wYWNrICdDKicsICRoZWFkOwoJQGJvZHkgPSB1bnBhY2sgJ0MqJywgJGJvZHk7CgoJJGZtdGRhdGEgPSBwYWNrICd2dlZWdnYnLAkkd0Zvcm1hdFRhZywgJG5DaGFubmVscywgJG5TYW1wbGVzUGVyU2VjLAoJCQkJCQkgJG5BdmdCeXRlc1BlclNlYywgJG5CbG9ja0FsaWduLCAkd0JpdHNQZXJTYW1wbGU7CgoJJHN1bSA9IDA7Cglmb3IgJGQgKCBAaGVhZCApIHsgJHN1bSArPSAkYm5bJGRdOyB9CgkkZWQgPSBqb2luICcnLCBtYXAgeyAkYmRbJF9dIH0gQGhlYWQsICRzdW0gPj4gOCAmIDB4ZmYsICRzdW0gJiAweGZmOwoKCSRwY21kYXRhICA9ICRkMCB4IDIyMDAwIC4gJGQxIHggNDAgLiAkZDAgeCA0MCAuICIkZDEkZWQkZDEiIC4gJGQwIHggMjU2IC4gIiRlZCRkMSI7CgkkcGNtZGF0YSAuPSAkbG8geCAoJHJhdGUgKiAkYmxhbmMxKTsKCgkkc3VtID0gMDsKCWZvciAkZCAoIEBib2R5ICkgeyAkc3VtICs9ICRiblskZF07IH0KCSRlZCA9IGpvaW4gJycsIG1hcCB7ICRiZFskX10gfSBAYm9keSwgJHN1bSA+PiA4ICYgMHhmZiwgJHN1bSAmIDB4ZmY7CgoJJHBjbWRhdGEgLj0gJGQwIHggMTEwMDAgLiAkZDEgeCAyMCAuICRkMCB4IDIwIC4gIiRkMSRlZCRkMSIgLiAkZDAgeCAyNTYgLiAiJGVkJGQxIjsKCSRwY21kYXRhIC49ICRsbyB4ICgkcmF0ZSAqICRibGFuYzIpOwoKCQoJJGZtdCAgPSBwYWNrICdhNFZhKicsICAnZm10ICcsIGxlbmd0aCAkZm10ZGF0YSwgJGZtdGRhdGE7CgkkZGF0YSA9IHBhY2sgJ2E0VmEqJywgICdkYXRhJywgbGVuZ3RoICRwY21kYXRhLCAkcGNtZGF0YTsKCgkkV0FWRSA9IHBhY2sgJ2E0YSphKicsICdXQVZFJywgJGZtdCwgJGRhdGE7CgkkUklGRiA9IHBhY2sgJ2E0VmEqJywgICdSSUZGJywgbGVuZ3RoICRXQVZFLCAkV0FWRTsKCgoJb3BlbiBPVVQsICc+JywgJG9uYW1lOwoJYmlubW9kZSBPVVQ7CglwcmludCBPVVQgJFJJRkY7CgljbG9zZSBPVVQ7Cn0KCl9fRU5EX18KOmVuZG9mcGVybAo=