Python时间序列分析:音乐表演数据揭秘

2025年02月19日 由 alex 发表 2114 0

现场音乐表演如同一幅幅精细的织锦,将多个音乐元素实时交织在一起。要理解这些表演中的变化,需要采用一种复杂的方法,综合考虑音乐背景、有意为之的变化、技术执行、风格惯例以及既定的表演实践。


表演分析中的音乐参数

在音乐中,我们不希望一切都机械化。分析音乐表演中的异常并不是简单的错误检测。我们需要对音准以及如颤音和滑音等表现手法进行细致的评估,同时还要考虑节奏元素,包括精确的时间安排、律动和弹性节奏。动态变化和音色特征有助于塑造音乐叙事。正是音乐的结构和乐句使得这些声音成为音乐,而非噪音。


全面的音乐分析框架

我们分析框架的技术实现从提取基本音乐特征开始。我们的代码系统地处理音频录音,以分析时间、音高、动态和音色。这种多维度的方法使我们能够捕捉表演中的技术和表现两个方面。


import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
# Load audio
y, sr = librosa.load(librosa.example('trumpet'))
# Extract multiple musical features
def extract_musical_features(y, sr):
    # Timing
    tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
    beat_times = librosa.frames_to_time(beat_frames, sr=sr)
    
    # Pitch
    f0, voiced_flag, voiced_probs = librosa.pyin(y, fmin=50, fmax=2000)
    
    # Energy/dynamics
    rms = librosa.feature.rms(y=y)[0]
    
    # Spectral features
    spectral_centroid = librosa.feature.spectral_centroid(y=y, sr=sr)[0]
    
    return beat_times, f0, rms, spectral_centroid, tempo
# Extract features
beat_times, f0, rms, spectral_centroid, tempo = extract_musical_features(y, sr)


音乐参数的可视化

音乐参数的可视化为我们提供了对表演特性的重要见解。我们的分析创建了三个主要视图:一个是音高轮廓分析,揭示了旋律的走向和音准;一个是动态剖面图,展示了音量和重点的变化;还有一个是音色分析,捕捉了声音特性的变化。


# Plot musical features with context
plt.figure(figsize=(15, 10))
# Plot 1: Pitch contour with context
plt.subplot(3, 1, 1)
times = librosa.times_like(f0)
valid_f0 = f0[~np.isnan(f0)]  # Remove NaN values
valid_times = times[~np.isnan(f0)]
plt.plot(valid_times, librosa.hz_to_midi(valid_f0), label='Pitch (MIDI)')
plt.title('Pitch Contour with Musical Context')
plt.ylabel('MIDI Note')
# Plot 2: Dynamic changes
plt.subplot(3, 1, 2)
times_rms = librosa.times_like(rms)
plt.plot(times_rms, librosa.amplitude_to_db(rms), label='Dynamics')
plt.title('Dynamic Changes')
plt.ylabel('dB')
# Plot 3: Spectral features
plt.subplot(3, 1, 3)
times_spec = librosa.times_like(spectral_centroid)
plt.plot(times_spec, spectral_centroid, label='Spectral Centroid')
plt.title('Timbral Changes')
plt.xlabel('Time (seconds)')
plt.ylabel('Frequency (Hz)')
plt.tight_layout()
plt.savefig("musical_features.png")
plt.show()


4


音乐情境分析

音乐特征的统计分析必须在适当的音乐情境中进行解释。我们的框架通过检查音符分布来识别音高中心,分析时间特性以理解节奏模式,并在考虑风格规范的同时评估节奏的稳定性。


# Print detected musical events
print("\nDetected Musical Events:")
print("------------------------")
print(f"Average tempo: {np.asscalar(tempo):.1f} BPM" if np.isscalar(tempo) else f"Average tempo: {tempo[0]:.1f} BPM")
print(f"Number of detected beats: {len(beat_times)}")
print(f"Duration: {len(y)/sr:.1f} seconds")
# Additional musical statistics
print("\nMusical Statistics:")
print("------------------")
valid_f0 = f0[~np.isnan(f0)]
if len(valid_f0) > 0:
    mean_midi = librosa.hz_to_midi(np.mean(valid_f0))
    pitch_range = librosa.hz_to_midi(np.max(valid_f0)) - librosa.hz_to_midi(np.min(valid_f0))
    print(f"Average pitch: {mean_midi:.1f} MIDI")
    print(f"Pitch range: {pitch_range:.1f} semitones")
mean_db = np.mean(librosa.amplitude_to_db(rms))
print(f"Average dynamics: {mean_db:.1f} dB")
# Additional analysis for musical context
if len(valid_f0) > 0:
    print("\nMusical Context:")
    print("---------------")
    # Calculate note distribution
    midi_notes = librosa.hz_to_midi(valid_f0)
    unique_notes, note_counts = np.unique(np.round(midi_notes), return_counts=True)
    most_common_note = unique_notes[np.argmax(note_counts)]
    print(f"Most common note: MIDI {most_common_note:.0f} ({librosa.midi_to_note(most_common_note)})")
    
    # Calculate average note duration
    mean_beat_interval = np.mean(np.diff(beat_times))
    print(f"Average beat duration: {mean_beat_interval:.3f} seconds")


表演分析需要仔细区分有意为之的变化和技术问题。如弹性节奏(rubato)这样的表现性时间处理是一种有意的艺术选择,而不均匀的节奏模式可能表明存在技术挑战。同样,动态塑造和装饰音有助于音乐表达,而意外的音色变化可能暗示存在技术问题。


对这些元素的解释必须始终考虑音乐风格和流派、既定的表演实践、声学环境以及所演奏乐器的特定特性等更广泛的背景。


应用与实施

这一分析框架在音乐界具有多种用途。它为表演教育和反馈提供了有价值的工具,能够对音乐表达和风格特征进行详细分析。该系统支持对表演质量的实时监测和评估,在教育环境和专业表演中特别有价值。


展望未来

用时间序列方法分析音乐表演需要将信号处理与音乐知识相结合。这样,我们才能更好地理解和评估技术执行与艺术表达之间复杂的相互作用。


文章来源:https://medium.com/@kylejones_47003/musical-performance-analysis-using-time-series-in-python-2bb5a19c7149
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消