Composing Music with Nyquist SAL


During my time at Carnegie Mellon University, I studied under Roger Dannenberg, professor of computer science, art and music at CMU, as well as the lead creator of Nyquist. Nyquist, found here, is described as "a language for sound synthesis and music composition. Unlike score languages that tend to deal only with events, or signal processing languages that tend to deal only with signals and synthesis, Nyquist handles both in a single integrated system." This means that signal processing and sound synthesis in Nyquist is more akin to writing programs in Python than it is to creating music with a digital audio workstation (DAW), like GarageBand.

To create my composition using Nyquist, I started with the nineteen second sample loaded into the nyquist IDE, playable below.

100 Grandkids, Mac Miller




In order to create the sounds in my final composition, I employed numerous signal processing techniques such as sound-stretching, amplitude modulation, and low-pass filters. Additionally, the creation of my composition was primarily executed using multiple functions like the Load Sample. For those unfamiliar with Nyquist's coding syntax SAL, the Load Sample function reads the wave file, plays it backwards, stretches the sample by a given value, and sets its volume with amps. For those familiar with python and other common programming languages, these functions may be readable, although syntax is distinct from more widespread languages.

Load Sample Function



This is how interaction with nyquist is, and how the composition was created. Interestingly, the techniques used to process and synthesize sounds are no difference from graphical interfaces other softwares like GarageBand, althought this format offers greater control over the produced sound. It comes at an obvious cost of having to code your actions instead of manipulating the sound more interactively.

In the end, my composition "Elevator Service" was created by running a simple function play sim(sound(comp()) * 0.7, sound(make-beat()) * 0.7). Functions comp() and make-beat() are functions that call other functions. To see this in more detail, view the full composition, written in SAL.

 Final Composition