MIDI音乐,看这一篇就够了

目录

1: 进入MIDI的世界

2: MIDI的发展历程

2.1: 从混乱到统一

2.2: 从载波调制到波表合成

2.2.1: 几个著名的硬件波表合成器

2.3: 软件合成器诞生至今

2.3.1: SoundFont

3: MIDI文件格式

4: 现在MIDI还有什么用途?

5: 总结


1: 进入MIDI的世界

Musical Instrumemt Digital Interface,乐器数字接口,是人们在1980年代为了降低音乐爱好者们创作音乐成本而发明的音乐合成技术,人们在家用廉价的键盘(黑白键)就能弹奏出乐曲,而不用动辄巨款去购买乐器,甚至数万RMB的钢琴也能用最低1000元以下的MIDI键盘代替。只需要用MIDI数据线将键盘与电脑声卡或者音乐合成器连接在一起,即可开始你的创作。

MIDI键盘
带MIDI接口的合成器

MIDI的工作原理是实时地将你音符的音高、长度、音量等信号发送到电脑的声卡(现在的声卡已经没有MIDI接口了)或者音乐合成器里,并以音频的形式输出,或者记录在电脑文件里。

2: MIDI的发展历程

2.1: 从混乱到统一

早期的MIDI并没有统一标准,具体由各个硬件厂商自己实现指令。这也就存在着严重的弊端:将不同品牌的键盘和合成器连在一起,就可能会导致音高不准、乐器不对等各种错误。例如,你用雅马哈的键盘连接Roland合成器,设置成钢琴音色,但有可能弹出萨克斯的声音。为了解决此冲突,Roland公司率领大家制定了MIDI统一标准:GS。后来又陆续制定了GM(General Midi)、GM2、XG(eXtended General midi)标准,其中以GM2最流行。

2.2: 从载波调制到波表合成

最初MIDI合成器是直接调制正弦波以模拟出不同乐器的音色,该方式成本极低实现难度也极低,但音质十分差,听得令人头皮发麻。追求播放质量的人们自然不会停下研发新技术的脚步。

OPL2/OPL3是最著名的FM合成器芯片标准,当时所有的声卡都采用此芯片标准。

OPL3调频合成器芯片示意图

合成Wavetable Synthesizing技术横空出世。它是将各种乐器的真实声音录制成一段又一段的PCM音频,并以哈希表 什么是哈希表 的形式逐一存储到ROM固件中,在播放时,合成器通过查表查找到对应乐器的波形,经过各种特效的处理,并播放出来。播放效果好坏取决于ROM的容量,容量越大,能够存放的波形信息就越多,播放效果就越好,成本也就越贵

2.2.1: 几个著名的硬件波表合成器

  • Roland Sound Canvas系列,包括SC-55、SC-88、SC-8820、SC-88 Pro,是Roland公司当年推出的旗舰级硬音源。
  • Yamaha MU系列,包括MU50、MU80等设备,ROM有4MB大小,效果稍逊色。
  • Creative Audio PCI声卡,有2MB、4MB、8MB的波表可选
Roland SC-88波表合成器

2.3: 软件合成器诞生至今

购买硬件合成器的成本还是太高,人们迫切需要更低成本的合成技术,因此发明了软件合成器,简称为软波表。它只能用电脑的CPU进行波形的合成,这在当时对于速度并不快的CPU是一个十分严峻的考验,所以人们还是购买了硬件。但随着CPU性能的不断提高,音乐合成对CPU的占用率越来越是微乎其微,硬件波表被逐渐淘汰,现在只有一些音乐发烧友会继续花费较高的资金购买硬件。

2.3.1: SoundFont

随着软波表的逐渐普及,于是就诞生了将波表直接保存在电脑文件里的方式,其中最著名的文件格式就是SoundFont,简称为SF,它由Creative Labs公司推出并开源,基于RIFF数据结构,应用最广泛的标准为SoundFont 2,即SF2,可用于各大音乐制作软件中。

3: MIDI文件格式

MIDI文件格式就是将MIDI信号保存成文件,内含音轨信息、乐器、音符的长度与音调等信息,不保存波形,在播放时使用合成器发出声音。因此,通常MIDI文件都很小,只有几十KiB的大小,而MP3至少需要几个MiB。MIDI文件大小只与乐曲的复杂度有关,而不涉及音质的问题。

但不同种类的合成器播放同一个MIDI文件,播放出来的音色相差甚远,而音频文件直接把波形保存下来,不改变音色。

4: 现在MIDI还有什么用途?

现在由于硬盘空间很大,人们可以很方便地下载音频,MIDI的用途变得狭窄,甚至大多数人都没听说过MIDI。但是在制作音乐时还是频繁提到这个词,它简化了音乐制作过程,不用花费高昂的金钱购买或租用乐器,降低了音乐制作成本。

5: 总结

下面我给大家列出来两个表格,就不用语言来做总结了。

合成器的对比
载波调制硬波表软波表
成本$$$$$$
效果很好较好
MIDI与音频的区别
MIDI音频
工作原理音符指令转成波形直接处理波形
播放效果较差较好
文件体积

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于STM32的MIDI音乐播放器的代码示例: ```C // 定义MIDI消息类型 #define MIDI_NOTE_ON 0x90 #define MIDI_NOTE_OFF 0x80 #define MIDI_PROGRAM_CHANGE 0xC0 // 定义MIDI事件结构体 typedef struct { uint8_t status; uint8_t data1; uint8_t data2; } MidiEvent; // 定义MIDI事件队列 #define MAX_EVENTS 16 MidiEvent midiEvents[MAX_EVENTS]; uint8_t midiEventHead = 0; uint8_t midiEventTail = 0; // 定义MIDI播放器状态 enum { MIDI_STOPPED, MIDI_PLAYING, MIDI_PAUSED }; uint8_t midiState = MIDI_STOPPED; // 定义MIDI处理函数 void handleMidiEvent(MidiEvent event) { switch (event.status & 0xF0) { case MIDI_NOTE_ON: // 处理Note On消息 break; case MIDI_NOTE_OFF: // 处理Note Off消息 break; case MIDI_PROGRAM_CHANGE: // 处理Program Change消息 break; default: // 忽略其他消息 break; } } // 定义MIDI输入回调函数 void handleMidiInput(uint8_t data) { if (midiState != MIDI_PLAYING) { // 如果没有在播放状态,忽略所有输入 return; } // 解析MIDI消息 if ((data & 0x80) == 0x80) { // 如果是状态字节 if (midiEventTail != midiEventHead) { // 如果队列还没满,加入新事件 MidiEvent event = {data, 0, 0}; midiEvents[midiEventTail] = event; midiEventTail = (midiEventTail + 1) % MAX_EVENTS; } } else { // 如果是数据字节 if (midiEventTail != midiEventHead) { // 如果队列不为空,更新最后一个事件的数据字段 MidiEvent *event = &midiEvents[midiEventTail - 1]; if (event->data1 == 0) { event->data1 = data; } else { event->data2 = data; handleMidiEvent(*event); midiEventHead = (midiEventHead + 1) % MAX_EVENTS; } } } } // 初始化MIDI播放器 void initMidiPlayer() { // 初始化MIDI输入 // ... // 初始化MIDI输出 // ... // 设置MIDI播放器状态为停止 midiState = MIDI_STOPPED; } // 开始播放MIDI文件 void playMidiFile() { // 读取MIDI文件 // ... // 解析MIDI文件 // ... // 设置MIDI播放器状态为播放 midiState = MIDI_PLAYING; } // 暂停MIDI播放器 void pauseMidiPlayer() { // 设置MIDI播放器状态为暂停 midiState = MIDI_PAUSED; } // 停止MIDI播放器 void stopMidiPlayer() { // 停止MIDI输出 // ... // 清空MIDI事件队列 midiEventHead = 0; midiEventTail = 0; // 设置MIDI播放器状态为停止 midiState = MIDI_STOPPED; } ``` 这段代码实现了一个简单的MIDI播放器,可以读取MIDI文件并播放其中的音乐。它使用了一个事件队列来缓存输入的MIDI消息,并在播放状态下处理这些消息以产生音乐。在停止或暂停状态下,它会忽略所有输入。你可以根据自己的需要修改这段代码以实现更复杂的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值