我想制作类似于真实乐器音频的声音.问题是我很少知道怎么做到这一点.
我所知道的远离真实乐器的是它们输出的声音很少干净.但是如何产生这种不洁的声音呢?
到目前为止,我已经做到了这一点,它产生了非常简单的声音,我不确定它是否正确地使用了alsa.
import numpy
from numpy.fft import fft, ifft
from numpy.random import random_sample
from alsaaudio import PCM, PCM_NONBLOCK, PCM_FORMAT_FLOAT_LE
pcm = PCM()#mode=PCM_NONBLOCK)
pcm.setrate(44100)
pcm.setformat(PCM_FORMAT_FLOAT_LE)
pcm.setchannels(1)
pcm.setperiodsize(4096)
def sine_wave(x, freq=100):
sample = numpy.arange(x*4096, (x+1)*4096, dtype=numpy.float32)
sample *= numpy.pi * 2 / 44100
sample *= freq
return numpy.sin(sample)
for x in xrange(1000):
sample = sine_wave(x, 100)
pcm.write(sample.tostring())
Run Code Online (Sandbox Code Playgroud) 我来使用mingus试图在python中重现一些音符.根据这里的回答,我尝试过:
from mingus.midi import fluidsynth
fluidsynth.init('/home/btc/Escritorio/SinestesiaRCB/gfx/ViolinsLong.sf2',"alsa")
fluidsynth.play_Note(64,0,100)
#Also tried with Note("C-5") and so forth
Run Code Online (Sandbox Code Playgroud)
使用其中一个sf2文件.但后来我得到了错误:
fluidsynth:warning:无法将线程设置为高优先级
fluidsynth:警告:在通道9上找不到预设[bank = 128 prog = 0]
研究了一下,这个答案说:
对于通用MIDI兼容性,默认声音字体乐器分配为0至0道和10-15的0区,0级("Acoustic Grand Piano")和9频道的0级("默认鼓组")显然,你的声音字体没有后者.如果您的MIDI文件不采用通用MIDI兼容乐器并且不尝试在通道9上播放鼓声,则无关紧要.
但除此之外,这可能会让事情变得更加清晰,我仍然不知道如何解决它.
另外,如果我使用与第一个链接的答案相同的文件,那么我得到的错误是这个(并且不知道如何解决它):
fluidsynth:warning:无法将线程设置为高优先级
fluidsynth:警告:无法将样本数据固定到RAM; 交换是可能的.
更新
使用sudo权限运行程序会删除此错误,但它不会发出声音.这样,我得到的错误是:
QStandardPaths:未设置XDG_RUNTIME_DIR,默认为'/ tmp/runtime-root'
我认为在fluidsynth驱动程序中选择的驱动程序模式可能存在问题,但我已尝试使用相同的结果(alsa,oss等).为了完整起见,我在VM中运行它,其中的其他声音在我的主机扬声器中正确再现.
但是根据这个答案,我想它应该通过传递给它正确的声音环境变量来解决.我不知道.我尝试过:
pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY python3 /home/btc/Escritorio/SinestesiaRCB/SinestesiaRCB.py
Run Code Online (Sandbox Code Playgroud)
在需要文件的完整路径的地方,因为这需要sudo权限并更改其工作目录,最后出现同样的错误:XDG_RUNTIME_DIR.
更新2
如果我使用sudo -E选项运行它,则错误将替换为新错误:
QStandardPaths:运行时目录/ run/user/1000上的错误所有权,1000而不是0
我正在读一些网页,1000用户应该是默认用户而不是root用户. …