fork download
  1. @rem = '--*-Perl-*--
  2. @echo off
  3. if "%OS%" == "Windows_NT" goto WinNT
  4. perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
  5. goto endofperl
  6. :WinNT
  7. perl -x -S %0 %*
  8. if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
  9. if %errorlevel% == 9009 echo You do not have Perl in your PATH.
  10. if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
  11. goto endofperl
  12. @rem ';
  13. #! perl
  14. #line 15
  15.  
  16. die <<"" unless @ARGV;
  17. Usage: mz2wav M12file.M12 [M12file.M12 ..]
  18. To convert MZ-80K emulator files to WAV format.
  19.  
  20. my($rate, $blanc1, $blanc2) = (44100, .5, 2);
  21. my($hi, $lo) = ("\x88", "\x00");
  22. my($hi1, $lo1) = (464, 494); #usec
  23. my($hi0, $lo0) = (240, 264); #usec
  24.  
  25. my($wFormatTag) = 1; # WAVE_FORMAT_PCM;
  26. my($nChannels) = 1; # monaural
  27. my($nSamplesPerSec) = $rate;
  28. my($nBlockAlign) = 1;
  29. my($wBitsPerSample) = 8; # 8 bits per sample
  30.  
  31. my($nAvgBytesPerSec) = $rate * $nChannels * int(($wBitsPerSample + 7) / 8);
  32.  
  33. my($d1) = $hi x int($hi1 * $rate / 1e6 + .5) . $lo x int($lo1 * $rate / 1e6 + .5);
  34. my($d0) = $hi x int($hi0 * $rate / 1e6 + .5) . $lo x int($lo0 * $rate / 1e6 + .5);
  35.  
  36. for $i ( 0 .. 0xff ) {
  37. $bp = sprintf '%08b', $i;
  38. $bd[$i] = join '', $d1, map { $_ ? $d1 : $d0 } unpack 'AAAAAAAA', $bp;
  39. $bn[$i] = @bp = ( $bp =~ /(1)/g );
  40. }
  41.  
  42. for $fname ( @ARGV ) {
  43. ($bname = $fname) =~ s/\.[^\.]*$// ;
  44. if( -e ($oname = "$bname.wav") ) {
  45. for($i = 2; -e ($oname = "$bname($i).wav") ;$i ++) { }
  46. }
  47.  
  48. open IN, '<', $fname;
  49. binmode IN;
  50. read IN, $head, 0x80;
  51. $len = unpack 'v', substr($head, 18, 2);
  52. read IN, $body, $len;
  53. close IN;
  54.  
  55. @head = unpack 'C*', $head;
  56. @body = unpack 'C*', $body;
  57.  
  58. $fmtdata = pack 'vvVVvv', $wFormatTag, $nChannels, $nSamplesPerSec,
  59. $nAvgBytesPerSec, $nBlockAlign, $wBitsPerSample;
  60.  
  61. $sum = 0;
  62. for $d ( @head ) { $sum += $bn[$d]; }
  63. $ed = join '', map { $bd[$_] } @head, $sum >> 8 & 0xff, $sum & 0xff;
  64.  
  65. $pcmdata = $d0 x 22000 . $d1 x 40 . $d0 x 40 . "$d1$ed$d1" . $d0 x 256 . "$ed$d1";
  66. $pcmdata .= $lo x ($rate * $blanc1);
  67.  
  68. $sum = 0;
  69. for $d ( @body ) { $sum += $bn[$d]; }
  70. $ed = join '', map { $bd[$_] } @body, $sum >> 8 & 0xff, $sum & 0xff;
  71.  
  72. $pcmdata .= $d0 x 11000 . $d1 x 20 . $d0 x 20 . "$d1$ed$d1" . $d0 x 256 . "$ed$d1";
  73. $pcmdata .= $lo x ($rate * $blanc2);
  74.  
  75.  
  76. $fmt = pack 'a4Va*', 'fmt ', length $fmtdata, $fmtdata;
  77. $data = pack 'a4Va*', 'data', length $pcmdata, $pcmdata;
  78.  
  79. $WAVE = pack 'a4a*a*', 'WAVE', $fmt, $data;
  80. $RIFF = pack 'a4Va*', 'RIFF', length $WAVE, $WAVE;
  81.  
  82.  
  83. open OUT, '>', $oname;
  84. binmode OUT;
  85. print OUT $RIFF;
  86. close OUT;
  87. }
  88.  
  89. __END__
  90. :endofperl
  91.  
Runtime error #stdin #stdout #stderr 0s 5124KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Usage: mz2wav M12file.M12 [M12file.M12 ..]
To convert MZ-80K emulator files to WAV format.