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

Spectrogram

Spektrogram langsung yang menggambar nada dalam suara Anda, memakai transformasi yang saya tulis dan buktikan sendiri

Tangkapan layar
permintaan jaringan saat runtime, dijamin build
0
lebih cepat dari waktu nyata di desktop
~101×
pemeriksaan terpisah atas kebenaran transformasi
4
sampel audio dibangkitkan lewat kode
6
Di halaman ini

Masalahnya

Bentuk gelombang, garis naik-turun yang dikenal semua orang, menunjukkan seberapa keras sebuah suara. Bentuk gelombang tidak menunjukkan nada: dengung rendah dan siulan tinggi terlihat hampir sama. Spektrogram menunjukkan nada apa saja yang muncul dari waktu ke waktu. Beginilah cara pengenal suara, software musik, dan aplikasi pengenal kicau burung melihat suara.

Saya membangun ini untuk dua jenis pengunjung. Yang pertama pernah mendengar transformasi Fourier dan ingin memahaminya secara intuitif. Gagasan utamanya adalah sebuah tarik-ulur: ketepatan waktu dan ketepatan nada tidak bisa didapat sekaligus. Yang kedua adalah peninjau teknis. Browser sudah punya analyser bawaan yang bisa menggambar spektrogram dalam sepuluh baris, dan itu tidak membuktikan apa pun tentang orang yang memakainya. Saya ingin menulis transformasinya sendiri dan menunjukkan bahwa hasilnya benar.

Yang saya bangun

Matematikanya saya buktikan sebelum membuat layar apa pun

Transformasi yang salah tetap bisa menggambar spektrogram yang meyakinkan, dan kesalahannya tidak akan terlihat hanya dengan memandanginya. Karena itu saya menulis transformasi dan tesnya lebih dulu, baru kemudian antarmukanya. Saya menyiapkan empat pemeriksaan yang saling lepas: versi buku teks yang lambat sebagai pembanding, aturan energi yang harus berlaku untuk setiap masukan, perjalanan bolak-balik kembali ke sinyal asal, dan sinyal uji yang bisa dicek dengan tangan. Masing-masing menangkap kesalahan yang lolos dari yang lain.

Tarik-ulurnya menjadi kontrol yang bisa digeser

Layar utama menggambar suara dari mikrofon atau sampel sebagai gambar bergulir, dengan bentuk gelombang di atasnya. Saat kursor diarahkan, muncul waktu, nada, dan kekerasan suara yang tepat. Tarik-ulur antara waktu dan nada menjadi kontrol dengan tiga posisi bernama, dari "lebih tajam di waktu" sampai "lebih tajam di nada". Menggesernya mengajarkan gagasan itu lebih cepat daripada satu paragraf penjelasan. Pengaturan mentahnya disimpan di bagian "lanjutan".

Mulus di layar karena tidak ada memori yang dibuang

Pada 60 frame per detik, jeda pembersihan memori terlihat seperti aplikasi rusak. Saya menyiapkan semua memori kerja sekali per pengaturan lalu memakainya ulang, jadi aplikasi tidak mengalokasikan apa pun per frame. Analisis berjalan di thread latar. Tes yang menjaganya mengukur pertumbuhan memori selama satu menit penuh, selain kecepatan mentahnya.

Audio tidak pernah keluar dari perangkat

Situs yang meminta akses mikrofon wajib menjelaskan ke mana audionya pergi. Di sini jawabannya tidak ke mana-mana, dan build yang memastikannya. Sebuah pemeriksaan memindai situs yang sudah jadi untuk mencari apa pun yang akan diambil browser, dan menggagalkan deploy kalau menemukannya. Satu-satunya pengecualian adalah empat tautan ke profil saya sendiri, masing-masing dicatat dengan alamat persisnya.

Halaman bukti yang mengakui browser lebih cepat

Halaman bukti menjalankan transformasi saya di samping analyser bawaan browser dengan masukan yang sama, dan menampilkan selisihnya di setiap frekuensi. Analyser bawaan lebih cepat, dan halaman itu menyebutkannya. Kecepatan memang tidak pernah menjadi klaimnya. Supaya perbandingannya adil, saya menyamakan bentuk jendela dan skala kekerasannya persis.

Hasilnya

Spectrogram sudah live dan terbuka untuk umum, dalam bahasa Inggris dan Indonesia. Ada empat bentuk jendela, tiga skala nada, dan mode sintesis tempat Anda menyusun sinyal dari nada murni lalu melihat spektrumnya mengembalikan persis apa yang dimasukkan. Enam sampel bawaan dibangkitkan lewat kode, jadi situs tetap bisa dipakai walaupun akses mikrofon ditolak. Di desktop, transformasinya berjalan sekitar 101 kali lebih cepat dari waktu nyata. Saya membangunnya dalam satu sesi sekitar empat jam pada 6 Agustus 2026.

Di balik layarDetail teknis untuk engineer
  • Inti DSP di lib/dsp/ sekitar 990 baris: FFT radix-2 Cooley-Tukey in-place beserta inversnya, tabel twiddle dan bit-reversal yang di-cache, empat jendela (rectangular, Hann, Hamming, Blackman) dari Harris (1978), konversi dB, pemetaan bin linear/log/mel, framing, dan sintesis aditif.
  • Sinyal kebenaran: oracle DFT naif O(n²) di setiap ukuran dan korpus acak ber-seed; identitas Parseval di setiap suite; round trip FFT → invers; fixture analitik (DC, sinus tepat di tengah bin, impuls satuan, kernel kebocoran Dirichlet pada offset setengah bin). Toleransi ditetapkan sekali dari fixture dan tidak pernah dilonggarkan.
  • Bagian real dan imajiner disimpan di Float64Array terpisah. Plate berupa ring buffer kolom yang di-blit sebagai satu ImageData per frame.
  • PRD meminta analisis di AudioWorkletProcessor, tetapi worklet tidak bisa diandalkan untuk memakai ES import, sehingga butuh salinan FFT kedua yang tidak teruji. Analisis dipindah ke Worker biasa; worklet hanya menjadi penyadap tangkapan, dengan fallback ScriptProcessor.
  • scripts/finalize-export.mjs memindai hasil build untuk src, <link href>, srcset, url(), dan @import, ditambah daftar tolak tracker. Namespace XML W3C dianggap aman.
  • Keadilan halaman bukti: Blackman α = 0,16 dan skala 20·log10(|X[k]|/fftSize) tanpa penggandaan satu sisi, dengan masukan stasioner tepat di tengah bin.
  • tests/ui/tokens.test.ts gagal kalau palet Tailwind dan modul warna canvas tidak sinkron. Tes kamus gagal kalau kedua bahasa tidak sinkron.
  • Benchmark pada 2048 titik, overlap 75%, 48 kHz: sekitar 0,105 ms per kolom, sekitar 101× waktu nyata, sekitar 0,6 byte pertumbuhan heap per kolom selama satu menit.
  • Static export Next.js 14, 4 rute × 2 bahasa, tiga dependensi runtime tanpa library DSP, audio, atau grafik. 256 tes di 13 berkas, sekitar 5,6 detik. Sekitar 8.400 baris, 32 commit.

Tangkapan layar

Beranda
See Sound
Build a Sound
Check the Maths

Sedang merekrut, atau membangun hal serupa?

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