This is very interesting and I will be following this. I tried the Faust online IDE and the Leslie effect is sounding good. 
Thanks!
I find this discussion interesting because it cuts to the heart of what I like to do with DSP. I get general ideas of things to try from articles about real devices but after that I would just be using my ears (what's left of them anyway) to come up with interesting sounds. I don't care if they sound realistic.
Of course I will be interested to see where this winds up and I am impressed that you are using Faust! The online IDE is WAY better than the editor I started with a couple years ago. Faust, being an academic project, also has an active open source community. It's quite likely that if you deep dive into Faust on Teensy you will uncover some limitation or opportunity or something... which you can then contribute to the project!
What I really like about Faust is the concept of high-level modelling and then easily port to a beginner-friendly, DIY-friendly environment like Teensy (which can run on an Arduino). I've been toying with FPGAs and stuff but the learning curve is simply to steep to even get to the DSP part...
I'm not per se looking to make things sound realistic, but I want to try and connect to what people expect and how they use their effects

Nice!, Faust is one of my main projects for 2022. I haven't tried your algorithm but I'm working on a leslie program for the FV1 for quite some time now and did a lot of research. Some things I found:
1. On the Drum, frequencies below 200Hz are unaffected. The above are affected by the AM and in the mix you get some sort of phase cancelation, harmonic tremolo-ish kind of thing
2 The depth of the doppler effect is increased by the speed
3 On the horn you get more treble sound when the horn is facing you, so you can model a filter that varies with the LFO and is in sync with the AM (more volume- more treble).
4 For the horn simulation you can do it switcheable but I think you have to include some filtering to get that mid range hump
5 Sinewave is the way to go, synchornize the horn to be sine and the drum to be -sines
6 The horn and drum have a slight difference in speed, beign the horn a little faster. Also has less inertia so speeds up and down faster than the drum
7 A small reverb blends it all reaaaally nicely. You can make some small reflections with some all pass filters and feed them back
Thanks for your detailed pointers! 1, 4 and 6 are already implemented!
@1: the signal between 200Hz and 800Hz has AM and is subtracted from the signal below 200Hz so there is phase cancellation along the crossover

@2: very good pointer! Right now it's always at full depth but that's probably not the way to go as it's not very subtle

what delay times did you use for your pitch modulation?
@3: that one was also pointed by one of the papers and makes a lot of sense! However, I'm struggling with the frequency ranges... How much treble is rolled off?
@4: currently I have a bandpass filter around 2kHz but I feel that I lose to much treble. Especially since the pitch modulation also washes the upper frequencies a bit
@5: right now I have both horns modulating in the opposite direction and the drums just in one direction

@6: Currently, I have the horn rotating 3 times as fast (as per one of the papers). Good point about the inertia, but I don't have any kind of ramping functionality yet. (although it does seem common when looking at commercial products)
@7: I kind of expect people to have amp reverb or a dedicated reverb pedal, wouldn't it be a bit superfluous?
----
To test it more properly, I've written a little amp sim. I also cleaned the code a bit. I don't know yet how to manage code in separate files and modules so here is óne file. You can swap the comments on the latest 2 lines in case you ónly want to audition the rotary effect

import("stdfaust.lib");
amp_volume = sp.stereoize(_*amp_vol)
with {
amp_vol = vslider("Volume[style:knob]", 1.5, 0.001, 2, 0.01);
};
amp_preamp = sp.stereoize((1/atan(amp_k))*atan(amp_k*_*amp_gain))
with {
amp_gain = vslider("Gain[style:knob]", 1.5, 0.1, 10, 0.1);
amp_k = 2;
};
amp_tonestack = component("tonestacks.lib").jcm800(t,m,l), component("tonestacks.lib").jcm800(t,m,l)
with {
t = vslider("Treble[style:knob]", 0.6, 0, 1, 0.01);
m = vslider("Middle[style:knob]", 0.45, 0, 1, 0.01);
l = vslider("Bass[style:knob]", 0.5, 0, 1, 0.01);
};
// cabsim = sp.stereoize(fi.highpass(4, 80) : fi.peak_eq_cq(5,120,1) : fi.peak_eq_cq(-10,1500,1.4) : fi.peak_eq_cq(-24,3820,14) : fi.highshelf(1, 7, 1820) : fi.lowpass(8, 5000));
amp_cabsim = sp.stereoize(ef.speakerbp(80,5000));
amp_dry_wetST(x1,x2,y1,y2) = (wet*y1 + dry*x1),(wet*y2 + dry*x2)
with {
wet = dw;
dry = 1.0-wet;
dw = vslider("Reverb[style:knob]", 0.25, 0.0, 1, 0.01);
};
amp_sim = amp_preamp : amp_tonestack : amp_volume <: _,_,re.dattorro_rev(128, 0.99, 0.75, 0.625, 0.5, 0.7, 0.5, 0.001) : amp_dry_wetST : amp_cabsim;
/* ROTARY EFFECT */
ms_sample = ba.sec2samp(1) / 1000;
max_delay_ms = 30;
//UI Elements
rot_bpc = checkbox("Bypass");
high_lfo_freq = vslider("Rate[style:knob]",5,0.1,10,0.1);
rot_dw = vslider("Mix[style:knob]", 0.5, 0.0, 1, 0.01);
// LFOs
high_lfo = os.lf_trianglepos(high_lfo_freq);
low_lfo = os.lf_trianglepos(high_lfo_freq/3);
// Dynamics Parameters
rot_waveshaper(_) = sp.stereoize((1/atan(rot_k))*atan(rot_k*_*rot_gain))
with {
rot_gain = vslider("Gain[style:knob]", 1.5, 0.1, 10, 0.1);
rot_k = 2;
};
rot_volume = sp.stereoize(_*rot_vol)
with {
rot_vol = vslider("Volume[style:knob]", 1.5, 0.001, 2, 0.01);
};
rotary(_,_) = de.fdelay(max_delay_ms * ms_sample, high_lfo * max_delay_ms)*high_lfo, de.fdelay(max_delay_ms * ms_sample, max_delay_ms - (high_lfo * max_delay_ms))*(1-high_lfo);
rot_mixer(a,b,c) = a+c,b+c;
rot_dry_wetST(x1,x2,y1,y2) = (wet*y1 + dry*x1),(wet*y2 + dry*x2)
with {
wet = dw;
dry = 1.0-wet;
dw = vslider("Mix[style:knob]", 0.5, 0.0, 1, 0.01);
};
rotary_effect = ba.bypass2(rot_bpc, (_,_ <:
_,_,(rot_waveshaper(_,_) :
low, hi :
rot_mixer(_,_)) :
rot_dry_wetST :
rot_volume
)
)
with {
low = fi.lowpass(1, 800) <: fi.lowpass(1,200), fi.highpass(1,200) : _+_*-low_lfo : _*0.4;
hi = fi.highpass(1, 800) <: rotary(_,_) : rot_horn_eq;
rot_horn_eq = sp.stereoize(fi.resonbp(2000,0.7,1));
};
//process = hgroup("Rotary", rotary_effect);
process = hgroup("Signal Chain", hgroup("Rotary",rotary_effect) : hgroup("British Amp", amp_sim));
Definitely has a better UI now

I only need to learn how to order those elements such that the tonestack knobs are adjacent to each other

