// /************************************************************** melodyc Copyrights(C)2003 air variable http://www.geocities.co.jp/SiliconValley-Sunnyvale/4889/ version 2.03 Maxium note of 406 **************************************************************/ #include #pragma CLOCK_FREQ 4000000 // tone Frequency set (as apend of soft delay 4) #define CL 19, #define C$L 33, #define DL 45, #define D$L 57, #define EL 68, #define FL 79, #define F$L 89, #define GL 99, #define G$L 108, #define AL 116, #define A$L 124, #define BL 131, #define C 139, #define C$ 145, #define D 152, #define D$ 158, #define E 163, #define F 169, #define F$ 174, #define G 178, #define G$ 183, #define A 187, #define A$ 191, #define B 195, #define CH 198, #define C$H 202, #define DH 205, #define D$H 208, #define EH 211, #define FH 213, #define F$H 216, #define GH 218, #define G$H 220, #define AH 222, #define A$H 224, #define BH 226, #define R 0, #define CMD 255, #define END 0 #define TEMPO , //Length #define L4 200, #define L6 150, #define L8 100, #define L12 75, #define L16 50, #define L20 40, #define L24 33, #define L32 25, #define L48 18, #define L64 12, #define L 6, //output port is #define sound_output 0x04 //gpioO3 //Tempo trim (0 to 4) #define tempo_multi 2; //SONG DATA max 405 note const char songdata[]={ CMD 100 TEMPO //tempocont (except 255) A$L L16 R L16 A$L L16 R L16 G$L L16 GL L16 FL L12 R L32 A$L L16 R L16 A$L L16 R L16 G$L L16 GL L16 FL L12 R L32 GL L16 R L16 GL L16 R L16 D$L L16 DL L16 CL L12 R L32 D$L L16 R L16 DL L16 R L16 CL L8 R L8 //--- C L8 D L8 D$ L16 D L16 C L8 D$ L8 F L8 G L8 F L8 D$ L8 G L8 A$ L8 G$ L16 A$ L16 G L8 F L8 G L8 R L8 // C L8 D L8 D$ L16 D L16 C L8 D$ L8 F L8 G L8 F L8 CH L12 R L32 CH L12 R L32 A$ L8 G L16 A$ L16 G L12 R L32 G L12 R L32 CH L8 R L8 // CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 R L8 CH L8 A$ L12 R L32 A$ L12 R L32 G L8 A$ L8 CH L8 R L8 // CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 R L8 CH L8 A$ L12 R L32 A$ L12 R L32 G L8 F L8 G L8 R L8 //--- A$ L8 R L8 A$ L8 R L8 A$ L8 R L8 A$ L8 R L8 A$ L16 R L16 A$ L16 R L16 G$ L16 G L16 F L12 R L32 A$ L16 R L16 A$ L16 R L16 G$ L16 G L16 F L12 R L32 D$ L8 F L8 G L16 R L16 G$ L16 G L16 F L8 D$ L8 A$ L8 R L8 // A$ L16 R L16 A$ L16 R L16 G$ L16 G L16 F L12 R L32 A$ L16 R L16 A$ L16 R L16 G$ L16 G L16 F L12 R L32 G L16 R L16 G L16 R L16 D$ L16 D L16 C L12 R L32 D$ L16 R L16 D L16 R L16 C L8 R L8 //Rest R L4 //----------------------------------------2nd data //tempo is fast CMD 50 TEMPO //tempocont (except 255) A$L L16 R L16 A$L L16 R L16 G$L L16 GL L16 FL L12 R L32 A$L L16 R L16 A$L L16 R L16 G$L L16 GL L16 FL L12 R L32 GL L16 R L16 GL L16 R L16 D$L L16 DL L16 CL L12 R L32 D$L L16 R L16 DL L16 R L16 CL L8 R L8 //--- C L8 D L8 D$ L16 D L16 C L8 D$ L8 F L8 G L8 F L8 D$ L8 G L8 A$ L8 G$ L16 A$ L16 G L8 F L8 G L8 R L8 // C L8 D L8 D$ L16 D L16 C L8 D$ L8 F L8 G L8 F L8 CH L12 R L32 CH L12 R L32 A$ L8 G L16 A$ L16 G L12 R L32 G L12 R L32 CH L8 R L8 // CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 R L8 CH L8 A$ L12 R L32 A$ L12 R L32 G L8 A$ L8 CH L8 R L8 // CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 CH L12 R L32 C L12 R L32 R L8 CH L8 A$ L12 R L32 A$ L12 R L32 G L8 F L8 G L8 R L8 //--- A$ L8 R L8 A$ L8 R L8 A$ L8 R L8 A$ L8 R L8 A$ L16 R L16 A$ L16 R L16 G$ L16 G L16 F L12 R L32 A$ L16 R L16 A$ L16 R L16 G$ L16 G L16 F L12 R L32 D$ L8 F L8 G L16 R L16 G$ L16 G L16 F L8 D$ L8 A$ L8 R L8 // A$ L16 R L16 A$ L16 R L16 G$ L16 G L16 F L12 R L32 A$ L16 R L16 A$ L16 R L16 G$ L16 G L16 F L12 R L32 G L16 R L16 G L16 R L16 D$ L16 D L16 C L12 R L32 D$ L16 R L16 D L16 R L16 C L8 R L8 //Rest R L4 //stop CMD END // Music Last of data }; //INTRC GPIO ,WTIMER EN,PWRUPTIMER DIS,MCLR INT,BOD DIS __CONFIG(0x3104); char tone; char tempocont = 100;//Default TEMPO #pragma interrupt_level 1 //Timer Int process/ void interrupt toneset( void ) { TMR0 = tone; if (tone != 0) GPIO ^= sound_output;//alternate port T0IF =0; } //tempo control wtime(char t0) { int i,t1; for ( i=0 ; i != t0 ;i++) { t1 = tempocont * tempo_multi; while ( --t1 ); } } main(){ //Initialization int n=0; char tmp,tmp2; CMCON = 7; ANSEL = 0b00000000; TRISIO = 0b11111111; GPIO = 0; TMR0 =0x00 ; GIE = 1; PEIE = 1; tone =0x00; OPTION = 0b10000010; // prescale 8 T0IE = 1; wtime(100); TRISIO = ~sound_output; GPIO = 0; while(1){ //command detect tmp=songdata[n]; tmp2=songdata[n+1]; if (tmp == 255) { //Command? if (tmp2 == 0){ //Tempo or End of data? n=0; // while(1);//coment out when if music play is 1 time } else{ tempocont = tmp2; //New tempo change n +=2; } } else{ tone=tmp; wtime(tmp2); n +=2; } } }