简易版  登录 注册

基于YM3812的简易MIDI合成器(芯片部分)

LiuXIkun 2020/6/12 16:01:57 #1

基于YM3812的简易MIDI合成器(芯片部分)

注意:文章中有些公式目前显示不出来

前言

本文主要是对芯片做介绍,之后还有设计思路,成品展示以及如何调制出想要音色的教程。本中会出现大量专有名词的编者图省事而自创的词,前者有不懂的话建议配合搜索引擎阅读,后者,,,,,看编者之后能不能想到更形象的词来替代了,强烈建议配合数据手册去查看。

附:一些用这个简易合成器播放的音乐:

μs-爱上你万岁

残酷天使的行动纲领(这首除了鼓组以外都是)

芯片介绍

​ YM3812(OPL2)是一款在1985年由雅马哈研发基于FM音频合成的音乐芯片,其广泛使用在以IBM PC 为载体的独立声卡上。其中最著名的就是ADLIB声卡,当年一些低端的雅马哈电子琴上也可以见到该芯片。该芯片有⑨个通道,每个通道由两个振荡器组成。或者由6个声道和5种打击乐器组成。每个振荡器都可以产生正弦波,也可以将其修改为其他3种波形:一种是像半波整流后的波形,一种是像全波整流后的波形,还有一种是伪锯齿波。这种奇怪的产生波形的方式为YM3812提供了独特的声音,对于上个世纪80年代中后期的游戏爱好者来说,该芯片产生的独特声音可以说是刻在了DNA当中。

关于FM合成

这个编者也是三脚猫功夫,就不在这献丑了:),感兴趣的可以看这篇文章

有能者也可以看看John Chowning教授关于FM音频合成的论文

​ 简单说一下吧,FM调制原理大概就是用一个信号去调制另一个信号的频率。说白了这里的FM跟我们平常听的FM广播是一个东西,只不过广播的频率不在人的听觉频率范围内且我们听到的是解调过后的信号,而这里提到的FM频率是在人的听觉范围内且我们听到的是调制后的信号。

芯片介绍(建议配合数据手册查看)

数据手册及相关资料:

YM3812选型手册

YM3812应用手册

YM3014数据手册

首先来看芯片管脚功能

总览

点击此处打开图片

注意:这里的读取读取的是YM3812的中断状态寄存器,其他寄存器不能读取

5.IRQ

默认低电平,当芯片的定时器溢出时产生中断信号(低电平)。这个中断信号可以被程序屏蔽。

6.IC

复位芯片,包括清除所有寄存器中的值。

7.MO

YM3812的13位串行数字音频信号输出,需要外置DAC转化。

8.GND,VCC

地和电源。


读写控制

点击此处打开图片

​ 由上图可以看到,每个通道对应两个槽(第一二行),这里槽就代替了算子实现了控制信号的功能。而表格中第三行指的是槽之间的联系,1是指调制波注3,2指载波注3。倒数两行是不同槽对应的寄存器地址,通过向寄存器中写入数据控制槽输出的信号频率。

[^注2]: 以下简称“算子” [^注3]: 参见“关于FM合成”这一章中的链接

寄存器介绍

注:($xx)指寄存器地址

总览

点击此处打开图片


4.AM/VIB/EG-TYP/KSR/Multiple($20~35)

| D7 | D6 | D5 | D4 | D3 D2 D1 D0 |
| AM | VIB | EG-Typ | KSR | MULTIPLE |

1):MULTIPLE:载波和调制波的倍频系数。参数如下表:

| MUL | Multiple | MUL | Multiple | MUL | Multiple | MUL | Multiple |
| 0 | 1/2 | 4 | 4 | 8 | 8 | C | 12 |
| 1 | 1 | 5 | 5 | 9 | 9 | D | 12 |
| 2 | 2 | 6 | 6 | A | 10 | E | 15 |
| 3 | 3 | 7 | 7 | B | 10 | F | 15 |

​ MUL:填入寄存器的值

​ Multiple:倍频系数

公式:
$$
输出信号F(t) = Esin(ωft+Isin(iωft))
$$

  • ωf:信号频率(F-number)

  • I:载波倍频系数

  • i:调制波倍频系数

  • 2):KSR:键缩放率。通过改变ADSR包络中的AD速率使得芯片发出的声音更接近真正乐器的声音(大致意思)

    | D4 | N | Rks | N | Rks | N | Rks | N | Rks |
    | 0 | 0 | 0 | 4 | 1 | 8 | 2 | 12 | 3 |
    | 0 | 1 | 0 | 5 | 1 | 9 | 2 | 13 | 3 |
    | 0 | 2 | 0 | 6 | 1 | 10 | 2 | 14 | 3 |
    | 0 | 3 | 0 | 7 | 1 | 11 | 2 | 15 | 3 |
    | 1*1 | 0 | 0 | 4 | 4 | 8 | 8 | 12 | 12 |
    | 1*1 | 1 | 1 | 5 | 5 | 9 | 9 | 13 | 13 |
    | 1*1 | 2 | 2 | 6 | 6 | 10 | 10 | 14 | 14 |
    | 1*1 | 3 | 3 | 7 | 7 | 11 | 11 | 15 | 15 |

    注:N为键缩放数

    [^\*1]: 手册中这里的值为0,但我根据对KSR的描述怀疑是手册上写错了,故这里改为1

    $$
    RATE = 4*R+Rks
    $$

  • R:ADSR包络的值
  • Rks:键缩放偏移值
  • 3):EG-TYP:控制尾音消失的方式。置1时键盘什么时候松开声音什么时候消失;置0时声音在键盘按下时逐渐消失。

    点击此处打开图片

    注:所需音量可由下列公式得到:

    2):KSL:一些乐器的响度会伴随着音调的升高而减弱,通过改变KSL的值可以模 拟出这一效果

    点击此处打开图片

    如上图所示,我们可以把ADSR四个参数看成关于时间t的分段函数.
    $$
    Volume(t) = \begin{cases} Attack(t)\ Decay(t)\Sustain(t)\Release(t)\end{cases}
    $$

    通过改变这四个函数来控制响度随时间改变模拟出不同的乐器.下图是真实钢琴发出的声音,我们可以很容易看出它的ADSR包络走向:

    点击此处打开图片

    2):Sustain/Release($80~95)

    点击此处打开图片

    ​ 1):F-Number($Ax),($Bx):

    ​ 通过改变F-Number的值我们可以得到我们想要的音高.

    ​ 2):Block:控制音阶的八度关系.

    ​ 3):Key_ON:置1时产生信号,置0时停止产生信号.

    ​ 那到底如何得到想要的频率呢?

    ​ 有如下公式:

    $ fmus = fsamF2^b-1 2^{19}$
    $fsam = {fM \over 72}$

  • fmus:所需频率

  • fsam:采样频率

  • F:F-number值

  • b:block值

  • fM:主时钟频率

  • 7.Feedback/Connection($C0~$C8)

    点击此处打开图片

    2):Feedback:调制因数

    点击此处打开图片

    1):Rhythm:置1时,启用节奏乐器

    点击此处打开图片

    之前说FM调制时通过正弦波来调制,但其实任意波形都可.YM3812内置了四种波形供使用者使用:

    芯片介绍部分结束,其中既有手册中的内容也有编者按照自己的理解加入的内容,其中可能有很多错误,希望读者们能多多指出.(之后还有三篇后续要写(超级大坑).

    LiuXIkun 2020/6/12 16:29:43 #2

    本站MarkDown里的Latex怎么搞啊,,,复制入站说明里的样例也不行,,,,

    C_Gear 2020/6/13 18:10:15 #3

    >

    回复给LiuXIkun: 值得注意的是,实际上在YM3812内部只有一个算子,所有的音频通道通过复用这一个算子来产生声音。

    请问“只有一个算子”怎么理解呢?是说类似于这个唯一的算子会频繁切换状态做所有逻辑算子的工作?

    LiuXIkun 2020/6/16 21:06:36 #4

    回复给C_Gear: 可以这么理解,我认为是类似于超线程的概念(把单个物理核心模拟成多个逻辑核心的感觉)

    C_Gear 2020/6/17 21:26:56 #5

    谢谢!
    其实OPL2这颗芯片,以及后续的OPL3(YMF262及改版YMF289)还是挺有意思的。有两点值得注意:

  • 每一个音开始时,波形的相位会重置。这会带来一个问题:某些音色会出现因为这个重置导致瞬间电平大跳跃,引起爆音。具体讨论在这里:https://github.com/adplug/adplug/issues/84

  • 某一个音色,只有最高四个八度的#C和#G能发出特别的效果,这个效果轩辕剑二、枫之舞和仙剑里用到了。这个特效对频率要求比较严格,只能容忍很小的偏移范围,超过后这种特效就不存在了。不知道其背后的原理如何。具体讨论在这里:https://github.com/adplug/adplug/issues/70

  • Designed by @ZephRay. Made by @ntzyz.
    Copyright (c) 2016-2020 cnVintage Team.