Ljud i XNA

Inledning

Vi kommer att använda oss av en del funktioner i XNA 3.1. Det mesta av innehållet gäller även XNA 2.0 men det underlättar om du har den senaste versionen. I slutet av artikeln finns ett komplett exempel att ladda hem.

Ljud är en mycket viktig del av ett spel. Till och med en mycket dålig ljudeffekt är bättre än ingen alls. Vi ska titta på några vanlig ingredienser i ett spel.

  • Bakgrundsmusik
  • Enstaka ljudeffekter
  • Ljud som repeterar (loop'as)

Bakgrundsmusik

En av de större nyheterna med XNA 3.x är att det numera finns en MediaPlayer-klass som kan användas för att spela upp musik. Vi behöver endast lägga till en ljudfil (mp3/wma/wav) i vår Content. Som bilden nedan visar så har vi lagt till en mp3-fil med namnet music.mp3.

bild

Ett tips för att hitta bra musik är http://remix.kwed.org som har många remixar av C64-musik. Var dock noga med copyright om du tänker använda musiken till annat än personligt bruk. Du får alltså själv ladda hem eller ta någon musik du redan har på hårddisken för att följa artikeln.

Vi kan nu lägga till lite kod i vår LoadContent om vil vill att bakgrundsmusiken ska börja spela meddetsamma. Vi kan även passa på att lägga till inställningar för volym och repetering.

Exempel: Bakgrundsmusik

        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            MediaPlayer.Volume = 0.5f;
            MediaPlayer.IsRepeating = true;
            MediaPlayer.Play(Content.Load<Song>("music"));
        }

Alla metoder nås direkt via den statiska klassen MediaPlayer. Andra metoder är t.ex. Stop och Pause. Du kan även lägga upp flera låtar som i en spellista för att sedan slumpa mellan dem. Notera att vi laddar music.mp3 som en Song. Tar vi en titt i bin-katalogen för vårt projekt så kan vi se att vår mp3 har blivit konverterad till wma. Det har mindre betydelse men för att undvika onödiga förluster så kan vi lägga på minnet att hålla oss till wma-formatet om vi skulle producera egna ljud eller musik i ett ljudprogram.

Microsoft Cross-Platform Audio Creation Tool 3 (XACT3)

Nu ska vi gå vidare med ljudeffekter. För att sköta detta på ett snyggt sätt till både PC, XBox360 och Zune så har Microsoft skapat speciella verktyg för att sätta ihop, komponera och redigera hur ljud ska spelas upp. XACT kommer att hjälpa dig med många saker, tro inget annat, även om det ser främmande ut första gången. Du hittar programmen på startmenyn under Microsoft XNA Game Studio 3.1 - Tools.

bild

Programmet XACT Auditioning Utility bör du starta först! [VIKTIGT]. Detta program hanterar uppspelning av ljud och ser ut som en server, vilket det också är. Därefter kan du starta programmet Microsoft Cross-Platform Audio Creation Tool 3 (XACT3). Detta program använder XACT Auditioning Utility för uppspelning så att du kan höra hur dina ljudeffekter låter när du redigerar dem.

bild

Om du glömmer att starta XACT Auditioning Utility så kommer XACT3 att hänga sig om du försöker spela ljud, något som är oerhört irriterande.

Som du kanske märkte fanns det en XACT2 version också. Denna är till för tidigare verioner av XNA. Skulle du blanda versioner av XACT med olika versioner av XNA-projekt så kommer ljudfilerna ej att fungera. Du kommer inte ens att kunna starta ditt projekt utan kommer att få felet .xap file is the wrong version i Visual Studio. XACT3 kan hantera ljud skapade med XACT2 men kommer att spara dem som i XACT3 format. Lyckligtvis kan XACT2 göra det omvända, nämligen att öppna XACT3 format och spara i XACT2.

Börja med att ladda hem zip-filen nedan. Den innehåller två ljud som vi ska använda (throttle.wav och explosion.wav, throttle betyder gasa på engelska).

Lägg till filerna (throttle.wav och explosion.wav) i din Content i Solution Explorern i Visual Studio. Anledningen till detta är att den ljudfil (XACT) som vi snart ska skapa kommer att använda wav-filerna där de ligger. Flyttar du eller ta bort filerna så kommer du få varningar i Visual Studio och problem med att kompilera. Det bästa är att ha dem i Content.

Starta programmet XACT3.

bild

Skapa nytt projekt

Välj New Project under menyn File. Bläddra sedan fram till din Content-katalog för ditt projekt och spara den som "sounds". Ändelsen .xap kommer automatiskt att läggas till.

Skapa Wave och Sound banks

Välj New Wave Bank under menyn Wave Banks. Använd standardnamnet.

Välj New Sound Bank under menyn Sound Banks. Använd standardnamnet.

Du borde nu se följande:

bild

Dra och släpp filerna throttle.wav och explosion.wav från Content på din Wave Bank i projektet. Alternativ kan du välja Insert Wave File(s) under menyn Wave Banks.

bild

Markera och dra nu filerna från din Wave Bank till din Sound Bank.

bild

Och till sista ska vi nu dra filerna från vår Sound Bank till den nedre delan av samma fönster, den där det står Cue Names. Det vi gör är något som kallas för cues. Dessa cues bygger på ljud från vår Sounb bank. För varje sound kan vi sedan göra en massa inställningar, t.ex. volym, panorering, pitch etc etc. Vi kan alltså göra flera olika sounds och cues (med olika namn) från en o samma wav-fil. Se till att du har två cues (throttle och explosion):

bild

När vi markerar våra sounds så har vi möjlighet att göra diverse inställningar i XACT3 längst ned till vänster. Vi gör följande inställningar:

  • Throttle, Looping - Infinite.
  • Throttle, Mixing - Volume - 0dB.
  • Explosion, inget.

Se till att spara projektet och avsluta med File - Build (F7). Följande ruta ska dyka upp.

bild

Tryck bara Finish om du inte vill ha någon rapport.

Ljudeffekter

Nu när vi har skapat och byggt vår ljuddel så ska vi gå över till Visual Studio. Vi börjar med att lägga till vår sounds.xap fil till vår Content i Solution Explorer. Projektet bör se ut som följande:

bild

Vi ska nu börja spela upp våra ljudeffekter. Explosionen ska vi bara spela upp (en gång) när vi trycker ned tangenten F1. Ljudet throttle ska vi spela upp och loop'a när vi håller nere tangenten F2. Släpper vi F2 så ska ljudet upphöra.

Loop'ande ljud i XNA är lite speciella. Hanteringen av ljud går vi objektet Cue. I normala fall kan vi beordra att en Cue ska spelas och ev. avbrytas. För loop'ande ljud måste vi pausa ljudet om vi sedan vill återuppta det. En avslutad Cue går ej att börja spela igen utan måste laddas om. Nog om det nu, vi börjar med att skapa en hög med nya variabler som vi behöver för ljudhanteringen:

Exempel: Variabler

		KeyboardState prev_ks = new KeyboardState();
		AudioEngine audioEngine;
        WaveBank waveBank;
        SoundBank soundBank;
		
		Cue throttleSound;

Vi förflyttar oss sedan till LoadContent metoden för att ladda och initiera vårt ljudsystem.

Exempel: LoadContent

			audioEngine = new AudioEngine("Content\\sounds.xgs");
            waveBank = new WaveBank(audioEngine, "Content\\Wave Bank.xwb");
            soundBank = new SoundBank(audioEngine, "Content\\Sound Bank.xsb");
			throttleSound = soundBank.GetCue("throttle");

Vi laddar vårt ljudsystem via tre filer. Dessa filer byggs från vår Content pipeline när vi lade till filen sounds.xap. Om du har namngett något annorlunda i XACT så får du anpassa koden efter vad dina filnamn.

Nu avslutar vi med att lägga till avläsning av tangetnbordet och själva kontrollen av ljudeffekterna i Update.

Exempel: LoadContent

            KeyboardState ks = Keyboard.GetState();

            if (ks.IsKeyDown(Keys.F1) && prev_ks.IsKeyUp(Keys.F1))
            {
                soundBank.PlayCue("explosion");
            }

            if (ks.IsKeyDown(Keys.F2))
            {
                if (!throttleSound.IsPlaying)
                    throttleSound.Play();
                else if (throttleSound.IsPaused)
                    throttleSound.Resume();
            }
            else
            {
                if (throttleSound.IsPlaying)
                    throttleSound.Pause();
            }

            prev_ks = ks;

Justera gärna ljudet på bakgrundsmusiken om du inte hör ljudeffekterna.

Lite extra tangentbordskontroll krävs för att veta när just F1 blir nedtryck. Därav formuleringen att F1 ska vara nedtryckt OCH att föregående tangentbordsinformation säger att F1 ej är nedtryckt. Detta kommer resultera i "explosion" bara spelas just vid knapptryckningen.

Hanteringen av "throttle" (loop'ande) är lite annorlunda då vi ej kan stoppa ljudet. Den enklaste hanteringen av loop'ande ljud som ska återupptas blir som koden ovan. Om ljudet inte spelas så ska vi såklart spela upp ljudet, men det kan också vara paus'at och då måste vi använda Resume (återuppta). Om vi inte trycker ned F2 så måste vi undersöka om ljudet spelas, gör det det så måste vi paus'a ljudet.

Avslutning

Vi har tittat lite på grunderna i ljud inom XNA. Med denna artikel borde du kunna lägga till dina egna ljudeffekter i andra projekt. Här nedan kan du ladda hem hela exemplet och som bonus har vi lagt in ett exempel på hur ljudkarakteristiken i bakgrundsmusiken kan visualiseras, ungefär som visuella ljudeffekter i t.ex. WinAmp.

OBS!: Notera att vi ej skickar med någon bakgrundsmusik (mp3-fil). Den får du lägga in själv. Om du inte gör det så kan du ej köra exemplet rakt av.

bild

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Scroll to top