OSDN Git Service

#30333 [DTXC] インポートを更に高速化(正確には、低速になっていたのを元に戻した)
[dtxmania/dtxmania.git] / DTXCreatorプロジェクト / コード / 07.MIDIインポート / CMIDIインポートダイアログ.cs
index 0a68137..4a54c36 100644 (file)
@@ -18,13 +18,34 @@ namespace DTXCreator.MIDIインポート
 \r
         private CMIDI cMIDI;\r
         public Cメインフォーム formメインフォーム;\r
-\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
+               public 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
+               public 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
@@ -36,9 +57,16 @@ namespace DTXCreator.MIDIインポート
             }\r
         }\r
 \r
-               private void numericUpDownCh_ValueChanged(object sender, EventArgs e)\r
+               private void dgvチャンネル一覧_CurrentCellDirtyStateChanged(object sender, EventArgs e)\r
                {\r
-                       if ( cMIDI != null ) this.tMIDIファイルを開く( cMIDI.strファイル名 );\r
+                       if ( dgvチャンネル一覧.IsCurrentCellDirty )\r
+                       {\r
+                               dgvチャンネル一覧.CommitEdit( DataGridViewDataErrorContexts.Commit );\r
+                       }\r
+               }\r
+               private void dgvチャンネル一覧_CellValueChanged( object sender, DataGridViewCellEventArgs e )\r
+               {\r
+                       if ( cMIDI != null && this.b一覧準備完了 ) this.tMIDIファイルを開く( cMIDI.strファイル名 );\r
                }\r
 \r
         private void buttonOpen_Click(object sender, EventArgs e)\r
@@ -61,6 +89,7 @@ namespace DTXCreator.MIDIインポート
                 string str楽器名 = "";\r
                 string[] strキー名 = new string[] { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", };\r
                 string strレーン名 = "* Disuse *";\r
+                               bool b裏チャンネル = false;\r
                 switch ( i )\r
                 {\r
                     case 35 : str楽器名 = "Bass Drum 2"; strレーン名 = "BD"; break;\r
@@ -72,22 +101,22 @@ namespace DTXCreator.MIDIインポート
                     case 41 : str楽器名 = "Low Tom 2"; strレーン名 = "FT"; break;\r
                     case 42 : str楽器名 = "Closed Hi-hat"; strレーン名 = "HH"; break;\r
                     case 43 : str楽器名 = "Low Tom 1"; strレーン名 = "FT"; break;\r
-                    case 44 : str楽器名 = "Pedal Hi-hat"; strレーン名 = "SE2"; break;\r
+                    case 44 : str楽器名 = "Pedal Hi-hat"; strレーン名 = "LP"; break;\r
                     case 45 : str楽器名 = "Mid Tom 2"; strレーン名 = "LT"; break;\r
-                    case 46 : str楽器名 = "Open Hi-hat"; strレーン名 = "HH"; break;\r
+                    case 46 : str楽器名 = "Open Hi-hat"; strレーン名 = "HH"; b裏チャンネル = true; break;\r
                     case 47 : str楽器名 = "Mid Tom 1"; strレーン名 = "LT"; break;\r
                     case 48 : str楽器名 = "High Tom 2"; strレーン名 = "HT"; break;\r
                     case 49 : str楽器名 = "Crash Cymbal 1"; strレーン名 = "CY"; break;\r
                     case 50 : str楽器名 = "High Tom 1"; strレーン名 = "HT"; break;\r
-                    case 51 : str楽器名 = "Ride Cymbal 1"; strレーン名 = "CY"; break;\r
+                    case 51 : str楽器名 = "Ride Cymbal 1"; strレーン名 = "CY"; b裏チャンネル = true; break;\r
                     case 52 : str楽器名 = "Chinese Cymbal"; strレーン名 = "CY"; break;\r
-                    case 53 : str楽器名 = "Ride Bell"; strレーン名 = "CY"; break;\r
+                    case 53 : str楽器名 = "Ride Bell"; strレーン名 = "CY"; b裏チャンネル = true; break;\r
                     case 54 : str楽器名 = "Tambourine"; strレーン名 = "SE1"; break;\r
                     case 55 : str楽器名 = "Splash Cymbal"; strレーン名 = "LC"; break;\r
                     case 56 : str楽器名 = "Cowbell"; strレーン名 = "SE1"; break;\r
                     case 57 : str楽器名 = "Crash Cymbal 2"; strレーン名 = "LC"; break;\r
                     case 58 : str楽器名 = "Vibra Slap"; strレーン名 = "SE1"; break;\r
-                    case 59 : str楽器名 = "Ride Cymbal 2"; strレーン名 = "CY"; break;\r
+                    case 59 : str楽器名 = "Ride Cymbal 2"; strレーン名 = "CY"; b裏チャンネル = true; break;\r
                     case 60 : str楽器名 = "High Bongo"; break;\r
                     case 61 : str楽器名 = "Low Bongo"; break;\r
                     case 62 : str楽器名 = "Mute High Conga"; break;\r
@@ -111,34 +140,48 @@ namespace DTXCreator.MIDIインポート
                     case 80 : str楽器名 = "Mute Triangle"; break;\r
                     case 81 : str楽器名 = "Open Triangle"; break;\r
                 }\r
-                this.dataGridView1.Rows.Add( i, strキー名[i%12], strレーン名, 0, str楽器名 );\r
-                if ( i%12 == 1 || i%12 == 3 || i%12 == 6 || i%12 == 8 || i%12 == 10 ) this.dataGridView1.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 240, 248, 255 );\r
-                if ( i%12 == 0 ) this.dataGridView1.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 255, 224, 224 );\r
-                tMIDI割り当て一覧のレーン名の背景色を変更する( this.dataGridView1.RowCount-1 );\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
+                if ( i%12 == 0 ) this.dgv割り当て一覧.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 255, 224, 224 );\r
+                tMIDI割り当て一覧のレーン名の背景色を変更する( this.dgv割り当て一覧.RowCount-1 );\r
 \r
             }\r
-            this.dataGridView1.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
-            this.dataGridView1.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
-            this.dataGridView1.Columns[2].DefaultCellStyle.Font = new Font( "meiryo", 8f, FontStyle.Bold );\r
-            this.dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\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割り当て一覧.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
 \r
-            this.dataGridView1.FirstDisplayedScrollingRowIndex = 80;\r
+            this.dgv割り当て一覧.FirstDisplayedScrollingRowIndex = 81;//key35=LBDが表示される位置\r
 \r
         }\r
 \r
+        public void tMIDIチャンネル一覧を作成する()\r
+        {\r
+                       for (int i = 1; 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
+                       }\r
+                       this.b一覧準備完了 = true;\r
+                       //      dgvチャンネル一覧変更イベント復旧();     //ここでイベントを復旧してはいけない\r
+                                                                                                               //(直後にファイルを開く動作+解析動作が発生するのでそこで)\r
+                                                                                                               //ChangValueイベントが発生しファイルを開き直す動作が何度も発生してしまう\r
+               }\r
+\r
         public void tMIDIファイルを選択する()\r
         {\r
             #region [ ファイル選択 ]\r
             //-----------------\r
+\r
             OpenFileDialog dialog = new OpenFileDialog();\r
             dialog.Title = "MIDIファイルを選択";\r
             dialog.Filter = "MIDIファイル (*.mid,*.midi)|*.mid;*.midi|すべてのファイル (*.*)|*.*";\r
             dialog.FilterIndex = 1;\r
-            dialog.InitialDirectory = this.formメインフォーム.str作業フォルダ名;\r
+            dialog.InitialDirectory = this.formメインフォーム.strMIDIインポートフォルダ;\r
             DialogResult result = dialog.ShowDialog();\r
 \r
-            if (result != DialogResult.OK)\r
-                return;\r
+            if (result != DialogResult.OK) return;\r
+\r
             //-----------------\r
             #endregion\r
 \r
@@ -175,9 +218,10 @@ namespace DTXCreator.MIDIインポート
             //-----------------\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
@@ -185,11 +229,12 @@ namespace DTXCreator.MIDIインポート
             //-----------------\r
             cMIDI = new CMIDI( strファイル名 );\r
             cMIDI.formメインフォーム = this.formメインフォーム;\r
-                       cMIDI.n読み込みCh = (int)this.numericUpDownCh.Value;\r
+                       cMIDI.dgvチャンネル一覧 = this.dgvチャンネル一覧;\r
             cMIDI.tMIDIを解析する();\r
-                       cMIDI.tMIDIチップをレーンに割り当てる( this.dataGridView1 );\r
-                       this.label3.Text = "重複チップ : " + cMIDI.nMIDI重複チップ数を返す();\r
-            \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
@@ -207,176 +252,327 @@ namespace DTXCreator.MIDIインポート
             //-----------------\r
             // 各キーのノート数を表に出力する\r
             for ( int i = 0 ; i < 128 ; i++ )\r
-            {\r
-                this.dataGridView1.Rows[127-i].Cells[3].Value = cMIDI.nドラム各ノート数[i];\r
-            }\r
+                this.dgv割り当て一覧.Rows[127-i].Cells["Notes"].Value = cMIDI.nドラム各ノート数[i];\r
                        \r
             // MIDI解析内容をテキストボックスに出力する\r
             string str文字列 = "";\r
             str文字列 += "File:" + strファイル名 + "\r\n";\r
-            str文字列 += "BPM:" + cMIDI.dBPM + "\r\n";\r
+            str文字列 += "BPM:" + cMIDI.f先頭BPM + "\r\n";\r
             str文字列 += "TimeBase:" + cMIDI.n分解能 + "\r\n";\r
             str文字列 += "\r\n";\r
             \r
             foreach ( CMIDIトラック value in cMIDI.lMIDIトラック )\r
             {\r
                 str文字列 += "Track " + value.nトラック数;\r
-                str文字列 += " / Channel " + value.nチャンネル;\r
-                str文字列 += " / Name " + value.strトラック名 + "\r\n";\r
+                str文字列 += " : " + value.strトラック名 + "\r\n";\r
                 str文字列 += value.str解析内容 + "\r\n";\r
             }\r
             \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
             #endregion\r
 \r
         }\r
         \r
         // レーン名をワンクリックで開く用\r
-        private void dataGridView1_CellEnter( object sender, DataGridViewCellEventArgs e )\r
+        private void dgv割り当て一覧_CellEnter( object sender, DataGridViewCellEventArgs e )\r
         {\r
-            DataGridView dgv = (DataGridView) sender;\r
+            DataGridView dgv割り当て一覧 = (DataGridView) sender;\r
 \r
-            if ( dgv.Columns[e.ColumnIndex].Name == "DTX_Lane" && dgv.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn )\r
-            {\r
+            if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "DTX_Lane" && dgv割り当て一覧.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn )\r
                 SendKeys.Send("{F4}");\r
-            }\r
         }\r
 \r
                // レーン名を変更したら\r
-        private void dataGridView1_CellEndEdit( object sender, DataGridViewCellEventArgs e )\r
+        private void dgv割り当て一覧_CellEndEdit( object sender, DataGridViewCellEventArgs e )\r
         {\r
-            DataGridView dgv = (DataGridView) sender;\r
+            DataGridView dgv割り当て一覧 = (DataGridView) sender;\r
 \r
-            if ( dgv.Columns[e.ColumnIndex].Name == "DTX_Lane" )\r
-            {\r
+            if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "DTX_Lane" )\r
                 tMIDI割り当て一覧のレーン名の背景色を変更する( e.RowIndex );\r
-            }\r
                        \r
-            if ( cMIDI != null )\r
+            if ( cMIDI != null && this.b一覧準備完了 )\r
                        {\r
-                               cMIDI.tMIDIチップをレーンに割り当てる( this.dataGridView1 );\r
-                               this.label3.Text = "重複チップ : " + cMIDI.nMIDI重複チップ数を返す();\r
+                               cMIDI.tMIDIチップをレーンに割り当てる( dgv割り当て一覧 );\r
+                               this.label重複チップ数.Text = resource.GetString("label重複チップ数.Text") + " : " + cMIDI.n重複チップ数;\r
+                               \r
                        }\r
 \r
         }\r
-\r
+               \r
+               /// <summary>\r
+               /// レーン名変更時に呼び出される\r
+               /// </summary>\r
         private void tMIDI割り当て一覧のレーン名の背景色を変更する( int RowIndex )\r
         {\r
-                       string strレーン名 = (string)this.dataGridView1.Rows[RowIndex].Cells[2].Value;\r
+                       string strレーン名 = (string)this.dgv割り当て一覧.Rows[RowIndex].Cells["DTX_Lane"].Value;\r
             int nレーン番号 = this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( strレーン名 );\r
-            if ( nレーン番号 > 1 )\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.dataGridView1.Rows[RowIndex].Cells[2].Style.BackColor = color;\r
+                this.dgv割り当て一覧.Rows[RowIndex].Cells["DTX_Lane"].Style.BackColor = color;\r
             }\r
                        else if ( strレーン名 == "* Disuse *" )\r
                        {\r
                 Color color = Color.FromArgb( 128, 128, 128 );\r
-                this.dataGridView1.Rows[RowIndex].Cells[2].Style.BackColor = color;\r
+                this.dgv割り当て一覧.Rows[RowIndex].Cells["DTX_Lane"].Style.BackColor = color;\r
                        }\r
         }\r
 \r
         public void tMIDIインポート結果を反映する()\r
         {\r
-            if ( cMIDI != null && cMIDI.lチップ.Count > 0 )\r
+            if ( cMIDI != null && cMIDI.lMIDIイベント.Count > 0 )\r
             {\r
-                               // チップリストで、ベロシティをDTX向けに調整する\r
-                               foreach ( CMIDIイベント vMIDIチップ in cMIDI.lチップ )\r
+                               \r
+                               #region [ チップリストで、ベロシティをDTX向けに調整する ]\r
+                               foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
                                {\r
-                                       int velo = vMIDIã\83\81ã\83\83ã\83\97.nベロシティ;\r
-                                       if ( this.checkBox2.Checked ) velo = (int)(velo / 1.27);\r
-                                       if ( this.checkBox1.Checked ) velo = (int)( Math.Pow( velo, 1.5 ) / Math.Pow( 100, 0.5 ) );\r
-                                       velo = ( velo / (int)this.numericUpDown1.Value ) * (int)this.numericUpDown1.Value;\r
+                                       int velo = vMIDIã\82¤ã\83\99ã\83³ã\83\88.nベロシティ;\r
+                                       if ( this.checkBoxベロシティ最大値127.Checked ) velo = (int)(velo / 1.27);//127を最大値\r
+                                       if ( this.checkBoxベロシティカーブ調整.Checked ) velo = (int)( Math.Pow( velo, 1.5 ) / Math.Pow( 100, 0.5 ) );//ベロシティカーブ\r
+                                       velo = ( velo / (int)this.numericUpDownVOLUME間隔.Value ) * (int)this.numericUpDownVOLUME間隔.Value;\r
                                        velo = ( velo > 100 ) ? 100 : ( ( velo == 0 ) ? 1 : velo );\r
-                                       vMIDIã\83\81ã\83\83ã\83\97.nベロシティ_DTX変換後 = velo;\r
+                                       vMIDIã\82¤ã\83\99ã\83³ã\83\88.nベロシティ_DTX変換後 = velo;\r
                                }\r
+                               #endregion\r
 \r
-                               // 配置予定チップをレーン指定に沿って割り当てる\r
-                               cMIDI.tMIDIチップをレーンに割り当てる( this.dataGridView1 );\r
+                               #region [ 配置予定チップを割り当て一覧に沿ってレーンを割り当てる ]\r
+                               cMIDI.tMIDIチップをレーンに割り当てる( this.dgv割り当て一覧 );\r
+                               #endregion\r
                                \r
-                               // #WAV02を仮BGM枠に\r
+                               #region [ WAVリスト出力 ]\r
+\r
+                               #region [ #WAV02 BGM仮置き用 ]\r
                                CWAV cwav = this.formメインフォーム.mgrWAVリスト管理者.tWAVをキャッシュから検索して返す_なければ新規生成する( 2 );\r
                                cwav.strラベル名 = "BGM";\r
                                cwav.bBGMとして使用 = true;\r
                                cwav.col背景色 = Color.FromArgb( 224, 255, 224 );\r
+                               #endregion\r
                                \r
-                               // #WAV04以降を変換枠に\r
+                               #region [ #WAV04 以降をWAVリスト割り当てに使う ]\r
                                // WAVリストをソートして見やすくする\r
                                cMIDI.lMIDIWAV.Sort( nMIDIWAVSort );\r
 \r
                                int nWAVCount = 4;\r
                                int nレーン番号before = 0;\r
                                \r
-                               foreach ( CMIDIイベント vチップWAV in cMIDI.lMIDIWAV )\r
+                               foreach ( CMIDIイベント vMIDIWAV in cMIDI.lMIDIWAV )\r
                                {\r
-                                       if ( nWAVCount > 4 && nレーン番号before != vチップWAV.nレーン番号 ) nWAVCount++;\r
-                                       nレーン番号before = vチップWAV.nレーン番号;\r
-\r
-                                       cwav = this.formメインフォーム.mgrWAVリスト管理者.tWAVをキャッシュから検索して返す_なければ新規生成する( nWAVCount );\r
-                                       cwav.strファイル名 = vチップWAV.nキー.ToString() + ".ogg";\r
+                                       // ノートチップ以外をWAVリストに表示させない\r
+                                       if ( vMIDIWAV.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;\r
 \r
-                                       cwav.n音量0to100 = vチップWAV.nベロシティ_DTX変換後;\r
-                                       cwav.strラベル名 = this.formメインフォーム.mgr譜面管理者.listレーン[vチップWAV.nレーン番号].strレーン名 + " " +vチップWAV.strコメント;\r
+                                       // レーン毎に1行空ける\r
+                                       if ( nWAVCount > 4 && nレーン番号before != vMIDIWAV.nレーン番号 ) nWAVCount++;\r
+                                       nレーン番号before = vMIDIWAV.nレーン番号;\r
 \r
-                                       Color color = this.formメインフォーム.mgr譜面管理者.listレーン[vチップWAV.nレーン番号].col背景色;\r
+                                       // WAVリストに配置\r
+                                       cwav = this.formメインフォーム.mgrWAVリスト管理者.tWAVをキャッシュから検索して返す_なければ新規生成する( nWAVCount );\r
+                                       cwav.strファイル名 = vMIDIWAV.nキー.ToString() + ".ogg";\r
+                                       cwav.n音量0to100 = vMIDIWAV.nベロシティ_DTX変換後;\r
+                                       cwav.strラベル名 = this.formメインフォーム.mgr譜面管理者.listレーン[vMIDIWAV.nレーン番号].strレーン名\r
+                                               + ( vMIDIWAV.b裏チャンネル ? "*" : "" )\r
+                                               + " " + vMIDIWAV.strコメント;\r
+\r
+                                       // WAVリストの背景色を、レーンの色に合わせる\r
+                                       Color color = this.formメインフォーム.mgr譜面管理者.listレーン[vMIDIWAV.nレーン番号].col背景色;\r
                                        cwav.col背景色 = Color.FromArgb( color.R/2 + 128, color.G/2 + 128, color.B/2 + 128 );\r
 \r
-                                       // é\85\8dç½®äº\88å®\9aå\85¨ã\83\81ã\83\83ã\83\97ã\81®WAVを指定する\r
-                                       foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIã\83\81ã\83\83ã\83\97 in cMIDI.lã\83\81ã\83\83ã\83\97 )\r
+                                       // é\85\8dç½®äº\88å®\9aå\85¨ã\83\81ã\83\83ã\83\97ã\81«WAVç\95ªå\8f·を指定する\r
+                                       foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIã\82¤ã\83\99ã\83³ã\83\88 in cMIDI.lMIDIã\82¤ã\83\99ã\83³ã\83\88 )\r
                                        {\r
-                                               if ( vチップWAV.strWAV重複チェック == vMIDIチップ.strWAV重複チェック ) vMIDIチップ.nWAV = nWAVCount;\r
+                                               if ( vMIDIWAV.strWAV重複チェック == vMIDIイベント.strWAV重複チェック )\r
+                                                       vMIDIイベント.nWAV = nWAVCount;\r
                                        }\r
                                        nWAVCount ++;\r
                                }\r
-                               \r
-                               // WAVリスト強制更新\r
+                               #endregion\r
+\r
+                               #region [ WAVリスト強制更新 ]\r
                                this.formメインフォーム.listViewWAVリスト.Refresh();\r
+                               #endregion\r
 \r
-                               // BPM他情報\r
-                this.formメインフォーム.numericUpDownBPM.Value = (decimal)cMIDI.dBPM;\r
-                this.formメインフォーム.textBox曲名.Text = Path.GetFileName( cMIDI.strファイル名 );\r
-                //this.formメインフォーム.textBox自由入力欄.Text = "; DTXC MI "+Resources.DTXC_VERSION;\r
-                if ( cMIDI.nMIDI重複チップ数を返す() > 0 ) this.formメインフォーム.textBoxコメント.Text = "重複チップ : "+cMIDI.nMIDI重複チップ数を返す();\r
+                               #endregion\r
                                \r
-                               // 小節付加\r
-                               int nCurrentMaxBar = this.formメインフォーム.mgr譜面管理者.n現在の最大の小節番号を返す();                                      // ★★拍子変更対応の場合、ここも修正しないとダメよ****************\r
-                               UInt32 nMaxBar = cMIDI.pMIDIチップで一番遅い時間のチップを返す().n時間 * (192 / 4) / (UInt32) cMIDI.n分解能 / 384;\r
-                               for ( int i = nCurrentMaxBar + 1; i <= nMaxBar; i++ )\r
-                               {\r
-                                       this.formメインフォーム.mgr譜面管理者.dic小節.Add( i, new C小節( i ) );\r
-                               }\r
+                               #region [ 小節付加+変拍子設定 ]\r
+                               tMIDIイベントリストから小節リストを構成する( cMIDI.lMIDIイベント, cMIDI.n分解能 );\r
+                               #endregion\r
                                \r
-                               // チップ配置\r
-                foreach ( CMIDIイベント vMIDIチップ in cMIDI.lチップ )\r
+                               #region [ チップ配置 ]\r
+                               // 複数トラックへの対応のため\r
+                               cMIDI.lMIDIイベント.Sort( ( ( a, b ) => (int) a.n時間 - (int) b.n時間 ) );\r
+\r
+                               // 配置予定チップを実際に配置する\r
+                foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
                 {\r
-                                       if ( vMIDIã\83\81ã\83\83ã\83\97.b入力 )\r
+                                       if ( vMIDIã\82¤ã\83\99ã\83³ã\83\88.b入力 )\r
                                        {\r
-                                               vMIDIã\83\81ã\83\83ã\83\97.挿入( this.formメインフォーム, cMIDI.n分解能 );\r
+                                               vMIDIã\82¤ã\83\99ã\83³ã\83\88.挿入( this.formメインフォーム, cMIDI.n分解能 );\r
                                        }\r
                 }\r
+\r
+                               // BGMチップを仮置き\r
                                this.formメインフォーム.mgr譜面管理者.tチップを配置または置換する( this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BGM" ), 0, 2, 0f, false );\r
-            }\r
+                               #endregion\r
+\r
+                               #region [ 情報を入力 ]\r
+                if ( cMIDI.f先頭BPM > 0.0 ) this.formメインフォーム.numericUpDownBPM.Value = (decimal)cMIDI.f先頭BPM;\r
+                               string str曲タイトル = cMIDI.lMIDIトラック[0].strトラック名;\r
+                               if ( str曲タイトル == "" )\r
+                               {\r
+                                       str曲タイトル = Path.GetFileName( cMIDI.strファイル名 );\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
+                               #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
-               // lMIDIWAVソート用\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
-                               if ( a.nキー > b.nキー ) return -1;\r
-                               else if ( a.nキー < b.nキー ) return 1;\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
-                                       if ( a.nベロシティ > b.nベロシティ ) return -1;\r
-                                       else if ( a.nベロシティ < b.nベロシティ ) return 1;\r
-                                       else return 0;\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
+               private struct barlen\r
+               {\r
+                       public int n時間;\r
+                       public int n分子;\r
+                       public int n分母;\r
+\r
+                       public barlen( int _n時間, int _n分子, int _n分母 )\r
+                       {\r
+                               n時間 = _n時間;\r
+                               n分子 = _n分子;\r
+                               n分母 = _n分母;\r
+                       }\r
+               }\r
         \r
-    }\r
+               private void tMIDIイベントリストから小節リストを構成する( List<CMIDIイベント> cml, int n四分音符の分解能 )\r
+               {\r
+                       if ( cml.Count <= 0 ) return;\r
+\r
+                       // 最終拍子イベント以降、曲最後までの小節について、この先のロジックで小節長を変更するために、ダミーで最後に拍子変更のイベントを入れる。\r
+\r
+                       int n最終分子 = 1;\r
+                       int n最終分母 = 1;\r
+                       int n最終時間 = (int)cml[ cml.Count - 1 ].n時間;\r
+\r
+                       cml.Reverse();\r
+                       foreach ( CMIDIイベント cm in cml )\r
+                       {\r
+                               if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )\r
+                               {\r
+                                       n最終分子 = cm.n拍子分子;\r
+                                       n最終分母 = cm.n拍子分母;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       cml.Reverse();\r
+\r
+                       if ( n最終時間 >= 0 )\r
+                       {\r
+                               cml.Add( new CMIDIBARLen( (UInt32)n最終時間, n最終分子, n最終分母 ) );\r
+                       }\r
+\r
+                       \r
+                       this.formメインフォーム.mgr譜面管理者.dic小節.Clear();\r
+                       foreach ( CMIDIイベント cm in cml )\r
+                       {\r
+                               if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )\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
+               }\r
+       }\r
 }\r