Skip to content

Commit

Permalink
fix some redefined outer scopes
Browse files Browse the repository at this point in the history
The fix in pylint-dev/pylint#2834 does not seem to be working here
  • Loading branch information
mscuthbert committed Sep 24, 2022
1 parent 22e1ec9 commit ab923a5
Show file tree
Hide file tree
Showing 13 changed files with 1,141 additions and 1,134 deletions.
123 changes: 1 addition & 122 deletions music21/clef.py
Expand Up @@ -1015,128 +1015,7 @@ def testCopyAndDeepcopy(self):
from music21.test.commonTest import testCopyAll
testCopyAll(self, globals())

def testConversionClassMatch(self):
from xml.etree.ElementTree import fromstring as El
from music21.musicxml.xmlToM21 import MeasureParser
from music21 import clef
# need to get music21.clef.X, not X, because
# we are comparing the result to a translation outside
# clef.py
src = [
[('G', 1, 0), clef.FrenchViolinClef],
[('G', 2, 0), clef.TrebleClef],
[('G', 2, -1), clef.Treble8vbClef],
[('G', 2, 1), clef.Treble8vaClef],
[('G', 3, 0), clef.GSopranoClef],
[('C', 1, 0), clef.SopranoClef],
[('C', 2, 0), clef.MezzoSopranoClef],
[('C', 3, 0), clef.AltoClef],
[('C', 4, 0), clef.TenorClef],
[('C', 5, 0), clef.CBaritoneClef],
[('F', 3, 0), clef.FBaritoneClef],
[('F', 4, 0), clef.BassClef],
[('F', 4, 1), clef.Bass8vaClef],
[('F', 4, -1), clef.Bass8vbClef],
[('F', 5, 0), clef.SubBassClef],
[('TAB', 5, 0), clef.TabClef]
]

MP = MeasureParser()

for params, className in src:
sign, line, octaveChange = params
mxClef = El(r'<clef><sign>'
+ sign + '</sign><line>'
+ str(line) + '</line>'
+ '<clef-octave-change>'
+ str(octaveChange)
+ '</clef-octave-change></clef>')
c = MP.xmlToClef(mxClef)

# environLocal.printDebug([type(c).__name__])

self.assertEqual(c.sign, params[0])
self.assertEqual(c.line, params[1])
self.assertEqual(c.octaveChange, params[2])
self.assertIsInstance(c, className,
f'Failed Conversion of classes: {c} is not a {className}')

def testContexts(self):
from music21 import stream
from music21 import note
from music21 import meter

n1 = note.Note('C')
n1.offset = 10
c1 = AltoClef()
c1.offset = 0
s1 = stream.Stream([c1, n1])

self.assertIs(s1.recurse().notes[0].getContextByClass(Clef), c1)
# equally good: getContextsByClass(Clef)[0]

del s1

n2 = note.Note('D')
n2.duration.type = 'whole'
n3 = note.Note('E')
n3.duration.type = 'whole'
ts1 = meter.TimeSignature('4/4')
s2 = stream.Stream()
s2.append(c1)
s2.append(ts1)
s2.append(n2)
s2.append(n3)
s2.makeMeasures()
self.assertIs(n2.getContextByClass(Clef), c1)

del s2

n4 = note.Note('F')
n4.duration.type = 'half'
n5 = note.Note('G')
n5.duration.type = 'half'
n6 = note.Note('A')
n6.duration.type = 'whole'

ts2 = meter.TimeSignature('4/4')
bc1 = BassClef()
tc1 = TrebleClef()

s3 = stream.Stream()
s3.append(bc1)
s3.append(ts2)
s3.append(n4)
s3.append(tc1)
s3.append(n5)
s3.append(n6)
s3.makeMeasures()

self.assertIs(n4.getContextByClass(stream.Measure), n5.getContextByClass(stream.Measure))
self.assertIs(n4.getContextByClass(Clef), bc1)
self.assertIs(n5.getContextByClass(Clef), tc1)
self.assertIs(n6.getContextByClass(Clef), tc1)

def testTabClefBeamDirections(self):

from music21 import stream
from music21 import clef
from music21 import meter
from music21 import note

m = stream.Measure()

n1 = note.Note(64, quarterLength=0.25)
n2 = note.Note(67, quarterLength=0.25)

m.append(clef.TabClef())
m.append(meter.TimeSignature('4/4'))
m.append(n1)
m.append(n2)
m.makeBeams(inPlace=True)

self.assertEqual(m.notes[0].stemDirection, 'down')

# all other tests in test/test_clef

# ------------------------------------------------------------------------------
# define presented order in documentation
Expand Down
169 changes: 4 additions & 165 deletions music21/expressions.py
Expand Up @@ -26,7 +26,6 @@

import copy
import string
import unittest
import typing as t

from music21 import base
Expand All @@ -37,6 +36,7 @@
from music21 import spanner
from music21 import style


if t.TYPE_CHECKING:
from music21 import note

Expand Down Expand Up @@ -1593,7 +1593,7 @@ def noteExtremes(self) -> tuple[t.Optional[note.Note],
(<music21.note.Note C#>, <music21.note.Note G>)
'''
from music21 import chord
from music21 import note
from music21 import note # pylint: disable=redefined-outer-name
notes = []
for n_or_ch in self:
if isinstance(n_or_ch, note.Note):
Expand All @@ -1604,168 +1604,7 @@ def noteExtremes(self) -> tuple[t.Optional[note.Note],


# ------------------------------------------------------------------------------
class Test(unittest.TestCase):

def testRealize(self):
from music21 import note
from music21 import stream
n1 = note.Note('D4')
n1.quarterLength = 4
n1.expressions.append(WholeStepMordent())
expList = realizeOrnaments(n1)
st1 = stream.Stream()
st1.append(expList)
st1n = st1.notes
self.assertEqual(st1n[0].name, 'D')
self.assertEqual(st1n[0].quarterLength, 0.125)
self.assertEqual(st1n[1].name, 'C')
self.assertEqual(st1n[1].quarterLength, 0.125)
self.assertEqual(st1n[2].name, 'D')
self.assertEqual(st1n[2].quarterLength, 3.75)

def testGetRepeatExpression(self):
from music21 import expressions

te = expressions.TextExpression('lightly')
# no repeat expression is possible
self.assertEqual(te.getRepeatExpression(), None)

te = expressions.TextExpression('d.c.')
self.assertEqual(str(te.getRepeatExpression()),
"<music21.repeat.DaCapo 'd.c.'>")
re = te.getRepeatExpression()
self.assertEqual(re.getTextExpression().content, 'd.c.')

te = expressions.TextExpression('DC al coda')
self.assertEqual(str(te.getRepeatExpression()),
"<music21.repeat.DaCapoAlCoda 'DC al coda'>")
re = te.getRepeatExpression()
self.assertEqual(re.getTextExpression().content, 'DC al coda')

te = expressions.TextExpression('DC al fine')
self.assertEqual(str(te.getRepeatExpression()),
"<music21.repeat.DaCapoAlFine 'DC al fine'>")
re = te.getRepeatExpression()
self.assertEqual(re.getTextExpression().content, 'DC al fine')

te = expressions.TextExpression('ds al coda')
self.assertEqual(str(te.getRepeatExpression()),
"<music21.repeat.DalSegnoAlCoda 'ds al coda'>")
re = te.getRepeatExpression()
self.assertEqual(re.getTextExpression().content, 'ds al coda')

te = expressions.TextExpression('d.s. al fine')
self.assertEqual(str(te.getRepeatExpression()),
"<music21.repeat.DalSegnoAlFine 'd.s. al fine'>")
re = te.getRepeatExpression()
self.assertEqual(re.getTextExpression().content, 'd.s. al fine')

def testExpandTurns(self):
from music21 import note
from music21 import stream
from music21 import clef
from music21 import key
from music21 import meter
p1 = stream.Part()
m1 = stream.Measure()
m2 = stream.Measure()
p1.append(clef.TrebleClef())
p1.append(key.Key('F', 'major'))
p1.append(meter.TimeSignature('2/4'))
n1 = note.Note('C5', type='half')
turn0 = Turn()
n1.expressions.append(turn0)
n2 = note.Note('B4', type='quarter')
n2.duration.dots = 1

n2.expressions.append(InvertedTurn())
m1.append(n1)
m2.append(key.KeySignature(5))
m2.append(n2)
m2.append(note.Rest('eighth'))
p1.append(m1)
p1.append(m2)
realized1 = realizeOrnaments(n1)
realized2 = realizeOrnaments(n2)
self.assertEqual('C5 D5 C5 B-4 C5', ' '.join(n.pitch.nameWithOctave for n in realized1))
self.assertEqual('B4 A#4 B4 C#5 B4', ' '.join(n.pitch.nameWithOctave for n in realized2))
self.assertEqual(realized1[0].quarterLength, 1.0)
self.assertEqual(realized1[1].quarterLength, 0.25)
self.assertEqual(realized2[0].quarterLength, 0.5)
self.assertEqual(realized2[1].quarterLength, 0.25)

turn0.quarterLength = 0.125
realized1b = realizeOrnaments(n1)
self.assertEqual(realized1b[0].quarterLength, 1.5)
self.assertEqual(realized1b[1].quarterLength, 0.125)


def testExpandTrills(self):
from music21 import note
from music21 import stream
from music21 import clef
from music21 import key
from music21 import meter
p1 = stream.Part()
m1 = stream.Measure()
p1.append(clef.TrebleClef())
p1.append(key.Key('D', 'major'))
p1.append(meter.TimeSignature('1/4'))
n1 = note.Note('E4', type='eighth')
n1.expressions.append(Trill())
m1.append(n1)
p1.append(m1)
realized = realizeOrnaments(n1)
self.assertIsInstance(realized, list)
self.assertEqual(len(realized), 4)
self.assertIsInstance(realized[0], note.Note)
self.assertEqual(realized[0].quarterLength, 0.125)
self.assertEqual('E4 F#4 E4 F#4', ' '.join(n.pitch.nameWithOctave for n in realized))


def testTrillExtensionA(self):
'''Test basic wave line creation and output, as well as passing
objects through make measure calls.
'''
from music21 import stream
from music21 import note
from music21 import chord
from music21 import expressions
from music21.musicxml import m21ToXml
s = stream.Stream()
s.repeatAppend(note.Note(), 12)
n1 = s.notes[0]
n2 = s.notes[-1]
sp1 = expressions.TrillExtension(n1, n2)
s.append(sp1)
raw = m21ToXml.GeneralObjectExporter().parse(s)
self.assertEqual(raw.count(b'wavy-line'), 2)

s = stream.Stream()
s.repeatAppend(chord.Chord(['c-3', 'g4']), 12)
n1 = s.notes[0]
n2 = s.notes[-1]
sp1 = expressions.TrillExtension(n1, n2)
s.append(sp1)
raw = m21ToXml.GeneralObjectExporter().parse(s)
# s.show()
self.assertEqual(raw.count(b'wavy-line'), 2)

def testUnpitchedUnsupported(self):
from music21 import note

unp = note.Unpitched()
mord = Mordent()
with self.assertRaises(TypeError):
mord.realize(unp) # type: ignore


# class TestExternal(unittest.TestCase):
# def testCPEBachRealizeOrnaments(self):
# from music21 import corpus
# cpe = corpus.parse('cpebach/h186').parts[0].measures(1, 4)
# cpe2 = cpe.realizeOrnaments()
# cpe2.show()
# Tests moved to test/test_expressions


# ------------------------------------------------------------------------------
Expand All @@ -1774,5 +1613,5 @@ def testUnpitchedUnsupported(self):

if __name__ == '__main__':
import music21
music21.mainTest(Test)
music21.mainTest()

4 changes: 2 additions & 2 deletions music21/graph/__init__.py
Expand Up @@ -184,7 +184,7 @@ def testAll(self):
def testPlotChordsC(self):
from music21 import dynamics
from music21 import note
from music21 import stream
from music21 import stream # pylint: disable=redefined-outer-name # only in TYPE_CHECKING
from music21 import scale

sc = scale.MajorScale('c4')
Expand Down Expand Up @@ -219,7 +219,7 @@ def testPlotChordsC(self):
def testHorizontalInstrumentationB(self):
from music21 import corpus
from music21 import dynamics
from music21 import stream
from music21 import stream # pylint: disable=redefined-outer-name # only in TYPE_CHECKING
s = corpus.parse('bwv66.6')
dyn = ['p', 'mf', 'f', 'ff', 'mp', 'fff', 'ppp']
i = 0
Expand Down

0 comments on commit ab923a5

Please sign in to comment.