Tellum II

A Million Missed Calls (also known as: Tellum II) is an installation piece centering a SouthWestern Bell payphone.

Tutorial audio as implemented in the first release

This phone can't make calls. Instead, its insides have been gutted and rewired into a machine that lets users explore an infinite coordinate space. Using the keypad as a navigation instrument and with the handset pressed to one's ear, they may listening to, and record audio messages along the way. Visitors are encouraged to mark locations in coordinate space on the device itself, allowing others to easily naviagate to them. A thematically-integrated user manual and artist's statement was printed for its vernissage and the Concordia D/CART year-end show.

Aesthetics & functionality

As installed during the vernissage

Audio files
1. keypad tone.
2. Early audio message left by a classmate.
3. Example of the pre-seeded sounds on the device

As noted in the dev log, I took primary inspiration in the delight of perusing community libraries, though I confess I've seldom ever found something I enjoyed. So then, this project finds the same delight and whimsy in the easier exchange of sound and sentences.

A screenshot of the Vimeo interface for "Out of touch but it's the last 20 years of culture and geopolitics in the West"

I have previously worked on Tellum as a concept, executed instead as a web app. As fun as that was, the potential physicality of the experience was what I was after, and what I aim for now. I’m drawn to data representation and retrospectives with regard to politics and ecology, and always with a certain sense of whimsy. With Tellum II I hope to capture a certain sense of whimsy, but actually invite Montrealers to reflect on the city with the physical installation of real devices around town.

Technical

For ease of prototyping, I elected to write the runtime as a Nodejs app, running as systemd service. Node effectively batches exec calls to record and playback audio, routed to onboard mic and headphone jack outputs that in turn are wired to the handset.

const fs = require('fs')
const { exec } = require('child_process')

if (process.getuid && process.getuid() !== 0) {
  console.warn('Audio playback must run as root')
}

const rate = 8000
const name = Date.now()

// sudo arecord --device=hw:1,0 -f dat --rate 8000 test3.wav
exec(`arecord --device=hw:1,0 -f dat --rate ${rate} ${name}-${rate}.wav`)

The real challenge in this approach was actually configuring handset oudio output; Linux audio is troublesome to say the least (where I had to disable the default HDMI audio out driver as I needed a consistent boot order for audio cards so that I could programatically select hardware - this was not straighforward). As noted in the dev log, the internal microphone in the handset had likely fried, and so the housing needed to be sawed apart for a replacement.

Not finding a suitably easy sqlite wrapper (I did not want to write base SQL calls), I instead wrote changes to a JSON file. Audio files are streamed as uncompressed 8000Hz, unsigned 16-bit LE (the only codec the board supports), taking roughly 400kb every ten seconds of audio. Given the Olimex SBC's 16GB of onboard space, 10GB or so I may use, the phonebooth is capable of storing roughly 69 hours of audio.

As installed during the vernissage

At the time of writing, the phone booth lives in my living room, functioning as a very odd guestbook, pending permanent installation at Concordia. Many thanks to all who came to see it, with special thanks to Brad Todd and Elio Bidinost for their support.