Reputation: 161
Is there a function or easy way to transpose a stream to a given key?
I want to use it in a loop, e.g, take a set of major streams and transpose all of then to C major (so then I can do some statistical work with them).
All the transpose tools I saw work with intervals or number of tones, not fixed keys. It shouldn't be so hard to write my function, but I suppose that it has to be already done... Thanks
Upvotes: 5
Views: 3608
Reputation: 3648
If s
is a Stream
(such as a Score
or Part
), then s.transpose('P4')
will move it up a Perfect Fourth, etc. If you know the key of s
as k
major, then i = interval.Interval(k, 'C')
will let you do s.transpose(i)
to move from k
to C. If you don't know the key of s
, then k = s.analyze('key')
will do a pretty decent job of figuring it out (using the Krumhansl probe-tone method). Putting it all together.
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
This assumes that your piece is likely to be in major. If not you can either treat it as the parallel major (f-minor -> F-major) or find in k.alternativeInterpretations
the best major key analysis. Or transpose it to a minor if it's minor, etc.
Upvotes: 6