Tag Archives: projects

Get back… to Mixtapes

Recently I took the plunge on an older cassette deck. I say “older” instead of “old’ because of relativity; I’m older than the deck, and am not young, so to call a mid-1980s piece of technology “old” seems a bit hypocritical, if not outright cruel. Like all older stereo equipment that makes it to the auction block, it’s been used by others and evenutally rejected. This one plays and records but has a mysterious problem with the meters on playback. I decided I really didn’t care what the meters said on playback- it really only matters when you record. I received it intact and it makes good recordings. I’m glad, because I’ve been itching to get back into making honest to goodness mixtapes.

I spent decades making mixtapes. Most were utilitarian- so I could play a record in the car, or to play instead of the vinyl so as to not wear it out. But over time I thought of the work I did on mixtapes a labor of creativity, and the humble mixtape itself as an artform.

Yesterday I resolved to make my first all-vinyl mixtape in many years on this new-to-me tape machine. I dedicated a vintage, new in box TDK SA-90 from my stash. Considering the options and limitations caused a flood of old instincts and decisions to return to my mind. Firstly, the creative aspect: What’s the theme of this tape? Who and what will go on it? Then the practical matters: Should I compose each side to leave as little blank tape as possible? Or should I just wing it? I decided to wing it and choose a starting track, each subsequent song I chose a reaction to hearing the previous selection. To set the levels, I queued up the first song- “Return,” the first track from Emma Ruth Rundle’s miraculous 2021 album, Engine of Hell- hit Record (some decks require choosing Record AND Pause for setting levels), and checked out the peak on the meters. It looked just right- only occasionally spilling over from green into orange. (LED meters- I much prefer the old fashioned VU needles, but LEDs will do)- hit Pause, lifted the arm, set it back on precisely at the beginning, and pressed Play, which on this deck sets the deck back into Record mode. Let Rundle’s beautiful mournful voice and spare piano fill the room with its solemnity- hit Pause when it was complete. And so on.

Miraculously, spontaneously choosing the tracks resulted in nearly filling up the first side. It resurrected an old familiar feeling- that rush of anticipation near the end, wondering if you’d have to fade out the last song because you’ve run out of tape. If you peer in the little window where you see the tape reels, you can see the clear leader tape which appears at the beginning and ending of a reel of tape. it gives you about a two seconds to fade the last song out as smoothly as your motor control allows as you turn the recording level knob back to zero. But I lucked out and the last song ended within seconds of the end of the tape! I felt a joy I hadn’t for far too long.

So what about the theme? I’m one of those who likes to set themes based on a representative track, something about the track suggesting the theme. For this one I picked a line from Broadcast’s “Black Cat-” “Curiouser and Curiouser.” As I choose tracks, I myself am increasingly curious about where this tape is going to go, so the theme seems fitting. And where that is, we’ll find out today, when I finish.

It’s a marvelous thing, an excuse to really sit and listen to your collection, make choices about transitions and sequence, to be the navigator, just like a well-designed Spotify playlists, but through a peculiar, specific, meditating activity, producing an artifact accessible only to the chosen few who partake of this arcane medium. It’s been a cleansing ritual, I highly recommend it.

Winter project: daap radio station

In late October of last year, I had a tangle with gift wrap and a set of stairs, and I lost, breaking and dislocating my right ankle in the process. Ever since I’ve been stuck at home for the most part. First there was a the trip to the emergency room, where my broken, dislocated ankle was put back in proper position and put in a splint and cast. Next there was the surgery- added to my natural arsenal was a plate and some screws. Re-splint, re-cast. Finally, after enough time, I was told to wear a CAM boot, which incidentally weighs at least twice as much as a cast. So I’ve had a lot of time to consider my situation. (Actually not a lot of time- I made arrangements to work from home once I could sit in a chair and access a laptop.)

One thing I had wanted to experiment with was finding a way to improve my “radio station-” really just an FM transmitter connected to whatever was handy. I have a bit of a reputation in the neighborhood for providing a Christmas radio station. Being near the crest of a bluff, the reach of this little box is remarkably good, spanning the immediate area, neighborhoods downhill from us and even on the ridge across from us. So I feel a bit of pride and an obligation to maintain and improve.

Two Christmases ago I moved from Windows- basically an m3u playlist dragged and dropped onto Winamp and shuffled and looped from December through January. During that time, Winamp needed at least three restarts, and Windows 8 would cough up a hairball and die about once every two weeks. I had grown tired of tuning into the station only to hear dead air and realized it was time to up my tech game. I had this windows laptop around when I got the wild hair to play radio Santa and spent enough time compiling music for this project, let alone tweaking the setup. But I’d had enough.

At first it was a simple alternative. I wanted to use the same machine of limited capabilities, so it had to be very low resource. I installed Ubuntu and booted it straight into the console. I used a simple console player- MP3123- and invoked one command on startup, for MP3123 to play all of the files it found in a certain subdirectory. And it worked pretty well. No dead air. No restarts. But there was zero flexibility. playlist management consisted of adding and deleting files. And while I do have a few radios and even an FM tuner in my stereo, I really wanted to access the station in more modern ways.

Enter DAAP- Digital Audio Access Protocol. It’s most commonly known as the transport protocol used by iTunes. Fortunately, it also has wide platform adoption beyond Apple. What really sold it was finding a Linux daemon called daapd that supports MTP clients. One example of that is my ten-year old Roku Soundbridge, which has been gathering dust in a cabinet for a few years now. Another is an app in the play store. Yet others are a couple of Linux programs. So I could set up a server to make the playlist available via several devices; one of the less mobile ones can be the dedicated radio station device that will output right to the FM transmitter. So many bases covered!

forked-daapd supports these kinds of clients:

DAAP clients, like iTunes or Rhythmbox
Remote clients, like Apple Remote or compatibles for Android/Windows Phone
AirPlay devices, like AirPort Express, Shairport and various AirPlay speakers
Chromecast devices
MPD clients, like mpc (see mpd-clients)
MP3 network stream clients, like VLC and almost any other music player
RSP clients, like Roku Soundbridge

Here is a list of working and non-working DAAP and Remote clients. The list is probably obsolete when you read it 🙂

Client Developer Type Platform Working (vers.)
iTunes Apple DAAP Win, OSX Yes (12.1)
Rhythmbox Gnome DAAP Linux Yes
WinAmp DAAPClient WardFamily DAAP WinAmp Yes
Banshee DAAP Linux/Win/OSX No (2.6.2)
jtunes4 DAAP Java No
Firefly Client (DAAP) Java No
Remote Apple Remote iOS Yes (4.2.1)
Retune SquallyDoc Remote Android Yes (3.5.23)
TunesRemote+ Melloware Remote Android Yes (2.5.3)
Remote for iTunes Hyperfine Remote Android Yes
Remote for Windows Phone Komodex Remote Windows Phone Yes (2.2.1.0)
TunesRemote SE Remote Java Yes (r108)
(https://github.com/feihugao/forked-daapd)

I even had the closest I could imagine ME having for a host computer- a fresh install of Ubuntu Server 17.04 on a headless IBM desktop. I had already set up SSH and was working on it remotely to set it up. It was ready to be used for something fun. The only problem was it was in the basement on my bench. I was upstairs in a cast. So however I did this, it had to be completely remotely. A challenge!

The first challenge was how to copy files. I could set up an rsync command to clone the collection over to the remote machine. But I wanted to pick and choose as I went, and a facility for moving things around on the remote machine quickly if needed. So I installed an FTP server. All I had to do was install:

$ sudo apt-get install vsftpd

Installing forked-daapd

https://github.com/ejurgensen/forked-daapd/blob/master/INSTALL

If you are the lucky kind, this should get you all the required tools and
libraries:

sudo apt-get install \
build-essential git autotools-dev autoconf libtool gettext gawk gperf \
antlr3 libantlr3c-dev libconfuse-dev libunistring-dev libsqlite3-dev \
libavcodec-dev libavformat-dev libavfilter-dev libswscale-dev libavutil-dev \
libasound2-dev libmxml-dev libgcrypt11-dev libavahi-client-dev zlib1g-dev \
libevent-dev libplist-dev libsodium-dev libjson-c-dev libwebsockets-dev

Optional packages:

Feature | Configure argument | Packages
--------------------|------------------------|---------------------------------------------
Chromecast | --enable-chromecast | libgnutls-dev libprotobuf-c-dev
LastFM | --enable-lastfm | libcurl4-gnutls-dev OR libcurl4-openssl-dev
iTunes XML | --disable-itunes | libplist-dev
Device verification | --disable-verification | libplist-dev libsodium-dev
Live web UI | --with-libwebsockets | libwebsockets-dev
Pulseaudio | --with-pulseaudio | libpulse-dev

After installation, edit the configuration file, /etc/forked-daapd.conf.

Note that ‘sudo make install’ will not install any system files to start the
service after boot, and it will not setup a system user.

forked-daapd will drop privileges to any user you’ll specify in the
configuration file if it’s started as root.

This user must have read permission on your library (you can create a group for this and make the user a member of the group, for instance) and read/write permissions on the database location ($localstatedir/cache/forked-daapd by default).

If your system uses systemd then you might be able to use the service file
included, see forked-daapd.service.

Otherwise you might need an init script to start forked-daapd at boot. A simple init script will do, forked-daapd daemonizes all by itself and creates a pidfile under /var/run. Different distributions have different standards for
init scripts and some do not use init scripts anymore; check the documentation for your distribution.

For dependency-based boot systems, here are the forked-daapd dependencies:
– local filesystems
– network filesystems, if needed in your setup (library on NFS, …)
– networking
– NTP
– Avahi daemon

The LSB header below sums it up:

### BEGIN INIT INFO
# Provides: forked-daapd
# Required-Start: $local_fs $remote_fs $network $time
# Required-Stop: $local_fs $remote_fs $network $time
# Should-Start: avahi
# Should-Stop: avahi
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: DAAP/DACP (iTunes) server, support for AirPlay and Spotify
# Description: forked-daapd is an iTunes-compatible media server for
# sharing your media library over the local network with DAAP
# clients like iTunes. Like iTunes, it can be controlled by
# Apple Remote (and compatibles) and stream music directly to
# AirPlay devices. It also supports streaming to RSP clients
# (Roku devices) and streaming from Spotify.
### END INIT INFO

after starting play, press the “*” button. Options will come up. This works for photos and music

#!/bin/sh

# save new source playlist

#grab date
now=$(date +"%m_%d_%Y")

# check for new items by building new playlist based on date
find /srv/Music/ -iname "*.mp3" > playlist$now.m3u

# shuffle the playlist
shuf playlist$now.m3u -o stationlist.m3u
#reset perms
chmod 777 stationlist.m3u

add a cronjob to to the daapd user:

30 00 * * * /srv/Music/newplaylist.sh

Make sure the daapd user has access to the cache folder:

chown -R daapd:nogroup /var/cache/forked-daapd/

For this distro, I can just restart Cron and it will pick up the script schedule:

# service crond restart

That’s it! Now just find your server on your daap player and let it play!

This was a fun project, though I have subsequently moved on to another project with more radio station-type automation, but the daap server project saw me through that Christmas season with no hiccups at all.