|
@@ -26,6 +26,7 @@ import java.io.BufferedOutputStream;
|
|
|
import java.io.ByteArrayOutputStream;
|
|
|
import java.io.File;
|
|
|
import java.io.FileOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
import java.io.UnsupportedEncodingException;
|
|
|
|
|
@@ -45,6 +46,10 @@ import de.mcs.utils.JacksonUtils;
|
|
|
*/
|
|
|
public class ConvertJsonData2Hex {
|
|
|
|
|
|
+ private static final int NUMBER_OF_SWITCHES = 6;
|
|
|
+ private static final int NUMBER_OF_SEQUENZES = 16;
|
|
|
+ private static final int NUMBER_OF_MIDICOMMANDS = 16;
|
|
|
+
|
|
|
/**
|
|
|
* @param args
|
|
|
* @throws Exception
|
|
@@ -68,95 +73,12 @@ public class ConvertJsonData2Hex {
|
|
|
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);
|
|
|
- }
|
|
|
+ buildSwitches(out, programData);
|
|
|
|
|
|
+ // Sequenzes starten bei 70
|
|
|
+ buildSequenzes(out, programData);
|
|
|
+
|
|
|
+ // end identifier
|
|
|
out.write(0xFF);
|
|
|
System.out.println(String.format("actual size: %d", out.size() - saveSize));
|
|
|
}
|
|
@@ -197,6 +119,104 @@ public class ConvertJsonData2Hex {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ private static void buildSequenzes(ByteArrayOutputStream out, ProgramData programData) throws Exception, IOException {
|
|
|
+ for (int i = 0; i < NUMBER_OF_SEQUENZES; i++) {
|
|
|
+ byte[] data = getEmptyByteArray(1 + 3 * NUMBER_OF_MIDICOMMANDS);
|
|
|
+ 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);
|
|
|
+ buildSequenzData(programData, data, eventData);
|
|
|
+ }
|
|
|
+ out.write(data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void buildSequenzData(ProgramData programData, byte[] data, SequenceData eventData) throws Exception {
|
|
|
+ DataData[] datas = eventData.getDatas();
|
|
|
+ int pos = 1;
|
|
|
+ if (datas.length > NUMBER_OF_MIDICOMMANDS) {
|
|
|
+ throw new Exception("not enough memory.");
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void buildSwitches(ByteArrayOutputStream out, ProgramData programData)
|
|
|
+ throws UnsupportedEncodingException, IOException, Exception {
|
|
|
+ byte switchSettings = 0x00;
|
|
|
+ ButtonData[] buttons = programData.getButtons();
|
|
|
+ if ((buttons != null) && (buttons.length > 2)) {
|
|
|
+ for (int i = 0; i < NUMBER_OF_SWITCHES; i++) {
|
|
|
+ byte[] buttonName = getEmptyByteArray(8);
|
|
|
+ ButtonData buttonData;
|
|
|
+ if (i < buttons.length) {
|
|
|
+ buttonData = buttons[i];
|
|
|
+ } else {
|
|
|
+ buttonData = new ButtonData();
|
|
|
+ buttonData.setName(String.format("btn%d_nn", i));
|
|
|
+ buttonData.setColor(0);
|
|
|
+ buttonData.setType(TYPE.SWITCH);
|
|
|
+ }
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
private static byte[] getStringAsByte(String value, int count) throws UnsupportedEncodingException {
|
|
|
String newValue = value;
|
|
|
if (newValue.length() > count) {
|