lilypond-auto
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Lilypond-auto] [LilyIssues-auto] [testlilyissues:issues] #5119 MIDI2Ly


From: Auto mailings of changes to Lily Issues
Subject: [Lilypond-auto] [LilyIssues-auto] [testlilyissues:issues] #5119 MIDI2Ly fraction reduction
Date: Sun, 16 Apr 2017 14:33:33 +0000

Christopher's explanation of his work:
This will reduce the fractions (n-1)/d, n/d, and (n+1)/d (where the
original fraction is n/d). If (n-1)/d or (n+1)/d reduces more, its
reduction replaces n/d, except in one technical case. For instance,
the fraction 29/120 is considered to be rounded off after some error
has been added. The possible values to be checked are 28/120 (7/30 in
lowest terms), 29/120 (which does not reduce), and 30/120 (1/4). Since
30/120 reduces to the smallest denominator, 29/120 gets replaced with
1/4.

Now the technical case: If n/d is in lowest terms, n is odd, and d is
even but not divisible by 2, then n/d won't reduce, but you will be
able to cancel a factor of 2 from (n-1)/d and (n+1)/d. Since there is
no way to break this tie, the original value n/d is kept. (Note this
is the only case where (n-1)/d and (n+1)/d will be reduced by the same
denominator. I've proven this.)

Note that this will not make changes like 4*1/4 into 16; that might
be in a future version. This would turn the example output into

r2. e16 r16 e8 r2. e16 r16 e8 r2. e16

Also, fractions which don't reduce but have large denominators might
be replaced with approximations with small denominators. (Continued
fractions allow you to calculate these.)


[issues:#5119] MIDI2Ly fraction reduction

Status: New
Created: Sun Apr 16, 2017 02:32 PM UTC by Colin Campbell
Last Updated: Sun Apr 16, 2017 02:32 PM UTC
Owner: nobody

Submitted by Christopher Heckman:

When midi2ly is run, it will print fractions with large numerators
and denominators, like

r4361/120 e429/120 r431/120 e459/120 r4361/120 e429/120

when the actual durations are more likely to be

r2. e41/4 r41/4 e41/2 r2. e41/4 r41/4 e41/2 r2. e4*1/4

I have written a patch to fix this. Inside of the class Duration (line
129), replace the dump function with:


def dump (self):
    den = self.den; num = self.num;
    # code below by C C Heckman
    # looks for a neighboring fraction that reduces
    if num > 1:
        gcd1 = gcd (num - 1, den)
        gcd2 = gcd (num, den)
        gcd3 = gcd (num + 1, den)
        if gcd1 > gcd2 and gcd1 > gcd3:
            d = -1; g = gcd1
        elif gcd3 > gcd2 and gcd3 > gcd1:
            d = +1; g = gcd3
        else:
            d = 0; g = gcd2
            # for now, do nothing
        num = (num + d) / g
        den = den / g
    if den == 1:
        if num == 1:
            s = '%d' % self.dur
        elif num == 3 and self.dur != 1:
            s = '%d.' % (self.dur / 2)
        else:
            s = '%d*%d' % (self.dur, num)
    else:
        s = '%d*%d/%d' % (self.dur, num, den)
    # end modified code


Sent from sourceforge.net because address@hidden is subscribed to https://sourceforge.net/p/testlilyissues/issues/

To unsubscribe from further messages, a project admin can change settings at https://sourceforge.net/p/testlilyissues/admin/issues/options. Or, if this is a mailing list, you can unsubscribe from the mailing list.

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Testlilyissues-auto mailing list
address@hidden
https://lists.sourceforge.net/lists/listinfo/testlilyissues-auto

reply via email to

[Prev in Thread] Current Thread [Next in Thread]