audioio
atau
audiopwmio
yang mengimplementasikan suara latar dengan cara asli ke papan. Sayangnya, untuk Meowbit (dan secara umum untuk papan berbasis STM32) tidak satu pun atau modul lainnya diimplementasikan; tetapi dalam proyek open source, ini bisa diperbaiki. Temukan telur Paskah di foto Pertama-tama: mengapa ada dua modul berbeda untuk memutar suara dengan API yang sepenuhnya identik, dan salah satu atau yang lain didukung pada papan yang berbeda?
Seperti inilah ⅒ detik dari file
WAV biasa (16-bit) di editor audio (seperti Audacity) :
Nilai berubah dengan mulus dalam kisaran dari sekitar -0,2 hingga +0,2 "unit konvensional". Jika tegangan yang disuplai ke pengeras suara elektrodinamik diubah dengan cara yang sama , maka membran akan berosilasi dengan lancar - dari sekitar 0,2 dari penyimpangan maksimum yang mungkin dalam satu arah, menjadi 0,2 penyimpangan ke arah lain. Modul ini
audioio
mengimplementasikan pemutaran suara seperti itu - melalui DAC, modul ini dengan lancar mengubah voltase pada output yang terhubung ke speaker.
Tetapi di Meowbit, alih-alih pengeras suara, ada tweeter piezo yang murah, yang tidak mampu membelokkan membran ke posisi antara: ia dengan sangat cepat berpindah dari satu posisi ekstrem ke ekstrem lain, dan tetap di sana hingga transisi berikutnya. Anggap saja sebagai suara dengan resolusi satu bit per sampel:
Dengan cara ini, tidak mungkin untuk mentransmisikan perubahan volume suara, tetapi secara teoritis mungkin untuk mentransmisikan semua harmonisa yang ada di dalamnya - jika, secara paralel dengan pengurangan resolusi 32768 kali lipat, frekuensi sampling ditingkatkan dengan cara yang sama. jumlah (yaitu hingga ratusan megahertz). Tidak mungkin membran piezo tweeter dapat bergetar pada frekuensi tersebut; tetapi ini dapat digunakan untuk keuntungan Anda - jika Anda mempelajari cara mengaktifkan tegangan pada bel, saat membran setengah jalan, Anda dapat membuat suara dengan volume menengah! Pencarian paten menegaskan bahwa orang memang sedang menjajaki kemungkinan menggunakan tweeter piezo dengan cara ini. Kami tidak akan masuk jauh ke dalam hutan ini, dan akan meninggalkan tingkat pengambilan sampel WAV yang biasa yaitu puluhan kilohertz. Untuk musik di mana harmonik fundamental berada di wilayah kilohertz, ini sudah cukup; pidato, bagaimanapun, berubah menjadi suara yang hampir tidak bisa dipahami.Anda dapat membandingkan bagaimana sampel suara delapan detik yang saya gunakan, yang diputar dengan sounder piezo satu-bit, dianggap: pertama yang asli, lalu versi satu-bit, lalu rekaman Meowbit dengan mikrofon.
Modul ini
audiopwmio
mengimplementasikan pemutaran suara melalui keluaran digital menggunakan PWM : perekaman audio satu-bit berubah menjadi urutan penundaan antara mengalihkan
keluaran ke nilai yang berlawanan.
Jadi, rencana implementasi umum
audiopwmio
untuk Meowbit adalah sebagai berikut:
- Kami menerjemahkan rekaman audio yang dikirimkan oleh pengguna ke dalam format PWM (daftar penundaan antar sakelar);
- .
pulseio
, , – – Python .
Tidak segera jelas bahwa ada aspek lain dari implementasi yang harus ditangani - penyanggaan audio. Sampel pengujian 8 detik saya adalah 8 * 22050 * 2 ≈ 340 KB - tiga kali ukuran seluruh RAM Meowbit; oleh karena itu, itu harus dimuat ke dalam memori sepotong demi sepotong. Implementasi standar
audiocore.WaveFile
memuat file WAV dalam potongan 256 byte, yang sesuai dengan 128 sampel atau waktu putar 5,8 milidetik. Artinya rata-rata, setiap 5,8 ms
audiopwmio
harus meminta pengisian ulang buffer; tidak ada jalan keluar, kecuali untuk menempatkan panggilan ini di pengatur interupsi pengatur waktu yang sama - jika tidak, menggambar ulang layar dapat menunda pengisian buffer hingga seratus milidetik. Namun, ini tidak sepenuhnya menyelesaikan masalah: apa yang terjadi jika interupsi pengatur waktu terjadi saat layar menggambar ulang? Layar Meowbit terhubung melalui bus SPI , flash drive terhubung melalui itu, yang berarti masih tidak mungkin untuk mengakses flash saat menggambar ulang layar!
Hasilnya adalah sebuah implementasi
audiopwmio
mampu memutar rekaman audio dari memori (atau dihasilkan secara prosedural) dengan kualitas setinggi mungkin di Meowbit; tetapi rekaman audio dari file hanya diputar jika tidak ada panggilan simultan ke layar dan ke flash. Ini cukup untuk soundtrack game sederhana. PR dengan implementasi saya telah menunggu review selama lebih dari seminggu, dan
audiopwmio
tidak diketahui kapan Meowbit akan muncul di versi resmi CircuitPython; tetapi itu tidak menghentikan siapa pun yang ingin mengkompilasi CircuitPython untuk diri mereka sendiri dengan add-on saya.