2016-05-28 56 views
1

有没有一个函数或简单的方法转移流给定的键?我想在一个循环中使用它,例如,采取一组主流并将所有主要流转置为C大调(这样我就可以对它们进行一些统计工作)。music21 - 转置流给定的键

我看到的所有转置工具都使用音调的间隔或数量,而不是固定键。它不应该这么难写我的功能,但我想,它必须已经完成...谢谢

回答

1

如果sStream(如ScorePart),然后将s.transpose('P4')它动起来一个完美的第四等,如果你知道s作为k专业的钥匙,那么i = interval.Interval(k, 'C')会让你做s.transpose(i)k转移到C.如果你不知道s的关键,那么k = s.analyze('key')将做一个相当不错的工作(使用Krumhansl探测音法)。把它放在一起。

from music21 import * 
for fn in filenameList: 
    s = converter.parse(fn) 
    k = s.analyze('key') 
    i = interval.Interval(k.tonic, pitch.Pitch('C')) 
    sNew = s.transpose(i) 
    # do something with sNew 

这假设你的作品很可能是主要的。如果不是,您可以将其视为并行专业(f-小调 - > F专业)或在k.alternativeInterpretations中查找最佳主要关键分析。或者如果它很小,则将其转置为未成年人等。

+1

谢谢迈克尔。我前几天写了自己的代码(但它不能正常工作,所以也许我应该试试这个)。关于主要/次要问题,我在转换前使用“分析”,因此我只保留主要或次要流 –

+1

只是一点改进:代码不起作用,因为'k'和'C'不是注释对象。一个正确的方法可能是用笔记替换'C'。注意('C')并从k得到一个笔记对象。例如:tonic = note.Note(pitch = k.pitchFromDegree(1)),并在区间中使用'tonic'而不是'k'。 –

+0

谢谢!固定(在这个例子中) –