Hehehe, for Lately and Fairlight vox, check the 3 Wavetable example presets... not sure if one would like to come much closer, I find them nicely modernized...surreal wrote:Urs thank you very much for all the time you but into these tutorials. .Urs wrote:Note that scaling the envelope with anything like env(x)^2 is very different from the built-in curves. Latter scale falling edges "upside down" of rising edges, like in analogue stuff. That's why I put them in, so there's the option for either kind of curvature.
My question is how do I make a lately bass, fairlight vox type sound and a hard synch or Lazerharp type sound... sorry if I sound like a stuck record.. honestly this new addition to Hive is awesome!!
[.uhm] FM Synthesis in Hive
- u-he
- Topic Starter
- 30195 posts since 8 Aug, 2002 from Berlin
- u-he
- Topic Starter
- 30195 posts since 8 Aug, 2002 from Berlin
- KVRist
- 430 posts since 4 Jun, 2018 from The UK
I've been playing with the envelopes. I created a wobbly bass-ish patch with a delay effect that gets brighter as it fades out. Probably not practical, was just playing around. Made use of some of the tricks I've been learning, probably most sound-designy wavetable I've done so far.
Code: Select all
NumFrames=100
Info "Ranoka - Wobbly Bass wavetable with delay effect that gets brighter as it fades out. Set Auto to -0.70 and Auto Mode to forward loop. Might need to boost the volume, or use the compressor etc."
// linear exponential quadric
Envelope curve=quadric L0=0.0 T1=0.05 L1=1 T2=0.1 L2=0.90 T3=0.75 L3=0.00
//Wave "env(phase)" //drzhnn trick to visualize wavetable
//Create the Bass sound and 9 delay echos
Wave start=0 end=9 "sin (2*pi*phase * 1)"
Wave start=0 end=9 "sin (2*pi*phase + x)"
Wave start=0 end=9 "sin (2*pi*phase + x * (8 - (table * 8) ))"
Wave start=10 end=19 "sin (2*pi*phase * 1)"
Wave start=10 end=19 "sin (2*pi*phase + x)"
Wave start=10 end=19 "sin (2*pi*phase + x * (16 - (table * 16) ))"
Wave start=20 end=29 "sin (2*pi*phase * 1)"
Wave start=20 end=29 "sin (2*pi*phase + x)"
Wave start=20 end=29 "sin (2*pi*phase + x * (32 - (table * 32) ))"
Wave start=30 end=39 "sin (2*pi*phase * 1)"
Wave start=30 end=39 "sin (2*pi*phase + x)"
Wave start=30 end=39 "sin (2*pi*phase + x * (64 - (table * 64) ))"
Wave start=40 end=49 "sin (2*pi*phase * 1)"
Wave start=40 end=49 "sin (2*pi*phase + x)"
Wave start=40 end=49 "sin (2*pi*phase + x * (128 - (table * 128) ))"
Wave start=50 end=59 "sin (2*pi*phase * 1)"
Wave start=50 end=59 "sin (2*pi*phase + x)"
Wave start=50 end=59 "sin (2*pi*phase + x * (256 - (table * 256) ))"
Wave start=60 end=69 "sin (2*pi*phase * 1)"
Wave start=60 end=69 "sin (2*pi*phase + x)"
Wave start=60 end=69 "sin (2*pi*phase + x * (512 - (table * 512) ))"
Wave start=70 end=79 "sin (2*pi*phase * 1)"
Wave start=70 end=79 "sin (2*pi*phase + x)"
Wave start=70 end=79 "sin (2*pi*phase + x * (1024 - (table * 1024) ))"
Wave start=80 end=89 "sin (2*pi*phase * 1)"
Wave start=80 end=89 "sin (2*pi*phase + x)"
Wave start=80 end=89 "sin (2*pi*phase + x * (2048 - (table * 2048) ))"
Wave start=90 end=99 "sin (2*pi*phase * 1)"
Wave start=90 end=99 "sin (2*pi*phase + x)"
Wave start=90 end=99 "sin (2*pi*phase + x * (4096 - (table * 4096) ))"
Wave start=0 end=100 "x * env(table)" // Apply the envelope
Wave "lowpass(x, 0.75, 0.2) * 0.8" // Lowpass to dampen high end
Wave blend=add "tanh( lowpass(x, 0.2, 0.5) * 0.3)" // Urs trick from Karplus-strong tutorial to add some low end
// Don't seem to make much difference
//Spectrum lowest=0 highest=0 "0" // remove DC offset
//Normalize base=all
- KVRian
- 544 posts since 1 Jan, 2013 from Saint-Petersburg, Russia
Has anyone figured out the magic formula for operator feedback? I spent whole day and night trying to get those classic brassy saws and I failed miserably.
- u-he
- Topic Starter
- 30195 posts since 8 Aug, 2002 from Berlin
You need to average the last two y samples- which doesn't really work yet. But I do have an idea for this. Maybe next beta...drzhnn wrote:Has anyone figured out the magic formula for operator feedback? I spent whole day and night trying to get those classic brassy saws and I failed miserably.
- KVRian
- 544 posts since 1 Jan, 2013 from Saint-Petersburg, Russia
Talking about the y variable, I believe there's an error in the Script Language manual, the definitions for x and y are mixed up:Urs wrote:You need to average the last two y samples...

- u-he
- Topic Starter
- 30195 posts since 8 Aug, 2002 from Berlin
Nope, x and y are correct. X is what a previous expression (Wave...) has left in the buffers. Y is what happened at the previous index in the current line.
- KVRAF
- 4197 posts since 23 May, 2004 from Bad Vilbel, Germany
I can assure you that I'm failing more miserably than you! I can't quite wrap my head around certain basic concepts, and even if I have an inkling, it's gone the next day...drzhnn wrote:Has anyone figured out the magic formula for operator feedback? I spent whole day and night trying to get those classic brassy saws and I failed miserably.
BTW did you try more operators in series? I suspect that would get you in the ballpark (will experiment in Bazille).
- u-he
- Topic Starter
- 30195 posts since 8 Aug, 2002 from Berlin
Chapter 2: FM Feedback!
Because it came up, here are the basics, Hive-style!
Let's have a look at some pseudo-code as to what FM Feedback in DX-style synths looked like. I'm using array notation y[ t ], where t is the current sample-value, while t-1 would be the previous and t-2 the one before.
One might naively think that FM feedback was done by juts feeding the operator back into itself. But that's not the case. Doing so quickly generates some high-frequency artifacts, before things burst into noise. Yamaha's engineers figured that out and simply averaged the two past output samples. That's how you get that smooth FM sawtooth sound.
In uhm, we have only y. As it's the result of the previous sample value, it is actually y[ t-1 ] (i.e. not "zero delay feedback"
). I had considered using yz as variable to access y[ t-2 ], but dismissed that thought. I might bring up an accessor function for past results, but am uncertain about it as of today. However, we have another tool to our disposal which does the job just fine: The lowpass() function!
So, check out this perfect FM-sawtooth:
It works really well IMHO. The lowpass is more than a good match for the averaging in the original algorithm, maybe even better. Depending on modulation depths, adjust cutoff (here: 0.95) to taste. Or try some resonance even, hehehe.
Now another thing I always liked was the square feedback to get square-ish waveforms:
That works nicely too, but this next one works even better:
There you go. FM feedback playground has just opened!
- U
Because it came up, here are the basics, Hive-style!
Let's have a look at some pseudo-code as to what FM Feedback in DX-style synths looked like. I'm using array notation y[ t ], where t is the current sample-value, while t-1 would be the previous and t-2 the one before.
Code: Select all
y[ t ] = sin( 2*pi*phase + feedback * 0.5 * ( y[ t-1 ] + y[ t-2 ] ) );In uhm, we have only y. As it's the result of the previous sample value, it is actually y[ t-1 ] (i.e. not "zero delay feedback"
So, check out this perfect FM-sawtooth:
Code: Select all
NumFrames=256
Envelope L0=2.2 T1=1 L1=0
Wave "sin( 2*pi*phase + env(table) * lowpass(y,0.95,0) )"Now another thing I always liked was the square feedback to get square-ish waveforms:
Code: Select all
Wave "sin( 2*pi*phase + env(table) * lowpass(y,0.94,0)^2 )"Code: Select all
Wave "sin( 2*pi*phase + env(table) * abs(lowpass(y,0.94,0)) )"- U
- u-he
- Topic Starter
- 30195 posts since 8 Aug, 2002 from Berlin
Btw. there's also a completely different approach to FM feedback, which is related to the methods used in the Karplus-Strong thread.
No envelope required. This method simply uses the previously calculated frame as input for the current frame's feedback. The delay is simply 2048 samples instead of just 1-2. While it does work as well, it is not nearly as brilliant and smooth sounding as the direct "in-wave" feedback. But maybe someone finds ways to put this to great use?
Code: Select all
NumFrames=256
Wave "sin( 2*pi*phase + table * 1.4 * lowpass( main_fi(frame-1, index),0.9,0) )"- KVRian
- 544 posts since 1 Jan, 2013 from Saint-Petersburg, Russia
I hear you Howard! I guess we all have to just embrace the suck and practice until it clicks.Howard wrote:I can assure you that I'm failing more miserably than you! I can't quite wrap my head around certain basic concepts, and even if I have an inkling, it's gone the next day...drzhnn wrote:Has anyone figured out the magic formula for operator feedback? I spent whole day and night trying to get those classic brassy saws and I failed miserably.
Actually, owning Zebra, I never though I would need Hive. But after hearing some demos of the new wavetable engine I decided to give Hive another try. The scripting turned out being so confusing and unfriendly, the only way I could use it was just copy-pasting formulas and changing the numbers without any comprehension. In the end of the day I was exhausted by switching between Hive, text editor and wikipedia. The periodic noise of a demo version was getting unbearable. I almost gave up. But the sounds were so sweet... you know. So before going to sleep, I distracted my reasonable self with a banana, while my rebellious self committed an impulse buy. Now I have to continue learning, otherwise I will blame myself for spending money on something that I won't use.
I tried but the way I see it I need to create a sin(2*pi*phase*harmonic + x/harmonic) line for each harmonic, and there're 1024 harmonics... I tested up to 100 and it still wasn't saw-ish enoughHoward wrote:BTW did you try more operators in series? I suspect that would get you in the ballpark (will experiment in Bazille).
Anyway, here's an attempt to recreate TUB BELLS patch from DX7's ROM Bank 2. Original sound uses Algorhithm 5, and consists of 3 towers in parallel, the third tower utilizes operator feedback for the slowly growing sustain part. So in uhm I only recreated towers 1 and 2:
"DX TUB BELLS.h2p" goes to Hive.data\UserPresets\Hive\
"DX TUB BELLS.uhm" goes to Hive.data\Wavetables\
You do not have the required permissions to view the files attached to this post.
- KVRist
- 430 posts since 4 Jun, 2018 from The UK
I'm guessing these may be limitations based on doing wavetable FM - but maybe Urs has some suggestions for workarounds. The patch still sounds good though even if it's not 'complete', thanks for sharing!drzhnn wrote: I tried but the way I see it I need to create a sin(2*pi*phase*harmonic + x/harmonic) line for each harmonic, and there're 1024 harmonics... I tested up to 100 and it still wasn't saw-ish enough. Otherwise they work very nice, though I couldn't figure out how to realize fractal ratios - they produce clicks, because phase won't finish at 0 at the end of frame. But integer ratios do well. Also if I understand it right, operator detune can't be done in script.
- KVRist
- 430 posts since 4 Jun, 2018 from The UK
Thanks for sharing the operator feedback technique you came up with Urs! So many possibilities. I've been playing around and have a couple wavetables I'd like to share:
I started experimenting with the phase modulation combined with the feedback and got a e-piano sounding wavetable.
I carried on taking it further, playing with the resonance and got this metallic bass patch of some sort. Couldn't decide whether to share the ABS version or not, so made it MultiTable.
I started experimenting with the phase modulation combined with the feedback and got a e-piano sounding wavetable.
Code: Select all
Info "Ranoka - E Piano-ish. Adjust Auto to control speed of dampening and set Auto Mode to one shot."
NumFrames = 256
Envelope L0=2.2 T1=1 L1=0
Wave "sin( 2*pi*phase + env(table) * lowpass(y, 0.2, 0)^2 )"
Wave "x * 0.25" // dampen amount
Wave "sin( 2*pi*phase + x * (16 - (table * 16)) )"
Code: Select all
Info "Ranoka - Metallic Bass. Set Hives voice to Mono, boost output and add compression if quiet. Set Tables to 2 and adjust Pos morph between sine and square timbre. Set Auto to -1 and Auto Mode to one shot. Better with low notes?"
NumFrames = 256
Envelope L0=2.2 T1=1 L1=0
Wave "sin( 2*pi*phase + x * (10 - (table * 10)) )"
Wave start=0 end=127 "sin( 2*pi*phase + env(table) * lowpass(y, 0.6, 0.5) )"
Wave start=0 end=127 "sin( 2*pi*phase + x * 16 * (1 - table) )"
Wave start=0 end=127 "sin( 2*pi*phase + x * (10 - (table * 10)) )"
Wave start=128 end=255 "sin( 2*pi*phase + env(table) * abs(lowpass(y, 0.6, 0.5)) )"
Wave start=128 end=255 "sin( 2*pi*phase + x * 16 * (1 - table) )"
Wave start=128 end=255 "sin( 2*pi*phase + x * (10 - (table * 10)) )"
-
- KVRian
- 1482 posts since 26 Jun, 2002 from London, UK
This is a fantastic approach to wavetable production and very similar to my own (using Mathematica).
If anyone wants to 'cheat' then there are wavetables available here:
https://charlesdickens.neocities.org/
Urs, if you're not happy with me posting here then please do feel free to delete my post and accept my apologies!
If anyone wants to 'cheat' then there are wavetables available here:
https://charlesdickens.neocities.org/
Urs, if you're not happy with me posting here then please do feel free to delete my post and accept my apologies!
Wavetables for DUNE2/3, Blofeld, IL Harmor, Hive and Serum etc: http://charlesdickens.neocities.org/
£10 for lifetime updates including wavetable editor for Windows.
Music: https://soundcloud.com/markholt
£10 for lifetime updates including wavetable editor for Windows.
Music: https://soundcloud.com/markholt
