PreenFM Forum
PreenFM => PreenFM2 => Topic started by: noyzelab on February 21, 2018, 01:00:24 PM

Apologies if this has been discussed already? Have not seen anything about it so thought would post.
It is possible and very simple to do nonlinear waveshaping on the PreenFM2 by setting carrier oscillators to 0Hz, and the selected waveform becomes the nonlinear transfer / shaping function.
Its detailed in section 5.6 in this great little FM programming book by Herbert Janssen =>
http://www.herbertjanssen.de/doc/syprog.pdf
Be sure to check out his main page here =>
http://www.herbertjanssen.de/sy.html
This can be done on any FM synth where the osc's can be set to 0Hz.

Enclosed is a quick example as a sysex file.
This uses ALG1, op1 set to 0Hz. The mod wheel is mapped to IM1, which will give an example of the timbral change. Also try changing both operators waveshape.
To get classic waveshaping, I would suggest making some user text wavetables of Chebyshev polynomials =>
https://en.wikipedia.org/wiki/Chebyshev_polynomials
https://courses.cs.washington.edu/courses/cse490s/11au/lectures/ENonlinearSynthesis.pdf
from the pdf =>
Cheby0 = 1
Cheby1 = x
Cheby2 = 2x^2  1
Cheby3 = 4x^3  3x
Cheby4 = 8x^4  8x^2 + 1
Cheby5 = 16x^5  20x^3 + 5x
...
Also see this paper for all the classic refs =>
A Tutorial on NonLinear Distortion or Waveshaping Synthesis
C. Roads
Computer Music Journal
Vol. 3, No. 2 (Jun., 1979), pp. 2934
can be read online free =>
https://www.jstor.org/stable/3680281?seq=1#page_scan_tab_contents

I made up my own preset with Alg4 using this technique on two operators with LFO’s at differentfrequencies and bias’ and it creates a great pwm effect! Thank you so much!

can you post your preset?

can you post your preset?
It's pseudo PWM so it still sounds somewhat FM but I think it's believable. I'm using ALG4 to enable two "oscillators" with PWM. Turn OP2 to SQUA to here both at the same time. It's currently off so it's easier to here the PWM effect. ENJOY!
Patch in a nutshell
ALGO4
OP1 OP4
 
OP3 OP2
IM1 1.86
IM2 0.00
IM3 1.73
IM4 0.00
Op's
FTyp Keyb for all
OP1 & OP2 = 0.00
OP3 = 1.00
OP4 = 2.00
Matrix
LFO1 2.09 IM1
LFO2 0.67 IM3
LFO1 SIN 0.13 0.00 0.00
LFO2 SIN 0.22 0.00 0.00

Enclosed is a quick example as a sysex file.
This uses ALG1, op1 set to 0Hz. The mod wheel is mapped to IM1, which will give an example of the timbral change. Also try changing both operators waveshape.
To get classic waveshaping, I would suggest making some user text wavetables of Chebyshev polynomials =>
https://en.wikipedia.org/wiki/Chebyshev_polynomials
https://courses.cs.washington.edu/courses/cse490s/11au/lectures/ENonlinearSynthesis.pdf
from the pdf =>
Cheby0 = 1
Cheby1 = x
Cheby2 = 2x^2  1
Cheby3 = 4x^3  3x
Cheby4 = 8x^4  8x^2 + 1
Cheby5 = 16x^5  20x^3 + 5x
...
Also see this paper for all the classic refs =>
A Tutorial on NonLinear Distortion or Waveshaping Synthesis
C. Roads
Computer Music Journal
Vol. 3, No. 2 (Jun., 1979), pp. 2934
can be read online free =>
https://www.jstor.org/stable/3680281?seq=1#page_scan_tab_contents
I found a Puredata patch that calculates Chebyshev Polynomials!
I first tried using the output of the array to quickly get 1024 plot points but it totally failed. >:( The waveform represented in the GUI for the array isn't the same as the output. I did get a really awesome ramp waveform that I'm going to use.
Next, I recorded the each polynomial at 46.87hz to get exactly 1024 samples and the waveforms sound amazing! ;D As you suspected the aliasing is greatly diminished. I'll post user waveform txt files tomorrow. In the meantime poke around the Pd file.
Credit for the Pd file goes to Simon2:
https://forum.pdpatchrepo.info/topic/4083/chebyshevpolynomials
Here's another great explanation of Chebyshev Polynomials just for reference:
http://sites.music.columbia.edu/cmc/MusicAndComputers/chapter4/04_06.php

>>>
I found a Puredata patch that calculates Chebyshev Polynomials!
I first tried using the output of the array to quickly get 1024 plot points but it totally failed. >:( The waveform represented in the GUI for the array isn't the same as the output. I did get a really awesome ramp waveform that I'm going to use.
Next, I recorded the each polynomial at 46.87hz to get exactly 1024 samples and the waveforms sound amazing! ;D As you suspected the aliasing is greatly diminished. I'll post user waveform txt files tomorrow. In the meantime poke around the Pd file.
<<<
Great stuff!
I'm doing a bunch of Chebyshev tables in Mathematica + the ones in Daniel Arfib's paper. Here are some quick tests at 1024 samples => T2 to T13 with graphic plots of the table function. I'll try a few at smaller sizes at some point too. Note that T11 has a big click [which I like of course!] as interpreted by Preen, and I think this is something to do with how the import works. ?? It will be interesting to hear the differences in table sizes too.
EDIT
Refs to Arfib's paper =>
this is a free pdf, but is an early version with lot of handwritten bits =>
https://quod.lib.umich.edu/i/icmc/bbp2372.1978.009/1/digitalsynthesisofcomplexspectra?page=root;size=100;view=text
and an even earlier one here =>
https://quod.lib.umich.edu/i/icmc/bbp2372.1977.001/digitalsynthesisofcomplexspectra?rgn=main;view=fulltext
the full paper ended up in AES, but its behind the dreaded academic paywall =>
http://www.aes.org/elib/browse.cfm?elib=3178
with a slim chance of being able to maybe view online here for free? =>
https://www.researchgate.net/publication/243764314_Digital_Synthesis_of_Complex_Spectra_by_means_of_Multiplication_of_Nonlinear_Distorted_Sine_Waves
+
I just spotted in my little example preset that OP1 is set to keybd, which would also normally be set to fixed for classic waveshaping. Having it track the keyboard will push it more or less away from zero hertz, depending on tuning table.
Which also reminded me that there is a little section on low frequency carriers in Chowning & Bristow, FM Theory and Applications: By Musicians for Musicians p97  102.
EDIT 2
Marc Le Brun's classic AES paper Digital Waveshaping Synthesis is also behind paywall, have not located a readable version of this online => http://www.aes.org/elib/browse.cfm?elib=3212
I've got copies of both Arfib and Le Brun's papers, from photocopies I made in the 90s, but as they are copyrighted I obviously can't scan & upload them..

its probably ok to post this little photo snippet from Le Brun's AES paper =>

I noticed the clicking in my own tests when using the plot points of array in puredata. I come up with an entirely different waveset when I create tables based on audio snippets recorded from the output of puredata which seem to be more accurate for waveshaping purposes. I'll post my waveforms with jpegs below. I'll give your waveshapes a try as well :)
I also modified the puredata patch to include an oscilloscope and a more accurate way to input pitch, amplitude, and the amplitude of each polynomial. Enjoy :)

I'm doing a bunch of Chebyshev tables in Mathematica + the ones in Daniel Arfib's paper. Here are some quick tests at 1024 samples => T2 to T13 with graphic plots of the table function. I'll try a few at smaller sizes at some point too. Note that T11 has a big click [which I like of course!] as interpreted by Preen, and I think this is something to do with how the import works. ?? It will be interesting to hear the differences in table sizes too.
&
I just spotted in my little example preset that OP1 is set to keybd, which would also normally be set to fixed for classic waveshaping. Having it track the keyboard will push it more or less away from zero hertz, depending on tuning table.
I tried out your waveforms! It's interesting to hear the different results. Your's are more buzzy which makes me think the amplitude of your output is maybe too high? Mine was set just below the maximum threshold around 90% and as a result my waveforms are less buzzy. Either way this is all really great stuff!
I'll mess around with that fixed/keybd on OP1. Should be interesting.
Also as a note waveform Tx5 in my zip file has an incorrect header at the top of the text file. Forgot to add:
Tx5
1024
0