Control Surface API  2.2.2
SysexBuilder.java
1 package com.bitwig.extension.api.util.midi;
2 
3 import java.nio.charset.StandardCharsets;
4 import java.util.Arrays;
5 
6 public class SysexBuilder
7 {
8  private final static int MAX_LENGTH = 512;
9 
10  public static SysexBuilder fromHex(final String hexString)
11  {
12  return new SysexBuilder().addHex(hexString);
13  }
14 
15  public SysexBuilder addByte(int value)
16  {
17  mData[mLength++] = (byte) (value & 0x7f);
18  return this;
19  }
20 
21  public SysexBuilder addString(final String string, final int length)
22  {
23  byte[] ascii = string.getBytes(StandardCharsets.US_ASCII);
24 
25  for(int i=0; i<length; i++)
26  {
27  if (i < ascii.length)
28  {
29  mData[mLength++] = ascii[i];
30  }
31  else
32  {
33  mData[mLength++] = 32;
34  }
35  }
36 
37  return this;
38  }
39 
40  public SysexBuilder add(final byte[] bytes)
41  {
42  for (int i = 0; i < bytes.length; i++)
43  {
44  mData[mLength++] = bytes[i];
45  }
46 
47  return this;
48  }
49 
50  public SysexBuilder addHex(final String hex)
51  {
52  String sysexMessage = hex.replace(" ", "");
53  sysexMessage = sysexMessage.toUpperCase();
54 
55  if ((sysexMessage.length() & 1) != 0)
56  {
57  throw new IllegalArgumentException("Invalid sysex string");
58  }
59 
60  final int bytes = sysexMessage.length() / 2;
61 
62  for(int i=0; i<bytes; i++)
63  {
64  mData[mLength++] = Integer.valueOf(sysexMessage.substring(i*2, i*2+2), 16).byteValue();
65  }
66 
67  return this;
68  }
69 
70  public byte[] terminate()
71  {
72  addByte(0x7f);
73  return array();
74  }
75 
76  public byte[] array()
77  {
78  return Arrays.copyOfRange(mData, 0, mLength);
79  }
80 
81  private byte[] mData = new byte[MAX_LENGTH];
82  private int mLength;
83 }