OSDN Git Service

#37946 MidiInChecker2: ここまでの修正で一区切りつけます。
authoryyagi <yyagi.dtxmania@gmail.com>
Tue, 6 Feb 2018 16:48:59 +0000 (01:48 +0900)
committeryyagi <yyagi.dtxmania@gmail.com>
Tue, 6 Feb 2018 16:48:59 +0000 (01:48 +0900)
 * MIDIイベント毎の詳細出力情報を大幅に改善。なおNoteOn/Offの音階表示は国際式で表示しているが、内部的にはYAMAHA方式にも対応。(YAMAHA方式だとオクターブ表記が一段小さくなるだけだが)
 * Fileメニューに、Save As(ファイルの保存)を追加。plaint textまたはrich textでの保存が可能。
 * 右クリックメニューを追加(copy, select all)。同じものをメインメニューのEditにも追加。
 * 改行コードを \r\nから System.Environment.NewLine に変更。
 * なんとなく、ほぼすべてのコメントを英語化。
ちなみに日本語版の開発予定はありませんが、問題ないですよね?

MidiInChecker2_Solution/MidiInChecker2_Project/Form_Main.Designer.cs
MidiInChecker2_Solution/MidiInChecker2_Project/Form_Main.cs
MidiInChecker2_Solution/MidiInChecker2_Project/Form_Main.resx

index eb67643..4b1e3aa 100644 (file)
                /// </summary>\r
                private void InitializeComponent()\r
                {\r
+                       this.components = new System.ComponentModel.Container();\r
                        System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form_Main));\r
                        this.menuStrip1 = new System.Windows.Forms.MenuStrip();\r
                        this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+                       this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+                       this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r
                        this.exitToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();\r
+                       this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+                       this.copyToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();\r
+                       this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r
+                       this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
                        this.buttonOK = new System.Windows.Forms.Button();\r
                        this.RichLogTextBox = new System.Windows.Forms.RichTextBox();\r
+                       this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);\r
+                       this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+                       this.pasteVToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
+                       this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();\r
                        this.menuStrip1.SuspendLayout();\r
+                       this.contextMenuStrip1.SuspendLayout();\r
                        this.SuspendLayout();\r
                        // \r
                        // menuStrip1\r
                        // \r
                        this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
-            this.exitToolStripMenuItem});\r
+            this.exitToolStripMenuItem,\r
+            this.editToolStripMenuItem});\r
                        resources.ApplyResources(this.menuStrip1, "menuStrip1");\r
                        this.menuStrip1.Name = "menuStrip1";\r
                        // \r
                        // exitToolStripMenuItem\r
                        // \r
                        this.exitToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+            this.saveAsToolStripMenuItem,\r
+            this.toolStripSeparator1,\r
             this.exitToolStripMenuItem1});\r
                        this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";\r
                        resources.ApplyResources(this.exitToolStripMenuItem, "exitToolStripMenuItem");\r
                        // \r
+                       // saveAsToolStripMenuItem\r
+                       // \r
+                       this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";\r
+                       resources.ApplyResources(this.saveAsToolStripMenuItem, "saveAsToolStripMenuItem");\r
+                       this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);\r
+                       // \r
+                       // toolStripSeparator1\r
+                       // \r
+                       this.toolStripSeparator1.Name = "toolStripSeparator1";\r
+                       resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");\r
+                       // \r
                        // exitToolStripMenuItem1\r
                        // \r
                        this.exitToolStripMenuItem1.Name = "exitToolStripMenuItem1";\r
                        resources.ApplyResources(this.exitToolStripMenuItem1, "exitToolStripMenuItem1");\r
                        this.exitToolStripMenuItem1.Click += new System.EventHandler(this.exitToolStripMenuItem1_Click);\r
                        // \r
+                       // editToolStripMenuItem\r
+                       // \r
+                       this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+            this.copyToolStripMenuItem1,\r
+            this.toolStripSeparator2,\r
+            this.selectAllToolStripMenuItem});\r
+                       this.editToolStripMenuItem.Name = "editToolStripMenuItem";\r
+                       resources.ApplyResources(this.editToolStripMenuItem, "editToolStripMenuItem");\r
+                       // \r
+                       // copyToolStripMenuItem1\r
+                       // \r
+                       this.copyToolStripMenuItem1.Name = "copyToolStripMenuItem1";\r
+                       resources.ApplyResources(this.copyToolStripMenuItem1, "copyToolStripMenuItem1");\r
+                       this.copyToolStripMenuItem1.Click += new System.EventHandler(this.copyToolStripMenuItem1_Click);\r
+                       // \r
+                       // toolStripSeparator2\r
+                       // \r
+                       this.toolStripSeparator2.Name = "toolStripSeparator2";\r
+                       resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2");\r
+                       // \r
+                       // selectAllToolStripMenuItem\r
+                       // \r
+                       this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem";\r
+                       resources.ApplyResources(this.selectAllToolStripMenuItem, "selectAllToolStripMenuItem");\r
+                       this.selectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click);\r
+                       // \r
                        // buttonOK\r
                        // \r
                        resources.ApplyResources(this.buttonOK, "buttonOK");\r
                        this.buttonOK.Name = "buttonOK";\r
                        this.buttonOK.UseVisualStyleBackColor = true;\r
-                       this.buttonOK.Click += new System.EventHandler(this.button1_Click);\r
+                       this.buttonOK.Click += new System.EventHandler(this.button_OK_Click);\r
                        // \r
                        // RichLogTextBox\r
                        // \r
                        resources.ApplyResources(this.RichLogTextBox, "RichLogTextBox");\r
+                       this.RichLogTextBox.ContextMenuStrip = this.contextMenuStrip1;\r
+                       this.RichLogTextBox.HideSelection = false;\r
                        this.RichLogTextBox.Name = "RichLogTextBox";\r
                        // \r
+                       // contextMenuStrip1\r
+                       // \r
+                       this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+            this.copyToolStripMenuItem,\r
+            this.pasteVToolStripMenuItem});\r
+                       this.contextMenuStrip1.Name = "contextMenuStrip1";\r
+                       resources.ApplyResources(this.contextMenuStrip1, "contextMenuStrip1");\r
+                       // \r
+                       // copyToolStripMenuItem\r
+                       // \r
+                       this.copyToolStripMenuItem.Name = "copyToolStripMenuItem";\r
+                       resources.ApplyResources(this.copyToolStripMenuItem, "copyToolStripMenuItem");\r
+                       this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click);\r
+                       // \r
+                       // pasteVToolStripMenuItem\r
+                       // \r
+                       this.pasteVToolStripMenuItem.Name = "pasteVToolStripMenuItem";\r
+                       resources.ApplyResources(this.pasteVToolStripMenuItem, "pasteVToolStripMenuItem");\r
+                       this.pasteVToolStripMenuItem.Click += new System.EventHandler(this.pasteVToolStripMenuItem_Click);\r
+                       // \r
+                       // saveFileDialog1\r
+                       // \r
+                       resources.ApplyResources(this.saveFileDialog1, "saveFileDialog1");\r
+                       this.saveFileDialog1.RestoreDirectory = true;\r
+                       this.saveFileDialog1.SupportMultiDottedExtensions = true;\r
+                       // \r
                        // Form_Main\r
                        // \r
                        resources.ApplyResources(this, "$this");\r
                        this.Shown += new System.EventHandler(this.Form_Main_Shown);\r
                        this.menuStrip1.ResumeLayout(false);\r
                        this.menuStrip1.PerformLayout();\r
+                       this.contextMenuStrip1.ResumeLayout(false);\r
                        this.ResumeLayout(false);\r
                        this.PerformLayout();\r
 \r
                private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem1;\r
                private System.Windows.Forms.Button buttonOK;\r
                private System.Windows.Forms.RichTextBox RichLogTextBox;\r
+               private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;\r
+               private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r
+               private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;\r
+               private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem1;\r
+               private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r
+               private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem;\r
+               private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;\r
+               private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;\r
+               private System.Windows.Forms.ToolStripMenuItem pasteVToolStripMenuItem;\r
+               private System.Windows.Forms.SaveFileDialog saveFileDialog1;\r
        }\r
 }\r
 \r
index 85ee3c2..58a83fe 100644 (file)
@@ -7,6 +7,7 @@ using System.Text;
 using System.Windows.Forms;\r
 using System.Diagnostics;\r
 using System.Threading;\r
+using System.IO;\r
 \r
 namespace MidiInChecker2\r
 {\r
@@ -15,30 +16,41 @@ namespace MidiInChecker2
                CInputManager InputManager;\r
                System.Threading.Timer timer;\r
                object lockobj = new object();\r
-               int looptimes = 11;\r
+               int looptimes = 16;\r
+               bool bYAMAHA_way_note = false;\r
 \r
                private void Form_Main_Shown(object sender, EventArgs e)\r
                {\r
-                       #region [ タイトルバーの設定 ]\r
+                       #region [ Title bar configuration (append version info) ]\r
                        System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();\r
                        int ver_asm_major = asm.GetName().Version.Major;\r
                        this.Text = "MidiInChecker2 Rel" + ver_asm_major.ToString("D3");\r
                        #endregion\r
+                       RichLogTextBox.LanguageOption = RichTextBoxLanguageOptions.UIFonts;\r
                }\r
 \r
+               /// <summary>\r
+               /// Initializations\r
+               /// </summary>\r
                public Form_Main()\r
                {\r
                        InitializeComponent();\r
                        InputManager = new CInputManager();\r
 \r
-                       RichLogTextBox.AppendText( "Number of MIDI devices: " + InputManager.nInputMidiDevices + "\r\n" );\r
+                       RichLogTextBox.AppendText( "Number of MIDI devices: " + InputManager.nInputMidiDevices + System.Environment.NewLine );\r
                        foreach ( string s in InputManager.listStrMidiDevices )\r
                        {\r
-                               RichLogTextBox.AppendText( s + "\r\n" );\r
+                               RichLogTextBox.AppendText( s + System.Environment.NewLine );\r
                        }\r
-                       RichLogTextBox.AppendText( "\r\nHit any MIDI Pad to show the signal info.\r\n\r\n\n" );\r
+                       RichLogTextBox.AppendText(\r
+                               System.Environment.NewLine +\r
+                               "Hit any MIDI Pad to show the signal info." +\r
+                               System.Environment.NewLine +\r
+                               System.Environment.NewLine +\r
+                               System.Environment.NewLine\r
+                       );\r
 \r
-                       #region [タイマーで0.1秒ごとにログ画面を更新するように初期化する]\r
+                       #region [ Set callback to update log area (richtextbox) every 0.1sec ]\r
                        TimerCallback timerDelegate = new TimerCallback(mainloop);\r
                        timer = new System.Threading.Timer(timerDelegate, null , 0, 100);\r
                        #endregion\r
@@ -52,11 +64,12 @@ namespace MidiInChecker2
                                InputManager.tポーリング( true, true );\r
                                List<STInputEvent> list = new List<STInputEvent>();\r
 \r
-                               // すべての入力デバイスについて…\r
+                               // For all MIDI input devices...\r
                                foreach ( IInputDevice device in InputManager.list入力デバイス )\r
                                {\r
                                        if ( ( device.list入力イベント != null ) && ( device.list入力イベント.Count != 0 ) && ( device.e入力デバイス種別 == E入力デバイス種別.MidiIn ) )\r
                                        {\r
+                                               // if MIDI-input exists, invoke all of them, then push them to the RichTextBox\r
                                                foreach ( STInputEvent ev in device.list入力イベント )\r
                                                {\r
                                                        Invoke( new AppendTextDelegate( appendLogText ), device.ID, ev);\r
@@ -64,7 +77,7 @@ namespace MidiInChecker2
                                                }\r
                                        }\r
                                }\r
-                               if (looptimes++ == 10)  // 10回ループ(1秒間)の間に入力がなければ、空行を挿入する。\r
+                               if (looptimes++ == 15)  // Insert horizontal rule if no inputs in 15times-loop (1.5sec)\r
                                {\r
                                        Invoke(new AppendTextDelegate( appendLogText ), -1, new STInputEvent() );\r
                                }\r
@@ -76,7 +89,7 @@ namespace MidiInChecker2
                {\r
                        string text;\r
 \r
-                       if (id == -1)\r
+                       if (id == -1)   // Insert Horizontal Rule\r
                        {\r
                                RichLogTextBox.SelectionColor = Color.Black;    // reset color\r
                                text = "------------------------------------------------------------\r\n";\r
@@ -84,28 +97,89 @@ namespace MidiInChecker2
                        else\r
                        {\r
                                int nMIDIevent = ev.nKey & 0xFF;\r
-                               int nNote = (ev.nKey >> 8) & 0xFF;    // note#\r
-                                                                                                         // int nVelo = ( ev.nKey >> 16 ) & 0xFF;      // velocity\r
+                               int nNote = (ev.nKey >> 8) & 0xFF;\r
+                               string[] strNote =\r
+                               {\r
+                                       "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"\r
+                               };\r
+\r
+                               #region [ At first, put time, and MIDI event info ]\r
+                               text = string.Format(\r
+                                       "{0}: Device={1}, MidiEvent=0x{2}",\r
+                                       new DateTime(ev.nTimeStamp).ToString("HH:mm:ss.fff"),\r
+                                       id,\r
+                                       nMIDIevent.ToString("X2")\r
+                               );\r
+                               #endregion\r
+                               #region [ Then, Append MIDI event detail descriptions ]\r
+                               switch (nMIDIevent & 0xF0)\r
+                               {\r
+                                       case 0x80:      // Note off\r
+                                       case 0x90:      // Note off/on\r
+                                               text += string.Format(\r
+                                                       ", Note#=0x{0} (Key={1}{2}) {3}, Velocity={4}",\r
+                                                       nNote.ToString("X2"),\r
+                                                       strNote[nNote % 12],\r
+                                                       (nNote / 12) - 1 - (bYAMAHA_way_note ? 1 : 0),\r
+                                                       ((nMIDIevent & 0xF0) == 0x80 || ev.nVelocity == 0x00) ? "Off" : "On ",\r
+                                                       ev.nVelocity.ToString("D3")\r
+                                               );\r
+                                               break;\r
+\r
+                                       case 0xA0:  // Polyphonic Key Pressure\r
+                                               text += string.Format(\r
+                                                       ", Note#=0x{0} (Key={1}{2}), PolyphonicKeyPresssure={3}",\r
+                                                       nNote.ToString("X2"),\r
+                                                       strNote[nNote % 12],\r
+                                                       (nNote / 12) - 1 - (bYAMAHA_way_note ? 1 : 0),\r
+                                                       ev.nVelocity.ToString("D3")\r
+                                               );\r
+                                               break;\r
+\r
+                                       case 0xB0:  // Control Change\r
+                                               text += strCtrlChangeText(nNote, ev.nVelocity);\r
+                                               break;\r
 \r
-                               DateTime dt = new DateTime(ev.nTimeStamp);\r
+                                       case 0xC0:  // Program Change\r
+                                               text += string.Format(\r
+                                                       ", ChangeProgram to {0}",\r
+                                                       nNote.ToString("X2")\r
+                                               );\r
+                                               break;\r
 \r
-                               text = dt.ToString("hh:mm:ss.fff") +\r
-                                               ": Device=" + id +\r
-                                               ", MidiEvent=0x" + nMIDIevent.ToString("X2") +\r
-                                               ", Note#=0x" + nNote.ToString("X2") +\r
-                                               ", Velocity=" + ev.nVelocity.ToString("D3") +\r
-                                               "\r\n";\r
+                                       case 0xD0:  // Channel Pressure\r
+                                               text += string.Format(\r
+                                                       ", ChannelPresssure={0}",\r
+                                                       nNote\r
+                                               );\r
+                                               break;\r
 \r
+                                       case 0xE0:  // Pitch Wheel Change\r
+                                               text += string.Format(\r
+                                                       ", PitchWheelChange to {0}",\r
+                                                       ((nNote + (ev.nVelocity * 128)) - 8192)\r
+                                               );\r
+                                               break;\r
+\r
+                                       case 0xF0:  // System Common Message\r
+                                               text += string.Format(\r
+                                                       ", SystemCommonMessage {0}",\r
+                                                       nNote.ToString("X2")\r
+                                               );\r
+                                               break;\r
+                               }\r
+                               #endregion\r
+                               #region [ Configure text color ]\r
                                Color[] cMidiEvent =\r
                                {\r
-                                       Color.Gray,                     // 0x8x Note Off\r
-                                       Color.Black,            // 0x9x Note On\r
-                                       Color.Black,            // 0xAx\r
-                                       Color.Green,            // 0xBx Control change\r
-                                       Color.Black,            // 0xCx\r
-                                       Color.Black,            // 0xDx\r
-                                       Color.Blue,                     // 0xEx Pitch bend\r
-                                       Color.Black,        // 0xFx\r
+                                       Color.Gray,                     // 0x8x: Note Off\r
+                                       Color.Black,            // 0x9x: Note On\r
+                                       Color.Black,            // 0xAx: Poliphonic Key Pressure\r
+                                       Color.Green,            // 0xBx: Control change / Channel Mode Message\r
+                                       Color.Black,            // 0xCx: Program Change\r
+                                       Color.Black,            // 0xDx: Channel Pressure\r
+                                       Color.Blue,                     // 0xEx: Pitch Wheel Change\r
+                                       Color.Purple,       // 0xFx: System Common Message\r
                                };\r
                                Color c = cMidiEvent[(nMIDIevent >> 4) - 8];\r
                                if ( (nMIDIevent & 0xF0) == 0x90 && (ev.nVelocity == 0) )\r
@@ -113,13 +187,14 @@ namespace MidiInChecker2
                                        c = cMidiEvent[0];      // Note off color\r
                                }\r
                                RichLogTextBox.SelectionColor = c;\r
+                               #endregion\r
                        }\r
                        RichLogTextBox.Focus();\r
-                       RichLogTextBox.AppendText( text );\r
+                       RichLogTextBox.AppendText( text + System.Environment.NewLine );\r
                        RichLogTextBox.SelectionColor = Color.Black;    // reset color\r
                }\r
 \r
-               // ダサい。後日改善予定。\r
+               // Need improvement...\r
                private void Form_Main_FormClosing( object sender, FormClosingEventArgs e )\r
                {\r
                        // mainloop処理中なら、待つ\r
@@ -134,7 +209,7 @@ namespace MidiInChecker2
                        InputManager = null;\r
                }\r
 \r
-               private void button1_Click( object sender, EventArgs e )\r
+               private void button_OK_Click( object sender, EventArgs e )\r
                {\r
                        Application.Exit();\r
                }\r
@@ -145,16 +220,208 @@ namespace MidiInChecker2
                }\r
 \r
                /// <summary>\r
-               /// textboxで、Ctrl-Aでの全選択ができるようにする\r
+               /// [Ctrl-A] => SelectAll\r
                /// </summary>\r
                /// <param name="sender"></param>\r
                /// <param name="e"></param>\r
-               private void LogTextBox_KeyDown( object sender, KeyEventArgs e )\r
+               private void RichLogTextBox_KeyDown( object sender, KeyEventArgs e )\r
                {\r
                        if ( e.KeyCode == System.Windows.Forms.Keys.A & e.Control == true )\r
                        {\r
                                RichLogTextBox.SelectAll();\r
                        } \r
                }\r
+\r
+               /// <summary>\r
+               /// Output logs about control change\r
+               /// </summary>\r
+               /// <param name="ctrl"></param>\r
+               /// <param name="data"></param>\r
+               /// <returns></returns>\r
+               private string strCtrlChangeText(int ctrl, int data)\r
+               {\r
+                       #region [ Control Change Number => strings ]\r
+                       string[] strCtrlChgName =\r
+                       {\r
+                       "BankSelect<MSB>",                                      // 0x00\r
+                       "Modulation",\r
+                       "BreathController",\r
+                       "",\r
+                       "FootController",\r
+                       "PortamentTime",\r
+                       "DataEntry",\r
+                       "ChannelVolume",\r
+                       "Balance",                                                      // 0x08\r
+                       "",\r
+                       "Pan",\r
+                       "Expression",\r
+                       "EffectControl1",\r
+                       "EffectControl2",\r
+                       "",\r
+                       "",\r
+                       "GeneralPurposeControler1",                     // 0x10\r
+                       "GeneralPurposeControler2",                     // 0x11\r
+                       "GeneralPurposeControler3",                     // 0x12\r
+                       "GeneralPurposeControler4",                     // 0x13\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "BankSelect<LSB>",                                      // 0x20\r
+                       "Modulation<LSB>",\r
+                       "BreathContoller<LSB>",\r
+                       "",\r
+                       "FootController<LSB>",\r
+                       "PortamentTime<LSB>",\r
+                       "DataEntry<LSB>",\r
+                       "ChannelVOlume<LSB>",\r
+                       "Balance<LSB>",\r
+                       "",\r
+                       "Expression<LSB>",\r
+                       "Pan<LSB>",\r
+                       "Expression<LSB>",\r
+                       "EffectControl1<LSB>",\r
+                       "EffectControl1<LSB>",\r
+                       "",\r
+                       "",\r
+                       "GeneralPurposeContoller1<LSB>",        // 0x30\r
+                       "GeneralPurposeContoller2<LSB>",        // 0x31\r
+                       "GeneralPurposeContoller3<LSB>",        // 0x32\r
+                       "GeneralPurposeContoller4<LSB>",        // 0x34\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "Hold1",                                                        // 0x40\r
+                       "Portament",\r
+                       "Sostenuto",\r
+                       "SoftPedal",\r
+                       "LegatoFootswitch",\r
+                       "Hold2",\r
+                       "SoundVariation",\r
+                       "Timbre/HarmonicIntensity",\r
+                       "ReleaseTime",\r
+                       "AttackTime",\r
+                       "Brightness",\r
+                       "DecayTime",\r
+                       "VibratoTime",\r
+                       "VibratoDepth",\r
+                       "VibratoDelay",\r
+                       "",\r
+                       "GeneralPurposeController5",            // 0x50\r
+                       "GeneralPurposeController6",            // 0x51\r
+                       "GeneralPurposeController7",            // 0x52\r
+                       "GeneralPurposeController8",            // 0x53\r
+                       "PortamentContol",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "Effect1Depth(ReverbSendLevel)",\r
+                       "Effect2Depth(TremoloDepth)",\r
+                       "Effect3Depth(ChorusSendLevel)",\r
+                       "Effect4Depth(CelesteDepth)",\r
+                       "Effect5Depth(PhaserDepth)",\r
+                       "DataIncrement",                                        // 0x60\r
+                       "DataDecrement",\r
+                       "NRPN(LSB)",\r
+                       "NRPN(MSB)",\r
+                       "RPN(LSB)",\r
+                       "RPN(MSB",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",                                                                     // 0x70\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "",\r
+                       "AllSoundOff",                                          // 0x78\r
+                       "ResetAllControllers",\r
+                       "LocalControl",\r
+                       "AllNoteOff",\r
+                       "OmniOff",\r
+                       "OmniOn",\r
+                       "Mono",\r
+                       "Poly",                                                                 // 0x7F\r
+               };\r
+                       #endregion\r
+\r
+                       string ret = string.Format(\r
+                               ", CtrlChgNo=0x{0} ({1}), data={2}",\r
+                               ctrl.ToString("D2"),\r
+                               strCtrlChgName[ctrl],\r
+                               data\r
+                       );\r
+                       \r
+                       return ret;\r
+               }\r
+\r
+               /// <summary>\r
+               /// Save Logs to the file (txt / rtf)\r
+               /// </summary>\r
+               /// <param name="sender"></param>\r
+               /// <param name="e"></param>\r
+               private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)\r
+               {\r
+                       if (saveFileDialog1.ShowDialog() == DialogResult.OK)\r
+                       {\r
+                               string filename = saveFileDialog1.FileName;\r
+                               bool bRTF = (Path.GetExtension(filename).ToLower() == ".rtf");\r
+\r
+                               RichLogTextBox.SaveFile(\r
+                                       filename,\r
+                                       bRTF ? RichTextBoxStreamType.RichText : RichTextBoxStreamType.PlainText\r
+                               );\r
+                       }\r
+               }\r
+\r
+               #region [ Copy/SelectAll support ]\r
+               private void copyToolStripMenuItem_Click(object sender, EventArgs e)\r
+               {\r
+                       RichLogTextBox.Copy();\r
+               }\r
+\r
+               private void pasteVToolStripMenuItem_Click(object sender, EventArgs e)\r
+               {\r
+                       RichLogTextBox.SelectAll();\r
+               }\r
+\r
+               private void copyToolStripMenuItem1_Click(object sender, EventArgs e)\r
+               {\r
+                       RichLogTextBox.Copy();\r
+               }\r
+\r
+               private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)\r
+               {\r
+                       RichLogTextBox.SelectAll();\r
+               }\r
+               #endregion\r
        }\r
 }\r
index 6213448..334c034 100644 (file)
     <value>0, 0</value>\r
   </metadata>\r
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
-  <data name="exitToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>37, 20</value>\r
-  </data>\r
-  <data name="exitToolStripMenuItem.Text" xml:space="preserve">\r
-    <value>&amp;File</value>\r
-  </data>\r
   <data name="menuStrip1.Location" type="System.Drawing.Point, System.Drawing">\r
     <value>0, 0</value>\r
   </data>\r
     <value>$this</value>\r
   </data>\r
   <data name="&gt;&gt;menuStrip1.ZOrder" xml:space="preserve">\r
-    <value>2</value>\r
+    <value>3</value>\r
+  </data>\r
+  <data name="exitToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>37, 20</value>\r
+  </data>\r
+  <data name="exitToolStripMenuItem.Text" xml:space="preserve">\r
+    <value>&amp;File</value>\r
+  </data>\r
+  <data name="saveAsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>123, 22</value>\r
+  </data>\r
+  <data name="saveAsToolStripMenuItem.Text" xml:space="preserve">\r
+    <value>Save &amp;As...</value>\r
+  </data>\r
+  <data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>120, 6</value>\r
   </data>\r
   <data name="exitToolStripMenuItem1.Size" type="System.Drawing.Size, System.Drawing">\r
-    <value>152, 22</value>\r
+    <value>123, 22</value>\r
   </data>\r
   <data name="exitToolStripMenuItem1.Text" xml:space="preserve">\r
     <value>E&amp;xit</value>\r
   </data>\r
+  <data name="editToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>39, 20</value>\r
+  </data>\r
+  <data name="editToolStripMenuItem.Text" xml:space="preserve">\r
+    <value>&amp;Edit</value>\r
+  </data>\r
+  <data name="copyToolStripMenuItem1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>152, 22</value>\r
+  </data>\r
+  <data name="copyToolStripMenuItem1.Text" xml:space="preserve">\r
+    <value>&amp;Copy</value>\r
+  </data>\r
+  <data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>119, 6</value>\r
+  </data>\r
+  <data name="selectAllToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>152, 22</value>\r
+  </data>\r
+  <data name="selectAllToolStripMenuItem.Text" xml:space="preserve">\r
+    <value>Select &amp;All</value>\r
+  </data>\r
   <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
   <data name="buttonOK.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
     <value>Bottom, Right</value>\r
     <value>3</value>\r
   </data>\r
   <data name="buttonOK.Text" xml:space="preserve">\r
-    <value>OK</value>\r
+    <value>Exit</value>\r
   </data>\r
   <data name="&gt;&gt;buttonOK.Name" xml:space="preserve">\r
     <value>buttonOK</value>\r
     <value>$this</value>\r
   </data>\r
   <data name="&gt;&gt;buttonOK.ZOrder" xml:space="preserve">\r
-    <value>1</value>\r
+    <value>2</value>\r
   </data>\r
   <data name="RichLogTextBox.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
     <value>Top, Bottom, Left, Right</value>\r
   </data>\r
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>115, 0</value>\r
+  </metadata>\r
+  <data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>123, 48</value>\r
+  </data>\r
+  <data name="&gt;&gt;contextMenuStrip1.Name" xml:space="preserve">\r
+    <value>contextMenuStrip1</value>\r
+  </data>\r
+  <data name="&gt;&gt;contextMenuStrip1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
   <data name="RichLogTextBox.Location" type="System.Drawing.Point, System.Drawing">\r
     <value>0, 27</value>\r
   </data>\r
     <value>$this</value>\r
   </data>\r
   <data name="&gt;&gt;RichLogTextBox.ZOrder" xml:space="preserve">\r
-    <value>0</value>\r
+    <value>1</value>\r
+  </data>\r
+  <data name="copyToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>152, 22</value>\r
+  </data>\r
+  <data name="copyToolStripMenuItem.Text" xml:space="preserve">\r
+    <value>&amp;Copy</value>\r
+  </data>\r
+  <data name="pasteVToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>152, 22</value>\r
+  </data>\r
+  <data name="pasteVToolStripMenuItem.Text" xml:space="preserve">\r
+    <value>Select &amp;All</value>\r
+  </data>\r
+  <metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>270, 0</value>\r
+  </metadata>\r
+  <data name="saveFileDialog1.Filter" xml:space="preserve">\r
+    <value>Text file (*.txt) | *.txt | Rich text file (*.rtf) | *.rtf | All files (*.*) | *.*</value>\r
   </data>\r
   <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
     <value>True</value>\r
   <data name="&gt;&gt;exitToolStripMenuItem.Type" xml:space="preserve">\r
     <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
   </data>\r
+  <data name="&gt;&gt;saveAsToolStripMenuItem.Name" xml:space="preserve">\r
+    <value>saveAsToolStripMenuItem</value>\r
+  </data>\r
+  <data name="&gt;&gt;saveAsToolStripMenuItem.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;toolStripSeparator1.Name" xml:space="preserve">\r
+    <value>toolStripSeparator1</value>\r
+  </data>\r
+  <data name="&gt;&gt;toolStripSeparator1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
   <data name="&gt;&gt;exitToolStripMenuItem1.Name" xml:space="preserve">\r
     <value>exitToolStripMenuItem1</value>\r
   </data>\r
   <data name="&gt;&gt;exitToolStripMenuItem1.Type" xml:space="preserve">\r
     <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
   </data>\r
+  <data name="&gt;&gt;editToolStripMenuItem.Name" xml:space="preserve">\r
+    <value>editToolStripMenuItem</value>\r
+  </data>\r
+  <data name="&gt;&gt;editToolStripMenuItem.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;copyToolStripMenuItem1.Name" xml:space="preserve">\r
+    <value>copyToolStripMenuItem1</value>\r
+  </data>\r
+  <data name="&gt;&gt;copyToolStripMenuItem1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;toolStripSeparator2.Name" xml:space="preserve">\r
+    <value>toolStripSeparator2</value>\r
+  </data>\r
+  <data name="&gt;&gt;toolStripSeparator2.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;selectAllToolStripMenuItem.Name" xml:space="preserve">\r
+    <value>selectAllToolStripMenuItem</value>\r
+  </data>\r
+  <data name="&gt;&gt;selectAllToolStripMenuItem.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;copyToolStripMenuItem.Name" xml:space="preserve">\r
+    <value>copyToolStripMenuItem</value>\r
+  </data>\r
+  <data name="&gt;&gt;copyToolStripMenuItem.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;pasteVToolStripMenuItem.Name" xml:space="preserve">\r
+    <value>pasteVToolStripMenuItem</value>\r
+  </data>\r
+  <data name="&gt;&gt;pasteVToolStripMenuItem.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;saveFileDialog1.Name" xml:space="preserve">\r
+    <value>saveFileDialog1</value>\r
+  </data>\r
+  <data name="&gt;&gt;saveFileDialog1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
   <data name="&gt;&gt;$this.Name" xml:space="preserve">\r
     <value>Form_Main</value>\r
   </data>\r