首先我不是PRO程序员,但只是一名学生,他对一个优秀的图书馆Midi-Dot-Net有点小问题。Midi-dot-net声音播放两次
我使用一个Midi-Dot-Net库在C#语言的Visual Studio中编写一个简单的应用程序。但我坚持一个非常混乱的问题。
我把一些代码到Form1.cs的
public void NoteOn(NoteOnMessage msg) {
if (InvokeRequired) {
BeginInvoke(noteOnHandler, msg);
return;
}
inputStatusLabel.Text = String.Format("{0}", msg.Pitch);
String nutka = inputStatusLabel.Text;
if (nutka == "A0") {
clock.Schedule(new NoteOnMessage(outputDevice, Channel.Channel1, Pitch.A0, 80, 2));
}
}
所以,我把新的String,并把它称为nutka,并nutka将收到我的USB MIDI键盘按下的音符名。然后,我放置IF声明,并将nutka与“A0”(键盘上的第一个音符)进行比较。
然后如果是“A0”,我按下我的outputDevice播放特定的音符。它播放,但它播放两次,一次 - 当我按下键盘(注意A0)键盘和第二次 - 当我释放该键。
我在public void NoteOn(NoteOnMessage msg)
上做了一个断点,并注意到应用程序在这里返回两次并播放两次该音符,但仍不知道为什么。
还有一件事,有一种方法public void NoteOff(NoteOffMessage message)
,但它似乎不工作。
我真的不知道,我正在寻找任何帮助。
UPDATE ...... UPDATE ... UPDATE
出现的另一个问题(第一部分就解决了由于CL和克里斯·达纳韦建议和步进一步一步贾斯汀解释)。
谢谢贾斯汀:)我看到生活没有任何问题是不可能的:)
随着clock.Schedule
我只能发挥将MIDI声音,但我要玩例如钢琴音符(WAV文件格式)和4- 5 星期我的大学会帮助我为每个音符录制自己的钢琴声音。我也想同时玩。
我认为一切都会好起来,现在......同时玩的问题。我试图检查三种可能性:
1)我是想弹钢琴,从基本的笔记库中的声音,我有和使用声音播放它:
SoundPlayer noteA0 = new SoundPlayer(Properties.Resources.A0);
noteA0.Play();
我用它的每一个音符语句不同的SoundPlayer名称(取决于音符名称),我注意到的是 - 我无法同时播放音符。
2)所以我用下一个WMP库和WindowsMediaPlayer中:
例如:
var noteA0 = new WMPLib.WindowsMediaPlayer();
noteA0.URL = @"c:\sounds\piano\A0.wav";
好吧......它起着同时,但它看起来更笔记我玩或者我只是播放歌曲我得到的更大的延迟,finnaly我的程序卡住玩什么...
3)我试图使用Microsoft.DirectX.AudioVideoPlayback:
Audio noteA1 = new Audio(@"C:\sounds\piano\A1.wav");
noteA1.Play();
我开始了我的程序,按下了键和繁荣!一个错误消息崩溃:
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)
我当然没忘了用:
using System.Media;
using Microsoft.DirectX.AudioVideoPlayback;
using Microsoft.DirectX;
现在,我不知道我能做些什么更多的,并再次 - 我需要的帮助经验的人:)
一个Velocity“音符关闭”的测试中,我不明白'Invoke'一部分,你不应该调用'NoteOn'?什么是'noteOnHandler'?你怎么称呼'NoteOn'?来自哪里? – Sinatr
我有一个完整的源使用:[链接](https://code.google.com/p/midi-dot-net/source/browse/trunk#trunk%2FGUIDemo)我eddited form1.cs和项目取决于在Midi文件夹中也放置在上面的链接中。 – Martin
您正在编辑的程序需要用户按窗口窗体上的播放按钮。通过使用MIDI键盘,您可以有效地演奏音符,但也可以将事件发送到“NoteOn”方法,然后在您调用clock.Schedule时触发第二个音符。总之,您正在编辑的程序可能不是您尝试实现的正确起点。 – Paul