PulseRoots is an interactive visualization of the evolution of electronic music. It presents the complex web of genres and subgenres as a hierarchical tree, allowing users to explore the history, characteristics, and sounds of electronic music through an intuitive interface.
Live Demo: https://mendiak.github.io/pulse.roots/
- Interactive Visualization: Choose between Tree, Radial, and Timeline layouts powered by D3.js.
- Deep Historical Context: Detailed descriptions and Wikipedia links for hundreds of genres.
- Curated Listening: Sample tracks via integrated Spotify embeds for every style.
- Music History Timeline: Explore 107 key milestones in electronic music history (1897–2024) — 47 events include external links to Wikipedia, official sites, and festival pages.
- Search & Discover: Find specific genres or use the "Shuffle" feature for random discovery.
- Responsive Design: Fully optimized for both desktop (interactive map) and mobile (accordion navigation).
- SEO Optimized: Dynamic sitemap generation and JSON-LD structured data.
- Frontend: HTML5, CSS3, JavaScript (ES6+), D3.js (v6), Bootstrap Icons.
- Data & Tools: Spotify Web API.
-
Clone the repository:
git clone https://github.com/Mendiak/pulse.roots.git cd pulse.roots -
Run Locally: Simply open
index.htmlin a modern web browser, or use a local server likeLive Serverin VS Code for the best experience.
The project's heart is data/pulseroots.genres.json. It follows a recursive tree structure:
{
"style": "Genre Name",
"description": "Historical and sonic description...",
"example": "Artist - Track Name",
"spotify_track_id": "Spotify_ID",
"wikipedia_url": "https://en.wikipedia.org/...",
"key_artists": [
{ "name": "Artist Name", "url": "Spotify_Artist_URL" }
],
"substyles": [
/* Recursive substyle objects */
]
}The project also includes data/music_history.json, a linear array of historical milestones used by the interactive timeline:
{
"date": "1994",
"fact": "The first Sónar festival takes place in Barcelona...",
"url": "https://sonar.es"
}date(string): Year of the event.fact(string): Description of the milestone.url(string, optional): External link to Wikipedia, official site, or related content.
build.js: Consolidates SEO and data maintenance. It generatessitemap.xmland all individual genre HTML pages in thegenres/directory based on the hierarchy indata/pulseroots.genres.json.- Usage:
node build.js
pulse.roots/
├── src/
│ └── js/ # ES6 modules (type="module")
│ ├── main.js # Entry point, orchestration
│ ├── state.js # Shared state between modules
│ ├── utils.js # Utilities (debounce, slugify, etc.)
│ ├── tree.js # D3.js tree visualization
│ ├── timeline.js # D3.js music history timeline
│ ├── panel.js # Genre info panel
│ ├── mobile-nav.js # Mobile accordion navigation
│ ├── search.js # Search with suggestions
│ ├── particles.js # Particle background
│ └── theme.js # Theme toggle, fullscreen, shuffle
├── data/
│ ├── pulseroots.genres.json # The database of genres
│ └── music_history.json # Historical music facts
├── assets/ # Images, icons, branding
├── genres/ # Generated genre pages (via build.js)
├── index.html # Main entry point
├── styles.css # Custom styling and responsive design
├── build.js # Build and maintenance script (Node.js)
├── package.json # Project metadata
├── contact.html # Contact page
├── privacy.html # Privacy policy
├── thanks.html # Redirection page for the contact form
├── sitemap.xml # SEO sitemap
├── sitemap.html # HTML sitemap
└── robots.txt # Robots exclusion
Contributions are welcome! Whether it's correcting a genre description, adding new substyles, or improving the visualization logic:
- Fork the repo.
- Create your feature branch.
- Submit a Pull Request.
This project is open source and available under the MIT License.
PulseRoots - Explore the roots, discover the sound.