FMOD Ses Kütüphanesine Giriş

FMOD Nedir?

FMOD kullanımı kolay, birçok popüler ses ve müzik formatına destek veren bir ses kütüphanesidir. FMOD, aynı zamanda bilgisayarın kaynaklarını oldukça efektif biçimde kullanması ile de ünlenmiştir. Bu özelliğinden dolayı başta oyunlar olmak üzere çeşitli multişmedya uygulamalarında ses motoru olarak kullanımı yaygındır. FireLight firması tarafindan geliştirilen FMOD, ticari getirisi olmayan her türlü projede serbestçe kullanılabilmektedir. FMOD kütüphanesi www.fmod.org sitesinden indirebilirsiniz.

FMOD wav,mp2,mp3,ogg,raw,mod,s3m,xm,it,mid ses formatlarına destek vermektedir. Windows, WinCE, Linux, Macintosh, Playstation, XBox, GameCube platformları FMOD un kullanılabileceği platformlardır. MSVC, METROWERKS/CODEWARRIOR, WATCOM, BORLAND, LCC-WIN32, MINGW, CYGWIN gibi derleyiciler ile FMOD kütüphanesini kullanan projeler geliştirebiliriz.

FMOD 'un Genel Yapısı:

FMOD kütüphanesi ses kütüklerini 2 alt türe ayırır. Sıralı (sequenced) ses kütükleri (mod,s3m,xm,it,mid) ve sıkıştırılmış ses kütükleri (mp2,mp3,wav,ogg,raw). Bu iki alt türü farklı FMOD fonksiyonlarını kullanarak işliyoruz. Sıralı ses kütükleri ile ilgili fonksiyonlar FMUSIC_ ön eki ile başlayan isimlere sahipken, diğer kütüklerle ilgili fonksiyonlar ise FSOUND_ ön eki ile isimlendirilirler.

FMOD ile aynı anda birçok ses dosyasını çalabilirsiniz. Bu işlem ses dosyalarının ses kartının farklı kanallarını (channel) kullanılarak çalınması ile sağlanır. FMOD kullanıken ses dosyanızın hangi kanaldan çalınmasını istediğinizi belirtebilir yada FMOD un uygun gördüğü kanalı kullanmasına izin verebilirsiniz. Unutmamanız gereken kural; bir kanal aynı anda sadece bir ses dosyası tarafından kullanılabilmektedir. FMOD yapısı gereği birçok fonksiyonunu kanallar üzerinde gerçekleştirmektedir, dolayısı ile bir sesin kullandığı kanalı bilmek o sesi kontrol etmek açısından önem taşır.

FMOD 3 boyutlu ses kaynaklarını kullanmaya da destek vermektedir. Bu sayede ses donanımınızın desteklediği 3 boyutlu ses özelliklerini kullanabilirsiniz.

Çalınan ses ile programınızın işleyişi arasındaki senkronizasyonu sağlamak için de iki farklı yöntem bulunmaktadır. İster "callback mekanizması" nı kullanarak ses dosyasının içine gömülmüş belirli noktalarda programınızın uyarılmasını sağlayabilir, isterseniz de ses dosyasının çalınma esnasındaki pozisyonunu sürekli sorgulayarak (polling) programınızı ses ile uyumlu biçimde devam ettirebilirsiniz.

Mp3, ogg, wav gibi kimi sıkıştırılmış ses kütükleri çalınma esnasında bellekte oldukça fazla yer kaplarlar. Bellek kullanımını daha efektif hale getirebilmek için bu tarz kütüklerin ihtiyaç olduğu kadarını diskten belleğe alma yöntemi ile kullanabilirsiniz. Streaming denilen bu teknik FMOD tarafindan desteklenmektedir. Özellikle çok yer kaplayan arkaplan müzikleri bu yöntem ile oldukça az bellek kullanılarak çalınabilir.

Basit bir FMOD Uygulaması:

//Şimdi basit bir program ile FMOD kullanarak bir wav dosyasını çaldıralım.
//Öncelikle gerekli olan include ları yazıyoruz.

#include <stdio.h>
#include <stdlib.h>
#if defined(WIN32) || defined(_WIN64) || defined(__WATCOMC__)
    #include <windows.h>
    #include <conio.h>         // getch() için gerekli
#else
    #include <wincompat.h>
#endif

#include <fmod.h>
#include <fmod_errors.h>

//Şimdide satır satır programımızı inceleyelim:

int main(int argc,char **argv) {

   // ses dosyamızı sample belirteci ile göstereceğiz. FMOD tüm sıkıştırılmış
   // ses verilerini bu belirteç ile ilişkilendirmektedir.

   FSOUND_SAMPLE *sample;  

   // gerekli fmod.dll sürümününün sistemde olup olmadığını denetleyelim
   if (FSOUND_GetVersion() < FMOD_VERSION) {
      printf("Hata: fmod.dll in sürümü farkli! FMOD %.02f kullanıyor olmalıydınız!n", FMOD_VERSION);
      exit(1);
   }
   
   // bu fonksiyon ile fmod kütüphanesini etkinleştiriyoruz.
   // 44100Hz örnekleme frekansı, ve toplam 32 ses kanalı kullanacağımızı belirtiyoruz.
   if (!FSOUND_Init(44100, 32, 0)) {
      printf("%sn", FMOD_ErrorString(FSOUND_GetError()));
      exit(1);
   }
  
   // FSOUND_Sample_Load(...) fonksiyonu ile deneme.wav isimli ses dosyasını yüklüyoruz.
   sample = FSOUND_Sample_Load(FSOUND_UNMANAGED,"deneme.wav", FSOUND_NORMAL | FSOUND_HW2D, 0, 0);

   // yüklediğimiz ses verisini çalıyoruz. FSOUND_FREE parametresi ile FMOD un
   // uygun gördüğü bir ses kanalını kullanmasını
istediğimizi belirtiyoruz.
   FSOUND_PlaySound(FSOUND_FREE,sample);

   // bir tuşa basılana kadar bekleyelim
   getch();  

   // ses dosyası tarafindan kullanılan belleği sisteme geri veriyoruz
   FSOUND_Sample_Free(sample);
 
   // FMOD sistemini kapatıyoruz
   FSOUND_Close();

   return 0;
}

Bu programı MSVC kullanarak derleyebilmek için öncelikle içi boş bir "consol application" projesi oluşturun, daha sonra bu projeye bir c yada cpp dosyası ekleyin. Eklediğiniz dosyaya yukarıdaki kodu yazın. Project->Settings->Link bölümünden projenize fmodvc.lib kütügünü ekleyin. Ayrıca FMOD kurulumu ile gelen include ve lib dosyalarını derleyicinizin uygun dizinlerine kopyalayın.
include dosyaları için kopyalamada kullanacağınız dizin:
C:Program FilesMicrosoft Visual StudioVC98include
lib dosyaları için dizin:
C:Program FilesMicrosoft Visual StudioVC98lib

Programı derleyip çalıştırın. Deneme.wav isimli ses dosyamız şu anda çalınıyor olmalı.

Mod, mid, xm gibi sırali bir ses dosyasını çalmak için ise şu kod satırlarını kullanabilirsiniz:

FMUSIC_MODULE *mod;
mod = FMUSIC_LoadSong("deneme.mid");
FMUSIC_PlaySong(mod);

Çalınan Sesin Kontrol Edilmesi:

Çoğu zaman herhangi bir ses dosyasını sadece çalmak işimizi görürken, kimi zaman sesin çalınma şekli üzerinde bazı değişikler yapma ihtiyacı hissederiz. Örnegin ses düzeyini değiştirmek, sesi durdurmak, yeniden başlatmak, devamlı çalmasını sağlamak (looping), çeşitli efektler vermek gibi (echo, reverb...). FMOD ses kontrolü için oldukça geniş bir programlama arayüzü sunar. Bu kontrol yordamlarından bazılarını açıklamaları ile beraber inceleyelim.

FSOUND_SetMute(int channel, bool mute);
bir kanalı açıp kapar (mute/unmute)

FSOUND_SetPan(int channel,int pan);
kanal için panning derecesini ayarlamanızı sağlar. Hep sol kanal (hoparlör) sesi için 0, hep sağ kanal sesi için 255 kullanılır. 128 ile sol ve sağ kanala eşit ölçüde ses dağılımı sağlanır.

FSOUND_SetVolume(int channel,int volume);
kanalın ses seviyesini ayarlamanızı sağlar.0 sessiz, 255 en yükses ses düzeyini belirtir.

FSOUND_StopSound(int channel);
kanalda çalan sesi durdurur. Bu kanal artık başka sesler için kullanılabilir.

FSOUND_SetCurrentPosition(int channel,int position);
kanalda çalan sesin offset değerini (pozisyonunu) degiştirmenizi sağlar. Bu fonksiyon ile sesin istediğiniz kısmını çaldırabilirsiniz.

FSOUND_SetFrequency(int channel,int frequency);
kanalın örnekleme frekansını değiştirmeyi sağlar.

FSOUND_FX_Enable(int channel,int fxtype);
ön tanımlı bir ses efektinin kanala uygulanmasını sağlar. FMOD kullanarak kanala chorus, echo, reverb, distortion gibi birçok ses efekti verebilirsiniz. Efektlerin parametreleri FSOUND_FX_Set... komutları ile değiştirilebilir.

UYARI: Yukarıda açıklanan kontrol yordamlarından bazılarının işlevsel olabilmesi için uygulama kanalının duraklatılmış (paused) olması gerekmektedir. FSOUND_SetPaused(channel,true) fonksiyonu ile istediğiniz kanaldaki sesi durdurup daha sonra kaldığı yerden devam ettirebilirsiniz. Yukarıdaki fonksiyonlar FMOD yordamlarının sadece küçük bir bölümünü oluşturmaktadır. FMOD dökümantasyonunu inceleyerek tüm FMOD fonksiyonlarının açıklamalarına erişebilirsiniz. FMOD un temel  kullanımını kavradıktan sonra bu dökümantasyonu mutlaka incelemenizi tavsiye ediyorum.

Sonuç:

Örnek uygulamadan da gördüğünüz üzere FMOD kullanması oldukça kolay bir kütüphane. Bu dökümanda FMOD un özelliklerini çok sınırlı biçimde kullandık. CD çalma, kayıt, callback mekanizması, ayrıntılı dsp efektleri, ve 3 boyutlu ses gibi özellikleri konuyu karışık hale getirmemek için incelemedik. İstek olursa ileriki dökümanlarda bu özellikleri kullanmayı örnekleyebiliriz.

Sanırım bu kadar bilgi kısa sürede FMOD kullanıp projelerinize ses özelliği eklemeniz için yeterli olacaktır. FMOD kütüphanesi ile birlikte yeterli sayıda örnek kod ve tüm fonksiyonların açıklamalarını içeren bir döküman gelmekte. Bu kaynaklardan da faydalanarak kütüphaneyi en verimli biçimde kullanabileceğinizi düşünüyorum. Dökümanla ilgili her türlü düzeltme, istek ya da öneri için deniz@oyunyapimi.org adresini kullanarak benimle irtibata geçmekten çekinmeyin. Oyunyapimi.org forumlarını sorunlarınıza cevap bulmak ya da bilginizi paylaşmak için kullanabilirsiniz.

İlgili Web Siteleri:

FMOD sitesi: www.fmod.org
Oyunyapimi.org: www.oyunyapimi.org
M.Deniz Aydınoglu :: 2004 :: www.oyunyapimi.org




Bu haberin geldigi yer: oyunyapimi.org
http://www.oyunyapimi.org

Bu haber icin adres:
http://www.oyunyapimi.org/modules.php?name=Sections&op=viewarticle&artid=71