{"id":3106,"date":"2026-08-29T06:55:40","date_gmt":"2026-08-29T06:55:40","guid":{"rendered":"https:\/\/produccionmusic.com\/blog\/?p=3106"},"modified":"2026-08-31T06:51:25","modified_gmt":"2026-08-31T06:51:25","slug":"analizar-bpm-tonalidad-online","status":"publish","type":"post","link":"https:\/\/produccionmusic.com\/blog\/analizar-bpm-tonalidad-online\/","title":{"rendered":"Analizador de BPM y Tonalidad Online"},"content":{"rendered":"<div id=\"pm-analyzer\" aria-live=\"polite\">\r\n  <div class=\"pma-card\">\r\n    <div class=\"pma-header\">\r\n      <img decoding=\"async\" class=\"pma-logo\" src=\"https:\/\/produccionmusic.com\/assets\/img\/logo-dark@2x.png\" alt=\"ProduccionMusic\" loading=\"lazy\">\r\n      <div class=\"pma-header-txt\">\r\n        <span class=\"pma-header-title\">Analizador de Audio<\/span>\r\n        <span class=\"pma-header-sub\">BPM &middot; Tonalidad &middot; Escala &middot; Camelot<\/span>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"pma-body\">\r\n  <!-- Estado 1: zona de subida -->\r\n  <div class=\"pma-drop\" id=\"pma-drop\" tabindex=\"0\" role=\"button\"\r\n       aria-label=\"Sube un archivo de audio WAV o MP3\">\r\n    <svg class=\"pma-drop-icon\" viewBox=\"0 0 48 48\" width=\"48\" height=\"48\" aria-hidden=\"true\">\r\n      <g fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\">\r\n        <line x1=\"8\"  y1=\"24\" x2=\"8\"  y2=\"24\"\/>\r\n        <line x1=\"15\" y1=\"18\" x2=\"15\" y2=\"30\"\/>\r\n        <line x1=\"22\" y1=\"12\" x2=\"22\" y2=\"36\"\/>\r\n        <line x1=\"29\" y1=\"16\" x2=\"29\" y2=\"32\"\/>\r\n        <line x1=\"36\" y1=\"20\" x2=\"36\" y2=\"28\"\/>\r\n        <line x1=\"43\" y1=\"23\" x2=\"43\" y2=\"25\"\/>\r\n      <\/g>\r\n    <\/svg>\r\n    <p class=\"pma-drop-title\">Arrastra tu WAV o MP3<\/p>\r\n    <p class=\"pma-drop-sub\">o si lo prefieres<\/p>\r\n    <button type=\"button\" class=\"pma-choose\" id=\"pma-choose\">\r\n      <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 15V3\"\/><path d=\"M7 8l5-5 5 5\"\/><path d=\"M4 15v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4\"\/><\/svg>\r\n      Selecciona un archivo\r\n    <\/button>\r\n    <input type=\"file\" id=\"pma-input\" accept=\".wav,.mp3,audio\/wav,audio\/mpeg,audio\/*\" hidden>\r\n    <p class=\"pma-privacy\">&#x1f512; Todo se analiza en tu dispositivo. Tu archivo no se sube a ning\u00fan servidor.<\/p>\r\n  <\/div>\r\n\r\n  <!-- Estado 2: cargando -->\r\n  <div class=\"pma-loading\" id=\"pma-loading\" hidden>\r\n    <div class=\"pma-eq\" aria-hidden=\"true\"><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><\/div>\r\n    <p class=\"pma-status\" id=\"pma-status\">Analizando\u2026<\/p>\r\n    <p class=\"pma-file\" id=\"pma-loading-file\"><\/p>\r\n  <\/div>\r\n\r\n  <!-- Estado 3: resultados -->\r\n  <div class=\"pma-results\" id=\"pma-results\" hidden>\r\n    <div class=\"pma-cols\">\r\n    <div class=\"pma-col-left\">\r\n    <div class=\"pma-hero\">\r\n      <div class=\"pma-hero-cell\">\r\n        <span class=\"pma-hero-label\">BPM<\/span>\r\n        <span class=\"pma-hero-value\" id=\"pma-bpm\">\u2014<\/span>\r\n        <span class=\"pma-hero-note\" id=\"pma-bpm-alt\"><\/span>\r\n      <\/div>\r\n      <div class=\"pma-hero-cell pma-hero-camelot\">\r\n        <span class=\"pma-hero-label\">Tonalidad<\/span>\r\n        <span class=\"pma-hero-value\" id=\"pma-hero-key\">\u2014<\/span>\r\n        <span class=\"pma-hero-note\" id=\"pma-camelot\"><\/span>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"pma-grid\">\r\n      <div class=\"pma-stat\"><span class=\"pma-stat-k\">Tonalidad relativa<\/span><span class=\"pma-stat-v\" id=\"pma-altkey\">\u2014<\/span><\/div>\r\n      <div class=\"pma-stat\"><span class=\"pma-stat-k\">Fiabilidad tonal<\/span><span class=\"pma-stat-v\" id=\"pma-strength\">\u2014<\/span><\/div>\r\n      <div class=\"pma-stat\"><span class=\"pma-stat-k\">Duraci\u00f3n<\/span><span class=\"pma-stat-v\" id=\"pma-duration\">\u2014<\/span><\/div>\r\n      <div class=\"pma-stat\"><span class=\"pma-stat-k\">Bailabilidad<\/span><span class=\"pma-stat-v\" id=\"pma-dance\">\u2014<\/span><\/div>\r\n      <div class=\"pma-stat\"><span class=\"pma-stat-k\">Pico<\/span><span class=\"pma-stat-v\" id=\"pma-peak\">\u2014<\/span><\/div>\r\n      <div class=\"pma-stat\"><span class=\"pma-stat-k\">Loudness (LUFS)<\/span><span class=\"pma-stat-v\" id=\"pma-lufs\">\u2014<\/span><\/div>\r\n      <div class=\"pma-stat\"><span class=\"pma-stat-k\">Muestreo original<\/span><span class=\"pma-stat-v\" id=\"pma-sr\">\u2014<\/span><\/div>\r\n      <div class=\"pma-stat\"><span class=\"pma-stat-k\">Canales<\/span><span class=\"pma-stat-v\" id=\"pma-ch\">\u2014<\/span><\/div>\r\n    <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"pma-col-right\">\r\n    <div class=\"pma-cof-wrap\">\r\n      <div class=\"pma-cof-title\">Tonalidades compatibles<\/div>\r\n      <svg class=\"pma-cof\" viewBox=\"0 0 300 300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" role=\"img\" aria-label=\"C\u00edrculo de quintas con las tonalidades compatibles\">\r\n        <g class=\"pma-cof-seg\" data-pc=\"0\" data-mode=\"major\"><path d=\"M112.21,8.97 A146.0,146.0 0 0 1 187.79,8.97 L176.66,50.51 A103.0,103.0 0 0 0 123.34,50.51 Z\"\/><text x=\"150.0\" y=\"25.5\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">C<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"9\" data-mode=\"minor\"><path d=\"M123.86,52.44 A101.0,101.0 0 0 1 176.14,52.44 L165.53,92.04 A60.0,60.0 0 0 0 134.47,92.04 Z\"\/><text x=\"150.0\" y=\"69.5\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">Am<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"7\" data-mode=\"major\"><path d=\"M187.79,8.97 A146.0,146.0 0 0 1 253.24,46.76 L222.83,77.17 A103.0,103.0 0 0 0 176.66,50.51 Z\"\/><text x=\"212.25\" y=\"42.18\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">G<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"4\" data-mode=\"minor\"><path d=\"M176.14,52.44 A101.0,101.0 0 0 1 221.42,78.58 L192.43,107.57 A60.0,60.0 0 0 0 165.53,92.04 Z\"\/><text x=\"190.25\" y=\"80.28\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">Em<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"2\" data-mode=\"major\"><path d=\"M253.24,46.76 A146.0,146.0 0 0 1 291.03,112.21 L249.49,123.34 A103.0,103.0 0 0 0 222.83,77.17 Z\"\/><text x=\"257.82\" y=\"87.75\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">D<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"11\" data-mode=\"minor\"><path d=\"M221.42,78.58 A101.0,101.0 0 0 1 247.56,123.86 L207.96,134.47 A60.0,60.0 0 0 0 192.43,107.57 Z\"\/><text x=\"219.72\" y=\"109.75\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">Bm<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"9\" data-mode=\"major\"><path d=\"M291.03,112.21 A146.0,146.0 0 0 1 291.03,187.79 L249.49,176.66 A103.0,103.0 0 0 0 249.49,123.34 Z\"\/><text x=\"274.5\" y=\"150.0\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">A<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"6\" data-mode=\"minor\"><path d=\"M247.56,123.86 A101.0,101.0 0 0 1 247.56,176.14 L207.96,165.53 A60.0,60.0 0 0 0 207.96,134.47 Z\"\/><text x=\"230.5\" y=\"150.0\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">F\u266fm<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"4\" data-mode=\"major\"><path d=\"M291.03,187.79 A146.0,146.0 0 0 1 253.24,253.24 L222.83,222.83 A103.0,103.0 0 0 0 249.49,176.66 Z\"\/><text x=\"257.82\" y=\"212.25\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">E<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"1\" data-mode=\"minor\"><path d=\"M247.56,176.14 A101.0,101.0 0 0 1 221.42,221.42 L192.43,192.43 A60.0,60.0 0 0 0 207.96,165.53 Z\"\/><text x=\"219.72\" y=\"190.25\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">C\u266fm<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"11\" data-mode=\"major\"><path d=\"M253.24,253.24 A146.0,146.0 0 0 1 187.79,291.03 L176.66,249.49 A103.0,103.0 0 0 0 222.83,222.83 Z\"\/><text x=\"212.25\" y=\"257.82\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">B<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"8\" data-mode=\"minor\"><path d=\"M221.42,221.42 A101.0,101.0 0 0 1 176.14,247.56 L165.53,207.96 A60.0,60.0 0 0 0 192.43,192.43 Z\"\/><text x=\"190.25\" y=\"219.72\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">G\u266fm<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"6\" data-mode=\"major\"><path d=\"M187.79,291.03 A146.0,146.0 0 0 1 112.21,291.03 L123.34,249.49 A103.0,103.0 0 0 0 176.66,249.49 Z\"\/><text x=\"150.0\" y=\"274.5\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">F\u266f<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"3\" data-mode=\"minor\"><path d=\"M176.14,247.56 A101.0,101.0 0 0 1 123.86,247.56 L134.47,207.96 A60.0,60.0 0 0 0 165.53,207.96 Z\"\/><text x=\"150.0\" y=\"230.5\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">D\u266fm<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"1\" data-mode=\"major\"><path d=\"M112.21,291.03 A146.0,146.0 0 0 1 46.76,253.24 L77.17,222.83 A103.0,103.0 0 0 0 123.34,249.49 Z\"\/><text x=\"87.75\" y=\"257.82\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">D\u266d<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"10\" data-mode=\"minor\"><path d=\"M123.86,247.56 A101.0,101.0 0 0 1 78.58,221.42 L107.57,192.43 A60.0,60.0 0 0 0 134.47,207.96 Z\"\/><text x=\"109.75\" y=\"219.72\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">B\u266dm<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"8\" data-mode=\"major\"><path d=\"M46.76,253.24 A146.0,146.0 0 0 1 8.97,187.79 L50.51,176.66 A103.0,103.0 0 0 0 77.17,222.83 Z\"\/><text x=\"42.18\" y=\"212.25\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">A\u266d<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"5\" data-mode=\"minor\"><path d=\"M78.58,221.42 A101.0,101.0 0 0 1 52.44,176.14 L92.04,165.53 A60.0,60.0 0 0 0 107.57,192.43 Z\"\/><text x=\"80.28\" y=\"190.25\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">Fm<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"3\" data-mode=\"major\"><path d=\"M8.97,187.79 A146.0,146.0 0 0 1 8.97,112.21 L50.51,123.34 A103.0,103.0 0 0 0 50.51,176.66 Z\"\/><text x=\"25.5\" y=\"150.0\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">E\u266d<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"0\" data-mode=\"minor\"><path d=\"M52.44,176.14 A101.0,101.0 0 0 1 52.44,123.86 L92.04,134.47 A60.0,60.0 0 0 0 92.04,165.53 Z\"\/><text x=\"69.5\" y=\"150.0\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">Cm<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"10\" data-mode=\"major\"><path d=\"M8.97,112.21 A146.0,146.0 0 0 1 46.76,46.76 L77.17,77.17 A103.0,103.0 0 0 0 50.51,123.34 Z\"\/><text x=\"42.18\" y=\"87.75\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">B\u266d<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"7\" data-mode=\"minor\"><path d=\"M52.44,123.86 A101.0,101.0 0 0 1 78.58,78.58 L107.57,107.57 A60.0,60.0 0 0 0 92.04,134.47 Z\"\/><text x=\"80.28\" y=\"109.75\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">Gm<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"5\" data-mode=\"major\"><path d=\"M46.76,46.76 A146.0,146.0 0 0 1 112.21,8.97 L123.34,50.51 A103.0,103.0 0 0 0 77.17,77.17 Z\"\/><text x=\"87.75\" y=\"42.18\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"13\">F<\/text><\/g>\r\n        <g class=\"pma-cof-seg\" data-pc=\"2\" data-mode=\"minor\"><path d=\"M78.58,78.58 A101.0,101.0 0 0 1 123.86,52.44 L134.47,92.04 A60.0,60.0 0 0 0 107.57,107.57 Z\"\/><text x=\"109.75\" y=\"80.28\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"11\">Dm<\/text><\/g>\r\n        <circle class=\"pma-cof-aro\" cx=\"150\" cy=\"150\" r=\"146\"\/>\r\n        <circle class=\"pma-cof-aro\" cx=\"150\" cy=\"150\" r=\"60\"\/>\r\n        <text id=\"pma-cof-center\" x=\"150\" y=\"150\" text-anchor=\"middle\" dominant-baseline=\"central\" font-size=\"22\">&mdash;<\/text>\r\n      <\/svg>\r\n      <p class=\"pma-cof-list\" id=\"pma-cof-list\"><\/p>\r\n      <p class=\"pma-tool-link\"><a href=\"https:\/\/produccionmusic.com\/blog\/circulo-de-quintas-y-rueda-camelot\/\" target=\"_blank\" rel=\"noopener\">C\u00f3mo funciona el c\u00edrculo de quintas y la rueda Camelot &rarr;<\/a><\/p>\r\n    <\/div>\r\n    <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"pma-piano-wrap\">\r\n      <div class=\"pma-piano-title\">Escala de la tonalidad<\/div>\r\n      <div class=\"pma-piano\" id=\"pma-piano\">\r\n        <div class=\"pma-wk\" data-pc=\"0\"><span>C<\/span><\/div>\r\n        <div class=\"pma-wk\" data-pc=\"2\"><span>D<\/span><\/div>\r\n        <div class=\"pma-wk\" data-pc=\"4\"><span>E<\/span><\/div>\r\n        <div class=\"pma-wk\" data-pc=\"5\"><span>F<\/span><\/div>\r\n        <div class=\"pma-wk\" data-pc=\"7\"><span>G<\/span><\/div>\r\n        <div class=\"pma-wk\" data-pc=\"9\"><span>A<\/span><\/div>\r\n        <div class=\"pma-wk\" data-pc=\"11\"><span>B<\/span><\/div>\r\n        <div class=\"pma-bk\" data-pc=\"1\"  style=\"left:10.0%\"><span>C&#9839;<\/span><\/div>\r\n        <div class=\"pma-bk\" data-pc=\"3\"  style=\"left:24.27%\"><span>D&#9839;<\/span><\/div>\r\n        <div class=\"pma-bk\" data-pc=\"6\"  style=\"left:52.84%\"><span>F&#9839;<\/span><\/div>\r\n        <div class=\"pma-bk\" data-pc=\"8\"  style=\"left:67.13%\"><span>G&#9839;<\/span><\/div>\r\n        <div class=\"pma-bk\" data-pc=\"10\" style=\"left:81.41%\"><span>A&#9839;<\/span><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <p class=\"pma-tool-link\">\u00bfQuieres los acordes de esta tonalidad? <a href=\"https:\/\/produccionmusic.com\/blog\/asistente_de_acordes_y_escalas_para_piano\/\" target=\"_blank\" rel=\"noopener\">\u00c1brela en el Asistente de acordes y escalas &rarr;<\/a><\/p>\r\n\r\n    <p class=\"pma-resfile\" id=\"pma-resfile\"><\/p>\r\n    <button class=\"pma-again\" id=\"pma-again\" type=\"button\">Analizar otro archivo<\/button>\r\n    <p class=\"pma-credit\">An\u00e1lisis ac\u00fastico con Essentia.js \u00b7 valores estimados a partir del audio<\/p>\r\n  <\/div>\r\n\r\n  <!-- Estado 4: error -->\r\n  <div class=\"pma-error\" id=\"pma-error\" hidden>\r\n    <p class=\"pma-error-msg\" id=\"pma-error-msg\"><\/p>\r\n    <button class=\"pma-again\" id=\"pma-error-again\" type=\"button\">Volver a intentar<\/button>\r\n  <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800&display=swap');\r\n\r\n#pm-analyzer{\r\n  --pma-orange:#F15900;\r\n  --pma-navy:#1A1A2E;\r\n  --pma-panel:#20203a;\r\n  --pma-panel-2:#2a2a48;\r\n  --pma-soft:rgba(241,89,0,.12);\r\n  --pma-line:rgba(255,255,255,.10);\r\n  --pma-muted:#a8a8bd;\r\n  --pma-text:#f5f5fa;\r\n  font-family:'Inter',system-ui,-apple-system,sans-serif;\r\n  color:var(--pma-text);\r\n  max-width:900px;margin:0 auto 48px;\r\n  -webkit-font-smoothing:antialiased;line-height:1.5;\r\n}\r\n#pm-analyzer *{box-sizing:border-box}\r\n\r\n\/* Tarjeta contenedora (fondo oscuro) *\/\r\n#pm-analyzer .pma-card{\r\n  background:var(--pma-navy);\r\n  border:1px solid var(--pma-line);\r\n  border-top:3px solid var(--pma-orange);\r\n  border-radius:18px;overflow:hidden;\r\n  box-shadow:0 18px 44px rgba(0,0,0,.35);\r\n}\r\n#pm-analyzer .pma-header{\r\n  display:flex;flex-direction:column;align-items:center;text-align:center;gap:2px;\r\n  padding:8px 22px 14px;border-bottom:1px solid var(--pma-line);\r\n}\r\n#pm-analyzer .pma-logo{height:170px;width:auto;display:block}\r\n#pm-analyzer .pma-header-txt{display:flex;flex-direction:column;align-items:center;line-height:1.2}\r\n#pm-analyzer .pma-header-title{font-weight:800;font-size:2.2rem;color:#fff}\r\n#pm-analyzer .pma-header-sub{font-size:.95rem;color:var(--pma-muted);letter-spacing:.04em;text-transform:uppercase;margin-top:2px}\r\n#pm-analyzer .pma-body{padding:20px}\r\n\r\n\/* Ocultar el input nativo de forma robusta (el tema puede pisar [hidden]) *\/\r\n#pm-analyzer #pma-input{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;border:0!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;opacity:0!important;pointer-events:none!important}\r\n\r\n\/* Zona de subida *\/\r\n#pm-analyzer .pma-drop{\r\n  border:2px dashed rgba(255,255,255,.22);border-radius:14px;\r\n  background:var(--pma-panel);\r\n  padding:34px 24px;text-align:center;cursor:pointer;outline:none;\r\n  transition:border-color .18s,background .18s,transform .18s;\r\n}\r\n#pm-analyzer .pma-drop:hover,#pm-analyzer .pma-drop:focus-visible,#pm-analyzer .pma-drop.pma-over{\r\n  border-color:var(--pma-orange);background:var(--pma-soft);\r\n}\r\n#pm-analyzer .pma-drop.pma-over{transform:scale(1.01)}\r\n#pm-analyzer .pma-drop-icon{color:var(--pma-orange);margin-bottom:6px}\r\n#pm-analyzer .pma-drop-title{font-size:1.2rem;font-weight:700;margin:6px 0 2px;color:#fff}\r\n#pm-analyzer .pma-drop-sub{margin:0;color:var(--pma-muted);font-size:.95rem}\r\n#pm-analyzer .pma-link{color:var(--pma-orange);font-weight:600;text-decoration:underline}\r\n#pm-analyzer .pma-drop-sub{margin:2px 0 0}\r\n#pm-analyzer .pma-choose{display:inline-flex;align-items:center;gap:9px;margin-top:14px;padding:12px 24px;background:var(--pma-orange);color:#fff;border:none;border-radius:12px;font-family:inherit;font-weight:700;font-size:1rem;cursor:pointer;box-shadow:0 8px 20px rgba(241,89,0,.35);transition:transform .15s,box-shadow .15s,background .15s}\r\n#pm-analyzer .pma-choose:hover{transform:translateY(-2px);background:#ff6a10;box-shadow:0 12px 26px rgba(241,89,0,.5)}\r\n#pm-analyzer .pma-choose:active{transform:translateY(0)}\r\n#pm-analyzer .pma-choose:focus-visible{outline:2px solid #fff;outline-offset:3px}\r\n#pm-analyzer .pma-privacy{margin:20px 0 0;font-size:.8rem;color:var(--pma-muted)}\r\n\r\n\/* Cargando *\/\r\n#pm-analyzer .pma-loading{padding:36px 24px;text-align:center}\r\n#pm-analyzer .pma-eq{display:inline-flex;gap:5px;align-items:flex-end;height:44px;margin-bottom:16px}\r\n#pm-analyzer .pma-eq span{width:7px;height:44px;background:var(--pma-orange);border-radius:4px;transform-origin:bottom center;transform:scaleY(.27);will-change:transform;animation:pma-bounce 1s ease-in-out infinite}\r\n#pm-analyzer .pma-eq span:nth-child(1){animation-delay:-.9s}\r\n#pm-analyzer .pma-eq span:nth-child(2){animation-delay:-.7s}\r\n#pm-analyzer .pma-eq span:nth-child(3){animation-delay:-.5s}\r\n#pm-analyzer .pma-eq span:nth-child(4){animation-delay:-.3s}\r\n#pm-analyzer .pma-eq span:nth-child(5){animation-delay:-.1s}\r\n@keyframes pma-bounce{0%,100%{transform:scaleY(.27)}50%{transform:scaleY(1)}}\r\n#pm-analyzer .pma-status{font-weight:600;margin:0;color:#fff}\r\n#pm-analyzer .pma-file{margin:6px 0 0;color:var(--pma-muted);font-size:.85rem;word-break:break-all}\r\n\r\n\/* Resultados *\/\r\n#pm-analyzer .pma-results{padding:4px 0 0;container-type:inline-size}\r\n#pm-analyzer .pma-cols{display:block}\r\n#pm-analyzer .pma-col-left,#pm-analyzer .pma-col-right{min-width:0}\r\n@container (min-width:640px){\r\n  #pm-analyzer .pma-cols{display:grid;grid-template-columns:1fr 1fr;gap:24px;align-items:start}\r\n  #pm-analyzer .pma-col-right > :first-child{margin-top:0}\r\n}\r\n#pm-analyzer .pma-hero{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}\r\n#pm-analyzer .pma-hero-cell{background:var(--pma-panel);border:1px solid var(--pma-line);color:#fff;border-radius:14px;padding:14px 14px;text-align:center;display:flex;flex-direction:column;gap:2px}\r\n#pm-analyzer .pma-hero-camelot{background:var(--pma-orange);border-color:transparent}\r\n#pm-analyzer .pma-hero-label{font-size:.95rem;letter-spacing:.12em;text-transform:uppercase;opacity:.85;font-weight:600}\r\n#pm-analyzer .pma-hero-value{font-size:2.2rem;font-weight:800;line-height:1.05}\r\n#pm-analyzer .pma-hero-note{font-size:.98rem;opacity:.85;min-height:1em}\r\n#pm-analyzer .pma-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;background:var(--pma-line);border:1px solid var(--pma-line);border-radius:12px;overflow:hidden}\r\n#pm-analyzer .pma-stat{background:var(--pma-panel);padding:16px 16px;display:flex;flex-direction:column;gap:4px}\r\n#pm-analyzer .pma-stat-k{font-size:.92rem;color:#fff;text-transform:uppercase;letter-spacing:.04em}\r\n#pm-analyzer .pma-stat-v{font-size:1.6rem;font-weight:700;color:var(--pma-orange)}\r\n#pm-analyzer .pma-resfile{margin:16px 0 0;font-size:.82rem;color:var(--pma-muted);word-break:break-all}\r\n#pm-analyzer .pma-again{margin-top:14px;width:100%;padding:15px;border-radius:11px;cursor:pointer;background:transparent;color:#fff;border:1.5px solid rgba(255,255,255,.35);font-family:inherit;font-weight:700;font-size:1.05rem;transition:background .15s,border-color .15s}\r\n#pm-analyzer .pma-again:hover{background:var(--pma-orange);border-color:var(--pma-orange)}\r\n#pm-analyzer .pma-credit{margin:14px 0 0;text-align:center;font-size:.72rem;color:var(--pma-muted)}\r\n\r\n\/* Piano de la tonalidad *\/\r\n#pm-analyzer .pma-piano-wrap{margin-top:18px}\r\n#pm-analyzer .pma-piano-title{font-size:.92rem;color:#fff;text-transform:uppercase;letter-spacing:.04em;margin-bottom:8px;text-align:center}\r\n#pm-analyzer .pma-piano{position:relative;display:flex;height:120px;max-width:360px;margin:0 auto;border-radius:8px;overflow:hidden;-webkit-user-select:none;user-select:none}\r\n#pm-analyzer .pma-wk{position:relative;flex:1 1 0;background:#f4f4f7;border:1px solid #cfcfe0;border-left:none;display:flex;align-items:flex-end;justify-content:center;padding-bottom:6px}\r\n#pm-analyzer .pma-wk:first-child{border-left:1px solid #cfcfe0;border-top-left-radius:10px;border-bottom-left-radius:10px}\r\n#pm-analyzer .pma-wk:last-child{border-top-right-radius:10px;border-bottom-right-radius:10px}\r\n#pm-analyzer .pma-wk>span{font-size:.72rem;font-weight:700;color:var(--pma-navy)}\r\n#pm-analyzer .pma-bk{position:absolute;top:0;width:8.6%;height:74px;background:#14141c;border:1px solid #000;border-radius:0 0 5px 5px;display:flex;align-items:flex-end;justify-content:center;padding-bottom:5px;z-index:2}\r\n#pm-analyzer .pma-bk>span{font-size:.55rem;font-weight:700;color:#fff}\r\n#pm-analyzer .pma-wk.pma-on{background:var(--pma-orange)}\r\n#pm-analyzer .pma-wk.pma-on>span{color:#fff}\r\n#pm-analyzer .pma-bk.pma-on{background:linear-gradient(180deg,#1a1a24 42%,var(--pma-orange) 100%);border-color:var(--pma-orange)}\r\n#pm-analyzer .pma-bk.pma-on>span{color:#fff}\r\n#pm-analyzer .pma-wk.pma-root{box-shadow:inset 0 0 0 3px #fff}\r\n#pm-analyzer .pma-bk.pma-root{box-shadow:inset 0 0 0 2px #fff}\r\n\r\n\/* Enlaces a otras herramientas *\/\r\n#pm-analyzer .pma-cof-aro{fill:none;stroke:var(--pma-orange);stroke-width:3}\r\n#pm-analyzer .pma-tool-link{margin:18px 0 0;font-size:1.08rem;color:#d6d6e0;text-align:center;line-height:1.55}\r\n#pm-analyzer .pma-tool-link a{color:var(--pma-orange);font-weight:700;text-decoration:none}\r\n#pm-analyzer .pma-tool-link a:hover{text-decoration:underline}\r\n\r\n\/* C\u00edrculo de quintas *\/\r\n#pm-analyzer .pma-cof-wrap{margin-top:24px}\r\n#pm-analyzer .pma-cof-title{font-size:.92rem;color:#fff;text-transform:uppercase;letter-spacing:.04em;margin-bottom:10px;text-align:center}\r\n#pm-analyzer .pma-cof{display:block;width:100%;max-width:300px;height:auto;margin:0 auto}\r\n#pm-analyzer .pma-cof-seg path{fill:#20203a;stroke:#14141c;stroke-width:1.5;transition:fill .18s,fill-opacity .18s}\r\n#pm-analyzer .pma-cof-seg text{fill:#cfcfe0;font-weight:700;font-family:inherit;pointer-events:none}\r\n#pm-analyzer .pma-cof-seg.pma-cof-comp path{fill:var(--pma-orange);fill-opacity:.42}\r\n#pm-analyzer .pma-cof-seg.pma-cof-comp text{fill:#fff}\r\n#pm-analyzer .pma-cof-seg.pma-cof-root path{fill:var(--pma-orange);fill-opacity:1}\r\n#pm-analyzer .pma-cof-seg.pma-cof-root text{fill:#fff}\r\n#pm-analyzer #pma-cof-center{fill:var(--pma-orange);font-weight:800}\r\n#pm-analyzer .pma-cof-list{margin:12px 0 0;text-align:center;font-size:1.08rem;color:#fff}\r\n#pm-analyzer .pma-cof-list b{color:var(--pma-orange)}\r\n\r\n\/* Error *\/\r\n#pm-analyzer .pma-error{padding:24px 4px;text-align:center}\r\n#pm-analyzer .pma-error-msg{margin:0 0 14px;font-weight:600;color:#fff}\r\n\r\n@media (max-width:520px){\r\n  #pm-analyzer .pma-hero{grid-template-columns:1fr}\r\n  #pm-analyzer .pma-hero-value{font-size:2rem}\r\n  #pm-analyzer .pma-logo{height:110px}\r\n  #pm-analyzer .pma-header-title{font-size:1.6rem}\r\n  #pm-analyzer .pma-piano{height:104px;max-width:100%}\r\n  #pm-analyzer .pma-bk{height:64px}\r\n}\r\n@media (prefers-reduced-motion:reduce){\r\n  #pm-analyzer .pma-eq span{animation-duration:0s}\r\n  #pm-analyzer .pma-drop{transition:none}\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  \/* ======================================================================\r\n     >>> AJUSTA ESTA L\u00cdNEA <<<\r\n     URL (con barra final) de la carpeta donde subiste los 3 archivos.\r\n  ====================================================================== *\/\r\n  var PM_WASM_BASE = \"https:\/\/produccionmusic.com\/assets\/essentia\/\";\r\n  \/* ====================================================================== *\/\r\n\r\n  var root = document.getElementById(\"pm-analyzer\");\r\n  if(!root) return;\r\n\r\n  var elDrop     = root.querySelector(\"#pma-drop\");\r\n  var elInput    = root.querySelector(\"#pma-input\");\r\n  var elLoading  = root.querySelector(\"#pma-loading\");\r\n  var elStatus   = root.querySelector(\"#pma-status\");\r\n  var elLoadFile = root.querySelector(\"#pma-loading-file\");\r\n  var elResults  = root.querySelector(\"#pma-results\");\r\n  var elError    = root.querySelector(\"#pma-error\");\r\n  var elErrorMsg = root.querySelector(\"#pma-error-msg\");\r\n\r\n  var essentia = null;\r\n\r\n  function show(state){\r\n    elDrop.hidden    = state !== \"drop\";\r\n    elLoading.hidden = state !== \"loading\";\r\n    elResults.hidden = state !== \"results\";\r\n    elError.hidden   = state !== \"error\";\r\n  }\r\n  function setStatus(t){ elStatus.textContent = t; }\r\n\r\n  \/* ---- Carga perezosa del motor (solo la 1\u00aa vez) ---- *\/\r\n  function loadScript(src){\r\n    return new Promise(function(res, rej){\r\n      var s = document.createElement(\"script\");\r\n      s.src = src; s.async = true;\r\n      s.onload = function(){ res(); };\r\n      s.onerror = function(){ rej(new Error(\"No se pudo cargar \" + src)); };\r\n      document.head.appendChild(s);\r\n    });\r\n  }\r\n  function initEngine(){\r\n    if(essentia) return Promise.resolve(essentia);\r\n    setStatus(\"Cargando motor de an\u00e1lisis\u2026\");\r\n    return loadScript(PM_WASM_BASE + \"essentia-wasm.web.js\")\r\n      .then(function(){ return loadScript(PM_WASM_BASE + \"essentia.js-core.js\"); })\r\n      .then(function(){\r\n        return window.EssentiaWASM({ locateFile: function(p){ return PM_WASM_BASE + p; } });\r\n      })\r\n      .then(function(wasm){\r\n        essentia = new window.Essentia(wasm);\r\n        return essentia;\r\n      });\r\n  }\r\n\r\n  \/* ---- Decodificar a mono 44.1 kHz ---- *\/\r\n  function decodeAudio(arrayBuffer){\r\n    var AC = window.AudioContext || window.webkitAudioContext;\r\n    var ctx = new AC();\r\n    return ctx.decodeAudioData(arrayBuffer).then(function(dec){\r\n      if(ctx.close) ctx.close();\r\n      var ch = dec.numberOfChannels;\r\n      var L0 = dec.getChannelData(0);\r\n      var R0 = ch > 1 ? dec.getChannelData(1) : L0;\r\n      \/\/ Pico real a partir de las muestras originales\r\n      var peak = 0, i, a, b;\r\n      for(i=0;i<L0.length;i++){ a = L0[i]<0?-L0[i]:L0[i]; if(a>peak) peak=a; }\r\n      if(ch>1) for(i=0;i<R0.length;i++){ b = R0[i]<0?-R0[i]:R0[i]; if(b>peak) peak=b; }\r\n      var meta = { duration:dec.duration, sampleRate:dec.sampleRate, channels:ch, peak:peak };\r\n      var needRS = dec.sampleRate !== 44100;\r\n      var pL = needRS ? resample(L0, dec.sampleRate, 44100) : Promise.resolve(L0);\r\n      var pR = (ch > 1) ? (needRS ? resample(R0, dec.sampleRate, 44100) : Promise.resolve(R0)) : null;\r\n      return Promise.all([pL, pR || pL]).then(function(arr){\r\n        var L = arr[0], R = arr[1];\r\n        var mono = new Float32Array(L.length);\r\n        for(var k=0;k<L.length;k++) mono[k] = (L[k] + R[k]) * 0.5;\r\n        return { mono:mono, left:L, right:R, meta:meta };\r\n      });\r\n    });\r\n  }\r\n  function resample(mono, src, dst){\r\n    var frames = Math.max(1, Math.round(mono.length * dst \/ src));\r\n    var OAC = window.OfflineAudioContext || window.webkitOfflineAudioContext;\r\n    var off = new OAC(1, frames, dst);\r\n    var buf = off.createBuffer(1, mono.length, src);\r\n    buf.copyToChannel(mono, 0);\r\n    var node = off.createBufferSource();\r\n    node.buffer = buf; node.connect(off.destination); node.start();\r\n    return off.startRendering().then(function(r){ return r.getChannelData(0); });\r\n  }\r\n\r\n  \/* ---- dBFS ---- *\/\r\n  function toDb(x){ return x>0 ? (20*Math.log10(x)) : -Infinity; }\r\n\r\n  \/* ---- Camelot ---- *\/\r\n  var CAMELOT = {\r\n    \"C:major\":\"8B\",\"C:minor\":\"5A\",\r\n    \"C#:major\":\"3B\",\"C#:minor\":\"12A\",\"Db:major\":\"3B\",\"Db:minor\":\"12A\",\r\n    \"D:major\":\"10B\",\"D:minor\":\"7A\",\r\n    \"D#:major\":\"5B\",\"D#:minor\":\"2A\",\"Eb:major\":\"5B\",\"Eb:minor\":\"2A\",\r\n    \"E:major\":\"12B\",\"E:minor\":\"9A\",\r\n    \"F:major\":\"7B\",\"F:minor\":\"4A\",\r\n    \"F#:major\":\"2B\",\"F#:minor\":\"11A\",\"Gb:major\":\"2B\",\"Gb:minor\":\"11A\",\r\n    \"G:major\":\"9B\",\"G:minor\":\"6A\",\r\n    \"G#:major\":\"4B\",\"G#:minor\":\"1A\",\"Ab:major\":\"4B\",\"Ab:minor\":\"1A\",\r\n    \"A:major\":\"11B\",\"A:minor\":\"8A\",\r\n    \"A#:major\":\"6B\",\"A#:minor\":\"3A\",\"Bb:major\":\"6B\",\"Bb:minor\":\"3A\",\r\n    \"B:major\":\"1B\",\"B:minor\":\"10A\"\r\n  };\r\n  var CAMELOT_NAME = {\r\n    \"1A\":\"La\u266d menor\",\"1B\":\"Si mayor\",\"2A\":\"Mi\u266d menor\",\"2B\":\"Fa\u266f mayor\",\r\n    \"3A\":\"Si\u266d menor\",\"3B\":\"Re\u266d mayor\",\"4A\":\"Fa menor\",\"4B\":\"La\u266d mayor\",\r\n    \"5A\":\"Do menor\",\"5B\":\"Mi\u266d mayor\",\"6A\":\"Sol menor\",\"6B\":\"Si\u266d mayor\",\r\n    \"7A\":\"Re menor\",\"7B\":\"Fa mayor\",\"8A\":\"La menor\",\"8B\":\"Do mayor\",\r\n    \"9A\":\"Mi menor\",\"9B\":\"Sol mayor\",\"10A\":\"Si menor\",\"10B\":\"Re mayor\",\r\n    \"11A\":\"Fa\u266f menor\",\"11B\":\"La mayor\",\"12A\":\"Re\u266d menor\",\"12B\":\"Mi mayor\"\r\n  };\r\n  function relativeCamelot(code){\r\n    var num = code.slice(0,-1), letter = code.slice(-1);\r\n    return num + (letter === \"A\" ? \"B\" : \"A\");\r\n  }\r\n  function keyPretty(k){ return k.replace(\"#\",\"\u266f\").replace(\"b\",\"\u266d\"); }\r\n\r\n  \/* ---- Formato ---- *\/\r\n  function fmtDur(s){\r\n    s = Math.round(s);\r\n    var m = Math.floor(s\/60), sec = s%60;\r\n    return m + \":\" + (sec<10?\"0\":\"\") + sec;\r\n  }\r\n  function danceLabel(v){\r\n    if(v == null) return \"\u2014\";\r\n    var pct = Math.max(0, Math.min(100, Math.round(v\/3*100)));\r\n    return pct + \"%\";\r\n  }\r\n\r\n  \/* ---- An\u00e1lisis con essentia ---- *\/\r\n  function analyze(data){\r\n    \/\/ Acota a 8 min como m\u00e1ximo (evita bloqueos con sets muy largos)\r\n    var MAX = 44100*480;\r\n    var mono = data.mono, s = mono, st;\r\n    if(s.length > MAX){ st = Math.floor((s.length - MAX)\/2); s = s.subarray(st, st+MAX); }\r\n    var vec = essentia.arrayToVector(s);\r\n    var out = {};\r\n    try{\r\n      out.bpm = essentia.PercivalBpmEstimator(vec).bpm;\r\n      var k = essentia.KeyExtractor(vec);\r\n      out.key = k.key; out.scale = k.scale; out.strength = k.strength;\r\n      try{\r\n        var dOut = essentia.Danceability(vec);\r\n        out.dance = dOut.danceability;\r\n        if(dOut.dfa && dOut.dfa.delete) dOut.dfa.delete();\r\n      }catch(e){ out.dance = null; }\r\n    } finally {\r\n      if(vec && vec.delete) vec.delete();\r\n    }\r\n    \/\/ Loudness integrada (LUFS) con los canales L\/R\r\n    out.lufs = null;\r\n    try{\r\n      var L = data.left, R = data.right;\r\n      if(L.length > MAX){ var st2 = Math.floor((L.length - MAX)\/2); L = L.subarray(st2, st2+MAX); R = R.subarray(st2, st2+MAX); }\r\n      var vL = essentia.arrayToVector(L), vR = essentia.arrayToVector(R);\r\n      try{ out.lufs = essentia.LoudnessEBUR128(vL, vR, 0.1, 44100, false).integratedLoudness; }\r\n      finally{ if(vL && vL.delete) vL.delete(); if(vR && vR.delete) vR.delete(); }\r\n    }catch(e){ out.lufs = null; }\r\n    return out;\r\n  }\r\n\r\n  \/* ---- Piano de la tonalidad ---- *\/\r\n  var NOTE_PC = {\"C\":0,\"C#\":1,\"Db\":1,\"D\":2,\"D#\":3,\"Eb\":3,\"E\":4,\"F\":5,\"F#\":6,\"Gb\":6,\"G\":7,\"G#\":8,\"Ab\":8,\"A\":9,\"A#\":10,\"Bb\":10,\"B\":11};\r\n  var SCALE_STEPS = { major:[0,2,4,5,7,9,11], minor:[0,2,3,5,7,8,10] };\r\n  function renderPiano(key, scale){\r\n    var piano = root.querySelector(\"#pma-piano\");\r\n    if(!piano) return;\r\n    var keys = piano.querySelectorAll(\".pma-wk,.pma-bk\");\r\n    var i;\r\n    for(i=0;i<keys.length;i++){ keys[i].classList.remove(\"pma-on\",\"pma-root\"); }\r\n    var tonic = NOTE_PC[key];\r\n    if(tonic == null) return;\r\n    var steps = SCALE_STEPS[scale] || SCALE_STEPS.major;\r\n    var inScale = {};\r\n    for(i=0;i<steps.length;i++){ inScale[(tonic+steps[i])%12] = true; }\r\n    for(i=0;i<keys.length;i++){\r\n      var pc = parseInt(keys[i].getAttribute(\"data-pc\"), 10);\r\n      if(inScale[pc]) keys[i].classList.add(\"pma-on\");\r\n      if(pc === tonic) keys[i].classList.add(\"pma-root\");\r\n    }\r\n  }\r\n\r\n  function renderCircle(key, scale){\r\n    var wrap = root.querySelector(\".pma-cof-wrap\");\r\n    if(!wrap) return;\r\n    var segs = wrap.querySelectorAll(\".pma-cof-seg\");\r\n    var center = root.querySelector(\"#pma-cof-center\");\r\n    var i;\r\n    for(i=0;i<segs.length;i++){ segs[i].classList.remove(\"pma-cof-root\",\"pma-cof-comp\"); }\r\n    var pc = NOTE_PC[key];\r\n    if(pc == null){ if(center) center.textContent = \"\\u2014\"; return; }\r\n    var relPc  = (scale === \"major\") ? (pc+9)%12 : (pc+3)%12;\r\n    var relMode= (scale === \"major\") ? \"minor\" : \"major\";\r\n    var comp = {};\r\n    comp[relPc + \":\" + relMode] = true;      \/\/ relativa\r\n    comp[((pc+7)%12) + \":\" + scale] = true;  \/\/ vecina (dominante)\r\n    comp[((pc+5)%12) + \":\" + scale] = true;  \/\/ vecina (subdominante)\r\n    var names = [];\r\n    for(i=0;i<segs.length;i++){\r\n      var spc = parseInt(segs[i].getAttribute(\"data-pc\"),10);\r\n      var smode = segs[i].getAttribute(\"data-mode\");\r\n      var label = segs[i].querySelector(\"text\").textContent;\r\n      if(spc === pc && smode === scale){\r\n        segs[i].classList.add(\"pma-cof-root\");\r\n        if(center) center.textContent = label;\r\n      } else if(comp[spc + \":\" + smode]){\r\n        segs[i].classList.add(\"pma-cof-comp\");\r\n        names.push(label);\r\n      }\r\n    }\r\n    var list = root.querySelector(\"#pma-cof-list\");\r\n    if(list) list.innerHTML = \"Compatibles para mezclar: \" + names.map(function(n){return \"<b>\"+n+\"<\/b>\";}).join(\" \\u00b7 \");\r\n  }\r\n\r\n  function render(res, meta, fileName){\r\n    \/\/ BPM\r\n    var bpm = res.bpm ? res.bpm : 0;\r\n    root.querySelector(\"#pma-bpm\").textContent = bpm ? bpm.toFixed(1) : \"\u2014\";\r\n    if(bpm){\r\n      var half = (bpm\/2).toFixed(1), dbl = (bpm*2).toFixed(1);\r\n      root.querySelector(\"#pma-bpm-alt\").textContent = \"tambi\u00e9n \" + half + \" \/ \" + dbl;\r\n    } else root.querySelector(\"#pma-bpm-alt\").textContent = \"\";\r\n\r\n    \/\/ Tonalidad (nomenclatura americana) + Camelot\r\n    root.querySelector(\"#pma-hero-key\").textContent = keyPretty(res.key) + (res.scale === \"minor\" ? \"m\" : \"\");\r\n    var code = CAMELOT[res.key + \":\" + res.scale];\r\n    if(code){\r\n      root.querySelector(\"#pma-camelot\").textContent = code;\r\n      var altCode = relativeCamelot(code);\r\n      root.querySelector(\"#pma-altkey\").textContent = altCode + \" \u00b7 \" + CAMELOT_NAME[altCode];\r\n    } else {\r\n      root.querySelector(\"#pma-camelot\").textContent = \"\u2014\";\r\n      root.querySelector(\"#pma-altkey\").textContent = \"\u2014\";\r\n    }\r\n    root.querySelector(\"#pma-strength\").textContent = res.strength != null ? Math.round(res.strength*100) + \"%\" : \"\u2014\";\r\n    renderPiano(res.key, res.scale);\r\n    renderCircle(res.key, res.scale);\r\n\r\n    \/\/ Resto\r\n    root.querySelector(\"#pma-duration\").textContent = fmtDur(meta.duration);\r\n    root.querySelector(\"#pma-dance\").textContent    = danceLabel(res.dance);\r\n    root.querySelector(\"#pma-peak\").textContent = isFinite(toDb(meta.peak)) ? toDb(meta.peak).toFixed(1) + \" dBFS\" : \"\u2014\";\r\n    root.querySelector(\"#pma-lufs\").textContent = (res.lufs != null && isFinite(res.lufs)) ? res.lufs.toFixed(1) + \" LUFS\" : \"\u2014\";\r\n    root.querySelector(\"#pma-sr\").textContent   = (meta.sampleRate\/1000).toFixed(1) + \" kHz\";\r\n    root.querySelector(\"#pma-ch\").textContent   = meta.channels === 1 ? \"Mono\" : (meta.channels === 2 ? \"Est\u00e9reo\" : meta.channels);\r\n    root.querySelector(\"#pma-resfile\").textContent = \"Archivo: \" + fileName;\r\n\r\n    show(\"results\");\r\n  }\r\n\r\n  \/* ---- Flujo principal ---- *\/\r\n  function handleFile(file){\r\n    if(!file) return;\r\n    var name = (file.name || \"\").toLowerCase();\r\n    var okType = \/\\.(wav|mp3)$\/.test(name) || \/audio\\\/\/.test(file.type || \"\");\r\n    if(!okType){\r\n      return fail(\"Formato no compatible. Sube un archivo WAV o MP3.\");\r\n    }\r\n    elLoadFile.textContent = file.name;\r\n    show(\"loading\");\r\n\r\n    initEngine()\r\n      .then(function(){\r\n        setStatus(\"Decodificando el audio\u2026\");\r\n        return file.arrayBuffer();\r\n      })\r\n      .then(function(buf){ return decodeAudio(buf); })\r\n      .then(function(data){\r\n        setStatus(\"Calculando BPM y tonalidad\u2026\");\r\n        \/\/ Cede un frame para que el ecualizador siga animando\r\n        return new Promise(function(r){\r\n          setTimeout(function(){\r\n            var res = analyze(data);\r\n            render(res, data.meta, elLoadFile.textContent);\r\n            r();\r\n          }, 30);\r\n        });\r\n      })\r\n      .catch(function(err){\r\n        var msg = \"No se pudo analizar el archivo.\";\r\n        if(\/cargar\/.test(err.message)) msg = \"No se pudo cargar el motor de an\u00e1lisis. Revisa que los 3 archivos est\u00e9n subidos en la carpeta indicada.\";\r\n        else if(\/decode\/i.test(err.message) || \/decodi\/i.test(err.message)) msg = \"No se pudo leer el audio. Prueba con otro WAV o MP3.\";\r\n        fail(msg);\r\n      });\r\n  }\r\n  function fail(msg){ elErrorMsg.textContent = msg; show(\"error\"); }\r\n  function reset(){ elInput.value = \"\"; show(\"drop\"); }\r\n\r\n  \/* ---- Eventos ---- *\/\r\n  elDrop.addEventListener(\"click\", function(){ elInput.click(); });\r\n  var elChoose = root.querySelector(\"#pma-choose\");\r\n  if(elChoose) elChoose.addEventListener(\"click\", function(e){ e.stopPropagation(); elInput.click(); });\r\n  elDrop.addEventListener(\"keydown\", function(e){\r\n    if(e.key === \"Enter\" || e.key === \" \"){ e.preventDefault(); elInput.click(); }\r\n  });\r\n  elInput.addEventListener(\"change\", function(e){ handleFile(e.target.files[0]); });\r\n\r\n  [\"dragenter\",\"dragover\"].forEach(function(ev){\r\n    elDrop.addEventListener(ev, function(e){ e.preventDefault(); e.stopPropagation(); elDrop.classList.add(\"pma-over\"); });\r\n  });\r\n  [\"dragleave\",\"drop\"].forEach(function(ev){\r\n    elDrop.addEventListener(ev, function(e){ e.preventDefault(); e.stopPropagation(); elDrop.classList.remove(\"pma-over\"); });\r\n  });\r\n  elDrop.addEventListener(\"drop\", function(e){\r\n    var f = e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files[0];\r\n    handleFile(f);\r\n  });\r\n  \/\/ Evita que soltar fuera de la caja abra el archivo en el navegador\r\n  [\"dragover\",\"drop\"].forEach(function(ev){\r\n    root.addEventListener(ev, function(e){ e.preventDefault(); });\r\n  });\r\n\r\n  root.querySelector(\"#pma-again\").addEventListener(\"click\", reset);\r\n  root.querySelector(\"#pma-error-again\").addEventListener(\"click\", reset);\r\n})();\r\n<\/script>\n<p>Esta herramienta gratuita <strong style=\"color:#000000\">detecta el BPM, la tonalidad y la escala<\/strong> de cualquier canci\u00f3n en segundos, pensada para <strong style=\"color:#000000\">DJs y productores musicales<\/strong>. Sube un WAV o MP3 y obt\u00e9n al instante su tempo, su tonalidad en nomenclatura americana, el <strong style=\"color:#000000\">c\u00f3digo Camelot<\/strong> para mezcla arm\u00f3nica y las notas de la escala sobre un piano. Sin registro, sin anuncios y <strong style=\"color:#000000\">sin subir tu m\u00fasica a ning\u00fan servidor<\/strong>: todo el an\u00e1lisis ocurre en tu navegador.<\/p>\n<h2>C\u00f3mo usar el analizador de BPM y tonalidad<\/h2>\n<p>Detectar y analizar el BPM y la tonalidad de una canci\u00f3n no puede ser m\u00e1s sencillo, y no necesitas registrarte ni instalar nada:<\/p>\n<ol>\n<li><strong style=\"color:#000000\">Arrastra<\/strong> tu archivo de audio sobre la caja, o haz clic para elegirlo desde tu ordenador.<\/li>\n<li>Espera un par de segundos mientras se analiza (todo ocurre en tu propio equipo).<\/li>\n<li>Lee los resultados. Cuando quieras, pulsa <strong style=\"color:#000000\">\u00abAnalizar otro archivo\u00bb<\/strong> y repite.<\/li>\n<\/ol>\n<p>Funciona con <strong style=\"color:#000000\">WAV y MP3<\/strong>, los formatos que vas a usar el 99% de las veces. Puedes analizar tanto tus propias producciones exportadas como cualquier pista de tu biblioteca. En cuanto sueltas el archivo, la herramienta <strong style=\"color:#000000\">detecta<\/strong> la tonalidad, la escala y el BPM de forma autom\u00e1tica.<\/p>\n<p><em>\u00bfNo te carga? Usa Chrome, Firefox, Edge o Safari actualizados. La primera vez tarda un par de segundos en preparar el motor de an\u00e1lisis; a partir de ah\u00ed es instant\u00e1neo.<\/em><\/p>\n<h2>Por qu\u00e9 conocer el BPM y la tonalidad de tus canciones<\/h2>\n<p>Saber el <strong style=\"color:#000000\">BPM<\/strong> y la <strong style=\"color:#000000\">tonalidad<\/strong> exacta de un tema es la diferencia entre una mezcla que fluye y una que suena forzada. Si eres <strong style=\"color:#000000\">DJ<\/strong>, lo necesitas para cuadrar transiciones y mezclar en armon\u00eda; si eres <strong style=\"color:#000000\">productor<\/strong>, para elegir samples, acordes o vocales que encajen desde el primer momento.<\/p>\n<p>Esta herramienta te da esos datos al instante y en un solo sitio, sin depender de que la informaci\u00f3n venga etiquetada en el archivo. Y con una ventaja importante: <strong style=\"color:#000000\">tu m\u00fasica no sale de tu ordenador<\/strong>.<\/p>\n<h2>Qu\u00e9 significa cada resultado<\/h2>\n<p>El analizador te da una ficha completa. Esto es lo que representa cada dato:<\/p>\n<h3>BPM (pulsos por minuto)<\/h3>\n<p>La velocidad del tema. Es el dato base para cuadrar transiciones y decidir qu\u00e9 pistas encajan entre s\u00ed. Debajo ver\u00e1s tambi\u00e9n su valor <strong style=\"color:#000000\">mitad y doble<\/strong> (por ejemplo, 140 BPM equivale a 70 o 280): \u00fatil cuando quieres mezclar temas a distinta \u00aboctava\u00bb de tempo. Como referencia r\u00e1pida por estilos: el <strong style=\"color:#000000\">house<\/strong> suele moverse entre 120 y 128 BPM, el <strong style=\"color:#000000\">techno<\/strong> entre 125 y 135, el <strong style=\"color:#000000\">reggaet\u00f3n<\/strong> en torno a 90-100, el <strong style=\"color:#000000\">hip-hop<\/strong> entre 80 y 100 y el <strong style=\"color:#000000\">drum and bass<\/strong> entre 170 y 175.<\/p>\n<h3>Tonalidad y escala<\/h3>\n<p>La nota t\u00f3nica del tema y si est\u00e1 en modo <strong style=\"color:#000000\">mayor<\/strong> o <strong style=\"color:#000000\">menor<\/strong>. Es la informaci\u00f3n arm\u00f3nica clave para que dos temas suenen bien juntos y para elegir samples, acordes o vocales que no choquen.<\/p>\n<h3>El teclado: la escala de la tonalidad<\/h3>\n<p>Debajo de los resultados tienes un teclado de piano con las <strong style=\"color:#000000\">notas de la escala resaltadas<\/strong>. Es la forma m\u00e1s r\u00e1pida de ver qu\u00e9 notas encajan en el tema: te sirve para <strong style=\"color:#000000\">componer melod\u00edas, bajos o acordes<\/strong> en la misma tonalidad, o para elegir samples y vocales que no desafinen. La t\u00f3nica va marcada aparte para que la localices de un vistazo. \u00bfQuieres ver qu\u00e9 acordes puedes construir con esa escala? \u00c9chale un ojo a nuestro <a href=\"https:\/\/produccionmusic.com\/blog\/asistente_de_acordes_y_escalas_para_piano\/\" style=\"color:#F15900;font-weight:bold;\">Asistente de acordes y escalas para piano<\/a>.<\/p>\n<h3>C\u00f3digo Camelot<\/h3>\n<p>La misma tonalidad traducida al sistema que usan las plataformas de <strong style=\"color:#000000\">mezcla arm\u00f3nica<\/strong> (la Rueda Camelot): un n\u00famero del 1 al 12 y una letra (A para menor, B para mayor). Hace que combinar tonalidades sea visual e inmediato, sin necesidad de saber teor\u00eda musical.<\/p>\n<h3>Tonalidad relativa<\/h3>\n<p>Es la <strong style=\"color:#000000\">tonalidad relativa<\/strong> (misma cifra Camelot, letra opuesta). Comparte todas las notas con la principal, as\u00ed que es una mezcla segura y muy habitual para cambiar de energ\u00eda sin romper la armon\u00eda.<\/p>\n<h3>Fiabilidad tonal<\/h3>\n<p>Un porcentaje que indica cu\u00e1nta confianza tiene el an\u00e1lisis en la tonalidad detectada. En temas con armon\u00eda muy marcada ser\u00e1 alto; en pistas ruidosas, muy percusivas o atonales, bajar\u00e1.<\/p>\n<h3>Duraci\u00f3n, pico y loudness (LUFS)<\/h3>\n<p>La duraci\u00f3n del archivo, el <strong style=\"color:#000000\">pico<\/strong> en dBFS (la muestra m\u00e1s alta) y la <strong style=\"color:#000000\">loudness integrada en LUFS<\/strong>, el est\u00e1ndar real de volumen percibido que se usa en mastering y streaming (referencia habitual: \u221214 LUFS). Perfecto para ver c\u00f3mo viene el archivo antes de trabajarlo.<\/p>\n<h3>Bailabilidad y datos t\u00e9cnicos<\/h3>\n<p>Un \u00edndice orientativo de lo bailable que resulta el ritmo, m\u00e1s la frecuencia de muestreo original y el n\u00famero de canales (mono o est\u00e9reo) del archivo.<\/p>\n<h2>La rueda Camelot: mezcla arm\u00f3nica en clave<\/h2>\n<p>Mezclar \u00aben clave\u00bb (harmonic mixing) es una de las t\u00e9cnicas que m\u00e1s r\u00e1pido eleva el nivel de un DJ. La idea es simple: si dos temas est\u00e1n en tonalidades compatibles, la transici\u00f3n suena limpia y musical en lugar de disonante.<\/p>\n<p>La <strong style=\"color:#000000\">rueda Camelot<\/strong> es la forma visual de aplicar el c\u00edrculo de quintas sin necesidad de teor\u00eda: cada tonalidad es un n\u00famero del 1 al 12 con una letra (A para menores, B para mayores). Para mezclar bien, basta con moverte a n\u00fameros <strong style=\"color:#000000\">adyacentes<\/strong> (de 8A a 7A o 9A) o cambiar de letra manteniendo el n\u00famero (8A &#x2194; 8B). Este analizador te da ese c\u00f3digo directamente, as\u00ed que puedes etiquetar tu biblioteca y planificar sets que encajen sin esfuerzo. Si quieres entender de d\u00f3nde sale, tienes una gu\u00eda completa en <a href=\"https:\/\/produccionmusic.com\/blog\/circulo-de-quintas-y-rueda-camelot\/\" style=\"color:#F15900;font-weight:bold;\">C\u00edrculo de quintas y rueda Camelot<\/a>.<\/p>\n<p>Programas profesionales como <strong style=\"color:#000000\">Rekordbox<\/strong> detectan y muestran la tonalidad de cada tema para que mezcles en armon\u00eda directamente en cabina. Si quieres dominar el flujo completo \u2014an\u00e1lisis, beatgrid y mezcla arm\u00f3nica\u2014 en nuestro <a href=\"https:\/\/produccionmusic.com\/curso-rekordbox-online\/\" style=\"color:#F15900;font-weight:bold;\">curso de DJ con Rekordbox<\/a> lo trabajamos paso a paso en clases particulares 1 a 1.<\/p>\n<h2>C\u00f3mo usar el BPM y la tonalidad para hacer un remix<\/h2>\n<p>Un buen <strong style=\"color:#000000\">remix<\/strong> empieza por los datos. Antes de tocar nada, analiza la canci\u00f3n original con esta herramienta para conocer su <strong style=\"color:#000000\">BPM y su tonalidad<\/strong>: son la base para que todo lo que a\u00f1adas encaje y suene afinado.<\/p>\n<p>El flujo habitual es este:<\/p>\n<ol>\n<li><strong style=\"color:#000000\">Identifica el BPM y la tonalidad<\/strong> de la canci\u00f3n elegida con el analizador de arriba.<\/li>\n<li><strong style=\"color:#000000\">Separa la canci\u00f3n en stems<\/strong> (voz, bater\u00eda, bajo, instrumentos) para quedarte con las partes que quieras reutilizar, como la acapella.<\/li>\n<li><strong style=\"color:#000000\">Ajusta el tempo y la tonalidad<\/strong> de tu proyecto a los de la pista original para que la voz y tus nuevos elementos encajen a tiempo y en clave.<\/li>\n<li>Construye tu base, tus acordes y tu bater\u00eda en ese mismo BPM y tonalidad, y monta el remix.<\/li>\n<\/ol>\n<p>Todo ese proceso \u2014separar stems, cuadrar tempo y tono, producir la base y mezclar\u2014 se hace dentro de un DAW. Si trabajas en Mac, en nuestro <a href=\"https:\/\/produccionmusic.com\/Cursos\/LogicPro\/\" style=\"color:#F15900;font-weight:bold;\">curso de Logic Pro<\/a> aprendes a producir de principio a fin; y si prefieres una opci\u00f3n potente y accesible en cualquier sistema, tienes el <a href=\"https:\/\/produccionmusic.com\/Cursos\/StudioOne\/\" style=\"color:#F15900;font-weight:bold;\">curso de Studio One \/ Fender Studio<\/a>. Ambos en clases particulares 1 a 1.<\/p>\n<h2>Tu m\u00fasica no sale de tu ordenador<\/h2>\n<p>A diferencia de otras webs, aqu\u00ed <strong style=\"color:#000000\">no se sube ning\u00fan archivo<\/strong>. Todo el an\u00e1lisis se ejecuta localmente en tu navegador mediante tecnolog\u00eda WebAssembly. Tu audio nunca viaja por internet ni se almacena en ning\u00fan sitio: en cuanto ves los resultados, el archivo se descarta de la memoria. Privacidad total para tus producciones in\u00e9ditas.<\/p>\n<h2>Preguntas frecuentes<\/h2>\n<h3>\u00bfEs gratis?<\/h3>\n<p>S\u00ed, totalmente gratis y sin l\u00edmite de usos. No hace falta registrarse ni instalar nada.<\/p>\n<h3>\u00bfSe sube mi m\u00fasica a alg\u00fan servidor?<\/h3>\n<p>No. El an\u00e1lisis ocurre al 100% en tu propio navegador. Tu archivo no se env\u00eda ni se guarda en ning\u00fan servidor.<\/p>\n<h3>\u00bfQu\u00e9 formatos acepta?<\/h3>\n<p>WAV y MP3, los dos formatos m\u00e1s habituales para producci\u00f3n y DJ.<\/p>\n<h3>\u00bfEs fiable el BPM y la tonalidad?<\/h3>\n<p>El BPM es muy preciso, sobre todo en m\u00fasica electr\u00f3nica con ritmo constante. La tonalidad acierta en la gran mayor\u00eda de casos; en temas con armon\u00edas ambiguas puede variar, por eso te muestro tambi\u00e9n el porcentaje de fiabilidad y una tonalidad relativa.<\/p>\n<h3>\u00bfSirve tanto para DJ como para producci\u00f3n?<\/h3>\n<p>Para ambos. Los DJ lo usan para mezcla arm\u00f3nica con el c\u00f3digo Camelot; los productores, para conocer BPM y tonalidad antes de meter samples, acordes o vocales.<\/p>\n<h3>\u00bfPara qu\u00e9 sirve el teclado con la escala?<\/h3>\n<p>Resalta sobre un piano las notas que componen la escala de la tonalidad detectada. Es muy \u00fatil para producir: te dice al instante qu\u00e9 notas puedes usar para melod\u00edas, acordes o bajos que suenen bien con el tema.<\/p>\n<h3>\u00bfMe sirve para hacer un remix?<\/h3>\n<p>S\u00ed. Analiza la canci\u00f3n original para conocer su BPM y tonalidad, separa en stems la parte que quieras reutilizar y trabaja tu versi\u00f3n en ese mismo tempo y clave. Es el primer paso de cualquier remix bien hecho.<\/p>\n<h3>\u00bfC\u00f3mo detectar la tonalidad de una canci\u00f3n?<\/h3>\n<p>Sube el archivo WAV o MP3 al analizador de arriba y detecta la tonalidad autom\u00e1ticamente en tu navegador: te muestra la nota en nomenclatura americana, su c\u00f3digo Camelot y la escala sobre el teclado. No necesitas conocimientos de teor\u00eda musical.<\/p>\n<h2>Lleva tus mezclas al siguiente nivel<\/h2>\n<p>Conocer el BPM y la tonalidad es solo el principio. Si quieres dar el salto y aprender de forma profesional, echa un vistazo a nuestros cursos: <a href=\"https:\/\/produccionmusic.com\/curso-rekordbox-online\/\" style=\"color:#F15900;font-weight:bold;\">DJ con Rekordbox<\/a> para mezcla arm\u00f3nica, o <a href=\"https:\/\/produccionmusic.com\/Cursos\/LogicPro\/\" style=\"color:#F15900;font-weight:bold;\">Logic Pro<\/a> y <a href=\"https:\/\/produccionmusic.com\/Cursos\/StudioOne\/\" style=\"color:#F15900;font-weight:bold;\">Studio One \/ Fender Studio<\/a> para producci\u00f3n. Todos en clases particulares 1 a 1 con un productor de +30 a\u00f1os de experiencia.<\/p>\n<p>Y si el analizador te ha resultado \u00fatil, comp\u00e1rtelo con quien lo necesite.<\/p>\n<p><a href=\"https:\/\/es.wikipedia.org\/wiki\/Luis_Sancho\"><span style=\"color: #ff6600;\"><strong>Luis Sancho<\/strong><\/span><\/a>.-\u00a0Compositor, Productor, Ingeniero de Mezcla \u2013 Masterizaci\u00f3n y Dj.<br \/>\nEspecialista en software DAW y Dj.<\/p>\n<p>Profesor en\u00a0escuela profesional\u00a0<strong><a style=\"color: #ff6600;\" href=\"https:\/\/produccionmusic.com\/\">ProduccionMusic.com<\/a><\/strong><\/p>\n<p><a href=\"https:\/\/produccionmusic.com\/\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/produccionmusic.com\/blog\/wp-content\/uploads\/2024\/01\/logog.jpg\" sizes=\"(max-width: 420px) 100vw, 420px\" srcset=\"https:\/\/produccionmusic.com\/blog\/wp-content\/uploads\/2024\/01\/logog.jpg 420w, https:\/\/produccionmusic.com\/blog\/wp-content\/uploads\/2024\/01\/logog-280x113.jpg 280w\" alt=\"Curso producci\u00f3n musical Dj en clases particulares\" width=\"420\" height=\"170\" \/><\/a><\/p>\n<script type=\"application\/ld+json\">\r\n{\r\n  \"@context\": \"https:\/\/schema.org\",\r\n  \"@type\": \"FAQPage\",\r\n  \"mainEntity\": [\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00bfEs gratis el analizador de BPM y tonalidad?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"S\u00ed, totalmente gratis y sin l\u00edmite de usos. No hace falta registrarse ni instalar nada.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00bfSe sube mi m\u00fasica a alg\u00fan servidor?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"No. El an\u00e1lisis ocurre al 100% en tu propio navegador. Tu archivo no se env\u00eda ni se guarda en ning\u00fan servidor.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00bfQu\u00e9 formatos de audio acepta?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"WAV y MP3, los dos formatos m\u00e1s habituales para producci\u00f3n musical y DJ.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00bfEs fiable el BPM y la tonalidad que detecta?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"El BPM es muy preciso, sobre todo en m\u00fasica electr\u00f3nica con ritmo constante. La tonalidad acierta en la gran mayor\u00eda de casos; en temas con armon\u00edas ambiguas puede variar, por eso se muestra tambi\u00e9n el porcentaje de fiabilidad y una tonalidad relativa.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00bfSirve tanto para DJ como para producci\u00f3n musical?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Para ambos. Los DJ lo usan para mezcla arm\u00f3nica con el c\u00f3digo Camelot; los productores, para conocer el BPM y la tonalidad antes de meter samples, acordes o vocales.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00bfPara qu\u00e9 sirve el teclado con la escala?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Resalta sobre un piano las notas que componen la escala de la tonalidad detectada. Es muy \u00fatil para producir: te dice al instante qu\u00e9 notas puedes usar para melod\u00edas, acordes o bajos que suenen bien con el tema.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00bfMe sirve para hacer un remix?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"S\u00ed. Analiza la canci\u00f3n original para conocer su BPM y tonalidad, separa en stems la parte que quieras reutilizar y trabaja tu versi\u00f3n en ese mismo tempo y clave. Es el primer paso de cualquier remix bien hecho.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00bfC\u00f3mo detectar la tonalidad de una canci\u00f3n?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Sube el archivo WAV o MP3 al analizador y detecta la tonalidad autom\u00e1ticamente en tu navegador: te muestra la nota en nomenclatura americana, su c\u00f3digo Camelot y la escala sobre el teclado. No necesitas conocimientos de teor\u00eda musical.\"\r\n      }\r\n    }\r\n  ]\r\n}\r\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Esta herramienta gratuita detecta el BPM, la tonalidad y la escala de cualquier canci\u00f3n en segundos, pensada para DJs y productores musicales. Sube un WAV o MP3 y obt\u00e9n al instante su tempo, su tonalidad en nomenclatura americana, el c\u00f3digo Camelot para mezcla arm\u00f3nica y las notas de la escala &#8230;<\/p>\n<a href=\"https:\/\/produccionmusic.com\/blog\/analizar-bpm-tonalidad-online\/\" title=\"Permalink to: Analizador de BPM y Tonalidad Online\" class=\"btn btn-extra-small btn-dark-border btn-transparent\">Leer m\u00e1s... <\/a>","protected":false},"author":2,"featured_media":3127,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-3106","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-audio"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/posts\/3106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/comments?post=3106"}],"version-history":[{"count":18,"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/posts\/3106\/revisions"}],"predecessor-version":[{"id":3130,"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/posts\/3106\/revisions\/3130"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/media\/3127"}],"wp:attachment":[{"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/media?parent=3106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/categories?post=3106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/produccionmusic.com\/blog\/wp-json\/wp\/v2\/tags?post=3106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}