Curious audible pitch change with varying move length.

This is something that I noticed a while back and which I've been meaning to ask about. I've known for a long time that when doing 45 degree infill on a rectangular part, as the print moves towards a corner there is an illusion that the print head speeds up as the moves get shorter. But it is just an illusion.
However, some time back, I noticed that not only do moves look like they change speed in relation to length, they also sound like it. I made a little video  I've enhanced the sound volume so it's much louder than in real life but you still might want to turn the sound up on your device (and probably use some decent speakers). Here is a link https://drive.google.com/file/d/1LB_qzK8RbXnqKnRNZTjOaNe6s6DCJib/view?usp=sharing
I can confirm that there are no feed rate changes in the gcode file and that DWC reports the same speed for all moves, regardless of their length. Now of course each move has an acceleration phase and a deceleration phase, but if my maths serves me correctly it should take around 0.8 seconds to accelerate up to speed and the head would travel about 3mm during that phase. The part is 100mm square so ignoring the first and last 3mm sections, there is a significant portion of each move which is at constant speed. Yet it sounds different as the head progresses away from, or closer too the corners. Although my hearing has degraded with age, I can hear two frequencies which I assume are from the two pairs pairs of motors (Nema17s for XY gantry and Nema23s for the UV gantry). But what is even more curious is that one frequency seems to increase, while the other decreases as the move length changes. Difficult to describe in words...........
Print quality wise, I can detect no difference in the surface finish so I'm not overly concerned about it. But I find it odd that the audible frequency changes with move length, even though all moves have the same constant speed section.
Curious is it not?

I think I know what is causing that. As I recall, your GCode file commands 5 linear axes: XYZAB. Your GCode processor that generates the A and B moves makes A and B move less distance than X and Y.
Now, the F parameter in a G1 command is assumed to apply to the total movement of all linear axes. If we assume that Z is not moving, then RRF is calculating the move length in 4dimensional (XYAB) space, and then applying the feed rate to that total move. So the XY speed you are getting is lower than you would get if you just specified X and Y movement, because of the A and B movement.
As the relative amount of AB movement reduces as the move length gets shorter because of the algorithm you use to generate the A and B movement, the amount by which the AB contribution reduces the XY speed decreases as the move gets shorter.
To avoid this, you need the AB motion to not be included in the feed rate calculation. In RRF 3.2 and later you can use the M584 S1 parameter in the command that creates the A and B axes, to have them treated as rotational for the purposes of interpreting the feed rate.

@dc42 Thanks. That makes a lot of sense.
But for info, I'm still using 3 gantries. XY is the (normal) hot end, UV is the extruder gantry  that's the one which moves different distances to XY. AB, is the load balancing gantry which is only there because I haven't got around to removing it. AB does exactly the same as XY (but the motor directions are reversed).
So a typical sequence of infill moves might look like this
G1 X188.079 Y133.701 E2.66162 A188.079 B133.701 U203.079 V148.701 G1 X187.373 Y133.701 E0.04398 A187.373 B133.701 U202.373 G1 X218.299 Y164.627 E2.72381 A218.299 B164.627 U203.299 V149.627 G1 X218.299 Y165.333 E0.04398 A218.299 B165.333 V150.333
A is always equal to X and B is always equal to Y. But U will be less that X and V will be less than Y (typically the start and end points for UV are circa +_20mm of the XY positions and relative to a point in the centre of the bed).
I confess that I hadn't considered that for moves to keep their start and end points synchronised, one gantry must move at a different speed to the other. So if the UV move is always (say 40mm) less than the XY move, the speed must progressively change (because the UV distance is not a fixed percentage of the XY distance). And of course, in some cases there might only be movement in U or V and not necessarily both, which will also affect the move length and thus the speed required to keep that move synchronised.
Could you just confirm that if a sequence of commands such as those shown above was preceded by a G1 F3600, that XY would always move at 60mm/sec (appart from the accel/decel phases) and the the speed of the UV gantry would be reduced accordingly (to suit the differing move length)? I'm assuming it would and DWC seems to confirm that is the case.
Thanks for solving that little mystery  it was bugging me.

@deckingman said in Curious audible pitch change with varying move length.:
Could you just confirm that if a sequence of commands such as those shown above was preceded by a G1 F3600, that XY would always move at 60mm/sec (appart from the accel/decel phases) and the the speed of the UV gantry would be reduced accordingly (to suit the differing move length)?
No! If all axes are treated as linear then the moves will proceed at 60mm/sec in 6dimensional XYUVAB space, and DWC will show the speed in that space. Here's an analysis of moves 2, 3 and 4:

@dc42 Strewth, that gets complicated! I'll just settle for the fact that if UV gantry move is less that XY gantry move and they start and end at the same point in time, then the UV move must happen at a lower overall velocity than the XU move. I can't comprehend any more than 3 dimensions (4 if you count time).

Does RRF even support the notion of multiple independent gantries?
For example, when we define max speed or jerk, can we have separate specifications for (XY), (AB) and (UV)? Or, do we have a way to tell the controller that these are three independent movement systems?

@zapta said in Curious audible pitch change with varying move length.:
Does RRF even support the notion of multiple independent gantries?
For example, when we define max speed or jerk, can we have separate specifications for (XY), (AB) and (UV)?
Yes you can.