/*
* Copyright (C) 2014-2017 たんらる
*/
package fourthline.mmlTools.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import fourthline.mmlTools.ComposeRank;
/**
* MML基本ツール.
* {@code MML@aaa,bbb,ccc;} 形式を扱います。
*/
public final class MMLText {
private static int DEFAULT_PART_NUM = 4;
private String text[];
public MMLText() {
text = new String[ DEFAULT_PART_NUM ];
for (int i = 0; i < text.length; i++) {
text[i] = "";
}
}
public MMLText setMMLText(String mml) {
if (!mml.startsWith("MML@")) {
mml = "";
return this;
}
int start = 4;
int end = mml.indexOf(";");
if (end <= 0)
end = mml.length();
mml = mml.substring(start, end);
String parts[] = mml.split(",");
setMMLText(parts);
return this;
}
public MMLText setMMLText(String parts[]) {
for (int i = 0; (i < parts.length) && (i < this.text.length); i++) {
this.text[i] = parts[i];
}
return this;
}
public MMLText setMMLText(String melody, String chord1, String chord2, String songEx) {
String parts[] = { melody, chord1, chord2, songEx };
setMMLText(parts);
return this;
}
public boolean isEmpty() {
for (String s : this.text) {
if (s.length() > 0) {
return false;
}
}
return true;
}
public String getText(int index) {
if (index < this.text.length) {
return this.text[index];
}
return "";
}
/**
* {@code MML@aaa,bbb,ccc,ddd;} 形式でMMLを取得する
* ddd: 歌パートがない場合は、dddは出力しない.
* @return {@code MML@aaa,bbb,ccc,ddd;} 形式の文字列
*/
public String getMML() {
String mml = "MML@"
+ this.text[0] + ","
+ this.text[1]+ ","
+ this.text[2];
if ( this.text[3].length() > 0 ) {
mml += "," + this.text[3];
}
mml += ";";
return mml;
}
public ComposeRank mmlRank() {
return ComposeRank.mmlRank(this.text[0], this.text[1], this.text[2], this.text[3]);
}
/**
* 作曲ランクを表す文字列をフォーマットして作成します.
* 歌パートがある場合は、4つ分のパート表示を行います.
* @return フォーマット済みの文字列
*/
public String mmlRankFormat() {
String str = "Rank "
+ this.mmlRank().getRank() + " "
+ "( " + this.text[0].length()
+ ", " + this.text[1].length()
+ ", " + this.text[2].length();
if ( this.text[3].length() > 0 ) {
str += ", " + this.text[3].length();
}
str += " )";
return str;
}
/**
* rankで分割する (楽譜集)
* @param rank
* @return
*/
public List<MMLText> splitMML(ComposeRank rank) {
int cut[] = { rank.getMelody(), rank.getChord1(), rank.getChord2(), rank.getMelody() };
StringBuffer sb[] = new StringBuffer[cut.length];
for (int i = 0; i < sb.length; i++) {
sb[i] = new StringBuffer(text[i]);
}
ArrayList<MMLText> mmlList = new ArrayList<>();
while (Arrays.asList(sb).stream().anyMatch(s -> s.length() != 0)) {
String parts[] = new String[sb.length];
for (int i = 0; i < sb.length; i++) {
int min = Math.min( sb[i].length(), cut[i] );
parts[i] = sb[i].substring(0, min);
sb[i].delete(0, min);
}
mmlList.add( new MMLText().setMMLText(parts) );
}
return mmlList;
}
}