1

在用 noteOn 键事件解决问题后(谢谢贾斯汀),我注意到另外两个问题:延迟太高和不可能同时播放。

首先我使用 IF 语句:

if (nutka == "A0" && msg.Velocity != 0) {
    clock.Schedule(new NoteOnMessage(outputDevice, Channel.Channel1, Pitch.A0, 80, 2));
}

这很好用,没有延迟,但它也允许我只使用 MIDI Pitch 而不是 .wav 文件。

当我使用其他可能性播放音符时(来自添加到资源的文件):

SoundPlayer noteA0 = new SoundPlayer(Properties.Resources.A0);
noteA0.Play();

看起来和工作正常,但 SoundPlayer 不允许我同时播放音符。

我尝试的另一种方法是 WMP 库:

var noteA0 = new WMPLib.WindowsMediaPlayer();
noteA0.URL = @"c:\sounds\piano\A0.wav";

好的......它同时播放,但发生了一件有趣的事情,我播放的音符越多,延迟越大(我按下一个键和我听到声音之间的延迟),最后我的程序卡在播放任何东西(仍然收到 noteOn 消息)...看起来内存缓冲区突然消失了或类似的东西?

我试图检查的最后一件事是 DirectX 库:

Audio noteA1 = new Audio(@"C:\sounds\piano\A1.wav");
noteA1.Play();

构建和编译 - 没有问题,没有任何错误,但是当我按下我的 midi 设备上的一个键时,应用程序返回消息:

An unhandled exception of type 'System.BadImageFormatException' occurred in Midi.dll
Additional information: Could not load file or assembly 'Microsoft.DirectX.AudioVideoPlayback.dll' or one of its dependencies. 
It is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)

我的问题是- 是否可以将我的文件 (.wav) 添加到解决方案资源并延迟同时播放它们,这将允许我像使用普通钢琴一样演奏?普通钢琴我的意思是低延迟,几乎不明显的延迟。

4

0 回答 0