Skip to main content

Hearing Graphs

My latest project is titled Hearing Graphs, and you can access it by clicking on the image below.

A screenshot of the project, with an undirected graph to the left and music notation to the right.

Hearing Graphs is a sonification of graphs using the graph spectrum – the eigenvalues of the graph’s adjacency matrix. Both negative and positive eigenvalues are represented by piano samples, and zero eigenvalues are interpreted with a bass drum. The multiplicity of each eigenvalue is represented by hitting notes multiple times.

Most sonifications establish some audible relationship between the source material and the resulting audio. This one remains mostly incomprehensible, especially to a general audience, so I consider it a failed experiment in that regard. Still, it was fun to make.

Moisture Bass

If you haven’t heard of the YouTube channel Bunting, it gets my strong recommendation. Bunting creates excellent style imitations of experimental bass music artists and breaks them down with succinct explanations. Notable is his minimal tooling: he uses mostly Ableton Live stock plugins and the free and open source wavetable synth Vital.

His latest tutorial, mimicking the style of the artist Resonant Language, contains several bass sounds with a property he calls “moisture” (timestamp). These bass sounds are created by starting with a low saw wave, boosting the highs, and running the result through Ableton Live’s vocoder set on “Modulator” mode. According to the manual, this enables self-vocoding, where the same signal is the modulator and carrier. An abstract view of a vocoder would suggest that this does little or nothing to the saw wave other than change its spectral tilt, but the reality is much more interesting. Hear for yourself an EQ’d saw wave before and after self-vocoding:

A closer inspection of the latter waveform shows why the self-vocoded saw sounds the way it does. Here’s a single pitch period:

A single pitch period of the second audio. It is mostly smooth but contains some very spiky oscillations in one portion of the waveform. The oscillations have a sudden onset and rapidly slow down.

The discontinuity in the saw signal is decorated with a chirp, or a sine wave that rapidly descends in frequency. This little 909 kick drum every pitch period is responsible for the “moisture” sound. Certainly there have been no studies on the psychoacoustics of moisture bass (for lack of a better term), but I suspect that it mimics dispersive behavior, lending a vaguely acoustic sound.

The chirp originates from the bandpass filters in the vocoder. The frequencies of the vocoder are exponentially spaced, so the bandpass filters have to increase in bandwidth for higher frequencies to cover the gaps. Larger bandwidth means lower Q, and lower Q reduces the ring time in the filter’s impulse response. The result is that low frequencies ring longer when the vocoder is pinged and high frequencies ring shorter. Mix them all together, and you have an impulse response resembling a chirp.

Self-vocoding with exponentially spaced bands is clever, but it isn’t the only way to create this effect. One option is to eliminate the vocoding part and use only the exponentially spaced bandpass filters, like an old-school filter bank. This sounds just like self-vocoding but requires fewer bandpass filters to work. In my experiments, I found that putting the resulting signal through nonlinear distortion is necessary to bring out the moisture property.

A more direct approach is to use wavefolding on a curved signal. The slope of the input signal controls the rate that it scrubs through wavefolding function, and thus controls the frequency of the resulting triangle wave. By modulating the slope from high in absolute value down to zero, a triangle wave descending in frequency is created. This is best explained visually:

A graph of two functions. One is labeled "curved signal," looking like a downward saw wave but with decreasing slope as it reaches a trough. The other is labeled "wavefolder output," showing the result of wavefolding on the curved signal, which displays triangle wave oscillations that onset at each pitch period and quickly decrease in frequency.

And here’s how it sounds:

Announcing Canvas

Canvas (working title) is a visual additive synthesizer for Windows, macOS, and Linux where you can create sound by drawing an image. This is accomplished with a bank of 239 oscillators spaced at quarter tones, with stereo amplitudes mapped to the red and blue channels of the image. You can import images and sonify them, you can import sounds and convert their spectrograms to images, and you can apply several image filters like reverb, tremolo, and chorus. Check out the demo:

Canvas is directly inspired by the Image Synth from U&I Software’s MetaSynth. When I first heard of MetaSynth, I wrote it off as a gimmick that could only produce sweeps and whooshes. It wasn’t until I heard Benn Jordan’s recent demo and learned of its powerful set of image filters that I was immediately sold on the approach. I decided to build an alternative that’s just featureful enough to yield musical results, a sort of MS Paint to MetaSynth’s Photoshop.

Canvas has a lot of rough edges, and currently requires building from scratch if using Linux or macOS. Nevertheless, I hope it is of some interest to the music tech community.

A Survey of Nonstandard Oscillators

This is a collection of synthesis algorithms that meet the following criteria:

  1. They must synthesize pitched tones — periodic or quasiperiodic waveforms.

  2. I can include or exclude anything at my arbitrary discretion. I’m biased towards algorithms that are parametric rather than data- or sample-driven.

Algorithms that meet these criteria and fall outside of the typical cuisines of subtractive, FM/PM, wavetable, and additive synthesis are what I call nonstandard oscillators, hence the title. An earlier version of this post left it at just nonstandard oscillators, but I’ve also added in the more vanilla ones for comparison.

Many of these descriptions are intentionally brief, and I add detail only if I feel I have something useful to add or if the topic is particularly obscure. Many algorithms overlap, some are generalizations of others.

As a word of caution, inexperienced and information-hungry computer musicians find nonstandard synthesis methods particularly attractive because FM and subtractive have gotten too “basic” for them. (This is autobiographical here.) If you’re tired of “standard” synthesis methods, you haven’t spent enough time with them — FM and subtractive are capable some incredibly far-out and alien sounds, many yet to be discovered. I do encourage you to try out the wilder methods here, but nonstandard synthesis is not a panacea that will make your sound design good. Only practice can make your sound design good.

Last updated: 2024-01-17.

Read more…

IXA Synthesis

Vintage synth hacker and generative electronic music producer acreil, a.k.a. Scott Nordlund, posted a video breaking down a PD patch he made. Go watch it now. Of the delightful DSP tricks to be found within, the most delightful to me is his review of the Casio CTK-1000, and the unearthing of its synthesis method.

The Casio CTK-1000 is a 1993 sythesizer and rompler whose manual boasts a new type of synthesis called “IXA Sound Source,” distinguished from phase distortion synthesis from the CZ series and “interactive phase distortion” or iPD from the Casio VZ series. These are largely ways of getting around Yamaha’s all-dominating FM synthesis patents.

Nordlund dug up Casio’s patent US5164530, and while we have no way of telling what’s really inside the CTK-1000, the document gives us useful clues. (There are three other patents, but none of them seem to contain much interesting information beyond this one.) The patent describes a phase modulation synthesis method where the carrier is a triangle wave and the modulator is a sine wave. However, the intrinsic phase of the triangle wave is distorted with a weird waveform made of sine wave segments such that a sine wave is produced if the modulation index is zero. Here’s a block diagram:

A block diagram of IXA synthesis. To the left, an input signal labeled "W(t) oscillator" has an upward sawtooth shape but with some gentle oscillations in the slope. From the bottom, an input signal labeled "sin(2 pi t * ratio)" is multiplied by an "index." The input signal and the weird oscillator are added together and piped into a triangular waveshaper to produce the output signal.

and a closer look at the weird waveform:

A graph of a single period of the weird waveform. The time axis ranges from 0 to 1 and the output from 0 to 4. The graph has an upward slope and consists of four quarter-sine wave segments. It has saddle points at t = 0.25 and t = 0.75, and an inflection point at t = 0.5.

For readers who prefer a more formal description, define a pulse wave \(\Pi_x(t)\) as a function with period \(x\) such that \(\Pi_x(t) = 1\) if \(0 \leq t < x / 2\) and \(\Pi_x(t) = 0\) if \(x / 2 \leq t < x\). Define a triangle wave \(\Delta(t)\) as a function with period \(4\) such that

\begin{equation*} \Delta(t) = \begin{cases} t & 0 \leq t < 1 \\ 2 - t & 1 \leq t < 3 \\ t - 4 & 3 \leq t < 4 \\ \end{cases} \end{equation*}

Then the weird waveform \(W(t)\) with period \(1\) is defined as:

\begin{equation*} W(t) = (2 \Pi_{1/2}(t) - 1) \sin\left[2\pi\,\text{mod}\left(t, \tfrac{1}{2}\right)\right] + 2 \Pi_{1/2}\left(t + \tfrac{1}{4}\right) + 2 \Pi_1\left(t + \tfrac{1}{2}\right) \end{equation*}

An IXA oscillator with period \(1\), index \(n\), and ratio \(r \in \mathbb{N}\) is defined as:

\begin{equation*} \text{IXA}(n, r, t) = \Delta\left( W(t) + n \sin(2 \pi r t) \right) \end{equation*}

It can be seen that \(\text{IXA}(0, r, t) = \sin(2 \pi t)\), i.e. turning off the modulator results in a sine wave.

IXA synthesis, as it could be called, produces unique buzzy waveforms with a deep and growly sound even with low index:

It sounds a bit like wavefolding. Classic two-operator sine wave FM, by comparison, sounds more muted when the index is low and squelchy when the index is high:

Here’s a spectrogram of partials for IXA with ratio set to 1:

A plot labeled "IXA Synthesis Spectrogram (ratio = 1)." The X-axis is modulation index, ranging from 0 to 10, and the Y-axis is harmonic, ranging from 1 to 20.

Here is two-operator FM synthesis with sine waves for comparison. Note the change of scale in the X-axis – FM requires a higher modulation index to achieve sounds comparable in brightness to IXA.

A plot labeled "FM Synthesis Spectrogram (ratio = 1)." The X-axis is modulation index, ranging from 0 to 20, and the Y-axis is harmonic, ranging from 1 to 20. It looks a little smoother than the IXA synthesis spectrogram.

The amplitude scale is linear in both graphs. Notice how the FM synthesis, whose harmonics follow one of the Bessel functions, has a sort of “resonance” at increasing even harmonics and quickly drops off to near-zero above that. IXA synthesis produces smoother spectra with less obvious resonance, and if you look closely there is some high-frequency fuzz above the dropoff.

IXA also works with non-integer ratios, but to me these sound harsh, like a bell FM patch run through nonlinear distortion:

Slight detuning of the modulation frequency, however, produces a pleasant beating effect.

The patent also touches on some variations. One is to pick a different \(W(t)\) so it no longer produces a sine wave when the modulation index is zero. I have experimented with this a little, but haven’t gotten anything good out of it. Another, more interesting, option is to open up the modulator to be the output of another IXA synthesis oscillator, or the output of the current oscillator in a feedback configuration. Chaining two or three IXA oscillators seems to automatically produce brostep bass waveforms, but I’m not sure if it’s useful for much else:

The way I see it, three or more operators are useful in FM to access richer sounds, but a single IXA operator is already complex enough and additional operators are limited in use.

Generally, anywhere FM or PM is used, it’s worth trying to substitute IXA to see how it sounds. For example, IXA produces formant-like results when setting a high modulation ratio, so FM vocal synthesis may apply to IXA as well.

SuperCollider code

Here’s a function you can copy-paste into your own SC patches:

// Public Domain

(
var ixa;

ixa = { |freq, in, index|
    var phase, waveform, snd;
    phase = Phasor.ar(Impulse.ar(0), freq / SampleRate.ir, 0, 1);
    waveform = (phase % 0.5 * 2pi).sin * (2 * (phase % 0.5 < 0.25) - 1);
    waveform = waveform + (2 * (phase % 0.5 >= 0.25));
    waveform = waveform + (2 * (phase >= 0.5));
    snd = (waveform + (in * index)).fold2;
    snd;
};

{
    var freq = 100;
    ixa.(freq, SinOsc.ar(freq), Line.kr(0, 10, 3)) * 0.5 ! 2;
}.play(fadeTime: 0);
)

Circular Membrane Modes

Just as the modal frequencies of an ideal string produce the overtone series, other ideal acoustic objects such as circular membranes produce their own sets of frequency ratios that we can think of as “non-Pythagorean overtone series” from an alternate universe. Like the classical overtone series, they arise naturally from physical laws and produce an infinitely ascending microtonal chord. These modal frequencies are found in physics textbooks, but I haven’t seen musicians talk about them much, nor anyone represent them in music notation like we do the standard overtone series.

Modal frequencies of a circular membrane are labeled by two mode numbers, overall forming a two-dimensional grid of frequency ratios rather than a linear series. For example, the lowest mode of a circular membrane is traditionally notated “0,1”. Just as the first and lowest classical overtones are the important ones, it’s mostly the low mode numbers that receive much attention from mechanical engineers. In the below charts, these are the tones in the upper left region.

I’ve notated the frequencies here on three levels. Read the note head position and sharp/flat/natural for the nearest 12ET pitch, and the up/down arrows indicate 50-cent alterations to a finer 24EDO approximation. The fearless can ignore all arrows and read the signed numbers for the cent deviations from 12ET (not 24EDO!). Modal synthesis decouples fundamental frequency from frequency ratios, so the choice of C2 as fundamental is arbitrary, and all charts are transposable without affecting their faithfulness to the physical model. Try them out on your instrument of choice – even the crude 12ET approximations generate some lovely chords that remind me a little of Morton Feldman.

Click the screenshot below to download a PDF version.

Sheet music showing a two-dimensional grid of microtonal pitches titled "Modes of a Circular Membrane."

Is there anything perceptually important about this series? I don’t think so. You could replace these chords with random pitches, and the results would likely sound similar to an average listener. But as a demonstration of complex microtonal harmonies arising from first principles of acoustics, I think it’s conceptually compelling and a fruitful source of harmonic inspiration.

Venn 7

I have released Venn 7, a little artistic Web app that turns symmetric 7-fold Venn diagrams into a musical interface. Click the screenshot below to visit the app, which also has an attached explanatory article.

A symmetric 7-fold Venn diagram labeled "Victoria" with a pink and purple color scheme.

There are some bugs and minor issues with it which I hope to hammer out as I receive feedback. Check the repository for bug reports and some technical documentation.

Chip Fuzzing Synthesis

I’m unsure whether I read about this or dreamt it (this year has been a blur) but I recall someone fuzzing a retro sound chip, most likely the Yamaha OPL3, by sending it random bits for its synthesis parameters and recording the output. Drawing from this, we can explore “chip fuzzing synthesis,” the art of feeding total digital randomness into a synthesis algorithm and seeing what comes out.

There is no specific need for a real retro sound chip or even an accurate emulation of one, but it helps to understand how some old sound chips operate to look for inspiration. As an example, we can look at the Commodore 64’s SID. This chip is an analog subtractive synthesizer, providing three oscillators with frequency inputs, waveform selection (saw, pulse, triangle, noise), and ADSR envelope generators, all mixed into a filter with controllable cutoff and famously nonfunctioning resonance.

The parameters of the SID are controlled by an internal set of 32 8-bit registers, which are written to using a 5-bit parallel address bus and an 8-bit parallel data bus. In C-like pseudocode, communication with the SID can be emulated like so: [1]

char sidRegisters[32];

// Parallel ports used to communicate with SID.
char addressBus = 0;
char dataBus = 0;

void writeSid(char address, char value)
{
    addressBus = address & 31;
    dataBus = value;
    sidRegisters[addressBus] = dataBus;
}

The SID interprets the sidRegisters array and maps various bits and bytes to analog synth parameters. For example, registers 0 and 1, taken as a 16-bit integer, control the frequency of an oscillator, and individual bits in register 4 select the waveform and enable ring modulation and hard sync.

Fuzzing the address and data buses is the equivalent of calling writeSid repeatedly with randomized address and value, writing random data to random registers. The exact rate at which random data is written is up to you. I find that slow randomization produces the most coherent results and has the least chance of turning the output into white noise. A few hundred times a second is a good start.

It also suffices to take a simpler route and feed high-frequency random noise (sample-and-hold, maybe) into every parameter of a synth. Again, we don’t need a vintage emulation at all – a minimal subtractive monosynth with waveform selection, ADSR envelope, and a few switchable filter types is adequate to get glitchy sounds. So here’s a little patch:

This is sonically uncompromising (and hey, maybe that’s your thing), but still makes a useful raw source for more polished sound design. Here’s the same patch as above with some minor modifications and a lot of post-effects like granulators, distortion, and reverb:

The outcome of chip fuzzing synthesis is highly dependent on the choice of synthesis algorithm, the set of parameters, and the ranges for said parameters. I can imagine fuzzing FM, subtractive, additive, physical modelling, and parameters of an effects chain. The more inputs to fuzz, the better – especially inputs that switch features on and off, exhibit complex interactions with other inputs, and/or unearth bugs and artifacts.

Low Battery Audio Effects

Searching YouTube for videos of low battery toys and keyboards brings up results like “Demon Possessed Singing Trout.” Please watch the video before proceeding.

I have a limited understanding of electronics, but a compulsory need to explain this phenomenon due to tech blogger ego syndrome. A low battery has an abnormally high internal resistance, causing its voltage to sag in response to the loads it’s supporting. If it’s powering multiple things, they will interact in strange ways. The distorted audio from the singing fish sounds like the clock rate is dropping in reaction to the load of the speaker. (The servo motors might also be causing voltage sag, although it isn’t entirely clear from the video.)

The speaker/clock interaction is interesting since it works in a feedback loop: the clock controls the playback rate, and the amplitude of the output audio draws current that affects the clock. This inspires a general method for turning an audio algorithm into a “low battery” version:

  • Run a DSP algorithm such as sample playback, synthesizer, effect, etc. that can be operated at a variable clock rate.

  • Apply filters like a full-wave rectifier, envelope follower, or simple lowpass to simulate speaker load. Optional.

  • Apply a highpass filter to block dc. (This helps prevent the algorithm from getting stuck.)

  • Use this signal to control the clock rate of the DSP algorithm, so that a signal of higher amplitude lowers the clock rate.

The casual experiments I’ve done with this are promising. At subtle settings, this creates wandering, droopy pitch bends. Pushed to the extreme, it produces squelchy signal-dependent distortion. I especially like its effect on percussive signals, where louder transients are stretched out and any rhythmic pulse becomes irregular. I’m imagining software plugins that emulate digital hardware could be augmented with a “battery” knob that lets the user control how much the clock rate sags in response to the output signal.