Skip to content

Instantly share code, notes, and snippets.

@tmcw
Created March 26, 2013 19:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tmcw/5248158 to your computer and use it in GitHub Desktop.
Save tmcw/5248158 to your computer and use it in GitHub Desktop.
var fs = require('fs');
var Canvas = require('canvas');
var songs = JSON.parse(fs.readFileSync('songs.json'));
var w = 2880, h = 1800;
var c = new Canvas(w, h);
var ctx = c.getContext('2d');
var artists = {}, i = 0;
var key = 'name';
var classes = songs.map(function(song) {
if (artists[song[key]]) {
return artists[song[key]];
} else {
return artists[song[key]] = i++;
}
});
var cl = classes.length;
function d3_hsl_rgb(h, s, l) {
var m1,
m2;
/* Some simple corrections for h, s and l. */
h = h % 360; if (h < 0) h += 360;
s = s < 0 ? 0 : s > 1 ? 1 : s;
l = l < 0 ? 0 : l > 1 ? 1 : l;
/* From FvD 13.37, CSS Color Module Level 3 */
m2 = l <= 0.5 ? l * (1 + s) : l + s - l * s;
m1 = 2 * l - m2;
function v(h) {
if (h > 360) h -= 360;
else if (h < 0) h += 360;
if (h < 60) return m1 + (m2 - m1) * h / 60;
if (h < 180) return m2;
if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
return m1;
}
function vv(h) {
return Math.round(v(h) * 255);
}
return [vv(h + 120), vv(h), vv(h - 120)];
}
var l = classes.length;
var rows = 100;
var perrow = l / rows;
var rowh = h / rows;
function x(c) {
return (c / perrow) * w;
}
classes.forEach(function(c, i) {
var rgb = d3_hsl_rgb(c, 0.5, 0.5);
ctx.fillStyle = 'rgb(' + rgb + ')';
var row = Math.floor(i / perrow);
var rowcut = row * perrow;
ctx.fillRect(x(i - rowcut), rowh * row, x((i - rowcut)+1), rowh * (1 + row));
});
fs.writeFileSync('names.png', c.toBuffer());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment