# [LAD] Wave shapes & forms

David Olofson david at olofson.net
Tue Oct 21 14:26:45 UTC 2014

```Really inefficient and awful sounding version:
output[pos] = (sin (self->phase * 2 * PI ) >= 0 ? 1 : -1) * volume;

Dirty trick: Round the phase increment so that the period becomes an
integer number of sample frames! This produces crystal clear square
waves, but frequency resolution is awful for high frequencies and/or
low sample rates, of course.

The simplest "correct" way is to construct the square wave by adding
up partials (sines), and just stop below Nyqvist, which essentially
brickwall-filters the waveform. Perfect results, but pretty
expensive...

The proper answer is that it's actually really complicated to do this
well, because an ideal geometric waveform contains an infinite number
of partials, and the ones above Nyqvist (sample rate / 2) will be
mirrored down below Nyqvist, making it all sound awful.

Some keywords: band limited oscillator, BLIT, BLEP, minBLEP

You may find interesting code examples here: http://musicdsp.org/

On Tue, Oct 21, 2014 at 3:56 PM, Philippe Coatmeur <philcm at gnu.org> wrote:
> Hi
>
> If this
>
>     // calculate the next sample: phase ranges from 0 -> 1, but sin()
>     // expects its input in radians. Just multiply by 2 PI to convert it!
>     // We also multiply by volume so its not extremely loud.
>     output[pos] = sin( self->phase * 2 * PI ) * volume;
>
> Sends a sine wave to output (this is the standard sin math function, right?)
> then what would send a square wave? What would send noise?
>
> Thanks -Phil
>
> --
> Philippe "xaccrocheur" Coatmeur
> http://bitbucket.org/xaccrocheur / https://github.com/xaccrocheur
> http://opensimo.org/play/
>
>
> _______________________________________________
> Linux-audio-dev mailing list
> Linux-audio-dev at lists.linuxaudio.org
> http://lists.linuxaudio.org/listinfo/linux-audio-dev
>

--
//David Olofson - Consultant, Developer, Artist, Open Source Advocate

.--- Games, examples, libraries, scripting, sound, music, graphics ---.