写入wav文件会发出咔哒声

2024-09-29 02:20:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有创建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是一个描述音符及其频率的dict。melodyNote对象的数组。除了在停顿时发出奇怪的咔嗒声之外,一切正常。据我所知,这与抽样率有关。但我不知道如何更改代码以避免暂停。这是旋律: https://drive.google.com/open?id=1e03VC90w5WF4QdU-VxrV906dl_c3UvSQ


Tags: sample代码nameselfdatalenrategenerate
2条回答

如果我猜的话,我认为这可能与音符的长度有时甚至不是音符频率的倍数有关。因此,注释的sin(end_time)有时可能导致相对较大的值:在最坏的情况下32768。 这个频率的音量突然下降可能是你听到的咔哒声/咯咯声的原因。你知道吗

只有当int((volume)*math.sin(freq*math.pi*float(i)/float(SAMPLE_RATE)))的计算结果接近0时终止notes才能消除大部分噪声,如果是这样的话。你知道吗

如果你是说音符间令人不快的咔哒声:那是完全正常的。你知道吗

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

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

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包含了一个相当详细的解释,说明了如何获得越来越好的音调。你知道吗

相关问题 更多 >