Pendeteksi BPM
Jatuhkan sebuah lagu. Dapatkan temponya dan waktu persis setiap ketukan — dihitung di mesin Anda sendiri, tanpa mengunggah apa pun.
Peramban Anda yang membaca dan mengodekan ulang berkas. Tidak ada permintaan yang mengirimnya ke mana pun — halaman ini tidak punya server tujuan unggah.
Pertanyaan
Apakah audio saya diunggah?
Tidak. Analisisnya berjalan di dalam peramban Anda sebagai WebAssembly. Berkas dibaca dari cakram ke memori dan tidak pernah keluar lewat jaringan: Anda bisa memeriksanya dengan membuka tab jaringan, atau mencabut koneksi setelah halamannya termuat.
Seberapa akurat?
Ia memakai analisis kekuatan onset dengan pelacakan ketukan berbasis pemrograman dinamis — pendekatan yang sama dengan perkakas music information retrieval yang sudah mapan, dan kode yang sama yang menggerakkan mesin montase Life2Film. Pada musik berdenyut stabil, ia meleset kurang dari satu ketukan. Pada rubato, rekaman langsung tanpa klik, atau materi yang sangat sinkopasi, anggap angkanya sebagai titik awal.
Apa arti «tempo separuh atau ganda»?
Tempo memang ambigu: lagu 140 BPM juga, secara benar, 70 BPM bila dihitung setengah. Pendeteksi memilih yang paling kuat dalam sinyalnya. Bila angkanya terasa meleset tepat dua kali lipat, itulah yang terjadi, dan kedua pembacaan ditampilkan agar Anda mengambil yang Anda perlukan.
Bisakah ketukannya dipakai di penyunting saya?
Untuk itulah ekspornya ada. EDL adalah pilihan untuk DaVinci Resolve atau Premiere: setiap ketukan datang sebagai penanda bernama di lini masa. Final Cut menerima FCPXML. OTIO juga bekerja di Resolve, Avid dan Premiere, dan tepat bila ketukannya menuju sebuah alur produksi alih-alih langsung ke lini masa. Audacity membaca ekspor label, sedangkan CSV atau JSON menutup kebutuhan lembar sebar dan skrip.
Kenapa frame rate penting?
Ketukan jatuh pada pecahan detik; lini masa menghitung bingkai utuh. Setiap penanda dibulatkan ke bingkai terdekat pada proyek tujuannya, jadi kisi yang diekspor pada 25 fps akan meleset sampai 20 md di rangkaian 30 fps. Setel lajunya sesuai proyek Anda dan penanda jatuh persis di tempat ketukannya. Ini tidak memengaruhi CSV maupun JSON, yang juga membawa detik mentahnya.
Alat lainnya
Pasang ini di proyek Anda sendiri
Finding the tempo and beat grid of a track — the same way this page does it, on the user's machine, with no server. Take the code, or hand the prompt to a coding agent.
const engine = await import('https://life2film.com/wasm/va_wasm.js');
await engine.default({ module_or_path: 'https://life2film.com/wasm/va_wasm_bg.wasm' });
const ctx = new AudioContext();
const buffer = await ctx.decodeAudioData(await file.arrayBuffer());
// Down-mix to mono at 22050 Hz first (OfflineAudioContext), then:
const { bpm, beats } = JSON.parse(engine.detect_beats(mono, 22050, null)); Add beat detection to my project. It must run in the browser with no upload and no API key.
Requirements:
- Use the "life2film-engine" npm package (WebAssembly). detect_beats takes mono f32 PCM, which is
exactly what AudioContext.decodeAudioData gives you.
- Down-mix to mono at 22050 Hz with an OfflineAudioContext before analysing. The onset envelope lives
far below that, so the source rate costs several times the memory and time for an identical answer.
- Tempo is genuinely ambiguous: 140 BPM is also 70 in half time. Show both readings rather than
treating a 2x difference as an error.
- Draw the beats over a waveform so the user can check them, but show a WINDOW of a few seconds, not
the whole track — 400 beats across 1000 pixels is a solid block that proves nothing.
- Let the user play the track with a click on every beat. It is the fastest way to verify a grid.
- Export the grid for editors: EDL for Resolve and Premiere, FCPXML for Final Cut, OTIO for
pipelines, Audacity labels, CSV, JSON. Markers land on whole frames, so ask for the project frame
rate — a grid at 25 fps sits up to 20 ms off in a 30 fps sequence.
Reference implementation: https://life2film.com/tools/bpm-detector/
The engine is documented for agents, and every tool page is available as
markdown by adding .md to its address.