Skip to content

Instantly share code, notes, and snippets.

@troughton
Forked from dribnet/gist:a0ef81cf281d53066ebb2416c1cae3b4
Last active October 24, 2016 23:52
Show Gist options
  • Save troughton/65387a7d767ac84db658bcb4e2b9707a to your computer and use it in GitHub Desktop.
Save troughton/65387a7d767ac84db658bcb4e2b9707a to your computer and use it in GitHub Desktop.
MDDN 342 Final Project
// note: this file is poorly named - it can generally be ignored.
// helper functions below for supporting blocks/purview
function saveBlocksImages(doZoom) {
if(doZoom == null) {
doZoom = false;
}
// generate 960x500 preview.jpg of entire canvas
// TODO: should this be recycled?
var offscreenCanvas = document.createElement('canvas');
offscreenCanvas.width = 960;
offscreenCanvas.height = 500;
var context = offscreenCanvas.getContext('2d');
// background is flat white
context.fillStyle="#FFFFFF";
context.fillRect(0, 0, 960, 500);
context.drawImage(this.canvas, 0, 0, 960, 500);
// save to browser
var downloadMime = 'image/octet-stream';
var imageData = offscreenCanvas.toDataURL('image/jpeg');
imageData = imageData.replace('image/jpeg', downloadMime);
p5.prototype.downloadFile(imageData, 'preview.jpg', 'jpg');
// generate 230x120 thumbnail.png centered on mouse
offscreenCanvas.width = 230;
offscreenCanvas.height = 120;
// background is flat white
context = offscreenCanvas.getContext('2d');
context.fillStyle="#FFFFFF";
context.fillRect(0, 0, 230, 120);
if(doZoom) {
// pixelDensity does the right thing on retina displays
var pd = this._pixelDensity;
var sx = pd * mouseX - pd * 230/2;
var sy = pd * mouseY - pd * 120/2;
var sw = pd * 230;
var sh = pd * 120;
// bounds checking - just displace if necessary
if (sx < 0) {
sx = 0;
}
if (sx > this.canvas.width - sw) {
sx = this.canvas.width - sw;
}
if (sy < 0) {
sy = 0;
}
if (sy > this.canvas.height - sh) {
sy = this.canvas.height - sh;
}
// save to browser
context.drawImage(this.canvas, sx, sy, sw, sh, 0, 0, 230, 120);
}
else {
// now scaledown
var full_width = this.canvas.width;
var full_height = this.canvas.height;
context.drawImage(this.canvas, 0, 0, full_width, full_height, 0, 0, 230, 120);
}
imageData = offscreenCanvas.toDataURL('image/png');
imageData = imageData.replace('image/png', downloadMime);
p5.prototype.downloadFile(imageData, 'thumbnail.png', 'png');
}

PS5 MDDN 342 2016

In extending my glyph system from Problem Set 4 I wanted to apply it to a real-world data set. The original inspiration and basic colour palette came from the album cover for The Bones of What You Believe; I found the symbol on the cover striking and saw a lot of potential for it as a glyph system. For the real-world data set, I thought what better place to start than a music library.

I exported data about my iTunes music library to an XML file, and then processed it using an external program (the source for which is in LibraryXMLConversion.swift and which isn't by any means good code). In that program, I computed statistics about each album: average play count, track count, how long ago the most recently played track was played, how loud the album is on average, how many times each track has been skipped on average, the length of the titles on the album, and roughly how many people contributed to composing each track. I then mapped those to the different parameters in my glyph system, trying to get some correlation between the effect and the meaning:

  • The loudness affects the triangle scale from the centre (how 'big' the triangles are).
  • The average track length affects the inner angle of the triangles (how long the tracks stretch out for).
  • The track count affects the stroke weight of the circles (how dense the album is).
  • The time since I last played a track on the album affects the stroke weight of the triangles.
  • The play count affects the saturation of the red background (how intensely I like the album).
  • The skip count inversely affects the saturation of the blue background (another measure of my opinion of the album).
  • The number of composers affects the triangle rotation.
  • The album title length affects the spacing on the ellipses – this is more of a fun 'bonus' data point.

All in all, we get an interesting visualisation of my music library – and if you really want to know what this visualisation thinks my tastes in music are, you can click on each glyph to see the album information. It'd be particularly interesting to compare to other people's libraries and see how their listening habits compare.

Links for Presentation:

Final Visualisation

The Bones of What You Believe Cover

Initial Concepts

Dimensional Glyph Prototype

Final Dimensional Glyph

Iterations for iTunes Port

Library Conversion Program

Final Visualisation

[
{
"Number of Composers" : 1.25,
"Title Length" : 13.16666666666667,
"Normalization" : 3126.666666666667,
"Skip Count" : 4.583333333333333,
"Track Count" : 12,
"Play Count" : 5.083333333333333,
"Total Time" : 218227.3333333333,
"Time Since Last Played" : 700758.9834139347,
"Album Name" : "19",
"Album Artist" : "Adele"
},
{
"Number of Composers" : 2.214285714285714,
"Title Length" : 14.42857142857143,
"Normalization" : 0,
"Skip Count" : 0.3571428571428572,
"Track Count" : 14,
"Play Count" : 6.142857142857143,
"Total Time" : 258110.0714285714,
"Time Since Last Played" : 781464.948018074,
"Album Name" : "25",
"Album Artist" : "Adele"
},
{
"Number of Composers" : 0.0625,
"Title Length" : 15.875,
"Normalization" : 243.3125,
"Skip Count" : 0.1875,
"Track Count" : 16,
"Play Count" : 4.9375,
"Total Time" : 254727.5,
"Time Since Last Played" : 818139.9765570164,
"Album Name" : "21",
"Album Artist" : "Adele"
},
{
"Number of Composers" : 4.866666666666666,
"Title Length" : 13.86666666666667,
"Normalization" : 5215.333333333333,
"Skip Count" : 0.2,
"Track Count" : 15,
"Play Count" : 2.733333333333333,
"Total Time" : 218796.6,
"Time Since Last Played" : 1069069.955549955,
"Album Name" : "Know-It-All (Deluxe)",
"Album Artist" : "Alessia Cara"
},
{
"Number of Composers" : 2.785714285714286,
"Title Length" : 23.92857142857143,
"Normalization" : 2976.714285714286,
"Skip Count" : 1.571428571428571,
"Track Count" : 14,
"Play Count" : 2.071428571428572,
"Total Time" : 227126.1428571429,
"Time Since Last Played" : 782289.9660260677,
"Album Name" : "The Element of Freedom",
"Album Artist" : "Alicia Keys"
},
{
"Number of Composers" : 1,
"Title Length" : 13.5,
"Normalization" : 1759.5,
"Skip Count" : 0,
"Track Count" : 2,
"Play Count" : 3.5,
"Total Time" : 147605.5,
"Time Since Last Played" : 780808.9728419781,
"Album Name" : "Portal 2: Songs to Test By",
"Album Artist" : "Aperture Science Psychoacoustics Laboratory"
},
{
"Number of Composers" : 0,
"Title Length" : 17.18181818181818,
"Normalization" : 0,
"Skip Count" : 1.909090909090909,
"Track Count" : 11,
"Play Count" : 2.727272727272727,
"Total Time" : 245544.7272727273,
"Time Since Last Played" : 9266019.964157104,
"Album Name" : "Journey Bonus Bundle",
"Album Artist" : "Austin Wintory"
},
{
"Number of Composers" : 0,
"Title Length" : 12.5,
"Normalization" : 0,
"Skip Count" : 0.7777777777777778,
"Track Count" : 18,
"Play Count" : 0.6666666666666666,
"Total Time" : 195761.5555555556,
"Time Since Last Played" : -735920191.0525241,
"Album Name" : "Journey",
"Album Artist" : "Austin Wintory"
},
{
"Number of Composers" : 1,
"Title Length" : 14.36363636363636,
"Normalization" : 0,
"Skip Count" : 0.1818181818181818,
"Track Count" : 11,
"Play Count" : 1.363636363636364,
"Total Time" : 219260.6363636364,
"Time Since Last Played" : 529313.973929882,
"Album Name" : "We Are for the Wild Places",
"Album Artist" : "Avalanche City"
},
{
"Number of Composers" : 0,
"Title Length" : 12.6,
"Normalization" : 0,
"Skip Count" : 0.7,
"Track Count" : 10,
"Play Count" : 3.3,
"Total Time" : 282047.6,
"Time Since Last Played" : 6678997.952067852,
"Album Name" : "True",
"Album Artist" : "Avicii"
},
{
"Number of Composers" : 0,
"Title Length" : 17,
"Normalization" : 0,
"Skip Count" : 2,
"Track Count" : 2,
"Play Count" : 2.5,
"Total Time" : 350915.5,
"Time Since Last Played" : 53767280.94540405,
"Album Name" : "TRUE",
"Album Artist" : "Avicii"
},
{
"Number of Composers" : 0,
"Title Length" : 10.78571428571429,
"Normalization" : 0,
"Skip Count" : 0.5714285714285714,
"Track Count" : 14,
"Play Count" : 5.571428571428571,
"Total Time" : 225639.6428571429,
"Time Since Last Played" : 1391721.981601954,
"Album Name" : "Let Go",
"Album Artist" : "Avril Lavigne"
},
{
"Number of Composers" : 2,
"Title Length" : 11.58333333333333,
"Normalization" : 0,
"Skip Count" : 0.25,
"Track Count" : 12,
"Play Count" : 2.416666666666667,
"Total Time" : 204715.5,
"Time Since Last Played" : 701865.9975450039,
"Album Name" : "Under My Skin",
"Album Artist" : "Avril Lavigne"
},
{
"Number of Composers" : 0,
"Title Length" : 29.27272727272727,
"Normalization" : 3773.454545454545,
"Skip Count" : 0.6363636363636364,
"Track Count" : 11,
"Play Count" : 3.181818181818182,
"Total Time" : 188130.9090909091,
"Time Since Last Played" : 1132802.981324911,
"Album Name" : "Other People's Heartache, Pt. 2",
"Album Artist" : "Bastille"
},
{
"Number of Composers" : 0.9705882352941176,
"Title Length" : 20.17647058823529,
"Normalization" : 1686.176470588235,
"Skip Count" : 0.7352941176470589,
"Track Count" : 34,
"Play Count" : 11.20588235294118,
"Total Time" : 203838.0882352941,
"Time Since Last Played" : 98484.94951105118,
"Album Name" : "All This Bad Blood",
"Album Artist" : "Bastille"
},
{
"Number of Composers" : 0,
"Title Length" : 31,
"Normalization" : 0,
"Skip Count" : 0.4285714285714285,
"Track Count" : 7,
"Play Count" : 3,
"Total Time" : 236292,
"Time Since Last Played" : 3205920.98990202,
"Album Name" : "Other People's Heartache",
"Album Artist" : "Bastille"
},
{
"Number of Composers" : 1.894736842105263,
"Title Length" : 10.78947368421053,
"Normalization" : 6157.578947368421,
"Skip Count" : 0.2631578947368421,
"Track Count" : 19,
"Play Count" : 7.052631578947368,
"Total Time" : 208537,
"Time Since Last Played" : 602485.9949040413,
"Album Name" : "Wild World (Complete Edition)",
"Album Artist" : "Bastille"
},
{
"Number of Composers" : 0,
"Title Length" : 6,
"Normalization" : 4785,
"Skip Count" : 1,
"Track Count" : 1,
"Play Count" : 6,
"Total Time" : 220520,
"Time Since Last Played" : 1133046.951741934,
"Album Name" : "B'Day (Deluxe Edition)",
"Album Artist" : "Beyoncé"
},
{
"Number of Composers" : 4,
"Title Length" : 10.5,
"Normalization" : 3800.5,
"Skip Count" : 0.75,
"Track Count" : 4,
"Play Count" : 4.75,
"Total Time" : 210029.5,
"Time Since Last Played" : 1908748.997974873,
"Album Name" : "4",
"Album Artist" : "Beyoncé"
},
{
"Number of Composers" : 3,
"Title Length" : 4,
"Normalization" : 5814,
"Skip Count" : 1,
"Track Count" : 1,
"Play Count" : 4,
"Total Time" : 261640,
"Time Since Last Played" : 25244947.96223092,
"Album Name" : "I Am...Sasha Fierce",
"Album Artist" : "Beyoncé"
},
{
"Number of Composers" : 4.071428571428571,
"Title Length" : 14.35714285714286,
"Normalization" : 3340.642857142857,
"Skip Count" : 1,
"Track Count" : 14,
"Play Count" : 2.214285714285714,
"Total Time" : 233943.4285714286,
"Time Since Last Played" : 699975.9545769691,
"Album Name" : "I Am…Sasha Fierce",
"Album Artist" : "Beyoncé"
},
{
"Number of Composers" : 0.4848484848484849,
"Title Length" : 18.18181818181818,
"Normalization" : 2585.969696969697,
"Skip Count" : 2.121212121212121,
"Track Count" : 33,
"Play Count" : 1.909090909090909,
"Total Time" : 258681.9696969697,
"Time Since Last Played" : 4065071.95342803,
"Album Name" : "The Essential Billy Joel",
"Album Artist" : "Billy Joel"
},
{
"Number of Composers" : 0.8888888888888888,
"Title Length" : 21,
"Normalization" : 737,
"Skip Count" : 1.666666666666667,
"Track Count" : 9,
"Play Count" : 2.111111111111111,
"Total Time" : 283570.1111111111,
"Time Since Last Played" : 24290213.96395588,
"Album Name" : "The Stranger",
"Album Artist" : "Billy Joel"
},
{
"Number of Composers" : 0,
"Title Length" : 11.37037037037037,
"Normalization" : 0,
"Skip Count" : 0.6666666666666666,
"Track Count" : 27,
"Play Count" : 0.1481481481481481,
"Total Time" : 257595,
"Time Since Last Played" : 3634032.998534918,
"Album Name" : "Mass Effect 2",
"Album Artist" : "Bioware"
},
{
"Number of Composers" : 0,
"Title Length" : 17.34375,
"Normalization" : 1396.8125,
"Skip Count" : 1.375,
"Track Count" : 32,
"Play Count" : 1.5,
"Total Time" : 159433.59375,
"Time Since Last Played" : 4239736.968374014,
"Album Name" : "Mass Effect 3 (Soundtrack)",
"Album Artist" : "Bioware"
},
{
"Number of Composers" : 0,
"Title Length" : 14.47297297297297,
"Normalization" : 0,
"Skip Count" : 0.2837837837837838,
"Track Count" : 74,
"Play Count" : 0.04054054054054054,
"Total Time" : 144773.6621621622,
"Time Since Last Played" : 33867238.99931192,
"Album Name" : "Mass Effect: The Complete Soundtrack",
"Album Artist" : "Bioware"
},
{
"Number of Composers" : 0,
"Title Length" : 16.77142857142857,
"Normalization" : 0,
"Skip Count" : 0.3714285714285714,
"Track Count" : 35,
"Play Count" : 0.3714285714285714,
"Total Time" : 233894.6571428571,
"Time Since Last Played" : 30853614.95623112,
"Album Name" : "Mass Effect 2: The Complete Soundtrack",
"Album Artist" : "Bioware"
},
{
"Number of Composers" : 2.818181818181818,
"Title Length" : 9.636363636363637,
"Normalization" : 0,
"Skip Count" : 0.1818181818181818,
"Track Count" : 11,
"Play Count" : 2.181818181818182,
"Total Time" : 223831,
"Time Since Last Played" : 1906192.991034985,
"Album Name" : "Evergreen",
"Album Artist" : "Broods"
},
{
"Number of Composers" : 3.230769230769231,
"Title Length" : 13.76923076923077,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 13,
"Play Count" : 0.6923076923076923,
"Total Time" : 222686.2307692308,
"Time Since Last Played" : 784501.9522271156,
"Album Name" : "Conscious",
"Album Artist" : "Broods"
},
{
"Number of Composers" : 2,
"Title Length" : 18,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 0,
"Total Time" : 256133,
"Time Since Last Played" : 8799397.983232975,
"Album Name" : "Human (IV Fridays) - Single",
"Album Artist" : "Brooke Fraser"
},
{
"Number of Composers" : 1.15,
"Title Length" : 15.25,
"Normalization" : 789.95,
"Skip Count" : 0.35,
"Track Count" : 20,
"Play Count" : 1.25,
"Total Time" : 250910.3,
"Time Since Last Played" : 700259.9965538979,
"Album Name" : "Albertine",
"Album Artist" : "Brooke Fraser"
},
{
"Number of Composers" : 1.7,
"Title Length" : 12.1,
"Normalization" : 3400.7,
"Skip Count" : 0.5,
"Track Count" : 10,
"Play Count" : 7.8,
"Total Time" : 222430.6,
"Time Since Last Played" : 1306207.948703051,
"Album Name" : "Brutal Romantic",
"Album Artist" : "Brooke Fraser"
},
{
"Number of Composers" : 1,
"Title Length" : 10.09090909090909,
"Normalization" : 0,
"Skip Count" : 0.4545454545454545,
"Track Count" : 11,
"Play Count" : 4.818181818181818,
"Total Time" : 268384,
"Time Since Last Played" : 5794713.973380089,
"Album Name" : "What To Do With Daylight",
"Album Artist" : "Brooke Fraser"
},
{
"Number of Composers" : 0,
"Title Length" : 19.53333333333333,
"Normalization" : 4348.866666666667,
"Skip Count" : 0.06666666666666667,
"Track Count" : 15,
"Play Count" : 2.666666666666667,
"Total Time" : 239596.2666666667,
"Time Since Last Played" : 1417066.963068008,
"Album Name" : "Every Open Eye (Extended Edition)",
"Album Artist" : "CHVRCHES"
},
{
"Number of Composers" : 0,
"Title Length" : 12.38888888888889,
"Normalization" : 4640.055555555556,
"Skip Count" : 0.4444444444444444,
"Track Count" : 18,
"Play Count" : 11.44444444444444,
"Total Time" : 231546.6666666667,
"Time Since Last Played" : 1304899.969026089,
"Album Name" : "The Bones of What You Believe (Deluxe Edition)",
"Album Artist" : "CHVRCHES"
},
{
"Number of Composers" : 1.357142857142857,
"Title Length" : 18,
"Normalization" : 8219.785714285714,
"Skip Count" : 0.7857142857142857,
"Track Count" : 14,
"Play Count" : 4.285714285714286,
"Total Time" : 224454.2142857143,
"Time Since Last Played" : 1134182.952647924,
"Album Name" : "Motion",
"Album Artist" : "Calvin Harris"
},
{
"Number of Composers" : 5.181818181818182,
"Title Length" : 11.90909090909091,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 11,
"Play Count" : 1,
"Total Time" : 214744.3636363636,
"Time Since Last Played" : 1908322.966995955,
"Album Name" : "<I°_°I>",
"Album Artist" : "Caravan Palace"
},
{
"Number of Composers" : 0,
"Title Length" : 15.17647058823529,
"Normalization" : 0,
"Skip Count" : 0.4117647058823529,
"Track Count" : 17,
"Play Count" : 8.117647058823529,
"Total Time" : 218915,
"Time Since Last Played" : 24769.96506214142,
"Album Name" : "E•MO•TION (Deluxe)",
"Album Artist" : "Carly Rae Jepsen"
},
{
"Number of Composers" : 3.5,
"Title Length" : 15.5,
"Normalization" : 5940.1875,
"Skip Count" : 0.25,
"Track Count" : 16,
"Play Count" : 5.375,
"Total Time" : 208658.875,
"Time Since Last Played" : 41623.9959359169,
"Album Name" : "Kiss (Deluxe Version)",
"Album Artist" : "Carly Rae Jepsen"
},
{
"Number of Composers" : 3.375,
"Title Length" : 6.75,
"Normalization" : 4303.75,
"Skip Count" : 0.25,
"Track Count" : 8,
"Play Count" : 14.375,
"Total Time" : 207698.875,
"Time Since Last Played" : 41328.98366498947,
"Album Name" : "Emotion Side B",
"Album Artist" : "Carly Rae Jepsen"
},
{
"Number of Composers" : 0,
"Title Length" : 7,
"Normalization" : 7056,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 2,
"Total Time" : 203600,
"Time Since Last Played" : 47191335.99410391,
"Album Name" : "Roads",
"Album Artist" : "Chris Mann"
},
{
"Number of Composers" : 0,
"Title Length" : 9,
"Normalization" : 7621,
"Skip Count" : 2,
"Track Count" : 1,
"Play Count" : 4,
"Total Time" : 240826,
"Time Since Last Played" : 2507483.977608919,
"Album Name" : "Stripped",
"Album Artist" : "Christina Aguilera"
},
{
"Number of Composers" : 0,
"Title Length" : 24,
"Normalization" : 8207,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 3,
"Total Time" : 213026,
"Time Since Last Played" : 21006039.94928789,
"Album Name" : "Takin' It to the Streets - Single",
"Album Artist" : "Christine Anu & Deni Hines"
},
{
"Number of Composers" : 0,
"Title Length" : 9.699999999999999,
"Normalization" : 3260.7,
"Skip Count" : 0.8,
"Track Count" : 10,
"Play Count" : 5.7,
"Total Time" : 250822.3,
"Time Since Last Played" : 1133286.9823699,
"Album Name" : "Parachutes",
"Album Artist" : "Coldplay"
},
{
"Number of Composers" : 2.315789473684211,
"Title Length" : 18.47368421052632,
"Normalization" : 123.5263157894737,
"Skip Count" : 1.157894736842105,
"Track Count" : 19,
"Play Count" : 5.526315789473684,
"Total Time" : 243528.7368421053,
"Time Since Last Played" : 784034.9504051208,
"Album Name" : "Viva la Vida (Prospekt's March Edition)",
"Album Artist" : "Coldplay"
},
{
"Number of Composers" : 0,
"Title Length" : 15.71428571428571,
"Normalization" : 0,
"Skip Count" : 0.7857142857142857,
"Track Count" : 14,
"Play Count" : 8.785714285714286,
"Total Time" : 189465.4285714286,
"Time Since Last Played" : 1547784.991533995,
"Album Name" : "Mylo Xyloto",
"Album Artist" : "Coldplay"
},
{
"Number of Composers" : 0,
"Title Length" : 13,
"Normalization" : 0,
"Skip Count" : 1.473684210526316,
"Track Count" : 19,
"Play Count" : 2,
"Total Time" : 286717.9473684211,
"Time Since Last Played" : 1552745.951539993,
"Album Name" : "X & Y",
"Album Artist" : "Coldplay"
},
{
"Number of Composers" : 0,
"Title Length" : 10.75,
"Normalization" : 0,
"Skip Count" : 0.25,
"Track Count" : 12,
"Play Count" : 4.75,
"Total Time" : 248771.9166666667,
"Time Since Last Played" : 1575216.997838974,
"Album Name" : "Ghost Stories",
"Album Artist" : "Coldplay"
},
{
"Number of Composers" : 1,
"Title Length" : 12.90909090909091,
"Normalization" : 0,
"Skip Count" : 1.636363636363636,
"Track Count" : 11,
"Play Count" : 3.090909090909091,
"Total Time" : 295668.8181818182,
"Time Since Last Played" : 4066720.951837063,
"Album Name" : "A Rush Of Blood To The Head",
"Album Artist" : "Coldplay"
},
{
"Number of Composers" : 0.5454545454545454,
"Title Length" : 13.63636363636364,
"Normalization" : 0,
"Skip Count" : 0.09090909090909091,
"Track Count" : 11,
"Play Count" : 4.090909090909091,
"Total Time" : 250082.4545454546,
"Time Since Last Played" : 1906913.946792126,
"Album Name" : "A Head Full of Dreams",
"Album Artist" : "Coldplay"
},
{
"Number of Composers" : 0,
"Title Length" : 11.8,
"Normalization" : 0,
"Skip Count" : 0.6,
"Track Count" : 5,
"Play Count" : 6.2,
"Total Time" : 234626.2,
"Time Since Last Played" : 5647249.985028982,
"Album Name" : "The Blue Room",
"Album Artist" : "Coldplay"
},
{
"Number of Composers" : 0.2105263157894737,
"Title Length" : 16.89473684210526,
"Normalization" : 2435.263157894737,
"Skip Count" : 1.842105263157895,
"Track Count" : 19,
"Play Count" : 1.947368421052632,
"Total Time" : 221975.1578947369,
"Time Since Last Played" : 2340679.984782934,
"Album Name" : "The Very Best Of Crowded House",
"Album Artist" : "Crowded House"
},
{
"Number of Composers" : 0,
"Title Length" : 11.36363636363636,
"Normalization" : 0,
"Skip Count" : 0.09090909090909091,
"Track Count" : 11,
"Play Count" : 0.5454545454545454,
"Total Time" : 300400,
"Time Since Last Played" : 3450383.978392124,
"Album Name" : "Deliverance",
"Album Artist" : "Culprate"
},
{
"Number of Composers" : 0.4666666666666667,
"Title Length" : 24,
"Normalization" : 0,
"Skip Count" : 0.2,
"Track Count" : 15,
"Play Count" : 6.8,
"Total Time" : 335012.2,
"Time Since Last Played" : 1130698.97217989,
"Album Name" : "Random Access Memories",
"Album Artist" : "Daft Punk"
},
{
"Number of Composers" : 0,
"Title Length" : 10.33333333333333,
"Normalization" : 0,
"Skip Count" : 0.6666666666666666,
"Track Count" : 24,
"Play Count" : 0.6666666666666666,
"Total Time" : 162038.3333333333,
"Time Since Last Played" : 783315.9693009853,
"Album Name" : "TRON: Legacy (Original Motion Picture Soundtrack)",
"Album Artist" : "Daft Punk"
},
{
"Number of Composers" : 1,
"Title Length" : 10.4375,
"Normalization" : 0,
"Skip Count" : 1.75,
"Track Count" : 16,
"Play Count" : 1.8125,
"Total Time" : 278801,
"Time Since Last Played" : 33867860.95005298,
"Album Name" : "Homework",
"Album Artist" : "Daft Punk"
},
{
"Number of Composers" : 0,
"Title Length" : 12.85714285714286,
"Normalization" : 0,
"Skip Count" : 1.285714285714286,
"Track Count" : 14,
"Play Count" : 8.5,
"Total Time" : 261380.0714285714,
"Time Since Last Played" : 1133613.964498997,
"Album Name" : "Discovery",
"Album Artist" : "Daft Punk"
},
{
"Number of Composers" : 2,
"Title Length" : 38,
"Normalization" : 0,
"Skip Count" : 1,
"Track Count" : 1,
"Play Count" : 7,
"Total Time" : 223987,
"Time Since Last Played" : 1116964.995414019,
"Album Name" : "Super Natural (feat. Carly Rae Jepsen) - Single",
"Album Artist" : "Danny L Harle"
},
{
"Number of Composers" : 0,
"Title Length" : 18.95454545454545,
"Normalization" : 0,
"Skip Count" : 3.181818181818182,
"Track Count" : 22,
"Play Count" : 1.818181818181818,
"Total Time" : 164948.4090909091,
"Time Since Last Played" : 30337407.96957803,
"Album Name" : "Bastion Original Soundtrack",
"Album Artist" : "Darren Korb"
},
{
"Number of Composers" : 1.307692307692308,
"Title Length" : 11.46153846153846,
"Normalization" : 11061.38461538462,
"Skip Count" : 1.384615384615385,
"Track Count" : 13,
"Play Count" : 2.615384615384615,
"Total Time" : 217441.6923076923,
"Time Since Last Played" : 15396949.97189188,
"Album Name" : "Daughtry",
"Album Artist" : "Daughtry"
},
{
"Number of Composers" : 3.307692307692307,
"Title Length" : 11.92307692307692,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 13,
"Play Count" : 1.615384615384615,
"Total Time" : 227974.0769230769,
"Time Since Last Played" : 1837846.946192026,
"Album Name" : "Wings of the Wild",
"Album Artist" : "Delta Goodrem"
},
{
"Number of Composers" : 1.518518518518519,
"Title Length" : 16.33333333333333,
"Normalization" : 698.8518518518518,
"Skip Count" : 1.296296296296296,
"Track Count" : 27,
"Play Count" : 4,
"Total Time" : 238354.5185185185,
"Time Since Last Played" : 528651.9852559566,
"Album Name" : "Child of the Universe",
"Album Artist" : "Delta Goodrem"
},
{
"Number of Composers" : 2.714285714285714,
"Title Length" : 13,
"Normalization" : 0,
"Skip Count" : 0.07142857142857142,
"Track Count" : 14,
"Play Count" : 1.214285714285714,
"Total Time" : 240369.9285714286,
"Time Since Last Played" : 2507991.994336128,
"Album Name" : "Innocent Eyes",
"Album Artist" : "Delta Goodrem"
},
{
"Number of Composers" : 2.777777777777778,
"Title Length" : 13.33333333333333,
"Normalization" : 0,
"Skip Count" : 0.1666666666666667,
"Track Count" : 18,
"Play Count" : 1.666666666666667,
"Total Time" : 211236.6111111111,
"Time Since Last Played" : 1321855.974896908,
"Album Name" : "Feline (Deluxe)",
"Album Artist" : "Ella Eyre"
},
{
"Number of Composers" : 3,
"Title Length" : 8.384615384615385,
"Normalization" : 0,
"Skip Count" : 0.07692307692307693,
"Track Count" : 13,
"Play Count" : 2.076923076923077,
"Total Time" : 224874.8461538462,
"Time Since Last Played" : 1553242.97676301,
"Album Name" : "Chapter One",
"Album Artist" : "Ella Henderson"
},
{
"Number of Composers" : 2.518518518518519,
"Title Length" : 13.7037037037037,
"Normalization" : 0,
"Skip Count" : 0.7037037037037037,
"Track Count" : 27,
"Play Count" : 9.74074074074074,
"Total Time" : 227147.2962962963,
"Time Since Last Played" : 530267.9673938751,
"Album Name" : "Halcyon Days",
"Album Artist" : "Ellie Goulding"
},
{
"Number of Composers" : 3.5,
"Title Length" : 14.40909090909091,
"Normalization" : 4222.090909090909,
"Skip Count" : 0.5909090909090909,
"Track Count" : 22,
"Play Count" : 14.40909090909091,
"Total Time" : 219137.9545454546,
"Time Since Last Played" : 366686.9539718628,
"Album Name" : "Delirium (Deluxe)",
"Album Artist" : "Ellie Goulding"
},
{
"Number of Composers" : 0,
"Title Length" : 12.70588235294118,
"Normalization" : 0,
"Skip Count" : 0.6470588235294118,
"Track Count" : 17,
"Play Count" : 10.11764705882353,
"Total Time" : 219899.2352941177,
"Time Since Last Played" : 698412.9588699341,
"Album Name" : "Bright Lights",
"Album Artist" : "Ellie Goulding"
},
{
"Number of Composers" : 3.8125,
"Title Length" : 15.5625,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 16,
"Play Count" : 0.25,
"Total Time" : 62496.75,
"Time Since Last Played" : 40965.9610118866,
"Album Name" : "Long Live the Angels",
"Album Artist" : "Emeli Sandé"
},
{
"Number of Composers" : 1,
"Title Length" : 9.714285714285714,
"Normalization" : 4374.571428571428,
"Skip Count" : 0.5714285714285714,
"Track Count" : 14,
"Play Count" : 5.285714285714286,
"Total Time" : 210411,
"Time Since Last Played" : 698873.9593589306,
"Album Name" : "Our Version Of Events",
"Album Artist" : "Emeli Sandé"
},
{
"Number of Composers" : 3,
"Title Length" : 18,
"Normalization" : 4372,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 4,
"Total Time" : 198440,
"Time Since Last Played" : 52444120.99569106,
"Album Name" : "Walking On A Dream - Single of the Week",
"Album Artist" : "Empire of the Sun"
},
{
"Number of Composers" : 0,
"Title Length" : 10.90909090909091,
"Normalization" : 0,
"Skip Count" : 1.090909090909091,
"Track Count" : 11,
"Play Count" : 6,
"Total Time" : 241809.4545454546,
"Time Since Last Played" : 11407393.96021295,
"Album Name" : "Fallen",
"Album Artist" : "Evanescence"
},
{
"Number of Composers" : 1,
"Title Length" : 48.38461538461539,
"Normalization" : 10261,
"Skip Count" : 0.5384615384615384,
"Track Count" : 13,
"Play Count" : 6.615384615384615,
"Total Time" : 197411.3846153846,
"Time Since Last Played" : 1392527.979454041,
"Album Name" : "From Under The Cork Tree",
"Album Artist" : "Fall Out Boy"
},
{
"Number of Composers" : 3.619047619047619,
"Title Length" : 29.19047619047619,
"Normalization" : 9711.952380952382,
"Skip Count" : 0.8095238095238095,
"Track Count" : 21,
"Play Count" : 8,
"Total Time" : 206099.3809523809,
"Time Since Last Played" : 701207.9969890118,
"Album Name" : "Infinity On High",
"Album Artist" : "Fall Out Boy"
},
{
"Number of Composers" : 2.818181818181818,
"Title Length" : 24.90909090909091,
"Normalization" : 9476.09090909091,
"Skip Count" : 0.8181818181818182,
"Track Count" : 11,
"Play Count" : 12.45454545454546,
"Total Time" : 227414.0909090909,
"Time Since Last Played" : 1320915.991922855,
"Album Name" : "Save Rock And Roll",
"Album Artist" : "Fall Out Boy"
},
{
"Number of Composers" : 6.363636363636363,
"Title Length" : 16.27272727272727,
"Normalization" : 10015.54545454545,
"Skip Count" : 0.5454545454545454,
"Track Count" : 11,
"Play Count" : 8.545454545454545,
"Total Time" : 213363.2727272727,
"Time Since Last Played" : 528861.9457631111,
"Album Name" : "American Beauty \/ American Psycho",
"Album Artist" : "Fall Out Boy"
},
{
"Number of Composers" : 3.466666666666667,
"Title Length" : 21.66666666666667,
"Normalization" : 8828.066666666668,
"Skip Count" : 0.2666666666666667,
"Track Count" : 15,
"Play Count" : 7.066666666666666,
"Total Time" : 230248.6,
"Time Since Last Played" : 780950.9999818802,
"Album Name" : "Folie à deux",
"Album Artist" : "Fall Out Boy"
},
{
"Number of Composers" : 1.294117647058824,
"Title Length" : 10.70588235294118,
"Normalization" : 0,
"Skip Count" : 2.235294117647059,
"Track Count" : 17,
"Play Count" : 3.352941176470588,
"Total Time" : 236121.2352941177,
"Time Since Last Played" : 5534687.957988977,
"Album Name" : "Fleetwood Mac: Greatest Hits",
"Album Artist" : "Fleetwood Mac"
},
{
"Number of Composers" : 1.090909090909091,
"Title Length" : 13.45454545454546,
"Normalization" : 0,
"Skip Count" : 0.2727272727272727,
"Track Count" : 11,
"Play Count" : 0.4545454545454545,
"Total Time" : 218082.3636363636,
"Time Since Last Played" : 7950062.972414017,
"Album Name" : "Rumours",
"Album Artist" : "Fleetwood Mac"
},
{
"Number of Composers" : 2.5,
"Title Length" : 16.5,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 2,
"Play Count" : 1.5,
"Total Time" : 336650,
"Time Since Last Played" : 5125888.978266001,
"Album Name" : "Songs from Final Fantasy XV",
"Album Artist" : "Florence + The Machine"
},
{
"Number of Composers" : 0,
"Title Length" : 15,
"Normalization" : 5983.8125,
"Skip Count" : 0.375,
"Track Count" : 16,
"Play Count" : 7.1875,
"Total Time" : 261998.0625,
"Time Since Last Played" : 1131052.946597099,
"Album Name" : "How Big, How Blue, How Beautiful (Deluxe)",
"Album Artist" : "Florence + The Machine"
},
{
"Number of Composers" : 0.52,
"Title Length" : 20.08,
"Normalization" : 6162.76,
"Skip Count" : 1.12,
"Track Count" : 25,
"Play Count" : 4.76,
"Total Time" : 229168.16,
"Time Since Last Played" : 698617.9550869465,
"Album Name" : "Between Two Lungs",
"Album Artist" : "Florence + The Machine"
},
{
"Number of Composers" : 1.041666666666667,
"Title Length" : 19,
"Normalization" : 0,
"Skip Count" : 0.2083333333333333,
"Track Count" : 24,
"Play Count" : 5.458333333333333,
"Total Time" : 265981.25,
"Time Since Last Played" : 529816.9730160236,
"Album Name" : "Ceremonials",
"Album Artist" : "Florence + The Machine"
},
{
"Number of Composers" : 2.3125,
"Title Length" : 12.1875,
"Normalization" : 2415.0625,
"Skip Count" : 0.25,
"Track Count" : 16,
"Play Count" : 4.8125,
"Total Time" : 245963.3125,
"Time Since Last Played" : 527291.9652950764,
"Album Name" : "Glorious (Deluxe Version)",
"Album Artist" : "Foxes"
},
{
"Number of Composers" : 2.8125,
"Title Length" : 11.1875,
"Normalization" : 5672,
"Skip Count" : 0.0625,
"Track Count" : 16,
"Play Count" : 9.0625,
"Total Time" : 207293.75,
"Time Since Last Played" : 1132551.965659142,
"Album Name" : "All I Need (Deluxe)",
"Album Artist" : "Foxes"
},
{
"Number of Composers" : 0,
"Title Length" : 11,
"Normalization" : 1193,
"Skip Count" : 3,
"Track Count" : 1,
"Play Count" : 2,
"Total Time" : 176483,
"Time Since Last Played" : 46574474.99632192,
"Album Name" : "The Orange Box (Original Soundtrack)",
"Album Artist" : "GLaDOS & Jonathan Coulton"
},
{
"Number of Composers" : 0,
"Title Length" : 18.5,
"Normalization" : 0,
"Skip Count" : 3,
"Track Count" : 2,
"Play Count" : 0,
"Total Time" : 337600,
"Time Since Last Played" : 248061755.984627,
"Album Name" : "Genesis (2007 Remaster)",
"Album Artist" : "Genesis"
},
{
"Number of Composers" : 2,
"Title Length" : 8,
"Normalization" : 3922,
"Skip Count" : 1,
"Track Count" : 1,
"Play Count" : 8,
"Total Time" : 200573,
"Time Since Last Played" : 21107129.98147702,
"Album Name" : "Budapest - Single",
"Album Artist" : "George Ezra"
},
{
"Number of Composers" : 1.071428571428571,
"Title Length" : 16,
"Normalization" : 4070.928571428572,
"Skip Count" : 0.5,
"Track Count" : 14,
"Play Count" : 8.428571428571429,
"Total Time" : 213086.9285714286,
"Time Since Last Played" : 530068.9687149525,
"Album Name" : "Art Angels",
"Album Artist" : "Grimes"
},
{
"Number of Composers" : 1,
"Title Length" : 19.21428571428572,
"Normalization" : 1964.857142857143,
"Skip Count" : 0.2142857142857143,
"Track Count" : 14,
"Play Count" : 0.9285714285714286,
"Total Time" : 214069.7857142857,
"Time Since Last Played" : 1134639.960720062,
"Album Name" : "Visions",
"Album Artist" : "Grimes"
},
{
"Number of Composers" : 0,
"Title Length" : 16.89655172413793,
"Normalization" : 0,
"Skip Count" : 0.9310344827586207,
"Track Count" : 29,
"Play Count" : 2,
"Total Time" : 107553.275862069,
"Time Since Last Played" : 3114937.957628965,
"Album Name" : "The Last of Us",
"Album Artist" : "Gustavo Santaolalla"
},
{
"Number of Composers" : 1.04,
"Title Length" : 12.56,
"Normalization" : 0,
"Skip Count" : 0.72,
"Track Count" : 25,
"Play Count" : 0.24,
"Total Time" : 140890.72,
"Time Since Last Played" : 1132444.970010996,
"Album Name" : "The Last of Us, Vol. 2 (Video Game Soundtrack)",
"Album Artist" : "Gustavo Santaolalla"
},
{
"Number of Composers" : 3.4,
"Title Length" : 12.86666666666667,
"Normalization" : 0,
"Skip Count" : 0.06666666666666667,
"Track Count" : 15,
"Play Count" : 1.933333333333333,
"Total Time" : 242524.4666666667,
"Time Since Last Played" : 698163.9603850842,
"Album Name" : "Days Are Gone (Deluxe Edition)",
"Album Artist" : "HAIM"
},
{
"Number of Composers" : 2.214285714285714,
"Title Length" : 14.64285714285714,
"Normalization" : 0,
"Skip Count" : 1.071428571428571,
"Track Count" : 14,
"Play Count" : 11.71428571428571,
"Total Time" : 209255.9285714286,
"Time Since Last Played" : 1548023.948353052,
"Album Name" : "Listen Up!",
"Album Artist" : "Haley Reinhart"
},
{
"Number of Composers" : 2.416666666666667,
"Title Length" : 9.25,
"Normalization" : 0,
"Skip Count" : 0.5,
"Track Count" : 12,
"Play Count" : 5.5,
"Total Time" : 210792.3333333333,
"Time Since Last Played" : 1835610.975270987,
"Album Name" : "BADLANDS (Deluxe Edition)",
"Album Artist" : "Halsey"
},
{
"Number of Composers" : 1,
"Title Length" : 4,
"Normalization" : 1364,
"Skip Count" : 1,
"Track Count" : 1,
"Play Count" : 5,
"Total Time" : 275518,
"Time Since Last Played" : 36057982.95541406,
"Album Name" : "Inception (Music from the Motion Picture)",
"Album Artist" : "Hans Zimmer"
},
{
"Number of Composers" : 4,
"Title Length" : 8,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 5,
"Total Time" : 187375,
"Time Since Last Played" : 4064020.976426125,
"Album Name" : "Firework - Single",
"Album Artist" : "Hollywood Principle"
},
{
"Number of Composers" : 0,
"Title Length" : 9.666666666666666,
"Normalization" : 5994.666666666667,
"Skip Count" : 1.666666666666667,
"Track Count" : 3,
"Play Count" : 1,
"Total Time" : 234421.6666666667,
"Time Since Last Played" : 43549429.97034788,
"Album Name" : "I Stand",
"Album Artist" : "Idina Menzel"
},
{
"Number of Composers" : 0,
"Title Length" : 11.25,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 12,
"Play Count" : 1.083333333333333,
"Total Time" : 228466.6666666667,
"Time Since Last Played" : 33273.98311805725,
"Album Name" : "idina.",
"Album Artist" : "Idina Menzel"
},
{
"Number of Composers" : 0,
"Title Length" : 26.5,
"Normalization" : 7119.6,
"Skip Count" : 0.3,
"Track Count" : 10,
"Play Count" : 8.1,
"Total Time" : 257371.3,
"Time Since Last Played" : 1242455.995543003,
"Album Name" : "Ashes",
"Album Artist" : "Illenium"
},
{
"Number of Composers" : 0.2727272727272727,
"Title Length" : 10.54545454545454,
"Normalization" : 1160.454545454545,
"Skip Count" : 0.6363636363636364,
"Track Count" : 22,
"Play Count" : 10.31818181818182,
"Total Time" : 220830.4545454546,
"Time Since Last Played" : 700538.9591078758,
"Album Name" : "Night Visions",
"Album Artist" : "Imagine Dragons"
},
{
"Number of Composers" : 1.571428571428571,
"Title Length" : 9.428571428571429,
"Normalization" : 0,
"Skip Count" : 0.5238095238095238,
"Track Count" : 21,
"Play Count" : 1.285714285714286,
"Total Time" : 228722.6190476191,
"Time Since Last Played" : 816609.9623820782,
"Album Name" : "Smoke + Mirrors (Deluxe)",
"Album Artist" : "Imagine Dragons"
},
{
"Number of Composers" : 3.4,
"Title Length" : 26.6,
"Normalization" : 1661.6,
"Skip Count" : 0.4,
"Track Count" : 5,
"Play Count" : 4.6,
"Total Time" : 234703.6,
"Time Since Last Played" : 7608684.94890213,
"Album Name" : "iTunes Session - EP",
"Album Artist" : "Imagine Dragons"
},
{
"Number of Composers" : 1,
"Title Length" : 35,
"Normalization" : 2906,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 6,
"Total Time" : 287999,
"Time Since Last Played" : 4331535.983298063,
"Album Name" : "Shots - EP",
"Album Artist" : "Imagine Dragons"
},
{
"Number of Composers" : 1.210526315789474,
"Title Length" : 14.1578947368421,
"Normalization" : 0,
"Skip Count" : 0.05263157894736842,
"Track Count" : 19,
"Play Count" : 0.8947368421052632,
"Total Time" : 251560.6315789474,
"Time Since Last Played" : 526506.9736249447,
"Album Name" : "Phase (Deluxe)",
"Album Artist" : "Jack Garratt"
},
{
"Number of Composers" : 2.083333333333333,
"Title Length" : 14.75,
"Normalization" : 0,
"Skip Count" : 0.1666666666666667,
"Track Count" : 12,
"Play Count" : 2.333333333333333,
"Total Time" : 241953.5,
"Time Since Last Played" : 529086.9741430283,
"Album Name" : "Chaos and the Calm",
"Album Artist" : "James Bay"
},
{
"Number of Composers" : 0,
"Title Length" : 15,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 3,
"Total Time" : 240166,
"Time Since Last Played" : 3373885.958750963,
"Album Name" : "Love Is a Four Letter Word",
"Album Artist" : "Jason Mraz"
},
{
"Number of Composers" : 0,
"Title Length" : 16,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 7,
"Total Time" : 268735,
"Time Since Last Played" : 9265224.952475071,
"Album Name" : "Habits of My Heart - EP",
"Album Artist" : "Jaymes Young"
},
{
"Number of Composers" : 0,
"Title Length" : 14.08333333333333,
"Normalization" : 0,
"Skip Count" : 2.75,
"Track Count" : 12,
"Play Count" : 2.583333333333333,
"Total Time" : 233438.5,
"Time Since Last Played" : 15393206.96281385,
"Album Name" : "Assassin's Creed Revelations (Best of)",
"Album Artist" : "Jesper Kyd"
},
{
"Number of Composers" : 0,
"Title Length" : 19.2962962962963,
"Normalization" : 0,
"Skip Count" : 1.074074074074074,
"Track Count" : 27,
"Play Count" : 2.222222222222222,
"Total Time" : 138207.9259259259,
"Time Since Last Played" : 3206176.963649988,
"Album Name" : "Sword & Sworcery LP - The Ballad of the Space Babies",
"Album Artist" : "Jim Guthrie"
},
{
"Number of Composers" : 0.1538461538461539,
"Title Length" : 12.07692307692308,
"Normalization" : 6334.076923076923,
"Skip Count" : 1.461538461538461,
"Track Count" : 13,
"Play Count" : 2,
"Total Time" : 241588.1538461538,
"Time Since Last Played" : 528149.9706180096,
"Album Name" : "Justice",
"Album Artist" : "Justice"
},
{
"Number of Composers" : 2.809523809523809,
"Title Length" : 19.42857142857143,
"Normalization" : 6402.142857142857,
"Skip Count" : 0.4285714285714285,
"Track Count" : 21,
"Play Count" : 1.904761904761905,
"Total Time" : 226324.0952380952,
"Time Since Last Played" : 529603.9786081314,
"Album Name" : "Greatest Hits - Chapter One",
"Album Artist" : "Kelly Clarkson"
},
{
"Number of Composers" : 0,
"Title Length" : 11.42857142857143,
"Normalization" : 0,
"Skip Count" : 2.714285714285714,
"Track Count" : 7,
"Play Count" : 0.7142857142857143,
"Total Time" : 170754.7142857143,
"Time Since Last Played" : 44274400.99019504,
"Album Name" : "The Impossible Game – Soundtrack",
"Album Artist" : "Kid2Will"
},
{
"Number of Composers" : 2,
"Title Length" : 18,
"Normalization" : 1429,
"Skip Count" : 2,
"Track Count" : 1,
"Play Count" : 4,
"Total Time" : 480173,
"Time Since Last Played" : 51953627.94607115,
"Album Name" : "Led Zeppelin IV",
"Album Artist" : "Led Zeppelin"
},
{
"Number of Composers" : 4.315789473684211,
"Title Length" : 13.57894736842105,
"Normalization" : 7768.368421052632,
"Skip Count" : 0.2105263157894737,
"Track Count" : 19,
"Play Count" : 3.789473684210526,
"Total Time" : 232683.8947368421,
"Time Since Last Played" : 699339.9597480297,
"Album Name" : "Glassheart (Deluxe Edition)",
"Album Artist" : "Leona Lewis"
},
{
"Number of Composers" : 2.666666666666667,
"Title Length" : 14.46666666666667,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 15,
"Play Count" : 0.1333333333333333,
"Total Time" : 209932.4666666667,
"Time Since Last Played" : 818659.9818129539,
"Album Name" : "I Am (Deluxe)",
"Album Artist" : "Leona Lewis"
},
{
"Number of Composers" : 3.111111111111111,
"Title Length" : 17.33333333333333,
"Normalization" : 6860.5,
"Skip Count" : 0.9444444444444444,
"Track Count" : 18,
"Play Count" : 5,
"Total Time" : 246625.5555555556,
"Time Since Last Played" : 700979.9708430767,
"Album Name" : "Echo (Deluxe Version)",
"Album Artist" : "Leona Lewis"
},
{
"Number of Composers" : 3,
"Title Length" : 49,
"Normalization" : 4124,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 6,
"Total Time" : 286073,
"Time Since Last Played" : 15398106.95489407,
"Album Name" : "Between the Raindrops (feat. Natasha Bedingfield) - Single",
"Album Artist" : "Lifehouse"
},
{
"Number of Composers" : 2.764705882352941,
"Title Length" : 13,
"Normalization" : 0,
"Skip Count" : 0.05882352941176471,
"Track Count" : 17,
"Play Count" : 2.647058823529412,
"Total Time" : 233183.7647058823,
"Time Since Last Played" : 1554639.956886053,
"Album Name" : "If You Wait (Deluxe Version)",
"Album Artist" : "London Grammar"
},
{
"Number of Composers" : 1.3125,
"Title Length" : 10.875,
"Normalization" : 1430.25,
"Skip Count" : 0.3125,
"Track Count" : 16,
"Play Count" : 3.6875,
"Total Time" : 212627.5,
"Time Since Last Played" : 783667.9893960953,
"Album Name" : "Pure Heroine (Extended)",
"Album Artist" : "Lorde"
},
{
"Number of Composers" : 1,
"Title Length" : 20.33333333333333,
"Normalization" : 1936.333333333333,
"Skip Count" : 2.666666666666667,
"Track Count" : 3,
"Play Count" : 2,
"Total Time" : 168884.3333333333,
"Time Since Last Played" : 55244705.97564697,
"Album Name" : "Assassin's Creed III",
"Album Artist" : "Lorne Balfe"
},
{
"Number of Composers" : 3,
"Title Length" : 13,
"Normalization" : 0,
"Skip Count" : 2,
"Track Count" : 1,
"Play Count" : 13,
"Total Time" : 243960,
"Time Since Last Played" : 3640455.94859004,
"Album Name" : "Hurry Up, We're Dreaming",
"Album Artist" : "M83"
},
{
"Number of Composers" : 1.666666666666667,
"Title Length" : 16.44444444444444,
"Normalization" : 0,
"Skip Count" : 0.2777777777777778,
"Track Count" : 18,
"Play Count" : 10.05555555555556,
"Total Time" : 219024.7222222222,
"Time Since Last Played" : 784699.9647068977,
"Album Name" : "Adventure (Deluxe)",
"Album Artist" : "Madeon"
},
{
"Number of Composers" : 4,
"Title Length" : 29,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 15,
"Total Time" : 176561,
"Time Since Last Played" : 1909145.996379852,
"Album Name" : "Lean On (feat. MØ & DJ Snake) - Single",
"Album Artist" : "Major Lazer"
},
{
"Number of Composers" : 0,
"Title Length" : 27,
"Normalization" : 7139,
"Skip Count" : 1,
"Track Count" : 1,
"Play Count" : 6,
"Total Time" : 237266,
"Time Since Last Played" : 17377611.97434092,
"Album Name" : "Exile On Mainstream",
"Album Artist" : "Matchbox Twenty"
},
{
"Number of Composers" : 0,
"Title Length" : 8.583333333333334,
"Normalization" : 0,
"Skip Count" : 0.3333333333333333,
"Track Count" : 12,
"Play Count" : 5.083333333333333,
"Total Time" : 264971.4166666667,
"Time Since Last Played" : 1553984.970456123,
"Album Name" : "Drones",
"Album Artist" : "Muse"
},
{
"Number of Composers" : 1,
"Title Length" : 26.36363636363636,
"Normalization" : 0,
"Skip Count" : 0.9090909090909091,
"Track Count" : 11,
"Play Count" : 7.636363636363637,
"Total Time" : 296211.8181818182,
"Time Since Last Played" : 3545965.953091145,
"Album Name" : "The Resistance",
"Album Artist" : "Muse"
},
{
"Number of Composers" : 0,
"Title Length" : 13.63636363636364,
"Normalization" : 0,
"Skip Count" : 1.090909090909091,
"Track Count" : 11,
"Play Count" : 4.909090909090909,
"Total Time" : 248272.3636363636,
"Time Since Last Played" : 1547544.975530148,
"Album Name" : "Black Holes And Revelations",
"Album Artist" : "Muse"
},
{
"Number of Composers" : 0,
"Title Length" : 11.84615384615385,
"Normalization" : 4339.23076923077,
"Skip Count" : 0.3846153846153846,
"Track Count" : 13,
"Play Count" : 2.923076923076923,
"Total Time" : 247277.3846153846,
"Time Since Last Played" : 526010.9455349445,
"Album Name" : "The 2nd Law",
"Album Artist" : "Muse"
},
{
"Number of Composers" : 5,
"Title Length" : 54,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 4,
"Total Time" : 213019,
"Time Since Last Played" : 1135079.962161064,
"Album Name" : "Runnin' (Lose It All) [feat. Beyoncé & Arrow Benjamin] - Single",
"Album Artist" : "Naughty Boy"
},
{
"Number of Composers" : 2.75,
"Title Length" : 16.75,
"Normalization" : 725.15,
"Skip Count" : 0.75,
"Track Count" : 20,
"Play Count" : 13.45,
"Total Time" : 234741.45,
"Time Since Last Played" : 1130473.961449146,
"Album Name" : "Native",
"Album Artist" : "OneRepublic"
},
{
"Number of Composers" : 3.15,
"Title Length" : 12.6,
"Normalization" : 4267.75,
"Skip Count" : 0.2,
"Track Count" : 20,
"Play Count" : 4.25,
"Total Time" : 226453.55,
"Time Since Last Played" : 40608.95836806297,
"Album Name" : "Oh My My (Deluxe)",
"Album Artist" : "OneRepublic"
},
{
"Number of Composers" : 0.5238095238095238,
"Title Length" : 18.57142857142857,
"Normalization" : 542.6190476190476,
"Skip Count" : 0.8571428571428571,
"Track Count" : 21,
"Play Count" : 7.714285714285714,
"Total Time" : 232816.5238095238,
"Time Since Last Played" : 785178.9798431396,
"Album Name" : "Dreaming Out Loud",
"Album Artist" : "OneRepublic"
},
{
"Number of Composers" : 2.2,
"Title Length" : 26.3,
"Normalization" : 3590.5,
"Skip Count" : 0.3,
"Track Count" : 10,
"Play Count" : 3.5,
"Total Time" : 233769,
"Time Since Last Played" : 5363018.986544132,
"Album Name" : "iTunes Session",
"Album Artist" : "OneRepublic"
},
{
"Number of Composers" : 1.315789473684211,
"Title Length" : 11.8421052631579,
"Normalization" : 3889.684210526316,
"Skip Count" : 0.4736842105263158,
"Track Count" : 19,
"Play Count" : 6.421052631578948,
"Total Time" : 250861.052631579,
"Time Since Last Played" : 26904.98275399208,
"Album Name" : "Waking Up (Deluxe Version)",
"Album Artist" : "OneRepublic"
},
{
"Number of Composers" : 4,
"Title Length" : 16.07692307692308,
"Normalization" : 0,
"Skip Count" : 0.5384615384615384,
"Track Count" : 13,
"Play Count" : 1.923076923076923,
"Total Time" : 252686.3076923077,
"Time Since Last Played" : 784904.9858698845,
"Album Name" : "Until the End of Time",
"Album Artist" : "Opshop"
},
{
"Number of Composers" : 0.6923076923076923,
"Title Length" : 14.69230769230769,
"Normalization" : 1288.384615384615,
"Skip Count" : 1.769230769230769,
"Track Count" : 13,
"Play Count" : 1.230769230769231,
"Total Time" : 252550.2307692308,
"Time Since Last Played" : 9426610.951164961,
"Album Name" : "Second Hand Planet",
"Album Artist" : "Opshop"
},
{
"Number of Composers" : 0,
"Title Length" : 17.28260869565218,
"Normalization" : 1919.782608695652,
"Skip Count" : 0.2391304347826087,
"Track Count" : 46,
"Play Count" : 3.521739130434783,
"Total Time" : 185993.6304347826,
"Time Since Last Played" : 782929.97143507,
"Album Name" : "Hamilton (Original Broadway Cast Recording)",
"Album Artist" : "Original Broadway Cast of Hamilton"
},
{
"Number of Composers" : 2.619047619047619,
"Title Length" : 15.76190476190476,
"Normalization" : 7274.857142857143,
"Skip Count" : 1.619047619047619,
"Track Count" : 21,
"Play Count" : 4.380952380952381,
"Total Time" : 222293.6190476191,
"Time Since Last Played" : 780585.9758319855,
"Album Name" : "Greatest Hits...So Far!!!",
"Album Artist" : "P!NK"
},
{
"Number of Composers" : 2,
"Title Length" : 18,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 6,
"Total Time" : 226962,
"Time Since Last Played" : 4226894.95720005,
"Album Name" : "Funhouse (The Tour Edition)",
"Album Artist" : "P!nk"
},
{
"Number of Composers" : 0,
"Title Length" : 16.11111111111111,
"Normalization" : 0,
"Skip Count" : 2.222222222222222,
"Track Count" : 9,
"Play Count" : 11.66666666666667,
"Total Time" : 250595.1111111111,
"Time Since Last Played" : 7347041.966545105,
"Album Name" : "The Truth About Love (Deluxe Version)",
"Album Artist" : "P!nk"
},
{
"Number of Composers" : 1.2,
"Title Length" : 18.06666666666667,
"Normalization" : 0,
"Skip Count" : 0.4,
"Track Count" : 15,
"Play Count" : 1.2,
"Total Time" : 251930,
"Time Since Last Played" : 4325116.963293076,
"Album Name" : "Manners",
"Album Artist" : "Passion Pit"
},
{
"Number of Composers" : 1,
"Title Length" : 15.5,
"Normalization" : 0,
"Skip Count" : 0.5833333333333334,
"Track Count" : 12,
"Play Count" : 2.333333333333333,
"Total Time" : 237576.5,
"Time Since Last Played" : 817833.990363121,
"Album Name" : "Gossamer",
"Album Artist" : "Passion Pit"
},
{
"Number of Composers" : 1.0625,
"Title Length" : 18.625,
"Normalization" : 5745.1875,
"Skip Count" : 0.3125,
"Track Count" : 16,
"Play Count" : 5.9375,
"Total Time" : 247855.5625,
"Time Since Last Played" : 699073.9449660778,
"Album Name" : "Soul Punk (Deluxe Edition)",
"Album Artist" : "Patrick Stump"
},
{
"Number of Composers" : 0,
"Title Length" : 16.83333333333333,
"Normalization" : 0,
"Skip Count" : 0.6666666666666666,
"Track Count" : 6,
"Play Count" : 8.166666666666666,
"Total Time" : 299028.3333333333,
"Time Since Last Played" : 2600151.951364994,
"Album Name" : "Immersion",
"Album Artist" : "Pendulum"
},
{
"Number of Composers" : 0,
"Title Length" : 18,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 2,
"Total Time" : 333080,
"Time Since Last Played" : 22487070.94924498,
"Album Name" : "Phil Collins: Hits",
"Album Artist" : "Phil Collins"
},
{
"Number of Composers" : 1,
"Title Length" : 12.33333333333333,
"Normalization" : 2112.666666666667,
"Skip Count" : 2.222222222222222,
"Track Count" : 9,
"Play Count" : 2.444444444444445,
"Total Time" : 286088.5555555556,
"Time Since Last Played" : 44237314.96634698,
"Album Name" : "Dark Side Of The Moon",
"Album Artist" : "Pink Floyd"
},
{
"Number of Composers" : 0,
"Title Length" : 7,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 8,
"Total Time" : 218965,
"Time Since Last Played" : 40098.94566702843,
"Album Name" : "Shelter - Single",
"Album Artist" : "Porter Robinson & Madeon"
},
{
"Number of Composers" : 0,
"Title Length" : 10,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 4,
"Total Time" : 215824,
"Time Since Last Played" : 526290.9876840115,
"Album Name" : "Soft Spoken - EP",
"Album Artist" : "Puppet"
},
{
"Number of Composers" : 0,
"Title Length" : 18,
"Normalization" : 0,
"Skip Count" : 0.07142857142857142,
"Track Count" : 14,
"Play Count" : 0.07142857142857142,
"Total Time" : 258670.6428571429,
"Time Since Last Played" : 702083.9802289009,
"Album Name" : "Remember Us to Life (Deluxe)",
"Album Artist" : "Regina Spektor"
},
{
"Number of Composers" : 0,
"Title Length" : 33.27777777777778,
"Normalization" : 0,
"Skip Count" : 0.1111111111111111,
"Track Count" : 18,
"Play Count" : 2.166666666666667,
"Total Time" : 265607.0555555556,
"Time Since Last Played" : 816302.977766037,
"Album Name" : "We the Generation (Deluxe Edition)",
"Album Artist" : "Rudimental"
},
{
"Number of Composers" : 0,
"Title Length" : 28.77777777777778,
"Normalization" : 0,
"Skip Count" : 0.6666666666666666,
"Track Count" : 9,
"Play Count" : 8.222222222222221,
"Total Time" : 282672.2222222222,
"Time Since Last Played" : 3374516.982527018,
"Album Name" : "Home",
"Album Artist" : "Rudimental"
},
{
"Number of Composers" : 0,
"Title Length" : 7.75,
"Normalization" : 621,
"Skip Count" : 0.5,
"Track Count" : 4,
"Play Count" : 3,
"Total Time" : 229756.25,
"Time Since Last Played" : 33869916.94645786,
"Album Name" : "Focus - EP",
"Album Artist" : "Ryan Keen"
},
{
"Number of Composers" : 2.333333333333333,
"Title Length" : 11.75,
"Normalization" : 0,
"Skip Count" : 0.25,
"Track Count" : 12,
"Play Count" : 0.5,
"Total Time" : 228974.4166666667,
"Time Since Last Played" : 21640097.97710299,
"Album Name" : "Room For Light",
"Album Artist" : "Ryan Keen"
},
{
"Number of Composers" : 3.166666666666667,
"Title Length" : 12.33333333333333,
"Normalization" : 3075.583333333333,
"Skip Count" : 0,
"Track Count" : 12,
"Play Count" : 4.166666666666667,
"Total Time" : 253564.1666666667,
"Time Since Last Played" : 39668.96670508385,
"Album Name" : "Internal",
"Album Artist" : "SAFIA"
},
{
"Number of Composers" : 1.384615384615385,
"Title Length" : 10.61538461538461,
"Normalization" : 342.6153846153846,
"Skip Count" : 0.3076923076923077,
"Track Count" : 13,
"Play Count" : 4.615384615384615,
"Total Time" : 249966.3076923077,
"Time Since Last Played" : 527072.9840009212,
"Album Name" : "The Blessed Unrest",
"Album Artist" : "Sara Bareilles"
},
{
"Number of Composers" : 1,
"Title Length" : 19.25,
"Normalization" : 3602.5,
"Skip Count" : 0.1666666666666667,
"Track Count" : 12,
"Play Count" : 6.75,
"Total Time" : 183997.5,
"Time Since Last Played" : 3472243.978034019,
"Album Name" : "What's Inside: Songs from Waitress",
"Album Artist" : "Sara Bareilles"
},
{
"Number of Composers" : 0.9230769230769231,
"Title Length" : 12.53846153846154,
"Normalization" : 4727.846153846154,
"Skip Count" : 0.3076923076923077,
"Track Count" : 13,
"Play Count" : 8.76923076923077,
"Total Time" : 229399.6923076923,
"Time Since Last Played" : 701412.9981839657,
"Album Name" : "Kaleidoscope Heart",
"Album Artist" : "Sara Bareilles"
},
{
"Number of Composers" : 1,
"Title Length" : 11.16666666666667,
"Normalization" : 5994,
"Skip Count" : 0.4166666666666667,
"Track Count" : 12,
"Play Count" : 9.583333333333334,
"Total Time" : 244944.1666666667,
"Time Since Last Played" : 1130220.974443913,
"Album Name" : "Little Voice",
"Album Artist" : "Sara Bareilles"
},
{
"Number of Composers" : 1,
"Title Length" : 15.75,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 4,
"Play Count" : 0.75,
"Total Time" : 296526.5,
"Time Since Last Played" : 2509057.991277933,
"Album Name" : "Once Upon Another Time - EP",
"Album Artist" : "Sara Bareilles"
},
{
"Number of Composers" : 2.8125,
"Title Length" : 11.625,
"Normalization" : 0,
"Skip Count" : 0.0625,
"Track Count" : 16,
"Play Count" : 3.1875,
"Total Time" : 219040.75,
"Time Since Last Played" : 1305645.987113953,
"Album Name" : "Pretend",
"Album Artist" : "Seinabo Sey"
},
{
"Number of Composers" : 2,
"Title Length" : 10,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 4,
"Total Time" : 272067,
"Time Since Last Played" : 6933622.981213093,
"Album Name" : "Colour the Small One (Deluxe Edition)",
"Album Artist" : "Sia"
},
{
"Number of Composers" : 3,
"Title Length" : 12.53333333333333,
"Normalization" : 6087.266666666666,
"Skip Count" : 0.5333333333333333,
"Track Count" : 15,
"Play Count" : 5.4,
"Total Time" : 221414.8,
"Time Since Last Played" : 1135292.984303951,
"Album Name" : "Let the Music Play",
"Album Artist" : "Stan Walker"
},
{
"Number of Composers" : 2.571428571428572,
"Title Length" : 12.14285714285714,
"Normalization" : 525.0714285714286,
"Skip Count" : 1.714285714285714,
"Track Count" : 14,
"Play Count" : 3.142857142857143,
"Total Time" : 227477,
"Time Since Last Played" : 4318609.979110956,
"Album Name" : "From the Inside Out",
"Album Artist" : "Stan Walker"
},
{
"Number of Composers" : 2.75,
"Title Length" : 18.83333333333333,
"Normalization" : 0,
"Skip Count" : 0.08333333333333333,
"Track Count" : 12,
"Play Count" : 0.9166666666666666,
"Total Time" : 215256.5833333333,
"Time Since Last Played" : 3549312.950841904,
"Album Name" : "Inventing Myself",
"Album Artist" : "Stan Walker"
},
{
"Number of Composers" : 1.888888888888889,
"Title Length" : 13.66666666666667,
"Normalization" : 7407.777777777777,
"Skip Count" : 2.222222222222222,
"Track Count" : 9,
"Play Count" : 1.777777777777778,
"Total Time" : 190246.1111111111,
"Time Since Last Played" : 9417382.974657059,
"Album Name" : "Introducing Stan Walker",
"Album Artist" : "Stan Walker"
},
{
"Number of Composers" : 0,
"Title Length" : 17.5,
"Normalization" : 0,
"Skip Count" : 1.3125,
"Track Count" : 16,
"Play Count" : 19.25,
"Total Time" : 244803.9375,
"Time Since Last Played" : 528367.9573378563,
"Album Name" : "Red",
"Album Artist" : "Taylor Swift"
},
{
"Number of Composers" : 2,
"Title Length" : 15.52631578947368,
"Normalization" : 0,
"Skip Count" : 0.7894736842105263,
"Track Count" : 19,
"Play Count" : 15.36842105263158,
"Total Time" : 217139.3684210526,
"Time Since Last Played" : 689548.9470019341,
"Album Name" : "1989 (Deluxe)",
"Album Artist" : "Taylor Swift"
},
{
"Number of Composers" : 1,
"Title Length" : 16.25,
"Normalization" : 4197.916666666667,
"Skip Count" : 1.416666666666667,
"Track Count" : 12,
"Play Count" : 2.666666666666667,
"Total Time" : 228924.0833333333,
"Time Since Last Played" : 13138675.98099709,
"Album Name" : "Everyone Is Here",
"Album Artist" : "The Finn Brothers"
},
{
"Number of Composers" : 0,
"Title Length" : 13.5,
"Normalization" : 7450.5,
"Skip Count" : 0,
"Track Count" : 2,
"Play Count" : 7,
"Total Time" : 249233,
"Time Since Last Played" : 17375238.96293688,
"Album Name" : "The Fray",
"Album Artist" : "The Fray"
},
{
"Number of Composers" : 2.272727272727273,
"Title Length" : 13.72727272727273,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 11,
"Play Count" : 1.181818181818182,
"Total Time" : 231199.9090909091,
"Time Since Last Played" : 4240336.97736907,
"Album Name" : "Helios",
"Album Artist" : "The Fray"
},
{
"Number of Composers" : 1,
"Title Length" : 21,
"Normalization" : 7963.5,
"Skip Count" : 1,
"Track Count" : 2,
"Play Count" : 7.5,
"Total Time" : 250940,
"Time Since Last Played" : 5361690.983864069,
"Album Name" : "How To Save A Life",
"Album Artist" : "The Fray"
},
{
"Number of Composers" : 0,
"Title Length" : 14,
"Normalization" : 3637.25,
"Skip Count" : 0.25,
"Track Count" : 4,
"Play Count" : 5.25,
"Total Time" : 302690.5,
"Time Since Last Played" : 3114371.995774031,
"Album Name" : "Useless Noises - EP",
"Album Artist" : "The Hidden Revolution"
},
{
"Number of Composers" : 0,
"Title Length" : 13,
"Normalization" : 2298,
"Skip Count" : 2,
"Track Count" : 1,
"Play Count" : 4,
"Total Time" : 177533,
"Time Since Last Played" : 13138497.97756386,
"Album Name" : "The Muppets (Original Soundtrack)",
"Album Artist" : "The Muppets"
},
{
"Number of Composers" : 3.5,
"Title Length" : 15.2,
"Normalization" : 0,
"Skip Count" : 0.8,
"Track Count" : 10,
"Play Count" : 7.1,
"Total Time" : 253194.5,
"Time Since Last Played" : 3111793.956556082,
"Album Name" : "Science & Faith",
"Album Artist" : "The Script"
},
{
"Number of Composers" : 0.1111111111111111,
"Title Length" : 15.22222222222222,
"Normalization" : 2061.666666666667,
"Skip Count" : 1.666666666666667,
"Track Count" : 9,
"Play Count" : 6.222222222222222,
"Total Time" : 224929.8888888889,
"Time Since Last Played" : 4327931.990625858,
"Album Name" : "The Script",
"Album Artist" : "The Script"
},
{
"Number of Composers" : 1,
"Title Length" : 16.07142857142857,
"Normalization" : 0,
"Skip Count" : 0.4285714285714285,
"Track Count" : 14,
"Play Count" : 1.214285714285714,
"Total Time" : 311287.7142857143,
"Time Since Last Played" : 1133841.972641945,
"Album Name" : "This Is War",
"Album Artist" : "Thirty Seconds to Mars"
},
{
"Number of Composers" : 0,
"Title Length" : 9,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 5,
"Total Time" : 102353,
"Time Since Last Played" : 2187676.98210597,
"Album Name" : "Voice Memos",
"Album Artist" : "Thomas Roughton’s iPhone"
},
{
"Number of Composers" : 0.68,
"Title Length" : 15.68,
"Normalization" : 0,
"Skip Count" : 1.82,
"Track Count" : 50,
"Play Count" : 1.8,
"Total Time" : 243862.14,
"Time Since Last Played" : 1555904.988287926,
"Album Name" : "Greatest Hits",
"Album Artist" : "Tracy Chapman"
},
{
"Number of Composers" : 2.2,
"Title Length" : 12.6,
"Normalization" : 3171.6,
"Skip Count" : 0.8,
"Track Count" : 5,
"Play Count" : 10.8,
"Total Time" : 209338.6,
"Time Since Last Played" : 701660.9952790737,
"Album Name" : "Trxye - EP",
"Album Artist" : "Troye Sivan"
},
{
"Number of Composers" : 3.466666666666667,
"Title Length" : 11.93333333333333,
"Normalization" : 5157.6,
"Skip Count" : 0.06666666666666667,
"Track Count" : 15,
"Play Count" : 4.933333333333334,
"Total Time" : 221245.5333333333,
"Time Since Last Played" : 941158.9679079056,
"Album Name" : "Blue Neighbourhood",
"Album Artist" : "Troye Sivan"
},
{
"Number of Composers" : 1,
"Title Length" : 18.23529411764706,
"Normalization" : 0,
"Skip Count" : 1.411764705882353,
"Track Count" : 17,
"Play Count" : 2.882352941176471,
"Total Time" : 255718.9411764706,
"Time Since Last Played" : 34306226.96188211,
"Album Name" : "Rattle And Hum",
"Album Artist" : "U2"
},
{
"Number of Composers" : 1.875,
"Title Length" : 23.9375,
"Normalization" : 70,
"Skip Count" : 0.3125,
"Track Count" : 16,
"Play Count" : 3.75,
"Total Time" : 357140.5625,
"Time Since Last Played" : 525783.9934699535,
"Album Name" : "Songs of Innocence",
"Album Artist" : "U2"
},
{
"Number of Composers" : 5,
"Title Length" : 28,
"Normalization" : 3728,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 2,
"Total Time" : 227274,
"Time Since Last Played" : 13479426.94732189,
"Album Name" : "Invisible (RED) Edit Version",
"Album Artist" : "U2"
},
{
"Number of Composers" : 0,
"Title Length" : 18.91666666666667,
"Normalization" : 0,
"Skip Count" : 1,
"Track Count" : 12,
"Play Count" : 2.5,
"Total Time" : 277267.3333333333,
"Time Since Last Played" : 3284605.947692871,
"Album Name" : "Achtung Baby",
"Album Artist" : "U2"
},
{
"Number of Composers" : 0,
"Title Length" : 18.57142857142857,
"Normalization" : 0,
"Skip Count" : 1.857142857142857,
"Track Count" : 14,
"Play Count" : 4.142857142857143,
"Total Time" : 238394.9285714286,
"Time Since Last Played" : 1307559.949102879,
"Album Name" : "U218",
"Album Artist" : "U2"
},
{
"Number of Composers" : 1,
"Title Length" : 21.27272727272727,
"Normalization" : 0,
"Skip Count" : 0.8181818181818182,
"Track Count" : 11,
"Play Count" : 6.727272727272728,
"Total Time" : 273663.9090909091,
"Time Since Last Played" : 817519.9762470722,
"Album Name" : "The Joshua Tree",
"Album Artist" : "U2"
},
{
"Number of Composers" : 1,
"Title Length" : 17.73076923076923,
"Normalization" : 3426.769230769231,
"Skip Count" : 1.692307692307692,
"Track Count" : 26,
"Play Count" : 2.307692307692307,
"Total Time" : 256631.5,
"Time Since Last Played" : 3545396.98051095,
"Album Name" : "The Best Of 1980-1990",
"Album Artist" : "U2"
},
{
"Number of Composers" : 0,
"Title Length" : 16.2,
"Normalization" : 0,
"Skip Count" : 1.6,
"Track Count" : 10,
"Play Count" : 9.9,
"Total Time" : 239879.6,
"Time Since Last Played" : 2331652.98220396,
"Album Name" : "Catching Fire",
"Album Artist" : "Various Artists"
},
{
"Number of Composers" : 0,
"Title Length" : 28,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 1,
"Play Count" : 1,
"Total Time" : 138331,
"Time Since Last Played" : 16794691.95169902,
"Album Name" : "Sunshine (Music from the Motion Picture)",
"Album Artist" : "Various Artists"
},
{
"Number of Composers" : 0,
"Title Length" : 18.5,
"Normalization" : 3980,
"Skip Count" : 1.5,
"Track Count" : 2,
"Play Count" : 3.5,
"Total Time" : 271790.5,
"Time Since Last Played" : 1906614.952522993,
"Album Name" : "Mirror's Edge Original Videogame Score (EA™ Games Soundtrack)",
"Album Artist" : "Various Artists"
},
{
"Number of Composers" : 0,
"Title Length" : 11.33333333333333,
"Normalization" : 9942,
"Skip Count" : 0.6666666666666666,
"Track Count" : 3,
"Play Count" : 4.333333333333333,
"Total Time" : 256921.6666666667,
"Time Since Last Played" : 4318851.969838142,
"Album Name" : "Need For Speed: Hot Pursuit OST",
"Album Artist" : "Various Artists"
},
{
"Number of Composers" : 1,
"Title Length" : 16.36842105263158,
"Normalization" : 2726.263157894737,
"Skip Count" : 1.210526315789474,
"Track Count" : 19,
"Play Count" : 3.526315789473684,
"Total Time" : 225017.2631578947,
"Time Since Last Played" : 691594.9926710129,
"Album Name" : "Wicked: Original Cast Recording",
"Album Artist" : "Wicked Original Broadway Cast"
},
{
"Number of Composers" : 1,
"Title Length" : 13.88888888888889,
"Normalization" : 0,
"Skip Count" : 0,
"Track Count" : 9,
"Play Count" : 1.555555555555556,
"Total Time" : 224184.8888888889,
"Time Since Last Played" : 3112469.952916145,
"Album Name" : "rose ave.",
"Album Artist" : "You+Me"
},
{
"Number of Composers" : 0,
"Title Length" : 10.75,
"Normalization" : 0,
"Skip Count" : 0.1666666666666667,
"Track Count" : 12,
"Play Count" : 4.666666666666667,
"Total Time" : 239094.1666666667,
"Time Since Last Played" : 784272.9643349648,
"Album Name" : "Vessel",
"Album Artist" : "twenty one pilots"
},
{
"Number of Composers" : 0,
"Title Length" : 10.53333333333333,
"Normalization" : 135.2666666666667,
"Skip Count" : 0.06666666666666667,
"Track Count" : 15,
"Play Count" : 4,
"Total Time" : 222623.6666666667,
"Time Since Last Played" : 783471.9908471107,
"Album Name" : "Blurryface",
"Album Artist" : "twenty one pilots"
}
]
function trianglePoints(radius, centreAngle, angleSize) {
var halfRadius = radius * 0.5;
var points = [];
var innerPoint = [-halfRadius * cos(centreAngle), -halfRadius * sin(centreAngle)];
points.push(innerPoint);
var innerAngleSize = angleSize * 0.5;
var pointB = [innerPoint[0] + radius * cos(centreAngle - innerAngleSize), innerPoint[1] + radius * sin(centreAngle - innerAngleSize)];
points.push(pointB);
var pointC = [innerPoint[0] + radius * cos(centreAngle + innerAngleSize), innerPoint[1] + radius * sin(centreAngle + innerAngleSize)];
points.push(pointC);
return points;
}
/*
* val8 is an array of 8 numbers that range from [0,100]
* size is the number of pixels for width and height
* use p5.js to draw a square color glpyh within the bounding box
*/
function glyph8(values, size) {
//values[0] is rotation of triangles.
//values[1] is the triangle spread
//values[2] is circle stroke weight
//values[3] is the triangle weight
//values[4] is the saturation of the background.
//values[5] is the saturation of the triangles
//values[7] is the ellipse spacing
var drawFunction = ellipse;
push();
colorMode(HSL);
rectMode(CENTER);
ellipseMode(CENTER);
scale(size, size);
strokeWeight(1.0/size, 1.0/size);
var backgroundColour = color(359, values[4], 43);
var ringColour = color(0, 0, 0);
var triangleColour = color(215, 0.88 * values[5], 55);
fill(backgroundColour);
drawFunction(0.5, 0.5, 1.0, 1.0);
noFill();
stroke(ringColour);
var ringWeight = map(values[2], 0, 100, 0.1, 1.25);
strokeWeight(0.5/8.0 * ringWeight);
var goldenRatio = 1.61803398875;
var exponentialStopStep = 1.0 / 17.94427191000132; //to make the last stop be at 1.
var exponentialStop = exponentialStopStep;
for (var i = 0; i < 4; i += 1) {
var linearStop = 0.2 + 0.2666666667 * i; //to make the last stop be at 1.
var diameter = lerp(linearStop, exponentialStop, values[7] * 0.01);
drawFunction(0.5, 0.5, diameter, diameter);
exponentialStop += exponentialStop * goldenRatio;
}
var triangleStroke = map(values[3], 0, 100, 0.008, 0.065);
strokeWeight(triangleStroke);
var triangleSpacing = map(values[3], 0, 100, 0.04, 0.15);
var triangleAngle = map(values[1], 0, 100, radians(45), radians(100));
var scaleXY = map(values[0], 0, 100, 0.6, 1.0);
var translation = (1 - scaleXY) * 0.5;
translate(translation, translation);
scale(scaleXY, scaleXY);
for (var i = 0; i < 4; i++) {
var centreAngle = radians(45) + radians(90) * i;
var startAngle = centreAngle - triangleAngle * 0.5;
var endAngle = centreAngle + triangleAngle * 0.5;
var triangleRotationOffset = values[6] * PI * 0.005;
{
push();
stroke(ringColour);
var triangleCentreX = 0.5 + 0.25 * cos(centreAngle);
var triangleCentreY = 0.5 + 0.25 * sin(centreAngle);
translate(triangleCentreX, triangleCentreY);
var adjustedCentreAngle = centreAngle + triangleRotationOffset;
var pointsOuter = trianglePoints(0.44, adjustedCentreAngle, triangleAngle);
triangle(pointsOuter[0][0], pointsOuter[0][1], pointsOuter[1][0], pointsOuter[1][1], pointsOuter[2][0], pointsOuter[2][1]);
var pointsInner = trianglePoints(0.44 - 2 * triangleSpacing, adjustedCentreAngle, triangleAngle);
triangle(pointsInner[0][0], pointsInner[0][1], pointsInner[1][0], pointsInner[1][1], pointsInner[2][0], pointsInner[2][1]);
strokeWeight(triangleStroke * 0.8);
stroke(triangleColour);
var pointsMiddle = trianglePoints(0.44 - triangleSpacing, adjustedCentreAngle, triangleAngle);
triangle(pointsMiddle[0][0], pointsMiddle[0][1], pointsMiddle[1][0], pointsMiddle[1][1], pointsMiddle[2][0], pointsMiddle[2][1]);
pop();
}
}
pop();
}
<head>
<script src="http://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.3/p5.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.3/addons/p5.dom.js"></script>
<script language="javascript" type="text/javascript" src=".purview_helper.js"></script>
<script language="javascript" type="text/javascript" src="glyph.js"></script>
<script language="javascript" type="text/javascript" src="sketch.js"></script>
<style>
body { padding: 0; margin: 0; }
.inner { position: absolute; }
</style>
</head>
<body style="background-color:white">
<div class="outer">
<div class="inner">
<div id="canvasContainer"></div>
</div>
</div>
</body>
//
// main.swift
// iTunes Plist to JSON
//
// Created by Thomas Roughton on 6/10/16.
// Copyright © 2016 Thomas Roughton. All rights reserved.
//
import Foundation
var library = NSDictionary(contentsOfFile: "/Users/Thomas/Music/Music Library.xml")!
var tracksDict = (library["Tracks"] as! NSDictionary).mutableCopy() as! NSMutableDictionary
for (key, value) in tracksDict {
if let value = value as? NSDictionary {
var copy = value.mutableCopy() as! NSMutableDictionary
for (innerKey, innerValue) in value {
if let innerValue = innerValue as? Date {
copy.setValue(innerValue.timeIntervalSince1970, forKey: innerKey as! String)
}
}
tracksDict.setValue(copy, forKey: key as! String)
}
}
let tracks = (tracksDict.allValues as! [Dictionary<String, Any>]).filter { (dict) -> Bool in
return (dict["Podcast"] == nil) && (dict["Genre"] as! String?) != "Voice Memo" && dict["Movie"] == nil && dict["Has Video"] == nil
}
var albums = [String : [[String : Any]]]()
for track in tracks {
guard let albumName = track["Album"] as? String else { continue }
var albumTracks = albums[albumName] ?? [[String : Any]]()
albumTracks.append(track)
albums[albumName] = albumTracks
}
func defaultConversion(_ obj: Any) -> Double {
if let obj = obj as? Double {
return obj
}
fatalError()
}
func averageValue(forKey key: String, inTracks tracks: [[String : Any]], conversion: ((Any) -> Double) = defaultConversion) -> Double {
var total = 0.0;
for track in tracks {
if let value = track[key] {
total += conversion(value)
}
}
return total / Double(tracks.count);
}
var albumData = albums.map { (albumName, tracks) -> [String : Any] in
var result = [String : Any]()
let playCountAverage = averageValue(forKey: "Play Count", inTracks: tracks)
result["Play Count"] = playCountAverage
let trackLengthAverage = averageValue(forKey: "Total Time", inTracks: tracks)
result["Total Time"] = trackLengthAverage
result["Track Count"] = Double(tracks.count)
var lastPlayDate = averageValue(forKey: "Date Added", inTracks: tracks); //Default to when the track was added if we haven't played it ever.
for track in tracks {
if let playDate = track["Play Date UTC"] as? Double, playDate > lastPlayDate {
lastPlayDate = playDate
}
}
var currentTime = Date().timeIntervalSince1970;
var elapsedTime = currentTime - lastPlayDate;
result["Time Since Last Played"] = elapsedTime
result["Normalization"] = averageValue(forKey: "Normalization", inTracks: tracks)
result["Skip Count"] = averageValue(forKey: "Skip Count", inTracks: tracks)
result["Album Name"] = tracks.first!["Album"]
result["Album Artist"] = tracks.first!["Album Artist"] ?? tracks.first!["Artist"]
result["Title Length"] = averageValue(forKey: "Name", inTracks: tracks, conversion: {
return Double(($0 as! String).characters.count)
})
let characterSet = CharacterSet(charactersIn: ",&")
result["Number of Composers"] = averageValue(forKey: "Composer", inTracks: tracks, conversion: {
let composers = ($0 as! String).components(separatedBy: characterSet)
return Double(composers.count > 0 ? composers.count : 1)
})
//Skip count, normalisation (loudness), etc.
return result;
}
albumData.sort { (dictA, dictB) -> Bool in
return (dictA["Album Artist"] as! String) < (dictB["Album Artist"] as! String)
}
print(albumData)
let output = OutputStream(toFileAtPath: "AlbumInfo.json", append: false)!
output.open()
defer { output.close() }
var error : NSError? = nil
JSONSerialization.writeJSONObject(albumData, to: output, options: .prettyPrinted, error: &error)
//print(library)
var canvasWidth = 1920;
var canvasHeight = 1080; //Leave some space up the top for the toolbars.
var val_sliders = [];
var albums;
function preload() {
albums = loadJSON("AlbumInfo.json");
}
function setup () {
// create the drawing canvas, save the canvas element
var main_canvas = createCanvas(canvasWidth, canvasHeight);
main_canvas.parent('canvasContainer');
noLoop();
refreshGridData();
// alert(JSON.stringify(albums, null, 2));
}
function mouseClicked() {
redraw();
}
function dataInterpolate(data1, data2, val) {
var d = new Array(8);
for(var i=0; i<8; i++) {
d[i] = lerp(data1[i], data2[i], val);
}
return d;
}
var numGridRows;
var numGridCols;
var gridValues; // row, col order
var gridOffsetX, gridOffsetY;
var gridSpacingX, gridSpacingY;
var glyphSize;
// Generate data for putting glyphs in a grid
function clamp(num, min, max) {
return Math.min(Math.max(num, min), max);
}
function boundedMap(value, currentMin, currentMax, newMin, newMax) {
return constrain(map(value, currentMin, currentMax, newMin, newMax), min(newMin, newMax), max(newMin, newMax));
}
function albumToVariables(album) {
var variables = [];
//Triangle scale from centre:
var normalisation = album["Normalization"];
if (normalisation == 0.0) { //If we have no data.
normalisation = 2500; //Lower values seem to indicate a louder album, with a range of 0 to 10000. Modern songs tend to be pretty loud, so let's go for about 75% size.
}
variables.push(boundedMap(normalisation, 10000, 0.0, 0.0, 100.0));
//Triangle inner angle.
var trackLengthAvg = album["Total Time"];
variables.push(boundedMap(trackLengthAvg, 0.0, 60 * 1000 * 10, 0, 100)); // 10min is the maximum value for this.
//Circle line weight
var numTracks = album["Track Count"];
variables.push(boundedMap(numTracks, 0, 40, 0, 100)); //An album caps out at 40 tracks for the purposes of the visualisation
//(it sounds somewhat excessive, but, for instance, a soundtrack in my library has 46 tracks).
//Triangle border weight
var elapsedTime = album["Time Since Last Played"];
var elapsedDays = elapsedTime / 60 / 60 / 24;
variables.push(boundedMap(elapsedDays, 0, 365, 100, 0)); //If it's been a year since we've played anything on an album then it's probably not very popular.
//Red background saturation
var playCountAvg = album["Play Count"];
variables.push(boundedMap(playCountAvg, 0.0, 18.0, 0, 100)); //30 plays is considered 'a lot' – this is based on looking through the values for the songs in my library.
//Blue triangle saturation
var skipCount = album["Skip Count"];
variables.push(boundedMap(skipCount, 0.0, 4.0, 100.0, 0.0));
//Triangle rotation
var numberOfComposers = album["Number of Composers"];
variables.push(boundedMap(numberOfComposers, 1, 5, 0, 100));
//Ellipse spacing
var trackTitleLength = album["Title Length"];
variables.push(boundedMap(trackTitleLength, 4, 30, 0, 100));
return variables;
}
function bestDimensions(albumCount) {
var ratio = canvasWidth/canvasHeight;
var a = Math.round(Math.sqrt(albumCount * ratio));
var b = Math.ceil(albumCount / a);
/*
while (b != Math.round(b)) {
a += 1;
b = albumCount / a;
}
*/
return [max(a, b), min(a, b)];
}
function refreshGridData() {
var spacing = 18;
var dimensions = bestDimensions(albums.length);
numGridCols = dimensions[0] + 2; //This isn't really very mathematcially sound, but it looks good for the display size we want, so let's keep it.
numGridRows = dimensions[1];
var availableWidth = canvasWidth - numGridCols * spacing;
var availableHeight = canvasHeight - numGridRows * spacing;
glyphSize = min(availableWidth / numGridCols, availableHeight / numGridRows);
gridOffsetX = spacing * 0.5;
gridSpacingX = glyphSize + spacing;
gridOffsetY = spacing * 0.5;
gridSpacingY = glyphSize + spacing;
gridValues = new Array(numGridRows);
for (var i=0; i<numGridRows; i++) {
gridValues[i] = new Array(numGridCols);
}
var albumVariables = [];
for (albumIdx in albums) {
albumVariables.push(albumToVariables(albums[albumIdx]));
}
for (var i=0; i<numGridRows; i++) {
for (var j=0; j<numGridCols; j++) {
gridValues[i][j] = albumVariables[i * numGridCols + j];
}
}
}
var colorBack = [30, 30, 35];
function drawGridMode() {
var glyph_fn = glyph8;
push();
background(colorBack);
for (var i=0; i<numGridRows; i++) {
for (var j=0; j<numGridCols; j++) {
if (i * numGridCols + j >= albums.length) {
break;
}
resetMatrix();
translate(gridOffsetX + j * gridSpacingX, gridOffsetY + i * gridSpacingY);
glyph_fn(gridValues[i][j], glyphSize);
}
}
pop();
}
function draw () {
drawGridMode();
var mouseGridX = Math.floor((mouseX - gridOffsetX)/gridSpacingX);
var mouseGridY = Math.floor((mouseY - gridOffsetY)/gridSpacingY);
if (mouseGridX >= 0 && mouseGridX < numGridCols && mouseGridY >= 0 && mouseGridY < numGridRows) {
var index = mouseGridY * numGridCols + mouseGridX;
var album = albums[index];
var title = album["Album Name"];
var artist = album["Album Artist"];
fill(255);
text(artist + "\n" + title, mouseX, mouseY);
}
}
function keyTyped() {
if (key == '!') {
saveBlocksImages();
}
else if (key == '@') {
saveBlocksImages(true);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment