Skip to content
YAngyp626 edited this page Mar 3, 2025 · 1 revision

def generate_melody(): midi = MIDIFile(1) track = 0 time = 0 midi.addTrackName(track, time, "Main Track") midi.addTempo(track, time, 72) # 中等节奏

# 钢琴音色(符合歌词意境)
midi.addProgramChange(track, 0, 0, 0)  # 大钢琴

# 主歌旋律(C大调,分解和弦+半音过渡)
chords = [
    (60, 0, 1), (64, 1, 0.5), (67, 1.5, 0.5),  # C和弦
    (62, 2, 1), (65, 3, 0.5), (69, 3.5, 0.5),  # Dm7
    (58, 4, 1), (62, 5, 0.5), (65, 5.5, 0.5)   # F和弦
]

for note, start, duration in chords * 2:  # 重复构成主歌
    midi.addNote(track, 0, note, start, duration, 100)

# 副歌高潮(升高音域)
high_melody = [
    (72, 8, 0.5), (74, 8.5, 0.5), (76, 9, 1),  # 上行
    (72, 10, 0.5), (71, 10.5, 0.5), (69, 11, 2)  # 周杰伦式滑音
]

for note, start, duration in high_melody:
    midi.addNote(track, 0, note, start, duration, 110)

# 保存MIDI文件
with open("fading_promise.mid", "wb") as f:
    midi.writeFile(f)

转换为音频并播放

def play_music(): # 转换MIDI为WAV(需要SoundFont) os.system("fluidsynth -ni GeneralUser.sf2 fading_promise.mid -F output.wav")

# 播放音频
import simpleaudio as sa
wave_obj = sa.WaveObject.from_wave_file("output.wav")
play_obj = wave_obj.play()
play_obj.wait_done()

if name == "main": generate_melody() play_music()