forked from osmocom/wireshark
10071 lines
313 KiB
C
10071 lines
313 KiB
C
/* packet-rtp-midi.c
|
|
*
|
|
* Routines for RFC 4695/6295 RTP-MIDI dissection
|
|
* Copyright 2006-2012, Tobias Erichsen <t.erichsen@gmx.de>
|
|
*
|
|
* Wireshark - Network traffic analyzer
|
|
* By Gerald Combs <gerald@wireshark.org>'
|
|
* Copyright 1998 Gerald Combs
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* RTP-MIDI ( RFC 4695/6295 ) is a payload type for transmitting MIDI-data over
|
|
* RTP-packets. This payload type can be used on an RTP-conversation that has been
|
|
* established either by means of a session establishment-protocol like SIP or
|
|
* something more lightweight like the Apple network-midi session establishment.
|
|
*
|
|
* This dissector is built based on the RTP-MIDI-specification RFC 4695 from
|
|
* August 13, 2008, the superseding version RFC 6295 and the MIDI-specification 96.1
|
|
*
|
|
* Here are some links:
|
|
*
|
|
* http://www.cs.berkeley.edu/~lazzaro/rtpmidi/
|
|
* http://www.faqs.org/rfcs/rfc4695.html
|
|
* http://www.faqs.org/rfcs/rfc6295.html
|
|
* http://www.midi.org/
|
|
*
|
|
* 2012-02-24
|
|
* - Initial version of dissector
|
|
*
|
|
* Open topics:
|
|
* - reassembly of large sysex-fields going over multiple RTP-packets - this would be a major task, though!
|
|
* - MIDI Show-Control
|
|
* - MIDI Machine-Control
|
|
*
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <epan/packet.h>
|
|
#include <epan/exceptions.h>
|
|
#include <epan/prefs.h>
|
|
|
|
void proto_register_rtp_midi(void);
|
|
|
|
/* Definitions for protocol name during dissector-register */
|
|
#define RTP_MIDI_DISSECTOR_NAME "RFC 4695/6295 RTP-MIDI"
|
|
#define RTP_MIDI_DISSECTOR_SHORTNAME "RTP-MIDI"
|
|
#define RTP_MIDI_DISSECTOR_ABBREVIATION "rtpmidi"
|
|
|
|
#define RTP_MIDI_NO_RUNNING_STATUS 0xffff
|
|
|
|
/*
|
|
* MIDI Controller Numbers
|
|
*/
|
|
#define RTP_MIDI_CTRL_BANK_SELECT_MSB 0
|
|
#define RTP_MIDI_CTRL_MODULATION_WHEEL_OR_LEVER_MSB 1
|
|
#define RTP_MIDI_CTRL_BREATH_CONTROLLER_MSB 2
|
|
/* #define RTP_MIDI_CTRL 3 */
|
|
#define RTP_MIDI_CTRL_FOOT_CONTROLLER_MSB 4
|
|
#define RTP_MIDI_CTRL_PORTAMENTO_TIME_MSB 5
|
|
#define RTP_MIDI_CTRL_DATA_ENTRY_MSB 6
|
|
#define RTP_MIDI_CTRL_CHANNEL_VOLUME_MSB 7
|
|
#define RTP_MIDI_CTRL_BALANCE_MSB 8
|
|
/* #define RTP_MIDI_CTRL 9 */
|
|
#define RTP_MIDI_CTRL_PAN_MSB 10
|
|
#define RTP_MIDI_CTRL_EXPRESSION_CONTROLLER_MSB 11
|
|
#define RTP_MIDI_CTRL_EFFECT_CONTROL_1_MSB 12
|
|
#define RTP_MIDI_CTRL_EFFECT_CONTROL_2_MSB 13
|
|
/* #define RTP_MIDI_CTRL_ 14
|
|
#define RTP_MIDI_CTRL_ 15 */
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_1_MSB 16
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_2_MSB 17
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_3_MSB 18
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_4_MSB 19
|
|
/* #define RTP_MIDI_CTRL_ 20
|
|
#define RTP_MIDI_CTRL_ 21
|
|
#define RTP_MIDI_CTRL_ 22
|
|
#define RTP_MIDI_CTRL_ 23
|
|
#define RTP_MIDI_CTRL_ 24
|
|
#define RTP_MIDI_CTRL_ 25
|
|
#define RTP_MIDI_CTRL_ 26
|
|
#define RTP_MIDI_CTRL_ 27
|
|
#define RTP_MIDI_CTRL_ 28
|
|
#define RTP_MIDI_CTRL_ 29
|
|
#define RTP_MIDI_CTRL_ 30
|
|
#define RTP_MIDI_CTRL_ 31 */
|
|
#define RTP_MIDI_CTRL_BANK_SELECT_LSB 32
|
|
#define RTP_MIDI_CTRL_MODULATION_WHEEL_OR_LEVER_LSB 33
|
|
#define RTP_MIDI_CTRL_BREATH_CONTROLLER_LSB 34
|
|
/* #define RTP_MIDI_CTRL_ 35 */
|
|
#define RTP_MIDI_CTRL_FOOT_CONTROLLER_LSB 36
|
|
#define RTP_MIDI_CTRL_PORTAMENTO_TIME_LSB 37
|
|
#define RTP_MIDI_CTRL_DATA_ENTRY_LSB 38
|
|
#define RTP_MIDI_CTRL_CHANNEL_VOLUME_LSB 39
|
|
#define RTP_MIDI_CTRL_BALANCE_LSB 40
|
|
/* #define RTP_MIDI_CTRL_ 41 */
|
|
#define RTP_MIDI_CTRL_PAN_LSB 42
|
|
#define RTP_MIDI_CTRL_EXPRESSION_CONTROLLER_LSB 43
|
|
#define RTP_MIDI_CTRL_EFFECT_CONTROL_1_LSB 44
|
|
#define RTP_MIDI_CTRL_EFFECT_CONTROL_2_LSB 45
|
|
/* #define RTP_MIDI_CTRL_ 46
|
|
#define RTP_MIDI_CTRL_ 47 */
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_1_LSB 48
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_2_LSB 49
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_3_LSB 50
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_4_LSB 51
|
|
/* #define RTP_MIDI_CTRL_ 52
|
|
#define RTP_MIDI_CTRL_ 53
|
|
#define RTP_MIDI_CTRL_ 54
|
|
#define RTP_MIDI_CTRL_ 55
|
|
#define RTP_MIDI_CTRL_ 56
|
|
#define RTP_MIDI_CTRL_ 57
|
|
#define RTP_MIDI_CTRL_ 58
|
|
#define RTP_MIDI_CTRL_ 59
|
|
#define RTP_MIDI_CTRL_ 60
|
|
#define RTP_MIDI_CTRL_ 61
|
|
#define RTP_MIDI_CTRL_ 62
|
|
#define RTP_MIDI_CTRL_ 63 */
|
|
#define RTP_MIDI_CTRL_DAMPER_PEDAL 64
|
|
#define RTP_MIDI_CTRL_PORTAMENTO_ON_OFF 65
|
|
#define RTP_MIDI_CTRL_SUSTENUTO 66
|
|
#define RTP_MIDI_CTRL_SOFT_PEDAL 67
|
|
#define RTP_MIDI_CTRL_LEGATO_FOOTSWITCH 68
|
|
#define RTP_MIDI_CTRL_HOLD_2 69
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_1 70
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_2 71
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_3 72
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_4 73
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_5 74
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_6 75
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_7 76
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_8 77
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_9 78
|
|
#define RTP_MIDI_CTRL_SOUND_CONTROLLER_10 79
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_5 80
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_6 81
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_7 82
|
|
#define RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_8 83
|
|
#define RTP_MIDI_CTRL_PORTAMENTO_CONTROL 84
|
|
/* #define RTP_MIDI_CTRL_ 85
|
|
#define RTP_MIDI_CTRL_ 86
|
|
#define RTP_MIDI_CTRL_ 87
|
|
#define RTP_MIDI_CTRL_ 88
|
|
#define RTP_MIDI_CTRL_ 89
|
|
#define RTP_MIDI_CTRL_ 90 */
|
|
#define RTP_MIDI_CTRL_EFFECTS_1_DEPTH 91
|
|
#define RTP_MIDI_CTRL_EFFECTS_2_DEPTH 92
|
|
#define RTP_MIDI_CTRL_EFFECTS_3_DEPTH 93
|
|
#define RTP_MIDI_CTRL_EFFECTS_4_DEPTH 94
|
|
#define RTP_MIDI_CTRL_EFFECTS_5_DEPTH 95
|
|
#define RTP_MIDI_CTRL_DATA_INCREMENT 96
|
|
#define RTP_MIDI_CTRL_DATA_DECREMENT 97
|
|
#define RTP_MIDI_CTRL_NON_REGISTERED_PARAM_LSB 98
|
|
#define RTP_MIDI_CTRL_NON_REGISTERED_PARAM_MSB 99
|
|
#define RTP_MIDI_CTRL_REGISTERED_PARAM_LSB 100
|
|
#define RTP_MIDI_CTRL_REGISTERED_PARAM_MSB 101
|
|
/* #define RTP_MIDI_CTRL_ 102
|
|
#define RTP_MIDI_CTRL_ 103
|
|
#define RTP_MIDI_CTRL_ 104
|
|
#define RTP_MIDI_CTRL_ 105
|
|
#define RTP_MIDI_CTRL_ 106
|
|
#define RTP_MIDI_CTRL_ 107
|
|
#define RTP_MIDI_CTRL_ 108
|
|
#define RTP_MIDI_CTRL_ 109
|
|
#define RTP_MIDI_CTRL_ 110
|
|
#define RTP_MIDI_CTRL_ 111
|
|
#define RTP_MIDI_CTRL_ 112
|
|
#define RTP_MIDI_CTRL_ 113
|
|
#define RTP_MIDI_CTRL_ 114
|
|
#define RTP_MIDI_CTRL_ 115
|
|
#define RTP_MIDI_CTRL_ 116
|
|
#define RTP_MIDI_CTRL_ 117
|
|
#define RTP_MIDI_CTRL_ 118
|
|
#define RTP_MIDI_CTRL_ 119 */
|
|
/* MIDI Channel Mode Messages */
|
|
#define RTP_MIDI_CTRL_ALL_SOUND_OFF 120
|
|
#define RTP_MIDI_CTRL_RESET_ALL_CONTROLLERS 121
|
|
#define RTP_MIDI_CTRL_LOCAL_CONTROL_ON_OFF 122
|
|
#define RTP_MIDI_CTRL_ALL_NOTES_OFF 123
|
|
#define RTP_MIDI_CTRL_OMNI_MODE_OFF 124
|
|
#define RTP_MIDI_CTRL_OMNI_MODE_ON 125
|
|
#define RTP_MIDI_CTRL_MONO_MODE_ON 126
|
|
#define RTP_MIDI_CTRL_POLY_MODE_ON 127
|
|
|
|
|
|
/*
|
|
* MIDI Status Bytes (Channel Voice Messages)
|
|
*/
|
|
#define RTP_MIDI_STATUS_CHANNEL_NOTE_OFF 0x08 /* 0x8n n->channel */
|
|
#define RTP_MIDI_STATUS_CHANNEL_NOTE_ON 0x09 /* 0x9n n->channel */
|
|
#define RTP_MIDI_STATUS_CHANNEL_POLYPHONIC_KEY_PRESSURE 0x0a /* 0xan n->channel */
|
|
#define RTP_MIDI_STATUS_CHANNEL_CONTROL_CHANGE 0x0b /* 0xbn n->channel */
|
|
#define RTP_MIDI_STATUS_CHANNEL_PROGRAM_CHANGE 0x0c /* 0xcn n->channel */
|
|
#define RTP_MIDI_STATUS_CHANNEL_CHANNEL_PRESSURE 0x0d /* 0xdn n->channel */
|
|
#define RTP_MIDI_STATUS_CHANNEL_PITCH_BEND_CHANGE 0x0e /* 0xen n->channel */
|
|
|
|
/*
|
|
* MIDI-Channels
|
|
*/
|
|
#define RTP_MIDI_CHANNEL_1 0x00
|
|
#define RTP_MIDI_CHANNEL_2 0x01
|
|
#define RTP_MIDI_CHANNEL_3 0x02
|
|
#define RTP_MIDI_CHANNEL_4 0x03
|
|
#define RTP_MIDI_CHANNEL_5 0x04
|
|
#define RTP_MIDI_CHANNEL_6 0x05
|
|
#define RTP_MIDI_CHANNEL_7 0x06
|
|
#define RTP_MIDI_CHANNEL_8 0x07
|
|
#define RTP_MIDI_CHANNEL_9 0x08
|
|
#define RTP_MIDI_CHANNEL_10 0x09
|
|
#define RTP_MIDI_CHANNEL_11 0x0a
|
|
#define RTP_MIDI_CHANNEL_12 0x0b
|
|
#define RTP_MIDI_CHANNEL_13 0x0c
|
|
#define RTP_MIDI_CHANNEL_14 0x0d
|
|
#define RTP_MIDI_CHANNEL_15 0x0e
|
|
#define RTP_MIDI_CHANNEL_16 0x0f
|
|
#define RTP_MIDI_CHANNEL_MASK 0x0f
|
|
|
|
|
|
/*
|
|
* MIDI Status Bytes (System Exclusive Messages, System Common Messages, System Realtime Messages )
|
|
*/
|
|
#define RTP_MIDI_STATUS_COMMON_SYSEX_START 0xf0
|
|
#define RTP_MIDI_STATUS_COMMON_MTC_QUARTER_FRAME 0xf1
|
|
#define RTP_MIDI_STATUS_COMMON_SONG_POSITION_POINTER 0xf2
|
|
#define RTP_MIDI_STATUS_COMMON_SONG_SELECT 0xf3
|
|
#define RTP_MIDI_STATUS_COMMON_UNDEFINED_F4 0xf4
|
|
#define RTP_MIDI_STATUS_COMMON_UNDEFINED_F5 0xf5
|
|
#define RTP_MIDI_STATUS_COMMON_TUNE_REQUEST 0xf6
|
|
#define RTP_MIDI_STATUS_COMMON_SYSEX_END 0xf7
|
|
#define RTP_MIDI_STATUS_COMMON_REALTIME_TIMING_CLOCK 0xf8
|
|
#define RTP_MIDI_STATUS_COMMON_REALTIME_MIDI_TICK 0xf9 /* Spec says undefined */
|
|
#define RTP_MIDI_STATUS_COMMON_REALTIME_START 0xfa
|
|
#define RTP_MIDI_STATUS_COMMON_REALTIME_CONTINUE 0xfb
|
|
#define RTP_MIDI_STATUS_COMMON_REALTIME_STOP 0xfc
|
|
#define RTP_MIDI_STATUS_COMMON_REALTIME_UNDEFINED_FD 0xfd
|
|
#define RTP_MIDI_STATUS_COMMON_REALTIME_ACTIVE_SENSING 0xfe
|
|
#define RTP_MIDI_STATUS_COMMON_REALTIME_SYSTEM_RESET 0xff
|
|
|
|
|
|
/*
|
|
* MIDI Universal Non-Realtime System Exclusive Messages (sysex-manu-id=0x7e)
|
|
*/
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DUMP_HEADER 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DATA_PACKET 0x02
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DUMP_REQUEST 0x03
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC 0x04
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DUMP_EXTENSIONS 0x05
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_GENERAL_INFORMATION 0x06
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_FILE_DUMP 0x07
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MIDI_TUNING_STANDARD 0x08
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_GENERAL_MIDI 0x09
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_DOWNLOADABLE_SOUNDS 0x0a
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_END_OF_FILE 0x7b
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_WAIT 0x7c
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_CANCEL 0x7d
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_NAK 0x7e
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_ACK 0x7f
|
|
|
|
|
|
/*
|
|
* MIDI Universal Realtime System Exclusive Messages (sysex-manu-id=0x7f)
|
|
*/
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MIDI_TIME_CODE 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MIDI_SHOW_CONTROL 0x02
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_NOTATION_INFORMATION 0x03
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_DEVICE_CONTROL 0x04
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUEING 0x05
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MIDI_MACHINE_CONTROL_COMMAND 0x06
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MIDI_MACHINE_CONTROL_RESPONSE 0x07
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MIDI_TUNING_STANDARD 0x08
|
|
|
|
|
|
/* List of short MIDI-manufacturer-IDs - needs to be completed! */
|
|
#define RTP_MIDI_MANU_SHORT_ISLONG 0x00
|
|
#define RTP_MIDI_MANU_SHORT_SEQUENTIAL_CIRCUITS 0x01
|
|
#define RTP_MIDI_MANU_SHORT_BIG_BRIAR_IDP 0x02
|
|
#define RTP_MIDI_MANU_SHORT_OCTAVE_PLATEAU_VOYETRA 0x03
|
|
#define RTP_MIDI_MANU_SHORT_MOOG 0x04
|
|
#define RTP_MIDI_MANU_SHORT_PASSPORT_DESIGNS 0x05
|
|
#define RTP_MIDI_MANU_SHORT_LEXICON 0x06
|
|
#define RTP_MIDI_MANU_SHORT_KURZWEIL 0x07
|
|
#define RTP_MIDI_MANU_SHORT_FENDER 0x08
|
|
#define RTP_MIDI_MANU_SHORT_GULBRANSEN 0x09
|
|
#define RTP_MIDI_MANU_SHORT_AKG_ACOUSTICS 0x0a
|
|
#define RTP_MIDI_MANU_SHORT_VOYCE_MUSIC 0x0b
|
|
#define RTP_MIDI_MANU_SHORT_WAVEFRAME 0x0c
|
|
#define RTP_MIDI_MANU_SHORT_ADA_SIGNAL_PROCESSORS 0x0d
|
|
#define RTP_MIDI_MANU_SHORT_GARFIELD_ELECTRONICS 0x0e
|
|
#define RTP_MIDI_MANU_SHORT_ENSONIQ 0x0f
|
|
#define RTP_MIDI_MANU_SHORT_OBERHEIM_GIBSON_LABS 0x10
|
|
#define RTP_MIDI_MANU_SHORT_APPLE_COMPUTERS 0x11
|
|
#define RTP_MIDI_MANU_SHORT_GREY_MATTER_RESPONSE 0x12
|
|
#define RTP_MIDI_MANU_SHORT_DIGIDESIGN 0x13
|
|
#define RTP_MIDI_MANU_SHORT_PALMTREE_INSTRUMENTS 0x14
|
|
#define RTP_MIDI_MANU_SHORT_JL_COOPER 0x15
|
|
#define RTP_MIDI_MANU_SHORT_LOWREY 0x16
|
|
#define RTP_MIDI_MANU_SHORT_LINN_ADAMS_SMITH 0x17
|
|
#define RTP_MIDI_MANU_SHORT_EMU_SYSTEMS 0x18
|
|
#define RTP_MIDI_MANU_SHORT_HARMONY_SYSTEMS 0x19
|
|
#define RTP_MIDI_MANU_SHORT_ART 0x1a
|
|
#define RTP_MIDI_MANU_SHORT_BALDWIN 0x1b
|
|
#define RTP_MIDI_MANU_SHORT_EVENTIDE 0x1c
|
|
#define RTP_MIDI_MANU_SHORT_INVENTRONICS 0x1d
|
|
#define RTP_MIDI_MANU_SHORT_KEY_CONCEPTS 0x1e
|
|
#define RTP_MIDI_MANU_SHORT_CLARITY 0x1f
|
|
#define RTP_MIDI_MANU_SHORT_PASSAC 0x20
|
|
#define RTP_MIDI_MANU_SHORT_SIEL 0x21
|
|
#define RTP_MIDI_MANU_SHORT_SYNTHE_AXE 0x22
|
|
#define RTP_MIDI_MANU_SHORT_STEPP 0x23
|
|
#define RTP_MIDI_MANU_SHORT_HOHNER 0x24
|
|
#define RTP_MIDI_MANU_SHORT_CRUMAR_TWISTER 0x25
|
|
#define RTP_MIDI_MANU_SHORT_SOLTON 0x26
|
|
#define RTP_MIDI_MANU_SHORT_JELLINGHAUS_MS 0x27
|
|
#define RTP_MIDI_MANU_SHORT_SOUTHWORK_MUSIC_SYSTEMS 0x28
|
|
#define RTP_MIDI_MANU_SHORT_PPG 0x29
|
|
#define RTP_MIDI_MANU_SHORT_JEN 0x2a
|
|
#define RTP_MIDI_MANU_SHORT_SSL 0x2b
|
|
#define RTP_MIDI_MANU_SHORT_AUDIO_VERITRIEB 0x2c
|
|
#define RTP_MIDI_MANU_SHORT_NEVE_HINTON_INSTRUMENTS 0x2d
|
|
#define RTP_MIDI_MANU_SHORT_SOUNDTRACS 0x2e
|
|
#define RTP_MIDI_MANU_SHORT_ELKA_GENERAL_MUSIC 0x2f
|
|
#define RTP_MIDI_MANU_SHORT_DYNACORD 0x30
|
|
#define RTP_MIDI_MANU_SHORT_VISCOUNT 0x31
|
|
#define RTP_MIDI_MANU_SHORT_DRAWMER 0x32
|
|
#define RTP_MIDI_MANU_SHORT_CLAVIA_DIGITAL_INSTRUMENTS 0x33
|
|
#define RTP_MIDI_MANU_SHORT_AUDIO_ARCHITECTURE 0x34
|
|
#define RTP_MIDI_MANU_SHORT_GENERAL_MUSIC_CORP 0x35
|
|
#define RTP_MIDI_MANU_SHORT_CHEETAH 0x36
|
|
#define RTP_MIDI_MANU_SHORT_CTM 0x37
|
|
#define RTP_MIDI_MANU_SHORT_SIMMONS_UK 0x38
|
|
#define RTP_MIDI_MANU_SHORT_SOUNDCRAFT_ELECTRONICS 0x39
|
|
#define RTP_MIDI_MANU_SHORT_STEINBERG_GMBH 0x3a
|
|
#define RTP_MIDI_MANU_SHORT_WERSI 0x3b
|
|
#define RTP_MIDI_MANU_SHORT_AVAB_ELEKTRONIK_AB 0x3c
|
|
#define RTP_MIDI_MANU_SHORT_DIGIGRAM 0x3d
|
|
#define RTP_MIDI_MANU_SHORT_WALDORF 0x3e
|
|
#define RTP_MIDI_MANU_SHORT_QUASIMIDI 0x3f
|
|
#define RTP_MIDI_MANU_SHORT_KAWAI 0x40
|
|
#define RTP_MIDI_MANU_SHORT_ROLAND 0x41
|
|
#define RTP_MIDI_MANU_SHORT_KORG 0x42
|
|
#define RTP_MIDI_MANU_SHORT_YAMAHA 0x43
|
|
#define RTP_MIDI_MANU_SHORT_CASIO 0x44
|
|
#define RTP_MIDI_MANU_SHORT_MORIDAIRA 0x45
|
|
#define RTP_MIDI_MANU_SHORT_KAMIYA_STUDIO 0x46
|
|
#define RTP_MIDI_MANU_SHORT_AKAI 0x47
|
|
#define RTP_MIDI_MANU_SHORT_JAPAN_VICTOR 0x48
|
|
#define RTP_MIDI_MANU_SHORT_MEISOSHA 0x49
|
|
#define RTP_MIDI_MANU_SHORT_HOSHINO_GAKKI 0x4a
|
|
#define RTP_MIDI_MANU_SHORT_FUJITSU 0x4b
|
|
#define RTP_MIDI_MANU_SHORT_SONY 0x4c
|
|
#define RTP_MIDI_MANU_SHORT_NISSHIN_ONPA 0x4d
|
|
#define RTP_MIDI_MANU_SHORT_TEAC 0x4e
|
|
/* #define RTP_MIDI_MANU_SHORT_ 0x4f */
|
|
#define RTP_MIDI_MANU_SHORT_MATSUSHITA_ELECTRIC 0x50
|
|
#define RTP_MIDI_MANU_SHORT_FOSTEX 0x51
|
|
#define RTP_MIDI_MANU_SHORT_ZOOM 0x52
|
|
#define RTP_MIDI_MANU_SHORT_MIDORI_ELECTRONICS 0x53
|
|
#define RTP_MIDI_MANU_SHORT_MATSUSHITA_COMMUNICATION 0x54
|
|
#define RTP_MIDI_MANU_SHORT_SUZUKI 0x55
|
|
#define RTP_MIDI_MANU_SHORT_FUJI 0x56
|
|
#define RTP_MIDI_MANU_SHORT_ACOUSTIC_TECHNICAL_LAB 0x57
|
|
/* #define RTP_MIDI_MANU_SHORT_ 0x58 */
|
|
#define RTP_MIDI_MANU_SHORT_FAITH 0x59
|
|
#define RTP_MIDI_MANU_SHORT_INTERNET_CORPORATION 0x5a
|
|
/* #define RTP_MIDI_MANU_SHORT_ 0x5b */
|
|
#define RTP_MIDI_MANU_SHORT_SEEKERS_CO 0x5c
|
|
/* #define RTP_MIDI_MANU_SHORT_ 0x5d */
|
|
/* #define RTP_MIDI_MANU_SHORT_ 0x5e */
|
|
#define RTP_MIDI_MANU_SHORT_SD_CARD_ASSOCIATION 0x5f
|
|
/* #define RTP_MIDI_MANU_SHORT_ 0x60
|
|
#define RTP_MIDI_MANU_SHORT_ 0x61
|
|
#define RTP_MIDI_MANU_SHORT_ 0x62
|
|
#define RTP_MIDI_MANU_SHORT_ 0x63
|
|
#define RTP_MIDI_MANU_SHORT_ 0x64
|
|
#define RTP_MIDI_MANU_SHORT_ 0x65
|
|
#define RTP_MIDI_MANU_SHORT_ 0x66
|
|
#define RTP_MIDI_MANU_SHORT_ 0x67
|
|
#define RTP_MIDI_MANU_SHORT_ 0x68
|
|
#define RTP_MIDI_MANU_SHORT_ 0x69
|
|
#define RTP_MIDI_MANU_SHORT_ 0x6a
|
|
#define RTP_MIDI_MANU_SHORT_ 0x6b
|
|
#define RTP_MIDI_MANU_SHORT_ 0x6c
|
|
#define RTP_MIDI_MANU_SHORT_ 0x6d
|
|
#define RTP_MIDI_MANU_SHORT_ 0x6e
|
|
#define RTP_MIDI_MANU_SHORT_ 0x6f
|
|
#define RTP_MIDI_MANU_SHORT_ 0x70
|
|
#define RTP_MIDI_MANU_SHORT_ 0x71
|
|
#define RTP_MIDI_MANU_SHORT_ 0x72
|
|
#define RTP_MIDI_MANU_SHORT_ 0x73
|
|
#define RTP_MIDI_MANU_SHORT_ 0x74
|
|
#define RTP_MIDI_MANU_SHORT_ 0x75
|
|
#define RTP_MIDI_MANU_SHORT_ 0x76
|
|
#define RTP_MIDI_MANU_SHORT_ 0x77
|
|
#define RTP_MIDI_MANU_SHORT_ 0x78
|
|
#define RTP_MIDI_MANU_SHORT_ 0x79
|
|
#define RTP_MIDI_MANU_SHORT_ 0x7a
|
|
#define RTP_MIDI_MANU_SHORT_ 0x7b
|
|
#define RTP_MIDI_MANU_SHORT_ 0x7c */
|
|
#define RTP_MIDI_MANU_SHORT_EDUCATIONAL_USE 0x7d
|
|
#define RTP_MIDI_MANU_SHORT_NON_REALTIME_UNIVERSAL 0x7e
|
|
#define RTP_MIDI_MANU_SHORT_REALTIME_UNIVERSAL 0x7f
|
|
|
|
|
|
/* List of long MIDI-manufacturer-IDs - needs to be completed! */
|
|
/* North American Manufacturers */
|
|
/* #define RTP_MIDI_MANU_LONG_TIME_ 0x0000 */
|
|
#define RTP_MIDI_MANU_LONG_TIME_WARNER_INTERACTIVE 0x0001
|
|
#define RTP_MIDI_MANU_LONG_ADVANCED_GRAVIS_COMP 0x0002
|
|
#define RTP_MIDI_MANU_LONG_MEDIA_VISION 0x0003
|
|
#define RTP_MIDI_MANU_LONG_DORNES_RESEARCH_GROUP 0x0004
|
|
#define RTP_MIDI_MANU_LONG_KMUSE 0x0005
|
|
#define RTP_MIDI_MANU_LONG_STYPHER 0x0006
|
|
#define RTP_MIDI_MANU_LONG_DIGITAL_MUSIC_CORPORATION 0x0007
|
|
#define RTP_MIDI_MANU_LONG_IOTA_SYSTEMS 0x0008
|
|
#define RTP_MIDI_MANU_LONG_NEW_ENGLAND_DIGITAL 0x0009
|
|
#define RTP_MIDI_MANU_LONG_ARTISYN 0x000a
|
|
#define RTP_MIDI_MANU_LONG_IVL_TECHNOLOGIES 0x000b
|
|
#define RTP_MIDI_MANU_LONG_SOUTHERN_MUSIC_SYSTEMS 0x000c
|
|
#define RTP_MIDI_MANU_LONG_LAKE_BUTLER_SOUND_COMPANY 0x000d
|
|
#define RTP_MIDI_MANU_LONG_ALESIS 0x000e
|
|
#define RTP_MIDI_MANU_LONG_SOUND_CREATION 0x000f
|
|
#define RTP_MIDI_MANU_LONG_DOD_ELECTRONICS 0x0010
|
|
#define RTP_MIDI_MANU_LONG_STUDER_EDITECH 0x0011
|
|
#define RTP_MIDI_MANU_LONG_SONUS 0x0012
|
|
#define RTP_MIDI_MANU_LONG_TEMPORAL_ACUITY_PRODUCTS 0x0013
|
|
#define RTP_MIDI_MANU_LONG_PERFECT_FRETWORKS 0x0014
|
|
#define RTP_MIDI_MANU_LONG_KAT 0x0015
|
|
#define RTP_MIDI_MANU_LONG_OPCODE 0x0016
|
|
#define RTP_MIDI_MANU_LONG_RANE_CORP 0x0017
|
|
#define RTP_MIDI_MANU_LONG_SPATIAL_SOUND_ANADI_INC 0x0018
|
|
#define RTP_MIDI_MANU_LONG_KMX 0x0019
|
|
#define RTP_MIDI_MANU_LONG_ALLEN_AND_HEATH_BRENNEL 0x001a
|
|
#define RTP_MIDI_MANU_LONG_PEAVEY 0x001b
|
|
#define RTP_MIDI_MANU_LONG_360_SYSTEMS 0x001c
|
|
#define RTP_MIDI_MANU_LONG_SPECTRUM_DESIGN_DEVELOPMENT 0x001d
|
|
#define RTP_MIDI_MANU_LONG_MARQUIS_MUSIC 0x001e
|
|
#define RTP_MIDI_MANU_LONG_ZETA_SYSTEMS 0x001f
|
|
#define RTP_MIDI_MANU_LONG_AXXES 0x0020
|
|
#define RTP_MIDI_MANU_LONG_ORBAN 0x0021
|
|
#define RTP_MIDI_MANU_LONG_INDIAN_VALLEY 0x0022
|
|
#define RTP_MIDI_MANU_LONG_TRITON 0x0023
|
|
#define RTP_MIDI_MANU_LONG_KTI 0x0024
|
|
#define RTP_MIDI_MANU_LONG_BREAKAWAY_TECHNOLOGIES 0x0025
|
|
#define RTP_MIDI_MANU_LONG_CAE 0x0026
|
|
#define RTP_MIDI_MANU_LONG_HARRISON_SYSTEMS_INC 0x0027
|
|
#define RTP_MIDI_MANU_LONG_FUTURE_LAB_MARK_KUO 0x0028
|
|
#define RTP_MIDI_MANU_LONG_ROCKTRON_CORP 0x0029
|
|
#define RTP_MIDI_MANU_LONG_PIANODISC 0x002a
|
|
#define RTP_MIDI_MANU_LONG_CANNON_RESEARCH_GROUP 0x002b
|
|
/* #define RTP_MIDI_MANU_LONG_ 0x002c */
|
|
#define RTP_MIDI_MANU_LONG_RODGERS_INSTRUMENTS_CORP 0x002d
|
|
#define RTP_MIDI_MANU_LONG_BLUE_SKY_LOGIC 0x002e
|
|
#define RTP_MIDI_MANU_LONG_ENCORE_ELECTRONICS 0x002f
|
|
#define RTP_MIDI_MANU_LONG_UPTOWN 0x0030
|
|
#define RTP_MIDI_MANU_LONG_VOCE 0x0031
|
|
#define RTP_MIDI_MANU_LONG_CTI_AUDIO_INC 0x0032
|
|
#define RTP_MIDI_MANU_LONG_SS_RESEARCH 0x0033
|
|
#define RTP_MIDI_MANU_LONG_BRODERBUND_SOFTWARE 0x0034
|
|
#define RTP_MIDI_MANU_LONG_ALLEN_ORGAN_CO 0x0035
|
|
/* #define RTP_MIDI_MANU_LONG_ 0x0036 */
|
|
#define RTP_MIDI_MANU_LONG_MUSIC_QUEST 0x0037
|
|
#define RTP_MIDI_MANU_LONG_APHEX 0x0038
|
|
#define RTP_MIDI_MANU_LONG_GALLIEN_KRUEGER 0x0039
|
|
#define RTP_MIDI_MANU_LONG_IBM 0x003a
|
|
#define RTP_MIDI_MANU_LONG_MARK_OF_THE_UNICORN 0x003b
|
|
#define RTP_MIDI_MANU_LONG_HOTZ_INSTRUMENTS_TECH 0x003c
|
|
#define RTP_MIDI_MANU_LONG_ETA_LIGHTING 0x003d
|
|
#define RTP_MIDI_MANU_LONG_NSI_CORPORATION 0x003e
|
|
#define RTP_MIDI_MANU_LONG_ADLIB_INC 0x003f
|
|
#define RTP_MIDI_MANU_LONG_RICHMOND_SOUND_DESIGN 0x0040
|
|
#define RTP_MIDI_MANU_LONG_MICROSOFT 0x0041
|
|
#define RTP_MIDI_MANU_LONG_THE_SOFTWARE_TOOLWORKS 0x0042
|
|
#define RTP_MIDI_MANU_LONG_RJMG_NICHE 0x0043
|
|
#define RTP_MIDI_MANU_LONG_INTONE 0x0044
|
|
#define RTP_MIDI_MANU_LONG_ADVANCED_REMOTE_TECH 0x0045
|
|
/* #define RTP_MIDI_MANU_LONG_ 0x0046 */
|
|
#define RTP_MIDI_MANU_LONG_GT_ELECTRONICS_GROOVE_TUBES 0x0047
|
|
#define RTP_MIDI_MANU_LONG_INTERMIDI 0x0048
|
|
#define RTP_MIDI_MANU_LONG_TIMELINE_VISTA 0x0049
|
|
#define RTP_MIDI_MANU_LONG_MESA_BOOGIE 0x004a
|
|
/* #define RTP_MIDI_MANU_LONG_ 0x004b */
|
|
#define RTP_MIDI_MANU_LONG_SEQUOIA_DEVELOPMENT 0x004c
|
|
#define RTP_MIDI_MANU_LONG_STUDIO_ELECTRONICS 0x004d
|
|
#define RTP_MIDI_MANU_LONG_EUPHONIX 0x004e
|
|
#define RTP_MIDI_MANU_LONG_INTERMIDI2 0x004f
|
|
#define RTP_MIDI_MANU_LONG_MIDI_SOLUTIONS 0x0050
|
|
#define RTP_MIDI_MANU_LONG_3DO_COMPANY 0x0051
|
|
#define RTP_MIDI_MANU_LONG_LIGHTWAVE_RESEARCH 0x0052
|
|
#define RTP_MIDI_MANU_LONG_MICROW 0x0053
|
|
#define RTP_MIDI_MANU_LONG_SPECTRAL_SYNTHESIS 0x0054
|
|
#define RTP_MIDI_MANU_LONG_LONE_WOLF 0x0055
|
|
#define RTP_MIDI_MANU_LONG_STUDIO_TECHNOLOGIES 0x0056
|
|
#define RTP_MIDI_MANU_LONG_PETERSON_EMP 0x0057
|
|
#define RTP_MIDI_MANU_LONG_ATARI 0x0058
|
|
#define RTP_MIDI_MANU_LONG_MARION_SYSTEMS 0x0059
|
|
#define RTP_MIDI_MANU_LONG_DESIGN_EVENT 0x005a
|
|
#define RTP_MIDI_MANU_LONG_WINJAMMER_SOFTWARE 0x005b
|
|
#define RTP_MIDI_MANU_LONG_ATT_BELL_LABS 0x005c
|
|
/*# define RTP_MIDI_MANU_LONG_ 0x005d */
|
|
#define RTP_MIDI_MANU_LONG_SYMETRIX 0x005e
|
|
#define RTP_MIDI_MANU_LONG_MIDI_THE_WORLD 0x005f
|
|
#define RTP_MIDI_MANU_LONG_DESPER_PRODUCTS 0x0060
|
|
#define RTP_MIDI_MANU_LONG_MICROS_N_MIDI 0x0061
|
|
#define RTP_MIDI_MANU_LONG_ACCORDIANS_INTL 0x0062
|
|
#define RTP_MIDI_MANU_LONG_EUPHONICS 0x0063
|
|
#define RTP_MIDI_MANU_LONG_MUSONIX 0x0064
|
|
#define RTP_MIDI_MANU_LONG_TURTLE_BEACH_SYSTEMS 0x0065
|
|
#define RTP_MIDI_MANU_LONG_MACKIE_DESIGNS 0x0066
|
|
#define RTP_MIDI_MANU_LONG_COMPUSERVE 0x0067
|
|
#define RTP_MIDI_MANU_LONG_BES_TECHNOLOGIES 0x0068
|
|
#define RTP_MIDI_MANU_LONG_QRS_MUSIC_ROLLS 0x0069
|
|
#define RTP_MIDI_MANU_LONG_P_G_MUSIC 0x006a
|
|
#define RTP_MIDI_MANU_LONG_SIERRA_SEMICONDUCTOR 0x006b
|
|
#define RTP_MIDI_MANU_LONG_EPIGRAF_AUDIO_VISUAL 0x006c
|
|
#define RTP_MIDI_MANU_LONG_ELECTRONICS_DIVERSIFIED 0x006d
|
|
#define RTP_MIDI_MANU_LONG_TUNE_1000 0x006e
|
|
#define RTP_MIDI_MANU_LONG_ADVANCED_MICRO_DEVICES 0x006f
|
|
#define RTP_MIDI_MANU_LONG_MEDIAMATION 0x0070
|
|
#define RTP_MIDI_MANU_LONG_SABINE_MUSIC 0x0071
|
|
#define RTP_MIDI_MANU_LONG_WOOG_LABS 0x0072
|
|
#define RTP_MIDI_MANU_LONG_MIRCOPOLIS 0x0073
|
|
#define RTP_MIDI_MANU_LONG_TA_HORNG_MUSICAL_INSTRUMENT 0x0074
|
|
#define RTP_MIDI_MANU_LONG_ETEK_LABS_FORTE_TECH 0x0075
|
|
#define RTP_MIDI_MANU_LONG_ELECTRO_VOICE 0x0076
|
|
#define RTP_MIDI_MANU_LONG_MIDISOFT_CORPORATION 0x0077
|
|
#define RTP_MIDI_MANU_LONG_QSOUND_LABS 0x0078
|
|
#define RTP_MIDI_MANU_LONG_WESTREX 0x0079
|
|
#define RTP_MIDI_MANU_LONG_NVIDIA 0x007a
|
|
#define RTP_MIDI_MANU_LONG_ESS_TECHNOLOGY 0x007b
|
|
#define RTP_MIDI_MANU_LONG_MEDIATRIX_PERIPHERALS 0x007c
|
|
#define RTP_MIDI_MANU_LONG_BROOKTREE_CORP 0x007d
|
|
#define RTP_MIDI_MANU_LONG_OTARI_CORP 0x007e
|
|
#define RTP_MIDI_MANU_LONG_KEY_ELECTRONICS 0x007f
|
|
/* ---break--- */
|
|
#define RTP_MIDI_MANU_LONG_SHURE_INCORPORATED 0x0100
|
|
#define RTP_MIDI_MANU_LONG_AURA_SOUND 0x0101
|
|
#define RTP_MIDI_MANU_LONG_CRYSTAL_SEMICONDUCTOR 0x0102
|
|
#define RTP_MIDI_MANU_LONG_CONEXANT_ROCKWELL 0x0103
|
|
#define RTP_MIDI_MANU_LONG_SILICON_GRAPHICS 0x0104
|
|
#define RTP_MIDI_MANU_LONG_MAUDIO_MIDIMAN 0x0105
|
|
#define RTP_MIDI_MANU_LONG_PRESONUS 0x0106
|
|
/* #define RTP_MIDI_MANU_LONG_ 0x0107 */
|
|
#define RTP_MIDI_MANU_LONG_TOPAZ_ENTERPRISES 0x0108
|
|
#define RTP_MIDI_MANU_LONG_CAST_LIGHTING 0x0109
|
|
#define RTP_MIDI_MANU_LONG_MICROSOFT_CONSUMER_DIVISION 0x010a
|
|
#define RTP_MIDI_MANU_LONG_SONIC_FOUNDRY 0x010b
|
|
#define RTP_MIDI_MANU_LONG_LINE6_FAST_FORWARD 0x010c
|
|
#define RTP_MIDI_MANU_LONG_BEATNIK_INC 0x010d
|
|
#define RTP_MIDI_MANU_LONG_VAN_KOEVERING_COMPANY 0x010e
|
|
#define RTP_MIDI_MANU_LONG_ALTECH_SYSTEMS 0x010f
|
|
#define RTP_MIDI_MANU_LONG_S_S_RESEARCH 0x0110
|
|
#define RTP_MIDI_MANU_LONG_VLSI_TECHNOLOGY 0x0111
|
|
#define RTP_MIDI_MANU_LONG_CHROMATIC_RESEARCH 0x0112
|
|
#define RTP_MIDI_MANU_LONG_SAPPHIRE 0x0113
|
|
#define RTP_MIDI_MANU_LONG_IDRC 0x0114
|
|
#define RTP_MIDI_MANU_LONG_JUSTONIC_TUNING 0x0115
|
|
#define RTP_MIDI_MANU_LONG_TORCOMP_RESEARCH_INC 0x0116
|
|
#define RTP_MIDI_MANU_LONG_NEWTEK_INC 0x0117
|
|
#define RTP_MIDI_MANU_LONG_SOUND_SCULPTURE 0x0118
|
|
#define RTP_MIDI_MANU_LONG_WALKER_TECHNICAL 0x0119
|
|
#define RTP_MIDI_MANU_LONG_DIGITAL_HARMONY 0x011a
|
|
#define RTP_MIDI_MANU_LONG_INVISION_INTERACTIVE 0x011b
|
|
#define RTP_MIDI_MANU_LONG_TSQUARE_DESIGN 0x011c
|
|
#define RTP_MIDI_MANU_LONG_NEMESYS_MUSIC_TECHNOLOGY 0x011d
|
|
#define RTP_MIDI_MANU_LONG_DBX_PROFESSIONAL_HARMAN_INTL 0x011e
|
|
#define RTP_MIDI_MANU_LONG_SYNDYNE_CORPORATION 0x011f
|
|
#define RTP_MIDI_MANU_LONG_BITHEADZ 0x0120
|
|
#define RTP_MIDI_MANU_LONG_CAKEWALK_MUSIC_SOFTWARE 0x0121
|
|
#define RTP_MIDI_MANU_LONG_ANALOG_DEVICES 0x0122
|
|
#define RTP_MIDI_MANU_LONG_NATIONAL_SEMICONDUCTOR 0x0123
|
|
#define RTP_MIDI_MANU_LONG_BOOM_THEORY 0x0124
|
|
#define RTP_MIDI_MANU_LONG_VIRTUAL_DSP_CORPORATION 0x0125
|
|
#define RTP_MIDI_MANU_LONG_ANTARES_SYSTEMS 0x0126
|
|
#define RTP_MIDI_MANU_LONG_ANGEL_SOFTWARE 0x0127
|
|
#define RTP_MIDI_MANU_LONG_ST_LOUIS_MUSIC 0x0128
|
|
#define RTP_MIDI_MANU_LONG_LYRRUS_DBA_GVOX 0x0129
|
|
#define RTP_MIDI_MANU_LONG_ASHLEY_AUDIO_INC 0x012a
|
|
#define RTP_MIDI_MANU_LONG_VARILITE_INC 0x012b
|
|
#define RTP_MIDI_MANU_LONG_SUMMIT_AUDIO_INC 0x012c
|
|
#define RTP_MIDI_MANU_LONG_AUREAL_SEMICONDUCTOR_INC 0x012d
|
|
#define RTP_MIDI_MANU_LONG_SEASOUND_LLC 0x012e
|
|
#define RTP_MIDI_MANU_LONG_US_ROBOTICS 0x012f
|
|
#define RTP_MIDI_MANU_LONG_AURISIS_RESEARCH 0x0130
|
|
#define RTP_MIDI_MANU_LONG_NEARFIELD_MULTIMEDIA 0x0131
|
|
#define RTP_MIDI_MANU_LONG_FM7_INC 0x0132
|
|
#define RTP_MIDI_MANU_LONG_SWIVEL_SYSTEMS 0x0133
|
|
#define RTP_MIDI_MANU_LONG_HYPERACTIVE_AUDIO_SYSTEMS 0x0134
|
|
#define RTP_MIDI_MANU_LONG_MIDILITE_CASTE_STUDIO_PROD 0x0135
|
|
#define RTP_MIDI_MANU_LONG_RADIKAL_TECHNOLOGIES 0x0136
|
|
#define RTP_MIDI_MANU_LONG_ROGER_LINN_DESIGN 0x0137
|
|
#define RTP_MIDI_MANU_LONG_TCHELION_VOCAL_TECHNOLOGIES 0x0138
|
|
#define RTP_MIDI_MANU_LONG_EVENT_ELECTRONICS 0x0139
|
|
#define RTP_MIDI_MANU_LONG_SONIC_NETWORK_INC 0x013a
|
|
#define RTP_MIDI_MANU_LONG_REALTIME_MUSIC_SOLUTIONS 0x013b
|
|
#define RTP_MIDI_MANU_LONG_APOGEE_DIGITAL 0x013c
|
|
#define RTP_MIDI_MANU_LONG_CLASSICAL_ORGANS_INC 0x013d
|
|
#define RTP_MIDI_MANU_LONG_MICROTOOLS_INC 0x013e
|
|
#define RTP_MIDI_MANU_LONG_NUMARK_INDUSTRIES 0x013f
|
|
#define RTP_MIDI_MANU_LONG_FRONTIER_DESIGN_GROUP_LLC 0x0140
|
|
#define RTP_MIDI_MANU_LONG_RECORDARE_LLC 0x0141
|
|
#define RTP_MIDI_MANU_LONG_STARR_LABS 0x0142
|
|
#define RTP_MIDI_MANU_LONG_VOYAGER_SOUND_INC 0x0143
|
|
#define RTP_MIDI_MANU_LONG_MANIFOLD_LABS 0x0144
|
|
#define RTP_MIDI_MANU_LONG_AVIOM_INC 0x0145
|
|
#define RTP_MIDI_MANU_LONG_MIXMEISTER_TECHNOLOGY 0x0146
|
|
#define RTP_MIDI_MANU_LONG_NOTATION_SOFTWARE 0x0147
|
|
#define RTP_MIDI_MANU_LONG_MERCURIAL_COMMUNICATIONS 0x0148
|
|
#define RTP_MIDI_MANU_LONG_WAVE_ARTS 0x0149
|
|
#define RTP_MIDI_MANU_LONG_LOGIC_SEQUENCING_DEVICES 0x014a
|
|
#define RTP_MIDI_MANU_LONG_AXESS_ELECTRONICS 0x014b
|
|
#define RTP_MIDI_MANU_LONG_MUSE_RESEARCH 0x014c
|
|
#define RTP_MIDI_MANU_LONG_OPEN_LABS 0x014d
|
|
#define RTP_MIDI_MANU_LONG_GUILLEMOT_RD_INC 0x014e
|
|
#define RTP_MIDI_MANU_LONG_SAMSON_TECHNOLOGIES 0x014f
|
|
#define RTP_MIDI_MANU_LONG_ELECTRONIC_THEATRE_CONTROLS 0x0150
|
|
#define RTP_MIDI_MANU_LONG_RESEARCH_IN_MOTION 0x0151
|
|
#define RTP_MIDI_MANU_LONG_MOBILEER 0x0152
|
|
#define RTP_MIDI_MANU_LONG_SYNTHOGY 0x0153
|
|
#define RTP_MIDI_MANU_LONG_LYNX_STUDIO_TECHNOLOGY_INC 0x0154
|
|
#define RTP_MIDI_MANU_LONG_DAMAGE_CONTROL_ENGINEERING 0x0155
|
|
#define RTP_MIDI_MANU_LONG_YOST_ENGINEERING_INC 0x0156
|
|
#define RTP_MIDI_MANU_LONG_BROOKS_FORSMAN_DESIGNS_LLC 0x0157
|
|
#define RTP_MIDI_MANU_LONG_MAGNEKEY 0x0158
|
|
#define RTP_MIDI_MANU_LONG_GARRITAN_CORP 0x0159
|
|
#define RTP_MIDI_MANU_LONG_PLOQUE_ART_ET_TECHNOLOGIE 0x015a
|
|
#define RTP_MIDI_MANU_LONG_RJM_MUSIC_TECHNOLOGY 0x015b
|
|
#define RTP_MIDI_MANU_LONG_CUSTOM_SOLUTIONS_SOFTWARE 0x015c
|
|
#define RTP_MIDI_MANU_LONG_SONARCANA_LLC 0x015d
|
|
#define RTP_MIDI_MANU_LONG_CENTRANCE 0x015e
|
|
#define RTP_MIDI_MANU_LONG_KESUMO_LLC 0x015f
|
|
#define RTP_MIDI_MANU_LONG_STANTON 0x0160
|
|
#define RTP_MIDI_MANU_LONG_LIVID_INSTRUMENTS 0x0161
|
|
#define RTP_MIDI_MANU_LONG_FIRST_ACT_745_MEDIA 0x0162
|
|
#define RTP_MIDI_MANU_LONG_PYGRAPHICS_INC 0x0163
|
|
#define RTP_MIDI_MANU_LONG_PANADIGM_INNOVATIONS_LTD 0x0164
|
|
#define RTP_MIDI_MANU_LONG_AVEDIS_ZILDJIAN_CO 0x0165
|
|
#define RTP_MIDI_MANU_LONG_AUVITAL_MUSIC_CORP 0x0166
|
|
#define RTP_MIDI_MANU_LONG_INSPIRED_INSTRUMENTS_INC 0x0167
|
|
#define RTP_MIDI_MANU_LONG_CHRIS_GRIGG_DESIGNS 0x0168
|
|
#define RTP_MIDI_MANU_LONG_SLATE_DIGITAL_LLC 0x0169
|
|
#define RTP_MIDI_MANU_LONG_MIXWARE 0x016a
|
|
#define RTP_MIDI_MANU_LONG_SOCIAL_ENTROPY 0x016b
|
|
#define RTP_MIDI_MANU_LONG_SOURCE_AUDIO_LLC 0x016c
|
|
#define RTP_MIDI_MANU_LONG_RESERVED_016d 0x016d
|
|
#define RTP_MIDI_MANU_LONG_RESERVED_016e 0x016e
|
|
#define RTP_MIDI_MANU_LONG_RESERVED_016f 0x016f
|
|
#define RTP_MIDI_MANU_LONG_AMERICAN_AUDIO_DJ 0x0170
|
|
#define RTP_MIDI_MANU_LONG_MEGA_CONTROL_SYSTEMS 0x0171
|
|
#define RTP_MIDI_MANU_LONG_KILPATRICK_AUDIO 0x0172
|
|
#define RTP_MIDI_MANU_LONG_IKINGDOM_CORP 0x0173
|
|
#define RTP_MIDI_MANU_LONG_FRACTAL_AUDIO 0x0174
|
|
#define RTP_MIDI_MANU_LONG_NETLOGIC_MICROSYSTEMS 0x0175
|
|
#define RTP_MIDI_MANU_LONG_MUSIC_COMPUTING 0x0176
|
|
#define RTP_MIDI_MANU_LONG_NEKTAR_TECHNOLOGY_INC 0x0177
|
|
#define RTP_MIDI_MANU_LONG_ZENPH_SOUND_INNOVATIONS 0x0178
|
|
#define RTP_MIDI_MANU_LONG_DJTECHTOOLS_COM 0x0179
|
|
#define RTP_MIDI_MANU_LONG_RESERVED_017a 0x017a
|
|
|
|
/* European manufacturers */
|
|
#define RTP_MIDI_MANU_LONG_DREAM 0x2000
|
|
#define RTP_MIDI_MANU_LONG_STRAND_LIGHTING 0x2001
|
|
#define RTP_MIDI_MANU_LONG_AMEK_SYSTEMS 0x2002
|
|
#define RTP_MIDI_MANU_LONG_CASA_DI_RISPARMIO_DI_LORETO 0x2003
|
|
#define RTP_MIDI_MANU_LONG_BOHM_ELECTRONIC 0x2004
|
|
#define RTP_MIDI_MANU_LONG_SYNTEC_DIGITAL_AUDIO 0x2005
|
|
#define RTP_MIDI_MANU_LONG_TRIDENT_AUDIO 0x2006
|
|
#define RTP_MIDI_MANU_LONG_REAL_WORLD_STUDIO 0x2007
|
|
#define RTP_MIDI_MANU_LONG_EVOLUTION_SYNTHESIS 0x2008
|
|
#define RTP_MIDI_MANU_LONG_YES_TECHNOLOGY 0x2009
|
|
#define RTP_MIDI_MANU_LONG_AUDIOMATICA 0x200a
|
|
#define RTP_MIDI_MANU_LONG_BONTEMPI_FARFISA 0x200b
|
|
#define RTP_MIDI_MANU_LONG_FBT_ELETTRONICA 0x200c
|
|
#define RTP_MIDI_MANU_LONG_MIDITEMP 0x200d
|
|
#define RTP_MIDI_MANU_LONG_LA_AUDIO_LARKING_AUDIO 0x200e
|
|
#define RTP_MIDI_MANU_LONG_ZERO_88_LIGHTING_LIMITED 0x200f
|
|
#define RTP_MIDI_MANU_LONG_MICON_AUDIO_ELECTRONICS_GMBH 0x2010
|
|
#define RTP_MIDI_MANU_LONG_FOREFRONT_TECHNOLOGY 0x2011
|
|
#define RTP_MIDI_MANU_LONG_STUDIO_AUDIO_AND_VIDEO_LTD 0x2012
|
|
#define RTP_MIDI_MANU_LONG_KENTON_ELECTRONICS 0x2013
|
|
#define RTP_MIDI_MANU_LONG_CELCO_DIVISON_OF_ELECTRONICS 0x2014
|
|
#define RTP_MIDI_MANU_LONG_ADB 0x2015
|
|
#define RTP_MIDI_MANU_LONG_MARSHALL_PRODUCTS 0x2016
|
|
#define RTP_MIDI_MANU_LONG_DDA 0x2017
|
|
#define RTP_MIDI_MANU_LONG_BBS 0x2018
|
|
#define RTP_MIDI_MANU_LONG_MA_LIGHTING_TECHNOLOGY 0x2019
|
|
#define RTP_MIDI_MANU_LONG_FATAR 0x201a
|
|
#define RTP_MIDI_MANU_LONG_QSC_AUDIO 0x201b
|
|
#define RTP_MIDI_MANU_LONG_ARTISAN_CLASSIC_ORGAN 0x201c
|
|
#define RTP_MIDI_MANU_LONG_ORLA_SPA 0x201d
|
|
#define RTP_MIDI_MANU_LONG_PINNACLE_AUDIO 0x201e
|
|
#define RTP_MIDI_MANU_LONG_TC_ELECTRONICS 0x201f
|
|
#define RTP_MIDI_MANU_LONG_DOEPFER_MUSIKELEKTRONIK 0x2020
|
|
#define RTP_MIDI_MANU_LONG_CREATIVE_TECHNOLOGY_PTE 0x2021
|
|
#define RTP_MIDI_MANU_LONG_MINAMI_SEIYDDO 0x2022
|
|
#define RTP_MIDI_MANU_LONG_GOLDSTAR 0x2023
|
|
#define RTP_MIDI_MANU_LONG_MIDISOFT_SAS_DI_M_CIMA 0x2024
|
|
#define RTP_MIDI_MANU_LONG_SAMICK 0x2025
|
|
#define RTP_MIDI_MANU_LONG_PENNY_AND_GILES 0x2026
|
|
#define RTP_MIDI_MANU_LONG_ACORN_COMPUTER 0x2027
|
|
#define RTP_MIDI_MANU_LONG_LSC_ELECTRONICS 0x2028
|
|
#define RTP_MIDI_MANU_LONG_NOVATION_EMS 0x2029
|
|
#define RTP_MIDI_MANU_LONG_SAMKYUNG_MECHATRONICS 0x202a
|
|
#define RTP_MIDI_MANU_LONG_MEDELI_ELECTRONICS_CO 0x202b
|
|
#define RTP_MIDI_MANU_LONG_CHARLIE_LAB_SRL 0x202c
|
|
#define RTP_MIDI_MANU_LONG_BLUE_CHIP_MUSIC_TECHNOLOGY 0x202d
|
|
#define RTP_MIDI_MANU_LONG_BEE_OH_CORP 0x202e
|
|
#define RTP_MIDI_MANU_LONG_LG_SEMICON_AMERICA 0x202f
|
|
#define RTP_MIDI_MANU_LONG_TESI 0x2030
|
|
#define RTP_MIDI_MANU_LONG_EMAGIC 0x2031
|
|
#define RTP_MIDI_MANU_LONG_BEHRINGER_GMBH 0x2032
|
|
#define RTP_MIDI_MANU_LONG_ACCESS_MUSIC_ELECTRONICS 0x2033
|
|
#define RTP_MIDI_MANU_LONG_SYNOPTIC 0x2034
|
|
#define RTP_MIDI_MANU_LONG_HANMESOFT_CORP 0x2035
|
|
#define RTP_MIDI_MANU_LONG_TERRATEC_ELECTRONIC_GMBH 0x2036
|
|
#define RTP_MIDI_MANU_LONG_PROEL_SPA 0x2037
|
|
#define RTP_MIDI_MANU_LONG_IBK_MIDI 0x2038
|
|
#define RTP_MIDI_MANU_LONG_IRCAM 0x2039
|
|
#define RTP_MIDI_MANU_LONG_PROPELLERHEAD_SOFTWARE 0x203a
|
|
#define RTP_MIDI_MANU_LONG_RED_SOUND_SYSTEMS_LTD 0x203b
|
|
#define RTP_MIDI_MANU_LONG_ELEKTRON_ESI_AB 0x203c
|
|
#define RTP_MIDI_MANU_LONG_SINTEFEX_AUDIO 0x203d
|
|
#define RTP_MIDI_MANU_LONG_MAM_MUSIC_AND_MORE 0x203e
|
|
#define RTP_MIDI_MANU_LONG_AMSARO_GMBH 0x203f
|
|
#define RTP_MIDI_MANU_LONG_CDS_ADVANCED_TECHNOLOGY_BV 0x2040
|
|
#define RTP_MIDI_MANU_LONG_TOUCHED_BY_SOUND_GMBH 0x2041
|
|
#define RTP_MIDI_MANU_LONG_DSP_ARTS 0x2042
|
|
#define RTP_MIDI_MANU_LONG_PHIL_REES_MUSIC_TECH 0x2043
|
|
#define RTP_MIDI_MANU_LONG_STAMER_MUSIKANLAGEN_GMBH 0x2044
|
|
#define RTP_MIDI_MANU_LONG_MUSICAL_MUNTANER_SA_DBA 0x2045
|
|
#define RTP_MIDI_MANU_LONG_CMEXX_SOFTWARE 0x2046
|
|
#define RTP_MIDI_MANU_LONG_KLAVIS_TECHNOLOGIES 0x2047
|
|
#define RTP_MIDI_MANU_LONG_NOTEHEADS_AB 0x2048
|
|
#define RTP_MIDI_MANU_LONG_ALGORITHMIX 0x2049
|
|
#define RTP_MIDI_MANU_LONG_SKRYDSTRUP_RD 0x204a
|
|
#define RTP_MIDI_MANU_LONG_PROFRESSIONAL_AUDIO_COMPANY 0x204b
|
|
#define RTP_MIDI_MANU_LONG_DBTECH_MADWAVES 0x204c
|
|
#define RTP_MIDI_MANU_LONG_VERMONA 0x204d
|
|
#define RTP_MIDI_MANU_LONG_NOKIA 0x204e
|
|
#define RTP_MIDI_MANU_LONG_WAVE_IDEA 0x204f
|
|
#define RTP_MIDI_MANU_LONG_HARTMANN_GMBH 0x2050
|
|
#define RTP_MIDI_MANU_LONG_LIONS_TRACK 0x2051
|
|
#define RTP_MIDI_MANU_LONG_ANALOGUE_SYSTEMS 0x2052
|
|
#define RTP_MIDI_MANU_LONG_FOCAL_JMLAB 0x2053
|
|
#define RTP_MIDI_MANU_LONG_RINGWAY_ELECTRONICS 0x2054
|
|
#define RTP_MIDI_MANU_LONG_FAITH_TECHNOLOGIES_DIGIPLUG 0x2055
|
|
#define RTP_MIDI_MANU_LONG_SHOWWORKS 0x2056
|
|
#define RTP_MIDI_MANU_LONG_MANIKIN_ELECTRONIC 0x2057
|
|
#define RTP_MIDI_MANU_LONG_1_COME_TECH 0x2058
|
|
#define RTP_MIDI_MANU_LONG_PHONIC_CORP 0x2059
|
|
#define RTP_MIDI_MANU_LONG_LAKE_TECHNOLOGY 0x205a
|
|
#define RTP_MIDI_MANU_LONG_SILANSYS_TECHNOLOGIES 0x205b
|
|
#define RTP_MIDI_MANU_LONG_WINBOND_ELECTRONICS 0x205c
|
|
#define RTP_MIDI_MANU_LONG_CINETIX_MEDIEN_UND_INTERFACE 0x205d
|
|
#define RTP_MIDI_MANU_LONG_AG_SOLUTIONI_DIGITALI 0x205e
|
|
#define RTP_MIDI_MANU_LONG_SEQUENTIX_MUSIC_SYSTEMS 0x205f
|
|
#define RTP_MIDI_MANU_LONG_ORAM_PRO_AUDIO 0x2060
|
|
#define RTP_MIDI_MANU_LONG_BE4_LTD 0x2061
|
|
#define RTP_MIDI_MANU_LONG_INFECTION_MUSIC 0x2062
|
|
#define RTP_MIDI_MANU_LONG_CENTRAL_MUSIC_CO_CME 0x2063
|
|
#define RTP_MIDI_MANU_LONG_GENOQS_MACHINES 0x2064
|
|
#define RTP_MIDI_MANU_LONG_MEDIALON 0x2065
|
|
#define RTP_MIDI_MANU_LONG_WAVES_AUDIO_LTD 0x2066
|
|
#define RTP_MIDI_MANU_LONG_JERASH_LABS 0x2067
|
|
#define RTP_MIDI_MANU_LONG_DA_FACT 0x2068
|
|
#define RTP_MIDI_MANU_LONG_ELBY_DESIGNS 0x2069
|
|
#define RTP_MIDI_MANU_LONG_SPECTRAL_AUDIO 0x206a
|
|
#define RTP_MIDI_MANU_LONG_ARTURIA 0x206b
|
|
#define RTP_MIDI_MANU_LONG_VIXID 0x206c
|
|
#define RTP_MIDI_MANU_LONG_C_THRU_MUSIC 0x206d
|
|
#define RTP_MIDI_MANU_LONG_YA_HORNG_ELECTRONIC_CO_LTD 0x206e
|
|
#define RTP_MIDI_MANU_LONG_SM_PRO_AUDIO 0x206f
|
|
#define RTP_MIDI_MANU_LONG_OTO_MACHINES 0x2070
|
|
#define RTP_MIDI_MANU_LONG_ELZAB_SA_G_LAB 0x2071
|
|
#define RTP_MIDI_MANU_LONG_BLACKSTAR_AMPLIFICATION_LTD 0x2072
|
|
#define RTP_MIDI_MANU_LONG_M3I_TECHNOLOGIES_GMBH 0x2073
|
|
#define RTP_MIDI_MANU_LONG_GEMALTO 0x2074
|
|
#define RTP_MIDI_MANU_LONG_PROSTAGE_SL 0x2075
|
|
#define RTP_MIDI_MANU_LONG_TEENAGE_ENGINEERING 0x2076
|
|
#define RTP_MIDI_MANU_LONG_TOBIAS_ERICHSEN 0x2077
|
|
#define RTP_MIDI_MANU_LONG_NIXER_LTD 0x2078
|
|
#define RTP_MIDI_MANU_LONG_HANPIN_ELECTRON_CO_LTD 0x2079
|
|
#define RTP_MIDI_MANU_LONG_MIDI_HARDWARE_R_SOWA 0x207a
|
|
|
|
#define RTP_MIDI_MANU_LONG_BEYOND_MUSIC_INDUSTRIAL_LTD 0x207b
|
|
#define RTP_MIDI_MANU_LONG_KISS_BOX_BV 0x207c
|
|
#define RTP_MIDI_MANU_LONG_MISA_DIGITAL_TECHNOLOGIES_LTD 0x207d
|
|
#define RTP_MIDI_MANU_LONG_AI_MUSICS_TECHNOLOGY_INC 0x207e
|
|
#define RTP_MIDI_MANU_LONG_SERATO_INC_LP 0x207f
|
|
#define RTP_MIDI_MANU_LONG_LIMEX_MUSIC_HANDLES_GMBH 0x2100
|
|
#define RTP_MIDI_MANU_LONG_KYODDAY_TOKAI 0x2101
|
|
#define RTP_MIDI_MANU_LONG_MUTABLE_INSTRUMENTS 0x2102
|
|
#define RTP_MIDI_MANU_LONG_PRESONUS_SOFTWARE_LTD 0x2103
|
|
#define RTP_MIDI_MANU_LONG_XIRING 0x2104
|
|
#define RTP_MIDI_MANU_LONG_FAIRLIGHT_INTRUMENTS_PTY_LTD 0x2105
|
|
#define RTP_MIDI_MANU_LONG_MUSICOM_LAB 0x2106
|
|
#define RTP_MIDI_MANU_LONG_VACO_LOCO 0x2107
|
|
#define RTP_MIDI_MANU_LONG_RWA_HONG_KONG_LIMITED 0x2108
|
|
|
|
/* Japanese Manufacturers */
|
|
#define RTP_MIDI_MANU_LONG_CRIMSON_TECHNOLOGY_INC 0x4000
|
|
#define RTP_MIDI_MANU_LONG_SOFTBANK_MOBILE_CORP 0x4001
|
|
/*#define RTP_MIDI_MANU_LONG_*/
|
|
#define RTP_MIDI_MANU_LONG_DM_HOLDINGS_INC 0x4003
|
|
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_DLS_LEVEL1_ON 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_DLS_LEVEL1_OFF 0x02
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_DLS_LEVEL1_VOICE_ALLOCATION_OFF 0x03
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_DLS_LEVEL1_VOICE_ALLOCATION_ON 0x04
|
|
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_SPECIAL 0x00
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_PUNCH_IN_POINTS 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_PUNGH_OUT_POINTS 0x02
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_PUNCH_IN_POINTS 0x03
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_PUNCH_OUT_POINTS 0x04
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_START_POINT 0x05
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_STOP_POINT 0x06
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_START_POINT_ADD 0x07
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_STOP_POINT_ADD 0x08
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_EVENT_START_POINT 0x09
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_EVENT_STOP_POINT 0x0a
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_CUE_POINTS 0x0b
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_CUE_POINTS_ADD 0x0c
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_CUE_POINT 0x0d
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_NAME_IN_ADD 0x0e
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LOOP_POINT_TRANSMISSION 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LOOP_POINTS_REQUEST 0x02
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LP_UNI 0x00
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LP_BI 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LP_OFF 0x7f
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_GI_IDENTITY_REQUEST 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_GI_IDENTITY_REPLY 0x02
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_FD_HEADER 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_FD_DATA_PACKET 0x02
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_FD_REQUEST 0x03
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_TUNING_BULK_DUMP_REQUEST 0x00
|
|
#define RTP_MIDI_SYSEX_COMMON_TUNING_BULK_DUMP_REPLY 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_TUNING_NOTE_CHANGE 0x02
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_GM_ON 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_NRT_GM_OFF 0x02
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_FULL_MESSAGE 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_USER_BITS 0x02
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SCL_EXTENSIONS 0x00
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_LIGHTING 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_MOVING_LIGHTS 0x02
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_COLOR_CHANGERS 0x03
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_STROBES 0x04
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SCL_LASERS 0x05
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SCL_CHASERS 0x06
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_SOUND 0x10
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_MUSIC 0x11
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_CD_PLAYERS 0x12
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_EPROM_PLAYBACK 0x13
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SCL_AUDIO_TAPE_MACHINE 0x14
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_INTERCOMS 0x15
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_AMPLIFIERS 0x16
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_AUDIO_EFFECTS 0x17
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_EQUALIZERS 0x18
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_MACHINERY 0x20
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_RIGGING 0x21
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_FLYS 0x22
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_LIFTS 0x23
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_TURNTABLES 0x24
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_TRUSSES 0x25
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_ROBOTS 0x26
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_ANIMATION 0x27
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_FLOATS 0x28
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_BREAKAWAYS 0x29
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_BARGES 0x2a
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO 0x30
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_TAPE_MACHINES 0x31
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_CASSETTE_MACHINES 0x32
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_DISC_PLAYERS 0x33
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_SWITCHERS 0x34
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_EFFECT 0x35
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_CHARACTER_GENERATORS 0x36
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_STIL_STORES 0x37
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_MONITORS 0x38
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_PROJECTION 0x40
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_FILM_PROJECTORS 0x41
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_SLIDE_PROJECTORS 0x42
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_PROJECTORS 0x43
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_DISSOLVERS 0x44
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_SHUTTER_CONTROLS 0x45
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_PROCESS_CONTROL 0x50
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_HYDRAULIC_OIL 0x51
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_H2O 0x52
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_CO2 0x53
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_COMPRESSED_AIR 0x54
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_NATURAL_GAS 0x55
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_FOG 0x56
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_SMOKE 0x57
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_CRACKED_HAZE 0x58
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_PYRO 0x60
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_FIREWORKS 0x61
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_EXPLOSIONS 0x62
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_FLAME 0x63
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_SMOKE_POTS 0x64
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_SC_ALL_TYPES 0x7f
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_NT_BAR_NUMBER 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_NT_TIME_SIGNATURE_IMMEDIATE 0x02
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_NT_TIME_SIGNATURE_DELAYED 0x42
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_DC_MASTER_VOLUME 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_DC_MASTER_BALANCE 0x02
|
|
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_SPECIAL 0x00
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_PUNCH_IN_POINTS 0x01
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_PUNCH_OUT_POINTS 0x02
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_03 0x03
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_04 0x04
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_START_POINTS 0x05
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_STOP_POINTS 0x06
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_START_POINTS_ADD 0x07
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_STOP_POINTS_ADD 0x08
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_09 0x09
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_0A 0x0a
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_CUE_POINTS 0x0b
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_CUE_POINTS_ADD 0x0c
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_0D 0x0d
|
|
#define RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_NAME_ADD 0x0e
|
|
|
|
/* TODO: Add MMC Commands */
|
|
|
|
/* TODO: Add MMC Responses */
|
|
|
|
|
|
|
|
#define RTP_MIDI_COMMON_MTC_QF_FRAME_LS_NIBBLE 0x00
|
|
#define RTP_MIDI_COMMON_MTC_QF_FRAME_MS_NIBBLE 0x01
|
|
#define RTP_MIDI_COMMON_MTC_QF_SECONDS_LS_NIBBLE 0x02
|
|
#define RTP_MIDI_COMMON_MTC_QF_SECONDS_MS_NIBBLE 0x03
|
|
#define RTP_MIDI_COMMON_MTC_QF_MINUTES_LS_NIBBLE 0x04
|
|
#define RTP_MIDI_COMMON_MTC_QF_MINUTES_MS_NIBBLE 0x05
|
|
#define RTP_MIDI_COMMON_MTC_QF_HOURS_LS_NIBBLE 0x06
|
|
#define RTP_MIDI_COMMON_MTC_QF_HOURS_MS_NIBBLE 0x07
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define RTP_MIDI_TREE_NAME_COMMAND "Command Section"
|
|
#define RTP_MIDI_TREE_NAME_COMMAND_SYSEX_MANU "Manufacturer specific data"
|
|
#define RTP_MIDI_TREE_NAME_COMMAND_SYSEX_EDU "Educational data"
|
|
#define RTP_MIDI_TREE_NAME_JOURNAL "Journal Section"
|
|
#define RTP_MIDI_TREE_NAME_SYSTEM_JOURNAL "System-Journal"
|
|
#define RTP_MIDI_TREE_NAME_SYSTEM_CHAPTERS "System-Chapters"
|
|
#define RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_J "System Common 0xF4"
|
|
#define RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_K "System Common 0xF5"
|
|
#define RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_Y "System Common 0xF9"
|
|
#define RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_Z "System Common 0xFD"
|
|
#define RTP_MIDI_TREE_NAME_SJ_CHAPTER_Q "Sequencer State Commands"
|
|
#define RTP_MIDI_TREE_NAME_SJ_CHAPTER_F "MIDI Time Code Tape Position"
|
|
#define RTP_MIDI_TREE_NAME_SJ_CHAPTER_X "System Exclusive"
|
|
#define RTP_MIDI_TREE_NAME_SJ_CHAPTER_X_DATA "Data field (sysex commands)"
|
|
#define RTP_MIDI_TREE_NAME_SJ_CHAPTER_X_INVALID_DATA "Data field (invalid sysex commands)"
|
|
#define RTP_MIDI_TREE_NAME_CHANNEL_JOURNAL "Channel-Journal"
|
|
#define RTP_MIDI_TREE_NAME_CHANNEL_CHAPTERS "Channel-Chapters"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_P "Program Change"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_C "Control Change"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_C_LOGLIST "Log List"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_C_LOGITEM "Log Item"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_M "Parameter System"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOGLIST "Log List"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOGITEM "Log Item"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOG_COUNT "Count"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_W "Pitch Wheel"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_N "Note on/off"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_N_LOGLIST "Log List"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_N_LOGITEM "Note On"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_N_OCTETS "Offbit Octets"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_E "Note Command Extras"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_E_LOGLIST "Log List"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_E_LOGITEM1 "Note Off"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_E_LOGITEM2 "Note On/Off"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_A "Poly Aftertouch"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_A_LOGLIST "Log List"
|
|
#define RTP_MIDI_TREE_NAME_CJ_CHAPTER_A_LOGITEM "Pressure"
|
|
|
|
/* used to mask the most significant bit, which flags the start of a new midi-command! */
|
|
#define RTP_MIDI_COMMAND_STATUS_FLAG 0x80
|
|
|
|
/* used to mask the lower 7 bits of the single octets that make up the delta-time */
|
|
#define RTP_MIDI_DELTA_TIME_OCTET_MASK 0x7f
|
|
/* used to mask the most significant bit, which flags the extension of the delta-time */
|
|
#define RTP_MIDI_DELTA_TIME_EXTENSION 0x80
|
|
|
|
#define RTP_MIDI_CS_FLAG_B 0x80
|
|
#define RTP_MIDI_CS_FLAG_J 0x40
|
|
#define RTP_MIDI_CS_FLAG_Z 0x20
|
|
#define RTP_MIDI_CS_FLAG_P 0x10
|
|
#define RTP_MIDI_CS_MASK_SHORTLEN 0x0f
|
|
#define RTP_MIDI_CS_MASK_LONGLEN 0x0fff
|
|
|
|
#define RTP_MIDI_CJ_CHAPTER_M_FLAG_J 0x80
|
|
#define RTP_MIDI_CJ_CHAPTER_M_FLAG_K 0x40
|
|
#define RTP_MIDI_CJ_CHAPTER_M_FLAG_L 0x20
|
|
#define RTP_MIDI_CJ_CHAPTER_M_FLAG_M 0x10
|
|
#define RTP_MIDI_CJ_CHAPTER_M_FLAG_N 0x08
|
|
#define RTP_MIDI_CJ_CHAPTER_M_FLAG_T 0x04
|
|
#define RTP_MIDI_CJ_CHAPTER_M_FLAG_V 0x02
|
|
#define RTP_MIDI_CJ_CHAPTER_M_FLAG_R 0x01
|
|
|
|
#define RTP_MIDI_JS_FLAG_S 0x80
|
|
#define RTP_MIDI_JS_FLAG_Y 0x40
|
|
#define RTP_MIDI_JS_FLAG_A 0x20
|
|
#define RTP_MIDI_JS_FLAG_H 0x10
|
|
#define RTP_MIDI_JS_MASK_TOTALCHANNELS 0x0f
|
|
|
|
#define RTP_MIDI_SJ_FLAG_S 0x8000
|
|
#define RTP_MIDI_SJ_FLAG_D 0x4000
|
|
#define RTP_MIDI_SJ_FLAG_V 0x2000
|
|
#define RTP_MIDI_SJ_FLAG_Q 0x1000
|
|
#define RTP_MIDI_SJ_FLAG_F 0x0800
|
|
#define RTP_MIDI_SJ_FLAG_X 0x0400
|
|
#define RTP_MIDI_SJ_MASK_LENGTH 0x03ff
|
|
|
|
#define RTP_MIDI_SJ_CHAPTER_D_FLAG_S 0x80
|
|
#define RTP_MIDI_SJ_CHAPTER_D_FLAG_B 0x40
|
|
#define RTP_MIDI_SJ_CHAPTER_D_FLAG_G 0x20
|
|
#define RTP_MIDI_SJ_CHAPTER_D_FLAG_H 0x10
|
|
#define RTP_MIDI_SJ_CHAPTER_D_FLAG_J 0x08
|
|
#define RTP_MIDI_SJ_CHAPTER_D_FLAG_K 0x04
|
|
#define RTP_MIDI_SJ_CHAPTER_D_FLAG_Y 0x02
|
|
#define RTP_MIDI_SJ_CHAPTER_D_FLAG_Z 0x01
|
|
|
|
#define RTP_MIDI_SJ_CHAPTER_D_RESET_FLAG_S 0x80
|
|
#define RTP_MIDI_SJ_CHAPTER_D_RESET_COUNT 0x7f
|
|
#define RTP_MIDI_SJ_CHAPTER_D_TUNE_FLAG_S 0x80
|
|
#define RTP_MIDI_SJ_CHAPTER_D_TUNE_COUNT 0x7f
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SONG_SEL_FLAG_S 0x80
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SONG_SEL_VALUE 0x7f
|
|
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_S 0x8000
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_C 0x4000
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_V 0x2000
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_L 0x1000
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSCOM_MASK_DSZ 0x0c00
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSCOM_MASK_LENGTH 0x03ff
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSCOM_MASK_COUNT 0xff
|
|
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_S 0x80
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_C 0x40
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_L 0x20
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSREAL_MASK_LENGTH 0x1f
|
|
#define RTP_MIDI_SJ_CHAPTER_D_SYSREAL_MASK_COUNT 0xff
|
|
|
|
#define RTP_MIDI_SJ_CHAPTER_Q_FLAG_S 0x80
|
|
#define RTP_MIDI_SJ_CHAPTER_Q_FLAG_N 0x40
|
|
#define RTP_MIDI_SJ_CHAPTER_Q_FLAG_D 0x20
|
|
#define RTP_MIDI_SJ_CHAPTER_Q_FLAG_C 0x10
|
|
#define RTP_MIDI_SJ_CHAPTER_Q_FLAG_T 0x80
|
|
#define RTP_MIDI_SJ_CHAPTER_Q_MASK_TOP 0x07
|
|
#define RTP_MIDI_SJ_CHAPTER_Q_MASK_CLOCK 0x07ffff
|
|
#define RTP_MIDI_SJ_CHAPTER_Q_MASK_TIMETOOLS 0xffffff
|
|
|
|
#define RTP_MIDI_SJ_CHAPTER_F_FLAG_S 0x80
|
|
#define RTP_MIDI_SJ_CHAPTER_F_FLAG_C 0x40
|
|
#define RTP_MIDI_SJ_CHAPTER_F_FLAG_P 0x20
|
|
#define RTP_MIDI_SJ_CHAPTER_F_FLAG_Q 0x10
|
|
#define RTP_MIDI_SJ_CHAPTER_F_FLAG_D 0x08
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_POINT 0x07
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_MT0 0xf0000000
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_MT1 0x0f000000
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_MT2 0x00f00000
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_MT3 0x000f0000
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_MT4 0x0000f000
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_MT5 0x00000f00
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_MT6 0x000000f0
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_MT7 0x0000000f
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_HR 0xff000000
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_MN 0x00ff0000
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_SC 0x0000ff00
|
|
#define RTP_MIDI_SJ_CHAPTER_F_MASK_FR 0x000000ff
|
|
|
|
#define RTP_MIDI_SJ_CHAPTER_X_FLAG_S 0x80
|
|
#define RTP_MIDI_SJ_CHAPTER_X_FLAG_T 0x40
|
|
#define RTP_MIDI_SJ_CHAPTER_X_FLAG_C 0x20
|
|
#define RTP_MIDI_SJ_CHAPTER_X_FLAG_F 0x10
|
|
#define RTP_MIDI_SJ_CHAPTER_X_FLAG_D 0x08
|
|
#define RTP_MIDI_SJ_CHAPTER_X_FLAG_L 0x04
|
|
#define RTP_MIDI_SJ_CHAPTER_X_MASK_STA 0x03
|
|
#define RTP_MIDI_SJ_CHAPTER_X_MASK_TCOUNT 0xff
|
|
#define RTP_MIDI_SJ_CHAPTER_X_MASK_COUNT 0xff
|
|
|
|
#define RTP_MIDI_CJ_FLAG_S 0x800000
|
|
#define RTP_MIDI_CJ_FLAG_H 0x040000
|
|
#define RTP_MIDI_CJ_FLAG_P 0x000080
|
|
#define RTP_MIDI_CJ_FLAG_C 0x000040
|
|
#define RTP_MIDI_CJ_FLAG_M 0x000020
|
|
#define RTP_MIDI_CJ_FLAG_W 0x000010
|
|
#define RTP_MIDI_CJ_FLAG_N 0x000008
|
|
#define RTP_MIDI_CJ_FLAG_E 0x000004
|
|
#define RTP_MIDI_CJ_FLAG_T 0x000002
|
|
#define RTP_MIDI_CJ_FLAG_A 0x000001
|
|
#define RTP_MIDI_CJ_MASK_LENGTH 0x03ff00
|
|
#define RTP_MIDI_CJ_MASK_CHANNEL 0x780000
|
|
#define RTP_MIDI_CJ_CHANNEL_SHIFT 19
|
|
|
|
#define RTP_MIDI_CJ_CHAPTER_M_MASK_LENGTH 0x3f
|
|
|
|
#define RTP_MIDI_CJ_CHAPTER_N_MASK_LENGTH 0x7f00
|
|
#define RTP_MIDI_CJ_CHAPTER_N_MASK_LOW 0x00f0
|
|
#define RTP_MIDI_CJ_CHAPTER_N_MASK_HIGH 0x000f
|
|
|
|
#define RTP_MIDI_CJ_CHAPTER_E_MASK_LENGTH 0x7f
|
|
#define RTP_MIDI_CJ_CHAPTER_A_MASK_LENGTH 0x7f
|
|
|
|
|
|
|
|
|
|
|
|
static const char rtp_midi_unknown_value_dec[] = "unknown value: %d";
|
|
static const char rtp_midi_unknown_value_hex[] = "unknown value: 0x%x";
|
|
|
|
static const value_string rtp_midi_note_values[] = {
|
|
{ 0, "C-1" },
|
|
{ 1, "C#-1" },
|
|
{ 2, "D-1" },
|
|
{ 3, "D#-1" },
|
|
{ 4, "E-1" },
|
|
{ 5, "F-1" },
|
|
{ 6, "F#-1" },
|
|
{ 7, "G-1" },
|
|
{ 8, "G#-1" },
|
|
{ 9, "A-1" },
|
|
{ 10, "A#-1" },
|
|
{ 11, "B-1" },
|
|
{ 12, "C0" },
|
|
{ 13, "C#0" },
|
|
{ 14, "D0" },
|
|
{ 15, "D#0" },
|
|
{ 16, "E0" },
|
|
{ 17, "F0" },
|
|
{ 18, "F#0" },
|
|
{ 19, "G0" },
|
|
{ 20, "G#0" },
|
|
{ 21, "A0" },
|
|
{ 22, "A#0" },
|
|
{ 23, "B0" },
|
|
{ 24, "C1" },
|
|
{ 25, "C#1" },
|
|
{ 26, "D1" },
|
|
{ 27, "D#1" },
|
|
{ 28, "E1" },
|
|
{ 29, "F1" },
|
|
{ 30, "F#1" },
|
|
{ 31, "G1" },
|
|
{ 32, "G#1" },
|
|
{ 33, "A1" },
|
|
{ 34, "A#1" },
|
|
{ 35, "B1" },
|
|
{ 36, "C2" },
|
|
{ 37, "C#2" },
|
|
{ 38, "D2" },
|
|
{ 39, "D#2" },
|
|
{ 40, "E2" },
|
|
{ 41, "F2" },
|
|
{ 42, "F#2" },
|
|
{ 43, "G2" },
|
|
{ 44, "G#2" },
|
|
{ 45, "A2" },
|
|
{ 46, "A#2" },
|
|
{ 47, "B2" },
|
|
{ 48, "C3" },
|
|
{ 49, "C#3" },
|
|
{ 50, "D3" },
|
|
{ 51, "D#3" },
|
|
{ 52, "E3" },
|
|
{ 53, "F3" },
|
|
{ 54, "F#3" },
|
|
{ 55, "G3" },
|
|
{ 56, "G#3" },
|
|
{ 57, "A3" },
|
|
{ 58, "A#3" },
|
|
{ 59, "B3" },
|
|
{ 60, "C4" },
|
|
{ 61, "C#4" },
|
|
{ 62, "D4" },
|
|
{ 63, "D#4" },
|
|
{ 64, "E4" },
|
|
{ 65, "F4" },
|
|
{ 66, "F#4" },
|
|
{ 67, "G4" },
|
|
{ 68, "G#4" },
|
|
{ 69, "A4" },
|
|
{ 70, "A#4" },
|
|
{ 71, "B4" },
|
|
{ 72, "C5" },
|
|
{ 73, "C#5" },
|
|
{ 74, "D5" },
|
|
{ 75, "D#5" },
|
|
{ 76, "E5" },
|
|
{ 77, "F5" },
|
|
{ 78, "F#5" },
|
|
{ 79, "G5" },
|
|
{ 80, "G#5" },
|
|
{ 81, "A5" },
|
|
{ 82, "A#5" },
|
|
{ 83, "B5" },
|
|
{ 84, "C6" },
|
|
{ 85, "C#6" },
|
|
{ 86, "D6" },
|
|
{ 87, "D#6" },
|
|
{ 88, "E6" },
|
|
{ 89, "F6" },
|
|
{ 90, "F#6" },
|
|
{ 91, "G6" },
|
|
{ 92, "G#6" },
|
|
{ 93, "A6" },
|
|
{ 94, "A#6" },
|
|
{ 95, "B6" },
|
|
{ 96, "C7" },
|
|
{ 97, "C#7" },
|
|
{ 98, "D7" },
|
|
{ 99, "D#7" },
|
|
{ 100, "E7" },
|
|
{ 101, "F7" },
|
|
{ 102, "F#7" },
|
|
{ 103, "G7" },
|
|
{ 104, "G#7" },
|
|
{ 105, "A7" },
|
|
{ 106, "A#7" },
|
|
{ 107, "B7" },
|
|
{ 108, "C8" },
|
|
{ 109, "C#8" },
|
|
{ 110, "D8" },
|
|
{ 111, "D#8" },
|
|
{ 112, "E8" },
|
|
{ 113, "F8" },
|
|
{ 114, "F#8" },
|
|
{ 115, "G8" },
|
|
{ 116, "G#8" },
|
|
{ 117, "A8" },
|
|
{ 118, "A#8" },
|
|
{ 119, "B8" },
|
|
{ 120, "C9" },
|
|
{ 121, "C#9" },
|
|
{ 122, "D9" },
|
|
{ 123, "D#9" },
|
|
{ 124, "E9" },
|
|
{ 125, "F9" },
|
|
{ 126, "F#9" },
|
|
{ 127, "G9" },
|
|
{ 0, NULL }
|
|
};
|
|
static value_string_ext rtp_midi_note_values_ext = VALUE_STRING_EXT_INIT(rtp_midi_note_values);
|
|
|
|
|
|
|
|
static const value_string rtp_midi_controller_values[] = {
|
|
{ RTP_MIDI_CTRL_BANK_SELECT_MSB, "Bank Select (msb)" },
|
|
{ RTP_MIDI_CTRL_MODULATION_WHEEL_OR_LEVER_MSB, "Modulation Wheel Or Lever (msb)" },
|
|
{ RTP_MIDI_CTRL_BREATH_CONTROLLER_MSB, "Breath Controller (msb)" },
|
|
{ RTP_MIDI_CTRL_FOOT_CONTROLLER_MSB, "Foot Controller (msb)" },
|
|
{ RTP_MIDI_CTRL_PORTAMENTO_TIME_MSB, "Portamento Time (msb)" },
|
|
{ RTP_MIDI_CTRL_DATA_ENTRY_MSB, "Data Entry (msb)" },
|
|
{ RTP_MIDI_CTRL_CHANNEL_VOLUME_MSB, "Channel Volume (msb)" },
|
|
{ RTP_MIDI_CTRL_BALANCE_MSB, "Balance (msb)" },
|
|
{ RTP_MIDI_CTRL_PAN_MSB, "Pan (msb)" },
|
|
{ RTP_MIDI_CTRL_EXPRESSION_CONTROLLER_MSB, "Expression Controller (msb)" },
|
|
{ RTP_MIDI_CTRL_EFFECT_CONTROL_1_MSB, "Effect Control 1 (msb)" },
|
|
{ RTP_MIDI_CTRL_EFFECT_CONTROL_2_MSB, "Effect Control 2 (msb)" },
|
|
{ RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_1_MSB, "General Purpose Controller 1 (msb)" },
|
|
{ RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_2_MSB, "General Purpose Controller 2 (msb)" },
|
|
{ RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_3_MSB, "General Purpose Controller 3 (msb)" },
|
|
{ RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_4_MSB, "General Purpose Controller 4 (msb)" },
|
|
{ RTP_MIDI_CTRL_BANK_SELECT_LSB, "Bank Select (lsb)" },
|
|
{ RTP_MIDI_CTRL_MODULATION_WHEEL_OR_LEVER_LSB, "Modulation Wheel Or Lever (lsb)" },
|
|
{ RTP_MIDI_CTRL_BREATH_CONTROLLER_LSB, "Breath Controller (lsb)" },
|
|
{ RTP_MIDI_CTRL_FOOT_CONTROLLER_LSB, "Foot Controller (lsb)" },
|
|
{ RTP_MIDI_CTRL_PORTAMENTO_TIME_LSB, "Portamento Time (lsb)" },
|
|
{ RTP_MIDI_CTRL_DATA_ENTRY_LSB, "Data Entry (lsb)" },
|
|
{ RTP_MIDI_CTRL_CHANNEL_VOLUME_LSB, "Volume (lsb)" },
|
|
{ RTP_MIDI_CTRL_BALANCE_LSB, "Balance (lsb)" },
|
|
{ RTP_MIDI_CTRL_PAN_LSB, "Pan (lsb)" },
|
|
{ RTP_MIDI_CTRL_EXPRESSION_CONTROLLER_LSB, "Expression Controller (lsb)" },
|
|
{ RTP_MIDI_CTRL_EFFECT_CONTROL_1_LSB, "Effect Control 1 (lsb)" },
|
|
{ RTP_MIDI_CTRL_EFFECT_CONTROL_2_LSB, "Effect Control 2 (lsb)" },
|
|
{ RTP_MIDI_CTRL_DAMPER_PEDAL, "Damper Pedal" },
|
|
{ RTP_MIDI_CTRL_PORTAMENTO_ON_OFF, "Portamento On/Off" },
|
|
{ RTP_MIDI_CTRL_SUSTENUTO, "Sustenuto" },
|
|
{ RTP_MIDI_CTRL_SOFT_PEDAL, "Soft Pedal" },
|
|
{ RTP_MIDI_CTRL_LEGATO_FOOTSWITCH, "Legato Footswitch" },
|
|
{ RTP_MIDI_CTRL_HOLD_2, "Hold 2" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_1, "Sound Controller 1 (default: Sound Variation)" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_2, "Sound Controller 2 (default: Timbre/Harmonic Intensity)" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_3, "Sound Controller 3 (default: Release Time)" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_4, "Sound Controller 4 (default: Attack Time)" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_5, "Sound Controller 5 (default: Brightness)" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_6, "Sound Controller 6" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_7, "Sound Controller 7" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_8, "Sound Controller 8" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_9, "Sound Controller 9" },
|
|
{ RTP_MIDI_CTRL_SOUND_CONTROLLER_10, "Sound Controller 10" },
|
|
{ RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_5, "General Purpose Controller 5" },
|
|
{ RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_6, "General Purpose Controller 6" },
|
|
{ RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_7, "General Purpose Controller 7" },
|
|
{ RTP_MIDI_CTRL_GENERAL_PURPOSE_CONTROLLER_8, "General Purpose Controller 8" },
|
|
{ RTP_MIDI_CTRL_PORTAMENTO_CONTROL, "Portamento Control" },
|
|
{ RTP_MIDI_CTRL_EFFECTS_1_DEPTH, "Effects 1 Depth (formerly: External Effects Depth)" },
|
|
{ RTP_MIDI_CTRL_EFFECTS_2_DEPTH, "Effects 2 Depth (formerly: Tremolo Depth)" },
|
|
{ RTP_MIDI_CTRL_EFFECTS_3_DEPTH, "Effects 3 Depth (formerly: Chorus Depth)" },
|
|
{ RTP_MIDI_CTRL_EFFECTS_4_DEPTH, "Effects 4 Depth (formerly: Celeste (Detune) Depth)" },
|
|
{ RTP_MIDI_CTRL_EFFECTS_5_DEPTH, "Effects 5 Depth (formerly: Phaser Deptch)" },
|
|
{ RTP_MIDI_CTRL_DATA_INCREMENT, "Data Increment" },
|
|
{ RTP_MIDI_CTRL_DATA_DECREMENT, "Data Decrement" },
|
|
{ RTP_MIDI_CTRL_NON_REGISTERED_PARAM_LSB, "Non-Registered Parameter (lsb)" },
|
|
{ RTP_MIDI_CTRL_NON_REGISTERED_PARAM_MSB, "Non-Registered Parameter (msb)" },
|
|
{ RTP_MIDI_CTRL_REGISTERED_PARAM_LSB, "Registered Parameter (lsb)" },
|
|
{ RTP_MIDI_CTRL_REGISTERED_PARAM_MSB, "Registered Parameter (msb)" },
|
|
{ RTP_MIDI_CTRL_ALL_SOUND_OFF, "All Sound Off" },
|
|
{ RTP_MIDI_CTRL_RESET_ALL_CONTROLLERS, "Reset All Controllers" },
|
|
{ RTP_MIDI_CTRL_LOCAL_CONTROL_ON_OFF, "Local Control" },
|
|
{ RTP_MIDI_CTRL_ALL_NOTES_OFF, "All Notes Off" },
|
|
{ RTP_MIDI_CTRL_OMNI_MODE_OFF, "Omni Mode Off" },
|
|
{ RTP_MIDI_CTRL_OMNI_MODE_ON, "Omni Mode On" },
|
|
{ RTP_MIDI_CTRL_MONO_MODE_ON, "Mono Mode On" },
|
|
{ RTP_MIDI_CTRL_POLY_MODE_ON, "Poly Mode On" },
|
|
{ 0, NULL }
|
|
};
|
|
static value_string_ext rtp_midi_controller_values_ext = VALUE_STRING_EXT_INIT(rtp_midi_controller_values);
|
|
|
|
|
|
static const value_string rtp_midi_manu_short_values[] = {
|
|
{ RTP_MIDI_MANU_SHORT_ISLONG, "< long id >" },
|
|
{ RTP_MIDI_MANU_SHORT_SEQUENTIAL_CIRCUITS, "Sequential Circuits" },
|
|
{ RTP_MIDI_MANU_SHORT_BIG_BRIAR_IDP, "Big Briar / IDP" },
|
|
{ RTP_MIDI_MANU_SHORT_OCTAVE_PLATEAU_VOYETRA, "Voyetra / Octave-Plateau" },
|
|
{ RTP_MIDI_MANU_SHORT_MOOG, "Moog" },
|
|
{ RTP_MIDI_MANU_SHORT_PASSPORT_DESIGNS, "Passport Designs" },
|
|
{ RTP_MIDI_MANU_SHORT_LEXICON, "Lexicon" },
|
|
{ RTP_MIDI_MANU_SHORT_KURZWEIL, "Kurzweil" },
|
|
{ RTP_MIDI_MANU_SHORT_FENDER, "Fender" },
|
|
{ RTP_MIDI_MANU_SHORT_GULBRANSEN, "Gulbransen" },
|
|
{ RTP_MIDI_MANU_SHORT_AKG_ACOUSTICS, "AKG Acoustics" },
|
|
{ RTP_MIDI_MANU_SHORT_VOYCE_MUSIC, "Voyce Music" },
|
|
{ RTP_MIDI_MANU_SHORT_WAVEFRAME, "Waveframe Corp" },
|
|
{ RTP_MIDI_MANU_SHORT_ADA_SIGNAL_PROCESSORS, "ADA Signal Processors" },
|
|
{ RTP_MIDI_MANU_SHORT_GARFIELD_ELECTRONICS, "Garfield Electronics" },
|
|
{ RTP_MIDI_MANU_SHORT_ENSONIQ, "Ensoniq" },
|
|
{ RTP_MIDI_MANU_SHORT_OBERHEIM_GIBSON_LABS, "Oberheim / Gibson Labs" },
|
|
{ RTP_MIDI_MANU_SHORT_APPLE_COMPUTERS, "Apple Computer" },
|
|
{ RTP_MIDI_MANU_SHORT_GREY_MATTER_RESPONSE, "Grey Matter Response / Simmons" },
|
|
{ RTP_MIDI_MANU_SHORT_DIGIDESIGN, "DigiDesign" },
|
|
{ RTP_MIDI_MANU_SHORT_PALMTREE_INSTRUMENTS, "Fairlight / Palmtree Instruments" },
|
|
{ RTP_MIDI_MANU_SHORT_JL_COOPER, "JL Cooper" },
|
|
{ RTP_MIDI_MANU_SHORT_LOWREY, "Lowrey" },
|
|
{ RTP_MIDI_MANU_SHORT_LINN_ADAMS_SMITH, "Linn / Adams-Smith" },
|
|
{ RTP_MIDI_MANU_SHORT_EMU_SYSTEMS, "Emu Systems" },
|
|
{ RTP_MIDI_MANU_SHORT_HARMONY_SYSTEMS, "Harmony Systems" },
|
|
{ RTP_MIDI_MANU_SHORT_ART, "ART" },
|
|
{ RTP_MIDI_MANU_SHORT_BALDWIN, "Baldwin" },
|
|
{ RTP_MIDI_MANU_SHORT_EVENTIDE, "Eventide" },
|
|
{ RTP_MIDI_MANU_SHORT_INVENTRONICS, "Inventronics" },
|
|
{ RTP_MIDI_MANU_SHORT_CLARITY, "Clarity" },
|
|
{ RTP_MIDI_MANU_SHORT_PASSAC, "Passac" },
|
|
{ RTP_MIDI_MANU_SHORT_SIEL, "S.I.E.L." },
|
|
{ RTP_MIDI_MANU_SHORT_SYNTHE_AXE, "SyntheAxe" },
|
|
{ RTP_MIDI_MANU_SHORT_STEPP, "Stepp" },
|
|
{ RTP_MIDI_MANU_SHORT_HOHNER, "Hohner" },
|
|
{ RTP_MIDI_MANU_SHORT_CRUMAR_TWISTER, "Crumar / Twister" },
|
|
{ RTP_MIDI_MANU_SHORT_SOLTON, "Solton" },
|
|
{ RTP_MIDI_MANU_SHORT_JELLINGHAUS_MS, "Jellinghaus MS" },
|
|
{ RTP_MIDI_MANU_SHORT_SOUTHWORK_MUSIC_SYSTEMS, "Southworks Music Systems" },
|
|
{ RTP_MIDI_MANU_SHORT_PPG, "PPG" },
|
|
{ RTP_MIDI_MANU_SHORT_JEN, "JEN" },
|
|
{ RTP_MIDI_MANU_SHORT_SSL, "SSL (Solid States Logic)" },
|
|
{ RTP_MIDI_MANU_SHORT_AUDIO_VERITRIEB, "Audio Veritrieb" },
|
|
{ RTP_MIDI_MANU_SHORT_NEVE_HINTON_INSTRUMENTS, "Neve / Hinton Instruments" },
|
|
{ RTP_MIDI_MANU_SHORT_SOUNDTRACS, "Soundtracs Ltd" },
|
|
{ RTP_MIDI_MANU_SHORT_ELKA_GENERAL_MUSIC, "Elka / General Music" },
|
|
{ RTP_MIDI_MANU_SHORT_DYNACORD, "Dynacord" },
|
|
{ RTP_MIDI_MANU_SHORT_VISCOUNT, "Viscount" },
|
|
{ RTP_MIDI_MANU_SHORT_DRAWMER, "Drawmer" },
|
|
{ RTP_MIDI_MANU_SHORT_CLAVIA_DIGITAL_INSTRUMENTS, "Clavia Digital Instruments" },
|
|
{ RTP_MIDI_MANU_SHORT_AUDIO_ARCHITECTURE, "Audio Architecture" },
|
|
{ RTP_MIDI_MANU_SHORT_GENERAL_MUSIC_CORP, "General Music Corp" },
|
|
{ RTP_MIDI_MANU_SHORT_CHEETAH, "Cheetah Marketing" },
|
|
{ RTP_MIDI_MANU_SHORT_CTM, "C.T.M" },
|
|
{ RTP_MIDI_MANU_SHORT_SIMMONS_UK, "Simmons UK" },
|
|
{ RTP_MIDI_MANU_SHORT_SOUNDCRAFT_ELECTRONICS, "Soundcraft Electronics" },
|
|
{ RTP_MIDI_MANU_SHORT_STEINBERG_GMBH, "Steinberg GmbH" },
|
|
{ RTP_MIDI_MANU_SHORT_WERSI, "Wersi" },
|
|
{ RTP_MIDI_MANU_SHORT_AVAB_ELEKTRONIK_AB, "Avab Electronik Ab" },
|
|
{ RTP_MIDI_MANU_SHORT_DIGIGRAM, "Digigram" },
|
|
{ RTP_MIDI_MANU_SHORT_WALDORF, "Waldorf Electronics" },
|
|
{ RTP_MIDI_MANU_SHORT_QUASIMIDI, "Quasimidi" },
|
|
{ RTP_MIDI_MANU_SHORT_KAWAI, "Kawai" },
|
|
{ RTP_MIDI_MANU_SHORT_ROLAND, "Roland" },
|
|
{ RTP_MIDI_MANU_SHORT_KORG, "Korg" },
|
|
{ RTP_MIDI_MANU_SHORT_YAMAHA, "Yamaha" },
|
|
{ RTP_MIDI_MANU_SHORT_CASIO, "Casio" },
|
|
{ RTP_MIDI_MANU_SHORT_MORIDAIRA, "Moridaira" },
|
|
{ RTP_MIDI_MANU_SHORT_KAMIYA_STUDIO, "Kamiya Studio" },
|
|
{ RTP_MIDI_MANU_SHORT_AKAI, "Akai" },
|
|
{ RTP_MIDI_MANU_SHORT_JAPAN_VICTOR, "Japan Victor" },
|
|
{ RTP_MIDI_MANU_SHORT_MEISOSHA, "Meisosha" },
|
|
{ RTP_MIDI_MANU_SHORT_HOSHINO_GAKKI, "Hoshino Gakki" },
|
|
{ RTP_MIDI_MANU_SHORT_FUJITSU, "Fujitsu" },
|
|
{ RTP_MIDI_MANU_SHORT_SONY, "Sony" },
|
|
{ RTP_MIDI_MANU_SHORT_NISSHIN_ONPA, "Nisshin Onpa" },
|
|
{ RTP_MIDI_MANU_SHORT_TEAC, "TEAC" },
|
|
{ RTP_MIDI_MANU_SHORT_MATSUSHITA_ELECTRIC, "Matsushita Electric" },
|
|
{ RTP_MIDI_MANU_SHORT_FOSTEX, "Fostex" },
|
|
{ RTP_MIDI_MANU_SHORT_ZOOM, "Zoom" },
|
|
{ RTP_MIDI_MANU_SHORT_MIDORI_ELECTRONICS, "Midori Electronics" },
|
|
{ RTP_MIDI_MANU_SHORT_MATSUSHITA_COMMUNICATION, "Matsushita Communication" },
|
|
{ RTP_MIDI_MANU_SHORT_SUZUKI, "Suzuki" },
|
|
{ RTP_MIDI_MANU_SHORT_FUJI, "Fuji" },
|
|
{ RTP_MIDI_MANU_SHORT_ACOUSTIC_TECHNICAL_LAB, "Acoustic Technical Lab" },
|
|
{ RTP_MIDI_MANU_SHORT_FAITH, "Faith" },
|
|
{ RTP_MIDI_MANU_SHORT_INTERNET_CORPORATION, "Internet Corporation" },
|
|
{ RTP_MIDI_MANU_SHORT_SEEKERS_CO, "Seekers Co" },
|
|
{ RTP_MIDI_MANU_SHORT_SD_CARD_ASSOCIATION, "SD Card Assoc" },
|
|
{ RTP_MIDI_MANU_SHORT_EDUCATIONAL_USE, "Educational Use" },
|
|
{ RTP_MIDI_MANU_SHORT_NON_REALTIME_UNIVERSAL, "Non-Realtime Universal" },
|
|
{ RTP_MIDI_MANU_SHORT_REALTIME_UNIVERSAL, "Realtime Universal" },
|
|
{ 0, NULL }
|
|
};
|
|
static value_string_ext rtp_midi_manu_short_values_ext = VALUE_STRING_EXT_INIT(rtp_midi_manu_short_values);
|
|
|
|
static const value_string rtp_midi_manu_long_values[] = {
|
|
/* North American Manufacturers */
|
|
{ RTP_MIDI_MANU_LONG_TIME_WARNER_INTERACTIVE, "Time Warner Interactive" },
|
|
{ RTP_MIDI_MANU_LONG_ADVANCED_GRAVIS_COMP, "Advanced Gravis Comp" },
|
|
{ RTP_MIDI_MANU_LONG_MEDIA_VISION, "Media Vision" },
|
|
{ RTP_MIDI_MANU_LONG_DORNES_RESEARCH_GROUP, "Dornes Research Group" },
|
|
{ RTP_MIDI_MANU_LONG_KMUSE, "K-Muse" },
|
|
{ RTP_MIDI_MANU_LONG_STYPHER, "Stypher" },
|
|
{ RTP_MIDI_MANU_LONG_DIGITAL_MUSIC_CORPORATION, "Digital Music Corporation" },
|
|
{ RTP_MIDI_MANU_LONG_IOTA_SYSTEMS, "IOTA Systems" },
|
|
{ RTP_MIDI_MANU_LONG_NEW_ENGLAND_DIGITAL, "New England Digital" },
|
|
{ RTP_MIDI_MANU_LONG_ARTISYN, "Artisyn" },
|
|
{ RTP_MIDI_MANU_LONG_IVL_TECHNOLOGIES, "IVL Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_SOUTHERN_MUSIC_SYSTEMS, "Southern Music Systems" },
|
|
{ RTP_MIDI_MANU_LONG_LAKE_BUTLER_SOUND_COMPANY, "Lake Butler Sound Company" },
|
|
{ RTP_MIDI_MANU_LONG_ALESIS, "Alesis" },
|
|
{ RTP_MIDI_MANU_LONG_SOUND_CREATION, "Sound Creation" },
|
|
{ RTP_MIDI_MANU_LONG_DOD_ELECTRONICS, "DOD Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_STUDER_EDITECH, "Studer-Editech" },
|
|
{ RTP_MIDI_MANU_LONG_SONUS, "Sonus" },
|
|
{ RTP_MIDI_MANU_LONG_TEMPORAL_ACUITY_PRODUCTS, "Temporal Acuity Products" },
|
|
{ RTP_MIDI_MANU_LONG_PERFECT_FRETWORKS, "Perfect Fretworks" },
|
|
{ RTP_MIDI_MANU_LONG_KAT, "KAT" },
|
|
{ RTP_MIDI_MANU_LONG_OPCODE, "Opcode" },
|
|
{ RTP_MIDI_MANU_LONG_RANE_CORP, "Rane Corp" },
|
|
{ RTP_MIDI_MANU_LONG_SPATIAL_SOUND_ANADI_INC, "Spatial Sound / Anadi Inc" },
|
|
{ RTP_MIDI_MANU_LONG_KMX, "KMX" },
|
|
{ RTP_MIDI_MANU_LONG_ALLEN_AND_HEATH_BRENNEL, "Allen & Heath Brenell" },
|
|
{ RTP_MIDI_MANU_LONG_PEAVEY, "Peavey" },
|
|
{ RTP_MIDI_MANU_LONG_360_SYSTEMS, "360 Systems" },
|
|
{ RTP_MIDI_MANU_LONG_SPECTRUM_DESIGN_DEVELOPMENT, "Spectrum Design and Development" },
|
|
{ RTP_MIDI_MANU_LONG_MARQUIS_MUSIC, "Marquis Music" },
|
|
{ RTP_MIDI_MANU_LONG_ZETA_SYSTEMS, "Zeta Systems" },
|
|
{ RTP_MIDI_MANU_LONG_AXXES, "Axxes" },
|
|
{ RTP_MIDI_MANU_LONG_ORBAN, "Orban" },
|
|
{ RTP_MIDI_MANU_LONG_INDIAN_VALLEY, "Indian Valley Mfg" },
|
|
{ RTP_MIDI_MANU_LONG_TRITON, "Triton" },
|
|
{ RTP_MIDI_MANU_LONG_KTI, "KTI" },
|
|
{ RTP_MIDI_MANU_LONG_BREAKAWAY_TECHNOLOGIES, "Breakaway Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_CAE, "CAE" },
|
|
{ RTP_MIDI_MANU_LONG_HARRISON_SYSTEMS_INC, "Harrison Systems Inc" },
|
|
{ RTP_MIDI_MANU_LONG_FUTURE_LAB_MARK_KUO, "Future Lab / Mark Kuo" },
|
|
{ RTP_MIDI_MANU_LONG_ROCKTRON_CORP, "Rocktron Corp" },
|
|
{ RTP_MIDI_MANU_LONG_PIANODISC, "PianoDisc" },
|
|
{ RTP_MIDI_MANU_LONG_CANNON_RESEARCH_GROUP, "Cannon Research Group" },
|
|
{ RTP_MIDI_MANU_LONG_RODGERS_INSTRUMENTS_CORP, "Rodgers Instrument Corp" },
|
|
{ RTP_MIDI_MANU_LONG_BLUE_SKY_LOGIC, "Blue Sky Logic" },
|
|
{ RTP_MIDI_MANU_LONG_ENCORE_ELECTRONICS, "Encore Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_UPTOWN, "Uptown" },
|
|
{ RTP_MIDI_MANU_LONG_VOCE, "Voce" },
|
|
{ RTP_MIDI_MANU_LONG_CTI_AUDIO_INC, "CTI Audio, Inc / Music Intel Dev" },
|
|
{ RTP_MIDI_MANU_LONG_SS_RESEARCH, "S&S Research" },
|
|
{ RTP_MIDI_MANU_LONG_BRODERBUND_SOFTWARE, "Broderbund Software Inc" },
|
|
{ RTP_MIDI_MANU_LONG_ALLEN_ORGAN_CO, "Allen Organ Co" },
|
|
{ RTP_MIDI_MANU_LONG_MUSIC_QUEST, "Music Quest" },
|
|
{ RTP_MIDI_MANU_LONG_APHEX, "APHEX" },
|
|
{ RTP_MIDI_MANU_LONG_GALLIEN_KRUEGER, "Gallien Krueger" },
|
|
{ RTP_MIDI_MANU_LONG_IBM, "IBM" },
|
|
{ RTP_MIDI_MANU_LONG_MARK_OF_THE_UNICORN, "Mark of the Unicorn" },
|
|
{ RTP_MIDI_MANU_LONG_HOTZ_INSTRUMENTS_TECH, "Hotz Instruments Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_ETA_LIGHTING, "ETA Lighting" },
|
|
{ RTP_MIDI_MANU_LONG_NSI_CORPORATION, "NSI Corporation" },
|
|
{ RTP_MIDI_MANU_LONG_ADLIB_INC, "PAd Lib, Inc" },
|
|
{ RTP_MIDI_MANU_LONG_RICHMOND_SOUND_DESIGN, "Richmond Sound Design" },
|
|
{ RTP_MIDI_MANU_LONG_MICROSOFT, "Microsoft" },
|
|
{ RTP_MIDI_MANU_LONG_THE_SOFTWARE_TOOLWORKS, "The Software Toolworks" },
|
|
{ RTP_MIDI_MANU_LONG_RJMG_NICHE, "RJMG / Niche" },
|
|
{ RTP_MIDI_MANU_LONG_INTONE, "Intone" },
|
|
{ RTP_MIDI_MANU_LONG_ADVANCED_REMOTE_TECH, "Advanced Remote Tech" },
|
|
{ RTP_MIDI_MANU_LONG_GT_ELECTRONICS_GROOVE_TUBES, "GT Electronics / Groove Tubes" },
|
|
{ RTP_MIDI_MANU_LONG_INTERMIDI, "InterMIDI" },
|
|
{ RTP_MIDI_MANU_LONG_TIMELINE_VISTA, "Timeline Vista" },
|
|
{ RTP_MIDI_MANU_LONG_MESA_BOOGIE, "Mesa Boogie" },
|
|
{ RTP_MIDI_MANU_LONG_SEQUOIA_DEVELOPMENT, "Sequoia Development" },
|
|
{ RTP_MIDI_MANU_LONG_STUDIO_ELECTRONICS, "Studio Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_EUPHONIX, "Euphonix" },
|
|
{ RTP_MIDI_MANU_LONG_INTERMIDI2, "InterMIDI" },
|
|
{ RTP_MIDI_MANU_LONG_MIDI_SOLUTIONS, "MIDI Solutions" },
|
|
{ RTP_MIDI_MANU_LONG_3DO_COMPANY, "3DO Company" },
|
|
{ RTP_MIDI_MANU_LONG_LIGHTWAVE_RESEARCH, "Lightwave Research" },
|
|
{ RTP_MIDI_MANU_LONG_MICROW, "Micro-W" },
|
|
{ RTP_MIDI_MANU_LONG_SPECTRAL_SYNTHESIS, "Spectral Synthesis" },
|
|
{ RTP_MIDI_MANU_LONG_LONE_WOLF, "Lone Wolf" },
|
|
{ RTP_MIDI_MANU_LONG_STUDIO_TECHNOLOGIES, "Studio Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_PETERSON_EMP, "Peterson EMP" },
|
|
{ RTP_MIDI_MANU_LONG_ATARI, "Atari" },
|
|
{ RTP_MIDI_MANU_LONG_MARION_SYSTEMS, "Marion Systems" },
|
|
{ RTP_MIDI_MANU_LONG_DESIGN_EVENT, "Design Event" },
|
|
{ RTP_MIDI_MANU_LONG_WINJAMMER_SOFTWARE, "Winjammer Software" },
|
|
{ RTP_MIDI_MANU_LONG_ATT_BELL_LABS, "AT&T Bell Labs" },
|
|
{ RTP_MIDI_MANU_LONG_SYMETRIX, "Symetrix" },
|
|
{ RTP_MIDI_MANU_LONG_MIDI_THE_WORLD, "MIDI the world" },
|
|
{ RTP_MIDI_MANU_LONG_DESPER_PRODUCTS, "Desper Products" },
|
|
{ RTP_MIDI_MANU_LONG_MICROS_N_MIDI, "Micros 'n MIDI" },
|
|
{ RTP_MIDI_MANU_LONG_ACCORDIANS_INTL, "Accodians Intl" },
|
|
{ RTP_MIDI_MANU_LONG_EUPHONICS, "EuPhonics" },
|
|
{ RTP_MIDI_MANU_LONG_MUSONIX, "Musonix" },
|
|
{ RTP_MIDI_MANU_LONG_TURTLE_BEACH_SYSTEMS, "Turtle Beach Systems" },
|
|
{ RTP_MIDI_MANU_LONG_MACKIE_DESIGNS, "Mackie Designs" },
|
|
{ RTP_MIDI_MANU_LONG_COMPUSERVE, "Compuserve" },
|
|
{ RTP_MIDI_MANU_LONG_BES_TECHNOLOGIES, "BES Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_QRS_MUSIC_ROLLS, "QRS Music Rolls" },
|
|
{ RTP_MIDI_MANU_LONG_P_G_MUSIC, "P G Music" },
|
|
{ RTP_MIDI_MANU_LONG_SIERRA_SEMICONDUCTOR, "Sierra Semiconductor" },
|
|
{ RTP_MIDI_MANU_LONG_EPIGRAF_AUDIO_VISUAL, "EpiGraf Audio Visual" },
|
|
{ RTP_MIDI_MANU_LONG_ELECTRONICS_DIVERSIFIED, "Electronics Diversified" },
|
|
{ RTP_MIDI_MANU_LONG_TUNE_1000, "Tune 1000" },
|
|
{ RTP_MIDI_MANU_LONG_ADVANCED_MICRO_DEVICES, "Advanced Micro Devices" },
|
|
{ RTP_MIDI_MANU_LONG_MEDIAMATION, "Mediamation" },
|
|
{ RTP_MIDI_MANU_LONG_SABINE_MUSIC, "Sabine Music" },
|
|
{ RTP_MIDI_MANU_LONG_WOOG_LABS, "Woog Labs" },
|
|
{ RTP_MIDI_MANU_LONG_MIRCOPOLIS, "Micropolis" },
|
|
{ RTP_MIDI_MANU_LONG_TA_HORNG_MUSICAL_INSTRUMENT, "Ta Horng Musical Instrument" },
|
|
{ RTP_MIDI_MANU_LONG_ETEK_LABS_FORTE_TECH, "e-Tek Labs (Forte Tech)" },
|
|
{ RTP_MIDI_MANU_LONG_ELECTRO_VOICE, "Electro-Voice" },
|
|
{ RTP_MIDI_MANU_LONG_MIDISOFT_CORPORATION, "Midisoft Corporation" },
|
|
{ RTP_MIDI_MANU_LONG_QSOUND_LABS, "Q-Sound Labs" },
|
|
{ RTP_MIDI_MANU_LONG_WESTREX, "Westrex" },
|
|
{ RTP_MIDI_MANU_LONG_NVIDIA, "NVidia" },
|
|
{ RTP_MIDI_MANU_LONG_ESS_TECHNOLOGY, "ESS Technology" },
|
|
{ RTP_MIDI_MANU_LONG_MEDIATRIX_PERIPHERALS, "MediaTrix Peripherals" },
|
|
{ RTP_MIDI_MANU_LONG_BROOKTREE_CORP, "Brooktree Corp" },
|
|
{ RTP_MIDI_MANU_LONG_OTARI_CORP, "Otari Corp" },
|
|
{ RTP_MIDI_MANU_LONG_KEY_ELECTRONICS, "Key Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_SHURE_INCORPORATED, "Shure Incorporated" },
|
|
{ RTP_MIDI_MANU_LONG_AURA_SOUND, "Aura Sound" },
|
|
{ RTP_MIDI_MANU_LONG_CRYSTAL_SEMICONDUCTOR, "Crystal Semiconductor" },
|
|
{ RTP_MIDI_MANU_LONG_CONEXANT_ROCKWELL, "Conexant (Rockwell)" },
|
|
{ RTP_MIDI_MANU_LONG_SILICON_GRAPHICS, "Silicon Graphics" },
|
|
{ RTP_MIDI_MANU_LONG_MAUDIO_MIDIMAN, "M-Audio (Midiman)" },
|
|
{ RTP_MIDI_MANU_LONG_PRESONUS, "PreSonus" },
|
|
{ RTP_MIDI_MANU_LONG_TOPAZ_ENTERPRISES, "Topaz Enterprises" },
|
|
{ RTP_MIDI_MANU_LONG_CAST_LIGHTING, "Cast Lighting" },
|
|
{ RTP_MIDI_MANU_LONG_MICROSOFT_CONSUMER_DIVISION, "Microsoft (Consumer Division)" },
|
|
{ RTP_MIDI_MANU_LONG_SONIC_FOUNDRY, "Sonic Foundry" },
|
|
{ RTP_MIDI_MANU_LONG_LINE6_FAST_FORWARD, "Line 6 (Fast Forward)" },
|
|
{ RTP_MIDI_MANU_LONG_BEATNIK_INC, "Beatnik Inc" },
|
|
{ RTP_MIDI_MANU_LONG_VAN_KOEVERING_COMPANY, "Van Koevering Company" },
|
|
{ RTP_MIDI_MANU_LONG_ALTECH_SYSTEMS, "DiAltech Systemsgit" },
|
|
{ RTP_MIDI_MANU_LONG_S_S_RESEARCH, "S&S Research" },
|
|
{ RTP_MIDI_MANU_LONG_VLSI_TECHNOLOGY, "VLSI Technology" },
|
|
{ RTP_MIDI_MANU_LONG_CHROMATIC_RESEARCH, "Chromatic Research" },
|
|
{ RTP_MIDI_MANU_LONG_SAPPHIRE, "Sapphire" },
|
|
{ RTP_MIDI_MANU_LONG_IDRC, "IDRC" },
|
|
{ RTP_MIDI_MANU_LONG_JUSTONIC_TUNING, "Justonic Tuning" },
|
|
{ RTP_MIDI_MANU_LONG_TORCOMP_RESEARCH_INC, "TorComp Research Inc" },
|
|
{ RTP_MIDI_MANU_LONG_NEWTEK_INC, "NewTek Inc" },
|
|
{ RTP_MIDI_MANU_LONG_SOUND_SCULPTURE, "Sound Sculpture" },
|
|
{ RTP_MIDI_MANU_LONG_WALKER_TECHNICAL, "Walker Technical" },
|
|
{ RTP_MIDI_MANU_LONG_DIGITAL_HARMONY, "Digital Harmony" },
|
|
{ RTP_MIDI_MANU_LONG_INVISION_INTERACTIVE, "InVision Interactive" },
|
|
{ RTP_MIDI_MANU_LONG_TSQUARE_DESIGN, "T-Square Design" },
|
|
{ RTP_MIDI_MANU_LONG_NEMESYS_MUSIC_TECHNOLOGY, "Nemesys Music Technology" },
|
|
{ RTP_MIDI_MANU_LONG_DBX_PROFESSIONAL_HARMAN_INTL, "DBX Professional (Harman Intl)" },
|
|
{ RTP_MIDI_MANU_LONG_SYNDYNE_CORPORATION, "Syndyne Corporation" },
|
|
{ RTP_MIDI_MANU_LONG_BITHEADZ, "Bitheadz" },
|
|
{ RTP_MIDI_MANU_LONG_CAKEWALK_MUSIC_SOFTWARE, "Cakewalk Music Software" },
|
|
{ RTP_MIDI_MANU_LONG_ANALOG_DEVICES, "Analog Devices" },
|
|
{ RTP_MIDI_MANU_LONG_NATIONAL_SEMICONDUCTOR, "National Semiconductor" },
|
|
{ RTP_MIDI_MANU_LONG_BOOM_THEORY, "Boom Theory" },
|
|
{ RTP_MIDI_MANU_LONG_VIRTUAL_DSP_CORPORATION, "Virtual DSP Corporation" },
|
|
{ RTP_MIDI_MANU_LONG_ANTARES_SYSTEMS, "Antares Systems" },
|
|
{ RTP_MIDI_MANU_LONG_ANGEL_SOFTWARE, "Angel Software" },
|
|
{ RTP_MIDI_MANU_LONG_ST_LOUIS_MUSIC, "St Louis Music" },
|
|
{ RTP_MIDI_MANU_LONG_LYRRUS_DBA_GVOX, "Lyrrus dba G-VOX" },
|
|
{ RTP_MIDI_MANU_LONG_ASHLEY_AUDIO_INC, "Ashley Audio Inc" },
|
|
{ RTP_MIDI_MANU_LONG_VARILITE_INC, "Vari-Lite Inc" },
|
|
{ RTP_MIDI_MANU_LONG_SUMMIT_AUDIO_INC, "Summit Audio Inc" },
|
|
{ RTP_MIDI_MANU_LONG_AUREAL_SEMICONDUCTOR_INC, "Aureal Semiconductor Inc" },
|
|
{ RTP_MIDI_MANU_LONG_SEASOUND_LLC, "SeaSound LLC" },
|
|
{ RTP_MIDI_MANU_LONG_US_ROBOTICS, "U.S. Robotics" },
|
|
{ RTP_MIDI_MANU_LONG_AURISIS_RESEARCH, "Aurisis Research" },
|
|
{ RTP_MIDI_MANU_LONG_NEARFIELD_MULTIMEDIA, "Nearfield Multimedia" },
|
|
{ RTP_MIDI_MANU_LONG_FM7_INC, "FM7 Inc" },
|
|
{ RTP_MIDI_MANU_LONG_SWIVEL_SYSTEMS, "Swivel Systems" },
|
|
{ RTP_MIDI_MANU_LONG_HYPERACTIVE_AUDIO_SYSTEMS, "Hyperactive Audio Systems" },
|
|
{ RTP_MIDI_MANU_LONG_MIDILITE_CASTE_STUDIO_PROD, "MidiLite (Castle Studios Productions)" },
|
|
{ RTP_MIDI_MANU_LONG_RADIKAL_TECHNOLOGIES, "Radikal Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_ROGER_LINN_DESIGN, "Roger Linn Design" },
|
|
{ RTP_MIDI_MANU_LONG_TCHELION_VOCAL_TECHNOLOGIES, "TC-Helicon Vocal Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_EVENT_ELECTRONICS, "Event Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_SONIC_NETWORK_INC, "Sonic Network Inc" },
|
|
{ RTP_MIDI_MANU_LONG_REALTIME_MUSIC_SOLUTIONS, "Realtime Music Solutions" },
|
|
{ RTP_MIDI_MANU_LONG_APOGEE_DIGITAL, "Apogee Digital" },
|
|
{ RTP_MIDI_MANU_LONG_CLASSICAL_ORGANS_INC, "Classical Organs, Inc" },
|
|
{ RTP_MIDI_MANU_LONG_MICROTOOLS_INC, "Microtools Inc" },
|
|
{ RTP_MIDI_MANU_LONG_NUMARK_INDUSTRIES, "Numark Industries" },
|
|
{ RTP_MIDI_MANU_LONG_FRONTIER_DESIGN_GROUP_LLC, "Frontier Design Group LLC" },
|
|
{ RTP_MIDI_MANU_LONG_RECORDARE_LLC, "Recordare LLC" },
|
|
{ RTP_MIDI_MANU_LONG_STARR_LABS, "Starr Labs" },
|
|
{ RTP_MIDI_MANU_LONG_VOYAGER_SOUND_INC, "Voyager Sound Inc" },
|
|
{ RTP_MIDI_MANU_LONG_MANIFOLD_LABS, "Manifold Labs" },
|
|
{ RTP_MIDI_MANU_LONG_AVIOM_INC, "Aviom Inc" },
|
|
{ RTP_MIDI_MANU_LONG_MIXMEISTER_TECHNOLOGY, "Mixmeister Technology" },
|
|
{ RTP_MIDI_MANU_LONG_NOTATION_SOFTWARE, "Notation Software" },
|
|
{ RTP_MIDI_MANU_LONG_MERCURIAL_COMMUNICATIONS, "Mercurial Communications" },
|
|
{ RTP_MIDI_MANU_LONG_WAVE_ARTS, "Wave Arts" },
|
|
{ RTP_MIDI_MANU_LONG_LOGIC_SEQUENCING_DEVICES, "Logic Sequencing Devices" },
|
|
{ RTP_MIDI_MANU_LONG_AXESS_ELECTRONICS, "Axess Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_MUSE_RESEARCH, "Muse Research" },
|
|
{ RTP_MIDI_MANU_LONG_OPEN_LABS, "Open Labs" },
|
|
{ RTP_MIDI_MANU_LONG_GUILLEMOT_RD_INC, "Guillemot R&D Inc" },
|
|
{ RTP_MIDI_MANU_LONG_SAMSON_TECHNOLOGIES, "Samson Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_ELECTRONIC_THEATRE_CONTROLS, "Electronic Theatre Controls" },
|
|
{ RTP_MIDI_MANU_LONG_RESEARCH_IN_MOTION, "Research In Motion" },
|
|
{ RTP_MIDI_MANU_LONG_MOBILEER, "Mobileer" },
|
|
{ RTP_MIDI_MANU_LONG_SYNTHOGY, "Synthogy" },
|
|
{ RTP_MIDI_MANU_LONG_LYNX_STUDIO_TECHNOLOGY_INC, "Lynx Studio Technology Inc" },
|
|
{ RTP_MIDI_MANU_LONG_DAMAGE_CONTROL_ENGINEERING, "Damage Control Engineering LLC" },
|
|
{ RTP_MIDI_MANU_LONG_YOST_ENGINEERING_INC, "Yost Engineering Inc" },
|
|
{ RTP_MIDI_MANU_LONG_BROOKS_FORSMAN_DESIGNS_LLC, "Brooks & Forsman Designs LLC" },
|
|
{ RTP_MIDI_MANU_LONG_MAGNEKEY, "Magnekey" },
|
|
{ RTP_MIDI_MANU_LONG_GARRITAN_CORP, "Garritan Corp" },
|
|
{ RTP_MIDI_MANU_LONG_PLOQUE_ART_ET_TECHNOLOGIE, "Ploque Art et Technologie, Inc" },
|
|
{ RTP_MIDI_MANU_LONG_RJM_MUSIC_TECHNOLOGY, "RJM Music Technology" },
|
|
{ RTP_MIDI_MANU_LONG_CUSTOM_SOLUTIONS_SOFTWARE, "Custom Solutions Software" },
|
|
{ RTP_MIDI_MANU_LONG_SONARCANA_LLC, "Sonarcana LLC" },
|
|
{ RTP_MIDI_MANU_LONG_CENTRANCE, "Centrance" },
|
|
{ RTP_MIDI_MANU_LONG_KESUMO_LLC, "Kesumo LLC" },
|
|
{ RTP_MIDI_MANU_LONG_STANTON, "Stanton" },
|
|
{ RTP_MIDI_MANU_LONG_LIVID_INSTRUMENTS, "Livid Instruments" },
|
|
{ RTP_MIDI_MANU_LONG_FIRST_ACT_745_MEDIA, "First Act / 745 Media" },
|
|
{ RTP_MIDI_MANU_LONG_PYGRAPHICS_INC, "Pygraphics, Inc" },
|
|
{ RTP_MIDI_MANU_LONG_PANADIGM_INNOVATIONS_LTD, "Panadigm Innovations Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_AVEDIS_ZILDJIAN_CO, "Avedis Zildjian Co" },
|
|
{ RTP_MIDI_MANU_LONG_AUVITAL_MUSIC_CORP, "Auvital Music Corp" },
|
|
{ RTP_MIDI_MANU_LONG_INSPIRED_INSTRUMENTS_INC, "Inspired Instruments Inc" },
|
|
{ RTP_MIDI_MANU_LONG_CHRIS_GRIGG_DESIGNS, "Chris Grigg Designs" },
|
|
{ RTP_MIDI_MANU_LONG_SLATE_DIGITAL_LLC, "Slate Digital LLC" },
|
|
{ RTP_MIDI_MANU_LONG_MIXWARE, "Mixware" },
|
|
{ RTP_MIDI_MANU_LONG_SOCIAL_ENTROPY, "Social Entropy" },
|
|
{ RTP_MIDI_MANU_LONG_SOURCE_AUDIO_LLC, "Source Audio LLC" },
|
|
{ RTP_MIDI_MANU_LONG_RESERVED_016d, "reserved" },
|
|
{ RTP_MIDI_MANU_LONG_RESERVED_016e, "reserved" },
|
|
{ RTP_MIDI_MANU_LONG_RESERVED_016f, "reserved" },
|
|
{ RTP_MIDI_MANU_LONG_AMERICAN_AUDIO_DJ, "American Audio/DJ" },
|
|
{ RTP_MIDI_MANU_LONG_MEGA_CONTROL_SYSTEMS, "Mega Control Systems" },
|
|
{ RTP_MIDI_MANU_LONG_KILPATRICK_AUDIO, "Kilpatrick Audio" },
|
|
{ RTP_MIDI_MANU_LONG_IKINGDOM_CORP, "iKingdom Corp" },
|
|
{ RTP_MIDI_MANU_LONG_FRACTAL_AUDIO, "Fractal Audio" },
|
|
{ RTP_MIDI_MANU_LONG_NETLOGIC_MICROSYSTEMS, "NetLogic Microsystems" },
|
|
{ RTP_MIDI_MANU_LONG_MUSIC_COMPUTING, "Music Computing" },
|
|
{ RTP_MIDI_MANU_LONG_NEKTAR_TECHNOLOGY_INC, "Nektar Technology Inc" },
|
|
{ RTP_MIDI_MANU_LONG_ZENPH_SOUND_INNOVATIONS, "Zenph Sound Innovations" },
|
|
{ RTP_MIDI_MANU_LONG_DJTECHTOOLS_COM, "DJTechTools.com" },
|
|
{ RTP_MIDI_MANU_LONG_RESERVED_017a, "reserved" },
|
|
|
|
/* European Manufacturers */
|
|
{ RTP_MIDI_MANU_LONG_DREAM, "Dream" },
|
|
{ RTP_MIDI_MANU_LONG_STRAND_LIGHTING, "Strand Lighting" },
|
|
{ RTP_MIDI_MANU_LONG_AMEK_SYSTEMS, "Amek Systems" },
|
|
{ RTP_MIDI_MANU_LONG_CASA_DI_RISPARMIO_DI_LORETO, "Cas Di Risparmio Di Loreto" },
|
|
{ RTP_MIDI_MANU_LONG_BOHM_ELECTRONIC, "Bohm electronic" },
|
|
{ RTP_MIDI_MANU_LONG_SYNTEC_DIGITAL_AUDIO, "Syntec Digital Audio" },
|
|
{ RTP_MIDI_MANU_LONG_TRIDENT_AUDIO, "Trident Audio" },
|
|
{ RTP_MIDI_MANU_LONG_REAL_WORLD_STUDIO, "Real World Studio" },
|
|
{ RTP_MIDI_MANU_LONG_EVOLUTION_SYNTHESIS, "Evolution Synthesis" },
|
|
{ RTP_MIDI_MANU_LONG_YES_TECHNOLOGY, "Yes Technology" },
|
|
{ RTP_MIDI_MANU_LONG_AUDIOMATICA, "Audiomatica" },
|
|
{ RTP_MIDI_MANU_LONG_BONTEMPI_FARFISA, "Bontempi / Farfisa" },
|
|
{ RTP_MIDI_MANU_LONG_FBT_ELETTRONICA, "F.B.T. Elettronica" },
|
|
{ RTP_MIDI_MANU_LONG_MIDITEMP, "Miditemp" },
|
|
{ RTP_MIDI_MANU_LONG_LA_AUDIO_LARKING_AUDIO, "LA Audio (Larking Audio)" },
|
|
{ RTP_MIDI_MANU_LONG_ZERO_88_LIGHTING_LIMITED, "Zero 88 Lighting Limited" },
|
|
{ RTP_MIDI_MANU_LONG_MICON_AUDIO_ELECTRONICS_GMBH, "Micon Audio Electronics GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_FOREFRONT_TECHNOLOGY, "Forefront Technology" },
|
|
{ RTP_MIDI_MANU_LONG_STUDIO_AUDIO_AND_VIDEO_LTD, "Stduio Audio and Video Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_KENTON_ELECTRONICS, "Kenton Electroncs" },
|
|
{ RTP_MIDI_MANU_LONG_CELCO_DIVISON_OF_ELECTRONICS, "Celco Division of Electrosonic" },
|
|
{ RTP_MIDI_MANU_LONG_ADB, "ADB" },
|
|
{ RTP_MIDI_MANU_LONG_MARSHALL_PRODUCTS, "Marshall Products" },
|
|
{ RTP_MIDI_MANU_LONG_DDA, "DDA" },
|
|
{ RTP_MIDI_MANU_LONG_BBS, "BSS" },
|
|
{ RTP_MIDI_MANU_LONG_MA_LIGHTING_TECHNOLOGY, "MA Lighting Technology" },
|
|
{ RTP_MIDI_MANU_LONG_FATAR, "Fatar" },
|
|
{ RTP_MIDI_MANU_LONG_QSC_AUDIO, "QSC Audio" },
|
|
{ RTP_MIDI_MANU_LONG_ARTISAN_CLASSIC_ORGAN, "Artisan Classic Organ" },
|
|
{ RTP_MIDI_MANU_LONG_ORLA_SPA, "Rola Spa" },
|
|
{ RTP_MIDI_MANU_LONG_PINNACLE_AUDIO, "Pinnacle Audio" },
|
|
{ RTP_MIDI_MANU_LONG_TC_ELECTRONICS, "TC Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_DOEPFER_MUSIKELEKTRONIK, "Doepfer Musikelektronik" },
|
|
{ RTP_MIDI_MANU_LONG_CREATIVE_TECHNOLOGY_PTE, "Creative Technology Pte" },
|
|
{ RTP_MIDI_MANU_LONG_MINAMI_SEIYDDO, "Minami / Seiyddo" },
|
|
{ RTP_MIDI_MANU_LONG_MIDISOFT_SAS_DI_M_CIMA, "Goldstar" },
|
|
{ RTP_MIDI_MANU_LONG_SAMICK, "Samick" },
|
|
{ RTP_MIDI_MANU_LONG_PENNY_AND_GILES, "Penny and Giles" },
|
|
{ RTP_MIDI_MANU_LONG_ACORN_COMPUTER, "Acorn Computer" },
|
|
{ RTP_MIDI_MANU_LONG_LSC_ELECTRONICS, "LSC Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_NOVATION_EMS, "Novation EMS" },
|
|
{ RTP_MIDI_MANU_LONG_SAMKYUNG_MECHATRONICS, "Samkyung Mechatronics" },
|
|
{ RTP_MIDI_MANU_LONG_MEDELI_ELECTRONICS_CO, "Medeli Electronics Co" },
|
|
{ RTP_MIDI_MANU_LONG_CHARLIE_LAB_SRL, "Charlie Lab SRL" },
|
|
{ RTP_MIDI_MANU_LONG_BLUE_CHIP_MUSIC_TECHNOLOGY, "Blue Chip Music Technology" },
|
|
{ RTP_MIDI_MANU_LONG_BEE_OH_CORP, "BEE OH Corp" },
|
|
{ RTP_MIDI_MANU_LONG_LG_SEMICON_AMERICA, "LG Semicon America" },
|
|
{ RTP_MIDI_MANU_LONG_TESI, "TESI" },
|
|
{ RTP_MIDI_MANU_LONG_EMAGIC, "EMAGIC" },
|
|
{ RTP_MIDI_MANU_LONG_BEHRINGER_GMBH, "Behringer GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_ACCESS_MUSIC_ELECTRONICS, "Access Music Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_SYNOPTIC, "Synoptic" },
|
|
{ RTP_MIDI_MANU_LONG_HANMESOFT_CORP, "Hanmesoft Corp" },
|
|
{ RTP_MIDI_MANU_LONG_TERRATEC_ELECTRONIC_GMBH, "Terratec Electronic GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_PROEL_SPA, "Proel SpA" },
|
|
{ RTP_MIDI_MANU_LONG_IBK_MIDI, "IBK MIDI" },
|
|
{ RTP_MIDI_MANU_LONG_IRCAM, "IRCAM" },
|
|
{ RTP_MIDI_MANU_LONG_PROPELLERHEAD_SOFTWARE, "Propellerhead Software" },
|
|
{ RTP_MIDI_MANU_LONG_RED_SOUND_SYSTEMS_LTD, "Red Sound Systems Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_ELEKTRON_ESI_AB, "Elektron ESI AB" },
|
|
{ RTP_MIDI_MANU_LONG_SINTEFEX_AUDIO, "Sintefex Audio" },
|
|
{ RTP_MIDI_MANU_LONG_MAM_MUSIC_AND_MORE, "MAM (Music and More)" },
|
|
{ RTP_MIDI_MANU_LONG_AMSARO_GMBH, "Amsaro GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_CDS_ADVANCED_TECHNOLOGY_BV, "CDS Advanced Technology BV" },
|
|
{ RTP_MIDI_MANU_LONG_TOUCHED_BY_SOUND_GMBH, "Touched By Sound GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_DSP_ARTS, "DSP Arts" },
|
|
{ RTP_MIDI_MANU_LONG_PHIL_REES_MUSIC_TECH, "Phil Rees Music Tech" },
|
|
{ RTP_MIDI_MANU_LONG_STAMER_MUSIKANLAGEN_GMBH, "Stamer Musikanlagen GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_MUSICAL_MUNTANER_SA_DBA, "Musical Muntaner S.A. dba Soundart" },
|
|
{ RTP_MIDI_MANU_LONG_CMEXX_SOFTWARE, "C-Mexx Software" },
|
|
{ RTP_MIDI_MANU_LONG_KLAVIS_TECHNOLOGIES, "Klavis Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_NOTEHEADS_AB, "Noteheads AB" },
|
|
{ RTP_MIDI_MANU_LONG_ALGORITHMIX, "Algorithmix" },
|
|
{ RTP_MIDI_MANU_LONG_SKRYDSTRUP_RD, "Skrydstrup R&D" },
|
|
{ RTP_MIDI_MANU_LONG_PROFRESSIONAL_AUDIO_COMPANY, "Professional Audio Company" },
|
|
{ RTP_MIDI_MANU_LONG_DBTECH_MADWAVES, "DBTECH/MadWaves" },
|
|
{ RTP_MIDI_MANU_LONG_VERMONA, "Vermona" },
|
|
{ RTP_MIDI_MANU_LONG_NOKIA, "Nokia" },
|
|
{ RTP_MIDI_MANU_LONG_WAVE_IDEA, "Wave Idea" },
|
|
{ RTP_MIDI_MANU_LONG_HARTMANN_GMBH, "Hartmann GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_LIONS_TRACK, "Lion's Track" },
|
|
{ RTP_MIDI_MANU_LONG_ANALOGUE_SYSTEMS, "Analogue Systems" },
|
|
{ RTP_MIDI_MANU_LONG_FOCAL_JMLAB, "Focal-JMlab" },
|
|
{ RTP_MIDI_MANU_LONG_RINGWAY_ELECTRONICS, "Ringway Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_FAITH_TECHNOLOGIES_DIGIPLUG, "Faith Technologies (Digiplug)" },
|
|
{ RTP_MIDI_MANU_LONG_SHOWWORKS, "Showworks" },
|
|
{ RTP_MIDI_MANU_LONG_MANIKIN_ELECTRONIC, "Manikin Electronic" },
|
|
{ RTP_MIDI_MANU_LONG_1_COME_TECH, "1 Come Tech" },
|
|
{ RTP_MIDI_MANU_LONG_PHONIC_CORP, "Phonic Corp" },
|
|
{ RTP_MIDI_MANU_LONG_LAKE_TECHNOLOGY, "Lake Technology" },
|
|
{ RTP_MIDI_MANU_LONG_SILANSYS_TECHNOLOGIES, "Silansys Technologies" },
|
|
{ RTP_MIDI_MANU_LONG_WINBOND_ELECTRONICS, "Winbond Electronics" },
|
|
{ RTP_MIDI_MANU_LONG_CINETIX_MEDIEN_UND_INTERFACE, "Cinetix Medien und Interface GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_AG_SOLUTIONI_DIGITALI, "A&G Soluzioni Digitali" },
|
|
{ RTP_MIDI_MANU_LONG_SEQUENTIX_MUSIC_SYSTEMS, "Sequentix Music Systems" },
|
|
{ RTP_MIDI_MANU_LONG_ORAM_PRO_AUDIO, "Oram Pro Audio" },
|
|
{ RTP_MIDI_MANU_LONG_BE4_LTD, "Be4 Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_INFECTION_MUSIC, "Infection Music" },
|
|
{ RTP_MIDI_MANU_LONG_CENTRAL_MUSIC_CO_CME, "Central Music Co. (CME)" },
|
|
{ RTP_MIDI_MANU_LONG_GENOQS_MACHINES, "GenoQs Machines" },
|
|
{ RTP_MIDI_MANU_LONG_MEDIALON, "Medialon" },
|
|
{ RTP_MIDI_MANU_LONG_WAVES_AUDIO_LTD, "Waves Audio Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_JERASH_LABS, "Jerash Labs" },
|
|
{ RTP_MIDI_MANU_LONG_DA_FACT, "Da Fact" },
|
|
{ RTP_MIDI_MANU_LONG_ELBY_DESIGNS, "Elby Designs" },
|
|
{ RTP_MIDI_MANU_LONG_SPECTRAL_AUDIO, "Spectral Audio" },
|
|
{ RTP_MIDI_MANU_LONG_ARTURIA, "Arturia" },
|
|
{ RTP_MIDI_MANU_LONG_VIXID, "Vixid" },
|
|
{ RTP_MIDI_MANU_LONG_C_THRU_MUSIC, "C-Thru Music" },
|
|
{ RTP_MIDI_MANU_LONG_YA_HORNG_ELECTRONIC_CO_LTD, "Ya Horng Electronic Co LTD" },
|
|
{ RTP_MIDI_MANU_LONG_SM_PRO_AUDIO, "SM Pro Audio" },
|
|
{ RTP_MIDI_MANU_LONG_OTO_MACHINES, "OTO MACHINES" },
|
|
{ RTP_MIDI_MANU_LONG_ELZAB_SA_G_LAB, "ELZAB S.A., G LAB" },
|
|
{ RTP_MIDI_MANU_LONG_BLACKSTAR_AMPLIFICATION_LTD, "Blackstar Amplification Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_M3I_TECHNOLOGIES_GMBH, "M3i Technologies GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_GEMALTO, "Gemalto" },
|
|
{ RTP_MIDI_MANU_LONG_PROSTAGE_SL, "Prostage SL" },
|
|
{ RTP_MIDI_MANU_LONG_TEENAGE_ENGINEERING, "Teenage Engineering" },
|
|
{ RTP_MIDI_MANU_LONG_TOBIAS_ERICHSEN, "Tobias Erichsen" },
|
|
{ RTP_MIDI_MANU_LONG_NIXER_LTD, "Nixer Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_HANPIN_ELECTRON_CO_LTD, "Hanpin Electron Co Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_MIDI_HARDWARE_R_SOWA, "MIDI-hardware R.Sowa" },
|
|
{ RTP_MIDI_MANU_LONG_BEYOND_MUSIC_INDUSTRIAL_LTD, "Beyond Music Industrial Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_KISS_BOX_BV, "Kiss Box B.V." },
|
|
{ RTP_MIDI_MANU_LONG_MISA_DIGITAL_TECHNOLOGIES_LTD, "Misa Digital Technologies Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_AI_MUSICS_TECHNOLOGY_INC, "AI Musics Technology Inc" },
|
|
{ RTP_MIDI_MANU_LONG_SERATO_INC_LP, "Serato Inc LP" },
|
|
{ RTP_MIDI_MANU_LONG_LIMEX_MUSIC_HANDLES_GMBH, "Limex Music Handles GmbH" },
|
|
{ RTP_MIDI_MANU_LONG_KYODDAY_TOKAI, "Kyodday/Tokai" },
|
|
{ RTP_MIDI_MANU_LONG_MUTABLE_INSTRUMENTS, "Mutable Instruments" },
|
|
{ RTP_MIDI_MANU_LONG_PRESONUS_SOFTWARE_LTD, "PreSonus Software Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_XIRING, "Xiring" },
|
|
{ RTP_MIDI_MANU_LONG_FAIRLIGHT_INTRUMENTS_PTY_LTD, "Fairlight Instruments Pty Ltd" },
|
|
{ RTP_MIDI_MANU_LONG_MUSICOM_LAB, "Musicom Lab" },
|
|
{ RTP_MIDI_MANU_LONG_VACO_LOCO, "VacoLoco" },
|
|
{ RTP_MIDI_MANU_LONG_RWA_HONG_KONG_LIMITED, "RWA (Hong Kong) Limited" },
|
|
|
|
|
|
/* Japanese Manufacturers */
|
|
{ RTP_MIDI_MANU_LONG_CRIMSON_TECHNOLOGY_INC, "Crimson Technology Inc" },
|
|
{ RTP_MIDI_MANU_LONG_SOFTBANK_MOBILE_CORP, "Softbank Mobile Corp" },
|
|
{ RTP_MIDI_MANU_LONG_DM_HOLDINGS_INC, "D&M Holdings Inc." },
|
|
{ 0, NULL }
|
|
};
|
|
static value_string_ext rtp_midi_manu_long_values_ext = VALUE_STRING_EXT_INIT(rtp_midi_manu_long_values);
|
|
|
|
static const value_string rtp_midi_channels[] = {
|
|
{ RTP_MIDI_CHANNEL_1, "Channel 1" },
|
|
{ RTP_MIDI_CHANNEL_2, "Channel 2" },
|
|
{ RTP_MIDI_CHANNEL_3, "Channel 3" },
|
|
{ RTP_MIDI_CHANNEL_4, "Channel 4" },
|
|
{ RTP_MIDI_CHANNEL_5, "Channel 5" },
|
|
{ RTP_MIDI_CHANNEL_6, "Channel 6" },
|
|
{ RTP_MIDI_CHANNEL_7, "Channel 7" },
|
|
{ RTP_MIDI_CHANNEL_8, "Channel 8" },
|
|
{ RTP_MIDI_CHANNEL_9, "Channel 9" },
|
|
{ RTP_MIDI_CHANNEL_10, "Channel 10" },
|
|
{ RTP_MIDI_CHANNEL_11, "Channel 11" },
|
|
{ RTP_MIDI_CHANNEL_12, "Channel 12" },
|
|
{ RTP_MIDI_CHANNEL_13, "Channel 13" },
|
|
{ RTP_MIDI_CHANNEL_14, "Channel 14" },
|
|
{ RTP_MIDI_CHANNEL_15, "Channel 15" },
|
|
{ RTP_MIDI_CHANNEL_16, "Channel 16" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
|
|
|
|
static const char rtp_midi_channel_status_special_off[] = "Note Off*";
|
|
static const char rtp_midi_common_status_sysex_segment_end[] = "End of Sysex-Segment";
|
|
static const char rtp_midi_common_status_sysex_segment_start[] = "Start of Sysex-Segment";
|
|
static const char rtp_midi_common_status_sysex_segment[] = "Middle Sysex-Segment";
|
|
static const char rtp_midi_common_status_sysex_segment_complete[] = "Full Sysex-Command";
|
|
static const char rtp_midi_common_status_sysex_cancel[] = "Sysex-Cancel";
|
|
|
|
static const value_string rtp_midi_channel_status[] = {
|
|
/* Channel */
|
|
{ RTP_MIDI_STATUS_CHANNEL_NOTE_OFF, "Note Off" },
|
|
{ RTP_MIDI_STATUS_CHANNEL_NOTE_ON, "Note On" },
|
|
{ RTP_MIDI_STATUS_CHANNEL_POLYPHONIC_KEY_PRESSURE, "Polyphonic Key Pressure" },
|
|
{ RTP_MIDI_STATUS_CHANNEL_CONTROL_CHANGE, "Control Change" },
|
|
{ RTP_MIDI_STATUS_CHANNEL_PROGRAM_CHANGE, "Program Change" },
|
|
{ RTP_MIDI_STATUS_CHANNEL_CHANNEL_PRESSURE, "Channel Pressure" },
|
|
{ RTP_MIDI_STATUS_CHANNEL_PITCH_BEND_CHANGE, "Pitch Bend Change" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_common_status[] = {
|
|
/* Common 0xf0 - 0xf7 */
|
|
{ RTP_MIDI_STATUS_COMMON_SYSEX_START, "SOX: Start Of System-Exclusive / End of System-Exclusive Segment" },
|
|
{ RTP_MIDI_STATUS_COMMON_MTC_QUARTER_FRAME, "MTC Quarter Frame" },
|
|
{ RTP_MIDI_STATUS_COMMON_SONG_POSITION_POINTER, "Song Position Pointer" },
|
|
{ RTP_MIDI_STATUS_COMMON_SONG_SELECT, "Song Select" },
|
|
{ RTP_MIDI_STATUS_COMMON_UNDEFINED_F4, "Systems Exclusive Cancel" }, /* not defined, special use in RTP-MIDI */
|
|
{ RTP_MIDI_STATUS_COMMON_UNDEFINED_F5, "Undefined 0xf5" }, /* not defined */
|
|
{ RTP_MIDI_STATUS_COMMON_TUNE_REQUEST, "Tune Request" },
|
|
{ RTP_MIDI_STATUS_COMMON_SYSEX_END, "EOX: Start of System-Exclusive Segment / End of System-Exclusive" },
|
|
/* Realtime 0xf8 - 0xff */
|
|
{ RTP_MIDI_STATUS_COMMON_REALTIME_TIMING_CLOCK, "RT: Timing Clock" },
|
|
{ RTP_MIDI_STATUS_COMMON_REALTIME_MIDI_TICK, "RT: Midi Tick" }, /* undefined ??? */
|
|
{ RTP_MIDI_STATUS_COMMON_REALTIME_START, "RT: Start" },
|
|
{ RTP_MIDI_STATUS_COMMON_REALTIME_CONTINUE, "RT: Continue" },
|
|
{ RTP_MIDI_STATUS_COMMON_REALTIME_STOP, "RT: Stop" },
|
|
{ RTP_MIDI_STATUS_COMMON_REALTIME_UNDEFINED_FD, "RT: Undefined 0xfd" },
|
|
{ RTP_MIDI_STATUS_COMMON_REALTIME_ACTIVE_SENSING, "RT: Active sensing" },
|
|
{ RTP_MIDI_STATUS_COMMON_REALTIME_SYSTEM_RESET, "RT: Systems reset" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_rt_mtc_cue[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_SPECIAL, "Special" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_PUNCH_IN_POINTS, "Punch In Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_PUNCH_OUT_POINTS, "Punch Out Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_03, "(Reserved 0x03)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_04, "(Reserved 0x04)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_START_POINTS, "Event Start Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_STOP_POINTS, "Event Stop Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_START_POINTS_ADD, "Event Start Points with additional Info" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_STOP_POINTS_ADD, "Event Stop Points with additional Info" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_09, "(Reserved 0x09)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_0A, "(Reserved 0x0a)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_CUE_POINTS, "Cue Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_CUE_POINTS_ADD, "Cue Points with additional Info" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_RESERVED_0D, "(Reserved 0x0d)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUE_EVENT_NAME_ADD, "Event Name in additional Info" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
|
|
static const value_string rtp_midi_sysex_common_nrt_mtc[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_SPECIAL, "Special" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_PUNCH_IN_POINTS, "Punch In Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_PUNGH_OUT_POINTS, "Punch Out Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_PUNCH_IN_POINTS, "Delete Punch In Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_PUNCH_OUT_POINTS, "Delete Punch Out Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_START_POINT, "Event Start Point" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_STOP_POINT, "Event Stop Point" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_START_POINT_ADD, "Event Start Point with additional Info" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_STOP_POINT_ADD, "Event Stop Point with additional Info" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_EVENT_START_POINT, "Delete Event Start Point" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_EVENT_STOP_POINT, "Delete Event Stop Point" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_CUE_POINTS, "Cue Points" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_CUE_POINTS_ADD, "Cue Points with additional Info" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_DELETE_CUE_POINT, "Delete Cue Point" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC_EVENT_NAME_IN_ADD, "Event Name in additional Info" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_nrt_sd_ext[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LOOP_POINT_TRANSMISSION, "Loop Point Transmission" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LOOP_POINTS_REQUEST, "Loop Points Request" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_nrt_sd_lt[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LP_UNI, "Forwards only (unidirectional)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LP_BI, "Backwards/Forwards (bi-directional)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LP_OFF, "Off" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_nrt_gi[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_GI_IDENTITY_REQUEST, "Identity Request" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_GI_IDENTITY_REPLY, "Identity Reply" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_nrt_fd[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_FD_HEADER, "Header" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_FD_DATA_PACKET, "Data Packet" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_FD_REQUEST, "Request" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_tuning[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_TUNING_BULK_DUMP_REQUEST, "Bulk Dump Request" },
|
|
{ RTP_MIDI_SYSEX_COMMON_TUNING_BULK_DUMP_REPLY, "Bulk Dump Reply" },
|
|
{ RTP_MIDI_SYSEX_COMMON_TUNING_NOTE_CHANGE, "Note Change" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_nrt_gm[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_GM_ON, "General MIDI System On" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_GM_OFF, "General MIDI System Off" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_nrt_dls[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_DLS_LEVEL1_ON, "DLS Level 1 On" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_DLS_LEVEL1_OFF, "DLS Level 1 Off" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_DLS_LEVEL1_VOICE_ALLOCATION_OFF, "DLS Level 1 Voice Allocation Off" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_DLS_LEVEL1_VOICE_ALLOCATION_ON, "DLS Level 1 Voice Allocation On" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
|
|
static const value_string rtp_midi_sysex_common_rt_mtc[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_FULL_MESSAGE, "Full Message" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_USER_BITS, "User Bits" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_rt_show_control[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SCL_EXTENSIONS, "Extensions" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_LIGHTING, "Lighting (General Category)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_MOVING_LIGHTS, "Moving Lights" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_COLOR_CHANGERS, "Color Changers" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_STROBES, "Strobes" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SCL_LASERS, "Lasers" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SCL_CHASERS, "Chasers" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_SOUND, "Sound (General Category)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_MUSIC, "Music" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_CD_PLAYERS, "CD Players" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_EPROM_PLAYBACK, "EPROM Playback" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SCL_AUDIO_TAPE_MACHINE, "Audio Tape Machine" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_INTERCOMS, "Intercoms" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_AMPLIFIERS, "Amplifiers" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_AUDIO_EFFECTS, "Audio Effects Devices" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_EQUALIZERS, "Equalizers" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_MACHINERY, "Machinery (General Category" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_RIGGING, "Rigging" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_FLYS, "Flys" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_LIFTS, "Lifts" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_TURNTABLES, "Turntables" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_TRUSSES, "Trusses" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_ROBOTS, "Robots" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_ANIMATION, "Animation" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_FLOATS, "Floats" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_BREAKAWAYS, "Breakaways" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_BARGES, "Barges" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO, "Video (General Category" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_TAPE_MACHINES, "Video Tape Machines" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_CASSETTE_MACHINES, "Video Cassette Machines" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_DISC_PLAYERS, "Video Disc Players" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_SWITCHERS, "Video Switchers" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_EFFECT, "Video Effects" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_CHARACTER_GENERATORS, "Video Character Generators" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_STIL_STORES, "Video Still Stores" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_MONITORS, "Video Monitors" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_PROJECTION, "Projections (General)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_FILM_PROJECTORS, "Film Projectors" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_SLIDE_PROJECTORS, "Slide Projectors" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_VIDEO_PROJECTORS, "Video Projectors" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_DISSOLVERS, "Dissolvers" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_SHUTTER_CONTROLS, "Shutter Controls" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_PROCESS_CONTROL, "Process Control (General)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_HYDRAULIC_OIL, "Hydraulic Oil" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_H2O, "H2O" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_CO2, "CO2" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_COMPRESSED_AIR, "Compressed Air" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_NATURAL_GAS, "Natural Gas" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_FOG, "Fog" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_SMOKE, "Smoke" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_CRACKED_HAZE, "Cracked Haze" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_PYRO, "Pyro (General Category)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_FIREWORKS, "Fireworks" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_EXPLOSIONS, "Explosions" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_FLAME, "Flame" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_SMOKE_POTS, "Smoke Pots" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_SC_ALL_TYPES, "All Types" },
|
|
{ 0, NULL }
|
|
};
|
|
static value_string_ext rtp_midi_sysex_common_rt_show_control_ext =
|
|
VALUE_STRING_EXT_INIT(rtp_midi_sysex_common_rt_show_control);
|
|
|
|
static const value_string rtp_midi_sysex_common_rt_notations[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_NT_BAR_NUMBER, "Bar Number" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_NT_TIME_SIGNATURE_IMMEDIATE, "Time Signature (Immediate)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_NT_TIME_SIGNATURE_DELAYED, "Time Signature (Delayed)" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sysex_common_rt_device_control[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_DC_MASTER_VOLUME, "Master Volume" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_DC_MASTER_BALANCE, "Master Balance" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
|
|
/* TODO: Add MMC Commands */
|
|
static const value_string rtp_midi_sysex_common_rt_mmc_commands[] = {
|
|
{ 0, NULL }
|
|
};
|
|
|
|
/* TODO: Add MMC Responses */
|
|
static const value_string rtp_midi_sysex_common_rt_mmc_responses[] = {
|
|
{ 0, NULL }
|
|
};
|
|
|
|
|
|
|
|
static const value_string rtp_midi_sysex_common_nrt[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DUMP_HEADER, "Common NRT: Sample Dump Header" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DATA_PACKET, "Common NRT: Sample Data Packet" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DUMP_REQUEST, "Common NRT: Sample Dump Request" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MTC, "Common NRT: MIDI Time Code (MTC)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DUMP_EXTENSIONS, "Common NRT: Sample Dump Extensions" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_GENERAL_INFORMATION, "Common NRT: General Information" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_FILE_DUMP, "Common NRT: File Dump" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_MIDI_TUNING_STANDARD, "Common NRT: Midi Tuning Standard" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_GENERAL_MIDI, "Common NRT: General MIDI (GM)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_DOWNLOADABLE_SOUNDS, "Common NRT: Downloadable Sounds (DLS)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_END_OF_FILE, "Common NRT: End Of File" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_WAIT, "Common NRT: Wait" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_CANCEL, "Common NRT: Cancel" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_NAK, "Common NRT: NAK" },
|
|
{ RTP_MIDI_SYSEX_COMMON_NRT_ACK, "Common NRT: ACK" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
|
|
static const value_string rtp_midi_sysex_common_rt[] = {
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MIDI_TIME_CODE, "Common RT: MIDI Time Code (MTC)" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MIDI_SHOW_CONTROL, "Common RT: MIDI Show Control" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_NOTATION_INFORMATION, "Common RT: Notation Information" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_DEVICE_CONTROL, "Common RT: Device Control" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MTC_CUEING, "Common RT: Real Time MTC Cueing" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MIDI_MACHINE_CONTROL_COMMAND, "Common RT: MIDI Machine Control Command" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MIDI_MACHINE_CONTROL_RESPONSE, "Common RT: MIDI Machine Control Response" },
|
|
{ RTP_MIDI_SYSEX_COMMON_RT_MIDI_TUNING_STANDARD, "Common RT: MIDI Tuning Standard" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
|
|
|
|
static const value_string rtp_midi_js_tot_channels[] = {
|
|
{ 0, "1 channel" },
|
|
{ 1, "2 channels" },
|
|
{ 2, "3 channels" },
|
|
{ 3, "4 channels" },
|
|
{ 4, "5 channels" },
|
|
{ 5, "6 channels" },
|
|
{ 6, "7 channels" },
|
|
{ 7, "8 channels" },
|
|
{ 8, "9 channels" },
|
|
{ 9, "10 channels" },
|
|
{ 10, "11 channels" },
|
|
{ 11, "12 channels" },
|
|
{ 12, "13 channels" },
|
|
{ 13, "14 channels" },
|
|
{ 14, "15 channels" },
|
|
{ 15, "16 channels" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_qft_values[] = {
|
|
{ RTP_MIDI_COMMON_MTC_QF_FRAME_LS_NIBBLE, "Frame count LS nibble" },
|
|
{ RTP_MIDI_COMMON_MTC_QF_FRAME_MS_NIBBLE, "Frame count MS nibble" },
|
|
{ RTP_MIDI_COMMON_MTC_QF_SECONDS_LS_NIBBLE, "Seconds count LS nibble" },
|
|
{ RTP_MIDI_COMMON_MTC_QF_SECONDS_MS_NIBBLE, "Seconds count MS nibble" },
|
|
{ RTP_MIDI_COMMON_MTC_QF_MINUTES_LS_NIBBLE, "Minutes count LS nibble" },
|
|
{ RTP_MIDI_COMMON_MTC_QF_MINUTES_MS_NIBBLE, "Minutes count MS nibble" },
|
|
{ RTP_MIDI_COMMON_MTC_QF_HOURS_LS_NIBBLE, "Hours count LS nibble" },
|
|
{ RTP_MIDI_COMMON_MTC_QF_HOURS_MS_NIBBLE, "Hours count MS nibble" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_sj_chapter_d_syscom_dsz_values[] = {
|
|
{ 0, "Command has 0 octets" },
|
|
{ 1, "Command has 1 octet" },
|
|
{ 2, "Command has 2 octets" },
|
|
{ 3, "Command has 3 or more octets" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string rtp_midi_mtc_fm_type_values[] = {
|
|
{ 0, "24 Frames/Second" },
|
|
{ 1, "25 Frames/Second" },
|
|
{ 2, "30 Frames/Second (drop frame)" },
|
|
{ 3, "30 Frames/Second (non-drop frame)" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cs_flag_b= {
|
|
"Long Header: 2 octets",
|
|
"Short Header: 1 octet"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cs_flag_j= {
|
|
"Journal present",
|
|
"No Journal present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cs_flag_z= {
|
|
"Delta-Time present for first MIDI-command",
|
|
"No Delta-Time for first MIDI-command"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cs_flag_p= {
|
|
"Status byte was NOT present in original MIDI-command",
|
|
"Status byte was present in original MIDI-command"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_js_flag_y = {
|
|
"System-journal present",
|
|
"System-journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_js_flag_s = {
|
|
"Standard journal behaviour",
|
|
"Journal encodes data in preceding RTP-packet"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_js_flag_a = {
|
|
"Channel-journal present",
|
|
"Channel-journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_js_flag_h = {
|
|
"Enhanced Encoding",
|
|
"Standard Encoding"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_flag_d = {
|
|
"Chapter D journal present",
|
|
"Chapter D journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_flag_v = {
|
|
"Chapter V journal present",
|
|
"Chapter V journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_flag_q = {
|
|
"Chapter Q journal present",
|
|
"Chapter Q journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_flag_f = {
|
|
"Chapter F journal present",
|
|
"Chapter F journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_flag_x = {
|
|
"Chapter X journal present",
|
|
"Chapter X journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_flag_p = {
|
|
"Chapter P journal present",
|
|
"Chapter P journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_flag_c = {
|
|
"Chapter C journal present",
|
|
"Chapter C journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_flag_m = {
|
|
"Chapter M journal present",
|
|
"Chapter M journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_flag_w = {
|
|
"Chapter W journal present",
|
|
"Chapter W journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_flag_n = {
|
|
"Chapter N journal present",
|
|
"Chapter N journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_flag_e = {
|
|
"Chapter E journal present",
|
|
"Chapter E journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_flag_t = {
|
|
"Chapter T journal present",
|
|
"Chapter T journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_flag_a = {
|
|
"Chapter A journal present",
|
|
"Chapter A journal NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_c_flag_a = {
|
|
"Alternative Coding",
|
|
"Value Coding"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_flag_p = {
|
|
"Pending field is encoded",
|
|
"Pending field is NOT encoded"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_flag_e = {
|
|
"Initiated transaction is in progress",
|
|
"NO transaction in progress"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_flag_u = {
|
|
"All parameters are RPNs",
|
|
"Parameters may include NRPNs"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_flag_w = {
|
|
"All parameters are NRPNs",
|
|
"Parameters may include RPNs"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_flag_z = {
|
|
"Only LSB parameters",
|
|
"Parameters may have LSB & MSB"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_flag_q = {
|
|
"Pending encodes NRPN MSB",
|
|
"Pending encodes RPN MSB"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_q = {
|
|
"NRPN parameter encoded",
|
|
"RPN parameter encoded"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_j = {
|
|
"ENTRY-MSB field present",
|
|
"ENTRY-MSB field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_k = {
|
|
"ENTRY-LSB field present",
|
|
"ENTRY-LSB field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_l = {
|
|
"A-Button field present",
|
|
"A-Button field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_m = {
|
|
"C-Button field present",
|
|
"C-Button field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_n = {
|
|
"Count field present",
|
|
"Count field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_t = {
|
|
"Count Tool used",
|
|
"Count Tool NOT used"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_v = {
|
|
"Value Tool used",
|
|
"Value Tool NOT used"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_r = {
|
|
"Reserved-Flag set",
|
|
"Reserved-Flag NOT set"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_x = {
|
|
"Precedes most recent Control Change command for ctrl=121",
|
|
"Does not precede most recent Control Change command for ctrl=121"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_m_log_flag_g = {
|
|
"negative value",
|
|
"positive value"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_n_log_flag_y = {
|
|
"Execute Note-On",
|
|
"Skip Note-On"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_e_log_flag_v = {
|
|
"Encodes Note-Off velocity",
|
|
"Encodes Note-On/Off count"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_a_log_flag_x = {
|
|
"Precedes most recent Control Change command for ctrl=123-127",
|
|
"Does not precede most recent Control Change command for ctrl=123-127"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_cj_chapter_p_log_flag_x = {
|
|
"Reset all controllers received between MSB and LSB",
|
|
"NO Reset all controllers received between MSB and LSB"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_flag_b = {
|
|
"Reset field present",
|
|
"Reset field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_flag_g = {
|
|
"Tune request field present",
|
|
"Tune request field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_flag_h = {
|
|
"Song select field present",
|
|
"Song select field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_flag_j = {
|
|
"Undefined system common 0xF4 field present",
|
|
"Undefined system common 0xF4 field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_flag_k = {
|
|
"Undefined system common 0xF5 field present",
|
|
"Undefined system common 0xF5 field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_flag_y = {
|
|
"Undefined system common 0xF9 field present",
|
|
"Undefined system common 0xF9 field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_flag_z = {
|
|
"Undefined system common 0xFD field present",
|
|
"Undefined system common 0xFD field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_syscom_flag_c = {
|
|
"Count field present",
|
|
"Count field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_syscom_flag_v = {
|
|
"Value field present",
|
|
"Value field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_d_syscom_flag_l = {
|
|
"Legal field present",
|
|
"Legal field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_q_flag_n = {
|
|
"Active Start / Continue",
|
|
"NO active Start / Stop Continue"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_q_flag_d = {
|
|
"Song position already reached",
|
|
"Song position yet to be reached"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_q_flag_c = {
|
|
"Clock field present",
|
|
"Clock field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_q_flag_t = {
|
|
"Timetools field present",
|
|
"Timetools field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_f_flag_c = {
|
|
"Complete field present",
|
|
"Complete field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_f_flag_p = {
|
|
"Partial field present",
|
|
"Partial field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_f_flag_q = {
|
|
"Complete field contains quarter frames",
|
|
"Complete field contains full frame format"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_f_flag_d = {
|
|
"Tape head is moving reverse",
|
|
"Tape head is moving forward or undefined"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_x_flag_t = {
|
|
"TCOUNT field present",
|
|
"TCOUNT field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_x_flag_c = {
|
|
"COUNT field present",
|
|
"COUNT field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_x_flag_f = {
|
|
"FIRST field present",
|
|
"FIRST field NOT present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_x_flag_d = {
|
|
"DATA field present",
|
|
"DATA field not present"
|
|
};
|
|
|
|
static const true_false_string rtp_midi_sj_chapter_x_flag_l = {
|
|
"List Tool used",
|
|
"Recency Tool used"
|
|
};
|
|
|
|
|
|
|
|
static int hf_rtp_midi_bflag = -1;
|
|
static int hf_rtp_midi_jflag = -1;
|
|
static int hf_rtp_midi_zflag = -1;
|
|
static int hf_rtp_midi_pflag = -1;
|
|
static int hf_rtp_midi_shortlen = -1;
|
|
static int hf_rtp_midi_longlen = -1;
|
|
|
|
static int hf_rtp_midi_sflag = -1;
|
|
static int hf_rtp_midi_yflag = -1;
|
|
static int hf_rtp_midi_aflag = -1;
|
|
static int hf_rtp_midi_hflag = -1;
|
|
static int hf_rtp_midi_totchan = -1;
|
|
static int hf_rtp_midi_check_seq_num = -1;
|
|
|
|
static int hf_rtp_midi_deltatime1 = -1;
|
|
static int hf_rtp_midi_deltatime2 = -1;
|
|
static int hf_rtp_midi_deltatime3 = -1;
|
|
static int hf_rtp_midi_deltatime4 = -1;
|
|
|
|
static int hf_rtp_midi_channel_status = -1;
|
|
static int hf_rtp_midi_common_status = -1;
|
|
static int hf_rtp_midi_channel = -1;
|
|
static int hf_rtp_midi_note = -1;
|
|
static int hf_rtp_midi_velocity = -1;
|
|
static int hf_rtp_midi_pressure = -1;
|
|
static int hf_rtp_midi_controller = -1;
|
|
static int hf_rtp_midi_controller_value = -1;
|
|
static int hf_rtp_midi_program = -1;
|
|
static int hf_rtp_midi_channel_pressure = -1;
|
|
static int hf_rtp_midi_pitch_bend = -1;
|
|
static int hf_rtp_midi_pitch_bend_truncated = -1;
|
|
|
|
static int hf_rtp_midi_manu_short = -1;
|
|
static int hf_rtp_midi_manu_long = -1;
|
|
|
|
static int hf_rtp_midi_sysjour_toc_s = -1;
|
|
static int hf_rtp_midi_sysjour_toc_d = -1;
|
|
static int hf_rtp_midi_sysjour_toc_v = -1;
|
|
static int hf_rtp_midi_sysjour_toc_q = -1;
|
|
static int hf_rtp_midi_sysjour_toc_f = -1;
|
|
static int hf_rtp_midi_sysjour_toc_x = -1;
|
|
static int hf_rtp_midi_sysjour_len = -1;
|
|
|
|
static int hf_rtp_midi_chanjour_sflag = -1;
|
|
static int hf_rtp_midi_chanjour_chan = -1;
|
|
static int hf_rtp_midi_chanjour_hflag = -1;
|
|
static int hf_rtp_midi_chanjour_len = -1;
|
|
static int hf_rtp_midi_chanjour_toc_p = -1;
|
|
static int hf_rtp_midi_chanjour_toc_c = -1;
|
|
static int hf_rtp_midi_chanjour_toc_m = -1;
|
|
static int hf_rtp_midi_chanjour_toc_w = -1;
|
|
static int hf_rtp_midi_chanjour_toc_n = -1;
|
|
static int hf_rtp_midi_chanjour_toc_e = -1;
|
|
static int hf_rtp_midi_chanjour_toc_t = -1;
|
|
static int hf_rtp_midi_chanjour_toc_a = -1;
|
|
|
|
static int hf_rtp_midi_cj_chapter_p_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_p_program = -1;
|
|
static int hf_rtp_midi_cj_chapter_p_bflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_p_bank_msb = -1;
|
|
static int hf_rtp_midi_cj_chapter_p_xflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_p_bank_lsb = -1;
|
|
|
|
static int hf_rtp_midi_cj_chapter_c_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_c_length = -1;
|
|
static int hf_rtp_midi_cj_chapter_c_number = -1;
|
|
static int hf_rtp_midi_cj_chapter_c_aflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_c_value = -1;
|
|
static int hf_rtp_midi_cj_chapter_c_tflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_c_alt = -1;
|
|
|
|
static int hf_rtp_midi_cj_chapter_m_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_pflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_eflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_uflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_wflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_zflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_length = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_qflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_pending = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_pnum_lsb = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_qflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_pnum_msb = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_jflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_kflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_lflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_mflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_nflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_tflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_vflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_rflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_msb = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_msb_x = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_msb_entry = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_lsb = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_lsb_x = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_lsb_entry = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_a_button_g = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_a_button_x = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_a_button = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_a_button_full = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_c_button = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_c_button_g = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_c_button_r = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_c_button_full = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_count = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_count_x = -1;
|
|
static int hf_rtp_midi_cj_chapter_m_log_count_full = -1;
|
|
|
|
static int hf_rtp_midi_cj_chapter_w_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_w_first = -1;
|
|
static int hf_rtp_midi_cj_chapter_w_rflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_w_second = -1;
|
|
|
|
static int hf_rtp_midi_cj_chapter_n_bflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_n_len = -1;
|
|
static int hf_rtp_midi_cj_chapter_n_low = -1;
|
|
static int hf_rtp_midi_cj_chapter_n_high = -1;
|
|
static int hf_rtp_midi_cj_chapter_n_log_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_n_log_notenum = -1;
|
|
static int hf_rtp_midi_cj_chapter_n_log_yflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_n_log_velocity = -1;
|
|
static int hf_rtp_midi_cj_chapter_n_log_octet = -1;
|
|
|
|
static int hf_rtp_midi_cj_chapter_e_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_e_len = -1;
|
|
static int hf_rtp_midi_cj_chapter_e_log_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_e_log_notenum = -1;
|
|
static int hf_rtp_midi_cj_chapter_e_log_vflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_e_log_velocity = -1;
|
|
static int hf_rtp_midi_cj_chapter_e_log_count = -1;
|
|
|
|
static int hf_rtp_midi_cj_chapter_t_channel_aftertouch = -1;
|
|
static int hf_rtp_midi_cj_chapter_t_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_t_pressure = -1;
|
|
|
|
static int hf_rtp_midi_cj_chapter_a_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_a_len = -1;
|
|
static int hf_rtp_midi_cj_chapter_a_log_sflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_a_log_notenum = -1;
|
|
static int hf_rtp_midi_cj_chapter_a_log_xflag = -1;
|
|
static int hf_rtp_midi_cj_chapter_a_log_pressure = -1;
|
|
|
|
static int hf_rtp_midi_sj_chapter_v = -1;
|
|
static int hf_rtp_midi_sj_chapter_v_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_v_count = -1;
|
|
|
|
static int hf_rtp_midi_sj_chapter_d_simple_system_commands = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_bflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_gflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_hflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_jflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_kflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_yflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_zflag = -1;
|
|
|
|
static int hf_rtp_midi_sj_chapter_d_reset = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_reset_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_reset_count = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_tune = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_tune_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_tune_count = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_song_sel = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_song_sel_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_song_sel_value = -1;
|
|
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_cflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_vflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_lflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_dsz = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_length = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_count = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_value = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_legal = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_syscom_data = -1;
|
|
|
|
static int hf_rtp_midi_sj_chapter_d_sysreal_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_sysreal_cflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_sysreal_lflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_sysreal_length = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_sysreal_count = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_sysreal_legal = -1;
|
|
static int hf_rtp_midi_sj_chapter_d_sysreal_data = -1;
|
|
|
|
static int hf_rtp_midi_sj_chapter_q_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_q_nflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_q_dflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_q_cflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_q_tflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_q_top = -1;
|
|
static int hf_rtp_midi_sj_chapter_q_clock = -1;
|
|
static int hf_rtp_midi_sj_chapter_q_timetools = -1;
|
|
|
|
static int hf_rtp_midi_sj_chapter_f_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_cflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_pflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_qflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_dflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_point = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_complete = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_partial = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_mt0 = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_mt1 = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_mt2 = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_mt3 = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_mt4 = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_mt5 = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_mt6 = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_mt7 = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_hr = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_mn = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_sc = -1;
|
|
static int hf_rtp_midi_sj_chapter_f_fr = -1;
|
|
|
|
static int hf_rtp_midi_sj_chapter_x_sflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_tflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_cflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_fflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_dflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_lflag = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_sta = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_tcount = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_count = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_first1 = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_first2 = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_first3 = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_first4 = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_data = -1;
|
|
static int hf_rtp_midi_sj_chapter_x_invalid_data = -1;
|
|
|
|
static int hf_rtp_midi_quarter_frame_type = -1;
|
|
static int hf_rtp_midi_quarter_frame_value = -1;
|
|
static int hf_rtp_midi_spp_truncated = -1;
|
|
static int hf_rtp_midi_spp = -1;
|
|
static int hf_rtp_midi_song_select = -1;
|
|
static int hf_rtp_midi_manu_data = -1;
|
|
static int hf_rtp_midi_edu_data = -1;
|
|
static int hf_rtp_midi_unknown_data = -1;
|
|
static int hf_rtp_midi_sysex_common_non_realtime = -1;
|
|
static int hf_rtp_midi_sysex_common_realtime = -1;
|
|
static int hf_rtp_midi_sysex_common_device_id = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_ext = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_gi = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_fd = -1;
|
|
static int hf_rtp_midi_sysex_common_tuning = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_gm = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_dls = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_rt_mtc = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_sc = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_ni = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_dc = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_cueing = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mmc_commands = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mmc_responses = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_nrt_gi_device_family = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_gi_device_family_member = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_gi_software_rev = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_packet_number = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_header_sn = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_header_sf = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_header_sp = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_header_sl = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_header_ls = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_header_le = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_header_lt = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_packet_count = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_packet_check = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_packet_data = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_nrt_sd_ext_ln = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_nrt_fd_device_id = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_fd_type = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_fd_name = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_fd_length = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_fd_packet_num = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_fd_byte_count = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_fd_packet_data = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_fd_checksum = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_tune_program = -1;
|
|
static int hf_rtp_midi_sysex_common_tune_name = -1;
|
|
static int hf_rtp_midi_sysex_common_tune_freq = -1;
|
|
static int hf_rtp_midi_sysex_common_tune_checksum = -1;
|
|
static int hf_rtp_midi_sysex_common_tune_changes = -1;
|
|
static int hf_rtp_midi_sysex_common_tune_note = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_fm_type = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_fm_hr = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_fm_mn = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_fm_sc = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_fm_fr = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_ub_u1 = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_ub_u2 = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_ub_u3 = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_ub_u4 = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_ub_u5 = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_ub_u6 = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_ub_u7 = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_ub_u8 = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_ub_u9 = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc_type = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc_hr = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc_mn = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc_sc = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc_fr = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc_ff = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc_enl = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc_enm = -1;
|
|
static int hf_rtp_midi_sysex_common_nrt_mtc_add = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_cue_enl = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_cue_enm = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_mtc_cue_add = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_rt_ni_bar_num = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_ni_bytes = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_ni_numerator = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_ni_denominator = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_ni_midi_clocks = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_ni_32nds = -1;
|
|
|
|
static int hf_rtp_midi_sysex_common_rt_dc_volume = -1;
|
|
static int hf_rtp_midi_sysex_common_rt_dc_balance = -1;
|
|
|
|
|
|
/* RTP MIDI fields defining a subtree */
|
|
|
|
static gint ett_rtp_midi = -1;
|
|
static gint ett_rtp_midi_commands = -1;
|
|
static gint ett_rtp_midi_journal = -1;
|
|
static gint ett_rtp_midi_command = -1;
|
|
static gint ett_rtp_midi_systemjournal = -1;
|
|
static gint ett_rtp_midi_channeljournals = -1;
|
|
static gint ett_rtp_midi_systemchapters = -1;
|
|
static gint ett_rtp_midi_sj_chapter_d = -1;
|
|
static gint ett_rtp_midi_sj_chapter_d_field_b = -1;
|
|
static gint ett_rtp_midi_sj_chapter_d_field_g = -1;
|
|
static gint ett_rtp_midi_sj_chapter_d_field_h = -1;
|
|
static gint ett_rtp_midi_sj_chapter_d_field_j = -1;
|
|
static gint ett_rtp_midi_sj_chapter_d_field_k = -1;
|
|
static gint ett_rtp_midi_sj_chapter_d_field_y = -1;
|
|
static gint ett_rtp_midi_sj_chapter_d_field_z = -1;
|
|
static gint ett_rtp_midi_sj_chapter_v = -1;
|
|
static gint ett_rtp_midi_sj_chapter_q = -1;
|
|
static gint ett_rtp_midi_sj_chapter_f = -1;
|
|
static gint ett_rtp_midi_sj_chapter_f_complete = -1;
|
|
static gint ett_rtp_midi_sj_chapter_f_partial = -1;
|
|
static gint ett_rtp_midi_sj_chapter_x = -1;
|
|
static gint ett_rtp_midi_sj_chapter_x_first = -1;
|
|
static gint ett_rtp_midi_sj_chapter_x_data = -1;
|
|
static gint ett_rtp_midi_channeljournal = -1;
|
|
static gint ett_rtp_midi_channelchapters = -1;
|
|
static gint ett_rtp_midi_cj_chapter_p = -1;
|
|
static gint ett_rtp_midi_cj_chapter_c = -1;
|
|
static gint ett_rtp_midi_cj_chapter_c_loglist = -1;
|
|
static gint ett_rtp_midi_cj_chapter_c_logitem = -1;
|
|
static gint ett_rtp_midi_cj_chapter_m = -1;
|
|
static gint ett_rtp_midi_cj_chapter_m_loglist = -1;
|
|
static gint ett_rtp_midi_cj_chapter_m_logitem = -1;
|
|
static gint ett_rtp_midi_cj_chapter_m_log_msb = -1;
|
|
static gint ett_rtp_midi_cj_chapter_m_log_lsb = -1;
|
|
static gint ett_rtp_midi_cj_chapter_m_log_a_button = -1;
|
|
static gint ett_rtp_midi_cj_chapter_m_log_c_button = -1;
|
|
static gint ett_rtp_midi_cj_chapter_m_log_count = -1;
|
|
static gint ett_rtp_midi_cj_chapter_w = -1;
|
|
static gint ett_rtp_midi_cj_chapter_n = -1;
|
|
static gint ett_rtp_midi_cj_chapter_n_loglist = -1;
|
|
static gint ett_rtp_midi_cj_chapter_n_logitem = -1;
|
|
static gint ett_rtp_midi_cj_chapter_n_octets = -1;
|
|
static gint ett_rtp_midi_cj_chapter_e = -1;
|
|
static gint ett_rtp_midi_cj_chapter_e_loglist = -1;
|
|
static gint ett_rtp_midi_cj_chapter_e_logitem = -1;
|
|
static gint ett_rtp_midi_cj_chapter_t = -1;
|
|
static gint ett_rtp_midi_cj_chapter_a = -1;
|
|
static gint ett_rtp_midi_cj_chapter_a_loglist = -1;
|
|
static gint ett_rtp_midi_cj_chapter_a_logitem = -1;
|
|
static gint ett_rtp_midi_sysex_data = -1;
|
|
static gint ett_rtp_midi_sysex_edu = -1;
|
|
static gint ett_rtp_midi_sysex_manu = -1;
|
|
static gint ett_rtp_midi_sysex_common_rt = -1;
|
|
static gint ett_rtp_midi_sysex_common_nrt = -1;
|
|
static gint ett_rtp_midi_sysex_common_tune_note = -1;
|
|
|
|
|
|
static guint rtp_midi_payload_type_value = 0;
|
|
static guint saved_payload_type_value;
|
|
|
|
|
|
static int proto_rtp_midi = -1;
|
|
|
|
|
|
|
|
|
|
void proto_reg_handoff_rtp_midi( void );
|
|
|
|
|
|
/*
|
|
* This decodes the delta-time before a MIDI-command
|
|
*/
|
|
static int
|
|
decodetime(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset)
|
|
{
|
|
guint8 octet;
|
|
unsigned int consumed;
|
|
unsigned int i;
|
|
unsigned int deltatime;
|
|
|
|
consumed = 0;
|
|
deltatime = 0;
|
|
|
|
|
|
/* RTP-MIDI deltatime is "compressed" using only the necessary amount of octets */
|
|
for ( i=0; i < 4; i++ ) {
|
|
|
|
octet = tvb_get_guint8( tvb, offset + consumed );
|
|
deltatime = ( deltatime << 7 ) | ( octet & RTP_MIDI_DELTA_TIME_OCTET_MASK );
|
|
consumed++;
|
|
|
|
if ( ( octet & RTP_MIDI_DELTA_TIME_EXTENSION ) == 0 ) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
switch (consumed) {
|
|
case 1:
|
|
proto_tree_add_uint ( tree, hf_rtp_midi_deltatime1, tvb, offset, consumed, deltatime );
|
|
break;
|
|
case 2:
|
|
proto_tree_add_uint ( tree, hf_rtp_midi_deltatime2, tvb, offset, consumed, deltatime );
|
|
break;
|
|
case 3:
|
|
proto_tree_add_uint ( tree, hf_rtp_midi_deltatime3, tvb, offset, consumed, deltatime );
|
|
break;
|
|
case 4:
|
|
proto_tree_add_uint ( tree, hf_rtp_midi_deltatime4, tvb, offset, consumed, deltatime );
|
|
break;
|
|
|
|
}
|
|
|
|
return consumed;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Here a Note-Off command is decoded.
|
|
*/
|
|
static int
|
|
decode_note_off(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned int cmd_count, unsigned int offset, guint8 status, unsigned int rsoffset, gboolean using_rs ) {
|
|
|
|
guint8 note;
|
|
guint8 velocity;
|
|
const gchar *status_str;
|
|
const gchar *note_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( status >> 4, rtp_midi_channel_status, rtp_midi_unknown_value_hex );
|
|
note = tvb_get_guint8( tvb, offset );
|
|
note_str = val_to_str_ext( note, &rtp_midi_note_values_ext, rtp_midi_unknown_value_dec );
|
|
velocity = tvb_get_guint8( tvb, offset + 1 );
|
|
|
|
if ( using_rs ) {
|
|
command_tree = proto_tree_add_subtree_format( tree, tvb, offset, 2, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, n=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, velocity );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_note, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_velocity, tvb, offset + 1, 1, ENC_BIG_ENDIAN );
|
|
} else {
|
|
command_tree = proto_tree_add_subtree_format(tree, tvb, offset - 1, 3, ett_rtp_midi_command , NULL,
|
|
"%s (c=%d, n=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, velocity );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_note, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_velocity, tvb, offset + 1, 1, ENC_BIG_ENDIAN );
|
|
}
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s (c=%d, n=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, velocity );
|
|
} else {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s (c=%d, n=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, velocity );
|
|
}
|
|
return 2;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here a Note-On command is decoded.
|
|
*/
|
|
static int
|
|
decode_note_on(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned int cmd_count, unsigned int offset, guint8 status, unsigned int rsoffset, gboolean using_rs ) {
|
|
|
|
guint8 note;
|
|
guint8 velocity;
|
|
const gchar *status_str;
|
|
const gchar *note_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( status >> 4, rtp_midi_channel_status, rtp_midi_unknown_value_hex );
|
|
note = tvb_get_guint8( tvb, offset );
|
|
note_str = val_to_str_ext( note, &rtp_midi_note_values_ext, rtp_midi_unknown_value_dec );
|
|
velocity = tvb_get_guint8( tvb, offset + 1 );
|
|
|
|
/* special case velocity=0 for Note-On means Note-Off (to preserve running-status!) */
|
|
if ( velocity == 0 ) {
|
|
status_str = rtp_midi_channel_status_special_off;
|
|
}
|
|
|
|
if ( using_rs ) {
|
|
command_tree = proto_tree_add_subtree_format( tree, tvb, offset, 2, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, n=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, velocity );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_note, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_velocity, tvb, offset + 1, 1, ENC_BIG_ENDIAN );
|
|
} else {
|
|
command_tree = proto_tree_add_subtree_format(tree, tvb, offset - 1, 3, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, n=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, velocity );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_note, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_velocity, tvb, offset + 1, 1, ENC_BIG_ENDIAN);
|
|
}
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s (c=%d, n=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, velocity );
|
|
} else {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s (c=%d, n=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, velocity );
|
|
}
|
|
return 2;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Here polyphonic aftertouch is decoded.
|
|
*/
|
|
static int
|
|
decode_poly_pressure(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned int cmd_count, unsigned int offset, guint8 status, unsigned int rsoffset, gboolean using_rs ) {
|
|
|
|
guint8 note;
|
|
guint8 pressure;
|
|
const gchar *status_str;
|
|
const gchar *note_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( status >> 4, rtp_midi_channel_status, rtp_midi_unknown_value_hex );
|
|
note = tvb_get_guint8( tvb, offset );
|
|
note_str = val_to_str_ext( note, &rtp_midi_note_values_ext, rtp_midi_unknown_value_dec );
|
|
pressure = tvb_get_guint8( tvb, offset + 1 );
|
|
|
|
if ( using_rs ) {
|
|
command_tree = proto_tree_add_subtree_format( tree, tvb, offset, 2, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, n=%s, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, pressure );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_note, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_pressure, tvb, offset + 1, 1, ENC_BIG_ENDIAN );
|
|
} else {
|
|
command_tree = proto_tree_add_subtree_format(tree, tvb, offset - 1, 3, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, n=%s, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, pressure );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_note, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_pressure, tvb, offset + 1, 1, ENC_BIG_ENDIAN);
|
|
}
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s (c=%d, n=%s, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, pressure );
|
|
} else {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s (c=%d, n=%s, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, note_str, pressure );
|
|
}
|
|
return 2;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here channel aftertouch is decoded.
|
|
*/
|
|
static int
|
|
decode_channel_pressure(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned int cmd_count, unsigned int offset, guint8 status, unsigned int rsoffset, gboolean using_rs ) {
|
|
|
|
guint8 pressure;
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( status >> 4, rtp_midi_channel_status, rtp_midi_unknown_value_hex );
|
|
pressure = tvb_get_guint8( tvb, offset );
|
|
|
|
if ( using_rs ) {
|
|
command_tree = proto_tree_add_subtree_format( tree, tvb, offset, 1, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, pressure );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_pressure, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
} else {
|
|
command_tree = proto_tree_add_subtree_format(tree, tvb, offset - 1, 2, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, pressure );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_pressure, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
}
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s (c=%d, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, pressure );
|
|
} else {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s (c=%d, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, pressure );
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Here pitch-bend is decoded.
|
|
*/
|
|
static int
|
|
decode_pitch_bend_change(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset, guint8 status, unsigned int rsoffset, gboolean using_rs ) {
|
|
|
|
guint8 octet1;
|
|
guint8 octet2;
|
|
guint8 pitch;
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( status >> 4, rtp_midi_channel_status, rtp_midi_unknown_value_hex );
|
|
octet1 = tvb_get_guint8( tvb, offset );
|
|
octet2 = tvb_get_guint8( tvb, offset + 1 );
|
|
pitch = ( octet1 << 7 ) | octet2;
|
|
|
|
if ( using_rs ) {
|
|
command_tree = proto_tree_add_subtree_format( tree, tvb, offset, 2, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, pb=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, pitch );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_pitch_bend, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
} else {
|
|
command_tree = proto_tree_add_subtree_format(tree, tvb, offset - 1, 3, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, pb=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, pitch );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_pitch_bend, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
}
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s (c=%d, pb=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, pitch );
|
|
} else {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s (c=%d, pb=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, pitch );
|
|
}
|
|
return 2;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Here program_change is decoded.
|
|
*/
|
|
static int
|
|
decode_program_change(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned int cmd_count, unsigned int offset, guint8 status, unsigned int rsoffset, gboolean using_rs ) {
|
|
|
|
guint8 program;
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( status >> 4, rtp_midi_channel_status, rtp_midi_unknown_value_hex );
|
|
program = tvb_get_guint8( tvb, offset );
|
|
|
|
if ( using_rs ) {
|
|
command_tree = proto_tree_add_subtree_format( tree, tvb, offset, 1, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, program );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_program, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
} else {
|
|
command_tree = proto_tree_add_subtree_format(tree, tvb, offset - 1, 2, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, program );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_program, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
}
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s (c=%d, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, program );
|
|
} else {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s (c=%d, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, program );
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Here control change is decoded.
|
|
*/
|
|
static int
|
|
decode_control_change(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned int cmd_count, unsigned int offset, guint8 status, unsigned int rsoffset, gboolean using_rs ) {
|
|
|
|
guint8 controller;
|
|
guint8 value;
|
|
const gchar *status_str;
|
|
const gchar *ctrl_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( status >> 4, rtp_midi_channel_status, rtp_midi_unknown_value_hex );
|
|
controller = tvb_get_guint8( tvb, offset );
|
|
ctrl_str = val_to_str_ext( controller, &rtp_midi_controller_values_ext, "Unknown: %d" );
|
|
value = tvb_get_guint8( tvb, offset + 1 );
|
|
|
|
if ( using_rs ) {
|
|
command_tree = proto_tree_add_subtree_format( tree, tvb, offset, 2, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, ctrl=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, ctrl_str, value );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, rsoffset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_controller, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_controller_value, tvb, offset + 1, 1, ENC_BIG_ENDIAN );
|
|
} else {
|
|
command_tree = proto_tree_add_subtree_format(tree, tvb, offset - 1, 3, ett_rtp_midi_command, NULL,
|
|
"%s (c=%d, ctrl=%s, v=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, ctrl_str, value );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_channel, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_controller, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_controller_value, tvb, offset + 1, 1, ENC_BIG_ENDIAN);
|
|
}
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s (c=%d, ctrl=%s, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, ctrl_str, value );
|
|
} else {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s (c=%d, ctrl=%s, p=%d)", status_str, ( status & RTP_MIDI_CHANNEL_MASK ) + 1, ctrl_str, value );
|
|
}
|
|
return 2;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime Sample Dump Header command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_sd_hdr( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
unsigned int start_offset = offset;
|
|
|
|
/* sample number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_sn, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
|
|
/* sample format */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_sf, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* sample period */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_sp, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
offset += 3;
|
|
|
|
/* sample length */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_sl, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
offset += 3;
|
|
|
|
/* loop start */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_ls, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
offset += 3;
|
|
|
|
/* loop end */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_le, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
offset += 3;
|
|
|
|
/* loop type */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_lt, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime Sample Dump Packet command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_sd_packet( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
unsigned int start_offset = offset;
|
|
|
|
/* sample number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_packet_count, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* do we have sample-data? */
|
|
if ( data_len - 1 > 1 ) {
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_packet_data, tvb, offset, data_len - 2, ENC_NA );
|
|
|
|
offset += ( data_len - 2 );
|
|
}
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_packet_check, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime Sample Dump Request command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_sd_req( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset) {
|
|
|
|
/* sample number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_sn, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
|
|
return 2;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime Sample Dump Extension command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_sd_ext( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
guint8 sub_id;
|
|
unsigned int start_offset = offset;
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* first we retrieve the sub-command */
|
|
sub_id = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_ext, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
if ( sub_id == RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LOOP_POINT_TRANSMISSION ) {
|
|
|
|
/* sample number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_sn, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
|
|
/* loop number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_ext_ln, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
|
|
/* loop type */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_lt, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* loop start */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_ls, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
offset += 3;
|
|
|
|
/* loop end */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_le, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
offset += 3;
|
|
|
|
} else if ( sub_id == RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LOOP_POINTS_REQUEST ) {
|
|
|
|
/* sample number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_header_sn, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
|
|
/* loop number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_ext_ln, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime General Information command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_gi( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
guint8 sub_id;
|
|
int consumed = 0;
|
|
|
|
if ( data_len < 1 )
|
|
return consumed;
|
|
|
|
/* first we retrieve the sub-command */
|
|
sub_id = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_gi, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
consumed++;
|
|
|
|
|
|
/* This is the only sub-command that we know that we can decode,
|
|
* the Identity Request has already been decoded up to this point. */
|
|
if ( sub_id == RTP_MIDI_SYSEX_COMMON_NRT_GI_IDENTITY_REQUEST ) {
|
|
|
|
/* nothing more to do... */
|
|
|
|
} else if ( sub_id == RTP_MIDI_SYSEX_COMMON_NRT_GI_IDENTITY_REPLY ) {
|
|
guint8 manu_short;
|
|
|
|
if ( data_len < 1 ) {
|
|
return consumed;
|
|
}
|
|
|
|
/* the manu-id should follow */
|
|
proto_tree_add_item( tree, hf_rtp_midi_manu_short, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
manu_short = tvb_get_guint8( tvb, offset );
|
|
offset++;
|
|
data_len--;
|
|
consumed++;
|
|
|
|
/* possibly escaped to be a long manu-id */
|
|
if ( manu_short == RTP_MIDI_MANU_SHORT_ISLONG ) {
|
|
if ( data_len < 2 ) {
|
|
return consumed;
|
|
}
|
|
proto_tree_add_item( tree, hf_rtp_midi_manu_long, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2 ;
|
|
data_len -= 2;
|
|
consumed += 2;
|
|
}
|
|
|
|
/* lets see if we can get the device family for this unit */
|
|
if ( data_len < 2 ) {
|
|
return consumed;
|
|
}
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_gi_device_family, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2 ;
|
|
data_len -= 2;
|
|
consumed += 2;
|
|
|
|
/* ...also get the detailed member of this family... */
|
|
if ( data_len < 2 ) {
|
|
return consumed;
|
|
}
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_gi_device_family_member, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2 ;
|
|
data_len -= 2;
|
|
consumed += 2;
|
|
|
|
/* and even the software-revision-level */
|
|
if ( data_len < 4 ) {
|
|
return consumed;
|
|
}
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_gi_software_rev, tvb, offset, 4, ENC_BIG_ENDIAN );
|
|
consumed += 4;
|
|
}
|
|
|
|
return consumed;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime File Dump command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_fd( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
guint8 sub_id;
|
|
unsigned int start_offset = offset;
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* first we retrieve the sub-command */
|
|
sub_id = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
if ( sub_id == RTP_MIDI_SYSEX_COMMON_NRT_FD_HEADER ) {
|
|
|
|
/* type */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_device_id, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* file type */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_type, tvb, offset, 4, ENC_ASCII|ENC_NA );
|
|
offset += 4;
|
|
data_len -= 4;
|
|
|
|
/* file length */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_length, tvb, offset, 4, ENC_BIG_ENDIAN );
|
|
offset += 4;
|
|
data_len -= 4;
|
|
|
|
if ( data_len ) {
|
|
|
|
/* file-name */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_name, tvb, offset, data_len, ENC_ASCII|ENC_NA );
|
|
offset += data_len;
|
|
}
|
|
|
|
} else if ( sub_id == RTP_MIDI_SYSEX_COMMON_NRT_FD_DATA_PACKET ) {
|
|
|
|
/* packet-num */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_packet_num, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* byte count */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_byte_count, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* do we have file-data? */
|
|
if ( data_len > 1 ) {
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_packet_data, tvb, offset, data_len - 1, ENC_NA );
|
|
|
|
offset += ( data_len - 1 );
|
|
}
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_checksum, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
} else if ( sub_id == RTP_MIDI_SYSEX_COMMON_NRT_FD_REQUEST ) {
|
|
|
|
/* type */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_device_id, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* file type */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_type, tvb, offset, 4, ENC_ASCII|ENC_NA );
|
|
offset += 4;
|
|
data_len -= 4;
|
|
|
|
if ( data_len ) {
|
|
|
|
/* file-name */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_name, tvb, offset, data_len, ENC_ASCII|ENC_NA );
|
|
offset += data_len;
|
|
}
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common (Non-)Realtime MIDI Tuning Standard command is decoded.
|
|
* As the code-points do not overlap, both RT and NRT are decoded here...
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_tuning( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
|
|
proto_tree *tune_tree;
|
|
const gchar *note_str;
|
|
guint8 sub_id;
|
|
unsigned int start_offset = offset;
|
|
unsigned int i;
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* first we retrieve the sub-command */
|
|
sub_id = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_tuning, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
if ( sub_id == RTP_MIDI_SYSEX_COMMON_TUNING_BULK_DUMP_REQUEST ) {
|
|
|
|
/* type */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_tune_program, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
} else if ( sub_id == RTP_MIDI_SYSEX_COMMON_TUNING_BULK_DUMP_REPLY ) {
|
|
|
|
/* type */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_tune_program, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* file length */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_tune_name, tvb, offset, 16, ENC_ASCII|ENC_NA );
|
|
offset += 16;
|
|
|
|
for ( i=0; i < 128; i++ ) {
|
|
note_str = val_to_str_ext( i, &rtp_midi_note_values_ext, rtp_midi_unknown_value_dec );
|
|
|
|
tune_tree = proto_tree_add_subtree_format(tree, tvb, offset, 3, ett_rtp_midi_sysex_common_tune_note, NULL, "Note: %s", note_str );
|
|
|
|
/* frequency */
|
|
proto_tree_add_item( tune_tree, hf_rtp_midi_sysex_common_tune_freq, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
offset += 3;
|
|
}
|
|
|
|
/* checksum */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_tune_checksum, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
} else if ( sub_id == RTP_MIDI_SYSEX_COMMON_TUNING_NOTE_CHANGE ) {
|
|
guint8 changes;
|
|
|
|
/* type */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_tune_program, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* changes */
|
|
changes = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_tune_changes, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
for ( i=0; i < changes; i++ ) {
|
|
guint8 note;
|
|
|
|
note = tvb_get_guint8( tvb, offset );
|
|
|
|
note_str = val_to_str_ext( note, &rtp_midi_note_values_ext, rtp_midi_unknown_value_dec );
|
|
|
|
tune_tree = proto_tree_add_subtree_format(tree, tvb, offset, 3, ett_rtp_midi_sysex_common_tune_note, NULL, "Note: %s", note_str );
|
|
|
|
/* note */
|
|
proto_tree_add_item( tune_tree, hf_rtp_midi_sysex_common_tune_note, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* frequency */
|
|
proto_tree_add_item( tune_tree, hf_rtp_midi_sysex_common_tune_freq, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
offset += 3;
|
|
}
|
|
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime General MIDI command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_gm( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_gm, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime Downloadable Sounds command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_dls( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_dls, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime End Of File command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_eof( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* we only have a packet-number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_packet_number, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime Wait command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_wait( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* we only have a packet-number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_packet_number, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime Cancel command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_cancel( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* we only have a packet-number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_packet_number, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime NAK command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_nak( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* we only have a packet-number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_packet_number, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime ACK command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_ack( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* we only have a packet-number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_sd_packet_number, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* here a sysex-common non-realtime midi time code cueing command is decoded.
|
|
* as the codepoints are the same, we decode both realtime and non-realtime here.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt_mtc( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
unsigned int start_offset = offset;
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* type and hours */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc_type, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc_hr, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* minutes */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc_mn, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* seconds */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc_sc, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* frames */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc_fr, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* fractional frames */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc_ff, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* event-number (lsb) */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc_enl, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* event-number (msb) */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc_enm, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
if ( data_len ) {
|
|
|
|
/* additional data */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_mtc_add, tvb, offset, data_len, ENC_NA );
|
|
offset += data_len;
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Realtime MIDI Time Code Cueing command is decoded.
|
|
* As the codepoints are the same, we decode both realtime and non-realtime here.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_rt_mtc_cue( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
unsigned int start_offset = offset;
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_cueing, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* event-number (lsb) */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_cue_enl, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
/* event-number (msb) */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_cue_enm, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
|
|
if ( data_len ) {
|
|
|
|
/* additional data */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_cue_add, tvb, offset, data_len, ENC_NA );
|
|
offset += data_len;
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Here a Sysex-Common Non-Realtime command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_nrt( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
guint8 common_nrt;
|
|
const gchar *nrt_str;
|
|
proto_tree *command_tree;
|
|
int consumed = 0;
|
|
int ext_consumed = 0;
|
|
|
|
if ( data_len < 1 )
|
|
return consumed;
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_device_id, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
consumed++;
|
|
|
|
if ( data_len < 1 ) {
|
|
return consumed;
|
|
}
|
|
|
|
common_nrt = tvb_get_guint8( tvb, offset );
|
|
|
|
nrt_str = val_to_str( common_nrt, rtp_midi_sysex_common_nrt, "Unknown 0x%02x" );
|
|
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset, data_len, ett_rtp_midi_sysex_common_nrt, NULL, nrt_str );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_sysex_common_non_realtime, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
data_len--;
|
|
consumed++;
|
|
|
|
switch ( common_nrt ) {
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DUMP_HEADER:
|
|
ext_consumed = decode_sysex_common_nrt_sd_hdr( tvb, pinfo, command_tree, offset);
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DATA_PACKET:
|
|
ext_consumed = decode_sysex_common_nrt_sd_packet( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DUMP_REQUEST:
|
|
ext_consumed = decode_sysex_common_nrt_sd_req( tvb, pinfo, command_tree, offset);
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_MTC:
|
|
ext_consumed = decode_sysex_common_nrt_mtc( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_SAMPLE_DUMP_EXTENSIONS:
|
|
ext_consumed = decode_sysex_common_nrt_sd_ext( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_GENERAL_INFORMATION:
|
|
ext_consumed = decode_sysex_common_nrt_gi( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_FILE_DUMP:
|
|
ext_consumed = decode_sysex_common_nrt_fd( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_MIDI_TUNING_STANDARD:
|
|
ext_consumed = decode_sysex_common_tuning( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_GENERAL_MIDI:
|
|
ext_consumed = decode_sysex_common_nrt_gm( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_DOWNLOADABLE_SOUNDS: /* ??? not in Spec */
|
|
ext_consumed = decode_sysex_common_nrt_dls( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_END_OF_FILE:
|
|
ext_consumed = decode_sysex_common_nrt_eof( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_WAIT:
|
|
ext_consumed = decode_sysex_common_nrt_wait( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_CANCEL:
|
|
ext_consumed = decode_sysex_common_nrt_cancel( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_NAK:
|
|
ext_consumed = decode_sysex_common_nrt_nak( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_NRT_ACK:
|
|
ext_consumed = decode_sysex_common_nrt_ack( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
}
|
|
|
|
if ( ext_consumed < 0 ) {
|
|
return -1;
|
|
}
|
|
|
|
/* set our pointers correct to move past already decoded data */
|
|
offset += ext_consumed;
|
|
data_len -= ext_consumed;
|
|
consumed += ext_consumed;
|
|
|
|
if ( data_len > 0 ) {
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_unknown_data, tvb, offset, data_len, ENC_NA );
|
|
consumed += data_len;
|
|
}
|
|
|
|
return consumed;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Here a Sysex-Common Realtime MIDI Time Code command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_rt_mtc( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
guint8 sub_id;
|
|
unsigned int start_offset = offset;
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* first we retrieve the sub-command */
|
|
sub_id = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
if ( sub_id == RTP_MIDI_SYSEX_COMMON_RT_MTC_FULL_MESSAGE ) {
|
|
|
|
/* type and hours */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_fm_type, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_fm_hr, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* minutes */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_fm_mn, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* seconds */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_fm_sc, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* frames */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_fm_fr, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
} else if ( sub_id == RTP_MIDI_SYSEX_COMMON_RT_MTC_USER_BITS ) {
|
|
|
|
/* U1 */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_ub_u1, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* U2 */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_ub_u2, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* U3 */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_ub_u3, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* U4 */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_ub_u4, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* U5 */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_ub_u5, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* U6 */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_ub_u6, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* U7 */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_ub_u7, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* U8 */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_ub_u8, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* U9 */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mtc_ub_u9, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Realtime MIDI Show Control command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_rt_sc( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_sc, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
/* TODO: decode Show Control stuff */
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Realtime Notation Information command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_rt_ni( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
guint8 sub_id;
|
|
unsigned int start_offset = offset;
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* first we retrieve the sub-command */
|
|
sub_id = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_ni, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
if ( sub_id == RTP_MIDI_SYSEX_COMMON_RT_NT_BAR_NUMBER ) {
|
|
|
|
/* bar number */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_ni_bar_num, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
|
|
} else if ( ( sub_id == RTP_MIDI_SYSEX_COMMON_RT_NT_TIME_SIGNATURE_IMMEDIATE ) ||
|
|
( sub_id == RTP_MIDI_SYSEX_COMMON_RT_NT_TIME_SIGNATURE_DELAYED ) ) {
|
|
int bytes;
|
|
|
|
/* bytes */
|
|
bytes = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_ni_bytes, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* beats / numerator */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_ni_numerator, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
bytes--;
|
|
|
|
/* beats / denominator */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_ni_denominator, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
bytes--;
|
|
|
|
/* clocks */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_ni_midi_clocks, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
bytes--;
|
|
|
|
/* 32nds */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_ni_32nds, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
bytes--;
|
|
|
|
while ( bytes > 0 ) {
|
|
|
|
/* beats / numerator */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_ni_numerator, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
bytes--;
|
|
|
|
/* beats / denominator */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_ni_denominator, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
bytes--;
|
|
}
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Realtime Device Control command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_rt_dc( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
guint8 sub_id;
|
|
unsigned int start_offset = offset;
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
/* first we retrieve the sub-command */
|
|
sub_id = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_dc, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
if ( sub_id == RTP_MIDI_SYSEX_COMMON_RT_DC_MASTER_VOLUME ) {
|
|
|
|
/* volume */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_dc_volume, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
|
|
} else if ( sub_id == RTP_MIDI_SYSEX_COMMON_RT_DC_MASTER_BALANCE ) {
|
|
|
|
/* balance */
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_dc_balance, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here a Sysex-Common Realtime MIDI Machine Control command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_rt_mmc_command( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mmc_commands, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
|
|
/* TODO: decode MMC stuff */
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Realtime MIDI Machine Control response is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_rt_mmc_response( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
|
|
if ( data_len < 1 )
|
|
return 0;
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_rt_mmc_responses, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
/* TODO: decode MMC stuff */
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Here a Sysex-Common Realtime command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_rt( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
guint8 common_rt;
|
|
const gchar *rt_str;
|
|
proto_tree *command_tree;
|
|
int consumed = 0;
|
|
int ext_consumed = 0;
|
|
|
|
if ( data_len < 1 )
|
|
return consumed;
|
|
|
|
proto_tree_add_item( tree, hf_rtp_midi_sysex_common_device_id, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
data_len--;
|
|
consumed++;
|
|
|
|
if ( data_len < 1 ) {
|
|
return consumed;
|
|
}
|
|
|
|
common_rt = tvb_get_guint8( tvb, offset );
|
|
rt_str = val_to_str( common_rt, rtp_midi_sysex_common_rt, "Unknown 0x%02x" );
|
|
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset, data_len, ett_rtp_midi_sysex_common_rt, NULL, rt_str );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_sysex_common_realtime, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
data_len--;
|
|
offset++;
|
|
consumed++;
|
|
|
|
switch ( common_rt ) {
|
|
case RTP_MIDI_SYSEX_COMMON_RT_MIDI_TIME_CODE:
|
|
ext_consumed = decode_sysex_common_rt_mtc( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_RT_MIDI_SHOW_CONTROL:
|
|
ext_consumed = decode_sysex_common_rt_sc( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_RT_NOTATION_INFORMATION:
|
|
ext_consumed = decode_sysex_common_rt_ni( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_RT_DEVICE_CONTROL:
|
|
ext_consumed = decode_sysex_common_rt_dc( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_RT_MTC_CUEING:
|
|
ext_consumed = decode_sysex_common_rt_mtc_cue( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_RT_MIDI_MACHINE_CONTROL_COMMAND:
|
|
ext_consumed = decode_sysex_common_rt_mmc_command( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_RT_MIDI_MACHINE_CONTROL_RESPONSE:
|
|
ext_consumed = decode_sysex_common_rt_mmc_response( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_SYSEX_COMMON_RT_MIDI_TUNING_STANDARD:
|
|
ext_consumed = decode_sysex_common_tuning( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
}
|
|
|
|
if ( ext_consumed < 0 ) {
|
|
return -1;
|
|
}
|
|
|
|
/* set our pointers correct to move past already decoded data */
|
|
offset += ext_consumed;
|
|
data_len -= ext_consumed;
|
|
consumed += ext_consumed;
|
|
|
|
if ( data_len > 0 ) {
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_unknown_data, tvb, offset, data_len, ENC_NA );
|
|
consumed += data_len;
|
|
}
|
|
|
|
return consumed;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here a Sysex-Common Educational command is decoded.
|
|
* According to the MIDI-specification, this should never be found "in the wild".
|
|
* We don't know what this data encodes, so we just dump it.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_educational( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len ) {
|
|
proto_tree *command_tree;
|
|
int consumed = 0;
|
|
|
|
if ( data_len < 1 )
|
|
return consumed;
|
|
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset, data_len, ett_rtp_midi_sysex_edu, NULL, RTP_MIDI_TREE_NAME_COMMAND_SYSEX_EDU );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_edu_data, tvb, offset, data_len, ENC_NA );
|
|
|
|
/* We consumed everything */
|
|
return data_len;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-Common Manufacturer command is decoded.
|
|
* We don't know what this data encodes, so we just dump it.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_common_manufacturer( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int data_len, unsigned int manu_code _U_) {
|
|
proto_tree *command_tree;
|
|
int consumed = 0;
|
|
|
|
if ( data_len < 1 )
|
|
return consumed;
|
|
|
|
/* Instead of dumping, at this point we could implement to start manufacturer-specific decoding
|
|
* of the sysex-data...
|
|
*/
|
|
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset, data_len, ett_rtp_midi_sysex_manu, NULL, RTP_MIDI_TREE_NAME_COMMAND_SYSEX_MANU );
|
|
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_manu_data, tvb, offset, data_len, ENC_NA );
|
|
|
|
/* We consumed everything */
|
|
return data_len;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Here a Sysex-Start command is decoded.
|
|
*/
|
|
static unsigned int
|
|
decode_sysex_start(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset, unsigned int cmd_len ) {
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
int consumed = 0;
|
|
int data_len;
|
|
int ext_consumed = 0;
|
|
|
|
status_str = val_to_str( RTP_MIDI_STATUS_COMMON_SYSEX_END, rtp_midi_common_status, rtp_midi_unknown_value_hex );
|
|
|
|
/* we need to parse "away" data until the next command */
|
|
while ( cmd_len ) {
|
|
guint8 octet;
|
|
octet = tvb_get_guint8( tvb, offset + consumed );
|
|
consumed++;
|
|
|
|
/*
|
|
* lets check if we have a "normal" end -
|
|
* if so, the last status-byte is consumed
|
|
* as it belongs to the message
|
|
*/
|
|
if ( octet == RTP_MIDI_STATUS_COMMON_SYSEX_END ) {
|
|
status_str = rtp_midi_common_status_sysex_segment_complete;
|
|
} else if ( octet == RTP_MIDI_STATUS_COMMON_SYSEX_START ) {
|
|
status_str = rtp_midi_common_status_sysex_segment_start;
|
|
} else if ( octet == RTP_MIDI_STATUS_COMMON_UNDEFINED_F4 ) {
|
|
status_str = rtp_midi_common_status_sysex_cancel;
|
|
}
|
|
|
|
/* Is this command through? */
|
|
if ( octet & RTP_MIDI_COMMAND_STATUS_FLAG ) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* the unknown data we have does not include the trailing status-command */
|
|
data_len = consumed - 1;
|
|
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset - 1, 1 + consumed, ett_rtp_midi_command, NULL, status_str );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
|
|
/* lets see if we have enough data for the sysex-id */
|
|
if ( data_len > 1 ) {
|
|
guint8 manu_short;
|
|
guint16 manufacturer;
|
|
manufacturer = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_manu_short, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
manu_short = tvb_get_guint8( tvb, offset );
|
|
offset++;
|
|
data_len--;
|
|
|
|
switch( manu_short ) {
|
|
case RTP_MIDI_MANU_SHORT_NON_REALTIME_UNIVERSAL:
|
|
ext_consumed = decode_sysex_common_nrt( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_MANU_SHORT_REALTIME_UNIVERSAL:
|
|
ext_consumed = decode_sysex_common_rt( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_MANU_SHORT_EDUCATIONAL_USE:
|
|
ext_consumed = decode_sysex_common_educational( tvb, pinfo, command_tree, offset, data_len );
|
|
break;
|
|
case RTP_MIDI_MANU_SHORT_ISLONG:
|
|
/* lets see if we have enough data to decode a long sysex-id and if we have a long id at all */
|
|
if ( data_len > 2 ) {
|
|
manufacturer = tvb_get_ntohs( tvb, offset );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_manu_long, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2 ;
|
|
data_len -= 2;
|
|
ext_consumed = decode_sysex_common_manufacturer( tvb, pinfo, command_tree, offset, data_len, manufacturer );
|
|
} else {
|
|
ext_consumed = -1;
|
|
}
|
|
break;
|
|
default:
|
|
ext_consumed = decode_sysex_common_manufacturer( tvb, pinfo, command_tree, offset, data_len, manufacturer );
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( ext_consumed < 0 ) {
|
|
return -1;
|
|
}
|
|
|
|
/* set our pointers correct to move past already decoded data */
|
|
offset += ext_consumed;
|
|
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s", status_str );
|
|
} else {
|
|
col_append_str(pinfo->cinfo, COL_INFO, status_str );
|
|
}
|
|
|
|
return consumed;
|
|
}
|
|
|
|
/*
|
|
* Here the MIDI-Time-Code (MTC) Quarter Frame command is decoded.
|
|
*/
|
|
static int
|
|
decode_mtc_quarter_frame(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset) {
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( RTP_MIDI_STATUS_COMMON_MTC_QUARTER_FRAME, rtp_midi_common_status, rtp_midi_unknown_value_hex );
|
|
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset - 1, 2, ett_rtp_midi_command, NULL, status_str );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_quarter_frame_type, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_quarter_frame_value, tvb, offset + 1, 1, ENC_BIG_ENDIAN );
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", status_str );
|
|
} else {
|
|
col_append_str(pinfo->cinfo, COL_INFO, status_str );
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here the Song Position Pointer command is decoded.
|
|
*/
|
|
static int
|
|
decode_song_position_pointer(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset) {
|
|
guint8 octet1;
|
|
guint8 octet2;
|
|
guint8 position;
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( RTP_MIDI_STATUS_COMMON_SONG_POSITION_POINTER, rtp_midi_common_status, rtp_midi_unknown_value_hex );
|
|
octet1 = tvb_get_guint8( tvb, offset );
|
|
octet2 = tvb_get_guint8( tvb, offset + 1 );
|
|
position = ( octet1 << 7 ) | octet2;
|
|
|
|
command_tree = proto_tree_add_subtree_format(tree, tvb, offset - 1, 3, ett_rtp_midi_command, NULL, "%s (p=%d)", status_str, position );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_spp, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s (p=%d)", status_str, position );
|
|
} else {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s (p=%d)", status_str, position );
|
|
}
|
|
return 2;
|
|
}
|
|
|
|
/*
|
|
* Here a Song-Select command is decoded.
|
|
*/
|
|
static int
|
|
decode_song_select(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset) {
|
|
guint8 song_nr;
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( RTP_MIDI_STATUS_COMMON_SONG_SELECT, rtp_midi_common_status, rtp_midi_unknown_value_hex );
|
|
song_nr = tvb_get_guint8( tvb, offset );
|
|
|
|
command_tree = proto_tree_add_subtree_format(tree, tvb, offset - 1, 2, ett_rtp_midi_command, NULL, "%s (s=%d)", status_str, song_nr );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_song_select, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s (s=%d)", status_str, song_nr );
|
|
} else {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%s (s=%d)", status_str, song_nr );
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Here the undefined common-command 0xf4 is decoded.
|
|
*/
|
|
static int
|
|
decode_undefined_f4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset, unsigned int cmd_len ) {
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
int consumed = 0;
|
|
|
|
status_str = val_to_str( RTP_MIDI_STATUS_COMMON_UNDEFINED_F4, rtp_midi_common_status, rtp_midi_unknown_value_hex );
|
|
|
|
/* we need to parse "away" data until the next command */
|
|
while ( cmd_len ) {
|
|
guint8 octet;
|
|
octet = tvb_get_guint8( tvb, offset + consumed );
|
|
consumed++;
|
|
|
|
/* Is this command through? */
|
|
if ( octet & RTP_MIDI_COMMAND_STATUS_FLAG ) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset - 1, 1 + consumed, ett_rtp_midi_command, NULL, status_str );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
/* just add the unknown data to the tree */
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_unknown_data, tvb, offset, consumed, ENC_NA );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset + consumed - 1, 1, ENC_BIG_ENDIAN );
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s", status_str );
|
|
} else {
|
|
col_append_str(pinfo->cinfo, COL_INFO, status_str );
|
|
}
|
|
return consumed;
|
|
}
|
|
|
|
/*
|
|
* Here the undefined common-command 0xf5 is decoded.
|
|
*/
|
|
static int
|
|
decode_undefined_f5(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset, unsigned int cmd_len ) {
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
int consumed = 0;
|
|
|
|
status_str = val_to_str( RTP_MIDI_STATUS_COMMON_UNDEFINED_F5, rtp_midi_common_status, rtp_midi_unknown_value_hex );
|
|
|
|
/* we need to parse "away" data until the next command */
|
|
while ( cmd_len ) {
|
|
guint8 octet;
|
|
octet = tvb_get_guint8( tvb, offset + consumed );
|
|
consumed++;
|
|
/* Is this command done? */
|
|
if ( octet & RTP_MIDI_COMMAND_STATUS_FLAG ) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset - 1, 1 + consumed, ett_rtp_midi_command, NULL, status_str );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
/* just add the unknown data to the tree */
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_unknown_data, tvb, offset, consumed, ENC_NA );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset + consumed - 1, 1, ENC_BIG_ENDIAN );
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s", status_str );
|
|
} else {
|
|
col_append_str(pinfo->cinfo, COL_INFO, status_str );
|
|
}
|
|
return consumed;
|
|
}
|
|
|
|
/*
|
|
* Here a Tune-Request command is decoded.
|
|
*/
|
|
static int
|
|
decode_tune_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset, unsigned int cmd_len _U_ ) {
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
|
|
status_str = val_to_str( RTP_MIDI_STATUS_COMMON_TUNE_REQUEST, rtp_midi_common_status, rtp_midi_unknown_value_hex );
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset - 1, 1, ett_rtp_midi_command, NULL, status_str );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s)", status_str );
|
|
} else {
|
|
col_append_str(pinfo->cinfo, COL_INFO, status_str );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Here a Sysex-End command is decoded - in RTP-MIDI this has a special semantic, it either starts a segmented Sysex-frame or a Sysex-Cancel
|
|
*/
|
|
static int
|
|
decode_sysex_end(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset, unsigned int cmd_len ) {
|
|
const gchar *status_str;
|
|
proto_tree *command_tree;
|
|
int consumed = 0;
|
|
|
|
status_str = val_to_str( RTP_MIDI_STATUS_COMMON_SYSEX_END, rtp_midi_common_status, rtp_midi_unknown_value_hex );
|
|
|
|
/* we need to parse "away" data until the next command */
|
|
while ( cmd_len ) {
|
|
guint8 octet;
|
|
octet = tvb_get_guint8( tvb, offset + consumed );
|
|
consumed++;
|
|
|
|
/*
|
|
* lets check if we have a "normal" end -
|
|
* if so, the last status-byte is consumed
|
|
* as it belongs to the message
|
|
*/
|
|
if ( octet == RTP_MIDI_STATUS_COMMON_SYSEX_END ) {
|
|
status_str = rtp_midi_common_status_sysex_segment_end;
|
|
} else if ( octet == RTP_MIDI_STATUS_COMMON_SYSEX_START ) {
|
|
status_str = rtp_midi_common_status_sysex_segment;
|
|
} else if ( octet == RTP_MIDI_STATUS_COMMON_UNDEFINED_F4 ) {
|
|
status_str = rtp_midi_common_status_sysex_cancel;
|
|
}
|
|
|
|
/* Is this command through? */
|
|
if ( octet & RTP_MIDI_COMMAND_STATUS_FLAG ) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset - 1, 1 + consumed, ett_rtp_midi_command, NULL, status_str );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset - 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_unknown_data, tvb, offset, consumed - 1, ENC_NA );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset + consumed - 1, 1, ENC_BIG_ENDIAN );
|
|
|
|
|
|
if ( cmd_count ) {
|
|
col_append_fstr(pinfo->cinfo, COL_INFO,", %s", status_str );
|
|
} else {
|
|
col_append_str(pinfo->cinfo, COL_INFO, status_str );
|
|
}
|
|
|
|
return consumed;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Here each single MIDI-command is decoded.
|
|
* The Status-octet is read and then the decoding
|
|
* of the individual MIDI-commands is punted to
|
|
* external decoders.
|
|
*/
|
|
|
|
static int
|
|
decodemidi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int cmd_count, unsigned int offset, unsigned int cmd_len, guint8 *runningstatus, unsigned int *rsoffset )
|
|
{
|
|
int consumed = 0;
|
|
int ext_consumed = 0;
|
|
guint8 octet;
|
|
gboolean using_rs;
|
|
|
|
|
|
#if 0
|
|
guint8 octet2;
|
|
guint8 octet3;
|
|
guint8 cmd;
|
|
guint8 channel;
|
|
proto_tree *sysexdata_tree = NULL;
|
|
gboolean foundend;
|
|
guint16 wordvalue;
|
|
char helptext[200];
|
|
char entry[200];
|
|
char segtype[200];
|
|
guint8 manu1;
|
|
guint16 manu2;
|
|
guint8 subid1;
|
|
guint8 subid2;
|
|
guint8 sysexchan;
|
|
unsigned int helpoffset;
|
|
#endif
|
|
|
|
octet = tvb_get_guint8( tvb, offset );
|
|
|
|
/* midi realtime-data -> one octet -- unlike serial-wired MIDI realtime-commands in RTP-MIDI will
|
|
* not be intermingled with other MIDI-commands, so we handle this case right here and return */
|
|
if ( octet >= 0xf8 ) {
|
|
proto_tree *command_tree;
|
|
const gchar *valstr;
|
|
|
|
valstr = val_to_str( octet, rtp_midi_common_status, rtp_midi_unknown_value_hex );
|
|
command_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_rtp_midi_command, NULL, valstr );
|
|
proto_tree_add_item( command_tree, hf_rtp_midi_common_status, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
if ( cmd_count ) {
|
|
col_add_fstr(pinfo->cinfo, COL_INFO,", %s", valstr );
|
|
} else {
|
|
col_add_str(pinfo->cinfo, COL_INFO, valstr );
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
/* see if this first octet is a status message */
|
|
if ( ( octet & RTP_MIDI_COMMAND_STATUS_FLAG ) == 0 ) {
|
|
/* if we have no running status yet -> error */
|
|
if ( ( ( *runningstatus ) & RTP_MIDI_COMMAND_STATUS_FLAG ) == 0 ) {
|
|
return -1;
|
|
}
|
|
/* our first octet is "virtual" coming from a preceding MIDI-command,
|
|
* so actually we have not really consumed anything yet */
|
|
octet = *runningstatus;
|
|
using_rs = TRUE;
|
|
} else {
|
|
/* We have a "real" status-byte */
|
|
using_rs = FALSE;
|
|
|
|
/* Let's see how this octet influences our running-status */
|
|
/* if we have a "normal" MIDI-command then the new status replaces the current running-status */
|
|
if ( octet < 0xf0 ) {
|
|
*rsoffset = offset ;
|
|
*runningstatus = octet;
|
|
} else {
|
|
/* system-realtime-commands maintain the current running-status
|
|
* other system-commands clear the running-status, since we
|
|
* already handled realtime, we can reset it here */
|
|
*runningstatus = 0;
|
|
}
|
|
|
|
/* lets update our pointers */
|
|
consumed++;
|
|
cmd_len--;
|
|
offset++;
|
|
}
|
|
|
|
|
|
|
|
|
|
/* non-system MIDI-commands encode the command in the high nibble and the channel
|
|
* in the low nibble - so we will take care of those cases next */
|
|
|
|
if ( octet < 0xf0 ) {
|
|
switch ( octet >> 4 ) {
|
|
case RTP_MIDI_STATUS_CHANNEL_NOTE_OFF:
|
|
ext_consumed = decode_note_off( tvb, pinfo, tree, cmd_count, offset, octet, *rsoffset, using_rs );
|
|
break;
|
|
case RTP_MIDI_STATUS_CHANNEL_NOTE_ON:
|
|
ext_consumed = decode_note_on( tvb, pinfo, tree, cmd_count, offset, octet, *rsoffset, using_rs );
|
|
break;
|
|
case RTP_MIDI_STATUS_CHANNEL_POLYPHONIC_KEY_PRESSURE:
|
|
ext_consumed = decode_poly_pressure(tvb, pinfo, tree, cmd_count, offset, octet, *rsoffset, using_rs );
|
|
break;
|
|
case RTP_MIDI_STATUS_CHANNEL_CONTROL_CHANGE:
|
|
ext_consumed = decode_control_change(tvb, pinfo, tree, cmd_count, offset, octet, *rsoffset, using_rs );
|
|
break;
|
|
case RTP_MIDI_STATUS_CHANNEL_PROGRAM_CHANGE:
|
|
ext_consumed = decode_program_change(tvb, pinfo, tree, cmd_count, offset, octet, *rsoffset, using_rs );
|
|
break;
|
|
case RTP_MIDI_STATUS_CHANNEL_CHANNEL_PRESSURE:
|
|
ext_consumed = decode_channel_pressure(tvb, pinfo, tree, cmd_count, offset, octet, *rsoffset, using_rs );
|
|
break;
|
|
case RTP_MIDI_STATUS_CHANNEL_PITCH_BEND_CHANGE:
|
|
ext_consumed = decode_pitch_bend_change(tvb, pinfo, tree, cmd_count, offset, octet, *rsoffset, using_rs );
|
|
break;
|
|
}
|
|
/* external decoder informed us of error -> pass this through */
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
return consumed + ext_consumed;
|
|
}
|
|
|
|
/* Here we catch the remaining system-common commands */
|
|
switch ( octet ) {
|
|
case RTP_MIDI_STATUS_COMMON_SYSEX_START:
|
|
ext_consumed = decode_sysex_start( tvb, pinfo, tree, cmd_count, offset, cmd_len );
|
|
break;
|
|
case RTP_MIDI_STATUS_COMMON_MTC_QUARTER_FRAME:
|
|
ext_consumed = decode_mtc_quarter_frame( tvb, pinfo, tree, cmd_count, offset);
|
|
break;
|
|
case RTP_MIDI_STATUS_COMMON_SONG_POSITION_POINTER:
|
|
ext_consumed = decode_song_position_pointer( tvb, pinfo, tree, cmd_count, offset);
|
|
break;
|
|
case RTP_MIDI_STATUS_COMMON_SONG_SELECT:
|
|
ext_consumed = decode_song_select( tvb, pinfo, tree, cmd_count, offset);
|
|
break;
|
|
case RTP_MIDI_STATUS_COMMON_UNDEFINED_F4:
|
|
ext_consumed = decode_undefined_f4( tvb, pinfo, tree, cmd_count, offset, cmd_len );
|
|
break;
|
|
case RTP_MIDI_STATUS_COMMON_UNDEFINED_F5:
|
|
ext_consumed = decode_undefined_f5( tvb, pinfo, tree, cmd_count, offset, cmd_len );
|
|
break;
|
|
case RTP_MIDI_STATUS_COMMON_TUNE_REQUEST:
|
|
ext_consumed = decode_tune_request( tvb, pinfo, tree, cmd_count, offset, cmd_len );
|
|
break;
|
|
case RTP_MIDI_STATUS_COMMON_SYSEX_END:
|
|
ext_consumed = decode_sysex_end( tvb, pinfo, tree, cmd_count, offset, cmd_len );
|
|
break;
|
|
}
|
|
/* external decoder informed us of error -> pass this through */
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
return consumed + ext_consumed;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Here the chapter c of the channel-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_cj_chapter_c( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_tree *rtp_midi_cj_chapter_tree;
|
|
proto_tree *rtp_midi_loglist_tree;
|
|
proto_tree *loglist_tree;
|
|
unsigned int start_offset = offset;
|
|
guint8 octet;
|
|
int count;
|
|
int i;
|
|
|
|
octet = tvb_get_guint8( tvb, offset );
|
|
count = octet & 0x7f;
|
|
|
|
/* count encoded is n+1 */
|
|
count++;
|
|
|
|
rtp_midi_cj_chapter_tree = proto_tree_add_subtree( tree, tvb, offset, 1 + 2 * count,
|
|
ett_rtp_midi_cj_chapter_c, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_C );
|
|
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_c_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_c_length, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
|
|
rtp_midi_loglist_tree = proto_tree_add_subtree( rtp_midi_cj_chapter_tree, tvb, offset, count * 2,
|
|
ett_rtp_midi_cj_chapter_c_loglist, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_C_LOGLIST );
|
|
|
|
for ( i = 0; i < count; i++ ) {
|
|
|
|
loglist_tree = proto_tree_add_subtree(rtp_midi_loglist_tree, tvb, offset, 2,
|
|
ett_rtp_midi_cj_chapter_c_logitem, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_C_LOGITEM );
|
|
|
|
proto_tree_add_item(loglist_tree, hf_rtp_midi_cj_chapter_c_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item(loglist_tree, hf_rtp_midi_cj_chapter_c_number, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
|
|
octet = tvb_get_guint8( tvb, offset );
|
|
proto_tree_add_item(loglist_tree, hf_rtp_midi_cj_chapter_c_aflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
/* do we have a value or alternative coding? */
|
|
if ( octet & 0x80 ) {
|
|
proto_tree_add_item(loglist_tree, hf_rtp_midi_cj_chapter_c_tflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item(loglist_tree, hf_rtp_midi_cj_chapter_c_alt, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
} else {
|
|
proto_tree_add_item(loglist_tree, hf_rtp_midi_cj_chapter_c_value, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
}
|
|
|
|
offset++;
|
|
}
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Here the chapter m of the channel-journal is decoded, possibly the most complex part of the RTP-MIDI stuff ;-)
|
|
*/
|
|
static int
|
|
decode_cj_chapter_m( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_tree *rtp_midi_cj_chapter_tree;
|
|
proto_tree *rtp_midi_loglist_tree;
|
|
proto_tree *rtp_midi_loglist_item_tree;
|
|
guint16 header;
|
|
guint8 logitemheader;
|
|
int length;
|
|
int logitemhdrlen;
|
|
int logitemlen;
|
|
gboolean no_pnum_msb;
|
|
unsigned int start_offset = offset;
|
|
|
|
/* first we need to get the flags & length of this chapter */
|
|
header = tvb_get_ntohs( tvb, offset );
|
|
length = header & RTP_MIDI_CJ_CHAPTER_M_MASK_LENGTH;
|
|
/* take of length of header */
|
|
length -= 2;
|
|
|
|
rtp_midi_cj_chapter_tree = proto_tree_add_subtree( tree, tvb, offset, length, ett_rtp_midi_cj_chapter_m, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_M );
|
|
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_m_sflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_m_pflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_m_eflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_m_uflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_m_wflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_m_zflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_m_length, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
|
|
/* done with header */
|
|
offset += 2;
|
|
|
|
/* do we have the pending field? */
|
|
if ( header & 0x4000 ) {
|
|
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_m_qflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_m_pending, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
}
|
|
|
|
/*
|
|
* lets find out if we need to decode the pnum_msb:
|
|
* if Z = 1 and either U = 1 or W = 1 we don't
|
|
*/
|
|
no_pnum_msb = ( header & 0x0400 ) && ( ( header & 0x0800 ) || ( header & 0x1000 ) );
|
|
logitemhdrlen = no_pnum_msb ? 2 : 3;
|
|
|
|
rtp_midi_loglist_tree = proto_tree_add_subtree( rtp_midi_cj_chapter_tree, tvb, offset, length, ett_rtp_midi_cj_chapter_m_loglist, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOGLIST );
|
|
|
|
/* lets step through the loglist */
|
|
while ( length > 0 ) {
|
|
|
|
if ( no_pnum_msb ) {
|
|
logitemheader = tvb_get_guint8( tvb, offset + 1 );
|
|
} else {
|
|
logitemheader = tvb_get_guint8( tvb, offset + 2 );
|
|
}
|
|
|
|
logitemlen = logitemhdrlen;
|
|
|
|
/* do we have a msb field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_J ) {
|
|
logitemlen++;
|
|
}
|
|
|
|
/* do we have a lsb field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_K ) {
|
|
logitemlen++;
|
|
}
|
|
|
|
/* do we have an a-button field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_L ) {
|
|
logitemlen +=2;
|
|
}
|
|
|
|
/* do we have a c-button field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_M ) {
|
|
logitemlen +=2;
|
|
}
|
|
|
|
/* do we have a count field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_N ) {
|
|
logitemlen++;
|
|
}
|
|
|
|
/* now that we have the length of the logitem, we can create the tree... */
|
|
rtp_midi_loglist_item_tree = proto_tree_add_subtree( rtp_midi_loglist_tree, tvb, offset, logitemlen,
|
|
ett_rtp_midi_cj_chapter_m_logitem, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOGITEM );
|
|
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_pnum_lsb, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
length--;
|
|
|
|
/* if we have the msb, we need to decode it */
|
|
if ( !no_pnum_msb ) {
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_qflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_pnum_msb, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
length--;
|
|
}
|
|
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_jflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_kflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_lflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_mflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_nflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_tflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_vflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_item_tree, hf_rtp_midi_cj_chapter_m_log_rflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
length--;
|
|
|
|
/* do we have a entry-msb field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_J ) {
|
|
static const int * msb_flags[] = {
|
|
&hf_rtp_midi_cj_chapter_m_log_msb_x,
|
|
&hf_rtp_midi_cj_chapter_m_log_msb,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_loglist_tree, tvb, offset, hf_rtp_midi_cj_chapter_m_log_msb_entry, ett_rtp_midi_cj_chapter_m_log_msb, msb_flags, ENC_NA);
|
|
|
|
offset++;
|
|
length--;
|
|
}
|
|
|
|
/* do we have a entry-lsb field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_K ) {
|
|
static const int * lsb_flags[] = {
|
|
&hf_rtp_midi_cj_chapter_m_log_lsb_x,
|
|
&hf_rtp_midi_cj_chapter_m_log_lsb,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_loglist_tree, tvb, offset, hf_rtp_midi_cj_chapter_m_log_lsb_entry, ett_rtp_midi_cj_chapter_m_log_lsb, lsb_flags, ENC_NA);
|
|
offset++;
|
|
length--;
|
|
}
|
|
|
|
/* do we have an a-button field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_L ) {
|
|
static const int * button_flags[] = {
|
|
&hf_rtp_midi_cj_chapter_m_log_a_button_g,
|
|
&hf_rtp_midi_cj_chapter_m_log_a_button_x,
|
|
&hf_rtp_midi_cj_chapter_m_log_a_button,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_loglist_tree, tvb, offset, hf_rtp_midi_cj_chapter_m_log_a_button_full, ett_rtp_midi_cj_chapter_m_log_a_button, button_flags, ENC_BIG_ENDIAN);
|
|
|
|
offset += 2;
|
|
length -= 2;
|
|
}
|
|
|
|
/* do we have a c-button field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_M ) {
|
|
static const int * button_flags[] = {
|
|
&hf_rtp_midi_cj_chapter_m_log_c_button_g,
|
|
&hf_rtp_midi_cj_chapter_m_log_c_button_r,
|
|
&hf_rtp_midi_cj_chapter_m_log_c_button,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_loglist_tree, tvb, offset, hf_rtp_midi_cj_chapter_m_log_c_button_full, ett_rtp_midi_cj_chapter_m_log_c_button, button_flags, ENC_BIG_ENDIAN);
|
|
|
|
offset += 2;
|
|
length -= 2;
|
|
}
|
|
|
|
/* do we have a count field? */
|
|
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_N ) {
|
|
static const int * log_flags[] = {
|
|
&hf_rtp_midi_cj_chapter_m_log_count_x,
|
|
&hf_rtp_midi_cj_chapter_m_log_count,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_loglist_tree, tvb, offset, hf_rtp_midi_cj_chapter_m_log_count_full, ett_rtp_midi_cj_chapter_m_log_count, log_flags, ENC_BIG_ENDIAN);
|
|
|
|
offset++;
|
|
length--;
|
|
}
|
|
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here the chapter n of the channel-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_cj_chapter_n( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_tree *rtp_midi_cj_chapter_tree;
|
|
proto_tree *rtp_midi_loglist_tree;
|
|
const gchar *note_str;
|
|
unsigned int start_offset = offset;
|
|
guint16 header;
|
|
guint8 note;
|
|
guint8 velocity;
|
|
int log_count;
|
|
int octet_count;
|
|
int low;
|
|
int high;
|
|
int i;
|
|
|
|
/* first we need to get the flags & length of this chapter */
|
|
header = tvb_get_ntohs( tvb, offset );
|
|
log_count = ( header & RTP_MIDI_CJ_CHAPTER_N_MASK_LENGTH ) >> 8;
|
|
low = ( header & RTP_MIDI_CJ_CHAPTER_N_MASK_LOW ) >> 4;
|
|
high = header & RTP_MIDI_CJ_CHAPTER_N_MASK_HIGH;
|
|
|
|
/* how many offbits octets do we have? */
|
|
if ( low <= high ) {
|
|
octet_count = high - low + 1;
|
|
} else if ( ( low == 15 ) && ( high == 0 ) ) {
|
|
octet_count = 0;
|
|
} else if ( ( low == 15 ) && ( high == 1 ) ) {
|
|
octet_count = 0;
|
|
} else {
|
|
return -1;
|
|
}
|
|
|
|
/* special case -> no offbit octets, but 128 note-logs */
|
|
if ( ( log_count == 127 ) && ( low == 15) && ( high == 0 ) ) {
|
|
log_count++;
|
|
}
|
|
|
|
rtp_midi_cj_chapter_tree = proto_tree_add_subtree( tree, tvb, offset, 2 + ( log_count * 2 ) + octet_count,
|
|
ett_rtp_midi_cj_chapter_n, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_N );
|
|
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_n_bflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_n_len, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_n_low, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_n_high, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
|
|
offset += 2;
|
|
|
|
if ( log_count > 0 ) {
|
|
|
|
rtp_midi_loglist_tree = proto_tree_add_subtree( rtp_midi_cj_chapter_tree, tvb, offset, log_count * 2,
|
|
ett_rtp_midi_cj_chapter_n_loglist, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_N_LOGLIST );
|
|
|
|
for ( i = 0; i < log_count; i++ ) {
|
|
|
|
note = tvb_get_guint8( tvb, offset ) & 0x7f;
|
|
velocity = tvb_get_guint8( tvb, offset + 1 ) & 0x7f;
|
|
|
|
note_str = val_to_str_ext( note, &rtp_midi_note_values_ext, rtp_midi_unknown_value_dec );
|
|
|
|
rtp_midi_loglist_tree = proto_tree_add_subtree_format(rtp_midi_loglist_tree, tvb, offset, 2,
|
|
ett_rtp_midi_cj_chapter_n_logitem, NULL, "%s (n=%s, v=%d)", RTP_MIDI_TREE_NAME_CJ_CHAPTER_N_LOGITEM, note_str, velocity );
|
|
|
|
proto_tree_add_item( rtp_midi_loglist_tree, hf_rtp_midi_cj_chapter_n_log_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_tree, hf_rtp_midi_cj_chapter_n_log_notenum, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
|
|
proto_tree_add_item( rtp_midi_loglist_tree, hf_rtp_midi_cj_chapter_n_log_yflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_loglist_tree, hf_rtp_midi_cj_chapter_n_log_velocity, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
}
|
|
|
|
}
|
|
|
|
if ( octet_count > 0 ) {
|
|
|
|
rtp_midi_loglist_tree = proto_tree_add_subtree( rtp_midi_cj_chapter_tree, tvb, offset, log_count,
|
|
ett_rtp_midi_cj_chapter_n_octets, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_N_OCTETS );
|
|
|
|
for ( i = 0; i < octet_count; i++ ) {
|
|
|
|
proto_tree_add_item(rtp_midi_loglist_tree, hf_rtp_midi_cj_chapter_n_log_octet, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
}
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here the chapter e of the channel-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_cj_chapter_e( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_tree *rtp_midi_cj_chapter_tree;
|
|
proto_tree *rtp_midi_loglist_tree, *log_tree;
|
|
const gchar *note_str;
|
|
unsigned int start_offset = offset;
|
|
guint8 header;
|
|
guint8 note;
|
|
guint8 count_vel;
|
|
guint8 octet;
|
|
int log_count;
|
|
int i;
|
|
|
|
/* first we need to get the flags & length of this chapter */
|
|
header = tvb_get_guint8( tvb, offset );
|
|
log_count = header & RTP_MIDI_CJ_CHAPTER_E_MASK_LENGTH;
|
|
|
|
/* count is encoded n+1 */
|
|
log_count++;
|
|
|
|
rtp_midi_cj_chapter_tree = proto_tree_add_subtree( tree, tvb, offset, 1 + ( log_count * 2 ),
|
|
ett_rtp_midi_cj_chapter_e, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_E );
|
|
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_e_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_e_len, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
|
|
rtp_midi_loglist_tree = proto_tree_add_subtree( rtp_midi_cj_chapter_tree, tvb, offset, log_count * 2,
|
|
ett_rtp_midi_cj_chapter_e_loglist, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_E_LOGLIST );
|
|
|
|
for ( i = 0; i < log_count; i++ ) {
|
|
|
|
note = tvb_get_guint8( tvb, offset ) & 0x7f;
|
|
octet = tvb_get_guint8( tvb, offset + 1 );
|
|
count_vel = octet & 0x7f;
|
|
|
|
note_str = val_to_str_ext( note, &rtp_midi_note_values_ext, rtp_midi_unknown_value_dec );
|
|
|
|
if ( octet & 0x80 ) {
|
|
log_tree = proto_tree_add_subtree_format(rtp_midi_loglist_tree, tvb, offset, 2, ett_rtp_midi_cj_chapter_e_logitem, NULL,
|
|
"%s (n=%s, v=%d)", RTP_MIDI_TREE_NAME_CJ_CHAPTER_E_LOGITEM1, note_str, count_vel );
|
|
} else {
|
|
log_tree = proto_tree_add_subtree_format(rtp_midi_loglist_tree, tvb, offset, 2, ett_rtp_midi_cj_chapter_e_logitem, NULL,
|
|
"%s (n=%s, c=%d)", RTP_MIDI_TREE_NAME_CJ_CHAPTER_E_LOGITEM2, note_str, count_vel );
|
|
}
|
|
|
|
proto_tree_add_item( log_tree, hf_rtp_midi_cj_chapter_e_log_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( log_tree, hf_rtp_midi_cj_chapter_e_log_notenum, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
|
|
proto_tree_add_item( log_tree, hf_rtp_midi_cj_chapter_e_log_vflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
if ( octet & 0x80 ) {
|
|
proto_tree_add_item( log_tree, hf_rtp_midi_cj_chapter_e_log_velocity, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
} else {
|
|
proto_tree_add_item( log_tree, hf_rtp_midi_cj_chapter_e_log_count, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
}
|
|
|
|
offset++;
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Here the chapter a of the channel-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_cj_chapter_a( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_tree *rtp_midi_cj_chapter_tree;
|
|
proto_tree *rtp_midi_loglist_tree, *log_tree;
|
|
const gchar *note_str;
|
|
unsigned int start_offset = offset;
|
|
guint8 header;
|
|
guint8 note;
|
|
guint8 pressure;
|
|
int log_count;
|
|
int i;
|
|
|
|
/* first we need to get the flags & length of this chapter */
|
|
header = tvb_get_guint8( tvb, offset );
|
|
log_count = header & RTP_MIDI_CJ_CHAPTER_A_MASK_LENGTH;
|
|
|
|
/* count is encoded n+1 */
|
|
log_count++;
|
|
|
|
rtp_midi_cj_chapter_tree = proto_tree_add_subtree( tree, tvb, offset, 1 + ( log_count * 2 ), ett_rtp_midi_cj_chapter_a, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_A );
|
|
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_a_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_a_len, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
|
|
rtp_midi_loglist_tree = proto_tree_add_subtree( rtp_midi_cj_chapter_tree, tvb, offset, log_count * 2, ett_rtp_midi_cj_chapter_a_loglist, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_A_LOGLIST );
|
|
|
|
for ( i = 0; i < log_count; i++ ) {
|
|
|
|
note = tvb_get_guint8( tvb, offset ) & 0x7f;
|
|
pressure = tvb_get_guint8( tvb, offset + 1 ) & 0x7f;
|
|
|
|
note_str = val_to_str_ext( note, &rtp_midi_note_values_ext, rtp_midi_unknown_value_dec );
|
|
|
|
log_tree = proto_tree_add_subtree_format(rtp_midi_loglist_tree, tvb, offset, 2, ett_rtp_midi_cj_chapter_a_logitem, NULL,
|
|
"%s (n=%s, p=%d)", RTP_MIDI_TREE_NAME_CJ_CHAPTER_A_LOGITEM, note_str, pressure );
|
|
|
|
proto_tree_add_item( log_tree, hf_rtp_midi_cj_chapter_a_log_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( log_tree, hf_rtp_midi_cj_chapter_a_log_notenum, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
|
|
proto_tree_add_item( log_tree, hf_rtp_midi_cj_chapter_a_log_xflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( log_tree, hf_rtp_midi_cj_chapter_a_log_pressure, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* Here a channel-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_channel_journal( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_tree *rtp_midi_chanjournal_tree;
|
|
proto_tree *rtp_midi_cj_chapters_tree;
|
|
proto_tree *rtp_midi_cj_chapter_tree;
|
|
guint32 chanflags;
|
|
guint16 chanjourlen;
|
|
int consumed = 0;
|
|
int ext_consumed = 0;
|
|
|
|
/* first we need to get the flags & length of this channel-journal */
|
|
chanflags = tvb_get_ntoh24( tvb, offset );
|
|
chanjourlen = ( chanflags & RTP_MIDI_CJ_MASK_LENGTH ) >> 8;
|
|
|
|
rtp_midi_chanjournal_tree = proto_tree_add_subtree( tree, tvb, offset, chanjourlen, ett_rtp_midi_channeljournal, NULL,
|
|
val_to_str( ( chanflags & RTP_MIDI_CJ_MASK_CHANNEL ) >> RTP_MIDI_CJ_CHANNEL_SHIFT, rtp_midi_channels, rtp_midi_unknown_value_hex ) );
|
|
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_sflag, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_chan, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_hflag, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_len, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_toc_p, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_toc_c, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_toc_m, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_toc_w, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_toc_n, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_toc_e, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_toc_t, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_chanjournal_tree, hf_rtp_midi_chanjour_toc_a, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
|
|
rtp_midi_cj_chapters_tree = proto_tree_add_subtree( rtp_midi_chanjournal_tree, tvb, offset + 3, chanjourlen - 3,
|
|
ett_rtp_midi_channelchapters, NULL, RTP_MIDI_TREE_NAME_CHANNEL_CHAPTERS );
|
|
|
|
/* take care of length of header */
|
|
offset += 3;
|
|
consumed += 3;
|
|
|
|
/* Do we have a program change chapter? */
|
|
if ( chanflags & RTP_MIDI_CJ_FLAG_P ) {
|
|
|
|
rtp_midi_cj_chapter_tree = proto_tree_add_subtree( rtp_midi_cj_chapters_tree, tvb, offset, 3,
|
|
ett_rtp_midi_cj_chapter_p, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_P );
|
|
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_p_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_p_program, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_p_bflag, tvb, offset + 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_p_bank_msb, tvb, offset + 1, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_p_xflag, tvb, offset + 2, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_p_bank_lsb, tvb, offset + 2, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset += 3;
|
|
consumed += 3;
|
|
}
|
|
|
|
/* Do we have a control chapter? */
|
|
if ( chanflags & RTP_MIDI_CJ_FLAG_C ) {
|
|
ext_consumed = decode_cj_chapter_c( tvb, pinfo, rtp_midi_cj_chapters_tree, offset );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
consumed += ext_consumed;
|
|
offset += ext_consumed;
|
|
|
|
}
|
|
|
|
/* Do we have a parameter changes? */
|
|
if ( chanflags & RTP_MIDI_CJ_FLAG_M ) {
|
|
ext_consumed = decode_cj_chapter_m( tvb, pinfo, rtp_midi_cj_chapters_tree, offset );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
consumed += ext_consumed;
|
|
offset += ext_consumed;
|
|
}
|
|
|
|
/* Do we have a pitch-wheel chapter? */
|
|
if ( chanflags & RTP_MIDI_CJ_FLAG_W ) {
|
|
|
|
rtp_midi_cj_chapter_tree = proto_tree_add_subtree( rtp_midi_cj_chapters_tree, tvb, offset, 2,
|
|
ett_rtp_midi_cj_chapter_w, NULL, RTP_MIDI_TREE_NAME_CJ_CHAPTER_W );
|
|
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_w_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_w_first, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
consumed++;
|
|
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_w_rflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_cj_chapter_tree, hf_rtp_midi_cj_chapter_w_second, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
consumed++;
|
|
}
|
|
|
|
/* Do we have a note on/off chapter? */
|
|
if ( chanflags & RTP_MIDI_CJ_FLAG_N ) {
|
|
ext_consumed = decode_cj_chapter_n( tvb, pinfo, rtp_midi_cj_chapters_tree, offset );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
consumed += ext_consumed;
|
|
offset += ext_consumed;
|
|
}
|
|
|
|
/* Do we have a note command extras chapter? */
|
|
if ( chanflags & RTP_MIDI_CJ_FLAG_E ) {
|
|
ext_consumed = decode_cj_chapter_e( tvb, pinfo, rtp_midi_cj_chapters_tree, offset );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
consumed += ext_consumed;
|
|
offset += ext_consumed;
|
|
}
|
|
|
|
/* Do we have channel aftertouch chapter? */
|
|
if ( chanflags & RTP_MIDI_CJ_FLAG_T ) {
|
|
static const int * flags_t[] = {
|
|
&hf_rtp_midi_cj_chapter_t_sflag,
|
|
&hf_rtp_midi_cj_chapter_t_pressure,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_cj_chapters_tree, tvb, offset, hf_rtp_midi_cj_chapter_t_channel_aftertouch, ett_rtp_midi_cj_chapter_t, flags_t, ENC_NA);
|
|
|
|
offset++;
|
|
consumed++;
|
|
}
|
|
|
|
/* Do we have a poly aftertouch chapter? */
|
|
if ( chanflags & RTP_MIDI_CJ_FLAG_A ) {
|
|
ext_consumed = decode_cj_chapter_a( tvb, pinfo, rtp_midi_cj_chapters_tree, offset );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
consumed += ext_consumed;
|
|
}
|
|
|
|
/* Make sanity check for consumed data vs. stated length of this channels journal */
|
|
if ( consumed != chanjourlen ) {
|
|
return -1;
|
|
}
|
|
return consumed;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here the chapter D F4-field of the system-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_sj_chapter_d_f4( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
|
|
proto_tree *rtp_midi_field_tree;
|
|
unsigned int start_offset = offset;
|
|
guint16 f4flags;
|
|
guint16 f4length;
|
|
|
|
/* Get flags & length */
|
|
f4flags = tvb_get_ntohs( tvb, offset );
|
|
f4length = f4flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_MASK_LENGTH;
|
|
|
|
/* now we can display our tree, as we now have the full length */
|
|
rtp_midi_field_tree = proto_tree_add_subtree( tree, tvb, offset, f4length, ett_rtp_midi_sj_chapter_d_field_j, NULL, RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_J );
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_sflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_cflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_vflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_lflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_dsz, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_length, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
|
|
offset += 2;
|
|
f4length -= 2;
|
|
|
|
if ( f4flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_C ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_count, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
f4length--;
|
|
}
|
|
|
|
if ( f4flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_V ) {
|
|
|
|
int valuelen = 0;
|
|
guint8 octet;
|
|
|
|
/* variable length field - ends with an octet with MSB set */
|
|
for (;;) {
|
|
octet = tvb_get_guint8( tvb, offset+valuelen );
|
|
valuelen++;
|
|
if ( octet & 0x80 ) {
|
|
break;
|
|
}
|
|
}
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_value, tvb, offset, valuelen, ENC_NA );
|
|
offset += valuelen;
|
|
f4length -= valuelen;
|
|
}
|
|
|
|
if ( f4flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_L ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_legal, tvb, offset, f4length, ENC_NA );
|
|
offset += f4length;
|
|
}
|
|
|
|
/* if we still have data, the length-field was incorrect we dump the data here and abort! */
|
|
if ( f4length > 0 ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_data, tvb, offset, f4length, ENC_NA );
|
|
offset += f4length;
|
|
/* must be a protocol error - since we have a length, we can recover...*/
|
|
}
|
|
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here the chapter D F5-field of the system-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_sj_chapter_d_f5( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
|
|
proto_tree *rtp_midi_field_tree;
|
|
unsigned int start_offset = offset;
|
|
guint16 f5flags;
|
|
guint16 f5length;
|
|
|
|
/* Get flags & length */
|
|
f5flags = tvb_get_ntohs( tvb, offset );
|
|
f5length = f5flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_MASK_LENGTH;
|
|
|
|
/* now we can display our tree, as we now have the full length */
|
|
rtp_midi_field_tree = proto_tree_add_subtree( tree, tvb, offset, f5length, ett_rtp_midi_sj_chapter_d_field_k, NULL, RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_K );
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_sflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_cflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_vflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_lflag, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_dsz, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_length, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
|
|
offset += 2;
|
|
f5length -= 2;
|
|
|
|
if ( f5flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_C ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_count, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
f5length--;
|
|
}
|
|
|
|
if ( f5flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_V ) {
|
|
|
|
int valuelen = 0;
|
|
guint8 octet;
|
|
|
|
/* variable length field - ends with an octet with MSB set */
|
|
for (;;) {
|
|
octet = tvb_get_guint8( tvb, offset+valuelen );
|
|
valuelen++;
|
|
if ( octet & 0x80 ) {
|
|
break;
|
|
}
|
|
}
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_value, tvb, offset, valuelen, ENC_NA );
|
|
offset += valuelen;
|
|
f5length -= valuelen;
|
|
}
|
|
|
|
if ( f5flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_L ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_legal, tvb, offset, f5length, ENC_NA );
|
|
offset += f5length;
|
|
f5length = 0;
|
|
}
|
|
|
|
/* if we still have data, we dump it here - see above! */
|
|
if ( f5length > 0 ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_syscom_data, tvb, offset, f5length, ENC_NA );
|
|
offset += f5length;
|
|
/* must be a protocol error - since we have a length, we can recover...*/
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here the chapter D F9-field of the system-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_sj_chapter_d_f9( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
|
|
proto_tree *rtp_midi_field_tree;
|
|
unsigned int start_offset = offset;
|
|
guint8 f9flags;
|
|
guint8 f9length;
|
|
|
|
/* Get flags & length */
|
|
f9flags = tvb_get_guint8( tvb, offset );
|
|
f9length = f9flags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_MASK_LENGTH;
|
|
|
|
/* now we can display our tree, as we now have the full length */
|
|
rtp_midi_field_tree = proto_tree_add_subtree( tree, tvb, offset, f9length, ett_rtp_midi_sj_chapter_d_field_y, NULL, RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_Y );
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_cflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_lflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_length, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
f9length--;
|
|
|
|
if ( f9flags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_C ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_count, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
f9length--;
|
|
}
|
|
|
|
if ( f9flags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_L ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_legal, tvb, offset, f9length, ENC_NA );
|
|
offset += f9length;
|
|
f9length = 0;
|
|
}
|
|
|
|
/* if we still have data, the length-field was incorrect we dump the data here and abort! */
|
|
|
|
if ( f9length > 0 ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_data, tvb, offset, f9length, ENC_NA );
|
|
offset += f9length;
|
|
/* must be a protocol error - since we have a length, we can recover...*/
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
/*
|
|
* Here the chapter D FD-field of the system-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_sj_chapter_d_fd( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
|
|
proto_tree *rtp_midi_field_tree;
|
|
unsigned int start_offset = offset;
|
|
guint8 fdflags;
|
|
guint8 fdlength;
|
|
|
|
/* Get flags & length */
|
|
fdflags = tvb_get_guint8( tvb, offset );
|
|
fdlength = fdflags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_MASK_LENGTH;
|
|
|
|
/* now we can display our tree, as we now have the full length */
|
|
rtp_midi_field_tree = proto_tree_add_subtree( tree, tvb, offset, fdlength, ett_rtp_midi_sj_chapter_d_field_z, NULL, RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_Z );
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_cflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_lflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_length, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
fdlength--;
|
|
|
|
if ( fdflags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_C ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_count, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
fdlength--;
|
|
}
|
|
|
|
if ( fdflags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_L ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_legal, tvb, offset, fdlength, ENC_NA );
|
|
offset += fdlength;
|
|
fdlength = 0;
|
|
}
|
|
|
|
/* if we still have data, the length-field was incorrect we dump the data here and abort! */
|
|
|
|
if ( fdlength > 0 ) {
|
|
|
|
proto_tree_add_item( rtp_midi_field_tree, hf_rtp_midi_sj_chapter_d_sysreal_data, tvb, offset, fdlength, ENC_NA );
|
|
|
|
offset += fdlength;
|
|
/* must be a protocol error - since we have a length, we can recover...*/
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Here the chapter D of the channel-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_sj_chapter_d( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_item *tix;
|
|
proto_tree *rtp_midi_sj_chapter_tree;
|
|
guint8 header;
|
|
unsigned int start_offset = offset;
|
|
int ext_consumed;
|
|
|
|
static const int * chapter_d_flags[] = {
|
|
&hf_rtp_midi_sj_chapter_d_sflag,
|
|
&hf_rtp_midi_sj_chapter_d_bflag,
|
|
&hf_rtp_midi_sj_chapter_d_gflag,
|
|
&hf_rtp_midi_sj_chapter_d_hflag,
|
|
&hf_rtp_midi_sj_chapter_d_jflag,
|
|
&hf_rtp_midi_sj_chapter_d_kflag,
|
|
&hf_rtp_midi_sj_chapter_d_yflag,
|
|
&hf_rtp_midi_sj_chapter_d_zflag,
|
|
NULL
|
|
};
|
|
|
|
/* first we need to get the flags of this chapter */
|
|
header = tvb_get_guint8( tvb, offset );
|
|
|
|
/*
|
|
* we don't know the complete length yet - we know that we have at least the header -> 1.
|
|
* At the end we set the real length...
|
|
*/
|
|
tix = proto_tree_add_bitmask(tree, tvb, offset, hf_rtp_midi_sj_chapter_d_simple_system_commands, ett_rtp_midi_sj_chapter_d, chapter_d_flags, ENC_NA);
|
|
rtp_midi_sj_chapter_tree = proto_item_add_subtree( tix, ett_rtp_midi_sj_chapter_d );
|
|
|
|
/* done with header */
|
|
offset++;
|
|
|
|
/* do we have Reset field? */
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_B ) {
|
|
|
|
static const int * reset_flags[] = {
|
|
&hf_rtp_midi_sj_chapter_d_reset_sflag,
|
|
&hf_rtp_midi_sj_chapter_d_reset_count,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_sj_chapter_tree, tvb, offset, hf_rtp_midi_sj_chapter_d_reset, ett_rtp_midi_sj_chapter_d_field_b, reset_flags, ENC_NA);
|
|
offset++;
|
|
}
|
|
|
|
/* do we have Tune request field? */
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_G ) {
|
|
|
|
static const int * tune_flags[] = {
|
|
&hf_rtp_midi_sj_chapter_d_tune_sflag,
|
|
&hf_rtp_midi_sj_chapter_d_tune_count,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_sj_chapter_tree, tvb, offset, hf_rtp_midi_sj_chapter_d_tune, ett_rtp_midi_sj_chapter_d_field_g, tune_flags, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
}
|
|
|
|
/* do we have Song select field? */
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_H ) {
|
|
|
|
static const int * song_flags[] = {
|
|
&hf_rtp_midi_sj_chapter_d_song_sel_sflag,
|
|
&hf_rtp_midi_sj_chapter_d_song_sel_value,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_sj_chapter_tree, tvb, offset, hf_rtp_midi_sj_chapter_d_song_sel, ett_rtp_midi_sj_chapter_d_field_h, song_flags, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
}
|
|
|
|
/* do we have 0xF4 field? */
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_J ) {
|
|
ext_consumed = decode_sj_chapter_d_f4( tvb, pinfo, rtp_midi_sj_chapter_tree, offset );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
offset += ext_consumed;
|
|
}
|
|
|
|
/* do we have 0xF5 field? */
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_K ) {
|
|
ext_consumed = decode_sj_chapter_d_f5( tvb, pinfo, rtp_midi_sj_chapter_tree, offset );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
offset += ext_consumed;
|
|
}
|
|
|
|
/* do we have 0xF9 field? */
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_Y ) {
|
|
ext_consumed = decode_sj_chapter_d_f9( tvb, pinfo, rtp_midi_sj_chapter_tree, offset );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
offset += ext_consumed;
|
|
}
|
|
|
|
/* do we have 0xFD field? */
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_Z ) {
|
|
ext_consumed = decode_sj_chapter_d_fd( tvb, pinfo, rtp_midi_sj_chapter_tree, offset );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
offset += ext_consumed;
|
|
}
|
|
|
|
|
|
/* now we know the complete length and set it. */
|
|
proto_item_set_len( tix, offset-start_offset );
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here the chapter Q of the channel-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_sj_chapter_q( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_tree *rtp_midi_sj_chapter_tree;
|
|
guint8 header;
|
|
unsigned int start_offset = offset;
|
|
int len = 1;
|
|
|
|
/* first we need to get the flags of this chapter */
|
|
header = tvb_get_guint8( tvb, offset );
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_Q_FLAG_C ) {
|
|
len += 2;
|
|
}
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_Q_FLAG_T ) {
|
|
len += 3;
|
|
}
|
|
|
|
/* now we have the length... */
|
|
rtp_midi_sj_chapter_tree = proto_tree_add_subtree( tree, tvb, offset, len, ett_rtp_midi_sj_chapter_q, NULL, RTP_MIDI_TREE_NAME_SJ_CHAPTER_Q );
|
|
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_q_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_q_nflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_q_dflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_q_cflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_q_tflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_Q_FLAG_C ) {
|
|
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_q_clock, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
|
|
offset += 3;
|
|
|
|
} else {
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_q_top, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
}
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_Q_FLAG_T ) {
|
|
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_q_timetools, tvb, offset, 3, ENC_BIG_ENDIAN );
|
|
|
|
offset += 3;
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here the chapter F of the channel-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_sj_chapter_f( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_tree *rtp_midi_sj_chapter_tree;
|
|
guint8 header;
|
|
unsigned int start_offset = offset;
|
|
int len = 1;
|
|
|
|
/* first we need to get the flags of this chapter */
|
|
header = tvb_get_guint8( tvb, offset );
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_F_FLAG_C ) {
|
|
len += 4;
|
|
}
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_F_FLAG_P ) {
|
|
len += 4;
|
|
}
|
|
|
|
/* now we have the length... */
|
|
rtp_midi_sj_chapter_tree = proto_tree_add_subtree( tree, tvb, offset, len, ett_rtp_midi_sj_chapter_f, NULL, RTP_MIDI_TREE_NAME_SJ_CHAPTER_F );
|
|
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_f_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_f_cflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_f_pflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_f_qflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_f_dflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_f_point, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
offset++;
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_F_FLAG_C ) {
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_F_FLAG_Q ) {
|
|
static const int * fq_flags[] = {
|
|
&hf_rtp_midi_sj_chapter_f_mt0,
|
|
&hf_rtp_midi_sj_chapter_f_mt1,
|
|
&hf_rtp_midi_sj_chapter_f_mt2,
|
|
&hf_rtp_midi_sj_chapter_f_mt3,
|
|
&hf_rtp_midi_sj_chapter_f_mt4,
|
|
&hf_rtp_midi_sj_chapter_f_mt5,
|
|
&hf_rtp_midi_sj_chapter_f_mt6,
|
|
&hf_rtp_midi_sj_chapter_f_mt7,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_sj_chapter_tree, tvb, offset, hf_rtp_midi_sj_chapter_f_complete, ett_rtp_midi_sj_chapter_f_complete, fq_flags, ENC_BIG_ENDIAN);
|
|
} else {
|
|
static const int * f_flags[] = {
|
|
&hf_rtp_midi_sj_chapter_f_hr,
|
|
&hf_rtp_midi_sj_chapter_f_mn,
|
|
&hf_rtp_midi_sj_chapter_f_sc,
|
|
&hf_rtp_midi_sj_chapter_f_fr,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_sj_chapter_tree, tvb, offset, hf_rtp_midi_sj_chapter_f_complete, ett_rtp_midi_sj_chapter_f_complete, f_flags, ENC_BIG_ENDIAN);
|
|
}
|
|
|
|
offset += 4;
|
|
}
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_F_FLAG_P ) {
|
|
static const int * fp_flags[] = {
|
|
&hf_rtp_midi_sj_chapter_f_mt0,
|
|
&hf_rtp_midi_sj_chapter_f_mt1,
|
|
&hf_rtp_midi_sj_chapter_f_mt2,
|
|
&hf_rtp_midi_sj_chapter_f_mt3,
|
|
&hf_rtp_midi_sj_chapter_f_mt4,
|
|
&hf_rtp_midi_sj_chapter_f_mt5,
|
|
&hf_rtp_midi_sj_chapter_f_mt6,
|
|
&hf_rtp_midi_sj_chapter_f_mt7,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_sj_chapter_tree, tvb, offset, hf_rtp_midi_sj_chapter_f_partial, ett_rtp_midi_sj_chapter_f_partial, fp_flags, ENC_BIG_ENDIAN);
|
|
offset += 4;
|
|
}
|
|
|
|
return offset-start_offset;
|
|
}
|
|
|
|
/*
|
|
* Here the chapter X of the channel-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_sj_chapter_x( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset, unsigned int max_length ) {
|
|
proto_tree *rtp_midi_sj_chapter_tree;
|
|
proto_tree *rtp_midi_sj_data_tree;
|
|
guint8 header;
|
|
guint8 octet;
|
|
unsigned int consumed = 0;
|
|
unsigned int cmdlen = 0;
|
|
unsigned int i;
|
|
|
|
/* first we need to get the flags of this chapter */
|
|
header = tvb_get_guint8( tvb, offset );
|
|
|
|
rtp_midi_sj_chapter_tree = proto_tree_add_subtree( tree, tvb, offset, max_length, ett_rtp_midi_sj_chapter_x, NULL, RTP_MIDI_TREE_NAME_SJ_CHAPTER_X );
|
|
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_tflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_cflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_fflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_dflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_lflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_sta, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
consumed++;
|
|
offset++;
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_X_FLAG_T ) {
|
|
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_tcount, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
consumed++;
|
|
offset++;
|
|
}
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_X_FLAG_C ) {
|
|
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_count, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
consumed++;
|
|
offset++;
|
|
}
|
|
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_X_FLAG_F ) {
|
|
unsigned int field = 0;
|
|
unsigned int fieldlen = 0;
|
|
|
|
/* FIRST is "compressed" using only the necessary amount of octets, like delta-time */
|
|
for ( i=0; i < 4; i++ ) {
|
|
|
|
/* do we still fit in the dissected packet & in the length restriction of this chapter? */
|
|
if ( ( !( consumed >= max_length ) ) || ( !tvb_bytes_exist( tvb, offset + fieldlen, 1 ) ) ) {
|
|
return -1;
|
|
}
|
|
|
|
octet = tvb_get_guint8( tvb, offset + fieldlen );
|
|
field = ( field << 7 ) | ( octet & RTP_MIDI_DELTA_TIME_OCTET_MASK );
|
|
fieldlen++;
|
|
|
|
if ( ( octet & RTP_MIDI_DELTA_TIME_EXTENSION ) == 0 ) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
switch (fieldlen) {
|
|
case 1:
|
|
proto_tree_add_uint ( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_first1, tvb, offset, fieldlen, field );
|
|
break;
|
|
case 2:
|
|
proto_tree_add_uint ( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_first2, tvb, offset, fieldlen, field );
|
|
break;
|
|
case 3:
|
|
proto_tree_add_uint ( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_first3, tvb, offset, fieldlen, field );
|
|
break;
|
|
case 4:
|
|
proto_tree_add_uint ( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_first4, tvb, offset, fieldlen, field );
|
|
break;
|
|
|
|
}
|
|
consumed += fieldlen;
|
|
offset += fieldlen;
|
|
|
|
}
|
|
|
|
/* XXX: 'cmdlen' in the following is always 0 (since initialized to 0 above) ??? */
|
|
if ( header & RTP_MIDI_SJ_CHAPTER_X_FLAG_D ) {
|
|
rtp_midi_sj_data_tree = proto_tree_add_subtree( rtp_midi_sj_chapter_tree, tvb, offset, max_length - consumed,
|
|
ett_rtp_midi_sj_chapter_x_data, NULL, RTP_MIDI_TREE_NAME_SJ_CHAPTER_X_DATA );
|
|
while ( consumed < max_length ) {
|
|
octet = tvb_get_guint8( tvb, offset + cmdlen );
|
|
if ( octet & 0x80 ) {
|
|
proto_tree_add_item( rtp_midi_sj_data_tree, hf_rtp_midi_sj_chapter_x_data, tvb, offset, cmdlen, ENC_NA );
|
|
offset += cmdlen;
|
|
cmdlen = 0;
|
|
}
|
|
consumed += 1;
|
|
}
|
|
/* unfinished command still to put into tree */
|
|
if ( cmdlen ) {
|
|
proto_tree_add_item( rtp_midi_sj_data_tree, hf_rtp_midi_sj_chapter_x_invalid_data, tvb, offset, cmdlen, ENC_NA );
|
|
offset += cmdlen;
|
|
}
|
|
}
|
|
|
|
/* this should not ever enter - we still have data, but flag d was apparently not set... */
|
|
if ( consumed < max_length ) {
|
|
|
|
proto_tree_add_item( rtp_midi_sj_chapter_tree, hf_rtp_midi_sj_chapter_x_invalid_data, tvb, offset, max_length - consumed, ENC_NA );
|
|
consumed = max_length;
|
|
}
|
|
|
|
return consumed;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* Here the system-journal is decoded.
|
|
*/
|
|
static int
|
|
decode_system_journal( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned int offset ) {
|
|
proto_tree *rtp_midi_sysjournal_tree;
|
|
proto_tree *rtp_midi_sj_chapters_tree;
|
|
unsigned int start_offset = offset;
|
|
int ext_consumed = 0;
|
|
guint16 sysjourlen;
|
|
guint16 systemflags;
|
|
|
|
systemflags = tvb_get_ntohs( tvb, offset );
|
|
sysjourlen = systemflags & RTP_MIDI_SJ_MASK_LENGTH;
|
|
|
|
rtp_midi_sysjournal_tree = proto_tree_add_subtree( tree, tvb, offset, sysjourlen, ett_rtp_midi_systemjournal, NULL, RTP_MIDI_TREE_NAME_SYSTEM_JOURNAL );
|
|
|
|
proto_tree_add_item( rtp_midi_sysjournal_tree, hf_rtp_midi_sysjour_toc_s, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sysjournal_tree, hf_rtp_midi_sysjour_toc_d, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sysjournal_tree, hf_rtp_midi_sysjour_toc_v, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sysjournal_tree, hf_rtp_midi_sysjour_toc_q, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sysjournal_tree, hf_rtp_midi_sysjour_toc_f, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sysjournal_tree, hf_rtp_midi_sysjour_toc_x, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_sysjournal_tree, hf_rtp_midi_sysjour_len, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
|
|
offset += 2;
|
|
|
|
rtp_midi_sj_chapters_tree = proto_tree_add_subtree( rtp_midi_sysjournal_tree, tvb, offset, sysjourlen - 2,
|
|
ett_rtp_midi_systemchapters, NULL, RTP_MIDI_TREE_NAME_SYSTEM_CHAPTERS );
|
|
|
|
/* Do we have a simple system commands chapter? */
|
|
if ( systemflags & RTP_MIDI_SJ_FLAG_D ) {
|
|
offset += decode_sj_chapter_d( tvb, pinfo, rtp_midi_sj_chapters_tree, offset );
|
|
}
|
|
|
|
/* Do we have a active sensing chapter? */
|
|
if ( systemflags & RTP_MIDI_SJ_FLAG_V ) {
|
|
static const int * v_flags[] = {
|
|
&hf_rtp_midi_sj_chapter_v_sflag,
|
|
&hf_rtp_midi_sj_chapter_v_count,
|
|
NULL
|
|
};
|
|
|
|
proto_tree_add_bitmask(rtp_midi_sj_chapters_tree, tvb, offset, hf_rtp_midi_sj_chapter_v, ett_rtp_midi_sj_chapter_v, v_flags, ENC_BIG_ENDIAN);
|
|
|
|
offset++;
|
|
}
|
|
|
|
/* Do we have a sequencer state commands chapter? */
|
|
if ( systemflags & RTP_MIDI_SJ_FLAG_Q ) {
|
|
offset += decode_sj_chapter_q( tvb, pinfo, rtp_midi_sj_chapters_tree, offset );
|
|
}
|
|
|
|
/* Do we have a MTC chapter? */
|
|
if ( systemflags & RTP_MIDI_SJ_FLAG_F ) {
|
|
offset += decode_sj_chapter_f( tvb, pinfo, rtp_midi_sj_chapters_tree, offset );
|
|
}
|
|
|
|
|
|
/* Do we have a Sysex chapter? */
|
|
if ( systemflags & RTP_MIDI_SJ_FLAG_X ) {
|
|
ext_consumed = decode_sj_chapter_x( tvb, pinfo, rtp_midi_sj_chapters_tree, offset, sysjourlen - (offset-start_offset) );
|
|
if ( ext_consumed < 0 ) {
|
|
return ext_consumed;
|
|
}
|
|
offset += ext_consumed;
|
|
}
|
|
|
|
|
|
/* Make sanity check for consumed data vs. stated length of system journal */
|
|
if ( offset-start_offset != sysjourlen ) {
|
|
return -1;
|
|
}
|
|
return offset-start_offset;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* This is the main dissector function for the RTP-MIDI protocol
|
|
* It decodes the wrapper of the command-section and punts
|
|
* decoding of delta-time and the actual MIDI-command itself to
|
|
* external decoders. Afterwards the journal-section is decoded.
|
|
*/
|
|
|
|
static int
|
|
dissect_rtp_midi( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_ )
|
|
{
|
|
proto_item *ti;
|
|
proto_tree *rtp_midi_tree;
|
|
unsigned int offset = 0;
|
|
|
|
guint8 flags; /* used for command-section and journal-section*/
|
|
unsigned int cmd_len;
|
|
unsigned int cmd_count;
|
|
guint8 runningstatus;
|
|
|
|
int consumed;
|
|
unsigned int rsoffset = 0;
|
|
|
|
guint8 totchan;
|
|
|
|
unsigned int i;
|
|
|
|
col_set_str( pinfo->cinfo, COL_PROTOCOL, RTP_MIDI_DISSECTOR_SHORTNAME );
|
|
col_clear( pinfo->cinfo, COL_INFO );
|
|
|
|
/*
|
|
* MIDI command section
|
|
*/
|
|
|
|
/* RTP-MIDI starts with 4 bits of flags... */
|
|
flags = tvb_get_guint8( tvb, offset );
|
|
|
|
ti = proto_tree_add_item( tree, proto_rtp_midi, tvb, 0, -1, ENC_NA );
|
|
rtp_midi_tree = proto_item_add_subtree( ti, ett_rtp_midi);
|
|
|
|
/* Decode those four flags */
|
|
proto_tree_add_item( rtp_midi_tree, hf_rtp_midi_bflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_tree, hf_rtp_midi_jflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_tree, hf_rtp_midi_zflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_tree, hf_rtp_midi_pflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
/* ...followed by a length-field of at least 4 bits */
|
|
cmd_len = flags & RTP_MIDI_CS_MASK_SHORTLEN;
|
|
|
|
/* see if we have small or large len-field */
|
|
if (flags & RTP_MIDI_CS_FLAG_B) {
|
|
cmd_len = tvb_get_ntohs( tvb, offset) & RTP_MIDI_CS_MASK_LONGLEN;
|
|
proto_tree_add_item( rtp_midi_tree, hf_rtp_midi_longlen, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
} else {
|
|
proto_tree_add_item( rtp_midi_tree, hf_rtp_midi_shortlen, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
offset++;
|
|
}
|
|
|
|
/* if we have a command-section -> dissect it */
|
|
if ( cmd_len ) {
|
|
proto_tree *rtp_midi_commands_tree;
|
|
|
|
rtp_midi_commands_tree = proto_tree_add_subtree( rtp_midi_tree, tvb, offset, cmd_len, ett_rtp_midi_commands, NULL, RTP_MIDI_TREE_NAME_COMMAND );
|
|
|
|
/* No commands decoded yet */
|
|
cmd_count = 0;
|
|
|
|
/* RTP-MIDI-pdus always start with no running status */
|
|
runningstatus = 0;
|
|
|
|
/* Multiple MIDI-commands might follow - the exact number can only be discovered by really decoding the commands! */
|
|
while ( cmd_len) {
|
|
|
|
/* for the first command we only have a delta-time if Z-Flag is set */
|
|
if ( ( cmd_count ) || ( flags & RTP_MIDI_CS_FLAG_Z ) ) {
|
|
|
|
/* Decode a delta-time */
|
|
consumed = decodetime( tvb, pinfo, rtp_midi_commands_tree, offset );
|
|
|
|
/* seek to next command and set remaining length */
|
|
offset += consumed;
|
|
cmd_len -= consumed;
|
|
}
|
|
|
|
/* Only decode MIDI-command if there is any data left - it is valid to only have delta-time! */
|
|
if ( cmd_len ) {
|
|
|
|
/* Decode a MIDI-command - if 0 is returned something went wrong */
|
|
consumed = decodemidi( tvb, pinfo, rtp_midi_commands_tree, cmd_count, offset, cmd_len, &runningstatus, &rsoffset );
|
|
if ( -1 == consumed ) {
|
|
return offset;
|
|
}
|
|
|
|
/* seek to next delta-time and set remaining length */
|
|
offset += consumed;
|
|
cmd_len -= consumed;
|
|
|
|
/* as we have successfully decoded another command, increment count */
|
|
cmd_count++;
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
* Journal section
|
|
*/
|
|
|
|
/* if we have a journal-section -> dissect it */
|
|
if ( flags & RTP_MIDI_CS_FLAG_J ) {
|
|
proto_tree *rtp_midi_journal_tree;
|
|
|
|
rtp_midi_journal_tree = proto_tree_add_subtree( rtp_midi_tree, tvb, offset, -1, ett_rtp_midi_journal, NULL, RTP_MIDI_TREE_NAME_JOURNAL );
|
|
|
|
/* lets get the main flags from the recovery journal header */
|
|
flags = tvb_get_guint8( tvb, offset );
|
|
|
|
proto_tree_add_item( rtp_midi_journal_tree, hf_rtp_midi_sflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_journal_tree, hf_rtp_midi_yflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_journal_tree, hf_rtp_midi_aflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
proto_tree_add_item( rtp_midi_journal_tree, hf_rtp_midi_hflag, tvb, offset, 1, ENC_BIG_ENDIAN );
|
|
|
|
/* At the same place we find the total channels encoded in the channel journal */
|
|
totchan = flags & RTP_MIDI_JS_MASK_TOTALCHANNELS;
|
|
proto_tree_add_item( rtp_midi_journal_tree, hf_rtp_midi_totchan, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
|
|
/* the checkpoint-sequence-number can be used to see if the recovery journal covers all lost events */
|
|
proto_tree_add_item( rtp_midi_journal_tree, hf_rtp_midi_check_seq_num, tvb, offset, 2, ENC_BIG_ENDIAN );
|
|
offset += 2;
|
|
|
|
|
|
/* do we have system journal? */
|
|
if ( flags & RTP_MIDI_JS_FLAG_Y ) {
|
|
/* first we need to get the flags & length from the system-journal */
|
|
consumed = decode_system_journal( tvb, pinfo, rtp_midi_journal_tree, offset );
|
|
|
|
if ( -1 == consumed ) {
|
|
return offset;
|
|
}
|
|
|
|
/* seek to optional channel-journals-section */
|
|
offset += consumed;
|
|
|
|
}
|
|
|
|
/* do we have channel journal(s)? */
|
|
if ( flags & RTP_MIDI_JS_FLAG_A ) {
|
|
proto_tree *rtp_midi_chanjournals_tree;
|
|
rtp_midi_chanjournals_tree = proto_tree_add_subtree( rtp_midi_journal_tree, tvb, offset, -1, ett_rtp_midi_channeljournals, NULL, RTP_MIDI_TREE_NAME_CHANNEL_JOURNAL );
|
|
|
|
/* iterate through all the channels specified in header */
|
|
for ( i = 0; i <= totchan; i++ ) {
|
|
|
|
consumed = decode_channel_journal( tvb, pinfo, rtp_midi_chanjournals_tree, offset );
|
|
|
|
if ( -1 == consumed ) {
|
|
return offset;
|
|
}
|
|
|
|
/* seek to next channel-journal */
|
|
offset += consumed;
|
|
|
|
}
|
|
}
|
|
}
|
|
return tvb_captured_length(tvb);
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
proto_register_rtp_midi( void )
|
|
{
|
|
module_t *rtp_midi_module;
|
|
|
|
static hf_register_info hf[] = {
|
|
{
|
|
&hf_rtp_midi_bflag,
|
|
{
|
|
"B-Flag",
|
|
"rtpmidi.b_flag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cs_flag_b),
|
|
RTP_MIDI_CS_FLAG_B,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_jflag,
|
|
{
|
|
"J-Flag",
|
|
"rtpmidi.j_flag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cs_flag_j),
|
|
RTP_MIDI_CS_FLAG_J,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_zflag,
|
|
{
|
|
"Z-Flag",
|
|
"rtpmidi.z_flag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cs_flag_z),
|
|
RTP_MIDI_CS_FLAG_Z,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_pflag,
|
|
{
|
|
"P-Flag",
|
|
"rtpmidi.p_flag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cs_flag_p),
|
|
RTP_MIDI_CS_FLAG_P,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_shortlen,
|
|
{
|
|
"Command length (short)",
|
|
"rtpmidi.cmd_length_short",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_CS_MASK_SHORTLEN,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_longlen,
|
|
{
|
|
"Command length (long)",
|
|
"rtpmidi.cmd_length_long",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_CS_MASK_LONGLEN,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sflag,
|
|
{
|
|
"S-Flag",
|
|
"rtpmidi.s_flag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_JS_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_yflag,
|
|
{
|
|
"Y-Flag",
|
|
"rtpmidi.y_flag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_y),
|
|
RTP_MIDI_JS_FLAG_Y,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_aflag,
|
|
{
|
|
"A-Flag",
|
|
"rtpmidi.a_flag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_a),
|
|
RTP_MIDI_JS_FLAG_A,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_hflag,
|
|
{
|
|
"H-Flag",
|
|
"rtpmidi.h_flag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_h),
|
|
RTP_MIDI_JS_FLAG_H,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_totchan,
|
|
{
|
|
"Total channels",
|
|
"rtpmidi.total_channels",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(rtp_midi_js_tot_channels),
|
|
RTP_MIDI_JS_MASK_TOTALCHANNELS,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_check_seq_num,
|
|
{
|
|
"Checkpoint Packet Seqnum",
|
|
"rtpmidi.check_Seq_num",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_deltatime1,
|
|
{
|
|
"Delta Time (one octet)",
|
|
"rtpmidi.deltatime_1",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_deltatime2,
|
|
{
|
|
"Delta Time (two octets)",
|
|
"rtpmidi.deltatime_2",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_deltatime3,
|
|
{
|
|
"Delta Time (three octets)",
|
|
"rtpmidi.deltatime_3",
|
|
FT_UINT24,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_deltatime4,
|
|
{
|
|
"Delta Time (four octets)",
|
|
"rtpmidi.deltatime_4",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_channel_status,
|
|
{
|
|
"Channel Status",
|
|
"rtpmidi.channel_status",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_channel_status),
|
|
0xf0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_common_status,
|
|
{
|
|
"Common Status",
|
|
"rtpmidi.common_status",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_common_status),
|
|
0xff,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_channel,
|
|
{
|
|
"Channel",
|
|
"rtpmidi.channel",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_channels),
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_note,
|
|
{
|
|
"Note",
|
|
"rtpmidi.note",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_EXT_STRING,
|
|
&rtp_midi_note_values_ext,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_velocity,
|
|
{
|
|
"Velocity",
|
|
"rtpmidi.velocity",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_pressure,
|
|
{
|
|
"Pressure",
|
|
"rtpmidi.pressure",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_controller,
|
|
{
|
|
"Controller",
|
|
"rtpmidi.controller",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_EXT_STRING,
|
|
&rtp_midi_controller_values_ext,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_controller_value,
|
|
{
|
|
"Value",
|
|
"rtpmidi.controller_value",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_program,
|
|
{
|
|
"Program",
|
|
"rtpmidi.program",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_channel_pressure,
|
|
{
|
|
"Pressure",
|
|
"rtpmidi.channel_pressure",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_pitch_bend,
|
|
{
|
|
"Pitch Bend",
|
|
"rtpmidi.pitch_bend",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_pitch_bend_truncated,
|
|
{
|
|
"Pitch Bend (truncated)",
|
|
"rtpmidi.pitch_bend_truncated",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_manu_short,
|
|
{
|
|
"Manufacturer (short)",
|
|
"rtpmidi.manufacturer_short",
|
|
FT_UINT8,
|
|
BASE_HEX | BASE_EXT_STRING,
|
|
&rtp_midi_manu_short_values_ext,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_manu_long,
|
|
{
|
|
"Manufacturer (long)",
|
|
"rtpmidi.manufacturer_long",
|
|
FT_UINT16,
|
|
BASE_HEX | BASE_EXT_STRING,
|
|
&rtp_midi_manu_long_values_ext,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysjour_toc_s,
|
|
{
|
|
"System-Journal TOC-S-Flag",
|
|
"rtpmidi.sysjour_toc_s",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysjour_toc_d,
|
|
{
|
|
"System-Journal TOC-D-Flag",
|
|
"rtpmidi.sysjour_toc_d",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_sj_flag_d),
|
|
RTP_MIDI_SJ_FLAG_D,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysjour_toc_v,
|
|
{
|
|
"System-Journal TOC-V-Flag",
|
|
"rtpmidi.sysjour_toc_v",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_sj_flag_v),
|
|
RTP_MIDI_SJ_FLAG_V,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysjour_toc_q,
|
|
{
|
|
"System-Journal TOC-Q-Flag",
|
|
"rtpmidi.sysjour_toc_q",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_sj_flag_q),
|
|
RTP_MIDI_SJ_FLAG_Q,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysjour_toc_f,
|
|
{
|
|
"System-Journal TOC-F-Flag",
|
|
"rtpmidi.sysjour_toc_f",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_sj_flag_f),
|
|
RTP_MIDI_SJ_FLAG_F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysjour_toc_x,
|
|
{
|
|
"System-Journal TOC-X-Flag",
|
|
"rtpmidi.sysjour_toc_x",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_sj_flag_x),
|
|
RTP_MIDI_SJ_FLAG_X,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysjour_len,
|
|
{
|
|
"System-Journal-Length",
|
|
"rtpmidi.cmd_sysjour_len",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_MASK_LENGTH,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_sflag,
|
|
{
|
|
"Channel-Journal S-Flag",
|
|
"rtpmidi.chanjour_s",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x800000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_chan,
|
|
{
|
|
"Channel",
|
|
"rtpmidi.chanjour_channel",
|
|
FT_UINT24,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_channels),
|
|
0x780000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_hflag,
|
|
{
|
|
"Channel-Journal H-Flag",
|
|
"rtpmidi.chanjour_h",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_js_flag_h),
|
|
0x040000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_len,
|
|
{
|
|
"Channel-Journal-Length",
|
|
"rtpmidi.cmd_chanjour_len",
|
|
FT_UINT24,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x03FF00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_toc_p,
|
|
{
|
|
"Channel-Journal TOC-P-Flag",
|
|
"rtpmidi.chanjour_toc_p",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_cj_flag_p),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_toc_c,
|
|
{
|
|
"Channel-Journal TOC-C-Flag",
|
|
"rtpmidi.chanjour_toc_c",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_cj_flag_c),
|
|
0x40,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_toc_m,
|
|
{
|
|
"Channel-Journal TOC-M-Flag",
|
|
"rtpmidi.chanjour_toc_m",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_cj_flag_m),
|
|
0x20,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_toc_w,
|
|
{
|
|
"Channel-Journal TOC-W-Flag",
|
|
"rtpmidi.chanjour_toc_w",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_cj_flag_w),
|
|
0x10,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_toc_n,
|
|
{
|
|
"Channel-Journal TOC-N-Flag",
|
|
"rtpmidi.chanjour_toc_n",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_cj_flag_n),
|
|
0x08,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_toc_e,
|
|
{
|
|
"Channel-Journal TOC-E-Flag",
|
|
"rtpmidi.chanjour_toc_e",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_cj_flag_e),
|
|
0x04,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_toc_t,
|
|
{
|
|
"Channel-Journal TOC-T-Flag",
|
|
"rtpmidi.chanjour_toc_t",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_cj_flag_t),
|
|
0x02,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_chanjour_toc_a,
|
|
{
|
|
"Channel-Journal TOC-A-Flag",
|
|
"rtpmidi.chanjour_toc_a",
|
|
FT_BOOLEAN,
|
|
24,
|
|
TFS(&rtp_midi_cj_flag_a),
|
|
0x01,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_p_sflag,
|
|
{
|
|
"Chapter P S-Flag",
|
|
"rtpmidi.cj_chapter_p_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_p_program,
|
|
{
|
|
"Chapter P Program",
|
|
"rtpmidi.cj_chapter_p_program",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_p_bflag,
|
|
{
|
|
"Chapter P B-Flag",
|
|
"rtpmidi.cj_chapter_p_bflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
NULL,
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_p_bank_msb,
|
|
{
|
|
"Chapter P Bank-MSB",
|
|
"rtpmidi.cj_chapter_p_bank_msb",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_p_xflag,
|
|
{
|
|
"Chapter P X-Flag",
|
|
"rtpmidi.cj_chapter_p_xflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_p_log_flag_x),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_cj_chapter_p_bank_lsb,
|
|
{
|
|
"Chapter P Bank-LSB",
|
|
"rtpmidi.cj_chapter_p_bank_lsb",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_c_sflag,
|
|
{
|
|
"Chapter C S-Flag",
|
|
"rtpmidi.cj_chapter_c_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_c_length,
|
|
{
|
|
"Chapter C Length",
|
|
"rtpmidi.cj_chapter_c_length",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_c_number,
|
|
{
|
|
"Chapter C Number",
|
|
"rtpmidi.cj_chapter_c_number",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_EXT_STRING,
|
|
&rtp_midi_controller_values_ext,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_c_aflag,
|
|
{
|
|
"Chapter C A-Flag",
|
|
"rtpmidi.cj_chapter_c_aflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_c_flag_a),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_c_tflag,
|
|
{
|
|
"Chapter C T-Flag",
|
|
"rtpmidi.cj_chapter_c_tflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
NULL,
|
|
0x40,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_c_value,
|
|
{
|
|
"Chapter C Value",
|
|
"rtpmidi.cj_chapter_c_value",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_c_alt,
|
|
{
|
|
"Chapter C Alt",
|
|
"rtpmidi.cj_chapter_c_alt",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x3f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_sflag,
|
|
{
|
|
"Chapter M S-Flag",
|
|
"rtpmidi.cj_chapter_m_sflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x8000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_pflag,
|
|
{
|
|
"Chapter M P-Flag",
|
|
"rtpmidi.cj_chapter_m_pflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_cj_chapter_m_flag_p),
|
|
0x4000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_eflag,
|
|
{
|
|
"Chapter M E-Flag",
|
|
"rtpmidi.cj_chapter_m_eflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_cj_chapter_m_flag_e),
|
|
0x2000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_uflag,
|
|
{
|
|
"Chapter M U-Flag",
|
|
"rtpmidi.cj_chapter_m_uflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_cj_chapter_m_flag_u),
|
|
0x1000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_wflag,
|
|
{
|
|
"Chapter M W-Flag",
|
|
"rtpmidi.cj_chapter_m_wflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_cj_chapter_m_flag_w),
|
|
0x0800,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_zflag,
|
|
{
|
|
"Chapter M Z-Flag",
|
|
"rtpmidi.cj_chapter_m_zflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_cj_chapter_m_flag_z),
|
|
0x0400,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_length,
|
|
{
|
|
"Chapter M Length",
|
|
"rtpmidi.cj_chapter_m_length",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x03ff,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_qflag,
|
|
{
|
|
"Chapter M Q-Flag",
|
|
"rtpmidi.cj_chapter_m_qflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_flag_q),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_pending,
|
|
{
|
|
"Chapter M Pending",
|
|
"rtpmidi.cj_chapter_m_pending",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_sflag,
|
|
{
|
|
"Chapter M Log S-Flag",
|
|
"rtpmidi.cj_chapter_m_log_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_pnum_lsb,
|
|
{
|
|
"Chapter M Log PNUM-LSB",
|
|
"rtpmidi.cj_chapter_m_log_pnum_lsb",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_qflag,
|
|
{
|
|
"Chapter M Log Q-Flag",
|
|
"rtpmidi.cj_chapter_m_log_qflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_q),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_pnum_msb,
|
|
{
|
|
"Chapter M Log PNUM-MSB",
|
|
"rtpmidi.cj_chapter_m_log_pnum_msb",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_jflag,
|
|
{
|
|
"Chapter M Log J-Flag",
|
|
"rtpmidi.cj_chapter_m_log_jflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_j),
|
|
RTP_MIDI_CJ_CHAPTER_M_FLAG_J,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_kflag,
|
|
{
|
|
"Chapter M Log K-Flag",
|
|
"rtpmidi.cj_chapter_m_log_kflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_k),
|
|
RTP_MIDI_CJ_CHAPTER_M_FLAG_K,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_lflag,
|
|
{
|
|
"Chapter M Log L-Flag",
|
|
"rtpmidi.cj_chapter_m_log_lflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_l),
|
|
RTP_MIDI_CJ_CHAPTER_M_FLAG_L,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_mflag,
|
|
{
|
|
"Chapter M Log M-Flag",
|
|
"rtpmidi.cj_chapter_m_log_mflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_m),
|
|
RTP_MIDI_CJ_CHAPTER_M_FLAG_M,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_nflag,
|
|
{
|
|
"Chapter M Log N-Flag",
|
|
"rtpmidi.cj_chapter_m_log_nflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_n),
|
|
RTP_MIDI_CJ_CHAPTER_M_FLAG_N,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_tflag,
|
|
{
|
|
"Chapter M Log T-Flag",
|
|
"rtpmidi.cj_chapter_m_log_tflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_t),
|
|
RTP_MIDI_CJ_CHAPTER_M_FLAG_T,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_vflag,
|
|
{
|
|
"Chapter M Log V-Flag",
|
|
"rtpmidi.cj_chapter_m_log_vflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_v),
|
|
RTP_MIDI_CJ_CHAPTER_M_FLAG_V,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_rflag,
|
|
{
|
|
"Chapter M Log R-Flag",
|
|
"rtpmidi.cj_chapter_m_log_rflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_r),
|
|
RTP_MIDI_CJ_CHAPTER_M_FLAG_R,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_msb_entry,
|
|
{
|
|
"Entry MSB",
|
|
"rtpmidi.cj_chapter_m_log_msb_entry",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_msb_x,
|
|
{
|
|
"Chapter M Log MSB X-Flag",
|
|
"rtpmidi.cj_chapter_m_log_msb_xflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_x),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_msb,
|
|
{
|
|
"Chapter M Log MSB",
|
|
"rtpmidi.cj_chapter_m_log_msb",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_lsb_entry,
|
|
{
|
|
"Entry LSB",
|
|
"rtpmidi.cj_chapter_m_log_lsb_entry",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_lsb_x,
|
|
{
|
|
"Chapter M Log LSB X-Flag",
|
|
"rtpmidi.cj_chapter_m_log_lsb_xflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_x),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_lsb,
|
|
{
|
|
"Chapter M Log LSB",
|
|
"rtpmidi.cj_chapter_m_log_lsb",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_a_button_g,
|
|
{
|
|
"Chapter M Log A-Button G-Flag",
|
|
"rtpmidi.cj_chapter_m_log_a_button_gflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_g),
|
|
0x8000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_a_button_x,
|
|
{
|
|
"Chapter M Log A-Button X-Flag",
|
|
"rtpmidi.cj_chapter_m_log_a_button_xflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_x),
|
|
0x4000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_a_button,
|
|
{
|
|
"Chapter M Log A-Button",
|
|
"rtpmidi.cj_chapter_m_log_a_button",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x3fff,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_a_button_full,
|
|
{
|
|
"A-Button",
|
|
"rtpmidi.cj_chapter_m_log_a_button_full",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_c_button_g,
|
|
{
|
|
"Chapter M Log C-Button G-Flag",
|
|
"rtpmidi.cj_chapter_m_log_c_button_gflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_g),
|
|
0x8000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_c_button_r,
|
|
{
|
|
"Chapter M Log C-Button R-Flag",
|
|
"rtpmidi.cj_chapter_m_log_c_button_rflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_r),
|
|
0x4000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_c_button,
|
|
{
|
|
"Chapter M Log C-Button",
|
|
"rtpmidi.cj_chapter_m_log_c_button",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x3fff,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_c_button_full,
|
|
{
|
|
"C-Button",
|
|
"rtpmidi.cj_chapter_m_log_c_button_full",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_count_x,
|
|
{
|
|
"Chapter M Log Count X-Flag",
|
|
"rtpmidi.cj_chapter_m_log_count_xflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_x),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_count,
|
|
{
|
|
"Chapter M Log Count",
|
|
"rtpmidi.cj_chapter_m_log_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_m_log_count_full,
|
|
{
|
|
"Count",
|
|
"rtpmidi.cj_chapter_m_log_count_full",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_w_sflag,
|
|
{
|
|
"Chapter W S-Flag",
|
|
"rtpmidi.cj_chapter_w_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_w_first,
|
|
{
|
|
"Chapter W First",
|
|
"rtpmidi.cj_chapter_w_first",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_w_rflag,
|
|
{
|
|
"Chapter W R-Flag",
|
|
"rtpmidi.cj_chapter_w_rflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_m_log_flag_r),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_w_second,
|
|
{
|
|
"Chapter W Second",
|
|
"rtpmidi.cj_chapter_w_second",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_n_bflag,
|
|
{
|
|
"Chapter N B-Flag",
|
|
"rtpmidi.cj_chapter_n_bflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x8000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_n_len,
|
|
{
|
|
"Chapter N Length",
|
|
"rtpmidi.cj_chapter_n_length",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_n_low,
|
|
{
|
|
"Chapter N Low",
|
|
"rtpmidi.cj_chapter_n_low",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x00f0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_n_high,
|
|
{
|
|
"Chapter N High",
|
|
"rtpmidi.cj_chapter_n_high",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x000f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_n_log_sflag,
|
|
{
|
|
"Chapter N Log S-Flag",
|
|
"rtpmidi.cj_chapter_n_log_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_n_log_notenum,
|
|
{
|
|
"Chapter N Log Note",
|
|
"rtpmidi.cj_chapter_n_log_note",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_EXT_STRING,
|
|
&rtp_midi_note_values_ext,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_n_log_yflag,
|
|
{
|
|
"Chapter N Log Y-Flag",
|
|
"rtpmidi.cj_chapter_n_log_yflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_n_log_flag_y),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_n_log_velocity,
|
|
{
|
|
"Chapter N Log Velocity",
|
|
"rtpmidi.cj_chapter_n_log_velocity",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_n_log_octet,
|
|
{
|
|
"Chapter N Log Octet",
|
|
"rtpmidi.cj_chapter_n_log_octet",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0xff,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_e_sflag,
|
|
{
|
|
"Chapter E S-Flag",
|
|
"rtpmidi.cj_chapter_e_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_e_len,
|
|
{
|
|
"Chapter E Length",
|
|
"rtpmidi.cj_chapter_e_length",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_e_log_sflag,
|
|
{
|
|
"Chapter E Log S-Flag",
|
|
"rtpmidi.cj_chapter_e_log_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_e_log_notenum,
|
|
{
|
|
"Chapter E Log Note",
|
|
"rtpmidi.cj_chapter_e_log_note",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_EXT_STRING,
|
|
&rtp_midi_note_values_ext,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_e_log_vflag,
|
|
{
|
|
"Chapter N Log V-Flag",
|
|
"rtpmidi.cj_chapter_n_log_vflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_e_log_flag_v),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_e_log_velocity,
|
|
{
|
|
"Chapter E Log Velocity",
|
|
"rtpmidi.cj_chapter_e_log_velocity",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_e_log_count,
|
|
{
|
|
"Chapter E Log Count",
|
|
"rtpmidi.cj_chapter_e_log_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_t_channel_aftertouch,
|
|
{
|
|
"Channel Aftertouch",
|
|
"rtpmidi.cj_chapter_t_channel_aftertouch",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_t_sflag,
|
|
{
|
|
"Chapter T S-Flag",
|
|
"rtpmidi.cj_chapter_t_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_t_pressure,
|
|
{
|
|
"Chapter T Pressure",
|
|
"rtpmidi.cj_chapter_t_pressure",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_a_sflag,
|
|
{
|
|
"Chapter A S-Flag",
|
|
"rtpmidi.cj_chapter_a_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_a_len,
|
|
{
|
|
"Chapter A Length",
|
|
"rtpmidi.cj_chapter_a_length",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_a_log_sflag,
|
|
{
|
|
"Chapter A Log S-Flag",
|
|
"rtpmidi.cj_chapter_a_log_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_a_log_notenum,
|
|
{
|
|
"Chapter A Log Note",
|
|
"rtpmidi.cj_chapter_a_log_note",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_EXT_STRING,
|
|
&rtp_midi_note_values_ext,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_a_log_xflag,
|
|
{
|
|
"Chapter A Log X-Flag",
|
|
"rtpmidi.cj_chapter_a_log_xflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_cj_chapter_a_log_flag_x),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_cj_chapter_a_log_pressure,
|
|
{
|
|
"Chapter A Log Pressure",
|
|
"rtpmidi.cj_chapter_a_log_pressure",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_v,
|
|
{
|
|
"Active Sensing",
|
|
"rtpmidi.sj_chapter_v",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_v_sflag,
|
|
{
|
|
"Chapter V S-Flag",
|
|
"rtpmidi.sj_chapter_v_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_v_count,
|
|
{
|
|
"Chapter V Count",
|
|
"rtpmidi.sj_chapter_v_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_simple_system_commands,
|
|
{
|
|
"Simple System Commands",
|
|
"rtpmidi.sj_chapter_d_simple_system_commands",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_sflag,
|
|
{
|
|
"Chapter D S-Flag",
|
|
"rtpmidi.sj_chapter_d_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_CHAPTER_D_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_bflag,
|
|
{
|
|
"Chapter D B-Flag",
|
|
"rtpmidi.sj_chapter_d_bflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_d_flag_b),
|
|
RTP_MIDI_SJ_CHAPTER_D_FLAG_B,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_gflag,
|
|
{
|
|
"Chapter D G-Flag",
|
|
"rtpmidi.sj_chapter_d_gflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_d_flag_g),
|
|
RTP_MIDI_SJ_CHAPTER_D_FLAG_G,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_hflag,
|
|
{
|
|
"Chapter D H-Flag",
|
|
"rtpmidi.sj_chapter_d_hflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_d_flag_h),
|
|
RTP_MIDI_SJ_CHAPTER_D_FLAG_H,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_jflag,
|
|
{
|
|
"Chapter D J-Flag",
|
|
"rtpmidi.sj_chapter_d_jflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_d_flag_j),
|
|
RTP_MIDI_SJ_CHAPTER_D_FLAG_J,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_kflag,
|
|
{
|
|
"Chapter D K-Flag",
|
|
"rtpmidi.sj_chapter_d_kflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_d_flag_k),
|
|
RTP_MIDI_SJ_CHAPTER_D_FLAG_K,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_yflag,
|
|
{
|
|
"Chapter D Y-Flag",
|
|
"rtpmidi.sj_chapter_d_yflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_d_flag_y),
|
|
RTP_MIDI_SJ_CHAPTER_D_FLAG_Y,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_zflag,
|
|
{
|
|
"Chapter D Z-Flag",
|
|
"rtpmidi.sj_chapter_d_zflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_d_flag_z),
|
|
RTP_MIDI_SJ_CHAPTER_D_FLAG_Z,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_reset,
|
|
{
|
|
"Reset Field",
|
|
"rtpmidi.cj_chapter_d_reset",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_reset_sflag,
|
|
{
|
|
"Chapter D Reset S-Flag",
|
|
"rtpmidi.sj_chapter_d_reset_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_CHAPTER_D_RESET_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_reset_count,
|
|
{
|
|
"Chapter D Reset Count",
|
|
"rtpmidi.cj_chapter_d_reset_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_D_RESET_COUNT,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_tune,
|
|
{
|
|
"Tune Request Field",
|
|
"rtpmidi.cj_chapter_d_tune",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_tune_sflag,
|
|
{
|
|
"Chapter D Tune Request S-Flag",
|
|
"rtpmidi.sj_chapter_d_tune_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_CHAPTER_D_TUNE_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_tune_count,
|
|
{
|
|
"Chapter D Tune Request Count",
|
|
"rtpmidi.cj_chapter_d_tune_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_D_TUNE_COUNT,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_song_sel,
|
|
{
|
|
"Song Select Field",
|
|
"rtpmidi.cj_chapter_d_song_sel",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_song_sel_sflag,
|
|
{
|
|
"Chapter D Song Select S-Flag",
|
|
"rtpmidi.sj_chapter_d_song_sel_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_CHAPTER_D_SONG_SEL_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_song_sel_value,
|
|
{
|
|
"Chapter D Song Select Value",
|
|
"rtpmidi.cj_chapter_d_song_sel_value",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_D_SONG_SEL_VALUE,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_sflag,
|
|
{
|
|
"Chapter D System Common (F4/F5) S-Flag",
|
|
"rtpmidi.sj_chapter_d_syscom_sflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_cflag,
|
|
{
|
|
"Chapter D System Common (F4/F5) C-Flag",
|
|
"rtpmidi.sj_chapter_d_syscom_cflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_sj_chapter_d_syscom_flag_c),
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_C,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_vflag,
|
|
{
|
|
"Chapter D System Common (F4/F5) V-Flag",
|
|
"rtpmidi.sj_chapter_d_syscom_vflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_sj_chapter_d_syscom_flag_v),
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_V,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_lflag,
|
|
{
|
|
"Chapter D System Common (F4/F5) L-Flag",
|
|
"rtpmidi.sj_chapter_d_syscom_lflag",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&rtp_midi_sj_chapter_d_syscom_flag_l),
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_L,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_dsz,
|
|
{
|
|
"Chapter D System Common (F4/F5) DSZ",
|
|
"rtpmidi.sj_chapter_d_syscom_dsz",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
VALS(rtp_midi_sj_chapter_d_syscom_dsz_values),
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSCOM_MASK_DSZ,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_length,
|
|
{
|
|
"Chapter D System Common (F4/F5) Length",
|
|
"rtpmidi.sj_chapter_d_syscom_len",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSCOM_MASK_LENGTH,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_count,
|
|
{
|
|
"Chapter D System Common (F4/F5) Count",
|
|
"rtpmidi.sj_chapter_d_syscom_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSCOM_MASK_COUNT,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_value,
|
|
{
|
|
"Chapter D System Common (F4/F5) Value",
|
|
"rtpmidi.sj_chapter_d_syscom_value",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_legal,
|
|
{
|
|
"Chapter D System Common (F4/F5) Legal - for future extension",
|
|
"rtpmidi.sj_chapter_d_syscom_legal",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_syscom_data,
|
|
{
|
|
"Chapter D System Common (F4/F5) Erroneous Data",
|
|
"rtpmidi.sj_chapter_d_syscom_data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_sysreal_sflag,
|
|
{
|
|
"Chapter D System Realtime (F9/FD) S-Flag",
|
|
"rtpmidi.sj_chapter_d_sysreal_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_sysreal_cflag,
|
|
{
|
|
"Chapter D System Realtime (F9/FF) C-Flag",
|
|
"rtpmidi.sj_chapter_d_sysreal_cflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_d_syscom_flag_c),
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_C,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_sysreal_lflag,
|
|
{
|
|
"Chapter D System Realtime (F9/FD) L-Flag",
|
|
"rtpmidi.sj_chapter_d_sysreal_lflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_d_syscom_flag_l),
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_L,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_sysreal_length,
|
|
{
|
|
"Chapter D System Realtime (F9/FD) Length",
|
|
"rtpmidi.sj_chapter_d_sysreal_len",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSREAL_MASK_LENGTH,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_sysreal_count,
|
|
{
|
|
"Chapter D System Realtime (F9/FD) Count",
|
|
"rtpmidi.sj_chapter_d_sysreal_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_D_SYSREAL_MASK_COUNT,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_sysreal_legal,
|
|
{
|
|
"Chapter D System Realtime (F9/FD) Legal - for future extension",
|
|
"rtpmidi.sj_chapter_d_sysreal_legal",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_d_sysreal_data,
|
|
{
|
|
"Chapter D System Realtime (F9/FD) Erroneous Data",
|
|
"rtpmidi.sj_chapter_d_sysreal_data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_q_sflag,
|
|
{
|
|
"Chapter Q Sequencer State S-Flag",
|
|
"rtpmidi.sj_chapter_q_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_CHAPTER_Q_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_q_nflag,
|
|
{
|
|
"Chapter Q Sequencer State N-Flag",
|
|
"rtpmidi.sj_chapter_q_nflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_q_flag_n),
|
|
RTP_MIDI_SJ_CHAPTER_Q_FLAG_N,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_q_dflag,
|
|
{
|
|
"Chapter Q Sequencer State D-Flag",
|
|
"rtpmidi.sj_chapter_q_dflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_q_flag_d),
|
|
RTP_MIDI_SJ_CHAPTER_Q_FLAG_D,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_q_cflag,
|
|
{
|
|
"Chapter Q Sequencer State C-Flag",
|
|
"rtpmidi.sj_chapter_q_cflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_q_flag_c),
|
|
RTP_MIDI_SJ_CHAPTER_Q_FLAG_C,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_q_tflag,
|
|
{
|
|
"Chapter Q Sequencer State T-Flag",
|
|
"rtpmidi.sj_chapter_q_tflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_q_flag_t),
|
|
RTP_MIDI_SJ_CHAPTER_Q_FLAG_T,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_q_top,
|
|
{
|
|
"Chapter Q Sequencer State Top",
|
|
"rtpmidi.sj_chapter_q_top",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_Q_MASK_TOP,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_q_clock,
|
|
{
|
|
"Chapter Q Sequencer State Clock",
|
|
"rtpmidi.sj_chapter_q_clock",
|
|
FT_UINT24,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_Q_MASK_CLOCK,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_q_timetools,
|
|
{
|
|
"Chapter Q Sequencer State Timetools",
|
|
"rtpmidi.sj_chapter_q_timetools",
|
|
FT_UINT24,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_Q_MASK_TIMETOOLS,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_sflag,
|
|
{
|
|
"Chapter F MTC S-Flag",
|
|
"rtpmidi.sj_chapter_f_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_CHAPTER_F_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_cflag,
|
|
{
|
|
"Chapter F MTC C-Flag",
|
|
"rtpmidi.sj_chapter_f_cflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_f_flag_c),
|
|
RTP_MIDI_SJ_CHAPTER_F_FLAG_C,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_pflag,
|
|
{
|
|
"Chapter F MTC P-Flag",
|
|
"rtpmidi.sj_chapter_f_pflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_f_flag_p),
|
|
RTP_MIDI_SJ_CHAPTER_F_FLAG_P,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_qflag,
|
|
{
|
|
"Chapter F MTC Q-Flag",
|
|
"rtpmidi.sj_chapter_f_qflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_f_flag_q),
|
|
RTP_MIDI_SJ_CHAPTER_F_FLAG_Q,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_dflag,
|
|
{
|
|
"Chapter F MTC D-Flag",
|
|
"rtpmidi.sj_chapter_f_dflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_f_flag_d),
|
|
RTP_MIDI_SJ_CHAPTER_F_FLAG_D,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_point,
|
|
{
|
|
"Chapter F MTC Point",
|
|
"rtpmidi.sj_chapter_f_point",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_POINT,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_complete,
|
|
{
|
|
"Complete field",
|
|
"rtpmidi.sj_chapter_f_complete",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_partial,
|
|
{
|
|
"Partial field",
|
|
"rtpmidi.sj_chapter_f_partial",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_mt0,
|
|
{
|
|
"Chapter F MTC MT0",
|
|
"rtpmidi.sj_chapter_f_mt0",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_MT0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_mt1,
|
|
{
|
|
"Chapter F MTC MT1",
|
|
"rtpmidi.sj_chapter_f_mt1",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_MT1,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_mt2,
|
|
{
|
|
"Chapter F MTC MT2",
|
|
"rtpmidi.sj_chapter_f_mt2",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_MT2,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_mt3,
|
|
{
|
|
"Chapter F MTC MT3",
|
|
"rtpmidi.sj_chapter_f_mt3",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_MT3,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_mt4,
|
|
{
|
|
"Chapter F MTC MT4",
|
|
"rtpmidi.sj_chapter_f_mt4",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_MT4,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_mt5,
|
|
{
|
|
"Chapter F MTC MT5",
|
|
"rtpmidi.sj_chapter_f_mt5",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_MT5,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_mt6,
|
|
{
|
|
"Chapter F MTC MT6",
|
|
"rtpmidi.sj_chapter_f_mt6",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_MT6,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_mt7,
|
|
{
|
|
"Chapter F MTC MT7",
|
|
"rtpmidi.sj_chapter_f_mt7",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_MT7,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_hr,
|
|
{
|
|
"Chapter F MTC Hour",
|
|
"rtpmidi.sj_chapter_f_hr",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_HR,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_mn,
|
|
{
|
|
"Chapter F MTC Minute",
|
|
"rtpmidi.sj_chapter_f_mn",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_MN,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_sc,
|
|
{
|
|
"Chapter F MTC Second",
|
|
"rtpmidi.sj_chapter_f_sc",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_SC,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_f_fr,
|
|
{
|
|
"Chapter F MTC Frame",
|
|
"rtpmidi.sj_chapter_f_fr",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_F_MASK_FR,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_sflag,
|
|
{
|
|
"Chapter X Sysex S-Flag",
|
|
"rtpmidi.sj_chapter_x_sflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_js_flag_s),
|
|
RTP_MIDI_SJ_CHAPTER_X_FLAG_S,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_tflag,
|
|
{
|
|
"Chapter X Sysex T-Flag",
|
|
"rtpmidi.sj_chapter_x_tflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_x_flag_t),
|
|
RTP_MIDI_SJ_CHAPTER_X_FLAG_T,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_cflag,
|
|
{
|
|
"Chapter X Sysex C-Flag",
|
|
"rtpmidi.sj_chapter_x_cflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_x_flag_c),
|
|
RTP_MIDI_SJ_CHAPTER_X_FLAG_C,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_fflag,
|
|
{
|
|
"Chapter X Sysex F-Flag",
|
|
"rtpmidi.sj_chapter_x_fflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_x_flag_f),
|
|
RTP_MIDI_SJ_CHAPTER_X_FLAG_F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_dflag,
|
|
{
|
|
"Chapter X Sysex D-Flag",
|
|
"rtpmidi.sj_chapter_x_dflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_x_flag_d),
|
|
RTP_MIDI_SJ_CHAPTER_X_FLAG_D,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_lflag,
|
|
{
|
|
"Chapter X Sysex L-Flag",
|
|
"rtpmidi.sj_chapter_x_lflag",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&rtp_midi_sj_chapter_x_flag_l),
|
|
RTP_MIDI_SJ_CHAPTER_X_FLAG_L,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_sta,
|
|
{
|
|
"Chapter X Sysex STA",
|
|
"rtpmidi.sj_chapter_x_sta",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_X_MASK_STA,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_tcount,
|
|
{
|
|
"Chapter X Sysex TCOUT",
|
|
"rtpmidi.sj_chapter_x_tcount",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_X_MASK_TCOUNT,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_count,
|
|
{
|
|
"Chapter X Sysex COUNT",
|
|
"rtpmidi.sj_chapter_x_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
RTP_MIDI_SJ_CHAPTER_X_MASK_COUNT,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_first1,
|
|
{
|
|
"Chapter X Sysex FIRST (one octet)",
|
|
"rtpmidi.sj_chapter_x_first_1",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_first2,
|
|
{
|
|
"Chapter X Sysex FIRST (two octets)",
|
|
"rtpmidi.sj_chapter_x_first_2",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_first3,
|
|
{
|
|
"Chapter X Sysex FIRST (three octets)",
|
|
"rtpmidi.sj_chapter_x_first_3",
|
|
FT_UINT24,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_first4,
|
|
{
|
|
"Chapter X Sysex FIRST (four octets)",
|
|
"rtpmidi.sj_chapter_x_first_4",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_data,
|
|
{
|
|
"Chapter X Sysex Data",
|
|
"rtpmidi.sj_chapter_x_data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sj_chapter_x_invalid_data,
|
|
{
|
|
"Chapter X Invalid Sysex Data",
|
|
"rtpmidi.sj_chapter_x_invalid_data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_quarter_frame_type,
|
|
{
|
|
"MTC-quarter-frame-type",
|
|
"rtpmidi.mtc_quarter_frame_type",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_qft_values),
|
|
0x70,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_quarter_frame_value,
|
|
{
|
|
"MTC-quarter-frame-value",
|
|
"rtpmidi.mtc_quarter_frame_value",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_spp,
|
|
{
|
|
"Song Position Pointer",
|
|
"rtpmidi.song_position_pointer",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_spp_truncated,
|
|
{
|
|
"Song Position Pointer (truncated)",
|
|
"rtpmidi.song_position_pointer_truncated",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_song_select,
|
|
{
|
|
"Song Select",
|
|
"rtpmidi.song_select",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_manu_data,
|
|
{
|
|
"Manufacturer specific data",
|
|
"rtpmidi.manu_data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_edu_data,
|
|
{
|
|
"Educational command data",
|
|
"rtpmidi.edu_data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_unknown_data,
|
|
{
|
|
"Unknown Data",
|
|
"rtpmidi.unknown_data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_realtime,
|
|
{
|
|
"Sysex Common Realtime",
|
|
"rtpmidi.sysex_common_realtime",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_rt),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_non_realtime,
|
|
{
|
|
"Sysex Common Non-Realtime",
|
|
"rtpmidi.sysex_common_non_realtime",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_nrt),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_device_id,
|
|
{
|
|
"Sysex Common Device ID",
|
|
"rtpmidi.sysex_common_device_id",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_ext,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Extension",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_ext",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_nrt_sd_ext),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_gi,
|
|
{
|
|
"Sysex Common Non-Realtime General Information",
|
|
"rtpmidi.sysex_common_non_realtime_general_information",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_nrt_gi),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_fd,
|
|
{
|
|
"Sysex Common Non-Realtime File Dump",
|
|
"rtpmidi.sysex_common_non_realtime_file_dump",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_nrt_fd),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_tuning,
|
|
{
|
|
"Sysex Common (Non-)Realtime Tuning",
|
|
"rtpmidi.sysex_common_tuning",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_tuning),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_gm,
|
|
{
|
|
"Sysex Common Non-Realtime General MIDI (GM)",
|
|
"rtpmidi.sysex_common_non_realtime_gm",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_nrt_gm),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_dls,
|
|
{
|
|
"Sysex Common Non-Realtime Downloadable Sounds (DLS)",
|
|
"rtpmidi.sysex_common_non_realtime_dls",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_nrt_dls),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc,
|
|
{
|
|
"Sysex Common Realtime MTC",
|
|
"rtpmidi.sysex_common_realtime_mtc",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_rt_mtc),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_sc,
|
|
{
|
|
"Sysex Common Realtime Show Control",
|
|
"rtpmidi.sysex_common_realtime_sc",
|
|
FT_UINT8,
|
|
BASE_HEX | BASE_EXT_STRING,
|
|
&rtp_midi_sysex_common_rt_show_control_ext,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_ni,
|
|
{
|
|
"Sysex Common Realtime Notation Information",
|
|
"rtpmidi.sysex_common_realtime_ni",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_rt_notations),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_dc,
|
|
{
|
|
"Sysex Common Realtime Device Control",
|
|
"rtpmidi.sysex_common_realtime_dc",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_rt_device_control),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_cueing,
|
|
{
|
|
"Sysex Common Realtime MTC Cueing",
|
|
"rtpmidi.sysex_common_rt_mtc_cue",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_rt_mtc_cue),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc,
|
|
{
|
|
"Sysex Common Non-Realtime MTC",
|
|
"rtpmidi.sysex_common_nrt_mtc",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_nrt_mtc),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mmc_commands,
|
|
{
|
|
"Sysex Common Realtime Machine Control Commands",
|
|
"rtpmidi.sysex_common_realtime_mmc_cmds",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_rt_mmc_commands),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mmc_responses,
|
|
{
|
|
"Sysex Common Realtime Machine Control Responses",
|
|
"rtpmidi.sysex_common_realtime_mmc_resps",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_sysex_common_rt_mmc_responses),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_gi_device_family,
|
|
{
|
|
"Sysex Common Non-Realtime General Information Device Family",
|
|
"rtpmidi.sysex_common_non_realtime_general_information_device_family",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_gi_device_family_member,
|
|
{
|
|
"Sysex Common Non-Realtime General Information Device Family Member",
|
|
"rtpmidi.sysex_common_non_realtime_general_information_device_family_member",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_gi_software_rev,
|
|
{
|
|
"Sysex Common Non-Realtime General Information Software Revision",
|
|
"rtpmidi.sysex_common_non_realtime_general_information_software_revision",
|
|
FT_UINT32,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_packet_number,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Packet Number",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_packet_number",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_header_sn,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Sample Number",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_sample_number",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_header_sf,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Sample Format",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_sample_format",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_header_sp,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Sample Period",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_sample_period",
|
|
FT_UINT24,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_header_sl,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Sample Length",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_sample_length",
|
|
FT_UINT24,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_header_ls,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Loop Start",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_loop_start",
|
|
FT_UINT24,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_header_le,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Loop End",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_loop_end",
|
|
FT_UINT24,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_header_lt,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Loop Type",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_loop_type",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(rtp_midi_sysex_common_nrt_sd_lt),
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_packet_count,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Running Packet Count",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_packet_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_packet_check,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Checkum",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_checksum",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_packet_data,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump Data Byte",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_sd_ext_ln,
|
|
{
|
|
"Sysex Common Non-Realtime Sample Dump LP Transmission Loop Number",
|
|
"rtpmidi.sysex_common_non_realtime_sample_dump_lp_trans_ln",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_fd_device_id,
|
|
{
|
|
"Sysex Common Non-Realtime File Dump Device ID",
|
|
"rtpmidi.sysex_common_non_realtime_fd_device_id",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_fd_type,
|
|
{
|
|
"Sysex Common Non-Realtime File Dump File Type",
|
|
"rtpmidi.sysex_common_non_realtime_fd_type",
|
|
FT_STRING,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_fd_name,
|
|
{
|
|
"Sysex Common Non-Realtime File Dump File Name",
|
|
"rtpmidi.sysex_common_non_realtime_fd_name",
|
|
FT_STRING,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_fd_length,
|
|
{
|
|
"Sysex Common Non-Realtime File Dump Length",
|
|
"rtpmidi.sysex_common_non_realtime_fd_length",
|
|
FT_UINT32,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_fd_packet_num,
|
|
{
|
|
"Sysex Common Non-Realtime File Packet Number",
|
|
"rtpmidi.sysex_common_non_realtime_fd_packet_num",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_fd_byte_count,
|
|
{
|
|
"Sysex Common Non-Realtime File Byte Count",
|
|
"rtpmidi.sysex_common_non_realtime_fd_byte_count",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_fd_packet_data,
|
|
{
|
|
"Sysex Common Non-Realtime File Packet Data",
|
|
"rtpmidi.sysex_common_non_realtime_fd_packet_data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_fd_checksum,
|
|
{
|
|
"Sysex Common Non-Realtime File Checksum",
|
|
"rtpmidi.sysex_common_non_realtime_fd_checksum",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_tune_program,
|
|
{
|
|
"Sysex Common (Non-)Realtime Tuning Program",
|
|
"rtpmidi.sysex_common_tune_program",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_tune_name,
|
|
{
|
|
"Sysex Common (Non-)Realtime Tuning Name",
|
|
"rtpmidi.sysex_common_tune_name",
|
|
FT_STRING,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_tune_freq,
|
|
{
|
|
"Sysex Common (Non-)Realtime Tuning Frequency",
|
|
"rtpmidi.sysex_common_tune_freq",
|
|
FT_UINT24,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_tune_checksum,
|
|
{
|
|
"Sysex Common (Non-)Realtime Tuning Checksum",
|
|
"rtpmidi.sysex_common_tune_checksum",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_tune_changes,
|
|
{
|
|
"Sysex Common (Non-)Realtime Tuning Changes",
|
|
"rtpmidi.sysex_common_tune_changes",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_tune_note,
|
|
{
|
|
"Sysex Common (Non-)Realtime Tuning Note",
|
|
"rtpmidi.sysex_common_tune_note",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_EXT_STRING,
|
|
&rtp_midi_note_values_ext,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_fm_type,
|
|
{
|
|
"Sysex Common Realtime MTC Full Message Type",
|
|
"rtpmidi.sysex_common_rt_mtc_fm_type",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_mtc_fm_type_values),
|
|
0x60,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_fm_hr,
|
|
{
|
|
"Sysex Common Realtime MTC Full Message Hour",
|
|
"rtpmidi.sysex_common_rt_mtc_fm_hour",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x1f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_fm_mn,
|
|
{
|
|
"Sysex Common Realtime MTC Full Message Minute",
|
|
"rtpmidi.sysex_common_rt_mtc_fm_minute",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_fm_sc,
|
|
{
|
|
"Sysex Common Realtime MTC Full Message Second",
|
|
"rtpmidi.sysex_common_rt_mtc_fm_second",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_fm_fr,
|
|
{
|
|
"Sysex Common Realtime MTC Full Message Frame",
|
|
"rtpmidi.sysex_common_rt_mtc_fm_frame",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_ub_u1,
|
|
{
|
|
"Sysex Common Realtime MTC User Bits U1",
|
|
"rtpmidi.sysex_common_rt_mtc_ub_u1",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_ub_u2,
|
|
{
|
|
"Sysex Common Realtime MTC User Bits U2",
|
|
"rtpmidi.sysex_common_rt_mtc_ub_u2",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_ub_u3,
|
|
{
|
|
"Sysex Common Realtime MTC User Bits U3",
|
|
"rtpmidi.sysex_common_rt_mtc_ub_u3",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_ub_u4,
|
|
{
|
|
"Sysex Common Realtime MTC User Bits U4",
|
|
"rtpmidi.sysex_common_rt_mtc_ub_u4",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_ub_u5,
|
|
{
|
|
"Sysex Common Realtime MTC User Bits U5",
|
|
"rtpmidi.sysex_common_rt_mtc_ub_u5",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_ub_u6,
|
|
{
|
|
"Sysex Common Realtime MTC User Bits U6",
|
|
"rtpmidi.sysex_common_rt_mtc_ub_u6",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_ub_u7,
|
|
{
|
|
"Sysex Common Realtime MTC User Bits U7",
|
|
"rtpmidi.sysex_common_rt_mtc_ub_u7",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_ub_u8,
|
|
{
|
|
"Sysex Common Realtime MTC User Bits U8",
|
|
"rtpmidi.sysex_common_rt_mtc_ub_u8",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x0f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_ub_u9,
|
|
{
|
|
"Sysex Common Realtime MTC User Bits U9",
|
|
"rtpmidi.sysex_common_rt_mtc_ub_u9",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x03,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc_type,
|
|
{
|
|
"Sysex Common Non-Realtime MTC Type",
|
|
"rtpmidi.sysex_common_nrt_mtc_type",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
VALS(rtp_midi_mtc_fm_type_values),
|
|
0x60,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc_hr,
|
|
{
|
|
"Sysex Common Non-Realtime MTC Hour",
|
|
"rtpmidi.sysex_common_nrt_mtc_hour",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x1f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc_mn,
|
|
{
|
|
"Sysex Common Non-Realtime MTCMinute",
|
|
"rtpmidi.sysex_common_nrt_mtc_minute",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc_sc,
|
|
{
|
|
"Sysex Common Non-Realtime MTC Second",
|
|
"rtpmidi.sysex_common_nrt_mtc_second",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc_fr,
|
|
{
|
|
"Sysex Common Non-Realtime MTC Frame",
|
|
"rtpmidi.sysex_common_nrt_mtc_frame",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc_ff,
|
|
{
|
|
"Sysex Common Non-Realtime MTC Fractional Frame",
|
|
"rtpmidi.sysex_common_nrt_mtc_fract_frame",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc_enl,
|
|
{
|
|
"Sysex Common Non-Realtime MTC Event Number (LSB)",
|
|
"rtpmidi.sysex_common_nrt_mtc_en_lsb",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc_enm,
|
|
{
|
|
"Sysex Common Non-Realtime MTC Event Number (MSB)",
|
|
"rtpmidi.sysex_common_nrt_mtc_en_msb",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_nrt_mtc_add,
|
|
{
|
|
"Sysex Common Non-Realtime MTC Additional Info",
|
|
"rtpmidi.sysex_common_nrt_mtc_add",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_cue_enl,
|
|
{
|
|
"Sysex Common Realtime MTC Cue Event Number (LSB)",
|
|
"rtpmidi.sysex_common_rt_mtc_cue_en_lsb",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_cue_enm,
|
|
{
|
|
"Sysex Common Realtime MTC Cue Event Number (MSB)",
|
|
"rtpmidi.sysex_common_rt_mtc_cue_en_msb",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_mtc_cue_add,
|
|
{
|
|
"Sysex Common Realtime MTC Cue Additional Info",
|
|
"rtpmidi.sysex_common_rt_mtc_cue_add",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_ni_bar_num,
|
|
{
|
|
"Sysex Common Realtime NI Bar Number",
|
|
"rtpmidi.sysex_common_rt_ni_barnum",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_ni_bytes,
|
|
{
|
|
"Sysex Common Realtime NI Bytes",
|
|
"rtpmidi.sysex_common_rt_ni_bytes",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_ni_numerator,
|
|
{
|
|
"Sysex Common Realtime NI Numerator",
|
|
"rtpmidi.sysex_common_rt_ni_numerator",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_ni_denominator,
|
|
{
|
|
"Sysex Common Realtime NI Denominator",
|
|
"rtpmidi.sysex_common_rt_ni_denominator",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_ni_midi_clocks,
|
|
{
|
|
"Sysex Common Realtime NI MIDI clocks in click",
|
|
"rtpmidi.sysex_common_rt_ni_midiclock",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_ni_32nds,
|
|
{
|
|
"Sysex Common Realtime NI 32nd notes in MIDI quarter note",
|
|
"rtpmidi.sysex_common_rt_ni_32nds",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_dc_volume,
|
|
{
|
|
"Sysex Common Realtime DC Volume",
|
|
"rtpmidi.sysex_common_rt_dc_volume",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_rtp_midi_sysex_common_rt_dc_balance,
|
|
{
|
|
"Sysex Common Realtime DC Balance",
|
|
"rtpmidi.sysex_common_rt_dc_balance",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7f7f,
|
|
NULL, HFILL
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
static gint *ett[] = {
|
|
&ett_rtp_midi,
|
|
&ett_rtp_midi_commands,
|
|
&ett_rtp_midi_journal,
|
|
&ett_rtp_midi_command,
|
|
&ett_rtp_midi_systemjournal,
|
|
&ett_rtp_midi_channeljournals,
|
|
&ett_rtp_midi_channelchapters,
|
|
&ett_rtp_midi_cj_chapter_p,
|
|
&ett_rtp_midi_cj_chapter_c,
|
|
&ett_rtp_midi_cj_chapter_c_loglist,
|
|
&ett_rtp_midi_cj_chapter_c_logitem,
|
|
&ett_rtp_midi_cj_chapter_m,
|
|
&ett_rtp_midi_cj_chapter_m_loglist,
|
|
&ett_rtp_midi_cj_chapter_m_logitem,
|
|
&ett_rtp_midi_cj_chapter_m_log_msb,
|
|
&ett_rtp_midi_cj_chapter_m_log_lsb,
|
|
&ett_rtp_midi_cj_chapter_m_log_a_button,
|
|
&ett_rtp_midi_cj_chapter_m_log_c_button,
|
|
&ett_rtp_midi_cj_chapter_m_log_count,
|
|
&ett_rtp_midi_cj_chapter_w,
|
|
&ett_rtp_midi_cj_chapter_n,
|
|
&ett_rtp_midi_cj_chapter_n_loglist,
|
|
&ett_rtp_midi_cj_chapter_n_logitem,
|
|
&ett_rtp_midi_cj_chapter_n_octets,
|
|
&ett_rtp_midi_cj_chapter_e,
|
|
&ett_rtp_midi_cj_chapter_e_loglist,
|
|
&ett_rtp_midi_cj_chapter_e_logitem,
|
|
&ett_rtp_midi_cj_chapter_t,
|
|
&ett_rtp_midi_cj_chapter_a,
|
|
&ett_rtp_midi_cj_chapter_a_loglist,
|
|
&ett_rtp_midi_cj_chapter_a_logitem,
|
|
&ett_rtp_midi_systemchapters,
|
|
&ett_rtp_midi_sj_chapter_d,
|
|
&ett_rtp_midi_sj_chapter_d_field_b,
|
|
&ett_rtp_midi_sj_chapter_d_field_g,
|
|
&ett_rtp_midi_sj_chapter_d_field_h,
|
|
&ett_rtp_midi_sj_chapter_d_field_j,
|
|
&ett_rtp_midi_sj_chapter_d_field_k,
|
|
&ett_rtp_midi_sj_chapter_d_field_y,
|
|
&ett_rtp_midi_sj_chapter_d_field_z,
|
|
&ett_rtp_midi_sj_chapter_v,
|
|
&ett_rtp_midi_sj_chapter_q,
|
|
&ett_rtp_midi_sj_chapter_f,
|
|
&ett_rtp_midi_sj_chapter_f_complete,
|
|
&ett_rtp_midi_sj_chapter_f_partial,
|
|
&ett_rtp_midi_sj_chapter_x,
|
|
&ett_rtp_midi_sj_chapter_x_first,
|
|
&ett_rtp_midi_sj_chapter_x_data,
|
|
&ett_rtp_midi_channeljournal,
|
|
&ett_rtp_midi_sysex_data,
|
|
&ett_rtp_midi_sysex_common_rt,
|
|
&ett_rtp_midi_sysex_common_nrt,
|
|
&ett_rtp_midi_sysex_common_tune_note,
|
|
&ett_rtp_midi_sysex_manu,
|
|
&ett_rtp_midi_sysex_edu
|
|
};
|
|
|
|
proto_rtp_midi = proto_register_protocol( RTP_MIDI_DISSECTOR_NAME, RTP_MIDI_DISSECTOR_SHORTNAME, RTP_MIDI_DISSECTOR_ABBREVIATION );
|
|
proto_register_field_array( proto_rtp_midi, hf, array_length( hf ) );
|
|
proto_register_subtree_array( ett, array_length( ett ) );
|
|
|
|
rtp_midi_module = prefs_register_protocol ( proto_rtp_midi, proto_reg_handoff_rtp_midi );
|
|
prefs_register_uint_preference ( rtp_midi_module, "midi_payload_type_value", "Payload Type for RFC 4695/6295 RTP-MIDI", "This is the value of the Payload Type field that specifies RTP-MIDI", 10, &rtp_midi_payload_type_value );
|
|
register_dissector( RTP_MIDI_DISSECTOR_ABBREVIATION, dissect_rtp_midi, proto_rtp_midi );
|
|
}
|
|
|
|
|
|
|
|
void
|
|
proto_reg_handoff_rtp_midi( void )
|
|
{
|
|
static dissector_handle_t rtp_midi_handle;
|
|
static int rtp_midi_prefs_initialized = FALSE;
|
|
|
|
|
|
if ( !rtp_midi_prefs_initialized ) {
|
|
rtp_midi_handle = find_dissector( RTP_MIDI_DISSECTOR_ABBREVIATION );
|
|
dissector_add_string("rtp_dyn_payload_type", "rtp-midi", rtp_midi_handle);
|
|
rtp_midi_prefs_initialized = TRUE;
|
|
}
|
|
else {
|
|
dissector_delete_uint( "rtp.pt", saved_payload_type_value, rtp_midi_handle );
|
|
}
|
|
if ( rtp_midi_payload_type_value > 95 ){
|
|
saved_payload_type_value = rtp_midi_payload_type_value;
|
|
dissector_add_uint( "rtp.pt", saved_payload_type_value, rtp_midi_handle );
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
* Editor modelines - http://www.wireshark.org/tools/modelines.html
|
|
*
|
|
* Local variables:
|
|
* c-basic-offset: 8
|
|
* tab-width: 8
|
|
* indent-tabs-mode: t
|
|
* End:
|
|
*
|
|
* vi: set shiftwidth=8 tabstop=8 noexpandtab:
|
|
* :indentSize=8:tabSize=8:noTabs=false:
|
|
*/
|