<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Oren MixDiagnose</title>
    <description>The latest articles on DEV Community by Oren MixDiagnose (@oren_mixdiagnose_1380fb19).</description>
    <link>https://dev.to/oren_mixdiagnose_1380fb19</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4020582%2Fd9a76abd-e1e4-4101-99c8-c4bd4e441163.png</url>
      <title>DEV Community: Oren MixDiagnose</title>
      <link>https://dev.to/oren_mixdiagnose_1380fb19</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oren_mixdiagnose_1380fb19"/>
    <language>en</language>
    <item>
      <title>The Loudness War Is Over (And the Data Proves It)</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 04:03:39 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/the-loudness-war-is-over-and-the-data-proves-it-2oia</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/the-loudness-war-is-over-and-the-data-proves-it-2oia</guid>
      <description>&lt;p&gt;For two decades, mastering engineers fought a war nobody asked for. The weapon of choice? A compressor. The casualty? Dynamics. But streaming platforms quietly ended the loudness war years ago — and the data proves it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Was the Loudness War?
&lt;/h2&gt;

&lt;p&gt;Starting in the mid-1990s, record labels realized that &lt;em&gt;louder sounds better&lt;/em&gt; — at least in a side-by-side comparison. If your track played louder than the competition, it grabbed attention. So mastering engineers started squashing dynamics with brick-wall limiters, pushing average loudness up while keeping peaks just below clipping.&lt;/p&gt;

&lt;p&gt;The result: tracks that sounded punchy on first listen but fatiguing after a minute. Transients disappeared. Drums lost their impact. Everything turned into a flat, dense wall of sound.&lt;/p&gt;

&lt;p&gt;The arms race escalated until entire albums were mastered at near-zero crest factor. By the 2010s, the loudness war had squeezed the life out of countless records.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Streaming Platforms Killed It
&lt;/h2&gt;

&lt;p&gt;Then came normalization.&lt;/p&gt;

&lt;p&gt;Spotify, YouTube, Apple Music, and Tidal all apply loudness normalization. They play every track back at a &lt;strong&gt;target loudness&lt;/strong&gt; — typically around &lt;strong&gt;-14 LUFS&lt;/strong&gt;. If your track is mastered at -8 LUFS, the platform &lt;strong&gt;turns it down&lt;/strong&gt; to hit the target. If it's mastered at -16 LUFS, they &lt;strong&gt;turn it up&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The implication is brutal but fair: &lt;strong&gt;all that loudness you pushed for? It gets undone.&lt;/strong&gt; Your squashed -8 LUFS master is simply played quieter than a dynamic -14 LUFS track. You've lost all your transients and gained nothing.&lt;/p&gt;

&lt;p&gt;The loudness war is over. Streaming normalization won.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data: 10 Hits, 50 Years
&lt;/h2&gt;

&lt;p&gt;I ran &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; on 10 hit songs spanning 1975 to 2026. Each track gets a &lt;strong&gt;mix quality score&lt;/strong&gt; (0-100) based on dynamics, loudness compliance, spectral balance, and stereo width. Here are the standouts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Song&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Crest Factor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Bohemian Rhapsody&lt;/strong&gt; — Queen&lt;/td&gt;
&lt;td&gt;1975&lt;/td&gt;
&lt;td&gt;88/100&lt;/td&gt;
&lt;td&gt;11.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Billie Eilish&lt;/strong&gt; — bad guy&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;94/100&lt;/td&gt;
&lt;td&gt;9.8 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Travis Scott&lt;/strong&gt; — SICKO MODE&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;81/100&lt;/td&gt;
&lt;td&gt;5.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bohemian Rhapsody — mastered in 1975 with analog gear and no brick-wall limiter — scored &lt;strong&gt;88/100&lt;/strong&gt; with a crest factor of &lt;strong&gt;11.5 dB&lt;/strong&gt;. Travis Scott's SICKO MODE, a modern hip-hop track crushed for maximum loudness, scored &lt;strong&gt;81/100&lt;/strong&gt; with a crest factor of just &lt;strong&gt;5.5 dB&lt;/strong&gt; — half the dynamic range.&lt;/p&gt;

&lt;p&gt;And Billie Eilish's &lt;em&gt;bad guy&lt;/em&gt;, produced by Finneas, proves you don't need to squash a modern mix: it scored &lt;strong&gt;94/100&lt;/strong&gt; — the highest in the dataset — with a healthy &lt;strong&gt;9.8 dB&lt;/strong&gt; crest factor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Correlation
&lt;/h2&gt;

&lt;p&gt;The pattern is striking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every Grade A track&lt;/strong&gt; (score ≥ 85) had a crest factor &lt;strong&gt;≥ 7 dB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every Grade B track&lt;/strong&gt; (score 70-84) had a crest factor &lt;strong&gt;below 7 dB&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crest factor — the gap between peak and average level — is the single strongest predictor of mix quality score in the dataset. It outperforms loudness itself, spectral balance, and stereo width.&lt;/p&gt;

&lt;p&gt;This isn't nostalgia. It's physics. Dynamics &lt;em&gt;are&lt;/em&gt; the signal. When you crush them, you remove the contrast that makes music feel alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Dynamics matter more than loudness.&lt;/strong&gt; Here's why:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Streaming normalizes anyway.&lt;/strong&gt; Spotify, Apple Music, and YouTube all play back at a fixed target loudness. Your -8 LUFS master gets turned down to -14. The loudness you fought for is erased.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Squashed mixes sound worse.&lt;/strong&gt; Low crest factor kills transients, flattens drums, and fatigues the ear. The data confirms: low crest factor = low score.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic mixes score higher.&lt;/strong&gt; Every track that preserved ≥ 7 dB of crest factor earned a Grade A. Every track below that threshold did not.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Stop squashing your mixes.&lt;/strong&gt; Master for dynamics, not for loudness. The platforms handle the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Check Your Mixes
&lt;/h2&gt;

&lt;p&gt;You can analyze your own tracks the same way I analyzed these hits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web:&lt;/strong&gt; &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; — upload any audio file and get a full mix quality report with crest factor, loudness, spectral balance, and stereo width scoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mixdiagnose
mixdiagnose your-track.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI gives you the same 0-100 score and detailed diagnostics right in your terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Data Table
&lt;/h2&gt;

&lt;p&gt;The complete dataset of all 10 songs — with scores, crest factors, loudness measurements, and grade breakdowns — is available at:&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://mixdiagnose.com/famous-mixes" rel="noopener noreferrer"&gt;&lt;strong&gt;mixdiagnose.com/famous-mixes&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The loudness war is over. The data proves it. Dynamics win. Let your mixes breathe.&lt;/p&gt;

</description>
      <category>audio</category>
      <category>music</category>
      <category>data</category>
      <category>production</category>
    </item>
    <item>
      <title>How the Mix Score Works — 12 Metrics, 4 Categories, One Number</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 03:51:37 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/how-the-mix-score-works-12-metrics-4-categories-one-number-365m</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/how-the-mix-score-works-12-metrics-4-categories-one-number-365m</guid>
      <description>&lt;h1&gt;
  
  
  How the Mix Score Works — 12 Metrics, 4 Categories, One Number
&lt;/h1&gt;

&lt;p&gt;When you upload a track to &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt;, it runs through 12 distinct audio analysis metrics, each scored from 0 to 100, and collapses them into a single Mix Score. This article breaks down every metric, the scoring logic, and shows the Python/librosa code that powers it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 12 Metrics
&lt;/h2&gt;

&lt;p&gt;The metrics fall into four categories: &lt;strong&gt;Frequency Balance&lt;/strong&gt;, &lt;strong&gt;Loudness &amp;amp; Dynamics&lt;/strong&gt;, &lt;strong&gt;Stereo Imaging&lt;/strong&gt;, and &lt;strong&gt;Overall Balance&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Category 1: Frequency Balance (6 metrics)
&lt;/h3&gt;

&lt;p&gt;The audio spectrum is divided into six bands. Each band's energy is compared against a target range derived from reference mixes in that genre.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Band&lt;/th&gt;
&lt;th&gt;Frequency Range&lt;/th&gt;
&lt;th&gt;What It Covers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Sub-Bass&lt;/td&gt;
&lt;td&gt;20–60 Hz&lt;/td&gt;
&lt;td&gt;Kick drum fundamentals, sub bass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Low-Mid&lt;/td&gt;
&lt;td&gt;60–250 Hz&lt;/td&gt;
&lt;td&gt;Bass guitar, low harmonics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Mid&lt;/td&gt;
&lt;td&gt;250 Hz–2 kHz&lt;/td&gt;
&lt;td&gt;Core instruments, vocals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;High-Mid&lt;/td&gt;
&lt;td&gt;2–6 kHz&lt;/td&gt;
&lt;td&gt;Presence, attack, clarity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;6–12 kHz&lt;/td&gt;
&lt;td&gt;Brilliance, cymbals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Air&lt;/td&gt;
&lt;td&gt;12–20 kHz&lt;/td&gt;
&lt;td&gt;Air, sheen, spatial openness&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If a band's energy falls within the target window, it scores &lt;strong&gt;100 (good)&lt;/strong&gt;. Slightly outside: &lt;strong&gt;60 (warn)&lt;/strong&gt;. Significantly out of range: &lt;strong&gt;25 (bad)&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Category 2: Loudness &amp;amp; Dynamics (3 metrics)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;LUFS Integrated&lt;/strong&gt; — The integrated loudness over the full track. Targets &lt;strong&gt;−14 LUFS&lt;/strong&gt; (streaming standard). Within ±1.5 LU = good, ±3 LU = warn, beyond = bad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True Peak&lt;/strong&gt; — The maximum sample-peak value measured with an oversampling True Peak meter. Must stay below &lt;strong&gt;−1 dBTP&lt;/strong&gt; (good), −0.3 to −1 = warn (headroom shrinking), above −0.3 = bad (clipping risk).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crest Factor&lt;/strong&gt; — The difference between peak and RMS levels. The most important dynamic-range metric.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Category 3: Stereo Imaging (2 metrics)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stereo Width Mean&lt;/strong&gt; — Average width of the stereo field across the track, measured using mid/side decomposition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mono Compatibility&lt;/strong&gt; — How much sonic information survives when summed to mono. A wide mix that collapses poorly in mono scores low.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Category 4: Overall Balance (1 metric)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Overall Balance&lt;/strong&gt; — A holistic metric that checks whether the frequency spectrum has a natural roll-off shape. Mixes that are scooped, humpy, or top-heavy get penalized here.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Scoring Logic
&lt;/h2&gt;

&lt;p&gt;Each of the 12 metrics is classified into one of three states:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢 Good&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Within target range&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟡 Warn&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;Slightly outside — fix recommended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴 Bad&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Significantly off — needs attention&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;Mix Score&lt;/strong&gt; is then computed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;mix_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;average&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_metric_scores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;critical_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;critical_count&lt;/code&gt; is the number of metrics in the &lt;strong&gt;bad&lt;/strong&gt; state. This means a mix with many critical issues gets penalized harder than one with several minor warnings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;If all 12 metrics are good (100), the Mix Score is &lt;code&gt;100&lt;/code&gt;.&lt;br&gt;
If 9 metrics are good (100), 2 are warns (60), and 1 is bad (25):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;average = (9×100 + 2×60 + 1×25) / 12
        = (900 + 120 + 25) / 12
        = 1045 / 12
        ≈ 87.1

mix_score = 87.1 - (8 × 1) = 79.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One critical issue drops a near-A mix down to a B.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grades
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Score Range&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≥ 85&lt;/td&gt;
&lt;td&gt;Excellent — release-ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≥ 70&lt;/td&gt;
&lt;td&gt;Good — minor tweaks recommended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≥ 55&lt;/td&gt;
&lt;td&gt;Fair — several issues to address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;D&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≥ 40&lt;/td&gt;
&lt;td&gt;Poor — significant work needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;F&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt; 40&lt;/td&gt;
&lt;td&gt;Failing — revisit the mix&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why Crest Factor Is the #1 Predictor
&lt;/h2&gt;

&lt;p&gt;After analyzing 10 commercially successful hit songs across multiple genres, one pattern was unmistakable: &lt;strong&gt;crest factor correlates with Mix Score more strongly than any other single metric.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Crest factor (peak level minus RMS level) is a direct measure of dynamic range. Tracks with a crest factor of &lt;strong&gt;8–14 dB&lt;/strong&gt; consistently scored in the A range. Tracks below 6 dB — over-compressed, flat — rarely broke past a B, regardless of how well-balanced their frequency spectrum was.&lt;/p&gt;

&lt;p&gt;Here's a summary of what the data showed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Song&lt;/th&gt;
&lt;th&gt;Crest Factor (dB)&lt;/th&gt;
&lt;th&gt;Mix Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hit #1&lt;/td&gt;
&lt;td&gt;12.3&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hit #2&lt;/td&gt;
&lt;td&gt;11.1&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hit #3&lt;/td&gt;
&lt;td&gt;10.5&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hit #4&lt;/td&gt;
&lt;td&gt;9.8&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hit #5&lt;/td&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hit #6&lt;/td&gt;
&lt;td&gt;8.7&lt;/td&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hit #7&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hit #8&lt;/td&gt;
&lt;td&gt;7.1&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hit #9&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hit #10&lt;/td&gt;
&lt;td&gt;5.9&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The correlation is clear: as crest factor drops below 8 dB, the Mix Score drops with it. Over-compression kills dynamics, and the score reflects that.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Code: Analyzing Audio with Python &amp;amp; Librosa
&lt;/h2&gt;

&lt;p&gt;Here's how the frequency band analysis works under the hood:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="c1"&gt;# Frequency band boundaries (Hz)
&lt;/span&gt;&lt;span class="n"&gt;BANDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sub_bass&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;low_mid&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mid&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;high_mid&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;air&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="mi"&gt;12000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;analyze_frequency_bands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mono&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Use stereo if available, else mono
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndim&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_mono&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Compute power spectrogram
&lt;/span&gt;    &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;freqs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fft_frequencies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;band_scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f_low&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f_high&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;BANDS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Find frequency bins within this band
&lt;/span&gt;        &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freqs&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;f_low&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freqs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;f_high&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;band_power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
        &lt;span class="n"&gt;band_scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;band_power&lt;/span&gt;

    &lt;span class="c1"&gt;# Normalize and compare against genre-specific targets
&lt;/span&gt;    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;band_scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
    &lt;span class="n"&gt;band_ratios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;band_scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;band_ratios&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Crest Factor Calculation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;crest_factor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mono&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndim&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_mono&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;rms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;rms&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peak&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;rms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# in dB
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stereo Width via Mid/Side Decomposition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stereo_width_mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mono&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndim&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;  &lt;span class="c1"&gt;# Mono file — no width
&lt;/span&gt;
    &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;side&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

    &lt;span class="n"&gt;mid_power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;side_power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mid_power&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;

    &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;side_power&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mid_power&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;side_power&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  LUFS &amp;amp; True Peak (via pyLoudnorm)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyloudnorm&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pyln&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lufs_and_true_peak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mono&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndim&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;  &lt;span class="c1"&gt;# pyloudnorm expects (channels, samples) -&amp;gt; transpose
&lt;/span&gt;
    &lt;span class="c1"&gt;# LUFS integrated
&lt;/span&gt;    &lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyln&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Meter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;lufs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integrated_loudness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# True peak (dBTP)
&lt;/span&gt;    &lt;span class="n"&gt;true_peak&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyln&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;peak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# normalize ref
&lt;/span&gt;    &lt;span class="n"&gt;peak_dbtp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;  &lt;span class="c1"&gt;# simplified
&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;lufs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;peak_dbtp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The API
&lt;/h2&gt;

&lt;p&gt;You can analyze any track programmatically via the REST API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://mixdiagnose.com/api/analyze &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@track.wav"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/json"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mix_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;87.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"grade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metrics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sub_bass"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.082&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"low_mid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.135&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.301&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"high_mid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"warn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.218&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.097&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"air"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.045&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lufs_integrated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-14.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"true_peak"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-1.3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"crest_factor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bad"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;5.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"stereo_width_mean"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.42&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mono_compat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"warn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.81&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"overall_balance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.92&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"critical_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;POST /api/analyze&lt;/code&gt; with multipart file upload. Returns JSON with the full metric breakdown.&lt;/p&gt;




&lt;h2&gt;
  
  
  The CLI
&lt;/h2&gt;

&lt;p&gt;Prefer the command line? Install the Python package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mixdiagnose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then analyze any audio file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mixdiagnose analyze track.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╭─ MixDiagnose Results ──────────────────────╮
│ Mix Score:  87.1   Grade: B                │
│ Critical:   1      Warnings: 2              │
╰────────────────────────────────────────────╯

Band            Score   Status    Value
─────────────────────────────────────────────
sub_bass        100     good      0.082
low_mid         100     good      0.135
mid             100     good      0.301
high_mid         60     warn      0.218
high            100     good      0.097
air             100     good      0.045
lufs_int        100     good      -14.2 dB
true_peak       100     good      -1.3 dBTP
crest_factor     25     bad       5.1 dB   ⚠
stereo_width    100     good      0.42
mono_compat      60     warn      0.81
overall_bal     100     good      0.92
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI also supports batch analysis (&lt;code&gt;mixdiagnose analyze *.wav&lt;/code&gt;) and JSON output (&lt;code&gt;--json&lt;/code&gt;) for scripting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The Mix Score isn't magic — it's 12 well-defined audio metrics, each measured with standard DSP techniques, collapsed into a single number with a penalty for critical issues. The biggest lesson from the data: &lt;strong&gt;protect your crest factor.&lt;/strong&gt; A mix with healthy dynamics can survive imperfect frequency balance; an over-compressed mix rarely scores well no matter what else is right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free analysis:&lt;/strong&gt; &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;mixdiagnose.com&lt;/a&gt; — upload any track, get your Mix Score in seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Famous mix scores:&lt;/strong&gt; &lt;a href="https://mixdiagnose.com/famous-mixes" rel="noopener noreferrer"&gt;mixdiagnose.com/famous-mixes&lt;/a&gt; — see how hit songs score&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to hear feedback — especially if you run a track through it and get a score that surprises you. Drop a comment below. 🎚️&lt;/p&gt;

</description>
      <category>audio</category>
      <category>python</category>
      <category>data</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The LUFS Cheat Sheet: Target Loudness for Every Streaming Platform</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 03:13:43 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/the-complete-lufs-cheat-sheet-for-2026-every-platforms-loudness-target-11hc</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/the-complete-lufs-cheat-sheet-for-2026-every-platforms-loudness-target-11hc</guid>
      <description>&lt;p&gt;You finished your mix. It sounds huge in your studio. Then you upload it, and on Spotify it sounds... quieter than your favorite track. Or worse — the chorus ducks under the verse for no obvious reason.&lt;/p&gt;

&lt;p&gt;The loudness wars are over, but nobody sent streaming platforms the memo. Each service normalizes your track to its own target, and if you master louder than that target, your dynamics get flattened automatically. If you master quieter, you actually keep your transients — and the platform turns you up.&lt;/p&gt;

&lt;p&gt;This cheat sheet is the thing I wish I'd had when I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a LUFS, really?
&lt;/h2&gt;

&lt;p&gt;LUFS (Loudness Units Full Scale) measures &lt;strong&gt;perceived loudness&lt;/strong&gt; — how loud something &lt;em&gt;sounds&lt;/em&gt; to a human, not the peak sample value. It's the same scale used by broadcast TV and film (EBU R128). One LUFS ≈ one dB of perceived change.&lt;/p&gt;

&lt;p&gt;The key numbers you care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrated LUFS&lt;/strong&gt; — the average loudness of the whole track. This is the number streaming platforms normalize to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True Peak (dBTP)&lt;/strong&gt; — the actual highest sample value after inter-sample peaks are calculated. Keep this under -1 dBTP to avoid clipping on playback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LU Range&lt;/strong&gt; — how dynamic your track is. Useful, but not the target.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most DAWs have a LUFS meter built in or available free (Youlean Loudness Meter 2 is a great free option). Check your integrated number against the table below before you bounce.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cheat sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Target (LUFS)&lt;/th&gt;
&lt;th&gt;True Peak&lt;/th&gt;
&lt;th&gt;What happens if you're louder&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Spotify&lt;/td&gt;
&lt;td&gt;-14&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down to -14; dynamics preserved but quieter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple Music&lt;/td&gt;
&lt;td&gt;-16&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down; Sound Check applies normalization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YouTube&lt;/td&gt;
&lt;td&gt;-14&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down to approx -14 LUFS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tidal&lt;/td&gt;
&lt;td&gt;-14 (HiFi) / -10 (Master)&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down to target tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Music&lt;/td&gt;
&lt;td&gt;-14&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Normalized to -14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deezer&lt;/td&gt;
&lt;td&gt;-15&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SoundCloud&lt;/td&gt;
&lt;td&gt;-14 (approx, varies)&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Normalized on upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broadcast (EBU R128)&lt;/td&gt;
&lt;td&gt;-23&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Required for TV/film delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The safe target for everything
&lt;/h3&gt;

&lt;p&gt;If you want one number that works everywhere: &lt;strong&gt;-14 LUFS integrated, -1 dBTP true peak.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That hits Spotify and YouTube exactly, and you'll only lose 2 dB on Apple Music (which is fine — they turn you up). Your dynamics survive, and you avoid the automatic loudness penalty.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one mistake that ruins everything
&lt;/h2&gt;

&lt;p&gt;People still master to &lt;strong&gt;-8 or -7 LUFS&lt;/strong&gt; because "louder sounds better in the car." It does — on CD. On Spotify, your -8 LUFS track gets turned down 6 dB to hit -14. Now you've crushed your track for nothing, and it sounds &lt;em&gt;quieter and more lifeless&lt;/em&gt; than a track that was mastered at -14 to begin with.&lt;/p&gt;

&lt;p&gt;The loudness penalty is real. A -14 LUFS master with real dynamics will sound &lt;strong&gt;bigger and punchier&lt;/strong&gt; after Spotify's normalization than a brick-walled -8 LUFS master of the same song. This is counterintuitive but measurable — try it on a reference track.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually hit the target
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mix at a consistent monitoring level.&lt;/strong&gt; Set your monitor controller to a fixed position (around 79 dB SPL at your listening position) and leave it there. Your ears calibrate to loudness relative to this baseline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't smash the mix bus.&lt;/strong&gt; If your mix bus limiter is doing 6+ dB of reduction, you're doing the streaming platform's job for it — badly. Aim for 1–2 dB of peak limiting on the master, max.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure integrated LUFS on the final bounce.&lt;/strong&gt; Run the full track through a LUFS meter. If you're at -11 and your target is -14, you have headroom — either lower the limiter threshold a touch or leave it (the platform will normalize up).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check true peak.&lt;/strong&gt; Set your true peak limiter to -1.0 dBTP. Some platforms re-encode, which can create inter-sample clipping you can't hear in the DAW.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare against a reference.&lt;/strong&gt; Import a track in your genre from Spotify into your DAW and measure its LUFS. You'll be surprised how quiet most well-mastered modern tracks actually are.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A quick workflow that saves time
&lt;/h2&gt;

&lt;p&gt;Before you bounce the final master, run your track through a quick check. If you want to skip the manual math, &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; runs the loudness and true-peak analysis for you and tells you where you sit relative to each platform's target — no plugin chain needed, just upload the bounce.&lt;/p&gt;

&lt;p&gt;It's the fastest way to confirm you're at -14 LUFS before you ship, rather than discovering the problem after release.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Master to -14 LUFS, -1 dBTP&lt;/strong&gt; for the broadest compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Louder is not better&lt;/strong&gt; on streaming — the platform decides the loudness, not you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep your dynamics.&lt;/strong&gt; A track with groove and punch beats a track that's been crushed flat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure, don't guess.&lt;/strong&gt; Use a LUFS meter every single time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your mix will sound bigger, your masters will translate, and you'll stop wondering why Spotify "made your track quieter." It didn't — you did.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Upload your finished track to &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; and get an instant loudness report — integrated LUFS, true peak, and exactly where you stand against Spotify, Apple Music, and YouTube targets. It takes about ten seconds and tells you whether to ship or re-master.&lt;/p&gt;

</description>
      <category>audio</category>
      <category>music</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The 6 Frequency Bands That Determine If Your Mix Sounds Pro</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 02:20:34 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/the-6-frequency-bands-that-determine-if-your-mix-sounds-pro-18d5</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/the-6-frequency-bands-that-determine-if-your-mix-sounds-pro-18d5</guid>
      <description>&lt;p&gt;Every great mix lives or dies by how it manages frequency balance. You can have the best reverb, the tightest compression, and the most expensive plugins — but if your frequency bands are fighting each other, your mix will always sound amateur.&lt;/p&gt;

&lt;p&gt;The secret that professional engineers use isn't magic ears. It's a mental model: they think in &lt;strong&gt;six frequency bands&lt;/strong&gt;, and they make sure none of them is screaming over the others.&lt;/p&gt;

&lt;p&gt;Let's break them down.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 6 Frequency Bands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Sub-Bass (20–60 Hz)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What lives here:&lt;/strong&gt; Kick drum fundamentals, sub-bass synths, 808s, pipe organ pedals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it should sound like:&lt;/strong&gt; You should &lt;em&gt;feel&lt;/em&gt; it more than hear it. A solid sub-bass gives your track weight and physical impact — the kind that moves air in a club. On headphones it's barely there; on speakers with a subwoofer, it's the foundation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too much sub-bass makes the mix feel bloated and slow, eating headroom for everything else.&lt;/li&gt;
&lt;li&gt;Too little and the mix loses body and impact.&lt;/li&gt;
&lt;li&gt;Notes below ~30 Hz are often inaudible on most systems but still eat valuable headroom — high-pass filter them out unless the content genuinely needs it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; A spectrum analyzer showing sustained energy below 20–25 Hz almost always means wasted headroom. Roll it off.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Low-Mid (60–250 Hz)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What lives here:&lt;/strong&gt; Bass guitar body, lower harmonics of vocals and guitars, tom resonance, the warmth of acoustic instruments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it should sound like:&lt;/strong&gt; Warm and full. This is where your mix gets its body and thickness. A well-balanced low-mid makes a mix sound expensive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mud&lt;/strong&gt; (200–400 Hz): The #1 amateur giveaway. It sounds like someone threw a blanket over your speakers. Too many instruments piling up in this range kills clarity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boominess&lt;/strong&gt; (20–80 Hz overlapping here): Uncontrolled low-end resonances that make monitors fatigue your ears quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thin&lt;/strong&gt; (100–300 Hz): Scoop too much here and your mix sounds anemic and lifeless.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; A gentle 2–3 dB cut around 200–300 Hz on overlapping instruments often clears mud without thinning the mix.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Midrange (250 Hz–2 kHz)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What lives here:&lt;/strong&gt; The core of vocals, guitar bodies, snare attack, piano, horns — this is where most of the &lt;em&gt;information&lt;/em&gt; in your mix lives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it should sound like:&lt;/strong&gt; Clear, present, and forward. The midrange is where listeners subconsciously decide whether a mix sounds professional. If it's clean here, you're 80% of the way there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Boxiness&lt;/strong&gt; (300–600 Hz): Sounds like the instrument was recorded inside a cardboard box. Very common with untreated rooms and close-mic'd sources.&lt;/li&gt;
&lt;li&gt;Overlap: Too many elements fighting for the same 500 Hz–1 kHz space creates a congested, claustrophobic mix.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; EQ carving and smart arrangement. Not everything needs to occupy the same frequency real estate — make space for your lead element.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. High-Mid (2–6 kHz)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What lives here:&lt;/strong&gt; Vocal presence, guitar attack, snare crack, consonants in speech, the bite of brass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it should sound like:&lt;/strong&gt; Present and intelligible. This range gives vocals their ability to cut through a dense mix without needing to be louder in level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Harshness&lt;/strong&gt; (2–5 kHz): The classic ear-fatigue zone. Too much here and your mix sounds abrasive and fatiguing after 30 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sibilance&lt;/strong&gt; (5–8 kHz): The aggressive "S" and "T" sounds in vocals that stab your ears. De-essers exist specifically for this.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; A broad, gentle cut (1–2 dB) around 3–4 kHz can tame harshness. Use a de-esser on vocals for sibilance rather than brute-force EQ.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. High (6–12 kHz)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What lives here:&lt;/strong&gt; Cymbal shimmer, hi-hats, string harmonics, the upper edge of synths, breath in vocals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it should sound like:&lt;/strong&gt; Open and detailed. This range adds sparkle and a sense of dimension. Without it, a mix sounds muffled; with too much, it sounds harsh and digital.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Digital harshness from cheap converters or aggressive plugins accumulates here.&lt;/li&gt;
&lt;li&gt;Cymbal bleed in drum overheads can pile up and clutter the top end.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; A gentle high shelf boost (1–2 dB) starting around 8 kHz can add air without harshness. If the highs are already bright, leave them alone.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Air (12–20 kHz)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What lives here:&lt;/strong&gt; The very top — sheen, sparkle, sense of space and openness, the breath above vocals, cymbal decay tails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it should sound like:&lt;/strong&gt; Effortless and open. You don't really &lt;em&gt;hear&lt;/em&gt; this band consciously, but you immediately notice when it's missing — the mix sounds dull, closed, and claustrophobic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dullness&lt;/strong&gt; (10–20 kHz): Mix sounds lifeless and dated. Often caused by low sample-rate processing, cumulative low-pass filtering, or cheap plugins that roll off the top.&lt;/li&gt;
&lt;li&gt;Too much air sounds artificially hyped or introduces aliasing artifacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; A tiny high-shelf boost (0.5–1 dB) at 12+ kHz adds life. Less is more here — a little goes a long way.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Golden Rule: Balance Between Bands
&lt;/h2&gt;

&lt;p&gt;Here's the single most important principle in mixing for frequency balance:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;No frequency band should be more than 6–8 dB louder than its neighbors.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your sub-bass is 12 dB louder than your low-mids, the mix will sound muddy and unbalanced. If your high-mids are 10 dB hotter than your highs, the mix will sound harsh and fatiguing.&lt;/p&gt;

&lt;p&gt;This isn't a subjective taste call — it's measurable. Pull up a spectrum analyzer on any professionally mixed track and you'll see a relatively smooth, gently sloping curve from low to high. No sharp spikes, no huge dips.&lt;/p&gt;

&lt;p&gt;The 6–8 dB rule gives you a concrete, actionable target. If you see a band that's 10+ dB above its neighbor, that's a red flag — something needs EQ attention.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Problems Quick Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Frequency Range&lt;/th&gt;
&lt;th&gt;What It Sounds Like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Boominess&lt;/td&gt;
&lt;td&gt;20–80 Hz&lt;/td&gt;
&lt;td&gt;Uncontrolled low-end rumble, fatiguing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mud&lt;/td&gt;
&lt;td&gt;200–400 Hz&lt;/td&gt;
&lt;td&gt;Blanket over the speakers, lacks clarity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thin&lt;/td&gt;
&lt;td&gt;100–300 Hz&lt;/td&gt;
&lt;td&gt;Anemic, lifeless, no body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boxiness&lt;/td&gt;
&lt;td&gt;300–600 Hz&lt;/td&gt;
&lt;td&gt;Recorded in a cardboard box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harshness&lt;/td&gt;
&lt;td&gt;2–5 kHz&lt;/td&gt;
&lt;td&gt;Abrasive, ear-fatiguing after 30 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sibilance&lt;/td&gt;
&lt;td&gt;5–8 kHz&lt;/td&gt;
&lt;td&gt;Aggressive "S" and "T" sounds stabbing ears&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dullness&lt;/td&gt;
&lt;td&gt;10–20 kHz&lt;/td&gt;
&lt;td&gt;Lifeless, closed, dated, no sparkle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to Check Your Frequency Balance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Spectrum Analyzer
&lt;/h3&gt;

&lt;p&gt;Load a spectrum analyzer on your master bus (Voxengo SPAN is free and excellent). Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A smooth, gently sloping curve from low to high&lt;/li&gt;
&lt;li&gt;No band more than 6–8 dB above its immediate neighbor&lt;/li&gt;
&lt;li&gt;Energy rolling off naturally below 20–25 Hz (unless you're making EDM with sub content)&lt;/li&gt;
&lt;li&gt;No huge dips that suggest EQ overcorrection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This takes practice. You need to train your eyes to match what good mixes look like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: MixDiagnose Automatic Analysis
&lt;/h3&gt;

&lt;p&gt;If you want to skip the guesswork, &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; analyzes your mix automatically and flags exactly which frequency bands are out of balance. It checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Band-to-band balance against the 6–8 dB rule&lt;/li&gt;
&lt;li&gt;Specific problem frequencies (mud, boxiness, harshness, sibilance, etc.)&lt;/li&gt;
&lt;li&gt;Overall spectral slope compared to professional reference mixes&lt;/li&gt;
&lt;li&gt;Whether your mix is &lt;em&gt;ready&lt;/em&gt; to release or needs fixes first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of staring at a spectrum and wondering "is that too much?", you get a clear pass/fail report with actionable suggestions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start Diagnosing Your Mixes
&lt;/h2&gt;

&lt;p&gt;The gap between amateur and professional mixes often comes down to frequency balance — not fancy plugins or expensive gear. Understand the 6 bands, enforce the 6–8 dB rule, and your mixes will immediately sound more polished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try MixDiagnose free:&lt;/strong&gt; &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;https://mixdiagnose.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install the CLI:&lt;/strong&gt; &lt;code&gt;pip install mixdiagnose&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full mix readiness guide:&lt;/strong&gt; &lt;a href="https://mixdiagnose.com/mix-readiness-guide" rel="noopener noreferrer"&gt;https://mixdiagnose.com/mix-readiness-guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stop guessing. Start diagnosing.&lt;/p&gt;

</description>
      <category>audio</category>
      <category>music</category>
      <category>tutorial</category>
      <category>production</category>
    </item>
    <item>
      <title>Building an API for Audio Mix Analysis — Tech Stack and Lessons</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 02:16:28 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/building-an-api-for-audio-mix-analysis-tech-stack-and-lessons-59ci</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/building-an-api-for-audio-mix-analysis-tech-stack-and-lessons-59ci</guid>
      <description>&lt;h1&gt;
  
  
  Building an API for Audio Mix Analysis — Tech Stack and Lessons
&lt;/h1&gt;

&lt;p&gt;I've been building &lt;a href="https://mixdiagnose.com/api-docs" rel="noopener noreferrer"&gt;mixdiagnose&lt;/a&gt;, an API that analyzes audio mixes and gives you actionable feedback on loudness, dynamics, frequency balance, and more. This post covers the tech stack, the API surface, how the Mix Score works, the frequency banding model, and the lessons I picked up along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API framework&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FastAPI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Async, automatic OpenAPI docs, multipart uploads, great DX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio analysis&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;librosa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Spectral features, STFT, frequency extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loudness&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;pyloudnorm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ITU-R BS.1770 / EBU R128 LUFS measurement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math / DSP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;numpy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vectorized array ops, FFT, statistics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zero-ops, file-based, more than enough for this use case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN / TLS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Edge caching, DDoS protection, free TLS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;FastAPI handles multipart audio uploads and JSON responses. librosa and numpy do the heavy DSP lifting. pyloudnorm gives me broadcast-standard LUFS. SQLite stores shared analysis results. Cloudflare sits in front for caching and TLS.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API
&lt;/h2&gt;

&lt;p&gt;Three endpoints make up the core:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;POST /api/analyze&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Multipart upload — you send an audio file (&lt;code&gt;wav&lt;/code&gt;, &lt;code&gt;mp3&lt;/code&gt;, &lt;code&gt;flac&lt;/code&gt;, etc.), and the server returns a full JSON analysis report. This is the main workhorse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@my-mix.wav"&lt;/span&gt; https://mixdiagnose.com/api/analyze
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes loudness (LUFS, dB peak, dB true-peak), dynamics (crest factor, RMS), frequency band energies, stereo width, and an overall Mix Score.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;GET /api/shared/{short_id}&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Retrieves a previously shared analysis by its short ID. When you share a mix analysis, you get a short URL like &lt;code&gt;/api/shared/ab12cd&lt;/code&gt;. Anyone with that link can view the full report without uploading the file again.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;POST /api/share&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Saves an analysis result and returns a &lt;code&gt;short_id&lt;/code&gt; you can distribute. This is what powers the shareable links — you analyze once, share the ID, and others can view the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mix Score Calculation
&lt;/h2&gt;

&lt;p&gt;The Mix Score is a single number from 0–100 that summarizes overall mix quality. Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;12 metrics&lt;/strong&gt; are evaluated. Each metric is scored as &lt;strong&gt;good&lt;/strong&gt;, &lt;strong&gt;warn&lt;/strong&gt;, or &lt;strong&gt;bad&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Each metric maps to a numeric value: &lt;code&gt;good = 100&lt;/code&gt;, &lt;code&gt;warn = 50&lt;/code&gt;, &lt;code&gt;bad = 0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The raw average is computed across all 12 metrics.&lt;/li&gt;
&lt;li&gt;For every metric flagged as &lt;strong&gt;Critical&lt;/strong&gt; (i.e., a hard failure that seriously impacts playability), &lt;strong&gt;8 points&lt;/strong&gt; are subtracted from the average.&lt;/li&gt;
&lt;li&gt;The final score is clamped to 0–100.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compute_mix_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Each metric dict has: name, status (good/warn/bad), critical (bool)
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;score_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;good&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;warn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bad&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;critical_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;critical&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;critical_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;final&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea: a mix with one or two warnings can still score well, but critical issues (like clipping, extremely low LUFS, or severe phase problems) drag the score down fast. The &lt;code&gt;-8 per Critical&lt;/code&gt; penalty ensures that you can't game the score by being mediocre-but-not-terrible across the board.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 12 Metrics
&lt;/h3&gt;

&lt;p&gt;The 12 metrics include things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrated LUFS&lt;/strong&gt; — is it in a reasonable range (targeting ~-14 for streaming, ~-9 for loud masters)?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True peak&lt;/strong&gt; — is it below -1 dBTP to avoid inter-sample clipping?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crest factor&lt;/strong&gt; — dynamics check (too low = over-compressed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RMS level&lt;/strong&gt; — overall energy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low-frequency energy&lt;/strong&gt; — is the sub-bass region balanced?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-frequency energy&lt;/strong&gt; — is the air band present or harsh?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frequency balance&lt;/strong&gt; — are any bands dramatically over/under-represented?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stereo width&lt;/strong&gt; — mono compatibility and width consistency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DC offset&lt;/strong&gt; — is there a DC bias?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spectral centroid&lt;/strong&gt; — overall brightness indicator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic range&lt;/strong&gt; — difference between loudest and quietest sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loudness range&lt;/strong&gt; — variation in loudness over time (EBU R128)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one is evaluated against thresholds tuned from real-world reference mixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6 Frequency Bands
&lt;/h2&gt;

&lt;p&gt;Audio is split into 6 frequency bands for analysis. This is more granular than the typical 3-band (low/mid/high) split and maps well to how engineers actually think about the spectrum:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Band&lt;/th&gt;
&lt;th&gt;Range&lt;/th&gt;
&lt;th&gt;What it covers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sub-bass&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20–60 Hz&lt;/td&gt;
&lt;td&gt;Kick drum fundamental, sub-bass synths, rumble&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Low-mid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;60–250 Hz&lt;/td&gt;
&lt;td&gt;Bass guitar body, low-end warmth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Midrange&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;250 Hz–2 kHz&lt;/td&gt;
&lt;td&gt;Vocals, snare, guitar presence — the core of the mix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High-mid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2–6 kHz&lt;/td&gt;
&lt;td&gt;Attack, presence, intelligibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6–12 kHz&lt;/td&gt;
&lt;td&gt;Cymbals, air on vocals, brightness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Air&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12–20 kHz&lt;/td&gt;
&lt;td&gt;Sparkle, openness, "hi-fi" sheen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;FREQUENCY_BANDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sub_bass&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low_mid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;midrange&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high_mid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;air&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;band_energies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Compute per-band energy from audio signal.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;fft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;freqs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfftfreq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;FREQUENCY_BANDS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freqs&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freqs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Energy distribution across these bands reveals common mix problems: too much sub-bass energy (muddy), too much high-mid (harsh), missing air band (dull). The API returns per-band energy and flags outliers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  pyloudnorm for LUFS — the right tool for the job
&lt;/h3&gt;

&lt;p&gt;LUFS (Loudness Units Full Scale) is the modern standard for loudness measurement — it's what Spotify, Apple Music, and YouTube use for normalization. Don't try to hand-roll it. &lt;strong&gt;pyloudnorm&lt;/strong&gt; implements ITU-R BS.1770-4 and EBU R128, which is exactly what you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyloudnorm&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pyln&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;

&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;librosa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-mix.wav&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;meter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyln&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Meter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# creates a BS.1770 meter
&lt;/span&gt;&lt;span class="n"&gt;loudness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integrated_loudness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Integrated LUFS: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loudness&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One gotcha: pyloudnorm expects float audio in the range [-1, 1]. librosa returns this by default, so they work together cleanly. Just make sure you don't apply any additional normalization before measuring.&lt;/p&gt;

&lt;h3&gt;
  
  
  Crest factor as a dynamics metric
&lt;/h3&gt;

&lt;p&gt;Crest factor = peak amplitude / RMS. It's a simple, effective proxy for dynamic range:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;crest_factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High crest factor&lt;/strong&gt; (6+): lots of dynamics, good headroom&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low crest factor&lt;/strong&gt; (&amp;lt;3): over-compressed, squashed — the mix will sound lifeless&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tried dynamic range meters and loudness range (LRA) from EBU R128, but crest factor ended up being the most intuitive single number for users. It's not perfect, but it's a great quick-check.&lt;/p&gt;

&lt;h3&gt;
  
  
  SQLite over Postgres — and I don't regret it
&lt;/h3&gt;

&lt;p&gt;For this project, SQLite was the right call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single-server deployment.&lt;/strong&gt; The analysis is CPU-bound (librosa/numpy), not DB-bound. The database just stores shared analysis JSON — read-heavy, write-light.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero ops.&lt;/strong&gt; No database server to manage, no connection pool, no migrations beyond schema init.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portability.&lt;/strong&gt; The entire database is one file. Back up by copying it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance is fine.&lt;/strong&gt; SQLite handles hundreds of concurrent reads without breaking a sweat. Writes are serialized, but share-creation is rare.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I ever need horizontal scaling or multi-writer scenarios, Postgres is the obvious migration path. But for a single-instance API doing DSP work, SQLite + WAL mode is more than sufficient:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mixdiagnose.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check_same_thread&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PRAGMA journal_mode=WAL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CLI Tool
&lt;/h2&gt;

&lt;p&gt;There's also a CLI so you can analyze mixes without hitting the API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mixdiagnose
mixdiagnose analyze my-mix.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is great for quick checks during mixing. It runs the same analysis locally and prints the report to your terminal. No upload, no network, no rate limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rate Limiting
&lt;/h2&gt;

&lt;p&gt;The API uses &lt;a href="https://slowapi.readthedocs.io/" rel="noopener noreferrer"&gt;slowapi&lt;/a&gt; for rate limiting. Free tier: &lt;strong&gt;3 analyses per IP address&lt;/strong&gt;. This keeps abuse in check without requiring auth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;slowapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Limiter&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;slowapi.util&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_remote_address&lt;/span&gt;

&lt;span class="n"&gt;limiter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Limiter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key_func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;get_remote_address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/analyze&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@limiter.limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3 per day&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UploadFile&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# ... analysis logic ...
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The limit is per-IP, per-day. If you need more, there's a paid tier with higher limits and API key auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API docs&lt;/strong&gt;: &lt;a href="https://mixdiagnose.com/api-docs" rel="noopener noreferrer"&gt;https://mixdiagnose.com/api-docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Famous mixes analysis&lt;/strong&gt;: &lt;a href="https://mixdiagnose.com/famous-mixes" rel="noopener noreferrer"&gt;https://mixdiagnose.com/famous-mixes&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The famous mixes page runs real hit songs through the analyzer so you can see what good looks like — super useful for calibrating your expectations.&lt;/p&gt;




&lt;p&gt;That's the whole stack. FastAPI + librosa + pyloudnorm + numpy + SQLite + Cloudflare. It's simple, cheap to run, and the analysis is genuinely useful. If you're building something similar, I hope this saves you some time. Questions? Hit me up in the comments.&lt;/p&gt;

</description>
      <category>python</category>
      <category>audio</category>
      <category>api</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I Fixed a Mix That Scored 42/100 — Before and After Analysis</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 02:07:50 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/how-i-fixed-a-mix-that-scored-42100-before-and-after-analysis-3m6h</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/how-i-fixed-a-mix-that-scored-42100-before-and-after-analysis-3m6h</guid>
      <description>&lt;h1&gt;
  
  
  How I Fixed a Mix That Scored 42/100 — Before and After Analysis
&lt;/h1&gt;

&lt;p&gt;A real before/after mix analysis. Same track scored &lt;strong&gt;42/100 (Grade F)&lt;/strong&gt; then &lt;strong&gt;87/100 (Grade A)&lt;/strong&gt; after 4 fixes. Here's exactly what changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Before: 42/100, Grade F
&lt;/h2&gt;

&lt;p&gt;I ran the same track through &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; and got a brutal but honest report:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overall Score&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;42/100 (Grade F)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LUFS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-7.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Crest Factor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.8 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;300 Hz Buildup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+8 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4 kHz Harshness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stereo Width&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Narrow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What the numbers told me
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LUFS -7.2&lt;/strong&gt; — way too loud. The mix bus limiter was crushing the life out of everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crest factor 3.8 dB&lt;/strong&gt; — almost no dynamic range. The track had been squeezed flat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;300 Hz buildup +8 dB&lt;/strong&gt; — mud city. Rhythm guitars were piling up in the low-mids.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 kHz +5 dB&lt;/strong&gt; — harshness that fatigued my ears within minutes (but I didn't notice while mixing).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Narrow stereo&lt;/strong&gt; — everything was clustered near center. No width, no space.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd been mixing for 6 hours straight. My ears were toast. The analysis caught problems I literally could not hear anymore.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 4 Fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fix #1: Removed the Mix Bus Limiter → +25 points
&lt;/h3&gt;

&lt;p&gt;This was the single biggest win. I had a limiter on the mix bus pushing everything to -7.2 LUFS. It was crushing transients, flattening dynamics, and making the whole track feel claustrophobic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt; Removed the limiter entirely. Let the mix breathe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Crest factor jumped from &lt;strong&gt;3.8 dB → 8.2 dB&lt;/strong&gt;. The mix went from sounding squashed to alive. Score jumped from 42 to &lt;strong&gt;67&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Lesson:&lt;/strong&gt; Loudness is mastering's job, not mixing's. A limiter on the mix bus is a crutch that hides problems instead of fixing them.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Fix #2: Cut 300 Hz by 4 dB on Rhythm Guitars → +12 points
&lt;/h3&gt;

&lt;p&gt;The +8 dB buildup at 300 Hz was the main culprit for the muddy, wooly low-mid mess. Rhythm guitars were the worst offender — three layers stacking up in the same frequency range.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt; Applied a -4 dB cut at 300 Hz (Q ~1.2) on the rhythm guitar bus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 300 Hz buildup went from +8 dB → +2 dB. The mix instantly sounded clearer. Kick and bass had room to breathe. Score went from 67 to &lt;strong&gt;79&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Fix #3: De-essed Vocals + Cut 2 dB at 4 kHz → +5 points
&lt;/h3&gt;

&lt;p&gt;The 4 kHz harshness was partly from the vocals (sibilance) and partly from cymbals/hi-hats piling up in the same region.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ran a de-esser on the vocal track (threshold -18 dB, frequency 5 kHz, range 4 dB)&lt;/li&gt;
&lt;li&gt;Applied a -2 dB cut at 4 kHz on the drum overhead bus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 4 kHz peak went from +5 dB → +1 dB. No more ear fatigue. Score went from 79 to &lt;strong&gt;84&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Fix #4: Widened Stereo Field → +3 points
&lt;/h3&gt;

&lt;p&gt;Everything was clustered near center. Guitars, keys, backing vocals — all sitting in the same narrow space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I did:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Panned rhythm guitars ±35 (hard left/right)&lt;/li&gt;
&lt;li&gt;Panned keys ±20&lt;/li&gt;
&lt;li&gt;Used a stereo widener on the drum room mic (100 Hz HPF, width 120%)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Stereo field went from narrow to wide. The mix had space, depth, and dimension. Score went from 84 to &lt;strong&gt;87&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The After: 87/100, Grade A
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overall Score&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;42/100 (F)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;87/100 (A)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LUFS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-7.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-14.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Crest Factor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.8 dB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.2 dB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;300 Hz Buildup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+8 dB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+2 dB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4 kHz Harshness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+5 dB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+1 dB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stereo Width&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Narrow&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Wide&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same track. Same session. Same ears. The only difference was that I let objective analysis guide my decisions instead of trusting fatigued ears.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Lesson: Objective Analysis Catches What Fatigued Ears Miss
&lt;/h2&gt;

&lt;p&gt;After 6 hours of mixing, I couldn't hear the 300 Hz mud. I couldn't hear the 4 kHz harshness. I couldn't hear that my dynamics were crushed. My brain had adapted — a phenomenon called &lt;strong&gt;ear fatigue&lt;/strong&gt; or &lt;strong&gt;temporary threshold shift&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is why objective analysis matters. Numbers don't get tired. A frequency analysis doesn't have a bad day. A LUFS meter doesn't lose perspective after 6 hours.&lt;/p&gt;

&lt;p&gt;The fixes themselves weren't complicated — remove a limiter, cut some mud, tame some harshness, add some width. But knowing &lt;em&gt;where&lt;/em&gt; to cut, &lt;em&gt;what&lt;/em&gt; to fix, and &lt;em&gt;how much&lt;/em&gt; to change — that's what the analysis gave me. Without it, I would have kept tweaking the wrong things.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Want to catch what your ears are missing? Run your mix through &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; — it's free.&lt;/p&gt;

&lt;p&gt;You can also use the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mixdiagnose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then analyze any track:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mixdiagnose analyze your_mix.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll get a detailed report with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overall score and grade&lt;/li&gt;
&lt;li&gt;LUFS and crest factor measurements&lt;/li&gt;
&lt;li&gt;Frequency analysis with problem areas highlighted&lt;/li&gt;
&lt;li&gt;Stereo width analysis&lt;/li&gt;
&lt;li&gt;Specific, actionable recommendations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't mix blind. Let the numbers tell you what your ears can't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you ever caught a major mix problem through analysis rather than listening? Share your story in the comments — I'd love to hear what objective measurements revealed for you.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>audio</category>
      <category>music</category>
      <category>production</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Built a CLI That Scores Your Mix 0-100 From the Terminal</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 01:59:06 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/i-built-a-cli-that-scores-your-mix-0-100-from-the-terminal-3j5j</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/i-built-a-cli-that-scores-your-mix-0-100-from-the-terminal-3j5j</guid>
      <description>&lt;h1&gt;
  
  
  I Built a CLI That Scores Your Mix 0–100 From the Terminal
&lt;/h1&gt;

&lt;p&gt;If you've ever finished a mix and wondered &lt;em&gt;"is this actually good?"&lt;/em&gt; — you're not alone. We open reference tracks, check LUFS meters, squint at spectrograms, and still second-guess ourselves. So I built &lt;strong&gt;mixdiagnose&lt;/strong&gt; — a Python CLI that analyzes your audio mix and gives you a &lt;strong&gt;0–100 Mix Score&lt;/strong&gt;, LUFS measurements, frequency issue detection, and actionable fix recommendations. All from the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mixdiagnose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No DAW plugins, no GUI, no account required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;Analyze a single mix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mixdiagnose analyze my-mix.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll get output like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;────────────────────────────────────────
  MixDiagnose Report — my-mix.wav
────────────────────────────────────────

  Mix Score: 78/100

  Loudness:
    Integrated LUFS:  -14.2
    True Peak:         -0.8 dBTP
    Dynamic Range:     9.4 DR

  Frequency Analysis:
    ✓ Low-end balanced
    ⚠ Excessive energy around 3 kHz — vocal harshness likely
    ✓ High frequencies clean

  Recommendations:
    1. Reduce 2–4 kHz by ~2 dB to tame harshness
    2. Mix is slightly below streaming target (-14 LUFS).
       Consider gentle limiter to reach -14 LUFS.
    3. True peak is within safe range. No changes needed.

────────────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Batch Processing
&lt;/h2&gt;

&lt;p&gt;Working on an album? Analyze an entire folder of mixes in one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mixdiagnose analyze ./album-mixes/ &lt;span class="nt"&gt;--batch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This processes every &lt;code&gt;.wav&lt;/code&gt;, &lt;code&gt;.mp3&lt;/code&gt;, &lt;code&gt;.flac&lt;/code&gt;, and &lt;code&gt;.aiff&lt;/code&gt; file in the directory and outputs a comparative summary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Batch Summary — 10 files
──────────────────────────────────────────────
File                    Score   LUFS    Top Issue
──────────────────────────────────────────────
track-01.wav             82    -14.0   None
track-02.wav             71    -16.3   Low-end muddy
track-03.wav             88    -14.1   None
track-04.wav             65    -18.0   Dynamic range too high
...
──────────────────────────────────────────────
Average Score: 76.4 / 100
──────────────────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also export results to JSON for integration into your workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mixdiagnose analyze ./album-mixes/ &lt;span class="nt"&gt;--batch&lt;/span&gt; &lt;span class="nt"&gt;--export&lt;/span&gt; results.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Mix Score Formula
&lt;/h2&gt;

&lt;p&gt;The Mix Score isn't a random number — it's a weighted composite of the metrics that actually matter in a professional mix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mix Score =
  (Loudness Score × 0.25) +
  (Frequency Balance Score × 0.30) +
  (Dynamic Range Score × 0.20) +
  (Stereo Width Score × 0.15) +
  (Spectral Cleanliness Score × 0.10)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What each component measures:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;What It Checks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Loudness Score&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;Integrated LUFS proximity to target (-14 LUFS for streaming, -9 LUFS for club), true peak compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frequency Balance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;Low/mid/high energy distribution, presence of frequency gaps or buildups, comparison to ideal curves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dynamic Range&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;DR rating, crest factor, transient preservation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stereo Width&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;td&gt;Side-channel energy, stereo image consistency, mono compatibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spectral Cleanliness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;Unwanted noise, resonance peaks, boxiness, harshness&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each sub-score is normalized to 0–100, then combined with the weights above. The result is a single number that gives you a quick gut-check on your mix quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD Integration
&lt;/h2&gt;

&lt;p&gt;Because mixdiagnose is a CLI, you can drop it into any pipeline. For example, here's a GitHub Actions snippet that checks your mix on every push:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Analyze mix&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;pip install mixdiagnose&lt;/span&gt;
    &lt;span class="s"&gt;mixdiagnose analyze ./mixes/master.wav --min-score 70&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--min-score&lt;/code&gt; flag exits with code 1 if the score falls below the threshold, making it perfect for automated quality gates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Available Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Analyze a single file&lt;/span&gt;
mixdiagnose analyze &amp;lt;file&amp;gt;

&lt;span class="c"&gt;# Batch analyze a directory&lt;/span&gt;
mixdiagnose analyze &amp;lt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt;

&lt;span class="c"&gt;# Export results to JSON&lt;/span&gt;
mixdiagnose analyze &amp;lt;file&amp;gt; &lt;span class="nt"&gt;--export&lt;/span&gt; results.json

&lt;span class="c"&gt;# Set a minimum acceptable score (exit 1 if below)&lt;/span&gt;
mixdiagnose analyze &amp;lt;file&amp;gt; &lt;span class="nt"&gt;--min-score&lt;/span&gt; 75

&lt;span class="c"&gt;# Compare your mix against a reference track&lt;/span&gt;
mixdiagnose compare my-mix.wav reference.wav

&lt;span class="c"&gt;# View help&lt;/span&gt;
mixdiagnose &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why a CLI?
&lt;/h2&gt;

&lt;p&gt;I wanted something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;anywhere&lt;/strong&gt; — no OS-specific GUI, no DAW dependency&lt;/li&gt;
&lt;li&gt;Integrates into &lt;strong&gt;scripts and CI/CD&lt;/strong&gt; pipelines&lt;/li&gt;
&lt;li&gt;Outputs &lt;strong&gt;machine-readable&lt;/strong&gt; results (JSON export)&lt;/li&gt;
&lt;li&gt;Is &lt;strong&gt;fast&lt;/strong&gt; — analyze a 4-minute track in seconds&lt;/li&gt;
&lt;li&gt;Stays &lt;strong&gt;opinionated&lt;/strong&gt; — a single score is easier to reason about than 15 separate meters&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full API docs &amp;amp; advanced usage:&lt;/strong&gt; &lt;a href="https://mixdiagnose.com/api-docs" rel="noopener noreferrer"&gt;mixdiagnose.com/api-docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare your mix against famous songs:&lt;/strong&gt; &lt;a href="https://mixdiagnose.com/famous-mixes" rel="noopener noreferrer"&gt;mixdiagnose.com/famous-mixes&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mixdiagnose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it on your latest mix. See what score you get. Then read the recommendations and go back to your DAW with a concrete plan instead of a vague feeling.&lt;/p&gt;

&lt;p&gt;Happy mixing. 🎧&lt;/p&gt;

</description>
      <category>python</category>
      <category>audio</category>
      <category>cli</category>
      <category>tools</category>
    </item>
    <item>
      <title>The 5 Most Common Mix Problems (And How to Fix Them)</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 01:50:28 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/the-5-most-common-mix-problems-and-how-to-fix-them-12bd</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/the-5-most-common-mix-problems-and-how-to-fix-them-12bd</guid>
      <description>&lt;p&gt;After analyzing hundreds of mixes on &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt;, the same problems show up over and over. Here are the 5 most common — and exactly how to fix them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Muddy Low-Mid Buildup (200-400 Hz)
&lt;/h2&gt;

&lt;p&gt;This is the #1 issue. Almost every amateur mix has it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; The mix sounds dull and unclear. Instruments blur together. You can't separate the bass from the guitars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Too many tracks occupying the 200-400 Hz range simultaneously. No high-pass filtering on non-bass instruments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# High-pass filter everything except kick, bass, and sub
&lt;/span&gt;&lt;span class="n"&gt;vocals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="n"&gt;Hz&lt;/span&gt;
&lt;span class="n"&gt;guitars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="n"&gt;Hz&lt;/span&gt;
&lt;span class="n"&gt;synths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="n"&gt;Hz&lt;/span&gt;

&lt;span class="c1"&gt;# Then cut 2-3 dB at 300 Hz on tracks that still sound muddy
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference is night and day. I've seen mixes jump 15 points on the Mix Score just from fixing this one issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Over-Compression (Crest Factor &amp;lt; 6 dB)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; The mix has no punch. Drums don't hit. Everything is the same volume. It sounds "small" despite being loud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Too much bus compression. The dynamic range that makes music feel alive has been squashed out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove or reduce mix bus compression (2:1 max, 2-3 dB GR)&lt;/li&gt;
&lt;li&gt;Compress individual tracks instead&lt;/li&gt;
&lt;li&gt;Target crest factor ≥7 dB&lt;/li&gt;
&lt;li&gt;If you need loudness, achieve it in mastering, not mixing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I analyzed 10 hit songs and every Grade A track had ≥7 dB crest factor. Every B-grade track was below 7. &lt;a href="https://mixdiagnose.com/famous-mixes" rel="noopener noreferrer"&gt;Full data here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Harsh Highs (2-5 kHz)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; The mix sounds piercing. Listeners want to turn it down. It's fatiguing after a few minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Too much energy in the 2-5 kHz range. Usually from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No de-essing on vocals&lt;/li&gt;
&lt;li&gt;Electric guitars with natural resonance at 3-4 kHz&lt;/li&gt;
&lt;li&gt;Synths with bright waveforms not filtered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;De-ess vocals (target 5-8 kHz for sibilance)&lt;/li&gt;
&lt;li&gt;Cut 1-2 dB at 3-4 kHz on harsh instruments&lt;/li&gt;
&lt;li&gt;If the whole mix is harsh, try a gentle 1 dB cut at 4 kHz on the mix bus&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4. No Headroom (Mix Too Loud)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Mix is at -8 LUFS with true peaks at -0.2 dBTP. There's no room for mastering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Mixing too hot — the mix is essentially pre-mastered. A limiter on the mix bus is crushing transients.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Target -18 to -14 LUFS for a pre-master mix&lt;/li&gt;
&lt;li&gt;Keep true peaks below -3 dBTP&lt;/li&gt;
&lt;li&gt;Remove the limiter from the mix bus&lt;/li&gt;
&lt;li&gt;Leave at least 6 dB of headroom&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Stereo Phase Issues
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Mix sounds wide on headphones but disappears on speakers. Elements sound hollow or phasey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; Phase cancellation from stereo widening plugins, duplicated tracks with timing offsets, or poor mic placement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check mono compatibility — sum to mono and listen&lt;/li&gt;
&lt;li&gt;Keep low frequencies (below 120 Hz) in mono&lt;/li&gt;
&lt;li&gt;Remove stereo widening plugins and see if the problem goes away&lt;/li&gt;
&lt;li&gt;Use a correlation meter — should stay above -0.5&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Want to check your mix for all 5 automatically? Upload to &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; and get an instant Mix Score (0-100) with specific issues flagged by severity.&lt;/p&gt;

&lt;p&gt;Or use the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mixdiagnose
mixdiagnose analyze my-mix.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix your mix before you master it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>audio</category>
      <category>music</category>
      <category>tutorial</category>
      <category>production</category>
    </item>
    <item>
      <title>I Analyzed 10 Hit Songs with AI to Find What Makes Pro Mixes Sound Pro</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 01:48:03 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/i-analyzed-10-hit-songs-with-ai-to-find-what-makes-pro-mixes-sound-pro-53ga</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/i-analyzed-10-hit-songs-with-ai-to-find-what-makes-pro-mixes-sound-pro-53ga</guid>
      <description>&lt;p&gt;What separates a pro mix from an amateur one? I uploaded 10 well-known tracks — from The Weeknd to Daft Punk — to &lt;a href="https://mixdiagnose.com/famous-mixes" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt;'s AI analyzer to find out.&lt;/p&gt;

&lt;p&gt;The results were surprising.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Song&lt;/th&gt;
&lt;th&gt;Artist&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;LUFS&lt;/th&gt;
&lt;th&gt;Crest&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;bad guy&lt;/td&gt;
&lt;td&gt;Billie Eilish&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;-10.5&lt;/td&gt;
&lt;td&gt;9.8 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blinding Lights&lt;/td&gt;
&lt;td&gt;The Weeknd&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;-9.2&lt;/td&gt;
&lt;td&gt;8.1 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strobe&lt;/td&gt;
&lt;td&gt;Deadmau5&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;-9.0&lt;/td&gt;
&lt;td&gt;8.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get Lucky&lt;/td&gt;
&lt;td&gt;Daft Punk&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;-8.8&lt;/td&gt;
&lt;td&gt;7.2 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shape of You&lt;/td&gt;
&lt;td&gt;Ed Sheeran&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;-9.5&lt;/td&gt;
&lt;td&gt;7.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bohemian Rhapsody&lt;/td&gt;
&lt;td&gt;Queen&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;-12.4&lt;/td&gt;
&lt;td&gt;11.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hotel California&lt;/td&gt;
&lt;td&gt;Eagles&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;-13.2&lt;/td&gt;
&lt;td&gt;10.8 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Money Trees&lt;/td&gt;
&lt;td&gt;Kendrick&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;-8.2&lt;/td&gt;
&lt;td&gt;6.0 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SICKO MODE&lt;/td&gt;
&lt;td&gt;Travis Scott&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;-7.1&lt;/td&gt;
&lt;td&gt;5.5 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teen Spirit&lt;/td&gt;
&lt;td&gt;Nirvana&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;-11.8&lt;/td&gt;
&lt;td&gt;7.0 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key Findings
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Crest factor is the #1 predictor of mix quality.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every Grade A track has ≥7 dB crest factor. Every B-grade track is below 7. More dynamics = better score, even when the mix is loud.&lt;/p&gt;

&lt;p&gt;This matches what mastering engineers have been saying for years: the loudness war killed dynamics, and listeners can feel it even if they can't name it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Frequency balance matters more than loudness.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Billie Eilish's mix is -10.5 LUFS — quieter than Travis Scott at -7.1. But it scores 13 points higher. It's not about loudness — it's about balance.&lt;/p&gt;

&lt;p&gt;The analyzer found a buildup at 300 Hz in the Nirvana mix (common in guitar-heavy music) and harshness at 4 kHz in some of the louder tracks. The A-grade tracks had no single frequency band dominating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Genre-appropriate choices affect the score.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trap and grunge intentionally sacrifice dynamics for vibe. Travis Scott at 5.5 dB crest factor isn't a mistake — it's the genre. But the analyzer flags it because it's objectively less dynamic.&lt;/p&gt;

&lt;p&gt;The key is knowing when low crest factor is intentional vs accidental. If you're making trap, a B-grade mix might be perfect. If you're making jazz, it's a problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Old mixes can outscore new ones.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bohemian Rhapsody (1975) scored 88/100. Queen's mix has better dynamics than 90% of modern releases. Hotel California (live) scored 87.&lt;/p&gt;

&lt;p&gt;This is the loudness war in a single table: a 50-year-old mix out-scores most 2024 releases on objective metrics.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means For Your Mixes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prioritize dynamics over loudness.&lt;/strong&gt; Aim for ≥7 dB crest factor. If you're below 6, remove bus compression.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check frequency balance.&lt;/strong&gt; No single octave should be more than 6-8 dB louder than its neighbors. The 200-400 Hz range is the most common offender.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't over-compress.&lt;/strong&gt; Every track that scored above 90 had healthy dynamics. The ones below 85 were squashed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use reference tracks.&lt;/strong&gt; Compare your mix against these songs. If your crest factor is 4 dB and Billie Eilish's is 9.8, you're over-compressing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Want to check your own mix?
&lt;/h2&gt;

&lt;p&gt;Upload your track to &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; and get an instant Mix Score (0-100) with specific issues flagged by severity. Free, no signup required.&lt;/p&gt;

&lt;p&gt;You can also &lt;a href="https://mixdiagnose.com/api-docs" rel="noopener noreferrer"&gt;install the CLI&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;mixdiagnose
mixdiagnose analyze my-mix.wav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix your mix before you master it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>audio</category>
      <category>music</category>
      <category>data</category>
      <category>production</category>
    </item>
    <item>
      <title>The Mix Readiness Checklist: 12 Signs Your Mix Is Done</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Thu, 09 Jul 2026 00:56:38 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/the-mix-readiness-checklist-12-signs-your-mix-is-done-3e9</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/the-mix-readiness-checklist-12-signs-your-mix-is-done-3e9</guid>
      <description>&lt;p&gt;Every producer knows the feeling: you've been mixing for hours, tweaking EQ, adjusting compression, checking on different speakers... and you still don't know if it's &lt;em&gt;done&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This guide gives you 12 concrete, measurable checkpoints so you never have to guess again.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The biggest mistake in mixing isn't bad EQ or too much compression — it's not knowing when to stop. Over-mixing kills more tracks than under-mixing ever did.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  01. Frequency Balance: No Range Dominates
&lt;/h2&gt;

&lt;p&gt;The #1 issue I see in mixes analyzed on &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; is frequency imbalance. A single range — usually 200-400 Hz or 2-5 kHz — dominates everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to check:&lt;/strong&gt; Load a spectrum analyzer. No single octave should be more than 6-8 dB louder than its neighbors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] No buildup in 200-400 Hz (mud zone)&lt;/li&gt;
&lt;li&gt;[ ] No harshness in 2-5 kHz (ear-piercing zone)&lt;/li&gt;
&lt;li&gt;[ ] Sub-bass (20-60 Hz) is controlled, not booming&lt;/li&gt;
&lt;li&gt;[ ] Air frequencies (10-20 kHz) add openness without sibilance&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  02. LUFS: You're In the Right Range
&lt;/h2&gt;

&lt;p&gt;Every streaming platform has a loudness target:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Target LUFS&lt;/th&gt;
&lt;th&gt;If you exceed it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Spotify&lt;/td&gt;
&lt;td&gt;-14 LUFS&lt;/td&gt;
&lt;td&gt;Turned down + limiter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple Music&lt;/td&gt;
&lt;td&gt;-16 LUFS&lt;/td&gt;
&lt;td&gt;Turned down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YouTube&lt;/td&gt;
&lt;td&gt;-14 LUFS&lt;/td&gt;
&lt;td&gt;Turned down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CD/Master&lt;/td&gt;
&lt;td&gt;-9 to -7 LUFS&lt;/td&gt;
&lt;td&gt;No normalization&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;For a pre-master mix:&lt;/strong&gt; aim for -18 to -14 LUFS integrated. If your mix is already at -8 LUFS, you've essentially mastered it — and left no headroom.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ If your mix is louder than -10 LUFS integrated, you're squashing dynamics. The mastering engineer can't add punch that isn't there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  03. True Peak: Below -1 dBTP
&lt;/h2&gt;

&lt;p&gt;True peak measures the actual peak level including inter-sample peaks. Going above -1 dBTP means you're already clipping on some playback systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Target:&lt;/strong&gt; -1 to -3 dBTP on the mix.&lt;/p&gt;

&lt;h2&gt;
  
  
  04. Dynamics: Crest Factor Above 6 dB
&lt;/h2&gt;

&lt;p&gt;Crest factor is the difference between peak and average level. It's the single best number for "how alive does this mix feel?"&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Crest Factor&lt;/th&gt;
&lt;th&gt;Assessment&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;≥12 dB&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Wide dynamic range, very punchy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9-12 dB&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Healthy dynamics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6-9 dB&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Starting to sound compressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4-6 dB&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;td&gt;Squashed — over-compressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;4 dB&lt;/td&gt;
&lt;td&gt;Dead&lt;/td&gt;
&lt;td&gt;Brickwalled — no dynamics left&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; If below 6 dB, remove or reduce bus compression. Let individual tracks carry the compression.&lt;/p&gt;

&lt;h2&gt;
  
  
  05. Stereo Width: Mono-Compatible
&lt;/h2&gt;

&lt;p&gt;Your mix should sound good in mono. Phone speakers, Bluetooth speakers, club systems — all sum to mono.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Mix sounds acceptable in mono&lt;/li&gt;
&lt;li&gt;[ ] Low frequencies (below 120 Hz) are mono&lt;/li&gt;
&lt;li&gt;[ ] Lead vocal is centered&lt;/li&gt;
&lt;li&gt;[ ] Stereo width enhances, doesn't destroy&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  06. No Clipping on Individual Tracks
&lt;/h2&gt;

&lt;p&gt;Check every track for clipping. A single clipped snare or vocal take can introduce harshness that no EQ will fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Pull every track down so peaks sit around -6 to -12 dBFS.&lt;/p&gt;

&lt;h2&gt;
  
  
  07. Low End Is Tight, Not Boomy
&lt;/h2&gt;

&lt;p&gt;Too much energy in 20-120 Hz makes the mix muddy on speakers and overwhelming on headphones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; High-pass filter everything that doesn't need low end — vocals at 80-100 Hz, guitars at 80 Hz. Only kick, bass, and sub-bass should occupy 20-120 Hz.&lt;/p&gt;

&lt;h2&gt;
  
  
  08. Vocal Sits On Top Of The Mix
&lt;/h2&gt;

&lt;p&gt;The vocal should be clearly intelligible at all times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test:&lt;/strong&gt; Close your eyes. Can you understand every word? If not, the vocal is buried or frequencies in 1-3 kHz are being masked.&lt;/p&gt;

&lt;h2&gt;
  
  
  09. Translates Across Systems
&lt;/h2&gt;

&lt;p&gt;The classic test, still the best:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Studio monitors&lt;/li&gt;
&lt;li&gt;[ ] Headphones (different pair)&lt;/li&gt;
&lt;li&gt;[ ] Phone speaker&lt;/li&gt;
&lt;li&gt;[ ] Car speakers&lt;/li&gt;
&lt;li&gt;[ ] AirPods / earbuds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it sounds great on monitors but thin on phone speakers → low-end problem. Great on headphones but muddy on monitors → midrange buildup.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. No Harshness or Sibilance
&lt;/h2&gt;

&lt;p&gt;Harshness lives in 2-5 kHz. Sibilance lives in 5-8 kHz. Both make listeners turn down the volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; De-ess vocals. Cut 1-2 dB at 3 kHz on harsh instruments.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Depth and Space Are Intentional
&lt;/h2&gt;

&lt;p&gt;Every element should have a deliberate position. Use reverb and delay to create depth — closer elements have less reverb, distant elements have more.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. The 24-Hour Rule
&lt;/h2&gt;

&lt;p&gt;The final checkpoint isn't technical — it's psychological. &lt;strong&gt;Step away for 24 hours.&lt;/strong&gt; Come back with fresh ears.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your ears adapt to a mix within 30 minutes. After that, you're not hearing the mix — you're hearing your memory of it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Checkpoint&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Red Flag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LUFS&lt;/td&gt;
&lt;td&gt;-18 to -14&lt;/td&gt;
&lt;td&gt;Louder than -10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;True Peak&lt;/td&gt;
&lt;td&gt;-1 to -3 dBTP&lt;/td&gt;
&lt;td&gt;Above -1 dBTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crest Factor&lt;/td&gt;
&lt;td&gt;≥6 dB&lt;/td&gt;
&lt;td&gt;Below 4 dB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freq Balance&lt;/td&gt;
&lt;td&gt;No range +6 dB&lt;/td&gt;
&lt;td&gt;Mud at 200-400 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stereo (mono)&lt;/td&gt;
&lt;td&gt;Acceptable&lt;/td&gt;
&lt;td&gt;Phase cancellation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Track clipping&lt;/td&gt;
&lt;td&gt;Peaks ≤ -6 dBFS&lt;/td&gt;
&lt;td&gt;Any track at 0 dBFS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If all 12 check out — your mix is ready for mastering. Not before.&lt;/p&gt;




&lt;p&gt;Want to check all 12 automatically? Upload your track to &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; and get an instant Mix Score (0-100) with specific issues flagged by severity. Free, no signup required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix your mix before you master it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>audio</category>
      <category>music</category>
      <category>production</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why Your Mix Sounds Great In The Studio But Terrible Everywhere Else</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Wed, 08 Jul 2026 05:42:42 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/why-your-mix-sounds-great-in-the-studio-but-terrible-everywhere-else-3pa5</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/why-your-mix-sounds-great-in-the-studio-but-terrible-everywhere-else-3pa5</guid>
      <description>&lt;h2&gt;
  
  
  Why Your Mix Sounds Great In The Studio But Terrible Everywhere Else
&lt;/h2&gt;

&lt;p&gt;You mixed for 6 hours on your Adam A7X monitors. It sounds perfect. Then you play it on your phone and it sounds like garbage — muddy, thin, harsh.&lt;/p&gt;

&lt;p&gt;This isn't your monitors' fault. It's your ears adapting and your room lying to you.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem: Ear Fatigue + Room Modes
&lt;/h3&gt;

&lt;p&gt;After 2+ hours of mixing at 85dB SPL, your ears temporarily lose sensitivity in the 1-4kHz range. You keep turning up the highs to compensate, which makes the mix harsh when your ears recover.&lt;/p&gt;

&lt;p&gt;Your room has resonant modes that boost certain frequencies and cancel others. A 4m x 3m room has a massive mode around 43Hz and another at 86Hz. You're mixing on top of a frequency response that's +/-15dB uneven, and you don't even know it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution: Objective Measurement
&lt;/h3&gt;

&lt;p&gt;I built a free tool called &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; that analyzes your mix objectively — no ears involved. Upload any audio file and get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequency balance across 6 bands&lt;/strong&gt; — see exactly where you have too much or too little energy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LUFS measurement&lt;/strong&gt; — know if streaming platforms will turn your mix down&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stereo width + mono compatibility&lt;/strong&gt; — does your mix survive on phone speakers?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic range&lt;/strong&gt; — are you over-compressing?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Mix Score (0-100)&lt;/strong&gt; — one number that tells you if your mix is ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No signup required. 3 free analyses per month.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 3 Most Common Issues I See
&lt;/h3&gt;

&lt;p&gt;After analyzing hundreds of mixes, here's what's wrong with most amateur productions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Low-mid buildup (200-500Hz) — 80% of mixes have this&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your room probably has a mode in this range that makes it sound quieter than it is, so you boost it. The fix: cut 2-3dB around 300Hz with a wide bell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Over-compression (crest factor &amp;lt; 6dB) — 60% of mixes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You smashed the mix with a limiter to make it loud. Now it's flat and lifeless. The fix: remove the limiter on the mix bus. Mix at -18 LUFS. Let mastering handle loudness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Zero stereo width — 40% of mixes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your stereo width is 0, your mix is essentially mono. This isn't always bad (mono mixes translate well), but if you intended stereo, your mid/side balance is off. Check your panning — are all your elements panned center?&lt;/p&gt;

&lt;h3&gt;
  
  
  How To Use Objective Analysis
&lt;/h3&gt;

&lt;p&gt;Run your mix through &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; at three stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;After rough mix&lt;/strong&gt; — fix the big issues (mud, no highs, mono)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After you think it's done&lt;/strong&gt; — verify the numbers look good&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before sending to mastering&lt;/strong&gt; — confirm LUFS is -14 to -18, not -8&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Mix Score gives you a number to track. If it goes from 54 to 72 to 85, you know you're improving. If it's stuck at 40, you know something structural is wrong.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Free mix analysis at &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;mixdiagnose.com&lt;/a&gt; — no signup required.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>audio</category>
      <category>music</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The LUFS Cheat Sheet: Target Loudness for Every Streaming Platform</title>
      <dc:creator>Oren MixDiagnose</dc:creator>
      <pubDate>Wed, 08 Jul 2026 05:36:36 +0000</pubDate>
      <link>https://dev.to/oren_mixdiagnose_1380fb19/stop-guessing-if-your-mix-is-ready-for-mastering-19cd</link>
      <guid>https://dev.to/oren_mixdiagnose_1380fb19/stop-guessing-if-your-mix-is-ready-for-mastering-19cd</guid>
      <description>&lt;p&gt;You finished your mix. It sounds huge in your studio. Then you upload it, and on Spotify it sounds... quieter than your favorite track. Or worse — the chorus ducks under the verse for no obvious reason.&lt;/p&gt;

&lt;p&gt;The loudness wars are over, but nobody sent streaming platforms the memo. Each service normalizes your track to its own target, and if you master louder than that target, your dynamics get flattened automatically. If you master quieter, you actually keep your transients — and the platform turns you up.&lt;/p&gt;

&lt;p&gt;This cheat sheet is the thing I wish I'd had when I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a LUFS, really?
&lt;/h2&gt;

&lt;p&gt;LUFS (Loudness Units Full Scale) measures &lt;strong&gt;perceived loudness&lt;/strong&gt; — how loud something &lt;em&gt;sounds&lt;/em&gt; to a human, not the peak sample value. It's the same scale used by broadcast TV and film (EBU R128). One LUFS ≈ one dB of perceived change.&lt;/p&gt;

&lt;p&gt;The key numbers you care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrated LUFS&lt;/strong&gt; — the average loudness of the whole track. This is the number streaming platforms normalize to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True Peak (dBTP)&lt;/strong&gt; — the actual highest sample value after inter-sample peaks are calculated. Keep this under -1 dBTP to avoid clipping on playback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LU Range&lt;/strong&gt; — how dynamic your track is. Useful, but not the target.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most DAWs have a LUFS meter built in or available free (Youlean Loudness Meter 2 is a great free option). Check your integrated number against the table below before you bounce.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cheat sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Target (LUFS)&lt;/th&gt;
&lt;th&gt;True Peak&lt;/th&gt;
&lt;th&gt;What happens if you're louder&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Spotify&lt;/td&gt;
&lt;td&gt;-14&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down to -14; dynamics preserved but quieter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple Music&lt;/td&gt;
&lt;td&gt;-16&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down; Sound Check applies normalization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YouTube&lt;/td&gt;
&lt;td&gt;-14&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down to approx -14 LUFS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tidal&lt;/td&gt;
&lt;td&gt;-14 (HiFi) / -10 (Master)&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down to target tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Music&lt;/td&gt;
&lt;td&gt;-14&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Normalized to -14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deezer&lt;/td&gt;
&lt;td&gt;-15&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Turned down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SoundCloud&lt;/td&gt;
&lt;td&gt;-14 (approx, varies)&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Normalized on upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broadcast (EBU R128)&lt;/td&gt;
&lt;td&gt;-23&lt;/td&gt;
&lt;td&gt;-1 dBTP&lt;/td&gt;
&lt;td&gt;Required for TV/film delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The safe target for everything
&lt;/h3&gt;

&lt;p&gt;If you want one number that works everywhere: &lt;strong&gt;-14 LUFS integrated, -1 dBTP true peak.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That hits Spotify and YouTube exactly, and you'll only lose 2 dB on Apple Music (which is fine — they turn you up). Your dynamics survive, and you avoid the automatic loudness penalty.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one mistake that ruins everything
&lt;/h2&gt;

&lt;p&gt;People still master to &lt;strong&gt;-8 or -7 LUFS&lt;/strong&gt; because "louder sounds better in the car." It does — on CD. On Spotify, your -8 LUFS track gets turned down 6 dB to hit -14. Now you've crushed your track for nothing, and it sounds &lt;em&gt;quieter and more lifeless&lt;/em&gt; than a track that was mastered at -14 to begin with.&lt;/p&gt;

&lt;p&gt;The loudness penalty is real. A -14 LUFS master with real dynamics will sound &lt;strong&gt;bigger and punchier&lt;/strong&gt; after Spotify's normalization than a brick-walled -8 LUFS master of the same song. This is counterintuitive but measurable — try it on a reference track.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually hit the target
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mix at a consistent monitoring level.&lt;/strong&gt; Set your monitor controller to a fixed position (around 79 dB SPL at your listening position) and leave it there. Your ears calibrate to loudness relative to this baseline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't smash the mix bus.&lt;/strong&gt; If your mix bus limiter is doing 6+ dB of reduction, you're doing the streaming platform's job for it — badly. Aim for 1–2 dB of peak limiting on the master, max.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure integrated LUFS on the final bounce.&lt;/strong&gt; Run the full track through a LUFS meter. If you're at -11 and your target is -14, you have headroom — either lower the limiter threshold a touch or leave it (the platform will normalize up).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check true peak.&lt;/strong&gt; Set your true peak limiter to -1.0 dBTP. Some platforms re-encode, which can create inter-sample clipping you can't hear in the DAW.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare against a reference.&lt;/strong&gt; Import a track in your genre from Spotify into your DAW and measure its LUFS. You'll be surprised how quiet most well-mastered modern tracks actually are.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A quick workflow that saves time
&lt;/h2&gt;

&lt;p&gt;Before you bounce the final master, run your track through a quick check. If you want to skip the manual math, &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; runs the loudness and true-peak analysis for you and tells you where you sit relative to each platform's target — no plugin chain needed, just upload the bounce.&lt;/p&gt;

&lt;p&gt;It's the fastest way to confirm you're at -14 LUFS before you ship, rather than discovering the problem after release.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Master to -14 LUFS, -1 dBTP&lt;/strong&gt; for the broadest compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Louder is not better&lt;/strong&gt; on streaming — the platform decides the loudness, not you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep your dynamics.&lt;/strong&gt; A track with groove and punch beats a track that's been crushed flat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure, don't guess.&lt;/strong&gt; Use a LUFS meter every single time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your mix will sound bigger, your masters will translate, and you'll stop wondering why Spotify "made your track quieter." It didn't — you did.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Upload your finished track to &lt;a href="https://mixdiagnose.com" rel="noopener noreferrer"&gt;MixDiagnose&lt;/a&gt; and get an instant loudness report — integrated LUFS, true peak, and exactly where you stand against Spotify, Apple Music, and YouTube targets. It takes about ten seconds and tells you whether to ship or re-master.&lt;/p&gt;

</description>
      <category>audio</category>
      <category>music</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
