15
Musik und 3D Sound Nils Jagdfeld, Patrick Gunia

Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

Embed Size (px)

Citation preview

Page 1: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

Musik und 3D Sound

Nils Jagdfeld,

Patrick Gunia

Page 2: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 3: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Starten der Hintergrundmusik

Beenden der Hintergrundmusik

Interaktion zwischen Anwender und Programm

Hintergrundmusik

Page 4: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 5: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 6: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 7: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 8: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 9: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 10: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

Set3DParameter()

Doppler

Rolloff

Minimale Distanz

Maximale Distanz

3D Sound

Page 11: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 12: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 13: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 14: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

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

Page 15: Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es stehen verschiedene Klassen zur Verfügung die den Einsatz

SetObjectProperties()

Inverse Matrix

Parameter werden ungenutztem Buffer zugewiesen

Transformation

3D Sound