WT11固有のパラメータ
WT11のエディットバッファ内のボイスデータ・パフォーマンスデータをTX81Z Programmerで取得する、という記事を前回書いた。その後マニュアルを眺めていたらTX81Zにはない固有のパラメータが存在するのに気が付いた。
ボイスデータについては、TX81ZのVCED・ACEDに加えWT11にはACED2というデータがある。アフタータッチの感度などを設定できる。
パフォーマンスデータについては、TX81ZのPCEDに加えWT11にはPCED2というデータがある。DSPエフェクタの設定項目のように見える。
ACED2・PCED2はTX81Z Programmerでは取得できなそうなので、吸出しプログラムを作ってみた。WT11はsecret modeで起動した後に本体のキーでボイスやパフォーマンスを変更するとsysexをMIDIに出力するようなので、それを拾って表示することにした。
ボイスデータを変更すると、こんなsysexデータが出力される。各行の先頭の数字はsysexのサイズ。マニュアルのTOTAL BULK SIZEにあるように、VCED=101、ACED=41、ACED2=28bytesとなる。
101:f0 43 00 03 00 5d 14 12 00 07 0f 0a 01 04 00 00 46 0a 03 1f 1f 00 07 0f 0f 01 03 00 00 44 04 03 15 14 00 05 0f 09 01 02 00 00 2f 08 03 12 1f 00 0b 0f 1f 01 05 00 00 63 0a 03 03 00 1f 0a 00 00 00 02 05 00 18 00 02 00 00 28 01 00 00 0f 00 0f 00 32 63 57 54 31 31 20 20 41 30 31 20 63 63 63 32 32 32 56 f7 41:f0 43 00 7e 00 21 4c 4d 20 20 38 39 37 36 41 45 00 00 00 02 00 00 00 00 01 00 00 00 00 03 00 00 00 00 03 00 00 00 00 3a f7 28:f0 43 00 7e 00 14 4c 4d 20 20 38 30 32 33 41 45 00 00 32 00 00 00 00 00 00 00 22 f7
一方パフォーマンスデータのsysexデータはこんな感じ。PCED=128、PCED2=51bytesとなる。
128:f0 43 00 7e 00 78 4c 4d 20 20 38 39 37 36 50 45 04 00 20 00 00 3b 07 18 47 03 01 00 04 00 21 00 00 7f 07 18 63 03 01 00 00 00 20 00 00 7f 07 18 63 03 00 00 00 00 20 00 00 7f 07 18 63 03 00 00 00 00 20 00 00 7f 07 18 63 03 00 00 00 00 20 00 00 7f 07 18 63 03 00 00 00 00 20 00 00 7f 07 18 63 03 00 00 00 00 20 00 00 7f 07 18 63 03 00 00 00 00 00 00 4f 62 6f 65 20 31 20 20 20 20 13 f7 51:f0 43 00 7e 00 2b 4c 4d 20 20 38 30 37 33 50 45 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 01 25 64 00 14 00 00 00 00 00 00 00 00 00 00 00 00 1a f7
プログラムはJavaで作った。Javaは意外とMIDI関連ライブラリが充実している。
import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiMessage; import javax.sound.midi.MidiSystem; import javax.sound.midi.Receiver; import javax.sound.midi.SysexMessage; import javax.sound.midi.Transmitter; /** * WT11をsecret modeで起動すると, * 本体のキーでボイス/パフォーマンスを切り替えるときにMIDIにダンプデータが出てくる * これを拾って表示する */ public class WT11sysex { Receiver receiver; Transmitter transmitter; MidiDevice deviceIn, deviceOut; WT11sysex() { String AUDIOIF = "UR22mkII"; // オーディオインタフェース名 try { MidiDevice.Info info[] = MidiSystem.getMidiDeviceInfo(); for (MidiDevice.Info i: info) { MidiDevice device = MidiSystem.getMidiDevice(i); String name = i.getName(); String desc = i.getDescription(); System.out.printf("%s ## %s\n", name, desc); if (name.contains(AUDIOIF) && device.getMaxReceivers() != 0) deviceOut = device; if (name.contains(AUDIOIF) && device.getMaxTransmitters() != 0) deviceIn = device; } deviceOut.open(); receiver = deviceOut.getReceiver(); deviceIn.open(); transmitter = deviceIn.getTransmitter(); transmitter.setReceiver(new MyReceiver()); } catch (Exception e) { e.printStackTrace(); } } void shutdown() { receiver.close(); transmitter.close(); deviceOut.close(); deviceIn.close(); } /** 拾ったsysexデータを表示する */ class MyReceiver implements Receiver { @Override public void send(MidiMessage message, long timeStamp) { int len = message.getLength(); byte b[] = message.getMessage(); System.out.printf("%5d:", len); for (int i=0; i<len; i++) System.out.printf("%02x ", b[i]); System.out.println(); } @Override public void close() { } } /** SYSEXを送る予定だったが不要だった */ void sendSysex() { try { int seq[] = { 0xf0,0x43,0x20,0x7e,'L','M',' ',' ','8','0','2','3','A','E',0xf7 }; // (3)ACED2 + ACED + VCED byte b[] = new byte[seq.length]; for (int i=0; i<seq.length; i++) b[i] = (byte)(seq[i] & 0xff); SysexMessage message = new SysexMessage(b, b.length); receiver.send(message, -1); } catch (Exception ex) { ex.printStackTrace(); } } /** 60秒のうちにキーで切り替える */ public static void main(String args[]) throws Exception { WT11sysex wt11 = new WT11sysex(); //wt11.sendSysex(); Thread.sleep(60000); wt11.shutdown(); } }