Repository: cuthbertLab/music21

Issue:
Fast 3/8 accent sequence no longer partitioned
**music21 version**

`7.0.2`


**Problem summary**
"FAST" 3/8 (new in v7) no longer gets a partitioned accent sequence (new) 
or beat sequence (status quo for other 1-beat meters like 1/4, but doesn't seem ideal.)
 Lack of a partitioned accent sequence could be an inconvenience for doing syncopation analysis.

**Steps to reproduce**

```
>>> ts38 = meter.TimeSignature('3/8')
meter: cannot set default accents for: <music21.meter.TimeSignature 3/8>
>>> ts38.accentSequence
<music21.meter.core.MeterSequence {3/8}>
>>> ts38.beatSequence
<music21.meter.core.MeterSequence {3/8}>
>>> ts38.beatDivisionDurations
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jwalls/music21/music21/meter/base.py", line 988, in beatDivisionDurations
    raise TimeSignatureException(
music21.exceptions21.TimeSignatureException: cannot determine beat division for a non-partitioned beat
>>> ts38.classification
'Other Single'
```

**Expected behavior**

beatSequence:  <music21.meter.core.MeterSequence {3/8}>
accentSequence: <music21.meter.core.MeterSequence {1/16+1/16+1/16+1/16+1/16+1/16}>
classification: 'Compound Single'

Other 1-beat meters 
don't get beat partitions (which I suggest they could)
, but they at least get a partitioned accent sequence:
```
>>> ts14 = meter.TimeSignature('1/4')
>>> ts14.accentSequence
<MeterSequence {1/32+1/32+1/32+1/32+1/32+1/32+1/32+1/32}>
>>> ts14.beatSequence
<MeterSequence {1/4}>
```


Comments:

Patch:
diff --git a/music21/figuredBass/realizer.py b/music21/figuredBass/realizer.py
index a4090dc48..6d06038c0 100644
--- a/music21/figuredBass/realizer.py
+++ b/music21/figuredBass/realizer.py
@@ -89,6 +89,7 @@ def figuredBassFromStream(streamPart):
     .. image:: images/figuredBass/fbRealizer_fbStreamPart.*
         :width: 500
 
+    Changed in v7.3: multiple figures in same lyric (e.g. '64') now supported.
     '''
     sf = streamPart.flatten()
     sfn = sf.notes
@@ -116,9 +117,44 @@ def figuredBassFromStream(streamPart):
         if paddingLeft != 0.0:
             fb._paddingLeft = paddingLeft
 
+    def updateAnnotationString(annotationString: str, inputText: str) -> str:
+        '''
+        Continue building the working `annotationString` based on some `inputText`
+        that has yet to be processed. Called recursively until `inputText` is exhausted
+        or contains unexpected characters.
+        '''
+        # "64" and "#6#42" but not necessarily "4-3" or "sus4"
+        stop_index_exclusive: int = 0
+        if inputText[0] in '+#bn' and len(inputText) > 1 and inputText[1].isnumeric():
+            stop_index_exclusive = 2
+        elif inputText[0].isnumeric():
+            stop_index_exclusive = 1
+        else:
+            # quit
+            stop_index_exclusive = 1000
+        annotationString += inputText[:stop_index_exclusive]
+        # Is there more?
+        if inputText[stop_index_exclusive:]:
+            annotationString += ', '
+            annotationString = updateAnnotationString(
+                annotationString, inputText[stop_index_exclusive:])
+        return annotationString
+
     for n in sfn:
         if n.lyrics:
-            annotationString = ', '.join([x.text for x in n.lyrics])
+            annotationString: str = ''
+            for i, lyric_line in enumerate(n.lyrics):
+                if lyric_line.text in (None, ''):
+                    continue
+                if ',' in lyric_line.text:
+                    # presence of comma suggests we already have a separated
+                    # sequence of figures, e.g. "#6, 4, 2"
+                    annotationString = lyric_line.text
+                else:
+                    # parse it more carefully
+                    annotationString = updateAnnotationString(annotationString, lyric_line.text)
+                if i + 1 < len(n.lyrics):
+                    annotationString += ', '
             fb.addElement(n, annotationString)
         else:
             fb.addElement(n)
@@ -793,7 +829,34 @@ class FiguredBassLineException(exceptions21.Music21Exception):
 
 
 class Test(unittest.TestCase):
-    pass
+    def testMultipleFiguresInLyric(self):
+        from music21 import converter
+
+        s = converter.parse('tinynotation: 4/4 C4 F4 G4_64 G4 C1', makeNotation=False)
+        third_note = s[note.Note][2]
+        self.assertEqual(third_note.lyric, '64')
+        unused_fb = figuredBassFromStream(s)
+        self.assertEqual(third_note.notationString, '6, 4')
+
+        third_note.lyric = '#6#42'
+        unused_fb = figuredBassFromStream(s)
+        self.assertEqual(third_note.notationString, '#6, #4, 2')
+
+        third_note.lyric = '#64#2'
+        unused_fb = figuredBassFromStream(s)
+        self.assertEqual(third_note.notationString, '#6, 4, #2')
+
+        # original case
+        third_note.lyric = '6\n4'
+        unused_fb = figuredBassFromStream(s)
+        self.assertEqual(third_note.notationString, '6, 4')
+
+        # single accidental
+        for single_symbol in '+#bn':
+            with self.subTest(single_symbol=single_symbol):
+                third_note.lyric = single_symbol
+                unused_fb = figuredBassFromStream(s)
+                self.assertEqual(third_note.notationString, single_symbol)
 
 
 if __name__ == '__main__':
diff --git a/music21/meter/base.py b/music21/meter/base.py
index b9592f17c..ec239a2e4 100644
--- a/music21/meter/base.py
+++ b/music21/meter/base.py
@@ -1178,7 +1178,10 @@ class TimeSignature(base.Music21Object):
         # create a scratch MeterSequence for structure
         tsStr = f'{self.numerator}/{self.denominator}'
         if self.beatSequence.isUniformPartition():
-            firstPartitionForm = len(self.beatSequence)
+            if len(self.beatSequence) > 1:
+                firstPartitionForm = len(self.beatSequence)
+            else:
+                firstPartitionForm = None
             cacheKey = (tsStr, firstPartitionForm, depth)
         else:  # derive from meter sequence
             firstPartitionForm = self.beatSequence


Test patch:
diff --git a/music21/meter/tests.py b/music21/meter/tests.py
index 493f6c3f4..5ee71b264 100644
--- a/music21/meter/tests.py
+++ b/music21/meter/tests.py
@@ -388,6 +388,9 @@ class Test(unittest.TestCase):
                       0.5, 0.125, 0.25, 0.125, 0.25, 0.125,
                       0.5, 0.125, 0.25, 0.125, 0.25, 0.125]),
 
+            ('3/8', [1.0, 0.125, 0.25, 0.125, 0.5, 0.125,
+                     0.25, 0.125, 0.5, 0.125, 0.25, 0.125]),
+
             ('11/8',
              [1.0, 0.125, 0.25, 0.125,
               0.5, 0.125, 0.25, 0.125,