/*
 * Tony Givargis
 */

/*---------------------------------------------------------------------------*/

#pragma SMALL
#include <reg51.h>

/*---------------------------------------------------------------------------*/

/* octave 1 */
#define F1_A		0x00
#define F1_AS		0x01
#define F1_B		0x02
#define F1_C		0x03
#define F1_CS		0x04
#define F1_D		0x05
#define F1_DS		0x06
#define F1_E		0x07
#define F1_F		0x08
#define F1_FS		0x09
#define F1_G		0x0a
#define F1_GS		0x0b

/* octave 2 */
#define F2_A		0x10
#define F2_AS		0x11
#define F2_B		0x12
#define F2_C		0x13
#define F2_CS		0x14
#define F2_D		0x15
#define F2_DS		0x16
#define F2_E		0x17
#define F2_F		0x18
#define F2_FS		0x19
#define F2_G		0x1a
#define F2_GS		0x1b

/* octave 3 */
#define F3_A		0x30
#define F3_AS		0x31
#define F3_B		0x32
#define F3_C		0x33
#define F3_CS		0x34
#define F3_D		0x35
#define F3_DS		0x36
#define F3_E		0x37
#define F3_F		0x38
#define F3_FS		0x39
#define F3_G		0x3a
#define F3_GS		0x3b

/* no sound */
#define F_NO		0xff

/*---------------------------------------------------------------------------*/

#define TEMPO_ELEVATOR	10000
#define TEMPO_SLOW	9000
#define TEMPO_FAST	7000
#define TEMPO_ROCKNROLL	5000

/*---------------------------------------------------------------------------*/

#define D_WHOLE		8
#define	D_HALFDOT	6
#define	D_HALF		4
#define D_QUARTERDOT	3
#define D_QUARTER	2
#define D_EIGHT		1

/*---------------------------------------------------------------------------*/

unsigned char xdata PLAY_REG _at_ 0xff00;

/*---------------------------------------------------------------------------*/

const unsigned char code SONG[][2] = {

	/* pitch, duration */

	{ F2_D,  D_QUARTER    },
	{ F2_D,  D_QUARTER    },
	{ F2_G,  D_HALF       },

	{ F2_FS, D_QUARTER    },
	{ F2_E,  D_QUARTER    },
	{ F2_D,  D_HALF       },

	{ F2_C,  D_QUARTER    },
	{ F2_C,  D_QUARTER    },
	{ F2_E,  D_QUARTER    },
	{ F2_E,  D_QUARTER    },

	{ F2_D,  D_QUARTER    },
	{ F2_C,  D_QUARTER    },
	{ F2_B,  D_HALF       },

	{ F2_A,  D_QUARTER    },
	{ F2_A,  D_QUARTER    },
	{ F2_C,  D_QUARTER    },
	{ F2_C,  D_QUARTER    },

	{ F2_B,  D_QUARTER    },
	{ F2_A,  D_QUARTER    },
	{ F1_G,  D_QUARTER    },
	{ F2_A,  D_QUARTER    },

	{ F1_G,  D_QUARTER    },
	{ F2_A,  D_QUARTER    },
	{ F1_G,  D_HALF       },

	{ F1_G,  D_WHOLE      },

	{ F2_D,  D_QUARTER    },
	{ F2_D,  D_QUARTER    },
	{ F2_G,  D_QUARTER    },
	{ F2_G,  D_QUARTER    },

	{ F2_FS, D_QUARTER    },
	{ F2_E,  D_QUARTER    },
	{ F2_D,  D_HALF       },

	{ F2_C,  D_QUARTER     },
	{ F2_C,  D_QUARTER     },
	{ F2_E,  D_QUARTER     },
	{ F2_E,  D_QUARTER     },

	{ F2_D,  D_QUARTER     },
	{ F2_C,  D_QUARTER     },
	{ F2_B,  D_HALF        },

	{ F2_A,  D_QUARTER     },
	{ F2_A,  D_QUARTER     },
	{ F2_C,  D_QUARTER     },
	{ F2_C,  D_QUARTER     },

	{ F2_B,  D_QUARTER     },
	{ F2_A,  D_QUARTER     },
	{ F1_G,  D_QUARTER     },
	{ F2_A,  D_QUARTER     },

	{ F1_G,  D_WHOLE       },

	{ F1_G,  D_HALF        },
	{ F2_B,  D_QUARTER     },
	{ F2_D,  D_QUARTER     },

	{ F2_D,  D_HALFDOT     },
	{ F2_E,  D_QUARTER     },

	{ F1_G,  D_QUARTER     },
	{ F2_A,  D_QUARTER     },
	{ F2_B,  D_QUARTER     },
	{ F2_D,  D_QUARTER     },

	{ F2_D,  D_HALF        },
	{ F2_D,  D_QUARTER     },
	{ F2_E,  D_QUARTER     },

	{ F1_G,  D_QUARTER     },
	{ F2_A,  D_QUARTER     },
	{ F2_B,  D_QUARTER     },
	{ F2_D,  D_QUARTER     },

	{ F2_D,  D_HALFDOT     },
	{ F2_D,  D_QUARTER     },

	{ F2_G,  D_QUARTER     },
	{ F2_FS, D_QUARTER     },
	{ F2_E,  D_QUARTER     },
	{ F2_D,  D_QUARTER     },

	{ F2_E,  D_QUARTER     },
	{ F2_D,  D_QUARTER     },
	{ F2_D,  D_HALF        },

	{ F2_D,  D_WHOLE       }
};

/*---------------------------------------------------------------------------*/

void Duration(int tempo, int delay) {

	static cnt;
	int i, j;

	for(i=0; i<delay; i++) {

		for(j=0; j<tempo; j++);
		P1 = ++cnt % 16;
	}
}

/*---------------------------------------------------------------------------*/

void Lift(void) {

	int i;

	PLAY_REG = F_NO;
	for(i=0; i<100; i++);
}

/*---------------------------------------------------------------------------*/

void main(void) {

	int i, tempo;

	while( 1 ) {

	    /* set the tempo value */

	    /* put each note of song into PLAY_REG*/
	    /* keep note in PLAY_REG for appropriate time */
            Lift();

	    /* change the tempo and play your song again */
	    
	    /* HINT: because song array is dynamice */
	    /* use the sizeof() operator */
	}
}

<div align="center"><br /><script type="text/javascript"><!--
google_ad_client = "pub-7293844627074885";
//468x60, Created at 07. 11. 25
google_ad_slot = "8619794253";
google_ad_width = 468;
google_ad_height = 60;
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />&nbsp;</div>