This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
sarah [2017/09/05 19:54] shane [About SARAH's oscillators] |
sarah [2017/09/30 15:38] (current) shane |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== SARAH: FFT-based synthesizer plugin ====== | ====== SARAH: FFT-based synthesizer plugin ====== | ||
- | **SARAH** is an improved and expanded version of [[VanillaJuce]] which uses the new DSP classes provided in JUCE 5.1 to address the problem of oscillator aliasing. It works by using // | + | **SARAH** is an improved and expanded version of [[VanillaJuce]] which uses the new DSP classes provided in JUCE 5.1 to address the problem of oscillator aliasing. It works by using // |
Because of the use of the Harmonic Analysis, via the Fast Fourier Transform, and because Fourier himself was French, and because the really great name [[http:// | Because of the use of the Harmonic Analysis, via the Fast Fourier Transform, and because Fourier himself was French, and because the really great name [[http:// | ||
Line 19: | Line 19: | ||
===== About SARAH' | ===== About SARAH' | ||
- | The oscillators are the only interesting aspect of SARAH' | + | The oscillators are the only interesting aspect of SARAH' |
+ | |||
+ | SARAH' | ||
+ | |||
+ | There is a common sine wave table which is generated once and shared by all oscillator instances (including the LFOs in sine-wave mode). This is adequate, because the sine wave has no higher-order harmonics which need to be suppressed to avoid aliasing. | ||
+ | |||
+ | The triangle, square, and sawtooth wave tables are generated dynamically, | ||
+ | - 1024 samples of each waveform (one cycle) are generated once, using exactly the same mathematical expressions used in the LFOs, resulting in mathematically " | ||
+ | - Each mathematically-exact waveform is transformed using // | ||
+ | - Each oscillator instance has its own 1024-element array. In preparation to sound a note, it copies the coefficient data out from the appropriate common frequency-domain table to its own array, then performs an //in-place **inverse FFT**// to reconstruct the appropriate time-domain wave table. To prevent aliasing, only the coefficients for harmonics below the //Nyquist frequency// (one-half the sampling rate) are copied; higher-order coefficients are set to zero. | ||
+ | |||
+ | ===== Harmonic Shaping ===== | ||
+ | Zeroing (or changing in any way) the coefficients of a frequency-domain signal and then performing an inverse FFT is basically a kind of filtering. After I had implemented the dynamic wavetable reconstruction algorithm described above, it occurred to me that I could easily apply some kind of frequency-response curve to the non-zero harmonic components, to obtain a similar effect as running the oscillator output through a conventional filter. This requires many more inverse FFT operations (because it must be done dynamically, | ||
+ | |||
+ | Because SARAH is using coefficient adjustments and the inverse FFT to // | ||
+ | |||
+ | ===== The details ===== | ||
+ | See [[sarah_oscillator_details|this page]] for the gritty details of SARAH' | ||
+ | |||
+ | ===== Skinning ===== | ||
+ | As of 29 September, 2017, SARAH uses a single-view GUI instead of the multi-tabbed approach inherited from [[https:// | ||
- | SARAH uses two oscillator instances per voice. The oscillators themselves are identically-structured, | ||
- | (More to come...) | ||