This program generates sound by using FM tone generator YMF825 via SPI.

Dependencies:   microbit

Committer:
hasebems
Date:
Fri Jan 05 22:58:49 2018 +0000
Revision:
0:c54d59d6fb78
???????????????

Who changed what in which revision?

UserRevisionLine numberNew 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