Pysound simple square waves

Martin McBride

In this example, we will create a simple square wave.

This process is quite similar to the way we create a sine wave, it is worth reading that first.. The way we create a graph of the function, and the way we vary the amplitude and frequency are identical, so we won't repeat them here.

However, square waves have an extra parameter, the ratio, that determines the on/off time of the wave. This creates waves with different shapes, and and similar but different sounds.

The code

Here is the code:

from pysound.buffer import BufferParams
from pysound.oscillators import sine_wave
from pysound import soundfile
from pysound.graphs import Plotter

params = BufferParams()
out = square_wave(params, frequency=500), 'square-500.wav', out)

This works in a similar way to the sine wave example, but it uses the square_wave function instead:

out = square_wave(params, frequency=500)

It is stored as square-500.wav in the current folder.

Here is what the sound looks like:

This sound is a lot harsher and more electronic sounding than a sine wave.

Changing the ratio of the square wave

A square wave only has two values, on or off (which are +1.0 and -1.0 in this case). By default, it spends half its time on, and half its time off.

We can change this using the ratio parameter. The ratio specifies the on time as a proportion of the total wave time. A square wave, above, has a ratio of 0.5 (it is on for 50% of the time, therefore off for 50% of the time). The ratio parameter defaults to 0.5, so if you don;t specify it you will get a square wave.

We can change the ratio like this:

out = square_wave(params, frequency=500, ratio=0.2), 'pulse-500.wav', out)

In this case, the ratio is 0.2 (it is on for 20% of the time, therefore off for 80% of the time). Of course it is also possible to create a wave that is on for longer than it is off (for example a ratio of 0.6 gives a wave that is one for 60% of the time, off for 40%).

A wave with unequal of/off times is sometimes called a pulse wave. Here is what the 0.2 case looks like:

Sign up to the Creative Coding Newletter

Join my newsletter to receive occasional emails when new content is added, using the form below:

Popular tags

ebooks fractal generative art generativepy generativepy tutorials github koch curve l systems mandelbrot open source productivity pysound python recursion scipy sine sound spriograph tinkerbell turtle writing