lilypond-user
[Top][All Lists]
Advanced

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

Re: etf2ly off-by-two in minor scales?


From: Arvid Grøtting
Subject: Re: etf2ly off-by-two in minor scales?
Date: Mon, 06 Oct 2003 17:59:20 +0200
User-agent: Gnus/5.1001 (Gnus v5.10.1) Emacs/21.2 (berkeley-unix)

Arvid Grøtting <address@hidden> writes:

> This seems to be a etf2ly issue.  Is it a known bug?  Is there an easy
> fix?

OK, I know it's rude of me to follow up to myself, but there's a fix
now.  Ugly, but it seems to work for fis minor with at least one
piece; YMMV.

Oh, and I fixed one other thing while I was at it.  ;-)

--

Arvid

Cut here, if you see a great need to cut at all: ------->8--
--- scripts/etf2ly-orig.py      Tue Sep  9 12:24:22 2003
+++ scripts/etf2ly.py   Mon Oct  6 17:57:38 2003
@@ -97,17 +97,30 @@
                while accidental_bits < 256:
                        p = transpose (p, (3,0))
                        accidental_bits = accidental_bits + 1
-                       
+
+       if bank_number == 1:
+               # minor scale
+               p = transpose (p, (5, 0))
        p  = (p[0] % 7, p[1])
 
-       return p
+       return KeySignature (p, bank_number)
 
 # should cache this.
-def find_scale (transposition):
+def find_scale (keysig):
        cscale = map (lambda x: (x,0), range (0,7))
-       trscale = map(lambda x, k=transposition: transpose(x, k), cscale)
-
+       print "cscale: ", cscale
+       ascale = map (lambda x: (x,0), range (-2,5))
+       print "ascale: ", ascale
+       transposition = keysig.pitch
+       if keysig.sig_type == 1:
+               transposition = transpose(transposition, (2, -1))
+               transposition = (transposition[0] % 7, transposition[1])
+               trscale = map(lambda x, k=transposition: transpose(x, k), 
ascale)
+       else:
+               trscale = map(lambda x, k=transposition: transpose(x, k), 
cscale)
+       print "trscale: ", trscale
        return trscale
+
 def EDU_to_duration (edu):
        log = 1
        d = 4096
@@ -384,7 +397,25 @@
                str = """\nverse%s = \\lyrics {\n %s}\n""" %  (encodeint 
(self.number - 1) ,str)
                return str
 
+class KeySignature:
+       def __init__(self, pitch, sig_type = 0):
+               self.pitch = pitch
+               self.sig_type = sig_type
        
+       def signature_type (self):
+               if self.sig_type == 1:
+                       return "\\minor"
+               else:
+                       # really only for 0, but we only know about 0 and 1
+                       return "\\major"
+       
+       def equal (self, other):
+               if other and other.pitch == self.pitch and other.sig_type == 
self.sig_type:
+                       return 1
+               else:
+                       return 0
+       
+
 class Measure:
        def __init__(self, no):
                self.number = no
@@ -502,9 +533,10 @@
                        e = ''
                        
                        if g:
-                               if last_key <> g.key_signature:
-                                       pitch= g.key_signature                  
                
-                                       e = e + "\\key %s \\major " % 
(lily_notename (pitch))
+                               if g.key_signature and not 
g.key_signature.equal(last_key):
+                                       pitch= g.key_signature.pitch
+                                       e = e + "\\key %s %s " % (lily_notename 
(pitch),
+                                                                 
g.key_signature.signature_type())
                                        
                                        last_key = g.key_signature
                                if last_time <> g.timesig :
@@ -1093,7 +1125,7 @@
                        sys.stderr.write ("\nLyrics found; edit to use 
\\addlyrics to couple to a staff\n")
                        
                if staffs:
-                       str = str + '\\score { < %s > } ' % string.join (staffs)
+                       str = str + '\\score { << %s >> } ' % string.join 
(staffs)
                        
                return str
 





reply via email to

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