DirectMusic for Visual Basic

Hiroyuki Kawanishi (川西 裕幸)
マイクロソフト株式会社
テクニカル エバンジェリスト

May 25, 2000

MIDI を Visual Basic から使う、それは平凡です。PC に標準の音色ではご不満な方に、ここでは DLS (Downloadable Sound) を使ってサウンド エフェクトを実現する方法について説明します。DLS を使えば好みの音色を使って、サウンドをプレイすることができます。DLS については Appendix を参照してください。

Windows 98 SE、Windows 2000 からは WDM ドライバによるハードウェア アクセラレーションも可能です、現在 Yamaha YMF724 チップ シリーズが DirectMusic のハードウェア アクセラレーションをサポートしています。

DLS Sound Effents

ここで使用する音色コレクションは MIDI のための DLS ではありますが音楽ではありません、この Vocals 音色には複数のスピーチ サウンドと鼓動音 (Heartbeat) が格納されています。C3-C10 のボタンを押すと、標準の音色の替わりに、ノートに対応したスピーチ サウンドが再生されます。鼓動音は On ボタンでエンドレスに再生され、ある範囲でノートやピッチ ベンドが変えられます。このサンプル コードはデフォルトでは mssdk\samples\Multimedia\VBSamples\Dmusic\src\DLSEffects にあります。

目次

DLS サウンドのロード

まず必要な DirectX7 あるいは DirectMusic 関連のオブジェクトを宣言します。

Dim dx As New DirectX7
Dim perf As DirectMusicPerformance
Dim coll As DirectMusicCollection
Dim seg As DirectMusicSegment

最初にパフォーマンスの初期化とポートの割り当てを行います、ここではデフォルト ポートを割り当てます。ポートはミュージック データの送信または受信を行うデバイスで、ハードウェア デバイス、ソフトウェア シンセサイザ、ソフトウェア フィルタのいずれかを表します。その後で DirectMusic ローダーを初期化して、boids.dls 音色コレクションをロードします。

このコレクションは実際には Vocals と呼ばれる 1 つの音色だけを持っています。しかしこの音色は異なったノートの範囲つまり「リージョン」に対して、異なった波形サンプルを対応させています。例えば、最初のスピーチ サウンドは C3 から B3 間のノートが送られた時に使われます。スピーチ サウンドはノートがリージョンの最も下(つまりこの場合は C3 )の時に正しいピッチ(本来の周波数)で再生されます、それ以外のノートでは波形のピッチが変更されます。

次にセグメントをロードします、ここでロードしているセグメントは何でもかまいません、先ほどロードした音色をポートにダウンロードするために必要なダミーのセグメントです。DirectMusicSegment.ConnectToCollection メソッドでこの boids.dls 音色コレクションをセグメントに関連付け、DirectMusicSegment.Download メソッドでポートにセグメントをダウンロードします。ただしこの時同時にこのセグメントが参照しているほかの音色もダウンロードされます。

セグメント (と関連付けられた音色コレクション boids.dls) をダウンロードした後で、Vocals 音色を2つのチャンネルにアサインします。Vocals 音色のパッチ番号は 127 です。鼓動音のサウンドにはピッチ ベンドなどを行うので別のチャンネルにアサインしています。

Private Sub Form_Load()
  ' パフォーマンスの初期化とポートの割り当て
  Set perf = dx.DirectMusicPerformanceCreate
  Call perf.Init(Nothing, 0)
  Call perf.SetPort(-1, 16)
  …  
  ' ローダーの作成と DLS のロード
  Dim loader As DirectMusicLoader
  Set loader = dx.DirectMusicLoaderCreate
  Set coll = loader.LoadCollection(mediapath & "boids.dls")
  
  ' セグメントをロードします。実際にはそれは再生しませんが、
  ' DLS をダウンロードするためには有効なセグメントオブジェクトが必要です。
  Set seg = loader.LoadSegment(mediapath & "sample.sgt")
  Call seg.ConnectToCollection(coll)
  Call seg.Download(perf)
  
  ' Vocals 音色を2つのチャンネルにアサイン
  ' 1つは heatbeat だけに使いますから、ピッチベンドができます
  Call perf.SendPatchPMSG(0, DMUS_PMSGF_REFTIME, channel, patch, 0, 0)
  Call perf.SendPatchPMSG(0, DMUS_PMSGF_REFTIME, hbchannel, patch, 0, 0)
  …  
Exit Sub

エフェクトの再生

C3 から C10 のボタンを押すと、ボタンに応じた MIDI 値 (ここでは変数 pitch) のノートをスピーチ サウンド用のチャンネルに送ります。鼓動音以外の波形はノートで指定した時間幅内で 1 度しか再生されません。ここでは DirectMusicPerformance.SendNotePMSG メソッドを使ってノートを送ります。

今 dur はサンプルの時間幅です。全てのサウンド エフェクトを収納するのに十分なサイズにすべきですが、ノートが再生終了後もずっとリソースを使いつづける(発音が続く)ほど長くすべきではありません、ここでは 6,000 ミリ秒を使っています。あるノートの再生が終わる前に同じノートを送ると、ノートオフ メッセージが送られるので新しいノートもキャンセルされ、再生が正しく行われないかもしれません。

Private Sub SendNote(chan As Integer, pitch As Byte, dur As Long)
  Dim noteMsg As DMUS_NOTE_PMSG
  noteMsg.velocity = gVelocity
  noteMsg.flags = DMUS_NOTEF_NOTEON
  noteMsg.midiValue = pitch
  noteMsg.mtDuration = dur
  Call perf.SendNotePMSG(0, DMUS_PMSGF_REFTIME, chan, noteMsg)
End Sub

エフェクトの変更と停止

鼓動音 Heartbeat はこの DLS コレクションの中で、ループ波形をベースにした唯一のサンプルです。したがって、ノートの最大時間幅まで連続的に再生できます。このサンプルは B7 から B8 間で有効で、スライダを動かすと、そのリージョン内でノートを変えられます。

ここではまたピッチ ベンドもスライダで変更しています。ピッチベンドの詳細についてはここでは触れないので、オリジナル サンプル コードやMIDI の仕様などを参照して下さい。

Heartbeat のOn ボタンを押すと、cmdB7_Click は鼓動音を再生するためのノートをHeartbeat 用に確保した hbchannel に送ります。このノートの時間幅は無期限なので、ここでは DirectMusicPerformance.SendMIDIPMSG メソッドを使って標準 MIDI ノートオン メッセージの形式で送信します。別の方法としては先ほど使った DirectMusicPerformance.SendMIDIPMSG メソッドを使って時間幅を非常に大きく取るやり方も可能です。

' 鼓動音用のメッセージを送る
Private Sub cmdB7_Click()
  ' heartbeat については、標準 MIDI メッセージを使ってノートを送る。
  ' そのため、ノートの時間幅については気にしない。
  ' それを止めるまで再生しつづける。
  Call perf.SendMIDIPMSG(0, DMUS_PMSGF_REFTIME, 
   hbchannel, &H90, B7Freq, gVelocity)
  B7Playing = True
  cmdB7.Enabled = False
  cmdOff.Enabled = True
End Sub

' スライダのデータから鼓動音のノートを変更し、メッセージを送る
Private Sub sliderB7_Change()
  B7NoteOff
  B7Freq = 94 + sliderB7.Value
  If B7Playing Then
    Call perf.SendMIDIPMSG(0, DMUS_PMSGF_REFTIME, 
     hbchannel, &H90, B7Freq, gVelocity)
  End If
End Sub

まとめ

DirectMusic を使えば、単に MIDI ファイルを再生するだけではなく、このような DLS を使ったエフェクトの作成や、インタラクティブ ミュージック等の非常に面白い特殊効果を創造することができます。DirectX Developer Center には DirectMusic の FAQ やオーサリング ツール DirectMusic Producer の FAQ もあります。これらの情報は Visual Basic から DirectMusic を使う際にも役に立ちます、ぜひ活用して DirectMusic を使いこなしてください。

Appendix ダウンローダブル サウンド

これまで、ほとんどのコンピュータ音楽は、次の 2 つの方法のいずれかで生成されていた。それぞれに利点はあるが、欠点もある。

  • 通常は .WAV ファイル、またはレッドブック オーディオ規格に従った標準的な CD トラックに記録されているデジタル サンプルからウェーブフォーム (波形) を再現する方法。デジタル サンプルではどのようなサウンドも再現可能で、どのサウンド カードを使った場合でも得られる出力は非常によく似ている。ただし、ストリーミング用に多くの記憶領域とリソースが必要となる。

  • 一般的には MIDI ファイルからのメッセージに応答して、音色のサウンドを通常はハードウェアで合成する方法。MIDI ファイルはコンパクトで、ストリーミング リソースもわずかしか必要としないが、出力は General MIDI セットのシンセサイザで利用できる音色の数に限定され、システムによっては非常に異なった音になる場合がある。

デジタル サンプリングの利点と、MIDI のコンパクトさおよび柔軟性を組み合わせる 1 つの方法が、ウェーブテーブル合成である。これは、デジタル サンプルから音色のサウンドを合成する方法である。実際の音色をレコーディングすることによってサンプルを取得し、ハードウェアに保存する。さまざまなピッチとボリュームで任意の長さのサウンドを作成するために、サンプルのループと調整が行われる。ウェーブテーブル合成はアルゴリズムに基づく FM 合成より現実的なティンバーを作成するが、依然として固定セットの音色に限定される。さらに特定の音色のサウンドはメーカーの実装によって異なり、ハードウェアの組み合わせが異なると非常に異なったサウンドになる場合がある。

これらの制限を克服するために、MIDI Manufactures Association によってダウンローダブル サウンド (downloadable sounds、DLS) 規格が発表された。DLS は、システムにハードワイアードで実装されたサンプルの代わりに、実行時に提供されるサンプルに基づいてウェーブテーブル合成を行うことができる方法である。音色を記述するデータはシンセサイザにダウンロードされ、その後はほかの MIDI 音色と同様にその音色を演奏できる。DLS はアプリケーションの一部として配信できるため、開発者はサウンドトラックをすべてのシステムで同じように演奏させることができる。また、音色の選択が制限されることもない。

DLS 音色は 1 つまたは複数のサンプルから作成され、通常はシングル ピッチを表すが、シンセサイザで変更を加えることによりその他のピッチを作成できる。広範囲のピッチで音色のサウンドを現実的にするには、複数のサンプルを使う。DLS 音色をダウンロードする際に、リージョンと呼ばれる特定のピッチ範囲が各サンプルに割り当てられる。通常、16 個より多くのリージョンを使うことはない。加えて、サンプルにアーティキュレーションを与えることもできる。これはアタック (音符がフル ボリュームに達する速度)、ディケイ (フルボリュームから減衰する速度)、およびサウンドを実際の音色により近づけるためのその他の特徴を定義する。ダウンローダブル サウンドは音色コレクションに格納され、ここからシンセサイザにダウンロードされる。

ほかの MIDI 音色の場合と同様に、DLS 音色にはパッチ番号が割り当てられ、MIDI メッセージに応答する。ただし、DLS 音色 (機器) は General MIDI セットに従う必要はない。実際、音色を表す必要はまったくない。演説の一部や作成済みの完全な小節など、どんなサウンドでも DLS 音色に変換することができる。

出典: DirectX 7 オンライン ヘルプ

Visual Basic で DirectX を使おう