www.codeworx.org/directx_tuts/Midi-Datei abspielen mit DirectSound

Midi-Datei abspielen mit DirectSound

1.) Einleitung
Dieses Tutorial setzt es sich zum Ziel euch in Direct Music einzuführen
und euch beizubringen eine MIDI-Datei abzuspielen. Ihr werdet dafür DirectX 8 verwenden.
Viele Grundlagen, die in diesem Tutorial erklärt werden,
entsprechen denen aus meinen anderen Tutorial über Direct Music in DirectX 7.

2.) Grundlagen
Die drei am häufigsten verwendeten Dateitypen zur Speicherung von Musik heißen
WAVE, MIDI und MP3. Direct Sound ermöglicht es, WAVE-Dateien abzuspielen, und
DirectShow erleichtert die Arbeit mit MP3-Dateien. In diesem Tutorial soll
jedoch eine MIDI-Datei abgespielt werden und das geht nur mit der Hilfe von DirectMusic.

DirectMusic ist, wie jeder Bestandteil von DirectX, in Klassen unterteilt.
Den Aufbau dieser Klassen zeigt das folgende Organisationsdiagramm.

                 DirectMusic

                      |

 Loader  Performance  Composition  Instrument

Für euch sind im Moment nur die Klassen Loader und Performance interessant.
Die Loader-Klasse dient dazu, Daten aus Ressourcen oder Dateien zu laden.
Diese Daten können zum Beispiel MIDI-Dateien sein. Hingegen stellt die Klasse
Performance den Kern einer Anwendung dar, die mit DirectMusic arbeitet.
Mit Hilfe dieser Klasse lassen sich beispielsweise MIDI-Dateien abspielen und stoppen.

Außer den bereits vorgestellten Klassen sind noch zwei andere für das
Abspielen einer MIDI-Datei wichtig. Dabei handelt es sich um die Klasse Segment,
in der die MIDI-Datei (innerhalb des Codes) gespeichert wird, und die Klasse
SegmentState, die den Zustand des Segmentes, in dem die MIDI-Datei gespeichert wurde,
aufnimmt. Mit der Hilfe dieser Klasse lässt sich beispielsweise abfragen,
ob die betroffene MIDI-Datei wiederholt werden soll.


3.) Praxis
Die Objekte jeder Anwendung, die DirectMusic unterstützt, müssen zuerst erzeugt
und danach initialisiert werden. Das Erzeugen gelingt, wie immer, über die Anweisung Set.

Set Loader = DirectX.DirectMusicLoaderCreate
Set Performance = DirectX.DirectMusicPerformanceCreate

Durch den gezeigten Code habt ihr die wichtigsten Komponenten erzeugt.

Für die, welche mein altes Tutorial bereits kennen, kommt nun zum ersten
Mal etwas neues. Um das Performance-Objekt zu intialisieren, muss die Methode

InitAudio aufgerufen werden, deren Syntax folgendermaßen aussieht.

Performance.InitAudio hWnd, lFlags, AudioParams, DirectSound, lDefaultPathType,    Soundchannels

Ab dieser Stelle tauchen die ersten Unterschiede zur alten DirectMusic-Version auf.
Die folgende Liste erklärt die Bedeutung der verschiedenen Argumente des oben
gezeigten Funktionsaufrufes:

  • hwnd: das Windowhandle (z.B.: Form1.hWnd)
  • lFlags: Features von Direct Music, die unterstützt werden sollen
  • AudioParams: um dieses Argument nutzen zu können, muss ein DMUS_AUDIOPARAMS-Objekt
    erzeugt werden (näheres dazu am Ende des Tutorials)
  • DirectSound: Platzhalter für das DirectSound-Objekt - wenn es nicht vorhanden ist,
    müsst ihr Nothing übergeben
  • LDefaultPathType: hiermit lassen sich die Boxen näher ansteuern (Stichwörter: Mono, Stereo)
  • Soundchannels: Anzahl der Tonkanäle


Nun der Code, der auch im Beispielprojekt verwendet wird.

dmPerformance.InitAudio Form1.hWnd, DMUS_AUDIOF_ALL, dmAudioParams, Nothing, DMUS_APATH_SHARED_STEREOPLUSREVERB, 64

Ein letztes Mal solltet ihr euch noch mit dem Performance-Objekt beschäftigen,
da die folgende Codezeile erst zulässt, das Musik abgespielt werden kann.

Performance.SetMasterAutoDownload True

Nun kümmert ihr euch um die Klasse Loader, mit deren Hilfe ihr die MIDI-Datei
in die Klasse Segment laden werdet. Hierbei vereinfacht euch die Loader-Klasse
die Arbeit, da ihr sie auf das Verzeichnis einstellen könnt,
in dem die MIDI-Dateien gespeichert sind.

Loader.SetSearchDirectory("Verzeichnis")

Nun müsst ihr die betroffene MIDI-Datei nur noch in der Klasse Segment speichern,
was mit dem folgenden Codeschnipsel möglich ist.

Set Segment = Loader.LoadSegment (Datei)

In DirectSound könnt ihr unterschiedliche Formate für die Unterstützumng von
WAVe-Dateien verwenden, was bedeutet, dass ihr DirectSound klar machen müsst,
um welches Dateiformat es sich handelt. Ähnlich ist es bei DirectMusic,
wo ihr ebenfalls bekannt geben müsst, dass es sich um eine MIDI-Datei handelt.

Segment.SetStandardMidiFile

Der Code ist nun schon fast vollständig. Ihr müsst die geladene MIDI-Datei
nur noch abspielen, was mit Hilfe der Klassen SegmentState und Performance
zu schaffen ist. Auch beim Abspielen von MIDI-Dateien gibt es Unterschiede
zur alten DirectMusic-Version, was die Leser und Leserinnen meines alten
Tutorials sicherlich durch die folgende Codezeile erkennen werden.

Set SegmentState = Performance.PlaySegmentEx (Segment, 0, 0)

Der Aufruf dieser Funktion besteht aus drei Argumenten.
Im ersten Argument gebt ihr das Segment an, in dem die MIDI-Datei abgespeichert wurde,
die ihr abspielen wollt, im zweiten die Flags, die sich auf das Abspielen
auswirken und im dritten und somit letzten Argument die Startzeit in Millisekunden,
nach der die betroffene MIDI-Datei abgespielt werden soll.

Wenn ihr mit der alten DirectMusic-Version umgehen konntet, wird euch
aufgefallen sein, dass im Groben nicht viele Unterschiede zwischen der neuen und
der alten Version bestehen.

Andreas ten Pas, präsentiert von codeworx.org