Can someone explain what is happening to this waveform in Zebra vs Serum?
-
- KVRist
- Topic Starter
- 32 posts since 1 Aug, 2019
Hi!. I'm trying to make an asymmetrical waveform in Zebra and match the waveform in Serum. Why is the waveform in Zebra being offset but not in Serum? I can't figure this out for the life of me:
Zebra: Serum:
Zebra: Serum:
You do not have the required permissions to view the files attached to this post.
-
- KVRist
- Topic Starter
- 32 posts since 1 Aug, 2019
FYI it looks like DC offset? Does this happen anytime you create a waveform in Zebra?
- KVRAF
- 15331 posts since 8 Mar, 2005 from Utrecht, Holland
DC offset is not audible.
Looks like one balances peak to peak, the other balances energy being equal on both sides of the axis. Both are valid approaches.
Looks like one balances peak to peak, the other balances energy being equal on both sides of the axis. Both are valid approaches.
We are the KVR collective. Resistance is futile. You will be assimilated.
My MusicCalc is served over https!!
My MusicCalc is served over https!!
-
- KVRist
- Topic Starter
- 32 posts since 1 Aug, 2019
Thanks Bert! I also noticed that Serum doesn't cause DC offset but Zebra does when looking at a PWM. I know it's not audbile but doesn't if matter when it comes to distortion and EQs and speakers?
Also, would you mind elaborating your answer? Thanks!
- KVRAF
- 15331 posts since 8 Mar, 2005 from Utrecht, Holland
Distortion: yes.
EQ & speakers: no.
Energy is the circumfence of those triangles. Think of it as peak versus RMS level normalization.
EQ & speakers: no.
Energy is the circumfence of those triangles. Think of it as peak versus RMS level normalization.
We are the KVR collective. Resistance is futile. You will be assimilated.
My MusicCalc is served over https!!
My MusicCalc is served over https!!
- u-he
- 28108 posts since 8 Aug, 2002 from Berlin
Zebra2 oscillators indeed remove DC offset from the waveforms. Asymmetric waveforms then often have a higher peak value in one direction than in the other, but the areas covered above and below the middle line is the same.
-
- KVRist
- Topic Starter
- 32 posts since 1 Aug, 2019
Thank you Urs. So what is Serum doing differently that makes the waveforms appear symmetrical?
- u-he
- 28108 posts since 8 Aug, 2002 from Berlin
To be clear, the Serum waveform in the pictures has a DC offset as it has more energy below the middle line than above. The Zebra2 waveforms has DC offset in the editor, but no DC offset when rendered.
Typically you'd want to have a DC removal at some point in the signal chain. Otherwise DC builds up when playing multiple voices (or when using Osc unison). When DC builds up, you lose headroom in the mix, and I guess whole books have been written about how not-so-good it is.
I decided to DC-filter in Zebra2 on oscillator level because it is possible to create sounds with the oscillator alone. If a synth typically runs through a filter section, one might not need to DC filter on oscillator level because many filter algorithms (and accurately modelled analogue filters) have built-in DC filtering.
Today though I'd probably design the oscillator like Serum's and make DC removal an additional user choice.
Typically you'd want to have a DC removal at some point in the signal chain. Otherwise DC builds up when playing multiple voices (or when using Osc unison). When DC builds up, you lose headroom in the mix, and I guess whole books have been written about how not-so-good it is.
I decided to DC-filter in Zebra2 on oscillator level because it is possible to create sounds with the oscillator alone. If a synth typically runs through a filter section, one might not need to DC filter on oscillator level because many filter algorithms (and accurately modelled analogue filters) have built-in DC filtering.
Today though I'd probably design the oscillator like Serum's and make DC removal an additional user choice.
-
- KVRist
- Topic Starter
- 32 posts since 1 Aug, 2019
Very interesting, thank you for responding. Why would you choose to not remove DC offset like Serum now?Urs wrote: ↑Sun Dec 03, 2023 10:26 am To be clear, the Serum waveform in the pictures has a DC offset as it has more energy below the middle line than above. The Zebra2 waveforms has DC offset in the editor, but no DC offset when rendered.
Typically you'd want to have a DC removal at some point in the signal chain. Otherwise DC builds up when playing multiple voices (or when using Osc unison). When DC builds up, you lose headroom in the mix, and I guess whole books have been written about how not-so-good it is.
I decided to DC-filter in Zebra2 on oscillator level because it is possible to create sounds with the oscillator alone. If a synth typically runs through a filter section, one might not need to DC filter on oscillator level because many filter algorithms (and accurately modelled analogue filters) have built-in DC filtering.
Today though I'd probably design the oscillator like Serum's and make DC removal an additional user choice.
-
- KVRist
- Topic Starter
- 32 posts since 1 Aug, 2019
Also, I just removed the DC offset from the Serum waves and now it looks just like Zebra...that's hilarious because I thought Zebra was the one with DC offset!
- u-he
- 28108 posts since 8 Aug, 2002 from Berlin
I would not necessarily remove DC offset anymore because that aligns more with user expectation. I think this thread is more about that than about the technicality behind it. Serum delivers the expected result, Zebra2's is unexpected.
As I said, in by far most cases it does not matter because somewhere down the path is a DC blocker. However, nowadays people interface with Eurorack and stuff, so they sometimes *want* the pure waveform unfiltered from the oscillator. Hence, I'd offer DC-removal as a choice.
As I said, in by far most cases it does not matter because somewhere down the path is a DC blocker. However, nowadays people interface with Eurorack and stuff, so they sometimes *want* the pure waveform unfiltered from the oscillator. Hence, I'd offer DC-removal as a choice.
-
- KVRist
- Topic Starter
- 32 posts since 1 Aug, 2019
Ah that makes sense, yea. That's why I was so confused why the Zebra waveform wasn't just outputting what I was doing in the editor. I thought I was doing something wrong.Urs wrote: ↑Sun Dec 03, 2023 10:53 am I would not necessarily remove DC offset anymore because that aligns more with user expectation. I think this thread is more about that than about the technicality behind it. Serum delivers the expected result, Zebra2's is unexpected.
As I said, in by far most cases it does not matter because somewhere down the path is a DC blocker. However, nowadays people interface with Eurorack and stuff, so they sometimes *want* the pure waveform unfiltered from the oscillator. Hence, I'd offer DC-removal as a choice.
This may be something you don't want to get into but why does Serum OSC effects (or any really) cause DC offset in the first place? I thought DC offset had to do with amplitude, but even a PWM wave introduces DC offset right? Even thought the positive and negative values are the same...that's what's confusing me.
- u-he
- 28108 posts since 8 Aug, 2002 from Berlin
Well, take an extreme PWM example. Let's draw a super small pulse into a 2048 sample wavetable (which I assume is what Serum does). You'd have 1 sample at +1, and you have 2047 samples at -1. Obviously, the overall energy leans heavily towards -1.
DC offset is the average of the sum of samples in such a wavetable. In this case it is (1 - 2047)/2048, which is almost -1. So this wavetable has a vast DC-offset.
To remove the DC offset, the most simply way is to add its inverse to each sample: Simply add "almost 1" to each sample. So the first sample becomes almost 2 and all other samples are about -0.0005. Now you'd get roughly (2 - 2047 * 0.0005)/2048, and that's a DC of 0.
The peak in this example shifts up a lot, but the DC is gone.
DC offset is the average of the sum of samples in such a wavetable. In this case it is (1 - 2047)/2048, which is almost -1. So this wavetable has a vast DC-offset.
To remove the DC offset, the most simply way is to add its inverse to each sample: Simply add "almost 1" to each sample. So the first sample becomes almost 2 and all other samples are about -0.0005. Now you'd get roughly (2 - 2047 * 0.0005)/2048, and that's a DC of 0.
The peak in this example shifts up a lot, but the DC is gone.
-
- KVRist
- Topic Starter
- 32 posts since 1 Aug, 2019
Super interesting. Thanks.