VirtualJV FX chain

Hello @zynthianers. I am opening a collateral topic of the main JV880 thread (JV880/JUCE on raspberry), to specifically highlight a subject that has been the occasional object of discussion:

how to improve the overall frequency spectrum output of a digital synthesis algorithm, originally designed to run on a device with 32Khz of DAC resolution.

Following suggestions from @piattica and others, I set to reconstruct on Zynthian (Oram) an FX chain for VirtualJV previously experimented with some success on a Mac-Cubase installation of the plugin. The goal was to bestow more hi-fi presence and upper spectrum brilliance, to the audio output of a rompler synth which tends to sound objectively a little dull, to contemporary ears used to the generous timbral response of modern samplers and libraries.

As a premise, I confirm the @ricard’s point that VirtualJV as it is sounds definitely better - without acoustic artifacts added by conversion between different sample rates - after setting the Zynthian’s DAC duty cycle at the same nominal frequency of the original hardware’s converters (i.e. at 32000 Hz).

If, conversely, one wants to add color and richness to the higher spectrum, the audio resolution of the FX processors becomes essential, and therefore setting Zynthian at 48000 (or even 96000, if sustainable according to snapshot complexity) is required. Otherwise, at lower rates the effects stage will introduce undesirable noises and artifacts, in pretty audible quantities.

For the FX design, I have employed a serial pre-fader chain, consisting of:

1] Calf Filter, with a 12 Db/Oct slope and a cutoff point between 15K and 16K Hz.

2] Tap Tubewarmth amplifier simulator, with overall delicate settings and a drive amount in the 0.2-0.5 range.

3] Calf Multi Chorus, with slow oscillation frequency and quite discrete amounts, voices addition and gains.

4 Dragonfly Hall Reverb.

In the attached snapshot, I have layered in active mode two versions of the same orchestral strings preset, slightly panned L-R ±30%: one is the untreated VirtualJV output, the other is the same sound passed through the FX chain. You can mute/unmute the two chains to listen selectively to the single outcome.

Overall, I think that this effects design works extremely well, providing better frequency response across the spectrum, added presence and an improved sense of three-dimensional depth of the sound stage. The layered patch delivers majesty and symphonic weight straight away, with better subjective clarity of the internal voices if you play polyphonically, at least to my ears.

I encourage you to try different timbres and layerings. Experimenting with this, I have come to detect that for brass presets it is advisable to disable the Multi Chorus, unless a synth-like output is desirable for its own sonic quality.

Depending on timbre and sound design objectives, the chorus is the FX element that more confers artificiality, while obviously does marvels and works brilliantly with stringed timbres, which are based on waveforms of the saw/ramp type.

I hope it is of any use :slightly_smiling_face:

Have fun, cheers! :rainbow:

020-Aethermind_Virtual JV FX chain.zss (9.5 KB)

PS: Of course, there is a setup to possibly experiment with: analog audio outputs of a Zynthian set at 32000 with VirtualJX passed through the FX chain on the analog inputs of another Zynthian set at 96000!

7 Likes

I just want to add, regarding the sample rate of Zynthian relative to VirtualJV, is that there seems to be some complex relationship between the sample rate and buffer size (latency). Referring to JV880/JUCE on raspberry - #119 by ricard and JV880/JUCE on raspberry - #125 by ricard it seems that for instance when setting a sample rate of 48000 in Zynthian VirtualJV sounds fine when the buffer size is 64 but not when it is 128, whereas when the Zynthian sample rate is set to 44100 it sounds fine with a buffer size of 128. So I don’t believe it’s the sample rate conversion per se that is causing problems, but rather some surrounding issue, like how the buffers are managed. (My thinking here is that when Zynthian requests a buffer of, say, 48000 Hz data, this would principally result in a non-integral number of samples being requested from VirtualJV, which is obviously not possible, so this is handled by requesting a few samples to many, and buffering them between processing calls, and it is this handling which for some reason fails for certain combinations of sample rate and buffer size).

Regarding the DAC frequency management on the original hardware, it would be interesting to discover what sample resolution contained, by factory design, the SR-JV80 expansion boards, if the initially exploited 32K or the higher 44.1K of the more hi-fi JD-990. I have no means to verify this with my precious Orchestral and Vintage Synth expansions on PCB, neither would subject them to some weird or brutal analytical procedure.

I wonder indeed whether the 990 was devised for integrating the missing data, with some kind of clever 32K-to-44.1K sample translation algorithm, or the 880/1080/2028 series was conceived from the beginning to read at a lower DAC rate a set of samples already stored at 44100. The second hypothesis seems more plausible.

Anyway, there’s no doubting that, in general, all sorts of possible sonic artifacts are likely to arise, from the fractional values generated by the non-integer relationships 44.1K/32K, 48K/32K and 48K/44.1K.

Regards :slight_smile:

True, but sample rate conversion is a well-known operation, and on a modern platform there should be no obvious artifacts if done properly, regardless of the conversion ratio. Anything that stands out is a result of something wrong in the implementation or taking too many shortcuts.