Skip to content

Instantly share code, notes, and snippets.

@tatmos
Created November 19, 2023 00:21
Show Gist options
  • Save tatmos/389f453946ce4f140e2e8f3dc7b82e89 to your computer and use it in GitHub Desktop.
Save tatmos/389f453946ce4f140e2e8f3dc7b82e89 to your computer and use it in GitHub Desktop.
MIDIの特定の小節を取り出してランダムにtransposeするサンプル
import random
import copy
from music21 import *
def init():
# get environment
env = environment.Environment()
# check the path
print('Environment settings:')
print('musicXML: ', env['musicxmlPath'])
print('musescore: ', env['musescoreDirectPNGPath'])
# set path if necessary
env['musicxmlPath'] = 'C:/Program Files/MuseScore 4/bin/MuseScore4.exe'
env['musescoreDirectPNGPath'] = 'C:/Program Files/MuseScore 4/bin/MuseScore4.exe'
def part_transpose(part,transpose):
part_elements = part.flat.getElementsByClass(['Note', 'Chord', 'Rest'])
part.show("Text")
out_elements = []
for i, element in enumerate(part_elements):
duplicated_element = copy.deepcopy(element)
if part.partName == "Drum":
pass
else:
if not isinstance(element, note.Rest):
# トランスポーズで全体のキーを変える
duplicated_element = duplicated_element.transpose(transpose)
print(duplicated_element)
out_elements.append(duplicated_element)
return out_elements;
def analyze_mid(midi_file_path):
# MIDIファイルを読み込む
midi_stream = converter.parse(midi_file_path, quantizePost=False, normalize=False)
midi_stream.write('midi',"D:/tatPython/midichord/test_out.mid")
# sp = midi.realtime.StreamPlayer(midi_stream.measures(1,2))
# sp.play()
# MIDIファイルの内容を表示
# midi_stream.show()
# MIDIストリームを2回繰り返す
new_score = stream.Score()
transpose = []
lengthBias = []
for _ in range(32):
transpose.append(random.randint(0, 11))
lengthBias.append(random.randint(1, 1))
# score
mm1 = midi_stream.measures(1, 2)
mm2 = midi_stream.measures(3, 4)
for part in mm2.parts:
new_part = stream.Part()
new_part.partName = part.partName
print(new_part.partName)
for j in range(16):
new_elements = part_transpose(part,transpose[j])
for element in new_elements:
new_part.append(element)
new_score.append(new_part)
new_score.show()
#
sp = midi.realtime.StreamPlayer(new_score)
sp.play()
if __name__ == '__main__':
init()
analyze_mid("D:/tatPython/midichord/test.mid")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment