.:: Menu Rápido ::.

Linux | C/C++ | Downloads | SDL | [×]

quarta-feira, 12 de dezembro de 2007

Tocando música e sons com SDL_Mixer

SDL é uma biblioteca básica, mas possui muitas bibliotecas de apoio. Uma delas é a SDL_Mixer.
De acordo com alguns tutoriais que andei vendo por aí, a forma mais fácil de tocar música e efeitos sonoros em seu jogo feito em SDL é com SDL_Mixer.
Além de suportar mais formatos (wav, mp3, ogg, mid(Timidity instalado), ...) você não tem que se preocupar com a função callback que é utilizada na SDL.
Siga este passo a passo de como deixar o seu jogo mais divertido !!!

» Post Completo...

#include <SDL/SDL_mixer.h>
Mix_Music *musica = NULL; //- música de fundo
Mix_Chunk *bomba = NULL; //- efeito sonoro mixável.
Mix_Chunk *tiro = NULL;

Você deve inicializar e finalizar a SDL_Mixer assim como faz com a SDL:

void init(){
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
atexit(SDL_Quit);
screen = SDL_SetVideoMode( W, H, 32, SDL_SWSURFACE);
Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 1024 ); //- inicializa SDL_Mixer
atexit(Mix_CloseAudio);
}

Carrega o arquivo de música e os arquivos de som:

void carregar(){
musica = Mix_LoadMUS("007JamesBond.mid");
bomba = Mix_LoadWAV("bomba.ogg");
tiro = Mix_LoadWAV("tiro.wav");
}

Faz (uma única vez) a música tocar em loop:

Mix_PlayMusic( musica, -1 );

E chama os efeitos sonoros sempre que precisar:

Mix_PlayChannel( -1, bomba, 0 );
Mix_PlayChannel( -1, tiro, 0 );

Perceba que a principal diferença entre música e som é que música fica tocando em loop e som é um efeito sonoro que será mixado à musica sempre que for chamado.

*** O Exemplo ***
Este é o exemplo que criei para testar a SDL_Mixer:
Não chega a ser um teclado, mas a intenção foi boa ! Ainda não sei como melhorar, mas estarei estudando.
EDIT (23/12/2007): Mudei o buffer de 4096 para 1024. Isso acelerou a mixagem das notas musicais ao som de fundo.
Download: » código fonte

*** Onde Encontar ?! ***
Onde encontrar músicas e efeitos sonoros para meus jogos ?!
» Arcade Accurate (incluíndo o Pacman)
» Sunncity (mid's)
» Midiworld (mid's)
» Simply The Best
» Galbadia
» Find Sound (ou Google msm !)
No eMule uma busca por "midis" ajuda bastante:
Mas de 500 Midis Heavy Metal.rar [hash]
[Midi] Classical Piano Midis...zip [hash]
40000.mids.Nacional.e.Internacionais...rar [hash]

Uma maneira de aproveitar melhor tudo isso é saber manipular programas de audio.
Pra Linux temos:
» Audacity (sudo apt-get install audacity) - Para editar audio.
» Rosegarden (sudo apt-get install rosegarden) - Editor de arquivos midi e de partituras.
» Timidity (sudo apt-get install timidity) - Sequenciador midi. Sem ele não tem como ouvir midi no Linux. dica: $ timidity 007.mid -Ov 007.ogg - Salva saída no formato ogg.

*** Link's ***
Download: » código fonte
» SDL
» SDL_Mixer - Página do projeto
» Playing Sounds - Tutorial Lazy Foo
» OSG/SDL Tutorial 17 - Audio with SDL_Mixer
» SDL_Mixer Tutorial
» Utilizando áudio com SDL_mixer

---
Essa semana foi dura ! Aprendi muita coisa de uma vez !!!

4 comentários:

Vinícius disse...

O SDL_Mixer não funcionava corretamente com o ogg e mp3 até essa última versão. Havia leaks de memória, o código travava, era horrível.

A versão atual corrigiu esses e outros bugs. :)

Diogo_RBG disse...

A SDL_Mixer não funcionou com todos os arquivos ogg, mas tbm não travou nada !
Estou satisfeito com os formatos suportados, só queria entender o porque de demorar para executar efeitos sonoros.

Thales S. disse...

Olá kara gostei muito desse programa estou no primeiro ano de ciência da computação e estou gostando muito, já estou pensando em bolar um jogo p/ minha iniciação cientifica e esse programa vai me ajudar muito, Valeu!!

Diogo_RBG disse...

;)

Acho que você também vai gostar desse jogo em SDL: http://themanaworld.org/
Dá uma olhada em como é feito a animação de um sprite no TMW:
* http://themanaworld-br.googlecode.com/svn/tmwdata/graphics/sprites/monstro-cachorro.png
* http://themanaworld-br.googlecode.com/svn/tmwdata/graphics/sprites/monstro-cachorro.xml

Jogos 2D se constituem de:
* mapas criados por tiles
* animações por sprites
* efeitos especiais por partículas
Isso a parte de recursos é claro... a lógica do jogo pode envolver diversas coisas.

T++