Radio where the music matters

Posted by: pat 2 years, 9 months ago
Invisible airwaves crackle with life
Bright antenna bristle with the energy
Emotional feedback on timeless wavelength
Bearing a gift beyond price, almost free
One likes to believe in the freedom of music
But glittering prizes and endless compromises
Shatter the illusion of integrity, yeah

I enjoy listening to music on the radio.  You hear new things, and it can make for a shared experience you can discuss with friends.  I like some DJs.  Some DJs drive me nuts, especially the ones with "DJ voice" where there are odd sing-songy cadences and intonations.

I really don't like ads.  Especially the ones that become earworms taking up uninvited space in my brain.

I value offline listening.  I don't always have internet or FM reception.  And while I am a middle aged gen X dude who suffered permanent hearing loss during Seattle's Grunge era (too many nights at Squid Row, the Offramp, the Vogue, and then there was that one Big Black show at the Georgetown Steamplant...), I value audio quality and fidelity and try to maximize it when possible.  Life is too short to listen to crappy audio.

As an experimental personal technology project I am making automated scheduled digital recordings of FM radio and putting the recordings through a software pipeline that does the following:

  • Identifies the start and end time of voice and music segments
  • Removes the voice segments, leaving only music
  • Encodes the music as MP3 files, including some arbitrary fixed duration track segmentation so I can skip songs when I like
  • Tags the MP3 files with arbitrary artist, date, and track numbers based on the time of day the recording was made
  • Retains a rolling library of the past week of recordings

The one thing I don't have is any real song metadata.  No artist, album, genre, track names.  With additional effort I think this would be possible to accomplish, but in the meantime Shazam exists when I need to know what I'm listening to.

Is it ethical?

I'm an Eagle Scout.  I try to live my life by the Scout Oath and Law.  Trustworthy, loyal, helpful, etc.  Do a good turn daily.  This is important to me.  I think it is important when you are doing something different to look in the mirror and ask "am I the asshole?", especially when you are applying your privilege as a technologist to do something with someone else's intellectual property.

I've built this in a way where I am not burdening the FM radio stations with anything I am doing.  Streamripper exists and I could rip digital streams from the internet.  I'm not doing that.  I am only recording from the free over-the-air FM broadcast.

I also decided that since I am denying the stations of one member of their advertising audience, it is important from an ethical perspective to do something for them in return.  So I became a monthly donor to the station I record.

Is it legal?

I am not a lawyer, but I am pretty confident this is legal in the United States.  See the Audio Home Recording Act.

I also do this solely for my personal use.  I do not distribute or share my recordings in any way.  If you find this project interesting, you can probably replicate it for under $50 in parts.

Methods of FM radio recording

I mentioned quality matters to me.  Seattle has some challenges with FM radio reception, mostly multipath fragmentation/reflection due to the hills, or that's my layman's understanding.  This manifests as hiss.

I have a rooftop antenna that has been up there for over 20 years.  I use it with SageTV and the Comskip plugin to record local OTA HD television and remove the ads.  We don't watch a lot of local TV these days, but it is still nice for Saturday Night Live.  Depending on your situation a rooftop antenna is probably overkill, but I already had it so I used it.

I tested three methods of digital FM recording:

  1. Recording the analog output of a respected vintage FM tuner, the Marantz ST6000.  I record it using a Raspberry Pi with a HiFiBerry DAC+ ADC.  fmtunerinfo.com is a great site to learn about different FM tuners.
  2. Recording the "regular" FM broadcast using a USB software defined radio device and a Raspberry Pi
  3. Recording the digital FM broadcast, misleadingly branded as HD Radio, using a USB software defined radio device and a Raspberry Pi

All three methods work great and produce very listenable recordings.  Each has pros and cons.

For method #1 with the external FM tuner and ADC, the results are only as good as the tuner and antenna can make them.  If there is multipath or hiss, there isn't much you can do.  I didn't really explore processing the recordings to try to remove hiss, but that is possible.  The HifiBerry ADC is excellent and is overkill for this source.  It puts very minimal load on the Raspberry Pi, but this solution does require a Raspberry Pi while the others don't:  for the other two methods you could use an old laptop or run it on an existing desktop computer you may already own.  You also have to have the tuner on all the time, or put it on its own power timer, and if you want to record more than one station you need to manually switch stations on the tuner.  But, this does have the advantage of being the simplest method from the perspective of setting up the Raspberry Pi.  You don't need to clone any github repositories or compile or "make" the software yourself.  These aren't difficult things and they are all pretty well documented, but that's a hurdle for some people.  If you want to avoid all that this is technically the simplest to get running.  Well, it is simplest from the recording perspective, but the subsequent processing for any of these recording methods requires a bit of heavy lifting to build and setup the software.

Methods 2 and 3 require a SDR or software defined radio device.  Software defined radios are amazing.  One of my personal goals with this project was just to put my toes in that water.  You can listen to or record all kinds of stuff including pagers, police and fire radio, unencrypted baby monitors, weather faxes, marine AIS data, shortwave and ham radio...you name it, if it is whizzing through the air you can listen or record it.  And the more amazing thing is you can do it all simultaneously:  you can record *all* the FM radio broadcasts of the whole dial at one time.  You would need a lot of storage to do that...but some people do it.  I've read of some people who will take their SDR and a laptop to a location that has excellent reception, capture a whole range of frequencies to a hard disk, and take it home to their apartment where they get no reception and process and listen to it.  And many SDRs are really quite affordable.  The most popular SDR is the RTL-SDR.com model that started it all and can be had for about $30 on Amazon, or under $60 with a nice starter antenna kit.  There are better models. FM recording is pretty much kindergarten for SDR enthusiasts and YAGNI applies. A step up would be the Noelec NESDR v4 which is about $34.  A major step up, and required for my prefered recording method, is the Airspy HF+ Discovery (available from Airspy.us) which is $170.  Top of the line is the HackRF from Great Scott Gadgets, who is a frequent guest on one of my favorite podcasts, The Amp Hour.  But it is over $300 and super overkill for this project.  I don't have one of these.

SDRs are amazing but some of the software is a little on the bleeding edge.  I had a few re-dos on setting up the Raspberry Pi to make it all work in a headless method with no human intervention required for scheduled recordings.  There is a little learning curve.  Some of the support and community forums are populated by experts who live and breathe this stuff and are not always friendly to newbs.  More than once I was scolded with comments like "it sounds like you are just blindly copying and pasting things you found on the internet and don't know what you are doing" (true!) and "if you want to do that, you are going to need to code some C++" (untrue!).  It is all possible with existing open source software, and it does all work great once you get it running.

For method #2 I am using the Airspy SDR, mostly because it supports a really awesome piece of software that features some effective FM radio multipath handling to minimize the hiss.  The library is here:  https://github.com/jj1bdx/airspy-fmradion and is mostly maintained by some Japanese folks who seem super knowledgeable about all this stuff.  Much respect to Kenji Rikitake and the other contributors.  A wonderful example of the power of open source software.  That library only works with Airspy SDRs, so you need to pony up for the $170 Airspy SDR.  Maybe the $99 model will work too?  This is the method I settled on for my personal use.  The software has a long list of dependencies you need to compile and install.  It was by far the most work to install, including installing VOLK, the "Vector-Optimized Library of Kernels" which was a bit of a bear.  The installation instructions are sound and you will get there if you persist.  And you still need a good antenna setup as you are starting with the regular old analog over the air FM broadcast.

Method #3 is probably the sweet spot for most people.  With this method I recorded the digital "HD Radio" broadcast that is sent over the air.  Since it is a digital source, it has the major advantage of being entirely hiss-free.  But HD Radio is just a marketing label.  There is absolutely nothing High Definition about HD Radio.  It tops out at about 96kbps.  For me, it had the major disadvantage of compression artifacts that I could not un-hear once I noticed them.  Unacceptable!  It also has a hard requirement that you can only record a station that broadcasts HD Radio (not all do), and you must have a good enough signal and antenna to lock onto the digital HD Radio signal.  Not hard if you are in a city and put a minimal effort into setting up your antenna.  You could also tap into the song metadata that is included in these digital broadcasts to tag your MP3 files with real artist and song information, but I have not gone to that effort.  The critical piece of software required to do this is https://github.com/theori-io/nrsc5 which will work the the RTL-SDR SDR and any of its ilk, including the NOOELEC models.

I'm not going to get into the weeds of all the installation steps.  The software installation instructions mostly work well as documented.  Set aside a few hours for that VOLK tuning to run once it is installed.  Feel free to get in touch with me if you get stuck.  Overall I'd say get your SDR working at a basic level with its drivers installed and responding to simple diagnostic commands before trying to install the NRSC5 library of the Airspy-FMRadion library.

Scheduled recordings

My goal was scheduled recordings using cron that just run on a headless (no monitor or keyboard or mouse) Raspberry Pi with no daily intervention required.  It is a success.  Such a success that I struggled to even remember the hostname I setup on the Raspberry Pi to get back into it and recall exactly how I had it setup so I could write this section of this blog post.  It just runs.

This is the script that I run as a daily cron job to record using the Airspy SDR with the airpspy-fmradion library:

#!/bin/bash

for i in 1 2 3
do
 today=`date '+%m-%d'`;
 filename="/home/pi/recording/showname-${today}-${i}.wav"
 timeout 3600 /usr/local/bin/airspy-fmradion -m fm -t airspyhf -q -c freq=90300000,srate=768000,hf_att=0 -U -E36 -W $filename
 cp $filename /mnt/files/radio/recorded
 rm $filename
done

This produces three one-hour long wav files.  The files have a filename like showname-date-1.wav  (-2 for the second hour, -3 for the third hour).  The file naming convention drives subsequent processing and the MP3 tags.

That's it for the recording.  Now the magic happens!

Processing recordings

The processing pipeline can't run on the Raspberry Pi.  I tried.  The key piece of the puzzle is a nifty python library I found that uses TensorFlow machine learning with a pre-trained corpus to do the segmentation of voice vs. music.  And boy that thing is resource-intensive.  Maybe you can get it running on the Pi if you chop the recordings up into smaller lengths than one hour.  I ran into the problem of needing it to be 64 bit in order to allocate enough memory, which is a non-starter on the Pi.

I happen to have a home server that I use for a handful of VMs fulfilling different utility purposes including our home SageTV DVR software, a Squeezebox music server, and a home security camera Windows VM running Blue Iris.  But the biggest VM is a Ubuntu server with a RAID-Z2 ZFS file system for backup storage, photos, media, and general file storage.  ZFS is a bit of a memory hog, so this VM has 32GB of RAM and 4 virtual processors allocated.  The server has a Xeon Silver 4214 12 core processor with 64GB ECC RAM.  Not exactly your every day piece of kit laying around waiting to be repurposed.  I used what I had, and it can handle this load.  You can probably get this working on a lesser rig like a spare laptop, but you will want 64 bit Ubuntu and a goodly amount of RAM.

There is a python library calleg Speechsegmenter that does this heavy lifting of identifying speech vs. music.  Find it here:  https://github.com/ina-foss/inaSpeechSegmenter

The cron job on this VM kicks off 6 minutes after each hour, to allow the recordings to finish before it starts.  It just picks up whatever files it finds, processes them, and then cleans up.

#!/bin/bash

find /tank/music/radio* -atime +7 -exec rm {} \;

source "/home/pat/speechsegmenter/env/bin/activate"

nice -n 10 /home/pat/speechsegmenter/env/bin/python /home/pat/speechsegmenter/radio.py

for f in /tank/files/radio/recorded/*.edit; do
 file=$(basename $f)
 wav="${file%.*}"
 base="${wav%.*}"
 echo "wav ${wav} base ${base}"
 i=1
 while read edit; do
  tracknum=$(printf "%02d" $i)
  /usr/bin/sox ${f%.*} /tank/files/radio/split/${base}-${tracknum}.wav trim ${edit}
  i=$((i+1))
 done <$f
 mv $f /tank/files/radio/archive
 mv /tank/files/radio/recorded/${base}.wav /tank/files/radio/archive
done

for f in /tank/files/radio/split/*.wav; do
 file=$(basename $f)
 wav="${file%.*}"
 base="${wav%.*}"
 echo "wav ${wav} base ${base}"
 /usr/bin/ffmpeg -i "$f" -vn -ar 44100 -ac 2 -channel_layout stereo -b:a 192k /tank/music/radio/"${base}.mp3";
done
mv /tank/files/radio/split/* /tank/files/radio/archive

/home/pat/speechsegmenter/env/bin/python /home/pat/speechsegmenter/tagger.py

find /tank/files/tag/archive* -mtime +10 -exec rm {} \;

I break all that down as:

  1. Delete all of the final processed mp3 files older than a week
  2. Run the recorded wav files through speechsegmenter python library.  I'll get into the radio.py script below.  It runs in a virtual Python environment so my Ubuntu VM doesn't get mucked up.  I run it under "nice" so that although it is CPU-intensive, it doesn't disrupt the other more important things happening on the server.  Speechsegmeter produces a series of time-coded segments identifying speech vs. music.  It actually differentiates male from female speech, but I just treat anything not music as something to be removed.
  3. The first for loop does some munging of the speechsegmenter output to create commands for sox, a general purpose audio utility that can cut wave files up based on start time and duration.
  4. The second for loop takes those wav files that now contain only music and encodes them to mp3 files using ffmpeg
  5. The taggery.py script tags the mp3 files with the show name, radio station, date, and the tracks are just named track 1, track 2, and so on

Here is the radio.py Python script that does the segmentation:

from inaSpeechSegmenter import Segmenter
import os

seg = Segmenter()
directory = r'/tank/files/radio/recorded/'

for filename in os.listdir(directory):
    if filename.endswith(".wav"):
        segmentation = seg(directory + filename)
        musicStart = 0
        music = False

        with open(directory + filename + '.edit', 'w') as editFile:
            for s in segmentation:
                label = s[0]
                start = s[1]
                end = s[2]
                print(f"{label} from {start} to {end}")
                if label != "male" and label != "female":
                    if music == False:
                        musicStart = start
                        music = True
                    if (end - musicStart > 120):
                        editFile.write(f"{musicStart} ={end}")
                        editFile.write("\n")
                        musicStart = end;
                else:
                    if music == True and start - musicStart > 10:
                        editFile.write(f"{musicStart} ={start}")
                        editFile.write("\n")
                    musicStart = 0
                    music = False

and the tagger.py script, which uses the eyed3 python library to do mp3 tagging is:

import eyed3
import os
import urllib.request
from pathlib import Path

directory = r'/tank/music/radio/'
files = os.listdir(directory)
sorted_files = sorted(files)
lastshow="nothing"
lastday=0
track=1
for filename in sorted_files:
    if filename.endswith(".mp3"):
        basename = Path(filename).stem
        print(filename)
        audiofile = eyed3.load(directory + filename)
        show=basename.split('-')[0]
        day=basename.split('-')[2]
        if show != lastshow:
            lastshow = show
            track=1
        if day != lastday:
            lastday = day
            track=1
        if show == "morning":
            audiofile.tag.artist = "The Morning Show"
            audiofile.tag.album = "MS " + basename.split('-')[1] + "-" + basename.split('-')[2]
        if show == "afternoon":
            audiofile.tag.artist = "The Afternoon Show"
            audiofile.tag.album = "PM " + basename.split('-')[1] + "-" + basename.split('-')[2]
        if show == "midday":
            audiofile.tag.artist = "The Midday Show"
            audiofile.tag.album = "Mid " + basename.split('-')[1] + "-" + basename.split('-')[2]
        if show == "drivetime":
            audiofile.tag.artist = "Drive Time"
            audiofile.tag.album = "DT " + basename.split('-')[1] + "-" + basename.split('-')[2]

        audiofile.tag.genre = "Radio"
        audiofile.tag.album_artist = "Station"
        audiofile.tag.title = "Track " + str(track)
        audiofile.tag.track_num = str(track)
        track=track+1

        audiofile.tag.save()


contents = urllib.request.urlopen("http://192.168.0.196:9000/settings/index.html?p0=rescan").read()

Folks in Seattle have probably figured out what station I am recording by now.

I use a bogus genre of Radio as this makes it easier to pick these out from my media player client software.

The final line just hits a URL on my squeezebox server to rescan the media library.  This way, the four squeezebox players scattered around my home all are up to date within about 20 minutes after an hourly recording file is produced.

Results

This was a nontrivial project.  I hope someone else gets some utility from it.

Did I get what I expected?  That's an interesting question.  I achieved the technical goals, but I honestly have some mixed feelings about the results.

Radio is kind of special, and I've effectively neutered a component of it.  I have zero remorse about removing the ads and fundraiser promos and endless talk about the healing power of music.  And there are a few DJs whose voices I am glad to be rid of.

It is very nice to be able to skip tracks, and whole shows that just don't fit my vibe at a given point in time.  I'm not always in the mood to be taken on a musical journey or history lesson of the 1920's jazz roots of modern hiphop. Skip!

But I don't miss all the DJs.  I do have some favorite DJs and I do miss them.  I miss knowing what it is I'm listening to, and some of the context for how it was chosen.  There is also an immediacy of listening to radio live and knowing that you are listening to the same thing others are hearing at that moment.  My book club read The Beastie Boys book and there is a whole piece at the start where they talk about the power of FM radio in NYC where you could travel around the city and have the sounds of specific radio stations follow you around, coming out of open apartment and car windows and boomboxes.  Sort of like how some people cannot watch a recorded sporting event, the loss of this shared experience is...something.

read more / Comments

Deck Update

Posted by: pat 7 years ago

I've been hard at work trying to maintain my commitment to deck maintenance discipline.  I don't want to just flush all of the hard prep work I did this past summer down the drain due to lack of upkeep.

So far this year I give myself an A on leaf control.  My mantra has been "leaves are finite", a philosophy which gives me great comfort.  Heck, if I was so inclined I could count them.  It may feel like a Sisyphean task, but it really isn't.  Every leaf I rake, sweep, and collect is one less leaf I need to deal with later.  This results in more frequent leaf cleanup without fussing too much over completeness, as I know I will be hitting the rake again within 7 - 10 days.  This is as opposed to prior years when I may have packed all of the leaf cleanup into one or two mammoth sessions, by which time many of the leaves have begun to decompose and are more problematic to clean up.  And as it pertains to the deck, the less time organic matter is given to evolve into a self-sustaining organism of slime, the more likely I am to be able to avoid another labor-intensive scrubdown before applying stain in the spring.

I am also for the first time performing interim mild scrubbing of the deck.  I could see that natural forces of wind and rain were doing very little to remove the dirt from raccoon footprints and the drifts of pollen dropped from the birch trees.  If I don't lightly scrub and hose that stuff away, it is only going to breed and multiply.  And then there are the cruddlies, or "seedkins" as I guess they are officially known, which get packed in tightly to the cracks between decking where the crack is on top of a joist.

Anywho, here's the current state of the deck after diligent sweeping and a light maintenance scrub, as of November 18, 2017, just about exactly two months after the latest Penofin application.  You can see it is holding up fine at two months.  I give it another two or three months of looking this nice and then the decline will begin.

read more / Comments

Germany Trip Report

Posted by: pat 7 years, 2 months ago

With over a year of advanced planning, four different lodgings, and taxis, trains, subways, cable cars, and a rented van as transportation modalities, our trip to Germany to join in the celebration of a friend's birthday was probably the most complicated trip we've undertaken as a family.  I am happy to report it was worth every penny and every hour of planning!

It all began about 16 months ago when a good friend announced that his 60th birthday would be celebrated at Oktoberfest in Munich in late September 2017.  We were the first group to commit outside of his family.  I'll admit to having experienced moments of second-guessing the decision between then and now and having a few premonitions of concern over the actual Oktoberfest event, but it turned out to be such a great trip that we are already trying to figure out what future event we could use as an excuse to return.

We spent 5 nights in Munich, including 2 days at the Oktoberfest fairgrounds at the Theresienwiese.  This was followed by 3 nights at Hopfen am See where our hotel apartment had views of castles from every window.  We closed the trip with one night at the world's largest thermal bath / spa / waterpark, Therme Erding.

I relished the opportunity to dust off my diminished but not forgotten German skills.  I was transported right back to 1984 the first time a waiter said “nehmen Sie Platz!” (take a seat), the phrase that seemed to start every class in high school.

Munich

We took the train and subway from the airport to our centrally located VRBO lodgings in Munich.  This apartment came with a price premium at Oktoberfest, but we value being in walking distance of sights and good food.  It was quite spacious and had a huge tiled shower room and a lighting system and appliances we never quite figured out.  My German skills were immediately put to the test as the charming and elegant cleaning lady Litza, who spoke no English, walked us through the place.  When it came to the light switches she just seemed to say try the switch here, try it there, until you get them to work.

Light switches.  These were everywhere in the apartment, unlabeled, and many were 3-way switches linked to other switches

Lighting control system

Our first night out featured perhaps our worst meal of the trip, currywurst from a nearby restaurant.  Maybe it was because my constitution and appetite were all out of whack from jet lag, but the too-sweet sauce and the big dollop of mayo made me a tiny bit nauseous.  But currywurst was on my checklist for the trip, so at least that was resolved.  After dinner I led the family on a walk through our neighborhood, passing through the lovely Gärtnerplatz circle, the Viktualienmarkt food market (where we saw all kinds of great food we could have had rather than currywurst), the Marienplatz plaza, and finally a tour through the ever-lively Hofbräuhaus.

Kim woke early due to the jet lag and by the time I got up she warned me the coffee should be warmed up in the microwave.  OK I thought and went to do so only to have to inform her "That's no microwave!" but rather it is some kind of Miele steam oven with metal trays and a water reservoir.

On Friday we rented bikes from Mike's Bikes and rode through Englischer Garten.  Didn’t see any nude sunbathers, probably due to the cooling weather.  We stopped to watch the surfers.  When I pointed out a nearby rope swing over the river our eldest proclaimed we should go back for our swimsuits.  After a pause she added "or we could just strip naked and go now, because that's a thing here, right?"

We hit the Chinese Tower Biergarten just in time for lunch.  I had to explain to the girls how a Chinese Tower in Germany is not racist, and that political correctness and cultural appropriation are concepts you generally leave behind in the US.  We had a lovely afternoon sitting outside enjoying a Maß of helles bier for me, a radler (half helles, half sprite, and much better tasting than that might sound!), ribs, bratwurst, sauerkraut, schnitzel, cabbage salad, and other snacks.  That made for an interesting ride back as we proceeded to get a little lost, but luckily Kim got us going in the right direction and we recovered in time to hit our 3 hour rental return window.  We then overextended ourselves by taking on a visit to through The Residenz, the former royal palace of the Wittelsbach family.  The relics were particularly interesting, but overall we were a bit weary and cranky by the time we got through it.  And all of the signage indicating “this area was destroyed during the war and later recreated” kind of took the wind out of the sails for the whole historical authenticity thing.

Betty enjoying her first radler

Saturday the plan was to meet up with our friends at the Theresienwiese, the permanent site of Oktoberfest, to try to "casually” do Oktoberfest.  We weren't planning to try to squeeze into any of the big tents on a busy Saturday, just check out the rides and visit some of the small tents.  We got an earlier start and our friends got a later start, so we didn't end up seeing any of them until we met for dinner that evening.  We did a bunch of the rides starting with the Ferris wheel.  The girls were excited to have heard there would be almost 200 rides and were not disappointed.  The fun house rides were more my speed, providing inspiration for new Halloween decorations.  The girls finished by riding the Höhenrausch ride with some inebriated young men who spent most of the ride flipping each other off.  When it looked like the ride was all over, they all chanted ONE MORE TIME, ONE MORE TIME and unbelievably they were obliged with a second round.  This ride really did a number on the girls.  Afterwards we got into a table that was open for an hour in a small tent and had a light lunch of salad and chicken noodle soup, and I of course enjoyed a Maß of the Wiesn fest bier.  Went back to the apartment and crashed for naptime so the girls could recover from their ride.

The crowds are building on the main drag through the tent area

Nymphenberg Sekt is the huge wine tent on site.  That's right, Oktoberfest isn't just about bier

That evening we dined with the whole birthday group at the Paulaner Bräuhaus.  My friend has a nephew who lives in Munich and was just recently married.  He had made the arrangements.  As we entered we witnessed some skilled handling of a jolly but very drunk patron who needed to be ejected into a waiting taxi.  It was good to meet the folks with whom we would be spending Monday afternoon in the Lowenbrau tent.  I had my best meal of the trip, a crisp roasted ham hock or as they say auf Deutsch, a schweinshaxe or pork knuckle.  It was very crispy on the outside and juicy tender on the inside, and came with two different dumplings.  One was some kind of stuffing dumpling and the other a springy potato dumpling, which I didn't really care for.  We closed out with the first of many delicious apple strudels to be sampled on this trip.  The girls ordered the creme brulee which was the worst example of this dish I've ever encountered, so bad it could not be finished.  Imagine a creme brulee that is about 1/3 inch deep and 10 inches wide and dark brown in color where it should be creamy yellow.  

Sunday we took a day trip to tour Dachau.  It was very crowded as it was a weekend during Oktoberfest, but we did get into an English language tour.  I had visited Dachau on a trip in high school so it wasn't all new to me, but some of it was.  I had not recalled how many of the prisoners were Jehovah's Witnesses and that there were over 3,000 Catholic priests there.  And that there is no very little photographic evidence of the atrocities there:  just cleaned up propaganda photos from the Nazis and then the photos taken when it was liberated.  There was also quite a bit of discussion among the tour group regarding the brothel that operated briefly at Dachau, with one visitor making the leap to draw parallels to modern scandals of sex trafficking by UN security forces.

Sunday night we ate at Der Pschorr, a spot across from the Viktualienmarkt food market near our apartment.  They serve an Edelhell which is poured by gravity feed from wood casks.  You can see the cold storage room in the cellar where they keep the kegs cool with blocks of ice.  We saw them tap a new cask with a massive wood mallet that just drives the big tap spigot into the cask, ejecting the bung into the beer inside the keg.  Then the beer comes gushing out to fill, fill, fill a constant stream of glasses.  Kim had a goulash that she declared to be one of the best restaurant meals of her life, and we closed the evening with some fine apfel strudel.

Wood casks chilling in Der Pschorr's Holzfasskeller (literally, "wood keg celler")  Note the use of ice blocks

Oktoberfest at the Löwenbräu Tent

Monday was the big day.  We had to shift lodgings to the Arthotel near the train station for our last night in Munich.  We checked out of the VRBO and schlepped our bags through the subway to the main train station and then to drop them in the hotel's baggage storage room.  Then it was a short walk back to the Theresienwiese grounds where we met up with the group and marched into the tent for our 12:00 - 4:30 shift.  We had two tables for a total of 20 seats, and each seat came with vouchers for two liters of bier and a half roast chicken.

It turned out you can use these vouchers for any other food or drink of equal or lesser value.  Some pooled their vouchers and got a massive mixed meat tray with pork knuckles, various sausages, and duck.  Cathy used a bier voucher for a liter of soda.  I stuck with the chicken, which was delicious but not really much different from a good grocery store rotisserie chicken.  Like most dishes in Germany it was literally what it said it was:  half a chicken, no more and no less.  No veg or garnish or anything on that plate but half a chicken.  We spent the whole trip a bit under-vegged in our diet and had to start ordering salads with everything in order to get some balance.

I had some apprehensions about this whole fest tent affair.  I am not a fan of crowds in general, and especially jam packed tight crowds.  I feared it was going to be butts to nuts packed in there and you would have to plan 20 minutes ahead of time to pee, and then they might give your seat away while you were doing so.  I also had an expectation that there were going to be a bunch of songs the audience sings along with and does hand motions to such as the Airplane Song, and that not wearing lederhosen would be a big mistake.  And I had 16 months for these anxieties to stew between committing to the trip and sitting down in that tent.  Looking back, it is a little unbelievable to recall part of me was thinking "it is just 4 hours, you can get through anything for 4 hours."  I guess I am a bit of a worry wart but anyone who knows me could tell you that.

All those concerns evaporated within about 10 minutes of entering the tent.  What a great time.  Being a Monday afternoon, it wasn't really crowded.  It did get full but never felt overwhelmingly so.

Same hair stylist?

Adjacent to our group was a table with 10 young ladies all in festive attire.  At one point I noticed them passing around a small glass vial from which they poured white powder onto the backs of their hands and snorted.  It all seemed a bit too out in the open to be anything illicit, but what could it be?  After it made the rounds you could see their eyes were watering and they were all a bit energized.  Snuff seemed an obvious answer except for the color.  Apparently one of our group chatted with them and confirmed it was snuff.  And after searching the internet I see that white snuff exists.  Who knew?

I bought two official Oktoberfest fidget spinners, thinking they might make cool prizes to give my students.  What a dumb idea.  They have little beer steins on them which pretty much makes them inappropriate to give to 12 year students.  Later I redeemed myself by purchasing one of the wonderful new-this-year robotic chicken hats.  Again, I justified my purchase by envisioning its use to inspire my robotics students.

 

Happy owner of a new chicken hat!

I particularly enjoyed my conversations with the locals who were part of our group, including a strong validation of our choice to end the trip at Therme Erding, and some nuanced discussion of the German election and the strains refugees are putting on the economy and German society.

Watch the video.  It's a good one.

It seems like now is a good time to comment on the beer.  I loved how the beer in Munich was integral to the culture, with the ubiquitous biergartens, and without any fussiness, pretension, or ceremony. The actual beer served in the tents and brew houses as the festival beer was quite different from what I had expected.  In the US when we think of an Oktoberfest beer we think of the amber Märzen style which features significant darker roasted malted barley than a Helles or most lagers.  In Munich the Helles style reigns, and I didn't find the Oktoberfest Wiesn or Festival beer in Munich to be terribly distinguished from the Helles also served there.  The Wiesn is perhaps a little breadier than the Helles.  Granted I don't have a very sensitive palate, but it was far lighter in body than any Märzen I've had.  Apparently the Märzen brewed by German breweries today is primarily for export and is more of a historical style out of favor in the modern domestic market, which is why it is what we think of for an Oktoberfest beer.  Well it turns out times have changed and we should revise our expectations of what the Oktoberfest style means, or maybe I was just ignorant and everyone else knows a modern Wiesn from a Märzen.  It was a bit of a personal epiphany.  I should also say that it was all delicious -- this is all just observation and not criticism.

We were very efficiently ejected promptly at 4:30. Once outside away from the din of the crowd I was delighted to discover that the chicken hat plays the chicken dance song and that the leg motions are in time with the song.  What a great hat!  We made our way to the Oide Wiesn or old-fashioned Oktoberfest, a separate area with a 3 euro admission charge.  This is the area focusing on family activities, folk dancing, and historic rides some of which are almost 100 years old.  It is so traditional that I was forbidden to wear my new chicken hat in the traditional fest tent.

This is the point at which the accounting for bier consumption gets a little fuzzy.  I am confident I ended up over 3 liters but probably less than 5.  There was also another round of traditional Bavarian meat dishes in there (sausages, pork knuckle, and duck).  I made friends with some neighbors at the next table, a group of musicians from Bamberg who have been attending every year for 15 years.  They offered me some snuff, and out of curioisity and a general sense of social manners I accepted a few taps on the back of my hand.  It woke me up with a bit of a jolt but that was about it.

I really enjoyed the music in both tents.  These are clearly skilled and hard-working musicians in tune with the crowd and venue.  There were no American pop hits in the traditional tent.  Our seats gave us a great view of the whole band including a woman who played trumpet and also sang duets with the band leader.  The birthday boy even got to take his daughter for a few spins on the folk dancing floor.

I took my leave of the group maybe around 9:30 or so, the last non-family-member to depart.  The lights of the rides at night were a great show, and I saw several casualties being handled around the exits from the fest, but no problems or sense of safety concerns at any time.  I did experience quite a bit of difficulty finding my way back to the hotel, partly because we had just moved there that day and I had only walked the route once coming in that day, but mostly due to my dead flat cell phone battery and reliance on its powers of navigation.  Oh, and my judgment may have been slightly impaired as well.  I spent about 45 minutes on what should have been a 15-minute journey, during which I had the opportunity to use my high school German skills a half dozen times to ask directions. I finally swallowed my pride, admitted defeat, and took a 5 euro taxi to the hotel.

That hotel room at the Arthotel confirmed every reason why we prefer to book apartments.  The cleanliness and quality were all great, as was the breakfast buffet, but there was barely room to turn around in this "quad" room.  For one night it was tolerable and the location was great for our requirements.

The next day I was amazed to hear that after I left, the few remaining members of our group went back to the Löwenbräu Tent, where apparently the whole tent was raucously dancing on the table tops, and then rode the Skyfall high altitude free fall ride.

Hopfen am See

Tuesday was to be a travel and recovery day.  We hopped in a nine-passenger rented van with our friends and took off south to our next hotel, Hartung’s Hotel Dorf at Hopfen am See, near Füssen and the famous castles of Neuschwanstein and Hohenschwangau.

We had a nice big two-bedroom apartment with great views across to the castles in the distance, framed by the alps.  It was a bit of a hike up and down the hill to the town and was very nice having the van available for our day trips.

We visited the castles one day, and the next day went to the nearby Tegelbahn where we rode the cable car up, hiked around, enjoyed lunch, bier, and strudel, and came back down to the bottom to do the summer luge ride.

On our last night in Hopfen am See we took a break from the typical Bavarian fare and visited an Italian restaurant.  Nothing too memorable except for our dessert order.  Kim and I both ordered the Kaiserschmarrn, the most expensive dessert on the menu, on a bit of a flyer.  I could decipher that there was going to be some apple sauce involved, and the use of the word “Kaiser” implied it must be something special, so why not take a chance?  This elicited an arched eyebrow and incredulous request for clarification from our server as he asked “Zwei Kaiserschmarrn?!?” as if to say “Madness!  who do you people think you are?!?”.  It was quite large and we were grateful for the opportunity to reduce our order to just one plate of diced up sweet bready pancake bits for dipping in apple sauce.

I'm just here to do my part for the Landwirtschaft!

View from our bedroom window

 

That white speck is a cat stalking rodentia.  Many fields featured resident feline guardians.

Help, we are feigning peril!

"the funny thing about regret is, it's better to regret something you have done, than to regret something you haven't done."  -Gibby Haynes

Our hotel had a bit of a spa / wellness focus with a pool, steam room, and two different saunas.  The girls were shocked to discover the pool has a “no playing” policy and were shushed for being too exuberant in their use.  They also developed a youthful attitude of scorn for the pool and spa habits of the elderly, and had their first exposure to a little mixed-gender nudity around the sauna area.  European adventure!

Therme Erding

Speaking of nudity…on our final day we were on the 8:00 AM train back to Munich and our last hotel, the Hotel Victory at Therme ErdingTherme Erding is a hot spring mineral baths / waterpark.  It claims to be the largest such spa facility IN THE WORLD!  No vacation is complete for us without a bit of swimming, and this place is within a 20 minute drive of the airport, so it seemed a perfect place to spend our last day before flying home in the morning.

We took the train to the airport and then a taxi to the hotel.  As we were making our way through the airport train station, some guy approached me and asked if we had just come from the city, and if so were we on a transit day pass and could he have it?  I suspect he is running a hustle where he gets these day passes from departing travelers and turns around and sells them for cash to arriving travelers.

When you check in to the hotel at Therme Erding they let you get your swimsuit out of your bag then they take your bags to your room and just issue you with bathrobes, towels, and a bracelet with an RFID chip for all access control and payments.  You can use the whole resort including the restaurants in your robe and swimsuit, and everything is cashless.

It is a huge complex.  I am guessing we only saw about 75% of it at most, and used less than 25%.  There was just too much for our short visit and much of it was a little intimidating.  There are few concessions to non-German speakers here, and we ended up feeling we stuck out a bit already with our hotel-issued bathrobes when 90% of the folks there were clearly locals with their own robes and towels.  Then there was the whole issue of grappling with the nude areas.

We hopped right into the wave pool before seeking out lunch.  As we ate lunch in our robes, Elizabeth complained about all of the music being too American just as a decidedly non-American song was played.  It was to become the girls' anthem for the trip, "Last Dance" by Swedish pop performer Rhys.  The chorus of "we gave it every godamned chance" sung in a saccharine cheery voice awkwardly spoke to it being a song by someone whose first language is not English.  Reminiscent of Bjork, ABBA, or a-ha.  It might be grammatically correct, but there is something quite dissonant with this turn of phrase.  Anyways the girls loved it and continued to employ this phrase at every godamned chance.

The girls loved the slide area which had over a dozen fun water slides, including some in the dark, some with floaty tubes to ride, and some extreme drops only for those over 15 (we didn’t try…they looked pretty intense).  We enjoyed drinks from the swim-up bars and floating through the crazy river with its soaking nooks, most of which were occupied by canoodling teen couples.

Kim and I visited the nude area where most of the 26 saunas are.  It also features the better restaurants, full of happy couples dining in just their robes and towels.  I’m not sure what the point is for having 26 different saunas.  To me a sauna is about having a decent wood bench to sit on and enjoy a specific temperature and humidity, and then the cooldown.  Many of the saunas were a bit too cool for me with temps under 70c.  We preferred the 80c Finnish sauna, one of about 8 saunas that are ringed around a cascading shower room of cold water falling from 20 foot high sculpted calla lilies.

There is also a Celtic Stonehenge sauna and the Russian Banya.  The saunas are not really that different from one another.  The differentiator seemed to be the cold water shower or plunge options that were paired with the sauna, the temperature of the sauna (too many were not really hot enough), and in some cases the addition of some scent or performance.  For example, in the Stonehenge area the sauna is pretty bog standard but when you want to cool off you have to wade through a rushing river in a dark rocky cave before standing under free falling gushes of cold water from a simulated subterranean waterfall.

People were naked in the pools and saunas, but very few just strolled around in their birthday suits.  Almost everyone was covered with a towel or robe except when entering or exiting whatever water or spa feature they had selected.

There is also yet another large pool area with swim-up bar and a nice recreation of a Roman villa with general naked lounging.  Oh, and there is a warm nap room too!

The whole cashless RFID badge system was just slightly evocative of another German badge system we learned of on this trip, intended to manage groups of people in a confined and highly managed locale.  Yeah I just went there, but if the analogy fits…  There was a different colored badge for men vs. women, and a different color again for children.  At first, we thought it was cute and quaint, but it didn’t take long to realize that the 12 year old (who can pass for 16 on casual inspection) was not going to get into the 16 and over area as her badge would make her stand out like a sore thumb, which I am sure was part of the intention.  And then there was the alcohol policy posted in several places stating that for safety purposes, there is a maximum of three drinks per person.  It did allow that after five hours you would be granted permission to purchase a fourth beverage.  I thought again, how sweet they are thinking of our safety.  Then I realized that with the badges they know exactly how many drinks have been purchased, at which locations and time intervals, and by whom, so this is not an idle unenforced policy but rather one where big brother is watching and ready to cut you off.

Conclusion

Things I learned on this trip which surprised me at least a little:

Most people pay the extra $35 per seat for pre-assigned seating on Lufthansa.  The spendthrift in me figured this was just for suckers who didn’t have the organizational ability to get online and claim a seat when the online check-in window opened.  I was sure glad that this plan freaked Kim out to the point that I actually checked the seat availability map a few weeks prior to the trip and discovered our only option to avoid middle seats was to book the very last row of the plane on the flight to Munich.  Gulp!  I guess that was $280 well spent after all.

If you aren’t in a tent at Oktoberfest, there is no place to sit down or take a break.  On a crowded day like Saturday, this can pose a challenge.

There are very few garbage cans to speak of at Oktoberfest.  I assume this is for security reasons.  Again it can catch you by surprise holding a soiled napkin after eating a bratwurst and having no place to discard it.

Every bottle at Oktoberfest has a 1 euro deposit.  Chug your water and take the bottle back to get your money back.

For how green and enviro-conscious it seems to be, waste management seems to lag in Germany in general, at least compared to Seattle.  Recycling and composting options are very few and far between.

Cigarettes remain surprisingly popular, and are available everywhere including sidewalk vending machines.

Snuff is a popular pick-me-upper to keep the fest going!

Kim declared this to be the best family trip ever.  We are already scheming for an excuse to return, hopefully with a big group of friends and family, to celebrate a future milestone.  Perhaps our 30th wedding anniversary in 2023!

 

read more / Comments

Deck Maintenance, 2017

Posted by: pat 7 years, 2 months ago

After a stunner of a summer with really no rain to speak of, I finally got on my deferred deck maintenance.  Although the photographic and blog evidence doesn't lie, I am astounded to realize that the last time I stained the deck was just about exactly two years ago.

I had let it go a little too long.  Scratch that, at two years it is way past due.  Really I think I need to put at least one coat on every year, and two would be better.  I surely paid the price this time, basically starting over from scratch.  It had been too long and it needed the full scrub down.  I figure I've got at least 20 hours of hard laborious work into it this month, over 3/4 of which are purely scrubbing.  My prep routine goes something like:

  1. Sweep
  2. A light hand with the pressure washer, just to get all the cracks cleaned out.  Especially where a crack is on top of a joist.
  3. Light detergent scrub with the brush on the pole
  4. Approximately 3 successive rounds of hard scrubbing with detergent, on my hands and knees
  5. Brightener.  This part is no work at all really, compared to the rest.  Apply, slight agitation, rinse.

The above was accomplished over a period of about a week, taking 2 - 4 hours out of hard work every day.  I swear this is the last time I'm going to do all of that myself.  Scrubbing seems like a perfect unskilled labor task to hire out.  Good exercise though, and the weather was perfect for it.

My detergent mix is..well I try different things.  Usually it is Oxyclean, TSP, and a little Dawn mixed up hot in a 1-gallon batch and applied by garden sprayer.  I have also used Restore-A-Deck which works well, but maybe not much better than the OxyClean mix.  The RAD product seamed to foam up a bit more on its own, but I'm not convinced it cleans better.  OxyClean is dirt cheap at Costco, and I get good TSP from Fisheries Supply.  Ultimately, the hard pressure of a hand scrub is needed to get the mold and algae to break free.

 

This photo attempts to capture the greenish brown slurry that comes up with a little scrubbing

The coat went on great as usual.  It took all of a gallon and about 4 hours to get it applied.  This is the most gratifying part, the big payoff for all of that work.  Now I've got the full beauty of the deck...for about a month!  It is a Sisyphean task.

Here we see the line between clean and dirty.  Boards are wet at this point.

My goal is to keep up with it.  I'd love to get into whatever maintenance cycle is required to keep it clean and recoat as needed without going through the hard laborious scrubbing again.  The key I guess is to not let the mold get a toehold.  I am considering the Wet and Forget treatment as well to fight the mold between Penofin coats.  

Application underway

Stain completed.  Beauty restored.

It is all very ephemeral.  A windy morning and the deck is coated with my nemesis, the cruddly.

In closing, I just have to say, "A pox on the Seattleites of a prior generation who thought my neighbors' lots would be improved by planting birch trees!"

 

read more / Comments

Red Skeleton gets a brain transplant

Posted by: pat 9 years, 1 month ago

I think this is Red Skeleton's fourth year.  Last year I grew more and more dissatisfied with Red's performance and vowed to make some updates.  My three goals were:

  1. Make the lip synch of the jaw movements more closely match the audio
  2. Replace moving parts in the electronics that might be contributing to instability
  3. Reduce the noise from the servo motor driving Red's jaw

This year I pulled Red into the workshop for a little refresh, which turned into a brain transplant.

Out With the Wave Shield, in with the Audio FX

In the past Red ran on an Arduino Duemilanove and an Adafruit Wave Shield.  The Wave Shield is getting pretty long in the tooth.  Frankly the only reason one would select it today is that the sd card gives you practically no limit on how much audio you can access.  I noticed some flakiness in Red last year, especially on clear afternoons when the sunlight through the plexiglas panel at the front of Red's enclosure would turn it into a greenhouse.  I never really liked the SD card and potentiometer volume dial on the Wave shield.  I've had it get fussy about the SD card, and it can be staticy when adjusting the volume potentiometer.  Right or wrong, I felt this was not a great solution for the harsh outdoor environment where Red makes his annual command performance.  And there are better options now.

I ended up replacing the Arduino and Adafruit Wave Shield with an Adafruit Metro Mini and Audio FX board.  The Metro Mini has a pretty anemic 5v supply so I wired up a 7805 to supply the servo, PIR sensor, and Audio FX board with power.  I mounted and wired up the whole mess on a small piece of stripboard with terminals for the PIR sensor, LEDs in the eyes, and the servo.

Improved Audio Measurement

In the past I simply piped the audio + into an analog pin on the Arduino to detect loud vs. quiet bits in Red's speech and move the jaw accordingly.  I've learned this is not a great solution.  Audio is AC current that alternates + and - and only swings millivolts.  The Arduino's analog input pins only read 0 to 5 volts DC.  So not only was I clipping all of the negative values but I was also only basing my logic on very small swings of current.  After learning all of this I also learned how to shunt the AC to ground to make the audio a DC signal, use a voltage divider to bias shift it up to be centered on + or - 2.5v rather than 0v (putting all values into the positive range), and amplify it with an operational amplifier so I can measure over a wider range.  I also tweaked the reading of the analog pin to use a rolling average to smooth the spikes out.

In addition to these software and circuitry changes, I also got some threaded rod and itty bitty fittings for the servo horn that eliminate a lot of the slop I had in the linkage between the jaw and the servo.

Silencing the Servo

The audible servo whine whine noise whenever it moved the jaw was annoying and distracting.  It compromised the illusion that you are standing in front of an actual zombie skeleton buccaneer with a razor sharp wit.

I put the servo into a plywood box with all inner surfaces covered with 1/2" wool felt, and the space filled with poly batting.  There is just one hole for the threaded rod that drives the jaw.  Hopefully the servo doesn't combust in this enclosed space.

Conclusion

So far so good.  I am very happy with the improved lip synch and silent servo.  We'll see how the new brain holds up over the next few years.  I've got a great idea for a new spider prop I'm planning for next year, in which I hope to add some EL wire lighting effects and go "bare metal" with just an AVR and no Arduino.

 

read more / Comments