{"id":4642,"date":"2026-02-18T16:52:09","date_gmt":"2026-02-18T21:52:09","guid":{"rendered":"https:\/\/smartdsp.pro\/?page_id=4642"},"modified":"2026-02-18T16:58:50","modified_gmt":"2026-02-18T21:58:50","slug":"abx-test","status":"publish","type":"page","link":"https:\/\/smartdsp.pro\/fr\/abx-test\/","title":{"rendered":"Test Comparaison Audio ABx"},"content":{"rendered":"\n[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>ABX Audio Comparator<\/title><!-- [et_pb_line_break_holder] --><link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"><!-- [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] --><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] -->  --accent:       #f3be29;<!-- [et_pb_line_break_holder] -->  --accent-h:     #f99c06;<!-- [et_pb_line_break_holder] -->  --gradient:     linear-gradient(135deg, #f3be29 0%, #cd3ba7 100%);<!-- [et_pb_line_break_holder] -->  --gb:           rgba(255,255,255,0.09);  \/* glass border *\/<!-- [et_pb_line_break_holder] -->  --gb-h:         rgba(255,255,255,0.16);  \/* glass border hover *\/<!-- [et_pb_line_break_holder] -->  --text:         #ffffff;<!-- [et_pb_line_break_holder] -->  --text-sub:     rgba(255,255,255,0.58);<!-- [et_pb_line_break_holder] -->  --text-dim:     rgba(255,255,255,0.32);<!-- [et_pb_line_break_holder] -->  --red:          #ff4d6d;<!-- [et_pb_line_break_holder] -->  --green:        #39d98a;<!-- [et_pb_line_break_holder] -->  --panel:        rgba(8,8,10,0.60);<!-- [et_pb_line_break_holder] -->  --r:            16px;<!-- [et_pb_line_break_holder] -->  --r-sm:         10px;<!-- [et_pb_line_break_holder] -->  --ease:         0.17s cubic-bezier(0.4,0,0.2,1);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->body {<!-- [et_pb_line_break_holder] -->  font-family: 'Be Vietnam Pro', sans-serif;<!-- [et_pb_line_break_holder] -->  color: var(--text);<!-- [et_pb_line_break_holder] -->  background: transparent;<!-- [et_pb_line_break_holder] -->  min-height: 100vh;<!-- [et_pb_line_break_holder] -->  padding: 32px 20px 56px;<!-- [et_pb_line_break_holder] -->  -webkit-font-smoothing: antialiased;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.app { max-width: 860px; margin: 0 auto; display: flex; flex-direction: column; gap: 18px; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 Header \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->.header {<!-- [et_pb_line_break_holder] -->  display: flex; align-items: center; gap: 18px;<!-- [et_pb_line_break_holder] -->  padding-bottom: 20px; border-bottom: 1px solid var(--gb);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.logo-badge {<!-- [et_pb_line_break_holder] -->  background: var(--gradient); border-radius: 11px;<!-- [et_pb_line_break_holder] -->  padding: 8px 15px; font-size: 13px; font-weight: 800;<!-- [et_pb_line_break_holder] -->  letter-spacing: .09em; text-transform: uppercase; color: #000; flex-shrink: 0;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.header-info h1 { font-size: 18px; font-weight: 700; letter-spacing: -.02em; color: var(--text); }<!-- [et_pb_line_break_holder] -->.header-info p  { font-size: 11.5px; color: var(--text); margin-top: 3px; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.la-badge {<!-- [et_pb_line_break_holder] -->    display: inline-flex;<!-- [et_pb_line_break_holder] -->    align-items: center;<!-- [et_pb_line_break_holder] -->    gap: 7px;<!-- [et_pb_line_break_holder] -->    padding: 5px 14px 5px 10px;<!-- [et_pb_line_break_holder] -->    border-radius: 100px;<!-- [et_pb_line_break_holder] -->    border: 1px solid rgba(8, 156, 4,0.22);<!-- [et_pb_line_break_holder] -->    background: rgba(28, 156, 4,0.06);<!-- [et_pb_line_break_holder] -->    margin-bottom: 10px;<!-- [et_pb_line_break_holder] -->    max-width:380px;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  .la-badge-pip {<!-- [et_pb_line_break_holder] -->    width: 5px; height: 5px;<!-- [et_pb_line_break_holder] -->    border-radius: 50%;<!-- [et_pb_line_break_holder] -->    background: #089c04;<!-- [et_pb_line_break_holder] -->    box-shadow: 0 0 7px #089c04;<!-- [et_pb_line_break_holder] -->    animation: pip 2.5s ease infinite;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  @keyframes pip {<!-- [et_pb_line_break_holder] -->    0%,100%{ opacity:1; box-shadow:0 0 7px var(--accent); }<!-- [et_pb_line_break_holder] -->    50%     { opacity:0.35; box-shadow:0 0 2px var(--accent); }<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  .la-badge-text {<!-- [et_pb_line_break_holder] -->    font-size: 10px;<!-- [et_pb_line_break_holder] -->    font-weight: 600;<!-- [et_pb_line_break_holder] -->    letter-spacing: 0.1em;<!-- [et_pb_line_break_holder] -->    text-transform: uppercase;<!-- [et_pb_line_break_holder] -->    color: #089c04;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 Panel \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->.panel {<!-- [et_pb_line_break_holder] -->  background: var(--panel);<!-- [et_pb_line_break_holder] -->  border: 1px solid var(--gb); border-radius: var(--r);<!-- [et_pb_line_break_holder] -->  backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px);<!-- [et_pb_line_break_holder] -->  padding: 24px; transition: border-color var(--ease);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.panel:hover { border-color: var(--gb-h); }<!-- [et_pb_line_break_holder] -->.panel-title {<!-- [et_pb_line_break_holder] -->  font-size: 10.5px; font-weight: 700;<!-- [et_pb_line_break_holder] -->  letter-spacing: .14em; text-transform: uppercase;<!-- [et_pb_line_break_holder] -->  color: var(--text); margin-bottom: 20px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 File Slots \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->.files-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }<!-- [et_pb_line_break_holder] -->.file-slot {<!-- [et_pb_line_break_holder] -->  border: 1.5px dashed rgba(255,255,255,0.12); border-radius: var(--r-sm);<!-- [et_pb_line_break_holder] -->  padding: 22px 16px; min-height: 116px;<!-- [et_pb_line_break_holder] -->  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;<!-- [et_pb_line_break_holder] -->  cursor: pointer; position: relative; overflow: hidden;<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,0.02); transition: all var(--ease);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.file-slot:hover { border-color: rgba(243,190,41,.40); background: rgba(243,190,41,.03); }<!-- [et_pb_line_break_holder] -->.file-slot.loaded { border-style: solid; border-color: rgba(243,190,41,.32); background: rgba(243,190,41,.04); }<!-- [et_pb_line_break_holder] -->.file-slot input[type=\"file\"] { display: none; }<!-- [et_pb_line_break_holder] -->.slot-label {<!-- [et_pb_line_break_holder] -->  font-size: 22px; font-weight: 800;<!-- [et_pb_line_break_holder] -->  background: var(--gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.slot-name { font-size: 11.5px; color: var(--text-sub); text-align: center; word-break: break-all; line-height: 1.45; }<!-- [et_pb_line_break_holder] -->.slot-hint { font-size: 11px; color: var(--text-dim); }<!-- [et_pb_line_break_holder] -->.slot-clear {<!-- [et_pb_line_break_holder] -->  position: absolute; top: 8px; right: 10px;<!-- [et_pb_line_break_holder] -->  font-size: 13px; color: var(--text-dim);<!-- [et_pb_line_break_holder] -->  cursor: pointer; background: none; border: none;<!-- [et_pb_line_break_holder] -->  transition: color var(--ease); display: none; line-height: 1; padding: 2px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.file-slot.loaded .slot-clear { display: block; }<!-- [et_pb_line_break_holder] -->.slot-clear:hover { color: var(--red); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 Toggle \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->.options-row { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 16px; }<!-- [et_pb_line_break_holder] -->.toggle-group { display: flex; align-items: center; gap: 10px; cursor: pointer; }<!-- [et_pb_line_break_holder] -->.toggle-label { font-size: 13px; font-weight: 500; color: var(--text-sub); user-select: none; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.toggle { position: relative; width: 40px; height: 22px; flex-shrink: 0; }<!-- [et_pb_line_break_holder] -->.toggle input { position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none; }<!-- [et_pb_line_break_holder] -->\/* track *\/<!-- [et_pb_line_break_holder] -->.t-track {<!-- [et_pb_line_break_holder] -->  position: absolute; inset: 0; border-radius: 11px;<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,0.10);<!-- [et_pb_line_break_holder] -->  border: 1.5px solid rgba(255,255,255,0.14);<!-- [et_pb_line_break_holder] -->  transition: background var(--ease), border-color var(--ease);<!-- [et_pb_line_break_holder] -->  cursor: pointer;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.toggle input:checked ~ .t-track { background: var(--accent); border-color: var(--accent); }<!-- [et_pb_line_break_holder] -->\/* thumb \u2014 sibling to track inside .toggle, NOT inside track *\/<!-- [et_pb_line_break_holder] -->.t-thumb {<!-- [et_pb_line_break_holder] -->  position: absolute; top: 3px; left: 3px;<!-- [et_pb_line_break_holder] -->  width: 16px; height: 16px; border-radius: 50%;<!-- [et_pb_line_break_holder] -->  background: #fff; box-shadow: 0 1px 4px rgba(0,0,0,.45);<!-- [et_pb_line_break_holder] -->  transition: transform var(--ease); pointer-events: none; z-index: 2;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.toggle input:checked ~ .t-thumb { transform: translateX(18px); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.gain-badges { display: flex; align-items: center; gap: 6px; margin-left: auto; }<!-- [et_pb_line_break_holder] -->.gain-badge {<!-- [et_pb_line_break_holder] -->  padding: 3px 9px; border-radius: 6px; font-size: 11px; font-weight: 600;<!-- [et_pb_line_break_holder] -->  background: rgba(243,190,41,.10); color: var(--accent);<!-- [et_pb_line_break_holder] -->  border: 1px solid rgba(243,190,41,.22); display: none;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.info-note {<!-- [et_pb_line_break_holder] -->  margin-top: 12px; padding: 10px 14px; border-radius: 9px;<!-- [et_pb_line_break_holder] -->  border: 1px solid var(--gb); background: rgba(255,255,255,.025);<!-- [et_pb_line_break_holder] -->  font-size: 11.5px; color: var(--text-sub); line-height: 1.6;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.info-note strong { color: var(--text); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 Buttons \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->.btn {<!-- [et_pb_line_break_holder] -->  display: inline-flex; align-items: center; gap: 8px;<!-- [et_pb_line_break_holder] -->  padding: 11px 22px; border-radius: var(--r-sm);<!-- [et_pb_line_break_holder] -->  font-family: 'Be Vietnam Pro', sans-serif;<!-- [et_pb_line_break_holder] -->  font-size: 13px; font-weight: 600; letter-spacing: .01em;<!-- [et_pb_line_break_holder] -->  cursor: pointer; border: 1.5px solid transparent;<!-- [et_pb_line_break_holder] -->  transition: all var(--ease); white-space: nowrap; background: none;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.btn:disabled { opacity: .28; cursor: not-allowed; pointer-events: none; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* Track buttons \u2014 white idle, yellow active *\/<!-- [et_pb_line_break_holder] -->.btn-track {<!-- [et_pb_line_break_holder] -->  color: var(--text);<!-- [et_pb_line_break_holder] -->  border-color: rgba(255,255,255,.18);<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,.05);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.btn-track:hover {<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,.09);<!-- [et_pb_line_break_holder] -->  border-color: rgba(255,255,255,.30);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.btn-track.playing {<!-- [et_pb_line_break_holder] -->  color: var(--accent);<!-- [et_pb_line_break_holder] -->  border-color: rgba(243,190,41,.55);<!-- [et_pb_line_break_holder] -->  background: rgba(243,190,41,.10);<!-- [et_pb_line_break_holder] -->  box-shadow: 0 0 18px rgba(243,190,41,.12);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* Ghost \/ secondary *\/<!-- [et_pb_line_break_holder] -->.btn-ghost {<!-- [et_pb_line_break_holder] -->  color: var(--text-sub);<!-- [et_pb_line_break_holder] -->  border-color: rgba(255,255,255,.12);<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,.04);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.btn-ghost:hover {<!-- [et_pb_line_break_holder] -->  color: var(--text);<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,.08);<!-- [et_pb_line_break_holder] -->  border-color: rgba(255,255,255,.20);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* Primary CTA *\/<!-- [et_pb_line_break_holder] -->.btn-primary {<!-- [et_pb_line_break_holder] -->  background: var(--gradient); color: #000;<!-- [et_pb_line_break_holder] -->  border: none; font-weight: 700;<!-- [et_pb_line_break_holder] -->  box-shadow: 0 4px 18px rgba(243,190,41,.18);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.btn-primary:hover {<!-- [et_pb_line_break_holder] -->  filter: brightness(1.07);<!-- [et_pb_line_break_holder] -->  box-shadow: 0 4px 26px rgba(243,190,41,.30);<!-- [et_pb_line_break_holder] -->  transform: translateY(-1px);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.btn-sm { padding: 7px 15px; font-size: 12px; border-radius: 8px; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 Player \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->.player-buttons { display: flex; gap: 10px; margin-bottom: 22px; flex-wrap: wrap; }<!-- [et_pb_line_break_holder] -->.timeline-wrap { display: flex; flex-direction: column; gap: 9px; }<!-- [et_pb_line_break_holder] -->.time-row { display: flex; justify-content: space-between; align-items: center; }<!-- [et_pb_line_break_holder] -->.now-playing { font-size: 12px; font-weight: 600; color: var(--text-sub); display: flex; align-items: center; gap: 8px; }<!-- [et_pb_line_break_holder] -->.np-slot { background: var(--gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }<!-- [et_pb_line_break_holder] -->.time-code { font-size: 11.5px; color: var(--text-dim); font-variant-numeric: tabular-nums; font-weight: 500; }<!-- [et_pb_line_break_holder] -->.status-dot {<!-- [et_pb_line_break_holder] -->  width: 7px; height: 7px; border-radius: 50%;<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,.14); flex-shrink: 0;<!-- [et_pb_line_break_holder] -->  transition: background var(--ease);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.status-dot.on { background: var(--green); box-shadow: 0 0 7px rgba(57,217,138,.65); animation: blink 1.4s ease-in-out infinite; }<!-- [et_pb_line_break_holder] -->@keyframes blink { 0%,100%{opacity:1} 50%{opacity:.5} }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 Range inputs \u2014 all unified \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->input[type=\"range\"] {<!-- [et_pb_line_break_holder] -->  -webkit-appearance: none; appearance: none;<!-- [et_pb_line_break_holder] -->  width: 100%; height: 4px; border-radius: 2px;<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,.10);<!-- [et_pb_line_break_holder] -->  outline: none; cursor: pointer;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->input[type=\"range\"]::-webkit-slider-thumb {<!-- [et_pb_line_break_holder] -->  -webkit-appearance: none; appearance: none;<!-- [et_pb_line_break_holder] -->  width: 15px; height: 15px; border-radius: 50%;<!-- [et_pb_line_break_holder] -->  background: var(--accent);<!-- [et_pb_line_break_holder] -->  box-shadow: 0 0 6px rgba(243,190,41,.50);<!-- [et_pb_line_break_holder] -->  transition: transform var(--ease), box-shadow var(--ease); cursor: pointer;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->input[type=\"range\"]:hover::-webkit-slider-thumb {<!-- [et_pb_line_break_holder] -->  transform: scale(1.25); box-shadow: 0 0 12px rgba(243,190,41,.65);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->input[type=\"range\"]::-moz-range-thumb {<!-- [et_pb_line_break_holder] -->  width: 15px; height: 15px; border-radius: 50%;<!-- [et_pb_line_break_holder] -->  background: var(--accent); border: none; box-shadow: 0 0 6px rgba(243,190,41,.50);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* Seek: yellow fill *\/<!-- [et_pb_line_break_holder] -->#seekBar { background: linear-gradient(to right, rgba(243,190,41,.65) var(--pct,0%), rgba(255,255,255,.10) var(--pct,0%)); }<!-- [et_pb_line_break_holder] -->\/* Volume: yellow fill *\/<!-- [et_pb_line_break_holder] -->#volumeBar { background: linear-gradient(to right, rgba(243,190,41,.70) var(--pct,80%), rgba(255,255,255,.10) var(--pct,80%)); max-width: 140px; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.controls-row { display: flex; align-items: center; gap: 14px; margin-top: 16px; flex-wrap: wrap; }<!-- [et_pb_line_break_holder] -->.vol-group { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 160px; }<!-- [et_pb_line_break_holder] -->.mute-btn { font-size: 14px; cursor: pointer; user-select: none; color: var(--text); transition: color var(--ease); flex-shrink: 0; background: none; border: none; padding: 0; font-family: inherit; }<!-- [et_pb_line_break_holder] -->.mute-btn:hover { color: var(--text); }<!-- [et_pb_line_break_holder] -->.vol-label { font-size: 11px; color: var(--text); font-variant-numeric: tabular-nums; min-width: 32px; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 ABX \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->.abx-header { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin-bottom: 20px; }<!-- [et_pb_line_break_holder] -->.abx-meta { display: flex; align-items: center; gap: 14px; }<!-- [et_pb_line_break_holder] -->.trial-counter { font-size: 13px; font-weight: 600; color: var(--text-sub); }<!-- [et_pb_line_break_holder] -->.trial-counter strong { color: var(--text); font-size: 16px; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.progress-dots { display: flex; gap: 5px; }<!-- [et_pb_line_break_holder] -->.dot {<!-- [et_pb_line_break_holder] -->  width: 9px; height: 9px; border-radius: 50%;<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,.12); border: 1.5px solid transparent;<!-- [et_pb_line_break_holder] -->  transition: all .25s ease;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->\/* During test \u2014 answered dots are just slightly brighter white, no colour hint *\/<!-- [et_pb_line_break_holder] -->.dot.answered { background: rgba(255,255,255,.40); }<!-- [et_pb_line_break_holder] -->\/* Current trial pulse *\/<!-- [et_pb_line_break_holder] -->.dot.current  { background: transparent; border-color: var(--accent); box-shadow: 0 0 7px rgba(243,190,41,.55); animation: blink 1.2s ease-in-out infinite; }<!-- [et_pb_line_break_holder] -->\/* Revealed after test *\/<!-- [et_pb_line_break_holder] -->.dot.correct  { background: var(--green); border-color: transparent; box-shadow: none; animation: none; }<!-- [et_pb_line_break_holder] -->.dot.wrong    { background: var(--red);   border-color: transparent; box-shadow: none; animation: none; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.stop-abx-wrap { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; }<!-- [et_pb_line_break_holder] -->.stop-abx-sub  { font-size: 10.5px; color: var(--text-dim); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.abx-player-row { display: flex; gap: 10px; margin-bottom: 18px; flex-wrap: wrap; }<!-- [et_pb_line_break_holder] -->.btn-x-wide { flex: 1; justify-content: center; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.answer-row { display: flex; gap: 12px; }<!-- [et_pb_line_break_holder] -->.btn-answer {<!-- [et_pb_line_break_holder] -->  flex: 1; justify-content: center;<!-- [et_pb_line_break_holder] -->  font-size: 15px; font-weight: 700; padding: 18px; border-radius: 12px;<!-- [et_pb_line_break_holder] -->  letter-spacing: .04em; color: var(--text);<!-- [et_pb_line_break_holder] -->  border-color: rgba(255,255,255,.16); background: rgba(255,255,255,.04);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.btn-answer:hover {<!-- [et_pb_line_break_holder] -->  color: var(--accent); border-color: rgba(243,190,41,.50);<!-- [et_pb_line_break_holder] -->  background: rgba(243,190,41,.08);<!-- [et_pb_line_break_holder] -->  box-shadow: 0 4px 22px rgba(243,190,41,.12); transform: translateY(-2px);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.abx-hint { font-size: 11.5px; color: var(--text-dim); text-align: center; margin-top: 14px; line-height: 1.6; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 Results \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->#results-panel { display: none; }<!-- [et_pb_line_break_holder] -->.results-hero {<!-- [et_pb_line_break_holder] -->  display: flex; align-items: center; gap: 24px;<!-- [et_pb_line_break_holder] -->  padding: 24px; border-radius: var(--r-sm);<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,.025); border: 1px solid var(--gb); margin-bottom: 18px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.score-pct {<!-- [et_pb_line_break_holder] -->  font-size: 54px; font-weight: 800; line-height: 1; flex-shrink: 0;<!-- [et_pb_line_break_holder] -->  background: var(--gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.score-detail { flex: 1; }<!-- [et_pb_line_break_holder] -->.score-label { font-size: 14px; font-weight: 700; color: var(--text); margin-bottom: 4px; }<!-- [et_pb_line_break_holder] -->.score-sub   { font-size: 12px; color: var(--text-sub); line-height: 1.6; }<!-- [et_pb_line_break_holder] -->.score-bar-wrap { height: 5px; background: rgba(255,255,255,.08); border-radius: 3px; margin-top: 14px; overflow: hidden; }<!-- [et_pb_line_break_holder] -->.score-bar { height: 100%; border-radius: 3px; background: var(--gradient); transition: width .7s cubic-bezier(.4,0,.2,1); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.stat-badges { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 16px; }<!-- [et_pb_line_break_holder] -->.stat-badge {<!-- [et_pb_line_break_holder] -->  padding: 9px 14px; border-radius: 9px;<!-- [et_pb_line_break_holder] -->  background: rgba(255,255,255,.04); border: 1px solid var(--gb);<!-- [et_pb_line_break_holder] -->  display: flex; flex-direction: column; gap: 3px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.sb-val { font-size: 18px; font-weight: 800; color: var(--text); }<!-- [et_pb_line_break_holder] -->.sb-lbl { font-size: 11px; color: var(--text-dim); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.trials-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(58px,1fr)); gap: 8px; margin-bottom: 16px; }<!-- [et_pb_line_break_holder] -->.trial-card {<!-- [et_pb_line_break_holder] -->  padding: 10px 6px; border-radius: 10px; text-align: center;<!-- [et_pb_line_break_holder] -->  font-size: 11px; font-weight: 600; border: 1.5px solid transparent;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.trial-card.correct { background: rgba(57,217,138,.10); border-color: rgba(57,217,138,.30); color: var(--green); }<!-- [et_pb_line_break_holder] -->.trial-card.wrong   { background: rgba(255,77,109,.10);  border-color: rgba(255,77,109,.30);  color: var(--red); }<!-- [et_pb_line_break_holder] -->.tc-num    { font-size: 16px; font-weight: 800; display: block; margin-bottom: 3px; }<!-- [et_pb_line_break_holder] -->.tc-answer { opacity: .72; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.interpretation {<!-- [et_pb_line_break_holder] -->  padding: 14px 18px; border-radius: var(--r-sm); font-size: 13px; line-height: 1.65;<!-- [et_pb_line_break_holder] -->  color: var(--text-sub); border: 1px solid var(--gb); background: rgba(255,255,255,.025);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.interpretation strong { color: var(--text); }<!-- [et_pb_line_break_holder] -->.results-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 16px; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 Feedback flash \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->.feedback-flash {<!-- [et_pb_line_break_holder] -->  position: fixed; inset: 0; pointer-events: none; z-index: 9999;<!-- [et_pb_line_break_holder] -->  opacity: 0; transition: opacity .12s ease; background: rgba(243,190,41,.06);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.feedback-flash.show { opacity: 1; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2500\u2500\u2500 Mobile \u2500\u2500\u2500 *\/<!-- [et_pb_line_break_holder] -->@media (max-width: 560px) {<!-- [et_pb_line_break_holder] -->  .files-grid { grid-template-columns: 1fr; }<!-- [et_pb_line_break_holder] -->  .answer-row { flex-direction: column; }<!-- [et_pb_line_break_holder] -->  .score-pct  { font-size: 38px; }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->::-webkit-scrollbar { width: 5px; }<!-- [et_pb_line_break_holder] -->::-webkit-scrollbar-track { background: transparent; }<!-- [et_pb_line_break_holder] -->::-webkit-scrollbar-thumb { background: rgba(255,255,255,.10); border-radius: 3px; }<!-- [et_pb_line_break_holder] --><\/style><!-- [et_pb_line_break_holder] --><\/head><!-- [et_pb_line_break_holder] --><body><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><div class=\"feedback-flash\" id=\"feedbackFlash\"><\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><div class=\"app\"><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <!-- Header --><!-- [et_pb_line_break_holder] -->  <div class=\"la-badge\"><!-- [et_pb_line_break_holder] -->      <span class=\"la-badge-pip\"><\/span><!-- [et_pb_line_break_holder] -->      <span class=\"la-badge-text\">Free \u00b7 100% Local \u00b7 No Ads \u00b7 No Account Required<\/span><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] -->  <div class=\"header\"><!-- [et_pb_line_break_holder] -->    <div class=\"logo-badge\">ABX<\/div><!-- [et_pb_line_break_holder] -->    <div class=\"header-info\"><!-- [et_pb_line_break_holder] -->      <h1>Audio Blind Test Comparator<\/h1><!-- [et_pb_line_break_holder] -->      <pee><b>Verify if you can actually hear a difference between 2 files.<\/b><\/br>Load files A\/B > Start Blind Test > Guess multiple times which file is playing > Reveal Results.> <\/pee><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] -->  <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <!-- File Loading --><!-- [et_pb_line_break_holder] -->  <div class=\"panel\"><!-- [et_pb_line_break_holder] -->    <div class=\"panel-title\">Load Files<\/div><!-- [et_pb_line_break_holder] -->    <div class=\"files-grid\"><!-- [et_pb_line_break_holder] -->      <div class=\"file-slot\" id=\"slotA\" onclick=\"triggerFile('A')\"><!-- [et_pb_line_break_holder] -->        <input type=\"file\" id=\"fileA\" accept=\"audio\/*\" onchange=\"loadFile('A',this)\"><!-- [et_pb_line_break_holder] -->        <div class=\"slot-label\">A<\/div><!-- [et_pb_line_break_holder] -->        <div class=\"slot-name\" id=\"nameA\">Click or drop file A<\/div><!-- [et_pb_line_break_holder] -->        <div class=\"slot-hint\" id=\"hintA\">WAV \u00b7 FLAC \u00b7 MP3 \u00b7 AAC \u00b7 OGG<\/div><!-- [et_pb_line_break_holder] -->        <button class=\"slot-clear\" id=\"clearA\" onclick=\"clearFile(event,'A')\" title=\"Remove\">\u2715<\/button><!-- [et_pb_line_break_holder] -->      <\/div><!-- [et_pb_line_break_holder] -->      <div class=\"file-slot\" id=\"slotB\" onclick=\"triggerFile('B')\"><!-- [et_pb_line_break_holder] -->        <input type=\"file\" id=\"fileB\" accept=\"audio\/*\" onchange=\"loadFile('B',this)\"><!-- [et_pb_line_break_holder] -->        <div class=\"slot-label\">B<\/div><!-- [et_pb_line_break_holder] -->        <div class=\"slot-name\" id=\"nameB\">Click or drop file B<\/div><!-- [et_pb_line_break_holder] -->        <div class=\"slot-hint\" id=\"hintB\">WAV \u00b7 FLAC \u00b7 MP3 \u00b7 AAC \u00b7 OGG<\/div><!-- [et_pb_line_break_holder] -->        <button class=\"slot-clear\" id=\"clearB\" onclick=\"clearFile(event,'B')\" title=\"Remove\">\u2715<\/button><!-- [et_pb_line_break_holder] -->      <\/div><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <div class=\"options-row\"><!-- [et_pb_line_break_holder] -->      <label class=\"toggle-group\" for=\"gainToggle\"><!-- [et_pb_line_break_holder] -->        <div class=\"toggle\"><!-- [et_pb_line_break_holder] -->          <input type=\"checkbox\" id=\"gainToggle\" checked onchange=\"onGainToggle()\"><!-- [et_pb_line_break_holder] -->          <div class=\"t-track\"><\/div><!-- [et_pb_line_break_holder] -->          <div class=\"t-thumb\"><\/div><!-- [et_pb_line_break_holder] -->        <\/div><!-- [et_pb_line_break_holder] -->        <span class=\"toggle-label\">Gain Match<\/span><!-- [et_pb_line_break_holder] -->      <\/label><!-- [et_pb_line_break_holder] -->      <div class=\"gain-badges\"><!-- [et_pb_line_break_holder] -->        <span class=\"gain-badge\" id=\"gainBadgeA\"><\/span><!-- [et_pb_line_break_holder] -->        <span class=\"gain-badge\" id=\"gainBadgeB\"><\/span><!-- [et_pb_line_break_holder] -->      <\/div><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <div class=\"info-note\" id=\"gainNote\"><!-- [et_pb_line_break_holder] -->      \u26a1 <strong>Gain Match ON<\/strong> \u2014 RMS-based compensation applied in real-time so volume differences don&#8217;t bias your test. For gold-standard results, LUFS-normalize your files in a DAW beforehand.<!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] -->  <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- 'Blind Test' --><!-- [et_pb_line_break_holder] -->  <div class=\"panel\"><!-- [et_pb_line_break_holder] -->    <div class=\"panel-title\">Blind Test<\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <div id=\"abxReady\"><!-- [et_pb_line_break_holder] -->      <pee style=\"font-size:13px;color:var(--text-sub);line-height:1.75;margin-bottom:18px;\"><!-- [et_pb_line_break_holder] -->        Load both files above to begin. Each trial randomly assigns A or B as the mystery file<!-- [et_pb_line_break_holder] -->        <strong style=\"color:var(--text);\">X<\/strong>. Listen freely, then vote. Results and statistics reveal only at the end \u2014 no bias during the test.<!-- [et_pb_line_break_holder] -->      <\/pee><!-- [et_pb_line_break_holder] -->      <button class=\"btn btn-primary\" id=\"startBtn\" onclick=\"abxStart()\" disabled>\u25b6&ensp;Start Blind Test<\/button><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <div id=\"abxRun\" style=\"display:none\"><!-- [et_pb_line_break_holder] -->      <div class=\"abx-header\"><!-- [et_pb_line_break_holder] -->        <div class=\"abx-meta\"><!-- [et_pb_line_break_holder] -->          <div class=\"progress-dots\" id=\"progressDots\"><\/div><!-- [et_pb_line_break_holder] -->          <div class=\"trial-counter\">Trial <strong id=\"trialNum\">1<\/strong> \/ 16<\/div><!-- [et_pb_line_break_holder] -->        <\/div><!-- [et_pb_line_break_holder] -->        <div class=\"stop-abx-wrap\"><!-- [et_pb_line_break_holder] -->          <button class=\"btn btn-ghost btn-sm\" onclick=\"abxStop()\">\u25a0 Stop Early<\/button><!-- [et_pb_line_break_holder] -->          <span class=\"stop-abx-sub\">Reveals results<\/span><!-- [et_pb_line_break_holder] -->        <\/div><!-- [et_pb_line_break_holder] -->      <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      <div class=\"abx-player-row\"><!-- [et_pb_line_break_holder] -->        <button class=\"btn btn-track btn-x-wide\" id=\"btnX\" onclick=\"abxToggle('X')\"><!-- [et_pb_line_break_holder] -->          <span id=\"iconX\">\u25b6<\/span> Play X<!-- [et_pb_line_break_holder] -->        <\/button><!-- [et_pb_line_break_holder] -->        <button class=\"btn btn-track btn-sm\" id=\"btnAbxA\" onclick=\"abxToggle('A')\"><!-- [et_pb_line_break_holder] -->          <span id=\"iconAbxA\">\u25b6<\/span> A<!-- [et_pb_line_break_holder] -->        <\/button><!-- [et_pb_line_break_holder] -->        <button class=\"btn btn-track btn-sm\" id=\"btnAbxB\" onclick=\"abxToggle('B')\"><!-- [et_pb_line_break_holder] -->          <span id=\"iconAbxB\">\u25b6<\/span> B<!-- [et_pb_line_break_holder] -->        <\/button><!-- [et_pb_line_break_holder] -->      <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      <div class=\"answer-row\"><!-- [et_pb_line_break_holder] -->        <button class=\"btn btn-answer\" onclick=\"abxAnswer('A')\">A<\/button><!-- [et_pb_line_break_holder] -->        <button class=\"btn btn-answer\" onclick=\"abxAnswer('B')\">B<\/button><!-- [et_pb_line_break_holder] -->      <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      <pee class=\"abx-hint\">Play X, then compare with A and B. <strong style=\"color:var(--text-sub);\">Click A or B when ready to answer.<\/strong><\/pee><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] -->  <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <!-- Results --><!-- [et_pb_line_break_holder] -->  <div class=\"panel\" id=\"results-panel\"><!-- [et_pb_line_break_holder] -->    <div class=\"panel-title\">Results<\/div><!-- [et_pb_line_break_holder] -->    <div class=\"results-hero\"><!-- [et_pb_line_break_holder] -->      <div class=\"score-pct\" id=\"scorePct\">\u2014<\/div><!-- [et_pb_line_break_holder] -->      <div class=\"score-detail\"><!-- [et_pb_line_break_holder] -->        <div class=\"score-label\" id=\"scoreLabel\">\u2014<\/div><!-- [et_pb_line_break_holder] -->        <div class=\"score-sub\"   id=\"scoreSub\">\u2014<\/div><!-- [et_pb_line_break_holder] -->        <div class=\"score-bar-wrap\"><div class=\"score-bar\" id=\"scoreBar\" style=\"width:0%\"><\/div><\/div><!-- [et_pb_line_break_holder] -->      <\/div><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] -->    <div class=\"stat-badges\" id=\"statBadges\"><\/div><!-- [et_pb_line_break_holder] -->    <div class=\"trials-grid\"  id=\"trialsGrid\"><\/div><!-- [et_pb_line_break_holder] -->    <div class=\"interpretation\" id=\"interp\"><\/div><!-- [et_pb_line_break_holder] -->    <div class=\"results-actions\"><!-- [et_pb_line_break_holder] -->      <button class=\"btn btn-primary\" onclick=\"abxStart()\">\u25b6 Run Again<\/button><!-- [et_pb_line_break_holder] -->      <button class=\"btn btn-ghost\"   onclick=\"hideResults()\">\u2715 Dismiss<\/button><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] -->  <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <!-- Player --><!-- [et_pb_line_break_holder] -->  <div class=\"panel\"><!-- [et_pb_line_break_holder] -->    <div class=\"panel-title\">Simple Player<\/div><!-- [et_pb_line_break_holder] -->    <div class=\"player-buttons\"><!-- [et_pb_line_break_holder] -->      <button class=\"btn btn-track\" id=\"btnA\" onclick=\"playerToggle('A')\" disabled><!-- [et_pb_line_break_holder] -->        <span id=\"iconA\">\u25b6<\/span> Play A<!-- [et_pb_line_break_holder] -->      <\/button><!-- [et_pb_line_break_holder] -->      <button class=\"btn btn-track\" id=\"btnB\" onclick=\"playerToggle('B')\" disabled><!-- [et_pb_line_break_holder] -->        <span id=\"iconB\">\u25b6<\/span> Play B<!-- [et_pb_line_break_holder] -->      <\/button><!-- [et_pb_line_break_holder] -->      <button class=\"btn btn-ghost\" id=\"btnStop\" onclick=\"playerStop()\" disabled>\u25a0 Stop<\/button><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <div class=\"timeline-wrap\"><!-- [et_pb_line_break_holder] -->      <div class=\"time-row\"><!-- [et_pb_line_break_holder] -->        <div class=\"now-playing\"><!-- [et_pb_line_break_holder] -->          <div class=\"status-dot\" id=\"playerDot\"><\/div><!-- [et_pb_line_break_holder] -->          <span id=\"npLabel\">Stopped<\/span><!-- [et_pb_line_break_holder] -->        <\/div><!-- [et_pb_line_break_holder] -->        <span class=\"time-code\" id=\"timeCode\">0:00 \/ 0:00<\/span><!-- [et_pb_line_break_holder] -->      <\/div><!-- [et_pb_line_break_holder] -->      <input type=\"range\" id=\"seekBar\" min=\"0\" max=\"10000\" value=\"0\"<!-- [et_pb_line_break_holder] -->             oninput=&#8221;seekInput(this)&#8221; onchange=&#8221;seekCommit(this)&#8221;><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <div class=\"controls-row\"><!-- [et_pb_line_break_holder] -->      <div class=\"vol-group\"><!-- [et_pb_line_break_holder] -->        <button class=\"mute-btn\" id=\"muteBtn\" onclick=\"toggleMute()\">\ud83d\udd0a<\/button><!-- [et_pb_line_break_holder] -->        <input type=\"range\" id=\"volumeBar\" min=\"0\" max=\"100\" value=\"80\" oninput=\"setVolume(this.value)\"><!-- [et_pb_line_break_holder] -->        <span class=\"vol-label\" id=\"volLabel\">80%<\/span><!-- [et_pb_line_break_holder] -->      <\/div><!-- [et_pb_line_break_holder] -->    <\/div><!-- [et_pb_line_break_holder] -->  <\/div><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><\/div><!-- \/.app --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><script><!-- [et_pb_line_break_holder] -->'use strict';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   AUDIO CONTEXT<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->const AC = new (window.AudioContext || window.webkitAudioContext)();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->const masterGain = AC.createGain();<!-- [et_pb_line_break_holder] -->masterGain.gain.value = 0.8;<!-- [et_pb_line_break_holder] -->masterGain.connect(AC.destination);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   APP STATE<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->\/\/ File data<!-- [et_pb_line_break_holder] -->const F = {<!-- [et_pb_line_break_holder] -->  A: { buffer: null, name: '', rms: 0, comp: 1 },<!-- [et_pb_line_break_holder] -->  B: { buffer: null, name: '', rms: 0, comp: 1 },<!-- [et_pb_line_break_holder] -->};<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/\/ Normal player<!-- [et_pb_line_break_holder] -->const P = {<!-- [et_pb_line_break_holder] -->  slot:      null,   \/\/ 'A'|'B'|null<!-- [et_pb_line_break_holder] -->  src:       null,   \/\/ AudioBufferSourceNode<!-- [et_pb_line_break_holder] -->  gn:        null,   \/\/ GainNode<!-- [et_pb_line_break_holder] -->  startAt:   0,      \/\/ AC.currentTime - offset when play began<!-- [et_pb_line_break_holder] -->  duration:  0,<!-- [et_pb_line_break_holder] -->  offset:    0,      \/\/ paused-at seconds<!-- [et_pb_line_break_holder] -->  playing:   false,<!-- [et_pb_line_break_holder] -->  seeking:   false,<!-- [et_pb_line_break_holder] -->  raf:       null,<!-- [et_pb_line_break_holder] -->};<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/\/ ABX player<!-- [et_pb_line_break_holder] -->const X = {<!-- [et_pb_line_break_holder] -->  active:    false,<!-- [et_pb_line_break_holder] -->  trials:    [],<!-- [et_pb_line_break_holder] -->  currentX:  null,   \/\/ 'A'|'B'<!-- [et_pb_line_break_holder] -->  which:     null,   \/\/ 'X'|'A'|'B'|null  (which button is active)<!-- [et_pb_line_break_holder] -->  src:       null,<!-- [et_pb_line_break_holder] -->  gn:        null,<!-- [et_pb_line_break_holder] -->  startAt:   0,<!-- [et_pb_line_break_holder] -->  duration:  0,<!-- [et_pb_line_break_holder] -->  offset:    0,<!-- [et_pb_line_break_holder] -->  playing:   false,<!-- [et_pb_line_break_holder] -->};<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let gainMatch = true;<!-- [et_pb_line_break_holder] -->let muted     = false;<!-- [et_pb_line_break_holder] -->let volume    = 0.8;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   FILE LOADING<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->function triggerFile(slot) {<!-- [et_pb_line_break_holder] -->  document.getElementById('file' + slot).click();<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->async function loadFile(slot, inp) {<!-- [et_pb_line_break_holder] -->  const file = inp.files[0];<!-- [et_pb_line_break_holder] -->  if (!file) return;<!-- [et_pb_line_break_holder] -->  inp.value = '';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const nameEl = document.getElementById('name' + slot);<!-- [et_pb_line_break_holder] -->  const hintEl = document.getElementById('hint' + slot);<!-- [et_pb_line_break_holder] -->  nameEl.textContent = '\u23f3 Decoding\u2026';<!-- [et_pb_line_break_holder] -->  hintEl.textContent = '';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  try {<!-- [et_pb_line_break_holder] -->    await acResume();<!-- [et_pb_line_break_holder] -->    const buf = await AC.decodeAudioData(await file.arrayBuffer());<!-- [et_pb_line_break_holder] -->    F[slot].buffer = buf;<!-- [et_pb_line_break_holder] -->    F[slot].name   = file.name;<!-- [et_pb_line_break_holder] -->    F[slot].rms    = calcRMS(buf);<!-- [et_pb_line_break_holder] -->    nameEl.textContent = file.name;<!-- [et_pb_line_break_holder] -->    hintEl.textContent = fmt(buf.duration) + ' \u00b7 ' + (file.size\/1048576).toFixed(1) + ' MB';<!-- [et_pb_line_break_holder] -->    document.getElementById('slot' + slot).classList.add('loaded');<!-- [et_pb_line_break_holder] -->    recomp();<!-- [et_pb_line_break_holder] -->    refreshGainBadges();<!-- [et_pb_line_break_holder] -->    refreshUI();<!-- [et_pb_line_break_holder] -->  } catch(e) {<!-- [et_pb_line_break_holder] -->    nameEl.textContent = '\u26a0 Could not decode this file';<!-- [et_pb_line_break_holder] -->    hintEl.textContent = 'Try WAV, FLAC, or MP3';<!-- [et_pb_line_break_holder] -->    console.error(e);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function clearFile(e, slot) {<!-- [et_pb_line_break_holder] -->  e.stopPropagation();<!-- [et_pb_line_break_holder] -->  if (P.slot === slot && P.playing) playerStop();<!-- [et_pb_line_break_holder] -->  F[slot] = { buffer: null, name: '', rms: 0, comp: 1 };<!-- [et_pb_line_break_holder] -->  document.getElementById('slot' + slot).classList.remove('loaded');<!-- [et_pb_line_break_holder] -->  document.getElementById('name' + slot).textContent = 'Click or drop file ' + slot;<!-- [et_pb_line_break_holder] -->  document.getElementById('hint' + slot).textContent = 'WAV \u00b7 FLAC \u00b7 MP3 \u00b7 AAC \u00b7 OGG';<!-- [et_pb_line_break_holder] -->  document.getElementById('gainBadge' + slot).style.display = 'none';<!-- [et_pb_line_break_holder] -->  refreshUI();<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   GAIN MATCHING<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->function calcRMS(buf) {<!-- [et_pb_line_break_holder] -->  let s = 0, n = 0;<!-- [et_pb_line_break_holder] -->  for (let c = 0; c < buf.numberOfChannels; c++) {<!-- [et_pb_line_break_holder] -->    const d = buf.getChannelData(c);<!-- [et_pb_line_break_holder] -->    for (let i = 0; i < d.length; i++) { s += d[i]*d[i]; n++; }<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  return n > 0 ? Math.sqrt(s\/n) : 0;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function recomp() {<!-- [et_pb_line_break_holder] -->  if (!F.A.buffer || !F.B.buffer) return;<!-- [et_pb_line_break_holder] -->  const ra = F.A.rms, rb = F.B.rms;<!-- [et_pb_line_break_holder] -->  if (!ra || !rb) return;<!-- [et_pb_line_break_holder] -->  const t = Math.min(ra, rb);<!-- [et_pb_line_break_holder] -->  F.A.comp = t \/ ra;<!-- [et_pb_line_break_holder] -->  F.B.comp = t \/ rb;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function getComp(slot) { return gainMatch ? (F[slot].comp || 1) : 1; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function onGainToggle() {<!-- [et_pb_line_break_holder] -->  gainMatch = document.getElementById('gainToggle').checked;<!-- [et_pb_line_break_holder] -->  \/\/ update live gain nodes<!-- [et_pb_line_break_holder] -->  if (P.playing  && P.gn)  P.gn.gain.setTargetAtTime(getComp(P.slot), AC.currentTime, 0.02);<!-- [et_pb_line_break_holder] -->  if (X.playing  && X.gn)  { const sl = X.which === 'X' ? X.currentX : X.which; if(sl) X.gn.gain.setTargetAtTime(getComp(sl), AC.currentTime, 0.02); }<!-- [et_pb_line_break_holder] -->  refreshGainBadges();<!-- [et_pb_line_break_holder] -->  document.getElementById('gainNote').innerHTML = gainMatch<!-- [et_pb_line_break_holder] -->    ? '\u26a1 <strong>Gain Match ON<\/strong> \u2014 RMS-based compensation applied in real-time so volume differences don\\'t bias your test. For gold-standard results, LUFS-normalize your files in a DAW beforehand.'<!-- [et_pb_line_break_holder] -->    : '\u26a0 <strong>Gain Match OFF<\/strong> \u2014 Volume differences are not compensated. Ensure your files are pre-matched (same integrated LUFS) for a truly unbiased comparison.';<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function refreshGainBadges() {<!-- [et_pb_line_break_holder] -->  ['A','B'].forEach(s => {<!-- [et_pb_line_break_holder] -->    const el = document.getElementById('gainBadge' + s);<!-- [et_pb_line_break_holder] -->    if (gainMatch && F.A.buffer && F.B.buffer) {<!-- [et_pb_line_break_holder] -->      const db = 20 * Math.log10(F[s].comp || 1);<!-- [et_pb_line_break_holder] -->      el.textContent = s + ': ' + (db >= 0 ? '+' : '') + db.toFixed(1) + ' dB';<!-- [et_pb_line_break_holder] -->      el.style.display = 'inline-block';<!-- [et_pb_line_break_holder] -->    } else {<!-- [et_pb_line_break_holder] -->      el.style.display = 'none';<!-- [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] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   AUDIO LOW-LEVEL HELPERS<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->function _startSrc(buf, comp, offset, onEnded) {<!-- [et_pb_line_break_holder] -->  const gn = AC.createGain();<!-- [et_pb_line_break_holder] -->  gn.gain.value = comp;<!-- [et_pb_line_break_holder] -->  gn.connect(masterGain);<!-- [et_pb_line_break_holder] -->  const src = AC.createBufferSource();<!-- [et_pb_line_break_holder] -->  src.buffer = buf;<!-- [et_pb_line_break_holder] -->  src.connect(gn);<!-- [et_pb_line_break_holder] -->  src.start(0, Math.max(0, Math.min(offset, buf.duration - 0.01)));<!-- [et_pb_line_break_holder] -->  src.onended = onEnded;<!-- [et_pb_line_break_holder] -->  return { src, gn, startAt: AC.currentTime - offset };<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function _killSrc(src) {<!-- [et_pb_line_break_holder] -->  if (!src) return;<!-- [et_pb_line_break_holder] -->  src.onended = null;<!-- [et_pb_line_break_holder] -->  try { src.stop(); } catch(e) {}<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   NORMAL PLAYER<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->function playerToggle(slot) {<!-- [et_pb_line_break_holder] -->  acResume();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  if (P.playing && P.slot === slot) {<!-- [et_pb_line_break_holder] -->    \/\/ Pause current slot<!-- [et_pb_line_break_holder] -->    const pos = _pPos();<!-- [et_pb_line_break_holder] -->    _killSrc(P.src);<!-- [et_pb_line_break_holder] -->    cancelAnimationFrame(P.raf);<!-- [et_pb_line_break_holder] -->    P.src = P.gn = null;<!-- [et_pb_line_break_holder] -->    P.playing = false;<!-- [et_pb_line_break_holder] -->    P.offset  = pos;<!-- [et_pb_line_break_holder] -->    renderPlayer();<!-- [et_pb_line_break_holder] -->    return;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ Switch slot or start fresh \u2014 carry offset regardless of slot<!-- [et_pb_line_break_holder] -->  \/\/ (same-position start when switching: user naturally synced in time)<!-- [et_pb_line_break_holder] -->  const offset = P.offset; \/\/ preserved across slot switches<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  _killSrc(P.src);<!-- [et_pb_line_break_holder] -->  cancelAnimationFrame(P.raf);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  if (!F[slot].buffer) return;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const { src, gn, startAt } = _startSrc(F[slot].buffer, getComp(slot), offset, () => {<!-- [et_pb_line_break_holder] -->    if (P.src === src) _onPlayerEnd();<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] -->  P.slot     = slot;<!-- [et_pb_line_break_holder] -->  P.src      = src;<!-- [et_pb_line_break_holder] -->  P.gn       = gn;<!-- [et_pb_line_break_holder] -->  P.startAt  = startAt;<!-- [et_pb_line_break_holder] -->  P.duration = F[slot].buffer.duration;<!-- [et_pb_line_break_holder] -->  P.offset   = 0;<!-- [et_pb_line_break_holder] -->  P.playing  = true;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  renderPlayer();<!-- [et_pb_line_break_holder] -->  _seekLoop();<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function playerStop() {<!-- [et_pb_line_break_holder] -->  P.offset = _pPos();<!-- [et_pb_line_break_holder] -->  _killSrc(P.src);<!-- [et_pb_line_break_holder] -->  cancelAnimationFrame(P.raf);<!-- [et_pb_line_break_holder] -->  P.src = P.gn = null;<!-- [et_pb_line_break_holder] -->  P.playing = false;<!-- [et_pb_line_break_holder] -->  renderPlayer();<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function _onPlayerEnd() {<!-- [et_pb_line_break_holder] -->  cancelAnimationFrame(P.raf);<!-- [et_pb_line_break_holder] -->  P.src = P.gn = null;<!-- [et_pb_line_break_holder] -->  P.playing = false;<!-- [et_pb_line_break_holder] -->  P.offset  = 0;<!-- [et_pb_line_break_holder] -->  setSeek(0);<!-- [et_pb_line_break_holder] -->  document.getElementById('timeCode').textContent = '0:00 \/ ' + fmt(P.duration);<!-- [et_pb_line_break_holder] -->  renderPlayer();<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function _pPos() {<!-- [et_pb_line_break_holder] -->  if (!P.playing) return P.offset;<!-- [et_pb_line_break_holder] -->  return Math.min(AC.currentTime - P.startAt, P.duration);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function seekInput(el) {<!-- [et_pb_line_break_holder] -->  P.seeking = true;<!-- [et_pb_line_break_holder] -->  const t = (el.value \/ 10000) * P.duration;<!-- [et_pb_line_break_holder] -->  document.getElementById('timeCode').textContent = fmt(t) + ' \/ ' + fmt(P.duration);<!-- [et_pb_line_break_holder] -->  setSeek(el.value \/ 10000);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function seekCommit(el) {<!-- [et_pb_line_break_holder] -->  P.seeking = false;<!-- [et_pb_line_break_holder] -->  const t = (el.value \/ 10000) * P.duration;<!-- [et_pb_line_break_holder] -->  if (P.playing) {<!-- [et_pb_line_break_holder] -->    const slot = P.slot;<!-- [et_pb_line_break_holder] -->    _killSrc(P.src);<!-- [et_pb_line_break_holder] -->    cancelAnimationFrame(P.raf);<!-- [et_pb_line_break_holder] -->    const { src, gn, startAt } = _startSrc(F[slot].buffer, getComp(slot), t, () => {<!-- [et_pb_line_break_holder] -->      if (P.src === src) _onPlayerEnd();<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] -->    P.src = src; P.gn = gn; P.startAt = startAt; P.offset = 0;<!-- [et_pb_line_break_holder] -->    _seekLoop();<!-- [et_pb_line_break_holder] -->  } else {<!-- [et_pb_line_break_holder] -->    P.offset = t;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function _seekLoop() {<!-- [et_pb_line_break_holder] -->  cancelAnimationFrame(P.raf);<!-- [et_pb_line_break_holder] -->  function tick() {<!-- [et_pb_line_break_holder] -->    if (!P.playing) return;<!-- [et_pb_line_break_holder] -->    if (!P.seeking) {<!-- [et_pb_line_break_holder] -->      const pos = _pPos();<!-- [et_pb_line_break_holder] -->      const pct = P.duration > 0 ? pos \/ P.duration : 0;<!-- [et_pb_line_break_holder] -->      setSeek(pct);<!-- [et_pb_line_break_holder] -->      document.getElementById('timeCode').textContent = fmt(pos) + ' \/ ' + fmt(P.duration);<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->    P.raf = requestAnimationFrame(tick);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  P.raf = requestAnimationFrame(tick);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function setSeek(pct) {<!-- [et_pb_line_break_holder] -->  const bar = document.getElementById('seekBar');<!-- [et_pb_line_break_holder] -->  bar.value = Math.round(pct * 10000);<!-- [et_pb_line_break_holder] -->  bar.style.setProperty('--pct', (pct * 100).toFixed(3) + '%');<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function setVolume(val) {<!-- [et_pb_line_break_holder] -->  volume = val \/ 100;<!-- [et_pb_line_break_holder] -->  if (!muted) masterGain.gain.value = volume;<!-- [et_pb_line_break_holder] -->  document.getElementById('volLabel').textContent = val + '%';<!-- [et_pb_line_break_holder] -->  document.getElementById('volumeBar').style.setProperty('--pct', val + '%');<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function toggleMute() {<!-- [et_pb_line_break_holder] -->  muted = !muted;<!-- [et_pb_line_break_holder] -->  masterGain.gain.value = muted ? 0 : volume;<!-- [et_pb_line_break_holder] -->  document.getElementById('muteBtn').textContent = muted ? '\ud83d\udd07' : '\ud83d\udd0a';<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function renderPlayer() {<!-- [et_pb_line_break_holder] -->  const btnA = document.getElementById('btnA');<!-- [et_pb_line_break_holder] -->  const btnB = document.getElementById('btnB');<!-- [et_pb_line_break_holder] -->  btnA.classList.toggle('playing', P.playing && P.slot === 'A');<!-- [et_pb_line_break_holder] -->  btnB.classList.toggle('playing', P.playing && P.slot === 'B');<!-- [et_pb_line_break_holder] -->  document.getElementById('iconA').textContent = (P.playing && P.slot === 'A') ? '\u23f8' : '\u25b6';<!-- [et_pb_line_break_holder] -->  document.getElementById('iconB').textContent = (P.playing && P.slot === 'B') ? '\u23f8' : '\u25b6';<!-- [et_pb_line_break_holder] -->  document.getElementById('btnStop').disabled = !P.playing;<!-- [et_pb_line_break_holder] -->  const dot = document.getElementById('playerDot');<!-- [et_pb_line_break_holder] -->  const lbl = document.getElementById('npLabel');<!-- [et_pb_line_break_holder] -->  if (P.playing) {<!-- [et_pb_line_break_holder] -->    dot.classList.add('on');<!-- [et_pb_line_break_holder] -->    lbl.innerHTML = 'Playing <span class=\"np-slot\">' + P.slot + ' \u2014 ' + (F[P.slot].name||'') + '<\/span>';<!-- [et_pb_line_break_holder] -->  } else {<!-- [et_pb_line_break_holder] -->    dot.classList.remove('on');<!-- [et_pb_line_break_holder] -->    lbl.textContent = 'Stopped';<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   ABX ENGINE<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->function abxStart() {<!-- [et_pb_line_break_holder] -->  if (!F.A.buffer || !F.B.buffer) return;<!-- [et_pb_line_break_holder] -->  playerStop();<!-- [et_pb_line_break_holder] -->  _xKill();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  X.active   = true;<!-- [et_pb_line_break_holder] -->  X.trials   = [];<!-- [et_pb_line_break_holder] -->  X.currentX = null;<!-- [et_pb_line_break_holder] -->  X.which    = null;<!-- [et_pb_line_break_holder] -->  X.playing  = false;<!-- [et_pb_line_break_holder] -->  X.offset   = 0;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  document.getElementById('abxReady').style.display  = 'none';<!-- [et_pb_line_break_holder] -->  document.getElementById('abxRun').style.display    = 'block';<!-- [et_pb_line_break_holder] -->  document.getElementById('results-panel').style.display = 'none';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  buildDots();<!-- [et_pb_line_break_holder] -->  nextTrial();<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function nextTrial() {<!-- [et_pb_line_break_holder] -->  const n = X.trials.length;<!-- [et_pb_line_break_holder] -->  if (n >= 16) { finishABX(); return; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  X.currentX = Math.random() < 0.5 ? 'A' : 'B';<!-- [et_pb_line_break_holder] -->  X.offset   = 0;<!-- [et_pb_line_break_holder] -->  X.which    = null;<!-- [et_pb_line_break_holder] -->  X.playing  = false;<!-- [et_pb_line_break_holder] -->  _xKill();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  document.getElementById('trialNum').textContent = n + 1;<!-- [et_pb_line_break_holder] -->  buildDots();<!-- [et_pb_line_break_holder] -->  xRenderBtns(null);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  setTimeout(() => xPlay('X'), 220);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function abxToggle(which) {<!-- [et_pb_line_break_holder] -->  acResume();<!-- [et_pb_line_break_holder] -->  if (X.which === which && X.playing) {<!-- [et_pb_line_break_holder] -->    \/\/ pause<!-- [et_pb_line_break_holder] -->    const pos = _xPos();<!-- [et_pb_line_break_holder] -->    _xKill();<!-- [et_pb_line_break_holder] -->    X.offset  = pos;<!-- [et_pb_line_break_holder] -->    X.which   = which;<!-- [et_pb_line_break_holder] -->    X.playing = false;<!-- [et_pb_line_break_holder] -->    xRenderBtns(null);<!-- [et_pb_line_break_holder] -->  } else {<!-- [et_pb_line_break_holder] -->    xPlay(which);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function xPlay(which) {<!-- [et_pb_line_break_holder] -->  acResume();<!-- [et_pb_line_break_holder] -->  const slot = which === 'X' ? X.currentX : which;<!-- [et_pb_line_break_holder] -->  const buf  = F[slot] && F[slot].buffer;<!-- [et_pb_line_break_holder] -->  if (!buf) return;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ carry position when switching sources within same trial<!-- [et_pb_line_break_holder] -->  const offset = X.playing ? _xPos() : X.offset;<!-- [et_pb_line_break_holder] -->  _xKill();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const { src, gn, startAt } = _startSrc(buf, getComp(slot), offset, () => {<!-- [et_pb_line_break_holder] -->    if (X.src === src) { X.playing = false; X.which = null; xRenderBtns(null); }<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] -->  X.src     = src;<!-- [et_pb_line_break_holder] -->  X.gn      = gn;<!-- [et_pb_line_break_holder] -->  X.startAt = startAt;<!-- [et_pb_line_break_holder] -->  X.duration= buf.duration;<!-- [et_pb_line_break_holder] -->  X.offset  = 0;<!-- [et_pb_line_break_holder] -->  X.which   = which;<!-- [et_pb_line_break_holder] -->  X.playing = true;<!-- [et_pb_line_break_holder] -->  xRenderBtns(which);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function _xPos() {<!-- [et_pb_line_break_holder] -->  if (!X.playing) return X.offset;<!-- [et_pb_line_break_holder] -->  return Math.min(AC.currentTime - X.startAt, X.duration);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function _xKill() {<!-- [et_pb_line_break_holder] -->  _killSrc(X.src);<!-- [et_pb_line_break_holder] -->  X.src = X.gn = null;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function xRenderBtns(which) {<!-- [et_pb_line_break_holder] -->  ['X','A','B'].forEach(w => {<!-- [et_pb_line_break_holder] -->    const btnId = w === 'X' ? 'btnX' : 'btnAbx' + w;<!-- [et_pb_line_break_holder] -->    const icoId = w === 'X' ? 'iconX' : 'iconAbx' + w;<!-- [et_pb_line_break_holder] -->    const act   = (which === w && X.playing);<!-- [et_pb_line_break_holder] -->    document.getElementById(btnId).classList.toggle('playing', act);<!-- [et_pb_line_break_holder] -->    document.getElementById(icoId).textContent = act ? '\u23f8' : '\u25b6';<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function abxAnswer(answer) {<!-- [et_pb_line_break_holder] -->  _xKill();<!-- [et_pb_line_break_holder] -->  X.playing = false;<!-- [et_pb_line_break_holder] -->  X.which   = null;<!-- [et_pb_line_break_holder] -->  xRenderBtns(null);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const correct = X.currentX;<!-- [et_pb_line_break_holder] -->  X.trials.push({ correct, answer, right: answer === correct });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ Neutral flash \u2014 no colour hint<!-- [et_pb_line_break_holder] -->  const fl = document.getElementById('feedbackFlash');<!-- [et_pb_line_break_holder] -->  fl.classList.add('show');<!-- [et_pb_line_break_holder] -->  setTimeout(() => fl.classList.remove('show'), 280);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  buildDots();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  if (X.trials.length >= 10) { setTimeout(finishABX, 380); }<!-- [et_pb_line_break_holder] -->  else                        { setTimeout(nextTrial, 380); }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function abxStop() {<!-- [et_pb_line_break_holder] -->  _xKill();<!-- [et_pb_line_break_holder] -->  X.active  = false;<!-- [et_pb_line_break_holder] -->  X.playing = false;<!-- [et_pb_line_break_holder] -->  document.getElementById('abxRun').style.display   = 'none';<!-- [et_pb_line_break_holder] -->  document.getElementById('abxReady').style.display = 'block';<!-- [et_pb_line_break_holder] -->  if (X.trials.length > 0) showResults();<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function finishABX() {<!-- [et_pb_line_break_holder] -->  _xKill();<!-- [et_pb_line_break_holder] -->  X.active  = false;<!-- [et_pb_line_break_holder] -->  X.playing = false;<!-- [et_pb_line_break_holder] -->  document.getElementById('abxRun').style.display   = 'none';<!-- [et_pb_line_break_holder] -->  document.getElementById('abxReady').style.display = 'block';<!-- [et_pb_line_break_holder] -->  buildDots(); \/\/ now reveal correct\/wrong colours<!-- [et_pb_line_break_holder] -->  showResults();<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* Dots: neutral (answered) during test, coloured only after *\/<!-- [et_pb_line_break_holder] -->function buildDots() {<!-- [et_pb_line_break_holder] -->  const c = document.getElementById('progressDots');<!-- [et_pb_line_break_holder] -->  c.innerHTML = '';<!-- [et_pb_line_break_holder] -->  for (let i = 0; i < 10; i++) {<!-- [et_pb_line_break_holder] -->    const d = document.createElement('div');<!-- [et_pb_line_break_holder] -->    d.className = 'dot';<!-- [et_pb_line_break_holder] -->    if (i < X.trials.length) {<!-- [et_pb_line_break_holder] -->      d.classList.add(X.active ? 'answered' : (X.trials[i].right ? 'correct' : 'wrong'));<!-- [et_pb_line_break_holder] -->    } else if (i === X.trials.length && X.active) {<!-- [et_pb_line_break_holder] -->      d.classList.add('current');<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->    c.appendChild(d);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   RESULTS<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->function showResults() {<!-- [et_pb_line_break_holder] -->  const t = X.trials, n = t.length;<!-- [et_pb_line_break_holder] -->  if (!n) return;<!-- [et_pb_line_break_holder] -->  const correct = t.filter(x => x.right).length;<!-- [et_pb_line_break_holder] -->  const pct     = Math.round(correct\/n*100);<!-- [et_pb_line_break_holder] -->  const p       = pVal(correct, n);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  document.getElementById('results-panel').style.display = 'block';<!-- [et_pb_line_break_holder] -->  document.getElementById('scorePct').textContent = pct + '%';<!-- [et_pb_line_break_holder] -->  setTimeout(() => document.getElementById('scoreBar').style.width = pct + '%', 60);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  let label, sub;<!-- [et_pb_line_break_holder] -->  if      (pct === 100) { label = '\ud83c\udfaf Perfect score';             sub = 'Every trial correct \u2014 statistically significant discrimination.'; }<!-- [et_pb_line_break_holder] -->  else if (pct >= 80)   { label = '\u2726 Excellent discrimination';   sub = 'Strong evidence you can reliably hear a difference.'; }<!-- [et_pb_line_break_holder] -->  else if (pct >= 70)   { label = '\u2726 Good performance';           sub = 'You likely perceive a real difference. Consider a second run to confirm.'; }<!-- [et_pb_line_break_holder] -->  else if (pct >= 60)   { label = '\u25b3 Marginal result';            sub = 'Slightly above chance. The difference may be very subtle.'; }<!-- [et_pb_line_break_holder] -->  else                  { label = '\u25cb Chance level';               sub = 'Consistent with random guessing. Files may be perceptually identical.'; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  document.getElementById('scoreLabel').textContent = label;<!-- [et_pb_line_break_holder] -->  document.getElementById('scoreSub').textContent   = sub;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  document.getElementById('statBadges').innerHTML =<!-- [et_pb_line_break_holder] -->    badge(correct+'\/'+n,'Correct') + badge(pct+'%','Accuracy') +<!-- [et_pb_line_break_holder] -->    badge(p.toFixed(3),'p-value') + badge(p < 0.05 ? 'Yes' : 'No','Significant?');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const grid = document.getElementById('trialsGrid');<!-- [et_pb_line_break_holder] -->  grid.innerHTML = '';<!-- [et_pb_line_break_holder] -->  t.forEach((r,i) => {<!-- [et_pb_line_break_holder] -->    const c = document.createElement('div');<!-- [et_pb_line_break_holder] -->    c.className = 'trial-card ' + (r.right ? 'correct' : 'wrong');<!-- [et_pb_line_break_holder] -->    c.innerHTML = `<span class=\"tc-num\">${i+1}<\/span><span class=\"tc-answer\">X=${r.correct}<!\u2013- [et_pb_br_holder] -\u2013>\u2192${r.answer}<\/span>`;<!-- [et_pb_line_break_holder] -->    grid.appendChild(c);<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  document.getElementById('interp').innerHTML = p < 0.05<!-- [et_pb_line_break_holder] -->    ? `<strong>Statistically significant<\/strong> (p = ${p.toFixed(3)}) \u2014 With ${correct} correct out of ${n}, there is strong statistical evidence that you can perceptually distinguish the two files. Tonal balance, transient handling, stereo image, or encoding artefacts may all be contributing.`<!-- [et_pb_line_break_holder] -->    : `<strong>Not statistically significant<\/strong> (p = ${p.toFixed(3)}) \u2014 With ${correct} correct out of ${n}, results are consistent with chance-level performance. You cannot reliably distinguish the two files under these conditions. Verify gain match, listening environment, and monitoring chain quality.`;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  document.getElementById('results-panel').scrollIntoView({ behavior: 'smooth', block: 'nearest' });<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function badge(v, l) { return `<div class=\"stat-badge\"><span class=\"sb-val\">${v}<\/span><span class=\"sb-lbl\">${l}<\/span><\/div>`; }<!-- [et_pb_line_break_holder] -->function hideResults() { document.getElementById('results-panel').style.display = 'none'; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/\/ One-tailed binomial p-value, H\u2080: p=0.5<!-- [et_pb_line_break_holder] -->function pVal(k, n) {<!-- [et_pb_line_break_holder] -->  let p = 0;<!-- [et_pb_line_break_holder] -->  for (let i = k; i <= n; i++) p += binom(n,i) * Math.pow(0.5, n);<!-- [et_pb_line_break_holder] -->  return p;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->function binom(n, k) {<!-- [et_pb_line_break_holder] -->  if (k < 0 || k > n) return 0;<!-- [et_pb_line_break_holder] -->  if (k === 0 || k === n) return 1;<!-- [et_pb_line_break_holder] -->  k = Math.min(k, n-k);<!-- [et_pb_line_break_holder] -->  let r = 1;<!-- [et_pb_line_break_holder] -->  for (let i = 0; i < k; i++) r = r * (n-i) \/ (i+1);<!-- [et_pb_line_break_holder] -->  return r;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   UI HELPERS<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->function refreshUI() {<!-- [et_pb_line_break_holder] -->  const both = !!(F.A.buffer && F.B.buffer);<!-- [et_pb_line_break_holder] -->  document.getElementById('btnA').disabled    = !F.A.buffer;<!-- [et_pb_line_break_holder] -->  document.getElementById('btnB').disabled    = !F.B.buffer;<!-- [et_pb_line_break_holder] -->  document.getElementById('startBtn').disabled= !both;<!-- [et_pb_line_break_holder] -->  if (both) { recomp(); refreshGainBadges(); }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function fmt(s) {<!-- [et_pb_line_break_holder] -->  const m = Math.floor(s\/60), sec = Math.floor(s%60);<!-- [et_pb_line_break_holder] -->  return m + ':' + String(sec).padStart(2,'0');<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->async function acResume() { if (AC.state === 'suspended') await AC.resume(); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<!-- [et_pb_line_break_holder] -->   DRAG & DROP<!-- [et_pb_line_break_holder] -->\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<!-- [et_pb_line_break_holder] -->['A','B'].forEach(slot => {<!-- [et_pb_line_break_holder] -->  const el = document.getElementById('slot' + slot);<!-- [et_pb_line_break_holder] -->  el.addEventListener('dragover',  e => { e.preventDefault(); el.style.borderColor = 'var(--accent)'; });<!-- [et_pb_line_break_holder] -->  el.addEventListener('dragleave', ()=> { el.style.borderColor = ''; });<!-- [et_pb_line_break_holder] -->  el.addEventListener('drop', e => {<!-- [et_pb_line_break_holder] -->    e.preventDefault(); el.style.borderColor = '';<!-- [et_pb_line_break_holder] -->    const f = e.dataTransfer.files[0];<!-- [et_pb_line_break_holder] -->    if (f) loadFile(slot, { files: [f], value: '' });<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] -->});<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->document.addEventListener('click', acResume, { once: true });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/\/ Init<!-- [et_pb_line_break_holder] -->refreshUI();<!-- [et_pb_line_break_holder] -->renderPlayer();<!-- [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;]<h1>Frequently Asked<\/h1>[\/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|75px|80px|75px|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 do I use this ABx Test?&#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; hover_enabled=&#8221;0&#8243; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<div class=\"faq-item\">\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>Load your two files<\/strong> \u2014 click slot A and slot B, or drag and drop audio files directly onto each slot. Any browser-supported format works: WAV, FLAC, MP3, AAC, OGG, and more.<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Preview and compare freely<\/strong> \u2014 use the Player section to listen to A and B back to back. The timeline scrubs both files; switching slots carries your playback position forward so you&#8217;re always comparing the same moment.<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Start the Blind Test<\/strong> \u2014 click the &#8220;Start Blind Test&#8221; button.<br \/>Each trial plays a mystery file X (secretly either A or B). Listen to X, then use the A and B buttons to compare, then click <strong>A<\/strong> or <strong>B<\/strong> to cast your vote.<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Repeat for all 16 trials<\/strong> \u2014 no right\/wrong feedback is shown during the test to keep it fully unbiased. You can stop before completing the 16 trials but we suggest doing at least 10, otherwise your results may not be accurate.<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Review your results<\/strong> \u2014 accuracy percentage, p-value, per-trial breakdown, and a plain-language statistical interpretation are revealed at the end.<\/li>\n<\/ol>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Tip:<\/strong> Unless if your studio, use headphones in a quiet environment. Listener fatigue is real \u2014 take a short break before starting the test if you&#8217;ve been mixing for hours!<\/p>\n<\/div>[\/et_pb_blurb][et_pb_blurb title=&#8221;Key features&#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; hover_enabled=&#8221;0&#8243; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<div class=\"faq-item\">\n<div class=\"faq-answer\">\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Gain Match<\/strong> is enabled by default and applies RMS-based gain compensation in real-time between the two files. This ensures that volume differences \u2014 one of the most common sources of bias in audio comparisons \u2014 don&#8217;t influence your judgment. The dB offset applied to each file is displayed as a badge. For the most rigorous results, consider LUFS-normalizing your files beforehand in your DAW (e.g. with a loudness normalization plugin or export option), then disabling Gain Match to confirm the compensation is minimal.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Easy ABx Test in your browser:\u00a0<\/strong>Simply click the &#8220;Start Blind Test&#8221; button after loading files A and B and guess which file you think is playing a few times before accessing the results.<br \/>ABx test allows you to tell via a less-biased test procedure if you can actually hear a difference between two files.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Statistical reporting<\/strong> \u2014 results include a one-tailed binomial p-value, which is the same statistical method used in peer-reviewed audio research and professional ABX software. A p-value below 0.05 is the standard threshold for claiming audible discrimination.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>Drag and drop<\/strong> is supported on both file slots for fast workflow integration.<\/p>\n<\/div>\n<\/div>[\/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;Are my audio files uploaded anywhere? How is data handled?&#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; hover_enabled=&#8221;0&#8243; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<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 \u2014 nothing ever leaves your device.<\/strong> This tool runs entirely inside your browser using the Web Audio API. Your audio files are decoded locally in memory, never written to disk by the tool, never sent to a server, and never logged or stored anywhere.\u00a0<\/p>\n<\/div>\n<\/div>[\/et_pb_blurb][et_pb_blurb title=&#8221;Suggestions for best results&#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; hover_enabled=&#8221;0&#8243; border_radii=&#8221;on|20px|20px|20px|20px&#8221; box_shadow_style=&#8221;preset1&#8243; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<ul>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Gain-match carefully before hand.<\/strong> Even with Gain Match ON, RMS compensation is a broadband average. If your files have very different spectral or dynamic characteristics (e.g. one is heavily limited, one is unmastered), consider using an integrated LUFS meter in your DAW for pre-matching. Or something like the -neat- free plugin <a href=\"https:\/\/goodhertz.com\/loudness\/\" target=\"_blank\" rel=\"noopener\">Ghz Loudness by Goodhertz<\/a>, which let&#8217;s automatically gain match based on short term LUFs!<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Run multiple sessions.<\/strong> A single 16-trial test has limited statistical power. Running the test twice on different days and combining results gives a much more reliable picture.<\/li>\n<\/ul>[\/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]\n","protected":false},"excerpt":{"rendered":"<p>Verify if you can actually hear a difference between 2 files. Free \u00b7 100% Local \u00b7 No Ads \u00b7 No Account Required.<\/p>","protected":false},"author":392,"featured_media":4648,"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-4642","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages\/4642","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=4642"}],"version-history":[{"count":5,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages\/4642\/revisions"}],"predecessor-version":[{"id":4650,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/pages\/4642\/revisions\/4650"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/media\/4648"}],"wp:attachment":[{"href":"https:\/\/smartdsp.pro\/fr\/wp-json\/wp\/v2\/media?parent=4642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}