FuncSynth is a synthesizer for harmonic sounds whose spectra over time are defined by functions. It provides spectrographs for sound visualization and can render series of variant sounds. It is also arbitrarily abstractable, since new control functions are easily defined. I wish I could say that it was especially suitable for the synthesis of funk, but its name refers to the functions which describe each sound.

Such functions are used in triplets. One describes the fundamental frequency over time; another describes the amplitude of each harmonic over time; and a third defines the number of harmonics present in the sound. The harmonics' amplitudes and relationships are calculated over each of an arbitrary number of time slices, and the oscillations are joined by a phase-matching algorithm.

My syntheses are largely multiplicative in the 0 - 1 domain, which can be considered a variation of substractive synthesis; the user is free to use whatever mathematical techniques he likes in the control functions.

For now, FuncSynth's interface is purely procedural and programmatic. I hope to design a superior syntax for it in the future, but this is a broad and distinct problem. Csound, for example, achieved a powerfully abstractable but practically unusable interface. Any suggestions on this topic are welcome.

Documentation:

You can download the source code. It has been successfully compiled on Linux and OS X. It depends upon the libsndfile and standard math libraries, and the gnuplot program.

You can send me an email at aaron@lithic.org.

Current features:

Labelled 3D spectrographs
Library of basic techniques
Sequence dimension for related sounds
Partials limited by Nyquist theorem
Optional limit at critical bandwidth
Phase matching over frequency shifts
Arbitrary resolution

Future features:

Matrix loading and math
Phase vocoder
Inharmonic partials
Direct output to sound card


Here are some examples. I used 250 Hz as a base because I find 440 a little annoying.
Description Fundamental Function

frequency = f ( slice )

Amplitude Function

amplitude = f ( slice, partial )

Harmonics Function

harmonics = f ( slice )

Spectrograph
The simplest note, one pure sine wave, has unchanging fundamental and amplitude. Listen. f = 250 a = 1 p = 1
This single-frequency sound has a 10 Hz. vibrato whose magnitude peaks in the middle of the sound and varies with some randomness. Listen. f = 250 + vibrato a = 1 p = 1
This sound encompasses a transition from dominant odd harmonics to even ones. The fundamental is left twice as strong as the peaks in other partials for consistency. Listen. f = 250 a = inversion * low pass p = critial bandwidth
A fuller sound with a handful of harmonics. The chi-squared curve makes a relatively natural amplitude envelope, and this low-pass filter provides a rudimentary timbre dominated by the fundamental frequency. A slight dip in frequency at the end causes the demise of higher harmonics at the end of the sound. Listen. f = 250 + end dip a = chi squared * low pass p = critial bandwidth
This sound features a 12 Hz. tremolo and ends with the frequency dip. Listen. f = 250 + end dip a = 1 + tremolo p = critical bandwidth
This sound has a highly randomized vibrato and decreasing amplitude of harmonics. The unbounded decrease in frequency makes for an unusual timbre. Listen. f = 250 + vibrato * random a = chi squared * low_pass p = critical bandwidth