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

Dependencies:   microbit

fmif.c

Committer:
hasebems
Date:
2018-01-05
Revision:
0:c54d59d6fb78

File content as of revision 0:c54d59d6fb78:

// 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;
	}
}