[sdiy] Linear offset movies, was: Observations of synthesized stretched-harmonic waveforms and subjective comments on their musical qualities

cheater cheater cheater00 at gmail.com
Fri Apr 9 17:02:28 CEST 2010


BTW - before someone asks - there is no audible difference at all
whether f_o is 0 or +1.

Cheers
D.

On Fri, Apr 9, 2010 at 14:38, cheater cheater <cheater00 at gmail.com> wrote:
> Hi guys,
> I have made some video recordings of how the setting 'f_o' works.
>
> http://dl.dropbox.com/u/5958997/rotation.rar
>
> By the end of the first animation the function is a bit rippled, those
> ripples are only created by errors in the model. It should in fact
> look smooth like in the beginning.
>
> In the 2nd movie, at the beginning I raise and then lower the offset
> frequency of the partials (f_o), and then set it to 0. On 0:32 I reset
> the resynthesis model (this is irrelevant to the effect, but it
> explains why the waveform suddenly changes). Later I set f_o to +1 Hz
> and 0 Hz, alternating the setting.
>
> In the 3rd and 4th animations I alternate f_o between +1 Hz and 0 Hz.
>
> Cheers,
> D.
>
> On Thu, Apr 8, 2010 at 04:45, cheater cheater <cheater00 at gmail.com> wrote:
>> 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