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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于LLM的自行车道CAD

LLM&#xff08;大型语言模型&#xff09;是强大的工具。对于许多人来说&#xff0c;用语言表达愿望通常比浏览复杂的 GUI 更简单。 1、系统简介和环境搭建 urb-x.ch&#xff0c;这是一家专门从事自行车道建设的公司。轨道采用模块化构建块进行独特设计&#xff0c;可以通过多…

HCIP的学习(15)

第六章&#xff0c;BGP—边界网关协议 自治系统—AS ​ 定义&#xff1a;由一个单一的机构或组织所管理的一系列IP网络及其设备所构成的集合。 ​ AS的来源&#xff1a; 整个网络规模过大&#xff0c;会导致路由信息收敛速度过慢&#xff0c;设备对相同目标认知不同。AS之间…

全国院校及梯度排序深度解析课(免费下载-帮助更多高考生做出人生重要的选择。)

"全国院校及梯度排序深度解析课"旨在深入探讨全国院校的排名及梯度排序原理。通过系统解析各院校的学术声誉、师资力量、科研水平等因素&#xff0c;帮助学员全面了解院校排名的背后逻辑&#xff0c;为选择合适院校提供理论支持。 课程大小&#xff1a;7G 课程下载…

Java面试之分布式篇

分布式锁的实现方案 &#xff08;1&#xff09;用数据库实现分布式锁比较简单&#xff0c;就是创建一张锁表&#xff0c;数据库对字段作唯一性约束。加锁的时候&#xff0c;在锁表中增加一条记录即可&#xff1b;释放锁的时候删除锁记录就行。如果有并发请求同时提交到数据库&…

css-页面布局-定位大解析-每文一言(世界上,没有人可以支持你一辈子)

&#x1f390;每文一言 世界上,没有人可以支持你一辈子 目录 &#x1f390;每文一言 &#x1f381;css定位 &#x1f9e7;静态定位 position: static &#x1f384;相对定位 position:relative &#x1f380;绝对定位 position:absolute &#x1f383;固定定位 position…

Yoast SEO Premium插件下载,提升您的网站SEO排名

在当今数字化时代&#xff0c;网站的搜索引擎优化&#xff08;SEO&#xff09;至关重要。它不仅影响着网站的可见度&#xff0c;更直接关系到您的在线业务成功与否。如果您正在寻找一个能够显著提升网站SEO表现的工具&#xff0c;Yoast SEO Premium插件将是您的理想选择。 为什…

赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十一)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 100道 Java 基础面试题&#xff08;四十&#xff09;-CSDN博客 八十一、tcp为什么要三次握手&#xff0c;两次不行吗&#xff1f;为什么&#xff1f; TCP&#xff08;传输控制协议&#xff09;使用三次握手&#xf…

【Linux网络】Shell脚本语句

目录 一、条件语句 1.1 测试 1.2 比较整数数值 1.3 字符串比较 1.4 双中括号 1.5 ()与{} 1.6 if语句 1.7 case语句 1.8 echo命令 二、循环语句 2.1 for循环 2.2 while循环 2.3 until循环 一、条件语句 1.1 测试 格式一&#xff1a;test 条件表达式 格式二&#x…

AI技术如何提升内容生产的效率和质量

随着人工智能&#xff08;AI&#xff09;技术的不断发展和应用&#xff0c;内容生产领域也迎来了巨大的变革。AI技术在提升内容生产效率和质量方面发挥着越来越重要的作用&#xff0c;从自然语言处理到生成模型&#xff0c;AI为内容创作者和生产者带来了许多新的机会和挑战。本…

(docker)进入容器后如何使用本机gpu

首次创建容器&#xff0c;不能直接使用本机gpu 在系统终端进行如下配置&#xff1a; 1.安装NVIDIA Container Toolkit 进入Nvidia官网Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.15.0 documentation&#xff0c;安装NVIDIA Container Toolkit …

AI预测福彩3D采取887定位策略+杀断组+杀和尾+杀和值012缩水测试5月12日预测第1弹

前段时间工作太忙&#xff0c;手头上各种事情较多&#xff0c;没有静下心来对我的AI模型预测结果进行进一步分析筛选&#xff0c;导致最近连续几期与实际开奖结果相差较大。当然&#xff0c;客观来说&#xff0c;搞6码定位的确难度比较大&#xff0c;昨天跟几个常年研究3D的彩友…

OpenCV 光流法总结

0.概述 1.原理说明 2.代码实现 #include <iostream> #include <opencv2/opencv.hpp>int main(int argc, char** argv) {if(argc ! 2) {std::cerr << "Usage: " << argv[0] << " <video_path>" << std::endl;…

从零学算法2391

2391. 收集垃圾的最少总时间 给你一个下标从 0 开始的字符串数组 garbage &#xff0c;其中 garbage[i] 表示第 i 个房子的垃圾集合。garbage[i] 只包含字符 ‘M’ &#xff0c;‘P’ 和 ‘G’ &#xff0c;但可能包含多个相同字符&#xff0c;每个字符分别表示一单位的金属、纸…

商业时代杂志社投稿信箱邮箱

商业时代杂志投稿信箱邮箱 商业时代杂志 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 咨询电话&#xf…

【RAG 论文】FiD:一种将 retrieved docs 合并输入给 LM 的方法

论文&#xff1a; Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering ⭐⭐⭐⭐ EACL 2021, Facebook AI Research 论文速读 在 RAG 中&#xff0c;如何将检索出的 passages 做聚合并输入到生成模型是一个问题&#xff0c;本文提出了一…

java基础知识点总结2024版(8万字超详细整理)

java基础知识点总结2024版&#xff08;超详细整理&#xff09; 这里写目录标题 java基础知识点总结2024版&#xff08;超详细整理&#xff09;java语言的特点1.简单性2.面向对象3.分布式4.健壮性5.安全性6.体系结构中立7.可移植性8.解释性9.多线程10.动态性 初识java中的main方…

Web前端开发之JavaScript_2

条件语句三元运算符循环语句字符串数组 1. 条件语句 1.1 if语句 if (布尔值){ // “布尔值”往往由一个表达式产生&#xff0c;其中&#xff0c;赋值表达式不具备比较作用 语句; } 1.2 if...else 语句 if...else可成对单独使用&#xff0c;也可多层if...else …

十二届蓝桥杯Python组3月中/高级试题 第三题

** 十二届蓝桥杯Python组3月中/高级试题 第三题 ** 第三题&#xff08;难度系数 3&#xff0c;25 个计分点&#xff09; 提示信息&#xff1a; 心理学用“智力商数”即“IQ”来表示一个人的智力水平。经过研究划分&#xff0c;智力水平可分为7 个等级&#xff1a; 1、IQ≥140…

Java类与对象(一)

类的定义与使用 在Java中使用关键字class定义一个类&#xff0c;格式如下&#xff1a; class 类名{// 成员变量/字段/属性//成员方法/行为 }Java中类和c语言中的结构体有点类似&#xff0c; 在Java中类名一般采用大驼峰&#xff08;每个首字母大写&#xff09;的形式&#xf…

类和对象一(从封装开始讲述)

目录&#xff1a; 一.封装 二.封装扩展之包&#xff0c;自定义包 三.访问限定符 四.static成员 一.封装&#xff1a;封装&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&#xff0c;仅对外公开接口来和对象进行 交互。面向对象…