<job>
<script language="VBScript">
function vbBinaryToArray(bin)
	dim i
	ReDim byteArray(LenB(bin))
	for i=1 to LenB(bin)
		byteArray(i-1)=AscB(MidB(bin, i, 1))
	next
	vbBinaryToArray=byteArray
end function
function vbInputBox(msg, title, def)
	vbInputBox=InputBox(msg, title, def)
end function
</script>
<script language="JavaScript">
// bZ[WtdqIS[ MyMelo2PLUS(^̍Đ@\ǉ)
// https://koyama.verse.jp/elecraft/mymelo/
// 20230616-20240315 koyama88@cameo.plala.or.jp
// ()
// (1) MyMelo2 Plus ́A̓dqIS[ MyMelo2 ɘ^}@\ǉ̂ŁAubZ[Wt dqIS[v邱Ƃł܂BIS[̉̓sAm̉ɎꂢȉFł(g)B
// (3) bZ[W̓IS[̃fB[̔Cӂ̏ꏊɑ}ł܂B̉ʁX̏ꏊōĐ邱Ƃł܂B
// (4) ̋Ȃo^A{^ōĐȂIł܂B
// (5) ArduinoUNO/NANO, Digispark, ATtiny85, ATtiny4313, ATmega328P Ȃǂœ삵܂B
// (6) }ł鉹bZ[W͎̒gp}CRɂقȂAATtiny85ł͒i1.3bAi2.6bxłB
//
// (f[^̏)
// (1) ͂߂ mymelo2plus.wsf _uNbNĉf[^t@C(mymelo2plustH_myvoice.h)Ɗyf[^t@C(mymelo2plustH_mymelo2.h)܂B
//
// (f[^̍쐬)
// (1) AudacityȂǂ̃\tggAp\Rŉ^Awavt@CƂĕۑ܂BX}zŘ^t@CFFMPEGȂǂ̃\tggĕϊ邱Ƃł܂B
// (2) ^t@C(ZZ.wav) mymelo2plus.wsf ɃhbOhbvƁAf[^t@Cɉf[^L^܂B
// (3) ̉t@C(ZZ.wav)pӂA(2)̑JԂƁAf[^t@Cɕ̉o^ł܂BAL^ł鎞Ԃ́uvŁvő1.3bx(i)܂2.6bx(i)łB
// (4) ύXꍇ́Af[^̏蒼܂B
//
// (yf[^̍쐬)
// (1) ueLXgyTNv(܂̓Ȃǂ̃eLXgGfB^)Łuhh\\\[v̂悤Ɋyt@C(ZZ.mml)쐬܂({R[h̓VtgJIS)B
//		g鉹RA1_`SI8REST(x)87ő31ނłB^̉ӏ́un0vun1v...̂悤ɋLڂ܂B
//		g鉹L1_(t_S)`L32(32)11ő8ނłB
// (2) yt@C(ZZ.mml) mymelo2plus.wsf ɃhbOhbvƁAyf[^t@CɊyf[^L^܂B
// (3) (2)̑JԂƁAyf[^t@Cɕ̊yo^ł܂B
// (4) yύXꍇ̓f[^̏蒼܂B
//
// (vȌ)
// ArduinoIDENAmymelo2plustH_ mymelo2plus.ino Jď݂܂B
//
// ()
// d𓊓ƁA^bZ[Wt̃IS[Đ܂BOXCb`ȂƁAXCb`ƂɍĐ܂BXCb`𒷉2Ȗڈȍ~Đ܂B

var ws=WScript.CreateObject("WScript.Shell");
var sh =new ActiveXObject("Shell.Application");
var ado=new ActiveXObject("ADODB.Stream");
var fso=new ActiveXObject("Scripting.FileSystemObject");
var folder=fso.GetFile(WScript.ScriptFullName).ParentFolder;

if(WScript.Arguments.length==0){			// _uNbNŋN
	var	mymelo_h=fso.CreateTextFile(folder+"/mymelo2plus/mymelo2.h",true);
	var	myvoice_h=fso.CreateTextFile(folder+"/mymelo2plus/myvoice.h",true);
	var btn=ws.Popup("f[^܂B낵ł?",0,"f[^",3);	// ͂:6 :7 LZ:2
	if(btn==6){													// ͂(Y)Ȃf[^
// mymelo_h -----------------------------------------------
		var s="// This file contains melody data created by mymelo2plus.wsf\n\n"
		s+="#define MYMELO\n";
		s+="#define WAVEFORM 1\n";
		s+="#define NMELO 0		// number of melody data\n";
		s+="#define NTRACK 1	// number of track(1..3)\n\n";
		s+="const uint16_t tempo[]={};\n\n";	// 20240313 uint16_t
		s+="const uint8_t* const pLen[] PROGMEM={};	// pointer to score length array of each melody\n\n";
		s+="const uint16_t* const pSW[] PROGMEM={};	// pointer to step width array of each melody\n\n";
		s+="const uint8_t* const pPart1[] PROGMEM={};	// pointer to part1 data of each melody\n";
		s+="const uint8_t* const pPart2[] PROGMEM={};	// pointer to part2 data of each melody\n";
		s+="const uint8_t* const pPart3[] PROGMEM={};	// pointer to part3 data of each melody\n";
		mymelo_h.Write(s);
		mymelo_h.Close();
// myvoice_h -----------------------------------------------
		s="// This file contains ADPCM encoded data created by mymelo2plus.wsf\n\n"
		s+="#define NVOICE 0		// number of voice data\n\n";
		s+="\nconst uint8_t* const Voice[] PROGMEM={};	// pointer of each voice data\n";
		s+="\nuint16_t voicesize[]={};							// size(bytes) of each voice data\n";
		myvoice_h.Write(s);
		myvoice_h.Close();
		WScript.Echo("f[^܂B\nmmlt@C܂wavt@ChbOhbvĂ");
		WScript.Quit();
	}
}
var filename=WScript.Arguments(0).toLowerCase();
if(!filename.match(/\.mml$/) && !filename.match(/\.wav$/)){
	WScript.Echo("wavt@C mmlt@C̏ɃhbOhbvĂ");
	WScript.Quit();
}
var sVoice=readFile(folder+"/mymelo2plus/myvoice.h").replace(/\r\n/,"\n");
var nVoice=parseInt(sVoice.match(/#define\sNVOICE\s(\d+)/)[1]);
if(filename.match(/\.mml$/)){					// mmlt@ChbOhbv

var sMelo=readFile(folder+"/mymelo2plus/mymelo2.h").replace(/\r\n/g,"\n");
waveform=parseInt(sMelo.match(/#define\sWAVEFORM\s(\d+)/)[1]);	// 1
var nMelo=parseInt(sMelo.match(/#define\sNMELO\s(\d+)/)[1]);		// ݂̋Ȑ
var nTrack=parseInt(sMelo.match(/#define\sNTRACK\s(\d+)/)[1]);	// gbN(ő)
var tempo=sMelo.match(/const uint16_t tempo\[\]=\{(.*)\};/)[1];	// eȂ̃e|(z)	20240313 uint16_t
tempo=(tempo==""?[]:tempo.split(","));	// : "".split(",")  [] ł͂Ȃ [""]

// mmlt@Cmymelo.h쐬 -----------------------------------------------
var Ts=0.000032, Nc=256;							// TvO^C, g`Tv
var Onpu={	"L32":1,"L16":2,"L16_":3,	// 11̒1Ȃōő8ޗpł
	"L8":4,"L8_":6,"L4":8,"L4_":12,"L2":16,"L2_":24,"L1":32,"L1_":48};
var Doremi={"r":"REST", "a":"RA", "b":"SI", "c":"DO", "d":"RE", "e":"MI", "f":"FA", "g":"SO"};
var Note=[														// 87̒1Ȃōő31ޗpł
	"REST","RA1_","SI1", "DO2","DO2_", "RE2","RE2_", "MI2","FA2", "FA2_", "SO2","SO2_",
	"RA2","RA2_", "SI2", "DO3","DO3_", "RE3","RE3_", "MI3", "FA3","FA3_", "SO3","SO3_",
	"RA3","RA3_", "SI3", "DO4","DO4_", "RE4","RE4_", "MI4", "FA4","FA4_", "SO4","SO4_",
	"RA4","RA4_", "SI4", "DO5","DO5_", "RE5","RE5_", "MI5", "FA5","FA5_", "SO5","SO5_",
	"RA5","RA5_", "SI5", "DO6","DO6_", "RE6","RE6_", "MI6", "FA6","FA6_", "SO6","SO6_",
	"RA6","RA6_", "SI6", "DO7","DO7_", "RE7","RE7_", "MI7", "FA7","FA7_", "SO7","SO7_",
	"RA7","RA7_", "SI7", "DO8","DO8_", "RE8","RE8_", "MI8", "FA8","FA8_", "SO8","SO8_",
	"RA8","RA8_", "SI8"];
var sw={"REST":0};							// g
for(var i=1;i<Note.length;i++){	// e[u
	sw[Note[i]]=Math.round(Ts*Nc*256*(110*Math.pow(2,i/12)));
}
var mymelo=fso.GetFile(WScript.ScriptFullName).ParentFolder;
var sPart=[,"","",""];
var mml=readFile(filename);
var Key=0;
if(mml.match(/Key\([+-]?\d+\)/)){	// 20230703 Key(-3)Łu-3Pʁvڒ
	Key=parseInt(mml.match(/Key\(([+-]?\d+)\)/)[1]);	// Ăŏ1L
}
for(var i=1;i<Note.length;i++){	// e[u
	sw[Note[i]]=Math.round(Ts*Nc*256*(110*Math.pow(2,(i+Key)/12)));		// g
}
mml=mml.replace(/\/\*[^\*]*\*\//g,"")	// Rg폜
	.replace(/@/g," ").replace(//g,"").replace(/S/g,"1")
	.replace(/y/g,"[").replace(/z/g,"]").replace(/F/g,":")
	.replace(/[I-`]/g,function(s){return String.fromCharCode(s.charCodeAt(0)-0xFEE0);})//pL͔p
	.replace(/Z/g,"0").replace(//g,"1").replace(//g,"2").replace(/O/g,"3")
	.replace(/l/g,"4").replace(//g,"5").replace(/Z/g,"6").replace(//g,"7")
	.replace(//g,"8").replace(//g,"9")
	.replace(/[-]/g,function(s){return String.fromCharCode(s.charCodeAt(0)+0x0060);})//Ȃ̓Ji
	.replace(/\[([^\[:\]]*):([^\[:\]]*)\]/g,"$1$2\n$1")						// r܂ŌJԂ
	.replace(/\[8([^\[\]]*)\]/g,"$1\n$1\n$1\n$1\n$1\n$1\n$1\n$1")	// 8JԂ
	.replace(/\[7([^\[\]]*)\]/g,"$1\n$1\n$1\n$1\n$1\n$1\n$1")			// 7JԂ
	.replace(/\[6([^\[\]]*)\]/g,"$1\n$1\n$1\n$1\n$1\n$1")					// 6JԂ
	.replace(/\[5([^\[\]]*)\]/g,"$1\n$1\n$1\n$1\n$1")							// 5JԂ
	.replace(/\[4([^\[\]]*)\]/g,"$1\n$1\n$1\n$1")									// 4JԂ
	.replace(/\[3([^\[\]]*)\]/g,"$1\n$1\n$1")											// 3JԂ
	.replace(/\[2?([^\[\]]*)\]/g,"$1\n$1")												// 2JԂ
	.replace(/\[8([^\[\]]*)\]/g,"$1\n$1\n$1\n$1\n$1\n$1\n$1\n$1")	// 8JԂ
	.replace(/\[7([^\[\]]*)\]/g,"$1\n$1\n$1\n$1\n$1\n$1\n$1")			// 7JԂ
	.replace(/\[6([^\[\]]*)\]/g,"$1\n$1\n$1\n$1\n$1\n$1")					// 6JԂ
	.replace(/\[5([^\[\]]*)\]/g,"$1\n$1\n$1\n$1\n$1")							// 5JԂ
	.replace(/\[4([^\[\]]*)\]/g,"$1\n$1\n$1\n$1")									// 4JԂ
	.replace(/\[3([^\[\]]*)\]/g,"$1\n$1\n$1")											// 3JԂ
	.replace(/\[2?([^\[\]]*)\]/g,"$1\n$1")												// 2JԂ
	.replace(//g,"l").replace(/(l\d+)/g,"\n$1\n")			// l2,l4,l8,l16,l32Ɨs
	.replace(/\r\n/g,"\n")			// sR[h𐮗
	.replace(/&\n/g,"&")				// s&Ύsƍ
	.split(/\n+/);							// sŕ

for(var i=0;i<mml.length;i++){	// sƂ
	mml[i]=mml[i]
	.replace(/\s*\/\/.*$/,"")		// s̃Rg폜
	.replace(/#/g,"System.KeyFlag+=").replace(//g,"System.KeyFlag-=")
	.replace(/[#]/g,"+").replace(//g,"-")
	.replace(/K/g,"o")
	.replace(//g,"Time")
	.replace(/tʒu/g,"PlayForm")
	.replace(/F/g,"@")
//	.replace(//g,"v").replace(/v\(?\d*\)?;?/g,"")								// 폜
	.replace(/A/g,"Div")
	.replace(/y_/g,"y64,127;").replace(//g,"y64,0;").replace(/y\d*,\d*;*/g,"")
	.replace(//g,"Decresc=").replace(/fNbVFh/g,"Decresc=")
	.replace(/Decresc=\d*,\d*,\d*/g,"").replace(/Decresc=\d*,\d*/g,"")// 폜
	.replace(/傫/g,"Cresc=").replace(/NbVFh/g,"Cresc=")	// 폜
	.replace(/Cresc=[0-9+]*,[0-9+]*,\d*/g,"").replace(/Cresc=[0-9+]*,[0-9+]*/g,"")
	.replace(/Ȗ{.*}/g,"").replace(/{.*}/g,"")									// 폜
	.replace(/Rg{.*}/g,"").replace(//g,"")						// 폜
	.replace(/\*/g,"")																								// *͐Ή
	.replace(/q/g,"System.TimeSignature=")

	.replace(/e|\(?\d*\)?/g,"")
	.replace(/e|/g,"Tempo=")
	.replace(/[啛]?.*p[g/g,"Track=")
	.replace(/gbN/g,"Track=")
	.replace(/Q[g/g,"q").replace(/q\d*/g,"")												// 폜

	.replace(/h/g,"c").replace(//g,"d").replace(/~/g,"e").replace(/t@/g,"f")
	.replace(/\/g,"g").replace(//g,"a").replace(/V/g,"b").replace(/[b]/g,"r")
	.replace(/[/g,"^").replace(/[uv]/g,"\'").replace(/[な]/g,">").replace(/[]/g,"<")
	.replace(/(\^)(\d+)/g,"$1r$2")										// b1^8  b1^r8
	.replace(/([a-g][+\-]?)/g,"`$1").replace(/([a-g][+\-]?)/g,"\"$1")
	.replace(/(n\d+)\s*\^*/,"$1")					// n0 ^^^ -> n0 *** ͉𖳎 ***
	.replace(/System\.MeasureShift\(.*\);/g,"")
	.replace(/System\.TimeSignature=.*$/g,"")
	.replace(/ResetGM;*/g,"")			.replace(/Time\(\d*\);*/g,"")
	.replace(/T\(\d*\);*/g,"")		.replace(/N\(\d*\);*/g,"")
	.replace(/TrackSync;*/g,"")		.replace(/v\.T\(\d*\);*/g,"")
	.replace(/t\.N\(\d*\);*/g,"")	.replace(/REV\(\d*\)/g,"")
	.replace(/M\(\d*\)/g,"")			.replace(/Str.*=\{.*\}/g,"")
	.replace(/ *A */g,"")	.replace(/Sub{.*}/g,"")	.replace(/ +/g,"");
}

var loop=0;
var NoteList={};	NoteList["REST"]=nVoice+1;
var iNote=nVoice+2;	// iNote0`31(0͏I, 1VOICE0(), 2͋x)
var Tempo=120;
var SW="";					// g g`e[uStepWidth
var OnpuList=[], iOnpu=0;									// iOnpu0`7
var Len="";
var track=1, l=4, o=4;										// ftHg̓gbN1, l, K4
var ukeys="", dkeys="";										// ftHg͒#, Ȃ
for(var i=0;i<mml.length;i++){						// sƂ
	if(mml[i].match(/System\.KeyFlag\+=/)){	// System.KeyFlag+=(afg) 	a+,f+,g+
		ukeys=mml[i].replace(/System\.KeyFlag\+=\((.*)\)/,"$1");	// ukeys="afg"
	}else if(mml[i].match(/System\.KeyFlag\-=/)){	// System.KeyFlag-=(ag) 	a-,g-
		dkeys=mml[i].replace(/System\.KeyFlag\-=\((.*)\)/,"$1");	// dkeys="ag"
	}else if(mml[i].match(/Track=1/)){
	}else if(mml[i].match(/Track=/)){				// gbN2`3
		track++;	l=4;	o=4;									// ftHg͎lŉK4
	}else if(mml[i].match(/Tempo=?\(?\d*\)?/)){	// Tempo120: L4(8)500ms
		Tempo=mml[i].replace(/Tempo=?\(?(\d*)\)?/,"$1");
	}else if(mml[i].match(/^l\d/)){						// `
		l=mml[i].replace(/l/,"")*1;
	}else if(mml[i].match(/^\s*[ǎ啛]/)){
	}else if(mml[i].match(/TrackName\s*=/)){
	}else if(mml[i].match(/Copyright\s*=/)){
	}else if(mml[i].match(/Meta.*\s*=/)){
	}else if(mml[i].match(/@\(.*\)/)){
	}else if(mml[i].match(/Time\(.*\)/)){
	}else if(mml[i].match(/PlayForm\(.*\)/)){
	}else{

	mml[i]=mml[i].replace(/\s*\^/g,"^")																											// 20240305 C
	.replace(/'([^']*)([a-g]\+?)([^']*)([a-g]\+?)([^']*)\'/g,"$1$2$3$5")										// 2a͐擪̂ݗL
	.replace(/'([^']*)([a-g]\+?)([^']*)([a-g]\+?)([^']*)([a-g]\+?)([^']*)'/g,"$1$2$3$5$7")	// 3a͐擪̂ݗL
	.replace(/<>/g,"").replace(/<>/g,"").replace(/></g,"").replace(/></g,"");								// KύXE
	if(l==2){
		mml[i]=mml[i].replace(/([a-gr][+\-]?)2?\^/g,"$11");
	}else if(l==4){
		mml[i]=mml[i].replace(/([a-gr][+\-]?)4?\^\^\^\^\^/g,"$11\.")
		.replace(/([a-gr][+\-]?)4?\^\^\^/g,"$11")
		.replace(/([a-gr][+\-]?)4?\^\^/g,"$12\.")	.replace(/([a-gr][+\-]?)4?\^/g,"$12");
	}else if(l==8){
		mml[i]=mml[i].replace(/([a-gr][+\-]?)8?\^\^\^\^\^\^\^/g,"$11")
		.replace(/([a-gr][+\-]?)8?\^\^\^\^\^/g,"$12\.")
		.replace(/([a-gr][+\-]?)8?\^\^\^/g,"$12")
		.replace(/([a-gr][+\-]?)8?\^\^/g,"$14\.")	.replace(/([a-gr][+\-]?)8?\^/g,"$14");
	}else if(l==16){
		mml[i]=mml[i].replace(/([a-gr][+\-]?)\^\^\^\^\^\^\^/g,"$12")
		.replace(/([a-gr][+\-]?)\^\^\^\^\^/g,"$14\.")
		.replace(/([a-gr][+\-]?)\^\^\^/g,"$14")
		.replace(/([a-gr][+\-]?)\^\^/g,"$18\.")		.replace(/([a-gr][+\-]?)\^/g,"$18");
	}else if(l==32){
		mml[i]=mml[i].replace(/([a-gr][+\-]?)\^\^\^\^\^\^\^/g,"$14")
		.replace(/([a-gr][+\-]?)\^\^\^\^\^/g,"$18\.")
		.replace(/([a-gr][+\-]?)\^\^\^/g,"$18")
		.replace(/([a-gr][+\-]?)\^\^/g,"$116\.")	.replace(/([a-gr][+\-]?)\^/g,"$116");
	}
	mml[i]=mml[i].replace(/([a-gr][+\-]?)32\^\^\^\^\^\^\^/g,"$14")
	.replace(/([a-gr][+\-]?)32\^\^\^\^\^/g,"$18\.")
	.replace(/([a-gr][+\-]?)32\^\^\^/g,"$18")
	.replace(/([a-gr][+\-]?)32\^\^/g,"$116\.")	.replace(/([a-gr][+\-]?)32\^/g,"$116")
	.replace(/([a-gr][+\-]?)16\^\^\^\^\^\^\^/g,"$12")
	.replace(/([a-gr][+\-]?)16\^\^\^\^\^/g,"$14\.")
	.replace(/([a-gr][+\-]?)16\^\^\^/g,"$14")
	.replace(/([a-gr][+\-]?)16\^\^/g,"$18\.")		.replace(/([a-gr][+\-]?)16\^/g,"$18")
	.replace(/([a-gr][+\-]?)8\^\^\^\^\^\^\^/g,"$11")
	.replace(/([a-gr][+\-]?)8\^\^\^\^\^/g,"$12\.")
	.replace(/([a-gr][+\-]?)8\^\^\^/g,"$12")
	.replace(/([a-gr][+\-]?)8\^\^/g,"$14\.")		.replace(/([a-gr][+\-]?)8\^/g,"$14")
	.replace(/([a-gr][+\-]?)4\^\^\^\^\^/g,"$11\.")
	.replace(/([a-gr][+\-]?)4\^\^\^/g,"$11")
	.replace(/([a-gr][+\-]?)4\^\^/g,"$12\.")		.replace(/([a-gr][+\-]?)4\^/g,"$12")
	.replace(/([a-gr][+\-]?)2\^/g,"$11")
	.replace(/([a-gr][+\-]?4?)\^\^\^\^\^/g,"$11\.")
	.replace(/([a-gr][+\-]?4?)\^\^\^/g,"$11")
	.replace(/([a-gr][+\-]?4?)\^\^/g,"$12\.")		.replace(/([a-gr][+\-]?4?)\^/g,"$12")
	.replace(/``([a-g][+\-]?[0-9.]*)/g,">>$1<<")
	.replace(/`([a-g][+\-]?[0-9.]*)/g,">$1<")		// KύX
	.replace(/\"\"([a-g][+\-]?[0-9.]*)/g,"<<$1>>")
	.replace(/\"([a-g][+\-]?[0-9.]*)/g,"<$1>")	// KύX
	.replace(/<>/g,"").replace(/<>/g,"").replace(/></g,"").replace(/></g,"");	// KύXE
	for(var k=0;k<ukeys.length;k++){
		var c=ukeys.charAt(k);	mml[i]=mml[i].split(c).join(c+"+");		// a  a+
	}
	for(var k=0;k<dkeys.length;k++){
		var c=dkeys.charAt(k);	mml[i]=mml[i].split(c).join(c+"-");		// a  a-
	}
	mml[i]=mml[i].replace(/a-/g,"g+").replace(/b-/g,"a+").replace(/d-/g,"c+")
	.replace(/e-/g,"d+").replace(/g-/g,"f+")
	.replace(/Div{([<>])(.*)([<>])}/g,"$1Div{$2}$3")
	.replace(/Div{(["`]*.\+*)(["`]*.\+*)(["`]*.\+*)}2/g,"$18.$28.$38")
	.replace(/Div{(["`]*.\+*)(["`]*.\+*)(["`]*.\+*)}4/g,"$116.$216.$316")
	.replace(/Div{(["`]*.\+*)(["`]*.\+*)(["`]*.\+*)}8/g,"$132$232$316")
	.replace(/Div{(["`]*.\+*)(["`]*.\+*)(["`]*.\+*)}16/g,"$132$232")
	.replace(/Div{(["`]*.\+*)(["`]*.\+*)(["`]*.\+*)}32/g,"$132");
	if(l==2){
		mml[i]=mml[i].replace(/([a-gr]\+)(\D)/g,"$12$2")
		.replace(/([a-gr])([^0-9+])/g,"$12$2")	// a+a+2, aa2
		.replace(/([a-gr]\+)(\D)/g,"$12$2")
		.replace(/([a-gr])([^0-9+])/g,"$12$2")	// a+a+2, aa2
		.replace(/([a-gr]\+)(\D)/g,"$12$2")
		.replace(/([a-gr])([^0-9+])/g,"$12$2")	// a+a+2, aa2
		.replace(/([a-gr]\+?)$/,"$12");					// s a+a+2, aa2
	}else if(l==4){
		mml[i]=mml[i].replace(/Div{(["`]?.\+?)(["`]?.\+?)(["`]*.\+*)}/g,"$116.$216.$316")
		.replace(/([a-gr]\+)(\D)/g,"$14$2")
		.replace(/([a-gr])([^0-9+])/g,"$14$2")	// a+a+4, aa4
		.replace(/([a-gr]\+)(\D)/g,"$14$2")
		.replace(/([a-gr])([^0-9+])/g,"$14$2")	// a+a+4, aa4
		.replace(/([a-gr]\+)(\D)/g,"$14$2")
		.replace(/([a-gr])([^0-9+])/g,"$14$2")	// a+a+4, aa4
		.replace(/([a-gr]\+*)$/g,"$14");				// s a+a+4, aa4
	}else if(l==8){
		mml[i]=mml[i].replace(/Div{(["`]*.\+*)(["`]*.\+*)(["`]*.\+*)}/g,"$132$232$316")
		.replace(/([a-gr]\+)(\D)/g,"$18$2")
		.replace(/([a-gr])([^0-9+])/g,"$18$2")	// a+a+8, aa8
		.replace(/([a-gr]\+)(\D)/g,"$18$2")
		.replace(/([a-gr])([^0-9+])/g,"$18$2")	// a+a+8, aa8
		.replace(/([a-gr]\+)(\D)/g,"$18$2")
		.replace(/([a-gr])([^0-9+])/g,"$18$2")	// a+a+8, aa8
		.replace(/([a-gr]\+*)$/,"$18");					// s a+a+8, aa8
	}else if(l==16){
		mml[i]=mml[i].replace(/Div{(["`]*.\+*\)\(["`]*.\+*)(["`]*.\+*)}/g,"$132$232")
		.replace(/([a-gr]\+)(\D)/g,"$116$2")
		.replace(/([a-gr])([^0-9\+])/g,"$116$2")// a+a+16, aa16
		.replace(/([a-gr]\+)(\D)/g,"$116$2")
		.replace(/([a-gr])([^0-9\+])/g,"$116$2")// a+a+16, aa16
		.replace(/([a-gr]\+)(\D)/g,"$116$2")
		.replace(/([a-gr])([^0-9\+])/g,"$116$2")// a+a+16, aa16
		.replace(/([a-gr]\+*)$/,"$116");				// s a+a+16, aa16
	}else if(l==32){
		mml[i]=mml[i].replace(/Div{(["`]*.\+*)(["`]*.\+*)(["`]*.\+*)}/g,"$132")
		.replace(/([a-gr]\+)(\D)/g,"$132$2")
		.replace(/([a-gr])([^0-9+])/g,"$132$2")	// a+a+32, aa32
		.replace(/([a-gr]\+)(\D)/g,"$132$2")
		.replace(/([a-gr])([^0-9+])/g,"$132$2")	// a+a+32, aa32
		.replace(/([a-gr]\+)(\D)/g,"$132$2")
		.replace(/([a-gr])([^0-9+])/g,"$132$2")	// a+a+32, aa32
		.replace(/([a-gr]\+*)$/,"$132");				// s a+a+32, aa32
	}
	mml[i]=mml[i].replace(/Div{(["`]?.\+?)(["`]?.\+?)(["`]*.\+*)}/g,"$116.$216.$316")
	.replace(/([a-gr]\+)(\D)/g,"$14$2")
	.replace(/([a-gr])([^0-9+])/g,"$14$2")		// a+a+4, aa4
	.replace(/([a-gr]\+)(\D)/g,"$14$2")
	.replace(/([a-gr])([^0-9+])/g,"$14$2")		// a+a+4, aa4
	.replace(/([a-gr]\+)(\D)/g,"$14$2")
	.replace(/([a-gr])([^0-9+])/g,"$14$2")		// a+a+4, aa4
	.replace(/([a-gr]\+*)$/g,"$14");					// s a+a+4, aa4
	mml[i]=mml[i].replace(/([a-gr]\+?)32&([a-gr]\+?)32/g,function($0,$1,$2){return $1==$2?$1+"16":$0;})//a32&a32/a+32&a+32	a16/a+16
	.replace(/([a-gr]\+?)16&([a-gr]\+?)16/g,function($0,$1,$2){return $1==$2?$1+"8":$0;})//a16&a16/a+16&a+16		a8/a+8
	.replace(/([a-gr]\+?)8&([a-gr]\+?)8/g,  function($0,$1,$2){return $1==$2?$1+"4":$0;})//a8&a8/a+8&a+8			a4/a+4
	.replace(/([a-gr]\+?)4&([a-gr]\+?)4/g,  function($0,$1,$2){return $1==$2?$1+"2":$0;})//a4&a4/a+4&a+4			a2/a+2
	.replace(/([a-gr]\+?)32&([a-gr]\+?)32/g,function($0,$1,$2){return $1==$2?$1+"16":$0;})//a32&a32/a+32&a+32	a16/a+16
	.replace(/([a-gr]\+?)16&([a-gr]\+?)16/g,function($0,$1,$2){return $1==$2?$1+"8":$0;})//a16&a16/a+16&a+16	a8/a+8
	.replace(/([a-gr]\+?)8&([a-gr]\+?)8/g,  function($0,$1,$2){return $1==$2?$1+"4":$0;})//a8&a8/a+8&a+8		a4/a+4
	.replace(/([a-gr]\+?)4&([a-gr]\+?)4/g,  function($0,$1,$2){return $1==$2?$1+"2":$0;})//a4&a4/a+4&a+4		a2/a+2
	.replace(/([a-gr]\+?)16&([a-gr]\+?)32/g,function($0,$1,$2){return $1==$2?$1+"16.":$0;})//a16&a32/a+16&a+32a16./a+16.
	.replace(/([a-gr]\+?)8&([a-gr]\+?)16/g, function($0,$1,$2){return $1==$2?$1+"8.":$0;})//a8&a16/a+8&a+16		a8./a+8.
	.replace(/([a-gr]\+?)4&([a-gr]\+?)8/g,  function($0,$1,$2){return $1==$2?$1+"4.":$0;})//a4&a8/a+4&a+8		a4./a+4.
	.replace(/([a-gr]\+?)2&([a-gr]\+?)4/g,  function($0,$1,$2){return $1==$2?$1+"2.":$0;})//a2&a4/a+2&a+4		a2./a+2.
	.replace(/r16r32/g,"r16.")							// r16r32		r16.
	.replace(/r8r16([^\.])/g,"r8.$1")				// r8r16		r8.
	.replace(/r4r8([^\.])/g,"r4.$1")				// r4r8			r4.
	.replace(/r2r4([^\.])/g,"r2.$1")				// r2r4			r2.
	.replace(/r8r16$/g,"r8.")								// r8r16		r8.
	.replace(/r4r8$/g,"r4.")								// r4r8			r4.
	.replace(/r2r4$/g,"r2.")								// r2r4			r2.
	.replace(/([a-g]\+?)4&([a-g]\+?)16\.r32/g,
		function($0,$1,$2){return $1==$2?$1+"4.":$0;})		// a4&a16.r32		a4.
	.replace(/([a-g]\+?)2&([a-g]\+?)8\.r16/g,
		function($0,$1,$2){return $1==$2?$1+"2.":$0;})		// a2&a8.r16			a2.
	.replace(/([a-g]\+?)4&([a-g]\+?)16\.\(r[0-9]+\)r32/g,
		function($0,$1,$2){return $1==$2?$1+"4.$3":$0;})	// a4&a16.r4r32		a4.r4
	.replace(/([a-g]\+?)2&([a-g]\+?)8\.\(r[0-9]+\)r16/g,
		function($0,$1,$2){return $1==$2?$1+"2.$3":$0;}) 	// a2&a8.r4r16		a2.r4
	.replace(/[\s&]/g,"")										// Xy[XƏłȂ&폜
	.replace(/(Div)/g," $1")								// Div̑OɃXy[X
	.replace(/([na-grlo<>])/g," $1")				// Xy[X} ***unvǉ *****
	.replace(/^ /g,"")											// s̃Xy[X폜
	.replace(/({.*\) \(.*})/g,"$1$2").replace(/({.*\) \(.*})/g,"$1$2")	// ) (		)(
	.replace(/({.*\) \(.*})/g,"$1$2").replace(/({.*\) \(.*})/g,"$1$2")	// ) (		)(
	.replace(/({.*\) \(.*})/g,"$1$2").replace(/({.*\) \(.*})/g,"$1$2");	// ) (		)(
	var gakufu1="", comment1="	// ";
	var a=mml[i].split(/\s/);
	for(var j=0;j<a.length;j++){
		if(++loop>8000){	WScript.Echo("ERROR: yG܂B");	WScript.Quit();	}
		if(a[j].match(/^n\d+/)){									// *** Đ ******************
			comment1+="VOICE"+a[j].substring(1)+",";	// n0 -> VOICE0
			gakufu1+=a[j].replace(/^n(\d+)/,"$1+1,");	// n0 -> 0+1
		}else if(a[j].match(/^o\d/))	o=a[j].replace(/o/,"");		// Kw
		else if(a[j]=="<")	o--;									// K
		else if(a[j]==">")	o++;									// K
		else if(a[j].match(/l\d+/)){}							// w͖
		else if(a[j].match(/^[a-gr]\+?\d+\.?/)){	// x
			var c=Doremi[a[j].charAt(0)];						// c  DO
			if(a[j].match(/^[^r]/))	c+=o;						// DO4
			if(a[j].match(/^.\+/))	c+="_";					// _
			c=c																			// DO1`RA2, DO9`SI9~
			.replace(/DO1/g,"DO2").replace(/RE1/g,"RE2").replace(/MI1/g,"MI2")
			.replace(/FA1/g,"FA2").replace(/SO1/g,"SO2").replace(/RA1[^_]?/g,"RA2")
			.replace(/DO2/g,"DO3").replace(/RE2/g,"RE3").replace(/MI2/g,"MI3")
			.replace(/FA2/g,"FA3").replace(/SO2/g,"SO3").replace(/RA2[^_]?/g,"RA3")
			.replace(/DO9/g,"DO8").replace(/RE9/g,"RE8").replace(/MI9/g,"MI8")
			.replace(/FA9/g,"FA8").replace(/SO9/g,"SO8").replace(/RA9/g,"RA8")
			.replace(/SI9/g,"SI8");
			if(!(c in sw)){	WScript.Echo("ERROR1("+i+"s) "+mml[i]+"\n"+c+" ͎g܂");	WScript.Quit();}
			else if(!(c in NoteList)){										// ߂ẲȂ
				NoteList[c]=iNote++;												// NoteListɒǉ
				SW+=sw[c]+",";															// g g`e[uStepWidth
			}
			var aa=a[j]
			a[j]=a[j].replace(/^[a-gr]\+?/,"").replace(/\./,"_");
			var L="L"+a[j];																// L16
			if(!(L in Onpu)){	WScript.Echo("ERROR2("+i+"s) "+mml[i]+"\n"+aa+" ͎g܂"); WScript.Quit();}
			else if(!(L in OnpuList)){										// ߂ẲȂ
				OnpuList[L]=iOnpu++;
				Len+=Onpu[L]+",";
			}
			if(OnpuList[L]<8){
				if(NoteList[c]<32){
					gakufu1+=NoteList[c]+"|"+(OnpuList[L]*32)+",";
					comment1+=c+"|"+L+",";										// DO4|L16
				}else{
					gakufu1+=NoteList["REST"]+"|"+(OnpuList[L]*32)+",";
					comment1+="REST|"+L+",";									// 32ȏɂȂxŗ
				}
			}else									gakufu1+="0,";					// 8ȏɂȂI
		}else										gakufu1+=a[j];					// ̑s̏ꍇ
	}
	if(gakufu1!="")	sPart[track]+="\t"+gakufu1+comment1+"\n";
}
}
if(iNote>=32)	WScript.Echo("Warning: "+iNote+"ނ̉gp(ő31)Bꕔxɒu܂B");
if(iOnpu>8)		WScript.Echo("ERROR3: "+iOnpu+"ނ̉gp(ő8)Br܂ŉt܂B");

var	mymelo_h=fso.CreateTextFile(folder+"/mymelo2plus/mymelo2.h",true);
var s="// This file contains melody data created by mymelo2plus.wsf\n\n"
s+="#define MYMELO\n";
s+="#define WAVEFORM 1\n";
s+="#define NMELO "+(nMelo+1)+"	// number of melody data\n";
s+="#define NTRACK "+(track>nTrack?track:nTrack)+"	// number of track(1..3)\n\n";
tempo.push(Tempo);	// e|ǉ
s+="const uint16_t tempo[]={"+tempo.join(",")+"};	// TEMPO of each melody\n\n";	// 20240313 uint16_t

u=sMelo.match(/const uint8_t Len\d+\[\] PROGMEM=\{.*\};\n+/g);// ̋Ȃ
if(u)	s+=u.join("");																					// ΂
s+="const uint8_t Len"+nMelo+"[] PROGMEM={"+Len+"0};\n";			// ݂̋Ȃǉ
var pointerArray=sMelo.match(/const pLen\[\] PROGMEM=\{(.*)\};/)[1];
pointerArray=(pointerArray==""?[]:pointerArray.split(","));		// : "".split(",")  [] ł͂Ȃ [""]
pointerArray.push("Len"+nMelo);																// |C^[ǉ
s+="const uint8_t* const pLen[] PROGMEM={"+pointerArray.join(",")+"};	// pointer to score length array of each melody\n\n";

u=sMelo.match(/const uint16_t SW\d+\[\] PROGMEM=\{.*\};\n+/g);// ̋Ȃ
if(u)	s+=u.join("");																					// ΂
function repeat(s, n){	return n==0?"":(n==1?s:s+repeat(s,n-1));	}	// ݂̋Ȃǉ
s+="const uint16_t SW"+nMelo+"[] PROGMEM={"+repeat("0,",nVoice+2)+SW+"0};\n";
var pointerArray=sMelo.match(/const pSW\[\] PROGMEM=\{(.*)\};/)[1];
pointerArray=(pointerArray==""?[]:pointerArray.split(","));		// : "".split(",")  [] ł͂Ȃ [""]
pointerArray.push("SW"+nMelo);																// |C^[ǉ
s+="const uint16_t* const pSW[] PROGMEM={"+pointerArray.join(",")+"};	// pointer to step width array of each melody\n\n";

u=sMelo.match(/const uint8_t Melo\d+Part\d+\[\] PROGMEM=\{[\s\S]*?\};\n+/g);// ̋Ȃ
if(u)	s+=u.join("");																					// ΂
s+="const uint8_t Melo"+nMelo+"Part1[] PROGMEM={\t// "+fso.getFileName(filename)+"\n";	// ݂̋Ȃǉ
s+=sPart[1]+"\t0};\n"
s+="const uint8_t Melo"+nMelo+"Part2[] PROGMEM={\n";
s+=sPart[2]+"\t0};\n"
s+="const uint8_t Melo"+nMelo+"Part3[] PROGMEM={\n";
s+=sPart[3]+"\t0};\n"

pointerArray=sMelo.match(/const pPart1\[\] PROGMEM=\{(.*)\};/)[1];	// Part1
pointerArray=(pointerArray==""?[]:pointerArray.split(","));// : "".split(",")  [] ł͂Ȃ [""]
pointerArray.push("Melo"+nMelo+"Part1");	// ݂̋Ȃǉ Melo0Part1, ...
s+="const uint8_t* const pPart1[] PROGMEM={"+pointerArray.join(",")+"};\n";

pointerArray=sMelo.match(/const pPart2\[\] PROGMEM=\{(.*)\};/)[1];	// Part2
pointerArray=(pointerArray==""?[]:pointerArray.split(","));// : "".split(",")  [] ł͂Ȃ [""]
pointerArray.push("Melo"+nMelo+"Part2");	// ݂̋Ȃǉ Melo0Part2, ...
s+="const uint8_t* const pPart2[] PROGMEM={"+pointerArray.join(",")+"};\n";

pointerArray=sMelo.match(/const pPart3\[\] PROGMEM=\{(.*)\};/)[1];	// Part3
pointerArray=(pointerArray==""?[]:pointerArray.split(","));// : "".split(",")  [] ł͂Ȃ [""]
pointerArray.push("Melo"+nMelo+"Part3");	// ݂̋Ȃǉ Melo0Part3, ...
s+="const uint8_t* const pPart3[] PROGMEM={"+pointerArray.join(",")+"};\n";

mymelo_h.Write(s);
mymelo_h.Close();

}else if(filename.match(/\.wav$/)){		// wavt@ChbOhbv
// wavt@Cmyvoice.h쐬 ----------------------------------------------
	var wav=binaryFileToArray(filename);
	var samplebits=wav[16]+wav[17]*256;	// 16 bit
	var format	=wav[20]+wav[21]*256;		// 1 񈳏kPCM
	var ch			=wav[22]+wav[23]*256;		// 1 m
	var rate		=wav[24]+wav[25]*256+wav[26]*65536+wav[27]*16777216;// 8000 sps
	var wavlen	=wav[40]+wav[41]*256+wav[42]*65536+wav[43]*16777216;//f[^̃oCg
	if(samplebits!=16){
		WScript.Echo("1Tv16rbgwavt@CpӂĂ");
		WScript.Quit();
	}
	if(format!=1){
		WScript.Echo("񈳏kPCMwavt@CpӂĂ");
		WScript.Quit();
	}
	if(ch!=1){
		WScript.Echo("mwavt@CpӂĂ");
		WScript.Quit();
	}
	if(rate!=8000){
		WScript.Echo("TvOg8000Hzwavt@CpӂĂ");
		WScript.Quit();
	}

	var lastsample=0;											// Output of ADPCM predictor
	var lastindex=0;											// Quantizer step size index
	var j=0;
	var p=0;															// f[^̃|C^(l͐擪)
	var IndexTable=[											// Table of index changes
		[-1,2],															// 16kBPS
		[-1,-1,-1,-1,2,4,6,8],							// 32kBPS
	];
	var StepSizeTable=[										// Quantizer step size lookup table
		7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
		19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
		50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
		130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
		337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
		876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
		2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
		5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
		15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
	];

	var sVoice=readFile(folder+"/mymelo2plus/myvoice.h").replace(/\r\n/g,"\n");
	var codesize=0;
	if(sVoice.match(/#define\sCODESIZE\s4/))			codesize=4;	// 32kbps(4-bits * 8ksps)
	else if(sVoice.match(/#define\sCODESIZE\s2/))	codesize=2;	// 16kbps(2-bits * 8ksps)
	if(codesize!=4 && codesize!=2){	// CODESIZEݒȂ
		var btn=ws.Popup("i?\n͂(Y): i(ő1.5b)\n(N): i(ő3b)",0,"f[^",3);
		if(btn==6)	codesize=4;							// ͂(Y)Ȃ32kbps(4-bits * 8ksps)
		else				codesize=2;							// (N)Ȃ16kbps(2-bits * 8ksps)
	}
	// : "".split(",")  [] ł͂Ȃ [""] (length0ł͂Ȃ1)
	var pointerArray=sVoice.match(/const Voice\[\] PROGMEM=\{(.*)\};/)[1];
	pointerArray=(pointerArray==""?[]:pointerArray.split(","));
//	var nVoice=pointerArray.length;				// ݂̘^̃f[^
	var voicesizeArray=sVoice.match(/voicesize\[\]=\{(.*)\};/)[1];
	voicesizeArray=(voicesizeArray==""?[]:voicesizeArray.split(","));
	var s="// This file contains ADPCM encoded data created by myvoice.wsf\n\n";
	s+="#define MYVOICE\n";
	s+="#define CODESIZE "+codesize+"	// 4:4*8ksps=32kbps / 	2:2*8ksps=16kbps\n";
	s+="#define NVOICE "+(nVoice+1)+"		// number of voice data\n\n";
	var u=sVoice.match(/const uint8_t Voice\d+\[\] PROGMEM=\{[\s\S]*?\};\n/g);	// ̃f[^
	if(u)	s+=u.join("\n");
	s+="\nconst uint8_t Voice"+nVoice+"[] PROGMEM={	// "+(codesize==4?"dual 4":"quad 2")
			+"-bit ADPCM data from "+fso.getFileName(filename)+"\n";	// VKf[^̒ǉ
	var bytes=0;
	for(var p=44; p<wavlen;){
		if(bytes%8==0)	s+="\t";
		if(codesize==4){									// 32kbps(1Tv4-bit/sample)
			var val=wav[p++]|(wav[p++]<<8);
			if(val>=32768)	val-=66636;
			var code=ADPCMEncoder(val)<<4;
			if(p<wavlen){
				val=wav[p++]|(wav[p++]<<8);
				if(val>=32768)	val-=66636;
				code|=ADPCMEncoder(val);
			}
			s+="0x"+("0"+code.toString(16)).slice(-2)+", ";
			if((++bytes)%8==0)	s+="\n";
		}else{															// 16kbps(1Tv2-bit/sample)
			var val=wav[p++]|(wav[p++]<<8);		if(val>=32768)	val-=66636;
			var code=ADPCMEncoder(val)<<6;
			if(p<wavlen){
				val=wav[p++]|(wav[p++]<<8);			if(val>=32768)	val-=66636;
				code|=ADPCMEncoder(val)<<4;
				if(p<wavlen){
					val=wav[p++]|(wav[p++]<<8);		if(val>=32768)	val-=66636;
					code|=ADPCMEncoder(val)<<2;
					if(p<wavlen){
						val=wav[p++]|(wav[p++]<<8);	if(val>=32768)	val-=66636;
						code|=ADPCMEncoder(val);
						s+="0x"+("0"+code.toString(16)).slice(-2)+", ";
					}
				}
			}
			if((++bytes)%8==0)	s+="\n";
		}
	}
	s+="};\n";
	s=s.replace(/,\s}/,"}");
	pointerArray.push("Voice"+nVoice);		// Voice0, Voice1, ...
	s+="\nconst uint8_t* const Voice[] PROGMEM={"+pointerArray.join(",")+"};"
			+"	// pointer of each voice data\n";
	voicesizeArray.push(bytes);
	s+="\nuint16_t voicesize[]={"+voicesizeArray.join(",")+"};"
			+"	// size(bytes) of each voice data\n";
	var	myvoice_h=fso.CreateTextFile(folder+"/mymelo2plus/myvoice.h",true);
	myvoice_h.Write(s);
	myvoice_h.Close();
// ܂ --------------------------------------------------------------------
}
WScript.Echo("f[^ǉ܂");

function readFile(fname){
	ado.Type=2;														// Text
	ado.charset="_autodetect_all";
	ado.Open();
	ado.LoadFromFile(fname);
	var text=ado.ReadText(-1);						// adReadAll
	ado.Close();
	return text;
}
function writeFile(fname, text){				// UTF-8Ńt@C̕ۑ
	ado.Type=2;														// Text
//ado.charset="utf-8";									// SHIFT_JIS/utf-8
	ado.Open();
	ado.WriteText(text);									// adWriteLine
	ado.SaveToFile(fname, 2);							// adSaveCreateOverWrite
	ado.Close();
}
function binaryFileToArray(fname){
	ado.Type=1;														// Binary
	ado.Open();
	ado.LoadFromFile(fname);
	var bin=ado.Read();
	ado.Close();
	var array=VbBinaryToArray(bin).toArray();
	array.length--;
	return array;
};
// Original Code for PIC by Rodger Richey, 1-9-96
// This ADPCM routines were obtained from the Interactive Multimedia Association's
// Reference ADPCM algorithm.  This algorithm was first implemented by Intel/DVI.
function ADPCMDecoder(code){
	var predsample=lastsample;					// Restore previous values of predicted sample
	var index=lastindex;								// and quantizer step size index
	var diffq;													// Dequantized predicted difference
// Find quantizer step size from lookup table using index
	var step=StepSizeTable[index];			// Quantizer step size
	if(codesize==4){										// 32kbps(1Tv4-bit/sample)
// Inverse quantize the ADPCM code into a difference using the quantizer step size
		var diffq=step>>3;
		if(code&4)	diffq+=step;
		if(code&2)	diffq+=step>>1;
		if(code&1)	diffq+=step>>2;
// Add the difference to the predicted sample
		if(code&8)	predsample-=diffq;
		else				predsample+=diffq;
// Find new quantizer step size by adding the old index and a table lookup
// using the ADPCM code
		index+=IndexTable[1][code&0x07];
	}else{																// 16kbps(1Tv2-bit/sample)
// Inverse quantize the ADPCM code into a difference using the quantizer step size
		diffq=step>>1;
		if(code&1)	diffq+=step;
// Add the difference to the predicted sample
		if(code&2)	predsample-=diffq;
		else				predsample+=diffq;
// Find new quantizer step size by adding the old index and a table lookup
// using the ADPCM code
		index+=IndexTable[0][code&0x01];
	}
// Check for overflow of the new predicted sample
	if(predsample>32767)				predsample=32767;
	else if(predsample<-32768)	predsample=-32768;
	if(index<0)				index=0;
	else if(index>88)	index=88;
// Save predicted sample for next iteration and quantizer step size index
	lastsample=predsample;	lastindex=index;
	return(predsample);
}
function ADPCMEncoder(sample){
	var code;
	var predsample=lastsample;					// Restore previous values of predicted sample
	var index=lastindex;								// and quantizer step size index
	var step=StepSizeTable[index];			// Quantizer step size
	var diffq=sample-predsample;				// Dequantized predicted difference
	if(codesize==4){										// 32kbps(1Tv4-bit/sample)
		if(diffq>=0)								code=0;
		else{												code=8;		diffq=-diffq;	}
		if(diffq>=step){						code|=4;	diffq-=step;	}
		step>>=1;	if(diffq>=step){	code|=2;	diffq-=step;	}
		step>>=1;	if(diffq>=step)		code|=1;
	}else{																// 16kbps(1Tv2-bit/sample)
		if(diffq>=0)								code=0;
		else{												code=2;		diffq=-diffq;	}
		if(diffq>=step)							code|=1;
	}
	ADPCMDecoder(code);
	return(code);
}
</script>
</job>