python - 如何使用 Music21 库将所有 midi 文件转换为通用键(主要和次要)
问题描述
我需要遍历给定的目录,因为将 midi 文件从它们各自的键转换为通用键 (C)。我怎样才能在python中做到这一点?
当前代码:
这将用于转调播放每个 midi 文件的键,以便每个文件都是通用键。这是因为如果每个 MIDI 文件位于不同的键中,模型将输出一个包含听起来不悦耳的指令的 MIDI 文件。
import music21 as m21
import glob
def main():
#Get midi files
fileHandler = FileHandler("./BluesMidi")
nonTransposedMidi = fileHandler.GetSongFromDirectory()
#print(nonProcessedMidi) prints a list of midi files
transposer = TransposeMidiKey(nonTransposedMidi)
transposer.TransposeMidi()
class FileHandler:
#Attributes
songs = []
#Constructor
def __init__(self, filePath):
self._filePath = filePath
#Properties
#Methods
def GetSongFromDirectory(self):
for i in glob.iglob(self._filePath + '/*.mid'):
self.songs.append(i)
return self.songs
def CreateNewTransposedMidi():
pass
class TransposeMidiKey:
#Attributes
#Constructor
def __init__(self, nonTransposedMidi):
self._nonTransposedMidi = nonTransposedMidi
#Properties
#Methods
def TransposeMidi(self):
for i in self._nonTransposedMidi:
# Change midi into stream objects
musicScorData = m21.converter.parse(i)
# Find current key of each midi file
key = musicScorData.analyze('key')
# Print the key and the mode (major or minor)
#print(key.tonic.name, key.mode)
# If the key is already major
if key.mode == 'major':
# Transpose it into the key of C
interval = m21.interval.Interval(key.tonic, m21.pitch.Pitch('C'))
if __name__=='__main__':
main()
解决方案
推荐阅读
- mysql - 在不访问时区表的情况下转换 MySQL 中的时区
- python - 获取“INVALID_TOKEN_FORMAT 安全令牌格式不符合预期架构。” docusign 旧版身份验证标头
- vue.js - 如何在d3中使用远程json数据显示条形图
- php - 如何创建倒计时(X 之前的剩余天数)
- r - 尽管其他功能因素在 R 中编写规则,但 Apriori 标签仍被拒绝
- python - 如何在自定义数据上运行 Pandas read_csv 的解析逻辑?
- google-chrome - Google Chrome 中 ctrl-r、F5 和刷新按钮的区别
- spring - 获取 ThreadPoolTaskExecutor 的队列大小并在 Spring Boot 中添加到队列
- python - OpenAI Gym 自定义环境:具有真实值的离散观察空间
- powerbi - 在 UserPrincipalName 的辅助字段上使用 RLS