feedback fm

Nov 12, 2007 at 12:20am

feedback fm

Hello all,

I’ve been trying to create a one-oscillator feedback FM patch based on the Roads book, but obviously I’m missing something. I scoured the Internet, and haven’t found any clearer explanation either.

Any suggestions? A patch is below, it produces something, but I’m sure it’s not what’s intended! Thanks, Inouk

#N vpreset 1;
#X append 1 2 7 125 242 flonum float 1.5 ; 14 352 251 flonum float 0.16 ; 15 100 151 flonum float 489. ;;
#P preset 80 111 47 27;
#P window setfont “Sans Serif” 9.;
#P window linecount 1;
#P newex 205 99 72 9109513 receive~ phase;
#P newex 277 322 61 9109513 send~ phase;
#P newex 215 295 72 9109513 cartopol~;
#P newex 215 266 89 9109513 fft~ 1024 1024 0;
#P flonum 151 100 45 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 251 352 35 9 0 0 0 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 188 376 40 9109513 *~ 0.5;
#P message 251 383 68 9109513 startwindow;
#P user ezdac~ 188 412 232 445 0;
#P newex 151 125 31 9109513 sig~;
#P newex 188 189 27 9109513 +~;
#P newex 205 160 27 9109513 *~;
#P flonum 242 125 35 9 0. 0 1 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 188 233 38 9109513 cycle~;
#P comment 105 79 93 9109513 x = phase increment;
#P window linecount 2;
#P comment 280 124 95 9109513 beta = mod index / feedback factor;
#P window linecount 1;
#P comment 292 297 36 9109513 sin (y);
#P comment 199 214 42 9109513 y (freq);
#P comment 236 160 66 9109513 beta * sin(y);
#P window linecount 2;
#P comment 206 45 136 9109513 yamaha: feedback factor beta <1.5;
#P connect 17 1 18 0;
#P fasten 16 1 17 1 259 290 282 290;
#P connect 13 0 11 0;
#P fasten 13 0 11 1 193 403 227 403;
#P fasten 7 0 8 1 247 150 227 150;
#P fasten 14 0 13 1 256 371 223 371;
#P connect 16 0 17 0;
#P connect 6 0 13 0;
#P fasten 6 0 16 0 193 259 220 259;
#P connect 8 0 9 1;
#P connect 19 0 8 0;
#P fasten 12 0 11 0 256 406 193 406;
#P connect 9 0 6 0;
#P fasten 10 0 9 0 156 169 193 169;
#P connect 15 0 10 0;
#P window clipboard copycount 21;

#34563
Nov 12, 2007 at 6:07am

On Nov 11, 2007, at 4:20 PM, Inouk Demers wrote:

>
> Hello all,
>
> I’ve been trying to create a one-oscillator feedback FM patch based
> on the Roads book, but obviously I’m missing something. I scoured
> the Internet, and haven’t found any clearer explanation either.

One thing to bear in mind is that, in the digital domain, there is no
feedback without at least some latency, and this latency is going to
put strange effects into the phase relationship of the feedback FM
that are totally different to the analogue domain.

In your patch, there are two points of latency – one is the send~/
receive~ that will in this case introduce one vector size of latency,
and the other is the fft~ which will incur your fft size of latency,
in samples. If your vector size is e.g. 128 then there’s 1152
samples total, which corresponds to 26ms. That means a 360 phase
delay at 38Hz, double that delay at each octave above.

Not sure what sonic effect this will have though.

An option to get around this (or minimize the delay at least) is to
run the feedback fm inside a poly~ with vectorsize set to 2, and
reading your phase directly from a driving phasor~ rather than using
fft.

#116890
Nov 12, 2007 at 8:37am

> I’ve been trying to create a one-oscillator feedback FM patch based on the Roads book, but obviously I’m missing something. I scoured the Internet, and haven’t found any clearer explanation either.

Does roads actually suggest to phase information of an fft and use that in the signal domain? Since you name yamaha, I think that model below comes close to what the dx7 does. Also I think that vector delay is not a problem at all for this application.

_
johan

#P window setfont “Sans Serif” 9.;
#P window linecount 1;
#P newex 237 165 29 196617 t b f;
#P flonum 237 147 41 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 233 189 27 196617 + 7.;
#P newex 255 261 27 196617 *~;
#P newex 291 227 30 196617 !- 1.;
#P newex 232 213 31 196617 mtof;
#P newex 233 236 40 196617 cycle~;
#P user ezdac~ 235 450 279 483 0;
#P newex 250 411 41 196617 *~ 0.2;
#P number 189 116 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 176 189 31 196617 mtof;
#P flonum 290 147 35 9 0. 1. 3 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 344 222 27 196617 *~;
#P newex 299 353 48 196617 send~ fb;
#P newex 344 193 62 196617 receive~ fb;
#P newex 176 213 46 196617 phasor~;
#P newex 228 310 40 196617 cycle~;
#P comment 332 149 100 196617 feedback;
#P comment 226 119 100 196617 pitch;
#P connect 10 0 11 0;
#P connect 10 0 11 1;
#P connect 2 0 10 0;
#P connect 2 0 5 0;
#P connect 17 0 18 0;
#P connect 18 0 16 0;
#P connect 18 1 16 1;
#P connect 9 0 8 0;
#P connect 9 0 16 0;
#P connect 16 0 13 0;
#P connect 8 0 3 0;
#P connect 13 0 12 0;
#P connect 7 0 14 0;
#P connect 7 0 6 1;
#P connect 6 0 2 1;
#P connect 14 0 15 1;
#P connect 15 0 2 1;
#P connect 12 0 15 0;
#P connect 4 0 6 0;
#P connect 3 0 2 1;
#P window clipboard copycount 19;

#116891
Nov 12, 2007 at 3:01pm

Here’s another effort. I don’t have the Roads book in front of me, so I can’t be sure this is what he specifies. I would bet $$ this is a simplified version of a patch previously posted to the list.

#P window setfont “Sans Serif” 9.;
#P flonum 38 29 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P flonum 89 301 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P window linecount 1;
#P newex 66 325 34 196617 *~ 0.;
#P newex 66 355 78 196617 send~ feedback;
#P newex 38 48 49 196617 sig~ 440;
#P newex 38 224 37 196617 +~;
#P newex 65 190 34 196617 *~ 0.;
#P newex 238 115 35 196617 sig~ 0;
#P newex 153 146 34 196617 *~ 0.;
#P flonum 238 93 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 65 121 92 196617 receive~ feedback;
#P user gain~ 38 406 24 100 158 0 1.071519 7.94321 10.;
#P user ezdac~ 38 549 82 582 0;
#P newex 38 253 60 196617 cycle~ 440;
#P window setfont “Sans Serif” 12.;
#P comment 274 93 125 196620 Modulation Index;
#P window setfont “Sans Serif” 9.;
#P comment 129 301 100 196617 Feedback Amount;
#P comment 80 29 67 196617 Carrier Freq;
#P connect 5 0 4 0;
#P connect 5 0 4 1;
#P connect 3 0 5 0;
#P connect 3 0 14 0;
#P connect 12 0 11 0;
#P fasten 12 0 8 0 43 80 158 80;
#P connect 16 0 12 0;
#P connect 6 0 10 0;
#P connect 14 0 13 0;
#P connect 11 0 3 0;
#P connect 15 0 14 1;
#P connect 7 0 9 0;
#P fasten 9 0 8 1 243 138 182 138;
#P fasten 8 0 10 1 158 174 94 174;
#P connect 10 0 11 1;
#P window clipboard copycount 17;

#116892
Nov 12, 2007 at 9:50pm

Why?

Try running your patch with pitch at, say, 20, and offset at say 0.2,
feedback at 0.25.

Now change the vector size and hear the differences.

They sound kind of cool… but since the vector delay has such a
strong impact on the sound, I think it should be incorporated as a
parameter itself; e.g. place a comb~ or tapin~ tapout~ in the
feedback loop.

Try this:

max v2;
#N vpatcher 100 100 792 716;
#P window setfont “Sans Serif” 9.;
#P window linecount 1;
#P newex 290 90 75 196617 loadmess 0.25;
#P newex 189 92 66 196617 loadmess 20;
#P window linecount 3;
#P comment 523 155 100 196617 note that the vector size implies a
minimum delay;
#P flonum 440 135 48 9 0. 0 1 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P window linecount 1;
#P comment 491 136 100 196617 delay;
#P newex 440 163 63 196617 pack 0. 100;
#P newex 440 186 50 196617 line~ 10.;
#P newex 338 227 59 196617 tapout~ 10;
#P newex 338 363 65 196617 tapin~ 1000;
#P newex 237 165 29 196617 t b f;
#P flonum 237 147 41 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 237 187 34 196617 + 0.5;
#P newex 255 261 27 196617 *~;
#P newex 291 227 30 196617 !- 1.;
#P newex 232 213 31 196617 mtof;
#P newex 233 236 40 196617 cycle~;
#P user ezdac~ 235 450 279 483 0;
#P newex 250 411 41 196617 *~ 0.2;
#P number 189 116 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 176 189 31 196617 mtof;
#P flonum 290 147 35 9 0. 1. 3 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 338 254 27 196617 *~;
#P newex 176 213 46 196617 phasor~;
#P newex 228 310 40 196617 cycle~;
#P comment 332 149 100 196617 feedback;
#P comment 226 119 100 196617 pitch;
#P connect 7 0 6 0;
#P connect 6 0 3 0;
#P connect 24 0 7 0;
#P connect 14 0 11 0;
#P connect 11 0 10 0;
#P connect 8 0 9 0;
#P connect 15 0 16 0;
#P connect 7 0 14 0;
#P connect 16 0 14 0;
#P connect 2 0 8 0;
#P connect 10 0 13 0;
#P connect 3 0 2 1;
#P connect 13 0 2 1;
#P connect 4 0 2 1;
#P connect 16 1 14 1;
#P connect 8 0 9 1;
#P connect 12 0 13 1;
#P connect 25 0 5 0;
#P connect 5 0 12 0;
#P fasten 19 0 18 0 445 218 343 218;
#P fasten 17 0 18 0 343 387 408 387 408 223 343 223;
#P connect 18 0 4 0;
#P connect 2 0 17 0;
#P connect 5 0 4 1;
#P connect 22 0 20 0;
#P connect 20 0 19 0;
#P pop;

Hey, why not also make the delay time variable by feedback too to
make it doubly nonlinear…

On Nov 12, 2007, at 12:37 AM, jvkr wrote:

> Also I think that vector delay is not a problem at all for this
> application.

#116893
Nov 12, 2007 at 11:10pm

Thanks so much for the replies everyone.

Johan, you seem to have two things being fed in to the phase input of cycle~ (thanks for that: I was feeding back into the primary input), yet each produces different things.

The Roads diagram only shows the feedback being multiplied by a modulation index before being added to the ‘offset’ frequency. That seems to match the right hand portion of your patch, which works on its own. The middle portion seems like a version of simple fm using the phase input. Do I have that right?

#116894

You must be logged in to reply to this topic.