yeah seems like the crazy 2MHz sampling rate of cyclonix is consistent with the sytrus softsynth (up to 64x oversampling).

So 16x is hardly overkill - might not even cut it… That’s nuts!

A link for sytrus that @rick_monster mentioned above. Windows only, alas.

A couple softsynths with capable FM implementations that are Mac compatible are NI’s FM8 and Arturia’s Synclavier V.

But I bet there’s some fantastic stuff in the Max and Pd worlds… (well, there certainly is, I just don’t have the links at my fingertips right this minute)

1 Like

I dunno. I have absolutely no backup for this statement, but my mathematical spidey-sense says that each modulator would require a doubling of the sample rate to avoid aliasing. Thus using all 6 operators stacked is 64x oversampling (2^6).

4 Likes

definitely true for A.M! cos (w t) * cos (w t) = 1/2 + cos(2w t).

So what’s the expansion of cos(w t + pi cos(w t)) ? time to crack out the fft - here be dragons when it comes to working through the math I think!

4 Likes

well halfway between:

&

one could try a semi-brute-force approach!

So how about a more manageable 8x oversampling throughout the algorithm, with 22kHz iir filters inserted to every modulation point? Obviously won’t have the ‘organic’ quality of analogue, but I feel like this would solve most of the aliasing problem without fully descending down said rabbit hole.

1 Like

yeah but a doubling isn’t enough. (it would be for AM.) each modulation point adds equally spaced sidebands at multiples of the modulation index (sorry, frequency), out to infinity i think. (negative-frequency sidebands are reflected though 0, which gives you the “chorusing” effects.) the amplitudes of the sidebands is a bessel function of the first kind, with mod index as argument.

sorry its just a google away, but this looks like a good walkthrough of the math using snd (and lisp!)
https://ccrma.stanford.edu/software/snd/snd/fm.html
its a good companion to the chowning paper. which i dunno has actually been linked yet in this thread but here it is:
(https://people.ece.cornell.edu/land/courses/ece4760/Math/GCC644/FM_synth/Chowning.pdf)

but! what gets really hard to handle is when the modulator is more complex than a sine wave. chowning doesn’t go there. i think you can just repeat the process for each component and sum the spectra? not sure right now.


(i feel like there’s some kind of version of godwin’s law for audio DSP, where bessel == hitler. like, as soon as we bring up bessel functions this thread is gettin locked)


just looking through that bill schottstaedt writeup again thought i’d excerpt some relevant bits (forgot that he is also very funny)

As the index sweeps upward, energy is swept gradually outward into higher order side bands; this is the originally exciting, now extremely annoying “FM sweep”. The important thing to get from these Bessel functions is that the higher the index, the more dispersed the spectral energy — normally a brighter sound.

There is a rule of thumb, Mr Carson’s rule, about the overall bandwidth of the resultant spectrum (it follows from our description of the Bessel functions): Roughly speaking, there are fm-index+1 significant sidebands on each side of the carrier, so our total bandwidth is more or less

2 * modulator-frequency * (fm-index + 1)

This is a good approximation — 99% of the signal power is within its limits. To turn that around, we can reduce the danger of aliasing by limiting the FM index to approximately (srate/2 - carrier_frequency) / modulator_frequency; use srate/4 to be safer. (Mr Carson’s opinion of FM: “this method of modulation inherently distorts without any compensating advantages whatsoever”).

10 Likes

This thread is simply amazing, and gave me an idea for Teletype : a new “HZ” table that would allow CV out to refer to a “relative” frequency based on the 1v/Oct standard.
Or, the ability to have fractional/floating point values for the N table ? (not sure how/if it could work).
Anyway, the goal is to easily produce frequencies that share some fractional proportion.

Or is there another way ? the EXP table lookup ?

3 Likes

the discussion in here has lead me into some pretty new (to me) sonic territory!

This is a first attempt at over-sampled bandlimited FM on the aleph’s blackfin DSP. 4 ops, moderately capable modulation matrix, 4x oversampling, 1st order lowpass @ 10kHz on each modulator, 16 bit processing, sine/triangle/saw waves & various little optimisations/hacks.

In the study above I run a semi-repetitive kria arpeggio pattern and gradually increase the overall note length from shortest to longest. No live tweaking of the FM settings but it’s a patch with some slow attack/decay settings & circular feedback loops across 3 oscillators. feedback between modulators is a lot more entertaining than in the original design.

It’s possible there are still some bugs in the DSP code but I will post a version of the module itself soon!

9 Likes

There is an interesting article by Barry Traux called “Organizational Techniques for c:m ratios in Frequency Modulation” in the book Foundations of Computer Music. Like most of those maths heavy academic articles I found it kinda hard to follow.

He groups c:m ratios that share a number of partials. You can cross-fade oscillator pairs with “similiar” ratios and, due to the common partials, the result sounds like a timbre sweep rather than fading between two distinct sounds. This gives another timbral parameter to an FM synth, other than changing the modulation index. Pretty easy to play around with the idea on most FM synths.

7 Likes

this whole thread is inspiring
+
your new fm module seems fantastic!

Too bad there doesn’t seem to be an electronic edition of this book.

1 Like

yea, i hadn’t heard of this book before and looks like a great collection, unfortunately $72 and “unavailable” on MITsite

there seem to be a lot of $6 and $10 copies from library stores on amazon though

1 Like

It is a great book if you are interested in the history of computer music. “The Music Machine” is another good one put together by Roads a few years later.

Barry Traux has most of information from his article on his web page…
https://www.sfu.ca/~truax/fmtut.html

1 Like

oh - i knew that seemed familiar - it is also in “handbook for acoustic ecology”

1 Like

He talks about it more, from a compositional perspective, in “Timbral Construction in “Arras” as a Stochastic Process” in the Music Machine book. Kind of an expansion on this… https://www.sfu.ca/~truax/arras.html

3 Likes

John Chowning & David Bristow¨: Fm Theory and Applications By Musicians for Musicians
published by Yamaha Music Foundation
Chowning explains FM theory in the context of the DX7 synthesizer
http://www.burnkit2600.com/manuals/fm_theory_and_applications.pdf

Computer Music Journal Volume 31, Issue 3 is dedicated to The Reconstruction of Stria.
Stria was composed in 1977 by John Chowning
there is online avalable the article:
Matteo Meneghini: An Analysis of the Compositional Techniques in John Chowning’s Stria
http://www.mitpressjournals.org/doi/pdf/10.1162/comj.2007.31.3.26

2 Likes

you can find it here
http://camil.music.illinois.edu/Classes/404A2/2/truax.pdf

6 Likes

@vals @widdly That article is fantastic! I had never thought about using the c:m ratio in the ways Truax described. Highly recommended and thanks for the link.

Some more discussion of Traux’s idea here, including some code for generating the groups of c:m ratios…

Also some great youtube links to FM tracks including Chownings Stria discussed in the papers vals linked.

2 Likes

I’ve got some good news for the Supercollider Synthdef-heads out there. I came up with this super-exact clone of DX7 in SC environment. After all these newbie syntax questions, I thought its time for me to give something back to the community. This project started with my internship at the STEIM during last year, I was able to get my hands on an original DX7 synth and eventually found out that this instrument has this mystic / marvelous sound. So I started fiddling with it and made some experiments with Supercollider. After a while, it became an obsession to play with it and started to copy parts of its synth mechanism just to flex my DSP muscles. Sooner, I found myself in this huge project to clone the entire thing. After 2-3 months of implementing process and lots of sleepless nights. I was able to clone the entire DX7 engine with very high accurate results. Other than the DX7’s vintage sound hiss, it is hard to distinguish between the clone and the original one on the same presets. For my own use, I collected some 16384 (2^14) DX7 sysex bank presets from the internet and converted it to some integer sequences to read it from Supercollider. I am also combining this clone with this 16384 preset package. Currently, I am using it with my sequencers to modulate its parameters but for everyone’s ease of use, I implemented a very basic function call. Which calls notes with this format: [Midi note, velocity, preset number]. Additional documentation is in the file. It is very easy to run but one requirement is to put my own collected DX7 presets files in the same directory as the DX7.scd patch and the other requirement is to have SC3plugins because I implemented it with FM7.ar Ugen. For the current version, it is not possible to put your own DX7 patches or modulate its parameters (I will add them in the future). But I think this synth has enough interesting presets and sounds to find some use in the different projects.
You can download the zip of DX7.scd and preset file from this link: egegonul.com/dx7.zip or from my github repo: https://github.com/everythingwillbetakenaway/DX7-Supercollider. I also added it to sccode.org. Have fun!

dx7.zip (990.3 KB)

29 Likes