Jed’s Other Poem
Music video for “Jed’s Other Poem (Beautiful Ground)”—a song by indie rockers Grandaddy, from their sophomore record The Sophtware Slump. Programmed in Applesoft BASIC on a vintage 1979 Apple ][+ computer, this is the world’s first open-source music video. Probably.
Jeddy-3, a humanoid robot built from spare parts, is a recurring character on Grandaddy’s second studio album, The Sophtware Slump (2000). Over time Jed’s creators, distracted by their subsequent inventions, lose interest in him. Left alone and in a fit of despair, the gloomy Jed drinks himself into a permanent shutdown. According to Grandaddy, before Jed’s system crashed he would write poems. Poems for no one. This song, “Jed’s Other Poem”, is one of those poems; authored by—and now serving as an elegy for—the emotionally neglected and recently departed Jeddy-3.
I created the simple animations by programming them in Applesoft BASIC on a vintage 1979 Apple ][+ computer—a computer so primitive that it is only equipped with 48K of memory. (That’s orders of magnitude less than your phone.) It contains no hard drive, relying on previously formatted 5¼-inch floppy diskettes to boot up to a command prompt—the iconic blinking cursor. My particular model could only make use of majuscule (“uppercase”) letters, but expansion cards to enable minuscule (“lowercase”) letters were common in this machine’s heyday.
An Apple ][ is not a Macintosh; those hadn’t been created yet in 1979. Macintosh would be released half a decade later in 1984, and was the first home-use personal computer to feature a graphic user interface and mouse. (Recall that the slightly earlier Apple Lisa was targeted at the enterprise market rather than home consumers.) Meanwhile, this pre-Macintosh Apple ][ series relied on a keyboard and command line interface; an exclusively text-based operating experience.
Choosing a vintage Apple to evince Jed’s final words was a nostalgic choice for me that also dovetailed neatly with Grandaddy’s “broken down technology” aesthetic. The Apple ][+ was the computer of my childhood. I have a vague memory of interacting with one as a pre-schooler, but it was the anachronistic hand-me-down in late grammar school that stirred my blood with six colors. Although I was living years behind my peers with their colorful Windows 3.x i486 machines, I was riding a bicycle for the mind. The years spent teaching myself how this system ticked by making my own simple games—and tearing apart others’ programs—laid a foundation for my future career in code and interface design. I had an emotional attachment to that particular blinking green cursor; it was the voice of an old friend.
Eventually my childhood machine, along with its manuals and library of diskettes, found a new family during a summer tag sale. Years later, in order to make this video I had to acquire a replacement via eBay. What a trip it was to reacquaint myself with this device. Programming on its keyboard was physically tiring as the keys are bulky with lengthy travel action and heavy resistance. (Be thankful for the decades of subtle keyboard evolution that we all take for granted today.) The Apple ][ series was the last Apple product designed primarily by Apple co-founder, Steve Wozniak, and as much as this video is a love letter to Grandaddy, it’s also a heartfelt hat tip to Woz who made this miracle machine possible.
I created the Jed video as a hobby; my self-initiated nights-and-weekends project for spring and summer of 2005. But the seeds of Jed were planted a few years earlier. The Sophtware Slump album was released in the spring of 2000, the end of my freshman year at the University of Connecticut. That was the peak of Napster and its MP3 file sharing service. Myself and other Radiohead fans were scouring the service for anything that might be related to Kid A, (their long awaited followup to OK Computer), not due for release until that October. I was retreading an obsession I’d had previously in the lead up to OK Computer, downloading VQF audio files to compile into a cassette collection titled Hypoxia.
My introduction to Grandaddy came via their Sophtware Slump closing track “So You’ll Aim Toward the Sky” which was available on Napster, but mislabeled as an unreleased Radiohead rarity dubbed “Far away.” I was entranced by the song—and certain it wasn’t Radiohead. I was eager to learn who had actually created and performed this track. Thankfully I eventually was able to identify it, and in doing so introduced myself to the previously unknown world of Grandaddy. I absolutely fell in love with The Sophtware Slump. It became a late night staple while working on my student graphic design projects. I listened to the entire album end to end more times than is reasonable for sanity. If I were in a coma I’d still be able to sing every lyric. (In my mind, at least.)
From seeds to fruit
There was a small motion graphics assignment (perhaps my Junior year?) to create a 30 second typographic animation using Macromedia Flash. (As I recall, the selection of text was left to our own choosing.) This assignment became my first sketch for a Jed’s Other Poem music video; animating some of the lyrics in monospace type and employing the blinking cursor to mark the beat. It serves as early documentation of the idea, but the aesthetics are off target. (There is one more digital precedent for this video in my repertoire and it comes from even earlier: high school. I coded a rudimentary text-driven animation of my own creation in QBasic. Perhaps I’ll unearth that some day, but it’s bad teenage heartache poetry; often best left interred.) Other than that, my main inspiration was the joy of handwriting out the lyrics to a song as you are listening to it; the just-in-time documentation as a form of expression itself.
I enjoyed the idea of using a seemingly expressionless interface to espouse emotional lyrics—during that time in college I’d been making art in general that held a digital nostalgia; a throwback to my grammar school days playing with actual Apple ][s and old arcade games. But I would put this concept away for a few years, graduate from UConn, and move to Brooklyn, before picking it back up again. In early 2005 with an eBay-purchased authentic Apple ][+ in hand, I was ready to reinvestigate this singing command line. The Apple model I received wasn’t quite as fancy as the one I’d played on as a kid; it had a generic screen rather than the original monochrome Apple display. There was no RAM expansion, modem, printer card, or minuscule character card. But it would do.
When I was satisfied with the results—or satisfied enough with the toil, I enlisted friends Jeff Bernier and JP Chirdon to help me capture the execution on video. That day happened to be Sunday, September 11th. It’d only been four years since the namesake terrorist attacks. I lived on the top level of a three floor walkup in Williamsburg, and from my bedroom window’s fire escape we could climb onto the roof for a clearer view of the ghostly tower lights that had become an annual memorial. We shot a few takes—with me manually typing the
RUN command to execute the code—and then it was off to Jeff’s nearby home and video editing system to add in the audio and export the final video file. We were done by midnight.
- Music. Grandaddy.
- Direction, concept, execution. Yours, truly.
- Camera. Jeff Bernier.
- Lighting. John Paul Chirdon.
I hadn’t touched Applesoft BASIC in years. Slowly the idiosyncratic practices came back to me—like the art of always spacing out a program’s line numbers by 10 units or more. Why do this? Because creating a program happens one line at a time via the command prompt, rather than within a text editor. Any command line input beginning with a number is assumed to be a line of code, and that number is used as the line number. So by typing
1000 PRINT "OK" you’ve created an instruction at line 1,000 to print the string
"OK" to the screen. Should you accidentally type
1000 HOME, this would replace your previous print instruction at line 1,000 with one that clears the screen instead.
Spacing out the line numbers accounts for the possibility that you may have to go back and edit a routine; inserting new lines of code between existing line numbers. If you don’t have the free line numbers to use, you’ll have to re-type everything using new line numbers—and that’s horrendous. You can see here how I initially stuck to the pattern of skipping 10 units between line numbers, but then did have to go back subsequently and insert new instructions between. (While debugging the timing sync, I needed to further adjust the speed of execution by changing my local delay unit variable,
DLY%, based on my master delay unit variable,
MDY%.) The varying spaces between line number and its instruction are controlled by the BASIC interpreter; not an artifact of my typing.
5400 DLY% = MDY% / 80 5410 X = 1 5420 Y = 13 5430 STRING$ = "I TRY TO SING IT FUNNY LIKE BECK" 5440 FOR I = 1 TO LEN (STRING$) 5450 CHAR$ = MID$ (STRING$,I,1) 5460 GOSUB 9000 5470 NEXT I 5471 CHAR$ = "" 5472 DLY% = MDY% 5473 GOSUB 9000 5479 DLY% = MDY% / 80 5480 X = 1 5490 Y = Y + 2 5500 STRING$ = "BUT IT'S BRINGING ME DOWN"
Note the variable name suffixes: a dollar symbol
$ indicates a text string while a percent symbol
% indicates an integer. The subroutine found on line
9000, called here by lines
5473, is the “printing cursor” animation routine. Because the whole program shares a single variable scope, there’s no need to pass values for the string to be printed or its intended
Y location on screen. The subroutine will execute based on whatever the current values are for those variables:
9000 REM ### CURSOR FUNCTION ### 9010 IF X < 1 THEN X = 1 9020 IF Y < 1 THEN Y = 1 9025 IF Y > 24 THEN Y = 24 9030 HTAB X 9040 VTAB Y 9050 INVERSE 9060 PRINT " "; 9070 NORMAL 9075 I$ = INKEY$ 9076 IF I$ = " " THEN GOSUB 9400 9080 FOR PAUSE = 1 TO DLY% 9090 NEXT PAUSE 9100 HTAB X 9110 VTAB Y 9120 IF CHAR$ < > "" THEN PRINT CHAR$:X = X + DIR 9130 HTAB X 9140 VTAB Y 9150 PRINT " "; 9160 FOR PAUSE = 1 TO DLY% 9170 NEXT PAUSE 9180 RETURN
I swear the program took longer to execute as I added more and more lines of code, as if more memory was required to sift around the ever-growing list of instructions. I don’t know if this was truly the case, or just my imagination. But if I recall correctly, I began working on the project with a certain value for the master delay setting,
MDY%, and by September I had greatly reduced this value in an attempt to keep previously synchronized animation routines in time with the music. The dirty secret is that regardless of my efforts, we did have to tweak the timing of the final video in order for it to execute perfectly in sync with the music. So it goes.
The saddest recursion
This is my favorite line of the entire program—the
LIST command. Used on its own from the command line, it lists the instructions for the current program in memory. It can also be used to list specific lines or ranges of line numbers. This is incredibly useful when debugging a program; to be able to call up and view chunks of the code. (Again, there is no text editor to scroll up and down through. Programs are entered directly into the command prompt one line at a time. Painfully.)
By putting this command inside of a program, it causes the program to list itself—as if it’s unraveling before you; a dramatic reveal of its own guts spilling out. This is what happens to Jed’s poem—or perhaps Jed, himself—as seen beginning at 2:13 in the video and continuing until the end. It’s a fitting final curtain of decomposition; this waterfall of instructions that made the piece and is now bursting forth from the piece itself. The zoom out expands the frame, re-contextualizing what we’ve just witnessed, and allows us a more contemplative and respectful distance from this unraveling.
Although I’ve always been tickled by artifacts that reveal the process of their own making, I don’t know if I would have placed as much emphasis on it had I not been working for David Reinfurt at the time of creating this video. David helped me better understand and articulate this sort of technique. It’s something he’s been fascinated with as well. Here’s a clip of David giving a talk at Google in early 2018 about one of his design heroes, Muriel Cooper. At about 10:42 into the video he draws our attention to Muriel’s design for the cover of her Bauhaus book and how its artwork is a register of the process that created it. This is far from her only employment of that technique, and if you aren’t familiar with Ms. Cooper (or David), you really ought to watch the full lecture.
Young Guns recognizes the vanguard of creative professionals 30 years of age and under. Founded in 1996, the portfolio-based competition has grown to become one of the most coveted awards for young creatives around the globe. For many, being named a Young Guns winner is a sure sign of a skyrocketing career, as well as a source of validation for all of the stressful days and sleepless nights that have come with early successes.
I’m not sure about all of that. But I was fortunate to be inducted into the Young Guns “YG7” class. Young Gun winners are included in the celebratory exhibition—and I knew exactly which piece I wanted to display. Rather than the video file for Jed’s Other Poem, I submitted my “prepared Apple ][+ computer” that I’d used to make the video, including the 5¼-inch floppy diskette that would drive the animation. I wanted the real, live executing thing to be the display piece—in contrast to the flat video which had already had the honor of going viral online and being seen by many eyeballs. My setup did not include audio as that wasn’t part of the executing program itself, and the animation wasn’t guaranteed to remain in sync with accompanying external audio anyhow. (This is just as well. The opening party was delightfully raucous and the music for my piece would have been drowned out by the DJ duo, which included fellow Yale design alum Luke Harris.)
There was one wrinkle, however. My original program was not made to loop. It executed once, and then politely ceased control back to the command prompt. I could have added a simple
GOTO statement at the end of the control flow to force it back to the head of the program—but this seemed lame. Why not “loop the entire machine” instead? This was the existing line that halted the program:
After considering the opportunity for a while, I created a special “Jed disk” by using the
INIT command to format a floppy that would execute my Jed program on boot. This at least solved the problem of executing the animation as soon as the computer was powered up; no need to type
RUN JED.BAS or provide further instructions to the exhibition minders. But it didn’t solve the loop. To do this, I needed to invoke a reboot command—but unlike
LIST, a reboot cannot be issued from the perspective of a program. It has to appear to come from the command prompt itself. I changed the above line to this bit of magic:
6005 PRINT CHR$(4) + "PR#6"
As described by Robert Gomez,
CHR$(…) is a function that retrieves the keyboard character assigned to the numerical value in the parenthesis. For example,
PRINT CHR$(65) prints the letter A to the screen. In this case, character number four is the equivalent of keying in Control+D. This tells the computer that the next printed string should be executed as an OS command rather than printed to the screen. That’s the first half of this compound line.
The second half of this line is an OS command that pipes output to a peripheral controller card sitting in one of the motherboard’s expansion slots. Which card? The one sitting in the slot indicated by the
# symbol. For example, printer cards were usually installed in expansion slot #1, so
PR#1 would ideally pipe subsequent output to your printer card, sending your next string outputs to your tractor-fed dot matrix printer. But in this case, we’re connecting to the card in slot #6, which is by convention the floppy disk drive. By pinging that disk card we’re actually triggering a warm boot from the attached disk drive. With that properly formatted boot disk in place, Bob’s your uncle.
The piece ends with the program listing its own source code. It was only a few weeks after publishing the video online that I received an email from a stranger who had transcribed as much of the code as was legible before the zoom out. “How can I get the rest?”, he pleaded. Great question. I coded this thing on an actual Apple ][+. Its only means of transferring files was the 5¼-inch floppy disk drive. There was no CD burner. No FireWire. No USB port. No Wi-Fi. And certainly no Bluetooth. I suppose if I’d had a modem expansion card I could have tried some kind of networking wizardry. Kermit, perhaps?
And then I remembered something. These machines have an audio input / output jack—but it’s not for connecting speakers to your computer. It’s for loading and saving data to regular old cassette tapes! This meant I could get data out of my old Apple as audio, and pipe that into my modern laptop’s line-in port with a simple auxiliary audio cable. It was a gleeful sprint from my apartment to Mikey’s Hookup on Graham Avenue to purchase the fanciest minijack cable they had on offer. Then it was a matter of finding an Apple ][ emulator for my laptop that could convert that audio data back into plain text. For this I selected Virtual ][, which was on lowly Version 4.1 at that time. (Still fantastic, though.)
From an audio waveform to binary, and back.
With those puzzle pieces in place I liberated the source code from its beige tomb onto my PowerBook with the
BSAVE (Binary Save) command. It was a strange feeling; having spent so much time physically laboring on the old Apple’s keyboard with its often frustrating constraints. I suddenly now had the ability to use a modern keyboard, text editors, syntax highlighting, even version control. And then I could pipe the results right back into my old Apple via that audio cable. But I’m happy I worked directly on the old hardware. Something about going through the real process rather than faking it added a foundation of authenticity that remains with me to this day. Perhaps it wouldn’t matter to fans of the video if I’d done it the other way around. But it mattered to me. It still does.
Piping out the Jed code via the cassette tape output port from the original 1979 Apple ][+ computer, through an audio aux cable, into my then-current Macintosh laptop running an Apple ][ emulator.
With the code now accessible, I could follow through on a wild idea: why not open-source this thing? (Yes, open-sourcing still felt a bit radical in 2005—at least to me. GitHub hadn’t been conceived yet. Git, itself, was only a few months old. Remember Subversion?) I collected my Jed pieces together: the recorded audio data stream as an AIF file, the recovered source code as a text file, and a disk image for use in emulators such as Virtual ][. Lastly, I hastily typed a short text file describing the package contents; encouraging downloaders to “have fun running and tweaking as you see fit” in lieu of more official license verbiage. I ZIP’d this up and published it on my website.
That was Monday, 12 December 2005. As far as I know, “Jed’s Other Poem” is the world’s first open-source music video. (If you know of another candidate, do come forward.) I emailed the inquisitive gentleman back with a link to the Jed source code package. By this time several folks had asked for my source code. It was now freely available to all.
On Monday, 12 December 2005, I released the “Jed’s Other Poem” source code as plain text, a disk image for Apple ][ emulators, and as an audio file for use with cassette tape drives.
(Oh, you want to talk about that open-source Radiohead music video for “House of Cards”, eh? That video was released and open-sourced in 2008—three years after mine 😉)
In early 2010, a popular software company called Panic Inc. was excited about their new office. They posted photos of its interior to their blog and newsletter. I immediately noticed something interesting: a 1980s era Apple //e computer tucked away on some back shelves. I emailed the folks at Panic to ask if they’d run my Jed code on it.
From: Stewart Smith / Stewdio Subject: panic office photos Date: April 30, 2010 7:44:43 AM PDT I just saw some photos of your office and couldn’t help but notice an Apple //e. I have an odd request. Back in 2005 I created a music video for the band Grandaddy by programming a text animation on an old Apple ][+. You can see the video here. So for my request: would you do me the honor of running the source code on your old Apple //e and sending a few pictures? (Or even posting them to your Flickr?) I imagine you could load the code onto the old machine by using my “cassette tape” source code file. The source code package is here.
Apparently that sounded just fine to Mr. Cabel Sasser and the Panic crew. But what would be the most appropriate means of playing that audio data stream into the Apple //e’s cassette drive port? Well… Apple had just released the first generation iPad—and Cabel was in that first wave of purchasers. He downloaded my audio file to his iPad, plugged one end of an auxiliary audio cable into its headphone jack, the other end into the //e’s cassette port, and hit play. With the
BLOAD (Binary Load) command, the //e listened to the audio stream and converted it back into text. Cabel recorded a sweet video and posted it on the Panic blog.
Panic Software’s iPad and Apple //e, having loaded my Jed code via the cassette drive audio port.
Cabel commented: It’s an obvious solution in retrospect, but there is something very unreal and amazing about tapping a button on a multi-touch screen and watching an Apple //e fill up with data. To quote Andy Baio, “that’s like WALL·E connecting to EVE.” Yes. To push data from 2010’s Apple iPad to 1983’s Apple //e is nearly three decades of backwards compatibility—thanks to the power of the almighty audio jack.
I’d worried my rusty BASIC code was more or less useless to folks who might wish to build on it. And if it were confined to actual Apple ][+ hardware, I’m sure it would be. But with emulators and modern hacks, it’s much easier to push around the code; to copy and paste bits as well as renumber the lines of the program. This has opened the doors to experiments like this: Nicky Ramone’s fan video for The Chameleons’ 1983 post-punk anthem “Up the Down Escalator.” You can see how Nicky has built his own composition here, but it’s making use of my familiar Jed subroutines. It’s delightful to put something out in the world and know that folks have enjoyed taking it apart and putting it back together.
Grandaddy didn’t know I’d made this video. I was operating purely as a fan making fan art. As the video went viral I began to realize that I’d cornered myself into some potentially dangerous territory. In the aftermath of Napster’s rise, record companies had become awfully litigious when it came to folks sharing their copyrighted audio for free on the Internet. This is in effect what I had done by embedding the QuickTime file of my unauthorized music video on my website. Meanwhile, I really wanted to share my creation with the band. I’d actually met them a few years earlier when they were touring on their Sumday record. (It may have been at Lupo’s Heartbreak Hotel where I interviewed them for my music and politics zine, Tweed.) I was hoping to meet them again.
Not long after my video’s release, Grandaddy posted a request to their website: They were collecting fan-recorded footage for a planned DVD release. My video wasn’t a concert recording, but I wanted to press my luck. I figured if they liked my video, that would be fantastic. And if they or V2 Records were upset about it, I’d immediately take it down (and of course apologize). I created a profile on the band’s message board and responded to their request for footage with a link to my video. And held my breath.
To my great relief, Grandaddy was into my video! Their drummer, Aaron Burch, seemed to be the main point of contact on the message board. He assured me they were interested in including it on their DVD. (Madness!) But sadly, the band’s DVD never materialized. They made the decision to break up at the tail end of 2005, announcing this in January of 2006. I was crushed—less about my missed opportunity, and more about a band that I treasured having decided to call it quits.
More tough news came later. It turns out V2 Records was not particularly pleased about what I’d done. Not only was I giving away their music for free, my video was composed almost entirely from lyrics that were also copyrighted. This means even if I stripped the audio and kept the visuals online, V2 would look upon that with unkind eyes. They did, however, really like my video it turns out. Jeanne Drewsen, V2’s Executive Vice President of Legal and Business Affairs, reached out to me directly. At first I was in total denial of what I was up against; attempted to claim it was all somehow “fair use” which … was a bit of stretch. Jeanne was patient. And kind. Eventually we agreed that V2 would “purchase” my video for the price of zero dollars, and in return I would have the right to post it online as a portfolio piece—including the source code. Signing that contract made my self-initiated fan video the official video for the song. (And prevented V2 from suing me.)
The irony is that two decades later, folks publishing videos to major social platforms with copyrighted music in them is just par for the course. The platforms even enthusiastically facilitate it. How different this world is two decades later.
Jed’s Other Poem is the first project of mine to ever go viral. While I’m very proud of my thought process and execution, I know in my heart that the real driving force is Grandaddy’s excellent music. I am honored that my silly little video helped introduce a new wave of folks to what I feel is one of America’s most underrated bands. This was 2005—before YouTube, Vimeo, and Google Video had really taken off. And it was literally before Facebook, Twitter, Instagram, TikTok, or any of the major social media sites of today were born. (It was even before the iPhone!) So when I say that it “went viral” I mean that an avalanche of tech and music bloggers propelled the popularity of my video to the point where it was briefly “everywhere.” I don’t know how many folks actually watched the 480p QuickTime file embedded on my website, but it was enough that my hosting company charged me severely for my exceeded bandwidth.
I received so many positively effusive emails from complete strangers. It was and is the most “pure” work I’ve put out in the world. I never aimed to scam any money off it (and I never did). I only wanted to capture the feeling of the music. And I’m so thankful that it’s resonated with as many folks as it has. If you search for it on YouTube you’ll find that it’s been re-uploaded and emulated many times over. It’s been nearly twenty years since spending all those nights and weekends listening to this song on repeat while crafting that code. I have kids now; kids that are old enough to make their own decisions about what plays on their speakers. Every now and then, entirely unprompted, they put on Jed’s Other Poem—and it always arrests me.
I can’t prove that Valve Software had Jed’s Other Poem in mind when their level designers created “Still Alive”, the grand finale to their 2007 masterpiece, Portal. But what I can say is that Portal was released more than two years after my music video. And I currently have the pleasure of working at Unity with a Mr. Bay Rait, the renowned modeler and animator who just so happened to work at Valve on Portal. He didn’t work on the Still Alive finale itself, but he’s obviously very familiar with it. When I explained that I thought perhaps Still Alive was inspired by a personal artwork of mine, he was appropriately skeptical. But then I showed him my video. I believe his reaction was “Spooky how close it is. My god.” You be the judge.