While I was at the NYC 2600 this month (September), I was talking with someone involved in chiptunes and it reminded me of one of my ‘secret’ projects that I somehow forgot to mention more publicly.
This was a project that I put together all the way back in 2008/2009 (hardware/software respectively). Pretty much all of my friends know that I did this, but I still never really made it ‘public.’ This was still during a time that I was kind of a perfectionist about things (which means you didn’t see too much from me). I didn’t want to publicly mention or post about it until I got it working perfect, and maybe had some kind of cool demo video to go with it. But then making a video would mean I would have to have a killer song to demonstrate, which would mean I would have to write a song, but not just any song, the perfect one, right? Some irony is that I feel like that I had already completed hardest part of the project (writing the audio driver in assembly). But it still wasn’t good enough to talk about.
I’m mostly over that kind of mental paralysis; I’m not at all like that at all anymore. If I’m working on something, I only keep it ‘secret’ until I have a PoC (because PoC||GTFO). I think I’ve always kind of found perfection to be boring anyway. I haven’t really done anything with the project since then (it’s possible I’ll dust it off soon), but I thought I would blast it here for those that it interests.
I will start with pictures, then talk about the technical details:
Bass in it’s original form. This bass was a gift from my dad. It’s a 4-string. Although I did physically modify it to handle the lower strings of a 5-string bass. So the tuning is B-E-A-D (not E-A-D-G):
The inside electronic guts on the back (all eventually removed):
Propeller dev board with low-pass filter soldered to it (some caps and a resistor), before installation:
Front of bass after modification (with NES for input to Propeller):
Closer image of front:
Back of bass, showing the computer/propeller:
Image showing 2 separate audio jacks; one for bass, the other for computer. This setup allows me to isolate each audio channel for different effects, instead of bleeding them in with each other.
Some Technical Stuff:
Physically, I used a router attachment for a dremel to hollow out a big enough area to fit the propeller. In front is a standard NES controller, but the wiring of those old things suck, so I instead used a CAT5 cable and used the wire from that (no it’s not ethernet, just using the wires). [Edit] I am told that I got this idea from Shaun Cox. I’m not perfectly happy with some of my design choices, like how the battery (9V) is under everything (and it takes minutes to disassemble). The clear plastic felt cool at first, but it’s not super durable and will be a pain to replace, however, at the time I didn’t have as ready access to a laser cutter. The computer is a propeller microcontroller. It may not sound like much for 2015 (with Edison, RasPi and other cool stuff), but when the chip came out in 2006-ish, 8 32-bit cores at 80 Mhz each (easily overclockable to 160) was kind of a big deal. I still think it’s nothing to scoff at; LoST used this chip in the recent Defcon 20 and 22 badges. As a side note, LoST got me into Parallax (company that makes Propeller) gear when he gave me a basic stamp II at a 2600 meeting more than a decade ago.
Software wise, I use an existing NES controller driver (found in the Hydra platform that I bought to learn Prop) and I created my own 4 channel audio driver that works with hard-coded data wave tables (think square, sine, saw, triangle, noise, etc…). Hydra had a good audio generation driver (algorithm generated), but I found it to be inflexible. Then the main software can do higher level tricks; like one button push could do a macro of timed notes, or ‘shift’ the audio quality lower (on the fly), or pitch shift an already playing note, etc…
Here is my post to parallax forums talking about my excitement of making this monster:
And eventually (about a year or two ago), I dropped this code my github page and made it ‘public’ without really saying anything about it to anyone. So if you want to see code: