March Madness - Close Encounters of the 3rd kind

The LCD Serial display board that I desgined has a buzzer on it.
I wanted to try out playing with tones so I wrote a little CE3K tone player.

//************************************************************************
//************************************************************************
#include 
#include 
#include 
#include 
#include 
#include "WProgram.h"


#ifdef __MWERKS__
	//*	I use Metrowerks CodeWarior for editing and syntax checking
	//*	this is ONLY to make Codewarrior happy
	void	sprintf(...);
	void	dtostrf(...);
	long	pgm_read_dword_near(...);
	short	pgm_read_word_near(...);
	short	pgm_read_byte_near(...);
	#define	prog_uint32_t long
	#define	prog_int16_t short
	#define	prog_uint8_t byte
	#define	PROGMEM
	#define	_USE_LOCAL_LIBRARY_VERSION_

#endif



#include "HardwareSerial.h"

//*	analog starts at 14
#define	kPin_Button_1			14
#define	kPin_Button_2			15
#define	kPin_Button_3			16
#define	kPin_Button_4			17
#define	kPin_Button_5			7
#define	kPin_Button_6			8
#define	kPin_Button_7			13

#define	kPin_Buzzer				6



//************************************************************************
void PlayNote(int noteFrequency, int theDuration)
{
long	pulseWidth;
long	startMilliSecs;

//	pulseWidth		=	500000 / noteFrequency;
	pulseWidth		=	250000 / noteFrequency;
	startMilliSecs	=	millis();
	
	while ((millis() - startMilliSecs) < (theDuration * 80))
	{
		//*	play our tone!
		digitalWrite(kPin_Buzzer, HIGH);
		delayMicroseconds(pulseWidth);
		digitalWrite(kPin_Buzzer, LOW);
		delayMicroseconds(pulseWidth);
	}
}

//************************************************************************
void PlayCI3K(int noteOffset, int divideFactor)
{
	PlayNote((noteOffset + 396) / divideFactor, 6);
	PlayNote((noteOffset + 440) / divideFactor, 6);
	PlayNote((noteOffset + 352) / divideFactor, 6);
	PlayNote((noteOffset + 176) / divideFactor, 6);
	PlayNote((noteOffset + 264) / divideFactor, 6);
}


#pragma mark -
#pragma mark Button processing

static boolean	gButton1_pressed;
static boolean	gButton2_pressed;
static boolean	gButton3_pressed;
static boolean	gButton4_pressed;
static boolean	gButton5_pressed;
static boolean	gButton6_pressed;
static boolean	gButton7_pressed;


//************************************************************************
//*	returns true if any button is down
static boolean	GetButtons(void)
{
	gButton1_pressed	=	!digitalRead(kPin_Button_1);
	gButton2_pressed	=	!digitalRead(kPin_Button_2);
	gButton3_pressed	=	!digitalRead(kPin_Button_3);
	gButton4_pressed	=	!digitalRead(kPin_Button_4);
	gButton5_pressed	=	!digitalRead(kPin_Button_5);
	gButton6_pressed	=	!digitalRead(kPin_Button_6);
	gButton7_pressed	=	!digitalRead(kPin_Button_7);
	
	return(	gButton1_pressed || gButton2_pressed || gButton3_pressed || gButton4_pressed || 
			gButton5_pressed || gButton6_pressed || gButton7_pressed);
}



#pragma mark -
//************************************************************************
void setup()
{

	analogWrite(kPin_Buzzer, 128);

	gButton1_pressed		=	false;
	gButton2_pressed		=	false;
	gButton3_pressed		=	false;
	gButton4_pressed		=	false;
	gButton5_pressed		=	false;
	gButton6_pressed		=	false;
	gButton7_pressed		=	false;


	//*	set up the buttons
	pinMode(kPin_Button_1, INPUT);
	pinMode(kPin_Button_2, INPUT);
	pinMode(kPin_Button_3, INPUT);
	pinMode(kPin_Button_4, INPUT);
	pinMode(kPin_Button_5, INPUT);
	pinMode(kPin_Button_6, INPUT);
	pinMode(kPin_Button_7, INPUT);


	//*****************************************************************************
	//*	now this may seem at bit strange, but we are going to set the outputs
	//*	on all of the buttin INPUTS to HIGH. This turns on the internal pull up
	//*	so we dont have to have external pull ups (Thanks Tim H for this info)
	//*****************************************************************************
	digitalWrite(kPin_Button_1, HIGH);
	digitalWrite(kPin_Button_2, HIGH);
	digitalWrite(kPin_Button_3, HIGH);
	digitalWrite(kPin_Button_4, HIGH);
	digitalWrite(kPin_Button_5, HIGH);
	digitalWrite(kPin_Button_6, HIGH);
	digitalWrite(kPin_Button_7, HIGH);

	delay(100);	//*	give the inputs time to settle
	analogWrite(kPin_Buzzer, 0);

}

//************************************************************************
void loop()
{
int		noteOffset;
int		divideFactor;

	//*	no data from serial port, check the buttons
	if (GetButtons())
	{
		pinMode(kPin_Buzzer, OUTPUT);

		//*	simple debounce
		delay(50);
		GetButtons();	//*	get the buttons again
		
		noteOffset		=	0;
		divideFactor	=	1;
		if (gButton1_pressed)
		{
			noteOffset		=	0;
			divideFactor	=	1;
		}
		else if (gButton2_pressed)
		{
			noteOffset		=	100;
			divideFactor	=	2;
		}
		else if (gButton3_pressed)
		{
			noteOffset		=	200;
			divideFactor	=	3;
		}
		
		PlayCI3K(noteOffset, divideFactor);
		delay(250);
	}
}



#pragma mark -