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