Jupyter Notebook中实时播放自定义音符的Python实现需求问询
解决方案:Jupyter Notebook中实时播放动态生成的音符
步骤1:安装依赖库
你用的是Anaconda环境,直接打开Anaconda Prompt执行以下命令即可完成安装,无需复杂配置:
conda install numpy sounddevice -y
这两个库都是Anaconda官方维护的,不会出现第三方库常见的依赖冲突问题,适合命令行操作不熟悉的场景。
步骤2:核心实现代码
在Jupyter Notebook中运行以下代码,定义满足你需求的playNote函数:
import numpy as np import sounddevice as sd # 音名到频率的映射(基于十二平均律,A4=440Hz) note_freq_map = { 'C': 261.63, 'C#': 277.18, 'Db': 277.18, 'D': 293.66, 'D#': 311.13, 'Eb': 311.13, 'E': 329.63, 'F': 349.23, 'F#': 369.99, 'Gb': 369.99, 'G': 392.00, 'G#': 415.30, 'Ab': 415.30, 'A': 440.00, 'A#': 466.16, 'Bb': 466.16, 'B': 493.88 } def playNote(pitch, duration_ms, volume=0.5): sample_rate = 44100 # 标准音频采样率 duration_s = duration_ms / 1000.0 # 将毫秒转为秒 # 处理音高输入:支持MIDI编号或音名字符串 if isinstance(pitch, int): # MIDI转频率公式:f = 440 * 2^((pitch - 69)/12) freq = 440 * (2 ** ((pitch - 69) / 12)) elif isinstance(pitch, str): pitch_upper = pitch.strip().upper() if pitch_upper not in note_freq_map: raise ValueError(f"不支持该音名:{pitch},请使用'F#'、'Db'这类格式") freq = note_freq_map[pitch_upper] else: raise TypeError("音高参数需为MIDI整数或音名字符串") # 动态生成正弦波音频 t = np.linspace(0, duration_s, int(sample_rate * duration_s), endpoint=False) audio = volume * np.sin(2 * np.pi * freq * t) # 即时播放,后台自动处理无需生成文件 sd.play(audio, sample_rate) sd.wait() # 等待播放完成,连续播放可注释此行
步骤3:使用示例
- 按音名播放:
playNote('F#', 1000, 0.2) # F#音,时长1000毫秒,音量0.2
- 按MIDI编号播放(你提到的中音F#对应MIDI 46,和上面的音名频率一致):
playNote(46, 1000, 0.2)
- 随机生成音高和时长:
import random random_note = random.choice(list(note_freq_map.keys())) playNote(random_note, random.randint(500, 2000), 0.2)
补充说明
- 所有音频都是动态生成,无需预存文件,完全符合即时播放需求。
- 音量参数建议设置在0-1之间,避免出现爆音;你之前示例中的
2可调整为0.2这类合理值。 - 若要连续播放多个音符且不阻塞Jupyter运行,可去掉
sd.wait(),但需注意音符间的间隔控制。 - 正弦波是最基础的波形,满足你最低需求;之后若想更换音色(如方波、三角波),只需修改
audio = ...行的波形生成逻辑即可。
内容的提问来源于stack exchange,提问作者lrnr
相关产品推荐
相关产品推荐

