Kassutronics Quantizer Repair
The Kassutronics Pitch Quantizer was the first true SDIY project I undertook. I’ve soldered lots of kits going back in the MOTM days, but this involved sourcing all of the parts and assembling the module. There was a major hurdle to make sure that all of the components were correct and would fit annnd I had very limited SMD experence.
Functionally it worked the first time I powered it on, but I did have a few bad connections on the shift registers used for illuminating the LED buttons. Also there was a later board modification required to make sure 12v didn’t leak out when plugging in the 2nd gate output.
Disassembling the panel and reflowing the SMD chip packages did the trick to get everything illumimating

A quick slice of a trace with a razor blade and soldering in a “bodge resistor” and the quantizer was back to two channels of awesomeness… now I’m seriously thinking of upping the resistance on those eye bleedingly bright blue LEDs!!

Panasonic Tape Cassette Recorder Repair
With my brother and his kids in town we did some thrift store shopping to pass the time and explore the Tower District
At the Neighborhood Thrift I came across an old Panasonic Tape Recorder that was in decent shape for $10. It came with the power cord and dictation microphone, so I purchased it and we enjoyed the rest of the afternoon with Mexican food and general silliness.
I had a chance to try it out and the tape was playing double speed, but otherwise worked fine.

Looking at the mechanism the pinch roller wasn’t contacting the capstan.

It was a quick fix to retension the spring and get the play speed back to normal.
Now that the tape recorder is working, I had a chance to hear some old recordings including audition tapes as well as recordings from Orchestra trips to Europe.

Audra and I also had a chance to test the dictation microphone with a Father/Daughter duet singing ROSÉ and Bruno Mars’ APT.
Always fun to give old stuff new life and share the experience of playing with audio.
20250305 Improv conversion to MIDI
Looking at the short improvisation from a few weeks back, I decided to use a tool to convert audio to MIDI. Why? Well this would be my first step in starting to orchestrate the basic melody of the improvisation and take what was a brief moment in time and grow it into a fully formed musical concept.
Traditionally this would be done by transcription of the melody as well as defining the chord and song structure. This is still the best and most thorough method because human thought is going into each note as well as the relationships between the notes to the structure and theme.
But this is 2025… we can just let computers do all that hard stuff for us right? As much as I would love to have transcription skills of a 19th century music scribe, alas my abilities are highly underdeveloped.
Turning to our robot overlords, I did a quick google search and one of the first tools to come up was:
This is a free to use, browser client side, conversion of audio to midi using Google Magenta. A few minutes of crunching was all it took to convert the audio file into the following MIDI file:
The results are not pleasant to listen to, but the basics of the notes are mostly there, the general rhythm, and the structure. This is a rough equivalent of if I were to go and hammer on a MIDI controller keyboard for a few minutes, but instead it’s gleaned from a (crappy) recording on a real piano.
The next steps would be to start to map this to a BPM, time signature, key signature, and song structure. Fixing bad notes comes next as well as chord harmonization and playback through MIDI instruments to look at timbre of sounds that fit those voicings.
Looking forward to spending more time on this and happy for now to have the rough transcription knocked out in a few minutes.
20250305 Improvisation
Unconditional love out lives all pain. I’m sorry and I love you.
Music Fonts in Common Lisp

A few months back during the holiday break, I had an opportunity to reconnect to some old friends on IRC via Libera.chat and my memories of a Common Lisp library for scoring music called Gsharp were revived. Not bad after 22 years.
I attempted to load up the old software, but the graphics library that it’s built upon, McCLIM, has had some real development done in recent years by Daniel Kochmański and team. They’ve been keeping that direct lineage of the Symbolics early and revolutionary graphics interface going and subsequently the old Gsharp code needed too many changes just to half render.
In stepping through that process I had a chance to discuss the current state of Common Lisp as well as Gsharp’s creator’s vision for a new library for music scoring along with some of the changes in Lisp Library support and some big happenings in the big wide world of musical fonts.
I decided it would be fun to try and crack into this, since it combines a few of my passions into a single coding project. First, I needed a way to load fonts into a Common Lisp graphics system and render them to the screen. Here is where Daniel and team’s hard work of building a TrueType font backend to McCLIM came in handy and so I got to work in making a simple proof of concept.
CLIM is a really interesting design based upon the Common Lisp Object System, which is one of the most pleasing object oriented implementations to use. It’s a big and robust system with a very open design that allows for a ton of customization and flexibility. The spec is rather huge and I remember being kind of overwhelmed by it all many years ago.
I’ve since had two decades of professional and amateur coding experience with Common Lisp and coming back to this spec is still a lot to take in. Talking with Daniel, Robert Strandh, and I few others, I was able to cobble the couple lines necessary render a TrueType font out to the screen. Now I just needed a music font.
The game changer in the world of music fonts is the W3C standard called SMuFL, which defines a set of glyphs (plus relationships, ligatures, sets, ranges, attributes, engraving, and registration details) in a standard way, so that fonts can be used across various scoring software. These fonts typically use OpenType font files, which are an extension of TrueType.
Attempting to load OpenType fonts using the ZPB-TTF library didn’t work, so instead I changed tact to converting the OTF files into TTF files using FontForge, which ZPB-TTF could read, and subsequently McCLIM could render.
You can find the source for this here:
http://elliottjohnson.net/lisp/McCLIM/Leland/leland-ttf.lisp
The problem with converting OTF fonts to TTF fonts is that OpenType allows for the SMuFL metadata to be stored in the font directly. This important information is used to properly render and position the font in a viewpane, but during the conversion to TrueType all of this information was lost.
As much as I would like to extend the ZPB-TTF library into an EAJ-OTF library, it is a non-trival undertaking for a future-future date. Instead I chose to examine the JSON files that accompany the SMuFL standard as well as each compliant font. These JSON files provide all of the metadata typically stored in the OTF font itself for other font types such as SVG, WOFF, etc.
Using the JSON definitions from the SMuFL spec and Bravura the model font that the spec was built around, I was able to build out a library to parse all of the font metadata and load it in such a way that all of the definitions and associations could be made between glyphs. There 13 main phases to loading a SMuFL font, each with a need to pull in data, cross reference and build out the font metadata for general use.
After doing the proof of concept, I dug into the SMuFL spec and started writing code to parse and relate all of the JSON data. The result is a library called Cloveleaf:
https://github.com/elliottjohnson/cloveleaf
Cloveleaf allows for a TTF metadata font to be defined, loaded, and prepped to use by other software. The ultimate goal is to create a cloveleaf backend for McCLIM to allow the TTF fonts to be rendered using the correct positioning, ornamentation, and clarity in order to make a useful, readable scoring application.
The immediate goal for Cloveleaf is to get unit tests written, correct issues in trying to load lesser compliant SMuFL fonts and then look at OpenType support. If you have any comments or suggestions, please leave a note below.
NLC Triple Sloths module repair.
My triple sloths module, which is an amazing source of chaotic modulation, took a dive.

The module initially worked, but the “apathy” portion of the module recently started outputting a constant -12V instead of the ever undulating voltage that I’ve grown accustomed to using in practically every synth patch.
On President’s Day I had a moment, so I visually inspected the board and all my hand soldered SMD connections looked OK. I verified all of the values of the resistors and the position of the ICs. Using the multi-meter I also confirmed all of the connections in the Apathy circuit to ground and the voltage supplies. Everything looked good.

At the end of all of that I wiped down the module to remove all of the left behind solder flux. Plugging it back in it worked!! Great, all done :)
Of course that wasn’t the end of the story, because after adding a few cables it went back to not working. The fact that it was intermittent was an clear sign that it was a non obvious bad solder joint.

Re-flowing the solder with lots of flux was the next step and greatly improved the soldering around the ICs. Another quick wipe down with flux remover and it fired right back up and ran as it should.

Happy ending, nice smooth modulation and back to making music.
uSEQ API less documented
In working with uSEQ, I’ve seen reference to a few functions such as:
FAST, SLOW, OFFSET
These functions are not explicitly described in the current documentation, but used in various ways such as:
(from-list [1 2 (from-list [1 2] bar)] (slow 2 bar))
Being an opensource project, I was able to fetch the source and looking at the file uSEQ/src/uSEQ.cpp
I found the definitions for the above.
From these definitions, I can see that the above functions take two arguments, the first of which is an array of two numbers and the second is an “environment”. The concept of an Environment is defined in uSEQ/src/lisp/Environment.cpp
, appears to me to be similar to the concept of lexical scope, and is basically handled by modulisp. As a user the first argument’s two values are what is provided, one a number and the other a phasor.
Looking at the meat of these functions, they perform the following:
FAST: multiplies by the provided factor
SLOW: divides by the provided factor
OFFSET: adds the provided offset.
The effect of this is to transform the “phasor” by applying the above rule in a new environment linked as a child to the original. This allows for modifications to the parent to ripple down to the child environments.
This does seem to imply that the global BPM is used throughout the system and defining systems with multiple BPMs is not currently not supported. Something I’ll definitely ask about in the Discord server.
cl-useq – A Common Lisp Library for working with uSEQ
Had a few moments this weekend to put together a library to connect to uSEQ. It uses a standard common-lisp implementation (tested with SBCL) and cl-libserial-port to form a serial connection to the uSEQ device (RP2040 based usb device).
I implemented a basic REPL to have a back and forth with the device. uSEQ ships with a much more full featured library called useqedit that I would recommend most people to use. I wrote this library to fold uSEQ into my native coding environment, which is Emacs and SLIME.
The cl-useq library can be found on my github along with a description and examples.
uSeq
It’s been a loong while since I last posted and I’ve been getting back into coding and music, the intersection of which got me into EE and CompSci way back in the early 2000s.
Common Lisp was the language of CLM and other software synthesis that attracted me at the time with fantasies of studying at Stanford’s CCRMA lab and the LaBRI Institute.
Nowadays there are new options like Incudine and OpusModus, which continue that direction and give me hope that I can continue to experiment with software based composition.
Lately I’ve been spending my days studying and practicing on an old studio piano as well as building a modest Eurorack DIY modular synth setup.
A kit popped up over at Thonk for a “livecoding” module called “uSeq” by Emute Labs, which is connected to the University of Sussex Experimental Music Lab. It uses a Lisp dialect (uLisp) as a means to program the module using their own DSL called ModuLisp. There is even a published paper written that discusses livecoding with this tool.
The kit comes with everything you need to assemble the module minus a soldering iron, solder, and about 1/2 an hour of time. There are two SMD switches, but other than it’s all through hole components. They have a great build guide here and there is also a prebuilt version if you’d prefer to rack it up and go.
The soldering went well and everything fired up on first go. The 10 LEDs lit up in circling sequence and it showed up as a USB device on my Gentoo Linux host running realtime Linux Kernel 6.6.36. Here is the output of dmesg
:
[646594.147296] usb 1-3: new full-speed USB device number 6 using xhci_hcd
[646594.295794] usb 1-3: New USB device found, idVendor=2e8a, idProduct=f00a, bcdDevice= 1.00
[646594.295812] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[646594.295820] usb 1-3: Product: RP2040
[646594.295825] usb 1-3: Manufacturer: Generic
[646594.295830] usb 1-3: SerialNumber: E463B013DB56402B
[646594.332211] cdc_acm 1-3:1.0: ttyACM0: USB ACM device
[646594.332284] usbcore: registered new interface driver cdc_acm
[646594.332291] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
The bolded text “ttyACM0” is the device name for connecting to this new USB connection via the device file /dev/ttyACM0. The issue is that the permissions on that file did not allow my user to open the device:
elliott@deph ~ $ ls -al /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 Aug 4 04:22 /dev/ttyACM0
The OS is assigning the Rasberry Pi 2040 chip on uSeq as a communications device (like modems) rather than a USB serial device and so it assigns the “dialout” group and root user. If I’d like to connect to the device, I’ll need to either join that group or change permissions. I decided to change the permissions and the best way to do that is by setting up a udev rule. Here is what I added:
elliott@deph ~ $ cat /etc/udev/rules.d/50-useq.rules
SUBSYSTEMS=="usb"
ATTRS{idVendor}=="2e8a"
ATTRS{idProduct}=="f00a"
GROUP="audio"
MODE="0660"
The idVendor and idProduct were from dmesg
output above, but also can be found by doing a lsusb -vvv
to see all the details of the device. I have the “audio” group setup, my user configured to use it, and I changed the permissions to “0660” to ensure read/write access to that group as well as the root user. The udev rules were reloaded and the cable replugged back in to complete the permissions adjustment.
elliott@deph ~ $ ls -al /dev/ttyACM0
crw-rw---- 1 root audio 166, 0 Aug 4 04:22 /dev/ttyACM0
Now that we have a device and it’s attached, we can connect to it via a serial console emulator app. Luckily Emacs has built in methods and it was quick to load serial-term
mode and connect to the device with an “9600 baud 8N1” connection rate using line-mode
.
All this went flawlessly and I was soon issuing ModuLisp commands to the uSeq module to get reoccurring patterns on the analog outputs. Looking at the code it’s apparent that there is a python interface (useqedit) and I believe a SuperCollider interface here. The easiest method of connecting with uSeq is the webbased interface and it works well.
Over the next few weeks I’d like to go over the current state of the development environment, commands, and other aspects about using this module towards doing some livecoded audio.