[.uhm] FM Synthesis in Hive

Official support for: u-he.com
Post Reply New Topic
RELATED
PRODUCTS

Post

surreal wrote:
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.
Urs thank you very much for all the time you but into these tutorials. .

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!! :tu:
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...

Post

AnX wrote:i thought it was Digital X (cross) mod :shrug:
Sounds legit, too

Post

Urs wrote:
AnX wrote:i thought it was Digital X (cross) mod :shrug:
Sounds legit, too
Thanks Urs will we be able to make the Lazerharp sound in hive by wavetable scripting? :help:

Post

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

Post

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.

Post

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.
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...

Post

Urs wrote:You need to average the last two y samples...
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:

Image

Post

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.

Post

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.
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...

BTW did you try more operators in series? I suspect that would get you in the ballpark (will experiment in Bazille).

Post

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.

Code: Select all

y[ t ] = sin( 2*pi*phase + feedback * 0.5 * ( y[ t-1 ] + y[ t-2 ] ) );
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" :hihi: ). 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:

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) )"
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:

Code: Select all

Wave "sin( 2*pi*phase + env(table) * lowpass(y,0.94,0)^2 )"
That works nicely too, but this next one works even better:

Code: Select all

Wave "sin( 2*pi*phase + env(table) * abs(lowpass(y,0.94,0)) )"
There you go. FM feedback playground has just opened!

- U

Post

Btw. there's also a completely different approach to FM feedback, which is related to the methods used in the Karplus-Strong thread.

Code: Select all

NumFrames=256
Wave "sin( 2*pi*phase + table * 1.4 * lowpass( main_fi(frame-1, index),0.9,0) )"
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?

Post

Howard wrote:
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.
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...
I hear you Howard! I guess we all have to just embrace the suck and practice until it clicks.

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.
Howard wrote:BTW did you try more operators in series? I suspect that would get you in the ballpark (will experiment in Bazille).
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.

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.zip
"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.

Post

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.
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!

Post

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.

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)) )"
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.

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)) )"

Post

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!
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

Post Reply

Return to “u-he”