V2MML用バイナリファイルバインダー

V2MMLで扱うバイナリファイルを作成

V2MML ver.1.0.28 から、MMLからバイナリファイルを読み込む機能が追加されました。
読み込めるのは定められたフォーマットに従ってバインドされたPCM/ADPCMです。
ここでは、定められたフォーマットに従ってバイナリをバインドするシェルスクリプトを紹介します。
次のシェルスクリプトは、macOS 10.12.6 で動作検証しており、標準のターミナルで動きます。
(macOS 10.15.5 でも動作しました。)
#!/bin/bash
MY_DIRNAME=$(dirname $0)
cd $MY_DIRNAME

function errorExit() {
    IFS=$IFS_SAVE
    echo $1
    echo "returnキーを押してください"
    read varWait
    exit 1
}

IFS_SAVE=$IFS
IFS=$'\n'

#バインドリスト(__v2mmlBindList.txt)存在確認
if [ ! -f __v2mmlBindList.txt ]; then
    errorExit "[v2mmlBind: error] __v2mmlBindList.txt が見つかりません"
fi

#バインドリスト読み込み
v_listFile=`cat __v2mmlBindList.txt`
v_listCount=0

#バイナリ作成用の配列作成
for i in ${v_listFile[@]}
do
    v_lineTop=${i: 0: 1}
    if [ "$v_lineTop" != "#" ] && [ "$v_lineTop" != "\n" ]; then
        v_Ext=${i##*.}
        if [ $v_listCount -eq 0 ]; then
            #最初のファイル名は書き出しファイル名
            v_file_arr[$v_listCount]=$i
            v_fileSize_arr[$v_listCount]=0
            v_fileExt_arr[$v_listCount]=$v_Ext
            v_listCount=$((v_listCount+1))
        else
            #2個目以降は読み込みファイル名
            if [ ! -f $i ]; then
                errorExit "[v2mmlBind: error] 次のリスト内ファイルが見つかりません:$i"
            fi
            case $v_Ext in
                u08)  ;;
                s08)  ;;
                16l)  ;;
                16b)  ;;
                ayb)  ;;
                amb)  ;;
                aml)  ;;
                *) errorExit "[v2mmlBind: error] 拡張子が規定(08u/s08/16l/16b/ayb/amb/aml)外です:$i" ;;
            esac
            v_file_arr[$v_listCount]=$i
            v_fileSize_arr[$v_listCount]=`ls -l ${v_file_arr[$v_listCount]} | awk '{print $5}'`
            v_fileExt_arr[$v_listCount]=$v_Ext
            v_listCount=$((v_listCount+1))
        fi
    fi
done

#for debug
#echo ${v_file_arr[@]}
#echo ${v_fileSize_arr[@]}
#echo ${v_fileExt_arr[@]}
#echo $v_listCount


if [ $v_listCount -lt 2 ]; then
    errorExit "[v2mmlBind: error] __v2mmlBindList.txt内のファイル数不足:少なくとも1つの出力ファイル名と1つの読み込みファイル名が必要です"
fi


#1st Chunk:固定ヘッダ出力:keyStr(16),2ndChunkTop(4),3rdChunkTop(4),reserved(8)
v_gap=32
v_2ndTop=32
v_3rdTop=$((((v_listCount-1)*16)+v_2ndTop+v_gap))
printf "V2MML-bin-180410" | xxd -p >__v2mmlBindListTemporary.txt
printf "%08x" $v_2ndTop >>__v2mmlBindListTemporary.txt
printf "%08x" $v_3rdTop >>__v2mmlBindListTemporary.txt
printf "%016x\n" 0 >>__v2mmlBindListTemporary.txt


#2nd Chunk:可変ヘッダ出力
v_allocPt=0
v_index=0
for i in ${v_fileSize_arr[@]}
do
    if [ $v_index -ne 0 ]; then
        printf "%08x" $v_allocPt >>__v2mmlBindListTemporary.txt
        printf "%08x" ${v_fileSize_arr[$v_index]} >>__v2mmlBindListTemporary.txt
        printf "%08x" 0 >>__v2mmlBindListTemporary.txt
        printf ".%s" ${v_fileExt_arr[$v_index]} | xxd -p >>__v2mmlBindListTemporary.txt
        v_allocPt=$((v_allocPt+v_fileSize_arr[$v_index]+v_gap))
    fi
    v_index=$((v_index+1))
done
#GAP書き出し
printf "%032x\n%032x\n" 0 0 >>__v2mmlBindListTemporary.txt


#3rd Chunk:バイナリデータ出力
v_index=0
for i in ${v_fileSize_arr[@]}
do
    if [ $v_index -ne 0 ]; then
        #バイナリ実体
        xxd -p ${v_file_arr[$v_index]} >>__v2mmlBindListTemporary.txt
        #GAP書き出し
        printf "%032x\n%032x\n" 0 0 >>__v2mmlBindListTemporary.txt
    fi
    v_index=$((v_index+1))
done


#バイナリファイル作成
xxd -r -p __v2mmlBindListTemporary.txt ${v_file_arr[0]}


#正常終了
IFS=$IFS_SAVE
echo "[v2mmlBind: 正常終了] returnキーを押してください"
read varWait
上記シェルスクリプトを、適当なフォルダを作成してその中に、
__v2mmlBind.command
という名前で保存してください。その後、
chmod u+x __v2mmlBind.command
このコマンドで実行属性を付与してください。
こうすることでファイルをFinderからダブルクリックするだけで実行できるようになります。

シェルスクリプトの使い方

上記で作成したシェルスクリプト「__v2mmlBind.command」と同じ場所に
__v2mmlBindList.txt
というテキストファイルを作成してください。
このファイルは、これからバインドするPCM/ADPCMファイルのリストです。
「__v2mmlBind.command」を実行すると、「__v2mmlBindList.txt」を読み込んで、
リストの順番通りにバインドし、結果のファイルを作成します。
「__v2mmlBindList.txt」の書き方は、例えば次の通りです。
#バインド結果の書き出しファイル(*.v2b)
__v2mmlBindResult.v2b
#読み込みファイル
1.u08
2.u08
3.u08
#
4.16l
5.16l
6.16l
#
7.16b
8.16l
#
9.ayb
10.aml
11.amb
# *.u08 = unsigned 8bit pcm
# *.s08 = signed 8bit pcm
# *.16l = signed 16bit pcm [little endian]
# *.16b = signed 16bit pcm [big endian]
# *.ayb = 4bit adpcm Yamaha format [nibble:big endian]
# *.amb = 4bit adpcm OKI format [nibble:big endian]
# *.aml = 4bit adpcm OKI format [nibble:little endian]
まず、# で始まる行はコメントとして無視されます。空行も無視されます。
それ以外は、1行に1つのファイル名が書かれてあるものと解釈されます。
一番最初のファイル名は、書き出しファイル名です。
書き出しファイル名の拡張子に制限はありませんが、原則「.v2b」としてください。
それ以降のファイル名は、読み込みファイル名で、バインドするPCM/ADPCMのファイル名を書きます。
「__v2mmlBindList.txt」と同じ場所に読み込みファイルも用意してください。
「__v2mmlBind.command」「__v2mmlBindList.txt」「読み込みファイル群」が用意できたら、
「__v2mmlBind.command」をダブルクリックして実行すると、目的のバイナリファイルができます。

読み込みファイル(PCM/ADPCM)の作り方

上記で作成した「__v2mmlBindList.txt」と同じ場所に、PCM/ADPCMファイルを用意します。
要点は、
・ヘッダ情報を含まない「RAWデータ」であること。
・モノラルデータであること。
・決められた拡張子でファイルを用意すること。
の3点です。
波形編集ソフトなどで保存された *.wavファイルは、RAWデータで書き出して、
ファイル名の拡張子は決められたものにしてください。
この拡張子は、V2MMLがデータ参照する際の種別確認に使用されるため必須です。
決められた拡張子は7種類で、次の通りです。
*.u08 = unsigned 8bit pcm
*.s08 = signed 8bit pcm
*.16l = signed 16bit pcm [little endian]
*.16b = signed 16bit pcm [big endian]
*.ayb = 4bit adpcm Yamaha format [nibble:big endian]
*.amb = 4bit adpcm OKI format [nibble:big endian]
*.aml = 4bit adpcm OKI format [nibble:little endian]
一般的な 16bit PCM の *.wav は、基本的に「signed 16bit pcm [little endian]」です。
ただ、大抵はステレオのため、モノラル化して RAWデータ に書き出すようご注意ください。

MML sound works へ戻る

Copyright (C) LinearDrive App Works
Last Modify: 2020/06/14 08:14:07