要从.mp3音乐文件中检测音符并显示MIDI时间图,需要经过以下几个步骤:
以下是一个简化的Python示例,使用librosa
库进行音频处理,并使用mido
库生成MIDI文件和时间图。
import librosa
import numpy as np
import mido
from mido import MidiFile, MidiTrack, Message
# 加载MP3文件
y, sr = librosa.load('example.mp3')
# 提取音高
pitches, magnitudes = librosa.core.piptrack(y=y, sr=sr)
# 创建MIDI文件
mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)
# 设置初始速度和时间
track.append(Message('program_change', program=1, time=0))
# 处理每个音符
for t in range(pitches.shape[1]):
index = magnitudes[:, t].argmax()
pitch = pitches[index, t]
if pitch > 0:
velocity = magnitudes[index, t] * 127
track.append(Message('note_on', note=int(pitch), velocity=int(velocity), time=0))
track.append(Message('note_off', note=int(pitch), velocity=int(velocity), time=480)) # 假设每个音符持续1拍
# 保存MIDI文件
mid.save('output.mid')
# 可视化MIDI时间图(简化示例)
import matplotlib.pyplot as plt
times = []
notes = []
for msg in track:
if msg.type == 'note_on':
times.append(msg.time)
notes.append(msg.note)
plt.figure(figsize=(10, 5))
plt.scatter(times, notes, c='blue')
plt.xlabel('Time (ticks)')
plt.ylabel('Note')
plt.title('MIDI Time Graph')
plt.show()
通过上述步骤和示例代码,可以实现从MP3文件中检测音符并生成MIDI时间图。根据具体需求和环境,可能需要进一步调整和优化。
没有搜到相关的文章