C# 调用 winmm.dll 播放 midi 文件

2024-05-13 00:20

本文主要是介绍C# 调用 winmm.dll 播放 midi 文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在C#中调用 winmm.dll(Windows Multimedia Library)来播放 MIDI 文件通常涉及使用mciSendString 函数,该函数是 winmm.dll 中提供的一个函数,用于发送 MCI(Media Control Interface)命令给MCI设备。

但是,需要注意的是,直接通过 mciSendString 播放 MIDI 文件可能需要一些特定的设置和配置,因为MIDI通常是通过MIDI输出设备(如声卡上的MIDI端口或MIDI合成器)来播放的,而不是通过默认的音频输出设备。

以下是一个简单的示例 play_mid.cs,说明如何在C#中使用 P/Invoke 调用 mciSendString 函数来尝试播放 MIDI 文件:

using System; 
using System.Text; 
using System.Runtime.InteropServices;  class MidiPlayer  
{  // 导入 mciSendString 函数  [DllImport("winmm.dll")]  private static extern int mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);  // 播放MIDI文件的函数  public static void PlayMidi(string midiFileName)  {  const int bufferSize = 128;  StringBuilder returnBuffer = new StringBuilder(bufferSize);  // 构建MCI命令来打开并播放MIDI文件  string command = "open \"" + midiFileName + "\" type sequencer alias myMid";  if (mciSendString(command, returnBuffer, bufferSize, IntPtr.Zero) != 0)  {  Console.WriteLine("Error open MIDI file: " + returnBuffer.ToString());  return;  }  // 构建MCI命令来播放MIDI文件  command = "play myMid";  if (mciSendString(command, returnBuffer, bufferSize, IntPtr.Zero) != 0)  {  Console.WriteLine("Error play MIDI file: " + returnBuffer.ToString());  return;  }  // 如果你想要等待MIDI播放完成,你可能需要轮询状态或使用其他同步机制 }  static void Main(string[] args)  {  if (args.Length <1){Console.WriteLine(" usage: play_mid.exe file1.mid ");return;}  string midiFilePath = args[0];Console.WriteLine("play: " + midiFilePath);PlayMidi(midiFilePath); Console.ReadLine();}  
}

where csc
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe

编译  csc play_mid.cs

运行 play_mid.exe  test1.mid

C# 直接调用 OpenFileDialog,打开文件夹,选择*.mid文件,并播放。

编写  open_mid.cs  如下

// open a midi file
using System;
using System.Diagnostics;
using System.Windows.Forms;public class OpenMidFile
{[STAThread]public static void Main(){OpenFileDialog ofd = new OpenFileDialog();// 设置对话框属性ofd.Title = "请选择.mid文件";// 设置初始目录ofd.InitialDirectory = "D:\\Music";// 设置文件过滤器ofd.Filter = "mid files (*.mid)|*.mid";ofd.FilterIndex = 1; // 设置默认的文件过滤器索引ofd.RestoreDirectory = true; // 设置在关闭对话框前还原目录if (ofd.ShowDialog() == DialogResult.OK) // 显示对话框{// 获取选中的文件路径string filePath = ofd.FileName;//Console.WriteLine("playing: " +filePath);ProcessStartInfo startInfo = new ProcessStartInfo("play_mid.exe");startInfo.Arguments = " " +filePath;startInfo.UseShellExecute = false;Process process = Process.Start(startInfo);process.WaitForExit();} else {Console.WriteLine("Select null");}}
}

编译  csc /r:System.Windows.Forms.dll /target:winexe open_mid.cs

运行  open_mid.exe

这篇关于C# 调用 winmm.dll 播放 midi 文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984155

相关文章

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

通过C#获取Excel单元格的数据类型的方法详解

《通过C#获取Excel单元格的数据类型的方法详解》在处理Excel文件时,了解单元格的数据类型有助于我们正确地解析和处理数据,本文将详细介绍如何使用FreeSpire.XLS来获取Excel单元格的... 目录引言环境配置6种常见数据类型C# 读取单元格数据类型引言在处理 Excel 文件时,了解单元格

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL