On Thu, 19 Oct 2023, 03:49 Jean Abou Samra, <j...@abou-samra.fr> wrote:

> Hi,
>
> Here is a more minimal example illustrating your problem:
>
> \version "2.24.2"
>
> {
>   \scaleDurations 1/2 c'1
>   \scaleDurations 1/3 d'1
>   \scaleDurations 1/5 e'1
>   \scaleDurations 1/7 f'1
>   \scaleDurations 1/11 g'1
>   \scaleDurations 1/13 a'1
>   \scaleDurations 1/17 b'1
>   \scaleDurations 1/19 c''1
>   \scaleDurations 1/23 d''1
>   \scaleDurations 1/29 e''1
>   \scaleDurations 1/31 f''1
>   \scaleDurations 1/37 g''1
> }
>
> The underlying issue here is that you use lots of "complicated"
> multipliers, with high denominators. LilyPond needs to represent each point
> in time in an exact way, which it does using fractions. However, because
> the denominators you use are sufficiently large and have sufficiently few
> common prime factors, the denominator of the fraction needed to represent a
> moment in your score gets huge. In my example above, the product of primes
> up to 37 has the order of magnitude of ten thousand billions, or two at the
> power 43. Programs often use a fixed number of digits to represent
> integers, for efficiency reasons. At some point, the computations overflow
> the number of digits that is being used, and everything goes wrong.
>
> You might call it a bug, but I'd rather speak of a limitation. All
> programs that are written in languages such as C++ (internally used in
> LilyPond) exhibit overflow issues when you feed them with such huge
> integers.
>
> So, unfortunately, I don't have a workaround to suggest other than to use
> fractions with smaller denominators.
>
> Jean
>
Would a function that turns a fraction into whatever number/1000000 work?

\scaleDurations \ratio 1/29 % or 1 29

Cheers,
Vaughan

Reply via email to