关于Windows下的MIDI基础编程

作者声明:

1.由于不清楚含有引用内容的文章是否能划为原创,所以就果断标记为原创啦。

2.如果您有强烈的欲望去转载本文,希望您能在文章醒目处注明原文地址,谢谢。

正文:

寒假期间,甚为无聊。深思熟虑之下,决定拓宽一下编程知识面。由于本人音乐细胞少的要死,所以便选中了music(哪里不会学哪里)。

在之前的学习过程中,我掌握了基于C语言的控制台编程。控制台有个大毛病,丑。为了不跑题,我就只吐槽它的声音表现能力了。其实,也不能说是控制台,应该是TC框架。在如此先进的现在,TC的许多库函数和能力已经被MS给禁用了。这也导致,我的时间消耗量增加了许多。

相信,大部分中国学生都是先在TC框架下编程,你用了好长时间学会了使用一些简单的I/O函数,然后自己加工数据,生成一个安静的黑乎乎的或许功能强大的exe。当你生产了一堆这样的程序后,总有一天你会意识到,我他喵的要声音!然后第一反应,找库函数。啊,有个sound(),结果不能用。啊,有个Beep(),结果是蜂鸣器。啊,playSound(),只能播放音频文件。啊,Dsp编程,太难。啊,DirectSound,还是难。最后,你在重重雾霾之中看到了一丝亮光,MIDI。

MIDI难吗,我觉得也挺难的。但是它符合我的要求,让你do(C)你就do。MIDI((Musical Instrument Digital Interface)的一些概念性知识,这里就不赘述了。MIDI功能强大,属于系统底层API。MIDI发声的方式是驱动声卡,它能演绎出很多的音色,如果你够强,自己写个交响曲我想也是可以的。下面列出我在网上找的播放MIDI音频的过程:

① 播放MIDI音频前应先查询系统是否具备播放MIDI音频的设备

② 读出RIFF格式的MIDI文件

③ 检查MIDI音频输出设备的性能

④ 打开MIDI输出设备

⑤ 打开音频输出设备,获得设备句柄后,生成MIDI音频信息头结构

⑥ 发送MIDI消息和发送记录为结构MIDIHDR的系统特有消息,即播放MIDI音频

⑦ 播放结束后清除已准备好的MIDI音频数据块结构MIDIHDR,释放分配的资源

⑧ 关闭MIDI音频输出设备

很明显,这套流程是假设有一个MIDI文件的,这怎么算是基础呢?去除2、3甚至是1。然后你发现,就是//开-放音乐-关//,简单多了。下面给出一段网友codexy写的代码:

#include <windows.h>
#include <stdio.h>
int main(void)
{
	unsigned long result;
	HMIDIOUT handle;
	result=midiOutOpen(&handle,0,0,0,CALLBACK_NULL);
	if(result)
	{
		printf("There is an error opening the default MIDI out device!/n");
	}
    /* Output the C note (ie, sound the note) */
    midiOutShortMsg(handle, 0x00403C90);
	Sleep(2000);
    /* Output the E note */
    midiOutShortMsg(handle, 0x00404090);
	Sleep(2000);
    /* Output the G note */
    midiOutShortMsg(handle, 0x00404390);
	Sleep(2000);
    /* Here you should insert a delay so that you can hear the notes sounding */
    /* Now let's turn off those 3 notes */
    // You should know this bad way to turn off MIDI, maybe it's wrong, but you don't hear the sound. yes?
    midiOutShortMsg(handle, 0x00003C90);
    midiOutShortMsg(handle, 0x00004090);
    midiOutShortMsg(handle, 0x00004390);
     /* Close the MIDI device */
     midiOutClose(handle);
	return 0;	
}
或许,你会为其中的一些16进制数字感到迷惑,那么你应该去了解一下MIDI API函数和MIDI规范。最后给出一个网址,也是网友codexy的博文里引用到的:

 http://www.giordanobenicchi.it/midi-tech/lowmidi.htm

谢谢阅读!

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
嵌入式MIDI协议编程是指在嵌入式系统中使用MIDI音乐仪器数字接口)协议进行编程的过程。MIDI协议是一种数字通讯协议,用于在音乐电子设备之间传输音乐信息。在嵌入式系统中,我们可以利用MIDI协议来实现音乐设备、声音控制器、合成器等的通讯和控制。 在嵌入式MIDI协议编程中,我们需要首先了解MIDI协议的数据格式和通讯规则。MIDI消息一般包括状态字节和数据字节,状态字节用于表示消息类型(例如音符、控制器等),而数据字节用于传输具体的音乐信息。通过理解MIDI消息的结构和含义,我们可以在嵌入式系统中编写相应的处理逻辑。 在实际编程过程中,我们可以使用各种嵌入式开发工具和设备,如Arduino、Raspberry Pi等。通过编写相应的代码,我们可以实现MIDI输入、输出、解析和处理等功能。例如,我们可以通过MIDI输入接口接收外部音乐设备的指令,然后根据这些指令控制嵌入式系统内部的声音生成器;同时,我们也可以通过MIDI输出接口将系统内部的音乐信息传输给外部设备进行播放或控制。 总之,嵌入式MIDI协议编程是一项涉及音乐、通讯和嵌入式技术的复合性任务。通过深入了解MIDI协议和灵活运用嵌入式系统编程技术,我们可以实现各种音乐设备和系统的控制和交互,为音乐科技领域的发展做出贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值