基于雅马哈YM2149的简单MIDI音源实现
前言
最近因为病毒的原因一直蜗居在家里,闲来无事想起去年买来放在家里落灰的YM2149,于是本着没事也得找事做的原则打算制作一个简易的MIDI音源。废话不多说,下面就来详细介绍一下该MIDI音源。(本文章分为芯片介绍,驱动编写和成品展示三部分。)
芯片介绍
YM2149是一款雅马哈研发的三通道软件控制声音发生器(SSG),通过CPU向寄存器中写入数据来控制芯片产生不同频率的方波/噪声。YM2149还内置了一个包络发生器,因此该芯片可以输出不同的音色。当然,最出名的还是YM2149的孪生兄弟AY-3-8910,在APPLE II和Atari 520ST等设备上都有使用。相比于AY-3-8910,YM2149拥有更高的输入时钟频率以及双分辨率但双速率的音量包络表。
驱动编写(建议配合数据手册查看)
总览
1.DA7-DA0
这八个脚是双向数据口,芯片通过这八个脚读取传入的命令/数据。
2.BDIR,BC1和BC2
这三个脚控制从双向数据口读取八位值是寄存器地址还是要写入寄存器地址的数据。通过下表来配置:
注:Inactive为高阻模式,此时发送到双向数据口的数据均认为是无效。
3.A8,A9
地址选择脚。当A8和A9分别接5V和地时,芯片强制使用默认器件地址0000。芯片本身是有自己特定的器件地址的,但是我们无法知道一些来源不明的芯片的器件地址,因此我们只能使用默认地址来操作芯片。(注:可以通过编写特定的程序来测出芯片实际器件地址,但是我懒x)
4.RESET
把这个脚按照时序拉低一段时间就可以使芯片复位。
5.CLOCK
此脚接外部晶振,一般接4Mhz晶振即可。
6.SEL
该脚电平为高时,系统时钟不分频,为低时2分频。
例:SEL为低,CLOCK脚外接4Mhz,那麽实际输入为2Mhz。
7.ANALOG CHANNEL A-C
音频输出口。
8.IOA/B
可以让芯片读取其他器件发来的数据,这里我们不使用。
9.TEST
测试脚,不使用。
总览
1.R0-R5
A-C通道输出的音频频率,计算公式如下:
Ft是要得到的频率,fMaster是总时钟频率,TP是寄存器中的值。
例如:要得到440HZ的输出频率,当fMaster = 2Mhz时通过计算可得TP = 284,转化为十六进制填入寄存器中即可。(注意一个通道由两个寄存器控制频率,前一个寄存器为低八位,后一个为高四位。)
2.R6
噪声输出频率,计算方式同上,但注意频率仅由R6寄存器的低五位控制,注意取值范围。
3.R7
混合器(直译),可以将噪声与音乐混合输出,每个通道都可以独立配置。写“0”为输出,写“1”为禁止输出。
例如:A通道只输出噪声,就把B3置“0”,B0置”1“,以此类推。
4.R8-RA
配置音频输出音量大小,每个通道均可独立配置。B4为模式位,置0时音量大小由B0-B4的值控制,置1时由包络控制(这个包络控制比较复杂,我在这里不细说了,对此感兴趣的可以自己去了解)。
5.RB-RC
包络频率控制,没玩懂就不再这细述了。。。
6.RD
包络线样式控制,一共有10种包络可选。
注意4,5,6是要连在一起去了解的,由于没有相关的专业知识我也不知道该如何去调制,这里就不再细讲了
终于到了激动人心的驱动编写时刻,我使用的是德仪的TM4C123系列单片机进行控制,由于这款单片机过于小众,我就不把代码放出来了,主要是通过自然语言+伪代码的方式来说明。
如何往地址中写入数据
首先来看芯片的时序表:
然后看芯片写寄存器地址时序:
注意这里有两点要关注,一是地址设置时间tAS,二是地址保持时间tAH。这里我们可以这样去编写:
BDIR = 1;BC1 =1;BC2 = 1;进入地址模式
发送地址数据到双向数据口
BDIR = 0;BC1 =1;BC2 = 0;进入高阻模式
以上三步即可使芯片读取到正确的寄存器地址并进入。
接下来是写入数据,
注意这里有三点点要er关注,一是数据设置时间tDS,二是数据信号时间tDW,三是数据保持时间tDH。这里我们可以这样去编写:
发送数据到双向数据口
BDIR = 1;BC1 =0;BC2 = 1;进入数据写模式
BDIR = 0;BC1 =1;BC2 = 0;进入高阻模式
以上三步即可使芯片读取到正确数据并写入前面进入的寄存器地址中。
如此,即可完成一次对寄存器的写操作。
剩下的工作就是按照功能编写相应函数进行封装即可。
如何复位
进行MIDI通讯
我是参照这两个来编写的
Arduino模拟MIDI键盘
用步进电机搭建MIDI播放设备
成品展示
组装好的样子:
原理图
PCB正面
PCB背面
音频播放展示
https://cdn.jsdelivr.net/gh/Lyxikun/lanthanum-database/AUDIO/YM_2149-9dewanmeisuanshujiaoshi.mp3
第一次在网上码了这么多字,如果由描述不当/错误的地方还请大家多指教