OSDN Git Service

#30333 MIDI読み込み設定のxmlファイル読み込み時にエラーが発生した場合は、設定のxmlを新規に作り直すよう修正。
[dtxmania/dtxmania.git] / DTXCreatorプロジェクト / コード / 07.MIDIインポート / CMIDIインポートダイアログ.cs
index 20ef1b4..d0d5eff 100644 (file)
@@ -7,6 +7,8 @@ using System.ComponentModel;
 using System.IO;\r
 using System.Drawing;\r
 using System.Diagnostics;\r
+using System.Xml;\r
+using System.Runtime.Serialization;\r
 using DTXCreator.譜面;\r
 using DTXCreator.WAV_BMP_AVI;\r
 using DTXCreator.Properties;\r
@@ -41,27 +43,37 @@ namespace DTXCreator.MIDIインポート
 \r
         private void buttonOpen_Click(object sender, EventArgs e)\r
         {\r
-            this.tMIDIファイルを選択する();\r
+            tMIDIファイルを選択する();\r
         }\r
+\r
+               private void buttonOpenSettings_Click(object sender, EventArgs e)\r
+               {\r
+                       tMIDIインポート設定ファイル選択ダイアログを開く();\r
+               }\r
+\r
+               private void buttonSaveSettings_Click(object sender, EventArgs e)\r
+               {\r
+                       tMIDIインポート設定ファイル保存ダイアログを開く();\r
+               }\r
         \r
         // レーン名をワンクリックで開く用\r
         private void dgv割り当て一覧_CellEnter( object sender, DataGridViewCellEventArgs e )\r
         {\r
             DataGridView dgv割り当て一覧 = (DataGridView) sender;\r
 \r
-            if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "DTX_Lane" && dgv割り当て一覧.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn )\r
+            if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "Assign_DTX_Lane" && dgv割り当て一覧.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn )\r
                 SendKeys.Send("{F4}");\r
         }\r
 \r
-               // レーン名を変更したら\r
+               // 割り当て一覧が更新された時の処理\r
         private void dgv割り当て一覧_CellEndEdit( object sender, DataGridViewCellEventArgs e )\r
         {\r
             DataGridView dgv割り当て一覧 = (DataGridView) sender;\r
 \r
-            if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "DTX_Lane" )\r
+            if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "Assign_DTX_Lane" )\r
                 tMIDI割り当て一覧のレーン名の背景色を変更する( e.RowIndex );\r
                        \r
-            if ( cMIDI != null ) tMIDIチップをレーンに割り当てる();\r
+            tMIDIチップをレーンに割り当てる();\r
 \r
         }\r
 \r
@@ -120,14 +132,14 @@ namespace DTXCreator.MIDIインポート
                        {\r
                                if (vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.NoteOnOff)\r
                                {\r
-                                       if ((bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells["ChLoad"].Value)\r
+                                       if ((bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells[ "Channel_Load" ].Value)\r
                                        {\r
                                                cMIDI.nドラムチャンネルのキー毎のノート数[vMIDIイベント.nキー] ++;\r
-                                       }\r
                                }\r
                        }\r
+                       }\r
             for ( int i = 0 ; i < 128 ; i++ )\r
-                this.dgv割り当て一覧.Rows[127-i].Cells["Notes"].Value = cMIDI.nドラムチャンネルのキー毎のノート数[i];\r
+                this.dgv割り当て一覧.Rows[127-i].Cells[ "Assign_Notes" ].Value = cMIDI.nドラムチャンネルのキー毎のノート数[i];\r
 \r
                        t同時刻で同じレーンに配置予定のチップを数えて反映する();\r
 \r
@@ -136,10 +148,10 @@ namespace DTXCreator.MIDIインポート
         public void tMIDI割り当て一覧を作成する()\r
         {\r
             // レーン一覧を作成\r
-            this.DTX_Lane.Items.AddRange( "* Disuse *" );\r
+            this.Assign_DTX_Lane.Items.AddRange( "* Disuse *" );\r
             foreach ( Cレーン cレーン in this.formメインフォーム.mgr譜面管理者.listレーン )\r
             {\r
-                               if ( cレーン.eレーン種別 == Cレーン.E種別.WAV ) this.DTX_Lane.Items.AddRange( cレーン.strレーン名 );\r
+                               if ( cレーン.eレーン種別 == Cレーン.E種別.WAV ) this.Assign_DTX_Lane.Items.AddRange( cレーン.strレーン名 );\r
             }\r
             \r
             // MIDIキー一覧を作成\r
@@ -197,33 +209,32 @@ namespace DTXCreator.MIDIインポート
                     case 78 : str楽器名 = "Mute Cuica"; break;\r
                     case 79 : str楽器名 = "Open Cuica"; break;\r
                     case 80 : str楽器名 = "Mute Triangle"; break;\r
-                    case 81 : str楽器名 = "Open Triangle"; break;\r
-                }\r
+                    case 81 : str楽器名 = "Open Triangle"; break;                }\r
                 this.dgv割り当て一覧.Rows.Add( i, strキー名[i%12], strレーン名, b裏チャンネル, 0, str楽器名 );\r
 \r
                                // 黒鍵に色付け\r
-                if ( i%12 == 1 || i%12 == 3 || i%12 == 6 || i%12 == 8 || i%12 == 10 ) this.dgv割り当て一覧.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 240, 248, 255 );\r
+                if ( i%12 == 1 || i%12 == 3 || i%12 == 6 || i%12 == 8 || i%12 == 10 )\r
+                                       this.dgv割り当て一覧.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 240, 248, 255 );\r
                                // C(ド)に色付け\r
                 if ( i%12 == 0 ) this.dgv割り当て一覧.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 255, 224, 224 );\r
 \r
                 tMIDI割り当て一覧のレーン名の背景色を変更する( 127-i );\r
 \r
             }\r
-            this.dgv割り当て一覧.Columns["MIDI_Key"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
-            this.dgv割り当て一覧.Columns["DTX_Lane"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
-            this.dgv割り当て一覧.Columns["DTX_Lane"].DefaultCellStyle.Font = new Font( "meiryo", 8f, FontStyle.Bold );\r
+            this.dgv割り当て一覧.Columns[ "Assign_MIDI_Key" ].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
+            this.dgv割り当て一覧.Columns[ "Assign_DTX_Lane" ].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
+            this.dgv割り当て一覧.Columns[ "Assign_DTX_Lane" ].DefaultCellStyle.Font = new Font( "meiryo", 8f, FontStyle.Bold );\r
             this.dgv割り当て一覧.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
 \r
-            this.dgv割り当て一覧.FirstDisplayedScrollingRowIndex = 81;//key35=LBDが表示される位置\r
-\r
+            this.dgv割り当て一覧.FirstDisplayedScrollingRowIndex = 82;//key35=LBDが表示される位置\r
         }\r
 \r
         public void tMIDIチャンネル一覧を作成する()\r
         {\r
-                       for (int i = 1; i <= 16; i++)\r
+                       for (int i = 0; i < 16; i++)\r
                        {\r
-                               this.dgvチャンネル一覧.Rows.Add( i, 0, (i==10) );\r
-                               this.dgvチャンネル一覧.Rows[i-1].DefaultCellStyle.BackColor = (i==10) ? Color.FromArgb( 255, 224, 224 ) : Color.FromArgb( 255, 255, 255 );\r
+                               this.dgvチャンネル一覧.Rows.Add( i+1, 0, (i+1==10) );\r
+                               this.dgvチャンネル一覧.Rows[i].DefaultCellStyle.BackColor = (i+1==10) ? Color.FromArgb( 255, 224, 224 ) : Color.FromArgb( 255, 255, 255 );\r
                        }\r
                        //      dgvチャンネル一覧変更イベント復旧();     //ここでイベントを復旧してはいけない\r
                                                                                                                //(直後にファイルを開く動作+解析動作が発生するのでそこで)\r
@@ -325,24 +336,24 @@ namespace DTXCreator.MIDIインポート
             }\r
             \r
             this.textBox1.Text = str文字列;\r
+\r
+                       //-----------------\r
+            #endregion\r
                        \r
             // 各チャンネルのノート数をチャンネル一覧に出力する\r
                        dgvチャンネル一覧変更イベント抑止();\r
                        for ( int i = 0; i < 16; i++ )\r
                        {\r
-                               this.dgvチャンネル一覧.Rows[i].Cells["ChNotes"].Value = cMIDI.nチャンネル0to15毎のノート数[i];\r
-                               this.dgvチャンネル一覧.Rows[i].Cells["ChLoad"].Value  = cMIDI.bドラムチャンネルと思われる[i];\r
+                               this.dgvチャンネル一覧.Rows[i].Cells[ "Channel_Notes" ].Value = cMIDI.nチャンネル0to15毎のノート数[i];\r
+                               this.dgvチャンネル一覧.Rows[i].Cells[ "Channel_Load" ].Value  = cMIDI.bドラムチャンネルと思われる[i];\r
                        }\r
                        dgvチャンネル一覧変更イベント復旧();\r
 \r
             // 各キーのノート数を割り当て一覧に出力する\r
                        t読み込むチャンネルを取得してキー毎のノート数を計算する();\r
 \r
-                       // è¨­å®\9aã\81«å¿\9cã\81\98ã\81¦å\87¦ç\90\86ã\81\99ã\82\8b\r
+                       // èª­ã\81¿è¾¼ã\82\80ã\83\81ã\83£ã\83³ã\83\8dã\83«ã\81\8c確å®\9aã\81\97ã\81\9fã\82\89ã\80\81å\89²ã\82\8aå½\93ã\81¦ä¸\80覧ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fæ\99\82ã\81®å\87¦ç\90\86\r
                        tMIDIチップをレーンに割り当てる();\r
-\r
-                       //-----------------\r
-            #endregion\r
         }\r
                \r
                /// <summary>\r
@@ -350,19 +361,19 @@ namespace DTXCreator.MIDIインポート
                /// </summary>\r
         private void tMIDI割り当て一覧のレーン名の背景色を変更する( int RowIndex )\r
         {\r
-                       string strレーン名 = (string)this.dgv割り当て一覧.Rows[RowIndex].Cells["DTX_Lane"].Value;\r
+                       string strレーン名 = (string)this.dgv割り当て一覧.Rows[RowIndex].Cells[ "Assign_DTX_Lane" ].Value;\r
             int nレーン番号 = this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( strレーン名 );\r
 \r
             if ( nレーン番号 >= this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "LC" ) )\r
             {\r
                 Color color = this.formメインフォーム.mgr譜面管理者.listレーン[nレーン番号].col背景色;\r
                 color = Color.FromArgb( color.R/2+128, color.G/2+128, color.B/2+128 );\r
-                this.dgv割り当て一覧.Rows[RowIndex].Cells["DTX_Lane"].Style.BackColor = color;\r
+                this.dgv割り当て一覧.Rows[RowIndex].Cells[ "Assign_DTX_Lane" ].Style.BackColor = color;\r
             }\r
                        else if ( strレーン名 == "* Disuse *" )\r
                        {\r
                 Color color = Color.FromArgb( 128, 128, 128 );\r
-                this.dgv割り当て一覧.Rows[RowIndex].Cells["DTX_Lane"].Style.BackColor = color;\r
+                this.dgv割り当て一覧.Rows[RowIndex].Cells[ "Assign_DTX_Lane" ].Style.BackColor = color;\r
                        }\r
         }\r
 \r
@@ -370,7 +381,6 @@ namespace DTXCreator.MIDIインポート
         {\r
             if ( cMIDI != null && cMIDI.lMIDIイベント.Count > 0 )\r
             {\r
-                               \r
                                #region [ チップリストで、ベロシティをDTX向けに調整する ]\r
                                foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
                                {\r
@@ -482,13 +492,15 @@ namespace DTXCreator.MIDIインポート
                                #region [ LP発生なら、LPレーンを表示する。 ]\r
                                for ( int i = 0; i < this.dgv割り当て一覧.Rows.Count; i++ )\r
                                {\r
-                                       if ( (string)this.dgv割り当て一覧.Rows[ i ].Cells[ "DTX_Lane" ].Value == "LP" &&\r
-                                               (int)this.dgv割り当て一覧.Rows[ i ].Cells[ "Notes" ].Value > 0 )\r
+                                       if ( (string)this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_DTX_Lane" ].Value == "LP" &&\r
+                                               (int)this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_Notes" ].Value > 0 )\r
                                        {\r
                                                this.formメインフォーム.mgr譜面管理者.tExpandLanes( Cレーン.ELaneType.LP );\r
                                        }\r
                                }\r
                                #endregion\r
+\r
+                               tMIDIインポート設定をファイルに保存する();\r
                        }\r
                }\r
                \r
@@ -497,20 +509,22 @@ namespace DTXCreator.MIDIインポート
                /// </summary>\r
         private void tMIDIチップをレーンに割り当てる()\r
         {\r
+                       if ( cMIDI == null ) return;\r
+\r
                        // MIDIイベントがひとつでもあるなら処理する\r
                        if ( cMIDI.lMIDIイベント.Count == 0 ) return;\r
 \r
                        #region [ 振り分け ]\r
                        foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
                        {\r
-                               if (vMIDIイベント.nキー == (int)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["MIDI_Key"].Value )\r
+                               if (vMIDIイベント.nキー == (int)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_MIDI_Key" ].Value )\r
                                {\r
-                                       if ( (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["DTX_Lane"].Value != "* Disuse *" )\r
+                                       if ( (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_DTX_Lane" ].Value != "* Disuse *" )\r
                                        {\r
-                                               vMIDIイベント.nレーン番号 = this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["DTX_Lane"].Value );\r
-                                               vMIDIイベント.strコメント = (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["Comment"].Value;\r
-                                               vMIDIイベント.b裏チャンネル = (bool)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["BackCH"].Value;\r
-                                               vMIDIイベント.b入力 = (bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells["ChLoad"].Value;\r
+                                               vMIDIイベント.nレーン番号 = this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_DTX_Lane" ].Value );\r
+                                               vMIDIイベント.strコメント = (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_Comment" ].Value;\r
+                                               vMIDIイベント.b裏チャンネル = (bool)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_BackCH" ].Value;\r
+                                               vMIDIイベント.b入力 = (bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells[ "Channel_Load" ].Value;\r
                                        }\r
                                        else\r
                                        {\r
@@ -554,7 +568,6 @@ namespace DTXCreator.MIDIインポート
                        #endregion\r
 \r
                        t同時刻で同じレーンに配置予定のチップを数えて反映する();\r
-                       \r
         }\r
 \r
                private void t同時刻で同じレーンに配置予定のチップを数えて反映する()\r
@@ -567,10 +580,10 @@ namespace DTXCreator.MIDIインポート
                                // チャンネル一覧で選択されているものと、ノートのみ数える\r
                                if ( !vMIDIイベント.b入力 || vMIDIイベント.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;\r
 \r
-                               string str = "" + vMIDIイベント.nレーン番号 + ":" + vMIDIイベント.n時間;\r
-                               if ( lMIDIイベント_重複.Contains( str ) ) cMIDI.n重複チップ数 ++;\r
-                               else lMIDIイベント_重複.Add( str );\r
-                       }\r
+                                       string str = "" + vMIDIイベント.nレーン番号 + ":" + vMIDIイベント.n時間;\r
+                                       if ( lMIDIイベント_重複.Contains( str ) ) cMIDI.n重複チップ数 ++;\r
+                                       else lMIDIイベント_重複.Add( str );\r
+                               }\r
 \r
                        this.label重複チップ数.Text = resource.GetString("label重複チップ数.Text") + " : " + cMIDI.n重複チップ数;\r
                }\r
@@ -595,8 +608,8 @@ namespace DTXCreator.MIDIインポート
 \r
                        // 最終拍子イベント以降、曲最後までの小節について、この先のロジックで小節長を変更するために、ダミーで最後に拍子変更のイベントを入れる。\r
 \r
-                       int n最終分子 = 1;\r
-                       int n最終分母 = 1;\r
+                       int n最終分子 = 4;\r
+                       int n最終分母 = 4;\r
                        int n最終時間 = (int)cml[ cml.Count - 1 ].n時間;\r
 \r
                        cml.Reverse();\r
@@ -611,63 +624,11 @@ namespace DTXCreator.MIDIインポート
                        }\r
                        cml.Reverse();\r
 \r
-                       if ( n最終時間 >= 0 )\r
+                       //if ( n最終時間 >= 0 )\r
                        {\r
                                cml.Add( new CMIDIBARLen( (UInt32)n最終時間, n最終分子, n最終分母 ) );\r
                        }\r
-\r
-                       // 拍子変更以外のイベントが小節外にある時チップが配置されなかったので最初のcm.eイベントタイプ条件式をなくした\r
-                       this.formメインフォーム.mgr譜面管理者.dic小節.Clear();\r
-                       foreach ( CMIDIイベント cm in cml )\r
-                       {\r
-                               // もしイベントの絶対時間が、小節外にあれば、必要なだけ小節を追加する\r
-                               while ( true )\r
-                               {\r
-                                       bool bExistBar = true;\r
-                                       // 現在保持している小節リストの、nGridの最大値を取得する\r
-                                       int nCurrentMaxBar = this.formメインフォーム.mgr譜面管理者.n現在の最大の小節番号を返す();\r
-                                       int nCurremtMaxBar_FirstGrid = this.formメインフォーム.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( nCurrentMaxBar );\r
-                                       if ( nCurremtMaxBar_FirstGrid < 0 ) nCurremtMaxBar_FirstGrid = 0;\r
-\r
-                                       C小節 c最終小節 = this.formメインフォーム.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( nCurremtMaxBar_FirstGrid );\r
-                                       float fCurrent小節倍率 = (c最終小節 == null) ? 1.0f : c最終小節.f小節長倍率;\r
-                                       int nCurrentMaxGrid = nCurremtMaxBar_FirstGrid + (int) ( 192 * fCurrent小節倍率 ) - 1;\r
-                                       if ( nCurrentMaxBar < 0 ) nCurrentMaxGrid = -1;\r
-\r
-                                       // イベントの絶対時間が、小節外にあれば、新規に小節を一つ追加する。\r
-                                       // 小節長は前の小節長を継承するか、MIDIイベント指定による新しい値にするか。\r
-                                       // 小節を1つ追加しただけでは足りないのであれば、whileループで繰り返し追加し続ける。\r
-                                       int nEvent時間 = (int)cm.n時間 * ( 192 / 4 ) / n四分音符の分解能;\r
-                                       if ( nCurrentMaxGrid < (int) nEvent時間 )\r
-                                       {\r
-                                               ++nCurrentMaxBar;\r
-\r
-                                               C小節 c小節 = new C小節( nCurrentMaxBar );\r
-                                               if ( c小節 != null )\r
-                                               {\r
-                                                       c小節.f小節長倍率 = fCurrent小節倍率;\r
-                                                       this.formメインフォーム.mgr譜面管理者.dic小節.Add( nCurrentMaxBar, c小節 );\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       throw new Exception("C小節の作成に失敗しました。");\r
-                                               }\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               // 小節追加whileループの最後か、または小節が既に存在する場合でも、拍子の変更があれば反映する。\r
-                                               if (cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen)\r
-                                               {\r
-                                                       C小節 c小節 = this.formメインフォーム.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( nEvent時間 );\r
-                                                       this.formメインフォーム.t小節長を変更する_小節単位( c小節.n小節番号0to3599, (float)cm.n拍子分子 / cm.n拍子分母 );\r
-                                               }\r
-                                               break;\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       // 最初のcm.eイベントタイプ条件式をなくす変更前\r
-                       /*\r
+               \r
                        foreach ( CMIDIイベント cm in cml )\r
                        {\r
                                if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )\r
@@ -717,8 +678,8 @@ namespace DTXCreator.MIDIインポート
                                                }\r
                                        }\r
                                }\r
-                       }*/\r
-               }\r
+                       }\r
+                       }\r
 \r
                /// <summary>\r
                /// WAVリストを順番にソートする\r
@@ -753,5 +714,255 @@ namespace DTXCreator.MIDIインポート
                        }\r
                }\r
 \r
+               #region [ 設定ファイル関連 ]\r
+               //-----------------\r
+\r
+//             [Serializable]\r
+               [DataContract]\r
+               [KnownType( typeof( DTXC_MIDIConvSetting ) )]\r
+               public struct DTXC_MIDIConvSetting\r
+               {\r
+                       [DataMember]\r
+                       public DTXC_MIDIConvSetting_Assign[] Assign;\r
+                       [DataMember]\r
+                       public DTXC_MIDIConvSetting_Other Other;\r
+\r
+                       public DTXC_MIDIConvSetting(DTXC_MIDIConvSetting_Assign[] _Assign, DTXC_MIDIConvSetting_Other _Other)\r
+                       {\r
+                               Assign = _Assign;\r
+                               Other = _Other;\r
+                       }\r
+\r
+               }\r
+\r
+               [DataContract]\r
+               [KnownType( typeof( DTXC_MIDIConvSetting_Assign ) )]\r
+               public struct DTXC_MIDIConvSetting_Assign\r
+               {\r
+                       [DataMember]\r
+                       public int MIDI_Key;\r
+                       [DataMember]\r
+                       public string DTX_Lane;\r
+                       [DataMember]\r
+                       public bool BackCH;\r
+                       [DataMember]\r
+                       public string Comment;\r
+\r
+                       public DTXC_MIDIConvSetting_Assign(int _MIDI_Key, string _DTX_Lane, bool _BackCH, string _Comment)\r
+                       {\r
+                               MIDI_Key = _MIDI_Key;\r
+                               DTX_Lane = _DTX_Lane;\r
+                               BackCH   = _BackCH;\r
+                               Comment   = _Comment;\r
+                       }\r
+               }\r
+               \r
+               [DataContract]\r
+               [KnownType( typeof( DTXC_MIDIConvSetting_Other ) )]\r
+               public struct DTXC_MIDIConvSetting_Other\r
+               {\r
+                       [DataMember]\r
+                       public bool VelocityMax127;\r
+                       [DataMember]\r
+                       public bool VelocityCurveFix;\r
+                       [DataMember]\r
+                       public int DTXVOLUME;\r
+\r
+                       public DTXC_MIDIConvSetting_Other( bool _VelocityCurveFix, bool _VelocityMax127, int _DTXVOLUME )\r
+                       {\r
+                               VelocityCurveFix = _VelocityCurveFix;\r
+                               VelocityMax127   = _VelocityMax127;\r
+                               DTXVOLUME        = _DTXVOLUME;\r
+                       }\r
+               }\r
+\r
+               public void tMIDIインポート設定をファイルから読み込む()\r
+               {\r
+                       #region [ ファイル確認 ]\r
+                       // ファイルが無かったら新規で保存して読み込まない\r
+                       if ( !File.Exists( this.formメインフォーム.strMIDIインポート設定ファイル ) ) {\r
+                               this.formメインフォーム.strMIDIインポート設定ファイル = Directory.GetCurrentDirectory() + @"\" + "DTXCreatorSMFSettings.xml";\r
+                               tMIDIインポート設定をファイルに保存する();\r
+                               return;\r
+                       }\r
+                       #endregion\r
+                       \r
+                       #region [ xmlファイルから読込 ]\r
+                       DTXC_MIDIConvSetting mcs;\r
+\r
+                       using ( var stream = new FileStream( this.formメインフォーム.strMIDIインポート設定ファイル, FileMode.Open ) )\r
+                       {\r
+                               var serializer = new System.Xml.Serialization.XmlSerializer( typeof( DTXC_MIDIConvSetting ) );\r
+                               try\r
+                               {\r
+                               mcs = (DTXC_MIDIConvSetting) serializer.Deserialize( stream );\r
+                               }\r
+                               catch ( System.InvalidOperationException e )\r
+                               {\r
+                                       // 読み込みエラー発生時は、xmlを新規作成する\r
+                                       stream.Close();         // Closeしないとこの際のファイル保存でファイルハンドルが重複してしまう\r
+                                       Trace.TraceError( "MIDIインポート設定をファイルから読み込む際に、エラーが発生しました: " + e.Message );\r
+                                       this.formメインフォーム.strMIDIインポート設定ファイル = Directory.GetCurrentDirectory() + @"\" + "DTXCreatorSMFSettings.xml";\r
+                                       tMIDIインポート設定をファイルに保存する();\r
+                                       return;\r
+                               }\r
+                       }\r
+                       #endregion\r
+                       \r
+                       #region [ 割り当て一覧の反映 ]\r
+                       for ( int i = 0; i < 128; i++ )\r
+                       {\r
+                               this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_MIDI_Key" ].Value = mcs.Assign[ i ].MIDI_Key;\r
+                               this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_DTX_Lane" ].Value = mcs.Assign[ i ].DTX_Lane;\r
+                               this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_BackCH" ].Value   = mcs.Assign[ i ].BackCH;\r
+                               this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_Comment" ].Value  = mcs.Assign[ i ].Comment;\r
+                       }\r
+                       #endregion\r
+\r
+                       #region [ その他インポート設定の反映 ]\r
+                       checkBoxベロシティカーブ調整.Checked = mcs.Other.VelocityCurveFix;\r
+                       checkBoxベロシティ最大値127.Checked  = mcs.Other.VelocityMax127;\r
+                       numericUpDownVOLUME間隔.Value        = mcs.Other.DTXVOLUME;\r
+                       #endregion\r
+                       \r
+                       labelMIDIImportSettingsFile.Text = Path.GetFileName( this.formメインフォーム.strMIDIインポート設定ファイル );\r
+\r
+                       #region [ 割り当て一覧が更新された時の処理 ]\r
+            //-----------------\r
+                       for ( int i = 0 ; i < 128 ; i++ ) tMIDI割り当て一覧のレーン名の背景色を変更する( i );\r
+                       tMIDIチップをレーンに割り当てる();\r
+            //-----------------\r
+            #endregion\r
+               }\r
+       \r
+               public void tMIDIインポート設定をファイルに保存する()\r
+               {\r
+                       DTXC_MIDIConvSetting mcs = new DTXC_MIDIConvSetting();\r
+                       mcs.Assign = new DTXC_MIDIConvSetting_Assign[ 128 ];\r
+                       mcs.Other = new DTXC_MIDIConvSetting_Other();\r
+\r
+                       #region [ 割り当て一覧の格納 ]\r
+                       for (int i = 0; i < 128; i++)\r
+                       {\r
+                               mcs.Assign[ i ].MIDI_Key = (int)    this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_MIDI_Key" ].Value;\r
+                               mcs.Assign[ i ].DTX_Lane = (string) this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_DTX_Lane" ].Value;\r
+                               mcs.Assign[ i ].BackCH   = (bool)   this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_BackCH" ].Value;\r
+                               mcs.Assign[ i ].Comment  = (string) this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_Comment" ].Value;\r
+                       }\r
+                       #endregion\r
+\r
+                       #region [ その他インポート設定の格納 ]\r
+                       mcs.Other.VelocityCurveFix = checkBoxベロシティカーブ調整.Checked;\r
+                       mcs.Other.VelocityMax127   = checkBoxベロシティ最大値127.Checked;\r
+                       mcs.Other.DTXVOLUME        = (int)numericUpDownVOLUME間隔.Value;\r
+                       #endregion\r
+                       \r
+                       #region [ xmlファイルに保存 ]\r
+                       using ( var stream = new FileStream( this.formメインフォーム.strMIDIインポート設定ファイル, FileMode.Create ) )\r
+                       {\r
+                               var serializer = new System.Xml.Serialization.XmlSerializer( typeof( DTXC_MIDIConvSetting ) );\r
+                               serializer.Serialize( stream, mcs );\r
+                       }\r
+                       #endregion\r
+                       \r
+                       labelMIDIImportSettingsFile.Text = Path.GetFileName( this.formメインフォーム.strMIDIインポート設定ファイル );\r
+               }\r
+\r
+               private void tMIDIインポート設定ファイル選択ダイアログを開く()\r
+               {\r
+                       #region [ ファイル選択 ]\r
+            //-----------------\r
+            OpenFileDialog dialog = new OpenFileDialog();\r
+                       dialog.Title = Resources.strMIDIインポート設定ファイル選択ダイアログのタイトル;\r
+            dialog.Filter = Resources.strMIDIインポート設定ファイル選択ダイアログのフィルタ;\r
+            dialog.FilterIndex = 1;\r
+            dialog.InitialDirectory =\r
+                               ( this.formメインフォーム.strMIDIインポート設定ファイル != "" )\r
+                               ? Path.GetDirectoryName( this.formメインフォーム.strMIDIインポート設定ファイル ) + @"\"\r
+                               : Directory.GetCurrentDirectory();\r
+            DialogResult result = dialog.ShowDialog();\r
+\r
+            if (result != DialogResult.OK) return;\r
+\r
+                       string strファイル名 = dialog.FileName;\r
+            //-----------------\r
+            #endregion\r
+\r
+                       #region [ ファイル確認 ]\r
+            //-----------------\r
+            if ( !File.Exists( strファイル名 ) )\r
+            {\r
+                MessageBox.Show(\r
+                    Resources.strMIDIインポート設定ファイルではないMSG,\r
+                    Resources.strMIDIインポートエラーのタイトル,\r
+                    MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);\r
+                return;\r
+            }\r
+            //-----------------\r
+            #endregion\r
+\r
+            #region [ 拡張子確認 ]\r
+            //-----------------\r
+            string str拡張子 = Path.GetExtension(strファイル名);\r
+\r
+            if ( !str拡張子.Equals(".xml", StringComparison.OrdinalIgnoreCase ) )\r
+            {\r
+                MessageBox.Show(\r
+                                       Resources.strMIDIインポート設定ファイルではないMSG,\r
+                                       Resources.strMIDIインポートエラーのタイトル,\r
+                                       MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
+                return;\r
+            }\r
+            //-----------------\r
+            #endregion\r
+\r
+                       #region [ 各設定 ]\r
+            //-----------------\r
+                       this.formメインフォーム.strMIDIインポート設定ファイル = strファイル名;\r
+            //-----------------\r
+            #endregion\r
+\r
+                       tMIDIインポート設定をファイルから読み込む();\r
+               }\r
+\r
+               private void tMIDIインポート設定ファイル保存ダイアログを開く()\r
+               {\r
+                       #region [ ファイル選択 ]\r
+            //-----------------\r
+                       SaveFileDialog dialog = new SaveFileDialog();\r
+                       dialog.Title = Resources.strMIDIインポート設定ファイル保存ダイアログのタイトル;\r
+                       dialog.Filter = Resources.strMIDIインポート設定ファイル選択ダイアログのフィルタ;\r
+                       dialog.FilterIndex = 1;\r
+                       dialog.InitialDirectory = \r
+                               ( this.formメインフォーム.strMIDIインポート設定ファイル != "" )\r
+                               ? Path.GetDirectoryName( this.formメインフォーム.strMIDIインポート設定ファイル ) + @"\"\r
+                               : Directory.GetCurrentDirectory();\r
+                       DialogResult result = dialog.ShowDialog();\r
+\r
+            if (result != DialogResult.OK) return;\r
+\r
+                       string strファイル名 = dialog.FileName;\r
+            //-----------------\r
+            #endregion\r
+\r
+                       #region [ 拡張子変更 ]\r
+            //-----------------\r
+                       if ( Path.GetExtension( strファイル名 ).Length == 0 )\r
+                               strファイル名 = Path.ChangeExtension( strファイル名, ".xml" );\r
+            //-----------------\r
+            #endregion\r
+                       \r
+                       #region [ 各設定 ]\r
+            //-----------------\r
+                       this.formメインフォーム.strMIDIインポート設定ファイル = strファイル名;\r
+            //-----------------\r
+            #endregion\r
+\r
+                       tMIDIインポート設定をファイルに保存する();\r
+               }\r
+\r
+               //-----------------\r
+               #endregion\r
+\r
        }\r
 }\r