Present Perfect


Picture Gallery
Present Perfect

Patrick Watson

Filed under: Music — Thomas @ 13:48


Last week by accident I saw that Patrick Watson was going to play at the Ancienne Belgique. Annoying, because I had no idea even though I'm on the mailing list and regularly check. So I was assuming it was sold out already.

One of the perks of having a gf working at a radio station is that that particular problem can sometimes be solved, though I would've easily gone over there and paid premium scalper price to get in.

And boy, was I glad I did! The concert was simply awesome. Luckily I illegally obtained the new album (after looking for it in 5 record stores in Barcelona and 2 in Belgium, depressing) before the concert, because he opened with 4 cuts from the new album. He nailed Fireweeds, the opener both live and on the album, from the first note. Kristien was duly impressed all through the concert as well.

This week I went Watsonsurfing a little, coming across among other things the scathing reviews on Pitchfork Media, which - Pitchfork tending to be elitist at times - only reinforced my view of the amazing gift this guy has.

I don't quite remember how I got into him in the first place, but the first hook was (I'm annoyed to admit) his voice's likeness to Jeff Buckley's. There's all sorts of singers and bands that I've tried to peg into the Buckley-shaped hole in my heart - the female Buckley (early Heather Nova), the african-american Buckley (early Ben Harper), the Buckley down under (Cordrazine), the local Buckley (Arid), however silly it is to compare. I've gotten tired of reading comparisons to Jeff Buckley.

But it was 'Luscious Life' that drew me in, and it owes more than just a passing resemblance to Jeff Buckley's work. Enough at least to draw me in long enough to discover the other sides to Patrick Watson, the effortless blend of classical influences and incredible vocal range, coupled with excellent songwriting.

Not that I needed more convincing, but today I stumbled upon a Blogotheque takeaway show with Patrick Watson (if you haven't seen blogotheque yet, and you like my kind of music, you're in for a treat - watch great bands trekking through Paris singing their songs in streets, metro stations and trains, apartments, ....).

If you don't have time to watch all of it, then take a minute to check out the fourth part. The band is outside on the street in a small alleyway, some people passing by, and they roped in what looks like a random street accordeon player to join in on their 'Man under the sea'. Around 4:15, the drummer stops banging the garbage bin, the people are softly whispering along with the chorus, and Patrick goes over to the accordeon player, brushes the guy's hand away from the keys, and while the accordeonist keeps pulling and pushing his instrument Patrick's hand start drifting over the keys to go into the song's bridge, two musicians on the same instrument. While doing so he keeps singing through his megaphone.

I'm not sure what Pitchfork where drinking when they claimed Patrick Watson a generic consensus pick, but these videos show that Patrick Watson is about as real as modern music gets. I don't necessarily like all of his songs, but they're growing on me more and more, and last week's concert, even without playing two of my favourites, was spellbinding.

His new album is fighting (equally excellent) Phoenix's new album for airplay on my CD players and computers. 2009 is going to be a good year for the P section of my CD shelf.

another notch on the bed post

Filed under: DAD,GStreamer,Python — Thomas @ 11:37


While working on morituri I provided some patches to pycdio, the python bindings for libcdio, to handle CD-Text. I was assuming it was the only library or program capable of reading it (turns out I was wrong, cdrdao also extracts it). But those functions weren't wrapped, so I added them. Upstream was using git, so that was another opportunity to test my git workflow across my 3 computers.

Anyway, it was nice to get feedback that said:

Your code has been checked into pycdio. Looks very competently done and is very thorough. Thanks.

For various reasons I won't get into I don't always enjoy the results of coding contributions at work to Flumotion, the project I started. And just as much in the open source world, my contributions aren't necessarily always valued, or treated with the respect I would think they deserve :)

That usually isn't that big of a deal to me, because that's not why I do it, but getting this succint positive remark reminds me that being nice invites being nice. Something I need to remind myself of once in a while to make sure I try and act the same way.

Anyways, a roundabout way of saying I can add another project to my list of projects I've touched.

Meanwhile, on my last plane trip I took the time to autotool morituri. I've finally caved in and went with the familiar, adding a simple frontend command using my python Command class
Another tree is born. Here's the first command's output:
[morituri-trunk] [gst-git] [thomas@ana trunk]$ rip offset find
Trying read offset 0 ...
Trying read offset 6 ...
Trying read offset 12 ...
Trying read offset 48 ...
Offset of device is likely 48, confirming ...

Read offset of device is: 48.

Now, on to ripping and drive selection and TOC caching and such niceties. Someday soon I should be able to actually use this...

rip update

Filed under: DAD,Hacking,Python — Thomas @ 21:47


Today was not a particularly good day - I woke up with a huge headache around 4, took a dafalgan, went back to bed, and woke up around 8:30, still with a headache. This sort of thing happens once in a while to me, though it happens a lot less since I reduced my disorganization stress a few years ago.

Anyways, that's not the point. On days like these, I can only do small incremental changes, which I guess is good for polishing. My brain doesn't let me do much more.

So, I finished some loose ends in my ripping code. Here's a file listing of a directory:

[gst-git] [thomas@ana trunk]$ ls -l Bloc\ Party\ -\ Silent\ Alarm
total 559364
-rw------- 1 thomas thomas 35797484 2009-05-15 16:25 00. Bloc Party - Hidden Track One Audio.wav
-rw------- 1 thomas thomas 46214492 2009-05-15 13:01 01. Bloc Party - Like Eating Glass.wav
-rw------- 1 thomas thomas 38838620 2009-05-15 13:02 02. Bloc Party - Helicopter.wav
-rw------- 1 thomas thomas 41531660 2009-05-15 13:03 03. Bloc Party - Positive Tension.wav
-rw------- 1 thomas thomas 35519948 2009-05-15 13:03 04. Bloc Party - Banquet.wav
-rw------- 1 thomas thomas 29480012 2009-05-15 13:04 05. Bloc Party - Blue Light.wav
-rw------- 1 thomas thomas 36928796 2009-05-15 13:05 06. Bloc Party - She's Hearing Voices.wav
-rw------- 1 thomas thomas 46854236 2009-05-15 13:06 07. Bloc Party - This Modern Love.wav
-rw------- 1 thomas thomas 37977788 2009-05-15 13:06 08. Bloc Party - The Pioneers.wav
-rw------- 1 thomas thomas 45809948 2009-05-15 13:07 09. Bloc Party - Price of Gasoline.wav
-rw------- 1 thomas thomas 41082428 2009-05-15 13:08 10. Bloc Party - So Here We Are.wav
-rw------- 1 thomas thomas 41846828 2009-05-15 13:08 11. Bloc Party - Luno.wav
-rw------- 1 thomas thomas 44151788 2009-05-15 13:09 12. Bloc Party - Plans.wav
-rw------- 1 thomas thomas 50010620 2009-05-15 13:10 13. Bloc Party - Compliments.wav
-rw-rw-r-- 1 thomas thomas 1769 2009-05-15 22:33 Bloc Party - Silent Alarm.cue
-rw-rw-r-- 1 thomas thomas 1002 2009-05-15 16:27 Bloc Party - Silent Alarm.m3u

Notice the first file - it's the hidden track one audio. The .cue file references it properly as well. The metadata is retrieved from MusicBrainz (that got added some night last week), and the files are named according to a template (I'm still not sure I like having the track number in my file names, but a certain site demands it). The files match the AccurateRip database, so this rip is basically as good as you can get with EAC. CDText and ISRC codes also get written to the .cue file (although this particular disc doesn't have CDText).

Things still left to be done, in no particular order:

  • write a command-line frontend
  • write a GUI
  • have the second step of the read-and-verify task encode directly to flac (or another lossless format)
  • write out a log file (involves interpreting cdparanoia's stderr-progress output, which looks a little tricky
  • add code to allow choosing a device
  • add some kind of config file so that, for each device (by name), an offset can be stored

That's quite enough for tonight. Hopefully I feel better tomorrow.


Filed under: Hacking — Thomas @ 23:45


Somehow I spent all this time on this planet without ever learning that in C,
numbers[4] == 4[numbers]

Arrays are just simply syntactic sugar.

I feel robbed of my childhood!

Come on, go ahead and tell me how you realized this when reading K&R back when you were 6 and writing BASIC interpreters in assembler for fun!

Live stream rewind

Filed under: Flumotion — Thomas @ 22:14


To take a break from my personal hacking on CD rippers and jukeboxes, I wanted to hack a little on a Flumotion feature.

Now the feature in question was thought up years ago, just like many features we have. Our problem has never been 'what should we implement', it's always been 'in what order do we implement all the things we could do ?'

Anyway, this particular feature is the idea of being able to request a live stream, but going back in time. So instead of seeing what is on now, you could ask to see what was on 30 minutes ago. And you'd connect, get data from that point back in time, then continue as if it was a live stream.

I of course think all my ideas are great, without question. And I've learned to accept over time getting older that everyone else doesn't realize, and so doesn't pick up on these great ideas I'm having. (Who was it again that said irony doesn't work on the internet ?)

Yesterday, in a boss meeting, I was asked to come up with reasons why we stream over HTTP and not over other protocols. I casually threw in a 'you know, we could do crazy things like rewinding in a live stream, or showing what was on half an hour ago.' Which drew a 'hm, that's interesting' from my boss, instead of a usual grunt while he's typing away on his MacBook and fielding a call on his iPhone.

Today, our product manager mails me and says he heard from our boss about this idea, and told me that would be a killer feature to have. So I dutifully replied to some questions he had.

Now, these days, our development process is a bit more structured, so I have two ways of seeing if this can actually work. I can either create a ticket, draft up some requirements, get it on a roadmap for a development cycle, and work with a developer on the team to explain and help out and maybe have something in a few months.

Or, I could just prototype it myself to see if it works, and go the Far West way!

Coming back tonight from tango class, I had been thinking on how I would actually implement it, and started hacking it in as a proof of concept. Basically, I wanted to extend the burst buffer of multifdsink (the GStreamer element responsible for doing the actual streaming) to, say, an hour, and parse a GET parameter like 'offset' in the HTTP request to start bursting from that time offset in the stream.

An embarassing multifdsink bug fix and some flumotion mutilating later, I have this to show for my evening:
live rewind in Flumotion

While it doesn't look that exciting, the screenshot shows a flumotion-launch pipeline, and a gst-launch pipeline with three playbin's playing the same live stream, but each with a different offset (a minute away each).

The 3 playback windows thus show 3 streams, roughly offset by a minute from each other. The time displayed is the system time at the time of frame generation. The slight difference from the requested offset is due to the fact that the streams start at a keyframe.

Not bad for a night of hacking.

Now, to actually get this nicely integrated, productized, supportable, and deployed on our platform is another matter. But now I can package up the ugly bits of hacks I did and hand it off to the team for analysis.

Maybe this is what our development manager meant when he said I should go back to hacking Flumotion once in a while?

Next Page »