Angklung Simulator
Angklung di browser yang membagi satu lagu ke banyak pemain, dengan setiap nada dihitung dari fisika bambu

- berkas audio, setiap nada disintesis
- 0
- teknik permainan dari satu model bambu
- 3
- laras bersumber, masing-masing dengan catatannya
- 3
- melodi bawaan, domain publik atau karya saya
- 5
Di halaman ini
Masalahnya
Aplikasi angklung yang saya temukan di internet semuanya berupa soundboard. Kita mengetuk gambar bambu, lalu terdengar satu nada. Suaranya ada, tapi alat musiknya hilang. Dalam ansambel angklung, setiap pemain memegang satu atau dua nada. Sebagian besar waktu dalam satu lagu dihabiskan untuk menunggu, sambil memperhatikan dirigen yang memberi isyarat angka dengan tangan. Koordinasi itulah inti alat musiknya, dan belum ada yang bisa mencobanya di web.
Ada dua celah lain. Tiga teknik memainkan angklung biasanya diajarkan sebagai tiga bunyi: kurulung (digetarkan), centok (ditarik tajam), dan tengkep (digetarkan dengan satu tabung ditahan). Padahal ketiganya adalah tiga cara membunyikan bambu yang sama. Lalu, pada angklung akompanimen, tengkep mengubah akor. Empat tabung berbunyi sebagai akor dominan septim. Tahan satu tabung dengan kelingking, dan akornya menjadi trinada mayor. Belum ada simulator yang menunjukkan hal ini.
Yang saya bangun
Setiap nada dihitung dari model tabung bambu
Saya memodelkan setiap tabung sebagai sekumpulan resonansi yang berdenging lalu meredup, seperti bambu yang dipukul. Situs ini tidak memuat satu pun berkas audio, dan build akan gagal kalau ada yang masuk. Tabung angklung tertutup di satu ujung, jadi hampir tidak punya bunyi di dua kali nada dasarnya. Celah itu membuat perubahan akor bisa dibuktikan: tabung oktaf adalah satu-satunya sumber nada itu, jadi menahannya menghilangkan nada tersebut sepenuhnya. Ketiga teknik hanya berbeda di cara tabung dipukul. Centok adalah satu pukulan keras, kurulung adalah getaran yang teratur, dan tengkep adalah getaran yang sama dengan beberapa tabung dibungkam.
Bunyinya diukur oleh tes
Mesin suaranya saya pisahkan dari kode browser, jadi audio bisa dirender di dalam test suite. Tes mengukur tinggi nada sampai selisih beberapa cent. Tes juga memastikan nada dari tabung yang ditahan hilang saat tengkep dan muncul tanpa tengkep, serta centok menghasilkan tepat satu pukulan. Yang terdengar di browser adalah audio yang sama dengan yang diukur tes. Waktu setiap nada dihitung dari jam audio itu sendiri, jadi lagu yang panjang tidak pernah meleset.
Tampilan ansambel menunjukkan siapa main kapan
Layar utamanya memuat sebuah melodi, satu set angklung, dan jumlah pemain. Di sana terlihat siapa memegang nada apa dan kapan setiap orang masuk. Jeda digambar sebagai ruang kosong, karena bagi pemain angklung, menunggu adalah pekerjaannya. Kita bisa memilih satu pemain dan memainkan bagiannya saja, atau menandai pemain yang absen dan melihat lagunya berantakan. Kalau sebuah lagu tidak bisa dibagi, solver menyebutkan alasannya: ada nada yang tidak ada di set, satu pemain dibutuhkan dua kali bersamaan, atau pemainnya kurang. Solver tidak pernah memotong lagu supaya muat.
Sumber budaya disertai batasannya
Padaeng adalah laras diatonis-kromatis yang diciptakan Daeng Soetigna pada 1938. Laras ini hadir berdampingan dengan dua laras tradisional, salendro dan pelog degung, sebagai set interval yang bisa diubah. Setiap laras membawa sumbernya dan catatan wajib tentang sampai mana angkanya sudah terverifikasi. Angka salendro dan pelog adalah model struktural, bukan hasil pengukuran, dan build menolak jalan kalau catatannya tidak ada. Situs ini menyebut Daeng Soetigna dan Udjo Ngalagena langsung di halaman, dan mengarahkan pembaca ke Saung Angklung Udjo serta ansambel setempat.
Hasilnya
Angklung Simulator sudah live dan terbuka untuk umum, dalam bahasa Indonesia dan Inggris. Isinya rak angklung yang bergoyang, tampilan ansambel, lab teknik yang memperlihatkan pukulan yang menggerakkan bambu, perubahan akor yang digambar sebagai tabung, perbandingan laras berdampingan, dan jalur dirigen. Ada juga halaman diagnostik yang melaporkan perilaku audio di ponsel kita. Semuanya berjalan dengan tiga dependensi runtime, tanpa pustaka audio atau pengolahan suara. Saya membangunnya dalam sekitar 37 jam pada 12 dan 13 Agustus 2026.
Di balik layarDetail teknis untuk engineer
- Setiap mode adalah resonator dua kutub,
y[n] = g·x[n] + 2r·cos(ω)·y[n-1] − r²·y[n-2], yang respons impulsnya berupa sinusoid yang meluruh. Tabungnya berperilaku seperti pipa tertutup, jadi parsial ganjil yang dominan. - Kurulung adalah deretan pukulan: getaran 2–3 Hz, dua pukulan per getaran, dengan jitter ber-seed pada waktu dan kekuatannya. Tengkep memakai deretan yang sama dan hanya mengubah resonator mana yang dijumlahkan. Menambah teknik berarti menambah pola, tanpa cabang baru.
- Inti sintesisnya adalah
(params) → Float32Array, tanpa Web Audio, DOM, React, jam, atau state tingkat modul, dan ini ditegakkan olehtests/synth/purity.test.ts. Seed yang sama menghasilkan render yang identik per byte. Helper FFT dan deteksi onset ditulis sendiri ditests/synth/helpers/dsp.ts. lib/audio/voices.tsmemutarFloat32Arrayhasil render dan tidak pernah membangun ulang modelnya dengan oscillator node. Kurulung dan tengkep dirender tetap enam detik lalu memudar saat dilepas, sebuah pendekatan yang dibatasi di lapisan audio.- Scheduler menghitung onset sebagai
startAudioTimeSec + eventTimeSec, tidak pernah diakumulasi. Jam dan timer di-inject supaya logika antreannya bisa diuji di Node. - Kegagalan pembagian berupa discriminated union:
nada-di-luar-set,nada-bertumpuk-sendiri,pemain-kurang, lengkap dengan indeks nada yang bermasalah. Solver juga melaporkan momen puncak lagu, jadi ukuran ansambel minimum bisa dicek. Solver diverifikasi terhadap oracle brute-force (620 baris, 56 tes). - Fixture perubahan akor punya toleransi 10 cent yang tidak boleh dilonggarkan. Mode tuner di lab teknik menjalankan renderer asli dan menghasilkan literal
TABUNG_MODESuntuk ditempel kembali ke kode. TuningSource.caveatwajib dan ditegakkan olehdata:validate. Data: 3 laras bersumber, 5 set angklung, 5 melodi, semuanya divalidasi saat build.- PRD meminta klik untuk centok dan tahan untuk kurulung. Membedakan ketukan dari tahanan akan menunda setiap nada, jadi rak memakai pemilih teknik ditambah tekan-dan-tahan.
- Warm-up merender satu buffer per slot idle supaya ponsel tidak macet. Anggaran 28 voice berasal dari
pnpm bench:voices, yang sanggup 64 voice offline di sekitar 18× realtime. - Bug audio senyap punya tiga penyebab sekaligus: level output, anggaran voice, dan tidak ada cara membedakan ketiganya. Perbaikannya menambahkan pesan error audio yang terlihat, fallback Safari, dan halaman
/diagnostik. scripts/postbuild.mjsmenggagalkan build kalau ada berkas audio. Dependensi runtime:next,react, danreact-dom. First Load JS 108–110 KB per halaman dari anggaran 250 KB.- 7 rute × 2 bahasa = 14 halaman statis. 132 tes di 11 berkas, sekitar 13.100 baris TS/TSX/JSON, 82 commit.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.