SMF to MDS version 1.00

最終更新日: 2002年11月6日

本ソフトウェアは、標準MIDIファイル (SMF) フォーマット0または1を、MIDIストリーム (MDS) ファイルに変換します。32ビット版Windows (Intel x86) の日本語環境下でのみ使用できます。

このプログラムは、自作のMIDIプレーヤでMDSファイルを読み込んで演奏できるかどうかをテストするために作りました。せっかく作ったので、公開することにしました。

目次:

  1. 本ソフトウェアの特徴
  2. 本ソフトウェアのインストール方法、アンインストール方法
  3. 本ソフトウェアの使い方
  4. 著作権、使用条件、連絡先およびWWWサイト
  5. 開発履歴
  6. MDSファイルの構造について

1. 本ソフトウェアの特徴

本ソフトウェアは、標準MIDIファイル (SMF) をMIDIストリーム (MDS) ファイルに変換するという目的において、DirectX SDKのサンプルにある「Mid2strm: Converts MIDI File into MDS (MidiStream) File」と似ています。しかし、以下の点で「Mid2strm」よりも優れています。

  1. SMFのSysexイベントを無視せず、MDSファイルに反映させます
  2. SMFに題名や著作権情報が含まれる場合、MDSファイルに反映させます。
  3. ストリーム バッファの最大サイズを、1KB単位で指定できます。
  4. ランニング ステータスを使用するかどうかを指定できます。
2について:
具体的には、"LIST"チャンク (フォーム タイプは"INFO") を作成し、題名を"INAM"チャンクに、著作権情報を"ICOP"チャンクに書き込みます。これは、マイクロソフト社とIBM社が共同で作成した「Multimedia Programming Interface and Data Specifications 1.0」に沿った動作です。

目次へ: 本ソフトウェアの特徴


2. 本ソフトウェアのインストール方法、アンインストール方法

2.1. インストール方法

  1. smf2mds.zipを解凍します。
  2. ファイルの読み書きが可能なドライブに、適当な名前のフォルダを作成します。
  3. 解凍してできたファイルを、2.で作成したフォルダに移します。すでに以前のバージョンがインストールされている場合は、2.の手順を省略し、以前のフォルダに上書きコピーしてもかまいません。

2.2. アンインストール方法

  1. 本ソフトウェアを終了します。
  2. 本ソフトウェアをインストールしたフォルダ内にある、以下の三つのファイルを削除します。
    • smf2mds.exe
    • smf2mds.html
    • smf2mds.ini (存在しない場合もあります)
  3. 本ソフトウェアをインストールしたフォルダ内に、上記以外のファイルやフォルダが無ければ、本ソフトウェアをインストールしたフォルダも削除します。

目次へ: 本ソフトウェアのインストール方法、アンインストール方法


3. 本ソフトウェアの使い方

3.1. 標準MIDIファイル (SMF) をMIDIストリーム (MDS) ファイルに変換する方法

  1. 「ファイル」メニューの「開く」項目を選ぶか、「SMFをMDSに変換する」ボタンを押すか、メインウィンドウに標準MIDIファイル (SMF) をドラッグアンドドロップします。
  2. 「ファイルを開く」ダイアログボックスが開くので、変換したい標準MIDIファイル (SMF) を選びます。
  3. 「名前を付けて保存」ダイアログボックスが開くので、MIDIストリーム (MDS) ファイルの保存先を指定します。

3.2. ファイル変換時のオプション

「ストリーム バッファの最大サイズ」:
ストリーム バッファの最大サイズをキロバイト (KB) 単位で指定します。1以上63以下の値を指定できます。初期値は4KBです。
「ランニング ステータスを使用する」:
MIDI規格に定められている、ランニング ステータス ルールを使用するかどうかを指定します。MDSファイルはSMFとは異なり、ランニング ステータスを使用しても、ファイル サイズは小さくなりません。しかし、MIDIデータの転送量は減らすことができます。MIDIの転送速度はとても遅いので、ランニング ステータスを使用して、転送するデータ量を少しでも減らした方が良いと思います。初期状態では、ランニング ステータスを使用します
「ストリームIDを省略する」:
ストリーム バッファ内からストリームIDを省略します。ストリームIDを省略すると、各イベントにつき4バイトの領域を節約できます。よって、MDSファイルのサイズを小さくできます (約3分の2のサイズになるはず)。しかし、MDSファイルを読みとるソフトウェアが、これに対応している必要があります。初期状態では、ストリームIDを省略しません

目次へ: 本ソフトウェアの使い方


4. 著作権、使用条件、連絡先およびWWWサイト

4.1. 著作権

4.2. 使用条件

何らかの媒体に転載を希望する場合は、ご一報ください。

4.3. 連絡先およびWWWサイト

電子メール:
tetem@brown.plala.or.jp
テテのアトリエ:
http://www1.plala.or.jp/tete009/

目次へ: 著作権、使用条件、連絡先およびWWWサイト


5. 開発履歴

1.00 (2002年11月6日)
初公開。

目次へ: 開発履歴


6. MDSファイルの構造について

MDSファイルの形式は、WindowsのMIDIストリーム系のAPI (midiStream〜) を用いてMIDIデータを演奏するのに適しています。MIDIストリーム系のAPIは、Windows 95以上やWindows NT 3.1以上に実装されています。

MDSファイルは、リソース交換ファイル形式 (RIFF) で記述されます。そのため、MDSファイルの読み書きには、マルチメディア ファイルI/O API (mmio〜) を用いると楽です。

6.1. MDSファイルのチャンクの構造を示した表:

MDSファイルのチャンクの構造
チャンク名 チャンクの解説
"RIFF" ルートに位置するチャンクです。フォーム タイプは、"MIDS"です。
"fmt " MIDSFMT構造体を格納するチャンクです。MIDSFMT構造体は、C言語で以下のように定義されています。
typedef struct {
   DWORD dwTimeFormat;
   DWORD cbMaxBuffer;
   DWORD dwFlags;
} MIDSFMT;
		
dwTimeFormat:
SMFのタイム形式を指定するのと同じやり方で、MIDIイベント間の時間 (デルタタイム) の表現方法を指定します。
cbMaxBuffer:
ストリーム バッファの最大サイズをバイト単位で指定します。この値は、必ず4の倍数を指定しなければなりません。なぜなら、ストリーム バッファは、MIDIEVENT構造体を連ねたものだからです。MIDIEVENT構造体の実態はというと、DWORD値の配列です。
また、この値は65536未満でなければなりません。理由は、現在のWindowsの実装では、各ストリーム バッファの最大サイズは、64キロバイト未満でなければならないからです。
dwFlags:
MDSファイルの形式を指定します。ストリーム バッファ内のストリームIDを省略しない場合は0を指定し、省略する場合は1を指定します。
"data" ストリーム バッファなどを格納するチャンクです。まず最初に、ストリーム バッファの個数をDWORD値で指定します。以降は、ストリーム バッファのヘッダとストリーム バッファの内容を、ストリーム バッファの個数のぶんだけ繰り返し指定します。

6.2. ストリーム バッファのヘッダとストリーム バッファの内容を示した表:

ストリーム バッファのヘッダとストリーム バッファの内容
概要 解説
ストリーム バッファのヘッダ
(MIDSBUFFER構造体)
ストリーム バッファのヘッダは、MIDSBUFFER構造体です。MIDSBUFFER構造体は、C言語で以下のように定義されています。
typedef struct {
   DWORD tkStart;
   DWORD cbBuffer;
} MIDSBUFFER;
tkStart:
曲の先頭からの時間を指定します。
たとえば、MIDIイベント間の時間 (デルタタイム) の表現に「四分音符当たりのティック数 (TPQN)」を用いている場合は、曲の先頭からのティック数を指定します。
cbBuffer:
このストリーム バッファの内容のサイズを、バイト単位で指定します。MIDSBUFFER構造体のサイズは含めません。
前に書いたように、ストリーム バッファのサイズは、4の倍数でなければなりません。
それからこの値は、ストリームIDを省略しない場合は65536未満でなければなりません。
一方、ストリームIDを省略する場合は、(65536 - 省略したストリームIDのバイト数)未満でなければなりません。なぜなら、ストリームIDを省略した場合は、そのストリーム バッファをMIDIストリーム系のAPIへ渡す前に、プログラマの手でストリームIDを復元する必要があるからです。
ストリーム バッファの内容
(MIDIEVENT構造体の連なり)
ストリーム バッファの内容は、MIDIEVENT構造体の連なりです。注意すべき点は、MDSファイルは、ストリームID (dwStreamID) を省略することもできることです。ストリームIDが省略されているストリーム バッファは、このままではMIDIストリーム系のAPIに渡すことができません (エラーを返します)。この場合、プログラマの責任でストリームIDを補う必要があります

目次へ: MDSファイルの構造について


Copyright (C) 2002 Tete's Atelier, All rights reserved.