If you haven’t heard of a stackmat, it’s the timer used in Rubik’s Cube competitions. I first played with one at Caltech Spring 2005. After the competition, I convinced my mom to buy me one.
Before I started speedcubing, I was very into calculator programming. Outside of the time I spent using my beloved TI-83+ to do actual math, I spent hundreds of hours and untold AAA batteries programming on that overpriced device with its cramped keyboard. When I learned that some people had managed to wire a PS/2 keyboard to their calculators, it was something I had to try out. I bought all the components needed for the project, but a general lack of EE knowledge meant that I never actually got the project working, and my mom eventually made me move the mess into our garage.
The upshot of all this is that when my stackmat arrived, I already had the adapter and cables to plug my stackmat into my computer via the microphone jack.
I wanted to practice with my new stackmat, but I also wanted to keep track of my times without manually entering them into my computer. I scoured the internet for a program to interpret the sound of my stackmat. To my great surprise, I couldn’t find any! To this day, I believe I was the first person to try this.
I graduated from high school in 2006, and spent some time that summer deciphering the stackmat protocol. I’ll never forget the thrill of zooming into a recording and seeing a repeated waveform.
After a long time staring at screenshots from Audacity, I was able to decode stackmat signals by hand (many years later, I learned that I had reverse engineered the RS-232 standard). Friends and other projects kept me from writing a software signal interpreter that summer. It wasn’t until I had settled into my freshman year of college that I finally sat down and coded a truly awful, barely working stackmat interpreter in Java.
I kept this project secret, confiding only in Darren Kwong. I decided to demonstrate my work at Berkeley’s first Rubik’s Cube competition, Berkeley Fall 2006. Of course, that didn’t happen. I had never staffed a competition before, but there’s rarely a moment of free time. Berkeley’s first competition was no exception. Fortunately, we all met up at Dan Dzoan’s apartment afterwards, and I was able to show off my hard work. I like to think that people were impressed and excited about my work, but I honestly only remember the reactions of two people: Chris Hunt, and Ryan Zheng.
Chris Hunt was the creator of the legendary JNetCube. At the time, almost every cuber I knew used JNetCube. He proposed adding my stackmat support to it, and I remember being honored by the opportunity to contribute to a real piece of software that other people use.
I’m sure I would have become a contributor to JNetCube if not for Ryan Zheng. Ryan wanted to see my awful code, and then felt compelled to improve it. He eventually pulled out his own laptop, and we descended into a full night of hacking. That night lengthened into a full weekend. At one point, Ryan suggested the unthinkable: rather than just giving this feature to JNetCube, we could build our own superior timer! That moment was the birth of C.A.L. Cube Timer (CCT). CCT received a lot of attention from the cubing community, and we worked for years to keep up with the requests. Many features that were first introduced in CCT live on in the the myriad cube timers we have today. Perhaps my proudest moment was seeing this video of a Chinese cuber using a translated version of CCT.
CCT eventually grew into TNoodle, the official WCA scrambling program. I am very proud of TNoodle, and it gives me great joy to know that it is used weekly as part of running official Rubik’s Cube competitions.