Z-MUSIC3.0本に付属のPCMデータをWindowsで利用しやすいように変換する

今からおよそ12年前に発売された、X68k用ミュージックドライバZ-MUSIC Ver.3.0の本に付属のCD-ROMには、多数のPCMデータが収録されています。(このPCMデータは、Z-MUSIC3.0本を持っていない方でもZ-MUSIC Home Pageのダウンロードページから入手できます。)

これを使ってみようかと思い立ったのですが、そのままではWindowsで使いにくい形式のため、Windows標準のWAVファイル形式に変換してみました。

まず、件のCD-ROM収録のPCMデータは、拡張子によって以下のような形式に分かれます。

*.PCM
X68k形式 15625Hz 4bit ADPCM
*.P16
15625Hz 16bit(有効12bit) PCM (ビッグエンディアン)
*.M30
30000Hz 16bit(有効12bit) PCM (ビッグエンディアン)
*.M44
44100Hz 16bit PCM (ビッグエンディアン)

すべてモノラルです。16bit(有効12bit)となっているものは、データ形式としては16bitだが、そのうち12bit分しか有効なデータが入っていないということです。

これらをWindows標準のWAVファイルにするため、Vectorで公開されているPCMCONVを使用させていただきました。

ただ、数が多いため手作業で逐一変換していると大変なので、Rubyスクリプトを組みました。

その際、Rubyからsystem()でPCMCONVをそのまま呼び出すと、なぜか途中で動作が固まってしまいました。どうも、PCMCONVの終了をRuby側が検知できていないような雰囲気だったので、試しにバッチを1段噛ましてみたところ、うまくいきました。

この他、PCMCONVを使う際の注意点として、DOS汎用の実行ファイルのためかロングファイルネームに対応していないようです。Z-MUSIC3.0本のPCMデータはすべて8+3文字以内のファイル名になっているので大丈夫でした。

月刊電脳倶楽部に収録されていた(AD)PCMデータなどは8+3文字を超えるファイル名の場合があるので、これらを変換する際はいったんリネームするなど、工夫が必要になります。

なお今回は、サンプリングレートはすべて元ファイルと同じままにしました。(どうせ実際の使用時にはサンプリングレートを変えると思うので) もしこの段階で変えたい場合は、PCMCONVに与える-orオプションの値を変えればいいです。


PCMtoWAV.rb

#!/usr/local/bin/ruby -Ks
######## *.PCM / *.P16 / *.M30 / *.M44形式のファイル → *.WAV形式に変換
######## ※ActiveScriptRuby1.8.7-p72にて動作確認

require 'fileutils'

if ARGV.length < 2
  printf("ruby %s srcBaseDir/ dstBaseDir/\n", $PROGRAM_NAME)
  exit(1)
end

def convert(batchName, srcBaseDir, dstBaseDir, srcExt, dstExt)
  ## 変換元ファイル群を求める
  srcFilePaths = Dir.glob(srcBaseDir + '**/*.' + srcExt)
  
  ## 各変換元ファイルに対して…
  srcFilePaths.each { |srcFilePath|
    ## 変換先ファイルパスを求める
    dstFilePath = srcFilePath.sub(srcBaseDir, dstBaseDir)
    dstFilePath.sub!(Regexp.new(srcExt + '$', Regexp::IGNORECASE), dstExt)
    
    ## 変換先ディレクトリを作る
    dstDir = File.dirname(dstFilePath)
    FileUtils.makedirs(dstDir)
    
    ## 変換を実行する
    commandLine = "#{batchName} #{srcFilePath} #{dstFilePath}"
    puts commandLine
    ret = system(commandLine)
    unless ret
      puts "エラー発生"
      break
    end
  }
end

convert('convPCM.bat', ARGV[0], ARGV[1], 'PCM', 'WAV')
convert('convP16.bat', ARGV[0], ARGV[1], 'P16', 'WAV')
convert('convM30.bat', ARGV[0], ARGV[1], 'M30', 'WAV')
convert('convM44.bat', ARGV[0], ARGV[1], 'M44', 'WAV')

convPCM.bat

PCMCONV.EXE -ir15625 -or15625 -if8 -of2 %1 %2

convP16.bat

PCMCONV.EXE -ir15625 -or15625 -if3 -of2 -lv16/1 %1 %2

convM30.bat

PCMCONV.EXE -ir30000 -or30000 -if3 -of2 -lv16/1 %1 %2

convM44.bat

PCMCONV.EXE -ir44100 -or44100 -if3 -of2 %1 %2


使い方:
1. PCMCONV.EXE, PCMtoWAV.rb, convPCM.bat, convP16.bat, convM30.bat, convM44.batを同じディレクトリに置く。

2. そのディレクトリに適当なディレクトリ("PCM"など)を作り、その中にZ-MUSIC3.0本付属のPCMデータを置く。

3. コマンドプロンプトで1.のディレクトリに行き、以下のコマンドを実行する。

ruby PCMtoWAV.rb PCM/ WAV/

4. WAVディレクトリの中に変換されたデータができる。