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# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

C#中的 StreamReader/StreamWriter 使用示例详解

《C#中的StreamReader/StreamWriter使用示例详解》在C#开发中,StreamReader和StreamWriter是处理文本文件的核心类,属于System.IO命名空间,本... 目录前言一、什么是 StreamReader 和 StreamWriter?1. 定义2. 特点3. 用

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务