3137|1

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

音乐芯片MIDI方面的问题,我实在想不明白。各位大哥大姐帮帮我吧! [复制链接]

我的工作是单片机编程。我们公司的音乐芯片是DREAM的(不知道大家知道不?),然而现在老板把一个芯片的编程全部交给我做,他对这个芯片也不是很懂,只不过他对DREAM的其它型号的芯片了解。我现在把我的问题介绍如下:
现在是学习MIDI编程,但在这卡住了,实习找不到方法,而且DREAM方法给的资料不多(不知道老外怎么不喜欢给系统的资料,只是随便给几个文档)。MIDI EVENT里面不是有SYSEX EVENT吗?sysex是系统码,可在程序里面好奇怪给它定了个变量,并且给它赋值,然后控制程序的运行。贴点代码:
WORD sysex=0;        // sysex status
DWORD d;
WORD cin,ch,b1,b2,b3;
               
if(_MIDI_ReceiveEvent(&d))
{
        //d = | code | byte1 | byte2 | byte3 |
        cin=(d>>24)&0x0F;        //code index number
        ch=(d>>16)&0x0F;        //MIDI channel
        b1=(d>>16)&0x7F;        //MIDI byte1 (status)
        b2=(d>>8)&0x7F;        //MIDI byte2
        b3=d&0x7F;        //MIDI byte3
               
        if( !sysex )
        {
                if( cin==0xC )        //program change?
                {
                        if( ch==0 ) General_Preset(b2);
                        else if( ch==1 ) Rev_Preset(b2);
                        else if( ch==2 ) Chr_Preset(b2);
                        else if( ch==3 ) Dist_Preset(b2);
                        else if( ch==4 ) Pitchshift_Preset(b2);
                        else if( ch==5 ) Comp_Preset(b2);
                        else if( ch==6 ) PEQ_Preset(b2);
                        else if( ch==15 ) GEQ_Preset(b2);
                }
                else if( cin==0xB ) //control change?
                {
                        if( b2==6 || b2==38 )// data entry MSB or LSB?
                HandleNRPN(ch,_MIDI_GetNRPN(ch),_MIDI_GetNRPNvalue(ch));
                }
                else if( cin==0x4 )        //sysex start?
                {
                        if( d==0x04F07E7F ) sysex=1; //identity request?
                        else if( d==0x04F00020 ) sysex=2;        //DREAM sysex header?
                }
        }
        else        //sysex handling...
        {
                if( sysex==1 && d==0x070601F7)
                {
                        SendIdentityReply();
                        sysex=0;
                }
                else if( sysex==2 && d==0x04000107 ) sysex++;                                else if( sysex==3 && d==0x04070000 ) sysex=10;                        else if( sysex==3 && d==0x04070100 ) sysex++;
                else if( sysex==4 )
                {
                        addr=(b2<<7)+b3;        //get address                                  checksum=0x20+CODE_ID+DEVICE_ID+MODEL_ID+0x01+b1+b2+b3;
                        _wreepromStart();
                        sysex++;
                }
                  .  
                  .
                  .
          }

其中SYSEX,本来是MIDI的系统码,但在这里却给搞成了变量,并赋成了值,来控制程序的流程。并且D之前的变值有什么关系,这些我都搞不明白。

各位单片机的前辈,帮帮我。我先谢谢你们了。

最新回复

各位大哥大姐帮忙啊,  详情 回复 发表于 2007-8-24 17:35
点赞 关注

回复
举报

89

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
各位大哥大姐帮忙啊,
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表