OSDN Git Service

#30333 最初のノートが3小節目以降だとチップが配置されないことがあるのを修正
[dtxmania/dtxmania.git] / DTXCreatorプロジェクト / コード / 07.MIDIインポート / CMIDIインポートダイアログ.cs
index 407e497..20ef1b4 100644 (file)
@@ -18,17 +18,16 @@ 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
-        private void CMIDIインポートダイアログ_KeyDown(object sender, KeyEventArgs e)\r
+               private void CMIDIインポートダイアログ_KeyDown(object sender, KeyEventArgs e)\r
         {\r
             if ( e.KeyCode == Keys.Return )\r
             {\r
@@ -40,6 +39,59 @@ namespace DTXCreator.MIDIインポート
             }\r
         }\r
 \r
+        private void buttonOpen_Click(object sender, EventArgs e)\r
+        {\r
+            this.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 == "DTX_Lane" )\r
+                tMIDI割り当て一覧のレーン名の背景色を変更する( e.RowIndex );\r
+                       \r
+            if ( cMIDI != null ) tMIDIチップをレーンに割り当てる();\r
+\r
+        }\r
+\r
+               /// <summary>\r
+               /// dgvチャンネル一覧変更の内容をプログラム中で変更する時は、CellValueChangedイベントを抑止する為にこの関数を呼ぶこと\r
+               /// </summary>\r
+               private void dgvチャンネル一覧変更イベント抑止()\r
+               {\r
+                       try\r
+                       {\r
+                               dgvチャンネル一覧.CellValueChanged -= dgvチャンネル一覧_CellValueChanged;\r
+                       }\r
+                       catch ( Exception e )\r
+                       {\r
+                               Debug.WriteLine( "dgvチャンネル一覧.CellValueChangedのイベントエントリ削除に失敗しましたが、続行します。{0}", e.Message );\r
+                       }\r
+               }\r
+\r
+               /// <summary>\r
+               /// dgvチャンネル一覧変更イベント抑止()を呼び出し、\r
+               /// dgvチャンネル一覧変更の内容をプログラム中で変更し終わった時にこの関数を呼ぶこと\r
+               /// </summary>\r
+               private void dgvチャンネル一覧変更イベント復旧()\r
+               {\r
+                       dgvチャンネル一覧.CellValueChanged += dgvチャンネル一覧_CellValueChanged;\r
+               }\r
+\r
+               /// <summary>\r
+               /// チェックした瞬間にCellValueChangedを発生させる用\r
+               /// </summary>\r
                private void dgvチャンネル一覧_CurrentCellDirtyStateChanged(object sender, EventArgs e)\r
                {\r
                        if ( dgvチャンネル一覧.IsCurrentCellDirty )\r
@@ -47,15 +99,39 @@ 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["ChLoad"].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["Notes"].Value = cMIDI.nドラムチャンネルのキー毎のノート数[i];\r
+\r
+                       t同時刻で同じレーンに配置予定のチップを数えて反映する();\r
+\r
+               }\r
 \r
         public void tMIDI割り当て一覧を作成する()\r
         {\r
@@ -75,7 +151,7 @@ namespace DTXCreator.MIDIインポート
                                bool b裏チャンネル = false;\r
                 switch ( i )\r
                 {\r
-                    case 35 : str楽器名 = "Bass Drum 2"; strレーン名 = "LP"; b裏チャンネル = true; break;\r
+                    case 35 : str楽器名 = "Bass Drum 2"; strレーン名 = "BD"; break;\r
                     case 36 : str楽器名 = "Bass Drum 1"; strレーン名 = "BD"; break;\r
                     case 37 : str楽器名 = "Side Stick"; strレーン名 = "SE1"; break;\r
                     case 38 : str楽器名 = "Snare Drum 1"; strレーン名 = "SD"; break;\r
@@ -124,9 +200,13 @@ namespace DTXCreator.MIDIインポート
                     case 81 : str楽器名 = "Open Triangle"; break;\r
                 }\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
+                               // 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
@@ -145,7 +225,9 @@ namespace DTXCreator.MIDIインポート
                                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
                        }\r
-                       this.b一覧準備完了 = true;\r
+                       //      dgvチャンネル一覧変更イベント復旧();     //ここでイベントを復旧してはいけない\r
+                                                                                                               //(直後にファイルを開く動作+解析動作が発生するのでそこで)\r
+                                                                                                               //ChangValueイベントが発生しイベントが何度も発生してしまう\r
                }\r
 \r
         public void tMIDIファイルを選択する()\r
@@ -154,8 +236,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
@@ -175,64 +257,58 @@ 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
             #endregion\r
 \r
-            #region [ 各設定 ]\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
@@ -249,42 +325,28 @@ namespace DTXCreator.MIDIインポート
             }\r
             \r
             this.textBox1.Text = str文字列;\r
-\r
-                       for ( int i = 1 ; i <= 16 ; i++ )\r
-                this.dgvチャンネル一覧.Rows[i-1].Cells["ChNotes"].Value = this.cMIDI.lチャンネル毎のノート数1to16[i];\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["ChNotes"].Value = cMIDI.nチャンネル0to15毎のノート数[i];\r
+                               this.dgvチャンネル一覧.Rows[i].Cells["ChLoad"].Value  = cMIDI.bドラムチャンネルと思われる[i];\r
                        }\r
+                       dgvチャンネル一覧変更イベント復旧();\r
+\r
+            // 各キーのノート数を割り当て一覧に出力する\r
+                       t読み込むチャンネルを取得してキー毎のノート数を計算する();\r
 \r
+                       // 設定に応じて処理する\r
+                       tMIDIチップをレーンに割り当てる();\r
+\r
+                       //-----------------\r
+            #endregion\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
@@ -320,9 +382,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
@@ -343,8 +409,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
@@ -386,7 +452,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
@@ -399,46 +465,114 @@ 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
-                this.formメインフォーム.textBox曲名.Text = Path.GetFileName( cMIDI.strファイル名 );\r
-                if ( cMIDI.n重複チップ数 > 0 ) this.formメインフォーム.textBoxコメント.Text = resource.GetString("label重複チップ数.Text") + " : "+cMIDI.n重複チップ数;\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
                                #endregion\r
 \r
-            }\r
+                               #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
+                                       {\r
+                                               this.formメインフォーム.mgr譜面管理者.tExpandLanes( Cレーン.ELaneType.LP );\r
+                                       }\r
+                               }\r
+                               #endregion\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
+                       // 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["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["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
+                                       }\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
+\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
@@ -482,10 +616,60 @@ namespace DTXCreator.MIDIインポート
                                cml.Add( new CMIDIBARLen( (UInt32)n最終時間, n最終分子, n最終分母 ) );\r
                        }\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
+                       foreach ( CMIDIイベント cm in cml )\r
+                       {\r
                                if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )\r
                                {\r
                                        // もし拍子変更イベントの絶対時間が、小節外にあれば、必要なだけ小節を追加する\r
@@ -533,8 +717,40 @@ namespace DTXCreator.MIDIインポート
                                                }\r
                                        }\r
                                }\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
        }\r