Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es...

Preview:

Citation preview

Musik und 3D Sound

Nils Jagdfeld,

Patrick Gunia

DirectX Audio• DirectX Audio

– Hintergrundmusik und 3D Sound• Es stehen verschiedene Klassen zur Verfügung

die den Einsatz von DirectX Audio extrem vereinfachen– CMusicManager– CMusicSegment– CMusicScript– C3DMusicSegment (ab DirectX 9)

• Deklarationen und Implementierungen befinden sich in dmutil.h/cpp

• Alle notwendigen Funktionalitäten sind in GoodSound.h

Hintergrundmusik

GoodSound.h in Anwendergerüst• Datei: Space3D.h

Starten der Hintergrundmusik

Beenden der Hintergrundmusik

Interaktion zwischen Anwender und Programm

Hintergrundmusik

GoodSound.h• CMusicManager* g_pMusicManager = NULL; • CMusicSegment* g_pBackgroundMusic = NULL;

• void CreateSoundObjects(HWND handle);• void DestroySoundObjects(void);

• inline void PlayMusic(CMusicSegment* pSound )• {• if(pSound) pSound->Stop(DMUS_SEGF_DEFAULT );• if(pSound) pSound->SetRepeats(DMUS_SEG_REPEAT_INFINITE );• if(pSound) pSound->Play( DMUS_SEGF_DEFAULT );• }

• inline void StopMusic(CMusicSegment* pSound )• {• if( pSound ) pSound->Stop(DMUS_SEGF_DEFAULT );• }

• inline void NewVolume( long Volume )• {• g_pBackgroundMusic->SetVol(Volume ); • }

• void CreateSoundObjects(HWND handle)• {• g_pMusicManager = new CMusicManager();• g_pMusicManager->Initialize(handle); • g_pMusicManager->CreateSegmentFromFile(&g_pBackgroundMusic, "1.wav");• }

• void DestroySoundObjects(void)• {• if(g_pMusicManager) g_pMusicManager->StopAll(); • SAFE_DELETE(g_pBackgroundMusic)• SAFE_DELETE( g_pMusicManager )• }

Erledigt alle Verwaltungsaufgaben die im Zuge der Arbeit mit DirectX Audio anfallen

Vereinfacht den Umgang mit den einzelnen Soundobjekten (abspielen, stoppen, Lautstärke)

Initialisierung eines CMusicManager Objekts sowie Upload der Hintergrundmusik- Wird aufgerufen zu Programmbeginn in der Funktion: GameInitialisierungsRoutine()

Aufräumarbeiten am Ende des Spiels

Abspielen,Stoppen,Lautstärkeregelungder Hintergrundmusik

Hintergrundmusik

Implementierung in Space3D.h

• Funktionen werden nicht direkt verwendet, sondern in Space3D.cpp aufgerufen durch Funktionen:

Wichtig:Damit die Funktionen beim Programmstart/-ende durch die Funktionen „GameInitialisierungsRoutine()“ und „GameCleanUpRoutine()“ aufgerufen werden können müssen die dazugehörigen Funktionsprototypen in GameRoutines() als Externals deklariert werden

Hintergrundmusik

3D Sound

Wozu:

– Spiele werden realistischer

– Damit es um uns richtig kracht und bumst gibt es DirectX Audio:

Formate:

- Verschiedene Audioformate können abgespielt werden- Die bekanntesten:

Midi

-Müssen vom Soundprozessor erzeugt werden-Qualität ist abhängig von der Leistungsfähigkeit der Soundkarte

Wave

-Werden nur abgespielt-Beanspruchen relativ viel Speicherplatz-Klingen viel besser

3D Sound

Was wird benötigt?!

• Zum Abspielen von 3D Sound braucht man mindestens einen 3DSoundBuffer und einen Listener– Wovon hängt Klang ab:

• von Position und Geschwindigkeit einer Schallquelle

• Position, Geschwindigkeit und Orientierung des Listeners

3D Sound

Der Listener:

• Seine Position wird durch zwei Vektoren bestimmt:– vOrientFront: Blickrichtung des Zuhörers– vOrientTop: Kopfhaltung des Listeners

• Beide Vektoren stehen senkrecht aufeinander

3D Sound

Parameterfestlegung vor Spielbeginn• Parameter zur 3D-Sound-Wiedergabe müssen vor Spielbeginn

festgelegt werden• Siehe: Set3DParameters()

– aufgerufen in: GameInitialisierungsRoutine() • Faktoren:

– Dopplerfaktor• Beschreibt Frequenzverschiebung einer Schallwelle, wenn diese sich relativ

zum Listener bewegt bewegt sich Schallquelle auf den Listener zu = Frequenzerhöhung; bewegt sich Schallquelle vom Listener weg = Frequenzverringerung

– Rolloff-Faktor• Beschreibt die Abnahme der Schallintensität mit zunehmender Distanz der

Schallquelle vom Listener– Wert von 0 = gleich bleibende Intensität– Wert von 1 = „natürliche“ Verhältnisse

– Minimale Distanz• Gibt die Entfernung an, ab der sich die Schallintensität nicht mehr erhöht

– Maximale Distanz• Gibt Entfernung an, ab der Schallquelle nicht mehr zu hören ist

• Parameter werden in zwei Variablen gespeichert– G_dsListenerParams von Typ DS3DLISTENER– G_dsBufferParams von Typ DS3DBUFFER

3D Sound

Set3DParameter()

Doppler

Rolloff

Minimale Distanz

Maximale Distanz

3D Sound

3D Audioobjekt erzeugen

• Funktion– CreateSoundObjects() umfangreicher als in

der Hintergrundmusikfunktion, da Listener und Buffer initialisiert werden müss

– Also:• Initialisierung von CMusicManager()-Objekt

– Enthält Hintergrundmusik

• Initialisierung von CMusicSegment()-Objekt– Enthält ein Explosionssample

3D Sound

Hintergrundmusik-GoodSound.h• CMusicManager* g_pMusicManager = NULL; • CMusicSegment* g_pBackgroundMusic = NULL;

• void CreateSoundObjects(HWND handle);• void DestroySoundObjects(void);

• inline void PlayMusic(CMusicSegment* pSound )• {• if(pSound) pSound->Stop(DMUS_SEGF_DEFAULT );• if(pSound) pSound->SetRepeats(DMUS_SEG_REPEAT_INFINITE );• if(pSound) pSound->Play( DMUS_SEGF_DEFAULT );• }

• inline void StopMusic(CMusicSegment* pSound )• {• if( pSound ) pSound->Stop(DMUS_SEGF_DEFAULT );• }

• inline void NewVolume( long Volume )• {• g_pBackgroundMusic->SetVol(Volume ); • }

• void CreateSoundObjects(HWND handle)• {• g_pMusicManager = new CMusicManager();• g_pMusicManager->Initialize(handle); • g_pMusicManager->CreateSegmentFromFile(&g_pBackgroundMusic, "1.wav");• }

• void DestroySoundObjects(void)• {• if(g_pMusicManager) g_pMusicManager->StopAll(); • SAFE_DELETE(g_pBackgroundMusic)• SAFE_DELETE( g_pMusicManager )• }

Erledigt alle Verwaltungsaufgaben die im Zuge der Arbeit mit DirectX Audio anfallen

Vereinfacht den Umgang mit den einzelnen Soundobjekten (abspielen, stoppen, Lautstärke)

Initialisierung eines CMusicManager Objekts sowie Upload der Hintergrundmusik- Wird aufgerufen zu Programmbeginn in der Funktion: GameInitialisierungsRoutine()

Aufräumarbeiten am Ende des Spiels

Abspielen,Stoppen,Lautsträkeregelungder Hintergrundmusik

3D Sound

CreateSoundObjects()

CMusicManager (Hintergrundmusik) & CMusicSegment (Explosions-sample) Objekt werden initialisiert

Audiopath-Objekte werden nacheinander erzeugt

3D Soundbuffer mit Audiopath-Objekten verbinden

Vorläufige Audio-Path Eigenschaften werden festgelegt (Standardeinstellungen)

Listener-Objekte mit einzelnen Audiopath verbinden

Orientierung des Listeners wird festgelegt

3D Sound

Ausrichten des 3D Soundbuffers

• SetObjectProperties()– Bekommt als Parameter:

• Adresse eines Positionsvektors• Adresse eines Geschwindigkeitsvektors

– Um Position des SoundBuffers relativ zum Listener auszurichten benötigen wir die inverse Matrix (g_ObjectKorrekturMatrix)

• Berücksichtigt die Drehung des Spielers • Damit lassen sich Position und Geschwindigkeit der

Schallquelle in die Orientierung des Listeners transformieren

– Zuletzt: Parameter müssen ungenutztem SoundBuffer zugewiesen werden

3D Sound

SetObjectProperties()

Inverse Matrix

Parameter werden ungenutztem Buffer zugewiesen

Transformation

3D Sound

Recommended