python - 写入 wav 文件会发出咔嗒声

标签 python wav

我有创建 wav 文件的代码:

class Note:
    def __init__(self,name,octave,duration):
        self.name = name
        self.octave = octave
        self.duration = duration

SAMPLE_RATE = 44100

wav = wave.open("starw.wav", mode="w")
wav.setparams((1, 2, SAMPLE_RATE , SAMPLE_RATE*4, 'NONE', 'noncompressed'))

def generate_sample(note,volume):
    freq = FREQUENCIES[note.octave][note.name]
    duration = note.duration
    total_samples = int(SAMPLE_RATE * duration)
    for i in range(0,total_samples):
        s = np.clip(int((volume)*math.sin(freq*math.pi*float(i)/float(SAMPLE_RATE))),-32768,32768)    
        data = struct.pack('<h',s)
        wav.writeframes(data)

    return data

for i,m in enumerate(melody):

    if i<len(melody)/5:
        generate_sample(m, 100+i*500)
    elif len(melody)/5<=i<=4*len(melody)/5:
        generate_sample(m, 8800)
    else:
        generate_sample(m, 8800-i*20)

FREQUENCIES 是描述音符及其频率的字典。 melody 是一组 Note 对象。除了在暂停期间会产生奇怪的咔哒声之外,一切正常。据我了解,它与采样率有关。但我不知道如何更改我的代码以避免暂停。这是旋律: https://drive.google.com/open?id=1e03VC90w5WF4QdU-VxrV906dl_c3UvSQ

最佳答案

如果您指的是音符之间令人不快的咔嗒声:那是完全正常的。

即使在专为生成音乐而设计的编程语言中,如果您简单地将 block 与在整个持续时间内具有固定振幅的(正弦)波并置,也会出现这种效果。

下面是一个音符结束、下一个音符开始时的示意图:

enter image description here

除非第一个节点意外地恰好以零结束,否则您会听到绘制在 2 处的这种“跳跃” .

为了避免这种情况,您必须实现更好的音符合成。

一个简单的解决方案是平滑地增加每个音符的振幅,然后让它平滑地衰减到最后。如果您这样做,两个音符之间的过渡会是这样的:

enter image description here

此图由以下公式生成:

  if x > 2:
    return sin((x-2) * 60) * (1 - exp(-(x-2)**2 / 0.5))
  else:
    return sin(x * 30) * (1- exp(-(x-2)**2 / 0.5))

希望您能认出 (1 - exp(-(x - tClick) ** 2 / smoothness))导致上升/衰减的“缓和剂”因素。

但是你再次看到音符之间的间隙似乎变大了,如果你试图让不同音符的音程相交,这一切都会变得相当困惑和复杂,你最好还是把已经知道如何正确执行的编程语言或库。我想Chuck manual包含关于如何获得越来越好听的音符的相当详细的解释。

关于python - 写入 wav 文件会发出咔嗒声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50612658/

相关文章:

python - 使用 Python 对 wav 文件每秒执行 FFT

java - java中的独立 channel

python - 如何在 python 中使用 keras 获得概率/置信度作为 CNN 的输出?

python - 正确使用 os.wait()?

python - 当通过子进程启动的应用程序关闭时Python执行操作

Python 脚本给出 `: No such file or directory`

python-3.x - audioop.rms(fragment, width)中的fragment和width是什么意思

c++ - 如何减少或消除通过更改 16 位 PCM 样本的 'volume' 所产生的噪音

java - 尽管列为可用格式,但将 ogg 转换为 wav 不起作用

python - 如何获取 pathlib.Path 对象的绝对路径?