Masahiko Hasebe / microbit_ymf825

Dependencies:   microbit

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers fmif.c Source File

fmif.c

00001 // fmif.c
00002 #include    "fmpart.h"
00003 
00004 //  Variable
00005 static Part             _part;
00006 static unsigned char    _midiCmdCounter;
00007 static unsigned char    _midiStatus;
00008 static unsigned char    _midiDataByte1;
00009 static unsigned char    _midiDataByte2;
00010 
00011 //  Prototype
00012 static void receiveDataByte( unsigned char byteStream );
00013 static void generateMidiCmd(void);
00014 
00015 void Fmdriver_init( void )
00016 {
00017     _midiCmdCounter = 0;
00018     _midiStatus = 0;
00019     _midiDataByte1 = 0;
00020     _midiDataByte2 = 0;
00021 
00022     Part_init(&_part);
00023     Part_pc(&_part,0);
00024 }
00025 void Fmdriver_sendMidi( unsigned char byteStream )
00026 {
00027     if ( byteStream & 0x80 ){
00028         if ( byteStream == 0xf7 ){
00029             Tone_sendTone();
00030             _midiStatus = 0;
00031             _midiCmdCounter = 0;
00032         }
00033         else {
00034             _midiStatus = byteStream;
00035             _midiCmdCounter = 1;
00036         }
00037     }
00038     else if ( _midiStatus == 0xf0 ){
00039         Tone_setToneExc(byteStream,_midiCmdCounter);
00040         _midiCmdCounter += 1;
00041     }
00042     else if ( _midiStatus != 0 ){
00043         receiveDataByte(byteStream);
00044     }
00045 }
00046 static void receiveDataByte( unsigned char byteStream )
00047 {
00048     switch (_midiCmdCounter){
00049         case 0: case 1:{
00050             _midiDataByte1 = byteStream;
00051             switch ( _midiStatus & 0xf0 ){
00052                 case 0xc0: case 0xd0:{
00053                     _midiCmdCounter = 0;
00054                     generateMidiCmd();
00055                     break;
00056                 }
00057                 default:{
00058                     _midiCmdCounter = 2;
00059                     break;
00060                 }
00061             }
00062             break;
00063         }
00064         case 2:{
00065             _midiDataByte2 = byteStream;
00066             _midiCmdCounter = 0;
00067             generateMidiCmd();
00068             break;
00069         }
00070         default: break;
00071     }
00072 }
00073 static void generateMidiCmd( void )
00074 {
00075     switch ( _midiStatus ){ //  receive only MIDI ch.1
00076         case 0x80: Part_note( &_part, _midiDataByte1, 0 ); break;
00077         case 0x90: Part_note( &_part, _midiDataByte1, _midiDataByte2 ); break;
00078         case 0xb0: Part_cc( &_part, _midiDataByte1, _midiDataByte2 ); break;
00079         case 0xc0: Part_pc( &_part, _midiDataByte1 ); break;
00080         case 0xe0: Part_pbend( &_part, _midiDataByte1, _midiDataByte2 ); break;
00081         default: break;
00082     }
00083 }
00084