【问题标题】:How do I translate a numpy array to polyphonic music?如何将 numpy 数组转换为和弦音乐?
【发布时间】:2012-07-19 05:36:52
【问题描述】:

我想使用数组来播放音乐/声音。输出的音乐/声音需要是和弦的。

我试过这个:

from scipy.io.wavfile import write
import numpy as np

duration=0.24
amp=1E4
rate=44100

def note(freq, duration, amp, rate):
    t = np.linspace(0, duration, duration * rate)
    data = np.sin(2*np.pi*freq*t)*amp
    return data.astype(np.int16) # two byte integers

tone0 = note(0, duration, amp, rate) #silence
tone1 = note(261.63, duration, amp, rate) # C4
tone2 = note(329.63, duration, amp, rate) # E4
tone3 = note(392.00, duration, amp, rate) # G4


seq1 = np.concatenate((tone1,tone0,tone0,tone0, tone1),axis=1)
seq2 = np.concatenate((tone0,tone2,tone0,tone0, tone2),axis=1)
seq3 = np.concatenate((tone0,tone0,tone3,tone0, tone3),axis=1)

song = np.dstack((seq1,seq2,seq3))

write('song.wav', 44100, song)

我想播放 song.wav 文件,然后依次听到音符 C、E 和 G,然后是静音,然后是 C 和弦(C、E、G 音符同时播放)。

我得到的是 write 函数的错误。没关系,因为 write 功能(据我所知,它不能创建复音 wav 文件)。

以防万一,错误是:

Traceback (most recent call last):
  File "music2.py", line 26, in <module>
    write('song.wav', 44100, song)
  File "/usr/lib/python2.7/dist-packages/scipy/io/wavfile.py", line 168, in write
    fid.write(struct.pack('<ihHIIHH', 16, 1, noc, rate, sbytes, ba, bits))
struct.error: 'I' format requires 0 <= number <= 4294967295
  1. 您知道支持复音的 write 函数的替代方法吗?
  2. 我愿意完全替代我的代码。重要的一点是从一个 numpy 数组生成(或播放)复音。我正在尝试做这样的事情:http://img44.imageshack.us/img44/6182/music.swf,但要简单得多;不是图形用户界面;不是交互式的,与 1 和 0 数组的概念相同,即行已分配、特定的声音/音符以及播放这些音符的时间的列代码。

【问题讨论】:

    标签: python arrays numpy audio scipy


    【解决方案1】:

    您遇到的错误是由于write 只需要一个一维或二维数组。您传递给它的是一个 3 维数组(dstack 的输出是 3D)。

    我不确定我明白你所说的复音是什么意思,但如果你只是想让不同的音调相互叠加,那么你需要做的就是叠加波形:

    song = seq1 + seq2 + seq3 # Assumes seqs are of same length
    

    最后你可能想要传递一个一维数组。 2-D 数组适用于您想要编写立体声音的情况。

    【讨论】:

    • 您好 Isaac,感谢您注意到 dstack 返回一个 3D 数组。我需要一个二维数组。复音意味着不同的声音/频率同时发声。我想我不能简单地对“seq*”数组求和,因为我会得到噪音而不是和弦。事实上,我尝试了你的解决方案,对于孤立音符来说没问题,但我得到的不是 C 和弦,而是一个糟糕的声音。
    • 我自己试过了,它似乎可以正常工作:三个音依次排列,然后全部放在一起。我正在使用您的代码,但用我的“song = ”行代替了您的代码。
    • 是的,它按预期工作,除了当所有声音一起播放时,声音就像噪音。你听到“好听”的声音了吗?...让我检查一下所选频率是否正常。
    • 对不起艾萨克,你是对的!我错误地改变了幅度。您的解决方案是正确的。现在我必须看看如何消除每个音符末尾的“咔哒”声。非常感谢!
    • 要消除“咔哒”声,您应该确保波形在音符结尾处归零(以防止扬声器响起)。对于更高频率的声音,您应该在音调结束时平滑地将幅度逐渐减小到零。
    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 2011-12-17
    • 2017-07-21
    • 1970-01-01
    • 2022-10-25
    • 2021-12-18
    • 2019-10-19
    • 2022-10-30
    相关资源
    最近更新 更多