quinta-feira, 17 de junho de 2010

Manipulação de áudio com XNA utilizando o XACT 1° Parte - Tutoriais “Como fazer...”

Tutorial de como fazer uma manipulação de audio com XNA........

1. Visão Geral

O framework do XNA permiti a reprodução e manipulação de sons através de uma ferramenta conhecida como XACT (Cross-Platform Audio Creation Tool), e também prove uma API bem simples que não necessita do XACT (no caso do XNA 3.0). Vejam abaixo a forma como o XACT trabalha com os arquivos de áudio:

Wave – È um arquivo de áudio com a extensão .wav.

Wave Bank – É um banco contendo vários arquivos wave agrupados em um só arquivo.

Sound Bank – É um agrupamento lógico de sons (“Wave banks”) e cues.

Cues – Permite ao programador efetivamente tocar os sons. É composto de um ou mais sons, e é referenciado através dos Sound banks.

O XACT através de sua interface funciona como um sistema de edição de conteúdos de áudio, que apesar de simples em certos aspectos, é poderosa o suficiente para criar efeitos interessantes nos sons de um jogo e facilitar a vida do desenvolvedor em nível de programação. O XACT permite o designer de áudio carregar arquivos wave em grupos, organizar os arquivos em cues que podem ser disparados por algum evento do gameplay, e ainda criar transições entre estes cues. O XACT também permite designers definirem variáveis que podem ser modificadas em tempo de execução (pela engine do XACT), para modificar uma determinada característica do som. Com esta ferramenta é possível, por exemplo, um grupo de sons de motor para um jogo de corrida, e através do uso de uma variável do XACT, fazer com que os sons do motor do carro aumentem ou diminuam o volume de acordo com algum evento.

1. Como criar um projeto no XACT

Bom, agora vem um pequeno tutorial de como criar um projeto no XACT, falar um pouco sobre sua interface, e adicionar uns arquivos wave (.wav) para que sejam utilizados em algum jogo.

1° Passo: No menu Iniciar do Windows, clique em Todos os Programas, clique em Microsoft XNA Game Studio 3.0, clique em Ferramentas e depois em Microsoft Cross-Platform Audio Creation Tool (XACT).

2° Passo: Para criar um novo projeto, clique no menu File, e então clique em New Project.

3° Passo: logo em seguida aparecerá uma tela onde você deverá inserir um nome para o projeto e o local onde ele deverá ser criado. Clique em OK. O projeto será criado.

4° Passo: Agora temos a tela principal do XACT com um projeto em branco. Agora na árvore de arquivos do lado esquerdo, clique com o botão direito do mouse em Wave Banks e em seguidaNewWave Bank. Um novo Wave Bank irá surgir na árvore com o nome padrão "Wave Bank".

5° Passo: O novo banco ainda estará selecionado caso você queira alterar o nome, aperteENTER para aceitar o nome padrão.

6° Passo: Para criar um Sound Bank o processo é o mesmo que o descrito acima, botão direito emSound Banks, e então clique em New Sound Bank.

7° Passo: Aperte ENTER para aceitar o nome padrão.

8° Passo: Para facilitar a execução dos passos seguintes organize a tela do XACT para permitir uma melhor visualização da tela deSounds Banks eWave Banks. Para isso clique em Windows, e então clique em Tile Horizontally. Veja como ficou:

9° Passo: Vamos agora adicionar arquivos wave (.wav) ao projeto. Para isso basta clicar com o botão direito do mouse na área branca da janelaWave Banks ou na ramificaçãoWave Bank da árvore ao lado esquerdo, e em seguida clique em Insert Wave Files(s).

10° Passo: Adicione um ou mais arquivos wave ao banco. A telaWave Bank ficará parecida com esta:

11° Passo: Agora para cada arquivo .wav adicionado noWave Bank, arraste o mesmo solte sobe o painel Cue Name na tela Sound Bank. Não é preciso fazer isso individualmente, basta selecionar todos os waves e arasta-los até o painel Cue Name.

O XACT irá automaticamente criar um novo cue, que será relacionado a um novo som que irá tocar o respectivo arquivo wave.

12° Passo: Para salvar o projeto, clique em File, e Save Project.

13° Passo: Já podemos construir o projeto para que possa ser utilizado, clique emFile, e entãoBuild para construir o projeto. Será então gerado o arquivo .xap (XACT Project File).

2. Tocando um som com XACT no Game Studio

Vou utilizar um exemplo que tinha pronto aqui para demonstrar como é fácil tocar um som no XNA usando o XACT, para isso precisaremos apenas inicializar a engine de áudio, carregar os bancos de som e wave (Sound Banks e Wave Banks), e tocar o som usando um objeto Cue. Para prosseguir é necessário que exista salvo um projeto do tipo .xap, que foi criado no capítulo anterior.

1° Passo: Inserir o projeto do XACT (.xap) no nosso projeto no Visual Studio.

· Com seu projeto do XNA carregado no Visual Studio, dê um clique com o botão direito emContent no painel do Solution Explorer.

· Vamos adicionar uma nova pasta, para isso clique em Add, clique New Folder, e então coloque o nome da pasta “Audio” (poderia ser qualquer nome, mas vamos ficar com esse).

· Agora mova o projeto do XACT (.xap) e suas respectivas pastas, que foram criados anteriormente, e o(s) arquivo(s) wave para dentro da pasta “Audio” que foi criada (faça isso no Windows explorer). Observe:

Obs: Caso a pasta Win eXbox não existam ainda, basta salvar seu projeto do XACT e dar um Build que elas serão geradas.

· Mais uma vez, dentro do XNA Game Studio, clique com o botão direito na pasta“Audio” dentro do painel do Solution Explorer.

· Clique emAdd, e Existing Item.

· Selecione o arquivo (.xap) no windows Explorer dentro da pasta [...Content/Audio] do seu projeto. O arquivo do XACT precisa ser adicionado ao nosso projeto, pois por padrão será processado pelo “Content Pipeline” e os “Wave Banks” e “Sound Banks” serão acessados automaticamente quando o jogo for construído.

O próximo passo é trabalhar o código da aplicação para testarmos o projeto do XACT. Para isto estou disponibilizando uma aplicação bem simples para fazermos os testes, a aplicação nada mais é que uma seta de mouse gigante que colide com uma aeronave estática, veja a imagem abaixo:

1° Passo: Primeiramente devemos declarar as variáveis que serão utilizadas:

// Variáveis de Audio

AudioEngine engine;

SoundBank soundBank;

WaveBank waveBank;

2° Passo: Quando o game iniciar, criamos um novo objeto AudioEngine. Na criação do objeto passamos como parâmetro o caminho do arquivo global de configurações gerado pelo projeto do XACT (neste caso disponível na pasta Content\Audio\Win).

// Inicialização dos objetos de audio

engine = new AudioEngine("Content\\Audio\\teste.xgs");

Obs: Lembre-se de verificar o caminho dos arquivos, pois nem sempre serão os mesmo deste artigo.

3° Passo: Ainda no Initialize() do jogo, devemos instanciar outros dois objetos:

soundBank = newSoundBank(engine, "Content\\Audio\\Sound Bank.xsb");

waveBank = newWaveBank(engine, "Content\\Audio\\Wave Bank.xwb");

Para cada wave bank no projeto do XACT, devemos criar um novo objeto WaveBank, e então passar oAudioEngine e o nome do arquivo do Wave bank gerado pelo XACT . Lembrem-se de adicionar a extensão .xwb (observe a imagem acima com os 3 arquivos).

Para cada sound bank no projeto do XACT, devemos criar um novo objeto SoundBank, e então passar o AudioEngine e o nome do arquivo do Sound bank gerado pelo XACT . Lembrem-se de adicionar a extensão .xsb (observe a imagem acima com os 3 arquivos).

Ainda no método Initialize do jogo, para tocarmos a música assim que o jogo inicie basta chamarmos o método PlayCue() do objeto soundbank, e passarmos como parâmetro o nome de algum cue criado no projeto do XACT.

// Toca o som.

soundBank.PlayCue("dk_remix");

Para finalizar, durante o update do jogo, chame o método Update do objeto engine (AudioEngine) para permitir a engine de áudio processar os dados de áudio.

protectedoverride void Update(GameTime gameTime)

{

Input Update

// Atualiza a engine de audio

engine.Update();

base.Update(gameTime);

}

PRONTO! Basta rodar o jogo e ouvir o resultado!!

2.1. Música como plano de fundo no XACT

Especificar um som como música de fundo permitir sobrescrever a musica de fundo com a música escolhida pelo usuário, sem interromper outros sons do jogo como efeitos sonoros. Isto é feito alterando a categoria dosoundbank no XACT como music. Arquivos de músicas geralmente são maiores que os arquivos com outros tipos de sons, então normalmente é feito o streaming destes arquivos. No XACT, é preciso criar e usar um Wave Bank de streaming para carregar a música, falaremos mais sobre isto em outro tópico.

1° Passo: Abra um projeto que já tenha sido criado no XACT, para isso clique duas vezes em um arquivo .xap ou dentro do XACT, escolha o menuFile, e então clique em Open Project.

2° Passo: Com o projeto carregado, dê um duplo clique em “Sound Bank” na árvore de navegação do lado esquerdo (escolha o sound bank onde se encontra a música). Isto fará com que seja exibido o painel do Sound bank.

3° Passo: Agora clique no som que você desejar colocar como música de fundo. Ao selecionar um som, será exibido um painel com suas propriedades do lado esquerdo do XACT.

4° Passo: Nodrop down Box selecione a opçãomusic, salve o projeto.

2.2. Como pausar ou parar um som

Para prosseguir é necessário que já exista um projeto no XACT criado e devidamente carregado no XNA Game Studio (siga o que foi feito nas etapas anteriores). Continuaremos utilizando o projeto do XNA do capítulo anterior.

1° Passo: Declarar uma variável do tipo Cue e outra do tipo KeyboardState para armazenarmos o último estado de entrada do teclado.

Cue cue;

KeyboardState oldState;

2° Passo: O método Initialize() sofrerá algumas pequenas modificações, desta vez para podermos tocar a música iremos utilizar um objeto do tipo Cue que funcionará como um “player” de música, gerenciando seu começo, pausa e fim. Veja abaixo como deve ficar:

protectedoverride void Initialize()

{

base.Initialize();

// Inicialização dos objetos de audio

engine = newAudioEngine("Content\\Audio\\teste.xgs");

soundBank = new SoundBank(engine, "Content\\Audio\\Sound Bank.xsb");

waveBank = new WaveBank(engine, "Content\\Audio\\Wave Bank.xwb");

// Iniciaiza o cue e toca o som.

cue = soundBank.GetCue("dk_remix");

cue.Play();

}

No método de Update() do jogo adicionaremos apenas uma linha, a responsável por chamar o método que irá atualizar o som do jogo baseado na entrada do teclado do usuário.Veja abaixo:

UpdateSoundInput();

Agora vamos ver como ficará o método responsável pelo gerenciamento do áudio:

/// /// Atualiza o controle de audio///

protectedvoid UpdateSoundInput()

{

KeyboardState currentState = Keyboard.GetState(PlayerIndex.One);

if (currentState.Equals(oldState))

{

return;

}

if (currentState.IsKeyDown(Keys.Space))

{

if (cue.IsPaused)

{

cue.Resume();

}

else if (cue.IsPlaying)

{

cue.Pause();

}

else

{

//Se estiver parado criado um novo cue

cue = soundBank.GetCue(cue.Name);

cue.Play();

}

}

if (currentState.IsKeyDown(Keys.S))

{

cue.Stop(AudioStopOptions.AsAuthored);

}

oldState = currentState;

}

Vamos explicar o que acontece no código acima, a idéia é bem simples.

1.span style="font:7.0pt "Times New Roman""> Inicialmente capturamos o estado da entrada do teclado para sabermos se o que está sendo pressionado.

2. O primeiro if testa se o atual estado é igual ao último estado capturado, para evitar uma captura em série de uma mesma tecla num mesmo frame do jogo. Sem isto, mesmo um rápido pressionamento de teclas pode resultar em eventos repetidos.

3. No segundo if testamos se a tecla de espaço esta sendo pressionada, se o som estiver pausado (), então tocamos, caso já esteja tocando damos uma pausa, se nenhuma destas duas situações for verificada é porque o som está parado, então criamos um cue novo.

4. E finalizando, no último if, caso a tecla S seja pressionada o som será parado.

2.3. Alterar o volume dos sons

Vamos mostrar agora como inicializar a engine de áudio e como usar categorias para mudar o volume da reprodução de um grupo de sons. As categorias controlam o volume de grupos de sons no XACT, estas categorias são coleções que podem armazenar uma ou mais referências para cues. Neste tópico trabalharemos com grupos de sons, mas para alterar o volume individual dos cues basta utilizar variáveis globais atreladas a parâmetros de controle em tempo de execução (RPC - Runtime Parameters controls). Não demonstrarei aqui como criar uma categoria, utilizaremos uma categoria (“Music”) já existente no projeto que criamos anteriormente.

1° Passo: Declarar as variáveis que serão utilizadas:

AudioCategory musicCategory;

// Volume da música

float musicVolume = 1.0f;

2° Passo: Para selecionarmos a categoria de sons cujo volume queremos alterar, chamamos o método GetCategory() do AudioEngine no método Initialize(), e passamos como parêmetro o nome da categoria que criamos no projeto do XACT.

//Seleciona a categoria

musicCategory = engine.GetCategory("Music");

3° Passo: Agora basta criar dentro do método UpdateSoundInput() o código responsável por capturar a entrada do teclado ( neste caso a seta direcional para cima (aumenta volume) e para baixo (diminui volume)) e setar o volume da categoria que foi calculado, bastando para isso chamar o método SetVolume(float) pertencente ao objeto da categoria e passar como parâmetro de entrada o valor em float do novo volume.

if (currentState.IsKeyDown(Keys.Up))

{

musicVolume = MathHelper.Clamp(musicVolume + 0.5f, 0.0f, 30.0f);

}

if (currentState.IsKeyDown(Keys.Down))

{

musicVolume = MathHelper.Clamp(musicVolume - 0.5f, 0.0f, 30.0f);

}

// Set the category volume.

musicCategory.SetVolume(musicVolume);

Nenhum comentário:

Postar um comentário