Repository: cuthbertLab/music21 (python)

Issue:
Regression issue - unable get fingering of cords after parsing xml file
<!-- Version of music21:  print(music21.__version__) -->
**music21 version**

Issue on version `8.1.0`   <!-- replace with actual version -->
Working well on version `7.3.3`


**Problem summary**
<!-- Briefly: what undesired thing happens when what action is taken? -->
**Regression issue unless there is a new way, I didn't find out.**
Unable get all fingering of chord, I'm receiving only the first finger

![image](https://user-images.githubusercontent.com/16102210/198280635-565c74ca-770f-49ca-be76-204dde5574f6.png)


**Steps to reproduce**

Use the following code and the attached file (simple cord)


```
for generalNote in music21.converter.parse(f"myFile.xml").parts[0].flat.notes:
  fingers = []

  # On version 8.1.0 print "generalNote.articulations.size: 1"
  # On version 7.3.3 print "generalNote.articulations.size: 3"
  print(f"generalNote.articulations.size: {len(generalNote.articulations)}")

  for articulation in (generalNote.articulations):
    if isinstance(articulation, music21.articulations.Fingering):
      fingers.append(articulation.fingerNumber)

  # fingers contain 1 finger on verion 8.1.1 and 3 fingers on version 7.3.3

```


**Expected vs. actual behavior**
<!-- Consider annotating the output produced by a function -->
Actual getting 1 finger
Expected getting 3 fingers

**More information**
<!-- If relevant: OS, suggested fix, attempted workarounds -->

<!-- Note: only Mac and Windows are directly supported by music21 staff.  
     Bug reports that are specific to other OSes w/o a PR will be closed
     unless the reporter is willing to contribute a fix.
 -->


Pull request:
Preserve multiple articulations on chords in musicxml import
Fixes #1473

Patch:
diff --git a/music21/musicxml/xmlToM21.py b/music21/musicxml/xmlToM21.py
index 8473d456b..c4ed5dd2d 100644
--- a/music21/musicxml/xmlToM21.py
+++ b/music21/musicxml/xmlToM21.py
@@ -2875,7 +2875,7 @@ class MeasureParser(XMLParserBase):
 
         # move spanners, expressions, articulations from first note to Chord.
         # See slur in m2 of schoenberg/op19 #2
-        # but move only one of each class
+        # but move only one of each class, unless a fingering.
         # Is there anything else that should be moved???
 
         seenArticulations = set()
@@ -2892,7 +2892,8 @@ class MeasureParser(XMLParserBase):
                 if type(art) in seenArticulations:  # pylint: disable=unidiomatic-typecheck
                     continue
                 c.articulations.append(art)
-                seenArticulations.add(type(art))
+                if not isinstance(art, articulations.Fingering):
+                    seenArticulations.add(type(art))
             for exp in n.expressions:
                 if type(exp) in seenExpressions:  # pylint: disable=unidiomatic-typecheck
                     continue


Test patch:
diff --git a/music21/musicxml/testPrimitive.py b/music21/musicxml/testPrimitive.py
index 7b236badf..ff2ac4297 100644
--- a/music21/musicxml/testPrimitive.py
+++ b/music21/musicxml/testPrimitive.py
@@ -18953,6 +18953,99 @@ multiMeasureEnding = (
 </score-partwise>
 ''')
 
+multipleFingeringsOnChord = """
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.1 Partwise//EN" "http://www.musicxml.org/dtds/partwise.dtd">
+<score-partwise version="3.1">
+  <part-list>
+    <score-part id="P1">
+      <part-name>Piano</part-name>
+      </score-part>
+    </part-list>
+  <part id="P1">
+    <measure number="1">
+      <attributes>
+        <divisions>1</divisions>
+        <key>
+          <fifths>0</fifths>
+          </key>
+        <time>
+          <beats>4</beats>
+          <beat-type>4</beat-type>
+          </time>
+        <staves>2</staves>
+        <clef number="1">
+          <sign>G</sign>
+          <line>2</line>
+          </clef>
+        <clef number="2">
+          <sign>F</sign>
+          <line>4</line>
+          </clef>
+        </attributes>
+      <note>
+        <pitch>
+          <step>C</step>
+          <octave>4</octave>
+          </pitch>
+        <duration>4</duration>
+        <voice>1</voice>
+        <type>whole</type>
+        <staff>1</staff>
+        <notations>
+          <technical>
+            <fingering>1</fingering>
+            </technical>
+          </notations>
+        </note>
+      <note>
+        <chord/>
+        <pitch>
+          <step>E</step>
+          <octave>4</octave>
+          </pitch>
+        <duration>4</duration>
+        <voice>1</voice>
+        <type>whole</type>
+        <staff>1</staff>
+        <notations>
+          <technical>
+            <fingering>3</fingering>
+            </technical>
+          </notations>
+        </note>
+      <note>
+        <chord/>
+        <pitch>
+          <step>G</step>
+          <octave>4</octave>
+          </pitch>
+        <duration>4</duration>
+        <voice>1</voice>
+        <type>whole</type>
+        <staff>1</staff>
+        <notations>
+          <technical>
+            <fingering>5</fingering>
+            </technical>
+          </notations>
+        </note>
+      <backup>
+        <duration>4</duration>
+        </backup>
+      <note>
+        <rest measure="yes"/>
+        <duration>4</duration>
+        <voice>5</voice>
+        <staff>2</staff>
+        </note>
+      <barline location="right">
+        <bar-style>light-heavy</bar-style>
+        </barline>
+      </measure>
+    </part>
+  </score-partwise>
+"""
 
 ALL = [
     articulations01, pitches01a, directions31a, lyricsMelisma61d, notations32a,  # 0
@@ -18971,7 +19064,7 @@ ALL = [
     unicodeStrNoNonAscii, unicodeStrWithNonAscii,  # 44
     tremoloTest, hiddenRests, multiDigitEnding, tupletsImplied, pianoStaffPolymeter,  # 46
     arpeggio32d, multiStaffArpeggios, multiMeasureEnding,   # 51
-    pianoStaffPolymeterWithClefOctaveChange,  # 54
+    pianoStaffPolymeterWithClefOctaveChange, multipleFingeringsOnChord  # 54
 ]
 
 
diff --git a/music21/musicxml/test_xmlToM21.py b/music21/musicxml/test_xmlToM21.py
index e0975561a..04a1b9ea0 100644
--- a/music21/musicxml/test_xmlToM21.py
+++ b/music21/musicxml/test_xmlToM21.py
@@ -1117,6 +1117,14 @@ class Test(unittest.TestCase):
         self.assertIsInstance(notes[3].articulations[0], articulations.StringIndication)
         self.assertEqual(notes[3].articulations[0].number, 2)
 
+    def testArticulationsOnChord(self):
+        from music21 import converter
+        from music21.musicxml import testPrimitive
+
+        s = converter.parse(testPrimitive.multipleFingeringsOnChord)
+        c = s[chord.Chord].first()
+        self.assertEqual(len(c.articulations), 3)
+
     def testFretIndication(self):
         from music21 import converter