package com.PP.IntelliSeg.MeasureIncrementSegmenter;
import java.util.ArrayList;
import java.util.List;
import org.herac.tuxguitar.song.models.TGBeat;
import org.herac.tuxguitar.song.models.TGMeasure;
import org.herac.tuxguitar.song.models.TGTrack;
import android.util.SparseArray;
import com.PP.IntelliSeg.Abstract.AbstractSegmenter;
import com.PP.IntelliSeg.Abstract.Instruction;
import com.PP.IntelliSeg.Abstract.Segment;
import com.PP.LunarTabsAndroid.APIs.TuxGuitarUtil;
import com.PP.LunarTabsAndroid.InstructionGenerator.DrumInstructionGenerator;
import com.PP.LunarTabsAndroid.InstructionGenerator.GuitarInstructionGenerator;
import com.PP.LunarTabsAndroid.InstructionGenerator.RepeatInstructionGenerator;
import com.PP.LunarTabsAndroid.InstrumentModels.ChordRecognizer;
/**
* Segmenter for measure increments.
* @author prateek
*
*/
public class MeasureIncrementSegmenter extends AbstractSegmenter {
//default params
public static final int increment_DEFAULT = 1;
//parameters
protected int increment;
//ctrs
public MeasureIncrementSegmenter() {
increment = increment_DEFAULT;
}
public MeasureIncrementSegmenter(int increment) {
this.increment = increment;
}
/**
* Implementation of segment.
* @param track The instrument to generate segments for
* @return
*/
@Override
public List<Segment> segment(TGTrack track) {
//get capo offset
int offset = track.getOffset();
//init return
List<Segment> rtn = new ArrayList<Segment>();
//init current segment structures
List<Instruction> instructions = new ArrayList<Instruction>();
int start=0;
int end=0;
int incCnt=0;
//get repeat measure instructions
List<TGMeasure> measures = TuxGuitarUtil.getMeasures(track);
SparseArray<String> repeatInstructions = RepeatInstructionGenerator.getRepeatInstructions(measures);
//iterate through measures and generate segments
for(int y=0; y < measures.size(); y++) {
//get measure and generate instructions for it
TGMeasure measure = measures.get(y);
List<TGBeat> beats = measure.getBeats();
for(int x=0; x < beats.size(); x++) {
String i1="";
String i2="";
String i3="";
TGBeat b = beats.get(x);
if(track.isPercussionTrack()) {
i1 = DrumInstructionGenerator.getInstance().getPlayInstruction(b,offset);
i2 = i1;
i3 = "";
}
else {
i1 = GuitarInstructionGenerator.getInstance().getPlayInstruction(b,offset);
// i2 = GuitarInstructionGenerator.getInstance().getStringFretInstruction(b);
i2 = GuitarInstructionGenerator.getInstance().getCondensedInstruction(b);
i3 = ChordRecognizer.getMatchTarget(b);
}
Instruction inst;
if(i1.toLowerCase().indexOf("rest") > -1) {
inst = new Instruction(Instruction.REST_INSTRUCTION);
}
else {
inst = new Instruction(Instruction.PLAY_INSTRUCTION);
}
inst.setBeat(b);
inst.setChordInst(i1);
inst.setSfInst(i2);
inst.setMatchTarget(i3);
instructions.add(inst);
}
incCnt++;
//add repeat instruction (if exists)
if(repeatInstructions.get((y+1))!=null) {
Instruction inst = new Instruction(Instruction.REPEAT_INSTRUCTION);
String repeatInst = repeatInstructions.get((y+1));
inst.setChordInst(repeatInst);
inst.setSfInst(repeatInst);
instructions.add(inst);
}
//store segment and restart if gone through enough measures
if(incCnt==increment) {
//create and store segment
end = y;
Segment s = new MeasureIncrementSegment(start,end);
s.setInstructions(instructions);
rtn.add(s);
//reset state
instructions = new ArrayList<Instruction>();
start = (y+1);
incCnt=0;
}
}
//do last one if needed
if(start!=measures.size()) {
end = measures.size()-1;
Segment s = new MeasureIncrementSegment(start,end);
s.setInstructions(instructions);
rtn.add(s);
}
//return
return rtn;
}
/**
* @return the increment
*/
public int getIncrement() {
return increment;
}
/**
* @param increment the increment to set
*/
public void setIncrement(int increment) {
this.increment = increment;
}
}