我有这个问题:
我想在C,linux中创建一个midi合成器。由于我没有USB MIDI键盘,因此我考虑使用VMPK之类的虚拟Midi设备。我在一本书中找到了这段代码,该书还解释了如何使用portmidi库:
#include <stdio.h>
#include <portmidi.h>
#include <porttime.h>
int main() {
int cnt,i,dev;
PmError retval;
const PmDeviceInfo *info;
PmEvent msg[32];
PortMidiStream *mstream;
Pm_Initialize();
cnt = Pm_CountDevices();
if(cnt) {
for(i=0; i < cnt; i++){
info = Pm_GetDeviceInfo(i);
if(info->input)
printf("%d: %s \n", i, info->name);
}
printf("choose device: ");
scanf("%d", &dev);
Pt_Start(1, NULL, NULL);
retval = Pm_OpenInput(&mstream, dev, NULL, 512L, NULL,NULL);
if(retval != pmNoError)
printf("error: %s \n", Pm_GetErrorText(retval));
else {
while(Pt_Time(NULL) < 60000){
if(Pm_Poll(mstream)) {
cnt = Pm_Read(mstream, msg, 32);
for(i=0; i<cnt; i++) {
printf("status:%d, byte1=%d, "
"byte2=%d, time=%.3f\n",
Pm_MessageStatus(msg[i].message),
Pm_MessageData1(msg[i].message),
Pm_MessageData2(msg[i].message),
msg[i].timestamp/1000.);
}
}
}
}
Pm_Close(mstream);
}
}
else printf("No MIDI devices found\n");
Pm_Terminate();
return 0;
}
简而言之,一旦程序与MIDI输入设备连接,它就会侦听60条来自它们的所有消息(作为Midi协议(protocol)打印状态字节和两个数据字节)
当我启动VMPK时,该程序似乎将VMPK显示为midi输入,名称为“out”。
Program output
我还检查了“JACK音频连接”程序,以验证VMPK是否作为MIDI输入设备显示出来。
JACK audio output
我不明白为什么当我从VMPK键盘上按下某个键时,我没有从程序中收到任何消息...
我试图更改VMPK配置,但是没有任何更改。
VMPK configuration menu
也许我在VMPK配置中做错了。
欢迎任何帮助。
我预先感谢您的到来
最佳答案
好的,我发现了问题。正如我所说,我设置了VMPK严重不足。如果以此方式设置,则可以检测MIDI输入
这是programm的输出:
关于linux - Pm_Read()无法读取VMPK输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62249015/