くだらないことをしてみる。

 最近ケータイでも40和音出てしまう。YM2203Cみたいな音の面白さはないが。
ただ問題は,フォーマットが各社各様になっていることだ。いい曲を見つけても,対応機種が違っているために 「○○対応の曲もアップしてくれ!」と思ったことはないだろうか? auの古い機種は.pmdだ。DoCoMoは.mldだが その中でも20kBの壁がある。せっかく曲をゲットしても「あと○kB削れればなー。でもプロテクト掛かって編集で きないよ」なんて経験はないだろうか。
 そこでいくつかのファイルフォーマットについて調査してみた。結論から言うと0か1のフラグでプロテクトを かけるかかけないかを見ているだけなので容易にプロテクトの解除が出来る。
ただし注意をひとつ。くれぐれも「プロテクトを外して変換し,再配布しない」こと。
これは2次著作者(.midや.mmfの作者)および1次著作者(原曲の作曲者等)の著作侵害になる。
 もう一点,あらかじめ断るが以降16進のバイナリコードで楽曲の一部が表示されている部分がある。 これは引用の範囲でかつ学術研究の目的とする。

1 プロテクトの仕様について
まずキャリアとフォーマットの大まかな対応を確認しよう。

表1.対応フォーマット
キャリアファイルフォーマット
DoCoMo.mld
au.pmd/.mmf
tu-ka.mmf
vodafone.mmf


 まずmmfならどこでも流用可能だ。一番困るのは他キャリアのフォーマットを利用したいときだろう。 また,auの古い携帯だと.pmd形式のため,.mmfの曲が再生できないこともある。その場合には変換ソフトなどを 用いる必要がある。
 ここでは簡単に変換・音色変更などが行えるPsmplayを利用する。 ソフトの利用方法は省略する。また,各フォーマットの詳細は省略する。

2 各ファイルのプロテクトについて
結論から言うと作成ソフトによってフラグのアドレスが異なるようだ。あるソフトでは0x13が00になっているとフラグオフ。 01ならフラグオンでプロテクト。またある別のソフトで作成した場合0x2Dがフラグになっている。
figure1
figure1.あるソフトでプロテクトあり/無しで保存した場合の比較(1)
b.mldがフラグオン。

figure2
figure2.あるソフトでプロテクトあり/無しで保存した場合の比較(2)
p.mldがフラグオン

バイナリエディタで2つのプロテクトがかかったファイルを比較してみる。 figure3
figure3.あるソフトでプロテクトをかけて作成したファイル(1)

figure4
figure4.あるソフトでプロテクトをかけて作成したファイル(2)

 赤線の部分は同じである。この72 63 00 01 01という並びを参考にして,フラグであろう アドレスの値を書き換えればよい。
余談だがsmzは拡張子の変更(.smd)だけでプロテクトの解除となる。

3 多量のファイルを更新する場合
 簡単なCソースを挙げる。個人的に使用するために十分な機能であると考えている。 拡張子などによるファイルの判別はせず,無条件に指定アドレスに00を書き込む。 3行目のオフセットバイトは10進で表している。つまり0x2Dとなる。 この値を19にすれば0x13に00が書き込まれる。 ある程度予想がつく場合はこれでファイルを複数まとめてドラッグアンドドロップすればよい。 ディレクトリは入れても反応しないので注意すること。

#include
#define MODIFY_OFFSET_BYTE 45

int modifyFile(char *fname)
	{
	FILE *fp;
	if(!(fp=fopen(fname,"rb+"))){
		return -1;
		}
	if(fseek(fp,MODIFY_OFFSET_BYTE,SEEK_SET)){
		fclose(fp);
		return -1;
		}
	fputc('\0',fp);
	fclose(fp);
	return 0;
	}

int main(int argc,char **argv)
	{
	while(*++argv){
		if(modifyFile(*argv)){
			perror(*argv);
			}
		}
	return 0;
	}