OSDN Git Service

#30333 最初のノートが3小節目以降だとチップが配置されないことがあるのを修正
authorikanick <ikanick@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Tue, 5 Apr 2016 17:45:57 +0000 (17:45 +0000)
committerikanick <ikanick@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Tue, 5 Apr 2016 17:45:57 +0000 (17:45 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/branches/160321(DTXCreator%20with%20MIDI%20Import)@969 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXCreatorプロジェクト/コード/07.MIDIインポート/CMIDIインポートダイアログ.cs

index 5da544d..20ef1b4 100644 (file)
@@ -616,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
@@ -667,7 +717,7 @@ namespace DTXCreator.MIDIインポート
                                                }\r
                                        }\r
                                }\r
-                       }\r
+                       }*/\r
                }\r
 \r
                /// <summary>\r