WebMix: Webmonetization + Dj mixes for the next internet

Mark and Ian at Mozfest 2018

While recovering from Covid, I got a little time to finally sort out the WebMix idea which I also wrote up for Mozfest earlier in the year.

With the incredible and generous help of Mark Boas of Hyperaudio, I was able to use Hyperaudio lite to make clearly mark up a list of tunes in a DJ mix. Its what I’ve been looking to do for ages to move away from Mixcloud,

My finally setup was something I was playing with for ages but mainly via a self installed wordpress on my raspberrypi. I found problems when installing hyperaudio and in the end decided to go with a static website. I choose Publii as it had a linux client and I could just write the HTML easily (so many use markdown and other things, which would have made working with hyperaudio more difficult than it needs to be)

With the site creation out the way, I needed somewhere to host it.

Originally I was going to use Yunohost but I couldn’t find a simple webserver to just host the static files, instead I found a proxy server, which points at my NAS, which is running a very simple webserver. Of course the NAS has plenty of space, its also where the mixes sit, has a excellent redundancy and backup system.

The result of the experiment all sits here – https://cubicgarden.info/mixes

Digital Italics WebMix

The core part of WebMix (as I’m calling it) sits in hyperaudio’s transcript and webmontization support.

Hacking hyperaudio’s transcripts

Originally I always saw Hyperaudio for its ability to tie a knot between the written word and the audio (& video). It wasn’t till I saw a demo of the WebMon functionality is when I understood it could be the thing I need for DJ mixes.

With correctly written HTML, I can tell Hyperaudio what it should do, and with Mark’s help we had a prototype up and running.

Here is an example of the code from the quiver in the underground mix.

<li class="active" data-wm="$ilp.uphold.com/B69UrXkYeQPr">
<span data-m="0">Activator, I know you can (That kid chris mix) - Whatever girl</span></li>
<li data-wm="$ilp.uphold.com/3h66mKZLrgQZ"><span data-m="127000">Air traffic (Erik De Koning remix) - Three drives</span></li>
<li data-wm="$ilp.uphold.com/B69UrXkYeQPr"><span data-m="445000">Chinook - Markus Schulz pres. Dakota</span></li>
<li data-wm="$ilp.uphold.com/3h66mKZLrgQZ"><span data-m="632000">Opium (Quivver remix) - Jerome Isma-Ae &amp; Alastor</span></li>

Each tune has a time configured using the attribute data-m, this is  in milliseconds. As I have all the data in the old CUE files I created a long time ago. Mark helped me out with a nice script which saved me manually copying and pasting. (I also considered writing a XSLT to do the conversion). In between sleeping and relaxing with Covid, I got a number of mixes up, changed the theming and finally got to grips with the static file uploading process, and the results you can see on the site.

Current webmix site

Payment and royalties

You will also notice each tune/list item also has data=”wm” attribute with a $ilp (payment pointers). Currently they are pointing to myself and Mark Boas. Obviously I would change them to the payment pointers of the artists/producers/djs involved but I don’t know any which have them so far. Which leads nicely on to the next challenge for WebMix.

I did/do have a plan to do a mix with dance music from artists which have payment providers but that is still in the pipeline. Along side this, myself and Mark thought about some kind of database/airtable/spreadsheet/etc with payment pointers crossed linked to their discogs profile.

WebMix active on my site

Maybe this is something which could be done in the next grant for the web call for participation?

Back to the current experiment, here is Opium (Quivver Remix) – Jerome Isma-Ae Alastor. You could imagine one payment provider decided between all involved which could be used to pay for each time its played on the site. (I am very aware this is very simplex and the royalties of music is a total nightmare!) but the point of the payment pointer is to hide the complexity behind one simple payment pointer, how its divided afterwards is up to each of the parties involved. I’m imagining a management agent, organisation or even dare I say it DAO; responsible for the payment pointer. There’s already things like revshare, which means you can have multiple people/entities behind the payment pointer and theres interest in this space. Long tail economics certainly could benefit here.

Anyway its a long complex area which I’m best staying out of…?

The main point is its all working and expect more updates soon… I know Mark has other ideas, while I still need to get older mixes up. I also would like to tie the whole thing to something federated or at very least setup a activity-pub feed.

Maybe I should be more ill more often?

Replacing Mixcloud with Funkwhale

Funkwhale mixes

For a long while I have been threatening to leave Mixcloud in favour of hosting my own mixes. I looked around and thought funkwhale looks great as its a federated network for music. With some help from JonT, I started to scrape the metadata I stupidly forgot to keep for myself.

I installed Funkwhale on the Yunoserver but spent too much time trying to work out how to mount my NAS on the Yunoserver. I gave Navidrome but  decided it wasn’t right as there was no way to listen without logging in, so went back to Funkwhale and got things up and running.

Seems Funkwhale might not be the best solution for the mixes, plus the developer is looking for new maintainers recently. Its really setup for single tracks not mixes. I could upload mixes but my plan to use cue files, won’t work. The only place to put playlists is in the comments. I also need to do more digging as I can’t change the year of the mixes. More importantly, the public sharing is a bit broken for me. You should be able to listen to the radio but its not working for me

Funkwhale profile

As I get my head around it all but you can subscribe via RSS and if you’re using Mastodon or other fediverse applications, you can subscribe to this account: @digitalitalicmixes@mixes.cubicgarden.info.

Enjoy, I’m one step closer to self hosting my mixes.

A better way to listen to mixes online?

Funkwhale audio logo

For a while I have been thinking about leaving Mixcloud. Its nothing personal, I think its a great service for djs but its clear their business model is starting to interfere with the listening experience.

I had a thought about what Mixcloud do for me and decided these are the key things.

  1. Hosting the full mix with limited rights problems (unless you do something like play a track from the same author twice)
  2. The community of people and djs in one place
  3. Ability to see the actual tracks within the mix

With this in mind, I thought I’d see what else was out there as I’m lucky enough to be sitting on a large enough internet connection to host my own mixes and become a node on a larger decentralised network. If it was build like the fediverse, that could solve the community side too? After looking around for alternatives I found a new upstart called funkwhale. You may have seen I mention it recently in a previous blog.

Maybe 1 and 2 could be solved but what about 3?

The last part of the puzzle seemed to be the track problem, as you want seamless playback but get an idea of what you are listening to. Mixcloud does this via metadata, which you can create via a slider over the audio waveform. Some DJ systems create this for you like the Pacemaker for example but that metadata is lost in translation I found. If only there was a standard way to define areas of a mix without slicing the audio mix up?

For example, here is a ambient mix I liked recently.

Its by Tonepoet and even they have gone through the effort of adding this metadata to their personal site complete with timings. I do a similar thing but without the timings (which I really should have added since I had them all and entered them into Mixcloud manually.

I looked a number of things including a bunch of playlist formats including pls, m3u and xspf. Even looked at smil and asx to see if they would help, but their problem was player support. The issue seemed to be they all treated their smallest objects as physical files rather than subsets of files. I did buy into xspf thought it was close with this extension.

The extension element allows non-XSPF XML to be included in XSPF documents. The purpose is to allow nested XML, which the meta and link elements do not. xspf:playlist elements MAY contain zero or more extension elements.

<playlist version="1" xmlns="http://xspf.org/ns/0/" xmlns:cl="http://example.com">
  <extension application="http://example.com">
    <cl:clip start="25000" end="34500"/>
  </extension>
  <trackList />
</playlist>

Close but not quite right and player support for extensions was going to be low. This is when I rethought the problem with something like .nfo files and found .cue files. Here is an example…

REM GENRE Electronica
REM DATE 1998
PERFORMER "Faithless"
TITLE "Live in Berlin"
FILE "Faithless - Live in Berlin.mp3" MP3
  TRACK 01 AUDIO
    TITLE "Reverence"
    PERFORMER "Faithless"
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    TITLE "She's My Baby"
    PERFORMER "Faithless"
    INDEX 01 06:42:00
  TRACK 03 AUDIO
    TITLE "Take the Long Way Home"
    PERFORMER "Faithless"
    INDEX 01 10:54:00
  TRACK 04 AUDIO
    TITLE "Insomnia"
    PERFORMER "Faithless"
    INDEX 01 17:04:00
  TRACK 05 AUDIO
    TITLE "Bring the Family Back"
    PERFORMER "Faithless"
    INDEX 01 25:44:00
  TRACK 06 AUDIO
    TITLE "Salva Mea"
    PERFORMER "Faithless"
    INDEX 01 30:50:00
  TRACK 07 AUDIO
    TITLE "Dirty Old Man"
    PERFORMER "Faithless"
    INDEX 01 38:24:00
  TRACK 08 AUDIO
    TITLE "God Is a DJ"
    PERFORMER "Faithless"
    INDEX 01 42:35:00

Perfect, so I took one of mixes, Quiver in the underground and turned the .nfo file into a .cue file.

REM GENRE Tech Trance
REM DATE 2019
PERFORMER "Digital Italic"
TITLE "Quiver in the underground mix"
FILE "Quiver in the underground mix.mp3" MP3
TRACK 01 AUDIO
TITLE "Activator, I know you can (That kid chris mix)"
PERFORMER "Whatever girl"
INDEX 01 00:00:00
TRACK 02 AUDIO
TITLE "Air traffic (Erik De Koning remix)"
PERFORMER "Three drives"
INDEX 01 02:07:00
TRACK 03 AUDIO
TITLE "Chinook"
PERFORMER "Markus Schulz pres. Dakota"
INDEX 01 07:25:00
TRACK 04 AUDIO
TITLE "Opium (Quivver remix)"
PERFORMER "Jerome Isma-Ae & Alastor"
INDEX 01 10:32:00
TRACK 05 AUDIO
TITLE "Surveillance"
PERFORMER "Jordon Suckley & Kutski"
INDEX 01 15:24:00
TRACK 06 AUDIO
TITLE "Nitric (Division one remix)"
PERFORMER "Hybrid system"
INDEX 01 19:02:00
TRACK 07 AUDIO
TITLE "Circa-Forever (Galen Behr & Organ Nilsen remix)"
PERFORMER "Rapid eye"
INDEX 01 23:55:00
TRACK 08 AUDIO
TITLE "Opulence"
PERFORMER "Simon Patterson"
INDEX 01 30:05:00
TRACK 09 AUDIO
TITLE "J'ai envie de toi (Protoculture remix)"
PERFORMER "Armin Van Buuren presents Gaia"
INDEX 01 35:10:00
TRACK 10 AUDIO
TITLE "Z.I.T.A (M.I.K.E's progressiva mix)"
PERFORMER "Hiver & Hammer with Funabashi"
INDEX 01 39:30:00
TRACK 11 AUDIO
TITLE "Kubrick (Extended mix)"
PERFORMER "Jerome Isma-Ae & Alastor"
INDEX 01 42:01:00

Tried it out on a number of media player and they all worked except Plex.

There is a very good chance if I was to run my own funkwhale node/server I could set it to index .cue files and playback the mix in a seamless way like Mixcloud? Theres only one way to find out really… Get Funkwhale installed!

On a side note I am slightly kicking myself now because I entered all that metadata into mixcloud but never stored it myself. I’m going to need to go through 90 of my own mixes and convert my .nfo files into .cue files.

I have the SQLite Database for my pacemaker device with the actual real timings but I need to identify which mix is which one (another thing I should have done, as changed the names of the mix depending on many things). I also hoped mixcloud’s developers guide would come to the rescue but it looks like maybe a GDPR request is my only option if I want the metadata for my mixes?