Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es...
-
Upload
erwin-stitz -
Category
Documents
-
view
108 -
download
1
Transcript of Musik und 3D Sound Nils Jagdfeld, Patrick Gunia. DirectX Audio –Hintergrundmusik und 3D Sound Es...
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