User Tools

Site Tools


getting_started_vividshaper

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
getting_started_vividshaper [2026/09/09 18:05] larsgetting_started_vividshaper [2026/09/09 21:00] (current) – [Filter functions] lars
Line 312: Line 312:
  
 ===== Filter functions ===== ===== Filter functions =====
 +There are three different filters available in VividShaper: lowpass, bandpass, and highpass filters.
  
-The lowpass/bandpass/highpass filters work a little bit different from other apps. Instead of filtering the output from the oscillators, you can filter the wave itself. The wave filter function in VividSynths is a biquad filter. A biquad filter consists of five different coefficients and depending on how you set them you can create either a lowpass, bandpass, or highpass filter.+These can either be applied on the actual waveform itself or applied as an insert effectIn both scenarios, you need to create a filter first using the following functions:
  
 <code Lua> <code Lua>
-wave[x] VSBiquad(wave[x],biquadcoeff+filter1 VSLowpass(cutoffFreq,resonance) 
 +filter2 = VSBandpass(cutoffFreq,resonance) 
 +filter3 = VSHighpass(cutoffFreq,resonance)
 </code> </code>
  
-It can be quite difficult to calculate how these coefficients should be setso VividShaper comes with three functions for this purpose:+If you want to apply the lowpass filter on the actual waveformyou will do this with the VSBiquad function:
  
 <code Lua> <code Lua>
-biquadcoeff VSLowpass(cutoffFreq,resonance,notein) +wave[1] VSBiquad(wave[1],filter1)
-biquadcoeff = VSBandpass(cutoffFreq,resonance,notein) +
-biquadcoeff = VSHighpass(cutoffFreq,resonance,notein)+
 </code> </code>
  
-A very important thing is that you need to provide each of these helper functions with the current note. If you play a note at a low frequency, you may actually play under the cutoffFreq so that no filter should be applied at all for lowpass filter. That means the filter effect on the wave depends not only on the cutoff frequency and the resonance, but also on the playback frequency (i.e. the note).+Since this filter is applied directly to the waveform, you can continue to manipulate the resulting wave afterwards. The filtered waveform still becomes steady-state wave that is repeated by the oscillator.
  
-A full example comes here:+The other method is to use the filter as an insert effect, processing the oscillator output continuously. In this case, the filter retains its state from one waveform cycle to the next. This is particularly important for resonance: instead of being baked into a single repeating waveform, the resonant response can build up and ring across successive cycles, producing a more dynamic filter response over time. 
 + 
 +Say we want to apply the highpass-filter above as an insert on oscillator 1. Then we will write it like this: 
 + 
 +<code Lua> 
 +afilter[1] = filter3 
 +</code> 
 + 
 +You can even combine the two methods. Say you first filter the wave with a lowpass filter, then you apply the bandpass filter as an insert: 
 + 
 +<code Lua> 
 +filter1 = VSLowpass(cutoffFreq,resonance) 
 +filter2 = VSBandpass(cutoffFreq,resonance) 
 +wave[1] = VSBiquad(wave[1],filter1) 
 +afilter[1] = filter2 
 +</code> 
 + 
 +You can even apply the same filter twice: 
 + 
 +<code Lua> 
 +filter1 = VSLowpass(cutoffFreq,resonance) 
 +wave[1] = VSBiquad(wave[1],filter1) 
 +afilter[1] = filter1 
 +</code> 
 + 
 +Both the waveform and the insert filters VividSynths are biquad filters. A biquad filter consists of five different coefficients and depending on how you set them you can create either a lowpass, bandpass, or a highpass filter. The different filter functions return an array with 11 values. The first five values are used by the waveform filter (i.e. VSBiquad()) and the second five values are used by the insert filter. The final value is just a value to turn on or off the insert filter (0 or 1). You don't really need to understand how this works since the filter functions calculate the biquad parameters for us. 
 + 
 +In previous versions, you also needed to provide the current note to the filter, like this: 
 + 
 +<code Lua> 
 +filter1 = VSLowpass(cutoffFreq,resonance,notein) 
 +</code> 
 + 
 +From v2.0, you don't have to do that any longer, as notein is default. However, you can still provide a note value to obtain the effect of a filter that follows the note in terms of the cutoff-frequency: 
 + 
 + 
 +<code Lua> 
 +filter1 = VSLowpass(cutoffFreq,resonance,60) 
 +</code> 
 + 
 +A full example comes here for how to apply the waveform filter:
  
 <code Lua> <code Lua>
 -- Patch: Filter example -- Patch: Filter example
 wave[1] = VSSaw(1,0) wave[1] = VSSaw(1,0)
-vol[1] = VSADSRE(1,1,0.8,3,0,gatetimeon,gatetimeoff) +vol[1] = VSADSRE(1,1,0.8,3,gatetimeon,gatetimeoff) 
-biquadcoeff = VSLowpass(300,1,notein)+biquadcoeff = VSLowpass(300,1)
 wave[1] = VSBiquad(wave[1],biquadcoeff) wave[1] = VSBiquad(wave[1],biquadcoeff)
 </code> </code>
Line 371: Line 412:
 ===== Math functions ===== ===== Math functions =====
  
-Besides all the built in math functions that come with Lua, VividShaper also comes with some wave manipulating wave functions that you may find useful. These are:+VividShaper allows you do apply all maths operators on the different waves: 
 + 
 +**+ - * / %** 
 + 
 +For instance, say you want to build an additive synth with sine waves, Then you can write: 
 + 
 +<code Lua
 +wave[1] = 0.3*VSSin(1,0)+0.6*VSSin(2,0)+0.3*VSSin(3,0) 
 +</code> 
 + 
 +You can also multiply two wave forms with each other, element-wise: 
 + 
 +<code Lua> 
 +wave[1] = VSSin(1,0)*VSSaw(1,0,0.5) 
 +</code> 
 + 
 +The modulus operator works with floats as well as integers: 
 + 
 +<code Lua> 
 +wave[1] = 2*(VSSin(1,0)%0.5) 
 +</code> 
 + 
 +{{:patchmodulus.png?600|}} 
 + 
 +If you divide one waveform with another waveform, you may get a division with zero. Although not mathematically correct, such divisions will always return zero for convenience.  
 + 
 +Previous versions before v2.0 did have functions instead that you would call to make the calculations. These are still available for compatibility reasons with older patches:
  
 <code Lua> <code Lua>
Line 382: Line 449:
 </code> </code>
  
-With these functions, you can either e.g. multiply a wave with a scalar value or a wave with another wave. These are very useful functions if you want to create an additive synth:+An additive synth with the older functions looks like this:
  
 <code Lua> <code Lua>
Line 538: Line 605:
 reverb1[5] -- mixMode, where 0=insert and 1=send. reverb1[5] -- mixMode, where 0=insert and 1=send.
 reverb1[6] -- tailLatch, where 0=off and 1=on. reverb1[6] -- tailLatch, where 0=off and 1=on.
-reverb1[7] -- keep (0 - 1), how much of the stereo signal that should be kept in the reverb. +reverb1[7] -- keep (0 - 1). How much of the stereo signal that should be kept in the reverb. 
-reverb1[8] -- cross (0 - 1), how much of the stereo signal that should be leaked+reverb1[8] -- cross (0 - 1). How much of the stereo signal that should be leaked 
 +reverb1[9] -- Stereo (0 - 1). If you want the final output from the reverb to be mono or stereo.
 </code> </code>
  
getting_started_vividshaper.1788977128.txt.gz · Last modified: by lars