[sdiy] Observations of synthesized stretched-harmonic waveforms and subjective comments on their musical qualities

cheater cheater cheater00 at gmail.com
Thu Apr 8 04:45:16 CEST 2010


Hi guys,
I've done some experiments with additive synthesis lately to check out
what stretched harmonic waveforms could sound like. I haven't seen
much about that on the internet and thought I would share my comments,
also benefiting myself from being able to organize my thoughts here.
First I explain the oscillator and how it works, then I talk about how
the parameters work when they're set to constant values, then what
happens when they're being modulated at a slow rate, and then finally
I mention what happens when the parameters are set to constants with a
second oscillator present at the same pitch and similar parameters. I
have not been able to make any tests of how these parameters behave
when modulated at audio rate. My computer is not fast enough and I am
expecting a huge increase in computational power consumption for a
full-blown model that works with audio-rate control, perhaps beyond
current-day desktop computer power, but who knows.

I've made a model which has a bank of 15 free-running sinewave
oscillators with these properties:

- assign to every partial (15 in total) the frequency f_n = f_B +
f_B*(n^p*l) + f_o

where:
n is the partial number counted from 0 (the partial at base
frequency). The for a 440 Hz note the 0th partial will 'typically'
have the frequency 440 Hz, the 1st partial will be the octave at 880
Hz, the 2nd partial will be at 1320 Hz, and so on. In fact the 0th
partial is mostly useless in many of the situations.
f_B is the base frequency ('note frequency')
p is the 'polynomial stretch', a parameter (not really sure of this name)
l is the 'linear stretch', a parameter
f_o is the 'linear offset frequency', a parameter

- assign to the nth partial the level of (n+1)^w where w is the
'partial weighting' and is a floating-point number. For example
triangle and square waves will be using w = 2, the saw wave will be
using a weighting parameter of 1. I did this because without this the
weighting parameter is 0 and it's not similar to any normal synth
waves, I needed some reference to previous experience.

- group the even (0, 2, ...) and odd (1, 3, ...) partials and freely
mix between the two groups (to make square/triangle waves). In fact
the triangle would be missing the base partial, but that doesn't
matter much. Note that here even and odd partials are swapped in
relation to 'normal' uses of these terms.

- sum the levels of all partials and normalize the mixed output to
make it easier to compare waves of different weightings

A bare oscillator on its own doesn't sound *very* special at all when
you're not animating any of the parameters, until you start going far
with the stretching parameters so that the partials start interacting
with each other. I bet it would sound great if there were any
non-linearities present, but I didn't model that - that would be the
benefit of using analog, which would be cool for this.

The following is for w = 1, all other parameters set to 'normal':

The parameter 'p' just on its own set to something small like 1.005
manages for some light beating in the higher partials. That's a very
light effect. The further you go with that parameter, the faster the
beating gets. The setting 1.5 is already extreme and limits a 500 Hz
waveform to 12 partials. The waveform is fairly acyclic when 'p' is in
use and it would probably be very pronounced with some clipping, but
without it it's very discrete - in fact other than the slight beating
or 'wobbliness' to the sound it sounds just like the input wave, but
any sort of processing (such as using this as an FM modulator) will
probably let it come out very pronounced.

Using positive 'p' less than 1 will make the partials beat much more
since they will become closer, rather than further apart, starting to
group up around the 1st partial. This goes on until p=0.5 which sounds
like AM with a fairly fast LFO, after that at p=0.35 there's a
'gurgling' quality to the sound (maybe like a chorus/ensemble at a
very fast setting) and at 0.17 the sound is similar to bandpassed
noise.

A negative 'p' will at first sound like long-tail reverb (p = -1) but
soon the partials degenerate to components around the 0th partial's
frequency. The 0th partial in itself is not computable and does not
exist in the model because the formula includes n^p which evaluates to
division by 0.

It is interesting that waves with the same weighting w but different p
seem to sound more similar than partials with the same p but different
w. This is however limited in credibility by the fact that the amount
of partials is limited to 15, which is not a whole lot. For
comprehensive full-band testing of this you'd need hundreds of
partials.

When increasing 'l' above 1 similar beating effects happen as with
'p', except this time all the partials stretch around the 0th not the
1st partial. This might conclude that my formula for 'polynomial
stretch' needs some sort of revising to make it stretch around the 0th
partial as well.

When decreasing 'l' below 1 the sound is similar to simple pitch
bending. Then when the partials get very close together, the sound
works quite differently from 'p' around positive numbers less than 1.
Starting with l=0, the sound is just a single sine wave (sum of all
partials being at f_B). Then as it is increased this sinewave gets a
bit of a 'bandpassed noise' quality and then starts beating in some
weird (but perfectly cyclic) pattern. This weird pattern is probably
due to the different phases of the partials and/or lack of numeric
precision, but oddly enough for the same 'l' the pattern is always the
same. This goes on to l = 0.005 after which time the beating is very
fast and starts soundling like sinewave AM. Then the higher l goes the
faster this 'AM' effect is, it gets into audio rate, and goes on. It's
interesting to hear the 'AM' effect get faster and faster and convert
a sinewave to something like, say, a triangle wave, without
transitions.

When decreasing 'l' below 0 something yet different happens.  At first
there's this 'AM style' effect as above (for 'l' just above 0), but
it's different than what happens for 'p' just below 0, which sounds
more like a quickly-modulated 'chorus' or 'ensemble' effect, whereas
'l' just sounds much more like amplitude-modulation or maybe FM; but
when the beating gets to audio rate, it starts sounding like frequency
mirroring or aliasing. And this is understandable because the partials
do take on patterns that happen when you have a wave that you start
pitching up in a digital system and it starts aliasing, mirroring the
partials and making the well-known techno sound. This effect is better
audible at higher frequencies because then the partials have more
space before they reach 0 Hz, and it's also important to band-limit
the system clamping the frequencies to 0 Hz because otherwise the
partials will start assuming negative frequencies and therefore alias,
obscuring the area in the frequency domain in which the interesting
effect happens.

The parameters 'p' and 'l' have an effect on the waveform that can be
described thus: depending on whether they are above or below 1, the
waveform has a main 'shape' described by the fundamental and the
higher partials are seen as 'ripples' that skid over that shape like
little ripples on water. The stronger the stretch, the faster the
'ripple skid'. This effect can be explained by the fact that if the
oscilloscope is tuned to the note frequency, then the partials are not
at an integer multiple of the note frequency and will either be of
higher frequency (and skid to the right) or of lower frequency (and
skid to the left). Thanks to this effect you can notice the single
partials on waveform display without having a frequency analyzer and
can learn about the terms of the 'harmonic' series (such as partial
weighting w here). I wonder if this effect has been described anywhere
before? I also wonder if it would be possible to somehow measure the
terms of the series (measure the amplitudes of the partials) by
measuring the wave in the time domain.

The parameter 'f_o' seems to have little effect on the sound on its
own. It just sounds like pitch bend. What is *very* interesting is the
effect it has on the time-domain waveform display. It does not have
the 'ripple effect', the wave (mostly) is stationary, but in a weird
way.. Imagine that the waveform as you see it on the oscilloscope is
not drawn on a flat strip of, say, paper, but is instead drawn on a
glass cylinder (its axis of symmetry is the x-axis, of course); the
nearer the point on the graph is to 0, the closer to the axis of
rotation it is (generally *) on the cylinder. Then as you start
increasing the 'f_o' parameter, the 'cylinder' starts rotating around
the x-axis. The higher 'f_o' is, the quicker the cylinder rotates.
Analogously for f_o<0 the cylinder starts rotating faster and faster
but in the other direction. It's a fairly crazy effect and you have to
see it. I wonder if it has been described somewhere? To save on
confusion I define that when f_o>0 then the part of the cylinder
closer to the viewer is rotating down, while the part further from the
viewer is rotating up; mathematically speaking, the cylinder is
rotating in the positive direction around the time axis on the graph,
according to the right-hand screw rule; although it could be defined
the other way, it's just up to our imagination, I'll define it this
way :-) I believe the location of the dots on the cylinder (the angle
around the 'cylinder') depends on the phases of the partials, but I
can't tell for sure, because they are not (right now) adjustable in my
model and it would take a lot of reworking to get that done. Of course
other than this rotation, you'd the waveform starts sliding to the
left slightly for f_o<0 and to the right slightly for f_o>0 - but
surprisingly it doesn't! What's furthermore, it seems that the waves
have a hidden 'z' component which puts the point on the graph of the
wave somewhere on the cylinder above or below the plane of the graph
(so closer or further from the viewer); this can be seen when the
cylinder starts 'spinning' but the zero crossings don't stay in a
single spot. Another effect is that with f_o rising in magnitude, the
cylinder seems to twist up, which is quite interesting in its own
right.

It is notable that when using the 'p', 'l' and 'f_o' parameters,
sometimes the frequencies of the partials will approximate the
frequencies of partias for the square or triangle wave, therefore
becoming a bit square-ish or triangle-ish in sound. Then when going
further with the modulation of those parameters, the waves will lose
that quality and become something different.

The weighting parameter 'w' is a bit like a high shelving/low shelving
filter. A negative w will be like a (non-resonant) high pass filter
changing its steepness rather than frequency the lower w goes, a
positive w will be like a low pass filter becoming sharper when w
increases.

The odd/even frequency mix has the obvious effect of making the wave
more square-ish or more triangle-ish or more saw-ish, but this only
happens without stretch, as with stretch the waves work completely
differently anyways.

When you do start animating the frequency parameters, the 'p' and 'l'
and 'f_o' parameters sound quite a bit like FM, but less 'crazy'. This
is not surprising since many of the sounds are in fact available from
ring modulation, if you heterodyne a wave up and then back down in
order to frequency-shift it - and ring modulation doesn't sound that
different from FM. Frequency shifting can emulate the parameters 'l'
and 'f_o'. I don't know of any typical process which could emulate the
'p' parameter - any ideas?

When animating the 'w' parameter, the waveform goes from mellow to
bright, as expected.

I have not been able to steer any of these parameters with audio-rate
modulation, maybe if I can figure out how to render stuff from max/msp
in offline mode.

The interesting stuff starts happening when you introduce a second
oscillator to the mix:
- the parameter 'f_o' works like linear FM, but every partial is
offset by the same amount, so all the partials beat at the same speed.
This sounds pretty cool especially if the phases of the partials are
not in perfect sync (because of previous manipulations to the
oscillators) and they zero-out at different moments but still in the
same distances (periods) of time. So having an oscillator at 500 Hz
and one at 502 Hz will make them beat at 2 Hz giving it the
'glistening' effect animating the higher frequencies. In contrast,
having two oscillators at 500 Hz with one at f_o = 0 and the other at
f_o = 2, the oscillator partials will beat at 2 Hz, but there will be
none of that animation, it will be much more plain (which is just an
interesting, different situation); it sounds much more like a slow AM
at 2 Hz; in fact, I wonder if it can be mathematically proven to be
the same. Finally, with one oscillator at 500 Hz and f_o = 0 and
another at 502 Hz and f_o = -2, the oscillators will have that nice
animation as a 500 and 502 Hz oscillator pair with no 'f_o' applied,
but they will not beat - the waveform level will stay mostly the same.
- a little amount of the parameter 'p' together with a little 'l'
allows you to control which partials are how inharmonic, making them
beat faster or slower against a fully harmonic series, for example to
just have effect on the highest partials.

And a little video:

http://dl.dropbox.com/u/5958997/oscillator.rar

for one thing I haven't seen something like this before, in FM or not.

You see me playing around with the harmonic stretch parameters (makes
the wave wobble faster or slower) and the weighting (changes to a
bassy wave and finally to a sinewave, and then back to the bassy wave
and then a very treble wave). I'm also playing around with the
stretching parameters. Finally I change the pitch of the wave as well
and show how the parameters work on it.

Unfortunately no audio as I don't know how to make the recording
software pick up max/msp - any ideas? I've used CamStudio, which is
free and good, but doesn't seem to be picking up the sound from
max/msp, I probably need to change some settings. I'm using max/msp
4.5. Any idea how to make this work properly?

Cheers
D.



More information about the Synth-diy mailing list