function Main()
	INFLATE_SIZE = INFLATE_SIZE or 0	--//幅と高さを拡張して描画したい場合は、この値を定義せよ。例えば、dpavigen.exeのオプションに「-e "INFLATE_SIZE=5"」を指定する。LedAviGen.batを参考にせよ。
	--//タブ区切りファイルから、LED定義を読み込む。
	LED = { }
	for line in io.lines(LED_FNAME) do
		local a = Split(line)
		local vLed = { }
		local id  = assert(tonumber(a[1])) assert((id        >= 0) and (id     <= (2^16)-2))	--//LED番号(0〜(2^16)-2))	--//(2^16)-1は終端を示すので、LED番号には使用不可
		vLed.c    = assert(tonumber(a[2])) assert((vLed.c    == 1) or  (vLed.c ==        3))	--//要素(1=単色LED,3=フルカラーLED)
		vLed.name = assert(tostring(a[3])) assert(#vLed.name ~= 0)				--//名称
		vLed.x    = assert(tonumber(a[4])) assert((vLed.x    >= 0) and (vLed.x <= (2^16)-1))	--//左端座標
		vLed.y    = assert(tonumber(a[5])) assert((vLed.y    >= 0) and (vLed.y <= (2^16)-1))	--//上端座標
		vLed.w    = assert(tonumber(a[6])) assert((vLed.w    >= 1) and (vLed.w <= (2^16)-1))	--//幅
		vLed.h    = assert(tonumber(a[7])) assert((vLed.h    >= 1) and (vLed.h <= (2^16)-1))	--//高さ
	--//{{幅と高さを拡張して描画したい場合に対応。INFLATE_SIZE=0ならばダミー処理となる。
		vLed.x = vLed.x - INFLATE_SIZE
		vLed.y = vLed.y - INFLATE_SIZE
		vLed.w = vLed.w + INFLATE_SIZE * 2
		vLed.h = vLed.h + INFLATE_SIZE * 2
	--//{{幅と高さを拡張して描画したい場合に対応。INFLATE_SIZE=0ならばダミー処理となる。
		LED[id] = vLed
	end
	--//データファイルの各行について…
	local aHdr = nil
	for line in io.lines(DAT_FNAME) do
		local a = Split(line)
		--//1行目ならば、ヘッダ行と見なす
		if not aHdr then
			aHdr = { }
			for iCol, v in ipairs(a) do
				aHdr[iCol] = tonumber(v)	--//一行目が空フィールド(又は非数値)である列は、対応するLED番号の無い列と見なし、nilを格納する。このようにした理由は、LedTest1(or2).luaの出力形式にも対応するためである。LedTest1(or2).luaの出力形式は、一列目の二行目以降にフレーム番号，二列目の二行目以降にイントロorループ区分を出力している。これらの列を無視するためである。
			end
		--//2行目以降ならば、データ行と見なす
		else
			local d = { }
			--//このフレームの、全LEDの全要素の輝度を取得する
			for iCol, v in ipairs(a) do
				id = aHdr[iCol]					--//この列に対応するLED番号を取得する
				if id then					--//対応するLED番号が存在する列ならば…
					v = assert(tonumber(v))			--//必要
					if v ~= 0 then				--//不透明ならば…
						d[id] = (v-1) / (31-1) * 255	--//(1〜31)⇒(0〜255)に変換して格納する
					end
				end
			end
			--//画面を消去する
			Fill(0, 0, DispX, DispY, {0,1/3,1/3})
			--//各LEDについて…
			for id, vLed in pairs(LED) do	--//フルカラーLEDの番号は飛んでいるので、ipairsは不可
				local r,g,b
				--//単色LEDならば…
				if vLed.c == 1 then
					r = d[id+0]
					g = d[id+0]
					b = d[id+0]
				--//フルカラーLEDならば…
				else
					r = d[id+0]	--//【変更可能】RGBの順序が違う場合は変更せよ
					g = d[id+1]	--//【変更可能】RGBの順序が違う場合は変更せよ
					b = d[id+2]	--//【変更可能】RGBの順序が違う場合は変更せよ
				end
				--//ボックス枠を塗りつぶす
				Fill(vLed.x-1, vLed.y-1, vLed.w+2, vLed.h+2, 1)
				--//不透明ならば、点灯色で塗りつぶす
				if r or g or b then
					r = r or 0
					g = g or 0
					b = b or 0
					Fill(vLed.x, vLed.y, vLed.w, vLed.h, {(r/255),(g/255),(b/255)})
				--//透明ならば、透明色で塗りつぶし、×を描く
				else
					Fill(vLed.x, vLed.y, vLed.w, vLed.h, {0,1/3,1/3})
					Line(vLed.x,          vLed.y, vLed.x+vLed.w, vLed.y+vLed.h, 255)
					Line(vLed.x+vLed.w-1, vLed.y, vLed.x-1,      vLed.y+vLed.h, 255)
				end
			end
			--//1フレーム出力する
			coroutine.yield()
		end
	end
	--//コルーチンのメイン関数が終了すると、AVI生成も終了する
end

function Split(s)
	local a = { }						--//┐
	for v in string.gmatch(s .. "\t", "(.-)" .. "\t") do	--//├タブ区切りでフィールド分割を行う。空フィールドも認める。
		table.insert(a, v)				--//│
	end							--//┘
	return a
end
