Langsung ke konten
AFM Studio
  • Halaman

    AFM Studio
  • Karya
  • Lab
  • Tentang
  • CV
  • Kontak
  • Proyek

    AksaraPerpustakaan pengetahuan Otorita IKN yang bisa dicari, dengan server memeriksa akses setiap pembaca di tiga tingkat
  • Daily TaqwaSistem presensi salat anti-manipulasi untuk ~2.000 pegawai OIKN di Masjid Negara IKN
  • Lantara v2Mesin perizinan Otorita IKN tempat administrator menambah jenis izin baru dari layar, tanpa developer
  • eKiosk IKNDua ruang kendali untuk Nusantara: konten kios dan pelacakan bus live dengan estimasi kedatangan yang menilai dirinya sendiri
  • E-Monev IKNPlatform pemantauan pembangunan Nusantara selama 23 tahun, melacak progres triwulan setiap unit terhadap 24 KPI
  • JDIH OIKNPortal dokumen hukum publik OIKN, dengan alur penerbitan terkendali dan ringkasan AI yang tidak pernah keluar dari server
  • Jejak PenanamanAplikasi absen acara penanaman pohon IKN yang membuktikan peserta hadir di lokasi lewat selfie ber-geofence
  • Dashboard SAKTIPipeline malam dan dashboard yang menggantikan unduhan anggaran manual di keenam satker OIKN
  • DoseRxKalkulator dosis untuk 127 obat yang membulatkan dosis ke tablet dan sirup yang dijual apotek Indonesia
  • CubiqPelatih speedcubing dengan timer setara kompetisi dan solver buatan sendiri untuk 8 puzzle utama
  • ScimotionPerpustakaan sains interaktif berisi 86 artikel, masing-masing dijelaskan bersama animasi yang bisa dikendalikan pembaca
  • WA Daily Scrum BotBot WhatsApp yang menagih laporan standup tim 14 orang dan menandai tugas yang macet berhari-hari

↑ ↓ untuk berpindah · Enter untuk membuka · Esc untuk menutup

Angklung Simulator

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

Tangkapan layar
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 oleh tests/synth/purity.test.ts. Seed yang sama menghasilkan render yang identik per byte. Helper FFT dan deteksi onset ditulis sendiri di tests/synth/helpers/dsp.ts.
  • lib/audio/voices.ts memutar Float32Array hasil 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_MODES untuk ditempel kembali ke kode.
  • TuningSource.caveat wajib dan ditegakkan oleh data: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.mjs menggagalkan build kalau ada berkas audio. Dependensi runtime: next, react, dan react-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

Beranda
Rak
Ansambel
Laboratorium Teknik
Laras
Aransemen

Sedang merekrut, atau membangun hal serupa?

Saya terbuka untuk posisi full-time dan proyek freelance tertentu.