Filter MIDI dan DirectMusic

Filter MIDI dan DirectMusic mewakili perangkat yang mensintesis, menghasilkan, atau mengambil data musik MIDI. Aplikasi biasanya mengakses kemampuan perangkat ini baik melalui DIRECTMusic API atau melalui fungsi Microsoft Windows Multimedia midiOutXxx dan midiInXxx . Untuk informasi selengkapnya tentang antarmuka ini, lihat dokumentasi Microsoft Windows SDK.

Filter sintesis MIDI atau DirectMusic menerima sebagai input aliran MIDI yang terdiri dari peristiwa MIDI bertanda waktu. Filter menghasilkan salah satu dari berikut ini:

  • Aliran audio digital berformat gelombang

  • Sinyal audio analog yang dapat mendorong sekumpulan speaker

Filter output MIDI atau DirectMusic menerima sebagai input aliran MIDI yang terdiri dari peristiwa MIDI bertanda waktu. Filter menghasilkan pesan MIDI mentah ke modul suara MIDI eksternal.

Filter pengambilan MIDI atau DirectMusic mengambil sebagai input serangkaian pesan MIDI mentah dari keyboard MIDI atau perangkat MIDI eksternal lainnya. Filter menghasilkan aliran MIDI yang terdiri dari peristiwa MIDI bertanda waktu.

Satu filter MIDI atau DirectMusic dapat melakukan kombinasi dari tiga fungsi--sintesis, output, dan pengambilan--tergantung pada kemampuan perangkat yang diwakili filter. Misalnya, perangkat MPU-401 murni melakukan output dan pengambilan tetapi bukan sintesis.

MIDI Filter

Filter MIDI diimplementasikan sebagai pasangan driver port/miniport. Pabrik filter MIDI membuat filter MIDI sebagai berikut:

  • Ini membuat instans objek driver miniport MIDI.

  • Ini membuat instans objek driver port MIDI dengan memanggil PcNewPort dengan nilai GUID CLSID_PortMidi.

  • Ini memanggil metode IPort::Init driver port untuk mengikat driver miniport ke driver port.

Contoh kode dalam Pembuatan Subdevice mengilustrasikan proses ini. Driver port dan miniport berkomunikasi satu sama lain melalui antarmuka IPortMidi dan IMiniportMidi mereka.

Untuk mendukung output MIDI dan perangkat synthesizer, driver port MIDI berisi pengurut perangkat lunak yang menghasilkan pesan MIDI mentah ke driver miniport dengan resolusi timer satu milidetik.

DirectMusic Filter

Filter DirectMusic menyediakan superset fungsionalitas filter MIDI. Superset mencakup kemampuan tambahan ini:

  • Sumber daya DLS (suara yang dapat diunduh) yang berisi bentuk gelombang dan data artikulasi yang menjelaskan instrumen MIDI. Permintaan set-property KSPROPERTY_SYNTH_DLS_DOWNLOAD mengunduh sumber daya DLS ke filter.

  • Grup saluran untuk memperluas jumlah instrumen yang dapat dipilih. Struktur DMUS_KERNEL_EVENT , yang digunakan untuk mengemas setiap pesan MIDI bertanda waktu dalam aliran MIDI, menentukan grup saluran mana yang akan digunakan untuk pesan tersebut.

  • Stempel waktu 64-bit dengan resolusi 100 nanodetik untuk mendukung pengurutan MIDI perangkat keras. Struktur DMUS_KERNEL_EVENT menentukan stempel waktu resolusi tinggi untuk pesan MIDI.

Dengan grup saluran, jumlah catatan yang dapat diputar secara bersamaan tidak lagi terbatas pada 16 saluran spesifikasi MIDI asli. Ini hanya dibatasi oleh jumlah suara yang tersedia di synthesizer.

Filter DirectMusic diimplementasikan sebagai pasangan driver port/miniport. Pabrik filter DirectMusic membuat filter DirectMusic sebagai berikut:

  • Ini membuat instans objek driver miniport DMus (DirectMusic).

  • Ini membuat instans objek driver port DMus dengan memanggil PcNewPort dengan nilai GUID CLSID_PortDMus.

  • Ini memanggil metode IPort::Init driver port untuk mengikat driver miniport ke driver port.

Contoh kode dalam Pembuatan Subdevice mengilustrasikan proses ini. Driver port dan miniport berkomunikasi satu sama lain melalui antarmuka IPortDMus dan IMiniportDMus mereka.

Untuk mendukung perangkat synthesizer DirectMusic, driver port DMus berisi pengurut perangkat lunak resolusi rendah (satu milidetik) yang dapat menghasilkan peristiwa MIDI bertanda waktu ke buffer pengurut perangkat keras terlebih dahulu ketika dijadwalkan untuk dimainkan. Untuk mendukung perangkat output DirectMusic, pengurut perangkat lunak driver port juga dapat dikonfigurasi untuk menghasilkan pesan MIDI mentah pada saat mereka akan dimainkan.

Menghitung Perangkat MIDI dan DirectMusic

Saat menghitung perangkat input atau output MIDI melalui fungsi Windows Multimedia midiInXxx atau midiOutXxx , aplikasi hanya dapat melihat perangkat WDM yang driver miniportnya mengekspos pin MIDI. Ini adalah pin yang mengelola aliran MIDI mentah tetapi tidak memiliki dukungan untuk fitur canggih seperti DLS dan grup saluran. Namun, saat menghitung perangkat melalui DirectMusic, aplikasi dapat melihat perangkat WDM dengan pin MIDI dan pin DirectMusic. Pin DirectMusic mengelola aliran MIDI bertanda waktu dan mendukung DLS dan grup saluran.

Saat menerapkan driver miniport kustom, vendor perangkat keras biasanya menulis driver miniport MIDI atau driver miniport DMus, tetapi tidak keduanya. Driver miniport MIDI hanya dapat mengekspos pin MIDI. Namun, driver miniport DMus dapat mengekspos pin MIDI dan DirectMusic, yang menghilangkan kebutuhan untuk menulis driver miniport MIDI terpisah. Untuk contoh pin MIDI pada filter DirectMusic, lihat driver audio sampel Dmusuart di Windows Driver Kit (WDK).

Saat menentukan rentang data untuk pin MIDI atau DirectMusic, driver miniport MIDI atau DMus menentukan format utama jenis KSDATAFORMAT_TYPE_MUSIC dan subformat jenis KSDATARANGE_SUBTYPE_MIDI untuk pin MIDI atau KSDATARANGE_SUBTYPE_DIRECTMUSIC untuk pin DirectMusic. Contoh deskriptor rentang data untuk pin MIDI dan DirectMusic muncul di MIDI Stream Data Range dan DirectMusic Stream Data Range, masing-masing.

Instans pin MIDI pada filter MIDI mengekspos antarmuka IMiniportMidiStream . Instans pin MIDI atau DirectMusic pada filter DirectMusic mengekspos antarmuka IMXF .

Di Windows Me/98, DirectMusic terkadang menghitung perangkat MPU-401 yang sama dua kali. Alasannya adalah bahwa beberapa vendor perangkat keras mengekspos perangkat MPU-401 mereka baik sebagai perangkat WARISAN, pra-WDM MIDI dan sebagai perangkat WDM. Untuk perangkat warisan, DirectMusic menghitung perangkat MPU-401 yang mewakili jalur langsung dari DMusic.dll ke Ihvaudio.dll. Untuk perangkat WDM, DirectMusic menghitung perangkat MPU-401 yang sama melalui jalur sirkuit yang terdiri dari urutan komponen berikut:

  1. DMusic.dll

  2. DMusic16.dll

  3. MMSystem.dll

  4. WDMAud.drv

  5. WDMAud.sys

  6. Driver miniport vendor

Synthesizer MIDI yang muncul di panel kontrol multimedia Windows (Mmsys.cpl) akan memiliki nama yang sama dengan perangkat WDM.

Port yang Disediakan Sistem dan Driver Miniport

Beberapa driver miniport MIDI dan DMus yang disediakan sistem dibangun ke dalam driver sistem PortCls:

  • Driver miniport FMSynth menyediakan antarmuka ke perangkat MIDI yang mengimplementasikan sintesis FM bergaya OPL3.

  • Driver miniport UART mendukung perangkat MIDI dengan antarmuka perangkat keras MPU-401, tetapi driver ini sekarang usang (setelah Windows 98 Gold) dan hanya didukung untuk driver adaptor yang ada. Kode driver adaptor baru harus menggunakan driver miniport DMusUART (di Windows 98 SE dan Windows Me, dan di Windows 2000 dan yang lebih baru), yang menggantikan UART dan mengimplementasikan superset fungsionalitasnya.

Driver adaptor dapat mengakses driver miniport yang disediakan sistem dengan memanggil fungsi PcNewMiniport . Driver miniport FMSynth dan DMusUART juga disertakan sebagai driver audio sampel dalam Windows Driver Kit (WDK). Dengan memodifikasi kode sumber dalam sampel ini, vendor perangkat keras dapat memperluas driver untuk mengelola fitur kepemilikan perangkat mereka.

DMusUART adalah contoh driver miniport DMus yang mengekspos pin MIDI dan DirectMusic, tetapi tidak mendukung unduhan DLS atau pengurutan perangkat keras. Pin penyajian DirectMusic driver miniport memiliki simpul sintetis (KSNODETYPE_SYNTHESIZER) yang mendukung beberapa properti KSPROPSETID_Synth . Driver miniport mencakup dirinya dalam kategori KSCATEGORY_RENDER dan KSCATEGORY_CAPTURE, tetapi tidak dalam KSCATEGORY_SYNTHESIZER (karena tidak berisi synthesizer internal). Untuk detailnya, lihat contoh driver audio DMusUART di WDK.

Perhatikan bahwa di Windows XP dan yang lebih baru, driver port MIDI dan DMus menggunakan implementasi perangkat lunak internal yang sama. Ini berarti bahwa GUID CLSID_PortMidi dan CLSID_PortDMus setara saat memanggil PcNewPort. Aplikasi yang ditulis untuk versi Windows sebelumnya tidak akan melihat perubahan perilaku yang dihasilkan dari konsolidasi driver port MIDI dan DMus.