package ch.retorte.intervalmusiccompositor.compilation; import ch.retorte.intervalmusiccompositor.list.BlendMode; import ch.retorte.intervalmusiccompositor.list.EnumerationMode; import ch.retorte.intervalmusiccompositor.list.ListSortMode; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.List; import static ch.retorte.intervalmusiccompositor.list.BlendMode.SEPARATE; import static ch.retorte.intervalmusiccompositor.list.EnumerationMode.SINGLE_EXTRACT; import static ch.retorte.intervalmusiccompositor.list.ListSortMode.SORT; /** * Aggregates all needed compilation parameters. * * @author nw */ public class CompilationParameters { //---- Static public static final BlendMode DEFAULT_BLEND_MODE = SEPARATE; public static final Double DEFAULT_BLEND_DURATION = 1d; public static final EnumerationMode DEFAULT_ENUMERATION_MODE = SINGLE_EXTRACT; public static final ListSortMode DEFAULT_LIST_SORT_MODE = SORT; private static final String PATTERN_SEPARATOR = ","; //---- Fields private List<Integer> musicPattern = new ArrayList<>(); private List<Integer> breakPattern = new ArrayList<>(); private int iterations; private BlendMode blendMode = DEFAULT_BLEND_MODE; private double blendDuration = DEFAULT_BLEND_DURATION; private EnumerationMode enumerationMode = DEFAULT_ENUMERATION_MODE; private ListSortMode listSortMode = DEFAULT_LIST_SORT_MODE; private String outputPath; private String encoderIdentifier; //---- Methods public void setMusicPattern(String pattern) { musicPattern.clear(); musicPattern.addAll(parsePattern(pattern)); } public void setMusicPattern(Integer period) { musicPattern.clear(); musicPattern.add(period); } public List<Integer> getMusicPattern() { return musicPattern; } public void setBreakPattern(String pattern) { breakPattern.clear(); breakPattern.addAll(parsePattern(pattern)); } public void setBreakPattern(Integer period) { breakPattern.clear(); breakPattern.add(period); } public List<Integer> getBreakPattern() { return breakPattern; } private List<Integer> parsePattern(String musicPattern) { List<Integer> result = Lists.newArrayList(); for(String s : Splitter.on(PATTERN_SEPARATOR).trimResults().omitEmptyStrings().split(musicPattern)) { try { result.add(Math.abs(Integer.parseInt(s))); } catch (Exception e) { // ignoring unsuitable values } } return result; } private void setBlendMode(BlendMode blendMode) { this.blendMode = blendMode; } public void setBlendMode(String blendMode) { try { setBlendMode(BlendMode.valueOf(blendMode)); } catch (Exception e) { // nop } } public BlendMode getBlendMode() { return blendMode; } public void setBlendDuration(Double blendDuration) { this.blendDuration = blendDuration; } public Double getBlendDuration() { return blendDuration; } private void setEnumerationMode(EnumerationMode enumerationMode) { this.enumerationMode = enumerationMode; } public void setEnumerationMode(String enumerationMode) { try { setEnumerationMode(EnumerationMode.valueOf(enumerationMode)); } catch (Exception e) { // nop } } public EnumerationMode getEnumerationMode() { return enumerationMode; } public String getOutputPath() { return outputPath; } public void setOutputPath(String outputPath) { this.outputPath = outputPath; } String getEncoderIdentifier() { return encoderIdentifier; } public void setEncoderIdentifier(String encoderIdentifier) { this.encoderIdentifier = encoderIdentifier; } public void setIterations(Integer iterations) { this.iterations = Math.abs(iterations); } public Integer getIterations() { return iterations; } public ListSortMode getListSortMode() { return listSortMode; } public void setListSortMode(ListSortMode listSortMode) { this.listSortMode = listSortMode; } /** * A set of parameters is considered usable if there is something to record, i.e. the duration is not zero. */ public boolean hasUsableData() { return 0 < getDurationEstimationSeconds(); } public int getDurationEstimationSeconds() { int singleIterationDuration = 0; for (int i = 0; i < musicPattern.size(); i++) { // Add current pattern item singleIterationDuration += musicPattern.get(i); // Add current break item (or restart if there are not enough of them) if (0 < breakPattern.size()) { singleIterationDuration += breakPattern.get(i % breakPattern.size()); } } int durationEstimationValue = singleIterationDuration * iterations; // If cross fading is activated, add fade interval once (= a half at start // and one at the end) if (blendMode == BlendMode.CROSS && 0 < singleIterationDuration && 0 < iterations) { durationEstimationValue += blendDuration; } return durationEstimationValue; } }