IPython Audio:列表拼接和弦仅播放单段而非依次播放问题
问题分析与解决方案
问题原因
你当前的错误在于:added_sample += h是把多个和弦的音轨列表直接合并,比如H0有3个音轨、H7有3个音轨,合并后变成12个独立音轨,但每个音轨的时长还是2秒,所以播放器会同时播放这12个音轨,总时长仍为2秒——这是叠加音轨,不是按时间顺序播放和弦。
要实现依次播放,需要在时间维度上拼接每个和弦的音轨数据,而不是增加音轨数量。
修正后的代码实现
首先优化生成音频的逻辑,用numpy数组替代嵌套列表,更高效且方便拼接操作:
import IPython.display as ipd import numpy as np # 修正函数:用numpy.sin支持数组输入,避免循环生成列表 def f_k(f_0, k): return f_0 * 2 ** ((k % 12)/12) def h_k(k, f0, t): return np.sin(2 * np.pi * f_k(f0, k) * t) F = 44000 T = 2 f0 = 440 N = F * T t = np.linspace(0, T, N) # 提前生成时间数组,重复使用 # 生成各和弦的多轨数组(shape: [音轨数, 时间点数]) H0 = np.array([h_k(k, f0, t) for k in [0,4,7]]) H5 = np.array([h_k(k, f0, t) for k in [5,9,12]]) H7 = np.array([h_k(k, f0, t) for k in [7, 11, 14]]) H9 = np.array([h_k(k, f0, t) for k in [5,9,16]]) # 按时间维度拼接(axis=1对应时间轴) added_sample = np.concatenate([H0, H7, H9, H5], axis=1) # 播放总时长8秒的音频 ipd.Audio(added_sample, rate=F)
补充说明
如果需要将每个和弦的多轨混合成单轨后再依次播放,可以这样修改:
# 将每个和弦的多轨求和混合为单轨 H0_mono = H0.sum(axis=0) H5_mono = H5.sum(axis=0) H7_mono = H7.sum(axis=0) H9_mono = H9.sum(axis=0) # 拼接单轨音频 added_sample_mono = np.concatenate([H0_mono, H7_mono, H9_mono, H5_mono]) ipd.Audio(added_sample_mono, rate=F)
内容的提问来源于stack exchange,提问作者user20693776
相关产品推荐
相关产品推荐

