<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Music on Signals &amp; Pixels</title><link>https://www.aazuspan.dev/tag/music/</link><description>Recent content in Music on Signals &amp; Pixels</description><generator>Hugo</generator><language>en</language><managingEditor>aa.zuspan@gmail.com (Aaron Zuspan)</managingEditor><webMaster>aa.zuspan@gmail.com (Aaron Zuspan)</webMaster><copyright>Copyright © 2024, Aaron Zuspan.</copyright><lastBuildDate>Fri, 05 Jun 2026 09:49:07 +0000</lastBuildDate><atom:link href="https://www.aazuspan.dev/tag/music/index.xml" rel="self" type="application/rss+xml"/><item><title>Hexadecimal Drum Loops</title><link>https://www.aazuspan.dev/blog/hexadecimal-drum-loops/</link><pubDate>Fri, 05 Jun 2026 09:49:07 +0000</pubDate><author>aa.zuspan@gmail.com (Aaron Zuspan)</author><guid>https://www.aazuspan.dev/blog/hexadecimal-drum-loops/</guid><description>&lt;p&gt;When you program a drum machine, you&amp;rsquo;re encoding a binary state (play or don&amp;rsquo;t play) for each drum (kick, snare, hi-hat, etc) at each time step. The obvious, intuitive interface &amp;ndash; the one used by pretty much every sequencer and DAW &amp;ndash; is a 2D grid of cells, with sounds on the Y-axis and time on the X-axis.&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://www.aazuspan.dev/blog/hexadecimal-drum-loops/daw_hu_646354f5a6eea8ae.webp"
 alt="A drum loop displayed on a classic &amp;lsquo;piano roll&amp;rsquo; MIDI interface."&gt;&lt;figcaption&gt;
 &lt;p&gt;A drum loop displayed on a classic &amp;lsquo;piano roll&amp;rsquo; MIDI interface.&lt;/p&gt;</description></item><item><title>Building Arpeggio Pt. 4: The Parser &amp; Interpreter</title><link>https://www.aazuspan.dev/blog/building-arpeggio-pt.-4-the-parser-interpreter/</link><pubDate>Sun, 26 Jan 2025 00:00:00 +0000</pubDate><author>aa.zuspan@gmail.com (Aaron Zuspan)</author><guid>https://www.aazuspan.dev/blog/building-arpeggio-pt.-4-the-parser-interpreter/</guid><description>&lt;p&gt;I&amp;rsquo;m building a domain-specific language called &lt;a href="https://www.aazuspan.dev/tag/arpeggio"&gt;Arpeggio&lt;/a&gt; that compiles code into songs. I outlined a tentative syntax for the language in &lt;a href="https://www.aazuspan.dev/blog/building-arpeggio-pt.-1-language-design/"&gt;Part 1&lt;/a&gt;, explored the musical theory behind it in &lt;a href="https://www.aazuspan.dev/blog/building-arpeggio-pt.-2-music-theory-for-programmers/"&gt;Part 2&lt;/a&gt;, and implemented a Python music engine to power it in &lt;a href="https://www.aazuspan.dev/blog/building-arpeggio-pt.-3-the-engine/"&gt;Part 3&lt;/a&gt;. Now it&amp;rsquo;s time to finally connect those components together by writing a parser and interpreter that turns our custom language into playable music.&lt;/p&gt;
&lt;h2 id="syntax-and-semantics"&gt;Syntax and Semantics&lt;/h2&gt;
&lt;p&gt;The language design was detailed in &lt;a href="https://www.aazuspan.dev/blog/building-arpeggio-pt.-1-language-design/"&gt;Part 1&lt;/a&gt;, but here&amp;rsquo;s a quick recap of the core concepts:&lt;/p&gt;</description></item><item><title>Replacing My Guitar Amp with a Neural Net</title><link>https://www.aazuspan.dev/blog/replacing-my-guitar-amp-with-a-neural-net/</link><pubDate>Mon, 28 Oct 2024 00:00:00 +0000</pubDate><author>aa.zuspan@gmail.com (Aaron Zuspan)</author><guid>https://www.aazuspan.dev/blog/replacing-my-guitar-amp-with-a-neural-net/</guid><description>&lt;p&gt;Vacuum tubes are an expensive, inefficient, and unreliable relic of early 1900s technology. So why are guitarists (and me) still lugging around old tube amps 80 years after the transistor made them obsolete? The short answer is that tube amps sound good when you overload their input signal, and transistor amps don&amp;rsquo;t&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;So, I can&amp;rsquo;t just swap my tubes for transistors one-to-one and get the same tone in an amp. But could I replace my tubes with a few &lt;em&gt;billion&lt;/em&gt; transistors in a GPU running an open-source neural network trained to sound like my amp?&lt;/p&gt;</description></item><item><title>Building Arpeggio Pt. 3: The Engine</title><link>https://www.aazuspan.dev/blog/building-arpeggio-pt.-3-the-engine/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><author>aa.zuspan@gmail.com (Aaron Zuspan)</author><guid>https://www.aazuspan.dev/blog/building-arpeggio-pt.-3-the-engine/</guid><description>&lt;p&gt;I&amp;rsquo;m building a domain-specific language called &lt;a href="https://www.aazuspan.dev/tag/arpeggio"&gt;Arpeggio&lt;/a&gt; that compiles&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; code into songs. When an Arpeggio program is run, the compiler will need a way to turn parsed instructions (e.g. play a C major chord for 1/4 of a measure) into playable audio. This post goes over the process of designing and building that backend API.&lt;/p&gt;
&lt;h2 id="building-a-song-in-code"&gt;Building a Song in Code&lt;/h2&gt;
&lt;p&gt;In &lt;a href="https://www.aazuspan.dev/blog/building-arpeggio-pt.-2-music-theory-for-programmers/"&gt;Part 2&lt;/a&gt;, I outlined how we can represent musical concepts like keys, modes, notes, and chords in Python. For a quick recap, here&amp;rsquo;s the basic structure of those classes:&lt;/p&gt;</description></item><item><title>Building Arpeggio Pt. 2: Music Theory for Programmers</title><link>https://www.aazuspan.dev/blog/building-arpeggio-pt.-2-music-theory-for-programmers/</link><pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate><author>aa.zuspan@gmail.com (Aaron Zuspan)</author><guid>https://www.aazuspan.dev/blog/building-arpeggio-pt.-2-music-theory-for-programmers/</guid><description>&lt;p&gt;I&amp;rsquo;m building a domain-specific language called &lt;a href="https://www.aazuspan.dev/tag/arpeggio"&gt;Arpeggio&lt;/a&gt; that compiles code into music. In &lt;a href="https://www.aazuspan.dev/blog/building-arpeggio-pt.-1-language-design/"&gt;Part 1&lt;/a&gt;, I outlined the basic language design and syntax. Here, I&amp;rsquo;m going to do a very shallow dive into music theory from a programmer&amp;rsquo;s perspective, focusing on the terms and concepts needed to build the music backend that powers Arpeggio.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: Music theory is a huge field of study that&amp;rsquo;s filled with complexity and ambiguity, which I&amp;rsquo;m going to vastly oversimplify down to the basic math and patterns that I can understand. Apologies to any real musicians who stumble onto this.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Building Arpeggio Pt. 1: Language Design</title><link>https://www.aazuspan.dev/blog/building-arpeggio-pt.-1-language-design/</link><pubDate>Tue, 03 Sep 2024 00:00:00 +0000</pubDate><author>aa.zuspan@gmail.com (Aaron Zuspan)</author><guid>https://www.aazuspan.dev/blog/building-arpeggio-pt.-1-language-design/</guid><description>&lt;p&gt;I&amp;rsquo;ve tinkered with parsers for a few small side projects like building &lt;a href="https://github.com/aazuspan/spinasm-lsp"&gt;a language server&lt;/a&gt; and &lt;a href="https://www.aazuspan.dev/blog/writing-a-parser-for-blog-posts/"&gt;parsing blog post metadata&lt;/a&gt;, but I wanted to tackle a bigger parsing project. I&amp;rsquo;ve also been trying to learn some music theory in my spare time, so why not combine the two ideas by building a domain-specific language (DSL) for notating and generating music?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m (tentatively) calling it &lt;a href="https://www.aazuspan.dev/tag/arpeggio"&gt;&lt;strong&gt;Arpeggio&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="the-concept"&gt;The Concept&lt;/h2&gt;
&lt;p&gt;This is going to take a few blog posts to get through, so let&amp;rsquo;s just start at the beginning with what our language is going to look like and how we&amp;rsquo;re going to use it, so we can build our parser around that.&lt;/p&gt;</description></item><item><title>Guitars, Microchips, and Assembly</title><link>https://www.aazuspan.dev/blog/guitars-microchips-and-assembly/</link><pubDate>Sat, 18 Mar 2023 00:00:00 +0000</pubDate><author>aa.zuspan@gmail.com (Aaron Zuspan)</author><guid>https://www.aazuspan.dev/blog/guitars-microchips-and-assembly/</guid><description>&lt;p&gt;My first attempts at programming were writing hacky embedded C++ to run Arduino microcontrollers, brute forcing my way through compiler errors to try to make LEDs blink and motors spin. These days I write most of my code in high-level, dynamically-typed languages, but there&amp;rsquo;s still something alluring about that intersection of software and hardware - about watching your code run in the physical world.&lt;/p&gt;
&lt;p&gt;So, leaving behind the comfort of high-level abstractions and garbage-collected memory management, I spent a few days diving back into the world of low-level embedded code by building a guitar effects pedal around the &lt;a href="http://www.spinsemi.com/products.html"&gt;FV-1&lt;/a&gt; chip. Because what&amp;rsquo;s lower level than Assembly?&lt;/p&gt;</description></item></channel></rss>