The Stack

Sporth is a stack-based language, largely inspired by languages like Forth and Postscript. In fact, Sporth is a blending of the words "Soundpipe" and "Forth". Understanding how the stack works is key to effectively using Sporth.

A stack in computer science is a simple data structure, typically implemented inside an array. Items can be pushed to the stack and popped off the stack. For this reason, a stack is also known as a Last In, First Out (LIFO) data type.

In stack-based languages like Sporth, the stack is the means for how data is exchanged. For this reason, arguments precede function calls. This can be seen in the A440 sine seen in the previous chapter:

 440 0.5 sine

In this code, the numbers "440" and "0.5" are arguments to the sine generator, for both frequency and amplitude, respectively. This patch code be broken down into stack operations:

Monophonic Sporth patches will always have a value left on the stack meant for the speaker. This value should be in the range (-1, 1). In this patch, the sine generator is responsible for producing this last value. This sine generator is known as a "unit generator" or "ugen". Ugens are the core means of producing sound and signal alike. Sporth has over 100 unit generators. These unit generators can be used together to build up very complex patches.

The patch below now has two sine waves being summed together. The frequencies produce a North American dial tone on phones:

 440 0.3 sine
 350 0.3 sine

In this patch, a 440hz sine is created, followed by a 330hz. These signals are then summed together with the '+' operator.

In stack operations, this works as follows:

Despite the fact that all unit generators are audio-rate, they don't necessarily need to be used to generate audio. They are perfectly content being used to generate signals. In fact, the differences between a control signal and an audio signal is rather arbitrary. This is important.

This patch below uses a sine wave to control the frequency of another sine wave:

 6 40 sine 
 440 + 0.3 sine

The first sine wave is 6 Hz with an amplitude of 40, which means the signal has a range (-40, 40). This signal is then being added to the constant value of 440. This addition operation causes this value to go up 40 to 480 and down 40 to 400. This value feeds into the frequency argument of another sine wave with an amplitude of 0.3.

Sporth is largely whitespace insensitive. This patch could all be written on one line as follows:

 6 40 sine 440 + 0.3 sine

Parentheses are ignored. They can be used as a means to group things:

 ((6 40 sine) 440 +) 0.3 sine

Hopefully that looks a little bit clearer.

Study this patch. The stack operations create an implied signal flow. Being able to see the signal path in this configuration is a good first step in developing an intution for modular sound design.