JAKARTA — Seorang pengembang berhasil mengimplementasikan rutinitas audio pada ZX Spectrum yang memungkinkan pemutaran nada sederhana melalui speaker 1-bit beeper. Pekerjaan ini terinspirasi dari eksperimen sebelumnya pada Apple II, dan menunjukkan potensi teknik audio tingkat lanjut yang sebelumnya hanya dikenal pada IBM PC.
Rencana awal adalah mereplikasi teknik PC speaker canggih ke ZX Spectrum. Meski tidak sepenuhnya berhasil, hasilnya tetap menjanjikan—peneliti justru menemukan metode lain yang bekerja lebih baik, terutama dalam memutar akord melalui speaker 1-bit.
Multichannel Sound Lewat Speaker 1-Bit
Pencapaian utama minggu ini berfokus pada audio multisaluran melalui speaker 1-bit, yang pada dasarnya adalah teknik memainkan akord. Di samping itu, peneliti juga berhasil merekreasinya dari artikel PC Speaker tentang pemutaran PCM 1-bit sederhana dan bereksperimen dengan teknik PWM (Pulse Width Modulation) yang lebih canggih. Kedua pendekatan ini saling menginformasikan pekerjaan playback akord.
Perjalanan ini penuh dengan kegagalan dan keberhasilan. Peneliti mencatat kedua-duanya untuk pembelajaran, dan minggu ini memang menghasilkan lebih banyak kegagalan ketimbang hasil final.
Pulse Code Modulation: Konsep Dasar
PCM adalah konsep sederhana: gelombang diambil sampelnya sebagai serangkaian nilai antara 0 dan nilai maksimum, lalu nilai-nilai tersebut dikirim ke perangkat keras untuk dikonversi menjadi tegangan speaker. Semakin besar nilai maksimum, semakin halus kontrol amplitudo. Semakin cepat pengiriman sampel, semakin halus kontrol frekuensi.
Dalam pemrosesan sinyal, aturan fundamental menyatakan bahwa Anda tidak dapat menambil sampel gelombang dengan akurat jika frekuensinya lebih dari setengah laju sampel Anda. Gelombang PCM biasanya dijelaskan dengan jumlah bit per sampel dan laju sampel—sampel berkualitas tinggi mungkin 16-bit 44kHz, sementara banyak kasus dapat dilayani oleh sampel 8-bit dengan laju serendah 8 kHz.
Tantangan pada ZX Spectrum
ZX Spectrum dapat mengakses memorinya pada kecepatan sekitar 1MHz, memungkinkan pemutaran respectable 16kHz bahkan di bawah kontrol CPU langsung yang dihitung siklus. Namun speaker hanya bisa hidup atau mati—ini berarti PCM 1-bit, yang diharapkan terdengar cukup buruk dengan distorsi seperti ketika speaker diledakkan karena amplifikasi berlebih, namun terus-menerus dan bahkan pada volume rendah.
Model Spectrum berbeda memiliki kecepatan CPU yang sedikit berbeda. Menggunakan jam 48K yang berjalan flat 3,5 MHz untuk penghitungan siklus, dengan membagi 16.000 sampel per detik menghasilkan waktu tunggu 219 siklus antara penulisan. Itu jumlah waktu yang cukup nyaman.
Sampel akan mengonsumsi sekitar 2KB per detik, yang ketat pada sistem 48K namun tidak bencana. Masalah utama adalah distorsi suara. Implementasi teknik ini tidak menimbulkan tantangan khusus.
Pulse Width Modulation: Kualitas Lebih Baik
PWM sedikit lebih rumit namun menjanjikan kualitas audio jauh lebih baik. Pada level sinyal elektrik, data PWM mengirimkan pulsa 1-bit sekali setiap sampel, dan panjang pulsa menunjukkan kekuatan sinyal audio yang dimaksudkan pada titik sampel itu.
Bandingkan PCM, yang secara efektif mengirimkan nilai digital multi-bit melalui kawat untuk mencapai tujuan yang sama. PWM lebih analog daripada PCM, meski lebih agresif dalam 1-bit.
Secara fisik, ini memanifestasikan sebagai konsekuensi dari fakta bahwa sinyal elektrik dapat berubah dari 1 ke 0 dan kembali dalam hitungan nanodetik, namun speaker fisik yang terpasang pada perangkat memerlukan puluhan mikrodetik untuk benar-benar melakukan perjalanan antara status “masuk” dan “keluar”.
Dengan menghentikan sinyal pada berbagai titik dalam perjalanannya, kekuatan speaker total bervariasi dengan cara yang jauh lebih presisi-controllable daripada yang disediakan PCM 1-bit.
Pada IBM PC, speaker 1-bit terikat ke timer perangkat keras, dan audio berkualitas tinggi dapat dihasilkan dengan memberi timer data PCM 7-bit. ZX Spectrum tidak sepenuhnya membantu dalam hal ini, dan pengembang harus mengelolanya dengan penghitungan siklus. Meski gagal mencapai sistem PWM yang memuaskan pada Spectrum, peneliti memiliki beberapa petunjuk dan yakin teknik secara keseluruhan valid.
Teknik Timing Presisi pada Z80
Sebelum menggali detail kode, penting memahami apa yang diperlukan untuk delay timing presisi. Hitungan “T-State” Z80 jauh lebih besar dan lebih licin daripada siklus CPU pada 6502. Sementara dapat merakit instruksi untuk menunggu jumlah siklus apa pun pada 6502 secara trivial, panduan Z80 harus lebih bersyarat.
NOP sendiri adalah 4 siklus, begitu juga hampir setiap operasi 8-bit satu byte (yang jumlahnya banyak). Setelah sisa delay pendek dan kelipatan 4 siklus, Anda pada dasarnya selesai. INC HL adalah 6 siklus, dan instruksi 16-bit satu byte yang terstruktur serupa juga demikian.
Ini dapat menghilangkan perbedaan 2 siklus, atau dipasangkan untuk menunggu 12 siklus dengan dua byte kode sebagai gantinya dari 3.
LD A,n adalah 7 siklus bersama instruksi immediate 8-bit lainnya. Selama total tunggu cukup lama, ini memungkinkan akurasi siklus. Instruksi JP adalah 10 siklus bahkan ketika bersyarat, menjadikannya jauh lebih disukai daripada JR atau DJNZ untuk kode yang harus membuat keputusan dalam loop presisi-waktu. Itu masih memiliki tempatnya, meski.
Loop LD B,n; LBL: DJNZ LBL adalah loop terpendek yang dapat ditulis dan menghabiskan 13n+2 siklus. Untuk tunggu panjang, loop ini akan menjadi sebagian besar darinya, dan instruksi lainnya di atas akan menghilangkan ketidaknyamanan apa pun. Ini bukan sistematis persis, namun cukup untuk tujuan kami.
Rencana Implementasi Akhir
Rencana keseluruhan adalah mengemas 8 sampel ke setiap byte, dengan bit tinggi dimainkan terlebih dahulu. Dengan sampel 16-bit, Anda akan menginginkan 219 siklus antara setiap output. Input akan menempatkan pointer ke data input dalam HL dan jumlah byte sampel dalam DE, membuka jalan untuk implementasi audio yang benar-benar dapat digunakan pada mesin 8-bit legendaris ini.

📝 Tinggalkan Komentar
Komentar sebagai . Ditinjau admin sebelum tampil.