Usando sons em jogos Delphi
Os primeiros passos para obter resultados satisfatórios

Em nossos micros, freqüentemente nos deparados com arquivos de sons. São extensões as mais variadas, como MID, VOC, AU, SND, RAW, MAT, AIF, AFC, IFF, VOX, DWD, SMP, MOD,SDS, WAV, etc. Desta lista, aqueles que podem nos interessar mais de perto são: MID e WAV.

Os arquivos MID são formados basicamente por comandos MIDI, que algum instrumento deverá tocar. Pode ser o próprio computador. Geralmente encontramos MIDs nas páginas da Web, por serem arquivos pequenos e com uma qualidade de som razoável. Encontramos uma grande variedade de músicas neste formato, apesar de noventa por cento delas soarem como se executadas por um teclado made in Paraguai de R$ 30,00 (mas a culpa é da placa de som e não do arquivo). Esses arquivos são usados geralmente como música de fundo, em jogos mais sofisticados.

Na estrutura interna da máquina, o MID é uma coleção de pedaços de sons que são manipulados em relação à sua frequência de reprodução, produzindo assim as notas musicais daquilo que chamamos "instrumento". Esses "pedaços" de sons ou "samples" estão gravados na ROM do equipamento (placa de som, etc) e não temos acesso a eles, mas apenas ao conjunto de notas musicais que ele produz. É por isso que no formato MID não tem voz, mas apenas música instrumental.

O formato WAV, que é padrão no Windows (wave), é a gravação literal de um determinado som, bit a bit. Podemos dizer que a diferença entre um arquivo MID e um WAV é praticamente a mesma diferença entre uma imagem vetorial e uma imagem bitmap. O WAV registra tudo: instrumentos, notas, vozes, ruídos, etc e permite a manipulação total do seu conteúdo. Mas gera arquivos monstruosos, mesmo se usarmos estruturas compactadas, como por exemplo o MP3.

Mas que tipo de arquivo usar em nossos jogos? Depende do que se quer fazer. Se for necessário o uso de música, sem gastar muito espaço, então uma boa coleção de MIDs dá para o gasto. Músicas WAV são um problema: cada uma ocupa em média 10 megabytes se gravadas com uma qualidade média de reprodução. Quanto mais qualidade, mais espaço do HD vai embora.

Em nossos programas usamos geralmente, para os efeitos especiais, sons diversos e para as conversas dos personagens, o formato WAV. Não é muito complicado trabalhar com esse formato, já que ele é o padrão de sons adotado pelo Windows, mas "tocar" uma wave no Delphi requer um pouco de trabalho com o componente TMediaPlayer.

Este componente pode ser encontrado na seção System, da palette de componentes (de todas as versões do Delphi). É um dos componentes básicos e no entanto é um sofisticado e completo sistema de reprodução / gravação de sons. Inclui automaticamente todos os botões e funções para tocar, gravar, avançar, retroceder, pausar e "ejetar" o arquivo ou mídia usada. Na verdade, este componente pode "tocar" literalmente qualquer coisa do padrão Windows, como wav, mid, avi, etc.

Basta informar o nome do arquivo a ser executado e ajustar o componente para Open automático. que o botão Play (e todos os outros) funcionará sem nenhum código adicional.

Obviamente que em nossos jogos não estaremos cogitando da hipótese do jogador acionar ele próprio a reprodução dos sons. Isso deverá ser uma operação automática ou então associada a alguma outra operação e para tanto não necessitamos dos controles do componente. Normalmente, simplificamos sua aparência ao máximo, inclusive tornando-o invisível.

Em termos de programação podemos ter (em um botão, por exemplo):

begin
  MediaPlayer1.FileName:= 'Beep.wav';
  MediaPlayer1.Open;
  MediaPlayer1.Play;
end;

Onde após definir o nome do arquivo a ser "tocado", executamos a função Open que, na prática, corresponde a fazer o Load do arquivo, para em seguida executar o Play. Tanto quanto nas imagens, aqui também cabem considerações acerca de como organizamos a sequência dos sons, a forma de carregar esses arquivos para execução, etc.

Existe uma alternativa para a execução de arquivos WAV, sem a necessidade do componente TMediaPlayer. Basta acrescentar MMSystem na declaração uses da unit e usar, para a reprodução dos arquivos, o seguinte código:

var
  Nome: array[0..79] of char;
begin
  StrPCopy(Nome,'Beep.wav');
  sndPlaySound(Nome,snd_ASync);
end;

Ainda assim, essa não é a solução ideal para o uso elaborado de sons, onde podemos necessitar de mais de um tipo de arquivo sendo executado ao mesmo tempo. Mas, para uma boa parte das nossas necessidades, estas duas soluções são satisfatórias.

 
online