不能和mingus一起玩

Btc*_*ces 5 python audio-player

我来使用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用户.

因此,我做了一个:

sudo chown root:root /run/user/1000
Run Code Online (Sandbox Code Playgroud)

只是尝试,然后应用程序运行没有失败,但它仍然没有响.

更新3

基于这个例子这个Q&A,我已经尝试了两次使用时间睡眠,并且raw_input在播放play_note之后(也在之前)使用它,但它仍然没有发出声音.

Btc*_*ces 1

我将回答我自己的问题,但调试/解决过程的很大一部分是通过更新完成的问题本身。

最后一部分是让它发出声音,即使等待也无法sleep使其工作。甚至在函数之前和之后都不做play_note。我可以说这个函数总是返回True,所以这个音符从一开始就应该发出声音。问题是,SF2 文件(几乎 150MB)已成功加载,或者至少看起来是这样,因为它True也返回了,并且速度肯定相当快。

解决方案

让我们在执行脚本时达到没有打印错误的程度后继续(就在问题中的更新 3 之前)。

我想检查我的脚本的 CPU 使用率,因此我top在 Linux 终端上使用并发现pulseaudio几天前正在运行:

在此输入图像描述

杀死这个进程让它终于发出声音。不过,我必须说的是,在该函数后面添加了一个time.sleep()大约秒数的函数,以便让它完整地播放该音符。0.25play_Note()