
Kisah tentang bagaimana saya secara tak terduga membeli synthesizer, memperbaikinya, menemukan cara kerjanya, dan menulis sebuah emulator.
Kisah ini dimulai saat festival
Chaos Constructions akhir pekan lalu Agustus 2019. Melihat melalui Avito di malam hari untuk mencari artefak yang menarik dari masa lalu, saya menemukan synthesizer P432 Formant yang murah. Itu terlihat cukup akrab untuk synthesizer digital: di bagian bawah ada keyboard dari 41 tombol (3,5 oktaf), di bagian atas ada tombol untuk memilih nada, menyalakan paduan suara dan efek serempak, serta menyesuaikan efek vibrato. Joystick dipasang di sebelah kiri keyboard, memungkinkan Anda untuk menggeser pitch ke atas dan ke bawah, serta menghubungkan vibrato dengan lancar.
Yang paling menarik bagi saya adalah synthesizer ini digital dan menghasilkan suara menggunakan metode wavetable, yaitu, pada saat menekan tombol, itu menghasilkan suara berdasarkan data tabular yang disimpan dalam chip ROM. Setelah berkenalan dengan sirkuit di Internet, menjadi jelas bahwa kontrol synthesizer dibangun pada mikroprosesor KP580VM80 (i8080) yang terkenal, dan suara disimpan dalam 8 chip ROM dengan volume total 8 * 2 = 16 Kb.
Synthesizer dibeli dan perlahan-lahan berangkat dari kota penjual ke kantor lokal perusahaan transportasi, dan saya terus mempelajari skema. Penjual menulis dalam iklan bahwa alat memiliki cacat yang memanifestasikan dirinya dalam bentuk mengi ketika Anda menekan lebih dari satu tombol. Lebih menarik lagi, pikirku. "Ini akan perlu untuk menemukan dan menghilangkan."
Tetapi motif utama untuk membeli adalah keinginan untuk berurusan dengan perangkat internal dan mengekstraksi sampel suara dari ROM synthesizer.
PENOLAKAN : Nama-nama komponen node dan sinyal synthesizer (selain yang ditunjukkan dalam "tanda kutip" dan dalam huruf BIG) diciptakan oleh saya dan mungkin berbeda dari apa yang dimaksudkan pengembang. Deskripsi pengoperasian node didasarkan pada pengetahuan saya (terbatas), materi dari Internet dan saran dari orang yang berpengalaman.
Memperbaiki
Ketika P432 [
2 ] membuat saya aman dan sehat, hal pertama yang saya lakukan adalah membukanya. Di dalam, aku tidak mengharapkan pemandangan yang sangat menyenangkan dari seikat kawat dan beberapa papan sirkuit tercetak.
Node kontrolPapan tempat tombol dan kontrol di panel depan disolder, serta indikasi mode operasi.
Node prosesorIni berisi mikroprosesor KR580VM80 dan chip lainnya dari kit 580, ROM 2 KB pada RF2, dua chip RAM statis dengan total kapasitas 256 byte (K541RU2). Juga, decoder dipasang di papan, yang mengalokasikan bagian dari ruang alamat untuk interaksi dengan keyboard, dengan tombol kontrol dan register, pada output yang sinyal kontrolnya dihasilkan untuk node generator.
Simpul Antarmuka MIDIItu diinstal di atas node prosesor dan terdiri dari ROM terpisah dengan rutinitas pengiriman pesan MIDI, logika halus dan dua sirkuit mikro besar: pengontrol interupsi VN59 dan antarmuka seri BB51. Untuk kontak TX / RX VN51, rangkaian implementasi loop arus midi standar dengan isolasi optocoupler tersambung.
Simpul paduan suaraDalam bentuk papan terisolasi dengan hanya input analog, output dan daya. Ini diimplementasikan pada sirkuit mikro KA528BR2 - saluran delay analog. Unit sangat bising, tetapi memberikan suara warna yang menarik.
Perakitan generatorModul utama synthesizer. Ini berisi 8 chip ROM masing-masing 2 KB, logika digital (register, adders), dua DAC, filter analog dengan parameter variabel dan stabilisasi termal. Node juga berisi generator jam yang dengannya operasi register node prosesor disinkronkan. Papan anak pada simpul ini memiliki papan VCO (voltage controlled generator), yang merupakan penyempurnaan pabrik dari revisi synthesizer selanjutnya.
Rakitan penyearah dan stabilizerCatu daya linier yang menghasilkan + 5V untuk daya logika dan + 12 / -15V untuk amplifier operasional. + 5V distabilkan oleh KR142EN5, radiator yang merupakan wadah logam dari synthesizer, dan + 12 / -15V adalah penstabil parametrik paling sederhana pada dioda dan transistor zener. Tegangan tambahan pasokan -5V untuk KR580VM50 dibentuk oleh dioda zener dari -15V langsung pada papan unit prosesor. Tanah analog dan digital dipisahkan secara terpisah dan hanya terhubung di blok ini.
Keyboard instrumenReed switch, tidak peka terhadap kecepatan, seperti pada synthesizer lain dari pabrik radio Kachkanar Formant.

Penghapusan simpul MIDI pada papan yang terpisah dengan ROM-nya disebabkan oleh kehadiran synthesizer lain di jalur P432 - "Formant MINI", yang tidak memiliki antarmuka MIDI dan efek HOR. Node prosesor MINI sedikit berbeda dalam firmware, dan simpul generator sama seperti pada P432.
Jadi, ketika saya menyalakan untuk pertama kalinya, saya melihat dua masalah: tingkat sinyal yang sangat lemah pada output linier dan suara yang telah disebutkan saat menekan lebih dari satu tombol pada suatu waktu. Perlu dicatat bahwa P432 adalah synthesizer polifonik, dan dapat memainkan secara bersamaan 4 suara (frekuensi) dari satu timbre. Dan dengan masuknya efek UNISON, jumlah suara yang disuarakan secara bersamaan meningkat menjadi 8, dua untuk setiap kunci.
Alasan untuk suara tenang ditemukan segera, output terbakar OU K544UD1A yang harus disalahkan.
Setelah menggantinya, instrumen mulai terdengar keras bahkan ketika headphone pasif terhubung ke output.
Tetapi dengan suara aneh, situasinya sangat tidak dapat dipahami, karena bahkan ketika tombol individual ditekan, suara nada tidak seperti demonstrasi P432 dari youtube.
Butuh waktu cukup lama untuk menemukan masalah, tetapi pada akhirnya itu terlokalisasi pada tingkat DAC utama. Bit input digital yang tinggi tidak cukup untuk mengenalinya sebagai logis 1, sehingga sinyal output analog terdistorsi. Pelakunya cerita ini ditemukan dan dihilangkan, setelah masalah diselesaikan. Semua nada mulai terdengar jelas dan tanpa masalah dengan beberapa ketukan.
Akan ada akhir dari sejarah, tetapi banyak waktu telah dihabiskan untuk perbaikan, jadi saya memutuskan bahwa kita tidak boleh berhenti di situ dan kita perlu mencari tahu:
- bagaimana proses sintesis suara
- apa yang disimpan dalam ROM unit generator
- cara kerja filter dan karakteristiknya
- di mana konfigurasi untuk setiap nada dan parameter amplop disimpan
Hasil dari pekerjaan ini adalah menjadi emulasi perangkat lunak P432 menggunakan data dari ROM asli.
Perakitan generator
Bentuk gelombang pada output DAC utama dari unit generator dibentuk oleh prinsip sintesis digital langsung (DDS) [
1 ]. Sinyal analog yang diterima dilewatkan melalui filter low-pass, kemudian, jika perlu, dicampur dengan output rakitan paduan suara, diamplifikasi oleh amplifier output, dan diumpankan ke output linear. Filter di P432 dibuat sesuai dengan skema yang sebelumnya digunakan dalam synthesizer Polyvox [
3 ].
Diagram menunjukkan unit generator dan blok fungsional utamanya. Panah oranye menunjukkan input dan output sinyal digital eksternal, sinyal hitam-digital di dalam modul, sinyal biru-analog.
Pertama, pertimbangkan input dan output:
- Input "Frekuensi" (11 bit) - untuk setiap suara, termasuk serempak, nilai yang sesuai dengan tombol yang ditekan atau catatan MIDI berasal dari node prosesor.
- Input amplifier (8 bit) βnilai amplop untuk amplitudo sinyal.
- Input "Filter" (8 bit) - nilai amplop dari frekuensi cutoff filter.
- Input "Kontrol" - (8 bit) - 3 bit paling signifikan bertanggung jawab untuk pemilihan bentuk gelombang, 2 bit untuk offset filter, 2 bit untuk level kualitas filter Q (resonansi) dan bit terakhir menentukan apakah efek UNISON aktif atau nonaktif.
- Output "Address" (3 bit) - bertanggung jawab untuk sinkronisasi dengan node prosesor.
Sekarang mari kita lihat bagaimana blok utama dari simpul bekerja.
Sirkuit sinkronisasi dengan bantuan multivibrator, elemen penghitung dan logika menghasilkan pulsa kontrol untuk berbagai modul unit generator dan memberikan nomor suara saat ini ke "Alamat" keluaran. Ketika mode "Alamat" UNISON aktif, dibutuhkan nilai [0,1,2,3,4,5,6,7] dan saat tidak aktif: [0,2,4,6]. Frekuensi osilator master dapat diubah sebagian kecil dengan tombol penyesuaian di panel depan dan joystick di sebelah kiri keyboard.
Diagram waktu dari pulsa jam. Penjelasan: Serempak - log. 0 level aktif, FA0-2 - output "Alamat", DD8-12 - register akumulator fase, DD33-35 - daftar total suara, DD36-37 - register DAC.
Bagian digital papan generator untuk masing-masing dari 4 (8) suara secara bersamaan dengan perubahan nilai output "Alamat" melakukan operasi berikut. Dari simpul prosesor input "Frekuensi" menerima nilai frekuensi sinyal. Nilai linear dari frekuensi dikonversi ke fase kenaikan oleh decoder pada ROM. Peningkatan tersebut dijumlahkan dalam akumulator fase (20 bit), terdiri dari penambah dan RAM 8 kata. 9 bit tertinggi dari jumlah diumpankan ke input alamat dari ROM bentuk gelombang. Area ROM tertentu dipilih oleh tiga bit paling tidak signifikan dari input "Kontrol". 10 bit dari output ROM dijumlahkan dengan nilai pada input "Amplifier" dan diumpankan ke input ROM penskalaan, yang menghasilkan kode bipolar untuk DAC. Output jatuh ke buffer akumulasi, dibangun di atas adders dan register, yang secara berurutan menjumlahkan nilai kode dari semua 4 (8) suara. Pada akhir setiap siklus, kode terakhir dikunci oleh register penyimpanan dan sampai ke DAC 12-bit. Frekuensi mengeluarkan kode pada DAC adalah frekuensi sampling sinyal dan untuk P432 adalah sekitar 33 kilohertz. Menurut Nyquist, frekuensi suara maksimum yang tersedia untuk generator P432 adalah sekitar 16,5 kHz.
Jika timbre yang dipilih membutuhkan perubahan dinamis dari parameter filter low-pass, maka nilai amplop adalah output ke input Filter, yang, melewati DAC 10-bit, membentuk tegangan kontrol untuk filter op-amp. Filter low-pass dibuat sesuai dengan filter non-kondensor dari filter state variabel dan mencakup sirkuit stabilisasi suhu, blok untuk mengubah faktor Q dari Q, dan bias awal.
Bagan waktu ini menunjukkan dua periode diskritisasi papan generator. UNISON tidak aktif. Input frekuensi (Freq_in) secara sinkron dengan perubahan alamat menerima nomor frekuensi dari empat kunci yang berbeda. Tetapi hanya dua yang terakhir yang ditekan (Volume_in = 0xFF). Pada saat yang sama, nilai konstan (Filter_in = 0x60) dikeluarkan untuk input "Filter". Kode terakhir adalah input ke DAC (DAC) setelah masuk ke register penyimpanan (DD36-37).Untuk termasuk UNISONsemuanya terlihat sama, hanya input "Frekuensi" yang menerima sepasang angka: untuk suara utama dan serempak.
Catatan: hanya satu periode ditampilkan.

Penjelasan lebih rinci tentang rakitan generator
Di bawah ini adalah detail dan diagram skematik listrik untuk mereka yang ingin memahami perangkat synthesizer secara lebih rinci. Sirkuit ditemukan di Internet, meskipun manual operasi [
4 ] dan rangkaian lengkap kertas [
5 ] dilampirkan ke synthesizer saya. Orang baik membagikan arsip dengan semua ROM dalam satu forum, tetapi ternyata ada kesalahan pada salah satu file, jadi saya harus berhenti berlangganan masing-masing ROM dan membandingkannya dengan firmware di arsip.
Perlu dicatat bahwa selama produksi P432, pabrikan mengeluarkan beberapa revisi papan synthesizer untuk meningkatkan karakteristik teknis, yang mungkin berbeda dari skema revisi pertama yang disajikan di bawah ini.

- ROM konversi penambahan-frekuensi - DD1-2, dijalankan pada dua 573RF2, berisi tabel korespondensi dari nilai frekuensi linier dengan kenaikan fase eksponensial. Secara grafis, isinya terlihat seperti ini

Selaras dengan perubahan nilai pada "Alamat" keluaran, simpul prosesor mengeluarkan nilai frekuensi 11-bit dari suara yang sesuai ke input "Frekuensi", yang dikonversi ke peningkatan 16 bit.
Jika kita mempertimbangkan isi dari 16 kata pertama dari DD1-2, maka beberapa angka aneh ditulis di sana yang sepertinya tidak digunakan dalam sintesis suara: - Akumulator fase - terdiri dari register DD3-7 (561IM1) dan register DD8-12 (561IR11). Adders termasuk dalam rantai dengan total kapasitas 20 bit. Blok register memungkinkan Anda untuk menyimpan delapan nilai fase sinyal 20-byte. Input alamat register baca / tulis terhubung ke bus "Alamat". Inklusi ini memungkinkan Anda untuk menerima nilai sebelumnya pada output dari pulsa jam dan menyimpan nilai saat ini dari input. Ini memastikan akumulasi fase secara terpisah untuk setiap synthesizer suara. Tinggi 9 bit dari output register diumpankan ke input alamat dari ROM bentuk gelombang.
- Bentuk gelombang ROM - DD13-14, DD18-19 (5732) berisi tabel delapan bentuk gelombang yang dapat disintesis oleh rakitan generator. Area memori tertentu dan sepasang ROM dipilih oleh bit S0-S2 dari sinyal "Kontrol". Di bawah deskripsi masing-masing sinyal, 512 kata ditetapkan dengan kapasitas bit 11 bit. 10 bit paling signifikan memiliki tujuan utilitas, menunjukkan polaritas sinyal: 1-positif, 0-negatif. Penampilan bentuk gelombang diberikan dengan mempertimbangkan pembalikan nilai negatif:
- Envelope Adder - 8 Bit amplop (bergeser ke kiri sebanyak 2 bit) diterima pada input Amplifier, yang dijumlahkan pada elemen DD23-25 ββ(561IM1) dengan 10 bit urutan terendah dari output ROM gelombang. Amplop ini memiliki 4 fase: Serangan, Pembusukan, Mempertahankan, Rilis, yang dibentuk oleh unit prosesor secara terpisah untuk masing-masing dari 4 suara utama tergantung pada waktu tombol ditekan / dilepaskan.
Contoh amplop untuk nada 00: serangan cepat ke 255 terlihat jelas, lalu penurunan untuk mendukung level 239, lalu penurunan level yang halus, diakhiri dengan pelemahan tajam ke 0 saat Anda melepaskan kunci. Pada sumbu horizontal adalah waktu dalam detik, pada sumbu vertikal adalah nilai input "Amplifier".
Nilai-nilai dalam synthesizer ROM dipilih sedemikian rupa sehingga pada 0 pada input "Amplifier", output dari DAC juga akan memiliki level sinyal nol, terlepas dari kenyataan bahwa semua sirkuit perantara secara konstan mengubah nilai-nilai variabel dan menghasilkan sinyal yang berbeda. - ROM penskalaan, terdiri dari DD27-28 (5732), berisi kurva untuk mendapatkan kode sinyal bipolar sesuai dengan nilai bit orde tinggi dari bentuk gelombang. Dalam bentuk grafis, isi ROM terlihat seperti ini.

Jika bit ke-10 adalah 1, maka nilai dari output DD28 + 256 digunakan, dan jika 0, maka DD27 + 1. - Akumulator suara pada DD30-32 (561IM1) dan register DD33-DD35 (5619) mencampur nilai-nilai kode semua suara sebelum mengeluarkan ke DAC. Setelah memproses kode suara terakhir, nilai yang diterima dipindahkan lebih jauh ke register penyimpanan, dan register adder diatur ulang ke nol.
Contoh: Seperti disebutkan di atas, jika "Amplifier" = 0, dan nilai amplitudo maksimum yang mungkin pada output ROM bentuk gelombang (1 << 10) -1 = 1023, maka pada output dari ROM penskalaan kita akan mendapatkan 0 + 256 atau 255+ 1 tergantung pada 10 bit dari gelombang, yang memberikan total 256 * 8 = 2048 dan sesuai dengan 0 pada output DAC. - Register penyimpanan pada elemen DD36-37 (555TM9) menerima dan menyimpan nilai kode pada output selama interval sampling. Frekuensi sampling dari simpul generator kira-kira sama dengan 33000 Hz.
- DA38 DAC (534PA1) - mengubah nilai 12-bit menjadi sinyal bipolar analog, kode 2048 sesuai dengan analog 0.
- Filter low-pass - dibangun sesuai dengan skema yang dikembangkan oleh Vladimir Kuzmin untuk synthesizer Polivox, namun, simpul untuk stabilisasi termal dari arus kontrol filter OA telah ditambahkan ke P432. Selain itu, ini diambil dari Polivox yang sama, di mana ia digunakan untuk menstabilkan frekuensi generator. Di situs penulis, Anda dapat menemukan instruksi tentang cara mengkonfigurasi simpul ini [ 6 ].
Sudah banyak yang menulis tentang filter itu sendiri, jadi kita bisa melakukannya tanpa detail.
Kontrol filter didasarkan pada DAC 10-bit (572PA1), input yang merupakan sinyal "Filter" 8-bit, yang merupakan amplop filter, dan tergantung pada timbre itu bisa menjadi nilai konstan, dan umumnya sama dengan nol. Parameter filter juga dipengaruhi oleh nilai 4 bit dari sinyal "Kontrol": F0-F1 menetapkan offset dari tegangan output DAC, dan Q0-Q1 bertanggung jawab atas faktor kualitas (level resonansi) filter. - Setelah filter, sakelar dipasang yang memungkinkan Anda mengaktifkan pencampuran dengan sinyal utama salinannya diproses oleh efek HOP. Pada modifikasi awal P432, saklar yang sama digunakan untuk mematikan output suara ketika tidak ada tombol yang ditekan. Tetapi dalam revisi kemudian ini ditolak, mereka mulai memotong jalan, melempar kabel dan menambahkan elemen baru ke sirkuit.
- Amplifier - meningkatkan level sinyal output ke 250mV.
Konfigurasi dan simpul CPU
Jadi, kami menemukan generatornya. Sekarang tinggal memahami dari mana semua sinyal kontrol berasal dan di mana parameter yang menggambarkannya disimpan.
Pada awalnya, saya berencana untuk menghapus kesedihan semua sinyal kontrol oleh penganalisa logika dan menghasilkan algoritma untuk menggambarkannya. Sebagai contoh, amplop dari amplifier dan filter dapat dijelaskan oleh fungsi linear piecewise, yang membutuhkan sejumlah parameter.
Dengan input "Frekuensi", itu juga cukup untuk merekam nilai frekuensi dari satu kunci untuk setiap timbre, dan menghitung semua yang lain berdasarkan itu.
Menurut instruksi manual, P432 memiliki keyboard 41 tombol dengan volume 3 dan 5/12 oktaf dengan kisaran C1-E4 dalam notasi ilmiah atau C1-e1 dalam notasi Helmholtz. Namun, dalam praktiknya (untuk nada 00), berdasarkan korespondensi A4 = 440 Hz, ternyata kunci A di oktaf kiri kedua menghasilkan suara frekuensi ini, dan ini sudah memberikan kisaran C3-E6. Ternyata nanti, tergantung pada nada aktif, kisaran frekuensi yang direproduksi dapat bervariasi, bergeser 1 atau 2 oktaf.
Saya juga mencatat nilai byte dari input "Kontrol" oleh penganalisis logika untuk semua nada yang mungkin dan membawanya ke piring.Daftar Suara dan Nilai Input Kontrol Jelas bahwa semua parameter konfigurasi ini harus disimpan di salah satu ROM synthesizer, dan setelah sedikit pencarian, mereka ditemukan di bagian kedua firmware DD16 pada node prosesor. Biarkan saya mengingatkan Anda bahwa volume ROM 573RF2 adalah 2048 byte.
1024 byte area konfigurasi mudah dibagi menjadi 32 nada, mengalokasikan 32 byte untuk pengaturan masing-masing timbre. Saya menghabiskan banyak waktu mencari korelasi antara pengaturan nada dan fase sebenarnya dari amplop, frekuensi suara, dan banyak lagi. Saya harus melihat banyak kesedihan dari analisa logis.Hasilnya adalah tabel seperti itu. Seperti dapat dilihat dari tabel, semua nilai dapat dibagi menjadi empat kelompok: deskripsi amplop input "Amplifier", amplop input "Filter", byte input "Kontrol" dan byte yang bertanggung jawab atas frekuensi suara utama dan UNISON pada input "Frekuensi".Mari kita perhatikan lebih detail menggunakan contoh amplop amplifier, yang pertama kali saya bahas. Amplop Filter dibentuk sama dengan pengecualian beberapa nada yang diperlukan untuk menggunakan hardcode, karena itu tidak mungkin untuk mendapatkan amplop yang benar secara berbeda.Parameter dengan akhiran * _dt menentukan delta perubahan tingkat sinyal dari fase yang sesuai, misalnya, untuk nada 00: A_min = 0, A_dt = 48 dan A_max = 255. Ini berarti bahwa nilai awal Serangan 0 harus ditambah 48 hingga mencapai 255. Untuk fase Musim Gugur, nilai D_dt harus dikurangi dari A_max ke tingkat S_lvl, jika S_ft> 0, maka level Dukungan akan berkurang dengan setiap interval S_ft sebesar 1, disimulasikan suara memudar dengan lancar. Parameter R_dt menunjukkan delta fase Atenuasi: level amplop saat ini harus dikurangi dengan R_dt setiap interval waktu hingga mencapai level 0. Dt sebenarnya adalah 1 jika nilai parameter * _dt <= 1 dan nilai * _dt dalam kasus lain.Parameter * _ft menentukan waktu di mana nilai harus tetap tidak berubah, semacam interval pengambilan sampel untuk amplop. Secara empiris, ditemukan bahwa nilai nol parameter ini sesuai dengan ~ 100 periode pengambilan sampel DAC atau ~ 3 ms. Untuk nilai yang lebih besar dari nol, waktu harus dihitung menggunakan rumus int (256 / * _ft) * 100 , yaitu * _ft adalah pengali untuk interval dasar 100 periode DAC.Ilustrasi menunjukkan semua opsi amplop. Di sisi kanan itu digandakan dengan diskritisasi eksplisit untuk pemahaman yang lebih baik dari esensi parameter * _ft / * _ dt.
Byte "Manajemen" di area konfigurasi bertepatan dengan apa yang saya terima secara empiris menggunakan penganalisis logika.Frekuensi byte menentukan nilai input Frekuensi. Seperti yang telah disebutkan di atas, synthesizer dapat memutar 4 suara secara bersamaan (polifoni), yang masing-masing, ketika UNISON dihidupkan, dapat ditambahkan bersamaan dengan generator lain dengan sedikit detuning atau offset dari suara utama dengan 1-2 oktaf.Frekuensi dikodekan dalam dua byte: FREQ_1, FREQ_2 untuk utama dan FREQ_u1, FREQ_u2 untuk serempak. Formula yang diturunkan secara eksperimental untuk menghitung nilai frekuensi untuk note A dari oktaf kedua keyboard P432.freq_offset = {4:0xd0, 5:0x90, 6:0x50} freq = (config['FREQ_1'] << 8) + freq_offset[config['FREQ_1']] + config['FREQ_2']
Contoh untuk nada 00, di mana: FREQ_1 = 6, FREQ_2 = 8, kita dapatkan: 6 * 0x100 + 0x50 + 8 = 0x658, yang konsisten dengan data penganalisa logika untuk semua nada. Untuk serempak, perhitungannya sama.
Perlu dicatat bahwa untuk nada 00, nilai 0x658 sesuai dengan frekuensi 440 Hz atau catatan A4.
Secara eksperimental ditetapkan bahwa interval "Frekuensi" untuk tombol yang berdekatan (termasuk hitam) adalah 16 (0x10) unit. Oleh karena itu, jika kita mengetahui nilai untuk kunci ke-22 di sebelah kiri (A dari oktaf kedua) - 0x658, maka kita dapat dengan mudah mendapatkan nilai untuk yang paling kiri (No. 1): 0x508 dan yang paling kanan (No. 41): 0x788.
Berdasarkan ini, Anda dapat menghitung kisaran keyboard dan frekuensi yang direproduksi untuk nada yang berbeda. Kolom "Frekuensi" hanya akan benar untuk bentuk gelombang sederhana.
Di atas lebih dari cukup untuk membuat emulator P432, jadi mari kita beralih ke itu.
Membuat emulasi P432 dengan Python
Saya pikir akan lebih baik untuk memisahkan penyimpanan konfigurasi dan generasi suara, sehingga dua kelas utama dibuat:
- P432data, bertanggung jawab untuk memuat nilai dari gambar ROM dan membawa konfigurasi nada ke bentuk yang nyaman untuk digunakan;
- P432, berisi metode untuk membuat bentuk amplop dan benar-benar menghasilkan sampel digital.
Saya tidak akan membahas P432data secara detail, kode sumbernya dapat dilihat di github.
Tetapi metode P432 dipertimbangkan secara lebih rinci.
Yang utama, tentu saja, adalah
gen_samples dengan parameter yang menunjukkan jumlah sampel yang harus dikembalikan. Dalam metode ini, pemrosesan sinyal dari penerimaan nilai pada input "Frekuensi" ke output ke DAC dibuat sedekat mungkin dengan prototipe. Pada prinsipnya, dengan fokus pada skema P432, Anda dapat dengan cepat menemukan padanan Python dari modul-modul perakitan generator. Satu-satunya hal yang harus ditambahkan secara eksplisit adalah pengurangan variabel ke dimensi yang diberikan: 20 bit untuk akumulator fase, 11 bit untuk amplop adder, dan 12 bit untuk pemilih suara. Pembatasan ini diperlukan agar logika overflow dari variabel-variabel ini bekerja secara normal.
Metode untuk membuat amplop penguat
getADS dan formulir filter
getFADS mencantumkan nilai amplitudo amplop, dari mana gen_samples mengambil nilai pada saat menekan tombol. Mereka memiliki beberapa metode
getR dan
getFR di perusahaan mereka yang membentuk fase Atenuasi Envelope. Mereka mengambil parameter level sebagai input - nilai saat ini dari level amplop, mulai dari yang akan turun menjadi 0.
Keempat suara utama memiliki bentuk amplop yang sama dari Amplifier dan Filter, tetapi jika Amplop memiliki amplop sendiri untuk setiap suara dan dimulai ketika tombol ditekan, maka untuk filter itu adalah umum untuk semua suara, mulai dari pers pertama, restart setelah yang berikutnya dan berlangsung hingga yang terakhir melepaskan.
Lihat di atasMenurut instruksi manual, P432 mengeluarkan nomor catatan MIDI dari 36 hingga 77 (dalam kenyataannya 76) untuk tombol keyboard 1 hingga 41, masing-masing. Agar tidak menemukan kembali roda, saya memutuskan untuk menggunakan rentang 36-76 dalam emulator sebagai angka dari tombol yang ditekan, jadi saya memerlukan metode midi2freq, yang mengubah nomor kunci menjadi nilai "Frekuensi", dengan mempertimbangkan nada yang dipilih.
Pasangan metode terakhir adalah
key_press (midi_note) dan
key_release (midi_note), yang membentuk kamus korespondensi suara dengan frekuensi nada dasar, fase, dan posisi amplop saat ini.
Metode utama terakhir adalah
setprog (prog, clean = True), yang dirancang untuk memilih nada aktif.
Setprog memuat konfigurasi nada yang diinginkan dan, jika flag bersih tidak dihapus, membersihkan variabel internal. Jika clean diset ke False, maka variabel internal tidak diatur ulang, yang memungkinkan Anda untuk beralih di antara nada selama pembuatan suara dengan hampir tanpa klik atau suara tidak menyenangkan lainnya.
Untuk menulis sampel yang dihasilkan ke file WAV, metode utilitas write_wav dibuat berdasarkan modul gelombang. Untuk setiap sampel, penskalaan dilakukan untuk meningkatkan amplitudo dan membawanya ke bentuk 16bit yang ditandatangani.
Metode-metode ini cukup untuk mendapatkan file wav dengan merekam beberapa detik dari suara synthesizer.
Bentuk gelombang timbre 00 adalah sinusoid, jadi pada outputnya kita mendapatkan sinusoid dengan amplop yang dilapiskan.
Untuk mendengarkan.
Yang sedikit lebih menarik adalah perekaman nada 14 dengan serempak dan filter dihidupkan.
Untuk mendengarkan.
GUI
Generator suara konsol bagus, tapi saya juga ingin bermain di keyboard. Jadi saya memutuskan untuk membuat GUI sederhana di Tkinter.
Antarmuka dipengaruhi oleh P432 nyata dengan penambahan legenda keyboard, tombol pilih input MIDI dan kemampuan untuk mematikan filter.
Tombol "Midi In" akan muncul jika Anda memasang modul "python-rtmidi". Setelah menekan dan memilih perangkat Midi-input, program mengaktifkan fungsi panggilan balik yang menangkap peristiwa Note-On, Note-Off dan Perubahan Program pada semua 16 saluran midi. Melalui Program Change, Anda dapat mengubah jumlah nada emulator aktif.
Untuk mencegat penekanan tombol keyboard, gunakan metode Tkinter
bind ('<KeyPress') ,
bind ('<KeyRelease') , dan kemudian pada fungsi panggilan balik, nomor kunci diperiksa dengan daftar yang diizinkan, dikonversi ke catatan midi dan metode
p432.key_press () dipanggil ,
p432.key_release () . Intersepsi diaktifkan ketika program dimulai dan dinonaktifkan di akhir.
Untuk mengeluarkan suara streaming, modul pyaudio digunakan dalam mode non-pemblokiran. Setelah rendering antarmuka, itu dimulai dalam thread threading terpisah, dan tkinter terus bekerja terutama. Dalam fungsi panggilan balik, pyaudio meneruskan jumlah sampel yang akan dihasilkan, dan sebagai balasannya menerima sampel dari gen_samples dan bendera status. Untuk mengurangi latensi antara acara note-on (dengan menekan tombol) dan penampilan suara, dipilih buffer yang agak kecil: 200 sampel. Ini diatur oleh parameter
frames_per_buffer dari metode pyaudio terbuka.
Versi kompilasi pyinstall dari P432_emulator untuk Windows dapat diunduh dari
rilis .
Kesimpulan
Dalam artikel ini, rincian pengoperasian filter analog di node generator (dan implementasi digitalnya di emulator), node prosesor, efek HOP, dan antarmuka MIDI hampir tidak diungkapkan. Penekanannya ditempatkan pada desain bagian digital dari unit generator, metode menyimpan parameter warna nada dan menggunakannya saat membuat emulator.
Jika topiknya menarik, maka saya akan merencanakan artikel kedua dengan analisis sisanya.
Juga, jika menurut Anda ada kesalahan atau ketidakakuratan dalam deskripsi operasi node P432, silakan tulis di komentar.
Kode sumber proyek, firmware ROM, diagram, dan manual pengoperasian tersedia di
github .
Referensi
- Ridiko L. DDS: Sintesis Frekuensi Digital Langsung.
- Museum Penyintesis Soviet, Formant P432. www.ruskeys.net/base/form432.php
- Wikipedia Polyvox.
- Instrumen keyboard electromusical "Formant P432". Manual operasi .
- Diagram skematik listrik dari "Formant P432".
- Mengatur stabilitas suhu Polyvox.