2012-05-17 20:13:22 +00:00
/* packet-rtp-midi.c
2012-02-27 09:18:53 +00:00
*
* Routines for RFC 4695 / 6295 RTP - MIDI dissection
* Copyright 2006 - 2012 , Tobias Erichsen < t . erichsen @ gmx . de >
*
* $ Id $
*
* 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
2012-06-28 22:56:06 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2012-02-27 09:18:53 +00:00
*
* 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
*
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include <glib.h>
2012-05-17 20:13:22 +00:00
2012-02-27 09:18:53 +00:00
# include <epan/packet.h>
# include <epan/prefs.h>
# include <epan/conversation.h>
# include <epan/tap.h>
/* 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 "Simple System Commands"
# define RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_B "Reset Field"
# define RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_G "Tune Request Field"
# define RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_H "Song Select Field"
# 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_V "Active Sensing"
# 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_F_COMPLETE "Complete field"
# define RTP_MIDI_TREE_NAME_SJ_CHAPTER_F_PARTIAL "Partial field"
# 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_MSB "Entry MSB"
# define RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOG_LSB "Entry LSB"
# define RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOG_A_BUTTON "A-Button"
# define RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOG_C_BUTTON "C-Button"
# 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_T "Channel Aftertouch"
# 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 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 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_JEN , " JEN " } ,
{ RTP_MIDI_MANU_SHORT_PPG , " PPG " } ,
{ 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 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 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 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 }
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cs_flag_b = {
2012-02-27 09:18:53 +00:00
" Long Header: 2 octets " ,
2012-02-27 11:44:19 +00:00
" Short Header: 1 octet "
2012-02-27 09:18:53 +00:00
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cs_flag_j = {
2012-02-27 09:18:53 +00:00
" Journal present " ,
" No Journal present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cs_flag_z = {
2012-02-27 09:18:53 +00:00
" Delta-Time present for first MIDI-command " ,
" No Delta-Time for first MIDI-command "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cs_flag_p = {
2012-02-27 09:18:53 +00:00
" Status byte was NOT present in original MIDI-command " ,
" Status byte was present in original MIDI-command "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_js_flag_y = {
2012-02-27 09:18:53 +00:00
" System-jounral present " ,
" System-journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_js_flag_s = {
2012-02-27 09:18:53 +00:00
" Standard journal behaviour " ,
" Journal encodes data in preceding RTP-packet "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_js_flag_a = {
2012-02-27 09:18:53 +00:00
" Channel-journal present " ,
" Channel-journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_js_flag_h = {
2012-02-27 09:18:53 +00:00
" Enhanced Encoding " ,
" Standard Encoding "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_flag_d = {
2012-02-27 09:18:53 +00:00
" Chapter D journal present " ,
" Chapter D journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_flag_v = {
2012-02-27 09:18:53 +00:00
" Chapter V journal present " ,
" Chapter V journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_flag_q = {
2012-02-27 09:18:53 +00:00
" Chapter Q journal present " ,
" Chapter Q journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_flag_f = {
2012-02-27 09:18:53 +00:00
" Chapter F journal present " ,
" Chapter F journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_flag_x = {
2012-02-27 09:18:53 +00:00
" Chapter X journal present " ,
" Chapter X journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_flag_p = {
2012-02-27 09:18:53 +00:00
" Chapter P journal present " ,
" Chapter P journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_flag_c = {
2012-02-27 09:18:53 +00:00
" Chapter C journal present " ,
" Chapter C journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_flag_m = {
2012-02-27 09:18:53 +00:00
" Chapter M journal present " ,
" Chapter M journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_flag_w = {
2012-02-27 09:18:53 +00:00
" Chapter W journal present " ,
" Chapter W journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_flag_n = {
2012-02-27 09:18:53 +00:00
" Chapter N journal present " ,
" Chapter N journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_flag_e = {
2012-02-27 09:18:53 +00:00
" Chapter E journal present " ,
" Chapter E journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_flag_t = {
2012-02-27 09:18:53 +00:00
" Chapter T journal present " ,
" Chapter T journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_flag_a = {
2012-02-27 09:18:53 +00:00
" Chapter A journal present " ,
" Chapter A journal NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_c_flag_a = {
2012-02-27 09:18:53 +00:00
" Alternative Coding " ,
" Value Coding "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_flag_p = {
2012-02-27 09:18:53 +00:00
" Pending field is encoded " ,
" Pending field is NOT encoded "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_flag_e = {
2012-02-27 09:18:53 +00:00
" Initiated transaction is in progress " ,
" NO transaction in progress "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_flag_u = {
2012-02-27 09:18:53 +00:00
" All parameters are RPNs " ,
" Parameters may include NRPNs "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_flag_w = {
2012-02-27 09:18:53 +00:00
" All parameters are NRPNs " ,
" Parameters may include RPNs "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_flag_z = {
2012-02-27 09:18:53 +00:00
" Only LSB parameters " ,
" Parameters may have LSB & MSB "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_flag_q = {
2012-02-27 09:18:53 +00:00
" Pending encodes NRPN MSB " ,
" Pending encodes RPN MSB "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_q = {
2012-02-27 09:18:53 +00:00
" NRPN parameter encoded " ,
" RPN parameter encoded "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_j = {
2012-02-27 09:18:53 +00:00
" ENTRY-MSB field present " ,
" ENTRY-MSB field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_k = {
2012-02-27 09:18:53 +00:00
" ENTRY-LSB field present " ,
" ENTRY-LSB field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_l = {
2012-02-27 09:18:53 +00:00
" A-Button field present " ,
" A-Button field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_m = {
2012-02-27 09:18:53 +00:00
" C-Button field present " ,
" C-Button field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_n = {
2012-02-27 09:18:53 +00:00
" Count field present " ,
" Count field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_t = {
2012-02-27 09:18:53 +00:00
" Count Tool used " ,
" Count Tool NOT used "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_v = {
2012-02-27 09:18:53 +00:00
" Value Tool used " ,
" Value Tool NOT used "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_r = {
2012-02-27 09:18:53 +00:00
" Reserved-Flag set " ,
" Reserved-Flag NOT set "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_x = {
2012-02-27 09:18:53 +00:00
" Precedes most recent Control Change command for ctrl=121 " ,
" Does not precede most recent Control Change command for ctrl=121 "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_m_log_flag_g = {
2012-02-27 09:18:53 +00:00
" negative value " ,
" positive value "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_n_log_flag_y = {
2012-02-27 09:18:53 +00:00
" Execute Note-On " ,
" Skip Note-On "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_e_log_flag_v = {
2012-02-27 09:18:53 +00:00
" Encodes Note-Off velocity " ,
" Encodes Note-On/Off count "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_a_log_flag_x = {
2012-02-27 09:18:53 +00:00
" Precedes most recent Control Change command for ctrl=123-127 " ,
" Does not precede most recent Control Change command for ctrl=123-127 "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_cj_chapter_p_log_flag_x = {
2012-02-27 09:18:53 +00:00
" Reset all controllers received between MSB and LSB " ,
" NO Reset all controllers received between MSB and LSB "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_flag_b = {
2012-02-27 09:18:53 +00:00
" Reset field present " ,
" Reset field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_flag_g = {
2012-02-27 09:18:53 +00:00
" Tune request field present " ,
" Tune request field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_flag_h = {
2012-02-27 09:18:53 +00:00
" Song select field present " ,
" Song select field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_flag_j = {
2012-02-27 09:18:53 +00:00
" Undefined system common 0xF4 field present " ,
" Undefined system common 0xF4 field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_flag_k = {
2012-02-27 09:18:53 +00:00
" Undefined system common 0xF5 field present " ,
" Undefined system common 0xF5 field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_flag_y = {
2012-02-27 09:18:53 +00:00
" Undefined system common 0xF9 field present " ,
" Undefined system common 0xF9 field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_flag_z = {
2012-02-27 09:18:53 +00:00
" Undefined system common 0xFD field present " ,
" Undefined system common 0xFD field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_syscom_flag_c = {
2012-02-27 09:18:53 +00:00
" Count field present " ,
" Count field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_syscom_flag_v = {
2012-02-27 09:18:53 +00:00
" Value field present " ,
" Value field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_d_syscom_flag_l = {
2012-02-27 09:18:53 +00:00
" Legal field present " ,
" Legal field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_q_flag_n = {
2012-02-27 09:18:53 +00:00
" Active Start / Continue " ,
" NO active Start / Stop Continue "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_q_flag_d = {
2012-02-27 09:18:53 +00:00
" Song position already reached " ,
" Song position yet to be reached "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_q_flag_c = {
2012-02-27 09:18:53 +00:00
" Clock field present " ,
" Clock field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_q_flag_t = {
2012-02-27 09:18:53 +00:00
" Timetools field present " ,
" Timetools field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_f_flag_c = {
2012-02-27 09:18:53 +00:00
" Complete field present " ,
" Complete field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_f_flag_p = {
2012-02-27 09:18:53 +00:00
" Partial field present " ,
" Partial field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_f_flag_q = {
2012-02-27 09:18:53 +00:00
" Complete field contains quarter frames " ,
" Complete field contains full frame format "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_f_flag_d = {
2012-02-27 09:18:53 +00:00
" Tape head is moving reverse " ,
" Tape head is moving forward or undefined "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_x_flag_t = {
2012-02-27 09:18:53 +00:00
" TCOUNT field present " ,
" TCOUNT field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_x_flag_c = {
2012-02-27 09:18:53 +00:00
" COUNT field present " ,
" COUNT field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_x_flag_f = {
2012-02-27 09:18:53 +00:00
" FIRST field present " ,
" FIRST field NOT present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_x_flag_d = {
2012-02-27 09:18:53 +00:00
" DATA field present " ,
" DATA field not present "
} ;
2012-02-27 11:44:19 +00:00
static const true_false_string rtp_midi_sj_chapter_x_flag_l = {
2012-02-27 09:18:53 +00:00
" List Tool used " ,
" Recency Tool used "
} ;
2012-05-17 20:13:22 +00:00
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_lsb = - 1 ;
static int hf_rtp_midi_cj_chapter_m_log_lsb_x = - 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_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_count = - 1 ;
static int hf_rtp_midi_cj_chapter_m_log_count_x = - 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_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_sflag = - 1 ;
static int hf_rtp_midi_sj_chapter_v_count = - 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_sflag = - 1 ;
static int hf_rtp_midi_sj_chapter_d_reset_count = - 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_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_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 ;
2012-02-27 09:18:53 +00:00
static int hf_rtp_midi_sysex_common_nrt_gi_device_family_member = - 1 ;
2012-05-17 20:13:22 +00:00
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 ;
2012-02-27 09:18:53 +00:00
/* RTP MIDI fields defining a subtree */
2012-05-17 20:13:22 +00:00
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 ;
2012-02-27 09:18:53 +00:00
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
2012-02-27 11:44:19 +00:00
decodetime ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int cmd_len )
2012-02-27 09:18:53 +00:00
{
guint8 octet ;
unsigned int consumed ;
unsigned int i ;
unsigned long deltatime ;
consumed = 0 ;
deltatime = 0 ;
/* RTP-MIDI deltatime is "compressed" using only the necessary amount of octets */
for ( i = 0 ; i < 4 ; i + + ) {
if ( ! cmd_len ) {
return - 1 ;
}
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 , unsigned int cmd_len , guint8 status , unsigned int rsoffset , gboolean using_rs ) {
2012-05-17 20:13:22 +00:00
guint8 note ;
guint8 velocity ;
const gchar * status_str ;
const gchar * note_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( status > > 4 , rtp_midi_channel_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
/* this case should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
note = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( note & RTP_MIDI_COMMAND_STATUS_FLAG ) {
/* this case should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
note_str = val_to_str ( note , rtp_midi_note_values , rtp_midi_unknown_value_dec ) ;
/* broken: we have only one further octet */
if ( cmd_len < 2 ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " TRUNCATED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " TRUNCATED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
velocity = tvb_get_guint8 ( tvb , offset + 1 ) ;
/* seems to be an aborted MIDI-command */
if ( velocity & RTP_MIDI_COMMAND_STATUS_FLAG ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " ABORTED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " ABORTED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 2 , " %s (c=%d, n=%s, v=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str , velocity ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_item = proto_tree_add_text ( tree , tvb , offset - 1 , 3 , " %s (c=%d, n=%s, v=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str , velocity ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 , unsigned int cmd_len , guint8 status , unsigned int rsoffset , gboolean using_rs ) {
2012-05-17 20:13:22 +00:00
guint8 note ;
guint8 velocity ;
const gchar * status_str ;
const gchar * note_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( status > > 4 , rtp_midi_channel_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
/* this should never happen! */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
note = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( note & RTP_MIDI_COMMAND_STATUS_FLAG ) {
/* this should never happethis should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
note_str = val_to_str ( note , rtp_midi_note_values , rtp_midi_unknown_value_dec ) ;
/* broken: we have only one further octet */
if ( cmd_len < 2 ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " TRUNCATED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " TRUNCATED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
velocity = tvb_get_guint8 ( tvb , offset + 1 ) ;
/* seems to be an aborted MIDI-command */
if ( velocity & RTP_MIDI_COMMAND_STATUS_FLAG ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " ABORTED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " ABORTED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 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_item = proto_tree_add_text ( tree , tvb , offset , 2 , " %s (c=%d, n=%s, v=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str , velocity ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_item = proto_tree_add_text ( tree , tvb , offset - 1 , 3 , " %s (c=%d, n=%s, v=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str , velocity ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 , unsigned int cmd_len , guint8 status , unsigned int rsoffset , gboolean using_rs ) {
2012-05-17 20:13:22 +00:00
guint8 note ;
guint8 pressure ;
const gchar * status_str ;
const gchar * note_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( status > > 4 , rtp_midi_channel_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
/* this should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
note = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( note & RTP_MIDI_COMMAND_STATUS_FLAG ) {
/* this should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
note_str = val_to_str ( note , rtp_midi_note_values , rtp_midi_unknown_value_dec ) ;
/* broken: we have only one further octet */
if ( cmd_len < 2 ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " TRUNCATED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " TRUNCATED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
pressure = tvb_get_guint8 ( tvb , offset + 1 ) ;
/* seems to be an aborted MIDI-command */
if ( pressure & RTP_MIDI_COMMAND_STATUS_FLAG ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " ABORTED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " ABORTED: %s (c=%d, n=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 2 , " %s (c=%d, n=%s, p=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str , pressure ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_item = proto_tree_add_text ( tree , tvb , offset - 1 , 3 , " %s (c=%d, n=%s, p=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , note_str , pressure ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 , unsigned int cmd_len , guint8 status , unsigned int rsoffset , gboolean using_rs ) {
2012-05-17 20:13:22 +00:00
guint8 pressure ;
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( status > > 4 , rtp_midi_channel_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
/* this should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
pressure = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( pressure & RTP_MIDI_COMMAND_STATUS_FLAG ) {
if ( using_rs ) {
/* this should never happen */
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " %s (c=%d, p=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , pressure ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " %s (c=%d, p=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , pressure ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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
2012-02-27 11:44:19 +00:00
decode_pitch_bend_change ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int cmd_count , unsigned int offset , unsigned int cmd_len , guint8 status , unsigned int rsoffset , gboolean using_rs ) {
2012-02-27 09:18:53 +00:00
2012-05-17 20:13:22 +00:00
guint8 octet1 ;
guint8 octet2 ;
guint8 pitch ;
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( status > > 4 , rtp_midi_channel_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
/* this should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
octet1 = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( octet1 & RTP_MIDI_COMMAND_STATUS_FLAG ) {
/* this should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
/* broken: we have only one further octet */
if ( cmd_len < 2 ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_truncated , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_truncated , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
}
return - 1 ;
}
octet2 = tvb_get_guint8 ( tvb , offset + 1 ) ;
/* seems to be an aborted MIDI-command */
if ( octet2 & RTP_MIDI_COMMAND_STATUS_FLAG ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_truncated , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_truncated , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
}
return - 1 ;
}
pitch = ( octet1 < < 7 ) | octet2 ;
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 2 , " %s (c=%d, pb=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , pitch ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_item = proto_tree_add_text ( tree , tvb , offset - 1 , 3 , " %s (c=%d, pb=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , pitch ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 , unsigned int cmd_len , guint8 status , unsigned int rsoffset , gboolean using_rs ) {
2012-05-17 20:13:22 +00:00
guint8 program ;
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( status > > 4 , rtp_midi_channel_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
/* this should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
program = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( program & RTP_MIDI_COMMAND_STATUS_FLAG ) {
/* this should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " %s (c=%d, p=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , program ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " %s (c=%d, p=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , program ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 , unsigned int cmd_len , guint8 status , unsigned int rsoffset , gboolean using_rs ) {
2012-05-17 20:13:22 +00:00
guint8 controller ;
guint8 value ;
const gchar * status_str ;
const gchar * ctrl_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( status > > 4 , rtp_midi_channel_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
/* this should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
controller = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( controller & RTP_MIDI_COMMAND_STATUS_FLAG ) {
/* this should never happen */
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 0 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s (c=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
ctrl_str = val_to_str ( controller , rtp_midi_controller_values , " Unknown: %d " ) ;
/* broken: we have only one further octet */
if ( cmd_len < 2 ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " TRUNCATED: %s (c=%d, ctrl=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , ctrl_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " TRUNCATED: %s (c=%d, ctrl=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , ctrl_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
value = tvb_get_guint8 ( tvb , offset + 1 ) ;
/* seems to be an aborted MIDI-command */
if ( value & RTP_MIDI_COMMAND_STATUS_FLAG ) {
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " ABORTED: %s (c=%d, ctrl=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , ctrl_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
} else {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " ABORTED: %s (c=%d, ctrl=%s) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , ctrl_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) ;
}
return - 1 ;
}
if ( using_rs ) {
command_item = proto_tree_add_text ( tree , tvb , offset , 2 , " %s (c=%d, ctrl=%s, v=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , ctrl_str , value ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_item = proto_tree_add_text ( tree , tvb , offset - 1 , 3 , " %s (c=%d, ctrl=%s, v=%d) " , status_str , ( status & RTP_MIDI_CHANNEL_MASK ) + 1 , ctrl_str , value ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_sd_hdr ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 2 )
return - 1 ;
/* sample number */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_sn , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
data_len - = 2 ;
consumed + = 2 ;
if ( data_len < 1 )
return - 1 ;
/* sample format */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_sf , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 3 )
return - 1 ;
/* sample period */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_sp , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
data_len - = 3 ;
consumed + = 3 ;
if ( data_len < 3 )
return - 1 ;
/* sample length */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_sl , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
data_len - = 3 ;
consumed + = 3 ;
if ( data_len < 3 )
return - 1 ;
/* loop start */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_ls , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
data_len - = 3 ;
consumed + = 3 ;
if ( data_len < 3 )
return - 1 ;
/* loop end */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_le , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
data_len - = 3 ;
consumed + = 3 ;
if ( data_len < 1 )
return - 1 ;
/* loop type */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_lt , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime Sample Dump Packet command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_sd_packet ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return - 1 ;
/* sample number */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_packet_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
/* do we have sample-data? */
if ( data_len > 1 ) {
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_packet_data , tvb , offset , data_len - 1 , ENC_NA ) ;
2012-05-17 20:13:22 +00:00
offset + = ( data_len - 1 ) ;
2012-02-27 09:18:53 +00:00
data_len - = ( data_len - 1 ) ;
consumed + = ( data_len - 1 ) ;
}
/* do we have data for the checksum! */
if ( data_len < 1 )
return - 1 ;
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_packet_check , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime Sample Dump Request command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_sd_req ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 2 )
return - 1 ;
/* sample number */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_sn , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
consumed + = 2 ;
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime Sample Dump Extension command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_sd_ext ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-05-17 20:13:22 +00:00
guint8 sub_id ;
2012-02-27 09:18:53 +00:00
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_sd_ext , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( sub_id = = RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LOOP_POINT_TRANSMISSION ) {
if ( data_len < 2 )
return - 1 ;
/* sample number */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_sn , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
data_len - = 2 ;
consumed + = 2 ;
if ( data_len < 2 )
return - 1 ;
/* loop number */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_ext_ln , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
data_len - = 2 ;
consumed + = 2 ;
if ( data_len < 1 )
return - 1 ;
/* loop type */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_lt , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 3 )
return - 1 ;
/* loop start */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_ls , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
data_len - = 3 ;
consumed + = 3 ;
if ( data_len < 3 )
return - 1 ;
/* loop end */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_le , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
consumed + = 3 ;
} else if ( sub_id = = RTP_MIDI_SYSEX_COMMON_NRT_SD_EXT_LOOP_POINTS_REQUEST ) {
if ( data_len < 2 )
return - 1 ;
/* sample number */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_header_sn , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
data_len - = 2 ;
consumed + = 2 ;
if ( data_len < 2 )
return - 1 ;
/* loop number */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_sd_ext_ln , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
consumed + = 2 ;
2012-05-03 14:00:56 +00:00
}
2012-02-27 09:18:53 +00:00
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime General Information command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_gi ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-05-17 20:13:22 +00:00
guint8 sub_id ;
2012-02-27 09:18:53 +00:00
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 . */
2012-05-03 14:00:56 +00:00
if ( sub_id = = RTP_MIDI_SYSEX_COMMON_NRT_GI_IDENTITY_REQUEST ) {
2012-02-27 09:18:53 +00:00
/* nothing more to do... */
} else if ( sub_id = = RTP_MIDI_SYSEX_COMMON_NRT_GI_IDENTITY_REPLY ) {
2012-05-17 20:13:22 +00:00
guint8 manu_short ;
2012-02-27 09:18:53 +00:00
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 ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
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 ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
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 ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
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 ;
2012-05-03 14:00:56 +00:00
}
2012-02-27 09:18:53 +00:00
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime File Dump command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_fd ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-05-17 20:13:22 +00:00
guint8 sub_id ;
2012-02-27 09:18:53 +00:00
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_fd , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( sub_id = = RTP_MIDI_SYSEX_COMMON_NRT_FD_HEADER ) {
if ( data_len < 1 )
return - 1 ;
/* type */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_fd_device_id , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 4 )
return - 1 ;
/* file type */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_fd_type , tvb , offset , 4 , ENC_ASCII | ENC_NA ) ;
2012-05-17 20:13:22 +00:00
offset + = 4 ;
2012-02-27 09:18:53 +00:00
data_len - = 4 ;
consumed + = 4 ;
if ( data_len < 4 )
return - 1 ;
/* file length */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_fd_length , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 4 ;
2012-02-27 09:18:53 +00:00
data_len - = 4 ;
consumed + = 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 ) ;
data_len - = data_len ;
consumed + = data_len ;
}
} else if ( sub_id = = RTP_MIDI_SYSEX_COMMON_NRT_FD_DATA_PACKET ) {
if ( data_len < 1 )
return - 1 ;
/* 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 - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* 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 - - ;
consumed + + ;
/* 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 ) ;
2012-05-17 20:13:22 +00:00
offset + = ( data_len - 1 ) ;
2012-02-27 09:18:53 +00:00
data_len - = ( data_len - 1 ) ;
consumed + = ( data_len - 1 ) ;
}
/* do we have data for the checksum? */
if ( data_len < 1 )
return - 1 ;
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_fd_checksum , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
} else if ( sub_id = = RTP_MIDI_SYSEX_COMMON_NRT_FD_REQUEST ) {
if ( data_len < 1 )
return - 1 ;
/* type */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_fd_device_id , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 4 )
return - 1 ;
/* file type */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_fd_type , tvb , offset , 4 , ENC_ASCII | ENC_NA ) ;
2012-05-17 20:13:22 +00:00
offset + = 4 ;
2012-02-27 09:18:53 +00:00
data_len - = 4 ;
consumed + = 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 ) ;
data_len - = data_len ;
consumed + = data_len ;
}
}
return consumed ;
}
/*
* 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
2012-02-27 11:44:19 +00:00
decode_sysex_common_tuning ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
2012-05-17 20:13:22 +00:00
proto_item * tune_item ;
proto_tree * tune_tree ;
const gchar * note_str ;
guint8 sub_id ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
unsigned int i ;
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_tuning , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( sub_id = = RTP_MIDI_SYSEX_COMMON_TUNING_BULK_DUMP_REQUEST ) {
if ( data_len < 1 )
return - 1 ;
/* type */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_tune_program , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
} else if ( sub_id = = RTP_MIDI_SYSEX_COMMON_TUNING_BULK_DUMP_REPLY ) {
if ( data_len < 1 )
return - 1 ;
/* type */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_tune_program , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 16 )
return - 1 ;
/* file length */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_tune_name , tvb , offset , 16 , ENC_ASCII | ENC_NA ) ;
2012-05-17 20:13:22 +00:00
offset + = 16 ;
2012-02-27 09:18:53 +00:00
data_len - = 16 ;
consumed + = 16 ;
for ( i = 0 ; i < 128 ; i + + ) {
if ( data_len < 3 )
return - 1 ;
note_str = val_to_str ( i , rtp_midi_note_values , rtp_midi_unknown_value_dec ) ;
tune_item = proto_tree_add_text ( tree , tvb , offset , 3 , " Note: %s " , note_str ) ;
tune_tree = proto_item_add_subtree ( tune_item , ett_rtp_midi_sysex_common_tune_note ) ;
/* frequency */
proto_tree_add_item ( tune_tree , hf_rtp_midi_sysex_common_tune_freq , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
data_len - = 3 ;
consumed + = 3 ;
}
if ( data_len < 1 )
return - 1 ;
/* checksum */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_tune_checksum , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
} else if ( sub_id = = RTP_MIDI_SYSEX_COMMON_TUNING_NOTE_CHANGE ) {
2012-05-17 20:13:22 +00:00
guint8 changes ;
2012-02-27 09:18:53 +00:00
if ( data_len < 1 )
return - 1 ;
/* type */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_tune_program , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* 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 + + ;
data_len - - ;
consumed + + ;
for ( i = 0 ; i < changes ; i + + ) {
2012-05-17 20:13:22 +00:00
guint8 note ;
2012-02-27 09:18:53 +00:00
if ( data_len < 4 )
return - 1 ;
note = tvb_get_guint8 ( tvb , offset ) ;
note_str = val_to_str ( note , rtp_midi_note_values , rtp_midi_unknown_value_dec ) ;
tune_item = proto_tree_add_text ( tree , tvb , offset , 3 , " Note: %s " , note_str ) ;
tune_tree = proto_item_add_subtree ( tune_item , ett_rtp_midi_sysex_common_tune_note ) ;
/* note */
proto_tree_add_item ( tune_tree , hf_rtp_midi_sysex_common_tune_note , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
/* frequency */
proto_tree_add_item ( tune_tree , hf_rtp_midi_sysex_common_tune_freq , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
data_len - = 3 ;
consumed + = 3 ;
}
}
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime General MIDI command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_gm ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_gm , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime Downloadable Sounds command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_dls ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_dls , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime End Of File command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_eof ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
/* 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 ) ;
offset + + ;
data_len - - ;
consumed + + ;
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime Wait command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_wait ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
/* 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 ) ;
offset + + ;
data_len - - ;
consumed + + ;
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime Cancel command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_cancel ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
/* 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 ) ;
offset + + ;
data_len - - ;
consumed + + ;
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime NAK command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_nak ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
/* 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 ) ;
offset + + ;
data_len - - ;
consumed + + ;
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime ACK command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_ack ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
/* 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 ) ;
offset + + ;
data_len - - ;
consumed + + ;
return consumed ;
}
/*
* 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
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt_mtc ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_mtc , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* 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 - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* minutes */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_mtc_mn , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* seconds */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_mtc_sc , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* frames */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_mtc_fr , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* fractional frames */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_mtc_ff , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* 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 - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* 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 - - ;
consumed + + ;
if ( data_len ) {
/* additional data */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_nrt_mtc_add , tvb , offset , data_len , ENC_NA ) ;
data_len - = data_len ;
consumed + = data_len ;
}
return consumed ;
}
/*
* 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
2012-02-27 11:44:19 +00:00
decode_sysex_common_rt_mtc_cue ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_cueing , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* 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 - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* 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 - - ;
consumed + + ;
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 ) ;
data_len - = data_len ;
consumed + = data_len ;
}
return consumed ;
}
/*
* Here a Sysex - Common Non - Realtime command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_nrt ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-05-17 20:13:22 +00:00
guint8 common_nrt ;
const gchar * nrt_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
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 " ) ;
2012-02-27 11:44:19 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset , data_len , " %s " , nrt_str ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_sysex_common_nrt ) ;
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 , data_len ) ;
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 , data_len ) ;
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 */
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
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
2012-02-27 11:44:19 +00:00
decode_sysex_common_rt_mtc ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-05-17 20:13:22 +00:00
guint8 sub_id ;
2012-02-27 09:18:53 +00:00
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_rt_mtc , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( sub_id = = RTP_MIDI_SYSEX_COMMON_RT_MTC_FULL_MESSAGE ) {
if ( data_len < 1 )
return - 1 ;
/* 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 + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* minutes */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_fm_mn , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* seconds */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_fm_sc , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* frames */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_fm_fr , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
} else if ( sub_id = = RTP_MIDI_SYSEX_COMMON_RT_MTC_USER_BITS ) {
if ( data_len < 1 )
return - 1 ;
/* U1 */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_ub_u1 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* U2 */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_ub_u2 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* U3 */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_ub_u3 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* U4 */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_ub_u4 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* U5 */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_ub_u5 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* U6 */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_ub_u6 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* U7 */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_ub_u7 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* U8 */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_ub_u8 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* U9 */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mtc_ub_u9 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
}
return consumed ;
}
/*
* Here a Sysex - Common Realtime MIDI Show Control command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_rt_sc ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_sc , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
/* TODO: decode Show Control stuff */
return consumed ;
}
/*
* Here a Sysex - Common Realtime Notation Information command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_rt_ni ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-05-17 20:13:22 +00:00
guint8 sub_id ;
2012-02-27 09:18:53 +00:00
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_rt_ni , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( sub_id = = RTP_MIDI_SYSEX_COMMON_RT_NT_BAR_NUMBER ) {
if ( data_len < 2 )
return - 1 ;
/* bar number */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_ni_bar_num , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
consumed + = 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 ) ) {
2012-05-17 20:13:22 +00:00
int bytes ;
2012-02-27 09:18:53 +00:00
if ( data_len < 1 )
return - 1 ;
/* 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 + + ;
data_len - - ;
consumed + + ;
if ( data_len < 1 )
return - 1 ;
/* beats / numerator */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_ni_numerator , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
bytes - - ;
/* beats / denominator */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_ni_denominator , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
bytes - - ;
/* clocks */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_ni_midi_clocks , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
bytes - - ;
/* 32nds */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_ni_32nds , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
bytes - - ;
while ( bytes > 0 ) {
if ( data_len < 1 )
return - 1 ;
/* beats / numerator */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_ni_numerator , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
bytes - - ;
/* beats / denominator */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_ni_denominator , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
bytes - - ;
}
}
return consumed ;
}
/*
* Here a Sysex - Common Realtime Device Control command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_rt_dc ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-05-17 20:13:22 +00:00
guint8 sub_id ;
2012-02-27 09:18:53 +00:00
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_rt_dc , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
if ( sub_id = = RTP_MIDI_SYSEX_COMMON_RT_DC_MASTER_VOLUME ) {
if ( data_len < 2 )
return - 1 ;
/* volume */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_dc_volume , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
consumed + = 2 ;
} else if ( sub_id = = RTP_MIDI_SYSEX_COMMON_RT_DC_MASTER_BALANCE ) {
if ( data_len < 2 )
return - 1 ;
/* balance */
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_dc_balance , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
consumed + = 2 ;
}
return consumed ;
}
/*
* Here a Sysex - Common Realtime MIDI Machine Control command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_rt_mmc_command ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mmc_commands , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
/* TODO: decode MMC stuff */
return consumed ;
}
/*
* Here a Sysex - Common Realtime MIDI Machine Control response is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_rt_mmc_response ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
proto_tree_add_item ( tree , hf_rtp_midi_sysex_common_rt_mmc_responses , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
data_len - - ;
consumed + + ;
/* TODO: decode MMC stuff */
return consumed ;
}
/*
* Here a Sysex - Common Realtime command is decoded .
*/
static unsigned int
2012-02-27 11:44:19 +00:00
decode_sysex_common_rt ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-05-17 20:13:22 +00:00
guint8 common_rt ;
const gchar * rt_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
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 " ) ;
2012-02-27 11:44:19 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset , data_len , " %s " , rt_str ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_sysex_common_rt ) ;
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 */
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
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
2012-02-27 11:44:19 +00:00
decode_sysex_common_educational ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int data_len ) {
2012-05-17 20:13:22 +00:00
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
if ( data_len < 1 )
return consumed ;
command_item = proto_tree_add_text ( tree , tvb , offset , data_len , RTP_MIDI_TREE_NAME_COMMAND_SYSEX_EDU ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_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
2012-02-27 12:13:06 +00:00
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_ ) {
2012-05-17 20:13:22 +00:00
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
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_item = proto_tree_add_text ( tree , tvb , offset , data_len , RTP_MIDI_TREE_NAME_COMMAND_SYSEX_MANU ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_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
2012-02-27 11:44:19 +00:00
decode_sysex_start ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int cmd_count , unsigned int offset , unsigned int cmd_len ) {
2012-05-17 20:13:22 +00:00
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
2012-05-17 20:13:22 +00:00
int data_len ;
2012-02-27 09:18:53 +00:00
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 ) {
2012-05-17 20:13:22 +00:00
guint8 octet ;
2012-02-27 09:18:53 +00:00
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 ;
2012-02-27 11:44:19 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 + consumed , " %s " , status_str ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 ) {
2012-05-17 20:13:22 +00:00
guint8 manu_short ;
guint16 manufacturer ;
2012-02-27 09:18:53 +00:00
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 ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
data_len - = 2 ;
ext_consumed = decode_sysex_common_manufacturer ( tvb , pinfo , command_tree , offset , data_len , manufacturer ) ;
2012-02-27 09:18:53 +00:00
} else {
2012-05-17 20:13:22 +00:00
ext_consumed = - 1 ;
2012-02-27 09:18:53 +00:00
}
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
2012-02-27 11:44:19 +00:00
decode_mtc_quarter_frame ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int cmd_count , unsigned int offset , unsigned int cmd_len ) {
2012-05-17 20:13:22 +00:00
guint8 value ;
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( RTP_MIDI_STATUS_COMMON_MTC_QUARTER_FRAME , rtp_midi_common_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s " , status_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
proto_tree_add_item ( command_tree , hf_rtp_midi_common_status , tvb , offset - 1 , 1 , ENC_BIG_ENDIAN ) ;
return - 1 ;
}
value = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( value & RTP_MIDI_COMMAND_STATUS_FLAG ) {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s " , status_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
proto_tree_add_item ( command_tree , hf_rtp_midi_common_status , tvb , offset - 1 , 1 , ENC_BIG_ENDIAN ) ;
return - 1 ;
}
2012-02-27 11:44:19 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " %s " , status_str ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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
2012-02-27 11:44:19 +00:00
decode_song_position_pointer ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int cmd_count , unsigned int offset , unsigned int cmd_len ) {
2012-05-17 20:13:22 +00:00
guint8 octet1 ;
guint8 octet2 ;
guint8 position ;
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( RTP_MIDI_STATUS_COMMON_SONG_POSITION_POINTER , rtp_midi_common_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s " , status_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
proto_tree_add_item ( command_tree , hf_rtp_midi_common_status , tvb , offset - 1 , 1 , ENC_BIG_ENDIAN ) ;
return - 1 ;
}
octet1 = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( octet1 & RTP_MIDI_COMMAND_STATUS_FLAG ) {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s " , status_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
proto_tree_add_item ( command_tree , hf_rtp_midi_common_status , tvb , offset - 1 , 1 , ENC_BIG_ENDIAN ) ;
return - 1 ;
}
/* broken: we have only one further octet */
if ( cmd_len < 2 ) {
2012-02-27 12:48:08 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " TRUNCATED: %s " , status_str ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_truncated , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
return - 1 ;
}
octet2 = tvb_get_guint8 ( tvb , offset + 1 ) ;
/* seems to be an aborted MIDI-command */
if ( octet2 & RTP_MIDI_COMMAND_STATUS_FLAG ) {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " ABORTED: %s " , status_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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_truncated , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
return - 1 ;
}
position = ( octet1 < < 7 ) | octet2 ;
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 3 , " %s (p=%d) " , status_str , position ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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
2012-02-27 11:44:19 +00:00
decode_song_select ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int cmd_count , unsigned int offset , unsigned int cmd_len ) {
2012-05-17 20:13:22 +00:00
guint8 song_nr ;
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( RTP_MIDI_STATUS_COMMON_SONG_SELECT , rtp_midi_common_status , rtp_midi_unknown_value_hex ) ;
/* broken: we have no further data */
if ( ! cmd_len ) {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " TRUNCATED: %s " , status_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
proto_tree_add_item ( command_tree , hf_rtp_midi_common_status , tvb , offset - 1 , 1 , ENC_BIG_ENDIAN ) ;
return - 1 ;
}
song_nr = tvb_get_guint8 ( tvb , offset ) ;
/* seems to be an aborted MIDI-command */
if ( song_nr & RTP_MIDI_COMMAND_STATUS_FLAG ) {
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " ABORTED: %s " , status_str ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
proto_tree_add_item ( command_tree , hf_rtp_midi_common_status , tvb , offset - 1 , 1 , ENC_BIG_ENDIAN ) ;
return - 1 ;
}
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 2 , " %s (s=%d) " , status_str , song_nr ) ;
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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
2012-02-27 11:44:19 +00:00
decode_undefined_f4 ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int cmd_count , unsigned int offset , unsigned int cmd_len ) {
2012-05-17 20:13:22 +00:00
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
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 ) {
2012-05-17 20:13:22 +00:00
guint8 octet ;
2012-02-27 09:18:53 +00:00
octet = tvb_get_guint8 ( tvb , offset + consumed ) ;
consumed + + ;
/* Is this command through? */
if ( octet & RTP_MIDI_COMMAND_STATUS_FLAG ) {
break ;
}
}
2012-02-27 11:44:19 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 + consumed , " %s " , status_str ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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
2012-02-27 11:44:19 +00:00
decode_undefined_f5 ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int cmd_count , unsigned int offset , unsigned int cmd_len ) {
2012-05-17 20:13:22 +00:00
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
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 ) {
2012-05-17 20:13:22 +00:00
guint8 octet ;
2012-02-27 09:18:53 +00:00
octet = tvb_get_guint8 ( tvb , offset + consumed ) ;
consumed + + ;
/* Is this command done? */
if ( octet & RTP_MIDI_COMMAND_STATUS_FLAG ) {
break ;
}
}
2012-02-27 11:44:19 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 + consumed , " %s " , status_str ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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
2012-02-27 12:13:06 +00:00
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_ ) {
2012-05-17 20:13:22 +00:00
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
2012-02-27 09:18:53 +00:00
status_str = val_to_str ( RTP_MIDI_STATUS_COMMON_TUNE_REQUEST , rtp_midi_common_status , rtp_midi_unknown_value_hex ) ;
2012-02-27 11:44:19 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 , " %s " , status_str ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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
2012-02-27 11:44:19 +00:00
decode_sysex_end ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int cmd_count , unsigned int offset , unsigned int cmd_len ) {
2012-05-17 20:13:22 +00:00
const gchar * status_str ;
proto_item * command_item ;
proto_tree * command_tree ;
int consumed = 0 ;
2012-02-27 09:18:53 +00:00
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 ) {
2012-05-17 20:13:22 +00:00
guint8 octet ;
2012-02-27 09:18:53 +00:00
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 ;
}
}
2012-02-27 11:44:19 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset - 1 , 1 + consumed , " %s " , status_str ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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
2012-02-27 11:44:19 +00:00
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 )
2012-02-27 09:18:53 +00:00
{
int consumed = 0 ;
int ext_consumed = 0 ;
2012-05-17 20:13:22 +00:00
guint8 octet ;
gboolean using_rs ;
2012-02-27 09:18:53 +00:00
2012-05-17 20:13:22 +00:00
#if 0
guint8 octet2 ;
2012-02-27 09:18:53 +00:00
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 ;
2012-05-17 20:13:22 +00:00
unsigned int helpoffset ;
# endif
2012-02-27 09:18:53 +00:00
/* extra sanity check */
if ( ! cmd_len ) {
return - 1 ;
}
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 ) {
2012-05-17 20:13:22 +00:00
proto_item * command_item ;
proto_tree * command_tree ;
const gchar * valstr ;
2012-02-27 09:18:53 +00:00
valstr = val_to_str ( octet , rtp_midi_common_status , rtp_midi_unknown_value_hex ) ;
2012-02-27 11:44:19 +00:00
command_item = proto_tree_add_text ( tree , tvb , offset , 1 , " %s " , valstr ) ;
2012-02-27 09:18:53 +00:00
command_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_command ) ;
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 , cmd_len , octet , * rsoffset , using_rs ) ;
break ;
case RTP_MIDI_STATUS_CHANNEL_NOTE_ON :
ext_consumed = decode_note_on ( tvb , pinfo , tree , cmd_count , offset , cmd_len , octet , * rsoffset , using_rs ) ;
break ;
case RTP_MIDI_STATUS_CHANNEL_POLYPHONIC_KEY_PRESSURE :
ext_consumed = decode_poly_pressure ( tvb , pinfo , tree , cmd_count , offset , cmd_len , octet , * rsoffset , using_rs ) ;
break ;
case RTP_MIDI_STATUS_CHANNEL_CONTROL_CHANGE :
ext_consumed = decode_control_change ( tvb , pinfo , tree , cmd_count , offset , cmd_len , octet , * rsoffset , using_rs ) ;
break ;
case RTP_MIDI_STATUS_CHANNEL_PROGRAM_CHANGE :
ext_consumed = decode_program_change ( tvb , pinfo , tree , cmd_count , offset , cmd_len , octet , * rsoffset , using_rs ) ;
break ;
case RTP_MIDI_STATUS_CHANNEL_CHANNEL_PRESSURE :
ext_consumed = decode_channel_pressure ( tvb , pinfo , tree , cmd_count , offset , cmd_len , 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 , cmd_len , 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 , cmd_len ) ;
break ;
case RTP_MIDI_STATUS_COMMON_SONG_POSITION_POINTER :
ext_consumed = decode_song_position_pointer ( tvb , pinfo , tree , cmd_count , offset , cmd_len ) ;
break ;
case RTP_MIDI_STATUS_COMMON_SONG_SELECT :
ext_consumed = decode_song_select ( tvb , pinfo , tree , cmd_count , offset , cmd_len ) ;
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
2012-02-27 11:44:19 +00:00
decode_cj_chapter_c ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_cj_chapter_tree ;
proto_tree * rtp_midi_loglist_tree ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
guint8 octet ;
int count ;
int i ;
/* Can we at least read the length of the control changes chapter? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
octet = tvb_get_guint8 ( tvb , offset ) ;
count = octet & 0x7f ;
/* count encoded is n+1 */
count + + ;
ti = proto_tree_add_text ( tree , tvb , offset , 1 + 2 * count , RTP_MIDI_TREE_NAME_CJ_CHAPTER_C ) ;
rtp_midi_cj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 + + ;
consumed + + ;
ti = proto_tree_add_text ( rtp_midi_cj_chapter_tree , tvb , offset , count * 2 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_C_LOGLIST ) ;
rtp_midi_loglist_tree = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_c_loglist ) ;
for ( i = 0 ; i < count ; i + + ) {
/* Can we still read this number/value-pair? */
if ( ! tvb_bytes_exist ( tvb , offset , 2 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 2 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_C_LOGITEM ) ;
ti = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_c_logitem ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_c_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_c_number , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
octet = tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_item ( ti , 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 ( ti , hf_rtp_midi_cj_chapter_c_tflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_c_alt , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
} else {
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_c_value , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
}
offset + + ;
consumed + + ;
}
return consumed ;
}
/*
* Here the chapter m of the channel - journal is decoded , possibly the most complex part of the RTP - MIDI stuff ; - )
*/
static int
2012-02-27 11:44:19 +00:00
decode_cj_chapter_m ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_cj_chapter_tree ;
proto_tree * rtp_midi_loglist_tree ;
proto_tree * rtp_midi_loglist_item_tree ;
2012-02-27 09:18:53 +00:00
guint16 header ;
guint8 logitemheader ;
int length ;
int logitemhdrlen ;
int logitemlen ;
gboolean no_pnum_msb ;
int consumed = 0 ;
/* Can we read this channel-journals header? */
if ( ! tvb_bytes_exist ( tvb , offset , 2 ) ) {
return - 1 ;
}
/* 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 ;
ti = proto_tree_add_text ( tree , tvb , offset , length , RTP_MIDI_TREE_NAME_CJ_CHAPTER_M ) ;
rtp_midi_cj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 */
consumed + = 2 ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
/* do we have the pending field? */
if ( header & 0x4000 ) {
/* Can we read this pending field? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
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 ) ;
consumed + + ;
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 ;
ti = proto_tree_add_text ( rtp_midi_cj_chapter_tree , tvb , offset , length , RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOGLIST ) ;
rtp_midi_loglist_tree = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_m_loglist ) ;
/* lets step through the loglist */
while ( length > 0 ) {
/* Can we read this channel-journals header? */
if ( ! tvb_bytes_exist ( tvb , offset , logitemhdrlen ) ) {
return - 1 ;
}
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... */
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , logitemlen , RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOGITEM ) ;
rtp_midi_loglist_item_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ) ;
consumed + + ;
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 ) ;
consumed + + ;
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 ) ;
consumed + + ;
offset + + ;
length - - ;
/* do we have a entry-msb field? */
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_J ) {
/* Can we read this table? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 1 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOG_MSB ) ;
ti = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_m_log_msb ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_msb_x , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_msb , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
consumed + + ;
offset + + ;
length - - ;
}
/* do we have a entry-lsb field? */
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_K ) {
/* Can we read this table? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 1 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOG_LSB ) ;
ti = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_m_log_lsb ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_lsb_x , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_lsb , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
consumed + + ;
offset + + ;
length - - ;
}
/* do we have an a-button field? */
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_L ) {
/* Can we read this table? */
if ( ! tvb_bytes_exist ( tvb , offset , 2 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 2 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOG_A_BUTTON ) ;
ti = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_m_log_a_button ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_a_button_g , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_a_button_x , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_a_button , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
consumed + = 2 ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
length - = 2 ;
2012-02-27 09:18:53 +00:00
}
/* do we have a c-button field? */
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_M ) {
/* Can we read this table? */
if ( ! tvb_bytes_exist ( tvb , offset , 2 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 2 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOG_C_BUTTON ) ;
ti = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_m_log_c_button ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_c_button_g , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_c_button_r , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_c_button , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
consumed + = 2 ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
length - = 2 ;
2012-02-27 09:18:53 +00:00
}
/* do we have a count field? */
if ( logitemheader & RTP_MIDI_CJ_CHAPTER_M_FLAG_N ) {
/* Can we read this table? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 1 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_M_LOG_COUNT ) ;
ti = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_m_log_count ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_count_x , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_m_log_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
consumed + + ;
offset + + ;
length - - ;
}
}
return consumed ;
}
/*
* Here the chapter n of the channel - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_cj_chapter_n ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_cj_chapter_tree ;
proto_tree * rtp_midi_loglist_tree ;
const gchar * note_str ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
guint16 header ;
guint8 note ;
guint8 velocity ;
int log_count ;
int octet_count ;
int low ;
int high ;
int i ;
/* Can we read this channel-journals header? */
if ( ! tvb_bytes_exist ( tvb , offset , 2 ) ) {
return - 1 ;
}
/* 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 + + ;
}
ti = proto_tree_add_text ( tree , tvb , offset , 2 + ( log_count * 2 ) + octet_count , RTP_MIDI_TREE_NAME_CJ_CHAPTER_N ) ;
rtp_midi_cj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
consumed + = 2 ;
if ( log_count > 0 ) {
/* Can we read this loglist? */
if ( ! tvb_bytes_exist ( tvb , offset , log_count * 2 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_cj_chapter_tree , tvb , offset , log_count * 2 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_N_LOGLIST ) ;
rtp_midi_loglist_tree = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_n_loglist ) ;
for ( i = 0 ; i < log_count ; i + + ) {
note = tvb_get_guint8 ( tvb , offset ) & 0x7f ;
2012-04-13 20:22:31 +00:00
velocity = tvb_get_guint8 ( tvb , offset + 1 ) & 0x7f ;
2012-02-27 09:18:53 +00:00
note_str = val_to_str ( note , rtp_midi_note_values , rtp_midi_unknown_value_dec ) ;
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 2 , " %s (n=%s, v=%d) " , RTP_MIDI_TREE_NAME_CJ_CHAPTER_N_LOGITEM , note_str , velocity ) ;
ti = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_n_logitem ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_n_log_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_n_log_notenum , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_n_log_yflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_n_log_velocity , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
}
}
if ( octet_count > 0 ) {
/* Can we read this loglist? */
if ( ! tvb_bytes_exist ( tvb , offset , octet_count ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_cj_chapter_tree , tvb , offset , log_count , RTP_MIDI_TREE_NAME_CJ_CHAPTER_N_OCTETS ) ;
rtp_midi_loglist_tree = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_n_octets ) ;
for ( i = 0 ; i < octet_count ; i + + ) {
2012-03-02 11:04:31 +00:00
proto_tree_add_item ( rtp_midi_loglist_tree , hf_rtp_midi_cj_chapter_n_log_octet , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2012-02-27 09:18:53 +00:00
offset + + ;
consumed + + ;
}
}
return consumed ;
}
/*
* Here the chapter e of the channel - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_cj_chapter_e ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_cj_chapter_tree ;
proto_tree * rtp_midi_loglist_tree ;
const gchar * note_str ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
guint8 header ;
guint8 note ;
guint8 count_vel ;
guint8 octet ;
int log_count ;
int i ;
/* Can we read this channel-journals header? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
/* 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 + + ;
ti = proto_tree_add_text ( tree , tvb , offset , 1 + ( log_count * 2 ) , RTP_MIDI_TREE_NAME_CJ_CHAPTER_E ) ;
rtp_midi_cj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 + + ;
consumed + + ;
/* Can we read this loglist? */
if ( ! tvb_bytes_exist ( tvb , offset , log_count * 2 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_cj_chapter_tree , tvb , offset , log_count * 2 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_E_LOGLIST ) ;
rtp_midi_loglist_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ( note , rtp_midi_note_values , rtp_midi_unknown_value_dec ) ;
if ( octet & 0x80 ) {
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 2 , " %s (n=%s, v=%d) " , RTP_MIDI_TREE_NAME_CJ_CHAPTER_E_LOGITEM1 , note_str , count_vel ) ;
} else {
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 2 , " %s (n=%s, c=%d) " , RTP_MIDI_TREE_NAME_CJ_CHAPTER_E_LOGITEM2 , note_str , count_vel ) ;
}
ti = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_e_logitem ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_e_log_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_e_log_notenum , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_e_log_vflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
if ( octet & 0x80 ) {
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_e_log_velocity , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
} else {
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_e_log_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
}
offset + + ;
consumed + + ;
}
return consumed ;
}
/*
* Here the chapter a of the channel - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_cj_chapter_a ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_cj_chapter_tree ;
proto_tree * rtp_midi_loglist_tree ;
const gchar * note_str ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
guint8 header ;
guint8 note ;
guint8 pressure ;
int log_count ;
int i ;
/* Can we read this channel-journals header? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
/* 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 + + ;
ti = proto_tree_add_text ( tree , tvb , offset , 1 + ( log_count * 2 ) , RTP_MIDI_TREE_NAME_CJ_CHAPTER_A ) ;
rtp_midi_cj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 + + ;
consumed + + ;
/* Can we read this loglist? */
if ( ! tvb_bytes_exist ( tvb , offset , log_count * 2 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_cj_chapter_tree , tvb , offset , log_count * 2 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_A_LOGLIST ) ;
rtp_midi_loglist_tree = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_a_loglist ) ;
for ( i = 0 ; i < log_count ; i + + ) {
2012-05-17 20:13:22 +00:00
note = tvb_get_guint8 ( tvb , offset ) & 0x7f ;
2012-02-27 09:18:53 +00:00
pressure = tvb_get_guint8 ( tvb , offset + 1 ) & 0x7f ;
note_str = val_to_str ( note , rtp_midi_note_values , rtp_midi_unknown_value_dec ) ;
ti = proto_tree_add_text ( rtp_midi_loglist_tree , tvb , offset , 2 , " %s (n=%s, p=%d) " , RTP_MIDI_TREE_NAME_CJ_CHAPTER_A_LOGITEM , note_str , pressure ) ;
ti = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_a_logitem ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_a_log_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_a_log_notenum , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_a_log_xflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ti , hf_rtp_midi_cj_chapter_a_log_pressure , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
}
return consumed ;
}
/*
* Here a channel - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_channel_journal ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_chanjournal_tree ;
proto_tree * rtp_midi_cj_chapters_tree ;
proto_tree * rtp_midi_cj_chapter_tree ;
2012-02-27 09:18:53 +00:00
guint32 chanflags ;
guint16 chanjourlen ;
int consumed = 0 ;
int ext_consumed = 0 ;
/* Can we read this channel-journals header? */
if ( ! tvb_bytes_exist ( tvb , offset , 3 ) ) {
return - 1 ;
}
/* 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 ;
2012-02-27 11:44:19 +00:00
ti = proto_tree_add_text ( tree , tvb , offset , chanjourlen , " %s " , val_to_str ( ( chanflags & RTP_MIDI_CJ_MASK_CHANNEL ) > > RTP_MIDI_CJ_CHANNEL_SHIFT , rtp_midi_channels , rtp_midi_unknown_value_hex ) ) ;
2012-02-27 09:18:53 +00:00
rtp_midi_chanjournal_tree = proto_item_add_subtree ( ti , ett_rtp_midi_channeljournal ) ;
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 ) ;
ti = proto_tree_add_text ( rtp_midi_chanjournal_tree , tvb , offset + 3 , chanjourlen - 3 , RTP_MIDI_TREE_NAME_CHANNEL_CHAPTERS ) ;
rtp_midi_cj_chapters_tree = proto_item_add_subtree ( ti , ett_rtp_midi_channelchapters ) ;
/* take care of length of header */
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
consumed + = 3 ;
/* Do we have a program change chapter? */
if ( chanflags & RTP_MIDI_CJ_FLAG_P ) {
/* Can we read the program change chapter? */
if ( ! tvb_bytes_exist ( tvb , offset , 3 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_cj_chapters_tree , tvb , offset , 3 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_P ) ;
rtp_midi_cj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ) ;
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
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 ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* 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 ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* Do we have a pitch-wheel chapter? */
if ( chanflags & RTP_MIDI_CJ_FLAG_W ) {
/* Can we get the data for the Pitch Wheel chapter? */
if ( ! tvb_bytes_exist ( tvb , offset , 2 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_cj_chapters_tree , tvb , offset , 2 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_W ) ;
rtp_midi_cj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* 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 ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* Do we have channel aftertouch chapter? */
if ( chanflags & RTP_MIDI_CJ_FLAG_T ) {
/* Can we get the data for the Pitch Wheel chapter? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_cj_chapters_tree , tvb , offset , 1 , RTP_MIDI_TREE_NAME_CJ_CHAPTER_T ) ;
rtp_midi_cj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_cj_chapter_t ) ;
proto_tree_add_item ( rtp_midi_cj_chapter_tree , hf_rtp_midi_cj_chapter_t_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_cj_chapter_tree , hf_rtp_midi_cj_chapter_t_pressure , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
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
2012-02-27 11:44:19 +00:00
decode_sj_chapter_d_f4 ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-02-27 09:18:53 +00:00
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_field_tree ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
guint16 f4flags ;
guint16 f4length ;
/* Can we read this fields header? */
if ( ! tvb_bytes_exist ( tvb , offset , 2 ) ) {
return - 1 ;
}
/* 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 */
ti = proto_tree_add_text ( tree , tvb , offset , f4length , RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_J ) ;
rtp_midi_field_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
consumed + = 2 ;
f4length - = 2 ;
if ( f4flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_C ) {
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_syscom_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
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 ( ; ; ) {
if ( ! tvb_bytes_exist ( tvb , offset + valuelen , 1 ) ) {
return - 1 ;
}
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 ) ;
2012-05-17 20:13:22 +00:00
offset + = valuelen ;
f4length - = valuelen ;
2012-02-27 09:18:53 +00:00
}
if ( f4flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_L ) {
if ( ! tvb_bytes_exist ( tvb , offset , f4length ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_syscom_legal , tvb , offset , f4length , ENC_NA ) ;
2012-05-17 20:13:22 +00:00
offset + = f4length ;
f4length - = f4length ;
2012-02-27 09:18:53 +00:00
}
/* if we still have data, the length-field was incorrect we dump the data here and abort! */
if ( f4length > 0 ) {
if ( ! tvb_bytes_exist ( tvb , offset , f4length ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_syscom_data , tvb , offset , f4length , ENC_NA ) ;
consumed + = f4length ;
/* must be a protocol error - since we have a length, we can recover...*/
}
return consumed ;
}
/*
* Here the chapter D F5 - field of the system - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_sj_chapter_d_f5 ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-02-27 09:18:53 +00:00
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_field_tree ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
guint16 f5flags ;
guint16 f5length ;
/* Can we read this fields header? */
if ( ! tvb_bytes_exist ( tvb , offset , 2 ) ) {
return - 1 ;
}
/* 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 */
ti = proto_tree_add_text ( tree , tvb , offset , f5length , RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_K ) ;
rtp_midi_field_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
consumed + = 2 ;
f5length - = 2 ;
if ( f5flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_C ) {
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_syscom_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
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 ( ; ; ) {
if ( ! tvb_bytes_exist ( tvb , offset + valuelen , 1 ) ) {
return - 1 ;
}
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 ) ;
2012-05-17 20:13:22 +00:00
offset + = valuelen ;
f5length - = valuelen ;
2012-02-27 09:18:53 +00:00
}
if ( f5flags & RTP_MIDI_SJ_CHAPTER_D_SYSCOM_FLAG_L ) {
if ( ! tvb_bytes_exist ( tvb , offset , f5length ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_syscom_legal , tvb , offset , f5length , ENC_NA ) ;
2012-05-17 20:13:22 +00:00
offset + = f5length ;
f5length - = f5length ;
2012-02-27 09:18:53 +00:00
}
/* if we still have data, we dump it here - see above! */
if ( f5length > 0 ) {
if ( ! tvb_bytes_exist ( tvb , offset , f5length ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_syscom_data , tvb , offset , f5length , ENC_NA ) ;
consumed + = f5length ;
/* must be a protocol error - since we have a length, we can recover...*/
}
return consumed ;
}
/*
* Here the chapter D F9 - field of the system - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_sj_chapter_d_f9 ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-02-27 09:18:53 +00:00
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_field_tree ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
guint8 f9flags ;
guint8 f9length ;
/* Can we read this fields header? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
/* 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 */
ti = proto_tree_add_text ( tree , tvb , offset , f9length , RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_Y ) ;
rtp_midi_field_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 + + ;
consumed + + ;
f9length - - ;
if ( f9flags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_C ) {
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_sysreal_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
f9length - - ;
}
if ( f9flags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_L ) {
if ( ! tvb_bytes_exist ( tvb , offset , f9length ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_sysreal_legal , tvb , offset , f9length , ENC_NA ) ;
2012-05-17 20:13:22 +00:00
offset + = f9length ;
f9length - = f9length ;
2012-02-27 09:18:53 +00:00
}
/* if we still have data, the length-field was incorrect we dump the data here and abort! */
if ( f9length > 0 ) {
if ( ! tvb_bytes_exist ( tvb , offset , f9length ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_sysreal_data , tvb , offset , f9length , ENC_NA ) ;
consumed + = f9length ;
/* must be a protocol error - since we have a length, we can recover...*/
}
return consumed ;
}
/*
* Here the chapter D FD - field of the system - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_sj_chapter_d_fd ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-02-27 09:18:53 +00:00
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_field_tree ;
2012-02-27 09:18:53 +00:00
int consumed = 0 ;
guint8 fdflags ;
guint8 fdlength ;
/* Can we read this fields header? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
/* Get flags & length */
2012-05-17 20:13:22 +00:00
fdflags = tvb_get_guint8 ( tvb , offset ) ;
2012-02-27 09:18:53 +00:00
fdlength = fdflags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_MASK_LENGTH ;
/* now we can display our tree, as we now have the full length */
ti = proto_tree_add_text ( tree , tvb , offset , fdlength , RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_Z ) ;
rtp_midi_field_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 + + ;
consumed + + ;
fdlength - - ;
if ( fdflags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_C ) {
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_sysreal_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
fdlength - - ;
}
if ( fdflags & RTP_MIDI_SJ_CHAPTER_D_SYSREAL_FLAG_L ) {
if ( ! tvb_bytes_exist ( tvb , offset , fdlength ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_sysreal_legal , tvb , offset , fdlength , ENC_NA ) ;
2012-05-17 20:13:22 +00:00
offset + = fdlength ;
fdlength - = fdlength ;
2012-02-27 09:18:53 +00:00
}
/* if we still have data, the length-field was incorrect we dump the data here and abort! */
if ( fdlength > 0 ) {
if ( ! tvb_bytes_exist ( tvb , offset , fdlength ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_sysreal_data , tvb , offset , fdlength , ENC_NA ) ;
consumed + = fdlength ;
/* must be a protocol error - since we have a length, we can recover...*/
}
return consumed ;
}
/*
* Here the chapter D of the channel - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_sj_chapter_d ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_item * tix ;
proto_tree * rtp_midi_sj_chapter_tree ;
proto_tree * rtp_midi_field_tree ;
2012-02-27 09:18:53 +00:00
guint8 header ;
int consumed = 0 ;
int ext_consumed ;
/* Can we read this channel-journals header? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
/* 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 now that we have at least the header - > 1.
* At the end we set the real length . . .
*/
tix = proto_tree_add_text ( tree , tvb , offset , 1 , RTP_MIDI_TREE_NAME_SJ_CHAPTER_D ) ;
rtp_midi_sj_chapter_tree = proto_item_add_subtree ( tix , ett_rtp_midi_sj_chapter_d ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_d_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_d_bflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_d_gflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_d_hflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_d_jflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_d_kflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_d_yflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_d_zflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
/* done with header */
consumed + + ;
offset + + ;
/* do we have Reset field? */
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_B ) {
/* Can we get the data for the Reset chapter? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_sj_chapter_tree , tvb , offset , 1 , RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_B ) ;
rtp_midi_field_tree = proto_item_add_subtree ( ti , ett_rtp_midi_sj_chapter_d_field_b ) ;
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_reset_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_reset_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
}
/* do we have Tune request field? */
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_G ) {
/* Can we get the data for the Reset chapter? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_sj_chapter_tree , tvb , offset , 1 , RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_G ) ;
rtp_midi_field_tree = proto_item_add_subtree ( ti , ett_rtp_midi_sj_chapter_d_field_g ) ;
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_tune_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_tune_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
}
/* do we have Song select field? */
if ( header & RTP_MIDI_SJ_CHAPTER_D_FLAG_H ) {
/* Can we get the data for the Reset chapter? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_sj_chapter_tree , tvb , offset , 1 , RTP_MIDI_TREE_NAME_SJ_CHAPTER_D_FIELD_H ) ;
rtp_midi_field_tree = proto_item_add_subtree ( ti , ett_rtp_midi_sj_chapter_d_field_h ) ;
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_song_sel_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_field_tree , hf_rtp_midi_sj_chapter_d_song_sel_value , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
}
/* 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 ;
}
consumed + = ext_consumed ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* 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 ;
}
consumed + = ext_consumed ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* 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 ;
}
consumed + = ext_consumed ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* 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 ;
}
consumed + = ext_consumed ;
}
/* now we know the complete length and set it. */
proto_item_set_len ( tix , consumed ) ;
return consumed ;
}
/*
* Here the chapter Q of the channel - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_sj_chapter_q ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_sj_chapter_tree ;
2012-02-27 09:18:53 +00:00
guint8 header ;
int consumed = 0 ;
int len = 1 ;
/* Can we read this chapters header? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 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... */
ti = proto_tree_add_text ( tree , tvb , offset , len , RTP_MIDI_TREE_NAME_SJ_CHAPTER_Q ) ;
rtp_midi_sj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ) {
if ( ! tvb_bytes_exist ( tvb , offset , 3 ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_q_clock , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
consumed + = 3 ;
2012-05-17 20:13:22 +00:00
offset + = 3 ;
2012-02-27 09:18:53 +00:00
} else {
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_q_top , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
consumed + + ;
offset + + ;
}
if ( header & RTP_MIDI_SJ_CHAPTER_Q_FLAG_T ) {
if ( ! tvb_bytes_exist ( tvb , offset , 3 ) ) {
return - 1 ;
}
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_q_timetools , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
consumed + = 3 ;
}
return consumed ;
}
/*
* Here the chapter F of the channel - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_sj_chapter_f ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_sj_chapter_tree ;
proto_tree * rtp_midi_sj_field_tree ;
2012-02-27 09:18:53 +00:00
guint8 header ;
int consumed = 0 ;
int len = 1 ;
/* Can we read this chapters header? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 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... */
ti = proto_tree_add_text ( tree , tvb , offset , len , RTP_MIDI_TREE_NAME_SJ_CHAPTER_F ) ;
rtp_midi_sj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ) ;
consumed + + ;
offset + + ;
if ( header & RTP_MIDI_SJ_CHAPTER_F_FLAG_C ) {
if ( ! tvb_bytes_exist ( tvb , offset , 4 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_sj_chapter_tree , tvb , offset , 4 , RTP_MIDI_TREE_NAME_SJ_CHAPTER_F_COMPLETE ) ;
rtp_midi_sj_field_tree = proto_item_add_subtree ( ti , ett_rtp_midi_sj_chapter_f_complete ) ;
if ( header & RTP_MIDI_SJ_CHAPTER_F_FLAG_Q ) {
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt0 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt1 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt2 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt3 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt5 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt6 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt7 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
} else {
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_hr , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mn , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_sc , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_fr , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
}
consumed + = 4 ;
2012-05-17 20:13:22 +00:00
offset + = 4 ;
2012-02-27 09:18:53 +00:00
}
if ( header & RTP_MIDI_SJ_CHAPTER_F_FLAG_P ) {
if ( ! tvb_bytes_exist ( tvb , offset , 4 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_sj_chapter_tree , tvb , offset , 4 , RTP_MIDI_TREE_NAME_SJ_CHAPTER_F_PARTIAL ) ;
rtp_midi_sj_field_tree = proto_item_add_subtree ( ti , ett_rtp_midi_sj_chapter_f_partial ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt0 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt1 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt2 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt3 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt4 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt5 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt6 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_field_tree , hf_rtp_midi_sj_chapter_f_mt7 , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
consumed + = 4 ;
}
return consumed ;
}
/*
* Here the chapter X of the channel - journal is decoded .
*/
static int
2012-02-27 11:44:19 +00:00
decode_sj_chapter_x ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset , unsigned int max_length ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_sj_chapter_tree ;
proto_tree * rtp_midi_sj_data_tree ;
2012-02-27 09:18:53 +00:00
guint8 header ;
guint8 octet ;
unsigned int consumed = 0 ;
2012-05-17 20:13:22 +00:00
unsigned long cmdlen = 0 ;
2012-02-27 09:18:53 +00:00
unsigned int i ;
2012-05-17 20:13:22 +00:00
/* Can we read this chapter's header? */
2012-02-27 09:18:53 +00:00
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
/* first we need to get the flags of this chapter */
header = tvb_get_guint8 ( tvb , offset ) ;
ti = proto_tree_add_text ( tree , tvb , offset , max_length , RTP_MIDI_TREE_NAME_SJ_CHAPTER_X ) ;
rtp_midi_sj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ) {
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
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 ) {
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
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 ) {
2012-05-17 20:13:22 +00:00
unsigned long field = 0 ;
unsigned long fieldlen = 0 ;
2012-02-27 09:18:53 +00:00
/* 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 ;
}
2012-05-17 20:13:22 +00:00
consumed + = fieldlen ;
offset + = fieldlen ;
2012-02-27 09:18:53 +00:00
}
2012-05-17 20:13:22 +00:00
/* XXX: 'cmdlen' in the following is always 0 (since initialized to 0 above) ??? */
2012-02-27 09:18:53 +00:00
if ( header & RTP_MIDI_SJ_CHAPTER_X_FLAG_D ) {
ti = proto_tree_add_text ( rtp_midi_sj_chapter_tree , tvb , offset , max_length - consumed , RTP_MIDI_TREE_NAME_SJ_CHAPTER_X_DATA ) ;
rtp_midi_sj_data_tree = proto_item_add_subtree ( ti , ett_rtp_midi_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 ;
2012-05-17 20:13:22 +00:00
cmdlen = 0 ;
2012-02-27 09:18:53 +00:00
}
2012-05-17 20:13:22 +00:00
consumed + = 1 ;
2012-02-27 09:18:53 +00:00
}
/* 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 ) {
ti = proto_tree_add_text ( rtp_midi_sj_chapter_tree , tvb , offset , max_length - consumed , RTP_MIDI_TREE_NAME_SJ_CHAPTER_X_INVALID_DATA ) ;
rtp_midi_sj_data_tree = proto_item_add_subtree ( ti , ett_rtp_midi_sj_chapter_x_data ) ;
proto_tree_add_item ( rtp_midi_sj_data_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
2012-02-27 11:44:19 +00:00
decode_system_journal ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree , unsigned int offset ) {
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_sysjournal_tree ;
proto_tree * rtp_midi_sj_chapters_tree ;
int consumed = 0 ;
2012-02-27 09:18:53 +00:00
int ext_consumed = 0 ;
guint16 sysjourlen ;
guint16 systemflags ;
/* Can we read this channel-journals header? */
if ( ! tvb_bytes_exist ( tvb , offset , 2 ) ) {
return - 1 ;
}
systemflags = tvb_get_ntohs ( tvb , offset ) ;
2012-05-17 20:13:22 +00:00
sysjourlen = systemflags & RTP_MIDI_SJ_MASK_LENGTH ;
2012-02-27 09:18:53 +00:00
ti = proto_tree_add_text ( tree , tvb , offset , sysjourlen , RTP_MIDI_TREE_NAME_SYSTEM_JOURNAL ) ;
rtp_midi_sysjournal_tree = proto_item_add_subtree ( ti , ett_rtp_midi_systemjournal ) ;
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 ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
consumed + = 2 ;
ti = proto_tree_add_text ( rtp_midi_sysjournal_tree , tvb , offset , sysjourlen - 2 , RTP_MIDI_TREE_NAME_SYSTEM_CHAPTERS ) ;
rtp_midi_sj_chapters_tree = proto_item_add_subtree ( ti , ett_rtp_midi_systemchapters ) ;
/* Do we have a simple system commands chapter? */
if ( systemflags & RTP_MIDI_SJ_FLAG_D ) {
ext_consumed = decode_sj_chapter_d ( tvb , pinfo , rtp_midi_sj_chapters_tree , offset ) ;
if ( ext_consumed < 0 ) {
return ext_consumed ;
}
consumed + = ext_consumed ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* Do we have a active sensing chapter? */
if ( systemflags & RTP_MIDI_SJ_FLAG_V ) {
2012-05-17 20:13:22 +00:00
proto_tree * rtp_midi_sj_chapter_tree ;
2012-02-27 09:18:53 +00:00
/* Can we get the data for the Active Sense chapter? */
if ( ! tvb_bytes_exist ( tvb , offset , 1 ) ) {
return - 1 ;
}
ti = proto_tree_add_text ( rtp_midi_sj_chapters_tree , tvb , offset , 1 , RTP_MIDI_TREE_NAME_SJ_CHAPTER_V ) ;
rtp_midi_sj_chapter_tree = proto_item_add_subtree ( ti , ett_rtp_midi_sj_chapter_v ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_v_sflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( rtp_midi_sj_chapter_tree , hf_rtp_midi_sj_chapter_v_count , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + + ;
consumed + + ;
}
/* Do we have a sequencer state commands chapter? */
if ( systemflags & RTP_MIDI_SJ_FLAG_Q ) {
ext_consumed = decode_sj_chapter_q ( tvb , pinfo , rtp_midi_sj_chapters_tree , offset ) ;
if ( ext_consumed < 0 ) {
return ext_consumed ;
}
consumed + = ext_consumed ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* Do we have a MTC chapter? */
if ( systemflags & RTP_MIDI_SJ_FLAG_F ) {
ext_consumed = decode_sj_chapter_f ( tvb , pinfo , rtp_midi_sj_chapters_tree , offset ) ;
if ( ext_consumed < 0 ) {
return ext_consumed ;
}
consumed + = ext_consumed ;
2012-05-17 20:13:22 +00:00
offset + = ext_consumed ;
2012-02-27 09:18:53 +00:00
}
/* Make sanity check for consumed data vs. stated length of system journal */
if ( consumed < = sysjourlen ) {
return - 1 ;
}
/* 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 - consumed ) ;
if ( ext_consumed < 0 ) {
return ext_consumed ;
}
consumed + = ext_consumed ;
}
/* Make sanity check for consumed data vs. stated length of system journal */
if ( consumed ! = sysjourlen ) {
return - 1 ;
}
return consumed ;
}
/*
* 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 void
2012-02-27 11:44:19 +00:00
dissect_rtp_midi ( tvbuff_t * tvb , packet_info * pinfo _U_ , proto_tree * tree )
2012-02-27 09:18:53 +00:00
{
2012-05-17 20:13:22 +00:00
proto_item * ti ;
proto_tree * rtp_midi_tree ;
unsigned int offset = 0 ;
2012-03-30 14:48:37 +00:00
guint8 flags ; /* used for command-section and journal-section*/
2012-02-27 11:48:38 +00:00
unsigned int cmd_len ;
unsigned int cmd_count ;
2012-03-30 14:48:37 +00:00
guint8 runningstatus ;
2012-02-27 09:18:53 +00:00
2012-03-30 14:48:37 +00:00
int consumed ;
unsigned int rsoffset = 0 ;
2012-02-27 09:18:53 +00:00
2012-03-30 14:48:37 +00:00
guint8 totchan ;
2012-02-27 09:18:53 +00:00
2012-02-27 11:48:38 +00:00
unsigned int i ;
2012-02-27 09:18:53 +00:00
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 ) {
2012-05-17 20:13:22 +00:00
guint8 octet ;
octet = tvb_get_guint8 ( tvb , offset + 1 ) ;
cmd_len = ( cmd_len < < 8 ) | octet ;
2012-02-27 09:18:53 +00:00
proto_tree_add_item ( rtp_midi_tree , hf_rtp_midi_longlen , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2012-05-17 20:13:22 +00:00
offset + = 2 ;
2012-02-27 09:18:53 +00:00
} else {
proto_tree_add_item ( rtp_midi_tree , hf_rtp_midi_shortlen , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2012-03-30 14:48:37 +00:00
offset + + ;
2012-02-27 09:18:53 +00:00
}
/* if we have a command-section -> dissect it */
if ( cmd_len ) {
2012-05-17 20:13:22 +00:00
proto_item * command_item ;
proto_tree * rtp_midi_commands_tree ;
2012-02-27 09:18:53 +00:00
command_item = proto_tree_add_text ( rtp_midi_tree , tvb , offset , cmd_len , RTP_MIDI_TREE_NAME_COMMAND ) ;
rtp_midi_commands_tree = proto_item_add_subtree ( command_item , ett_rtp_midi_commands ) ;
/* if the reported command-length larger than data found in packet -> error */
if ( ! tvb_bytes_exist ( tvb , offset , cmd_len ) ) {
THROW ( ReportedBoundsError ) ;
return ;
}
/* No commands decoded yet */
2012-05-17 20:13:22 +00:00
cmd_count = 0 ;
2012-02-27 09:18:53 +00:00
/* RTP-MIDI-pdus always start with no running status */
2012-05-17 20:13:22 +00:00
runningstatus = 0 ;
2012-02-27 09:18:53 +00:00
/* 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 - if 0 is returned something went wrong */
2012-05-17 20:13:22 +00:00
consumed = decodetime ( tvb , pinfo , rtp_midi_commands_tree , offset , cmd_len ) ;
2012-02-27 09:18:53 +00:00
if ( - 1 = = consumed ) {
THROW ( ReportedBoundsError ) ;
return ;
}
/* seek to next command and set remaining length */
2012-05-17 20:13:22 +00:00
offset + = consumed ;
2012-02-27 09:18:53 +00:00
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 ) {
THROW ( ReportedBoundsError ) ;
return ;
}
/* seek to next delta-time and set remaining length */
2012-05-17 20:13:22 +00:00
offset + = consumed ;
2012-02-27 09:18:53 +00:00
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 ) {
2012-05-17 20:13:22 +00:00
proto_item * journal_item ;
proto_tree * rtp_midi_journal_tree ;
2012-02-27 09:18:53 +00:00
journal_item = proto_tree_add_text ( rtp_midi_tree , tvb , offset , - 1 , RTP_MIDI_TREE_NAME_JOURNAL ) ;
rtp_midi_journal_tree = proto_item_add_subtree ( journal_item , ett_rtp_midi_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 ) {
THROW ( ReportedBoundsError ) ;
return ;
}
/* seek to optional channel-journals-section */
offset + = consumed ;
}
/* do we have channel journal(s)? */
if ( flags & RTP_MIDI_JS_FLAG_A ) {
2012-05-17 20:13:22 +00:00
proto_tree * rtp_midi_chanjournals_tree ;
2012-02-27 09:18:53 +00:00
ti = proto_tree_add_text ( rtp_midi_journal_tree , tvb , offset , - 1 , RTP_MIDI_TREE_NAME_CHANNEL_JOURNAL ) ;
rtp_midi_chanjournals_tree = proto_item_add_subtree ( ti , ett_rtp_midi_channeljournals ) ;
/* 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 ) {
THROW ( ReportedBoundsError ) ;
return ;
}
/* seek to next channel-journal */
offset + = consumed ;
}
}
}
}
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 ,
VALS ( rtp_midi_note_values ) ,
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 " ,
" rtpevent.controller " ,
FT_UINT8 ,
BASE_DEC ,
VALS ( rtp_midi_controller_values ) ,
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 ,
VALS ( rtp_midi_manu_short_values ) ,
0x7f ,
NULL , HFILL
}
} ,
{
& hf_rtp_midi_manu_long ,
{
" Manufacturer (long) " ,
" rtpmidi.manufacturer_long " ,
FT_UINT16 ,
BASE_HEX ,
VALS ( rtp_midi_manu_long_values ) ,
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 ,
VALS ( rtp_midi_controller_values ) ,
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_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_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_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_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_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 ,
VALS ( rtp_midi_note_values ) ,
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 ,
VALS ( rtp_midi_note_values ) ,
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_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 ,
VALS ( rtp_midi_note_values ) ,
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_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_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_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_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_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_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 ,
VALS ( rtp_midi_sysex_common_rt_show_control ) ,
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 ,
VALS ( rtp_midi_note_values ) ,
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 ) ;
}
2012-03-10 17:00:30 +00:00
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 ) ;
}
2012-02-27 09:18:53 +00:00
}