OSDN Git Service

#30333 MIDIインポート設定ファイルの読込/保存を追加。
[dtxmania/dtxmania.git] / DTXCreatorプロジェクト / コード / 07.MIDIインポート / CMIDIインポートダイアログ.cs
index 4a54c36..21529c4 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
@@ -18,18 +20,67 @@ namespace DTXCreator.MIDIインポート
 \r
         private CMIDI cMIDI;\r
         public Cメインフォーム formメインフォーム;\r
-        private bool b一覧準備完了;\r
                private System.Resources.ResourceManager resource;\r
                \r
         public CMIDIインポートダイアログ()\r
         {\r
             InitializeComponent();\r
-                       this.b一覧準備完了 = false;\r
                        dgvチャンネル一覧変更イベント抑止();\r
                        resource = new System.Resources.ResourceManager( this.GetType() );\r
         }\r
 \r
-               public void dgvチャンネル一覧変更イベント抑止()\r
+               private void CMIDIインポートダイアログ_KeyDown(object sender, KeyEventArgs e)\r
+        {\r
+            if ( e.KeyCode == Keys.Return )\r
+            {\r
+                this.buttonOK.PerformClick();\r
+            }\r
+            else if ( e.KeyCode == Keys.Escape )\r
+            {\r
+                this.buttonCancel.PerformClick();\r
+            }\r
+        }\r
+\r
+        private void buttonOpen_Click(object sender, EventArgs e)\r
+        {\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
+                SendKeys.Send("{F4}");\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 == "Assign_DTX_Lane" )\r
+                tMIDI割り当て一覧のレーン名の背景色を変更する( e.RowIndex );\r
+                       \r
+            tMIDIチップをレーンに割り当てる();\r
+\r
+        }\r
+\r
+               /// <summary>\r
+               /// dgvチャンネル一覧変更の内容をプログラム中で変更する時は、CellValueChangedイベントを抑止する為にこの関数を呼ぶこと\r
+               /// </summary>\r
+               private void dgvチャンネル一覧変更イベント抑止()\r
                {\r
                        try\r
                        {\r
@@ -40,23 +91,19 @@ namespace DTXCreator.MIDIインポート
                                Debug.WriteLine( "dgvチャンネル一覧.CellValueChangedのイベントエントリ削除に失敗しましたが、続行します。{0}", e.Message );\r
                        }\r
                }\r
-               public void dgvチャンネル一覧変更イベント復旧()\r
+\r
+               /// <summary>\r
+               /// dgvチャンネル一覧変更イベント抑止()を呼び出し、\r
+               /// dgvチャンネル一覧変更の内容をプログラム中で変更し終わった時にこの関数を呼ぶこと\r
+               /// </summary>\r
+               private void dgvチャンネル一覧変更イベント復旧()\r
                {\r
                        dgvチャンネル一覧.CellValueChanged += dgvチャンネル一覧_CellValueChanged;\r
                }\r
 \r
-               private void CMIDIインポートダイアログ_KeyDown(object sender, KeyEventArgs e)\r
-        {\r
-            if ( e.KeyCode == Keys.Return )\r
-            {\r
-                this.buttonOK.PerformClick();\r
-            }\r
-            else if ( e.KeyCode == Keys.Escape )\r
-            {\r
-                this.buttonCancel.PerformClick();\r
-            }\r
-        }\r
-\r
+               /// <summary>\r
+               /// チェックした瞬間にCellValueChangedを発生させる用\r
+               /// </summary>\r
                private void dgvチャンネル一覧_CurrentCellDirtyStateChanged(object sender, EventArgs e)\r
                {\r
                        if ( dgvチャンネル一覧.IsCurrentCellDirty )\r
@@ -64,23 +111,47 @@ namespace DTXCreator.MIDIインポート
                                dgvチャンネル一覧.CommitEdit( DataGridViewDataErrorContexts.Commit );\r
                        }\r
                }\r
+\r
                private void dgvチャンネル一覧_CellValueChanged( object sender, DataGridViewCellEventArgs e )\r
                {\r
-                       if ( cMIDI != null && this.b一覧準備完了 ) this.tMIDIファイルを開く( cMIDI.strファイル名 );\r
+                       if ( cMIDI != null ) {\r
+                               t読み込むチャンネルを取得してキー毎のノート数を計算する();\r
+                       }\r
                }\r
 \r
-        private void buttonOpen_Click(object sender, EventArgs e)\r
-        {\r
-            this.tMIDIファイルを選択する();\r
-        }\r
+               /// <summary>\r
+               /// ファイルを開いた時か、チャンネル一覧のチェック変更時に呼び出す\r
+               /// </summary>\r
+               private void t読み込むチャンネルを取得してキー毎のノート数を計算する()\r
+               {\r
+                       // キー毎のノート数初期化\r
+                       for ( int i = 0 ; i < 128 ; i++ ) cMIDI.nドラムチャンネルのキー毎のノート数[i] = 0;\r
+                       \r
+                       // MIDIイベントの内、チャンネル一覧でチェックの入ってるチャンネルを持つノートを、変換するノートとしてカウントする\r
+                       foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
+                       {\r
+                               if (vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.NoteOnOff)\r
+                               {\r
+                                       if ((bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells[ "Channel_Load" ].Value)\r
+                                       {\r
+                                               cMIDI.nドラムチャンネルのキー毎のノート数[vMIDIイベント.nキー] ++;\r
+                               }\r
+                       }\r
+                       }\r
+            for ( int i = 0 ; i < 128 ; i++ )\r
+                this.dgv割り当て一覧.Rows[127-i].Cells[ "Assign_Notes" ].Value = cMIDI.nドラムチャンネルのキー毎のノート数[i];\r
+\r
+                       t同時刻で同じレーンに配置予定のチップを数えて反映する();\r
+\r
+               }\r
 \r
         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
@@ -138,34 +209,36 @@ 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
-                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
+\r
+                               // 黒鍵に色付け\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
-                tMIDI割り当て一覧のレーン名の背景色を変更する( this.dgv割り当て一覧.RowCount-1 );\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
-                       this.b一覧準備完了 = true;\r
                        //      dgvチャンネル一覧変更イベント復旧();     //ここでイベントを復旧してはいけない\r
                                                                                                                //(直後にファイルを開く動作+解析動作が発生するのでそこで)\r
-                                                                                                               //ChangValueã\82¤ã\83\99ã\83³ã\83\88ã\81\8cç\99ºç\94\9fã\81\97ã\83\95ã\82¡ã\82¤ã\83«ã\82\92é\96\8bã\81\8dç\9b´ã\81\99å\8b\95ä½\9cが何度も発生してしまう\r
+                                                                                                               //ChangValueã\82¤ã\83\99ã\83³ã\83\88ã\81\8cç\99ºç\94\9fã\81\97ã\82¤ã\83\99ã\83³ã\83\88が何度も発生してしまう\r
                }\r
 \r
         public void tMIDIファイルを選択する()\r
@@ -174,8 +247,8 @@ namespace DTXCreator.MIDIインポート
             //-----------------\r
 \r
             OpenFileDialog dialog = new OpenFileDialog();\r
-            dialog.Title = "MIDIファイルを選択";\r
-            dialog.Filter = "MIDIファイル (*.mid,*.midi)|*.mid;*.midi|すべてのファイル (*.*)|*.*";\r
+                       dialog.Title = Resources.strMIDIファイル選択ダイアログのタイトル;\r
+            dialog.Filter = Resources.strMIDIファイル選択ダイアログのフィルタ;\r
             dialog.FilterIndex = 1;\r
             dialog.InitialDirectory = this.formメインフォーム.strMIDIインポートフォルダ;\r
             DialogResult result = dialog.ShowDialog();\r
@@ -195,24 +268,24 @@ namespace DTXCreator.MIDIインポート
             if ( !File.Exists( strファイル名 ) )\r
             {\r
                 MessageBox.Show(\r
-                    "ファイルが見つかりません。",\r
-                    "MIDIインポート",\r
+                    Resources.strファイルが存在しませんMSG,\r
+                    Resources.strMIDIインポートエラーのタイトル,\r
                     MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);\r
                 return;\r
             }\r
             //-----------------\r
             #endregion\r
 \r
-            #region [ 拡張子 ]\r
+            #region [ 拡張子確認 ]\r
             //-----------------\r
             string str拡張子 = Path.GetExtension(strファイル名);\r
 \r
             if ( !str拡張子.Equals(".mid", StringComparison.OrdinalIgnoreCase ) && !str拡張子.Equals( ".midi", StringComparison.OrdinalIgnoreCase) )\r
             {\r
                 MessageBox.Show(\r
-                    "MIDIファイルではありません。",\r
-                    "MIDIインポート",\r
-                    MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);\r
+                                       Resources.strMIDIファイルではないMSG,\r
+                                       Resources.strMIDIインポートエラーのタイトル,\r
+                                       MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
                 return;\r
             }\r
             //-----------------\r
@@ -220,39 +293,33 @@ namespace DTXCreator.MIDIインポート
 \r
                        #region [ 各設定 ]\r
             //-----------------\r
-                       this.formメインフォーム.str作業フォルダ名 = Path.GetDirectoryName( strファイル名 ) + @"\";\r
                        this.formメインフォーム.strMIDIインポートフォルダ = Path.GetDirectoryName( strファイル名 ) + @"\";\r
             //-----------------\r
             #endregion\r
 \r
-            #region [ MIDIファイル解析 ]\r
+                       #region [ MIDIファイル解析 ]\r
             //-----------------\r
             cMIDI = new CMIDI( strファイル名 );\r
             cMIDI.formメインフォーム = this.formメインフォーム;\r
                        cMIDI.dgvチャンネル一覧 = this.dgvチャンネル一覧;\r
             cMIDI.tMIDIを解析する();\r
-                       cMIDI.tMIDIチップをレーンに割り当てる( this.dgv割り当て一覧 );\r
-\r
-                       this.label重複チップ数.Text = resource.GetString("label重複チップ数.Text") + " : " + cMIDI.n重複チップ数;\r
                        \r
             // ヘッダがMIDI以外なら中断\r
             if ( !cMIDI.bMIDIファイル )\r
             {\r
                 MessageBox.Show(\r
-                    "MIDIファイルではありません。",\r
-                    "MIDIインポート",\r
-                    MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);\r
+                    Resources.strMIDIファイルではないMSG,\r
+                                       Resources.strMIDIインポートエラーのタイトル,\r
+                                       MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
                                cMIDI = null;\r
                 return;\r
             }\r
+\r
             //-----------------\r
             #endregion\r
             \r
-            #region [ 解析結果を出力・処理 ]\r
+            #region [ 解析結果を出力 ]\r
             //-----------------\r
-            // 各キーのノート数を表に出力する\r
-            for ( int i = 0 ; i < 128 ; i++ )\r
-                this.dgv割り当て一覧.Rows[127-i].Cells["Notes"].Value = cMIDI.nドラム各ノート数[i];\r
                        \r
             // MIDI解析内容をテキストボックスに出力する\r
             string str文字列 = "";\r
@@ -270,60 +337,43 @@ namespace DTXCreator.MIDIインポート
             \r
             this.textBox1.Text = str文字列;\r
 \r
-                       for ( int i = 1; i <= 16; i++ )\r
-                       {\r
-                               this.dgvチャンネル一覧.Rows[i-1].Cells["ChNotes"].Value = this.cMIDI.lチャンネル毎のノート数1to16[i];\r
-                               this.dgvチャンネル一覧.Rows[i-1].Cells["ChLoad"].Value  = this.cMIDI.bドラムチャンネルと思われる[i-1];\r
-                       }\r
-            //-----------------\r
+                       //-----------------\r
             #endregion\r
-\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
-                SendKeys.Send("{F4}");\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
-                tMIDI割り当て一覧のレーン名の背景色を変更する( e.RowIndex );\r
                        \r
-            if ( cMIDI != null && this.b一覧準備完了 )\r
+            // 各チャンネルのノート数をチャンネル一覧に出力する\r
+                       dgvチャンネル一覧変更イベント抑止();\r
+                       for ( int i = 0; i < 16; i++ )\r
                        {\r
-                               cMIDI.tMIDIチップをレーンに割り当てる( dgv割り当て一覧 );\r
-                               this.label重複チップ数.Text = resource.GetString("label重複チップ数.Text") + " : " + cMIDI.n重複チップ数;\r
-                               \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
+                       // 読み込むチャンネルが確定したら、割り当て一覧が更新された時の処理\r
+                       tMIDIチップをレーンに割り当てる();\r
         }\r
                \r
                /// <summary>\r
-               /// ã\83¬ã\83¼ã\83³å\90\8då¤\89æ\9b´æ\99\82ã\81«å\91¼ã\81³å\87ºã\81\95ã\82\8cã\82\8b\r
+               /// ã\83¬ã\83¼ã\83³å\90\8då¤\89æ\9b´æ\99\82ã\81«å\91¼ã\81³å\87ºã\81\99ã\81\93ã\81¨\r
                /// </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
@@ -331,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
@@ -343,9 +392,13 @@ namespace DTXCreator.MIDIインポート
                                        vMIDIイベント.nベロシティ_DTX変換後 = velo;\r
                                }\r
                                #endregion\r
+                               \r
+                               #region [ 読み込むチャンネルを取得してキー毎のノート数を計算する ]\r
+                               t読み込むチャンネルを取得してキー毎のノート数を計算する();\r
+                               #endregion\r
 \r
                                #region [ 配置予定チップを割り当て一覧に沿ってレーンを割り当てる ]\r
-                               cMIDI.tMIDIチップをレーンに割り当てる( this.dgv割り当て一覧 );\r
+                               tMIDIチップをレーンに割り当てる();\r
                                #endregion\r
                                \r
                                #region [ WAVリスト出力 ]\r
@@ -366,8 +419,8 @@ namespace DTXCreator.MIDIインポート
                                \r
                                foreach ( CMIDIイベント vMIDIWAV in cMIDI.lMIDIWAV )\r
                                {\r
-                                       // ノートチップ以外をWAVリストに表示させない\r
-                                       if ( vMIDIWAV.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;\r
+                                       // ノートチップ以外をWAVリストに表示させない→WAVリスト化する部分で処理する\r
+                                       //if ( vMIDIWAV.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;\r
 \r
                                        // レーン毎に1行空ける\r
                                        if ( nWAVCount > 4 && nレーン番号before != vMIDIWAV.nレーン番号 ) nWAVCount++;\r
@@ -409,7 +462,7 @@ namespace DTXCreator.MIDIインポート
                                // 複数トラックへの対応のため\r
                                cMIDI.lMIDIイベント.Sort( ( ( a, b ) => (int) a.n時間 - (int) b.n時間 ) );\r
 \r
-                               // 配置予定チップを実際に配置する\r
+                               // é\85\8dç½®äº\88å®\9aã\83\81ã\83\83ã\83\97ã\81§ã\80\81é\81¸æ\8a\9eã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\81ã\83£ã\83³ã\83\8dã\83«ã\81®ã\83\8eã\83¼ã\83\84ã\82\92å®\9fé\9a\9bã\81«é\85\8dç½®ã\81\99ã\82\8b\r
                 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
                 {\r
                                        if ( vMIDIイベント.b入力 )\r
@@ -422,13 +475,15 @@ namespace DTXCreator.MIDIインポート
                                this.formメインフォーム.mgr譜面管理者.tチップを配置または置換する( this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BGM" ), 0, 2, 0f, false );\r
                                #endregion\r
 \r
-                               #region [ æ\83\85å ±ã\82\92å\85¥力 ]\r
+                               #region [ æ\83\85å ±ã\82\92å\87º力 ]\r
                 if ( cMIDI.f先頭BPM > 0.0 ) this.formメインフォーム.numericUpDownBPM.Value = (decimal)cMIDI.f先頭BPM;\r
+\r
                                string str曲タイトル = cMIDI.lMIDIトラック[0].strトラック名;\r
                                if ( str曲タイトル == "" )\r
                                {\r
                                        str曲タイトル = Path.GetFileName( cMIDI.strファイル名 );\r
                                }\r
+\r
                 this.formメインフォーム.textBox曲名.Text = str曲タイトル;\r
 \r
                                if ( cMIDI.n重複チップ数 > 0 ) this.formメインフォーム.textBoxコメント.Text = resource.GetString("label重複チップ数.Text") + " : "+cMIDI.n重複チップ数;\r
@@ -437,47 +492,100 @@ 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
                /// <summary>\r
-               /// WAVリストを順番にソートする\r
-               /// ・レーン番号:昇順\r
-               /// ・裏チャンネル:昇順(表が0、裏が1)\r
-               /// ・(MIDIの)キー:昇順\r
-               /// ・音量:降順\r
+               /// dgv割り当て一覧で設定した値に応じて、各レーンへ振り分ける\r
                /// </summary>\r
-               static int nMIDIWAVSort( CMIDIイベント a, CMIDIイベント b )\r
-               {\r
-                       // 昇順\r
-                       if ( a.nレーン番号 > b.nレーン番号 ) return 1;\r
-                       else if ( a.nレーン番号 < b.nレーン番号 ) return -1;\r
-                       else\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
-                               // 昇順\r
-                               if ( (a.b裏チャンネル?1:0) > (b.b裏チャンネル?1:0) ) return 1;\r
-                               else if ( (a.b裏チャンネル?1:0) < (b.b裏チャンネル?1:0) ) return -1;\r
-                               else\r
+                               if (vMIDIイベント.nキー == (int)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_MIDI_Key" ].Value )\r
                                {\r
-                                       // 昇順\r
-                                       if ( a.nキー > b.nキー ) return 1;\r
-                                       else if ( a.nキー < b.nキー ) return -1;\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[ "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
-                                               // 降順\r
-                                               if ( a.nベロシティ > b.nベロシティ ) return -1;\r
-                                               else if ( a.nベロシティ < b.nベロシティ ) return 1;\r
-                                               else return 0;\r
+                                               vMIDIイベント.nレーン番号 = 0;\r
+                                               vMIDIイベント.strコメント = "";\r
+                                               vMIDIイベント.b裏チャンネル = false;\r
+                                               vMIDIイベント.b入力 = false;\r
+                                       }\r
+                                       if ( vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BPM  ||\r
+                                                       vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )\r
+                                       {\r
+                                               vMIDIイベント.b入力 = true;\r
+                                       }\r
+                               }\r
+                       }\r
+                       #endregion\r
+\r
+                       #region [ WAVリスト化する ]\r
+                       cMIDI.lMIDIWAV = new List<CMIDIイベント>();\r
+\r
+                       foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
+                       {\r
+                               // チャンネル一覧で選択されているものと、ノートのみリスト化\r
+                               if ( !vMIDIイベント.b入力 || vMIDIイベント.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;\r
+\r
+                               // WAVリストで、同じ内容(キーとベロシティ)が無ければ挿入する\r
+                               bool bMIDIWAV_AddFlag = true;\r
+                               foreach ( CMIDIイベント vMIDIWAV in cMIDI.lMIDIWAV )\r
+                               {\r
+                                       if ( vMIDIWAV.strWAV重複チェック == vMIDIイベント.strWAV重複チェック )\r
+                                       {\r
+                                               bMIDIWAV_AddFlag = false;\r
+                                               break;\r
                                        }\r
                                }\r
+                               if (bMIDIWAV_AddFlag)\r
+                               {\r
+                                       cMIDI.lMIDIWAV.Add( vMIDIイベント );\r
+                               }\r
                        }\r
+                       #endregion\r
+\r
+                       t同時刻で同じレーンに配置予定のチップを数えて反映する();\r
+        }\r
+\r
+               private void t同時刻で同じレーンに配置予定のチップを数えて反映する()\r
+               {\r
+                       cMIDI.n重複チップ数 = 0;\r
+                       List<string> lMIDIイベント_重複 = new List<string>();\r
+                       \r
+                       // 読み込むチャンネルだけチェックする\r
+                       foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント ){\r
+                               // チャンネル一覧で選択されているものと、ノートのみ数える\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
+\r
+                       this.label重複チップ数.Text = resource.GetString("label重複チップ数.Text") + " : " + cMIDI.n重複チップ数;\r
                }\r
 \r
                private struct barlen\r
@@ -500,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
@@ -516,13 +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
-                       \r
-                       this.formメインフォーム.mgr譜面管理者.dic小節.Clear();\r
+               \r
                        foreach ( CMIDIイベント cm in cml )\r
                        {\r
                                if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )\r
@@ -573,6 +679,278 @@ namespace DTXCreator.MIDIインポート
                                        }\r
                                }\r
                        }\r
+                       }\r
+\r
+               /// <summary>\r
+               /// WAVリストを順番にソートする\r
+               /// ・レーン番号:昇順\r
+               /// ・裏チャンネル:昇順(表が0、裏が1)\r
+               /// ・(MIDIの)キー:昇順\r
+               /// ・音量:降順\r
+               /// </summary>\r
+               static int nMIDIWAVSort( CMIDIイベント a, CMIDIイベント b )\r
+               {\r
+                       // 昇順\r
+                       if ( a.nレーン番号 > b.nレーン番号 ) return 1;\r
+                       else if ( a.nレーン番号 < b.nレーン番号 ) return -1;\r
+                       else\r
+                       {\r
+                               // 昇順\r
+                               if ( (a.b裏チャンネル?1:0) > (b.b裏チャンネル?1:0) ) return 1;\r
+                               else if ( (a.b裏チャンネル?1:0) < (b.b裏チャンネル?1:0) ) return -1;\r
+                               else\r
+                               {\r
+                                       // 昇順\r
+                                       if ( a.nキー > b.nキー ) return 1;\r
+                                       else if ( a.nキー < b.nキー ) return -1;\r
+                                       else\r
+                                       {\r
+                                               // 降順\r
+                                               if ( a.nベロシティ > b.nベロシティ ) return -1;\r
+                                               else if ( a.nベロシティ < b.nベロシティ ) return 1;\r
+                                               else return 0;\r
+                                       }\r
+                               }\r
+                       }\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
+                               mcs = (DTXC_MIDIConvSetting) serializer.Deserialize( stream );\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