This program generates sound by using FM tone generator YMF825 via SPI.
fmif.c@0:c54d59d6fb78, 2018-01-05 (annotated)
- Committer:
- hasebems
- Date:
- Fri Jan 05 22:58:49 2018 +0000
- Revision:
- 0:c54d59d6fb78
???????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hasebems | 0:c54d59d6fb78 | 1 | // fmif.c |
hasebems | 0:c54d59d6fb78 | 2 | #include "fmpart.h" |
hasebems | 0:c54d59d6fb78 | 3 | |
hasebems | 0:c54d59d6fb78 | 4 | // Variable |
hasebems | 0:c54d59d6fb78 | 5 | static Part _part; |
hasebems | 0:c54d59d6fb78 | 6 | static unsigned char _midiCmdCounter; |
hasebems | 0:c54d59d6fb78 | 7 | static unsigned char _midiStatus; |
hasebems | 0:c54d59d6fb78 | 8 | static unsigned char _midiDataByte1; |
hasebems | 0:c54d59d6fb78 | 9 | static unsigned char _midiDataByte2; |
hasebems | 0:c54d59d6fb78 | 10 | |
hasebems | 0:c54d59d6fb78 | 11 | // Prototype |
hasebems | 0:c54d59d6fb78 | 12 | static void receiveDataByte( unsigned char byteStream ); |
hasebems | 0:c54d59d6fb78 | 13 | static void generateMidiCmd(void); |
hasebems | 0:c54d59d6fb78 | 14 | |
hasebems | 0:c54d59d6fb78 | 15 | void Fmdriver_init( void ) |
hasebems | 0:c54d59d6fb78 | 16 | { |
hasebems | 0:c54d59d6fb78 | 17 | _midiCmdCounter = 0; |
hasebems | 0:c54d59d6fb78 | 18 | _midiStatus = 0; |
hasebems | 0:c54d59d6fb78 | 19 | _midiDataByte1 = 0; |
hasebems | 0:c54d59d6fb78 | 20 | _midiDataByte2 = 0; |
hasebems | 0:c54d59d6fb78 | 21 | |
hasebems | 0:c54d59d6fb78 | 22 | Part_init(&_part); |
hasebems | 0:c54d59d6fb78 | 23 | Part_pc(&_part,0); |
hasebems | 0:c54d59d6fb78 | 24 | } |
hasebems | 0:c54d59d6fb78 | 25 | void Fmdriver_sendMidi( unsigned char byteStream ) |
hasebems | 0:c54d59d6fb78 | 26 | { |
hasebems | 0:c54d59d6fb78 | 27 | if ( byteStream & 0x80 ){ |
hasebems | 0:c54d59d6fb78 | 28 | if ( byteStream == 0xf7 ){ |
hasebems | 0:c54d59d6fb78 | 29 | Tone_sendTone(); |
hasebems | 0:c54d59d6fb78 | 30 | _midiStatus = 0; |
hasebems | 0:c54d59d6fb78 | 31 | _midiCmdCounter = 0; |
hasebems | 0:c54d59d6fb78 | 32 | } |
hasebems | 0:c54d59d6fb78 | 33 | else { |
hasebems | 0:c54d59d6fb78 | 34 | _midiStatus = byteStream; |
hasebems | 0:c54d59d6fb78 | 35 | _midiCmdCounter = 1; |
hasebems | 0:c54d59d6fb78 | 36 | } |
hasebems | 0:c54d59d6fb78 | 37 | } |
hasebems | 0:c54d59d6fb78 | 38 | else if ( _midiStatus == 0xf0 ){ |
hasebems | 0:c54d59d6fb78 | 39 | Tone_setToneExc(byteStream,_midiCmdCounter); |
hasebems | 0:c54d59d6fb78 | 40 | _midiCmdCounter += 1; |
hasebems | 0:c54d59d6fb78 | 41 | } |
hasebems | 0:c54d59d6fb78 | 42 | else if ( _midiStatus != 0 ){ |
hasebems | 0:c54d59d6fb78 | 43 | receiveDataByte(byteStream); |
hasebems | 0:c54d59d6fb78 | 44 | } |
hasebems | 0:c54d59d6fb78 | 45 | } |
hasebems | 0:c54d59d6fb78 | 46 | static void receiveDataByte( unsigned char byteStream ) |
hasebems | 0:c54d59d6fb78 | 47 | { |
hasebems | 0:c54d59d6fb78 | 48 | switch (_midiCmdCounter){ |
hasebems | 0:c54d59d6fb78 | 49 | case 0: case 1:{ |
hasebems | 0:c54d59d6fb78 | 50 | _midiDataByte1 = byteStream; |
hasebems | 0:c54d59d6fb78 | 51 | switch ( _midiStatus & 0xf0 ){ |
hasebems | 0:c54d59d6fb78 | 52 | case 0xc0: case 0xd0:{ |
hasebems | 0:c54d59d6fb78 | 53 | _midiCmdCounter = 0; |
hasebems | 0:c54d59d6fb78 | 54 | generateMidiCmd(); |
hasebems | 0:c54d59d6fb78 | 55 | break; |
hasebems | 0:c54d59d6fb78 | 56 | } |
hasebems | 0:c54d59d6fb78 | 57 | default:{ |
hasebems | 0:c54d59d6fb78 | 58 | _midiCmdCounter = 2; |
hasebems | 0:c54d59d6fb78 | 59 | break; |
hasebems | 0:c54d59d6fb78 | 60 | } |
hasebems | 0:c54d59d6fb78 | 61 | } |
hasebems | 0:c54d59d6fb78 | 62 | break; |
hasebems | 0:c54d59d6fb78 | 63 | } |
hasebems | 0:c54d59d6fb78 | 64 | case 2:{ |
hasebems | 0:c54d59d6fb78 | 65 | _midiDataByte2 = byteStream; |
hasebems | 0:c54d59d6fb78 | 66 | _midiCmdCounter = 0; |
hasebems | 0:c54d59d6fb78 | 67 | generateMidiCmd(); |
hasebems | 0:c54d59d6fb78 | 68 | break; |
hasebems | 0:c54d59d6fb78 | 69 | } |
hasebems | 0:c54d59d6fb78 | 70 | default: break; |
hasebems | 0:c54d59d6fb78 | 71 | } |
hasebems | 0:c54d59d6fb78 | 72 | } |
hasebems | 0:c54d59d6fb78 | 73 | static void generateMidiCmd( void ) |
hasebems | 0:c54d59d6fb78 | 74 | { |
hasebems | 0:c54d59d6fb78 | 75 | switch ( _midiStatus ){ // receive only MIDI ch.1 |
hasebems | 0:c54d59d6fb78 | 76 | case 0x80: Part_note( &_part, _midiDataByte1, 0 ); break; |
hasebems | 0:c54d59d6fb78 | 77 | case 0x90: Part_note( &_part, _midiDataByte1, _midiDataByte2 ); break; |
hasebems | 0:c54d59d6fb78 | 78 | case 0xb0: Part_cc( &_part, _midiDataByte1, _midiDataByte2 ); break; |
hasebems | 0:c54d59d6fb78 | 79 | case 0xc0: Part_pc( &_part, _midiDataByte1 ); break; |
hasebems | 0:c54d59d6fb78 | 80 | case 0xe0: Part_pbend( &_part, _midiDataByte1, _midiDataByte2 ); break; |
hasebems | 0:c54d59d6fb78 | 81 | default: break; |
hasebems | 0:c54d59d6fb78 | 82 | } |
hasebems | 0:c54d59d6fb78 | 83 | } |
hasebems | 0:c54d59d6fb78 | 84 |