diff --git a/build.sh b/build.sh index 56d65f6..a3d46e8 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ #javac -sourcepath "./src" -d "./bin" "./src/main/Main.java" -cp "libs/commons-math3-3.5.jar:libs/guava-18.0.jar" -#cp -R src/Gui/imgs bin/Gui/ +#cp -R src/gui/imgs bin/gui/ function join { local IFS="$1"; shift; echo "$*"; } @@ -8,4 +8,4 @@ libs_query=$(join : libs/*) mkdir -p bin javac -sourcepath "./src" -d "./bin" "./src/main/Main.java" -cp $libs_query -cp -R src/Gui/imgs bin/Gui/ +cp -R src/gui/imgs bin/gui/ diff --git a/imgs/Thumbs.db b/imgs/Thumbs.db deleted file mode 100755 index f9893c8..0000000 Binary files a/imgs/Thumbs.db and /dev/null differ diff --git a/src/Gui/imgs/0_sized.png b/src/Gui/imgs/0_sized.png deleted file mode 100755 index 3a045f1..0000000 Binary files a/src/Gui/imgs/0_sized.png and /dev/null differ diff --git a/src/Gui/imgs/16_sized.png b/src/Gui/imgs/16_sized.png deleted file mode 100755 index 6f63798..0000000 Binary files a/src/Gui/imgs/16_sized.png and /dev/null differ diff --git a/src/Gui/imgs/1_sized.png b/src/Gui/imgs/1_sized.png deleted file mode 100755 index 0d4b9ac..0000000 Binary files a/src/Gui/imgs/1_sized.png and /dev/null differ diff --git a/src/Gui/imgs/2_sized.png b/src/Gui/imgs/2_sized.png deleted file mode 100755 index a0def85..0000000 Binary files a/src/Gui/imgs/2_sized.png and /dev/null differ diff --git a/src/Gui/imgs/4_sized.png b/src/Gui/imgs/4_sized.png deleted file mode 100755 index cafcf0c..0000000 Binary files a/src/Gui/imgs/4_sized.png and /dev/null differ diff --git a/src/Gui/imgs/8_sized.png b/src/Gui/imgs/8_sized.png deleted file mode 100755 index e06dc7c..0000000 Binary files a/src/Gui/imgs/8_sized.png and /dev/null differ diff --git a/src/Gui/imgs/MyPointer.png b/src/Gui/imgs/MyPointer.png deleted file mode 100755 index ab21651..0000000 Binary files a/src/Gui/imgs/MyPointer.png and /dev/null differ diff --git a/src/Gui/imgs/bass_sized.png b/src/Gui/imgs/bass_sized.png deleted file mode 100755 index 6f00f60..0000000 Binary files a/src/Gui/imgs/bass_sized.png and /dev/null differ diff --git a/src/Gui/imgs/flat_sized.png b/src/Gui/imgs/flat_sized.png deleted file mode 100755 index e8f7ac9..0000000 Binary files a/src/Gui/imgs/flat_sized.png and /dev/null differ diff --git a/src/Gui/imgs/instrument.png b/src/Gui/imgs/instrument.png deleted file mode 100755 index 45a8433..0000000 Binary files a/src/Gui/imgs/instrument.png and /dev/null differ diff --git a/src/Gui/imgs/sharp_sized.png b/src/Gui/imgs/sharp_sized.png deleted file mode 100755 index 350dcb8..0000000 Binary files a/src/Gui/imgs/sharp_sized.png and /dev/null differ diff --git a/src/Gui/imgs/vio_sized.png b/src/Gui/imgs/vio_sized.png deleted file mode 100755 index 53f4e5f..0000000 Binary files a/src/Gui/imgs/vio_sized.png and /dev/null differ diff --git a/src/Gui/imgs/volume.png b/src/Gui/imgs/volume.png deleted file mode 100755 index d22b114..0000000 Binary files a/src/Gui/imgs/volume.png and /dev/null differ diff --git a/src/Model/Action.java b/src/Model/Action.java deleted file mode 100755 index cfd925b..0000000 --- a/src/Model/Action.java +++ /dev/null @@ -1,17 +0,0 @@ -package Model; - -import java.util.HashMap; -import java.util.Map; - -public class Action { - - private Map paramsForUndo = new HashMap<>(); - - private ActionFactory factory = null; - Boolean done = false; - Boolean undone = false; - - public Action(ActionFactory factory) { - this.factory = factory; - } -} diff --git a/src/Model/ActionFactory.java b/src/Model/ActionFactory.java deleted file mode 100755 index eb341d2..0000000 --- a/src/Model/ActionFactory.java +++ /dev/null @@ -1,99 +0,0 @@ -package Model; - -import Stuff.Tools.Logger; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.function.*; - -public class ActionFactory { - - final private static HashMap emptyHashMap = new HashMap<>(); - - public Function> doLambda = (combo) -> null; - public BiFunction, Boolean> undoLambda = (combo, paramsForUndo) -> false; - - private Boolean omitMenuBar = false; - - public Combo combo = null; - - public ActionFactory(Combo combo) { - this.combo = combo; - } - public ActionFactory addTo(Map map) { - map.put(this.combo, this); - return this; - } - - public ActionFactory setDo(Function lambda) { - doLambda = (combo) -> { - if (lambda.apply(combo)) { - return new HashMap<>(); - } else { - return null; - } - }; - return this; - } - - // -_- - public ActionFactory setDo2(Function> lambda) { - doLambda = lambda; - return this; - } - - public ActionFactory setDo(Consumer lambda) { - doLambda = (e) -> { lambda.accept(e); return emptyHashMap; }; - return this; - } - - public ActionFactory setDo(Runnable lambda) { - doLambda = (e) -> { - lambda.run(); return emptyHashMap; }; - return this; - } - - public ActionFactory setDo(Callable lambda) { - doLambda = (e) -> { - Boolean result = false; - try { result = lambda.call(); } - catch (Exception exc) { Logger.fatal(exc, "Sorry bro, nevhujebu. This lambda came from ActionFactory::setDo(Callable)"); } - return result ? emptyHashMap : null; - }; - return this; - } - - public ActionFactory setUndo(Consumer lambda) { - undoLambda = (e, action) -> { lambda.accept(e); return true; }; - return this; - } - - public ActionFactory setUndo(BiConsumer> lambda) { - undoLambda = (combo, paramsForUndo) -> { lambda.accept(combo, paramsForUndo); return true; }; - return this; - } - - public ActionFactory biDirectional() { - this.undoLambda = (combo, action) -> this.doLambda.apply(combo) != null ? true : false; - return this; - } - - public ActionFactory setUndoChangeSign() { - this.undoLambda = (combo, action) -> this.doLambda.apply(combo.changeSign()) != null ? true : false; - return this; - } - - public ActionFactory setOmitMenuBar(Boolean value) { - this.omitMenuBar = true; - return this; - } - - public Boolean omitMenuBar() { - return this.omitMenuBar; - } - - public Action createAction() { - return new Action(this); - } -} diff --git a/src/Model/Helper.java b/src/Model/Helper.java deleted file mode 100755 index e5cb174..0000000 --- a/src/Model/Helper.java +++ /dev/null @@ -1,125 +0,0 @@ -package Model; - -import Model.Field.Arr; -import Model.Field.Field; -import BlockSpacePkg.ArticlePkg.Article; -import BlockSpacePkg.ArticlePkg.Paragraph; -import BlockSpacePkg.BlockSpace; -import BlockSpacePkg.Image.ImagePanel; -import BlockSpacePkg.StaffPkg.Accord.Accord; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import BlockSpacePkg.StaffPkg.Staff; -import BlockSpacePkg.StaffPkg.StaffPanel; -import BlockSpacePkg.Block; -import Stuff.Tools.Logger; -import org.apache.commons.math3.fraction.Fraction; -import org.json.JSONObject; - -import java.awt.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class Helper { - - IModel model; - - public Helper(IModel model) { - this.model = model; - } - - @Deprecated - public static JSONObject getJsonRepresentation(IModel model) { - JSONObject dict = new JSONObject(); - model.getJsonRepresentation(dict); - - // TODO: arghhh! No instanceof! Interface::getHelper mazafaka! - if (model instanceof Paragraph) { - Helper helper = Paragraph.class.cast(model).getModelHelper(); - for (Field field : helper.fieldStorage) { - dict.put(field.getName(), field.get()); - } - } - - return dict; - } - - // TODO: use it instead of the deprecated above - public JSONObject getJsonRepresentation() { - return Helper.getJsonRepresentation(model); - } - - public void getJsonRepresentation(JSONObject dict) { - for (Field field : fieldStorage) { - if (field.get().getClass() != Boolean.class || field.get() != field.defaultValue) { // Issue[69] - dict.put(field.getName(), field.getJsonValue()); - } - } - } - - public IModel reconstructFromJson(JSONObject jsObject) { - for (Field field : fieldStorage) { - if (jsObject.has(field.getName())) { field.setValueFromJsObject(jsObject); } - else { Logger.warning("Source does not have field [" + field.getName() + "] for class {" + model.getClass().getSimpleName() + "}"); } - } - return model; - } - - public Cursor getDefaultCursor() { - return model instanceof Paragraph ? Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR) : - Cursor.getDefaultCursor(); - } - - // field getters - - private List fieldStorage = new ArrayList<>(); - - public List getFieldStorage() { return fieldStorage; } - - @Deprecated // use direct construct instead - public Field addField(String fieldName, Integer fieldValue) { - return new Field<>(fieldName, fieldValue, model); - } - @Deprecated // use direct construct instead - public Field addField(String fieldName, Fraction fieldValue) { - return new Field<>(fieldName, fieldValue, model); - } - @Deprecated // use direct construct instead - public Field addField(String fieldName, String fieldValue) { - return new Field<>(fieldName, fieldValue, model); - } - @Deprecated // use direct construct instead - public Field addField(String fieldName, Boolean fieldValue) { - return new Field<>(fieldName, fieldValue, model); - } - @Deprecated // use direct construct instead - public Arr addField(String fieldName, List fieldValue, Class cls) { - return (Arr)new Arr(fieldName, fieldValue, model, cls); - } - - // retarded language - public List makeFakePossibleChildListForClassMethods() { - if (model.getClass() == BlockSpace.class) { - return Arrays.asList(new Block(new ImagePanel((BlockSpace)model), (BlockSpace)model)); - } else if (model.getClass() == Block.class) { - Block scroll = (Block)model; - return Arrays.asList(new StaffPanel(scroll.getModelParent()), new Article(scroll.getModelParent()), new ImagePanel(scroll.getModelParent())); - } else if (model.getClass() == Article.class) { - return Arrays.asList(new Paragraph((Article)model)); - } else if (model.getClass() == StaffPanel.class) { - return Arrays.asList(new Staff((StaffPanel)model)); - } else if (model.getClass() == Staff.class) { - return Arrays.asList(new Accord((Staff)model)); - } else if (model.getClass() == Accord.class) { - return Arrays.asList(new Nota((Accord)model)); - } else { - return new ArrayList<>(); - } - } - - public static Fraction limit(Fraction value, Fraction min, Fraction max) { - value = value.compareTo(min) < 0 ? min : value; - value = value.compareTo(max) > 0 ? max : value; - return value; - } -} diff --git a/src/Model/IModel.java b/src/Model/IModel.java deleted file mode 100755 index 29135fa..0000000 --- a/src/Model/IModel.java +++ /dev/null @@ -1,28 +0,0 @@ -package Model; - -import org.apache.commons.math3.fraction.Fraction; -import org.json.JSONException; -import org.json.JSONObject; - -public interface IModel { - - IComponentModel getModelParent(); - Helper getModelHelper(); - - default void getJsonRepresentation(JSONObject dict) { - getModelHelper().getJsonRepresentation(dict); - } - default JSONObject getJsonRepresentation() { - return Helper.getJsonRepresentation(this); - } - default IModel reconstructFromJson(JSONObject jsObject) throws JSONException { - return getModelHelper().reconstructFromJson(jsObject); - } - - default int limit(int value, int min, int max) { return Math.min(Math.max(value, min), max); } - default Fraction limit(Fraction value, Fraction min, Fraction max) { - value = value.compareTo(min) < 0 ? min : value; - value = value.compareTo(max) > 0 ? max : value; - return value; - } -} diff --git a/src/Stuff/Tools/jmusicIntegration/INota.java b/src/Stuff/Tools/jmusicIntegration/INota.java deleted file mode 100644 index 0a27551..0000000 --- a/src/Stuff/Tools/jmusicIntegration/INota.java +++ /dev/null @@ -1,56 +0,0 @@ -package Stuff.Tools.jmusicIntegration; - -import Gui.ImageStorage; -import Model.Helper; -import Stuff.Tools.Bin; -import Stuff.Tools.Logger; -import org.apache.commons.math3.fraction.Fraction; - -public interface INota extends Comparable { - - Integer getTune(); - Integer getChannel(); - Fraction getLength(); - Boolean isTriplet(); - - default int compareTo(INota n) { - return ((n.getTune() - this.getTune()) << 4) + (n.getChannel() - this.getChannel()); - } - - static Fraction legnthNorm(Fraction value) { - if (!isDotable(value)) { - Logger.warning("Not Dotable Fraction: " + value); - } - return Helper.limit(value, new Fraction(1, 256), new Fraction(4)); // sometimes need to fill diff between triplet and straight -// return Helper.limit(value, new Fraction(1, 16), new Fraction(2)); - } - - default Boolean isDotable() { - return isDotable(getLength()); - } - - // 1/256 + 1/128 + 1/64 + 1/32 + 1/16 + 1/8 + 1/4 + 1/2 = 1111 1111 - - // 0000 0111 - true - - // 0001 1111 - true - - // 0011 1111 - true - - // 0010 0110 - false - - /** @return true if length can be expressed through sum 2 + 1 + 1/2 + 1/4 + 1/8 + ... 1/2^n */ - static Boolean isDotable(Fraction length) { - length = length.divide(ImageStorage.getGreatestPossibleNotaLength().multiply(2)); // to make sure, that the length is less than 1 - if (length.compareTo(new Fraction(1)) >= 0) { - Logger.fatal("Providen fraction is greater than 1 even after deviding it to gretest possible Nota length! We'll all die!!!" + length); - } - - if (Bin.isPowerOf2(length.getDenominator())) { // will be false for triols - return Bin.isPowerOf2(length.getNumerator() + 1); // not sure... but, ok, kinda sure - } else { - return false; - } - } - -} diff --git a/src/Stuff/Tools/jmusicIntegration/addPhrase.java b/src/Stuff/Tools/jmusicIntegration/addPhrase.java deleted file mode 100644 index 13feb49..0000000 --- a/src/Stuff/Tools/jmusicIntegration/addPhrase.java +++ /dev/null @@ -1,96 +0,0 @@ -package Stuff.Tools.jmusicIntegration; - -import BlockSpacePkg.StaffPkg.Accord.Accord; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import BlockSpacePkg.StaffPkg.Staff; -import Gui.ImageStorage; -import Stuff.Tools.Logger; -import main.Main; -import org.apache.commons.math3.fraction.Fraction; -import org.json.JSONArray; -import org.json.JSONObject; - -import javax.swing.*; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public class AddPhrase { - - final private Staff staff; - final private List noteList; - final private Fraction startOffset; - final private int channel; - - public AddPhrase(Staff staff, JSONObject phraseJs, int channel) { - this.staff = staff; - this.channel = channel; - this.noteList = toList(phraseJs.getJSONArray("noteList")) - .stream().map(j -> JmNote.mk(j, channel)).collect(Collectors.toList()); - this.startOffset = phraseJs.has("startTime") - ? JmNote.toFrac(phraseJs.getDouble("startTime")) - : new Fraction(0); - } - - public void perform() { - Fraction curPos = this.startOffset; - for (JmNote note: noteList) { - - if (note.getTune() == Integer.MIN_VALUE) { - // , INT_MIN, ! - note = JmNote.mk(0, note.getLength(), channel); - } - - put(curPos, note); - - curPos = curPos.add(note.getRealLength()); - } - } - - private void put(Fraction pos, JmNote note) { - Nota nota; - if (note.isDotable() || note.getLength().compareTo(ImageStorage.getSmallestPossibleNotaLength()) < 0) { - nota = staff.putAt(pos, note); - } else { - Fraction base = getClosestRegularBelow(note.getLength()); - Fraction rest = note.getLength().subtract(base); - nota = staff.putAt(pos, JmNote.mk(note.getTune(), base, channel)).setIsLinkedToNext(true); - nota = staff.putAt(pos.add(base), JmNote.mk(note.getTune(), rest, channel)); - } - - /** @debug */ -// nota.getFirstAwtParent().repaint(); -// JOptionPane.showMessageDialog(Main.window, nota.toString()); - } - - // clean with dots - private static Fraction getClosestRegularBelow(Fraction irregular) { - Fraction regular = getClosestCleanBelow(irregular); - - // for now i'll allow only one dot here, cuz more dots are rarely used; less conditions - more chances to guess correctly - if (regular.add(regular.divide(2)).compareTo(irregular) < 0) { - regular = regular.add(regular.divide(2)); - } - - return regular; - } - - private static Fraction getClosestCleanBelow(Fraction irregular) { - for (Fraction maybeResult: ImageStorage.getAvailableNotaLengthList()) { - if (irregular.compareTo(maybeResult) >= 0) { - return maybeResult; - } - } - - Logger.fatal("You should not need to call this method with such small argument"); - return new Fraction(-100); - } - - private static List toList(JSONArray arr) { - List result = new ArrayList<>(); - for (int i = 0; i < arr.length(); ++i) { - result.add(arr.getJSONObject(i)); - } - return result; - } -} diff --git a/src/BlockSpacePkg/Block.java b/src/blockspace/Block.java similarity index 89% rename from src/BlockSpacePkg/Block.java rename to src/blockspace/Block.java index 8c2bb23..e2032e2 100755 --- a/src/BlockSpacePkg/Block.java +++ b/src/blockspace/Block.java @@ -1,10 +1,10 @@ -package BlockSpacePkg; -import BlockSpacePkg.StaffPkg.Staff; -import Model.AbstractHandler; -import Model.Helper; -import Model.IComponentModel; -import Stuff.OverridingDefaultClasses.Scroll; -import Stuff.OverridingDefaultClasses.TruLabel; +package blockspace; +import blockspace.staff.Staff; +import model.AbstractHandler; +import model.Helper; +import model.IComponentModel; +import stuff.OverridingDefaultClasses.Scroll; +import stuff.OverridingDefaultClasses.TruLabel; import org.json.JSONException; import org.json.JSONObject; @@ -75,12 +75,13 @@ public Helper getModelHelper() { } @Override - public void getJsonRepresentation(JSONObject dict) { - dict.put("x", getLocation().getX()); - dict.put("y", getLocation().getY()); - dict.put("width", getWidth()); - dict.put("height", getHeight()); - dict.put("title", getTitle()); + public JSONObject getJsonRepresentation() { + return new JSONObject() + .put("x", getLocation().getX()) + .put("y", getLocation().getY()) + .put("width", getWidth()) + .put("height", getHeight()) + .put("title", getTitle()); } @Override public Block reconstructFromJson(JSONObject jsObject) throws JSONException { diff --git a/src/BlockSpacePkg/BlockHandler.java b/src/blockspace/BlockHandler.java similarity index 97% rename from src/BlockSpacePkg/BlockHandler.java rename to src/blockspace/BlockHandler.java index 41de484..8345b36 100755 --- a/src/BlockSpacePkg/BlockHandler.java +++ b/src/blockspace/BlockHandler.java @@ -1,13 +1,12 @@ -package BlockSpacePkg; +package blockspace; -import Model.*; -import Stuff.OverridingDefaultClasses.TruMap; +import model.*; +import stuff.OverridingDefaultClasses.TruMap; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.LinkedHashMap; -import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; diff --git a/src/BlockSpacePkg/BlockSpace.java b/src/blockspace/BlockSpace.java similarity index 89% rename from src/BlockSpacePkg/BlockSpace.java rename to src/blockspace/BlockSpace.java index b6ad047..aebe0ce 100755 --- a/src/BlockSpacePkg/BlockSpace.java +++ b/src/blockspace/BlockSpace.java @@ -1,13 +1,13 @@ -package BlockSpacePkg; +package blockspace; -import Gui.ImageStorage; -import Gui.Settings; +import gui.ImageStorage; +import gui.Settings; import main.MajesticWindow; -import Model.*; -import BlockSpacePkg.Image.ImagePanel; -import BlockSpacePkg.StaffPkg.StaffPanel; -import BlockSpacePkg.ArticlePkg.Article; -import Stuff.Tools.Logger; +import model.*; +import blockspace.Image.ImagePanel; +import blockspace.staff.StaffPanel; +import blockspace.article.Article; +import stuff.tools.Logger; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -102,13 +102,14 @@ public Helper getModelHelper() { public ImageStorage getImageStorage() { return this.imageStorage; } @Override - public void getJsonRepresentation(JSONObject dict) { - dict.put("childBlockList", new JSONArray(childScrollList.stream().map(child -> { - JSONObject childJs = Helper.getJsonRepresentation(child.content); - childJs.put("scroll", Helper.getJsonRepresentation(child)); - childJs.put("className", child.content.getClass().getSimpleName()); - return childJs; - }).toArray())); + public JSONObject getJsonRepresentation() { + return new JSONObject() + .put("childBlockList", new JSONArray(childScrollList.stream().map(child -> { + JSONObject childJs = child.content.getJsonRepresentation(); + childJs.put("scroll", child.getJsonRepresentation()); + childJs.put("className", child.content.getClass().getSimpleName()); + return childJs; + }).toArray())); } @Override public BlockSpace reconstructFromJson(JSONObject jsObject) throws JSONException { diff --git a/src/BlockSpacePkg/BlockSpaceHandler.java b/src/blockspace/BlockSpaceHandler.java similarity index 92% rename from src/BlockSpacePkg/BlockSpaceHandler.java rename to src/blockspace/BlockSpaceHandler.java index 1725011..35baff9 100755 --- a/src/BlockSpacePkg/BlockSpaceHandler.java +++ b/src/blockspace/BlockSpaceHandler.java @@ -1,9 +1,9 @@ -package BlockSpacePkg; +package blockspace; -import Model.*; -import Stuff.OverridingDefaultClasses.TruMap; -import Stuff.Tools.FileProcessor; -import Stuff.Tools.Logger; +import model.*; +import stuff.OverridingDefaultClasses.TruMap; +import stuff.tools.FileProcessor; +import stuff.tools.Logger; import javax.swing.*; import javax.swing.filechooser.FileFilter; @@ -11,8 +11,6 @@ import java.io.File; import java.util.Arrays; import java.util.LinkedHashMap; -import java.util.Map; -import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; @@ -83,7 +81,7 @@ public Boolean mouseDraggedFinal(ComboMouse mouse) { @Override public Boolean mouseReleasedFinal(ComboMouse mouse) { IComponentModel eventOrigin = (IComponentModel)getFirstParentComponent(mouse.getOrigin()); - eventOrigin.setCursor(eventOrigin.getModelHelper().getDefaultCursor()); + eventOrigin.setCursor(eventOrigin.getDefaultCursor()); return true; } diff --git a/src/BlockSpacePkg/IBlockSpacePanel.java b/src/blockspace/IBlockSpacePanel.java similarity index 61% rename from src/BlockSpacePkg/IBlockSpacePanel.java rename to src/blockspace/IBlockSpacePanel.java index 87869b0..53d0a9b 100755 --- a/src/BlockSpacePkg/IBlockSpacePanel.java +++ b/src/blockspace/IBlockSpacePanel.java @@ -1,6 +1,6 @@ -package BlockSpacePkg; +package blockspace; -import Model.IComponentModel; +import model.IComponentModel; public interface IBlockSpacePanel extends IComponentModel { diff --git a/src/BlockSpacePkg/Image/ImagePanel.java b/src/blockspace/Image/ImagePanel.java similarity index 89% rename from src/BlockSpacePkg/Image/ImagePanel.java rename to src/blockspace/Image/ImagePanel.java index 6225f20..590d065 100755 --- a/src/BlockSpacePkg/Image/ImagePanel.java +++ b/src/blockspace/Image/ImagePanel.java @@ -1,11 +1,11 @@ -package BlockSpacePkg.Image; - -import Model.*; -import BlockSpacePkg.BlockSpace; -import BlockSpacePkg.IBlockSpacePanel; -import BlockSpacePkg.Block; -import Stuff.OverridingDefaultClasses.TruMap; -import Stuff.Tools.Logger; +package blockspace.Image; + +import model.*; +import blockspace.BlockSpace; +import blockspace.IBlockSpacePanel; +import blockspace.Block; +import stuff.OverridingDefaultClasses.TruMap; +import stuff.tools.Logger; import org.json.JSONException; import org.json.JSONObject; @@ -76,7 +76,9 @@ public Helper getModelHelper() { } @Override - public void getJsonRepresentation(JSONObject dict) { dict.put("imagePath", this.imagePath); } + public JSONObject getJsonRepresentation() { + return new JSONObject().put("imagePath", this.imagePath); + } @Override public ImagePanel reconstructFromJson(JSONObject jsObject) throws JSONException { this.loadImage(new File(jsObject.getString("imagePath"))); @@ -88,7 +90,7 @@ public ImagePanel reconstructFromJson(JSONObject jsObject) throws JSONException private void loadImage(File file) { this.imagePath = file.getAbsolutePath(); try { - this.image = getScroll().getModelParent().getImageStorage().openImage(file.toURI().toURL()); + this.image = getScroll().getModelParent().getImageStorage().openRandomImage(file.toURI().toURL()); } catch (MalformedURLException exc) { Logger.fatal(exc, "No WAI"); } scroll.setTitle(file.getName()); diff --git a/src/BlockSpacePkg/ArticlePkg/Article.java b/src/blockspace/article/Article.java similarity index 93% rename from src/BlockSpacePkg/ArticlePkg/Article.java rename to src/blockspace/article/Article.java index 11bed52..ec0baa4 100755 --- a/src/BlockSpacePkg/ArticlePkg/Article.java +++ b/src/blockspace/article/Article.java @@ -1,10 +1,10 @@ -package BlockSpacePkg.ArticlePkg; +package blockspace.article; -import Model.*; -import BlockSpacePkg.BlockSpace; -import BlockSpacePkg.IBlockSpacePanel; -import BlockSpacePkg.Block; -import Stuff.OverridingDefaultClasses.TruMap; +import model.*; +import blockspace.BlockSpace; +import blockspace.IBlockSpacePanel; +import blockspace.Block; +import stuff.OverridingDefaultClasses.TruMap; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -141,8 +141,9 @@ public Helper getModelHelper() { } @Override - public void getJsonRepresentation(JSONObject dict) { - dict.put("paragraphList", new JSONArray(getParList().stream().map(p -> Helper.getJsonRepresentation(p)).toArray())); + public JSONObject getJsonRepresentation() { + return new JSONObject() + .put("paragraphList", new JSONArray(getParList().stream().map(p -> p.getJsonRepresentation()).toArray())); } @Override diff --git a/src/BlockSpacePkg/ArticlePkg/CatchPhrase.java b/src/blockspace/article/CatchPhrase.java similarity index 76% rename from src/BlockSpacePkg/ArticlePkg/CatchPhrase.java rename to src/blockspace/article/CatchPhrase.java index 51ebd47..413768a 100755 --- a/src/BlockSpacePkg/ArticlePkg/CatchPhrase.java +++ b/src/blockspace/article/CatchPhrase.java @@ -1,16 +1,16 @@ -package BlockSpacePkg.ArticlePkg; +package blockspace.article; -import Gui.ImageStorage; -import Model.AbstractModel; -import Model.Field.Field; +import gui.ImageStorage; +import model.AbstractModel; +import model.field.Field; import org.apache.commons.math3.fraction.Fraction; import java.awt.*; public class CatchPhrase extends AbstractModel { - private Field text = h.addField("text", ""); - private Field score = h.addField("score", 4); + private Field text = new Field<>("text", "", this); + private Field score = new Field<>("score", 4, this); public CatchPhrase(Paragraph parent, String text) { super(parent); diff --git a/src/BlockSpacePkg/ArticlePkg/Paragraph.java b/src/blockspace/article/Paragraph.java similarity index 93% rename from src/BlockSpacePkg/ArticlePkg/Paragraph.java rename to src/blockspace/article/Paragraph.java index b242e3b..c78b22a 100755 --- a/src/BlockSpacePkg/ArticlePkg/Paragraph.java +++ b/src/blockspace/article/Paragraph.java @@ -1,11 +1,11 @@ -package BlockSpacePkg.ArticlePkg; - -import Gui.Constants; -import Gui.ImageStorage; -import Model.*; -import Model.Field.Field; -import Stuff.OverridingDefaultClasses.TruMap; -import Stuff.Tools.Logger; +package blockspace.article; + +import gui.Constants; +import gui.ImageStorage; +import model.*; +import model.field.Field; +import stuff.OverridingDefaultClasses.TruMap; +import stuff.tools.Logger; import org.apache.commons.math3.fraction.Fraction; import org.json.JSONException; import org.json.JSONObject; @@ -31,7 +31,7 @@ public class Paragraph extends JTextArea implements IComponentModel { private AbstractHandler handler = null; private Helper modelHelper = new Helper(this); - private Field score = modelHelper.addField("score", 0); + private Field score = addField("score", 0); private Map catchPhrases = new HashMap<>(); private static TruMap> actionMap = new TruMap<>(); @@ -177,18 +177,21 @@ public Helper getModelHelper() { } @Override - public void getJsonRepresentation(JSONObject dict) { - dict.put("text", getText()); + public JSONObject getJsonRepresentation() { JSONObject phraseDict = new JSONObject(); for (Entry entry: catchPhrases.entrySet()) { phraseDict.put(entry.getKey(), entry.getValue().getJsonRepresentation()); } - dict.put("catchPhrases", phraseDict); + + return new JSONObject() + .put("score", score.get()) + .put("text", getText()) + .put("catchPhrases", phraseDict); } @Override public IModel reconstructFromJson(JSONObject jsObject) throws JSONException { clearChildList(); - modelHelper.reconstructFromJson(jsObject); + IComponentModel.super.reconstructFromJson(jsObject); setText(jsObject.getString("text")); if (jsObject.has("catchPhrases")) { JSONObject phraseDict = jsObject.getJSONObject("catchPhrases"); @@ -205,6 +208,11 @@ public IModel reconstructFromJson(JSONObject jsObject) throws JSONException { return this; } + @Override + public Cursor getDefaultCursor() { + return Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR); + } + private void clearChildList() { catchPhrases.clear(); } @Override diff --git a/src/BlockSpacePkg/StaffPkg/MidianaComponent.java b/src/blockspace/staff/MidianaComponent.java similarity index 88% rename from src/BlockSpacePkg/StaffPkg/MidianaComponent.java rename to src/blockspace/staff/MidianaComponent.java index 080bc96..4a04233 100755 --- a/src/BlockSpacePkg/StaffPkg/MidianaComponent.java +++ b/src/blockspace/staff/MidianaComponent.java @@ -1,15 +1,13 @@ -package BlockSpacePkg.StaffPkg; +package blockspace.staff; -import Gui.ImageStorage; -import Gui.Settings; -import Model.AbstractHandler; -import Model.AbstractModel; -import Model.IComponentModel; -import Model.IModel; +import gui.ImageStorage; +import gui.Settings; +import model.AbstractHandler; +import model.AbstractModel; +import model.IComponentModel; import java.awt.*; import java.awt.event.FocusListener; -import java.util.function.Function; abstract public class MidianaComponent extends AbstractModel implements IComponentModel { diff --git a/src/BlockSpacePkg/StaffPkg/Staff.java b/src/blockspace/staff/Staff.java similarity index 83% rename from src/BlockSpacePkg/StaffPkg/Staff.java rename to src/blockspace/staff/Staff.java index 04733e8..6d95a74 100755 --- a/src/BlockSpacePkg/StaffPkg/Staff.java +++ b/src/blockspace/staff/Staff.java @@ -1,26 +1,25 @@ -package BlockSpacePkg.StaffPkg; +package blockspace.staff; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import Model.Explain; -import Model.SimpleAction; -import BlockSpacePkg.StaffPkg.Accord.AccordHandler; -import BlockSpacePkg.StaffPkg.StaffConfig.StaffConfig; +import blockspace.staff.accord.nota.Nota; +import model.Explain; +import model.SimpleAction; +import blockspace.staff.accord.AccordHandler; +import blockspace.staff.StaffConfig.StaffConfig; import java.awt.*; import java.util.ArrayList; import java.util.List; -import BlockSpacePkg.StaffPkg.Accord.Accord; -import Stuff.Midi.DeviceEbun; -import Stuff.Midi.Playback; -import Stuff.Musica.PlayMusThread; +import blockspace.staff.accord.Accord; +import stuff.Midi.DeviceEbun; +import stuff.Midi.Playback; +import stuff.Musica.PlayMusThread; import java.util.concurrent.TimeUnit; -import Stuff.Tools.jmusicIntegration.INota; +import stuff.tools.jmusic_integration.INota; import com.google.common.util.concurrent.Uninterruptibles; -import org.apache.commons.math3.exception.MathArithmeticException; import org.apache.commons.math3.fraction.Fraction; import org.json.JSONArray; import org.json.JSONException; @@ -146,9 +145,10 @@ public synchronized void drawOn(Graphics g, Boolean completeRepaintRequired) { } @Override - public void getJsonRepresentation(JSONObject dict) { - dict.put("staffConfig", this.getConfig().getJsonRepresentation()); - dict.put("accordList", new JSONArray(this.getAccordList().stream().map(p -> p.getJsonRepresentation()).toArray())); + public JSONObject getJsonRepresentation() { + return new JSONObject() + .put("staffConfig", this.getConfig().getJsonRepresentation()) + .put("accordList", new JSONArray(this.getAccordList().stream().map(p -> p.getJsonRepresentation()).toArray())); } // TODO: model, mazafaka! @@ -288,7 +288,7 @@ public Explain moveFocus(int n) return getFocusedIndex() != wasIndex ? new Explain(true) : new Explain("dead end").setImplicit(true); } - /** @return - Nota that we just put */ + /** @return - nota that we just put */ public Nota putAt(Fraction desiredPos, INota nota) { Fraction curPos = new Fraction(0); @@ -309,8 +309,13 @@ public Nota putAt(Fraction desiredPos, INota nota) { } else if (curPos.compareTo(desiredPos) > 0) { Accord accord = getAccordList().get(i - 1); - Fraction offset = curPos.subtract(desiredPos); - Fraction onset = accord.getFraction().subtract(offset); + Fraction offset = new Fraction(curPos.doubleValue() - desiredPos.doubleValue()); + Fraction onset = new Fraction(accord.getFraction().doubleValue() - offset.doubleValue()); + + /** @debug */ +// if (onset.equals(new Fraction(0))) { +// Logger.fatal("How came ?! " + accord.getFraction() + " " + offset + " " + curPos + " " + desiredPos); +// } accord.addNewNota(0, 0).setLength(onset); @@ -318,11 +323,11 @@ public Nota putAt(Fraction desiredPos, INota nota) { Nota newNota = newAccord.addNewNota(nota); if (newNota.getLength().compareTo(offset) > 0) { // TODO: maybe if last accord in staff then no need - // put Nota with onset length into newNota's accord to preserve timing + // put nota with onset length into newNota's accord to preserve timing newAccord.addNewNota(0, 0).setLength(offset); } else if (newNota.getLength().compareTo(offset) < 0) { // TODO: maybe if last accord in staff then no need - // put an empty Nota after and set it's length(onset - newNota.getLength()) + // put an empty nota after and set it's length(onset - newNota.getLength()) this.add(new Accord(this), i + 1).addNewNota(0, 0).setLength(offset.subtract(newNota.getLength())); } @@ -331,15 +336,15 @@ public Nota putAt(Fraction desiredPos, INota nota) { Fraction accordFraction = getAccordList().get(i).getFraction(); - try { - curPos.add(getAccordList().get(i).getFraction()); - } catch (MathArithmeticException exc) { + curPos = new Fraction(curPos.doubleValue() + accordFraction.doubleValue()); + } - curPos = new Fraction(Math.round(curPos.doubleValue() * accordFraction.getDenominator()) / accordFraction.getDenominator()); - } - curPos = curPos.add(accordFraction); + Fraction rest = desiredPos.subtract(curPos); + if (!rest.equals(new Fraction(0))) { + this.add(new Accord(this), getAccordList().size()).addNewNota(0,0).setLength(rest); } + // TODO: we don't handle here pause prefix! (i.e when desired start is more than end) !!! // if not returned already return this.add(new Accord(this), getAccordList().size()).addNewNota(nota); } diff --git a/src/BlockSpacePkg/StaffPkg/StaffConfig/Channel.java b/src/blockspace/staff/StaffConfig/Channel.java similarity index 89% rename from src/BlockSpacePkg/StaffPkg/StaffConfig/Channel.java rename to src/blockspace/staff/StaffConfig/Channel.java index 7cf1f16..bdba1fa 100755 --- a/src/BlockSpacePkg/StaffPkg/StaffConfig/Channel.java +++ b/src/blockspace/staff/StaffConfig/Channel.java @@ -1,7 +1,7 @@ -package BlockSpacePkg.StaffPkg.StaffConfig; +package blockspace.staff.StaffConfig; -import Model.AbstractModel; -import Model.Field.Field; +import model.AbstractModel; +import model.field.Field; public class Channel extends AbstractModel { diff --git a/src/BlockSpacePkg/StaffPkg/StaffConfig/ConfigDialog.java b/src/blockspace/staff/StaffConfig/ConfigDialog.java similarity index 92% rename from src/BlockSpacePkg/StaffPkg/StaffConfig/ConfigDialog.java rename to src/blockspace/staff/StaffConfig/ConfigDialog.java index cfdfcdf..f31bf40 100755 --- a/src/BlockSpacePkg/StaffPkg/StaffConfig/ConfigDialog.java +++ b/src/blockspace/staff/StaffConfig/ConfigDialog.java @@ -1,12 +1,12 @@ -package BlockSpacePkg.StaffPkg.StaffConfig; +package blockspace.staff.StaffConfig; -import Gui.ImageStorage; -import Model.AbstractModel; -import Model.Field.Arr; -import Model.Field.Field; -import Stuff.OverridingDefaultClasses.ModelFieldInput; -import Stuff.OverridingDefaultClasses.TruLabel; +import gui.ImageStorage; +import model.AbstractModel; +import model.field.Arr; +import model.field.Field; +import stuff.OverridingDefaultClasses.ModelFieldInput; +import stuff.OverridingDefaultClasses.TruLabel; import javax.swing.*; import java.awt.*; diff --git a/src/BlockSpacePkg/StaffPkg/StaffConfig/StaffConfig.java b/src/blockspace/staff/StaffConfig/StaffConfig.java similarity index 90% rename from src/BlockSpacePkg/StaffPkg/StaffConfig/StaffConfig.java rename to src/blockspace/staff/StaffConfig/StaffConfig.java index 13e3e9b..fd6f2ae 100755 --- a/src/BlockSpacePkg/StaffPkg/StaffConfig/StaffConfig.java +++ b/src/blockspace/staff/StaffConfig/StaffConfig.java @@ -1,14 +1,14 @@ -package BlockSpacePkg.StaffPkg.StaffConfig; - -import Model.AbstractHandler; -import Model.AbstractModel; -import Model.Combo; -import Model.ContextAction; -import Model.Field.Arr; -import Model.Field.Field; -import BlockSpacePkg.StaffPkg.MidianaComponent; -import Stuff.Midi.DeviceEbun; -import BlockSpacePkg.StaffPkg.Staff; +package blockspace.staff.StaffConfig; + +import model.AbstractHandler; +import model.AbstractModel; +import model.Combo; +import model.ContextAction; +import model.field.Arr; +import model.field.Field; +import blockspace.staff.MidianaComponent; +import stuff.Midi.DeviceEbun; +import blockspace.staff.Staff; import java.awt.*; import java.awt.image.BufferedImage; @@ -19,7 +19,7 @@ import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.ShortMessage; -import Stuff.OverridingDefaultClasses.TruMap; +import stuff.OverridingDefaultClasses.TruMap; import org.apache.commons.math3.fraction.Fraction; import org.json.JSONException; diff --git a/src/BlockSpacePkg/StaffPkg/StaffConfig/instrumentNames.txt b/src/blockspace/staff/StaffConfig/instrumentNames.txt similarity index 100% rename from src/BlockSpacePkg/StaffPkg/StaffConfig/instrumentNames.txt rename to src/blockspace/staff/StaffConfig/instrumentNames.txt diff --git a/src/BlockSpacePkg/StaffPkg/StaffHandler.java b/src/blockspace/staff/StaffHandler.java similarity index 90% rename from src/BlockSpacePkg/StaffPkg/StaffHandler.java rename to src/blockspace/staff/StaffHandler.java index b35959d..b0fb2e2 100755 --- a/src/BlockSpacePkg/StaffPkg/StaffHandler.java +++ b/src/blockspace/staff/StaffHandler.java @@ -1,19 +1,17 @@ -package BlockSpacePkg.StaffPkg; -import Model.*; -import BlockSpacePkg.StaffPkg.StaffConfig.StaffConfig; -import Stuff.Midi.DeviceEbun; -import BlockSpacePkg.StaffPkg.Accord.Accord; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import Stuff.OverridingDefaultClasses.TruMap; -import Stuff.Tools.FileProcessor; +package blockspace.staff; +import model.*; +import blockspace.staff.StaffConfig.StaffConfig; +import stuff.Midi.DeviceEbun; +import blockspace.staff.accord.Accord; +import blockspace.staff.accord.nota.Nota; +import stuff.OverridingDefaultClasses.TruMap; +import stuff.tools.FileProcessor; -import java.io.File; import java.util.*; import java.util.function.Consumer; import java.util.function.Function; import javax.swing.*; -import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; public class StaffHandler extends AbstractHandler { @@ -35,6 +33,7 @@ public Staff getContext() { .p(new Combo(ctrl, k.VK_S), mkFailableAction(FileProcessor::saveMusicPanel).setCaption("Save")) .p(new Combo(ctrl, k.VK_O), mkFailableAction(FileProcessor::openStaff).setCaption("Open")) .p(new Combo(ctrl, k.VK_M), mkFailableAction(FileProcessor::openJMusic).setCaption("Open JMusic project")) + .p(new Combo(ctrl, k.VK_K), mkFailableAction(FileProcessor::openJMusic2).setCaption("Open JMusic project (with rounding)")) .p(new Combo(0, k.VK_ESCAPE), mkAction(s -> s.getConfig().getDialog().showMenuDialog(StaffConfig::syncSyntChannels)) .setCaption("Settings")) diff --git a/src/BlockSpacePkg/StaffPkg/StaffPanel.java b/src/blockspace/staff/StaffPanel.java similarity index 88% rename from src/BlockSpacePkg/StaffPkg/StaffPanel.java rename to src/blockspace/staff/StaffPanel.java index 8721d65..81aef9b 100755 --- a/src/BlockSpacePkg/StaffPkg/StaffPanel.java +++ b/src/blockspace/staff/StaffPanel.java @@ -1,13 +1,12 @@ -package BlockSpacePkg.StaffPkg; - -import Gui.Settings; -import Model.*; -import BlockSpacePkg.BlockSpace; -import Stuff.Midi.DumpReceiver; -import BlockSpacePkg.IBlockSpacePanel; -import BlockSpacePkg.Block; -import Stuff.OverridingDefaultClasses.TruMap; -import Stuff.Tools.Logger; +package blockspace.staff; + +import gui.Settings; +import model.*; +import blockspace.BlockSpace; +import stuff.Midi.DumpReceiver; +import blockspace.IBlockSpacePanel; +import blockspace.Block; +import stuff.OverridingDefaultClasses.TruMap; import org.json.JSONException; import org.json.JSONObject; @@ -17,7 +16,6 @@ import java.awt.event.*; import java.util.LinkedHashMap; -import java.util.Map; import java.util.function.Consumer; @@ -131,10 +129,11 @@ public Block getModelParent() { public AbstractHandler getHandler() { return this.handler; } public Helper getModelHelper() { return modelHelper; } - @Override - public void getJsonRepresentation(JSONObject dict) { - dict.put("staff", loadJsonOnFocus ? staffJson : getStaff().getJsonRepresentation()); + public JSONObject getJsonRepresentation() { + return new JSONObject() + .put("staff", loadJsonOnFocus ? staffJson : getStaff().getJsonRepresentation()); } + @Override public StaffPanel reconstructFromJson(JSONObject jsObject) throws JSONException { this.staffJson = jsObject.getJSONObject("staff"); diff --git a/src/BlockSpacePkg/StaffPkg/TactMeasurer.java b/src/blockspace/staff/TactMeasurer.java similarity index 64% rename from src/BlockSpacePkg/StaffPkg/TactMeasurer.java rename to src/blockspace/staff/TactMeasurer.java index 250efc3..397c5e2 100755 --- a/src/BlockSpacePkg/StaffPkg/TactMeasurer.java +++ b/src/blockspace/staff/TactMeasurer.java @@ -1,6 +1,7 @@ -package BlockSpacePkg.StaffPkg; +package blockspace.staff; -import BlockSpacePkg.StaffPkg.Accord.Accord; +import blockspace.staff.accord.Accord; +import stuff.tools.jmusic_integration.INota; import org.apache.commons.math3.fraction.Fraction; public class TactMeasurer { @@ -17,7 +18,11 @@ public TactMeasurer(Staff parent) { /** @returns true if accord finished the tact */ public Boolean inject(Accord accord) { - sumFraction = sumFraction.add(accord.getFraction()); + if (INota.isDotable(accord.getFraction())) { + sumFraction = sumFraction.add(accord.getFraction()); + } else { + sumFraction = new Fraction(sumFraction.doubleValue() + accord.getFraction().doubleValue()); + } Boolean finishedTact = false; while (sumFraction.compareTo(parent.getConfig().getTactSize()) >= 0) { diff --git a/src/BlockSpacePkg/StaffPkg/Accord/Accord.java b/src/blockspace/staff/accord/Accord.java similarity index 94% rename from src/BlockSpacePkg/StaffPkg/Accord/Accord.java rename to src/blockspace/staff/accord/Accord.java index 0ab50dd..117e87d 100755 --- a/src/BlockSpacePkg/StaffPkg/Accord/Accord.java +++ b/src/blockspace/staff/accord/Accord.java @@ -1,19 +1,19 @@ -package BlockSpacePkg.StaffPkg.Accord; +package blockspace.staff.accord; import java.awt.*; import java.util.*; import java.util.function.Consumer; -import Model.Explain; -import Model.Field.Arr; -import Model.Field.Field; -import Model.SimpleAction; -import BlockSpacePkg.StaffPkg.MidianaComponent; -import Stuff.Tools.jmusicIntegration.INota; +import model.Explain; +import model.field.Arr; +import model.field.Field; +import model.SimpleAction; +import blockspace.staff.MidianaComponent; +import stuff.tools.jmusic_integration.INota; import org.apache.commons.math3.fraction.Fraction; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import BlockSpacePkg.StaffPkg.Staff; +import blockspace.staff.accord.nota.Nota; +import blockspace.staff.Staff; import org.json.JSONObject; public class Accord extends MidianaComponent { @@ -80,7 +80,7 @@ public Explain moveFocus(int n) { if (getFocusedIndex() + n > this.getNotaSet().size() - 1 || getFocusedIndex() + n < 0) { this.setFocusedIndex(-1); - return new Explain<>("End Of Accord"); + return new Explain<>("End Of accord"); } else { if (this.getFocusedIndex() + n < -1) { this.setFocusedIndex(this.getNotaSet().size() - 1); diff --git a/src/BlockSpacePkg/StaffPkg/Accord/AccordHandler.java b/src/blockspace/staff/accord/AccordHandler.java similarity index 89% rename from src/BlockSpacePkg/StaffPkg/Accord/AccordHandler.java rename to src/blockspace/staff/accord/AccordHandler.java index 222cf4f..202ef38 100755 --- a/src/BlockSpacePkg/StaffPkg/Accord/AccordHandler.java +++ b/src/blockspace/staff/accord/AccordHandler.java @@ -1,10 +1,10 @@ -package BlockSpacePkg.StaffPkg.Accord; +package blockspace.staff.accord; -import Model.*; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import BlockSpacePkg.StaffPkg.Accord.Nota.NotaHandler; -import Stuff.OverridingDefaultClasses.TruMap; +import model.*; +import blockspace.staff.accord.nota.Nota; +import blockspace.staff.accord.nota.NotaHandler; +import stuff.OverridingDefaultClasses.TruMap; import org.apache.commons.math3.fraction.Fraction; import java.util.*; @@ -50,7 +50,7 @@ public Accord getContext() { actionMap.p(entry.getKey(), action .setRedo(accord -> System.currentTimeMillis() - accord.getEarliestKeydown() < ACCORD_EPSILON ? new Explain(accord.addNewNota(entry.getValue(), accord.getSettings().getDefaultChannel())) - : new Explain("too slow. to collect Nota-s into single accord, they have to be pressed in " + ACCORD_EPSILON + " milliseconds")) + : new Explain("too slow. to collect nota-s into single accord, they have to be pressed in " + ACCORD_EPSILON + " milliseconds")) .setOmitMenuBar(true) ); } diff --git a/src/BlockSpacePkg/StaffPkg/Accord/AccordPainter.java b/src/blockspace/staff/accord/AccordPainter.java similarity index 92% rename from src/BlockSpacePkg/StaffPkg/Accord/AccordPainter.java rename to src/blockspace/staff/accord/AccordPainter.java index cba8882..9522c1d 100755 --- a/src/BlockSpacePkg/StaffPkg/Accord/AccordPainter.java +++ b/src/blockspace/staff/accord/AccordPainter.java @@ -1,7 +1,7 @@ -package BlockSpacePkg.StaffPkg.Accord; +package blockspace.staff.accord; -import Model.AbstractPainter; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; +import model.AbstractPainter; +import blockspace.staff.accord.nota.Nota; import java.awt.*; @@ -38,7 +38,7 @@ public void draw(Boolean completeRepaint) { drawDot(nota.getAncorPoint().plus(notaX + dx() / 2, notaY - dy()), dy(), Color.RED); } - drawModel(nota, notaX, notaY, false); // TODO: if it was true, we wouldn't get here, but it kinda sux now i think - pass the flag here from Accord! + drawModel(nota, notaX, notaY, false); // TODO: if it was true, we wouldn't get here, but it kinda sux now i think - pass the flag here from accord! if (nota.isStriked() ^ oneOctaveLower) { drawLine(getTraitCoordinates(nota).plus(new Point(notaX, notaY))); } @@ -50,7 +50,7 @@ public void draw(Boolean completeRepaint) { drawFields(completeRepaint); - // gonna use Field::painting instead + // gonna use field::painting instead // drawString(a.getSlog(), 0, Constants.FONT_HEIGHT, Color.BLACK); diff --git a/src/BlockSpacePkg/StaffPkg/Accord/Nota/Nota.java b/src/blockspace/staff/accord/nota/Nota.java similarity index 87% rename from src/BlockSpacePkg/StaffPkg/Accord/Nota/Nota.java rename to src/blockspace/staff/accord/nota/Nota.java index 39bf478..1d8ada0 100755 --- a/src/BlockSpacePkg/StaffPkg/Accord/Nota/Nota.java +++ b/src/blockspace/staff/accord/nota/Nota.java @@ -1,29 +1,24 @@ -package BlockSpacePkg.StaffPkg.Accord.Nota; +package blockspace.staff.accord.nota; -import Gui.ImageStorage; -import Model.Combo; -import Model.Field.Field; -import BlockSpacePkg.StaffPkg.MidianaComponent; -import BlockSpacePkg.StaffPkg.Accord.Accord; +import gui.ImageStorage; +import model.Combo; +import model.field.Field; +import blockspace.staff.MidianaComponent; +import blockspace.staff.accord.Accord; import java.awt.*; import java.awt.image.BufferedImage; import java.util.*; -import Model.Helper; -import Stuff.OverridingDefaultClasses.Pnt; -import Stuff.Tools.Bin; -import Stuff.Tools.Logger; -import Stuff.Tools.jmusicIntegration.INota; +import stuff.OverridingDefaultClasses.Pnt; +import stuff.tools.jmusic_integration.INota; import org.apache.commons.math3.fraction.Fraction; -import BlockSpacePkg.StaffPkg.StaffConfig.StaffConfig; -import Stuff.Tools.Fp; +import blockspace.staff.StaffConfig.StaffConfig; +import stuff.tools.Fp; import org.json.JSONObject; -import java.util.List; - public class Nota extends MidianaComponent implements INota { // @@ -58,9 +53,15 @@ public void drawOn(Graphics surface, int x, int y, Boolean completeRepaint) { surface.setColor(Color.BLACK); surface.drawImage(getEbonySignImage(), x + dx() / 2, y + 3 * dy() + 2, null); - BufferedImage tmpImg = getIsMuted() || isPause() - ? getImageStorage().getNotaImg(getCleanLength(), 9) - : getImageStorage().getNotaImg(getCleanLength(), getChannel()); + int colorChannel = getIsMuted() || isPause() ? 9 : getChannel(); + BufferedImage tmpImg; + if (isTooShort()) { + tmpImg = getImageStorage().getTooShortImage(); + } else if (isTooLong()) { + tmpImg = getImageStorage().getTooLongImage(); + } else { + tmpImg = getImageStorage().getNotaImg(getCleanLength(), colorChannel); + } if (getIsLinkedToNext()) { Fp.drawParabola((Graphics2D) surface, new Rectangle(x + dx() * 3 / 2, y + dy() * 7, dx() * 2, dy() * 2)); @@ -90,7 +91,7 @@ public int hashCode() { } @Override - public boolean equals(Object rival) { // it's a bit arguable. this equals is supposed to be used only in context of one Accord or Playback (two equal Nota-s cant sound simulatenously) + public boolean equals(Object rival) { // it's a bit arguable. this equals is supposed to be used only in context of one accord or Playback (two equal nota-s cant sound simulatenously) return rival instanceof Nota && ((Nota)rival).tune.get() == this.tune.get() && ((Nota)rival).channel.get() == this.channel.get(); } @@ -148,7 +149,7 @@ private BufferedImage getEbonySignImage() { private int getDotCount() { - Fraction length = this.length.get().divide(ImageStorage.getGreatestPossibleNotaLength().multiply(2)); // to make sure, that the length is less than 1 + Fraction length = this.length.get().divide(ImageStorage.getTallLimit().multiply(2)); // to make sure, that the length is less than 1 // don't worry, denominator does not affect dot count return 31 - Integer.numberOfLeadingZeros(length.getNumerator() + 1) - 1; // 3/8 => 001_1_ + 1 = 0100 => 3 - 2 = 1 >D @@ -190,7 +191,7 @@ private Fraction getCleanLength() { // i.e. length without dots: 1/4, 1/2 public int getStickX() { return this.getNotaImgRelX() + dx() / 2; } public int getHeight() { return getSettings().getNotaHeight(); } - // TODO: use it in Accord.getWidth() + // TODO: use it in accord.getWidth() public int getWidth() { return dx() * 2; } private Boolean isPause() { return tune.get() == 0; } @@ -209,7 +210,7 @@ private Fraction getCleanLength() { // i.e. length without dots: 1/4, 1/2 public Boolean getIsMuted() { return isMuted.get(); } public Boolean getIsLinkedToNext() { return isLinkedToNext.get(); } // model setters - public Nota setTune(int value){ + public Nota setTune(int value) { this.tune.set(value); return this; } @@ -248,7 +249,7 @@ public Nota linkedTo() { return this.getIsLinkedToNext() ? this.getNext() : null; } - /** @return Nota of the next accord with same tune or null */ + /** @return nota of the next accord with same tune or null */ private Nota getNext() { Accord nextAccord = getParentAccord().getNext(); return nextAccord != null diff --git a/src/BlockSpacePkg/StaffPkg/Accord/Nota/NotaHandler.java b/src/blockspace/staff/accord/nota/NotaHandler.java similarity index 95% rename from src/BlockSpacePkg/StaffPkg/Accord/Nota/NotaHandler.java rename to src/blockspace/staff/accord/nota/NotaHandler.java index 79685f6..974b250 100755 --- a/src/BlockSpacePkg/StaffPkg/Accord/Nota/NotaHandler.java +++ b/src/blockspace/staff/accord/nota/NotaHandler.java @@ -1,8 +1,8 @@ -package BlockSpacePkg.StaffPkg.Accord.Nota; +package blockspace.staff.accord.nota; -import Model.*; -import Stuff.Musica.PlayMusThread; -import Stuff.OverridingDefaultClasses.TruMap; +import model.*; +import stuff.Musica.PlayMusThread; +import stuff.OverridingDefaultClasses.TruMap; import org.json.JSONObject; import javax.swing.*; diff --git a/src/Gui/Constants.java b/src/gui/Constants.java similarity index 97% rename from src/Gui/Constants.java rename to src/gui/Constants.java index eaaba04..c446706 100755 --- a/src/Gui/Constants.java +++ b/src/gui/Constants.java @@ -1,4 +1,4 @@ -package Gui; +package gui; import java.awt.*; import java.awt.image.BufferedImage; diff --git a/src/Gui/ImageStorage.java b/src/gui/ImageStorage.java similarity index 85% rename from src/Gui/ImageStorage.java rename to src/gui/ImageStorage.java index 69091c8..01bad50 100755 --- a/src/Gui/ImageStorage.java +++ b/src/gui/ImageStorage.java @@ -1,15 +1,14 @@ -package Gui; +package gui; -import BlockSpacePkg.BlockSpace; -import BlockSpacePkg.StaffPkg.StaffConfig.Channel; -import Stuff.Tools.Logger; +import blockspace.BlockSpace; +import blockspace.staff.StaffConfig.Channel; +import stuff.tools.Logger; +import stuff.tools.jmusic_integration.INota; import org.apache.commons.math3.fraction.Fraction; -import org.apache.commons.math3.fraction.FractionFormat; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; -import java.io.File; import java.io.IOException; import java.net.URL; import java.util.*; @@ -23,6 +22,8 @@ public class ImageStorage { private Map[] coloredNotas = new Map[Channel.CHANNEL_COUNT]; + private Map> coloredImages = new HashMap<>(); + private Map defaultImageMap = new HashMap<>(); private Map sizedDefaultImageMap = new HashMap<>(); private Map randomImageMap = new HashMap<>(); @@ -35,11 +36,25 @@ public ImageStorage(BlockSpace parentBlockSpace) { refreshImageSizes(); } - // TODO: rename to openRandomImage() - public BufferedImage openImage(URL file) { + public BufferedImage getNotaImg(Fraction length, int channel) { + if (INota.isTooLong(length)) { + return getTooLongImage(); // TODO: color! + } else if (INota.isTooShort(length)) { + return getTooShortImage(); // TODO: color! + } else { + return coloredNotas[channel].get(length); + } + } + + public BufferedImage openRandomImage(URL file) { return openImage(file, randomImageMap); } + public void refreshImageSizes() { + sizedDefaultImageMap.clear(); + refreshNotaSizes(); // TODO: maybe make nota-s lazy too ? + } + private static BufferedImage strToImg(String str) { BufferedImage img = new BufferedImage(str.length() * Constants.FONT_WIDTH, Constants.FONT_HEIGHT, BufferedImage.TYPE_INT_ARGB); Graphics g = img.getGraphics(); @@ -49,12 +64,7 @@ private static BufferedImage strToImg(String str) { return img; } - public void refreshImageSizes() { - sizedDefaultImageMap.clear(); - refreshNotaSizes(); // TODO: maybe make Nota-s lazy too ? - } - - public void refreshNotaSizes() { + private void refreshNotaSizes() { int w1, h1; Graphics2D g; w1 = parentBlockSpace.getSettings().getNotaWidth(); @@ -78,43 +88,42 @@ public void refreshNotaSizes() { } } - public BufferedImage getNotaImg(Fraction length, int channel) { - return coloredNotas[channel].get(length); - } - // default images // it's 2/1 - public static Fraction getGreatestPossibleNotaLength() { + public static Fraction getTallLimit() { return getAvailableNotaLengthList().get(0); } - // it's 1/16 - public static Fraction getSmallestPossibleNotaLength() { - return getAvailableNotaLengthList().get(getAvailableNotaLengthList().size() -1); + // it's 1/32 + public static Fraction getShortLimit() { + return getAvailableNotaLengthList().get(getAvailableNotaLengthList().size() - 1); } // from 2/1 downto 1/16 public static List getAvailableNotaLengthList() { List result = new ArrayList<>(); - for (int idx = 0; idx < 6; ++idx) { result.add(new Fraction(2, pow2(idx))); } + for (int idx = 0; idx < 7; ++idx) { result.add(new Fraction(2, pow2(idx))); } return result; } private URL getNotaImageFile(Fraction length) { int fileStupidIndex = length.equals(new Fraction(2)) ? 0 : length.getDenominator(); - String fileName = fileStupidIndex + "_sized.png"; + String fileName = fileStupidIndex + ".png"; return getClass().getResource(DEFAULT_IMAGE_FOLDER + fileName); } public BufferedImage getQuarterImage() { return coloredNotas[0].get(new Fraction(1, 4)); } - public BufferedImage getFlatImage() { return openSizedDefaultImage("flat_sized.png"); } - public BufferedImage getViolinKeyImage() { return openSizedDefaultImage("vio_sized.png"); } - public BufferedImage getBassKeyImage() { return openSizedDefaultImage("bass_sized.png"); } + public BufferedImage getTooLongImage() { return openSizedDefaultImage("star.png"); } + public BufferedImage getTooShortImage() { return openSizedDefaultImage("star_empty.png"); } + + public BufferedImage getFlatImage() { return openSizedDefaultImage("flat.png"); } + public BufferedImage getViolinKeyImage() { return openSizedDefaultImage("vio.png"); } + public BufferedImage getBassKeyImage() { return openSizedDefaultImage("bass.png"); } public BufferedImage getPointerImage() { return openSizedDefaultImage("MyPointer.png"); } - public BufferedImage getSharpImage() { return openSizedDefaultImage("sharp_sized.png"); } + public BufferedImage getSharpImage() { return openSizedDefaultImage("sharp.png"); } // not used for now, but may be handy one day public BufferedImage getInstrumentImage() { return openSizedDefaultImage("instrument.png"); } @@ -149,13 +158,10 @@ public static Color getColorByChannel(int n) { // private methods - - private BufferedImage openDefaultImage(URL file) { - return openImage(file, defaultImageMap); - } - private BufferedImage openSizedDefaultImage(String fileName) { + URL file = getClass().getResource(DEFAULT_IMAGE_FOLDER + fileName); + if (!sizedDefaultImageMap.containsKey(file)) { sizedDefaultImageMap.put(file, changeSize(openDefaultImage(file))); } @@ -163,6 +169,10 @@ private BufferedImage openSizedDefaultImage(String fileName) { return sizedDefaultImageMap.get(file); } + private BufferedImage openDefaultImage(URL file) { + return openImage(file, defaultImageMap); + } + private BufferedImage openImage(URL file, Map imageMap) { if (!imageMap.containsKey(file)) { try { @@ -187,18 +197,6 @@ private BufferedImage changeSize(BufferedImage originalImage) { return newImage; } - private static int log2(int n) { - - if (n == 1) { - return 0; - } else if (n <= 0 || n % 2 != 0) { - Logger.fatal("Number " + n + " does not have integer logarithm with base 2 "); - return -100; - } else { - return 1 + log2(n / 2); - } - } - private static int pow2(int k){ if (k==0) { return 1; diff --git a/src/Gui/Settings.java b/src/gui/Settings.java similarity index 85% rename from src/Gui/Settings.java rename to src/gui/Settings.java index 48f009d..2c07284 100755 --- a/src/Gui/Settings.java +++ b/src/gui/Settings.java @@ -1,7 +1,7 @@ -package Gui; +package gui; -import BlockSpacePkg.BlockSpace; -import BlockSpacePkg.StaffPkg.StaffPanel; +import blockspace.BlockSpace; +import blockspace.staff.StaffPanel; // TODO: maybe move it into ImageStorage public class Settings { @@ -28,9 +28,9 @@ public void scale(int sign) { } public int getStepWidth() { return getNotaWidth(); } // nota image width (the one OS would display when you click on fil->properties) - public int getStepHeight() { return getNotaHeight() / 8; } // half-space between two StaffPkg's lines + public int getStepHeight() { return getNotaHeight() / 8; } // half-space between two staff's lines - /** @return - scaled Nota image from file width */ + /** @return - scaled nota image from file width */ public int getNotaWidth() { return Constants.NORMAL_NOTA_WIDTH + 5 * scaleKoefficient; } diff --git a/imgs/0_sized.png b/src/gui/imgs/0.png similarity index 100% rename from imgs/0_sized.png rename to src/gui/imgs/0.png diff --git a/imgs/1_sized.png b/src/gui/imgs/1.png similarity index 100% rename from imgs/1_sized.png rename to src/gui/imgs/1.png diff --git a/imgs/16_sized.png b/src/gui/imgs/16.png similarity index 100% rename from imgs/16_sized.png rename to src/gui/imgs/16.png diff --git a/imgs/2_sized.png b/src/gui/imgs/2.png similarity index 100% rename from imgs/2_sized.png rename to src/gui/imgs/2.png diff --git a/src/gui/imgs/32.png b/src/gui/imgs/32.png new file mode 100644 index 0000000..39824f8 Binary files /dev/null and b/src/gui/imgs/32.png differ diff --git a/imgs/4_sized.png b/src/gui/imgs/4.png similarity index 100% rename from imgs/4_sized.png rename to src/gui/imgs/4.png diff --git a/imgs/8_sized.png b/src/gui/imgs/8.png similarity index 100% rename from imgs/8_sized.png rename to src/gui/imgs/8.png diff --git a/imgs/MyPointer.png b/src/gui/imgs/MyPointer.png similarity index 100% rename from imgs/MyPointer.png rename to src/gui/imgs/MyPointer.png diff --git a/imgs/bass_sized.png b/src/gui/imgs/bass.png similarity index 100% rename from imgs/bass_sized.png rename to src/gui/imgs/bass.png diff --git a/imgs/flat_sized.png b/src/gui/imgs/flat.png similarity index 100% rename from imgs/flat_sized.png rename to src/gui/imgs/flat.png diff --git a/imgs/instrument.png b/src/gui/imgs/instrument.png similarity index 100% rename from imgs/instrument.png rename to src/gui/imgs/instrument.png diff --git a/imgs/sharp_sized.png b/src/gui/imgs/sharp.png similarity index 100% rename from imgs/sharp_sized.png rename to src/gui/imgs/sharp.png diff --git a/src/gui/imgs/star - Copy.png b/src/gui/imgs/star - Copy.png new file mode 100644 index 0000000..99b19ea Binary files /dev/null and b/src/gui/imgs/star - Copy.png differ diff --git a/src/gui/imgs/star.png b/src/gui/imgs/star.png new file mode 100644 index 0000000..01f1050 Binary files /dev/null and b/src/gui/imgs/star.png differ diff --git a/src/gui/imgs/star_empty - Copy.png b/src/gui/imgs/star_empty - Copy.png new file mode 100644 index 0000000..a9e8963 Binary files /dev/null and b/src/gui/imgs/star_empty - Copy.png differ diff --git a/src/gui/imgs/star_empty.png b/src/gui/imgs/star_empty.png new file mode 100644 index 0000000..d8e75d7 Binary files /dev/null and b/src/gui/imgs/star_empty.png differ diff --git a/imgs/vio_sized.png b/src/gui/imgs/vio.png similarity index 100% rename from imgs/vio_sized.png rename to src/gui/imgs/vio.png diff --git a/imgs/volume.png b/src/gui/imgs/volume.png similarity index 100% rename from imgs/volume.png rename to src/gui/imgs/volume.png diff --git a/src/Main/Main.java b/src/main/Main.java similarity index 87% rename from src/Main/Main.java rename to src/main/Main.java index 06ce151..ccb1b73 100755 --- a/src/Main/Main.java +++ b/src/main/Main.java @@ -1,7 +1,7 @@ package main; -import Stuff.Midi.DeviceEbun; -import Stuff.Tools.Logger; +import stuff.Midi.DeviceEbun; +import stuff.tools.Logger; public class Main { diff --git a/src/Main/MajesticListener.java b/src/main/MajesticListener.java similarity index 89% rename from src/Main/MajesticListener.java rename to src/main/MajesticListener.java index 0b2777d..43ea32f 100755 --- a/src/Main/MajesticListener.java +++ b/src/main/MajesticListener.java @@ -1,6 +1,6 @@ package main; -import Stuff.Midi.DeviceEbun; +import stuff.Midi.DeviceEbun; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; diff --git a/src/Main/MajesticWindow.java b/src/main/MajesticWindow.java similarity index 94% rename from src/Main/MajesticWindow.java rename to src/main/MajesticWindow.java index 0ce7ef8..34aa48c 100755 --- a/src/Main/MajesticWindow.java +++ b/src/main/MajesticWindow.java @@ -1,9 +1,9 @@ package main; -import BlockSpacePkg.Block; -import Model.*; -import BlockSpacePkg.BlockSpace; -import Stuff.OverridingDefaultClasses.TruMenuItem; +import blockspace.Block; +import model.*; +import blockspace.BlockSpace; +import stuff.OverridingDefaultClasses.TruMenuItem; import javax.swing.*; @@ -138,7 +138,7 @@ private IComponentModel findeFocusedByClass(Class cls } // the Great idea behind this is to refresh menu bar each time we change focus - // i.e. when we're pointing Nota we have Menus: [BlockSpace, Scroll, StaffPkg, Accord, Nota], when Paragraph - [BlockSpace, Scroll, ArticlePkg, Paragraph] etc + // i.e. when we're pointing nota we have Menus: [BlockSpace, Scroll, staff, accord, nota], when Paragraph - [BlockSpace, Scroll, article, Paragraph] etc public void updateMenuBar() { menus.values().forEach(m -> { diff --git a/src/Model/AbstractHandler.java b/src/model/AbstractHandler.java similarity index 97% rename from src/Model/AbstractHandler.java rename to src/model/AbstractHandler.java index ed472e5..9721c8f 100755 --- a/src/Model/AbstractHandler.java +++ b/src/model/AbstractHandler.java @@ -1,7 +1,7 @@ -package Model; +package model; -import BlockSpacePkg.BlockSpaceHandler; -import BlockSpacePkg.StaffPkg.MidianaComponent; +import blockspace.BlockSpaceHandler; +import blockspace.staff.MidianaComponent; import javax.swing.*; import java.awt.*; diff --git a/src/Model/AbstractModel.java b/src/model/AbstractModel.java similarity index 81% rename from src/Model/AbstractModel.java rename to src/model/AbstractModel.java index 1b3edc2..fdaf1fa 100755 --- a/src/Model/AbstractModel.java +++ b/src/model/AbstractModel.java @@ -1,15 +1,10 @@ -package Model; +package model; import java.util.List; import java.util.stream.Collectors; -import Gui.Settings; -import org.apache.commons.math3.fraction.Fraction; -import org.json.JSONException; -import org.json.JSONObject; - public abstract class AbstractModel implements IModel { private IComponentModel parent = null; diff --git a/src/Model/AbstractPainter.java b/src/model/AbstractPainter.java similarity index 95% rename from src/Model/AbstractPainter.java rename to src/model/AbstractPainter.java index 721b4c5..5b21b06 100755 --- a/src/Model/AbstractPainter.java +++ b/src/model/AbstractPainter.java @@ -1,10 +1,10 @@ -package Model; +package model; // this will be helper class for MidianaComponent-s -import Model.Field.Field; -import BlockSpacePkg.StaffPkg.MidianaComponent; -import Stuff.OverridingDefaultClasses.Pnt; +import model.field.Field; +import blockspace.staff.MidianaComponent; +import stuff.OverridingDefaultClasses.Pnt; import java.awt.*; import java.util.stream.Collectors; diff --git a/src/Model/Combo.java b/src/model/Combo.java similarity index 98% rename from src/Model/Combo.java rename to src/model/Combo.java index d2de54d..6c7aaf9 100755 --- a/src/Model/Combo.java +++ b/src/model/Combo.java @@ -1,7 +1,7 @@ -package Model; +package model; -import Stuff.OverridingDefaultClasses.TruMap; -import Stuff.Tools.Logger; +import stuff.OverridingDefaultClasses.TruMap; +import stuff.tools.Logger; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; diff --git a/src/Model/ComboMouse.java b/src/model/ComboMouse.java similarity index 98% rename from src/Model/ComboMouse.java rename to src/model/ComboMouse.java index 4d8c7c7..8efb5b5 100755 --- a/src/Model/ComboMouse.java +++ b/src/model/ComboMouse.java @@ -1,4 +1,4 @@ -package Model; +package model; import javax.swing.*; import java.awt.*; diff --git a/src/Model/ContextAction.java b/src/model/ContextAction.java similarity index 98% rename from src/Model/ContextAction.java rename to src/model/ContextAction.java index abdf585..32494cf 100755 --- a/src/Model/ContextAction.java +++ b/src/model/ContextAction.java @@ -1,4 +1,4 @@ -package Model; +package model; import java.util.function.Consumer; import java.util.function.Function; diff --git a/src/Model/Explain.java b/src/model/Explain.java similarity index 98% rename from src/Model/Explain.java rename to src/model/Explain.java index c1fb807..4f7937e 100755 --- a/src/Model/Explain.java +++ b/src/model/Explain.java @@ -1,4 +1,4 @@ -package Model; +package model; public class Explain { diff --git a/src/model/Helper.java b/src/model/Helper.java new file mode 100755 index 0000000..0310d71 --- /dev/null +++ b/src/model/Helper.java @@ -0,0 +1,51 @@ +package model; + +import model.field.Field; +import blockspace.article.Article; +import blockspace.article.Paragraph; +import blockspace.BlockSpace; +import blockspace.Image.ImagePanel; +import blockspace.staff.accord.Accord; +import blockspace.staff.accord.nota.Nota; +import blockspace.staff.Staff; +import blockspace.staff.StaffPanel; +import blockspace.Block; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Helper { + + IModel model; + + public Helper(IModel model) { + this.model = model; + } + + // field getters + + private List fieldStorage = new ArrayList<>(); + + public List getFieldStorage() { return fieldStorage; } + + // retarded language + public List makeFakePossibleChildListForClassMethods() { + if (model.getClass() == BlockSpace.class) { + return Arrays.asList(new Block(new ImagePanel((BlockSpace)model), (BlockSpace)model)); + } else if (model.getClass() == Block.class) { + Block scroll = (Block)model; + return Arrays.asList(new StaffPanel(scroll.getModelParent()), new Article(scroll.getModelParent()), new ImagePanel(scroll.getModelParent())); + } else if (model.getClass() == Article.class) { + return Arrays.asList(new Paragraph((Article)model)); + } else if (model.getClass() == StaffPanel.class) { + return Arrays.asList(new Staff((StaffPanel)model)); + } else if (model.getClass() == Staff.class) { + return Arrays.asList(new Accord((Staff)model)); + } else if (model.getClass() == Accord.class) { + return Arrays.asList(new Nota((Accord)model)); + } else { + return new ArrayList<>(); + } + } +} diff --git a/src/Model/IComponentModel.java b/src/model/IComponentModel.java similarity index 89% rename from src/Model/IComponentModel.java rename to src/model/IComponentModel.java index 1d4cd31..be8be60 100755 --- a/src/Model/IComponentModel.java +++ b/src/model/IComponentModel.java @@ -1,4 +1,7 @@ -package Model; +package model; + +import org.json.JSONException; +import org.json.JSONObject; import java.awt.*; import java.awt.event.FocusListener; diff --git a/src/model/IModel.java b/src/model/IModel.java new file mode 100755 index 0000000..8574317 --- /dev/null +++ b/src/model/IModel.java @@ -0,0 +1,53 @@ +package model; + +import model.field.Field; +import org.apache.commons.math3.fraction.Fraction; +import org.json.JSONException; +import org.json.JSONObject; +import stuff.tools.Logger; + +import java.awt.*; + +public interface IModel { + + IComponentModel getModelParent(); + Helper getModelHelper(); + + default JSONObject getJsonRepresentation() { + + JSONObject dict = new JSONObject(); + + getModelHelper().getFieldStorage().stream() + .filter(field -> field.get().getClass() != Boolean.class || field.get() != field.defaultValue) // Issue[69] + .forEach(field -> dict.put(field.getName(), field.getJsonValue())); + + return dict; + } + + default IModel reconstructFromJson(JSONObject jsObject) throws JSONException { + + for (Field field : getModelHelper().getFieldStorage()) { + if (jsObject.has(field.getName())) { + field.setValueFromJsObject(jsObject); + } else if (field.isFinal) { + Logger.fatal("Source does not have final field [" + field.getName() + "] for class {" + getClass().getSimpleName() + "}"); + } + } + return this; + } + + default Field addField(String name, T defaultValue) { + return new Field<>(name, defaultValue, this); + } + + default Cursor getDefaultCursor() { + return Cursor.getDefaultCursor(); + } + + default int limit(int value, int min, int max) { return Math.min(Math.max(value, min), max); } + default Fraction limit(Fraction value, Fraction min, Fraction max) { + value = value.compareTo(min) < 0 ? min : value; + value = value.compareTo(max) > 0 ? max : value; + return value; + } +} diff --git a/src/Model/SimpleAction.java b/src/model/SimpleAction.java similarity index 89% rename from src/Model/SimpleAction.java rename to src/model/SimpleAction.java index e094ce6..dd9a923 100755 --- a/src/Model/SimpleAction.java +++ b/src/model/SimpleAction.java @@ -1,9 +1,8 @@ -package Model; +package model; -import Stuff.Tools.Logger; +import stuff.tools.Logger; import java.util.concurrent.Callable; -import java.util.function.Consumer; public class SimpleAction { diff --git a/src/Model/Field/Arr.java b/src/model/field/Arr.java similarity index 92% rename from src/Model/Field/Arr.java rename to src/model/field/Arr.java index 019db7c..0c3b006 100755 --- a/src/Model/Field/Arr.java +++ b/src/model/field/Arr.java @@ -1,19 +1,17 @@ -package Model.Field; +package model.field; -import Model.AbstractModel; -import Model.IModel; -import Stuff.Tools.Logger; -import com.google.common.collect.Lists; +import model.AbstractModel; +import model.IModel; +import stuff.tools.Logger; import org.json.JSONArray; import org.json.JSONObject; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; -// this class represents our model Field that sores list of AbstractModel-z +// this class represents our model field that sores list of AbstractModel-z public class Arr extends Field> { Class elemClass; diff --git a/src/Model/Field/Field.java b/src/model/field/Field.java similarity index 93% rename from src/Model/Field/Field.java rename to src/model/field/Field.java index 03e0b03..3b4096b 100755 --- a/src/Model/Field/Field.java +++ b/src/model/field/Field.java @@ -1,8 +1,8 @@ -package Model.Field; +package model.field; -import Model.IModel; -import Stuff.OverridingDefaultClasses.TruMap; -import Stuff.Tools.Logger; +import model.IModel; +import stuff.OverridingDefaultClasses.TruMap; +import stuff.tools.Logger; import org.apache.commons.math3.fraction.Fraction; import org.apache.commons.math3.fraction.FractionFormat; import org.json.JSONObject; @@ -62,7 +62,7 @@ public Field set(E value) { E normalizedValue = normalize != null ? normalize.apply(value) : value; if (!normalizedValue.equals(value)) { - Logger.warning("Tried to set invalid value: [" + value + "] for Field [" + getName() + "] of [" + owner.getClass().getSimpleName() + "]"); + Logger.warning("Tried to set invalid value: [" + value + "] for field [" + getName() + "] of [" + owner.getClass().getSimpleName() + "]"); } this.changedSinceLastRepaint |= this.value != normalizedValue; @@ -123,7 +123,7 @@ private static Map> getParserMap() { /** dies if class is wrong */ protected void checkValueClass(Class cls) { if (!getParserMap().containsKey(cls)) { - Logger.fatal("Unsupported Field Value Class! [" + cls.getSimpleName() + "]"); + Logger.fatal("Unsupported field Value Class! [" + cls.getSimpleName() + "]"); } } } diff --git a/src/Stuff/Midi/DeviceEbun.java b/src/stuff/Midi/DeviceEbun.java similarity index 95% rename from src/Stuff/Midi/DeviceEbun.java rename to src/stuff/Midi/DeviceEbun.java index cb64d7a..69c2692 100755 --- a/src/Stuff/Midi/DeviceEbun.java +++ b/src/stuff/Midi/DeviceEbun.java @@ -1,14 +1,14 @@ -package Stuff.Midi; +package stuff.Midi; import javax.sound.midi.*; import main.Main; -import Model.Explain; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import BlockSpacePkg.StaffPkg.StaffConfig.StaffConfig; -import BlockSpacePkg.StaffPkg.StaffPanel; -import Stuff.Musica.PlayMusThread; -import Stuff.Tools.Logger; +import model.Explain; +import blockspace.staff.accord.nota.Nota; +import blockspace.staff.StaffConfig.StaffConfig; +import blockspace.staff.StaffPanel; +import stuff.Musica.PlayMusThread; +import stuff.tools.Logger; public class DeviceEbun { diff --git a/src/Stuff/Midi/DumpReceiver.java b/src/stuff/Midi/DumpReceiver.java similarity index 86% rename from src/Stuff/Midi/DumpReceiver.java rename to src/stuff/Midi/DumpReceiver.java index 79983f9..4fb04ee 100755 --- a/src/Stuff/Midi/DumpReceiver.java +++ b/src/stuff/Midi/DumpReceiver.java @@ -1,7 +1,7 @@ -package Stuff.Midi; +package stuff.Midi; -import BlockSpacePkg.StaffPkg.StaffHandler; -import Stuff.Tools.Logger; +import blockspace.staff.StaffHandler; +import stuff.tools.Logger; import javax.sound.midi.MidiMessage; import javax.sound.midi.ShortMessage; diff --git a/src/Stuff/Midi/MidiCommon.java b/src/stuff/Midi/MidiCommon.java similarity index 96% rename from src/Stuff/Midi/MidiCommon.java rename to src/stuff/Midi/MidiCommon.java index c9f719f..1eb4ae4 100755 --- a/src/Stuff/Midi/MidiCommon.java +++ b/src/stuff/Midi/MidiCommon.java @@ -5,9 +5,9 @@ // Il███████████████████]. /▌ Скопируйте и вставь везде // ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙◤.. / \ если вы с нами. -package Stuff.Midi; +package stuff.Midi; -import Stuff.Tools.Logger; +import stuff.tools.Logger; import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiSystem; diff --git a/src/Stuff/Midi/Playback.java b/src/stuff/Midi/Playback.java similarity index 85% rename from src/Stuff/Midi/Playback.java rename to src/stuff/Midi/Playback.java index 52da9bd..c39b036 100755 --- a/src/Stuff/Midi/Playback.java +++ b/src/stuff/Midi/Playback.java @@ -1,8 +1,8 @@ -package Stuff.Midi; +package stuff.Midi; -import Model.Explain; -import BlockSpacePkg.StaffPkg.Accord.Accord; -import BlockSpacePkg.StaffPkg.Staff; +import model.Explain; +import blockspace.staff.accord.Accord; +import blockspace.staff.Staff; import org.apache.commons.math3.fraction.Fraction; public class Playback { @@ -43,13 +43,13 @@ private Explain play() { staff.moveFocusWithPlayback(1, false); staff.getParentSheet().checkCam(); }); - sumFraction = sumFraction.add(accord.getFraction()); + sumFraction = new Fraction(sumFraction.doubleValue() + accord.getFraction().doubleValue()); } runningProcess.addTask(sumFraction.add(1), this::interrupt); runningProcess.start(); return new Explain<>(runningProcess); // returning it so it could be interrupted from another action } else { - return new Explain<>("StaffPkg is empty"); + return new Explain<>("staff is empty"); } } diff --git a/src/Stuff/Midi/PlaybackTimer.java b/src/stuff/Midi/PlaybackTimer.java similarity index 86% rename from src/Stuff/Midi/PlaybackTimer.java rename to src/stuff/Midi/PlaybackTimer.java index 902dccd..8ca1b16 100755 --- a/src/Stuff/Midi/PlaybackTimer.java +++ b/src/stuff/Midi/PlaybackTimer.java @@ -1,9 +1,9 @@ -package Stuff.Midi; +package stuff.Midi; -import Gui.ImageStorage; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import BlockSpacePkg.StaffPkg.StaffConfig.StaffConfig; -import Stuff.Tools.Logger; +import gui.ImageStorage; +import blockspace.staff.accord.nota.Nota; +import blockspace.staff.StaffConfig.StaffConfig; +import stuff.tools.Logger; import org.apache.commons.math3.fraction.Fraction; import java.util.HashMap; @@ -64,7 +64,7 @@ private long toMillis(Fraction f) { } private long getTimerPeriod() { - Fraction step = ImageStorage.getSmallestPossibleNotaLength().divide(3); // 3 - cuz triplet + Fraction step = ImageStorage.getShortLimit().divide(3); // 3 - cuz triplet return toMillis(step); } } \ No newline at end of file diff --git a/src/Stuff/Musica/PlayMusThread.java b/src/stuff/Musica/PlayMusThread.java similarity index 91% rename from src/Stuff/Musica/PlayMusThread.java rename to src/stuff/Musica/PlayMusThread.java index 70d9794..f018b9d 100755 --- a/src/Stuff/Musica/PlayMusThread.java +++ b/src/stuff/Musica/PlayMusThread.java @@ -1,11 +1,11 @@ -package Stuff.Musica; - -import Model.Combo; -import BlockSpacePkg.StaffPkg.Staff; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import BlockSpacePkg.StaffPkg.Accord.Accord; -import Stuff.Midi.DeviceEbun; -import Stuff.Midi.Playback; +package stuff.Musica; + +import model.Combo; +import blockspace.staff.Staff; +import blockspace.staff.accord.nota.Nota; +import blockspace.staff.accord.Accord; +import stuff.Midi.DeviceEbun; +import stuff.Midi.Playback; import org.apache.commons.math3.fraction.Fraction; import java.awt.event.KeyEvent; diff --git a/src/Stuff/OverridingDefaultClasses/ModelFieldInput.java b/src/stuff/OverridingDefaultClasses/ModelFieldInput.java similarity index 78% rename from src/Stuff/OverridingDefaultClasses/ModelFieldInput.java rename to src/stuff/OverridingDefaultClasses/ModelFieldInput.java index 4fababd..bf3197a 100755 --- a/src/Stuff/OverridingDefaultClasses/ModelFieldInput.java +++ b/src/stuff/OverridingDefaultClasses/ModelFieldInput.java @@ -1,6 +1,6 @@ -package Stuff.OverridingDefaultClasses; +package stuff.OverridingDefaultClasses; -import Model.Field.Field; +import model.field.Field; import javax.swing.*; diff --git a/src/Stuff/OverridingDefaultClasses/Pnt.java b/src/stuff/OverridingDefaultClasses/Pnt.java similarity index 88% rename from src/Stuff/OverridingDefaultClasses/Pnt.java rename to src/stuff/OverridingDefaultClasses/Pnt.java index 8e7d2ea..1002dfd 100755 --- a/src/Stuff/OverridingDefaultClasses/Pnt.java +++ b/src/stuff/OverridingDefaultClasses/Pnt.java @@ -1,4 +1,4 @@ -package Stuff.OverridingDefaultClasses; +package stuff.OverridingDefaultClasses; import java.awt.*; diff --git a/src/Stuff/OverridingDefaultClasses/Scroll.java b/src/stuff/OverridingDefaultClasses/Scroll.java similarity index 87% rename from src/Stuff/OverridingDefaultClasses/Scroll.java rename to src/stuff/OverridingDefaultClasses/Scroll.java index 081a537..9378bc3 100755 --- a/src/Stuff/OverridingDefaultClasses/Scroll.java +++ b/src/stuff/OverridingDefaultClasses/Scroll.java @@ -1,4 +1,4 @@ -package Stuff.OverridingDefaultClasses; +package stuff.OverridingDefaultClasses; import javax.swing.*; import java.awt.*; diff --git a/src/Stuff/OverridingDefaultClasses/SynchronizedHashMap.java b/src/stuff/OverridingDefaultClasses/SynchronizedHashMap.java similarity index 91% rename from src/Stuff/OverridingDefaultClasses/SynchronizedHashMap.java rename to src/stuff/OverridingDefaultClasses/SynchronizedHashMap.java index 6495c06..27badd2 100755 --- a/src/Stuff/OverridingDefaultClasses/SynchronizedHashMap.java +++ b/src/stuff/OverridingDefaultClasses/SynchronizedHashMap.java @@ -1,4 +1,4 @@ -package Stuff.OverridingDefaultClasses; +package stuff.OverridingDefaultClasses; import java.util.HashMap; diff --git a/src/Stuff/OverridingDefaultClasses/TruLabel.java b/src/stuff/OverridingDefaultClasses/TruLabel.java similarity index 80% rename from src/Stuff/OverridingDefaultClasses/TruLabel.java rename to src/stuff/OverridingDefaultClasses/TruLabel.java index 734ff44..1fa8dec 100755 --- a/src/Stuff/OverridingDefaultClasses/TruLabel.java +++ b/src/stuff/OverridingDefaultClasses/TruLabel.java @@ -1,6 +1,6 @@ -package Stuff.OverridingDefaultClasses; +package stuff.OverridingDefaultClasses; -import Gui.Constants; +import gui.Constants; import javax.swing.*; diff --git a/src/Stuff/OverridingDefaultClasses/TruMap.java b/src/stuff/OverridingDefaultClasses/TruMap.java similarity index 76% rename from src/Stuff/OverridingDefaultClasses/TruMap.java rename to src/stuff/OverridingDefaultClasses/TruMap.java index 487b880..9635e33 100755 --- a/src/Stuff/OverridingDefaultClasses/TruMap.java +++ b/src/stuff/OverridingDefaultClasses/TruMap.java @@ -1,6 +1,5 @@ -package Stuff.OverridingDefaultClasses; +package stuff.OverridingDefaultClasses; -import java.util.HashMap; import java.util.LinkedHashMap; public class TruMap extends LinkedHashMap { diff --git a/src/Stuff/OverridingDefaultClasses/TruMenuItem.java b/src/stuff/OverridingDefaultClasses/TruMenuItem.java similarity index 83% rename from src/Stuff/OverridingDefaultClasses/TruMenuItem.java rename to src/stuff/OverridingDefaultClasses/TruMenuItem.java index 6560d31..25fae8b 100755 --- a/src/Stuff/OverridingDefaultClasses/TruMenuItem.java +++ b/src/stuff/OverridingDefaultClasses/TruMenuItem.java @@ -1,4 +1,4 @@ -package Stuff.OverridingDefaultClasses; +package stuff.OverridingDefaultClasses; import javax.swing.*; diff --git a/src/Stuff/test/CoreJavaSound.java b/src/stuff/test/CoreJavaSound.java similarity index 98% rename from src/Stuff/test/CoreJavaSound.java rename to src/stuff/test/CoreJavaSound.java index 6788048..0972590 100755 --- a/src/Stuff/test/CoreJavaSound.java +++ b/src/stuff/test/CoreJavaSound.java @@ -1,4 +1,4 @@ -package Stuff.test; +package stuff.test; import java.io.File; diff --git a/src/Stuff/test/HtmlTextAreaExample/TextSamplerDemo.java b/src/stuff/test/HtmlTextAreaExample/TextSamplerDemo.java similarity index 99% rename from src/Stuff/test/HtmlTextAreaExample/TextSamplerDemo.java rename to src/stuff/test/HtmlTextAreaExample/TextSamplerDemo.java index 5d10bdc..16ac8fd 100755 --- a/src/Stuff/test/HtmlTextAreaExample/TextSamplerDemo.java +++ b/src/stuff/test/HtmlTextAreaExample/TextSamplerDemo.java @@ -29,7 +29,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package Stuff.test.HtmlTextAreaExample; +package stuff.test.HtmlTextAreaExample; /* * TextSamplerDemo.java requires the following files: @@ -44,7 +44,6 @@ import java.awt.*; //for layout managers and more import java.awt.event.*; //for action events -import java.net.URL; import java.io.IOException; public class TextSamplerDemo extends JPanel diff --git a/src/Stuff/test/HtmlTextAreaExample/TextSamplerDemoHelp.html b/src/stuff/test/HtmlTextAreaExample/TextSamplerDemoHelp.html similarity index 100% rename from src/Stuff/test/HtmlTextAreaExample/TextSamplerDemoHelp.html rename to src/stuff/test/HtmlTextAreaExample/TextSamplerDemoHelp.html diff --git a/src/Stuff/test/HtmlTextAreaExample/images/Pig.gif b/src/stuff/test/HtmlTextAreaExample/images/Pig.gif similarity index 100% rename from src/Stuff/test/HtmlTextAreaExample/images/Pig.gif rename to src/stuff/test/HtmlTextAreaExample/images/Pig.gif diff --git a/src/Stuff/test/HtmlTextAreaExample/images/dukeWaveRed.gif b/src/stuff/test/HtmlTextAreaExample/images/dukeWaveRed.gif similarity index 100% rename from src/Stuff/test/HtmlTextAreaExample/images/dukeWaveRed.gif rename to src/stuff/test/HtmlTextAreaExample/images/dukeWaveRed.gif diff --git a/src/Stuff/test/HtmlTextAreaExample/images/sound.gif b/src/stuff/test/HtmlTextAreaExample/images/sound.gif similarity index 100% rename from src/Stuff/test/HtmlTextAreaExample/images/sound.gif rename to src/stuff/test/HtmlTextAreaExample/images/sound.gif diff --git a/src/Stuff/test/MidiSequencerTest.java b/src/stuff/test/MidiSequencerTest.java similarity index 99% rename from src/Stuff/test/MidiSequencerTest.java rename to src/stuff/test/MidiSequencerTest.java index 705211e..89d6f1d 100755 --- a/src/Stuff/test/MidiSequencerTest.java +++ b/src/stuff/test/MidiSequencerTest.java @@ -1,4 +1,4 @@ -package Stuff.test; +package stuff.test; import javax.sound.midi.*; import javax.sound.sampled.AudioFormat; diff --git a/src/Stuff/test/NoteVectorDrawing.java b/src/stuff/test/NoteVectorDrawing.java similarity index 79% rename from src/Stuff/test/NoteVectorDrawing.java rename to src/stuff/test/NoteVectorDrawing.java index 902a30c..a5cec91 100755 --- a/src/Stuff/test/NoteVectorDrawing.java +++ b/src/stuff/test/NoteVectorDrawing.java @@ -1,4 +1,4 @@ -package Stuff.test; +package stuff.test; /** * Created by klesun on 6/28/15. diff --git a/src/Stuff/test/PitchBendAndVolumeTest.java b/src/stuff/test/PitchBendAndVolumeTest.java similarity index 96% rename from src/Stuff/test/PitchBendAndVolumeTest.java rename to src/stuff/test/PitchBendAndVolumeTest.java index 416fa08..6c64541 100755 --- a/src/Stuff/test/PitchBendAndVolumeTest.java +++ b/src/stuff/test/PitchBendAndVolumeTest.java @@ -1,9 +1,9 @@ -package Stuff.test; +package stuff.test; -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import Stuff.Midi.MidiCommon; -import Stuff.Tools.Logger; +import blockspace.staff.accord.nota.Nota; +import stuff.Midi.MidiCommon; +import stuff.tools.Logger; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MidiDevice; diff --git a/src/Stuff/test/ScrollGrid.java b/src/stuff/test/ScrollGrid.java similarity index 98% rename from src/Stuff/test/ScrollGrid.java rename to src/stuff/test/ScrollGrid.java index 70167a9..92233d3 100755 --- a/src/Stuff/test/ScrollGrid.java +++ b/src/stuff/test/ScrollGrid.java @@ -1,4 +1,4 @@ -package Stuff.test; +package stuff.test; import java.awt.BorderLayout; import java.awt.EventQueue; diff --git a/src/Stuff/test/SimpleMenuEx.java b/src/stuff/test/SimpleMenuEx.java similarity index 92% rename from src/Stuff/test/SimpleMenuEx.java rename to src/stuff/test/SimpleMenuEx.java index 31c6870..e68c1f0 100755 --- a/src/Stuff/test/SimpleMenuEx.java +++ b/src/stuff/test/SimpleMenuEx.java @@ -1,8 +1,6 @@ -package Stuff.test; +package stuff.test; import java.awt.EventQueue; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.ImageIcon; diff --git a/src/Stuff/test/hujGuzno.java b/src/stuff/test/hujGuzno.java similarity index 55% rename from src/Stuff/test/hujGuzno.java rename to src/stuff/test/hujGuzno.java index 11fdd7e..daa6a69 100755 --- a/src/Stuff/test/hujGuzno.java +++ b/src/stuff/test/hujGuzno.java @@ -1,8 +1,4 @@ -package Stuff.test; - -import javax.swing.*; -import javax.swing.text.BadLocationException; -import java.awt.*; +package stuff.test; public class hujGuzno { diff --git a/src/Stuff/Tools/Bin.java b/src/stuff/tools/Bin.java similarity index 82% rename from src/Stuff/Tools/Bin.java rename to src/stuff/tools/Bin.java index d6e55f6..c2c0100 100755 --- a/src/Stuff/Tools/Bin.java +++ b/src/stuff/tools/Bin.java @@ -1,4 +1,4 @@ -package Stuff.Tools; +package stuff.tools; public class Bin { diff --git a/src/Stuff/Tools/FileProcessor.java b/src/stuff/tools/FileProcessor.java similarity index 88% rename from src/Stuff/Tools/FileProcessor.java rename to src/stuff/tools/FileProcessor.java index bfd98a4..88e5a39 100755 --- a/src/Stuff/Tools/FileProcessor.java +++ b/src/stuff/tools/FileProcessor.java @@ -1,16 +1,16 @@ -package Stuff.Tools; +package stuff.tools; -import Model.Explain; +import model.Explain; import main.Main; -import BlockSpacePkg.StaffPkg.Staff; -import BlockSpacePkg.BlockSpace; -import Model.IModel; +import blockspace.staff.Staff; +import blockspace.BlockSpace; +import model.IModel; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.filechooser.FileFilter; -import Stuff.Tools.jmusicIntegration.JMusicIntegration; +import stuff.tools.jmusic_integration.JMusicIntegration; import org.json.JSONException; import org.json.JSONObject; @@ -22,6 +22,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.Arrays; +import java.util.function.Function; public class FileProcessor { @@ -118,20 +119,27 @@ public String getDescription() { } } + // with rounding + public static Explain openJMusic2(Staff staff) { + return openJMusicAndPerform(staff, new JMusicIntegration(staff)::fillFromJm2); + } + // TODO: we'll need this just untill i get opening MIDI into MIDIana public static Explain openJMusic(Staff staff) { + return openJMusicAndPerform(staff, new JMusicIntegration(staff)::fillFromJm); + } + + private static Explain openJMusicAndPerform(Staff staff, Function fillStaffLambda) { fileChooser.setFileFilter(new FileFilter() { public boolean accept(File f) { return f.getAbsolutePath().endsWith(".jm.json") || f.isDirectory(); } public String getDescription() { return "Json JMusic data"; } }); if (fileChooser.showOpenDialog(Main.window) == JFileChooser.APPROVE_OPTION) { File f = fileChooser.getSelectedFile(); - staff.getParentSheet().getScroll().setTitle(f.getName()); - - JMusicIntegration helper = new JMusicIntegration(staff.clearStan()); + staff.clearStan().getParentSheet().getScroll().setTitle(f.getName()); Explain jsExplain = openJsonFile(f); - return jsExplain.isSuccess() ? helper.fillFromJm(jsExplain.getData()) : jsExplain; + return jsExplain.isSuccess() ? fillStaffLambda.apply(jsExplain.getData()) : jsExplain; } else { return new Explain("you changed your mind, why?"); } diff --git a/src/Stuff/Tools/Fp.java b/src/stuff/tools/Fp.java similarity index 98% rename from src/Stuff/Tools/Fp.java rename to src/stuff/tools/Fp.java index 35687b6..b6eaddb 100755 --- a/src/Stuff/Tools/Fp.java +++ b/src/stuff/tools/Fp.java @@ -1,4 +1,4 @@ -package Stuff.Tools; +package stuff.tools; import java.awt.*; import java.util.ArrayList; diff --git a/src/Stuff/Tools/Logger.java b/src/stuff/tools/Logger.java similarity index 98% rename from src/Stuff/Tools/Logger.java rename to src/stuff/tools/Logger.java index 62da2e0..ca024a2 100755 --- a/src/Stuff/Tools/Logger.java +++ b/src/stuff/tools/Logger.java @@ -1,7 +1,7 @@ -package Stuff.Tools; +package stuff.tools; import main.Main; -import Model.Explain; +import model.Explain; import javax.swing.*; import java.awt.*; diff --git a/src/stuff/tools/jmusic_integration/AddPhrase.java b/src/stuff/tools/jmusic_integration/AddPhrase.java new file mode 100644 index 0000000..8a359be --- /dev/null +++ b/src/stuff/tools/jmusic_integration/AddPhrase.java @@ -0,0 +1,162 @@ +package stuff.tools.jmusic_integration; + +import blockspace.staff.accord.nota.Nota; +import blockspace.staff.Staff; +import gui.ImageStorage; +import stuff.tools.Logger; +import org.apache.commons.math3.fraction.Fraction; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class AddPhrase { + + final private Staff staff; + final private List noteList; + final private Fraction startOffset; + final private int channel; + final private Boolean round; + + public AddPhrase(Staff staff, JSONObject phraseJs, int channel, Boolean round) { + this.staff = staff; + this.channel = channel; + this.round = round; + + this.noteList = toList(phraseJs.getJSONArray("noteList")) + .stream().map(j -> JmNote.mk(j, channel)).collect(Collectors.toList()); + this.startOffset = phraseJs.has("startTime") + ? JmNote.toFrac(phraseJs.getDouble("startTime")) + : new Fraction(0); + } + + public void perform() { + Fraction curPos = this.startOffset; + for (JmNote note: noteList) { + + if (note.getTune() == Integer.MIN_VALUE) { + // �� ��������, ��� ����� ��� INT_MIN, � � ������ ��� ����! + note = JmNote.mk(0, note.getLength(), channel); + } + + /** @debug */ + if (note.getLength().equals(new Fraction(0))) { + System.out.println("zhopa " + note.rawLength); + Runtime.getRuntime().exit(-100); + } + + if (round) { + note = JmNote.mk(note.getTune(), roundNotaLength(note.rawLength), channel); + } + + put(curPos, note); + + curPos = new Fraction(curPos.floatValue() + note.getRealLength().floatValue()); + if (round) { + curPos = roundPos(curPos); + } + } + } + + private void put(Fraction pos, JmNote note) { + Nota nota; + if (note.isDotable() || note.isTooLong() || note.isTooShort()) { + nota = staff.putAt(pos, note); + } else { + Fraction base = getClosestRegularBelow(note.getLength()); + Fraction rest = note.getLength().subtract(base); + nota = staff.putAt(pos, JmNote.mk(note.getTune(), base, channel)).setIsLinkedToNext(true); + nota = staff.putAt(pos.add(base), JmNote.mk(note.getTune(), rest, channel)); + } + } + + private static Fraction roundPos(Fraction pos) { + Fraction result = new Fraction(0); + // ��������� �� ����� ��������� ��� � ������� ������� + while (pos.compareTo(ImageStorage.getShortLimit().divide(3)) > 0) { + Fraction change = pos.compareTo(ImageStorage.getTallLimit()) < 0 + ? roundNotaLength(pos.doubleValue()) + : ImageStorage.getTallLimit(); + result = result.add(change); + pos = pos.subtract(change); + } + return result; + } + + // clean with dots + private static Fraction getClosestRegularBelow(Fraction irregular) { + Fraction regular = getClosestCleanBelow(irregular); + + // for now i'll allow only one dot here, cuz more dots are rarely used; less conditions - more chances to guess correctly + if (regular.add(regular.divide(2)).compareTo(irregular) < 0) { + regular = regular.add(regular.divide(2)); + } + + return regular; + } + + private static Fraction getClosestCleanBelow(Fraction irregular) { + for (Fraction maybeResult: ImageStorage.getAvailableNotaLengthList()) { + if (irregular.compareTo(maybeResult) >= 0) { + return maybeResult; + } + } + + Logger.fatal("You should not need to call this method with such small argument"); // maybe i amnt right + return new Fraction(-100); + } + + private static List toList(JSONArray arr) { + List result = new ArrayList<>(); + for (int i = 0; i < arr.length(); ++i) { + result.add(arr.getJSONObject(i)); + } + return result; + } + + /** @return a fraction between left and right limit (1/48 and 2/1) */ + private static Fraction roundNotaLength(Double rhythm) { + + rhythm = rhythm / 4; // i dunno, looks like it's standard practice in midi to divide nota length in milliseconds to TicksPerBeat + + List lengths = new ArrayList<>(); + // filling the list + for (Fraction frac: ImageStorage.getAvailableNotaLengthList()) { + lengths.add(frac); // simple + lengths.add(frac.divide(3)); // triplet + lengths.add(frac.add(frac.divide(2))); // with dot + if (frac.divide(4).compareTo(ImageStorage.getShortLimit()) > 0) { + lengths.add(frac.add(frac.divide(4))); // linked to 4 times smaller + } + } + Collections.sort(lengths); + + /** @debug */ + System.out.println("\nRounders gonna round! " + rhythm); + + for (int i = 0; i < lengths.size(); ++i) { + System.out.println("Iteration " + i); + if (i < lengths.size() - 1) { + Fraction small = lengths.get(i); + Fraction big = lengths.get(i + 1); + + if (rhythm <= big.doubleValue()) { + Double dSmall = rhythm - small.doubleValue(); + Double dBig = rhythm - big.doubleValue(); + + System.out.println("huj"); + return dSmall < dBig ? small : big; // should note: works also if rhythm is greater than greatest (dSmall will be negative) + } + } else { + System.out.println("zhopa"); + return lengths.get(lengths.size() - 1); + } + } + + Logger.fatal("Cant happen!"); + return new Fraction(-100); + } +} diff --git a/src/stuff/tools/jmusic_integration/INota.java b/src/stuff/tools/jmusic_integration/INota.java new file mode 100644 index 0000000..407f380 --- /dev/null +++ b/src/stuff/tools/jmusic_integration/INota.java @@ -0,0 +1,81 @@ +package stuff.tools.jmusic_integration; + +import gui.ImageStorage; +import stuff.tools.Bin; +import stuff.tools.Logger; +import org.apache.commons.math3.fraction.Fraction; + +public interface INota extends Comparable { + + Integer getTune(); + Integer getChannel(); + Fraction getLength(); + Boolean isTriplet(); + + default int compareTo(INota n) { + return ((n.getTune() - this.getTune()) << 4) + (n.getChannel() - this.getChannel()); + } + + static Fraction legnthNorm(Fraction value) { + // Commented for now, but not sure that made right thing +// if (value.equals(new Fraction(0))) { +// Logger.fatal("zero length NO WAI"); +// } + if (!isDotable(value) && !isTooShort(value) && !isTooLong(value)) { + Logger.warning("Not Dotable Fraction: " + value); + } + + return value; +// return Helper.limit(value, new Fraction(1, 256), new Fraction(4)); // sometimes need to fill diff between triplet and straight +// return Helper.limit(value, new Fraction(1, 16), new Fraction(2)); + } + + default Boolean isDotable() { + return isDotable(getLength()); + } + + default Boolean isTooLong() { + return isTooLong(getLength()); + } + + default Boolean isTooShort() { + return isTooShort(getLength()); + } + + // 1/256 + 1/128 + 1/64 + 1/32 + 1/16 + 1/8 + 1/4 + 1/2 = 1111 1111 + + // 0000 0111 - true + + // 0001 1111 - true + + // 0011 1111 - true + + // 0010 0110 - false + + /** @return true if length can be expressed through sum 2 + 1 + 1/2 + 1/4 + 1/8 + ... 1/2^n */ + static Boolean isDotable(Fraction length) { + + if (isTooShort(length) || isTooLong(length) || length.getDenominator() > ImageStorage.getShortLimit().getDenominator()) { + return false; + } else { + length = length.divide(ImageStorage.getTallLimit().multiply(2)); // to make sure, that the length is less than 1 + if (length.compareTo(new Fraction(1)) >= 0) { + Logger.fatal("Providen fraction is greater than 1 even after deviding it to gretest possible nota length! We'll all die!!!" + length); + } + + if (Bin.isPowerOf2(length.getDenominator())) { // will be false for triols + return Bin.isPowerOf2(length.getNumerator() + 1); // not sure... but, ok, kinda sure + } else { + return false; + } + } + } + + static Boolean isTooLong(Fraction length) { + return length.compareTo(ImageStorage.getTallLimit()) > 0; + } + + static Boolean isTooShort(Fraction length) { + return length.compareTo(ImageStorage.getShortLimit()) < 0; + } +} diff --git a/src/Stuff/Tools/jmusicIntegration/JMusicIntegration.java b/src/stuff/tools/jmusic_integration/JMusicIntegration.java similarity index 57% rename from src/Stuff/Tools/jmusicIntegration/JMusicIntegration.java rename to src/stuff/tools/jmusic_integration/JMusicIntegration.java index 85179f4..d70e429 100644 --- a/src/Stuff/Tools/jmusicIntegration/JMusicIntegration.java +++ b/src/stuff/tools/jmusic_integration/JMusicIntegration.java @@ -1,18 +1,10 @@ -package Stuff.Tools.jmusicIntegration; - -import BlockSpacePkg.StaffPkg.Accord.Nota.Nota; -import BlockSpacePkg.StaffPkg.Staff; -import Gui.ImageStorage; -import Model.Explain; -import Stuff.Tools.Logger; -import org.apache.commons.math3.fraction.Fraction; +package stuff.tools.jmusic_integration; + +import blockspace.staff.Staff; +import model.Explain; import org.json.JSONArray; import org.json.JSONObject; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - public class JMusicIntegration { final private Staff staff; @@ -22,14 +14,25 @@ public JMusicIntegration(Staff staff) { } public Explain fillFromJm(JSONObject jmJs) { + return fillFromJm(jmJs, false); + } + // with rounding + public Explain fillFromJm2(JSONObject jmJs) { + return fillFromJm(jmJs, true); + } + + private Explain fillFromJm(JSONObject jmJs, Boolean round) { int channel = 0; JSONArray partList = jmJs.getJSONArray("partList"); for (int i = 0; i < partList.length(); ++i) { JSONArray phraseList = partList.getJSONObject(i).getJSONArray("phraseList"); for (int j = 0; j < phraseList.length(); ++j) { - new AddPhrase(staff, phraseList.getJSONObject(j), channel++).perform(); + new AddPhrase(staff, phraseList.getJSONObject(j), channel++, round).perform(); + + /** @debug - wanna listen just how first sound */ +// break; } /** @debug - lets merge just phrases for begin */ diff --git a/src/Stuff/Tools/jmusicIntegration/JmNote.java b/src/stuff/tools/jmusic_integration/JmNote.java similarity index 89% rename from src/Stuff/Tools/jmusicIntegration/JmNote.java rename to src/stuff/tools/jmusic_integration/JmNote.java index 42f7dfa..ce6aaad 100644 --- a/src/Stuff/Tools/jmusicIntegration/JmNote.java +++ b/src/stuff/tools/jmusic_integration/JmNote.java @@ -1,4 +1,4 @@ -package Stuff.Tools.jmusicIntegration; +package stuff.tools.jmusic_integration; import org.apache.commons.math3.fraction.Fraction; import org.json.JSONObject; @@ -14,7 +14,7 @@ public JmNote(int pitch, Double rawLength, int channel) { this.pitch = pitch; this.channel = channel; - if (toFrac(rawLength).getDenominator() % 3 == 0) { // TODO it's not fair. Nota with three dots will match and with 5 and with 1 + if (toFrac(rawLength).getDenominator() % 3 == 0) { // TODO it's not fair. nota with three dots will match and with 5 and with 1 this.isTriplet = true; this.rawLength = rawLength * 3; } else { @@ -71,7 +71,7 @@ public Fraction getLength() { public static Fraction toFrac(Double rawLength) { Double realNum = Math.round(rawLength / 4 * 100000) / 100000.0; // will break program if got triplet and yu-no this - return new Fraction(realNum, 48); // 48 - 1/48 16th triol + return new Fraction(realNum/*, 48*/); // 48 - 1/48 16th triol } final private static Double JM_DEFAULT_RHYTM = 1.0; // quarter... narkomani