Memainkan WAV dan MIDI dengan DirectX Audio

March 9, 2006 at 2:50 pm | Posted in Code Samples, Tutorials | 2 Comments

by: Zamrony P Juhara

Pendahuluan

Artikel ini membahas cara menggunakan DirectX Audio untuk loading dan memainkan file WAV dan MIDI termasuk Inisialisasi objek performance, segmen dan audiopath. Artikel ini juga membahas mengenai cara melakukan mixing sehingga dua atau lebih sampel suara dapat dimainkan secara simultan, yang sangat tepat dipergunakan pada pengembangan game. Di bagian terakhir, semua informasi diwujudkan menjadi sebuah wrapper class yang dapat digunakan untuk memainkan file WAV dan MIDI dengan DirectX Audio.

Sekilas DirectX

DirectX saat ini telah menjelma menjadi API yang matang untuk digunakan dalam pengembangan game pada platform Windows. DirectX banyak didukung developer game, selain karena mempermudah pekerjaan developer game juga karena luasnya penggunaan Windows di seluruh muka bumi. Jaman dulu pada jaman keemasannya DOS, developer game harus menulis code untuk semua perangkat keras yang diakses game mulai kode untuk memprogram kartu grafis, sound card, joystick, mouse, keyboard sampai kode untuk game enginenya sendiri. Tambah rumit jika tiap hardware cara pengaksesannya berbeda. Pada jaman itu developer game umumnya pekerjaannya tidak fokus ke game enginenya saja.

DirectX diciptakan untuk mempercepat proses pengembangan aplikasi multimedia khususnya game. Dengan adanya DirectX developer lebih fokus ke game programmingnya dan bukan API programming lagi. Untuk sound programming DirectX memiliki beberapa komponen-komponen yakni DirectSound dan DirectMusic, tapi untuk versi 8 keatas kedua komponen ini dilebur menjadi satu menjadi DirectX Audio.

Kode yang nanti ditulis menggunakan unit-unit yang merupakan konversi header DirectX Audio yg dapat didownload di Project-JEDI. Terima kasih buat orang-orang di JEDI yg sudah susah-susah mengkonversi header DirectX SDK dari C++ ke Delphi.

DirectX Audio

Ok langsung saja. Untuk menggunakan DirectX Audio (dan yg lainnya) secara garis besar kita perlu melakukan tiga langkah:

1.Inisialisasi

1.1 Insialisasi COM

Karena DirectX Audio tidak lebih adalah sebuah COM server maka untuk memulai kita inisialisasi COM dengan memanggil fungsi CoInitialize. Fungsi ini dideklarasikan di unit ActiveX.pas dan mempunyai satu parameter, isi saja parameter ini dengan nil. Untuk mengetahui parameter apa ini silakan lihat di Windows API help. Contoh:

CoInitialize(nil);

1.2 Inisialisasi Performance

Permormance adalah istilah yg digunakan Microsoft untuk menyebut objek yg menangani pengaturan proses sound playback. Di satu aplikasi biasanya kita cuma butuh satu performance. Untuk menginisialisasi performance kita pergunakan fungsi CoCreateInstance dideklarasikan di unit ActiveX.pas. Contoh:

CoCreateInstance(
  CLSID_DirectMusicPerformance,
  nil,
  CLSCTX_INPROC,
  IID_IDirectMusicPerformance8,
  FPerformance);

Parameter:

  • CLSID_DirectMusicPerformance adalah GUID performance (deklarasinya di DirectMusic.pas).
  • CLSCTX_INPROC adalah in-process COM server DirectX.
  • IID_IDirectMusicPerformance8 adalah interface identifier performance DirectX 8 (deklarasinya di DirectMusic.pas).
  • FPerformance adalah variale yang akan menampung pointer ke objek performance yg diciptakan, tipenya IDirectMusicPerformance8 (deklarasinya di DirectMusic.pas).

Jika sukses FPerformance tidak nil. Selanjutnya kita bisa memanggil fungsi anggota FPerformance InitAudio contoh:

if (FPerformance<>nil) then
begin
  FPerformance.InitAudio(
    nil,
    nil,
    Handle,
    DMUS_APATH_SHARED_STEREOPLUSREVERB,
    64,
    DMUS_AUDIOF_ALL,
    nil);
end;

Parameter:

  • Parameter pertama dan kedua berturut-turut adalah instance IDirectMusic dan IDirectSound. Jika diisi nil ini berarti DirectX Audio akan menciptakan instance IDirectMusic dan IDirectSound otomatis secara internal.
  • Parameter ketiga adalah handle window yang digunakan untuk digunakan saat membuat instance DirectSound. Jika diisi nol berarti window foreground yang digunakan.
  • Parameter keempat adalah tipe audiopath. DMUS_APATH_SHARED_STEREOPLUSREVERB berarti audiopath biasa dengan stereo output dan reverb. Jika diisi nol maka aaudiopath yg digunakan adalah audiopath default.
  • Paramater kelima jumlah channel, yaitu 64 channel.
  • Paramater keenam fitur audiopath yang digunakan. DMUS_AUDIOF_ALL semua fitur.
  • Paramater ketujuh adalah pointer ke struktur data yang digunakan untuk mengatur setting synthesizer, isi nil untuk menggunakan default setting.

1.3 Inisialisasi Loader

Objek loader seperti namanya digunakan untuk me-load objek-objek DirectMusic seperti audio file atau resource agar dapat dimainkan oleh performance. Microsoft menyarankan kita menggunakan satu loader utk satu aplikasi. Agar penggunaan loader ini optimal disarankan untuk menciptakan sebuah loader dengan scope global dan baru membebaskan loader setelah aplikasi berakhir karena menurut M$ hal ini akan membuat object caching menjadi efisien.

Untuk menginisialisasi loader fungsi yang digunakan masih sama dengan performance

CoCreateInstance(CLSID_DirectMusicLoader,
  nil,
  CLSCTX_INPROC,
  IID_IDirectMusicLoader8,
  FLoader);

FLoader bertipe IDirectMusicLoader8

1.4 Loading Sound Sample dari File.

Untuk load sound sample kdari file kita gunakan fungsi anggota FLoader LoadObjectFromFile.
contoh:

FLoader.LoadObjectFromFile(
  CLSID_DirectMusicSegment,
  IID_IDirectMusicSegment8,
  wchFilename,
  FSoundSegment);

Parameter:

  • CLSID_DirectMusicSegment adalah GUID interface IDirectMusicSegment.
  • IID_IDirectMusicSegment8 adalah interface identifier IDirectMusicSegment8.
  • wchFilename adalah nama file yang diload bertipe PWideChar.
  • FSoundSegment adalah variable yang meanmpung pointer segment bertipe
  • IDirectMusicSegment8.
  • Segment adalah objek yg berisi data adudio yg dapat dimainkan oleh performance.

1.5 Download Segment

Agar segement dapat dimainkan performance kita perlu mendownload segment ke performance. fungsi yang kita gunakan adalah Download. fungsi ini fungsi anggota objek segment
contoh:

FSoundSegment.Download(FPerformance);

1.6 Menciptakan audiopath

Audiopath adalah istilah untuk objek yang menangani pengaturan aliran data suara. Jika kita ingin mengubah bagaimana suatu suara akan terdengar misal menambahkan filter, mixing dll, audiopath adalah tempatnya. Ketika kita menciptakan performance, DirectX juga menciptakan audiopath default. Kalau cuma untuk memainkan satu sample suara pada satu saat (seperti pada aplikasi audio player semisal winAmp) cukup menggunakan audiopath default. Tapi kalau untuk memainkan beberapa sample suara sekaligus pada satu saat seperti misal pada aplikasi game, tidak cukup hanya dengan audiopath default. Kalau kita menggunakan satu audiopath untuk memainkan beberapa sample suara, ketika kita memainkan sebuah sample, sample lain yang sebelumnya sedang dimainkan akan langsung di hentikan playbacknya, yang mana untuk aplikasi game sangat tidak cocok.

Agar tiap sample suara bisa dimainkan secara simutan (di-mix), kita perlu menciptakan audiopath untuk tiap-tiap segment.
contoh:

FPerformance.CreateStandardAudioPath(
  DMUS_APATH_SHARED_STEREOPLUSREVERB,
  64,
  TRUE,
  FAudioPath);

Parameter:

  • DMUS_APATH_SHARED_STEREOPLUSREVERB adalah tipe audiopath stereo output dan reverb.
  • 64 adalah jumlah channel.
  • TRUE adalah jika langsung ingin mengaktifkan audiopath.
  • FAudioPath adalah variabel yg menampung pointer ke AudioPath.

2. Memainkan Sample Suara dan menghentikan playback

Ini bagian yang paling menyenangkan. Untuk memainkan suara dari default audiopath kita menggunakan PlaySegment. Untuk memainkan segement dengan audiopath yang kita buat sendiri, kita menggunakan PlaySegmentEx. Kedua fungsi ini adalah fungsi anggota object performance.
contoh:

FPerformance.PlaySegmentEx(
  FSoundSegment,
  nil,
  nil,
  DMUS_SEGF_SECONDARY,
  0,
  FSegmentState,
  nil,
  FAudioPath);

Parameter:

  • FSoundSegment adalah segment yg ingin kita mainkan.
  • kedua adalah nama segment-pada versi 8 belum didukung isi saja nil.
  • ketiga adalah objek transition efek seperti fade out. kita isi nil karena pada aplikasi game ketika sebuah sound efek misal bunyi ledakan dimainkan kita ingin mendengarnya langsung.
  • DMUS_SEGF_SECONDARY adalah untuk memperintahkan directX Audio memainkan segment sebagai secondary segment. Dengan cara ini beberapa segment dapat dimix dan dimainkan simultan dengan segment lain yg saat ini sedang dimainkan. kelima adalah waktu untuk memulai playback, kita isi 0 agar segement dimainkan saat itu juga.
  • FSegmentState adalah status playback segment. Kalau ingin mengecek status playback seperti apakah sound sedang dimainkan kita cek dengan object ini, bertipe IDirectMusicSegmentState.
  • Ketujuh adalah segment lain yg ingin kita stop ketika FSoundSegment dimainkan. Kita set nil supaya segement-segement ain yg sedang dimainkan tetap seperti semula(tidak distop).
  • FAudioPath adalah audiopath yg kita pergunakan.

Untuk menghentikan suatu segment suara kita gunakan Stop atau StopEx anggota objek performance.

FPerformance.StopEx(FSoundSegment, 0, 0);

Parameter kedua dan ketiga kita set 0 agar playback dihentikan saat itu juga.

3. Finalisasi

Supaya resource bisa dibebaskan ketika aplikasi diakhiri kita panggil fungsi CloseDown (fungsi anggota performance).CloseDown akan meng-unload segement-segment yg sebelumnya didownload.

FPerformance.CloseDown;

Kode lengkap contoh aplikasi dan unit yang berisi wrapper class bisa didownload di codecentral borland.

Ok itu saja….

2 Comments »

RSS feed for comments on this post. TrackBack URI

  1. […] Artikel ini ditulis terinspirasi pertanyaan yang diajukan seorang member milis Delphindo tentang bagaimana memainkan beberapa sample suara pada speaker yang berbeda-beda. Untuk mengikuti artikel ini dengan lancar dan menjawab pertanyaan tersebut di atas, paling tidak anda telah memiliki pengetahuan tentang dasar bagaimana memainkan suara menggunakan DirectX. Anda bisa membaca artikel Memainkan File WAV dan MIDI dengan DirectX yang saya tulis sebagai pendahuluan. […]

  2. wah sekarang sudah ada milisi buat delphi maniac, pokoknya aku kasih acungan 4 jempol (tangan+kaki) buat siapa pun yang participasi buat web ini. Jangan lupa untuk Windows Api, kpn2 aku mo kirim source-code kesini (kalo boleh, lho). tapi gak bisa sekarang (lagi buat TA masih sibuk). sekali lagi acungan jempol buat loe2 pada.
    sel-x.kagebunshin no jutsu……….


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.
Entries and comments feeds.

%d bloggers like this: