# oscillators.lib

This library contains a collection of sound generators. Its official prefix is `os`

.

## Wave-Table-Based Oscillators

`(os.)sinwaveform`

Sine waveform ready to use with a `rdtable`

.

#### Usage

```
sinwaveform(tablesize) : _
```

Where:

`tablesize`

: the table size

`(os.)coswaveform`

Cosine waveform ready to use with a `rdtable`

.

#### Usage

```
coswaveform(tablesize) : _
```

Where:

`tablesize`

: the table size

`(os.)phasor`

A simple phasor to be used with a `rdtable`

.
`phasor`

is a standard Faust function.

#### Usage

```
phasor(tablesize,freq) : _
```

Where:

`tablesize`

: the table size`freq`

: the frequency of the phasor (Hz)

`(os.)hs_phasor`

Hardsyncing phasor to be used with an `rdtable`

.

#### Usage

```
hs_phasor(tablesize,freq,c) : _
```

Where:

`tablesize`

: the table size`freq`

: the frequency of the phasor (Hz)`c`

: a clock signal,`c>0`

resets phase to 0

`(os.)hsp_phasor`

Hardsyncing phasor with selectable phase to be used with an `rdtable`

.

#### Usage

```
hsp_phasor(tablesize,freq,p,c)
```

Where:

`tablesize`

: the table size`freq`

: the frequency of the phasor (Hz)`p`

: phase init (0 <=`p`

<=1)`c`

: a clock signal,`c>0`

resets phase to 0

`(os.)oscsin`

Sine wave oscillator.
`oscsin`

is a standard Faust function.

#### Usage

```
oscsin(freq) : _
```

Where:

`freq`

: the frequency of the wave (Hz)

`(os.)hs_oscsin`

Sin lookup table with hardsyncing phase.

#### Usage

```
hs_oscsin(freq,c) : _
```

Where:

`freq`

: the fundamental frequency of the phasor`c`

: a clock signal,`c>0`

resets phase to 0

`(os.)osccos`

Cosine wave oscillator.

#### Usage

```
osccos(freq) : _
```

Where:

`freq`

: the frequency of the wave (Hz)

`(os.)oscp`

A sine wave generator with controllable phase.

#### Usage

```
oscp(freq,phase) : _
```

Where:

`freq`

: the frequency of the wave (Hz)`phase`

: the phase in radian

`(os.)osci`

Interpolated phase sine wave oscillator.

#### Usage

```
osci(freq) : _
```

Where:

`freq`

: the frequency of the wave (Hz)

## LFOs

Low-Frequency Oscillators (LFOs) have prefix `lf_`

(no aliasing suppression, which is not audible at LF).

`(os.)lf_imptrain`

Unit-amplitude low-frequency impulse train.
`lf_imptrain`

is a standard Faust function.

#### Usage

```
lf_imptrain(freq) : _
```

Where:

`freq`

: frequency in Hz

`(os.)lf_pulsetrainpos`

Unit-amplitude nonnegative LF pulse train, duty cycle between 0 and 1.

#### Usage

```
lf_pulsetrainpos(freq,duty) : _
```

Where:

`freq`

: frequency in Hz`duty`

: duty cycle between 0 and 1

`(os.)lf_pulsetrain`

Unit-amplitude zero-mean LF pulse train, duty cycle between 0 and 1.

#### Usage

```
lf_pulsetrain(freq,duty) : _
```

Where:

`freq`

: frequency in Hz`duty`

: duty cycle between 0 and 1

`(os.)lf_squarewavepos`

Positive LF square wave in [0,1]

#### Usage

```
lf_squarewavepos(freq) : _
```

Where:

`freq`

: frequency in Hz

`(os.)lf_squarewave`

Zero-mean unit-amplitude LF square wave.
`lf_squarewave`

is a standard Faust function.

#### Usage

```
lf_squarewave(freq) : _
```

Where:

`freq`

: frequency in Hz

`(os.)lf_trianglepos`

Positive unit-amplitude LF positive triangle wave.

#### Usage

```
lf_trianglepos(freq) : _
```

Where:

`freq`

: frequency in Hz

`(os.)lf_triangle`

Positive unit-amplitude LF triangle wave
`lf_triangle`

is a standard Faust function.

#### Usage

```
lf_triangle(freq) : _
```

Where:

`freq`

: frequency in Hz

## Low Frequency Sawtooths

Sawtooth waveform oscillators for virtual analog synthesis et al.
The 'simple' versions (`lf_rawsaw`

, `lf_sawpos`

and `saw1`

), are mere samplings of
the ideal continuous-time ("analog") waveforms. While simple, the
aliasing due to sampling is quite audible. The differentiated
polynomial waveform family (`saw2`

, `sawN`

, and derived functions)
do some extra processing to suppress aliasing (not audible for
very low fundamental frequencies). According to Lehtonen et al.
(JASA 2012), the aliasing of `saw2`

should be inaudible at fundamental
frequencies below 2 kHz or so, for a 44.1 kHz sampling rate and 60 dB SPL
presentation level; fundamentals 415 and below required no aliasing
suppression (i.e., `saw1`

is ok).

`(os.)lf_rawsaw`

Simple sawtooth waveform oscillator between 0 and period in samples.

#### Usage

```
lf_rawsaw(periodsamps)
```

Where:

`periodsamps`

: number of periods per samples

`(os.)lf_sawpos_phase`

Simple sawtooth waveform oscillator between 0 and 1 with phase control.

#### Usage

```
lf_sawpos_phase(phase,freq)
```

Where:

`phase`

: phase`freq`

: frequency

`(os.)lf_sawpos`

Simple sawtooth waveform oscillator between 0 and 1.

#### Usage

```
lf_sawpos(freq)
```

Where:

`freq`

: frequency

`(os.)lf_sawpos_reset`

Simple sawtooth waveform oscillator between 0 and 1. with reset.

#### Usage

```
lf_sawpos_reset(freq,reset)
```

Where:

`freq`

: frequency`reset`

: reset the oscillator to 0

`(os.)lf_sawpos_phase_reset`

Simple sawtooth waveform oscillator between 0 and 1. with phase control and reset.

#### Usage

```
lf_sawpos_phase_reset(freq,phase,reset)
```

Where:

`freq`

: frequency`phase`

: phase between 0 and 1`reset`

: reset the oscillator to 0

`(os.)lf_saw`

Simple sawtooth waveform.
`lf_saw`

is a standard Faust function.

#### Usage

```
lf_saw(freq)
```

Where:

`freq`

: frequency

## Bandlimited Sawtooth

`(os.)sawN`

Bandlimited Sawtooth

`sawN(N,freq)`

, `sawNp`

, `saw2dpw(freq)`

, `saw2(freq)`

, `saw3(freq)`

,
`saw4(freq)`

, `saw5(freq)`

, `saw6(freq)`

, `sawtooth(freq)`

, `saw2f2(freq)`

`saw2f4(freq)`

#### Method 1 (`saw2`

)

Polynomial Transition Regions (PTR) (for aliasing suppression).

##### References

- Kleimola, J.; Valimaki, V., "Reducing Aliasing from Synthetic Audio Signals Using Polynomial Transition Regions," in Signal Processing Letters, IEEE , vol.19, no.2, pp.67-70, Feb. 2012
- https://aaltodoc.aalto.fi/bitstream/handle/123456789/7747/publication6.pdf?sequence=9
- http://research.spa.aalto.fi/publications/papers/spl-ptr/

#### Method 2 (`sawN`

)

Differentiated Polynomial Waves (DPW) (for aliasing suppression).

##### Reference

"Alias-Suppressed Oscillators based on Differentiated Polynomial Waveforms", Vesa Valimaki, Juhan Nam, Julius Smith, and Jonathan Abel, IEEE Tr. Acoustics, Speech, and Language Processing (IEEE-ASLP), Vol. 18, no. 5, May 2010.

#### Other Cases

Correction-filtered versions of `saw2`

: `saw2f2`

, `saw2f4`

The correction filter compensates "droop" near half the sampling rate.
See reference for sawN.

#### Usage

```
sawN(N,freq) : _
sawNp(N,freq,phase) : _
saw2dpw(freq) : _
saw2(freq) : _
saw3(freq) : _ // based on sawN
saw4(freq) : _ // based on sawN
saw5(freq) : _ // based on sawN
saw6(freq) : _ // based on sawN
sawtooth(freq) : _ // = saw2
saw2f2(freq) : _
saw2f4(freq) : _
```

Where:

`N`

: polynomial order`freq`

: frequency in Hz`phase`

: phase

`(os.)sawNp`

TODO: MarkDown doc in comments

`(os.)saw2dpw`

TODO: MarkDown doc in comments

`(os.)saw3`

TODO: MarkDown doc in comments

`(os.)sawtooth`

Alias-free sawtooth wave. 2nd order interpolation (based
on `saw2`

).
`sawtooth`

is a standard Faust function.

#### Usage

```
sawtooth(freq) : _
```

Where:

`freq`

: frequency

`(os.)saw2f2`

TODO: MarkDown doc in comments

`(os.)saw2f4`

TODO: MarkDown doc in comments

## Bandlimited Pulse, Square, and Impulse Trains

Bandlimited Pulse, Square, and Impulse Trains.

`pulsetrainN`

, `pulsetrain`

, `squareN`

, `square`

, `imptrain`

, `imptrainN`

,
`triangle`

, `triangleN`

All are zero-mean and meant to oscillate in the audio frequency range. Use simpler sample-rounded lf_* versions above for LFOs.

#### Usage

```
pulsetrainN(N,freq,duty) : _
pulsetrain(freq, duty) : _ // = pulsetrainN(2)
squareN(N, freq) : _
square : _ // = squareN(2)
imptrainN(N,freq) : _
imptrain : _ // = imptrainN(2)
triangleN(N,freq) : _
triangle : _ // = triangleN(2)
```

Where:

`N`

: polynomial order`freq`

: frequency in Hz

`(os.)pulsetrainN`

TODO: MarkDown doc in comments

`(os.)pulsetrain`

Bandlimited pulse train oscillator. Based on `pulsetrainN(2)`

.
`pulsetrain`

is a standard Faust function.

#### Usage

```
pulsetrain(freq, duty) : _
```

Where:

`freq`

: frequency`duty`

: duty cycle between 0 and 1

`(os.)squareN`

TODO: MarkDown doc in comments

`(os.)square`

Bandlimited square wave oscillator. Based on `squareN(2)`

.
`square`

is a standard Faust function.

#### Usage

```
square(freq) : _
```

Where:

`freq`

: frequency

`(os.)impulse`

One-time impulse generated when the Faust process is started.
`impulse`

is a standard Faust function.

#### Usage

```
impulse : _
```

`(os.)imptrainN`

TODO: MarkDown doc in comments

`(os.)imptrain`

Bandlimited impulse train generator. Based on `imptrainN(2)`

.
`imptrain`

is a standard Faust function.

#### Usage

```
imptrain(freq) : _
```

Where:

`freq`

: frequency

`(os.)triangleN`

TODO: MarkDown doc in comments

`(os.)triangle`

Bandlimited triangle wave oscillator. Based on `triangleN(2)`

.
`triangle`

is a standard Faust function.

#### Usage

```
triangle(freq) : _
```

Where:

`freq`

: frequency

## Filter-Based Oscillators

Filter-Based Oscillators

#### Usage

```
osc[b|r|rs|rc|s|w](f), where f = frequency in Hz.
```

#### References

- http://lac.linuxaudio.org/2012/download/lac12-slides-jos.pdf
- https://ccrma.stanford.edu/~jos/pdf/lac12-paper-jos.pdf

`(os.)oscb`

Sinusoidal oscillator based on the biquad.

#### Usage

```
oscb(freq) : _
```

Where:

`freq`

: frequency

`(os.)oscrq`

Sinusoidal (sine and cosine) oscillator based on 2D vector rotation, = undamped "coupled-form" resonator = lossless 2nd-order normalized ladder filter.

#### Usage

```
oscrq(freq) : _,_
```

Where:

`freq`

: frequency

#### Reference

`(os.)oscrs`

Sinusoidal (sine) oscillator based on 2D vector rotation, = undamped "coupled-form" resonator = lossless 2nd-order normalized ladder filter.

#### Usage

```
oscrs(freq) : _
```

Where:

`freq`

: frequency

#### Reference

`(os.)oscrc`

Sinusoidal (cosine) oscillator based on 2D vector rotation, = undamped "coupled-form" resonator = lossless 2nd-order normalized ladder filter.

#### Usage

```
oscrc(freq) : _
```

Where:

`freq`

: frequency

#### Reference

`(os.)oscs`

Sinusoidal oscillator based on the state variable filter = undamped "modified-coupled-form" resonator = "magic circle" algorithm used in graphics.

`(os.)osc`

Default sine wave oscillator (same as oscsin).
`osc`

is a standard Faust function.

#### Usage

```
osc(freq) : _
```

Where:

`freq`

: the frequency of the wave (Hz)

## Waveguide-Resonator-Based Oscillators

Sinusoidal oscillator based on the waveguide resonator `wgr`

.

`(os.)oscw`

Sinusoidal oscillator based on the waveguide resonator `wgr`

. Unit-amplitude
cosine oscillator.

#### Usage

```
oscwc(freq) : _
```

Where:

`freq`

: frequency

#### Reference

`(os.)oscws`

Sinusoidal oscillator based on the waveguide resonator `wgr`

. Unit-amplitude
sine oscillator.

#### Usage

```
oscws(freq) : _
```

Where:

`freq`

: frequency

#### Reference

`(os.)oscwq`

Sinusoidal oscillator based on the waveguide resonator `wgr`

.
Unit-amplitude cosine and sine (quadrature) oscillator.

#### Usage

```
oscwq(freq) : _
```

Where:

`freq`

: frequency

#### Reference

`(os.)oscw`

Sinusoidal oscillator based on the waveguide resonator `wgr`

.
Unit-amplitude cosine oscillator (default).

#### Usage

```
oscw(freq) : _
```

Where:

`freq`

: frequency

#### Reference

## Casio CZ Oscillators

Oscillators that mimic some of the Casio CZ oscillators.

There are two sets: - A set with an index parameter - A set with a res parameter

The "index oscillators" outputs a sine wave at index=0 and gets brighter with a higher index. There are two versions of the "index oscillators": - with P appended to the name: is phase aligned with 'fund:sin' - without P appended to the name: has the phase of the original CZ oscillators

The "res oscillators" have a resonant frequency. "res" is the frequency of resonance as a factor of the fundamental pitch.

`(os.)CZsaw`

Oscillator that mimics the Casio CZ saw oscillator
`CZsaw`

is a standard Faust function.

#### Usage

```
CZsaw(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = saw-wave

`(os.)CZsawP`

Oscillator that mimics the Casio CZ saw oscillator,
with it's phase aligned to `fund:sin`

.
`CZsawP`

is a standard Faust function.

#### Usage

```
CZsawP(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = saw-wave

`(os.)CZsquare`

Oscillator that mimics the Casio CZ square oscillator
`CZsquare`

is a standard Faust function.

#### Usage

```
CZsquare(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = square-wave

`(os.)CZsquareP`

Oscillator that mimics the Casio CZ square oscillator,
with it's phase aligned to `fund:sin`

.
`CZsquareP`

is a standard Faust function.

#### Usage

```
CZsquareP(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = square-wave

`(os.)CZpulse`

Oscillator that mimics the Casio CZ pulse oscillator
`CZpulse`

is a standard Faust function.

#### Usage

```
CZpulse(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 gives a sine-wave, 1 is closer to a pulse

`(os.)CZpulseP`

Oscillator that mimics the Casio CZ pulse oscillator,
with it's phase aligned to `fund:sin`

.
`CZpulseP`

is a standard Faust function.

#### Usage

```
CZpulseP(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 gives a sine-wave, 1 is closer to a pulse

`(os.)CZsinePulse`

Oscillator that mimics the Casio CZ sine/pulse oscillator
`CZsinePulse`

is a standard Faust function.

#### Usage

```
CZsinePulse(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 gives a sine-wave, 1 is a sine minus a pulse

`(os.)CZsinePulseP`

Oscillator that mimics the Casio CZ sine/pulse oscillator,
with it's phase aligned to `fund:sin`

.
`CZsinePulseP`

is a standard Faust function.

#### Usage

```
CZsinePulseP(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 gives a sine-wave, 1 is a sine minus a pulse

`(os.)CZhalfSine`

Oscillator that mimics the Casio CZ half sine oscillator
`CZhalfSine`

is a standard Faust function.

#### Usage

```
CZhalfSine(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 gives a sine-wave, 1 is somewhere between a saw and a square

`(os.)CZhalfSineP`

Oscillator that mimics the Casio CZ half sine oscillator,
with it's phase aligned to `fund:sin`

.
`CZhalfSineP`

is a standard Faust function.

#### Usage

```
CZhalfSineP(fund,index) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`index`

: the brightness of the oscillator, 0 gives a sine-wave, 1 is somewhere between a saw and a square

`(os.)CZresSaw`

Oscillator that mimics the Casio CZ resonant saw-tooth oscillator
`CZresSaw`

is a standard Faust function.

#### Usage

```
CZresSaw(fund,res) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`res`

: the frequency of resonance as a factor of the fundamental pitch.

`(os.)CZresTriangle`

Oscillator that mimics the Casio CZ resonant triangle oscillator
`CZresTriangle`

is a standard Faust function.

#### Usage

```
CZresTriangle(fund,res) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`res`

: the frequency of resonance as a factor of the fundamental pitch.

`(os.)CZresTrap`

Oscillator that mimics the Casio CZ resonant trapeze oscillator
`CZresTrap`

is a standard Faust function.

#### Usage

```
CZresTrap(fund,res) : _
```

Where:

`fund`

: a saw-tooth waveform between 0 and 1 that the oscillator slaves to`res`

: the frequency of resonance as a factor of the fundamental pitch.

## PolyBLEP-Based Oscillators

`(os.)polyblep`

PolyBLEP residual function - used for smoothing steps in the audio signal.

#### Usage

```
polyblep(Q, phase) : _
```

Where:

`Q`

: smoothing factor between 0 and 0.5. Determines how far from the ends of the phase interval the quadratic function is used.`phase`

: normalised phase (between 0 and 1)

`(os.)polyblep_saw`

Sawtooth oscillator with suppressed aliasing (using polyBLEP).

#### Usage

```
polyblep_saw(f) : _
```

Where:

`f`

: frequency in Hz

`(os.)polyblep_square`

Square wave oscillator with suppressed aliasing (using polyBLEP).

#### Usage

```
polyblep_square(f) : _
```

Where:

`f`

: frequency in Hz

`(os.)polyblep_triangle`

Triangle wave oscillator with suppressed aliasing (using polyBLEP).

#### Usage

```
polyblep_triangle(f) : _
```

Where:

`f`

: frequency in Hz

## Filter-Based Oscillators

`(os.)quadosc`

Sinusoidal oscillator based on QuadOsc by Martin Vicanek.

#### Usage

```
quadosc(freq) : _
```

where

`freq`

: frequency in Hz