Dari musik satu bit - meowbit

Artikel sebelumnya dikhususkan untuk papan pelatihan Meowbit dan implementasi Python untuk itu diakhiri dengan penyebutan ketidakmampuan CircuitPython untuk memutar musik secara bersamaan dengan permainan: CircuitPython tidak mengizinkan penangan interupsi untuk ditulis dengan Python, dan tanpa ini, penundaan untuk menggambar ulang layar (sekitar 0,15 dtk) "menghentikan" suara ... Namun demikian, suara latar belakang sering dibutuhkan, dan untuk sebagian besar papan yang didukung (100 dari 189) CircuitPython menyertakan modul 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:



  1. Kami menerjemahkan rekaman audio yang dikirimkan oleh pengguna ke dalam format PWM (daftar penundaan antar sakelar);
  2. . 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.










All Articles