How predictable is popular music? The McGill Billboard Project annotates various audio features of songs from a random sample of the Billboard charts. I scraped this data to produce the following file of chord progressions:

chords.txt

Write the shortest code that outputs the above file (or its contents).

Edit: Here's a quick description of the notation to get you started:


N denotes no chord.
A:min denotes the A minor triad chord.
C#:sus4(b7,9) and other spicy chords are completely described here.
Java (JDK), 295709 47044 (gzipped file) + 943 (code) + 1 (file) + 67 (imports) = 48055 bytes

Examining the file manually (with some help from notepad++), I found that there were 976 unique entries in the file, formed of 36 unique characters (plus newlines):

#(),/123456789:ABCDEFGNXabdghijmnsu

I then looked for common patterns, and created a dictionary as follows (key = value):


  :maj = ¬
  :min = `
  \r\nA = "
  \r\nB = £
  \r\nC = $
  \r\nD = %
  \r\nE = ^
  \r\nF = &amp;
  \r\nG = *
  \r\nN = _
  \r\nX = -
  :sus = +
  :hdim = =
  :dim = [
  (9) = }
  (#9) = ]
  :7 = {
  :5 = ~
  :aug = ;
  #11 = @
  b7 = '
  maj7 = &lt;
  b13 = &gt;
  :11 = ?
  (11) = \
  b:9 = Z
  ¬^¬ = H
  ¬%¬ = I
  ¬$¬ = J
  ¬"¬ = K
  £b¬ = L
  ¬*¬ = M
  b¬"b = O
  ¬&amp;¬ = P
  b¬^b = Q
  +4(', = R
  ¬£ = S
  +4(') = T
  %b¬ = U
  £`£ = V
  `7%`7 = W
  7"` = Y
  "b{] = c
  *`7 = e
  :13^b = f
  `7$ = k
  %` = l
  ^` = o
  "` = p
  b`7^ = q
  b{% = r
  cc = t
  oo = v
  &amp;#~ = w
  __ = x
  YY = y
  &amp;#¬ = z  


I then find-and-replace using those items in order:



()-&gt;{String s = "A LONG STRING THAT I CAN'T PASTE HERE - SEE TIO LINK";
&#9;&#9;String[] d=new String[]{"&amp;#¬","z","YY","y","__","x","&amp;#~","w","oo","v","cc","t","b{%","r","b`7^","q","\"`","p","^`","o","%`","l","`7$","k",":13^b","f","*`7","e","\"b{]","c","7\"`","Y","`7%`7","W","£`£","V","%b¬","U","+4(')","T","¬£","S","+4(',","R","b¬^b","Q","¬&amp;¬","P","b¬\"b","O","¬*¬","M","£b¬","L","¬\"¬","K","¬$¬","J","¬%¬","I","¬^¬","H","b:9","Z","(11)","\\",":11","?","b13","&gt;","maj7","&lt;","b7","'","#11","@",":aug",";",":5","~",":7","{","(#9)","]","(9)","}",":dim","[",":hdim","=",":sus","+","\r\nX","-","\r\nN","_","\r\nG","*","\r\nF","&amp;","\r\nE","^","\r\nD","%","\r\nC","$","\r\nB","£","\r\nA","\"",":min","`",":maj","¬"};
&#9;&#9;for (int i=0;i&lt;d.length;i+=2){s=s.replace(d[i+1],d[i]);}return s;}


TIO (sort of).

EDIT

By compressing the string, as suggested in the comments, this answer can then be made shorter.

Using the GZIPped version of the string in a file "f" (size 45708 bytes), the code can then be as follows:

import java.io.*;
import java.nio.file.*;
import java.util.zip.*;
()-&gt;{String s="",l;try{BufferedReader b=new BufferedReader(new InputStreamReader(new GZIPInputStream(new ByteArrayInputStream(Files.readAllBytes(Paths.get("f"))))));while((l=b.readLine())!=null){s+=l;}}catch(Exception e){}String[] d=new String[]{THE SAME DICTIONARY AS THE PREVIOUS CODE - REDACTED HERE TO MAKE ANSWER SHORT ENOUGH};for (int i=0;i&lt;d.length;i+=2){s=s.replace(d[i+1],d[i]);}return s;}