Feedback FM

Esteban Xbender's icon

Hello everyone. I'm reading Curtis Road's the computer music tutorial and in the Feedback Frequency Modulation part of the book I saw the figures below. I guess I made first one but I got confused while doing the second and third. Can someone solve this tables in Max/Msp patch and share?

Jean-Francois Charles's icon

Esteban, examples #2 and #3 use the same techniques as #1. Why don't you Copy-Compress what you have for patch #1 and paste here? That could be a good conversation starter.

Graham Wakefield's icon

For feedback FM you'll probably want the feedback loops to be single-sample delay, which means you probably want to use gen~ and [history] objects in the feedback paths.

Notice that the diagram caption describes "x" as a "phase increment" for a "sine lookup table".

A sine lookup table in gen~ is [cycle @index phase] (indexed as unipolar phase from 0 to 1), or you can compute it directly using [sin] (indexed in radians from 0 to twopi).

Using "phase increment" also means your frequency parameters are not in Hz, but in phase change per sample. You can convert Hz to unipolar phase for [cycle @index phase] using [/ samplerate] or to radians for [sin] using [* twopi/samplerate].

There's more subtleties to feedback FM (and feedback Phase Modulation). I highly recommend adding some kind of filter in the feedback path -- even the Yamaha DX algorithms used a very crude averaging FIR filter on feedback paths, but things can get a lot more fun and controllable with better filters.

(PS. Honest plug: There's a whole chapter about FM/PM etc. including several feedback variants in this book: https://cycling74.com/books/go) :-)

Esteban Xbender's icon

thank you for all answers. what about bulding feedback fm without gen~ and least feedback time using send~/receive~ pair?
I added patch below that it explaine what I want to explaine. If I made wrong, building all three type of feedback FM it will worth for me and for who want to learn with easiest way.

Max Patch
Copy patch and select New From Clipboard in Max.

Jean-Francois Charles's icon

Using a send~ / receive~ pair as in your patch introduces a signal vector of latency. The sonic result will depend on your Signal Vector Size (and options depend on your audio interface).
[gen~] and the [history] object allow you a single sample of "latency" in the feedback loop.

Esteban Xbender's icon

Thank you so much Jean-Francois and Graham. When I do I will share it here.