Been a while since I wrote an update about this project. Lot has happened in life which is why this post has been postponed a bit. Traveled a lot for work and managed to catch the flu on one of these trips which had me spending a lot of time at home, playing RDR2.
Last post talked a bit about drilling but at that time I still hadn’t figured out how to fit all the electronics within the cube. One of the design goals is to have no visible wires except for the power/signal feed coming in at one of the sides. This means that all the power distribution has to happen inside the cube. Since the space and the AWG cable requirement is so high it was impossible to just do this the simple way. Everything has to fit in that tiny 3 way connector which meant that most of the connectors had to be perfectly flush with the 3D printed ends.
The blue outlined part representes the acrylic tube, meaning the inner diameter is about 31,5mm. Within this diameter, the aluminium profile, passthrough data cable, power cable and LED strip has to fit with junctions and soldering + the MOLEX connector that connects with the other tubes. In order to get this right i tapped the knowledge of 2 good friends who happened to be in San Francisco, Love and Pajlada once again spent a day with me to bounce ideas on how to build this.
What we ended up deciding on was that the power rail cable would be crimped separately in the MOLEX connector, then there would be a soldered junction in parallel with the power rail that branched out to the LED strip from both directions in order to ensure that there would not be a voltage drop which causes less intensity. The signal passthrough would be fixated using hot glue to the aluminium angle.
Next up, the diffusion film that goes inside of the tubes had to be inserted. Since the diameter is 31,5mm and this film isn’t made to be rolled it was quite a challenge to insert this film without damaging it and creating crevasses in the film. What ended up working is using a round wooden stick on which the film was first rolled up onto, pushed into an acrylic tube and expanding onto it’s shape inside the acrylic tube. Since I once again went too far with my perfectionism I wanted the seem to be invisible, this however meant that the cut between the 2 rolls of film had to align perfectly, so cutting this had to be very exact. Luckily I had just the solution for this.
It turns out you can use one of these plastic mats from IKEA designed for office chairs to not damage the floor as a cutting board, couple this with some 3D printed measurement brackets and a laser cut acrylic template, it was easy to cut these up and fit them into the tubes. You can see the nice effect that becomes when the diffusion is inside of the tubes rather than outside, as the acrylic tube creates a certain glossy depth.
Lots of time was spent soldering these together and fixating the LED strip onto the structural bracket. The neat thing about the bracket is that it reflects a lot of the light so the result is a very even light distribution. This picture also shows the passthrough and the exiting power cables from the rail in more clearly, this allowed the result to be very flush.
Finishing these up felt like a real milestone in this project. The only hardware part remaining now is the connector cables for the ends, which can be made very fast. From now on I need to focus more on getting the software up and running as that has been a bit on backburner due to me focusing on some other projects related to ANDERSTORPSFESTIVALEN.
My hope is to write 2 more updates about this cube in rapid succession, one about how the code has developed and one about the actual launch of this in July, see you then!
The good part about Psytrance gatherings is that they are usually located in remote areas. Unlike a big festival that focuses on ease of reach, simple transport options and surrounding services, the psytrance gatherings are often the opposite. Such was the case with Ozora USA, a small “sample” of the European experience (which was a instant go for me). The location was hidden away all the way up in the desert mountains with this beautiful view, about an hour drive from the nearest town.
Smaller festival tends to create smaller and more intimate communities, which is why they are more enjoyable. With music running 24/7 from the stage the concept of “getting drunk for the night” doesn’t exist. You can go and sleep for a couple of hours and get right back to the stage which makes it more a marathon and less of a sprint. This creates another kind of mood of the audience, being in it for the long haul together.
If you’ve never tried it, there is something special about standing with strangers and watching the sunrise come up over the horizon while hearing the echoes of the stage behind you.
The trip was worth every minute, driving through these landscapes was almost as much of a highlight as the event itself. With that said, 4 days of Psytrance is sort of the limit of what i can handle so it feels good to be home.
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 1000 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 1000 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 1000 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 APA102LED 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.