Quellcode durchsuchen

new version with new data structure

Wilfried Klaas vor 6 Jahren
Ursprung
Commit
8840d181b7

+ 176 - 162
src/main/java/de/mcs/tools/midicontroller/ConvertJsonData2Hex.java

@@ -30,10 +30,11 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 
 import de.mcs.tools.midicontroller.data.ButtonData;
+import de.mcs.tools.midicontroller.data.ButtonData.TYPE;
 import de.mcs.tools.midicontroller.data.DataData;
-import de.mcs.tools.midicontroller.data.EventData;
 import de.mcs.tools.midicontroller.data.ProgramData;
 import de.mcs.tools.midicontroller.data.Programs;
+import de.mcs.tools.midicontroller.data.SequenceData;
 import de.mcs.tools.sps.utils.IntelHex;
 import de.mcs.utils.Files;
 import de.mcs.utils.JacksonUtils;
@@ -44,165 +45,178 @@ import de.mcs.utils.JacksonUtils;
  */
 public class ConvertJsonData2Hex {
 
-	/**
-	 * @param args
-	 * @throws Exception
-	 */
-	public static void main(String[] args) throws Exception {
-		InputStream source = ClassLoader.getSystemResourceAsStream("programdata.json");
-		Programs programs = JacksonUtils.getJsonMapper().readValue(source, Programs.class);
-		int saveSize = 0;
-		try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-			out.write((byte) programs.getVersion());
-
-			for (ProgramData programData : programs.getPrograms()) {
-				saveSize = out.size();
-				System.out.println(programData.toString());
-				byte[] name = copyInto(getEmptyByteArray(12), getStringAsByte(programData.getName(), 12));
-
-				out.write(name);
-
-				out.write((byte) programData.getPrgNumber());
-				out.write((byte) programData.getInternalMidi());
-				out.write((byte) programData.getExternalMidi());
-
-				byte switchSettings = 0x00;
-				if ((programData.getButtons() != null) && (programData.getButtons().length > 2)) {
-					for (int i = 0; i < programData.getButtons().length; i++) {
-						byte[] buttonName = getEmptyByteArray(8);
-						ButtonData buttonData = programData.getButtons()[i];
-						if (i < 3) {
-							buttonName = copyInto(buttonName, getStringAsByte(buttonData.getName(), 8));
-							out.write(buttonName);
-							out.write((byte) buttonData.getColor());
-						}
-						if (ButtonData.TYPE.SWITCH.equals(buttonData.getType())) {
-							switchSettings = (byte) (switchSettings | (0x01 << i));
-						}
-					}
-				} else {
-					throw new Exception("buttons not correct configured.");
-				}
-				out.write(switchSettings);
-				for (int i = 0; i < 15; i++) {
-					byte[] data = getEmptyByteArray(25);
-					if ((programData.getEvents() != null) && (programData.getEvents().length > i)) {
-						int eventTyp = 0;
-						EventData eventData = programData.getEvents()[i];
-						switch (eventData.getType()) {
-						case INTERNAL:
-							eventTyp = 0;
-							break;
-						case EXPRESSION:
-							eventTyp = 0x70;
-							break;
-						case BUTTON:
-							eventTyp = 0x10 * (eventData.getValue());
-							break;
-						default:
-							break;
-						}
-						eventTyp = eventTyp | eventData.getEvent().ordinal();
-						data[0] = (byte) (eventTyp & 0xFF);
-						DataData[] datas = eventData.getDatas();
-						int pos = 1;
-						for (DataData dataData : datas) {
-							int dataType = dataData.getType().getByte();
-							if (DataData.CHANNEL.INTERNAL.equals(dataData.getChannel())) {
-								dataType = dataType + programData.getInternalMidi();
-							}
-							if (DataData.CHANNEL.EXTERNAL.equals(dataData.getChannel())) {
-								dataType = dataType + programData.getExternalMidi();
-							}
-							data[pos++] = (byte) dataType;
-							if ((pos + 1) < data.length) { // mindestens 2 noch
-															// platz
-								switch (dataData.getType()) {
-								case CC:
-								case NOTE_OFF:
-								case NOTE_ON:
-									data[pos++] = (byte) dataData.getData1();
-									data[pos++] = (byte) dataData.getData2();
-									break;
-								case ALL_NOTE_OFF:
-									data[pos++] = 0x78;
-									data[pos++] = 0x00;
-									break;
-								case PC:
-									data[pos++] = (byte) dataData.getData1();
-									data[pos++] = (byte) 0;
-									break;
-								default:
-									break;
-								}
-							} else {
-								throw new Exception("not enough memory.");
-							}
-						}
-					}
-					out.write(data);
-				}
-
-				out.write(0xFF);
-				System.out.println(String.format("actual size: %d", out.size() - saveSize));
-			}
-			out.close();
-			byte[] outBytes = out.toByteArray();
-			StringBuilder b1 = new StringBuilder();
-			StringBuilder b2 = new StringBuilder();
-			StringBuilder b3 = new StringBuilder();
-			for (int i = 0; i < outBytes.length; i++) {
-				byte myByte = outBytes[i];
-				if ((myByte & 0xFF) == 0xFF) {
-					b1.append(String.format("    ", (char) myByte));
-				} else {
-					b1.append(String.format("  %1s ", (char) myByte));
-				}
-				b2.append(String.format(" %2x,", myByte));
-				if (((i + 1) % 8) == 0) {
-					b3.append(b1.toString());
-					b3.append("\r\n");
-					b3.append(b2.toString());
-					b3.append("\r\n");
-					b1 = new StringBuilder();
-					b2 = new StringBuilder();
-				}
-			}
-			System.out.println(b3.toString());
-			File text = new File("programData.txt");
-			Files.writeStringToFile(text, b3.toString());
-
-			System.out.printf("The file has %d bytes.\r\n", outBytes.length);
-
-			File dest = new File("programData.hex");
-			try (BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(dest))) {
-				IntelHex intelHex = new IntelHex();
-				intelHex.writeHexStream(output, outBytes);
-			}
-		}
-
-	}
-
-	private static byte[] getStringAsByte(String value, int count) throws UnsupportedEncodingException {
-		String newValue = value;
-		if (newValue.length() > count) {
-			newValue = newValue.substring(0, count);
-		}
-		return newValue.getBytes("US-ASCII");
-	}
-
-	private static byte[] getEmptyByteArray(int count) {
-		byte[] value = new byte[count];
-		for (int i = 0; i < value.length; i++) {
-			value[i] = 0;
-		}
-		return value;
-	}
-
-	private static byte[] copyInto(byte[] dest, byte[] source) {
-		for (int i = 0; i < source.length; i++) {
-			dest[i] = source[i];
-		}
-		return dest;
-	}
+  /**
+   * @param args
+   * @throws Exception
+   */
+  public static void main(String[] args) throws Exception {
+    InputStream source = ClassLoader.getSystemResourceAsStream("programdata.json");
+    Programs programs = JacksonUtils.getJsonMapper().readValue(source, Programs.class);
+    int saveSize = 0;
+    try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+      out.write((byte) programs.getVersion());
+
+      for (ProgramData programData : programs.getPrograms()) {
+        saveSize = out.size();
+        System.out.println(programData.toString());
+        byte[] name = copyInto(getEmptyByteArray(12), getStringAsByte(programData.getName(), 12));
+
+        out.write(name);
+
+        out.write((byte) programData.getPrgNumber());
+        out.write((byte) programData.getInternalMidi());
+        out.write((byte) programData.getExternalMidi());
+
+        // bis hier sind es 15 Bytes
+        byte switchSettings = 0x00;
+        ButtonData[] buttons = programData.getButtons();
+        if ((buttons != null) && (buttons.length > 2)) {
+          for (int i = 0; i < 6; i++) {
+            byte[] buttonName = getEmptyByteArray(8);
+            ButtonData buttonData;
+            if (i < buttons.length) {
+              buttonData = buttons[i];
+            } else {
+              buttonData = new ButtonData();
+              buttonData.setName("");
+              buttonData.setColor(0);
+              buttonData.setType(TYPE.SWITCH);
+            }
+            if (i < 6) {
+              buttonName = copyInto(buttonName, getStringAsByte(buttonData.getName(), 8));
+              out.write(buttonName);
+              out.write((byte) buttonData.getColor());
+            }
+            if (ButtonData.TYPE.SWITCH.equals(buttonData.getType())) {
+              switchSettings = (byte) (switchSettings | (0x01 << i));
+            }
+          }
+        } else {
+          throw new Exception("buttons not correct configured.");
+        }
+        // 9 pro Button = 54 pos: 54+15 69
+        out.write(switchSettings);
+
+        // Events starten bei 70
+        for (int i = 0; i < 15; i++) {
+          byte[] data = getEmptyByteArray(49);
+          if ((programData.getSequences() != null) && (programData.getSequences().length > i)) {
+            int eventTyp = 0;
+            SequenceData eventData = programData.getSequences()[i];
+            switch (eventData.getType()) {
+            case INTERNAL:
+              eventTyp = 0;
+              break;
+            case EXPRESSION:
+              eventTyp = 0x70;
+              break;
+            case BUTTON:
+              eventTyp = 0x10 * (eventData.getValue());
+              break;
+            default:
+              break;
+            }
+            eventTyp = eventTyp | eventData.getEvent().ordinal();
+            data[0] = (byte) (eventTyp & 0xFF);
+            DataData[] datas = eventData.getDatas();
+            int pos = 1;
+            for (DataData dataData : datas) {
+              int dataType = dataData.getType().getByte();
+              if (DataData.CHANNEL.INTERNAL.equals(dataData.getChannel())) {
+                dataType = dataType + programData.getInternalMidi();
+              }
+              if (DataData.CHANNEL.EXTERNAL.equals(dataData.getChannel())) {
+                dataType = dataType + programData.getExternalMidi();
+              }
+              data[pos++] = (byte) dataType;
+              if ((pos + 1) < data.length) { // mindestens 2 noch
+                                             // platz
+                switch (dataData.getType()) {
+                case CC:
+                case NOTE_OFF:
+                case NOTE_ON:
+                  data[pos++] = (byte) dataData.getData1();
+                  data[pos++] = (byte) dataData.getData2();
+                  break;
+                case ALL_NOTE_OFF:
+                  data[pos++] = 0x78;
+                  data[pos++] = 0x00;
+                  break;
+                case PC:
+                  data[pos++] = (byte) dataData.getData1();
+                  data[pos++] = (byte) 0;
+                  break;
+                default:
+                  break;
+                }
+              } else {
+                throw new Exception("not enough memory.");
+              }
+            }
+          }
+          out.write(data);
+        }
+
+        out.write(0xFF);
+        System.out.println(String.format("actual size: %d", out.size() - saveSize));
+      }
+      out.close();
+      byte[] outBytes = out.toByteArray();
+      StringBuilder b1 = new StringBuilder();
+      StringBuilder b2 = new StringBuilder();
+      StringBuilder b3 = new StringBuilder();
+      for (int i = 0; i < outBytes.length; i++) {
+        byte myByte = outBytes[i];
+        if ((myByte & 0xFF) == 0xFF) {
+          b1.append(String.format("    ", (char) myByte));
+        } else {
+          b1.append(String.format("  %1s ", (char) myByte));
+        }
+        b2.append(String.format(" %2x,", myByte));
+        if (((i + 1) % 8) == 0) {
+          b3.append(b1.toString());
+          b3.append("\r\n");
+          b3.append(b2.toString());
+          b3.append("\r\n");
+          b1 = new StringBuilder();
+          b2 = new StringBuilder();
+        }
+      }
+      System.out.println(b3.toString());
+      File text = new File("programData.txt");
+      Files.writeStringToFile(text, b3.toString());
+
+      System.out.printf("The file has %d bytes.\r\n", outBytes.length);
+
+      File dest = new File("programData.hex");
+      try (BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(dest))) {
+        IntelHex intelHex = new IntelHex();
+        intelHex.writeHexStream(output, outBytes);
+      }
+    }
+
+  }
+
+  private static byte[] getStringAsByte(String value, int count) throws UnsupportedEncodingException {
+    String newValue = value;
+    if (newValue.length() > count) {
+      newValue = newValue.substring(0, count);
+    }
+    return newValue.getBytes("US-ASCII");
+  }
+
+  private static byte[] getEmptyByteArray(int count) {
+    byte[] value = new byte[count];
+    for (int i = 0; i < value.length; i++) {
+      value[i] = 0;
+    }
+    return value;
+  }
+
+  private static byte[] copyInto(byte[] dest, byte[] source) {
+    for (int i = 0; i < source.length; i++) {
+      dest[i] = source[i];
+    }
+    return dest;
+  }
 }

+ 74 - 73
src/main/java/de/mcs/tools/midicontroller/data/ProgramData.java

@@ -29,78 +29,79 @@ import java.util.Arrays;
  *
  */
 public class ProgramData {
-	private String name;
-	private int prgNumber;
-	private int internalMidi;
-	private int externalMidi;
-	private ButtonData[] buttons;
-	private EventData[] events;
-
-	@Override
-	public String toString() {
-		return String.format("PRG[name: %s, prgNumber: %d, buttons: %s, events: %s]", name, prgNumber, Arrays.toString(buttons), Arrays.toString(events));
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public int getPrgNumber() {
-		return prgNumber;
-	}
-
-	public void setPrgNumber(int prgNumber) {
-		this.prgNumber = prgNumber;
-	}
-
-	public ButtonData[] getButtons() {
-		return buttons;
-	}
-
-	public void setButtons(ButtonData[] buttons) {
-		this.buttons = buttons;
-	}
-
-	public EventData[] getEvents() {
-		return events;
-	}
-
-	public void setEvents(EventData[] events) {
-		this.events = events;
-	}
-
-	/**
-	 * @return the internalMidi
-	 */
-	public int getInternalMidi() {
-		return internalMidi;
-	}
-
-	/**
-	 * @param internalMidi
-	 *            the internalMidi to set
-	 */
-	public void setInternalMidi(int internalMidi) {
-		this.internalMidi = internalMidi;
-	}
-
-	/**
-	 * @return the externalMidi
-	 */
-	public int getExternalMidi() {
-		return externalMidi;
-	}
-
-	/**
-	 * @param externalMidi
-	 *            the externalMidi to set
-	 */
-	public void setExternalMidi(int externalMidi) {
-		this.externalMidi = externalMidi;
-	}
+  private String name;
+  private int prgNumber;
+  private int internalMidi;
+  private int externalMidi;
+  private ButtonData[] buttons;
+  private SequenceData[] sequences;
+
+  @Override
+  public String toString() {
+    return String.format("PRG[name: %s, prgNumber: %d, buttons: %s, sequences: %s]", name, prgNumber,
+        Arrays.toString(buttons), Arrays.toString(sequences));
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public int getPrgNumber() {
+    return prgNumber;
+  }
+
+  public void setPrgNumber(int prgNumber) {
+    this.prgNumber = prgNumber;
+  }
+
+  public ButtonData[] getButtons() {
+    return buttons;
+  }
+
+  public void setButtons(ButtonData[] buttons) {
+    this.buttons = buttons;
+  }
+
+  public SequenceData[] getSequences() {
+    return sequences;
+  }
+
+  public void setSequences(SequenceData[] sequences) {
+    this.sequences = sequences;
+  }
+
+  /**
+   * @return the internalMidi
+   */
+  public int getInternalMidi() {
+    return internalMidi;
+  }
+
+  /**
+   * @param internalMidi
+   *          the internalMidi to set
+   */
+  public void setInternalMidi(int internalMidi) {
+    this.internalMidi = internalMidi;
+  }
+
+  /**
+   * @return the externalMidi
+   */
+  public int getExternalMidi() {
+    return externalMidi;
+  }
+
+  /**
+   * @param externalMidi
+   *          the externalMidi to set
+   */
+  public void setExternalMidi(int externalMidi) {
+    this.externalMidi = externalMidi;
+  }
 
 }

+ 2 - 2
src/main/java/de/mcs/tools/midicontroller/data/EventData.java → src/main/java/de/mcs/tools/midicontroller/data/SequenceData.java

@@ -28,7 +28,7 @@ import java.util.Arrays;
  * @author wklaa
  *
  */
-public class EventData {
+public class SequenceData {
   public enum EVENTTYPE {
     INTERNAL, BUTTON, EXPRESSION
   };
@@ -47,7 +47,7 @@ public class EventData {
 
   @Override
   public String toString() {
-    return String.format("Event[ type: %s, event: %s, value: %d, datas: %s]", type.name(), event.name(), value,
+    return String.format("Sequence[ type: %s, event: %s, value: %d, datas: %s]", type.name(), event.name(), value,
         Arrays.toString(datas));
   }
 

+ 10 - 4
src/main/resources/programdata.json

@@ -28,19 +28,25 @@
 				},
 
 				{
-					"type": "SWITCH"
+					"name": "Chr1",
+					"type": "MOMENTARY",
+					"color": 240
 				},
 
 				{
-					"type": "SWITCH"
+					"name": "Chr2",
+					"type": "SWITCH",
+					"color": 240
 				},
 
 				{
-					"type": "MOMENTARY"
+					"name": "Chr3",
+					"type": "MOMENTARY",
+					"color": 240
 				}
 			],
 
-			"events": 
+			"sequences": 
 			[
 				{
 					"type": "INTERNAL",

+ 219 - 0
src/main/resources/programdata2.json

@@ -0,0 +1,219 @@
+{
+	"version": 1,
+	"programs": 
+	[
+		{
+			"name": "Rock",
+			"prgNumber": 100,
+			"internalMidi": 0,
+			"externalMidi": 1,
+			"buttons": 
+			[
+				{
+					"name": "EQ0",
+					"type": "MOMENTARY",
+					"color": 195
+				},
+
+				{
+					"name": "Drv0",
+					"type": "SWITCH",
+					"color": 204
+				},
+
+				{
+					"name": "Chr0",
+					"type": "MOMENTARY",
+					"color": 240
+				},
+
+				{
+					"name": "Chr1",
+					"type": "MOMENTARY",
+					"color": 240
+				},
+
+				{
+					"name": "Chr2",
+					"type": "SWITCH",
+					"color": 240
+				},
+
+				{
+					"name": "Chr3",
+					"type": "MOMENTARY",
+					"color": 240
+				}
+			],
+
+			"seqenzes": 
+			[
+				{
+					"type": "INTERNAL",
+					"event": "START",
+					"datas": 
+					[
+						{
+							"channel": "INTERNAL",
+							"type": "CC",
+							"data1": 8,
+							"data2": 1
+						},
+
+						{
+							"channel": "INTERNAL",
+							"type": "CC",
+							"data1": 9,
+							"data2": 2
+						},
+
+						{
+							"channel": "INTERNAL",
+							"type": "CC",
+							"data1": 11,
+							"data2": 3
+						}
+					]
+				},
+
+				{
+					"type": "BUTTON",
+					"value": 1,
+					"event": "CLICK",
+					"datas": 
+					[
+						{
+							"channel": "EXTERNAL",
+							"type": "CC",
+							"data1": 9,
+							"data2": 127
+						},
+
+						{
+							"channel": "EXTERNAL",
+							"type": "CC",
+							"data1": 11,
+							"data2": 0
+						}
+					]
+				},
+
+				{
+					"type": "BUTTON",
+					"value": 2,
+					"event": "PUSH",
+					"datas": 
+					[
+						{
+							"channel": "EXTERNAL",
+							"type": "CC",
+							"data1": 9,
+							"data2": 127
+						},
+
+						{
+							"channel": "EXTERNAL",
+							"type": "CC",
+							"data1": 11,
+							"data2": 0
+						}
+					]
+				},
+
+				{
+					"type": "BUTTON",
+					"value": 4,
+					"event": "CLICK",
+					"datas": 
+					[
+						{
+							"channel": "INTERNAL",
+							"type": "PC_PREV"
+						}
+					]
+				},
+
+				{
+					"type": "BUTTON",
+					"value": 5,
+					"event": "CLICK",
+					"datas": 
+					[
+						{
+							"channel": "INTERNAL",
+							"type": "PC_NEXT"
+						}
+					]
+				},
+
+				{
+					"type": "EXPRESSION",
+					"event": "VALUECHANGE",
+					"datas": 
+					[
+						{
+							"channel": "EXTERNAL",
+							"type": "CC",
+							"data1": 30,
+							"data2": 127
+						}
+					]
+				}
+			]
+		},
+
+		{
+			"name": "Pop",
+			"prgNumber": 0,
+			"internalMidi": 0,
+			"externalMidi": 1,
+			"buttons": 
+			[
+				{
+					"name": "EQ1",
+					"type": "SWITCH",
+					"color": 240
+				},
+
+				{
+					"name": "Drv1",
+					"type": "MOMENTARY",
+					"color": 195
+				},
+
+				{
+					"name": "Chr1",
+					"type": "SWITCH",
+					"color": 204
+				}
+			]
+		},
+
+		{
+			"name": "Soul",
+			"prgNumber": -1,
+			"internalMidi": 0,
+			"externalMidi": 1,
+			"buttons": 
+			[
+				{
+					"name": "EQ2",
+					"type": "MOMENTARY",
+					"color": 204
+				},
+
+				{
+					"name": "Drv2",
+					"type": "SWITCH",
+					"color": 240
+				},
+
+				{
+					"name": "Chr2",
+					"type": "SWITCH",
+					"color": 195
+				}
+			]
+		}
+	]
+}