如何使用Music21库将所有midi文件转换为通用键(大调和小调)

2024-09-27 09:33:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在给定的目录中循环,将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()

Tags: 文件ofthekeyselfmainmodedef

热门问题