-
Notifications
You must be signed in to change notification settings - Fork 267
ExampleSoundFonts
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()