Uma das grandes adições do XNA 3.0 foi a possibilidade de se tocar músicas e outros efeitos sonoros sem a necessidade de utilizar o XACT (a ferramenta de autoria de som que acompanha o Game Studio).
Assim, agora é possível tratar os efeitos sonoros da mesma forma que uma textura ou um modelo 3D, simplesmente carregando o arquivo através de Content.Load. Este novo sistema é interessante porque permite fazer várias coisas com as músicas, inclusive tocar arquivos da biblioteca do usuário. Os formatos suportados são mp3 e wma (para músicas) e wave (para efeitos sonoros).
Neste pequeno tutorial eu vou mostrar como carregar e tocar músicas e efeitos sonoros nos jogos.
Para começar, crie um novo Windows Game. Depois vamos criar os atributos que irão guardar as instâncias das músicas. Nesta versão existem basicamente duas classes para trabalhar com sons, Song (canção) e SoundEffect (efeito sonoro).
A primeira classe serve para tocar as músicas do jogo. Apenas uma de cada vez pode ser executada (quando uma nova começa a tocar, a anterior pára) e é possível criar uma fila de músicas, em uma espécie de play list. A outra classe permite tocar efeitos sonoros, estes sim podem ter várias instâncias em execução ao mesmo tempo.
Para esta demonstração vamos criar uma instância de cada classe:
Song musica; SoundEffect efeitoSonoro;
Feito isso, carregamos as músicas dentro do método LoadContent da mesma forma que faríamos com uma textura, por exemplo. Só não esqueça de adicionar também os arquivos de som ao projeto, na subpasta Content (clique com o botão direito nesta subpasta e vá em Add->Existing Item).
musica = Content.Load("DrumLoop"); efeitoSonoro = Content.Load("Boing1");
Neste mesmo método já é possível colocar a música que foi carregada para tocar. Para fazer isso, utiliza-se o método Play da classe MediaPlayer. Observe que este método aceita tanto uma música (que começa a ser tocada imediatamente) quanto uma coleção de músicas (que ficam enfileiradas para serem tocadas uma após a outra).
MediaPlayer.Play(musica);
A classe MediaPlayer oferece alguns métodos e propriedades interessantes para lidar com as músicas, entre eles IsRepeating (para controlar a repetição), Volume (para aumentar ou diminuir o volume), e Play/Stop e Pause/Resume (para controlar a execução do arquivo). Para exemplificar podemos colocar a música para repetir:
MediaPlayer.IsRepeating = true;
Para tocar um efeito sonoro o processo é ainda mais simples, basta chamar seu método Play diretamente, sem necessidade do MediaPlayer. Vamos fazer então que o efeito sonoro seja tocado sempre que o usuário pressionar a barra de espaço. Para isso, adicione o seguinte código no método Update do jogo. Note que o efeito sonoro termina sua execução automáticamente quando chega ao fim do arquivo e várias cópias de um mesmo efeito podem ser tocadas ao mesmo tempo (ou várias instâncias de efeitos distintos).
if (Keyboard.GetState().IsKeyDown(Keys.Space)) { efeitoSonoro.Play(); }
Basicamente é isto. Com este exemplo simples fica demonstrado como trabalhar com músicas e efeitos sonoros no XNA 3.0 ficou bem mais simples. O projeto com o código-fonte e as músicas usadas neste exemplo está disponível para download aqui.