音乐芯片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之前的变值有什么关系,这些我都搞不明白。
各位单片机的前辈,帮帮我。我先谢谢你们了。