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

Dependencies:   microbit

Revision:
0:c54d59d6fb78
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fmif.c	Fri Jan 05 22:58:49 2018 +0000
@@ -0,0 +1,84 @@
+// fmif.c
+#include	"fmpart.h"
+
+//	Variable
+static Part				_part;
+static unsigned char	_midiCmdCounter;
+static unsigned char	_midiStatus;
+static unsigned char	_midiDataByte1;
+static unsigned char	_midiDataByte2;
+
+//	Prototype
+static void receiveDataByte( unsigned char byteStream );
+static void	generateMidiCmd(void);
+
+void Fmdriver_init( void )
+{
+	_midiCmdCounter = 0;
+	_midiStatus = 0;
+	_midiDataByte1 = 0;
+	_midiDataByte2 = 0;
+
+	Part_init(&_part);
+	Part_pc(&_part,0);
+}
+void Fmdriver_sendMidi( unsigned char byteStream )
+{
+	if ( byteStream & 0x80 ){
+		if ( byteStream == 0xf7 ){
+			Tone_sendTone();
+			_midiStatus = 0;
+			_midiCmdCounter = 0;
+		}
+		else {
+			_midiStatus = byteStream;
+			_midiCmdCounter = 1;
+		}
+	}
+	else if ( _midiStatus == 0xf0 ){
+		Tone_setToneExc(byteStream,_midiCmdCounter);
+		_midiCmdCounter += 1;
+	}
+	else if ( _midiStatus != 0 ){
+		receiveDataByte(byteStream);
+	}
+}
+static void receiveDataByte( unsigned char byteStream )
+{
+	switch (_midiCmdCounter){
+		case 0: case 1:{
+			_midiDataByte1 = byteStream;
+			switch ( _midiStatus & 0xf0 ){
+				case 0xc0: case 0xd0:{
+					_midiCmdCounter = 0;
+					generateMidiCmd();
+					break;
+				}
+				default:{
+					_midiCmdCounter = 2;
+					break;
+				}
+			}
+			break;
+		}
+		case 2:{
+			_midiDataByte2 = byteStream;
+			_midiCmdCounter = 0;
+			generateMidiCmd();
+			break;
+		}
+		default: break;
+	}
+}
+static void generateMidiCmd( void )
+{
+	switch ( _midiStatus ){	//	receive only MIDI ch.1
+		case 0x80: Part_note( &_part, _midiDataByte1, 0 ); break;
+		case 0x90: Part_note( &_part, _midiDataByte1, _midiDataByte2 ); break;
+		case 0xb0: Part_cc( &_part, _midiDataByte1, _midiDataByte2 ); break;
+		case 0xc0: Part_pc( &_part, _midiDataByte1 ); break;
+		case 0xe0: Part_pbend( &_part, _midiDataByte1, _midiDataByte2 ); break;
+		default: break;
+	}
+}
+