たま日記

たまに書く

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

ポチポチとキーを押下するごとに表示されるので、これをファイルに保存すればOK。

プログラムは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();
    }
}