💁♀️ TLDR; performance streaming comes to richsoni.com
45 of my live music sets from 2016-2019 (885 tracks total) are now available as free streamable audio right here on richsoni.com!!! 🤘 This is every live audio recording I took during 2016-2019, and it includes memorable sets from Pine Island Brewing, Cricket Hill Brewery, The Fine Grind Coffee, amongst others.
To make this happen, a few new features have been developed into the site including: a builtin audio player, recording indicators within the Performances Directory and individual performance pages, and recording stats in the Songs Directory.
🤳 Screenshots of these new features are provided at the end of this post. 📸
Putting this all together took a lot of clever software development, and delicate consideration of the way my media archive is structured. It took many months to make it happen, and the rest of this post describes both why I invested so much effort into this project, and what I learned from it.
😸 Scratching Your Own Itch
A great way to build software is to start out by solving your own problems. You’ll be the target audience and you’ll know what’s important and what’s not. That gives you a great head start on delivering a breakout product
~ excerpt from 'Getting Real' by Jason Fried and David Heinemeier Hansson
Toward the end of 2011, my junior year of college, my friend Tadas Vilkeliskis sent me a free online pamphlet, 'Getting Real', which is full of pragmatic wisdom for executing software projects. It was written by the co-founders of Basecamp; the same folks that started the eminent web framework Ruby on Rails. Each section of 'Getting Real' is just a few paragraphs, but contains radical ideas like 'Meetings are Toxic', 'Forget Feature Requests', and 'Build Software for Yourself' (quoted above).
'Getting Real' has had a profound influence on how and what I work on, especially in regards to richsoni.com. Take the 'Build Software for Yourself' section as an example: Every feature and post on richsoni.com assumes myself as the primary audience. If I don't see value for myself, I don't do it.
The effort put into the new performance streaming features is not an exception to this heuristic. Indeed, the streaming feature set is probably the most useful software I have ever built for myself.
👾 Fixing Your Own Glitch
~ screenshot of https://richsoni.com/songs
The initial design for the Songs Directory table was inspired by https://bobdylan.com/songs which displays a table with a few interesting columns related to live performances: Times Played, First Played, and Last Played.
~ screenshot of https://bobdylan.com/songs
I was intrigued by this table because it answers some interesting questions:
- What are Dylan's most performed songs?
- What songs has Dylan played a lot recently?
- What songs have been performed only a few times?
- What songs have never been performed?
I wanted to answer those questions for my own performances, so I built a similar table into the Songs Directory of richsoni.com. This table is now a lynchpin in constructing setlists for my upcoming performances.
During this period I continued to stockpile audio recordings of my live performances. I had some new questions which would leverage data from those recordings:
- Which songs sounded the best at this venue?
- Which did not work?
- Which songs sound good when played next to each other?
- Which songs sound bad when played next to each other?
I always knew I wanted to do something with these recordings, but the effort involved was discouraging. To reliably ask these questions, I would have to simplify the process of archiving these recordings, as well as develop a way of easily publishing them into richsoni.com.
🗄 Archival & Publishing (From 1 Month to 1 Hour)
There are 2 hard problems in computer science: cache invalidation, naming things, and off-by-1 errors.
Computer Science Idiom (see TwoHardThings)
In Using SoX to improve Live Music Archive Publishing Latency, I outlined how automation reduced my archival latency from 1 month to 1 week. This allowed me to effectively catch up, and stay on top of archival problem.
This naming took a long time to get right, but since my archival process was fully automated, I could rerun the process as much as I wanted to. In computer science, we call that an idempotent process. Having something idempotent means you can tweak the formula, and rerun the entire thing to produce a determenistic result.
Long story short, it took a long time to tweak, but ultimately the solution I have for archival and publishing is very elegant. Perhaps in a future post I will outline the details of this process.
Below are the features developed to answer the questions listed above. This took a considerable amount of effort, which I will describe at a high level in the rest of this post.
🔈 Indicators in the Performances Directory
- The "Recordings" column has been added to the Past Performances table
- A speaker icon 🔈 is displayed in this column for performances with recordings
▶️ Indicators within each Performance
- Performances with recordings have an enriched Setlist section with playback controls
- The play ▶️ or playing 🔈 icon will be displayed if a song has streamable recordings, i.e., performances/2019-07-07-fine-grind
- Clicking a row with the play icon icon ▶️ will play the track
- Sets with multiple recording sources will include a dropdown to select an alternate source, i.e., performances/2019-07-07-fine-grind
⏮▶️ ⏭ The Audio Player
- When a track is playing, the Audio Player will appear at the bottom of the screen
- Playing will continue while navigating between pages within richsoni.com, so feel free to explore while you listen
Use the controls to move backward ⏮ or forward ⏭ between songs within the triggered playing context, i.e., performance page or song page Performance names and song names are also clickable
🎤 Performance Recordings on Song Pages
- Each song page includes a list of recordings organized by date
- Playing a song in this context will set the player to advance through each recorded version of that song
🎙 Stats in the Songs Directory
- The Songs Directory contains a new column, "Recordings Count", which displays the number of existing recordings for that song
- Just like all the other columns on this table, "Recordings Count" is sortable