Recent Content

2023 Reflections

posted on 2024-01-02 09:45:00

2023 was a bad year. It had bright spots, most notably my honeymoon in Morocco. But a large portion of the year and a lot of the second half was a real slog. My dad and my last and favorite paternal uncle died. My dog and my stepmother got cancer. My company went through a tumultuous leadership change and re-org.

It was the year of questioning everything. I questioned my career ambitions and my industry. I questioned my hobbies and whether I really enjoyed them. I questioned financial decisions. I questioned my health and my own character. About the only thing I didn't question was my relationship with Norma.

That said, there were a few things that really went right in 2023.

Regular Exercise

I started going to spin classes in Grant Park with Norma around October 2022. This has been one of the best things for ensuring I get out of the house and get some endorphins. The structure and the forced recognition that I'm doing something good for myself are huge. I'm very glad to continue this in 2024.

Seeing James and Aaron

I love James and Aaron so much it almost hurts. I've been making trips to California to see James every 3-6 months for about 2 years now and seeing Aaron in Canada once a year where possible. This past fall, Aaron came to see me and stayed at the house for a week. I was finally able to show him so favorite Atlanta haunts and it was generally a great time.

I'm traveling to see James again in February and really looking forward to it. It is hugely important for me to see these people I respect and am edified by.

Collecting Weird Records

I listened to a lot of music in 2023. Well, probably not as much as I would have were I still an engineer but I still found some lovely albums. It has been really fun for me to explore weird sounds and build up a collection of records that I find engaging, interesting, exciting, and weird. They aren't the best albums for anyone, even me, they're just things I have enjoyed. I hope to do more of this in 2024.

Hopes for 2024

I'm still bracing for 2024, despite myself. I know it should be a better year. And yet, anxiety feels like the starting point for how I look at what is coming. I don't have very explicit goals, and rarely do, but I have some clear intents.

1. Be kinder to myself

This is so hard for me. People who don't know me closely often don't realize how harshly I judge my own work and actions. I tend to worry I'm not doing much of value with my life. It sounds wild to me but I'm going to have to practice catching myself when I'm getting stuck in an anxiety spiral or speaking negatively about my own efforts and try to speak encouragingly and lovingly to myself.

2. Enjoy hobbies in small steps

I have a bad habit of waiting for large chunks of time off before I allow myself to undertake major creative projects. I feel that if I can't point to progress of some form after a few days engaged in a problem, that I should be ashamed of that. This is a habit worth breaking for many reasons.

The biggest adjustment I want to make is simply to enjoy hobbies and creative things regularly but without the pressure of delivering anything. I don't know when the pressure overtook the process but it's been a lot of years and I don't feel I can afford to lose any more. I need to be enjoying my life now in whatever ways make sense to me.

3. Write more

I'd like to blog more. I have said the same thing for the past few years and struggled to build the habit. I'll give myself a break since 2023 was a year of everything being on fire and me being emotionally exhausted. The desire to write has not changed. I have thoughts worth articulating if I just make space for it.

Conclusion

That's it. Probably a bit anticlimactic but I wanted to get down the core parts of how I'm feeling before 2024 gets too far underway. I also thought I would get some clarity over whether or not I want to say at Calendly or stay an Engineering Manager over the holiday break but that hasn't come yet. I'm sure I'll figure it out as the year goes on.

Favorite Albums of 2023

posted on 2023-12-29 10:20:00

I really love discovering and listening to new music. In fact, going through "Best of the year" lists is one of great things I enjoy doing over the holidays. I don't make it a habit to listen to everything, but I skim through and try to find a half dozen records I'm unfamiliar with to audition. I've used publications for this in the past (Paste, Pitchfork, Popmatters, etc) but have also really enjoyed individual lists from some folks, notably @funkentechno who writes OptimisticUnderground.

A personal list is a good list. Yet I haven't historically written many lists myself. The last one I wrote up dates to 2011! But before I get into that, let me just say "Fuck spotify" for a whole host of reasons not least of which is that:

  1. you don't own the music you love and
  2. they exploit the hell out of musicians

Use bandcamp and discogs wherever possible. Or until folks start using faircamp or jam.coop anyway. (Youtube or piracy for purposes of auditioning before buying is fine, of course.) I'll include links where I can.

With that out of the way, let's talk tunes. I've broken things into very loose categories of Indie, Ambient, and Techno. I confess I'm biased towards exploring instrumental and electronic music. I've listed 20 albums from 2023 and have additional sections for music that held over from 2022 or were discovered (but not originally released) in 2023.

This also feels a bit like the year of really diving hard into Ambient and trying to build a map of the territory. I've started exploring the catalogs of labels like Astral Industries, 12k, Faitiche, Silentes, Sferic. Grief and a need for comfort informed the larger than usual representation of that genre. Now off we go...

Continuing influence

It's interesting to look at what albums held on from 2022. In that regard, JID and SZA were really stuck in my head and wound up as 2 of my top 5 albums by plays (according to last.fm). I'm sure there are other 2022 albums that weren't in rotation long enough that I should run back too. :)

Indie, etc

boygenius - the record [Interscope]

Standout tracks: $20, True Blue

The indie girl supergroup returns. It is hard not to love boygenius but this album didn't land quite as strongly for me as either their EP or Home Video by Lucy Dacus. Still, it is impossible to ignore work from these three and there's a lot to love here.

feeble little horse - Girl with Fish [Saddle Creek]

Standout tracks: Freak, Steamroller, Paces, Sweet, Slide, Heavy Water

Man, I really loved this album. It is a real contender for AOTY for me. I had a really shit year in 2023 and the fuzz and shoegaze vibes of feeble little horse was just what I needed from about February to September. It is a shame because it seems like the band may have broken up (canceled summer tour, radio silence). I'll be coming back to this one for a while.

Kelela - Raven [Warp]

Standout tracks: Happy Ending, Let It Go, Contact, Far Away

I've been following Kelela since Hallucinogen so I knew I had to check out Raven when it was announced and it didn't disappoint. It feels like the most polished and fully realized version of her sound I've heard. An immaculately produced and deeply sensual album.

Softcult - See You in the Dark [Self-released]

Standout tracks: Dress, Love Song

I got turned onto this one by a Daniel Avery interview of all things. The album is uneven but Dress and Love Song really got their hooks into me. Anyway, fuzzed out guitars and elegiac vocals was just the recipe I needed a lot of this year and Softcult delivered.

Youth Lagoon - Heaven is a Junkyard [Fat Possum]

Standout tracks: Rabbit, Prizefighter, The Sling, Mercury

I had no idea I needed Youth Lagoon and then the album hit me over the head with the weight of a freight train. I found it in August after Dad's death, Uncle Mack's death, and a company re-org. It was on loop continuously for a month as I processed grief and exhaustion. The simple, lovely harmonies and worn singing from Trevor Powers guided me through a lot.

Yussef Dayes - Black Classical Music [Brownswood]

Standout tracks: Rust, Turquoise Galaxy, The Light, Chasing the Drum

I missed out on an opportunity to see Yussef Dayes right after Thanksgiving and have been kicking myself for not buying tickets soon enough ever since. This is the best jazz album I heard all year and Yussef's drumming is just impeccable. Infectious and endlessly listenable. This one is a joy from start to finish.

Yves Tumor - Praise a Lord Who Chews But Which Does Not Consume [Warp]

Standout tracks: Heaven Surrounds Us Like A Hood, Fear Evil Like Fire, Ebony Eye

What is this stuff? It doesn't matter. Like Flying Lotus inventing a universe with Cosmogramma, Yves Tumor has created a sonic world to get lost in. Massive, beautiful, and psychedelic but never serene, the groove and stomp of these tracks is ever present. I was hooked from the first notes of Heaven Surrounds Us Like a Hood and never looked back.

Ambient corner

Anthony Naples - Orbs [ANS]

Standout tracks: Moto Verse, Silas, Scars, Unknow

Anthony Naples has made a gorgeous, enthralling downtempo record with Orbs. I played it in team retros, I played it when I was driving, I played it when I needed to be pulled back to center. Smacking of trip-hop and dub, these elegant tracks were just what was called for.

Gigi Masin & Greg Foat - Dolphin [Strut]

Standout tracks: London Nights, Love Theme, Viento Calido

Some tracks lean more jazzy, some more ambient, but without fail Foat's keys and Masin's synths are a perfect pairing. This album is a warm blanket to wrap up in when you can afford to slow down and be still.

Gigi Masin & Rod Modell - Red Hair Girl at Lighthouse Beach [Silentes]

Youtube excerpt

Standout tracks: Red Hair Girl at the Boat Stop, Summer Morning at Lighthouse Beach

I took a gamble on this physical-only release based solely on what I know about Gigi Masin and Rod Modell and it worked out. The first track is an aquatic dub excursion to the bottom of the ocean, the second track is ethereal ambient basking in sunlight. Both are unhurried, beautiful, patient. I hope these two decide to team up again soon. The initial run sold out lightning fast but there is a repress coming you can preorder...

Jonny Nash - Point of Entry [Melody as Truth]

Standout tracks: All I Ever Needed, Silver Sand, Face of Another

When the guitar's delay cranked up two thirds of the way through All I Ever Needed, my eyes rolled back in my head. The beginning of this album felt a bit too somber to me but the rest is keys, guitar, and saxophone gently carrying me away.

Purelink - Signs [Peak Oil]

Standout tracks: In Circuits, Stadium Drive, Pinned

Hovering somewhere on the precipice between Ambient and Dub, this album is as good a modern day example of Ambient Techno as you're likely to find. It makes perfect sense for Peak Oil as a label as well, sitting very well alongside Topdown Dialectic.

Rod Modell - Ghost Lights [Astral Industries]

Standout tracks: N/A, it is one contiguous journey

I took a chance on this based on Rod Modell's work as Deepchord and liked it a good bit. But buyer beware, if you're unfamiliar with Astral Industries this is more ambiance, field recordings, and subterranean echo and crackle than melody. But Rod Modell is the master of creating a sense of place and proper headphones or monitoring can take you on a real journey with this record. Slow down.

Rod Modell & Taka Noda - Glow World [Silentes]

Youtube playlist

Standout tracks: N/A, they are all untitled, it is one contiguous journey

If Ghost Lights is the ambient record and Red Hair Girl the ambient/dub pair, Glow World seems more clearly anchored on the dub side of the spectrum. It has a steadier thrum than the previous two records (but this is not techno), so if the anchor of bass or a kick would be helpful this is where to begin. It sold out rapidly all over not unlike Red Hait Girl but you can stream it on youtube and there are copies popping up on discogs here and there.

Techno

Andrea - Due In Colour [Ilian Tape]

Standout tracks: Ress, Remote Working, Chessbio, Hazymo, Return Lei

It must be hard to be on Ilian Tape because of the inevitable comparisons to Skee Mask. Since his debut album Ritorno, I've felt that Andrea is the most slept on member of the label. He has a very distinctive style, still incorporating the ever important breakbeats and lush pads that are core elements of Ilian Tape, but wandering further afield into jazzy ambient pastures than the rest of his labelmates. Due In Colour sees that style reach its full potential. It is an enthralling record and a wake up call for anyone still sleeping on Andrea.

Dario Zenker - Reflection [Ilian Tape]

Standout tracks: ASM 61 Gate, Ear 660 Cruise, The 600 Prophets

What can I say? I'm a sucker for Ilian Tape. It's been interesting to see the two Zenker brothers that founded the label, Dario and Marco, veer away from their long history of records together and both release a solo album in the last 24 months. While I think Marco's Channel Balance is my preference both are excellent records. The drum programming on Reflection is impeccable but it is the aqueous, dubby ambience that really captures me. Gorgeous stuff.

Gacha Bakradze - Forget [Oath]

Standout tracks: Shifting, Lake

There's something in the water in Tbilisi. Gacha Bakradze and HVL are maybe the two most prominent exports from Georgia's techno scene and I can't get enough of them. The soaring melodies in the A-side hooked me more than the B-side on this EP and it was nice to see Gacha branching out a bit from his usual style and home on Lapsus.

Gacha Bakradze & HVL - Splits [Organic Analogue]

Standout tracks: Infinitesmal, Routes, Chain

When I saw that there was a split EP from Gacha and HVL coming out on Organic Analogue, I preordered it before reading anything else or looking at the track listing. I have no regrets.

HVL - Dialogue [Self-released]

Standout tracks: Nugeshi, Enjoyable Recollection, 6km Freight Train, Collgen Live Chords

HVL (Gigi Jikia) is my favorite techno artist that I don't hear people talk about enough. He isn't unknown by any means. Aphex Twin and Daniel Avery play him in DJ sets, his debut album Ostati made 2018 year ends lists from Mixmag and RA, etc. HVL's output is a bit intimidating though. In the last 4 years, Gigi has self-released no less than 5 double albums in addition to Dialogue. In total, that is around 11 hours worth of techno since the start of the pandemic. That starts to put you in line with acts like Aleksi Perala and Autechre. The quality of his productions remains superlative but even I'll admit a lot of the post-pandemic work feels more like track dumps than albums. That said, Dialogue is the shortest, most focused and accessible thing he has released since Rhythmic Sonatas to my ear. I'm hopeful that it will get the wide audience it deserves and, if I'm very very lucky, a vinyl pressing at some point.

James Holden - Imagine This is a High Dimensional Space of All Possibilities [Border Community]

Standout tracks: Common Land, In the End You'll Know, Continuous Revolution, The Answer Is Yes

Holden's most famous album "The Inheritors" has moments of brilliance but never fully clicked for me. There's a steadiness to the arc of his latest album that I had a much easier time following, where with Inheritors I would get thrown off course. And when the drums come in a minute into Common Land? The birds sang, the rivers whispered, the seasons of the earth returned unerringly, a fox chased a mouse in a thicket, and for a moment everything was just right.

Surgeon - Crash Recoil [Tresor]

Standout tracks: Oak Bank, Metal Pig, Subcultures

Though it is quite consistent in tonal palette and general structure, it is fascinating to listen to the process behind Crash Recoil. Anthony Child takes the same MIDI sequences, synths, and samples, and contorts them into a constellation of shapes just as he would live. We get to hear him riff on mixing and arrangement and find the different ways to combine simple elements to make people move.

Tammo Hesselink - Beam [Nous'klaer]

Standout tracks: Function As Foils, Eraser, Etseled

Normally, work as spare and minimal as Tammo's is pretty challenging for me. I'm still trying to process the albums of his labelmate Konduku, for example. But something about Beam just worked. The drums and delay on Function As Foils engaged me immediately in polyrhythm and negative space. The aggressive rush of Eraser's percussion juxtaposed perfectly with the arrival of sumptuous pads. This is just solid hypnotic techno.

Discovered, not from 2023 (reissue, late to the party, etc)

WHEW!

There we go. 3500 words and 30 great albums. Go listen to some music! Will I be back next year? Maybe! 😂

If you discover something you love, by all means drop me a line and let me know.

Grief and recovery

posted on 2023-07-11 09:43:00

I hardly know how to write anymore. The last 13 months have seen the funerals for my dad and both his brothers. My stepmother is also in the hospital for a mass on her pancreas. In short, it has not been a quiet year. I've always had a troubled relationship with my dad and that extended to his side of the family because I thought how I fit in to the rest of the family depended on him and our relationship. I am grateful at least to have finally realized that isn't the case.

Uncle Mack was the Butler I felt closest to. In part because he reached out and had me come stay on the ranch in Bozeman with him a week or two in the summers when I was 13 and 14 and Terry wasn't around. I can't remember any specific conversation we had but he made me feel seen and that meant a lot in a family where I felt like I didn't fit.

I'm taking Mack's death rather hard ... but not from missing him. It makes me ask "what am I doing?". You see, Mack was a cowboy and a lawyer. He worked for Ted Turner's legal team for a number of years, made partner, and at some point took a vacation to Montana. Within months of that vacation he stopped himself from walking into a board room, resigned, moved to Montana, and started a new life. In short, he said "fuck this".

Mack was a larger than life character and there are a ton of ways that I don't think I'm much like him. But in this one aspect, I would like to be. I think I've been too safe these past few years and I'm not sure what it looks like for me to say "fuck this" and lean into something more meaningful to me. I haven't been as financially successful as Mack that I can start over quite so easily. And there's a lot about my life as it exists that I'm not unhappy with. Norma and the house, honeymoons in Morocco and driving a silly car, this year has had its good points. But I spend more time worrying about the future then focusing on what excites me. I've got my grip so tight at this point that I can't hear my gut when I listen. I could be overreacting but I think something has gone wrong here.

Burnout Update

posted on 2023-02-27 12:40:00

Well, it's been 2 weeks. Dad died 11 days ago. I'm headed to Morocco for my 3-year delayed honeymoon on Friday.

I think I'm starting to come back a little bit. For most of this year, I haven't been able to convince myself that my hobbies were worthwhile. Why did Lisp or emulators seem important? Why were videogames interesting? Do I really think I'm going to ever do anything useful with my modular synthesizers?

I'm still moving slowly but some life is coming back. I'm really glad I've had spin as something to keep pushing myself to do, just for endorphins and getting out of the house if nothing else. The rest has been hard. One of my favorite parts of myself is discovering new things and sharing them with others, the pursuit of passions. When I'm low energy like I have been, it's harder to like myself than usual.

I can tell I'm starting to get my energy back because I got sad when I realized I almost certainly won't take a laptop on my honeymoon. Sure, it's 12 planned days of travelling around Morocco but I finally have energy to hack, to write, to think! It's okay. I have never in my adult life taken a vacation without a laptop and it's been ten years since I was off work more than a week. It will be good for me. And I will still find the energy to care about my projects, even if they are silly and uniquely mine, not meant to influence the arc of industry.

Milosz is speaking to me as always:

Earth Again

They are incomprehensible, the things of this earth.
The lure of waters. The lure of fruits.
In rouge, in vermillion, in that color of ponds
Found only in the Green Lakes near Wilno.
And ungraspable multitudes swarm, come together
In the crinkles of tree bark, in the telescope's eye,
For an endless wedding,
For the kindling of the eyes, for a sweet dance
In the elements of the air, sea, earth and subterranean caves,
So that for a short moment there is no death
And time does not unreel like a skein of yarn
Thrown into an abyss.

... later he writes in Consciousness

I think that I am here, on this earth,

To present a report on it, but to whom I don't know.

As if I were sent so that whatever takes place

Has meaning because it changes into memory...

... and elsewhere in Unattainable Earth

What use are you? In your writings there 1s nothing except immense amazement.

It is all a single thread.

Spiritual Burnout

posted on 2023-02-13 20:20:00

It's been remarkably difficult to figure out what to hope for lately.

My dad is dying again (not that one, the other one) and it's hard to tell how long the process will take. It has been decades since we had a good relationship and he wasn't the one to teach me how to shave or ride a bike. He's in a nursing home being cared for and I believe he is at peace. I don't know what more to hope for than that. It has been strange in that Terry has been notable mostly for his absence from my life even with me keeping him at a distance. His suddenly taking up space has been confusing and hard to adjust to.

Everything has taken on a dull hue so far in 2023. I'm unable to remember why I wanted to write, or learn about, software. Unable to remember why video games were fun. Unable to come up with an answer to what I want to do with the rest of my life.

Some things are still good. I'm enjoying spin with Norma a few times a week. I'm still finding a little time to hear some new albums and find music I enjoy. I understand being depressed too. It's natural in the face of Terry's decline. But I miss dreaming of the future and can't help but feel that I've forgotten in the past 3 years what sort of futures are even interesting to me. Hopefully with time I will change. For now, I'm treading water.

My 2022

posted on 2022-12-31 18:00:00

Somehow it's already New Year's Eve. I've got two more days off but I'm already distracted by work to do in January. So now seems like an ideal time to step back and reflect on what happened in 2022, what I loved, and what I'll let go of as I move forward. I also feel I should shout out Manuel Uberti's wrap up which inspired me (and he has great posts on emacs).

(See also: Last year's reflections)

Things to Celebrate

Traveling

I took a trip to see Aaron on Vancouver Island and then James in Santa Barbara. They were two glorious and much needed weeks out of the house. While I wasn't off the whole time, I was able to focus on spending time with people I love very much and get myself out of a rut. In fact, I've made pilgrimages to go see James and Rachel in California 4 or 5 times in the last 18 months. Yet to regret it. Need to squeeze in a NYC trip next year to see Justin and Kelly and Roni.

Exercise

I started running in the summer. I've barely exercised for a decade. It wasn't really intentional. I used to love skateboarding with Burke or around the apartment complex. After Burke moved away and Norma and I settled down, it just wasn't the same. I started running in the spring but had a hard time staying motivated. In late October, I started going to a nearby spin class with Norma. At first I thought it wasn't for me but here we are two months later and I love it. I'm going 3-4 times a week, sometimes with Norma and sometimes on my own. It feels wonderful to be pushing my body again and just get out of the house and move.

My Partner

I had some really wonderful experiences with Norma this year. We took a trip to Austin to see dear friends. We took a week off together at the end of March and just lounged about and went on lunch dates. We're doing spin together and early in the year we made a different cookie recipe every weekend for a few months. I feel closer to her than I have before and in January we will have been dating 10 years. It's hard to believe but it's something I'm very happy about.

Family

I got closer to the Butlers. I've always had a ... tenuous relationship with Dad's side of the family. In a lot of ways, I thought my relationship to them was determined by my relationship with my dad which has never been very good. To a large degree, I still think of my step dad John as dad and I miss him dearly. But I went to Uncle Eddie's funeral earlier this year and started to realize that my relationship with the Butlers is just plain separate from my relationship to Terry. I haven't figured out what I want to do with that but I'm grateful for it. I also attended my niece Caroline's wedding and have gotten a bit closer to my half-sister Renee between that and Terry's recent health issues.

Hacking

A few different things have brought me joy this year on the hacking front. I've done effectively no programming for work now that I'm an Engineering Manager and a year on I'm happy with that decision. I struggle to recognize and appreciate my contributions as a manager because a lot of relational work ... doesn't really seem like work to me. But that's a separate issue. On the hacking front, there are 3 things I've really enjoyed this year:

  1. Advent of Code. Most recently, I organized a slack channel at work (#fun-advent-of-code) where about 15 folks participated in daily slack threads working through and discussing the different puzzles posted over the month of December. I coded my solutions in Common Lisp and enjoyed getting practice playing with new libraries. While I didn't get quite as far as I wanted, I got further than in past years and really enjoyed the camaraderie of it. I also had a few particularly elegant solutions. More literate puzzle writeups to come!
  2. Streaming Clones Hacking. During my week off with Norma at the end of March, I knew I missed hacking so I wanted to try reworking my emulator. Working alone in the garage is discouraging for me. I like having people to discuss my projects with. So I decided to take a risk and stream a rewrite of my NES emulator from scratch on twitch. I made a ton of progress and while I stopped at the end of July and some bugs remain. Super Mario Bros is playable and the codebase is generally in good shape. I got a lot of joy from this.
  3. Sourcehut. I started paying for Sourcehut and hosting my emulator hacking there early in the year. Drew Devault seems a bit divisive but I have a lot of appreciation for the way he has built sourcehut and the principled stance it takes on prioritizing open source and community-oriented projects over for-profit corporate software. I have greatly enjoyed being a user of this service.
Records and VOTD

My favorite hack of the year wasn't Advent or Clones. It was actually a bit of emacs lisp I wrote in under an hour to help me randomly pick music to play on my twitch stream from my record collection. The satisfaction of hitting Super+N and being shown album art of a record to play is hard to beat. I've been purchasing most of my music on bandcamp or discogs. As someone who enjoys archiving or curating things in general, this has been a lot of fun. The current collection and VOTD code lives here.

Things to Come

I'd love to do a separate post about some cultural things I enjoyed in 2022. Favorite TV, movies, music, that sort of thing. There are also some things I'd like to change in 2023 and pieces of myself I'd like to work on. But for now, I'll close with a few things I'm looking forward to.

Norma and I are finally going on our honeymoon. We'll be going to Morocco for 2 weeks in March. I can't wait. I've never traveled overseas with Norma and I think it'll be a wonderful time.

The final Strangeloop is happening and I'll be going with James and also a wonderful former Iron Yard instructor, Tim. Strangeloop is always a great conference and St Louis is always a great adventure. This time will be no different.

Last but not least, Aaron is coming to Atlanta at some point. I've been hoping to take Aaron to some of my favorite local haunts, and Kimball House in particular, for years so I can't wait for him to visit. We're gonna have a blast.

For now, I'm grateful that I made it through the crazy year, that Calendly has been a good place for me to grow in my career, and that I'm as close to my beautiful partner as I've ever been. Here's hoping that 2023 is an opportunity to have more adventures, grow healthier, and learn something new. Cheers. 🥂

Clones FAQ

posted on 2022-06-21 09:30:00

An Update on Clones

Even though I've been finding less time to work on it, I've enjoyed the process of hacking on clones and things are going pretty well. Input handling and background rendering are finished and with any luck it will be another weekend until sprites are working. I do expect to need some tweaks for fine scrolling to be implemented correctly so it may be another week or two still until more advanced NROM titles like Super Mario Bros run. It should be a hop, skip, and a jump from there to MMC1 titles like Mega Man 2 though. 🙏

clones-progress

Commonly asked questions

There are 3 questions that have come up pretty regularly though, either on stream chat or elsewhere, and I'd like to jot down some thoughts about them while it's fresh in my mind.

Why are you building clones?

Because it brings me joy. I feel compelled to work on it as a vehicle to try to create something that I find aesthetically appealing and that indulges parts of my curiosity.

Why are you building clones in lisp?

Because it's my favorite language to work in. I don't think the feature set of Common Lisp is critical. Macros, CLOS, and conditions and restarts are all great but the motivating factor for me remains the interactive development workflow with Emacs and SLIME/Sly. When I was young and not yet a programmer, I imagined that at some point working on software or digging into the internals would be more like having a conversation than working out a math problem. Our tooling remains far from those (naive) visions, but Common Lisp is closer to what I imagined and so it feels more comfortable to me. Mikel Evins has written some great posts about this.

What are your goals in building clones?

This is the toughest part to answer. Initially, I'd just like to be able to have a functioning emulator and play childhood games that I loved, like Mega Man 2, tolerably well. Once that piece is completed though, I'm very interested in trying to add tools for debugging and reverse engineering games.

This isn't so much about the games themselves as it is about having better tools for investigating software without access to source code. An emulator is a great place to experiment with approaches to that. Now I admit I have not spent a lot of time doing reverse engineering or security work and am not familiar with the state of the art around static analysis or disassembly tools like IDA Pro.

I'm limited in my ability to express what I imagine. So since I can't tell you exactly what it should be, here's a sketch:

I would love it if I could build a graph of the control flow of the game as I play it. I would love it if I could later annotate the graph, name segments of assembly, and receive hints around what specific parts might be interacting with graphics data, or the APU, or handling player inputs.

The code is an artifact, the leftover cocoon of the program being written. The interesting pieces are in the constraints of the level design, the physics, the musical score, the artwork. I would like, as much as possible, to have tools for exploring the shape of a process as it lives, exploring the data it operates on, and understanding the constraints of the problem, rather than relying on code to understand one specific approach to solving that problem.

In the abstract, this isn't a solvable problem and I will never have a proof of correctness or confidence in completion. But it's worth striving to see how software in general could leave breadcrumbs behind it, given how much of our ideas and culture are being poured into it and fossilized in amber.

Staycation

posted on 2022-04-03 21:15:00

Norma and I are at the end of a lovely week on vacation at home. It was extremely welcome, quite relaxing, and over all too soon like any vacation. I often struggle with breaks but I think a few things conspired to make this one feel different.

  1. I had about an hour of work or chores each day to give me a little structure.
  2. Norma was also off so we could hang out together.
  3. I was able to alternate between friends, Hollow Knight, and streaming emulator hacking.

Historically, Norma's work in non-profit means she gets less vacation, or has a harder time taking it, than I do. Streaming has also been an interesting experiment. For most of our relationship, I have struggled to pull myself away to work on coding projects. I spend so much time sequestered with my computers, I hardly want to do it more when I could be with her. But then I can get frustrated or down on myself because I haven't made more time to learn or experiment. Streaming helps me feel like I'm not just wasting time alone in the garage.

I'm going to try to continue streaming every Sunday and see how it goes. It's also been interesting to work on an emulator again. I'm reminded that the workflow with Common Lisp and Sly or Slime is as good as any I'm familiar with. I still love the language. But I was disappointed today to realize that after almost 20 hours of streaming, I wouldn't finish the CPU of my emulator this week. I don't think it's the fact that I'm not finished ultimately. I think I'm surprised that I still haven't been able to solve the problem to my satisfaction. Sure, I haven't gotten scrolling working on previous attempts. More than that though, the code still feels awkward and messy in various parts and the hard bits are still hard. Writing a reasonably accurate and efficient emulator in a high-level language is still fairly tricky it turns out. Or it is for me anyway.

I don't entirely know why this task continues to be something I want to tilt at. But until it isn't, I'll keep trying. Cheers.

Back to Clones

posted on 2022-03-20 20:34:00

Ancient History

When I last wrote about clones, I was 32 and still working at Showcase IDX. I never got around to finishing clones and in fact worked on rawbones with my dear friend James Dabbs for a spell while teaching at the Flatiron School. By my count I have something like 4 half-finished NES emulators now.

  • famiclom - My original half-hearted attempt in CL when I had no idea what I was doing.
  • nescavation - A NES emulator I hacked up while learning to teach Javascript.
  • clones - A better thought out attempt in CL.
  • rawbones - The ReasonML version I wrote with James.

I seem to write one whenever I get bored and with any luck I'll wind up finishing one of them sooner or later. Nescavation and Famiclom really never got close to running games, clones and rawbones both got much closer to playable territory but I never got background scrolling right. I still find it a bit funny that famiclom gets more attention than my later, improved efforts like clones or rawbones. (Probably because cl-6502 mentions it and achieved a little notoriety.)

Getting to a playable state has never been the point though. These projects have been part learning exercise, part avenue for exploring literate programming, and often just a fun project to noodle with for my own entertainment. I still like the idea that a fast and reasonably accurate emulator can be written in a concise, clear way with a garbage-collected language.

Present Day

Recently, I got the itch again and so I decided to start fresh with clones. There are a few interesting changes this time around. When I made cl-6502, creating a readable document from the program was a primary goal and resulted in a literate book. This ethos never quite made the transition from the CPU stage to the full system emulators. This time I'll be leaning heavily into that spirit using mgl-pax. I'll also be testing with try and relying as heavily as I can on CPU and PPU test roms.

This is all happening in the "once-more-with-feeling" branch on sourcehut. So far there isn't a lot there though I'm on vacation starting in 6 days so I'm hoping to get ROM parsing and a basic structure for stepping the CPU in place to crank through NEStest. I do have some nice automation set up though. Every push runs the test suite and deploys the docs. I also have a very basic twitch stream working in case I want to indulge in the silliness of coding on camera.

For now, here's a look at the .build.yml file that powers the CI on sourcehut. It really isn't harder to set up an automatation pipeline for a CL app than anything else. Here's to working on fun projects again. More soon. 👋

image: alpine/latest
oauth: pages.sr.ht/PAGES:RW
environment:
  site: clones.kingcons.io
packages:
  - sbcl
sources:
  - https://git.sr.ht/~kingcons/clones
tasks:
  - install-quicklisp: |
      curl -O https://beta.quicklisp.org/quicklisp.lisp
      sbcl --non-interactive \
           --eval "(load \"~/quicklisp.lisp\")" \
           --eval "(quicklisp-quickstart:install)" \
      mkdir -p ~/quicklisp/local-projects/
  - test: |
      ln -sf ~/clones ~/quicklisp/local-projects/clones
      sbcl --non-interactive \
           --eval "(load (merge-pathnames \"quicklisp/setup.lisp\" (user-homedir-pathname)))" \
           --eval "(ql:quickload '(clones clones/test))" \
           --eval "(unless (try:passedp (try:try 'clones.test:test-all)) (uiop:quit 1))"
  - build-site: |
      cd clones
      echo 'Building site'
      sbcl --non-interactive \
           --eval "(load (merge-pathnames \"quicklisp/setup.lisp\" (user-homedir-pathname)))" \
           --eval "(ql:quickload '(clones mgl-pax/document))" \
           --eval "(clones.docs::build-site)"
      mv ~/clones/site/clones.html ~/clones/site/index.html
      tar -C site -cvz . > site.tar.gz
      acurl -f https://pages.sr.ht/publish/$site -Fcontent=@site.tar.gz
      rm site.tar.gz

Advent Reflections

posted on 2022-01-23 18:00:00

It's been a busy start to 2022. I'm working as an Engineering Manager for the first time and enjoying it but it's been easy for other things to slip through the cracks. For example, I told myself I would write a post on Advent of Code several weeks ago. So I'm sitting down to write about it now before I forget any more details.

Background

This is the second time I've attempted Advent of Code. The first time was in 2020 and I enjoyed it a lot but ran out of gas around day 10. I was pretty distracted with a Flamingo Squad project I can't recall and probably a bit burned out. Both years I've written my solutions in Common Lisp.

Advent is interesting. I get enjoyment from different things on different days. Some problems I just enjoy seeing how much I can optimize Common Lisp, or writing solutions in a few different styles if the problem is simple and seeing the differences in how they are compiled and allocate memory. Other problems I'm much more satisfied by trying to see how "pretty" a solution I can write, either using constraint solving tools like Screamer or a pipeline using threading macros and so on.

I enjoy the social aspect of AoC and having a leaderboard with some mutual friends and coworkers. It's nice to chat about something besides production code with other talented programmers. That said, I have to be pretty careful to avoid judging myself. I have to consciously remind myself that my goal isn't to "win the race" and not worry too much if I struggle to solve a problem elegantly.

Advent 2021

There were two things I wanted to try and do differently this year from last year. The first was just to go as far as I could and not worry about racing. The second was to experiment with literate programming tools and try to do a better job documenting my work.

I think the results were a mixed bag. I got through day 11 so I powered out at around the same point. I mostly worried less about the race but I still cared a lot about finishing each problem on the day it became available and definitely got discouraged once or twice when I didn't like my approach. On the other hand, I had a good time and learned a few things so it's a good investment overall.

Here's the current state of the generated site. You can see I didn't wind up embedding the source for the different functions so it can't properly be called literate but the [function] label (or equivalent) next to all the exported symbols can be clicked to jump to the source on github.

Takeaways

MGL-PAX

I have been meaning to play with mgl-pax for a long time. Like ... probably several years? There are blog posts about it as far back as 2014 and it's been on my radar a long time but I just never seemed to make time for it. Advent seemed like a good opportunity to dive in.

I like the idea of an environment where prose and code are intermingled, so I have a natural attraction to literate programming. This shouldn't surprise you if you've been here before. It also seems important to me that such an environment for authoring programs should be rooted in the development tools and support the prose as a secondary feature (like MGL-PAX) rather than rooted in the prose and supporting the code as a secondary feature (like org-babel). I.e. tangling one or more files to produce my program seems like the wrong way to go to me.

In terms of Advent of Code problems, I'd ideally be able to do the following:

  • Keep the prose and code for a given day/problem in a single file
  • Easily export the entire project with all days to an easily navigated, well designed web page
  • Make it easy to show different versions of the code as well as disassembly or evaluation examples

Editor's Note: The issues I bring up below were resolved before I could ever make a PR or ask the author about them. It seems making PAX more flexible about transcription was in the plans all along.

I think MGL-PAX excels on the first two points and struggles more on the third. It has a feature called transcripts which could plausibly support it but they are an awkward fit. Transcripts allow for including examples that are evaluated when the documentation is generated but there are two issues I have with it:

  1. The results are actually embedded in the source code. The argument for this is that they are parsed and checked to ensure the code and docs don't get out of date. I'm interested in embedding details like disassembly though and things like the memory address will change from run to run. The output could also easily dwarf the code for the function itself so shouldn't be directly embedded. (PAX now supports not checking consistency, allowing me to simply dump the output of a form.)
  2. The second (much more minor) issue is that there isn't a straightforward way to ask the source definition of a function to be embedded in the doc. MGL-PAX assumes that symbols listed in the doc should be an exported part of the public API and links directly to the source on github at the relevant commit. It's a neat bit of hackery but makes more sense in the case of medium-to-large projects rather than Advent of Code exercises. (Similarly, PAX now has a way of adding "includes" via transcript.)

My only remaining concern is that the navigation and transcription functionality is tied to slime and swank. Hopefully I'll have an opportunity to try them with sly soon and can dig in or report it if there are issues.

In the advent project, the site-building and deployment was trivial. Hacking together a way to generate an overview of all solved problems with performance measurements involved some fiddling but I'm happy with the results.

Evolving my style

For a long time, I've been writing small projects in common lisp, writing a handful of tests, and relied only sparingly on libraries. A little alexandria here, a little cl-ppcre there. There's a place for that but I'm ready to try and cobble together the utilities and extensions to the language that I'm comfortable with. For now, that's alexandria, serapeum, iterate, mgl-pax, and try. Clingon, trivia, screamer, and fset wait in the wings for the right problem.

There are plenty of talented lispers around. Two people whose code I've enjoyed reading during advent are death and Steve Losh (aka sjl). They feel like opposites to me if only because sjl has a project dedicated to advent and an assortment of dependencies, macros, and utilities to make advent hacking pleasant. Death by contrast almost always just relies on the language standard and throws his code unceremoniously in a gist. His solutions are often faster than mine but don't sacrifice elegance.

Conclusion

It all boils down to this: I still like lisp, I miss hacking it, and I should read and write more code. My algorithms chops aren't as good as I'd like and I have to make an effort to not get discouraged by my limitations. All the more reason to keep doing advent, even out of season, and learn a few things.


Unless otherwise credited all material Creative Commons License by Brit Butler