Spotify Poster Generator

One song. Three ways to see it.

Type
Generative data art
Data
Six audio features, 114,000 stored records

The idea

A song’s audio features become something you can keep.

What began as an experiment with soft circles and ellipses has grown into three algorithms: Resonance, Pigment and Classic. Each reads the same six values through a different visual language, from sculpted filaments to rough paint and quiet geometry.

As It Was, one set of values, three algorithms.
Blinding Lights by The Weeknd in Pigment: loose coloured brushstrokes on cream paper with hand-drawn lettering.
Blinding Lights in Pigment: another song, another painting.

The data

The values don’t spread out evenly.

Before choosing a visual form, I looked at what each number says about a song. Four features use a 0–1 scale; loudness and tempo keep their own units. Replotted across all 114,000 records, acousticness concentrates near zero while energy leans high, so the mappings had to work where most songs actually sit.

Valence

Hover or tap a bar to see its value range, record count and percentage. Use the arrow keys to move between bars, Home or End to jump to the first or last bar, and Escape to dismiss the tooltip.Valence distributionA broad spread across the scale, with the average close to the midpoint. Histogram of 114,000 dataset records, showing the percentage in each 0.05 interval. Mean 0.47; population standard deviation 0.26.Share of records
A broad spread across the scale, with the average close to the midpoint.

Acousticness

Hover or tap a bar to see its value range, record count and percentage. Use the arrow keys to move between bars, Home or End to jump to the first or last bar, and Escape to dismiss the tooltip.Acousticness distribution42.3% of records fall below 0.1: a strong concentration at the less-acoustic end. Histogram of 114,000 dataset records, showing the percentage in each 0.05 interval. Mean 0.31; population standard deviation 0.33.Share of records
42.3% of records fall below 0.1: a strong concentration at the less-acoustic end.

Energy

Hover or tap a bar to see its value range, record count and percentage. Use the arrow keys to move between bars, Home or End to jump to the first or last bar, and Escape to dismiss the tooltip.Energy distribution72.0% of records score above 0.5, shifting the distribution toward higher energy. Histogram of 114,000 dataset records, showing the percentage in each 0.05 interval. Mean 0.64; population standard deviation 0.25.Share of records
72.0% of records score above 0.5, shifting the distribution toward higher energy.

Danceability

Hover or tap a bar to see its value range, record count and percentage. Use the arrow keys to move between bars, Home or End to jump to the first or last bar, and Escape to dismiss the tooltip.Danceability distribution75.4% of records sit between 0.4 and 0.8, concentrating around the middle. Histogram of 114,000 dataset records, showing the percentage in each 0.05 interval. Mean 0.57; population standard deviation 0.17.Share of records
75.4% of records sit between 0.4 and 0.8, concentrating around the middle.

Loudness

Hover or tap a bar to see its value range, record count and percentage. Use the arrow keys to move between bars, Home or End to jump to the first or last bar, and Escape to dismiss the tooltip.Loudness distributionLoudness clusters toward the louder end, with a long tail of quieter recordings. Histogram of 114,000 dataset records, showing the percentage in each 2.5 dB interval. Mean −8.26 dB; population standard deviation 5.03 dB.Share of records
Loudness clusters toward the louder end, with a long tail of quieter recordings.

Tempo

Hover or tap a bar to see its value range, record count and percentage. Use the arrow keys to move between bars, Home or End to jump to the first or last bar, and Escape to dismiss the tooltip.Tempo distribution80.7% of records fall between 80 and 160 BPM. The largest group is 120–130 BPM. Histogram of 114,000 dataset records, showing the percentage in each 10 BPM interval. Mean 122.1 BPM; population standard deviation 30.0 BPM.Share of records
80.7% of records fall between 80 and 160 BPM. The largest group is 120–130 BPM.

Classic

Six numbers, one abstract visual.

The first notebook sketches explored how a circle could hold several kinds of information at once. Colour, width, direction, offset, scale and layers each found a role: the outer ellipse, smaller coloured layers, an offset central circle, and a soft blur bringing them together.

Original notebook sketches exploring tempo as layers, valence as colour and loudness as circle size.
Original notebook sketches exploring danceability as offset, acousticness as width and energy as rotation.
Original valence diagram: a colour spectrum maps the emotional character of a track to colour.
Emotion becomes colour. Valence controls the hue, saturation and brightness of the composition.
Original acousticness diagram: a circle labelled Low Acoustic beside a narrow ellipse labelled Highly Acoustic.
Acousticness changes the ellipse's width: a rounder form at the low end, a narrower one at the high end.
Original energy diagram: a dot on a circular path and a curved arrow explain higher energy as higher torsion.
Energy sets the direction in which the shapes shift away from the centre.
Original danceability diagram: a dashed line from zero at the centre to one shows the inner circle moving outward.
A danceable track moves the inner circle farther from the centre, creating an offset composition.
Original loudness diagram: a large outer circle with an inner circle, annotated More Loudness equals Bigger the inner circle.
Loudness changes the size of the inner circle. A louder track gives it more visual weight.
Original tempo diagram: alternating blue and orange layers with the annotation High Tempo equals More Colours.
Tempo becomes layering. A faster track produces more overlapping coloured layers.
As It Was by Harry Styles in Classic: blurred coloured ellipses combine the six visual mappings in one poster.
As It Was in Classic.
Blinding Lights by The Weeknd in Classic: blurred coloured ellipses on white, shaped by a different set of values.
Blinding Lights in Classic.

Resonance

A moving form, a frame to keep.

Hundreds of fine filaments build a dimensional form, with seeded noise bending the geometry into folds and ribbons. Acoustic tracks lean toward an organic bloom, danceable ones form an orbit, and the rest become a folded current.

Resonance moves gently, with tempo influencing its pace. This animates the visual rather than playing the song or syncing to a beat, and a download saves the exact frame you paused on.

As It Was.
Blinding Lights.

Pigment

New variation, same data.

Washes, dry bristles, scraped colour and scattered flecks build a textured painting, with lettering drawn from an irregular, crayon-like alphabet. Energy adds strokes and roughens their edges; acousticness balances bleeding edges with dry bristles.

The song and edition number seed the composition, so the same pair always reproduces the same artwork. New variation changes only that seed. All six values stay intact.

Five editions of As It Was.
As It Was by Harry Styles in Pigment: loose, colourful brushstrokes on cream paper with hand-drawn lettering.
A saved edition, kept as a PNG.

Sandbox

Change a value. Watch what it does.

Search the included catalogue, or make the six inputs editable in Sandbox and see each one’s effect on the drawing. Here lowering energy and pushing acousticness up turns a closed ring into a many-lobed bloom.

Under the hood

A saved catalogue, a live drawing process.

Spotify originally made these audio features available through its API. After access was restricted for new apps in November 2024, I used a saved Kaggle dataset. The generator doesn’t analyse a recording or search Spotify live. Each renderer scales the stored values into drawing ranges and the browser draws the result on a canvas, with p5.js noise giving Resonance and Pigment their irregularity.

The project

Find a song. Take a poster home.

Try a style, make a new variation, and save a 1500 × 1500 PNG.