From e299316e936b53d4ffd1897056eb7dbd8bba055f Mon Sep 17 00:00:00 2001 From: hill Date: Wed, 23 Sep 2026 11:55:46 +0200 Subject: [PATCH] Pass the altered degrees to find in derive derive called IntervalNetwork.find without the scale's alteredDegrees, which deriveRanked and deriveAll both pass, so a harmonic minor scale was derived as if it were a natural minor: >>> scale.HarmonicMinorScale().derive(['C', 'D', 'E-', 'B']) A harmonic minor has neither the E- nor the B; C harmonic minor has all four, and is what deriveRanked ranks first. --- music21/scale/__init__.py | 3 ++- music21/scale/test_scale_main.py | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/music21/scale/__init__.py b/music21/scale/__init__.py index 9dc898f0f..8804228a6 100644 --- a/music21/scale/__init__.py +++ b/music21/scale/__init__.py @@ -2486,7 +2486,8 @@ def derive(self, other, comparisonAttribute: str = 'pitchClass') -> ConcreteScal abstract = t.cast(AbstractScale, self._abstract) net = t.cast('intervalNetwork.IntervalNetwork', abstract._net) pairs = net.find(pitchTarget=otherPitches, - comparisonAttribute=comparisonAttribute) + comparisonAttribute=comparisonAttribute, + alteredDegrees=abstract._alteredDegrees) newScale = self.__class__(tonic=pairs[0][1]) if newScale.abstract is None: diff --git a/music21/scale/test_scale_main.py b/music21/scale/test_scale_main.py index 96876fc2c..4a831a0e4 100644 --- a/music21/scale/test_scale_main.py +++ b/music21/scale/test_scale_main.py @@ -286,6 +286,10 @@ def testHarmonicMinorDescendingRange(self): descending = sc.getPitches('c#4', 'g#4', direction=Direction.DESCENDING) self.assertEqual(self.pitchOut(descending), '[G-4, F4, E-4, D-4]') + def testDeriveHarmonicMinor(self): + sc = scale.HarmonicMinorScale() + self.assertEqual(sc.derive(['C', 'D', 'E-', 'B']).name, 'C harmonic minor') + def testDeriveByDegree(self): sc1 = scale.MajorScale() self.assertEqual(str(sc1.deriveByDegree(7, 'G#')),