/*
* Copyright (C) 2013 たんらる
*/
package fourthline.mmlTools;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import fourthline.mmlTools.core.UndefinedTickException;
/**
* MMLEvent
*/
public abstract class MMLEvent implements Serializable {
private static final long serialVersionUID = -6142467143073639266L;
// イベントの開始オフセット
private int tickOffset;
protected MMLEvent(int tickOffset) {
this.tickOffset = tickOffset;
}
public void setTickOffset(int tickOffset) {
this.tickOffset = tickOffset;
}
public int getTickOffset() {
return this.tickOffset;
}
public abstract String toString();
public abstract String toMMLString() throws UndefinedTickException;
/**
* tick長の空白を挿入します.
* @param list 空白を挿入するMMLEventリスト. MMLEventList以外のList構造も可.
* @param startTick 挿入する位置
* @param tick 挿入するtick長
*/
public static void insertTick(List<? extends MMLEvent> list, int startTick, int tick) {
for (MMLEvent event : list) {
int noteTick = event.getTickOffset();
if (noteTick >= startTick) {
event.setTickOffset(noteTick + tick);
}
}
}
/**
* tick長の部分を削除して詰めます.
* @param list 削除するMMLEventリスト. MMLEventList以外のList構造も可.
* @param startTick 削除する位置
* @param tick 削除するtick長
*/
public static void removeTick(List<? extends MMLEvent> list, int startTick, int tick) {
ArrayList<MMLEvent> deleteEvent = new ArrayList<>();
for (MMLEvent event : list) {
int eventTick = event.getTickOffset();
if (eventTick >= startTick) {
if (eventTick < startTick+tick) {
// 削除リストに加えておく.
deleteEvent.add(event);
} else {
event.setTickOffset(eventTick - tick);
}
}
}
for (MMLEvent event : deleteEvent) {
list.remove(event);
}
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof MMLEvent)) {
return false;
}
MMLEvent event = (MMLEvent) obj;
if (this.tickOffset == event.tickOffset) {
return true;
}
return false;
}
}