
	//˫ͨĲϳ
	//Ȼǰ,ֹĵѹ,
	//ȻδͨĲβ,ͨ任޷PWM
	//ÿͨĲΪ:
	//        *
	//       *  *
	//      *     **
	//     *         **
	//    *               **
	//   *                       ***
	//  *                                ****
	// *                                            ******
	//*                                                           *******


unit tone
{
	public link unit SOUND {}
	
	//[i] interface_tone tone1;
	public unit tone1
	{
		public link void play( int8 channal, int8 tone, uint8 vol ) {}
		public link void stop( int8 channal, int8 s ) {}
		public link uint8 switch_time( uint8 t ) {}
		public link bool isBusy;
		public link bool isNeed;
	}
	tone1.play = play;
	tone1.stop = stop;
	tone1.switch_time = switch_time;
	tone1.isBusy = NullFalse;
	tone1.isNeed = NullFalse;
	bool NullFalse;
	
	link unit MCU {} = #.MEGA328;
	
	//[i] var_uint8 OS_time;
	uint8 OS_time;
	
	sound.SOUND = SOUND;
	sound =
	#include "sound.txt"
	
	link uint16 value1 = sound.value1;
	link uint16 value2 = sound.value2;
	
	uint16 env_index1;
	uint16 env_index2;
	
	uint8 volume1;
	uint8 volume2;
	
	//---------------------------------------------------
	//[i] function_void OS_init;
	void OS_init()
	{
		sound.OS_init();
		OS_time = 5;
		env_index1 = 0;
		env_index2 = 0;
		volume1 = 255;
		volume2 = 255;
		NullFalse = false;
	}
	//---------------------------------------------------
	//[i] function_void play int32 int32 int32;
	void play( int32 channal, int32 tone32, int32 vol0 )
	{
		uint8 vol = (uint)(int8)(int16)vol0;
		int16 tone = (int16)tone32;
		vol << 1;
		if( channal == 1 ) {
			env_index1 = 0;
			sound.freq1 = FREQ[tone];
			sound.vol1 = vol;
			volume1 = vol;
			//ֵʵû,Ϊ˲
			//if value1 == 0; value1 = 1.
			sound.Start1 = true;
		}
		if( channal == 2 ) {
			env_index2 = 0;
			sound.freq2 = FREQ[tone];
			sound.vol2 = vol;
			volume2 = vol;
			//ֵʵû,Ϊ˲
			//if value2 == 0; value2 = 1.
			sound.Start2 = true;
		}
	}
	//---------------------------------------------------
	//[i] function_void stop int32 int32;
	void stop( int32 channel, int32 s )
	{
		if( channel == 1 ) value1 = 0;
		if( channel == 2 ) value2 = 0;
	}
	//---------------------------------------------------
	uint8 switch_time( uint8 t )
	{
		uint16 x = 65;
		return (uint8)( t * x / 100 );
	}
	//---------------------------------------------------
	//[i] function_void OS_run;
	void OS_run()
	{
		if( !sound.Start1 && value1 != 0 ) {
			uint16 v = envelope[env_index1];
			v * volume1;
			value1 = v.8(uint8);
			env_index1 + 1;
		}
		if( !sound.Start2 && value2 != 0 ) {
			uint16 v = envelope[env_index2];
			v * volume2;
			value2 = v.8(uint8);
			env_index2 + 1;
		}
	}
	//---------------------------------------------------
	
	//Ƶʱ
	const uint16 TR1 = 512;
	const uint16 TR2 = 976;//675;
	[#.code uint16*?] FREQ =
	[
		00,01,02,03,04,05,06,07,08,09,
		10,11,12,13,14,15,16,17,18,19,
		20,21,22,23,24,25,26,27,28,29,
		30,31,32,33,34,35,
		//Ƶʹ,һò
		
		65 * TR1 / TR2,//36  65   C2
		69 * TR1 / TR2,//37  69
		73 * TR1 / TR2,//38  73   D2
		78 * TR1 / TR2,//39  78
		82 * TR1 / TR2,//40  82   E2
		87 * TR1 / TR2,//41  87   F2
		92 * TR1 / TR2,//42  92
		98 * TR1 / TR2,//43  98   G2
		104 * TR1 / TR2,//44  104
		110 * TR1 / TR2,//45  110  A2
		117 * TR1 / TR2,//46  117
		123 * TR1 / TR2,//47  123  B2
		
		131 * TR1 / TR2,//48  131  C3
		139 * TR1 / TR2,//49  139
		147 * TR1 / TR2,//50  147  D3
		156 * TR1 / TR2,//51  156
		165 * TR1 / TR2,//52  165  E3
		175 * TR1 / TR2,//53  175  F3
		185 * TR1 / TR2,//54  185
		196 * TR1 / TR2,//55  196  G3
		208 * TR1 / TR2,//56  208
		220 * TR1 / TR2,//57  220  A3
		233 * TR1 / TR2,//58  233
		247 * TR1 / TR2,//59  247  B3
		
		262 * TR1 / TR2,//60  262  C4
		277 * TR1 / TR2,//61  277
		294 * TR1 / TR2,//62  294  D4
		311 * TR1 / TR2,//63  311
		330 * TR1 / TR2,//64  330  E4
		349 * TR1 / TR2,//65  349  F4
		370 * TR1 / TR2,//66  370
		392 * TR1 / TR2,//67  392  G4
		415 * TR1 / TR2,//68  415
		440 * TR1 / TR2,//69  440  A4
		466 * TR1 / TR2,//70  466
		494 * TR1 / TR2,//71  494  B4
		
		523 * TR1 / TR2,//72  523  C5
		554 * TR1 / TR2,//73  554
		587 * TR1 / TR2,//74  587  D5
		622 * TR1 / TR2,//75  622
		659 * TR1 / TR2,//76  659  E5
		698 * TR1 / TR2,//77  698  F5
		740 * TR1 / TR2,//78  740
		784 * TR1 / TR2,//79  784  G5
		831 * TR1 / TR2,//80  831
		880 * TR1 / TR2,//81  880  A5
		932 * TR1 / TR2,//82  932
		988 * TR1 / TR2,//83  988  B5
		
		1047 * TR1 / TR2,//84  1047 C6
		1109 * TR1 / TR2,//85  1109
		1175 * TR1 / TR2,//86  1175 D6
		1245 * TR1 / TR2,//87  1245
		1319 * TR1 / TR2,//88  1319 E6
		1397 * TR1 / TR2,//89  1397 F6
		1480 * TR1 / TR2,//90  1480
		1568 * TR1 / TR2,//91  1568 G6
		1661 * TR1 / TR2,//92  1661
		1760 * TR1 / TR2,//93  1760 A6
		1865 * TR1 / TR2,//94  1865
		1976 * TR1 / TR2,//95  1976 B6
		
		2093 * TR1 / TR2,//96  2093 C7
		2218 * TR1 / TR2,//97  2218
		2349 * TR1 / TR2,//98  2349 D7
		2489 * TR1 / TR2,//99  2489
		2637 * TR1 / TR2,//100 2637 E7
		2793 * TR1 / TR2,//101 2793 F7
		2960 * TR1 / TR2,//102 2960
		3136 * TR1 / TR2,//103 3136 G7
		3322 * TR1 / TR2,//104 3322
		3520 * TR1 / TR2,//105 3520 A7
		3729 * TR1 / TR2,//106 3729
		3951 * TR1 / TR2,//107 3951 B7
		
		4186 * TR1 / TR2,//108  4186 C8
		4436 * TR1 / TR2,//109  4436
		4698 * TR1 / TR2,//110  4698 D8
		4978 * TR1 / TR2,//111  4978
		5274 * TR1 / TR2,//112 5274 E8
		5586 * TR1 / TR2,//113 5586 F8
		5920 * TR1 / TR2,//114 5920
		6272 * TR1 / TR2,//115 6272 G8
		6644 * TR1 / TR2,//116 6644
		7040 * TR1 / TR2,//117 7040 A8
		7458 * TR1 / TR2,//118 7458
		7902 * TR1 / TR2,//119 7902 B8
	];
	
	[#.code uint8*?] envelope =
	[
		255,252,250,247,245,243,240,238,235,233,231,228,226,224,222,219,
		217,215,213,211,209,207,205,203,201,199,197,195,193,191,189,187,
		185,183,182,180,178,176,174,173,171,169,168,166,164,163,161,159,
		158,156,155,153,152,150,149,147,146,144,143,141,140,139,137,136,
		134,133,132,130,129,128,127,125,124,123,122,120,119,118,117,116,
		115,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,
		98,97,96,95,94,93,92,91,90,89,88,87,87,86,85,84,
		83,82,82,81,80,79,78,78,77,76,75,75,74,73,72,72,
		71,70,69,69,68,67,67,66,65,65,64,64,63,62,62,61,
		60,60,59,59,58,57,57,56,56,55,55,54,54,53,53,52,
		51,51,50,50,49,49,48,48,48,47,47,46,46,45,45,44,
		44,43,43,43,42,42,41,40,40,39,39,38,38,37,37,36,
		35,35,34,34,33,33,32,31,31,30,30,29,29,28,28,27,
		26,26,25,25,24,24,23,22,22,21,21,20,20,19,19,18,
		17,17,16,16,15,15,14,13,13,12,12,11,11,10,10,9,
		8,8,7,7,6,6,5,4,4,3,3,2,2,1,1,0,
	];
}





















































