首页 > 解决方案 > 如何使用 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()

标签: pythonmachine-learningmusic21

解决方案


推荐阅读