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:40] shane |
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:// | ||
+ | |||
+ | I don't suggest the FFT-based approach is in any way superior to more conventional time-domain synthesis approaches. Simplicity is probably its only virtue. I present SARAH as nothing more than an example of how to incorporate one small aspect of the new JUCE 5.1 DSP library into a plugin, present some early ideas about oscillator anti-aliasing, | ||
You can find the SARAH source-code (published under the [[https:// | You can find the SARAH source-code (published under the [[https:// | ||
Line 12: | Line 14: | ||
{{:: | {{:: | ||
- | The two oscillators OSC1 and OSC2 are the same in terms of how they are controlled. In addition to the “waveform”, | + | The two oscillators OSC1 and OSC2 are the same in terms of how they are controlled. In addition to the “waveform”, |
The OSC1 and OSC2 outputs are mixed according to the “Blend” setting. The mixed output is scaled by the sum of the Amp EG output, plus the “Master volume” setting, and split out evenly (no panning) to the Left and Right audio outputs. | The OSC1 and OSC2 outputs are mixed according to the “Blend” setting. The mixed output is scaled by the sum of the Amp EG output, plus the “Master volume” setting, and split out evenly (no panning) to the Left and Right audio outputs. | ||
+ | ===== About 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:// | ||
- | (More to come...) | ||