检查音乐中某个部分(来自krn)的标签或名称

时间:2014-04-19 16:47:39

标签: python midi music21

我想从4个语音krn得分中提取2个部分,并将它们保存为midi文件。

我可以加载文件:

s = converter.parse('/something.krn') 

我可以得到一些这样的基本信息:

s.metadata.title

在v2中,我想存储带有标签" Cantus"的s部分。知道如何检查标签吗?他们在krn有一个标签。

一旦我得到了部件的编号,我可以用

来获得它
s.parts[i]

krn文件的定义如下:

**kern  **kern  **kern  **kern  **kern
*Ibass  *Itenor *Itenor *Icalto *Icant
!Bassus !Tenor 2    !Tenor 1    !Altus  !Cantus

我猜标签不是正确的名称,因为我无法在music21文档中找到它,也许是该部分的名称?

我似乎无法在music21 documentation中找到该属性。

1 个答案:

答案 0 :(得分:1)

我终于能够这样做了:

import sys
from music21 import *
import os
# input ("Please make sure that you have places all the krn files in a subdirectory called data. Press enter to continue")
for filename in os.listdir('./data'):
 s = converter.parse('./data/' + filename) 
 sys.stdout.write('Processing ' + filename + '... ')
 numcant = -1
 nums = list()
 try:
  length = len(s.parts)
 except: 
  length = 0
 if (length > 0): 
  for num in range(0,length): 
      # sys.stdout.write(s.parts[num].flat.getElementsByClass('SpineComment')[0].comment + ' - ') 
      if (s.parts[num].flat.getElementsByClass('SpineComment')[0].comment == "Cantus"):
        numcant = num
        # print "cant "
        # print numcant
      else:
        # print "nums"
        nums.append(num)
        # print num
 else:
    # sys.stdout.write(' - no parts present.')
    sys.stdout.write('\n')

 try:
  length = len(nums)
 except:
  length = 0
 if (length > 0):
  sys.stdout.write('\n')
  if (numcant != -1):
    for num in nums:
      sys.stdout.write(' - ' + filename[:-4] + '_' + str(num) + '.mid written.\n')  
      # print "cantus present"
      s2 = stream.Stream()
      s2.insert(0, s.parts[num])
      s2.insert(0, s.parts[numcant])
      # write the midi file 
      s2.write('midi', './midi/' + filename[:-4] + '_' + str(num) + '.mid')
      # sys.stdout.write('I')
  else:
     sys.stdout.write(' - no cantus specified for this file.\n')
 else:
  sys.stdout.write(' - not enough parts in this file.\n')
 sys.stdout.write('\n')