打印

求助!提供几款音乐播放芯片

[复制链接]
3508|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinghan|  楼主 | 2008-8-30 14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
tyw| | 2008-8-30 18:27 | 只看该作者

参考一下

和弦芯片C520的结构与典型应用
杭州职业技术学院 黄睿 

1 和弦铃声概述  
和弦原来是乐理上的一个概念,指的是按照三度关系叠置起来的三个或三个以上的音的结合;而在音频器材的工业设计领域中,和弦指的是多个音源同时发音,也叫复音、多音(polyphony)。和弦铃声在手机中得到了广泛的应用,它的音色饱满圆润,立体感强,已经全面取代了以往的单音铃声。目前和弦铃声文件格式有多种,如MIDI、MMF、AMR、MP3、IMY等,其中MIDI是目前支持度最高的铃音文件格式,它的文件占用空间小,表现力强,几乎已经成为目前和弦铃声手机的标准配置。
手机中的MIDI和弦音乐是通过内置高集成度的和弦芯片播放MIDI音乐文件来实现的。和弦芯片使用的声音合成和音色调用方式决定了铃声的播放效果。早期的FM(Frequency Modulation)合成法将多个频率的单音组成复合音来模拟各种乐器的声音,产生的声音音色少、音质差。另一种是波形表(wavetable)合成法。这种方法是先把各种真正乐器的音乐录制下来再进行合成处理,音色好,音域广。根据波表产生方式的不同分为软件和弦和硬件和弦两种。软件和弦比硬件和弦节省系统开销,更容易集成到移动设备上。
目前手机市场有多种和弦控制芯片,使用较多的有日本的Yamaha,我国台湾的华邦和旺宏、大陆的中星微和智多微。各个公司的和弦芯片都有自己的特点,其中智多微的C520能够支持民族乐器播放,所以选用C520作和弦音乐控制。
2 C520和弦芯片
C520是上海智多微电子有限公司的一款和弦芯片,专门用于为手机提供清脆逼真的音乐铃声和丰富游戏音效。该芯片集成了64和弦、16音色波表和21首中国民乐,具有3D立体声环绕增效的MIDI合成器、MIDI GM预置ROM、16位高性能音频数模转换器和2/4位ADPCM解码器等功能。
2.1 芯片特点
相对于市场上的其他手机和弦芯片,C520具有以下几个特点:
① 能够通过片上的音乐合成器对输入MIDI信号合成,或者通过ADPCM解调器对输入的ADPCM信号解调,然后通过内置的DAC输出波形。
② 集成了高质量的MIDI GM音色库,容量高达3 Mb;提供GM音色库之外的民族乐器音色库,支持二胡、古筝、琵琶等20多种民族乐器;支持多音色和复音——最多同时支持16个音色和64复音。
③ 具有多个功能端口,可支持手机振动驱动及LCD背光驱动,可用于播放音乐同步的PWM来控制七彩灯。
④ 与主控端的接口可以是并行接口或者串行接口;允许芯片工作于DAC输入模式,接受兼容通用串行DAC数据格式的输入数据;片内集成不同输入数据的FIFO;待机模式下典型工作电流小于50 μA。
2.2 功能单元
整个芯片由IOU(I/O接口单元)、 SG(音乐合成器)、ADEC(ADPCM解调器)、TG(时钟模块)和ANALOG(逻辑)模块组成。
IOU完成与外部CPU的接口,控制内部的FIFO以及芯片其他功能接口;形成音乐的MIDI数据以及外部CPU对芯片的控制命令也是通过IOU中的寄存器送出。SG模块从IOU的FIFO中取的MIDI数据,采用波表合成的方式合成音乐。ADEC接收经过压缩的PCM数据,根据相应的控制信号进行解码,将解码后的16位PCM码输出至SG的DSP单元。TG对输入时钟倍频以及产生内部时钟。ANALOG包括一个DAC和对DAC的输出信号进行低通滤波以及功率放大的AMP。C520芯片内部结构如图1所示。

图1 C520内部结构框图 

3 应用
3.1 典型电路
控制CPU选用三星公司的32位RISC芯片S3C4510B。该芯片是专为嵌入式以太网应用开发的,内核为ARM7TDMI,支持高代码密度的THUMB指令集,适用于对价格及功耗敏感的应用场合。  
C520与S3C4510B可以是并行接口或者串行接口,但是并行接口比串行接口数据传输速度快,因此在本设计中采用并行接口。芯片应用电路如图2所示。

图2典型应用电路 

在这个电路中,C520的CS_N用S3C4510B的I/O P0进行控制。其实如果在片选信号线够用的情况下,可选择S3C4510B中ROM/SRAM/Flash片选信号 Nrcs[5∶0]中的任何一根信号线,这样可以节省1根GPIO;同理,如果不想再控制C520复位,可以将其复位信号与S3C4510B的复位线nRESET相连,这样S3C4510B与C520将在上电时同时复位;C520 PD脚是低功耗状态控制引脚,“1”为正常工作状态,“0”为进入低功耗状态;C520 IRQ脚为中断输出脚,其可连接S3C4510B的外部中断请求信号脚XINTREQ[0]。
3.2 芯片初始化
C520的初始化工作非常简单,包括:
① 根据外部时钟设置PLL分频比。PLL分频比由寄存器CLOCK(read:10h/write:11h)和寄存器Master Clock(read:18h/write:19h)共同决定。内部时钟频率fsys=fclock·(DN+1)/(DM+1)。其中DM为寄存器CLOCK[4∶0],DN为寄存器Master clock tuning[5∶0],fclock是外部输入时钟,内部系统时钟频率fsys必须定在48 MHz~50 MHz之间。 
② 打开模拟模块,向寄存器Analog Power Down(read:66h/write:67h)的bit3写0。
③ 设置Analog Select,根据寄存器Analog Select(read:60h/ write:61h)选择模拟功能。
3.3 播放MIDI音乐文件
C520可以播放MIDI FORMAT 0和MMD格式的MIDI文件。
MIDI FORMAT 0文件开头4字节数据ASCII值为“MThd”,MMD文件开头4字节数据ASCII值为“MMhd”。ARM发送这两种格式的MIDI数据过程不同,在发送前根据文件开头4字节数据进行区分。  发送MIDI FORMAT 0格式的MIDI文件,文件中的所有数据都要发送。
MMD格式的文件,可分为四块,每块的开头都有8字节的头数据部分。第1块头数据部分前4字节的ASCII码值是“MMhd”,第2块头数据部分前4字节的 ASCII 码值是 “MMly”, 第 3 块头数据部分前 4 字节的ASCII码值是“MMdd”。第4块头数据部分前4字节的ASCII码值是“MMex”。每一块头数据的第5、6、7、8字节是这块数据的长度(不包括头数据),第5字节是低字节位,第8字节是高字节位,这4个字节组成的十六进制数据加上头数据长度8,就是这块数据的长度。MMdd块数据的头数据后面就是经过压缩的MIDI数据;MMly块数据是用于卡拉OK的专用数据,播放MIDI时无须发送该块;Mmex为扩展块。
向C520发送MMD格式的MIDI数据时,先发送MMhd块,接着发送MMdd块的MIDI数据部分(即该块中除块名及块长度的部分),而MMly块不用发送。
图3为播放MIDI文件流程。

图3播放MIDI文件流程

结语
本文介绍了智多微公司的手机和弦芯片C520,给出了其原理及内部结构图。采用三星的RISC芯片S3C4510B做控制器,实现了和弦音乐的播放。文中给出了详细的电路原理图和播放MIDI音乐文件的流程,可以作为和弦芯片在移动产品上的应用参考。


 
本文摘自《EDN电子设计技术》

使用特权

评论回复
板凳
xinghan|  楼主 | 2008-8-30 23:25 | 只看该作者

谢谢。。。

自己制作一款类似的产品可能有点难。。。

使用特权

评论回复
地板
tyw| | 2008-8-31 14:54 | 只看该作者

俺96年用89c52+ym3812做过一个midi驱动器

ym3812是8bit声卡里叫opl2的音源芯片.
随着ram,rom价格直线下跌,midi驱动器逐渐失去优势,mp3播放器才几十元钱的身价哦,再去开发midi驱动器似乎钱景不大.

使用特权

评论回复
5
xinghan|  楼主 | 2008-9-1 12:40 | 只看该作者

非常感谢楼上,能提供技术资料吗

da我想自己做一款类似产品,用单片机和雅马哈的芯片,你能不能给我提供一些帮助,这是我的邮箱xinghan1984@hotmail.com,方便的话MSN

使用特权

评论回复
6
tyw| | 2008-9-1 14:26 | 只看该作者

去收

现在ym3812不大好找了
你得先确定音源芯片,找到datasheet才有戏.

使用特权

评论回复
7
xinghan|  楼主 | 2008-9-2 17:10 | 只看该作者

回楼上:找到手册了,你说的是现在市场上很难买到了?

使用特权

评论回复
8
tyw| | 2008-9-2 21:44 | 只看该作者

这里有一个midi文件格式很有用的

 

 

 

http://www.myfaq.com.cn/A/2001-12-20/8449.html

 


 

MIDI 文件结构

Chunks


MIDI 文件由 chunks 组成:
每个chunk 的组成: 

类型 

长度

数据 

4 字节 

4 字节 

(前面规定的)长度
  • A 4-字节 chunk 类型 (ASCII) 
  • A 4-byte 长度(32 位, msb first) 
  • (前面规定的)长度数据 

有两种类型的 chunks :
Header Chunks 
有一个chunk标志“MThd”
Track Chunks 
有一个chunk标志“MTrk”
一个 MIDI文件由一个header chunk和紧接的一个或多个track chunks组成。
在chunks结构中,自长度区以后是严格规定好的。它可能容纳的chunks除了“MThd”或“MTrk”其它的将被忽略。MIDI说明书要求软件能够处理意想不到的chunk,并忽略掉整个chunk。 


<---Chunk---> 


类型

长度

数据

MIDI
文件

MThd 


<格式> 

<tracks> 

<division> 

MTrk 

<长度> 

<delta_time> <event> ... 


MTrk 

<长度> 

<delta_time> <event> ... 

数值表示法


在MIDI 文件中,除了基本的MIDI数据,还有一个变化的数据(类型)。如: delta-times 和 meta-events。
这里有一些关于这样的数的一些资料,它们有通常有下面1~2种格式:

二进制数


二进制数的存贮:
  • 每个字节8位 
  • MSB first (最左方的字节权(或数位)大) 

(除非其它的描述) 

可变长度数


这个可变长度数是为了方便表示任意大的整数,而不必创建固定宽度的整数。 
一个可变长度数被表示为连续的7位数据。从最高位到最低位,最后一个字节bit7等于0,前面的字节bit7等于1。
例: 


可变长度数 

十进制 

十六进制 

二进制 

二进制 

十六进制 


abcd 

aaaabbbbccccdddd 

100000aa 1aabbbbc 0cccdddd 


0
:
127 

00
:
7F 

0000 0000
:
0111 1111 

0000 0000
:
0111 1111 

00
:
7F 

128
:
16383 

80
:
3FFF 

00000000 10000000
:
00111111 11111111 

10000001 00000000
:
11111111 01111111 

81 00
:
FF 7F 

1000 

03E8 

11 1110 1000 

10000111 01101000 

87 68 

100000 

0F4240 

1111 0100 0010 0100 0000 

10111101 10000100 01000000 

BD 84 40 

如此,你可以从上面的例子发现:小的数(0~127)可以用一个字节表示。而(比较)大的数也可以表示出来。
在MIDI 文件中,最大的数是0FFF,FFFF。这个规定了可变长度数允许利用32位整数。

Header Chunks


Header chunk 数据部分包括3个16位(数据)区。这个区域描述:( MIDI 文件)格式、track 的数量和 MIDI 的时间设置。 
Header chunk的长度是6个字节。无论如何软件必须遵循这个原则。即使它大于预期的,任何意料外的数据被忽略。

Header Chunk 

Chunk 类型

长度 

数据 

4 字节 
(ASCII)

4 字节 
(32位二进制数)

<-- 长度(= 6字节) --> 

16位

16位

16位

MThd 

<长度> 

<格式> 

<tracks> 

<division> 

<长度> 
Chunk数据部分的长度。 
这是一个32位二进制数, MSB first. 
这在 MIDI  1.0文件说明书中规定为6。不过,考虑到将来的扩充,(希望)任何MIDI文件的作者能够应付大的Header chunks。
<格式> 
MIDI 文件的格式。 
这是 一个16位二进制数, MSB first。 
有效的格式是: 0、 1 和 2 。
<tracks> 
MIDI 文件中track chunk的数量。 
这是 一个16位二进制数, MSB first。 
<division> 
这个定义在MIDI 文件中(一个)单位的 delta-time数。 
这是 一个16位二进制数, MSB first。 
有下列两者之一的的格式,依赖于最高位值。  


15 

14 ... 8 

7 ... 0

<division> 


1/4音符tick数


-帧/秒

ticks / 帧

bit 15 = 0: 
bits 0-14 
每个1/4音符的 delta-time 数。
bit 15 = 1: 
bits 0-7 
每个  SMTPE 帧的 delta-time 数。
bits 8-14 
负数,表示每秒中SMTPE 帧的数量。有效数应符合MTC Quarter Frame消息。
   -24 = 24 帧/秒
   -25 = 25 帧/秒
   -29 = 30 帧/秒, drop frame
   -30 = 30 帧/秒, non-drop frame

MIDI File Formats


MIDI 文件有3种变化: 
  • 格式 0 
    …容纳单一的Track。 
  • 格式1 
    …容纳一个和多个同步的Track(所有的Track同时播放)。 
  • 格式2 
    …容纳一个和多个独立的Track(所有的Track独立播放)。 

MIDI 文件格式 0


格式0 MIDI 文件包括一个Header-Chunk 和一个 Track-Chunk。
这个 Track-Chunk 包括所有的音符和节拍消息。

MIDI 文件格式 1


格式1 MIDI 文件包括一个Header-Chunk 和多个 Track-Chunk,所有的Track同时播放。
格式1 中第一个Track是专用的。它看成“Tempo Map”。它包括所有的 meta-event :拍子记号拍子音序/Track 名称音序号标记SMTPE偏移量。在格式1中(这些)将放入在第一个 track 中。 

MIDI 文件格式 2


格式2 MIDI 文件包括一个Header-Chunk 和多个 Track-Chunk,每个Track表现出独立的次序。

Track Chunks


Track chunk 的数据部分由一对和多对 <delta-time> <event> 组成。 <delta-time>是必须的,0是有效的 delta-time。

Track Chunk 

类型

长度

数据 

4 字节 
(ASCII) 

4 字节 
(32位二进制数) 

<-- 长度--> 
(二进制数) 

MTrk 

<长度> 

<delta-time> <event> ... 

<delta-time> 
相对于前一个事件的“tick”,是一个可变长度数。
<event> 
下列之一: 
·   <midi   事件>
·   <sysex 事件>
·   <meta 事件>

事件


注意:在 <delta-time> 和 <event>之间,没有明确的分隔符。这个是因为 delta-times 和event有一个长度定义。  
  • Delta-time 定义最后一个字节的最高位等于0。 
  • MIDI Channel 消息有一个长度定义。 
  • Sysex-events 和 meta-events 有一个清楚的长度区。 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

95

帖子

0

粉丝