{"id":4699,"date":"2026-02-21T21:07:22","date_gmt":"2026-02-22T02:07:22","guid":{"rendered":"https:\/\/smartdsp.pro\/?page_id=4699"},"modified":"2026-02-22T15:55:34","modified_gmt":"2026-02-22T20:55:34","slug":"bpm-and-key-detector","status":"publish","type":"page","link":"https:\/\/smartdsp.pro\/fr\/bpm-and-key-detector\/","title":{"rendered":"D\u00e9tecteur de BPM et Tonalit\u00e9"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; background_color=&#8221;#000000&#8243; background_image=&#8221;https:\/\/smartdsp.pro\/wp-content\/uploads\/2022\/10\/streamer-79.png&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_code _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<!DOCTYPE html><!-- [et_pb_line_break_holder] --><html lang=\"en\"><!-- [et_pb_line_break_holder] --><head><!-- [et_pb_line_break_holder] --><meta charset=\"UTF-8\"><!-- [et_pb_line_break_holder] --><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><!-- [et_pb_line_break_holder] --><title>BPM &#038; Key Detector<\/title><!-- [et_pb_line_break_holder] --><link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"><!-- [et_pb_line_break_holder] --><link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin><!-- [et_pb_line_break_holder] --><link href=\"https:\/\/fonts.googleapis.com\/css2?family=Be+Vietnam+Pro:wght@300;400;500;600;700;800&#038;display=swap\" rel=\"stylesheet\"><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><script src=\"\/wp-content\/cache\/essentia-wasm.web.js\"><\/script><!-- [et_pb_line_break_holder] --><script src=\"\/wp-content\/cache\/essentia.js-core.js\"><\/script><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><\/p>\n<style><!-- [et_pb_line_break_holder] -->*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->:root {<!-- [et_pb_line_break_holder] -->  --acc: #f3be29;<!-- [et_pb_line_break_holder] -->  --pink: #cd3ba7;<!-- [et_pb_line_break_holder] -->  --grad: linear-gradient(135deg, #f3be29 0%, #cd3ba7 100%);<!-- [et_pb_line_break_holder] -->  --font: 'Be Vietnam Pro', sans-serif;<!-- [et_pb_line_break_holder] -->  --r: 14px;<!-- [et_pb_line_break_holder] -->  --b: rgba(255,255,255,0.08);<!-- [et_pb_line_break_holder] -->  --b2: rgba(243,190,41,0.28);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->body { font-family: var(--font); background: transparent; color: #fff; padding: 40px 20px; }<!-- [et_pb_line_break_holder] -->.wrap { max-width: 740px; margin: 0 auto; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* HEADER *\/<!-- [et_pb_line_break_holder] -->.hdr { text-align: center; margin-bottom: 34px; }<!-- [et_pb_line_break_holder] -->.badge {<!-- [et_pb_line_break_holder] -->  display: inline-flex; align-items: center; gap: 7px;<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,0.06); border: 1px solid #089c04;<!-- [et_pb_line_break_holder] -->  border-radius: 100px; padding: 5px 14px 5px 10px;<!-- [et_pb_line_break_holder] -->  font-size: 11px; font-weight: 600; letter-spacing: .08em;<!-- [et_pb_line_break_holder] -->  text-transform: uppercase; color: #089c04; margin-bottom: 16px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.badge i { width:7px; height:7px; border-radius:50%; background:#089c04; display:inline-block; animation: blink 2s ease-in-out infinite; }<!-- [et_pb_line_break_holder] -->@keyframes blink { 0%,100%{opacity:1} 50%{opacity:.35} }<!-- [et_pb_line_break_holder] -->h1 {<!-- [et_pb_line_break_holder] -->  font-size: clamp(1.9rem, 5vw, 3rem); font-weight: 800;<!-- [et_pb_line_break_holder] -->  letter-spacing: -.03em; line-height: 1.06;<!-- [et_pb_line_break_holder] -->  background: var(--grad); -webkit-background-clip: text;<!-- [et_pb_line_break_holder] -->  -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 10px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.sub { font-size: 14px; color: white; line-height: 1.6; max-width: 400px; margin: 0 auto; }<!-- [et_pb_line_break_holder] -->.engine-status {<!-- [et_pb_line_break_holder] -->  margin-top: 14px; font-size: 12px; font-weight: 600;<!-- [et_pb_line_break_holder] -->  letter-spacing: .04em; color: rgba(255,255,255,.35);<!-- [et_pb_line_break_holder] -->  display: flex; align-items: center; justify-content: center; gap: 8px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.engine-status .dot {<!-- [et_pb_line_break_holder] -->  width: 7px; height: 7px; border-radius: 50%;<!-- [et_pb_line_break_holder] -->  background: var(--acc); animation: blink 1.2s ease-in-out infinite;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.engine-status.ready { color: rgba(100,218,118,.8); }<!-- [et_pb_line_break_holder] -->.engine-status.ready .dot { background: rgba(100,218,118,.9); animation: none; }<!-- [et_pb_line_break_holder] -->.engine-status.error-st { color: rgba(255,100,100,.8); }<!-- [et_pb_line_break_holder] -->.engine-status.error-st .dot { background: rgba(255,100,100,.9); animation: none; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* DROP ZONE *\/<!-- [et_pb_line_break_holder] -->.drop {<!-- [et_pb_line_break_holder] -->  position: relative; border: 1.5px dashed rgba(255,255,255,0.13);<!-- [et_pb_line_break_holder] -->  border-radius: var(--r); padding: 50px 28px; text-align: center; cursor: pointer;<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,0.04); backdrop-filter: blur(16px);<!-- [et_pb_line_break_holder] -->  transition: all .25s cubic-bezier(.4,0,.2,1); overflow: hidden;<!-- [et_pb_line_break_holder] -->  margin-top: 8px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.drop::after {<!-- [et_pb_line_break_holder] -->  content:''; position:absolute; inset:0; pointer-events:none;<!-- [et_pb_line_break_holder] -->  background: radial-gradient(ellipse at 50% 0%, rgba(243,190,41,.07) 0%, transparent 65%);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.drop:hover:not(.disabled), .drop.over {<!-- [et_pb_line_break_holder] -->  border-color: rgba(243,190,41,.5); background: rgba(243,190,41,.03);<!-- [et_pb_line_break_holder] -->  transform: translateY(-2px);<!-- [et_pb_line_break_holder] -->  box-shadow: 0 0 0 5px rgba(243,190,41,.05), 0 18px 48px rgba(0,0,0,.3);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.drop.disabled { opacity: .55; cursor: not-allowed; }<!-- [et_pb_line_break_holder] -->.ico {<!-- [et_pb_line_break_holder] -->  width: 58px; height: 58px; border-radius: 15px; background: var(--grad);<!-- [et_pb_line_break_holder] -->  margin: 0 auto 18px; display: flex; align-items: center; justify-content: center;<!-- [et_pb_line_break_holder] -->  box-shadow: 0 8px 22px rgba(243,190,41,.26); transition: transform .3s;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.drop:hover:not(.disabled) .ico { transform: scale(1.07) translateY(-2px); }<!-- [et_pb_line_break_holder] -->.drop h3 { font-size: 16px; font-weight: 700; margin-bottom: 7px; }<!-- [et_pb_line_break_holder] -->.drop p { font-size: 13.5px; color: rgba(255,255,255,.5); margin-bottom: 22px; line-height: 1.5; }<!-- [et_pb_line_break_holder] -->.drop p em { color: rgba(255,255,255,.75); font-style: normal; }<!-- [et_pb_line_break_holder] -->.btn-pick {<!-- [et_pb_line_break_holder] -->  display: inline-flex; align-items: center; gap: 7px;<!-- [et_pb_line_break_holder] -->  background: var(--grad); color: #000; font-family: var(--font);<!-- [et_pb_line_break_holder] -->  font-size: 13.5px; font-weight: 700; border: none; border-radius: 100px;<!-- [et_pb_line_break_holder] -->  padding: 11px 26px; cursor: pointer; transition: all .2s;<!-- [et_pb_line_break_holder] -->  box-shadow: 0 4px 18px rgba(243,190,41,.3); letter-spacing: .01em;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.btn-pick:hover { transform: translateY(-1px); box-shadow: 0 8px 26px rgba(243,190,41,.42); filter: brightness(1.05); }<!-- [et_pb_line_break_holder] -->.btn-pick:disabled { opacity: .5; cursor: not-allowed; transform: none; }<!-- [et_pb_line_break_holder] -->.fmts { margin-top: 16px; font-size: 11px; color: rgba(255,255,255,.22); letter-spacing: .07em; text-transform: uppercase; }<!-- [et_pb_line_break_holder] -->#fi { display: none; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* QUEUE *\/<!-- [et_pb_line_break_holder] -->.queue { margin-top: 20px; display: none; }<!-- [et_pb_line_break_holder] -->.q-hdr { display: flex; justify-content: space-between; align-items: center; margin-bottom: 11px; padding: 0 2px; }<!-- [et_pb_line_break_holder] -->.q-hdr span { font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; color: rgba(255,255,255,.45); }<!-- [et_pb_line_break_holder] -->.btn-clr {<!-- [et_pb_line_break_holder] -->  background: none; border: none; color: rgba(255,255,255,.45); font-family: var(--font);<!-- [et_pb_line_break_holder] -->  font-size: 12px; font-weight: 600; cursor: pointer; padding: 4px 10px; border-radius: 7px; transition: all .2s;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.btn-clr:hover { color: var(--acc); background: rgba(243,190,41,.08); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* CARD *\/<!-- [et_pb_line_break_holder] -->.cards { display: flex; flex-direction: column; gap: 10px; }<!-- [et_pb_line_break_holder] -->.card {<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,0.05); backdrop-filter: blur(20px);<!-- [et_pb_line_break_holder] -->  border: 1px solid var(--b); border-radius: var(--r);<!-- [et_pb_line_break_holder] -->  padding: 16px 20px; position: relative; overflow: hidden;<!-- [et_pb_line_break_holder] -->  animation: fadeUp .3s cubic-bezier(.4,0,.2,1); transition: border-color .3s;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->@keyframes fadeUp { from{opacity:0;transform:translateY(10px)} to{opacity:1;transform:translateY(0)} }<!-- [et_pb_line_break_holder] -->.card.done { border-color: rgba(243,190,41,.14); }<!-- [et_pb_line_break_holder] -->.card.err  { border-color: rgba(255,80,80,.2); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.pbar { position:absolute; bottom:0; left:0; height:2px; background:var(--grad); border-radius:0 2px 2px 0; }<!-- [et_pb_line_break_holder] -->.card.analyzing .pbar { animation: prog 1.3s ease-in-out infinite; }<!-- [et_pb_line_break_holder] -->@keyframes prog { 0%{left:-40%;width:40%} 60%,100%{left:100%;width:40%} }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.top { display: flex; align-items: center; gap: 14px; }<!-- [et_pb_line_break_holder] -->.thumb {<!-- [et_pb_line_break_holder] -->  width: 44px; height: 44px; border-radius: 11px;<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,0.06); flex-shrink: 0;<!-- [et_pb_line_break_holder] -->  display: flex; align-items: center; justify-content: center;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.bars { display: flex; align-items: center; gap: 2.5px; height: 22px; }<!-- [et_pb_line_break_holder] -->.bars s { display:block; width:3px; border-radius:2px; background:var(--grad); height:var(--h,50%); transform-origin:bottom; text-decoration:none; }<!-- [et_pb_line_break_holder] -->.analyzing .bars s { animation: wb .7s ease-in-out infinite; }<!-- [et_pb_line_break_holder] -->.bars s:nth-child(1){--h:30%;animation-delay:0s}<!-- [et_pb_line_break_holder] -->.bars s:nth-child(2){--h:75%;animation-delay:.1s}<!-- [et_pb_line_break_holder] -->.bars s:nth-child(3){--h:50%;animation-delay:.2s}<!-- [et_pb_line_break_holder] -->.bars s:nth-child(4){--h:90%;animation-delay:.05s}<!-- [et_pb_line_break_holder] -->.bars s:nth-child(5){--h:38%;animation-delay:.15s}<!-- [et_pb_line_break_holder] -->@keyframes wb { 0%,100%{transform:scaleY(1)} 50%{transform:scaleY(.2)} }<!-- [et_pb_line_break_holder] -->.thumb .note-icon { display:none; }<!-- [et_pb_line_break_holder] -->.card.done .bars { display:none; }<!-- [et_pb_line_break_holder] -->.card.done .note-icon { display:flex; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.info { flex:1; min-width:0; }<!-- [et_pb_line_break_holder] -->.fname { font-size:14px; font-weight:600; letter-spacing:-.01em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; margin-bottom:3px; }<!-- [et_pb_line_break_holder] -->.fsize { font-size:12px; color:rgba(255,255,255,.45); }<!-- [et_pb_line_break_holder] -->.cstatus { font-size:12px; font-weight:600; white-space:nowrap; flex-shrink:0; }<!-- [et_pb_line_break_holder] -->.st-a { color: var(--acc); }<!-- [et_pb_line_break_holder] -->.st-d { color: rgba(100,218,118,.9); }<!-- [et_pb_line_break_holder] -->.st-e { color: rgba(255,90,90,.9); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* RESULTS *\/<!-- [et_pb_line_break_holder] -->.results {<!-- [et_pb_line_break_holder] -->  display: grid; grid-template-columns: 1fr 1fr;<!-- [et_pb_line_break_holder] -->  gap: 10px; margin-top: 14px; padding-top: 14px;<!-- [et_pb_line_break_holder] -->  border-top: 1px solid var(--b); animation: fadeUp .35s ease;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.chip {<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,0.05); border: 1px solid var(--b);<!-- [et_pb_line_break_holder] -->  border-radius: 10px; padding: 14px 16px; text-align: center; transition: border-color .2s;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.chip:hover { border-color: var(--b2); }<!-- [et_pb_line_break_holder] -->.chip .lbl { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.1em; color:rgba(255,255,255,.45); margin-bottom:7px; }<!-- [et_pb_line_break_holder] -->.chip .val {<!-- [et_pb_line_break_holder] -->  font-size:28px; font-weight:800; letter-spacing:-.03em; line-height:1;<!-- [et_pb_line_break_holder] -->  background:var(--grad); -webkit-background-clip:text; -webkit-text-fill-color:transparent; background-clip:text;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.chip .unit { font-size:11.5px; color:rgba(255,255,255,.4); margin-top:4px; font-weight:500; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* COMPACT DROP (after first file loaded) *\/<!-- [et_pb_line_break_holder] -->.drop.compact {<!-- [et_pb_line_break_holder] -->  padding: 10px 16px;<!-- [et_pb_line_break_holder] -->  display: flex; align-items: center; gap: 12px;<!-- [et_pb_line_break_holder] -->  text-align: left; cursor: default;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.drop.compact::after { display: none; }<!-- [et_pb_line_break_holder] -->.drop.compact .ico,<!-- [et_pb_line_break_holder] -->.drop.compact h3,<!-- [et_pb_line_break_holder] -->.drop.compact p,<!-- [et_pb_line_break_holder] -->.drop.compact .fmts { display: none; }<!-- [et_pb_line_break_holder] -->.drop.compact .btn-pick {<!-- [et_pb_line_break_holder] -->  flex-shrink: 0; padding: 9px 18px; font-size: 12.5px;<!-- [et_pb_line_break_holder] -->  margin: 0;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.drop.compact .compact-label {<!-- [et_pb_line_break_holder] -->  font-size: 13px; color: rgba(255,255,255,.45); flex: 1;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.drop.compact .compact-label em { color: rgba(255,255,255,.7); font-style: normal; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* SUB-VALUES in chips *\/<!-- [et_pb_line_break_holder] -->.chip .sub-vals {<!-- [et_pb_line_break_holder] -->  margin-top: 8px; padding-top: 8px;<!-- [et_pb_line_break_holder] -->  border-top: 1px solid rgba(255,255,255,0.07);<!-- [et_pb_line_break_holder] -->  display: flex; justify-content: center; gap: 10px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.chip .sv {<!-- [et_pb_line_break_holder] -->  font-size: 11px; font-weight: 600; color: rgba(255,255,255,.38);<!-- [et_pb_line_break_holder] -->  letter-spacing: .02em; line-height: 1.3;<!-- [et_pb_line_break_holder] -->  display: flex; flex-direction: column; align-items: center; gap: 1px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.chip .sv span {<!-- [et_pb_line_break_holder] -->  font-size: 13px; font-weight: 700; color: rgba(255,255,255,.6);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.chip .sv-sep { width: 1px; background: rgba(255,255,255,.1); align-self: stretch; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->@media(max-width:500px){<!-- [et_pb_line_break_holder] -->  body{padding:22px 14px;}<!-- [et_pb_line_break_holder] -->  .drop{padding:36px 16px;}<!-- [et_pb_line_break_holder] -->  .drop.compact{padding:9px 12px;}<!-- [et_pb_line_break_holder] -->  h1{font-size:1.8rem;}<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><\/style>\n<p><!-- [et_pb_line_break_holder] --><\/head><!-- [et_pb_line_break_holder] --><body><!-- [et_pb_line_break_holder] --><\/p>\n<div class=\"wrap\"><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"hdr\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"badge\"><i><\/i> Free \u00b7 100% Local \u00b7 No Ads \u00b7 No Account Required<\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<h1>BPM &#038; Key Detector<\/h1>\n<p><!-- [et_pb_line_break_holder] -->    <pee class=\"sub\">Detect audio files BPM and Key in seconds!<\/pee><!-- [et_pb_line_break_holder] -->   <!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"drop disabled\" id=\"dz\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ico\"><!-- [et_pb_line_break_holder] -->      <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#000\" stroke-width=\"2.2\"><!-- [et_pb_line_break_holder] -->        <path d=\"M9 18V5l12-2v13\"\/><circle cx=\"6\" cy=\"18\" r=\"3\"\/><circle cx=\"18\" cy=\"16\" r=\"3\"\/><!-- [et_pb_line_break_holder] -->      <\/svg><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<h3>Drop your tracks here<\/h3>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"fmts\">MP3 \u00b7 WAV \u00b7 FLAC \u00b7 AAC \u00b7 OGG \u00b7 M4A<\/div>\n<p><!-- [et_pb_line_break_holder] -->    <pee><span class=\"compact-label\">Drag &#038; drop file(s), or <em>browse to select<\/em><\/span><\/pee><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <button class=\"btn-pick\" id=\"btnPick\" disabled><!-- [et_pb_line_break_holder] -->      <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><!-- [et_pb_line_break_holder] -->        <path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4\"\/><!-- [et_pb_line_break_holder] -->        <polyline points=\"17 8 12 3 7 8\"\/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"\/><!-- [et_pb_line_break_holder] -->      <\/svg><!-- [et_pb_line_break_holder] -->      Choose Files<!-- [et_pb_line_break_holder] -->    <\/button><!-- [et_pb_line_break_holder] -->    <input type=\"file\" id=\"fi\" accept=\"audio\/*\" multiple><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] -->   <\/p>\n<div class=\"engine-status\" id=\"engStatus\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<div class=\"dot\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->      <span id=\"engText\">Loading analysis engine\u2026<\/span><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"queue\" id=\"queue\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"q-hdr\"><!-- [et_pb_line_break_holder] -->      <span id=\"qlbl\">0 tracks<\/span><!-- [et_pb_line_break_holder] -->      <button class=\"btn-clr\" id=\"bclr\">Clear all<\/button><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"cards\" id=\"cards\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><script><!-- [et_pb_line_break_holder] -->\/\/ \u2500\u2500\u2500 Essentia init \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->\/\/ essentia-wasm.web.js exposes EssentiaWASM as a global factory function.<!-- [et_pb_line_break_holder] -->\/\/ essentia.js-core.js exposes Essentia as a global class.<!-- [et_pb_line_break_holder] -->\/\/ We must wait for window.onload so both scripts are fully parsed.<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let essentia = null;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->window.addEventListener('load', function () {<!-- [et_pb_line_break_holder] -->  const engStatus = document.getElementById('engStatus');<!-- [et_pb_line_break_holder] -->  const engText   = document.getElementById('engText');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ Verify both globals exist before calling<!-- [et_pb_line_break_holder] -->  if (typeof EssentiaWASM === 'undefined' || typeof Essentia === 'undefined') {<!-- [et_pb_line_break_holder] -->    engStatus.className = 'engine-status error-st';<!-- [et_pb_line_break_holder] -->    engText.textContent = 'Engine failed to load \u2014 check file paths in page source.';<!-- [et_pb_line_break_holder] -->    console.error('EssentiaWASM or Essentia global not found. Verify script src paths.');<!-- [et_pb_line_break_holder] -->    return;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ EssentiaWASM() returns a Promise that resolves with the WASM module<!-- [et_pb_line_break_holder] -->  EssentiaWASM().then(function (wasmModule) {<!-- [et_pb_line_break_holder] -->    essentia = new Essentia(wasmModule);<!-- [et_pb_line_break_holder] -->    console.log('Essentia ready, version:', essentia.version);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    engStatus.className = 'engine-status ready';<!-- [et_pb_line_break_holder] -->    engText.textContent = 'Engine ready \u2014 ' + essentia.version;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Unlock drop zone<!-- [et_pb_line_break_holder] -->    document.getElementById('dz').classList.remove('disabled');<!-- [et_pb_line_break_holder] -->    document.getElementById('btnPick').disabled = false;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  }).catch(function (err) {<!-- [et_pb_line_break_holder] -->    console.error('Essentia WASM init failed:', err);<!-- [et_pb_line_break_holder] -->    engStatus.className = 'engine-status error-st';<!-- [et_pb_line_break_holder] -->    engText.textContent = 'Engine failed to initialize. See console for details.';<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] -->});<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/\/ \u2500\u2500\u2500 UI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->const dz    = document.getElementById('dz');<!-- [et_pb_line_break_holder] -->const fi    = document.getElementById('fi');<!-- [et_pb_line_break_holder] -->const queue = document.getElementById('queue');<!-- [et_pb_line_break_holder] -->const qlbl  = document.getElementById('qlbl');<!-- [et_pb_line_break_holder] -->const cards = document.getElementById('cards');<!-- [et_pb_line_break_holder] -->const bclr  = document.getElementById('bclr');<!-- [et_pb_line_break_holder] -->let total   = 0;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->document.getElementById('btnPick').addEventListener('click', function(e) {<!-- [et_pb_line_break_holder] -->  e.stopPropagation(); fi.click();<!-- [et_pb_line_break_holder] -->});<!-- [et_pb_line_break_holder] -->dz.addEventListener('click', function() {<!-- [et_pb_line_break_holder] -->  if (!dz.classList.contains('disabled') && !dz.classList.contains('compact')) fi.click();<!-- [et_pb_line_break_holder] -->});<!-- [et_pb_line_break_holder] -->dz.addEventListener('dragover',  function(e) { e.preventDefault(); if (!dz.classList.contains('disabled')) dz.classList.add('over'); });<!-- [et_pb_line_break_holder] -->dz.addEventListener('dragleave', function()  { dz.classList.remove('over'); });<!-- [et_pb_line_break_holder] -->dz.addEventListener('drop',      function(e) {<!-- [et_pb_line_break_holder] -->  e.preventDefault(); dz.classList.remove('over');<!-- [et_pb_line_break_holder] -->  if (!dz.classList.contains('disabled')) handle(e.dataTransfer.files);<!-- [et_pb_line_break_holder] -->});<!-- [et_pb_line_break_holder] -->fi.addEventListener('change', function() { handle(fi.files); });<!-- [et_pb_line_break_holder] -->bclr.addEventListener('click', function() {<!-- [et_pb_line_break_holder] -->  cards.innerHTML = ''; total = 0; queue.style.display = 'none'; fi.value = '';<!-- [et_pb_line_break_holder] -->  dz.classList.remove('compact');<!-- [et_pb_line_break_holder] -->});<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function handle(files) {<!-- [et_pb_line_break_holder] -->  var list = Array.from(files).filter(function(f) {<!-- [et_pb_line_break_holder] -->    return f.type.startsWith('audio\/') || \/\\.(mp3|wav|flac|aac|ogg|m4a|opus|aif|aiff)$\/i.test(f.name);<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] -->  if (!list.length) return;<!-- [et_pb_line_break_holder] -->  queue.style.display = 'block';<!-- [et_pb_line_break_holder] -->  \/\/ Compact drop zone after first batch<!-- [et_pb_line_break_holder] -->  if (!dz.classList.contains('compact')) {<!-- [et_pb_line_break_holder] -->    dz.classList.add('compact');<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  list.forEach(addTrack);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function fmtSize(b) {<!-- [et_pb_line_break_holder] -->  return b < 1048576 ? (b\/1024).toFixed(0)+' KB' : (b\/1048576).toFixed(1)+' MB';<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->function esc(s) {<!-- [et_pb_line_break_holder] -->  return s.replace(\/&\/g,'&').replace(\/<\/g,'<').replace(\/>\/g,'>').replace(\/\"\/g,'\"');<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/\/ \u2500\u2500\u2500 Add track card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->function addTrack(file) {<!-- [et_pb_line_break_holder] -->  total++;<!-- [et_pb_line_break_holder] -->  qlbl.textContent = total + ' track' + (total !== 1 ? 's' : '');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  var id = 'c' + Date.now() + Math.random().toString(36).slice(2, 6);<!-- [et_pb_line_break_holder] -->  var card = document.createElement('div');<!-- [et_pb_line_break_holder] -->  card.className = 'card analyzing';<!-- [et_pb_line_break_holder] -->  card.id = id;<!-- [et_pb_line_break_holder] -->  card.innerHTML =<!-- [et_pb_line_break_holder] -->    '<\/p>\n<div class=\"pbar\"><\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->    '<\/p>\n<div class=\"top\">' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"thumb\">' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"bars\"><s><\/s><s><\/s><s><\/s><s><\/s><s><\/s><\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"note-icon\">' +<!-- [et_pb_line_break_holder] -->          '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\">' +<!-- [et_pb_line_break_holder] -->            '<defs><linearGradient id=\"ng' + id + '\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">' +<!-- [et_pb_line_break_holder] -->            '<stop offset=\"0%\" stop-color=\"#f3be29\"\/><stop offset=\"100%\" stop-color=\"#cd3ba7\"\/>' +<!-- [et_pb_line_break_holder] -->            '<\/linearGradient><\/defs>' +<!-- [et_pb_line_break_holder] -->            '<path d=\"M9 18V5l12-2v13\" stroke=\"url(#ng' + id + ')\"\/>' +<!-- [et_pb_line_break_holder] -->            '<circle cx=\"6\" cy=\"18\" r=\"3\" stroke=\"url(#ng' + id + ')\"\/>' +<!-- [et_pb_line_break_holder] -->            '<circle cx=\"18\" cy=\"16\" r=\"3\" stroke=\"url(#ng' + id + ')\"\/>' +<!-- [et_pb_line_break_holder] -->          '<\/svg>' +<!-- [et_pb_line_break_holder] -->        '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"info\">' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"fname\" title=\"' + esc(file.name) + '\">' + esc(file.name) + '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"fsize\">' + fmtSize(file.size) + '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"cstatus st-a\" id=\"st-' + id + '\">Analyzing\u2026<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->    '<\/div>\n<p>';<!-- [et_pb_line_break_holder] -->  cards.appendChild(card);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ Decode and analyze<!-- [et_pb_line_break_holder] -->  var audioCtx = new (window.AudioContext || window.webkitAudioContext)({ sampleRate: 44100 });<!-- [et_pb_line_break_holder] -->  file.arrayBuffer()<!-- [et_pb_line_break_holder] -->    .then(function(ab) { return audioCtx.decodeAudioData(ab); })<!-- [et_pb_line_break_holder] -->    .then(function(buf) {<!-- [et_pb_line_break_holder] -->      audioCtx.close();<!-- [et_pb_line_break_holder] -->      return analyze(buf);<!-- [et_pb_line_break_holder] -->    })<!-- [et_pb_line_break_holder] -->    .then(function(result) { showResult(id, result.bpm, result.key); })<!-- [et_pb_line_break_holder] -->    .catch(function(err) {<!-- [et_pb_line_break_holder] -->      console.error('Analysis error:', err);<!-- [et_pb_line_break_holder] -->      audioCtx.close().catch(function(){});<!-- [et_pb_line_break_holder] -->      showError(id);<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/\/ \u2500\u2500\u2500 Essentia analysis \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->function analyze(audioBuf) {<!-- [et_pb_line_break_holder] -->  return new Promise(function(resolve, reject) {<!-- [et_pb_line_break_holder] -->    try {<!-- [et_pb_line_break_holder] -->      \/\/ Mix to mono<!-- [et_pb_line_break_holder] -->      var nCh  = audioBuf.numberOfChannels;<!-- [et_pb_line_break_holder] -->      var len  = audioBuf.length;<!-- [et_pb_line_break_holder] -->      var mono = new Float32Array(len);<!-- [et_pb_line_break_holder] -->      for (var c = 0; c < nCh; c++) {<!-- [et_pb_line_break_holder] -->        var ch = audioBuf.getChannelData(c);<!-- [et_pb_line_break_holder] -->        for (var i = 0; i < len; i++) mono[i] += ch[i] \/ nCh;<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      var signal = essentia.arrayToVector(mono);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      \/\/ BPM \u2014 PercivalBpmEstimator<!-- [et_pb_line_break_holder] -->      \/\/ Params: signal, frameSize, frameSizeOSS, hopSize, hopSizeOSS, maxBPM, minBPM, sampleRate<!-- [et_pb_line_break_holder] -->      var bpmOut = essentia.PercivalBpmEstimator(<!-- [et_pb_line_break_holder] -->        signal, 1024, 2048, 128, 128, 210, 50, audioBuf.sampleRate<!-- [et_pb_line_break_holder] -->      );<!-- [et_pb_line_break_holder] -->      var bpm = bpmOut.bpm;<!-- [et_pb_line_break_holder] -->      \/\/ Fold into 60\u2013180 range<!-- [et_pb_line_break_holder] -->      while (bpm > 0 && bpm < 60)  bpm *= 2;<!-- [et_pb_line_break_holder] -->      while (bpm > 180)            bpm \/= 2;<!-- [et_pb_line_break_holder] -->      bpm = Math.round(bpm);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      \/\/ KEY \u2014 KeyExtractor (HPCP-based)<!-- [et_pb_line_break_holder] -->      \/\/ Params: audio, averageDetuningCorrection, frameSize, hopSize, hpcpSize,<!-- [et_pb_line_break_holder] -->      \/\/         maxFrequency, maximumSpectralPeaks, minFrequency, pcpThreshold,<!-- [et_pb_line_break_holder] -->      \/\/         profileType, sampleRate, spectralPeaksThreshold,<!-- [et_pb_line_break_holder] -->      \/\/         tuningFrequency, weightType, windowType<!-- [et_pb_line_break_holder] -->      var keyOut = essentia.KeyExtractor(<!-- [et_pb_line_break_holder] -->        signal,<!-- [et_pb_line_break_holder] -->        true, 4096, 4096, 12, 3500, 60, 25, 0.2,<!-- [et_pb_line_break_holder] -->        'bgate', audioBuf.sampleRate, 0.0001, 440, 'cosine', 'hann'<!-- [et_pb_line_break_holder] -->      );<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      signal.delete();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      resolve({ bpm: bpm, key: keyOut.key + ' ' + keyOut.scale });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    } catch(e) {<!-- [et_pb_line_break_holder] -->      reject(e);<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/\/ \u2500\u2500\u2500 Key helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->var CAMELOT = {<!-- [et_pb_line_break_holder] -->  \/\/ major<!-- [et_pb_line_break_holder] -->  'C major':   {wheel:'8B',  rel:'A minor',   compat:['G major','F major']},<!-- [et_pb_line_break_holder] -->  'G major':   {wheel:'9B',  rel:'E minor',   compat:['D major','C major']},<!-- [et_pb_line_break_holder] -->  'D major':   {wheel:'10B', rel:'B minor',   compat:['A major','G major']},<!-- [et_pb_line_break_holder] -->  'A major':   {wheel:'11B', rel:'F# minor',  compat:['E major','D major']},<!-- [et_pb_line_break_holder] -->  'E major':   {wheel:'12B', rel:'C# minor',  compat:['B major','A major']},<!-- [et_pb_line_break_holder] -->  'B major':   {wheel:'1B',  rel:'G# minor',  compat:['F# major','E major']},<!-- [et_pb_line_break_holder] -->  'F# major':  {wheel:'2B',  rel:'D# minor',  compat:['C# major','B major']},<!-- [et_pb_line_break_holder] -->  'Db major':  {wheel:'3B',  rel:'Bb minor',  compat:['Ab major','Gb major']},<!-- [et_pb_line_break_holder] -->  'Ab major':  {wheel:'4B',  rel:'F minor',   compat:['Eb major','Db major']},<!-- [et_pb_line_break_holder] -->  'Eb major':  {wheel:'5B',  rel:'C minor',   compat:['Bb major','Ab major']},<!-- [et_pb_line_break_holder] -->  'Bb major':  {wheel:'6B',  rel:'G minor',   compat:['F major','Eb major']},<!-- [et_pb_line_break_holder] -->  'F major':   {wheel:'7B',  rel:'D minor',   compat:['C major','Bb major']},<!-- [et_pb_line_break_holder] -->  \/\/ minor<!-- [et_pb_line_break_holder] -->  'A minor':   {wheel:'8A',  rel:'C major',   compat:['E minor','D minor']},<!-- [et_pb_line_break_holder] -->  'E minor':   {wheel:'9A',  rel:'G major',   compat:['B minor','A minor']},<!-- [et_pb_line_break_holder] -->  'B minor':   {wheel:'10A', rel:'D major',   compat:['F# minor','E minor']},<!-- [et_pb_line_break_holder] -->  'F# minor':  {wheel:'11A', rel:'A major',   compat:['C# minor','B minor']},<!-- [et_pb_line_break_holder] -->  'C# minor':  {wheel:'12A', rel:'E major',   compat:['G# minor','F# minor']},<!-- [et_pb_line_break_holder] -->  'G# minor':  {wheel:'1A',  rel:'B major',   compat:['D# minor','C# minor']},<!-- [et_pb_line_break_holder] -->  'D# minor':  {wheel:'2A',  rel:'F# major',  compat:['A# minor','G# minor']},<!-- [et_pb_line_break_holder] -->  'Bb minor':  {wheel:'3A',  rel:'Db major',  compat:['F minor','Eb minor']},<!-- [et_pb_line_break_holder] -->  'F minor':   {wheel:'4A',  rel:'Ab major',  compat:['C minor','Bb minor']},<!-- [et_pb_line_break_holder] -->  'C minor':   {wheel:'5A',  rel:'Eb major',  compat:['G minor','F minor']},<!-- [et_pb_line_break_holder] -->  'G minor':   {wheel:'6A',  rel:'Bb major',  compat:['D minor','C minor']},<!-- [et_pb_line_break_holder] -->  'D minor':   {wheel:'7A',  rel:'F major',   compat:['A minor','G minor']}<!-- [et_pb_line_break_holder] -->};<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/\/ \u2500\u2500\u2500 Card result\/error rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<!-- [et_pb_line_break_holder] -->function showResult(id, bpm, key) {<!-- [et_pb_line_break_holder] -->  var card = document.getElementById(id);<!-- [et_pb_line_break_holder] -->  if (!card) return;<!-- [et_pb_line_break_holder] -->  card.classList.remove('analyzing');<!-- [et_pb_line_break_holder] -->  card.classList.add('done');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  var pb = card.querySelector('.pbar');<!-- [et_pb_line_break_holder] -->  pb.style.animation = 'none'; pb.style.width = '100%';<!-- [et_pb_line_break_holder] -->  setTimeout(function() { pb.style.transition = 'opacity .5s'; pb.style.opacity = '0'; }, 500);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  var st = document.getElementById('st-' + id);<!-- [et_pb_line_break_holder] -->  st.className = 'cstatus st-d';<!-- [et_pb_line_break_holder] -->  st.textContent = '\u2713';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  var parts    = key.split(' ');<!-- [et_pb_line_break_holder] -->  var keyNote  = parts[0] || key;<!-- [et_pb_line_break_holder] -->  var keyScale = parts[1] || '';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ BPM sub-values<!-- [et_pb_line_break_holder] -->  var bpmHalf   = Math.round(bpm \/ 2);<!-- [et_pb_line_break_holder] -->  var bpmDouble = bpm * 2;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ Key sub-values from Camelot wheel<!-- [et_pb_line_break_holder] -->  var keyFull = keyNote + ' ' + keyScale;<!-- [et_pb_line_break_holder] -->  var keyInfo = CAMELOT[keyFull];<!-- [et_pb_line_break_holder] -->  var keySubHTML = '';<!-- [et_pb_line_break_holder] -->  if (keyInfo) {<!-- [et_pb_line_break_holder] -->    var c1 = keyInfo.compat[0], c2 = keyInfo.compat[1];<!-- [et_pb_line_break_holder] -->    keySubHTML =<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"sub-vals\">' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"sv\"><span>' + keyInfo.rel + '<\/span>Relative<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"sv-sep\"><\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"sv\"><span>' + keyInfo.wheel + '<\/span>Camelot<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/div>\n<p>';<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  var res = document.createElement('div');<!-- [et_pb_line_break_holder] -->  res.className = 'results';<!-- [et_pb_line_break_holder] -->  res.innerHTML =<!-- [et_pb_line_break_holder] -->    '<\/p>\n<div class=\"chip\">' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"lbl\">BPM<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"val\">' + bpm + '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"unit\">beats \/ min<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"sub-vals\">' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"sv\"><span>' + bpmHalf + '<\/span>\u00f7 2<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"sv-sep\"><\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->        '<\/p>\n<div class=\"sv\"><span>' + bpmDouble + '<\/span>\u00d7 2<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->    '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->    '<\/p>\n<div class=\"chip\">' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"lbl\">Key<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"val\" style=\"font-size:' + (keyNote.length > 2 ? '22px' : '28px') + '\">' + keyNote + '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      '<\/p>\n<div class=\"unit\">' + keyScale + '<\/div>\n<p>' +<!-- [et_pb_line_break_holder] -->      keySubHTML +<!-- [et_pb_line_break_holder] -->    '<\/div>\n<p>';<!-- [et_pb_line_break_holder] -->  card.appendChild(res);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function showError(id) {<!-- [et_pb_line_break_holder] -->  var card = document.getElementById(id);<!-- [et_pb_line_break_holder] -->  if (!card) return;<!-- [et_pb_line_break_holder] -->  card.classList.remove('analyzing'); card.classList.add('err');<!-- [et_pb_line_break_holder] -->  card.querySelector('.pbar').style.display = 'none';<!-- [et_pb_line_break_holder] -->  var st = document.getElementById('st-' + id);<!-- [et_pb_line_break_holder] -->  st.className = 'cstatus st-e';<!-- [et_pb_line_break_holder] -->  st.textContent = 'Error';<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><\/script><!-- [et_pb_line_break_holder] --><\/body><!-- [et_pb_line_break_holder] --><\/html>[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Hero Section&#8221; _builder_version=&#8221;4.27.5&#8243; background_color=&#8221;#000000&#8243; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_stops=&#8221;#000000 0%|rgba(0,0,0,0) 20%|rgba(0,0,0,0) 80%|#000000 100%&#8221; background_color_gradient_overlays_image=&#8221;on&#8221; background_image=&#8221;https:\/\/smartdsp.pro\/wp-content\/uploads\/2022\/10\/streamer-79.png&#8221; custom_padding=&#8221;9px|||1px||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.16&#8243; background_size=&#8221;initial&#8221; background_position=&#8221;top_left&#8221; background_repeat=&#8221;repeat&#8221; module_alignment=&#8221;center&#8221; custom_width_px=&#8221;700px&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.16&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_text _builder_version=&#8221;4.16&#8243; text_font=&#8221;||||||||&#8221; text_font_size=&#8221;18px&#8221; text_line_height=&#8221;2em&#8221; header_font=&#8221;Titillium Web||||||||&#8221; header_font_size=&#8221;66px&#8221; header_line_height=&#8221;1.5em&#8221; header_2_font=&#8221;Titillium Web||||||||&#8221; header_2_font_size=&#8221;66px&#8221; header_2_line_height=&#8221;1.5em&#8221; header_3_font=&#8221;Titillium Web||||||||&#8221; header_3_font_size=&#8221;66px&#8221; header_3_line_height=&#8221;1.5em&#8221; header_4_font=&#8221;Titillium Web||||||||&#8221; header_4_font_size=&#8221;66px&#8221; header_4_line_height=&#8221;1.5em&#8221; header_5_font=&#8221;Titillium Web||||||||&#8221; header_5_font_size=&#8221;66px&#8221; header_5_line_height=&#8221;1.5em&#8221; header_6_font=&#8221;Titillium Web||||||||&#8221; header_6_font_size=&#8221;66px&#8221; header_6_line_height=&#8221;1.5em&#8221; text_orientation=&#8221;center&#8221; background_layout=&#8221;dark&#8221; max_width=&#8221;700px&#8221; module_alignment=&#8221;center&#8221; header_font_size_tablet=&#8221;40px&#8221; header_font_size_phone=&#8221;&#8221; header_font_size_last_edited=&#8221;on|phone&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<h1>Frequently Asked<\/h1>\n<p>[\/et_pb_text][et_pb_code _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_code][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_2,1_2&#8243; custom_padding_last_edited=&#8221;on|desktop&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;default&#8221; background_color=&#8221;rgba(79,79,79,0.16)&#8221; overflow-x=&#8221;visible&#8221; overflow-y=&#8221;visible&#8221; custom_padding=&#8221;80px|80px|80px|80px|true|true&#8221; custom_padding_tablet=&#8221;30px|30px|30px|30px|true|true&#8221; custom_padding_phone=&#8221;20px|20px|20px|20px|true|true&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_horizontal=&#8221;-1px&#8221; box_shadow_vertical=&#8221;-1px&#8221; box_shadow_blur=&#8221;0px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.21)&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.17.4&#8243; _module_preset=&#8221;default&#8221; custom_padding_tablet=&#8221;||||false|false&#8221; custom_padding_phone=&#8221;||30px||false|false&#8221; custom_padding_last_edited=&#8221;off|phone&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;How to use it \u2014 3 steps&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;100ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<div class=\"faq-answer\">\n<ol class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3\">\n<li class=\"whitespace-normal break-words pl-2\"><strong>Drop your file<\/strong> onto the upload zone, or click &#8220;Choose Files&#8221; to browse. Supports WAV, MP3, FLAC, AIFF, AAC, and OGG.<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Wait a few seconds.<\/strong> Analysis runs automatically the moment a file is loaded \u2014 no button to click. You&#8217;ll see the processing steps animate in real time.<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Read your results.<\/strong> BPM and key are displayed, alongside half-time and double-time BPM variants, the relative key.<\/li>\n<\/ol>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">For batch analysis, drop multiple files at once. Each file is analyzed in parallel and results appear as they complete \u2014 no waiting for the full queue to finish.<\/p>\n<\/div>\n<\/div>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;How does it work?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<p data-start=\"809\" data-end=\"896\">This tool uses advanced <strong data-start=\"833\" data-end=\"858\">audio signal analysis<\/strong> running entirely inside your browser.<\/p>\n<p data-start=\"898\" data-end=\"954\">Here\u2019s what happens behind the scenes (in simple terms):<\/p>\n<ul data-start=\"956\" data-end=\"1327\">\n<li data-start=\"956\" data-end=\"1015\">\n<p data-start=\"958\" data-end=\"1015\">Your track is decoded locally using the Web Audio engine.<\/p>\n<\/li>\n<li data-start=\"1016\" data-end=\"1081\">\n<p data-start=\"1018\" data-end=\"1081\">The audio is converted to mono for accurate rhythmic detection.<\/p>\n<\/li>\n<li data-start=\"1082\" data-end=\"1171\">\n<p data-start=\"1084\" data-end=\"1171\">A professional BPM detection algorithm analyzes rhythmic patterns and transient energy.<\/p>\n<\/li>\n<li data-start=\"1172\" data-end=\"1257\">\n<p data-start=\"1174\" data-end=\"1257\">A harmonic analysis engine extracts pitch information to determine the musical key.<\/p>\n<\/li>\n<li data-start=\"1258\" data-end=\"1327\">\n<p data-start=\"1260\" data-end=\"1327\">The result is mapped to standard notation and Camelot wheel format.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"1329\" data-end=\"1464\">All processing runs in real-time using WebAssembly for speed and precision \u2014 similar to desktop-grade audio software, but fully online.<\/p>\n<\/div>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;What do the results mean?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>BPM<\/strong> \u2014 The detected tempo in beats per minute. This is the primary beat pulse of the track.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Half-time BPM<\/strong> \u2014 Exactly half the detected BPM. Useful if the track feels like it could be interpreted at a slower, heavier groove. Common in genres like hip-hop, trap, and half-time drum and bass.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Double-time BPM<\/strong> \u2014 Exactly double the detected BPM. Relevant if the track&#8217;s energy feels faster than the stated tempo suggests \u2014 common in techno and hardstyle DJ contexts.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Key<\/strong> \u2014 The detected musical key (e.g. A Minor, F\u266f Major). Displayed with a confidence percentage.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Relative Key<\/strong> \u2014 Every major key has a relative minor that shares the same notes (and vice versa). If a track is detected as C Major, its relative minor is A Minor. Both are shown because ambiguity between relative pairs is common and musically meaningful.<\/p>\n<\/div>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;Is my music safe? Will my files be uploaded?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;100ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<div class=\"faq-answer\">\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>No files are uploaded. Ever.<\/strong><\/p>\n<p data-start=\"2119\" data-end=\"2155\">Your music never leaves your device.<\/p>\n<p data-start=\"2157\" data-end=\"2250\">This BPM &amp; key detector runs entirely inside your browser using local processing.<br data-start=\"2238\" data-end=\"2241\" \/>There is:<\/p>\n<ul data-start=\"2252\" data-end=\"2334\">\n<li data-start=\"2252\" data-end=\"2270\">\n<p data-start=\"2254\" data-end=\"2270\">No file upload<\/p>\n<\/li>\n<li data-start=\"2271\" data-end=\"2291\">\n<p data-start=\"2273\" data-end=\"2291\">No cloud storage<\/p>\n<\/li>\n<li data-start=\"2292\" data-end=\"2318\">\n<p data-start=\"2294\" data-end=\"2318\">No background transfer<\/p>\n<\/li>\n<li data-start=\"2319\" data-end=\"2334\">\n<p data-start=\"2321\" data-end=\"2334\">No tracking<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"2336\" data-end=\"2417\">If you disconnect your internet after -fully- loading the page, the tool will still work.<\/p>\n<p data-start=\"2419\" data-end=\"2442\"><em>Your audio stays yours.<\/em><\/p>\n<\/div>\n<\/div>\n<p>[\/et_pb_blurb][\/et_pb_column][et_pb_column type=&#8221;1_2&#8243; _builder_version=&#8221;4.17.4&#8243; _module_preset=&#8221;default&#8221; custom_padding_tablet=&#8221;|||0%|false|false&#8221; custom_padding_phone=&#8221;|||0%|false|false&#8221; custom_padding_last_edited=&#8221;off|desktop&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_blurb title=&#8221;What is this tool?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;250ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<div class=\"faq-answer\">\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">BPM &amp; Key Detector is a free, professional-grade audio analysis tool that instantly detects the <strong>BPM (tempo)<\/strong> and <strong>musical key<\/strong> of any audio file \u2014 directly in your browser, with no uploads, no account, and no limits.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Drop a track, get results in seconds. That&#8217;s it.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">It&#8217;s built for producers, DJs, sound designers, and music educators who need fast, reliable analysis without handing their unreleased music to a third-party server.<\/p>\n<\/div>\n<\/div>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;What makes this different from other BPM\/key tools?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;150ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<p data-start=\"1530\" data-end=\"1631\">Unlike other platforms:<\/p>\n<ul data-start=\"1633\" data-end=\"1796\">\n<li data-start=\"1633\" data-end=\"1668\">\n<p data-start=\"1635\" data-end=\"1668\">Your files are <strong data-start=\"1650\" data-end=\"1668\">never uploaded<br \/><\/strong><\/p>\n<\/li>\n<li data-start=\"1633\" data-end=\"1668\">Analysis using some of the best algorithms, widely used in music technology applications.<\/li>\n<li data-start=\"1669\" data-end=\"1693\">\n<p data-start=\"1671\" data-end=\"1693\">No account is required<\/p>\n<\/li>\n<li data-start=\"1694\" data-end=\"1711\">\n<p data-start=\"1696\" data-end=\"1711\">No subscription\/ No PayWall<\/p>\n<\/li>\n<li data-start=\"1712\" data-end=\"1720\">\n<p data-start=\"1714\" data-end=\"1720\">No ads<\/p>\n<\/li>\n<li data-start=\"1721\" data-end=\"1762\">\n<p data-start=\"1723\" data-end=\"1762\">No file size limits imposed by a server<\/p>\n<\/li>\n<li data-start=\"1763\" data-end=\"1796\">\n<p data-start=\"1765\" data-end=\"1796\">No waiting for cloud processing<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"1798\" data-end=\"1843\">Everything runs 100% locally on your machine.<\/p>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;What formats are supported?&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;100ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<div class=\"faq-answer\">\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">WAV \u00b7 MP3 \u00b7 FLAC \u00b7 AIFF \u00b7 AAC \/ M4A \u00b7 OGG \/ Opus<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The tool uses your browser&#8217;s native audio decoder, which means format support mirrors what your browser supports natively \u2014 broadly excellent across Chrome, Firefox, Edge, and Safari.<\/p>\n<\/div>\n<\/div>\n<p>[\/et_pb_blurb][et_pb_blurb title=&#8221;What are the limitations? (Honest answer)&#8221; use_icon=&#8221;on&#8221; font_icon=&#8221;&#x75;||divi||400&#8243; icon_color=&#8221;#f3be29&#8243; icon_placement=&#8221;left&#8221; _builder_version=&#8221;4.27.5&#8243; header_font=&#8221;&#8211;et_global_heading_font|700||on|||||&#8221; header_font_size=&#8221;14px&#8221; header_letter_spacing=&#8221;2px&#8221; header_line_height=&#8221;1.8em&#8221; body_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; body_text_color=&#8221;#FFFFFF&#8221; body_font_size=&#8221;16px&#8221; body_line_height=&#8221;1.8em&#8221; background_enable_color=&#8221;off&#8221; use_background_color_gradient=&#8221;on&#8221; background_color_gradient_direction=&#8221;164deg&#8221; background_color_gradient_stops=&#8221;rgba(243,190,41,0.17) 0%|rgba(205,59,167,0.17) 100%&#8221; background_layout=&#8221;dark&#8221; custom_margin=&#8221;||12%|&#8221; custom_margin_tablet=&#8221;70px|||&#8221; custom_margin_last_edited=&#8221;off|desktop&#8221; custom_padding=&#8221;30px|16px|30px|16px&#8221; animation_style=&#8221;fold&#8221; animation_delay=&#8221;100ms&#8221; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;]<\/p>\n<div class=\"faq-item\">\n<div class=\"faq-answer\">\n<p data-start=\"2481\" data-end=\"2527\">Since everything runs locally in your browser:<\/p>\n<ul data-start=\"2529\" data-end=\"2821\">\n<li data-start=\"2529\" data-end=\"2611\">\n<p data-start=\"2531\" data-end=\"2611\">Very long files may briefly cause your browser tab to slow down during analysis.<\/p>\n<\/li>\n<li data-start=\"2612\" data-end=\"2687\">\n<p data-start=\"2614\" data-end=\"2687\">This is completely normal and depends on your computer\u2019s CPU performance.<\/p>\n<\/li>\n<li data-start=\"2688\" data-end=\"2744\">\n<p data-start=\"2690\" data-end=\"2744\">Once analysis finishes, performance returns to normal.<\/p>\n<\/li>\n<li data-start=\"2745\" data-end=\"2821\">\n<p data-start=\"2747\" data-end=\"2821\">Older devices may take slightly longer to process large WAV or FLAC files.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"2823\" data-end=\"2895\">There are no artificial restrictions \u2014 just normal hardware limitations.<\/p>\n<p data-start=\"2897\" data-end=\"3007\">For best performance, short edits or full tracks under 5-10 minutes will analyze quickly (within a few seconds) on most modern systems.<\/p>\n<\/div>\n<\/div>\n<p>[\/et_pb_blurb][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_heading title=&#8221;We&#8217;ve much more for you to explore:&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; title_level=&#8221;h2&#8243; title_font=&#8221;&#8211;et_global_heading_font||||||||&#8221; title_text_color=&#8221;#FFFFFF&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_heading][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_4,1_4,1_4,1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_margin=&#8221;1vw|auto||auto|false|false&#8221; animation_style=&#8221;flip&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/smartdsp.pro\/mastering-services&#8221; button_text=&#8221;Mastering&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;3117bc07-6a8a-4679-b3bb-b6ed74b48a2f&#8221; custom_button=&#8221;on&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_bg_enable_color__hover=&#8221;on&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_border_radius__hover=&#8221;15px&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221;][\/et_pb_button][\/et_pb_column][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/smartdsp.pro\/smart-dsp-products\/&#8221; button_text=&#8221;Audio Effects&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.4&#8243; _module_preset=&#8221;3117bc07-6a8a-4679-b3bb-b6ed74b48a2f&#8221; custom_button=&#8221;on&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_bg_enable_color__hover=&#8221;on&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_border_radius__hover=&#8221;15px&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221;][\/et_pb_button][\/et_pb_column][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/www.patreon.com\/posts\/how-to-get-most-96445637&#8243; url_new_window=&#8221;on&#8221; button_text=&#8221;Learning&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;3117bc07-6a8a-4679-b3bb-b6ed74b48a2f&#8221; custom_button=&#8221;on&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_bg_enable_color__hover=&#8221;on&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_border_radius__hover=&#8221;15px&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221;][\/et_pb_button][\/et_pb_column][et_pb_column type=&#8221;1_4&#8243; _builder_version=&#8221;4.18.0&#8243; custom_padding=&#8221;|||&#8221; global_colors_info=&#8221;{}&#8221; custom_padding__hover=&#8221;|||&#8221;][et_pb_button button_url=&#8221;https:\/\/smartdsp.pro\/tools&#8221; button_text=&#8221;Online Tools&#8221; button_alignment=&#8221;center&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;3117bc07-6a8a-4679-b3bb-b6ed74b48a2f&#8221; custom_button=&#8221;on&#8221; button_text_color=&#8221;#FFFFFF&#8221; button_bg_use_color_gradient=&#8221;on&#8221; button_bg_color_gradient_direction=&#8221;229deg&#8221; button_bg_color_gradient_stops=&#8221;rgba(189,22,179,0.8) 0%|rgba(253,202,65,0.8) 100%&#8221; button_border_width=&#8221;0px&#8221; button_border_radius=&#8221;15px&#8221; button_font=&#8221;Be Vietnam Pro|600|||||||&#8221; button_use_icon=&#8221;off&#8221; box_shadow_style=&#8221;preset1&#8243; box_shadow_blur=&#8221;35px&#8221; box_shadow_spread=&#8221;-11px&#8221; box_shadow_color=&#8221;rgba(255,255,255,0.28)&#8221; global_colors_info=&#8221;{}&#8221; button_bg_color__hover_enabled=&#8221;on|desktop&#8221; button_bg_color__hover=&#8221;rgba(0,127,31,0.7)&#8221; button_bg_enable_color__hover=&#8221;on&#8221; button_border_width__hover=&#8221;0px&#8221; button_border_width__hover_enabled=&#8221;on|desktop&#8221; button_border_radius__hover=&#8221;15px&#8221; button_border_radius__hover_enabled=&#8221;on|desktop&#8221; box_shadow_color__hover=&#8221;rgba(255,255,255,0.49)&#8221; box_shadow_color__hover_enabled=&#8221;on|hover&#8221; button_text_size__hover_enabled=&#8221;on|desktop&#8221; button_border_color__hover=&#8221;rgba(255,255,255,0.02)&#8221; button_border_color__hover_enabled=&#8221;on|hover&#8221; button_icon_color__hover=&#8221;#FFFFFF&#8221; button_icon_color__hover_enabled=&#8221;on|hover&#8221;][\/et_pb_button][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Detect BPM and Musical Key of audio files in seconds, from your browser. Local processing, free, no ads, no account required, no limits.<\/p>","protected":false},"author":392,"featured_media":4727,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-4699","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages\/4699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/users\/392"}],"replies":[{"embeddable":true,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/comments?post=4699"}],"version-history":[{"count":27,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages\/4699\/revisions"}],"predecessor-version":[{"id":4738,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages\/4699\/revisions\/4738"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/media\/4727"}],"wp:attachment":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/media?parent=4699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}