It’s December in Stockholm 2015. The cold winter is just on the edge of rolling in and one of the weirdest years in my life has just ended. Not only have I started at a new job at the other end of the world but I’ve dealt with a lot of personal struggles along the route.
Seated in a well known pub just a few blocks from my apartment, discussing whatever two drunk men discuss a Tuesday evening I bring up the subject about the fact that we are drinking on a Tuesday. It’s an infected subject for both of us, my colleague and I both had alcohol-wise intense years due to external factors, shitty jobs and extensive traveling. In the haze I utter “Being sober is easy though” and my colleague reacts with “If it’s so easy why don’t you do it?”. A very good question indeed, why not? Why did I insist on drinking yet another Tuesday night at this bar with my colleague, knowing fully well that I would meet him at a party just a week later. “Sure I’ll do it” I said, quickly followed up by “I’d even do it for a year”. My friend looks at me like I’m crazy and says “I’ll bet you a 10000 EUR that you can’t do it”. What my friend doesn’t know at this point is that I’ve already decided that this was going to happen; although moderately intoxicated I felt that this had to be done in order to change a dangerous habit.
“Sure, I’ll bet you a 10000 EUR that I can be sober for a year.”
Alcohol is a great drug, in fact there’s enough written and said about booze that I don’t have to recite it here but one specific part that many people overlook is the really powerful stress relief alcohol provides. In a high stress environment like my new job, alcohol provided a way of turning off the job for a short while, clearing thoughts and creating an efficient relaxation to recharge after the long days. It’s fair to say that I was completely lost the first month of 2016, not by the loss of alcohol but by the loss of stress relief. In fact I’ve spent the last years solving stress with alcohol that when it came to it I couldn’t decouple work from my private life without it.
I moved to a new apartment in February and my SO went on a long work trip, leaving me alone in the new apartment with basically nothing to do. In a desperate attempt to waste time I took up gaming again, having fallen out with it earlier. Long nights of Witcher 3 usually ended in scouting the Internet for music to build support pillars for the deep winter depression that March in Sweden easily delivers. You know that state that happens sometimes where all the music you have is boring and all the new music you find is not what you want.
Then one night, working through a project in Go, shuffling through the crates of new music comes this long drawn out filter sweeping white noise through my Genelec 8040s followed up by an rather silly baseline hinting on something completely different to what the intro provided. I’ve just heard the intro of Todd Terje’s dance masterpiece “Inspector Norse” and for about 40 seconds of FLAC goodness I’m suddenly alive again.
Everyone who’s heard the song know what part I’m talking about. Once that specific part cued in for me the first time I know that I won the bet, breaking through the 3 months of downward spiraling that all of this combined added. A composition of pure joy, filled with the most rememberable lick that an ARP2600 synth has ever produced provides me with this intense joy that I haven’t felt in so long that it’s unclear if I by mistake had MDMA for dinner.
I didn’t think about it at the time, looped the song a few times and went to bed, reading the “Witcher” book and falling asleep. Waking up that morning was what provided the confirmation that this was a moment that changed it all, life suddenly felt bright again and the hardships of the cold Swedish winter was soon to be erased with another San Francisco trip. I’ve spent the day looking up this song and trying to figure out how on earth I could have missed this release in 2012, stumbling on the mockumentary made for the track called WHATEVEREST.
WHATEVEREST follows the life of a young male in Norway coming to terms with adult life, realizing that many dreams are secondary and that life didn’t turn out as planned. The character although portrayed in a depressing and weird light shows the joy in small things in life, enjoying what’s given and appreciating the day with the motto “No Bad Days”
The video had an strong impact on me, resonating with a lot of what I’ve felt over the past years. Not only the constant chase of the “next” thing, the failure of using and appreciating what I knew and had coupled with the lingering feeling of having missed the boat was put in words by the character in a relatable way. I’m not even sure if this was the intent of the video other than exploring the mockumentary space but parts of me believes that the person behind this video felt a lot of this himself (or met me in 2013). Although meant as a meme, “No Bad Days” became my motto for the year. Caring to deeply about missing parties, work deadlines or potential jobs shouldn’t destroy my day, I had to appreciate what the day had in store.
July was the mid point of this bet. The first iteration of ANDERSTORPSFESTIVALEN was held before we even knew it was a festival. I hadn’t met many of these people in a while and traveling down to a party of this scope sober was a mental challenge indeed. It’s 1AM in the morning and it’s the one hour during the Swedish summer in which there’s some actual darkness, already in a terrific mood someone turns on “Inspector Norse” and it’s if this wave of joy comes on me again. The exact same feelings I felt that empty day in March repeats and once again I felt free, free of the baggage I carried with me from the past few years of an abusive work situation and mountains of stress.
Winning this bet became a breeze rather than a challenge and I developed new methods of coping with intense stress (something 2016 still had in store for me). I collected the 10000 EUR in cash later that year at the New Years Eve party after midnight and had the first beer in a year.
Fast forward to June 2017, I’m sitting in a couch in San Francisco with one of my best friends that worked at Facebook at the time. We’ve just spent 2 weeks together sharing an apartment and we’re now seated in the sofa late at night with a laptop playing back music. I hadn’t heard Inspector Norse in a while so I put the track on. While the taste of beer and enjoyment of alcohol changed dramatically for me, the track that was playing through the laptop speaker hadn’t, still evoking the same emotions of pure joy.
I woke up the after about 1 hour of sleep en route for a flight to LA to lead the technical production for Twitch’s E3 coverage and adjacent streams. Even if the sleep deprivation felt absolutely awful I knew it didn’t matter, the moment had proved to me that the track is what did it. “Inspector Norse” was the turning point of a life on the downward slope to a future filled of joy.
Few weeks has passed since my last entry, mostly because I’ve had a lot of “actual” work on my plate which has had priority over the project. Humans tend to see progress as a exponential process or a skipping process. You will see the result of the creator and the result has to stand for itself, meaning that the time that was put into the project is transparent to the viewer of the project itself. This is probably the hardest part of building a project as for a good project to work, there is a lot of scaffolding that has to be done that progresses the project but not the result. Hence projects progress on a linear timescale while results progress on an exponential timescale. The project will show no result for a long amount of time until all the pieces align and the result evolves quickly. Same goes for this project, spending tons of time on designing the small parts does advance the state but I feel it’s just further away from when the prototype was mounted in my living room. It’s almost like the result has progressed backwards but knowing this and pushing through it is what will take me out of the local minima.
With that said there has still been a ton of progress happening in the few off hours that has surfaced over the weeks. It turns out that repeating a task multiple times just multiplies the odds of something going wrong in each step. As an example, the cheap 3D printer that I’m printing the parts on has broken down in every single imaginable way and I have had to spend time replacing components, driving my to the point of purchasing a new different 3D printer (Prusa i3). The first thing that broke down was the build plate. Adhesive tape just didn’t cut it for me so i decided on printing on glass with thermal pads which has been very successful for my projects so far, while the act of making prints stick are harder, the print quality is better. The second thing that broke down was the stepper motor, quickly followed by the hot-end fan. Both replaced with better components and modded onto the printer in place.
I guess you just can’t assume great consistent quality from a $159 (with shipping) printer from Monoprice. It’s clear that the printer hit that price point by cutting tons of corners and while I still recommend the printer to get into 3D printing, be aware that it will not last you printing over 3 kilos of PLA before something breaks.
The printed drill guides that i showed last post turned out to work very well for the purpose. They fit perfectly on top of the part and made drilling equal holes a breeze. As you can see here the first one fit the entire bar and mounted to a plank to ensure equal holes on both sides whereas the second fitted over one of the corners in order to allow drilling 3 perfect holes per outlet.
With all the parts printed (24+ barholders) and bolts glued into the holders i was able to mount together the physical parts without the actual LED bars within them to test out the rigidity of the solution so far.
Turns out that it fits extremely snug, there was some extra drilling for some alignment purposes but the design 99% works for the use case. Huge relief right here since I’ve been very worried about if the actual thing will come together in the end. This leaves us with 2 remaining large tasks instead of 3, namely electronics and software. There has been a lot of changes in how I’m attacking the electronics but I will leave that for the next post as I believe that there’s more conclusion to be had by explaining it in more detail so that leaves us to the software part.
In an earlier post i discussed about what the optimal solution was for having a lot of CPU horsepower yet a dead simple SPI solution to feed bits to the APA102 LED strips. After playing around with USB->SPI bridges and a variety of different solutions, all working but not working perfectly, the most obvious solution surfaced by itself. Sometimes i forget that most computers today are outfitted with a standard high speed communication bus that can be switched between devices and easily extended, namely hardwired Ethernet. Even if the Raspberry Pi is too slow to drive pattern generation and FFT it can without a problem just consume network traffic and convert that into APA102 data at the desired framerate. So i spent time building a Raspberry Pi bridge that connects using ZeroConf/Avahi and consumes pixel traffic from the nocube host.
Another problem that quickly surfaces was the need of having a way of testing out patterns and code without having the cube setup, leading me to build a “simulator”. The simulator was surprisingly easy, since all the “pixels” are mapped in a cartesian coordinate system between 0 and 1 (float64), rendering the pixels in Three.JS took an hour or two with the largest problem being figuring out how to efficiently stream the color updates per pixel. Here’s how the rendering currently looks in Chrome.
After this I started on the actual audio processing part of this project with Aubio. I rescurrected a seemingly abandoned project on Github and added the bindings to the C code i needed that didn’t exist in the current bindings (now available in my fork). With this in place i wrote a simple naive FFT pattern to test how it would look. In this case the pattern just renders the 1024 bins summed down to nearest pixel in the bin. It doesn’t really look great when rendered naively at 5 FPS in a web browser, but here it is regardless.
Apart from this there has been general work on the processing pipeline in the project, now allowing for multiple processing pipelines to run simultaneously in a threaded manner feeding into the result per frame. There is a new rendering loop that allows the internal generation to run at a fixed framerate which lets outputs lock onto that framerate instead of having the output dictate the framerate of the rendering. This makes sure that the patterns renders in full speed on the device I’m using regardless if i have an output connected or not, allowing me to benchmark the performance of the patterns.
Seeing the demo come together has me convinced that this will look really good once up and running as a complete project. There is still a lot of work to do but every day gets me one step closer.
Although I’ve written about how i feel the Internet has changed over the past years, there are still these glimmering moments of brilliance that outshines a lot of the negative self-centeredness we have today. FatalFarm’s “Lasagnacat” is one of them. A series of weird videos published in 2008, exploring the digital tropes of the time only to go into a long hibernation. 9 years later, LasagnaCat reappears on the internet with an array of new videos, all published in a Netflix-esque fashion by dumping them all online in an instant. Of all these videos, there is one that sticks out above the pack of videos. 07/27/1978 starts out in the classic LasagnaCat format, starting with a reenactment of a Garfield strip followed by a capture of the original strip for comparison. After the sketch has ended, LasagnaCat provides their own commentary on the strip and in this video the commentary is a 1 hour long monologue read back by John Blyth Barrymore. The 1 hour monologue, cut to show a one-take shot is backed by a fantastic production value with a nonsensical, yet intriguing script set to the “Kundun” score by Philip Glass.
This is the perfect embodiment of internet mashup culture unlike what I’ve seen before. A deadpan commitment to the joke, creating the impression that the creators are serious about the intent of the video. In a world of short form video, episodic content striving to hit the magic barrier of 10 minutes to meet YouTube’s ad density requirement this video goes against all the established formats to provide one hour of monotone, yet unique and well produced content. It’s hard to actually recommend this video, as the enjoyment i got from the video didn’t come from the video itself. Rather the gratification this video delivers is the meta commentary on what i believe is the authors opinions on the state of YouTube in general.
The last two weeks has mostly been a repetitive process of sketching in Fusion360, slicing, printing, verifying and realizing i need to tweak something. Hence repeating this entire process over for a couple of iterations. Since the tolerances of the fittings needs to be perfect, the whole thing becomes an interplay between designing around the limitations and tolerances of the 3D printer while having the parts come out as i want them. All these iterations has become quite a few prototypes:
This is also the reason i decided to make the lamp in part 2 as a different project. There was a lot of prototyping i needed to do to verify that the approach is sane, building a lamp allowed me to verify some of these ideas without printing parts that i intended to throw away afterwards. Sort of like a stepping stone in order to reach the final decision.
After designing quite a few different variations on the end caps for the rods i settled on a design where three M4 hex nuts can be slotted in, locking the rod in place through pre-drilled holes while holding the L angle in place through a slide-in fit.
With this done (a relief) i had two remaining problems:
After looking into a bunch of options on different connectors and solutions it was clear that there had to be an actual connector, a terminal block would not work due to the restricted space within the fittings. Since the budget had already gone out of the window for this project, going for Molex Connectors seemed to be the right choice. I purchased a bunch of Molex SL and Molex 0.93 2 pin connectors from Mouser, with the problem being that Molex has maybe a million different connectors, so figuring out what exact connectors to use was hard. For example, this is the spec for a Molex pin, figuring out what goes with this is not obvious if you haven’t used the ecosystem before. Someone should build a digital Molex compatibility guide. The Molex SL connectors are perfect for the SPI and the 0.93 plug can sustain up to 15A, making it perfect for the use case. You also have to buy the for some reason ultra expensive Molex tools (sad face).
With all this done, a rod could finally be powered up in the form it will have when this cube is done, using the proper connectors and a simulator to drive the APA102
So for the second problem, this was again one of the situations where Love had great feedback on how to approach the problems: “Just 3D print a fitting for the fitting with pre-printed drill holes 4Head”. Sounded like a wild idea but had to try at least, so i designed a hood for the 3-way PVC fittings:
Printing this turned out to work also (after some tweaking of the model). Sliding this on onto the 3 way fitting ensures a snug fit while making it easy to drill perfectly aligned holes. I ended up sketching out the same approach for the rods, with two symmetrical drill mounters that i can screw to a table with a rod mounted and use as a drill guide.
With all this done, the remaining parts for the building of the cube is actually just manufacturing 11 more rods, which due to the printing time (9 hours per rod) will take a fair amount of time on the smaller 3D printer i have. Thanks to this though i can head back onto writing the software. Software wise I’ve changed my mind about some minor design implementations but this is something i will cover in the next blog post.
Hope you enjoyed this update, I will try to post the next update within a few weeks!