N@Advanced Smoother I@Target Speed Acceleration O@Value Active # Activate when target has been set ~Target -> Active = 1; # Main computation loop first() | clk() -> # Precomputation of inputs !Acceleration -> Acceleration = Speed * 50 * 2; AccLength = Speed^2 / Acceleration / 2 AccRate = min(Speed, Acceleration / 50) # Precomputation of variables Distance = Target - Value Direction = Distance >= 0 ? 1 : -1 # Calculate ideal speed modifier IdealRate = Speed * Direction abs(Distance) <= AccLength -> IdealRate *= sqrt(abs(Distance - Rate / 50) / AccLength); # Calculate final speed for iteration Rate += clamp(IdealRate - Rate, -Acceleration / 50, Acceleration / 50) Value += Rate / 50 # Check if value has reached target Active = abs(Rate) > AccRate | abs(Distance) > AccRate / 50 !Active -> Rate = 0, Value = Target;; # Schedule the main loop if active Active -> interval(20);