“Now that’s one fine and classy, atmospheric, big room tool, son.” Here’s the data when you crawl Berlin electronic music shop Hard Wax for descriptive keywords.

Friend of the site (and one-time CDM Web developer) musician-and-hacker Olle Holmberg has crawled Hard Wax’s website. That’ll be the legendary record purveyor opened by Mark Ernestus back in 1989 in Kreuzberg, Berlin, and still a leading destination for vinyl lovers today.

hardwax.com has accordingly accumulated a lot of words about music on their Internet portal, since each time a release like this Drexciya side project comes out, you get a whole bunch of language, too.

Olle collected the most important words, and he’s shared his data set.

I wrote some Processing code to visualize all of this as a word cloud, and here’s what you get (details on how to do this yourself below):

Since the data is available as a CSV, you could probably refine it more. For instance, one flaw is that singular and plural versions of words aren’t combined, so the rankings are slightly off. “Banger” and “bangers” he’s manually combined so that one gets a solid ranking.

The top 25, with number of appearances in a description:

1. tool (1848)
2. atmospheric (974)
3. fine (941)
4. big room (928)
5. classy (904)
6. deep (872)
7. effective (858)
8. killer (858)
9. heavy (851)
10. leftfield (798)
11. minimalist (744)
12. original (734)
13. excellent (720)
14. crafty (647)
15. trips (598)
16. recommended (594)
17. raw (590)
18. spaced (585)
19. rooted (574)
20. hard (567)
21. dark (526)
22. banger/bangers (520)
23. excursions (516)
24. tripping (508)
25. leaning (506)

“It’s atmospheric, yet also a banging big room tool.”

Next challenges: build a random keyword generator, train some machine learning on this, or … try to make music that fits the most popular words?

Oh, and if you’re interested in the code, I’ve got that, too. I worked with free and open source, multiplatform artist-friendly coding tool Processing. (Other Web-based tools exist, too, but then you miss out on the fun and flexibility of coding things yourself.)

Ah, word clouds – remember when we thought those were the bee’s knees? (To misquote Douglas Adams, it harkens to a headier, more innocent time when we were “so amazingly primitive that we still thought word clouds were a pretty neat data visualization.”

Dan Bernier’s free library gives you some tools for free:
http://wordcram.org/

Here’s a simple code template to get you started, loosely inspired by Dan Shiffman and Dan Bernier examples:


import wordcram.*;
import wordcram.text.*;

Table table;
Word[] wordArray;
WordCram wordcram;

void setup () {
size(1280, 1020);
background(255);
table = loadTable("data.csv", "header");
int numRows = table.getRowCount();
wordArray = new Word[numRows];
int rowCount = 0;
for (TableRow row : table.rows()) {
float weight = row.getFloat("count");
String mWord = row.getString("phrase");
wordArray[rowCount] = new Word(mWord, weight);
rowCount++;
}
wordcram = new WordCram(this)
.fromWords(wordArray);
}

void draw() {
wordcram.drawAll();
}

It’s quite slow to run by comparison, but here’s the code that makes the record-shaped visualization:

// image source: https://commons.wikimedia.org/wiki/File:Disque_Vinyl.svg
// author: Muel, CC-BY-SA
// https://creativecommons.org/licenses/by-sa/3.0/deed.en

import wordcram.*;
import wordcram.text.*;
import java.awt.*;

Table table;
Word[] wordArray;
WordCram wordcram;

PFont georgia;

void setup () {
size(1000, 1000);
background(255);
PImage image = loadImage("vinylicon.png");
image.resize(width, height);

Shape imageShape = new ImageShaper().shape(image, #000000);
ShapeBasedPlacer placer = new ShapeBasedPlacer(imageShape);

table = loadTable("data.csv", "header");
georgia = createFont("Georgia", 1);
int numRows = table.getRowCount();
wordArray = new Word[numRows];
int rowCount = 0;
for (TableRow row : table.rows()) {
float weight = row.getFloat("count");
String mWord = row.getString("phrase");
wordArray[rowCount] = new Word(mWord, weight);
rowCount++;
}
wordcram = new WordCram(this)
.fromWords(wordArray)
.withFont(georgia)
.withPlacer(placer)
.withNudger(placer)
.angledAt(0)
.sizedByWeight(10, 90)
;
}

void draw() {
wordcram.drawAll();
save("wordcloud.png");
println("Finished.");
stop();
}

With both code examples, you’ll need to slightly modify the csv file. Open the file in a text editor and add this line to the top:

sep=;

And remember to add the data file, and the image file (if you use the shape variation), to your Processing sketch (Sketch > Add File).

If you want to check out Berlin’s record shops and you happen to make it to town, here’s a good guide. It’s impressively only a little bit dated in terms of locations – Berlin is a weird haven where record shops mostly survive. Hard Wax is a must. Space Hall has become a huge music venue. And digger heaven The Record Loft has recently reopened next to the Sonnenalle S-Bahn stop.

The definitive guide to Berlin’s best record shops [The Vinyl Factory]

If Olle’s name is familiar, it’s because he also crawled Berghain’s site, though we were later informed both by resident DJs and the booking office that the data crawled there wasn’t really representative. (Still, it was a fun project – and we did wind up learning more about Berghain booking data in the end. Science!)

Berghain, by the numbers: data on the relentless Berlin techno club

If you have any time left after tinkering with Processing, of course, go buy up some records!

https://hardwax.com/