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# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.