C# WinForm使用乐器数字接口

继续,前面已经实现了C#调用Windows API实现了弹出对话框功能。使用了User32.dll文件,主要代码如下:

[DllImport("User32.dll")]
public static extern int MessageBox(int h, string m, string c, int type);
详情请参考:http://hovertree.com/h/bjaf/psjdasa2.htm

效果如下:

也练习了调用winmm.dll播放wav声音文件,主要代码:
[DllImport("winmm.dll")]
private static extern int sndPlaySoundA(byte[] lpszSoundName, int uFlags);

详情参考:http://hovertree.com/h/bjaf/jeg0ytf5.htm

效果图:

接下来继续练习调用别API,就调用winmm.dll的midi播放功能吧。

MIDI(Musical Instrument Digital Interface)乐器数字接口 ,是20 世纪80 年代初为解决电声乐器之间的通信问题而提出的。MIDI是编曲界最广泛的音乐标准格式,可称为“计算机能理解的乐谱”。它用音符的数字控制信号来记录音乐。一首完整的MIDI音乐只有几十KB大,而能包含数十条音乐轨道。几乎所有的现代音乐都是用MIDI加上音色库来制作合成的。MIDI 传输的不是声音信号, 而是音符、控制参数等指令, 它指示MIDI 设备要做什么,怎么做, 如演奏哪个音符、多大音量等。它们被统一表示成MIDI 消息(MIDI Message) 。传输时采用异步串行通信, 标准通信波特率为31.25×( 1±0.01) KBaud。

所以调用API播放midi也是按照格式指定播放指令。接下来就测试实现midi功能。

首先是打开midi输出设备的API:
MMRESULT midiOutOpen(
LPHMIDIOUT lphmo,
UINT uDeviceID,
DWORD_PTR dwCallback,
DWORD_PTR dwCallbackInstance,
DWORD dwFlags
);
详情请看:http://hovertree.com/h/bjaf/tug59e9l.htm

在C#中调用该API:
[DllImport("winmm.dll")]
private static extern UInt32 midiOutOpen(out UInt32 lphMidiOut, uint uDeviceID, UInt32 dwCallback, UInt32 dwInstance, UInt32 dwFlags);

其中lphMidiOut 为设备的句柄 ,在后面播放声音会用到。

然后是向设备发送播放指令API:
MMRESULT midiOutShortMsg(
HMIDIOUT hmo,
DWORD dwMsg
);
详情请参考:http://hovertree.com/h/bjaf/4ext7m8l.htm

在C#中调用:
[DllImport("winmm.dll")]
private static extern UInt32 midiOutShortMsg(UInt32 hMidiOut, UInt32 dwMsg);

这里hMidiOut就是midiOutOpen方法的lphMidiOut
接下来就封装这些API,进行。

Midi输出设备,之后打开后才能播放声音,在封装的类HewenqiMidi中加一个状态,表示设备是否打开,代码为:private bool _isOpened; 因为是调用API,所以设备有一个句柄,也就是上面提到的lphMidiOut ,所以类中加一个设备句柄字段,句柄的类型为32位无符号整形UNIT,参考:http://hovertree.com/h/bjaf/exee7473.htm,代码为:private uint _deviceHandle; 用来存储midiOutOpen获得的句柄lphMidiOut,这两个字段可以封装为属性,只读的属性。

接下来,实现设备的打开功能,主要代码:
uint h_Device;
uint h_r = midiOutOpen(out h_Device, 0, 0, 0, 0);
当h_r等与0时,表示打开成功,否则打开不成功,具体返回值可以参考:http://hovertree.com/h/bjaf/tug59e9l.htm

播放声音的方法:
public uint ShortPlay(uint msg)
{
if (_isOpened)
return midiOutShortMsg(_deviceHandle, msg);
else
return 621;
}
先检查设备是否已经打开,打开了就播放声音,返回0表示成功。参考:http://hovertree.com/h/bjaf/37iovb7c.htm

参数msg表示要播放的声音,这个参数可以包含音量和音高等信息,详情请参考:
http://hovertree.com/h/bjaf/4ext7m8l.htm
根据这个参数构造以下方法:

/// <summary>
/// 播放声音
/// </summary>
/// <param name="key">音高(音调)</param>
/// <param name="volume">音量</param>
/// <param name="chenel">通道</param>
/// <returns></returns>
public uint ShortPlay(uint key, uint volume, uint chenel)
{
return ShortPlay(144 + key * 256 + volume * 65536 + chenel);
}

这样就可以方便调节播放的音量和音高了。当然还有可以设置音色,先放到后边介绍。

打开MIDI设备后,要怎么关闭呢?也是调用API:
midiOutClose(
hMidiOut: HMIDIOUT {设备句柄}
)
详情:http://hovertree.com/h/bjaf/gmn82vlo.htm

在C#中调用:
[DllImport("winmm.dll")]
private static extern UInt32 midiOutClose(UInt32 hMidiOut);
返回0表示成功

接着,使用HewenqiMidi 类,建立一个WinForm 窗体,测试播放功能。如下图所示:

演示下载地址:http://hovertree.com/h/bjaf/xy6rbg5m.htm

源码发布到这个网址:http://hovertree.net/

转自:http://hovertree.com/h/bjaf/dg7nbe4t.htm

时间: 2024-10-20 00:31:15

C# WinForm使用乐器数字接口的相关文章

Winform调用百度地图接口简单示例

1.首先用一个html文件调用百度地图接口(主要注册一个序列号):   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head>

Winform调用百度地图接口

using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace BaiDuMap { public partial class Form1 : Form { public Form

(五十二)c#Winform自定义控件-LED数字

前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 如果觉得写的还行,请点个 star 支持一下吧 欢迎前来交流探讨: 企鹅群568015492  麻烦博客下方点个[推荐],谢谢 NuGet Install-Package HZH_Con

winform小程序------数字猜大小(经典线程和自动生成控件的小例子)

一:上图 二:相关代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace gessNumGame { public partial class Form1 : F

声音文件格式、常见的数字音频格式

数字声音在计算机中存储和处理时,其数据必须以文件的形式进行组织,所选用 的文件格式必须得到操作系统和应用软件的支持.不同计算机一级应用软件中使用的声音文件格式也互不相同. 常见的数字音频格式   音频格式 说明 1 Wave(.WAV) 是微软公司开 发的一种声音文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持.WAV格式支持许多压缩算法,支持多种音频 位数.采样频率和声道,采用44.1kHz的采样频率,16位量化位数,跟CD一样,对存储空间需求太大不便

常见的多媒体文件格式几种类型

常见的多媒体文件格式类型 多媒体技术从根本上改变了昔日基于字符的各种计算机处理,动感十足的图象.声音给计算机带来了无限生机.多媒体技术的核心就是使用计算机综合处理声音.文字.图象等多媒体信息,使得计算机更富有娱乐性.更趋人性化. 3.图(常见图像文件名后缀) BMP(*.bmp):一种位图(BitMap)文件格式,它是一组点(像素)组成的图像,Windows系统下的标准位图格式,使用很普遍.其结构简单,未经过压缩,一般图像文件会比较大.它最大的好处就是能被大多数软件“接受”,可称为通用格式. 常

word20161214

MAC, Message Authentication Code / 消息验证代码 MAC address / MAC 地址 machine-centric / 机器中心的 Macintosh-accessible volume / Macintosh 可访问卷 Macintosh-style permissions / Macintosh 风格的权限 MADCAP, Multicast Address Dynamic Client Allocation Protocol / 多播地址动态客户端

Java API 各个包的内容解释

java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类. java.awt 包含用于创建用户界面和绘制图形图像的所有类. java.awt.color 提供用于颜色空间的类. java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类. java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关

Java sun的JDK

JDK概述 JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品.自从Java推出以来,JDK已经成为使用最广泛的Java SDK(Software development kit). JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具和Java基础的类库(rt.jar).不论什么Java应用服务器实质都是内置了某个版本的JDK.因此掌握 JDK是学好Java的第一步.