当前位置: 首页 > 编程语言 > C#

在C#中播放MIDI声音的最佳方式Share

时间:2023-04-11 00:50:26 C#

在C#中播放MIDI声音的最佳方式我遇到的一个问题是播放用于表示节拍器“点击”的midi文件。我在网上找到了几篇关于在.NET中播放MIDI的文章,但大多数文章似乎都依赖于某人拼凑并提供的自定义库。我不反对使用这些,但我宁愿自己了解这是如何完成的,因为它看起来应该是一个非常微不足道的练习。那么,我错过了什么吗?还是很难在.NET应用程序中使用MIDI?我认为您需要p/invoke到windowsapi才能播放.net中的midi文件。这篇代码项目文章很好地解释了如何做到这一点:vb.net文章播放midi文件要将其覆盖为c#,您需要mciSendString的以下导入语句:[DllImport("winmm.dll")]staticexternInt32mciSendString(字符串命令,StringBuilder缓冲区,Int32bufferSize,IntPtrhwndCallback);希望这有帮助,祝你好运!我目前正在开发一个C#MIDI应用程序,其他人都是对的——您需要使用p/invoke来实现这一点。我正在滚动我自己的,因为它似乎更适合该应用程序(我只需要一小组MIDI函数),但出于您的目的,C#MIDI工具包可能更适合。它至少是我找到的最好的.NETMIDI库,在开始一个项目之前我进行了广泛的搜索。midi-dot-net让我在几分钟内启动并运行-对于我的家庭项目来说足够轻巧。它也可以在GitHub上找到。(不要与前面提到的MIDI.NET混淆,它看起来很有前途,但我从来没有抽出时间去做。)当然,NAudio(上面也提到过)有很多功能,但就像最初的海报一样,我只是想玩一些注释并快速阅读和理解源代码。我不能声称对此了解很多,但我不认为这很简单-DotNetRocks名人卡尔富兰克林做了很多-你看过他的DNRTV吗?您可以使用媒体播放器:usingWMPLib;//...WindowsMediaPlayerwmp=newWindowsMediaPlayer();wmp.URL=Path.Combine(Application.StartupPath,"Resources/mymidi1.mid");wmp.controls.play();最近添加的是MIDI.NET,支持Midi端口、Midi文件和SysEx。系统。媒体。SoundPlayer是一种播放WAV文件的简单方法。WAV文件比MIDI有一些优势,其中之一就是您可以精确地控制每个乐器的声音(而不是依赖于计算机的内置合成器)。对于.NET中的大量MIDI和Wave操作,我认为放弃NAudio是解决方案(也可通过NuGet获得)。抱歉,这个问题现在有点老了,但以下对我有用(有点从使用MCISendString的Win32-Midi循环复制):[DllImport("winmm.dll")]staticexternInt32mciSendString(Stringcommand,StringBuilderbuffer,Int32bufferSize,IntPtrhwndCallback);publicstaticvoidplayMidi(StringfileName,Stringalias){mciSendString("open"+fileName+"typesequenceralias"+alias,newStringBuilder(),0,newIntPtr());mciSendString("play"+别名,newStringBuilder(),0,newIntPtr());}publicstaticvoidstopMidi(Stringalias){mciSendString("stop"+alias,null,0,newIntPtr());mciSendString("close"+alias,null,0,newIntPtr());}这是命令字符串的完整列表。这个很酷的部分是你可以使用不同的东西来播放不同的东西,而不是音序器,例如用于播放.wav文件的waveaudio。我不知道如何让它播放.mp3。另请注意,停止和关闭命令必须在发送打开和播放命令的同一线程上发送,否则它们将无效并且文件将保持打开状态。例如:以上就是《C#学习教程:用C#播放MIDI声音的最佳方式》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——[DllImport("winmm.dll")]staticexternInt32mciSendString(Stringcommand,StringBuilderbuffer,Int32bufferSize,IntPtrhwnd回调);publicstaticDictionaryplayingMidi=newDictionary();publicstaticvoidPlayMidi(StringfileName,Stringalias){if(playingMidi.ContainsKey(alias))thrownewException("Midiwithalias'"+alias+"'isalreadyplaying");playingMidi.Add(别名,false);ThreadstoppingThread=newThread(()=>{StartAndStopMidiWithDelay(fileName,alias);});stoppingThread.Start();}publicstaticvoidStopMidiFromOtherThread(Stringalias){if(!playingMidi.ContainsKey(alias))return;playingMidi[别名]=true;}publicstaticboolisPlaying(Stringalias){returnplayingMidi.ContainsKey(alias);}privatestaticvoidStartAndStopMidiWithDelay(StringfileName,Stringalias){mciSendString("open"+fileName+"typesequenceralias"+ali作为,空,0,新的IntPtr());mciSendString("play"+alias,null,0,newIntPtr());StringBuilder结果=newStringBuilder(100);mciSendString("set"+alias+"时间格式毫秒",null,0,newIntPtr());mciSendString("status"+alias+"length",result,100,newIntPtr());intmidiLengthInMilliseconds;Int32.TryParse(result.ToString(),outmidiLengthInMilliseconds);秒表定时器=new秒表();定时器。开始();while(timer.ElapsedMilliseconds本文采集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。