كاشف BPM
أفلت مقطوعة. احصل على إيقاعها والزمن الدقيق لكل نبضة — محسوبًا على جهازك أنت، دون رفع أي شيء.
متصفحك هو الذي يقرأ الملف ويعيد ترميزه. لا يُرسَل في أي طلب إلى أي مكان — فهذه الصفحة لا تملك خادمًا يُرفع إليه.
أسئلة
هل يُرفع الصوت إلى أي مكان؟
لا. يجري التحليل داخل متصفحك بصيغة WebAssembly. يُقرأ الملف من القرص إلى الذاكرة ولا يخرج عبر الشبكة قط: يمكنك التحقق بفتح تبويب الشبكة، أو بقطع الاتصال بعد تحميل الصفحة.
ما مدى دقته؟
يستخدم تحليل قوة البدايات مع تتبّع النبض بالبرمجة الديناميكية — المقاربة نفسها في أدوات استرجاع معلومات الموسيقى الراسخة، والشيفرة نفسها التي تحرّك محرّك المونتاج في Life2Film. مع موسيقى ذات نبض ثابت يصيب ضمن نبضة واحدة. أما مع الروباتو والتسجيلات الحية بلا مِترونوم والمادة المتقطّعة بشدة، فاعتبر الرقم نقطة انطلاق.
ما معنى «نصف الإيقاع أو ضعفه»؟
الإيقاع ملتبس بطبيعته: مقطوعة عند 140 نبضة في الدقيقة هي أيضًا، وبصواب، 70 إن عُدّت بنصف الزمن. والكواشف تختار الأقوى في الإشارة. فإن بدا الرقم ضعف ما تتوقع أو نصفه بالضبط، فهذا ما جرى، وتُعرض القراءتان لتأخذ ما تحتاج.
هل أستطيع استخدام النبضات في برنامج المونتاج؟
لهذا وُجد التصدير. EDL هو الخيار لدافينشي ريزولف أو بريمير: تصل كل نبضة علامةً مسمّاة على الخط الزمني. وفاينل كت يقبل FCPXML. وOTIO يعمل في ريزولف وأفيد وبريمير، وهو المناسب إن كانت النبضات ذاهبة إلى مسار إنتاج لا إلى خط زمني مباشرة. وأوداسيتي يقرأ تصدير العلامات، وCSV وJSON يغطيان الجداول والبرامج النصية.
لماذا يهمّ معدّل الإطارات؟
النبضات تقع على أجزاء من الثانية، والخطوط الزمنية تعدّ إطارات كاملة. تُقرَّب كل علامة إلى أقرب إطار في المشروع الذاهبة إليه، فشبكة مصدّرة عند 25 إطارًا/ث تقع بفارق يصل إلى 20 مللي ثانية داخل تسلسل عند 30. اضبط المعدّل على معدّل مشروعك تستقر العلامات تمامًا حيث النبضة. ولا يؤثر ذلك في CSV وJSON، إذ يحملان الثواني الخام أيضًا.
الأدوات الأخرى
أضف هذا إلى مشروعك
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.