# mml2c.pl で整形済みの .h ファイルに WAIT マークを付加する
# PROGMEM(const) の必要性に注意

# マーク挿入可能タイミングのサーチ
# END マークでパート分割
# "{" "}" を含む行は無視してよい

$part = 0;
$time = 0;
foreach $line (<>) {
		$line =~ s/[\r\n]//g;
		if ($line !~ /,/) { next } # , を含まなければスキップ

		# 2要素に分割
		@ELEM = split(/,/, $line);

		# 要素の格納
		push(@{$NOTES[$part]}, [$ELEM[0], $ELEM[1], $time]);

		# パート終了
		if ($ELEM[0] eq "END") {
				$endtime[$part]=$time;   # 終了時刻記録
				$partlen[$part] = $cnt;
				$cnt=0;
				$part++; 
				$time=0;
				next;
		}
		
		# 時間加算
		$ELEM[0] =~ /(\d+)$/;
		$note = $1;
		if ($note==2) { $note = $ELEM[1] }
		$time += 1/$note;
		
		$cnt++;
}

# デバッグプリント
#foreach $n (@{$NOTES[3]}) {
#		print "$n->[2]\t\t$n->[0],$n->[1]\n";
#}


# 全パートを対象にする
@parts = sort({$partlen[$b]<=>$partlen[$a]} (0..$part-1));
$maxpart = $parts[0];

# WAIT 挿入可能候補時刻の検索
foreach $n (@{$NOTES[$maxpart]}) {
		# 候補時刻
		$time = $n->[2];
		# 全パート探索
		undef @poslist;
		foreach $p (0..$part-1) {
				$pos=0;
				$flag=-1;
				$parttime=0;
				foreach $nn (@{$NOTES[$p]}) {
						# print "$nn->[0], $nn->[1], $nn->[2]\n";
						# 検索中の時刻($time)より前に END が発見されたパートは無視する必要がある
						if (($nn->[0] eq "END") && $nn->[2]<$time) { $flag="END"; last }
						# 時刻が一致していたら追加
						if (abs($nn->[2] - $time) < 0.0001) { $timelog=$time; $flag=$pos; last }
						# 検索中の時刻の方が古ければもう見つからないので終了
						if ($nn->[2]>$time+1) { last; }
						$pos++;
				}
				if ($flag==-1) { last }
				push(@poslist, $flag);
		}
		# 全パートに一致ポイントが見つかった場合
		if (@poslist==$part) { 
				unshift(@poslist,$timelog); # 先頭に時刻を入れる
				push(@kouho, [@poslist]);   # @kouho に追加
		}
}

# WAIT を挿入
$inserted=0;
$previous=0;
foreach $k (@kouho) {
		# 配列展開
		@poslist = @{$k};
		$time = shift(@poslist);
		
		# 前回からN単位以上あいていれば挿入
		if ($time - $previous >1) {

				print STDERR "WAIT Inserted in $time\n";
				 $previous = $time;
				 foreach $p (0..$part-1) {
						 $index = $poslist[$p];
						 # 挿入実行($NOTES[] の参照先の最後には時刻が入っているが使用しない)
						 @notes = @{$NOTES[$p]};

						 # END マーク以前と以降で挿入位置が違う
						 if ($time<$endtime[$p]) {
								 @notes = (@notes[0..$index-1+$inserted], ["WAIT"], @notes[$index+$inserted..$#notes]);
						 } else {
								 @notes = (@notes[0..$#notes-1], ["WAIT"], $notes[$#notes]);
						 }
						 
						 $NOTES[$p] = [@notes];
				 }
				 $inserted++;
		 }
}

# 出力
print "const PROGMEM unsigned char gakufu[] = {\n";

foreach $p (0..$part-1) {
		foreach $n (@{$NOTES[$p]}) {
				print "$n->[0],\n";
				if ($n->[1] ne "") { print "$n->[1],\n";}
		}
		
}
print "};\n";
