用music21(python)从kern得分中获取部分 - 为什么它没有找到这些部分?

时间:2014-04-23 18:23:57

标签: python midi music21

我用music21解析了一组krn文件,它们都包含许多部分。我想重新混合这些部分并将它们保存为不同的文件。

然而,对于一些kern文件,music21说它有0部分:

>>> s = converter.parse('./data/Benedictus_23.krn')
>>> print len(s.parts)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Opus' object has no attribute 'parts'   -> this really strange
>>> print len(s.voices)
0

文件确实有不同的条/乐器。我怎么能分开/识别它们?它似乎也没有声音。

以下是一个示例标题(full file

!!!COM: Palestrina, Giovanni Perluigi da
!!!OPR: Fratres Ego Enim Accepi
!!!OTL: Benedictus
**kern    **kern    **kern    **kern
*Itenor    *Icalto    *Icalto    *Icant
!Tenor    !Altus 2    !Altus 1    !Cantus
*clefGv2    *clefG2    *clefG2    *clefG2
*k[b-]    *k[b-]    *k[b-]    *k[b-]
*G:dor    *G:dor    *G:dor    *G:dor
*M4/2    *M4/2    *M4/2    *M4/2
=1    =1    =1    =1
0r    0a    0r    0r
=2    =2    =2    =2

其他具有此标头的krn文件可以正常工作:

!!!COM: Palestrina, Giovanni Perluigi da
!!!OPR: Dum esset summus pontifex
!!!OTL: Gloria
**kern    **kern    **kern    **kern
*Ibass    *Itenor    *Icalto    *Icant
!Bassus    !Tenor    !Altus    !Cantus
*clefF4    *clefGv2    *clefG2    *clefG2
*k[]    *k[]    *k[]    *k[]
*A:aeo    *A:aeo    *A:aeo    *A:aeo
*M4/2    *M4/2    *M4/2    *M4/2
=1    =1    =1    =1
1.A    1.c#    1.e    1.a

关于如何分离乐器的任何想法?或者正确阅读部分内容?

1 个答案:

答案 0 :(得分:1)

这些作品显然包括多个对话。

您可以像这样获得不同的流:

s = converter.parse('./data/Benedictus_23.krn')
 try:
    numscores = len(s.scores)
 except:
    numscores = 0
    #for each opus
    if numscores > 0:
      for score in range(0,numscores):
    sys.stdout.write('\n -> opus ' + str(score))
        t = s.scores[score]
        print len(t.parts)