Ariock®’s Writing:

ilovebees and the JoCoCruise 2024

You know how I go on the @jococruise most years. It’s really a blast. But there are a couple things about this cruise that you might not know.

1. People often decorate their cabin doors. This can be more elaborate or less elaborate. One person decorated their door to look like a giant game of Donkey Kong. Another decorated their door to look like it was just more hallway.

A decorated door on the JoCoCruise with an Alice in Wonderland theme. An image of the Cheshire Cat's smile and eyes says, "We are all mad here"

2. Some very kind JoCoNauts created the JoCo Passporto, which they create and give freely to folks who ask for it. They also create a bunch of passport stamps that they place around the ship which you find and stamp your passport with. But also, other cruisers make and bring their own stamps for people to add to their passports. It’s a whole lot of fun.

Decorations outside the room of the people who created the JoCo Passporto. Two large posters are covered in JoCoCruise themed passport stamps.

So, for the past few years, I’ve wanted to both decorate my door, and make a stamp. And maybe even some stickers. But what? What other thing is happening this year?

3. Oh yeah. It’s 20 years since ilovebees! Because another thing you might not know is that:

4. there is an onboard social media forum called twitarr, also created and maintained by another kind JoCoNaut. On twitarr, people can post about their doors, or how they tried to install a 20 year old website on their cabin door, and it’s maybe been hacked?

A decorated door with an ilovebees theme. The door and surrounding walls have images of hacked webpages attached to them.

Did you know you can install a website on a cabin door? Well, not really, but if you print the website on vinyl sticker sheets, you can attach it to your door! The door image was printed on thick vinyl banner material and attached using a combination of command strips and magnets. On the banner, in addition to the ilovebees text at the top, the bee logo, and the seek/behold/reveal at the bottom, there were four columns of text. Each column of text was a different part of the story that was hidden on the website. Vinyl sticker sheets printed with the ilovebees webpages were attached to the banner and eventually to the walls around our door.

In the image above, you can see eight of the hacked webpages that we printed out. The pages were added to the display on a daily basis, paralleling how the story was revealed to players over the weeks that the game took place.


On twitarr, I was able to let other JoCoNauts know what was going on and invite them to have a look/take a sticker/stamp their Passporto.

Text of an online forum post for door decorations on the JoCoCruise: ilovebees says, "Hi. About 20 years ago, a friend created a website called ilovebees but it got kind of hacked. I tried installing the website on my door and it still seems to have issues."
Text of an online forum post for door decorations on the JoCoCruise: ilovebees says, "My door seems to bee loading other webpages. Please have a look. There are stickers and an unofficial passport stamp."
Text of an online forum post for ilovebees on the JoCoCruise. The text is quoted in the article below. It starts, "Hello fellow JoCoNauts."

Here is the text from the third image, explaining what is going on:

“Back in 2004, as part of the marketing campaign for the video game, Halo 2, Microsoft commissioned a company called 42Entertainment to create an Alternate Reality Game. They had made one previously in-house for the release of Stephen Spielberg’s movie AI. That team later formed 42E.

The story behind ilovebees was that a website for a small family-owned honey making business had seemingly gotten hacked. There was strange text showing up, etc.

It turned out that in the Halo universe (our future), a sentient AI (Melissa/the Operator) operating a star ship on a covert mission in Covenant space accidentally triggered an artifact which split her personality, sending part to live on the Chatter (future iPhone) of a teen living on earth in that future, but also to a website hundreds of years in the past. The “hack” was actually that AI consciousness attempting to reassemble itself.

Over the next several weeks, players reassembled the story from the website.

See the reassembly of part of the story on our door along with several of the original webpages. I’ll be adding more pages and info here as the cruise goes on.

Let me know if you were a beekeeper from back in the day! We also have stickers and an unofficial passport stamp!”


The writeup got several kind responses from folks.

The next day’s writeup gave more details about the story:

“Hi folks, the ilovebees account is an alt I made for twitarr. I was a player way back when and made several friends in the community that sprang up around the game (two of whom are also onboard!). We had hoped to make puzzles to go with the decorations, but I couldn’t get the McGuffin I’d hoped to bring aboard working in time (It would have been an old touch-tone phone that would play messages based on numbers punched into it).

Anyway, some more info about the game:

Current day characters:
Margaret: She owns the website ilovebees.com (now defunct. Another player copied the site to ilovebees.co, which still works) which was designed by her niece,
Dana: a tech savvy person trying to figure out what’s happened to the site she made. She creates a blog on blogspot (which can now only be accessed via the internet archive) where she asks people to help her figure out what’s going on.
AI characters on the website:
Melissa/The Operator/the Queen: column 1 of our door decoration has Melissa’s memories and thoughts. Though she was damaged in an accident, she is being reconstructed by the:
SPDR/System Peril Distributed Reflex/the Widow: an autonomous program designed to repair the primary AI in case of damage. Column 2 of the door is the log of the SPDR attempting to fix the Operator. However another program is interfering.
The Pious Flea: a separate program introduced by a Covenant artifact when the artifact was opened. It is attempting to trick the Operator into releasing classified memories which it is sending to the future in order to help the Covenant invade Earth (See Halo 2 for that). Column 3 is the flea trying to evade the SPDR and make it think it is part of it. The flea has an overriding ambition: ‘Seek the truth. Behold the truth. Reveal the truth. That is the law and the whole of the law.’
Column 4 is a retelling of the other columns, but in a fairytale setting. It mentions our last character, the Sleeping Princess.”


Another image showing an update on the twitarr forum. The text is copied below.
A continuation of the previous image showing an update on the twitarr forum. This photo includes the website showing a series of coordinates and times. These are mentioned in the text below. 
Another person has responded saying, "This is so neat to learn about. All I got is that Melissa means "bee". ;-)

Soon, it was time to tell the story of the countdown and what it meant.

“After several weeks of storytelling via “hacked” webpages, a new page popped up with a countdown and a whole lot of Lat/Long coordinates. Coordinates all over the USA. No one knew what they were, so players went and scouted the locations. And in (almost) all of the cases, there was a common thread. Each site had one or more public telephones.

For the younger folks, 20 years ago, there were telephones at most public spaces that you would put money into and you could call the home phone of anyone else. Often times, these phones would have their own number posted on them, so you could call that phone from elsewhere.

Look up the “Mojave Phone Booth” story from 99 percent invisible for more about pay phones. [Or I could just add a link now that I’m putting this on my website.]

https://99percentinvisible.org/episode/mojave-phone-booth/

Back to our story. Once the countdown ended, payphones around the country started ringing. A voice would ask people answering if they knew who she was. If they answered “The Operator,” they would hear a fragment of an audio drama. Think, “War of the Worlds,” but in 10 second segments. And we have more characters!

Durga – Kristen Rutherford
Jan – Kari Wahlgren
Rani – Olivia Burnette
Kamal – Yuri Lowenthal
Jersey – Zan Passante
Herzog – Dave Mallow
Sophie – Kristin Minter
Genie/Isabel/Cassie – Tara Platt
And apparently Rami Malek as various background characters?

Jan is the child of a former soldier who’d been trained similarly to the Master Chief (Halo guy). Jan has enhanced speed and strength. She knows Jersey, whose futuristic communications device (chatter) has been taken over by an AI he names Durga. Durga has crash-landed onto Jersey’s chatter, but her memory is hazy. Kamal is a hacker who has always wondered what happened to his sister, Yasmine, who died as a child under mysterious circumstances. Rani, Sophie, and Herzog work for the intelligence services and have heard some disturbing news about the ongoing war against the Covenant. Durga is somehow able to hack into the worldwide network of connected devices and hear the conversations of the other characters, which she informs Jersey of.

Their stories are unlocked over the next few months as players answer payphones.”


There was one more update on twitarr to give some last context for what we were doing. There is a lot more that could have been said, but these 6 days of updates on a communications platform that disappears at the end of the cruise seemed like enough.

“Time to finish this story.

As previously mentioned, there were calls to payphones for about 3 months, and for 3 months we answered them. There was a bit of a rebellion because not everyone could (or necessarily wanted to) get to a phone. So the creators added a twist. The Sleeping Princess had woken up and was hiding on the 404 page for the site. She started hiding puzzles inside of the images on the site. In the code of the jpgs, there would be plain text inserted, just barely breaking the image, glitching it out. [see the next image for an example]

Soon after that, players answering phones started receiving live calls from Melissa herself. Melissa would ask her “crewmembers” what rank they were and what their names were.

One of the players, trying to help, tells Melissa where the Princess is hiding. She catches and locks away the princess.

The following week, during live calls, Melissa asks her crew what their favorite songs are. Melissa has remembered that hers is “Stormy Weather.” She asks players to sing their songs. It becomes clear that sad songs make Melissa lose control, briefly allowing the Princess to speak to the crew. The Princess is lost, trying to find her way back. She travels a path lined with red balloons and comes to a crossroad. One path has a compass, one has an image of the wind blowing, and the third has waves. Players remember that Bungie loves the number 7, and the waves symbolize the seven seas. When a player tells her to take that route, she finds more balloons and another crossroad. If a player tells her to go another way, Melissa wakes up and ends the call. And another crewmember in another city in another state has to try now. But they are keeping up with the rest of the crew online, and eventually, the Princess is free! She continues to help us from the shadows.

I could talk and talk about this experience, but I’ve taken up enough space here.

I’ll just mention some of the creators of the game (and other things they’ve done):

Jordan Weisman (Shadowrun)
Elan Lee (Exploding Kittens)
Sean Stewart (wrote Dark Rendezvous, a Star Wars novel about Yoda featuring one of the most badass characters, Asajj Ventress)
Jim Stewartson (Google’s Niantic Labs)
Jane McGonigal (Reality is Broken and Superbetter)
Thanks to them

And thanks to you for your time.”

I included two of the websites in this update showing the Princess telling players where she was hiding, and showing progress for the answered phones. Two of the players mentioned on the website in the photo are hmrpita and aliendial.


“OK. One more message here. If anyone was on Unfiction, let me know your handle. Hmrpita is here (she saved the Princess in her live call). Aliendial is also here. I’m Ariock, and I’m on the JoCo discord and Facebook groups. If you want to talk more about it, let me know. I was on a player panel in 2014 (the ten year anniversary) at Arg-Fest-O-Con to talk about it. I even got a tattoo to commemorate it.

Check out ilovebees.co where you can download the audio drama (click on the “mission log” on the front page). A friend owns it, so please don’t download everything at once. Download a file a day, maybe?

[Link to a podcast removed. I started listening to their episodes about another ARG (Find the Lost Ring) and it’s not good. Instead, I will recommend checking out https://wonderweasels.org/apiary/guide.htm which has a great timeline of the game with commentary.]

Another friend is hopefully going to put all the story audio up in a podcast this summer. I’ll post in discord [on various other social media] when it’s up.

Thank you again!”

Phone-Modding Part 4 – The End?

Previously on…

All right. Time to open the last page:

https://learn.adafruit.com/touch-tone-phone-dial-a-song/assemble-the-dial-a-song

First up, connecting the handset to the amplifier. See the photo:

I cut the wires from the jack for the handset, stripped the two that were for the speaker, added some shrink tubing (probably unnecessary) and connected them to the out jacks on the amplifier. I don’t think it matters which is which, or I got lucky. I believe the other two wires are for the microphone. I wasn’t able to disassemble the handset to be sure, but it worked fine.

Next, the switch hook connection. Again, this ends up being a lot easier with a newer phone.

This was a bit more complicated. There is a connection between the EN pin on the Feather and ground that will either be connected or disconnected when you set the handset down on the cradle. I’m still a little confused as to the reason. I feel like there should be a connection from EN(able) to ground to make it work. But there’s not normally a connection to that, so it would never work. It appears that the connection of EN to ground kills the program.

The switch itself has different connectors that are normally open or normally closed that change position with the handset is put in the cradle. I managed to find the two pins on this switch that made it work.

Last connection is for the regular USB power.

The usb cable is threaded through the hole in the back that would normally be where the phone connects to the wall. I tied a knot in this to prevent tension on the USB cable from possibly disconnecting the pins. The cable has all the pins a USB cable would need, but we only need two. First, the red wire is our 5 volt source that will power everything up for us. That needs to connect to the USB pin on the Feather. The black wire needs to connect to our ground.

And that’s it. Make sure the jumper wires don’t get in the way of the cradle switch. Put the keypad back in position. Connect the handset to the handset jack. And put the top of the phone back on. Screw it all back together, and you’re done. Plug the usb cable into something that’ll give it power, lift the handset, and it works!

Right?

Right??

Next up, troubleshooting.

Phone-Modding Part 3 – Circuitry and Phone Guts

Previously on Phone-Modding

Next up we’re going to take that phone apart! But first, remember to refer to the source!

https://learn.adafruit.com/touch-tone-phone-dial-a-song/build-the-dial-a-song-circuit

So it shows the circuit a few different ways. There’s an illustration of the circuit on a breadboard. (is it right? I’m not sure!) There’s a diagram! (Is that right? Some is, but some is definitely broken!) Then there’s a bunch of pictures. (How about those? They’re what I used, so yes?)

The first set of photos are for the amplifier. You should have already soldered a set of 5 pins to this, and two pins for the audio out connector. The 5 pins are (left to right) A+, A-, SD, Vin, Gnd. A- and Gnd need to get to a common ground. Vin connects to a 3 volt source. And SD doesn’t need to connect to anything. A+ connects via a series of two resistors to the TX connector on the Feather. Between the two resistors place the capacitor, and connect it to ground. Note the capacitor has a positive and negative side. Negative side goes to ground.

Next is the keypad. The instructions have a lot of desoldering and adding pins, etc. None of that is necessary.

Looking at the second photo first, you can see the rows and columns of the keypad next to the cable (while they are labeled in this case, they may not be. See upcoming “Troubleshooting” page for help if they aren’t). If you look at the first photo, you can see the end of the cable popping up behind the keypad with a bunch of jumpers going into it.

Also, as you can see in the phone here, I have removed everything except for the connector for the handset, the connector and switch for the disconnect hook, and the keypad. You can get rid of everything else. You’re going to need that space for the little self-adhesive breadboards.

Anyway, one nice thing about not doing it the way they say to, is it doesn’t lock you into using the pins on the Feather that the instructions recommend. And one of the reasons that we want to avoid that is that the SD card interface likes to use some of the pins that the instructions use for the keypad. To summarize:

Keypad Columns/RowsInstructions My Circuit
C1A3A3
C2A2A2
C3A1A1
R1D24D24
R2D25D25
R3SCKD4
R4MOSID5
Connect jumpers from the keypad cable to the Feather.

Since we’re here, lets also talk about the SD card reader.

Once you solder the pins onto the board, you may be confused, since there are a LOT of pins. You only need the first six. 3V, Gnd, Clk, SO, SI, and CS.

3V connects to the same 3 volt source you’re using for the amplifier. That also connects to the 3V pin on the Feather. Gnd connects to the same ground you’re using for the amplifier. Again, this also connects to the Gnd pin on the Feather.

CLK connects to the SCK pin on the Feather. SO connects to the Feather’s MI pin. SI connects to the MO pin. (Remember MISO and MOSI). Finally, the CS pin needs to connect to a data pin on the Feather. I used D10.

Side note: Some of the pins on the Feather use the same data addresses. My understanding is that this could theoretically cause issues if you have two pins with the same address trying to operate at the same time. I chose all the pins so that they wouldn’t conflict with any other pins.

Next up, More Phone Guts?

Phone-Modding Part 2, the Python and the Program

Part 1

Again, I highly recommend reviewing the previously linked site for how to get python up and running. Here’s a link to the next section:

https://learn.adafruit.com/touch-tone-phone-dial-a-song/circuitpython

I followed the instructions on here closely and had no problem getting python running and connecting to the board. I used a short USB type C connector to connect the feather to my computer. I never needed to use safe mode or anything. It just worked.

Next is the code:

https://learn.adafruit.com/touch-tone-phone-dial-a-song/circuitpython

I highly recommend getting Mu, which is a tool to assist in programming with python on boards like this. Here’s a link with help on doing that:

https://learn.adafruit.com/welcome-to-circuitpython/installing-mu-editor

In the video I posted, showing the system working, I am using Mu. I have the program stopped at the beginning, and then using the REPL, I start the program, which causes the dial tone to start playing. Basically, you connect your Feather to the computer. You start Mu. You open a serial connection to the Feather in Mu. And finally, you hit Ctrl-C to stop the program. You hit Ctrl-D to restart it.

Another great thing about Mu is that it will check the code for you. For example, several of the lines in the code provided are too long according to Mu. Also, be careful with spaces around comments.

In addition to the code provided with the instructions on building the phone, we also need code for our SD Card reader. Here’s where I went for help:

https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial/circuitpython

Which is different from this:

https://learn.adafruit.com/adafruit-microsd-spi-sdio/circuitpython

Note that there are a number of confusing and contradictory bits. The code I ended up using seemed the simplest, and it ultimately worked.

Returning to the main guide for the phone, the last thing mentioned on the program page is regarding modifying audio files so that they’ll work with the program.

https://learn.adafruit.com/microcontroller-compatible-audio-file-conversion/check-your-files

Make sure you follow the instructions closely when making your audio files. I accidentally used a 24000 hz instead of 20000 hz for one file, and the program wouldn’t open it.

Finally, here’s the code I used. It works so far.

# SPDX-FileCopyrightText: 2022 John Park for Adafruit Industries
# Modified By Ariock for beekeepers
# SPDX-License-Identifier: MIT
#
# DTMF keypad phone Dial-a-Song
import time
import random
import board
import keypad
from audiocore import WaveFile
from audiopwmio import PWMAudioOut as AudioOut  # for RP2040 etc
import audiomixer
import busio
import sdcardio
import storage

# Use the board's primary SPI bus
# spi = board.SPI()
# Or, use an SPI bus on specific pins:
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
# old spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
# spi = busio.SPI(board.SD_SCK, MOSI=board.SD_MOSI, MISO=board.SD_MISO)

# For breakout boards, you can choose any GPIO pin that's convenient:
cs = board.D10
# Boards with built in SPI SD card slots will generally have a
# pin called SD_CS:
# cs = board.SD_CS

sdcard = sdcardio.SDCard(spi, cs)
vfs = storage.VfsFat(sdcard)

storage.mount(vfs, "/sd")

# time.sleep(3)  # let USB settle during development, remove when on battery

km = keypad.KeyMatrix(
    # 2500 phone ignoring first column store/redial/memory. reverse mount Feather RP2040
    column_pins=(board.A3, board.A2, board.A1,),
    row_pins=(
                board.D24,
                board.D25,
                board.D4,
                board.D5,
                 ),
)

numbers = {
            "8675309" : "songs/beepbox.wav",
            "6358393" : "songs/streetchicken.wav",
            "5551212" : "songs/carpeter.wav",
            "7654321" : "songs/daisy.wav",
            "9255292" : "/sd/week1_subject2.wav",  # walkawa
            "2772643" : "/sd/week1_subject3.wav",  # arrange
            "2696338" : "/sd/week1_subject1.wav",  # boymeet
            "4423273" : "/sd/week1_subject5.wav",  # ihadare
            "9486377" : "/sd/week2_subject2.wav",  # witness
            "7332888" : "/sd/week2_subject3.wav",  # redbutt
            "4376636" : "/sd/week2_subject1.wav",  # ifsomeo
            "6537743" : "/sd/week2_subject5.wav",  # oldspie
            "8446546" : "/sd/week3_subject2.wav",  # thinkin
            "2442536" : "/sd/week3_subject3.wav",  # chicken
            "8293778" : "/sd/week3_subject1.wav",  # taxessu
            "2762259" : "/sd/week3_subject5.wav",  # apocaly
            "2443640" : "/sd/week4_subject2.wav",  # bigdog0
            "8682559" : "/sd/week4_subject3.wav",  # totally
            "2834800" : "/sd/week4_subject1.wav",  # audit00
            "7327848" : "/sd/week4_subject4.wav",  # recruit
            "3644620" : "/sd/week4_subject5.wav",  # enigma0
            "2264000" : "/sd/week5_subject2.wav",  # bang000
            "2274660" : "/sd/week5_subject3.wav",  # casino0
            "2765343" : "/sd/week5_subject1.wav",  # asoldie
            "9333464" : "/sd/week5_subject4.wav",  # wedding
            "3333464" : "/sd/week5_subject5.wav",  # feeding
            "4232732" : "/sd/week6_subject2.wav",  # icecrea
            "2332470" : "/sd/week6_subject3.wav",  # affair0
            "7867699" : "/sd/week6_subject1.wav",  # stormyw
            "5867370" : "/sd/week6_subject4.wav",  # jumper0
            "6926672" : "/sd/week6_subject5.wav",  # myconsc
            "2444373" : "/sd/week7_subject2.wav",  # biggerd
            "9276463" : "/sd/week7_subject3.wav",  # yasmine
            "7533777" : "/sd/week7_subject1.wav",  # sleepsp
            "5278786" : "/sd/week7_subject4.wav",  # laststo
            "3475662" : "/sd/week7_subject5.wav",  # diploma
            "3863725" : "/sd/week8_subject2.wav",  # funeral
            "2672547" : "/sd/week8_subject3.wav",  # coralis
            "4475423" : "/sd/week8_subject1.wav",  # girlhad
            "6965353" : "/sd/week8_subject4.wav",  # myoldke
            "7378587" : "/sd/week8_subject5.wav",  # results
            "2797825" : "/sd/week9_subject2.wav",  # crystal
            "3384500" : "/sd/week9_subject3.wav",  # devil00
            "7383693" : "/sd/week9_subject1.wav",  # sevenye
            "2526246" : "/sd/week9_subject4.wav",  # clamcho
            "9687325" : "/sd/week9_subject5.wav",  # youreal
            "5646464" : "/sd/week10_subject2.wav",  # joining
            "3264597" : "/sd/week10_subject3.wav",  # familyr
            "5377397" : "/sd/week10_subject1.wav",  # jerseys
            "7358282" : "/sd/week10_subject4.wav",  # relucta
            "8742645" : "/sd/week10_subject5.wav",  # triangl
            "4376370" : "/sd/week11.wav",  # heroes0
            "6637646" : "/sd/week12_subject2.wav",  # onepoin
            "3426233" : "/sd/week12_subject3.wav",  # fiancee
            "5878254" : "/sd/week12_subject1.wav",  # justali
            "7328466" : "/sd/week12_subject4.wav"  # section
}

ringing = "songs/full_ring.wav"
wrong_number = "songs/blank_number.wav"
dial_tone = "songs/dial_tone_loop.wav"
busy_signal = "songs/busy_loop.wav"

button_tones = [
                "dtmf/tt_1.wav", "dtmf/tt_2.wav",  "dtmf/tt_3.wav",
                "dtmf/tt_4.wav", "dtmf/tt_5.wav", "dtmf/tt_6.wav",
                "dtmf/tt_7.wav", "dtmf/tt_8.wav", "dtmf/tt_9.wav",
                "dtmf/tt_star.wav", "dtmf/tt_0.wav", "dtmf/tt_pound.wav"
]

digits_entered = 0  # counter
dialed = []  # list of digits user enters to make one 7 digit number
dialed_str = ""  # stores the phone number string for dictionary comparison

audio = AudioOut(board.TX)  # PWM out pin
mixer = audiomixer.Mixer(
    voice_count=4,
    sample_rate=22050,
    channel_count=1,
    bits_per_sample=16,
    samples_signed=True,
)
audio.play(mixer)
mixer.voice[0].level = 1.0  # dial tone voice
mixer.voice[1].level = 1.0  # touch tone voice
mixer.voice[2].level = 0.0  # song/message voice
mixer.voice[3].level = 0.0  # busy signal

wave_file0 = open(dial_tone, "rb")
wave0 = WaveFile(wave_file0)
mixer.voice[0].play(wave0, loop=True)  # play dial tone

wave_file2 = open(wrong_number, "rb")
wave2 = WaveFile(wave_file2)

wave_file3 = open(busy_signal, "rb")
wave3 = WaveFile(wave_file3)
mixer.voice[3].play(wave3, loop=True)  # play dial tone


def reset_number():
    # pylint: disable=global-statement
    global digits_entered, dialed, dialed_str
    digits_entered = 0
    dialed = []
    dialed_str = ""
    km.events.clear()


while True:

    event = km.events.get()  # check for keypad presses
    if event:
        if event.pressed:
            mixer.voice[0].level = 0.0  # mute the dial tone
            wave_file1 = open(button_tones[event.key_number], "rb")  # play Touch Tone
            wave1 = WaveFile(wave_file1)
            mixer.voice[1].play(wave1)
            if event.key_number == 9 or event.key_number == 11:  # check fr special keys
                if event.key_number == 9:  # pressed the '*' key
                    reset_number()   # or make some cool new function for this key
                if event.key_number == 11:  # pressed the '#' key
                    reset_number()  # or make some cool new function for this key

            else:  # number keys
                if digits_entered < 7:  # adding up to full number
                    # convert event to number on the keypad button, add to string
                    if event.key_number < 9:  # 1-9 on keypad
                        dialed.append(event.key_number+1)
                    if event.key_number == 10:  # the 0 key, ignore '*' and "#'
                        dialed.append(0)
                    dialed_str = "".join(str(n) for n in dialed)
                    digits_entered = digits_entered + 1  # increment counter

                if digits_entered == 7:  # a full number has been entered
                    if not mixer.voice[2].playing:
                        dialed_str = "".join(str(n) for n in dialed)
                        if dialed_str in numbers:  # check if string is in directory
                            value = numbers[dialed_str]
                            time.sleep(0.6)

                            wave_file2 = open(ringing, "rb")  # ring before it answers
                            wave2 = WaveFile(wave_file2)
                            mixer.voice[2].level = 1.0
                            mixer.voice[2].play(wave2, loop=True)

                            time.sleep(random.uniform(4.0, 9.5))  # random ring b4 answr

                            wave_file2 = open(value, "rb")  # answered
                            wave2 = WaveFile(wave_file2)
                            mixer.voice[2].level = 1.0
                            mixer.voice[2].play(wave2, loop=True)

                        else:  # number is not in directory
                            time.sleep(0.5)
                            weighted_coin_toss = random.randint(0, 4)
                            if weighted_coin_toss < 3:  # favor the "not in service" msg
                                mixer.voice[2].level = 1.0
                                mixer.voice[2].play(wave2)
                            else:
                                mixer.voice[3].level = 1.0

                        reset_number()

                    if mixer.voice[2].playing:
                        reset_number()  # stop #s dialed during play doing anything

The next section is on modding the phone itself.

Modding a Touch-Tone Phone to Play .wav Files

Happy 20th anniversary of ilovebees! I was thinking about this the other day and as my mind wandered, I thought, “Wouldn’t it be cool if you could have a touch tone phone, and if you dialled a number, it would play one of the audio clips from the ARG?” And then I searched for it, and found this link:

https://www.digikey.com/en/maker/projects/touch-tone-phone-dial-a-song/ae4fd7386c844a14a23d246330bca340

Later I found a better link. The one above has broken links to the software needed, but this one works better:

https://learn.adafruit.com/touch-tone-phone-dial-a-song/overview

And after a month on and off (mostly off) I have a working phone. Check my instagram for a video of the working circuit/program.

I’m going to get more detailed about what I did, what worked, what didn’t, what had to change, etc. so if you’re interested in doing this yourself, you’ll avoid the problems I ran into. Probably the big one for me is that I had no experience soldering electronics. It is not easy. It is absolutely necessary. But it is nowhere near as necessary as I made it. I ruined a couple of electronics components because I tried to pack too much into a small space.

Let’s talk about the bits and bobs you’ll need to make this. Refer to the website above.

  1. Adafruit Feather RP2040. Absolutely necessary. Comes with a set of posts that you’ll need to solder to the board. This is necessary, but if you’re careful, not terribly difficult. (<$20)
  2. Featherwind Doubler. Not necessary. It comes with some items that can make your life easier. Instead of the posts that come with the Feather, it has headers. Basically posts that have openings on the other end that other posts (or jumper wires) can be put into.
  3. Audio Amplifier. Necessary. Also comes with posts. And a connector for the phone receiver. (<$10)
  4. Battery. Not necessary. I got it, plugged it into the board far too early, and burned out the board. You need to be done before you plug the battery in. It may be obvious to you, but it wasn’t to me.
  5. Terminal Blocks and Wire ferrules. Both unnecessary.
  6. USB Adapter. Necessary. This is nice because the wires have connectors like the headers. (<$20)
  7. Jumper Wires. Necessary if you want to minimize soldering. (<$10 for over 100 jumpers)
  8. Resistors/Capacitors. Necessary. I had these from other kits I’ve gotten over the years. (<$30 for hundreds of resistors and 10 capacitors)
  9. Telephone. Obviously. I didn’t get the model they have here. I went with “Home Intuition Classic Corded Phone for Hearing Impaired Telephone for Seniors with Extra Loud Ringer” from Amazon. One nice thing about it is that it’s a newer phone, so a lot of the connectors inside will easily accept jumper wires from item 7 above. (Approx $40)
  10. Another thing I recommend getting is several Mini Breadboards. They can take the place of the Doubler in item 2 above. Again, I had several of these from previous kits. They are great because they have an adhesive backing that allows you to easily attach them inside the phone. (<$10 for six)
  11. For this project you’re also going to need a “MicroSD SPI or SDIO Card Breakout Board” (Get one that is only 3 Volts, not 5V) and a MicroSD card to hold all of the files. It turns out that the Feather has very limited onboard memory. The project is designed/programmed to play wav files and not mp3s. Even if playing of mp3s was possible, they’re still too large to fit on the Feather. All of the ARG audio files as mp3s are a total of 130 MB, and after converting them to wavs, they’re 819 MB. (<$20 for the board and a 32 GB MicroSD)

Total price is pretty close to $150 (assuming you have solder and a soldering gun, spare USB cables to plug the feather into your computer, a computer, etc)

I’m going to make this guide parallel the source material, with each section making up another page. Next up, the Python and the Program

Finding Satoshi (the OG)

I highly recommend that you watch this documentary about finding one person in a billion.

https://www3.nhk.or.jp/nhkworld/en/ondemand/video/3016112/

It’s really well done, almost lovingly crafted, telling of the story of the last (solvable) card of Perplex City to be solved. It’s only 50 minutes as well, so pretty briskly paced.

Dispatches From Elsewhere First Impressions

I wrote this over a year ago after first seeing the first episode of Dispatches from Elsewhere. As such, I’m not sure if the links still work, but we’ll see. I was able to watch episodes 2-4 after this since they were free to view on the AMC site, but I haven’t seen any of the other episodes.

Original Starts Here:


Hoooo boy. That hit me right in the feels.

So in case you haven’t seen it yet, because SPOILERS WILL BE COMING, apparently AMC tacked the first episode of Dispatches from Elsewhere on the end of The Walking Dead on their website. Here’s the link (go to 45 min if you’re not into zombies):

https://www.amc.com/shows/the-walking-dead/full-episodes/season-10/episode-09/squeeze

It’s free to watch/no login, though I had a weird experience when I tried to watch the first time. It automatically tried to log me in anyway. And I do not have AMC, so it wasn’t happy to see me. Reloading and hitting escape worked. Thank you to Michael J. Andersen at ARGN for the link.

Here’s where we’re going to put the SPOILER BREAK.

Seriously. Go watch it. It’s actually pretty good.

Thoughts as I was watching it.

    1. I’m glad Hull and McCall are listed as “executive producers” insofar as I hope they’re not involved. While I loved the Institute, the Socio-ReEngineering event was too much of a fuck you. Followed by the similar fuck you of The Institute movie and the real fuck you of the Latitude Society.
    2. I’ve seen the start of this. This bit where Octavio Coleman talks about Peter and his life. It was a teaser released a week or so ago. At one point when Peter is working, there’s a chalkboard in the background with “EPWA LIFE” written on it. I suppose here’s where I should talk about the New Noology Network tie-in game. I had very high hopes for this. There’s a lot of information about this, and here’s a link to an ARGN article: NNN. The problem with the game is that they’ve got a lot of blurring of the lines between In-Game (IG) and Out-of-Game (OOG). IG characters are showing up in chat groups run by players which should be OOG. This causes players to wonder if other players are IG. And in games where clues about who a person is might lead to more information about the story, this creates a breeding ground for doxxing of players. It’s to the point where players are finding out the identities of actors playing roles in the ARG. This blurring of the lines makes me worry that Hull and friends are involved in the ARG portion. But I think he’s got a new project that’s more based on perfect discretion or whatever new bullshit “dance for me but don’t tell anyone about it!” power trip.
    3. The call out of this being based on “The Institute” is pretty funny. So a movie I’m technically in is mentioned on the TV show. That’s kind of cool.
    4. HA. ok, about 8 minutes in, and we’ve got what are now referred to as “Easter Eggs.” (Sorry Hmrpita) In reality, they’re just references to the original game. The map is the original map? Sure looks the same. I would need to grab it from the shrine to check. Is that Arye Bender in the bed with a hand on his chest? Oh yeah, and the building he’s walking up to has the three hooded figures that are on 580 California Street.
    5. “for those dark horses with the spirit to look up and see, a recondite family awaits.” damn. yeah. Or do they? or is there no family at all, and the people you thought were family, who were part of your “crew” will they get in and leave you high and dry? More Latitude bitterness.
    6. ok. We’re at the Induction center. So this is chapter 1. Getting the key at the security desk is a little off. in the original game, you’d go to security and let them know you were there for the Jejune Institute. You’d get a name badge. They’d send you up to the 16th floor. On the 16th floor, there was another desk where you’d get the key with the instructions attached. And the door was a single door, and with no little antechamber. No weird devices along the hallway either. All the weirdness was inside the room itself. Let’s go in, shall we?
    7. Inside. you’d hear the voice telling you to sit  down. this wasn’t timed, if I recall correctly. No countdown. But when you sat in the chair, the video would immediately start. There’s a slight missed opportunity in that the desk in front of Octavio, and the background behind Octavio might be the background behind the TV, but it’s uniform enough with the rest of the room, that it could be any part of the room. The actual induction video had odd pictures behind Octavio, arranged asymmetrically, so when you saw them actually on the wall behind the TV, it was clearly the same wall. Or at least obviously the same arrangement meticulously recreated. Let’s watch the original! Part 1. Part 2. Part 3. So the I.D.E.A. is what Jejune referred to as The Algorithm.
    8. So they’re departing again from the original in that Octavio doesn’t tell Peter not to read or fill out the induction form.
    9. AHAHAHA! So they DID keep that in, but someone ELSE is telling Peter not to do what’s on the form. It was a weird dissonance. Providing the instructions but telling you not to do it. I get why they changed it.
    10. Also, nice pen. We got pencils that said, The Jejune Institute on them.
    11. I kind of wish we could see what’s actually written on the cards. Even though it doesn’t get done.
    12. So Peter is running. Again, the layout of the buildings is different. In the original, you HAD to take the elevator down. HOWEVER, there was an admonishment to avoid the security desk and take a side exit.
    13. No hobo marks for finding the way. O” No time anchor. those were so good.
    14. Commander 14 is calling NOW? So. It’s too bad they didn’t use Harry S. Robins. You know. Dr. Kleiner from Half-Life? Dr. Howland Owl of the Church of the SubGenius? Anyway. So is it just me, or is the voice of Commander 14 very familiar? I mean, like, obviously familiar? Is there an attempt to disguise this voice, because I mean, is it? I guess this will be a thing.
    15. We’re through the hidden garden and on to the shop. Easter Egg! The Elsewhere Brick. This brick wasn’t so much a brick as it was a plaque painted like and mounted to a brick. The brick plaque was hidden in an external alcove of Old St. Mary’s Cathedral. A picture of it would also be on the envelope available for sale in the Asian Image shop a couple blocks away. The garden and shop seem to be compressing a lot of this together.
    16. Peter and Simone’s montage after the shop compresses the rest of Chapter 1, including finding the peep hole and seeing the missing girl. Eva has become Clara.

It was a nice bit of nostalgia. But I am now forever leery of Nonchalance. I hope to see the other episodes eventually.


So that’s the original write up. As I mentioned, I was able to see the first four episodes. I have also now seen “In Bright Axiom,” and whoa boy Hull-as-Max was a lot. Max is an asshole who fails upwards and gets his supper anyway. So yeah.

What’s Ariock Playing?

My current playlist as of 4/2024:

  • Noita
  • Inscryption 
  • Rock Band 4 Rivals (always)
  • Factorio
  • Escape Room Simulator
  • Puzzle Trails / Puzzled Pint

My current playlist as of 9/2018:

  • Animal Crossing: Pocket Camp
  • Terraria 
  • Rock Band 4 Rivals
  • Lego Indiana Jones 2 (Crystal Skull)
  • Donut County
  • Codenames Duet

ADG 08/20/18 – Room Escape Artists

Last night the folks behind RoomEscapeArtist.com (REA) presented to the kind people at the Adventure Design Group (ADG) at The Laundry in SF. 

First off, holy crap, they’ve done a lot of room escapes. I’ve done…2 real ones and 4 of the SCRAP not-really-escaping-a-room escape rooms. They’ve done over  600? Assuming an average of $30/room, and ignoring the cost to travel and stay near the locations around the world, that’s still $18,000? Yikes.

Since I was unfamiliar with their work, as I was waiting for the event to start, I looked their site up. You should do that, if you haven’t. They have a lot of good information if you are looking to go to an Escape Room.

Some of the things I learned from their presentation (and the evening in general):

  • Someone was attempting to patent the idea of a mobile escape room. The folks at REA were not amused. Hopefully that has gone away.
  • Not too long ago, Business Week spurred a lot of folks into creating Escape Rooms. Some of the less well-thought-out ones aren’t doing terribly well (as would be expected) and may be closing shop soon. That shouldn’t be interpreted as the bottom falling out. Or the sky falling. Someone’s bottom may be someone else’s sky? I don’t know.
  • They were really impressed with a number of Rooms. Two that stood out for me were:  Palace Games (I’ve done their Houdini and Roosevelt rooms) and primarily with Strange Bird Immersive in Houston (several friends went there and LOVED IT).
  • There’s a group working to start up an Escape Room pretty close to downtown Oakland. They’re called Trivium Games (triviumgames.com and @triviumgames)

After the presentation, I ended up chatting with an SF expat living in LA about Room Escape Games. Since I’m terrible at names, I think Lily? and I reminisced about the Jejune Institute. They’d done everything up through the Chapel of the Chimes, but moved before the Socio-Re-engineering event (Which honestly was probably for the best). I mentioned an old thought about Air-BnB-based Escape Room, and found out they’d done something similar. 

All in all, it was a good evening. My only regret was not having a moment to say hello to Laura Hall who was in town for the event.