/*
 * NRPN.cs
 * Copyright (c) 2009 kbinani
 *
 * This file is part of Boare.Lib.Vsq.
 *
 * Boare.Lib.Vsq is free software; you can redistribute it and/or
 * modify it under the terms of the BSD License.
 *
 * Boare.Lib.Vsq 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.
 */
using System;
using System.Reflection;
using System.Collections.Generic;

namespace Boare.Lib.Vsq {

    public static class NRPN {
        /// <summary>
        /// (0x5000) Version number(MSB) &amp;, Device number(LSB)
        /// </summary>
        public const ushort CVM_NM_VERSION_AND_DEVICE = 0x5000;
        /// <summary>
        /// (0x5001) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort CVM_NM_DELAY = 0x5001;
        /// <summary>
        /// (0x5002) Note number(MSB)
        /// </summary>
        public const ushort CVM_NM_NOTE_NUMBER = 0x5002;
        /// <summary>
        /// (0x5003) Velocity(MSB)
        /// </summary>
        public const ushort CVM_NM_VELOCITY = 0x5003;
        /// <summary>
        /// (0x5004) Note Duration in millisec(MSB, LSB)
        /// </summary>
        public const ushort CVM_NM_NOTE_DURATION = 0x5004;
        /// <summary>
        /// (0x5005) Note Location(MSB)
        /// </summary>
        public const ushort CVM_NM_NOTE_LOCATION = 0x5005;
        /// <summary>
        /// (0x5006) Attack Type(MSB, LSB)
        /// </summary>
        public const ushort CVM_NM_ATTACK_TYPE = 0x5006;
        /// <summary>
        /// (0x5007) Attack Duration in millisec(MSB, LSB)
        /// </summary>
        public const ushort CVM_NM_ATTACK_DURATION = 0x5007;
        /// <summary>
        /// (0x5008) Attack Depth(MSB)
        /// </summary>
        public const ushort CVM_NM_ATTACK_DEPTH = 0x5008;
        /// <summary>
        /// (0x500c) Index of Vibrato DB(MSB: ID_H00, LSB:ID_L00)
        /// </summary>
        public const ushort CVM_NM_INDEX_OF_VIBRATO_DB = 0x500c;
        /// <summary>
        /// (0x500d) Vibrato configuration(MSB: Index of Vibrato Type, LSB: Duration &amp;, Configuration parameter of vibrato)
        /// </summary>
        public const ushort CVM_NM_VIBRATO_CONFIG = 0x500d;
        /// <summary>
        /// (0x500e) Vibrato Delay(MSB)
        /// </summary>
        public const ushort CVM_NM_VIBRATO_DELAY = 0x500e;
        /*/// <summary>
        /// (0x5011) Unknonw(MSB), only used in VOCALOID1
        /// </summary>
        public const ushort CVM_NM_UNKNOWN1 = 0x5011;*/
        /// <summary>
        /// (0x5012) Number of phonetic symbols in bytes(MSB)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL_BYTES = 0x5012;
        /// <summary>
        /// (0x5013) Phonetic symbol 1(MSB:Phonetic symbol 1, LSB: Consonant adjustment 1)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL1 = 0x5013;
        /// <summary>
        /// (0x5014) Phonetic symbol 2(MSB:Phonetic symbol 2, LSB: Consonant adjustment 2)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL2 = 0x5014;
        /// <summary>
        /// (0x5015) Phonetic symbol 3(MSB:Phonetic symbol 3, LSB: Consonant adjustment 3)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL3 = 0x5015;
        /// <summary>
        /// (0x5016) Phonetic symbol 4(MSB:Phonetic symbol 4, LSB: Consonant adjustment 4)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL4 = 0x5016;
        /// <summary>
        /// (0x5017) Phonetic symbol 5(MSB:Phonetic symbol 5, LSB: Consonant adjustment 5)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL5 = 0x5017;
        /// <summary>
        /// (0x5018) Phonetic symbol 6(MSB:Phonetic symbol 6, LSB: Consonant adjustment 6)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL6 = 0x5018;
        /// <summary>
        /// (0x5019) Phonetic symbol 7(MSB:Phonetic symbol 7, LSB: Consonant adjustment 7)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL7 = 0x5019;
        /// <summary>
        /// (0x501a) Phonetic symbol 8(MSB:Phonetic symbol 8, LSB: Consonant adjustment 8)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL8 = 0x501a;
        /// <summary>
        /// (0x501b) Phonetic symbol 9(MSB:Phonetic symbol 9, LSB: Consonant adjustment 9)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL9 = 0x501b;
        /// <summary>
        /// (0x501c) Phonetic symbol 10(MSB:Phonetic symbol 10, LSB: Consonant adjustment 10)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL10 = 0x501c;
        /// <summary>
        /// (0x501d) Phonetic symbol 11(MSB:Phonetic symbol 11, LSB: Consonant adjustment 11)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL11 = 0x501d;
        /// <summary>
        /// (0x501e) Phonetic symbol 12(MSB:Phonetic symbol 12, LSB: Consonant adjustment 12)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL12 = 0x501e;
        /// <summary>
        /// (0x501f) Phonetic symbol 13(MSB:Phonetic symbol 13, LSB: Consonant adjustment 13)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL13 = 0x501f;
        /// <summary>
        /// (0x5020) Phonetic symbol 14(MSB:Phonetic symbol 14, LSB: Consonant adjustment 14)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL14 = 0x5020;
        /// <summary>
        /// (0x5021) Phonetic symbol 15(MSB:Phonetic symbol 15, LSB: Consonant adjustment 15)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL15 = 0x5021;
        /// <summary>
        /// (0x5022) Phonetic symbol 16(MSB:Phonetic symbol 16, LSB: Consonant adjustment 16)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL16 = 0x5022;
        /// <summary>
        /// (0x5023) Phonetic symbol 17(MSB:Phonetic symbol 17, LSB: Consonant adjustment 17)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL17 = 0x5023;
        /// <summary>
        /// (0x5024) Phonetic symbol 18(MSB:Phonetic symbol 18, LSB: Consonant adjustment 18)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL18 = 0x5024;
        /// <summary>
        /// (0x5025) Phonetic symbol 19(MSB:Phonetic symbol 19, LSB: Consonant adjustment 19)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL19 = 0x5025;
        /// <summary>
        /// (0x5026) Phonetic symbol 20(MSB:Phonetic symbol 20, LSB: Consonant adjustment 20)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL20 = 0x5026;
        /// <summary>
        /// (0x5027) Phonetic symbol 21(MSB:Phonetic symbol 21, LSB: Consonant adjustment 21)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL21 = 0x5027;
        /// <summary>
        /// (0x5028) Phonetic symbol 22(MSB:Phonetic symbol 22, LSB: Consonant adjustment 22)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL22 = 0x5028;
        /// <summary>
        /// (0x5029) Phonetic symbol 23(MSB:Phonetic symbol 23, LSB: Consonant adjustment 23)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL23 = 0x5029;
        /// <summary>
        /// (0x502a) Phonetic symbol 24(MSB:Phonetic symbol 24, LSB: Consonant adjustment 24)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL24 = 0x502a;
        /// <summary>
        /// (0x502b) Phonetic symbol 25(MSB:Phonetic symbol 25, LSB: Consonant adjustment 25)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL25 = 0x502b;
        /// <summary>
        /// (0x502c) Phonetic symbol 26(MSB:Phonetic symbol 26, LSB: Consonant adjustment 26)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL26 = 0x502c;
        /// <summary>
        /// (0x502d) Phonetic symbol 27(MSB:Phonetic symbol 27, LSB: Consonant adjustment 27)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL27 = 0x502d;
        /// <summary>
        /// (0x502e) Phonetic symbol 28(MSB:Phonetic symbol 28, LSB: Consonant adjustment 28)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL28 = 0x502e;
        /// <summary>
        /// (0x502f) Phonetic symbol 29(MSB:Phonetic symbol 29, LSB: Consonant adjustment 29)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL29 = 0x502f;
        /// <summary>
        /// (0x5030) Phonetic symbol 30(MSB:Phonetic symbol 30, LSB: Consonant adjustment 30)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL30 = 0x5030;
        /// <summary>
        /// (0x5031) Phonetic symbol 31(MSB:Phonetic symbol 31, LSB: Consonant adjustment 31)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL31 = 0x5031;
        /// <summary>
        /// (0x5032) Phonetic symbol 32(MSB:Phonetic symbol 32, LSB: Consonant adjustment 32)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL32 = 0x5032;
        /// <summary>
        /// (0x5033) Phonetic symbol 33(MSB:Phonetic symbol 33, LSB: Consonant adjustment 33)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL33 = 0x5033;
        /// <summary>
        /// (0x5034) Phonetic symbol 34(MSB:Phonetic symbol 34, LSB: Consonant adjustment 34)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL34 = 0x5034;
        /// <summary>
        /// (0x5035) Phonetic symbol 35(MSB:Phonetic symbol 35, LSB: Consonant adjustment 35)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL35 = 0x5035;
        /// <summary>
        /// (0x5036) Phonetic symbol 36(MSB:Phonetic symbol 36, LSB: Consonant adjustment 36)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL36 = 0x5036;
        /// <summary>
        /// (0x5037) Phonetic symbol 37(MSB:Phonetic symbol 37, LSB: Consonant adjustment 37)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL37 = 0x5037;
        /// <summary>
        /// (0x5038) Phonetic symbol 38(MSB:Phonetic symbol 38, LSB: Consonant adjustment 38)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL38 = 0x5038;
        /// <summary>
        /// (0x5039) Phonetic symbol 39(MSB:Phonetic symbol 39, LSB: Consonant adjustment 39)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL39 = 0x5039;
        /// <summary>
        /// (0x503a) Phonetic symbol 40(MSB:Phonetic symbol 40, LSB: Consonant adjustment 40)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL40 = 0x503a;
        /// <summary>
        /// (0x503b) Phonetic symbol 41(MSB:Phonetic symbol 41, LSB: Consonant adjustment 41)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL41 = 0x503b;
        /// <summary>
        /// (0x503c) Phonetic symbol 42(MSB:Phonetic symbol 42, LSB: Consonant adjustment 42)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL42 = 0x503c;
        /// <summary>
        /// (0x503d) Phonetic symbol 43(MSB:Phonetic symbol 43, LSB: Consonant adjustment 43)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL43 = 0x503d;
        /// <summary>
        /// (0x503e) Phonetic symbol 44(MSB:Phonetic symbol 44, LSB: Consonant adjustment 44)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL44 = 0x503e;
        /// <summary>
        /// (0x503f) Phonetic symbol 45(MSB:Phonetic symbol 45, LSB: Consonant adjustment 45)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL45 = 0x503f;
        /// <summary>
        /// (0x5040) Phonetic symbol 46(MSB:Phonetic symbol 46, LSB: Consonant adjustment 46)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL46 = 0x5040;
        /// <summary>
        /// (0x5041) Phonetic symbol 47(MSB:Phonetic symbol 47, LSB: Consonant adjustment 47)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL47 = 0x5041;
        /// <summary>
        /// (0x5042) Phonetic symbol 48(MSB:Phonetic symbol 48, LSB: Consonant adjustment 48)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL48 = 0x5042;
        /// <summary>
        /// (0x5043) Phonetic symbol 49(MSB:Phonetic symbol 49, LSB: Consonant adjustment 49)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL49 = 0x5043;
        /// <summary>
        /// (0x5044) Phonetic symbol 50(MSB:Phonetic symbol 50, LSB: Consonant adjustment 50)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL50 = 0x5044;
        /// <summary>
        /// (0x5045) Phonetic symbol 51(MSB:Phonetic symbol 51, LSB: Consonant adjustment 51)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL51 = 0x5045;
        /// <summary>
        /// (0x5046) Phonetic symbol 52(MSB:Phonetic symbol 52, LSB: Consonant adjustment 52)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL52 = 0x5046;
        /// <summary>
        /// (0x5047) Phonetic symbol 53(MSB:Phonetic symbol 53, LSB: Consonant adjustment 53)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL53 = 0x5047;
        /// <summary>
        /// (0x5048) Phonetic symbol 54(MSB:Phonetic symbol 54, LSB: Consonant adjustment 54)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL54 = 0x5048;
        /// <summary>
        /// (0x5049) Phonetic symbol 55(MSB:Phonetic symbol 55, LSB: Consonant adjustment 55)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL55 = 0x5049;
        /// <summary>
        /// (0x504a) Phonetic symbol 56(MSB:Phonetic symbol 56, LSB: Consonant adjustment 56)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL56 = 0x504a;
        /// <summary>
        /// (0x504b) Phonetic symbol 57(MSB:Phonetic symbol 57, LSB: Consonant adjustment 57)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL57 = 0x504b;
        /// <summary>
        /// (0x504c) Phonetic symbol 58(MSB:Phonetic symbol 58, LSB: Consonant adjustment 58)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL58 = 0x504c;
        /// <summary>
        /// (0x504d) Phonetic symbol 59(MSB:Phonetic symbol 59, LSB: Consonant adjustment 59)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL59 = 0x504d;
        /// <summary>
        /// (0x504e) Phonetic symbol 60(MSB:Phonetic symbol 60, LSB: Consonant adjustment 60)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL60 = 0x504e;
        /// <summary>
        /// (0x504f) Phonetic symbol continuation(MSB, 0x7f=end, 0x00=continue)
        /// </summary>
        public const ushort CVM_NM_PHONETIC_SYMBOL_CONTINUATION = 0x504f;
        /// <summary>
        /// (0x5050) v1mean in Cent/5(MSB)
        /// </summary>
        public const ushort CVM_NM_V1MEAN = 0x5050;
        /// <summary>
        /// (0x5051) d1mean in millisec/5(MSB)
        /// </summary>
        public const ushort CVM_NM_D1MEAN = 0x5051;
        /// <summary>
        /// (0x5052) d1meanFirstNote in millisec/5(MSB)
        /// </summary>
        public const ushort CVM_NM_D1MEAN_FIRST_NOTE = 0x5052;
        /// <summary>
        /// (0x5053) d2mean in millisec/5(MSB)
        /// </summary>
        public const ushort CVM_NM_D2MEAN = 0x5053;
        /// <summary>
        /// (0x5054) d4mean in millisec/5(MSB)
        /// </summary>
        public const ushort CVM_NM_D4MEAN = 0x5054;
        /// <summary>
        /// (0x5055) pMeanOnsetFirstNote in Cent/5(MSB)
        /// </summary>
        public const ushort CVM_NM_PMEAN_ONSET_FIRST_NOTE = 0x5055;
        /// <summary>
        /// (0x5056) vMeanNoteTransition in Cent/5(MSB)
        /// </summary>
        public const ushort CVM_NM_VMEAN_NOTE_TRNSITION = 0x5056;
        /// <summary>
        /// (0x5057) pMeanEndingNote in Cent/5(MSB)
        /// </summary>
        public const ushort CVM_NM_PMEAN_ENDING_NOTE = 0x5057;
        /// <summary>
        /// (0x5058) AddScooptoUpIntervals &amp;, AddPortamentoToDownIntervals(MSB)
        /// </summary>
        public const ushort CVM_NM_ADD_PORTAMENTO = 0x5058;
        /// <summary>
        /// (0x5059) changAfterPeak(MSB)
        /// </summary>
        public const ushort CVM_NM_CHANGE_AFTER_PEAK = 0x5059;
        /// <summary>
        /// (0x505a) Accent(MSB)
        /// </summary>
        public const ushort CVM_NM_ACCENT = 0x505a;
        /// <summary>
        /// (0x507f) Note message continuation(MSB)
        /// </summary>
        public const ushort CVM_NM_NOTE_MESSAGE_CONTINUATION = 0x507f;

        /// <summary>
        /// (0x5075) Extended Note message; Voice Overlap(MSB, LSB)(VoiceOverlap = ((MSB &amp; 0x7f) &lt;&lt; 7) | (LSB &amp; 0x7f) - 8192)
        /// </summary>
        public const ushort CVM_EXNM_VOICE_OVERLAP = 0x5075;
        /// <summary>
        /// (0x5076) Extended Note message; Flags length in bytes(MSB, LSB)
        /// </summary>
        public const ushort CVM_EXNM_FLAGS_BYTES = 0x5076;
        /// <summary>
        /// (0x5077) Extended Note message; Flag(MSB)
        /// </summary>
        public const ushort CVM_EXNM_FLAGS = 0x5077;
        /// <summary>
        /// (0x5078) Extended Note message; Flag continuation(MSB)(MSB, 0x7f=end, 0x00=continue)
        /// </summary>
        public const ushort CVM_EXNM_FLAGS_CONINUATION = 0x5078;
        /// <summary>
        /// (0x5079) Extended Note message; Moduration(MSB, LSB)(Moduration = ((MSB &amp; 0x7f) &lt;&lt; 7) | (LSB &amp; 0x7f) - 100)
        /// </summary>
        public const ushort CVM_EXNM_MODURATION = 0x5079;
        /// <summary>
        /// (0x507a) Extended Note message; PreUtterance(MSB, LSB)(PreUtterance = ((MSB &amp; 0x7f) &lt;&lt; 7) | (LSB &amp; 0x7f) - 8192)
        /// </summary>
        public const ushort CVM_EXNM_PRE_UTTERANCE = 0x507a;
        /// <summary>
        /// (0x507e) Extended Note message; Envelope: value1(MSB, LSB) actual value = (value3.msb &amp; 0xf) &lt;&lt; 28 | (value2.msb &amp; 0x7f) &lt;&lt; 21 | (value2.lsb &amp; 0x7f) &lt;&lt; 14 | (value1.msb &amp; 0x7f) &lt;&lt; 7 | (value1.lsb &amp; 0x7f)
        /// </summary>
        public const ushort CVM_EXNM_ENV_DATA1 = 0x507e;
        /// <summary>
        /// (0x507d) Extended Note message; Envelope: value2(MSB, LSB)
        /// </summary>
        public const ushort CVM_EXNM_ENV_DATA2 = 0x507d;
        /// <summary>
        /// (0x507c) Extended Note message; Envelope: value3(MSB)
        /// </summary>
        public const ushort CVM_EXNM_ENV_DATA3 = 0x507c;
        /// <summary>
        /// (0x507b) Extended Note message; Envelope: data point continuation(MSB)(MSB, 0x7f=end, 0x00=continue)
        /// </summary>
        public const ushort CVM_EXNM_ENV_DATA_CONTINUATION = 0x507b;

        /// <summary>
        /// (0x6000) Version number &amp;, Device number(MSB, LSB)
        /// </summary>
        public const ushort CC_BS_VERSION_AND_DEVICE = 0x6000;
        /// <summary>
        /// (0x6001) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort CC_BS_DELAY = 0x6001;
        /// <summary>
        /// (0x6002) Laugnage type(MSB, optional LSB)
        /// </summary>
        public const ushort CC_BS_LANGUAGE_TYPE = 0x6002;

        /// <summary>
        /// (0x6100) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort CC_CV_VERSION_AND_DEVICE = 0x6100;
        /// <summary>
        /// (0x6101) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort CC_CV_DELAY = 0x6101;
        /// <summary>
        /// (0x6102) Volume value(MSB)
        /// </summary>
        public const ushort CC_CV_VOLUME = 0x6102;

        /// <summary>
        /// (0x6200) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort CC_P_VERSION_AND_DEVICE = 0x6200;
        /// <summary>
        /// (0x6201) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort CC_P_DELAY = 0x6201;
        /// <summary>
        /// (0x6202) Pan value(MSB)
        /// </summary>
        public const ushort CC_PAN = 0x6202;

        /// <summary>
        /// (0x6300) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort CC_E_VESION_AND_DEVICE = 0x6300;
        /// <summary>
        /// (0x6301) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort CC_E_DELAY = 0x6301;
        /// <summary>
        /// (0x6302) Expression vlaue(MSB)
        /// </summary>
        public const ushort CC_E_EXPRESSION = 0x6302;

        /// <summary>
        /// (0x6400) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort CC_VR_VERSION_AND_DEVICE = 0x6400;
        /// <summary>
        /// (0x6401) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort CC_VR_DELAY = 0x6401;
        /// <summary>
        /// (0x6402) Vibrato Rate value(MSB)
        /// </summary>
        public const ushort CC_VR_VIBRATO_RATE = 0x6402;

        /// <summary>
        /// (0x6500) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort CC_VD_VERSION_AND_DEVICE = 0x6500;
        /// <summary>
        /// (0x6501) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort CC_VD_DELAY = 0x6501;
        /// <summary>
        /// (0x6502) Vibrato Depth value(MSB)
        /// </summary>
        public const ushort CC_VD_VIBRATO_DEPTH = 0x6502;

        /// <summary>
        /// (0x6600) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort CC_FX2_VERSION_AND_DEVICE = 0x6600;
        /// <summary>
        /// (0x6601) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort CC_FX2_DELAY = 0x6601;
        /// <summary>
        /// (0x6602) Effect2 Depth(MSB)
        /// </summary>
        public const ushort CC_FX2_EFFECT2_DEPTH = 0x6602;

        /// <summary>
        /// (0x6700) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort CC_PBS_VERSION_AND_DEVICE = 0x6700;
        /// <summary>
        /// (0x6701) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort CC_PBS_DELAY = 0x6701;
        /// <summary>
        /// (0x6702) Pitch Bend Sensitivity(MSB, LSB)
        /// </summary>
        public const ushort CC_PBS_PITCH_BEND_SENSITIVITY = 0x6702;

        /// <summary>
        /// (0x5300) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort PC_VERSION_AND_DEVICE = 0x5300;
        /// <summary>
        /// (0x5301) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort PC_DELAY = 0x5301;
        /// <summary>
        /// (0x5302) Voice Type(MSB)
        /// </summary>
        public const ushort PC_VOICE_TYPE = 0x5302;

        /// <summary>
        /// (0x5400) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort PB_VERSION_AND_DEVICE = 0x5400;
        /// <summary>
        /// (0x5401) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort PB_DELAY = 0x5401;
        /// <summary>
        /// (0x5402) Pitch Bend value(MSB, LSB)
        /// </summary>
        public const ushort PB_PITCH_BEND = 0x5402;

        /// <summary>
        /// (0x5500) Version number &amp;, device number(MSB, LSB)
        /// </summary>
        public const ushort VCP_VERSION_AND_DEVICE = 0x5500;
        /// <summary>
        /// (0x5501) Delay in millisec(MSB, LSB)
        /// </summary>
        public const ushort VCP_DELAY = 0x5501;
        /// <summary>
        /// (0x5502) Voice Change Parameter ID(MSB)
        /// </summary>
        public const ushort VCP_VOICE_CHANGE_PARAMETER_ID = 0x5502;
        /// <summary>
        /// (0x5503) Voice Change Parameter value(MSB)
        /// </summary>
        public const ushort VCP_VOICE_CHANGE_PARAMETER = 0x5503;

        private class NrpnIterator : Iterator {
            private List<ushort> nrpns = new List<ushort>();
            private int m_pos = -1;

            public NrpnIterator() {
                Type t = typeof( NRPN );
                foreach ( FieldInfo fi in t.GetFields() ) {
                    if ( fi.FieldType.Equals( typeof( ushort ) ) ) {
                        nrpns.Add( (ushort)fi.GetValue( t ) );
                    }
                }
            }

            public bool hasNext() {
                if ( 0 <= m_pos + 1 && m_pos + 1 < nrpns.Count ) {
                    return true;
                } else {
                    return false;
                }
            }

            public Object next() {
                m_pos++;
                return nrpns[m_pos];
            }

            public void remove() {
            }
        }

        public static Iterator iterator() {
            return new NrpnIterator();
        }

        public static string getName( ushort nrpn ) {
            foreach ( FieldInfo fi in typeof( NRPN ).GetFields() ) {
                if ( fi.FieldType.Equals( typeof( ushort ) ) ) {
                    ushort v = (ushort)fi.GetValue( typeof( NRPN ) );
                    if ( v == nrpn ) {
                        return fi.Name;
                    }
                }
            }
            return "";
        }

        /// <summary>
        /// 指定したコントロールに対応するVoice Change Parameter IDの値を調べます
        /// </summary>
        /// <param name="curve_name"></param>
        /// <returns></returns>
        public static byte getVoiceChangeParameterID( string curve_name ) {
            byte lsb = 0x31;
            switch ( curve_name.ToLower() ) {
                case "harmonics":
                    lsb = 0x30;
                    break;
                case "bre":
                    lsb = 0x31;
                    break;
                case "bri":
                    lsb = 0x32;
                    break;
                case "cle":
                    lsb = 0x33;
                    break;
                case "por":
                    lsb = 0x34;
                    break;
                case "ope":
                    lsb = 0x35;
                    break;
                case "reso1freq":
                    lsb = 0x40;
                    break;
                case "reso2freq":
                    lsb = 0x41;
                    break;
                case "reso3freq":
                    lsb = 0x42;
                    break;
                case "reso4freq":
                    lsb = 0x43;
                    break;
                case "reso1bw":
                    lsb = 0x50;
                    break;
                case "reso2bw":
                    lsb = 0x51;
                    break;
                case "reso3bw":
                    lsb = 0x52;
                    break;
                case "reso4bw":
                    lsb = 0x53;
                    break;
                case "reso1amp":
                    lsb = 0x60;
                    break;
                case "reso2amp":
                    lsb = 0x61;
                    break;
                case "reso3amp":
                    lsb = 0x62;
                    break;
                case "reso4amp":
                    lsb = 0x63;
                    break;
                case "gen":
                    lsb = 0x70;
                    break;
            }
            return lsb;
        }

        public static bool is_require_data_lsb( ushort nrpn ) {
            switch ( nrpn ) {
                case CVM_NM_VERSION_AND_DEVICE:
                case CVM_NM_DELAY:
                case CVM_NM_NOTE_DURATION:
                case CVM_NM_INDEX_OF_VIBRATO_DB:
                case CVM_NM_VIBRATO_CONFIG:
                case CVM_NM_PHONETIC_SYMBOL1:
                case CC_BS_VERSION_AND_DEVICE:
                case CC_BS_DELAY:
                case CC_BS_LANGUAGE_TYPE:
                case CC_CV_VERSION_AND_DEVICE:
                case CC_CV_DELAY:
                case CC_P_VERSION_AND_DEVICE:
                case CC_P_DELAY:
                case CC_E_VESION_AND_DEVICE:
                case CC_E_DELAY:
                case CC_VR_VERSION_AND_DEVICE:
                case CC_VR_DELAY:
                case CC_VD_VERSION_AND_DEVICE:
                case CC_VD_DELAY:
                case CC_FX2_VERSION_AND_DEVICE:
                case CC_FX2_DELAY:
                case CC_PBS_VERSION_AND_DEVICE:
                case CC_PBS_DELAY:
                case CC_PBS_PITCH_BEND_SENSITIVITY:
                case PC_VERSION_AND_DEVICE:
                case PC_DELAY:
                case PB_VERSION_AND_DEVICE:
                case PB_DELAY:
                case PB_PITCH_BEND:
                case VCP_VERSION_AND_DEVICE:
                case VCP_DELAY:
                case CVM_EXNM_ENV_DATA1:
                case CVM_EXNM_ENV_DATA2:
                    return true;
                case CVM_NM_NOTE_NUMBER:
                case CVM_NM_VELOCITY:
                case CVM_NM_NOTE_LOCATION:
                case CVM_NM_VIBRATO_DELAY:
                //case CVM_NM_UNKNOWN1:
                case CVM_NM_PHONETIC_SYMBOL_BYTES:
                case CVM_NM_PHONETIC_SYMBOL_CONTINUATION:
                case CVM_NM_V1MEAN:
                case CVM_NM_D1MEAN:
                case CVM_NM_D1MEAN_FIRST_NOTE:
                case CVM_NM_D2MEAN:
                case CVM_NM_D4MEAN:
                case CVM_NM_PMEAN_ONSET_FIRST_NOTE:
                case CVM_NM_VMEAN_NOTE_TRNSITION:
                case CVM_NM_PMEAN_ENDING_NOTE:
                case CVM_NM_ADD_PORTAMENTO:
                case CVM_NM_CHANGE_AFTER_PEAK:
                case CVM_NM_ACCENT:
                case CVM_NM_NOTE_MESSAGE_CONTINUATION:
                case CC_CV_VOLUME:
                case CC_PAN:
                case CC_E_EXPRESSION:
                case CC_VR_VIBRATO_RATE:
                case CC_VD_VIBRATO_DEPTH:
                case CC_FX2_EFFECT2_DEPTH:
                case PC_VOICE_TYPE:
                case VCP_VOICE_CHANGE_PARAMETER_ID:
                case VCP_VOICE_CHANGE_PARAMETER:
                case CVM_EXNM_ENV_DATA3:
                case CVM_EXNM_ENV_DATA_CONTINUATION:
                    return false;
            }
            return false;
        }

    }

}
