加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 编写wav文件可以发出咔嗒声

发布时间:2020-12-20 11:05:14 所属栏目:Python 来源:网络整理
导读:我有这个代码用于创建wav文件: class Note: def __init__(self,name,octave,duration): self.name = name self.octave = octave self.duration = durationSAMPLE_RATE = 44100wav = wave.open("starw.wav",mode="w")wav.setparams((1,2,SAMPLE_RATE,SAMPLE_
我有这个代码用于创建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

解决方法

如果你的意思是音符之间发出令人不快的咔哒声:那是完全正常的.

即使在专门用于生成音乐的编程语言中,如果您只是在整个持续时间内将块与具有一定固定幅度的(正弦)波并置,也会发生这种效应.

下面是一个音符结束时的样子草图,下一个音符开始:

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))“mollifier”因素,这些因素导致斜升/衰减.

但是你再次看到音符之间的间隙看起来变得更大,如果你试图让不同音符的音程相交,那么它们就会变得相当混乱和复杂,而你最好还是选择一种编程语言或者已经知道如何正确操作的库.我认为Chuck manual包含了一个相当详细的解释,说明如何获得越来越好的发音音符.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读