OSDN Git Service

#28021 読込高速化試作の内、DTXファイルパースの高速化と、BMP/BMPTEX読込高速化を、コピペでtrunkに反映。チップ音読込高速化は副作用が大きすぎるため...
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Wed, 25 Apr 2012 15:37:20 +0000 (15:37 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Wed, 25 Apr 2012 15:37:20 +0000 (15:37 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@371 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs
DTXManiaプロジェクト/コード/ステージ/06.曲読み込み/CStage曲読み込み.cs
DTXManiaプロジェクト/コード/全体/CDTXMania.cs
FDK17プロジェクト/Properties/AssemblyInfo.cs
FDK17プロジェクト/コード/00.共通/CWin32.cs
FDK17プロジェクト/コード/04.グラフィック/CTexture.cs
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/FDK.dll

index 0d606ab..9838092 100644 (file)
@@ -8,6 +8,7 @@ using System.IO;
 using System.Security.Cryptography;\r
 using System.Reflection;\r
 using System.Globalization;\r
+using System.Threading;\r
 using FDK;\r
 \r
 namespace DTXMania\r
@@ -178,7 +179,38 @@ namespace DTXMania
                                        CDTX.tZZ( this.nBMP番号 ) );\r
                        }\r
                }\r
-               public class CBMP : IDisposable\r
+               public class CBMP : CBMPbase, IDisposable\r
+               {\r
+                       public CBMP()\r
+                       {\r
+                               b黒を透過する = true;     // BMPでは、黒を透過色とする\r
+                       }\r
+                       public override void PutLog( string strテクスチャファイル名 )\r
+                       {\r
+                               Trace.TraceInformation( "テクスチャを生成しました。({0})({1})({2}x{3})", this.strコメント文, strテクスチャファイル名, this.n幅, this.n高さ );\r
+                       }\r
+                       public override string ToString()\r
+                       {\r
+                               return string.Format( "CBMP{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
+                       }\r
+\r
+               }\r
+               public class CBMPTEX : CBMPbase, IDisposable\r
+               {\r
+                       public CBMPTEX()\r
+                       {\r
+                               b黒を透過する = false;    // BMPTEXでは、透過色はαで表現する\r
+                       }\r
+                       public override void PutLog( string strテクスチャファイル名 )\r
+                       {\r
+                               Trace.TraceInformation( "テクスチャを生成しました。({0})({1})(Gr:{2}x{3})(Tx:{4}x{5})", this.strコメント文, strテクスチャファイル名, this.tx画像.sz画像サイズ.Width, this.tx画像.sz画像サイズ.Height, this.tx画像.szテクスチャサイズ.Width, this.tx画像.szテクスチャサイズ.Height );\r
+                       }\r
+                       public override string ToString()\r
+                       {\r
+                               return string.Format( "CBMPTEX{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
+                       }\r
+               }\r
+               public class CBMPbase : IDisposable\r
                {\r
                        public bool bUse;\r
                        public int n番号;\r
@@ -199,20 +231,27 @@ namespace DTXMania
                                        return this.tx画像.sz画像サイズ.Width;\r
                                }\r
                        }\r
+                       public bool b黒を透過する;\r
+                       public Bitmap bitmap;\r
+\r
+                       public string GetFullPathname\r
+                       {\r
+                               get\r
+                               {\r
+                                       if ( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
+                                               return CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
+                                       else\r
+                                               return CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
+                               }\r
+                       }\r
 \r
                        public void OnDeviceCreated()\r
                        {\r
                                #region [ strテクスチャファイル名 を作成。]\r
-                               //-----------------\r
-                               string strテクスチャファイル名;\r
-                               if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
-                                       strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
-                               else\r
-                                       strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
-                               //-----------------\r
+                               string strテクスチャファイル名 = this.GetFullPathname;\r
                                #endregion\r
 \r
-                               if( !File.Exists( strテクスチャファイル名 ) )\r
+                               if ( !File.Exists( strテクスチャファイル名 ) )\r
                                {\r
                                        Trace.TraceWarning( "ファイルが存在しません。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
                                        this.tx画像 = null;\r
@@ -220,164 +259,88 @@ namespace DTXMania
                                }\r
 \r
                                // テクスチャを作成。\r
+                               byte[] txData = File.ReadAllBytes( strテクスチャファイル名 );\r
+                               this.tx画像 = CDTXMania.tテクスチャの生成( txData, b黒を透過する );\r
 \r
-                               this.tx画像 = CDTXMania.tテクスチャの生成( strテクスチャファイル名, true );\r
-\r
-                               if( this.tx画像 != null )\r
+                               if ( this.tx画像 != null )\r
                                {\r
                                        // 作成成功。\r
-\r
-                                       if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
-                                               Trace.TraceInformation( "テクスチャを生成しました。({0})({1})({2}x{3})", this.strコメント文, strテクスチャファイル名, this.n幅, this.n高さ );\r
-\r
+                                       if ( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
+                                               PutLog( strテクスチャファイル名 );\r
                                        this.bUse = true;\r
                                }\r
                                else\r
                                {\r
                                        // 作成失敗。\r
-\r
                                        Trace.TraceError( "テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
                                        this.tx画像 = null;\r
                                }\r
                        }\r
-                       public override string ToString()\r
+                       /// <summary>\r
+                       /// BGA画像のデコードをTexture()に渡す前に行う、OnDeviceCreate()\r
+                       /// </summary>\r
+                       /// <param name="bitmap">テクスチャ画像</param>\r
+                       /// <param name="strテクスチャファイル名">ファイル名</param>\r
+                       public void OnDeviceCreated( Bitmap bitmap, string strテクスチャファイル名 )\r
                        {\r
-                               return string.Format( "CBMP{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
-                       }\r
-\r
-                       #region [ IDisposable 実装 ]\r
-                       //-----------------\r
-                       public void Dispose()\r
-                       {\r
-                               if( this.bDisposed済み )\r
-                                       return;\r
-\r
-                               if( this.tx画像 != null )\r
+                               if ( bitmap != null && b黒を透過する )\r
                                {\r
-                                       #region [ strテクスチャファイル名 を作成。]\r
-                                       //-----------------\r
-                                       string strテクスチャファイル名;\r
-                                       if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
-                                               strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
-                                       else\r
-                                               strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
-                                       //-----------------\r
-                                       #endregion\r
-\r
-                                       CDTXMania.tテクスチャの解放( ref this.tx画像 );\r
-\r
-                                       if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
-                                               Trace.TraceInformation( "テクスチャを解放しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
+                                       bitmap.MakeTransparent( Color.Black );          // 黒を透過色にする\r
                                }\r
-                               this.bUse = false;\r
-\r
-                               this.bDisposed済み = true;\r
-                       }\r
-                       //-----------------\r
-                       #endregion\r
+                               this.tx画像 = CDTXMania.tテクスチャの生成( bitmap, b黒を透過する );\r
 \r
-                       #region [ private ]\r
-                       //-----------------\r
-                       private bool bDisposed済み;\r
-                       //-----------------\r
-                       #endregion\r
-               }\r
-               public class CBMPTEX : IDisposable\r
-               {\r
-                       public bool bUse;\r
-                       public int n番号;\r
-                       public string strコメント文 = "";\r
-                       public string strファイル名 = "";\r
-                       public CTexture tx画像;\r
-                       public int n高さ\r
-                       {\r
-                               get\r
-                               {\r
-                                       return this.tx画像.sz画像サイズ.Height;\r
-                               }\r
-                       }\r
-                       public int n幅\r
-                       {\r
-                               get\r
+                               if ( this.tx画像 != null )\r
                                {\r
-                                       return this.tx画像.sz画像サイズ.Width;\r
+                                       // 作成成功。\r
+                                       if ( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
+                                               PutLog( strテクスチャファイル名 );\r
+                                       this.bUse = true;\r
                                }\r
-                       }\r
-\r
-                       public void OnDeviceCreated()\r
-                       {\r
-                               #region [ strテクスチャファイル名 を作成。]\r
-                               //-----------------\r
-                               string strテクスチャファイル名;\r
-                               if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
-                                       strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
                                else\r
-                                       strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
-                               //-----------------\r
-                               #endregion\r
-\r
-                               if( !File.Exists( strテクスチャファイル名 ) )\r
                                {\r
-                                       Trace.TraceWarning( "ファイルが存在しません。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
+                                       // 作成失敗。\r
+                                       Trace.TraceError( "テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
                                        this.tx画像 = null;\r
-                                       return;\r
                                }\r
-\r
-                               // テクスチャを作成。\r
-\r
-                               this.tx画像 = CDTXMania.tテクスチャの生成( strテクスチャファイル名 );\r
-\r
-                               if( this.tx画像 != null )\r
+                               if ( bitmap != null )\r
                                {\r
-                                       // 作成成功\r
-\r
-                                       if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
-                                               Trace.TraceInformation( "テクスチャを生成しました。({0})({1})(Gr:{2}x{3})(Tx:{4}x{5})", this.strコメント文, strテクスチャファイル名, this.tx画像.sz画像サイズ.Width, this.tx画像.sz画像サイズ.Height, this.tx画像.szテクスチャサイズ.Width, this.tx画像.szテクスチャサイズ.Height );\r
-                                       this.bUse = true;\r
-                               }\r
-                               else\r
-                               {\r
-                                       // 作成失敗\r
-\r
-                                       Trace.TraceError( "テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
+                                       bitmap.Dispose();\r
                                }\r
                        }\r
-                       public override string ToString()\r
+\r
+                       public virtual void PutLog( string strテクスチャファイル名 )\r
                        {\r
-                               return string.Format( "CBMPTEX{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
                        }\r
 \r
                        #region [ IDisposable 実装 ]\r
                        //-----------------\r
                        public void Dispose()\r
                        {\r
-                               if( this.bDisposed済み )\r
+                               if ( this.bDisposed済み )\r
                                        return;\r
 \r
-                               if( this.tx画像 != null )\r
+                               if ( this.tx画像 != null )\r
                                {\r
                                        #region [ strテクスチャファイル名 を作成。]\r
                                        //-----------------\r
-                                       string strテクスチャファイル名;\r
-                                       if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
-                                               strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
-                                       else\r
-                                               strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
+                                       string strテクスチャファイル名 = this.GetFullPathname;\r
+                                       //if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )\r
+                                       //    strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;\r
+                                       //else\r
+                                       //    strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
                                        //-----------------\r
                                        #endregion\r
 \r
                                        CDTXMania.tテクスチャの解放( ref this.tx画像 );\r
 \r
-                                       if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
+                                       if ( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
                                                Trace.TraceInformation( "テクスチャを解放しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );\r
                                }\r
                                this.bUse = false;\r
 \r
                                this.bDisposed済み = true;\r
                        }\r
-                       //-----------------\r
                        #endregion\r
-\r
                        #region [ private ]\r
                        //-----------------\r
                        private bool bDisposed済み;\r
@@ -1550,44 +1513,11 @@ namespace DTXMania
                        stdgbvalue.Guitar = 0;\r
                        stdgbvalue.Bass = 0;\r
                        this.LEVEL = stdgbvalue;\r
-\r
-#if true       // 2010.12.31 yyagi #RESULTxxxのリファクタ後。ここはnew()して参照渡ししなくてもいいよね?\r
                        for (int i = 0; i < 7; i++) {\r
                                this.RESULTIMAGE[i] = "";\r
                                this.RESULTMOVIE[i] = "";\r
                                this.RESULTSOUND[i] = "";\r
                        }\r
-#else          // #RESULTxxxのリファクタ前\r
-                       STRESULT stresult4 = new STRESULT();\r
-                       STRESULT stresult = stresult4;\r
-                       stresult.SS = "";\r
-                       stresult.S = "";\r
-                       stresult.A = "";\r
-                       stresult.B = "";\r
-                       stresult.C = "";\r
-                       stresult.D = "";\r
-                       stresult.E = "";\r
-                       this.RESULTIMAGE = stresult;\r
-                       stresult4 = new STRESULT();\r
-                       STRESULT stresult2 = stresult4;\r
-                       stresult2.SS = "";\r
-                       stresult2.S = "";\r
-                       stresult2.A = "";\r
-                       stresult2.B = "";\r
-                       stresult2.C = "";\r
-                       stresult2.D = "";\r
-                       stresult2.E = "";\r
-                       this.RESULTMOVIE = stresult2;\r
-                       STRESULT stresult3 = new STRESULT();\r
-                       stresult3.SS = "";\r
-                       stresult3.S = "";\r
-                       stresult3.A = "";\r
-                       stresult3.B = "";\r
-                       stresult3.C = "";\r
-                       stresult3.D = "";\r
-                       stresult3.E = "";\r
-                       this.RESULTSOUND = stresult3;\r
-#endif\r
                        this.db再生速度 = 1.0;\r
                        this.strハッシュofDTXファイル = "";\r
                        this.bチップがある = new STチップがある();\r
@@ -1611,7 +1541,7 @@ namespace DTXMania
                        this.nRESULTMOVIE用優先順位 = new int[ 7 ];\r
                        this.nRESULTSOUND用優先順位 = new int[ 7 ];\r
 \r
-#if true       // 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ後\r
+                       #region [ 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ後 ]\r
                        STGDAPARAM[] stgdaparamArray = new STGDAPARAM[] {               // GDA->DTX conversion table\r
                                new STGDAPARAM("TC", 0x03),     new STGDAPARAM("BL", 0x02),     new STGDAPARAM("GS", 0x29),\r
                                new STGDAPARAM("DS", 0x30),     new STGDAPARAM("FI", 0x53),     new STGDAPARAM("HH", 0x11),\r
@@ -1635,314 +1565,8 @@ namespace DTXMania
                                new STGDAPARAM("B7", 0xA7),     new STGDAPARAM("BW", 0xA8),     new STGDAPARAM("G0", 0x20),\r
                                new STGDAPARAM("B0", 0xA0)\r
                        };\r
-#else  // 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ前\r
-                       STGDAPARAM[] stgdaparamArray = new STGDAPARAM[62];\r
-                       STGDAPARAM stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam = stgdaparam62;\r
-                       stgdaparam.s = "TC";\r
-                       stgdaparam.c = 3;\r
-                       stgdaparamArray[ 0 ] = stgdaparam;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam2 = stgdaparam62;\r
-                       stgdaparam2.s = "BL";\r
-                       stgdaparam2.c = 2;\r
-                       stgdaparamArray[ 1 ] = stgdaparam2;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam3 = stgdaparam62;\r
-                       stgdaparam3.s = "GS";\r
-                       stgdaparam3.c = 0x29;\r
-                       stgdaparamArray[ 2 ] = stgdaparam3;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam4 = stgdaparam62;\r
-                       stgdaparam4.s = "DS";\r
-                       stgdaparam4.c = 0x30;\r
-                       stgdaparamArray[ 3 ] = stgdaparam4;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam5 = stgdaparam62;\r
-                       stgdaparam5.s = "FI";\r
-                       stgdaparam5.c = 0x53;\r
-                       stgdaparamArray[ 4 ] = stgdaparam5;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam6 = stgdaparam62;\r
-                       stgdaparam6.s = "HH";\r
-                       stgdaparam6.c = 0x11;\r
-                       stgdaparamArray[ 5 ] = stgdaparam6;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam7 = stgdaparam62;\r
-                       stgdaparam7.s = "SD";\r
-                       stgdaparam7.c = 0x12;\r
-                       stgdaparamArray[ 6 ] = stgdaparam7;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam8 = stgdaparam62;\r
-                       stgdaparam8.s = "BD";\r
-                       stgdaparam8.c = 0x13;\r
-                       stgdaparamArray[ 7 ] = stgdaparam8;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam9 = stgdaparam62;\r
-                       stgdaparam9.s = "HT";\r
-                       stgdaparam9.c = 20;\r
-                       stgdaparamArray[ 8 ] = stgdaparam9;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam10 = stgdaparam62;\r
-                       stgdaparam10.s = "LT";\r
-                       stgdaparam10.c = 0x15;\r
-                       stgdaparamArray[ 9 ] = stgdaparam10;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam11 = stgdaparam62;\r
-                       stgdaparam11.s = "CY";\r
-                       stgdaparam11.c = 0x16;\r
-                       stgdaparamArray[ 10 ] = stgdaparam11;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam12 = stgdaparam62;\r
-                       stgdaparam12.s = "G1";\r
-                       stgdaparam12.c = 0x21;\r
-                       stgdaparamArray[ 11 ] = stgdaparam12;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam13 = stgdaparam62;\r
-                       stgdaparam13.s = "G2";\r
-                       stgdaparam13.c = 0x22;\r
-                       stgdaparamArray[ 12 ] = stgdaparam13;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam14 = stgdaparam62;\r
-                       stgdaparam14.s = "G3";\r
-                       stgdaparam14.c = 0x23;\r
-                       stgdaparamArray[ 13 ] = stgdaparam14;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam15 = stgdaparam62;\r
-                       stgdaparam15.s = "G4";\r
-                       stgdaparam15.c = 0x24;\r
-                       stgdaparamArray[ 14 ] = stgdaparam15;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam16 = stgdaparam62;\r
-                       stgdaparam16.s = "G5";\r
-                       stgdaparam16.c = 0x25;\r
-                       stgdaparamArray[ 15 ] = stgdaparam16;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam17 = stgdaparam62;\r
-                       stgdaparam17.s = "G6";\r
-                       stgdaparam17.c = 0x26;\r
-                       stgdaparamArray[ 0x10 ] = stgdaparam17;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam18 = stgdaparam62;\r
-                       stgdaparam18.s = "G7";\r
-                       stgdaparam18.c = 0x27;\r
-                       stgdaparamArray[ 0x11 ] = stgdaparam18;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam19 = stgdaparam62;\r
-                       stgdaparam19.s = "GW";\r
-                       stgdaparam19.c = 40;\r
-                       stgdaparamArray[ 0x12 ] = stgdaparam19;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam20 = stgdaparam62;\r
-                       stgdaparam20.s = "01";\r
-                       stgdaparam20.c = 0x61;\r
-                       stgdaparamArray[ 0x13 ] = stgdaparam20;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam21 = stgdaparam62;\r
-                       stgdaparam21.s = "02";\r
-                       stgdaparam21.c = 0x62;\r
-                       stgdaparamArray[ 20 ] = stgdaparam21;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam22 = stgdaparam62;\r
-                       stgdaparam22.s = "03";\r
-                       stgdaparam22.c = 0x63;\r
-                       stgdaparamArray[ 0x15 ] = stgdaparam22;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam23 = stgdaparam62;\r
-                       stgdaparam23.s = "04";\r
-                       stgdaparam23.c = 100;\r
-                       stgdaparamArray[ 0x16 ] = stgdaparam23;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam24 = stgdaparam62;\r
-                       stgdaparam24.s = "05";\r
-                       stgdaparam24.c = 0x65;\r
-                       stgdaparamArray[ 0x17 ] = stgdaparam24;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam25 = stgdaparam62;\r
-                       stgdaparam25.s = "06";\r
-                       stgdaparam25.c = 0x66;\r
-                       stgdaparamArray[ 0x18 ] = stgdaparam25;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam26 = stgdaparam62;\r
-                       stgdaparam26.s = "07";\r
-                       stgdaparam26.c = 0x67;\r
-                       stgdaparamArray[ 0x19 ] = stgdaparam26;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam27 = stgdaparam62;\r
-                       stgdaparam27.s = "08";\r
-                       stgdaparam27.c = 0x68;\r
-                       stgdaparamArray[ 0x1a ] = stgdaparam27;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam28 = stgdaparam62;\r
-                       stgdaparam28.s = "09";\r
-                       stgdaparam28.c = 0x69;\r
-                       stgdaparamArray[ 0x1b ] = stgdaparam28;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam29 = stgdaparam62;\r
-                       stgdaparam29.s = "0A";\r
-                       stgdaparam29.c = 0x70;\r
-                       stgdaparamArray[ 0x1c ] = stgdaparam29;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam30 = stgdaparam62;\r
-                       stgdaparam30.s = "0B";\r
-                       stgdaparam30.c = 0x71;\r
-                       stgdaparamArray[ 0x1d ] = stgdaparam30;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam31 = stgdaparam62;\r
-                       stgdaparam31.s = "0C";\r
-                       stgdaparam31.c = 0x72;\r
-                       stgdaparamArray[ 30 ] = stgdaparam31;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam32 = stgdaparam62;\r
-                       stgdaparam32.s = "0D";\r
-                       stgdaparam32.c = 0x73;\r
-                       stgdaparamArray[ 0x1f ] = stgdaparam32;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam33 = stgdaparam62;\r
-                       stgdaparam33.s = "0E";\r
-                       stgdaparam33.c = 0x74;\r
-                       stgdaparamArray[ 0x20 ] = stgdaparam33;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam34 = stgdaparam62;\r
-                       stgdaparam34.s = "0F";\r
-                       stgdaparam34.c = 0x75;\r
-                       stgdaparamArray[ 0x21 ] = stgdaparam34;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam35 = stgdaparam62;\r
-                       stgdaparam35.s = "10";\r
-                       stgdaparam35.c = 0x76;\r
-                       stgdaparamArray[ 0x22 ] = stgdaparam35;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam36 = stgdaparam62;\r
-                       stgdaparam36.s = "11";\r
-                       stgdaparam36.c = 0x77;\r
-                       stgdaparamArray[ 0x23 ] = stgdaparam36;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam37 = stgdaparam62;\r
-                       stgdaparam37.s = "12";\r
-                       stgdaparam37.c = 120;\r
-                       stgdaparamArray[ 0x24 ] = stgdaparam37;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam38 = stgdaparam62;\r
-                       stgdaparam38.s = "13";\r
-                       stgdaparam38.c = 0x79;\r
-                       stgdaparamArray[ 0x25 ] = stgdaparam38;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam39 = stgdaparam62;\r
-                       stgdaparam39.s = "14";\r
-                       stgdaparam39.c = 0x80;\r
-                       stgdaparamArray[ 0x26 ] = stgdaparam39;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam40 = stgdaparam62;\r
-                       stgdaparam40.s = "15";\r
-                       stgdaparam40.c = 0x81;\r
-                       stgdaparamArray[ 0x27 ] = stgdaparam40;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam41 = stgdaparam62;\r
-                       stgdaparam41.s = "16";\r
-                       stgdaparam41.c = 130;\r
-                       stgdaparamArray[ 40 ] = stgdaparam41;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam42 = stgdaparam62;\r
-                       stgdaparam42.s = "17";\r
-                       stgdaparam42.c = 0x83;\r
-                       stgdaparamArray[ 0x29 ] = stgdaparam42;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam43 = stgdaparam62;\r
-                       stgdaparam43.s = "18";\r
-                       stgdaparam43.c = 0x84;\r
-                       stgdaparamArray[ 0x2a ] = stgdaparam43;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam44 = stgdaparam62;\r
-                       stgdaparam44.s = "19";\r
-                       stgdaparam44.c = 0x85;\r
-                       stgdaparamArray[ 0x2b ] = stgdaparam44;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam45 = stgdaparam62;\r
-                       stgdaparam45.s = "1A";\r
-                       stgdaparam45.c = 0x86;\r
-                       stgdaparamArray[ 0x2c ] = stgdaparam45;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam46 = stgdaparam62;\r
-                       stgdaparam46.s = "1B";\r
-                       stgdaparam46.c = 0x87;\r
-                       stgdaparamArray[ 0x2d ] = stgdaparam46;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam47 = stgdaparam62;\r
-                       stgdaparam47.s = "1C";\r
-                       stgdaparam47.c = 0x88;\r
-                       stgdaparamArray[ 0x2e ] = stgdaparam47;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam48 = stgdaparam62;\r
-                       stgdaparam48.s = "1D";\r
-                       stgdaparam48.c = 0x89;\r
-                       stgdaparamArray[ 0x2f ] = stgdaparam48;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam49 = stgdaparam62;\r
-                       stgdaparam49.s = "1E";\r
-                       stgdaparam49.c = 0x90;\r
-                       stgdaparamArray[ 0x30 ] = stgdaparam49;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam50 = stgdaparam62;\r
-                       stgdaparam50.s = "1F";\r
-                       stgdaparam50.c = 0x91;\r
-                       stgdaparamArray[ 0x31 ] = stgdaparam50;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam51 = stgdaparam62;\r
-                       stgdaparam51.s = "20";\r
-                       stgdaparam51.c = 0x92;\r
-                       stgdaparamArray[ 50 ] = stgdaparam51;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam52 = stgdaparam62;\r
-                       stgdaparam52.s = "B1";\r
-                       stgdaparam52.c = 0xa1;\r
-                       stgdaparamArray[ 0x33 ] = stgdaparam52;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam53 = stgdaparam62;\r
-                       stgdaparam53.s = "B2";\r
-                       stgdaparam53.c = 0xa2;\r
-                       stgdaparamArray[ 0x34 ] = stgdaparam53;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam54 = stgdaparam62;\r
-                       stgdaparam54.s = "B3";\r
-                       stgdaparam54.c = 0xa3;\r
-                       stgdaparamArray[ 0x35 ] = stgdaparam54;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam55 = stgdaparam62;\r
-                       stgdaparam55.s = "B4";\r
-                       stgdaparam55.c = 0xa4;\r
-                       stgdaparamArray[ 0x36 ] = stgdaparam55;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam56 = stgdaparam62;\r
-                       stgdaparam56.s = "B5";\r
-                       stgdaparam56.c = 0xa5;\r
-                       stgdaparamArray[ 0x37 ] = stgdaparam56;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam57 = stgdaparam62;\r
-                       stgdaparam57.s = "B6";\r
-                       stgdaparam57.c = 0xa6;\r
-                       stgdaparamArray[ 0x38 ] = stgdaparam57;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam58 = stgdaparam62;\r
-                       stgdaparam58.s = "B7";\r
-                       stgdaparam58.c = 0xa7;\r
-                       stgdaparamArray[ 0x39 ] = stgdaparam58;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam59 = stgdaparam62;\r
-                       stgdaparam59.s = "BW";\r
-                       stgdaparam59.c = 0xa8;\r
-                       stgdaparamArray[ 0x3a ] = stgdaparam59;\r
-                       stgdaparam62 = new STGDAPARAM();\r
-                       STGDAPARAM stgdaparam60 = stgdaparam62;\r
-                       stgdaparam60.s = "G0";\r
-                       stgdaparam60.c = 0x20;\r
-                       stgdaparamArray[ 0x3b ] = stgdaparam60;\r
-                       STGDAPARAM stgdaparam61 = new STGDAPARAM();\r
-                       stgdaparam61.s = "B0";\r
-                       stgdaparam61.c = 160;\r
-                       stgdaparamArray[ 60 ] = stgdaparam61;\r
-#endif\r
                        this.stGDAParam = stgdaparamArray;\r
+                       #endregion\r
                        this.nBGMAdjust = 0;\r
 \r
 #if TEST_NOTEOFFMODE\r
@@ -2050,44 +1674,184 @@ namespace DTXMania
                                }\r
                        }\r
                }\r
+               #region [ BMP/BMPTEXの並列読み込み・デコード用メソッド ]\r
+               delegate void BackgroundBMPLoadAll( Dictionary<int, CBMP> listB );\r
+               static BackgroundBMPLoadAll backgroundBMPLoadAll = new BackgroundBMPLoadAll( BMPLoadAll );\r
+               delegate void BackgroundBMPTEXLoadAll( Dictionary<int, CBMPTEX> listB );\r
+               static BackgroundBMPTEXLoadAll backgroundBMPTEXLoadAll = new BackgroundBMPTEXLoadAll( BMPTEXLoadAll );\r
+               private static void LoadTexture( CBMPbase cbmp )                                                // バックグラウンドスレッドで動作する、ファイル読み込み部\r
+               {\r
+                       string filename = cbmp.GetFullPathname;\r
+                       if ( !File.Exists( filename ) )\r
+                       {\r
+                               Trace.TraceWarning( "ファイルが存在しません。({0})", filename );\r
+                               cbmp.bitmap = null;\r
+                               return;\r
+                       }\r
+                       cbmp.bitmap = new Bitmap( filename );\r
+               }\r
+               private static void BMPLoadAll( Dictionary<int, CBMP> listB )   // バックグラウンドスレッドで、テクスチャファイルをひたすら読み込んではキューに追加する\r
+               {\r
+                       //Trace.TraceInformation( "Back: ThreadID(BMPLoad)=" + Thread.CurrentThread.ManagedThreadId + ", listCount=" + listB.Count  );\r
+                       foreach ( CBMPbase cbmp in listB.Values )\r
+                       {\r
+                               LoadTexture( cbmp );\r
+                               lock ( lockQueue )\r
+                               {\r
+                                       queueCBMPbaseDone.Enqueue( cbmp );\r
+                                       //  Trace.TraceInformation( "Back: Enqueued(" + queueCBMPbaseDone.Count + "): " + cbmp.strファイル名 );\r
+                               }\r
+                               if ( queueCBMPbaseDone.Count > 8 )\r
+                               {\r
+                                       Thread.Sleep( 10 );\r
+                               }\r
+                       }\r
+               }\r
+               private static void BMPTEXLoadAll( Dictionary<int, CBMPTEX> listB )     // ダサい実装だが、Dictionary<>の中には手を出せず、妥協した\r
+               {\r
+                       //Trace.TraceInformation( "Back: ThreadID(BMPLoad)=" + Thread.CurrentThread.ManagedThreadId + ", listCount=" + listB.Count  );\r
+                       foreach ( CBMPbase cbmp in listB.Values )\r
+                       {\r
+                               LoadTexture( cbmp );\r
+                               lock ( lockQueue )\r
+                               {\r
+                                       queueCBMPbaseDone.Enqueue( cbmp );\r
+                                       //  Trace.TraceInformation( "Back: Enqueued(" + queueCBMPbaseDone.Count + "): " + cbmp.strファイル名 );\r
+                               }\r
+                               if ( queueCBMPbaseDone.Count > 8 )\r
+                               {\r
+                                       Thread.Sleep( 10 );\r
+                               }\r
+                       }\r
+               }\r
+\r
+               private static Queue<CBMPbase> queueCBMPbaseDone = new Queue<CBMPbase>();\r
+               private static object lockQueue = new object();\r
+               private static int nLoadDone;\r
+               #endregion\r
+\r
                public void tBMP_BMPTEXの読み込み()\r
                {\r
-                       if( this.listBMP != null )\r
+                       #region [ CPUコア数の取得 ]\r
+                       CWin32.SYSTEM_INFO sysInfo = new CWin32.SYSTEM_INFO();\r
+                       CWin32.GetSystemInfo( ref sysInfo );\r
+                       int nCPUCores = (int) sysInfo.dwNumberOfProcessors;\r
+                       #endregion\r
+                       #region [ BMP読み込み ]\r
+                       if ( this.listBMP != null )\r
                        {\r
-                               foreach( CBMP cbmp in this.listBMP.Values )\r
+                               if ( nCPUCores <= 1 )\r
                                {\r
-                                       cbmp.OnDeviceCreated();\r
+                                       #region [ シングルスレッドで逐次読み出し・デコード・テクスチャ定義 ]\r
+                                       foreach ( CBMP cbmp in this.listBMP.Values )\r
+                                       {\r
+                                               cbmp.OnDeviceCreated();\r
+                                       }\r
+                                       #endregion\r
+                               }\r
+                               else\r
+                               {\r
+                                       #region [ メインスレッド(テクスチャ定義)とバックグラウンドスレッド(読み出し・デコード)を並列動作させ高速化 ]\r
+                                       //Trace.TraceInformation( "Main: ThreadID(Main)=" + Thread.CurrentThread.ManagedThreadId + ", listCount=" + this.listBMP.Count );\r
+                                       nLoadDone = 0;\r
+                                       backgroundBMPLoadAll.BeginInvoke( listBMP, null, null );\r
+\r
+                                       // t.Priority = ThreadPriority.Lowest;\r
+                                       // t.Start( listBMP );\r
+                                       int c = listBMP.Count;\r
+                                       while ( nLoadDone < c )\r
+                                       {\r
+                                               if ( queueCBMPbaseDone.Count > 0 )\r
+                                               {\r
+                                                       CBMP cbmp;\r
+                                                       //Trace.TraceInformation( "Main: Lock Begin for dequeue1." );\r
+                                                       lock ( lockQueue )\r
+                                                       {\r
+                                                               cbmp = (CBMP) queueCBMPbaseDone.Dequeue();\r
+                                                               //  Trace.TraceInformation( "Main: Dequeued(" + queueCBMPbaseDone.Count + "): " + cbmp.strファイル名 );\r
+                                                       }\r
+                                                       cbmp.OnDeviceCreated( cbmp.bitmap, cbmp.GetFullPathname );\r
+                                                       nLoadDone++;\r
+                                                       //Trace.TraceInformation( "Main: OnDeviceCreated: " + cbmp.strファイル名 );\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       //Trace.TraceInformation( "Main: Sleeped.");\r
+                                                       Thread.Sleep( 5 );      // WaitOneのイベント待ちにすると、メインスレッド処理中に2個以上イベント完了したときにそれを正しく検出できなくなるので、\r
+                                               }                                               // ポーリングに逃げてしまいました。\r
+                                       }\r
+                                       #endregion\r
                                }\r
                        }\r
-                       if( this.listBMPTEX != null )\r
+                       #endregion\r
+                       #region [ BMPTEX読み込み ]\r
+                       if ( this.listBMPTEX != null )\r
                        {\r
-                               foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
+                               if ( nCPUCores <= 1 )\r
                                {\r
-                                       cbmptex.OnDeviceCreated();\r
+                                       #region [ シングルスレッドで逐次読み出し・デコード・テクスチャ定義 ]\r
+                                       foreach ( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
+                                       {\r
+                                               cbmptex.OnDeviceCreated();\r
+                                       }\r
+                                       #endregion\r
+                               }\r
+                               else\r
+                               {\r
+                                       #region [ メインスレッド(テクスチャ定義)とバックグラウンドスレッド(読み出し・デコード)を並列動作させ高速化 ]\r
+                                       //Trace.TraceInformation( "Main: ThreadID(Main)=" + Thread.CurrentThread.ManagedThreadId + ", listCount=" + this.listBMP.Count );\r
+                                       nLoadDone = 0;\r
+                                       backgroundBMPTEXLoadAll.BeginInvoke( listBMPTEX, null, null );\r
+                                       int c = listBMPTEX.Count;\r
+                                       while ( nLoadDone < c )\r
+                                       {\r
+                                               if ( queueCBMPbaseDone.Count > 0 )\r
+                                               {\r
+                                                       CBMPTEX cbmptex;\r
+                                                       //Trace.TraceInformation( "Main: Lock Begin for dequeue1." );\r
+                                                       lock ( lockQueue )\r
+                                                       {\r
+                                                               cbmptex = (CBMPTEX) queueCBMPbaseDone.Dequeue();\r
+                                                               //  Trace.TraceInformation( "Main: Dequeued(" + queueCBMPbaseDone.Count + "): " + cbmp.strファイル名 );\r
+                                                       }\r
+                                                       cbmptex.OnDeviceCreated( cbmptex.bitmap, cbmptex.GetFullPathname );\r
+                                                       nLoadDone++;\r
+                                                       //Trace.TraceInformation( "Main: OnDeviceCreated: " + cbmp.strファイル名 );\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       //Trace.TraceInformation( "Main: Sleeped.");\r
+                                                       Thread.Sleep( 5 );      // WaitOneのイベント待ちにすると、メインスレッド処理中に2個以上イベント完了したときにそれを正しく検出できなくなるので、\r
+                                               }                                               // ポーリングに逃げてしまいました。\r
+                                       }\r
+                                       #endregion\r
                                }\r
                        }\r
-                       if( !this.bヘッダのみ )\r
+                       #endregion\r
+                       if ( !this.bヘッダのみ )\r
                        {\r
-                               foreach( CChip chip in this.listChip )\r
+                               foreach ( CChip chip in this.listChip )\r
                                {\r
-                                       if( ( ( ( chip.nチャンネル番号 == 4 ) || ( chip.nチャンネル番号 == 7 ) ) || ( ( chip.nチャンネル番号 >= 0x55 ) && ( chip.nチャンネル番号 <= 0x59 ) ) ) || ( chip.nチャンネル番号 == 0x60 ) )\r
+                                       #region [ BGAPAN/BGA/BMPTEX/BMP ]\r
+                                       if ( ( ( ( chip.nチャンネル番号 == 4 ) || ( chip.nチャンネル番号 == 7 ) ) || ( ( chip.nチャンネル番号 >= 0x55 ) && ( chip.nチャンネル番号 <= 0x59 ) ) ) || ( chip.nチャンネル番号 == 0x60 ) )\r
                                        {\r
                                                chip.eBGA種別 = EBGA種別.Unknown;\r
                                                chip.rBMP = null;\r
                                                chip.rBMPTEX = null;\r
                                                chip.rBGA = null;\r
                                                chip.rBGAPan = null;\r
-                                               if( this.listBGAPAN.ContainsKey( chip.n整数値 ) )\r
+                                               #region [ BGAPAN ]\r
+                                               if ( this.listBGAPAN.ContainsKey( chip.n整数値 ) )\r
                                                {\r
                                                        CBGAPAN cbgapan = this.listBGAPAN[ chip.n整数値 ];\r
-                                                       if( this.listBMPTEX.ContainsKey( cbgapan.nBMP番号 ) && this.listBMPTEX[ cbgapan.nBMP番号 ].bUse )\r
+                                                       if ( this.listBMPTEX.ContainsKey( cbgapan.nBMP番号 ) && this.listBMPTEX[ cbgapan.nBMP番号 ].bUse )\r
                                                        {\r
                                                                chip.eBGA種別 = EBGA種別.BGAPAN;\r
                                                                chip.rBMPTEX = this.listBMPTEX[ cbgapan.nBMP番号 ];\r
                                                                chip.rBGAPan = cbgapan;\r
                                                                continue;\r
                                                        }\r
-                                                       if( this.listBMP.ContainsKey( cbgapan.nBMP番号 ) && this.listBMP[ cbgapan.nBMP番号 ].bUse )\r
+                                                       if ( this.listBMP.ContainsKey( cbgapan.nBMP番号 ) && this.listBMP[ cbgapan.nBMP番号 ].bUse )\r
                                                        {\r
                                                                chip.eBGA種別 = EBGA種別.BGAPAN;\r
                                                                chip.rBMP = this.listBMP[ cbgapan.nBMP番号 ];\r
@@ -2095,17 +1859,19 @@ namespace DTXMania
                                                                continue;\r
                                                        }\r
                                                }\r
-                                               if( this.listBGA.ContainsKey( chip.n整数値 ) )\r
+                                               #endregion\r
+                                               #region [ BGA ]\r
+                                               if ( this.listBGA.ContainsKey( chip.n整数値 ) )\r
                                                {\r
                                                        CBGA cbga = this.listBGA[ chip.n整数値 ];\r
-                                                       if( this.listBMPTEX.ContainsKey( cbga.nBMP番号 ) && this.listBMPTEX[ cbga.nBMP番号 ].bUse )\r
+                                                       if ( this.listBMPTEX.ContainsKey( cbga.nBMP番号 ) && this.listBMPTEX[ cbga.nBMP番号 ].bUse )\r
                                                        {\r
                                                                chip.eBGA種別 = EBGA種別.BGA;\r
                                                                chip.rBMPTEX = this.listBMPTEX[ cbga.nBMP番号 ];\r
                                                                chip.rBGA = cbga;\r
                                                                continue;\r
                                                        }\r
-                                                       if( this.listBMP.ContainsKey( cbga.nBMP番号 ) && this.listBMP[ cbga.nBMP番号 ].bUse )\r
+                                                       if ( this.listBMP.ContainsKey( cbga.nBMP番号 ) && this.listBMP[ cbga.nBMP番号 ].bUse )\r
                                                        {\r
                                                                chip.eBGA種別 = EBGA種別.BGA;\r
                                                                chip.rBMP = this.listBMP[ cbga.nBMP番号 ];\r
@@ -2113,37 +1879,45 @@ namespace DTXMania
                                                                continue;\r
                                                        }\r
                                                }\r
-                                               if( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )\r
+                                               #endregion\r
+                                               #region [ BMPTEX ]\r
+                                               if ( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )\r
                                                {\r
                                                        chip.eBGA種別 = EBGA種別.BMPTEX;\r
                                                        chip.rBMPTEX = this.listBMPTEX[ chip.n整数値 ];\r
                                                        continue;\r
                                                }\r
-                                               if( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )\r
+                                               #endregion\r
+                                               #region [ BMP ]\r
+                                               if ( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )\r
                                                {\r
                                                        chip.eBGA種別 = EBGA種別.BMP;\r
                                                        chip.rBMP = this.listBMP[ chip.n整数値 ];\r
                                                        continue;\r
                                                }\r
+                                               #endregion\r
                                        }\r
-                                       if( ( ( ( chip.nチャンネル番号 == 0xc4 ) || ( chip.nチャンネル番号 == 0xc7 ) ) || ( ( chip.nチャンネル番号 >= 0xd5 ) && ( chip.nチャンネル番号 <= 0xd9 ) ) ) || ( chip.nチャンネル番号 == 0xe0 ) )\r
+                                       #endregion\r
+                                       #region [ BGA入れ替え ]\r
+                                       if ( ( ( ( chip.nチャンネル番号 == 0xc4 ) || ( chip.nチャンネル番号 == 0xc7 ) ) || ( ( chip.nチャンネル番号 >= 0xd5 ) && ( chip.nチャンネル番号 <= 0xd9 ) ) ) || ( chip.nチャンネル番号 == 0xe0 ) )\r
                                        {\r
                                                chip.eBGA種別 = EBGA種別.Unknown;\r
                                                chip.rBMP = null;\r
                                                chip.rBMPTEX = null;\r
                                                chip.rBGA = null;\r
                                                chip.rBGAPan = null;\r
-                                               if( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )\r
+                                               if ( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )\r
                                                {\r
                                                        chip.eBGA種別 = EBGA種別.BMPTEX;\r
                                                        chip.rBMPTEX = this.listBMPTEX[ chip.n整数値 ];\r
                                                }\r
-                                               else if( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )\r
+                                               else if ( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )\r
                                                {\r
                                                        chip.eBGA種別 = EBGA種別.BMP;\r
                                                        chip.rBMP = this.listBMP[ chip.n整数値 ];\r
                                                }\r
                                        }\r
+                                       #endregion\r
                                }\r
                        }\r
                }\r
@@ -2521,27 +2295,27 @@ namespace DTXMania
                        this.strファイル名 = Path.GetFileName( this.strファイル名の絶対パス );\r
                        this.strフォルダ名 = Path.GetDirectoryName( this.strファイル名の絶対パス ) + @"\";\r
                        string ext = Path.GetExtension( this.strファイル名 ).ToLower();\r
-                       if( ext != null )\r
+                       if ( ext != null )\r
                        {\r
-                               if( !( ext == ".dtx" ) )\r
+                               if ( !( ext == ".dtx" ) )\r
                                {\r
-                                       if( ext == ".gda" )\r
+                                       if ( ext == ".gda" )\r
                                        {\r
                                                this.e種別 = E種別.GDA;\r
                                        }\r
-                                       else if( ext == ".g2d" )\r
+                                       else if ( ext == ".g2d" )\r
                                        {\r
                                                this.e種別 = E種別.G2D;\r
                                        }\r
-                                       else if( ext == ".bms" )\r
+                                       else if ( ext == ".bms" )\r
                                        {\r
                                                this.e種別 = E種別.BMS;\r
                                        }\r
-                                       else if( ext == ".bme" )\r
+                                       else if ( ext == ".bme" )\r
                                        {\r
                                                this.e種別 = E種別.BME;\r
                                        }\r
-                                       else if( ext == ".mid" )\r
+                                       else if ( ext == ".mid" )\r
                                        {\r
                                                this.e種別 = E種別.SMF;\r
                                        }\r
@@ -2551,12 +2325,24 @@ namespace DTXMania
                                        this.e種別 = E種別.DTX;\r
                                }\r
                        }\r
-                       if( this.e種別 != E種別.SMF )\r
+                       if ( this.e種別 != E種別.SMF )\r
                        {\r
-                               StreamReader reader = new StreamReader( strファイル名, Encoding.GetEncoding( "shift-jis" ) );\r
-                               string str2 = reader.ReadToEnd();\r
-                               reader.Close();\r
-                               this.t入力・全入力文字列から( str2, db再生速度, nBGMAdjust );\r
+                               try\r
+                               {\r
+                                       //DateTime timeBeginLoad = DateTime.Now;\r
+                                       //TimeSpan span;\r
+\r
+                                       StreamReader reader = new StreamReader( strファイル名, Encoding.GetEncoding( "shift-jis" ) );\r
+                                       string str2 = reader.ReadToEnd();\r
+                                       reader.Close();\r
+                                       //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                       //Trace.TraceInformation( "DTXfileload時間:          {0}", span.ToString() );\r
+\r
+                                       this.t入力・全入力文字列から( str2, db再生速度, nBGMAdjust );\r
+                               }\r
+                               catch\r
+                               {\r
+                               }\r
                        }\r
                        else\r
                        {\r
@@ -2569,13 +2355,22 @@ namespace DTXMania
                }\r
                public unsafe void t入力・全入力文字列から( string str全入力文字列, double db再生速度, int nBGMAdjust )\r
                {\r
-                       if( !string.IsNullOrEmpty( str全入力文字列 ) )\r
+                       //DateTime timeBeginLoad = DateTime.Now;\r
+                       //TimeSpan span;\r
+\r
+                       if ( !string.IsNullOrEmpty( str全入力文字列 ) )\r
                        {\r
+                               #region [ 改行カット ]\r
                                this.db再生速度 = db再生速度;\r
                                str全入力文字列 = str全入力文字列.Replace( Environment.NewLine, "\n" );\r
                                str全入力文字列 = str全入力文字列.Replace( '\t', ' ' );\r
                                str全入力文字列 = str全入力文字列 + "\n";\r
-                               for( int j = 0; j < 36 * 36; j++ )\r
+                               #endregion\r
+                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                               //Trace.TraceInformation( "改行カット時間:           {0}", span.ToString() );\r
+                               //timeBeginLoad = DateTime.Now;\r
+                               #region [ 初期化 ]\r
+                               for ( int j = 0; j < 36 * 36; j++ )\r
                                {\r
                                        this.n無限管理WAV[ j ] = -j;\r
                                        this.n無限管理BPM[ j ] = -j;\r
@@ -2588,34 +2383,36 @@ namespace DTXMania
                                this.bstackIFからENDIFをスキップする = new Stack<bool>();\r
                                this.bstackIFからENDIFをスキップする.Push( false );\r
                                this.n現在の乱数 = 0;\r
-                               for( int k = 0; k < 7; k++ )\r
+                               for ( int k = 0; k < 7; k++ )\r
                                {\r
                                        this.nRESULTIMAGE用優先順位[ k ] = 0;\r
                                        this.nRESULTMOVIE用優先順位[ k ] = 0;\r
                                        this.nRESULTSOUND用優先順位[ k ] = 0;\r
                                }\r
+                               #endregion\r
+                               #region [ 入力/行解析 ]\r
                                CharEnumerator ce = str全入力文字列.GetEnumerator();\r
-                               if( ce.MoveNext() )\r
+                               if ( ce.MoveNext() )\r
                                {\r
                                        this.n現在の行数 = 1;\r
                                        do\r
                                        {\r
-                                               if( !this.t入力・空白と改行をスキップする( ref ce ) )\r
+                                               if ( !this.t入力・空白と改行をスキップする( ref ce ) )\r
                                                {\r
                                                        break;\r
                                                }\r
-                                               if( ce.Current == '#' )\r
+                                               if ( ce.Current == '#' )\r
                                                {\r
-                                                       if( ce.MoveNext() )\r
+                                                       if ( ce.MoveNext() )\r
                                                        {\r
                                                                StringBuilder builder = new StringBuilder( 0x20 );\r
-                                                               if( this.t入力・コマンド文字列を抜き出す( ref ce, ref builder ) )\r
+                                                               if ( this.t入力・コマンド文字列を抜き出す( ref ce, ref builder ) )\r
                                                                {\r
                                                                        StringBuilder builder2 = new StringBuilder( 0x400 );\r
-                                                                       if( this.t入力・パラメータ文字列を抜き出す( ref ce, ref builder2 ) )\r
+                                                                       if ( this.t入力・パラメータ文字列を抜き出す( ref ce, ref builder2 ) )\r
                                                                        {\r
                                                                                StringBuilder builder3 = new StringBuilder( 0x400 );\r
-                                                                               if( this.t入力・コメント文字列を抜き出す( ref ce, ref builder3 ) )\r
+                                                                               if ( this.t入力・コメント文字列を抜き出す( ref ce, ref builder3 ) )\r
                                                                                {\r
                                                                                        this.t入力・行解析( ref builder, ref builder2, ref builder3 );\r
                                                                                        this.n現在の行数++;\r
@@ -2627,166 +2424,208 @@ namespace DTXMania
                                                        break;\r
                                                }\r
                                        }\r
-                                       while( this.t入力・コメントをスキップする( ref ce ) );\r
+                                       while ( this.t入力・コメントをスキップする( ref ce ) );\r
+                               #endregion\r
+                                       //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                       //Trace.TraceInformation( "抜き出し時間:             {0}", span.ToString() );\r
+                                       //timeBeginLoad = DateTime.Now;\r
                                        this.n無限管理WAV = null;\r
                                        this.n無限管理BPM = null;\r
                                        this.n無限管理VOL = null;\r
                                        this.n無限管理PAN = null;\r
                                        this.n無限管理SIZE = null;\r
-                                       if( !this.bヘッダのみ )\r
+                                       if ( !this.bヘッダのみ )\r
                                        {\r
-                                               int num26;\r
+                                               #region [ BPM/BMP初期化 ]\r
+                                               int ch;\r
                                                CBPM cbpm = null;\r
-                                               foreach( CBPM cbpm2 in this.listBPM.Values )\r
+                                               foreach ( CBPM cbpm2 in this.listBPM.Values )\r
                                                {\r
-                                                       if( cbpm2.n表記上の番号 == 0 )\r
+                                                       if ( cbpm2.n表記上の番号 == 0 )\r
                                                        {\r
                                                                cbpm = cbpm2;\r
                                                                break;\r
                                                        }\r
                                                }\r
-                                               if( cbpm == null )\r
+                                               if ( cbpm == null )\r
                                                {\r
                                                        cbpm = new CBPM();\r
                                                        cbpm.n内部番号 = this.n内部番号BPM1to++;\r
                                                        cbpm.n表記上の番号 = 0;\r
                                                        cbpm.dbBPM値 = 120.0;\r
                                                        this.listBPM.Add( cbpm.n内部番号, cbpm );\r
-                                                       CChip item = new CChip();\r
-                                                       item.n発声位置 = 0;\r
-                                                       item.nチャンネル番号 = 8;\r
-                                                       item.n整数値 = 0;\r
-                                                       item.n整数値・内部番号 = cbpm.n内部番号;\r
-                                                       this.listChip.Insert( 0, item );\r
+                                                       CChip chip = new CChip();\r
+                                                       chip.n発声位置 = 0;\r
+                                                       chip.nチャンネル番号 = 8;                // 拡張BPM\r
+                                                       chip.n整数値 = 0;\r
+                                                       chip.n整数値・内部番号 = cbpm.n内部番号;\r
+                                                       this.listChip.Insert( 0, chip );\r
                                                }\r
                                                else\r
                                                {\r
-                                                       CChip chip2 = new CChip();\r
-                                                       chip2.n発声位置 = 0;\r
-                                                       chip2.nチャンネル番号 = 8;\r
-                                                       chip2.n整数値 = 0;\r
-                                                       chip2.n整数値・内部番号 = cbpm.n内部番号;\r
-                                                       this.listChip.Insert( 0, chip2 );\r
+                                                       CChip chip = new CChip();\r
+                                                       chip.n発声位置 = 0;\r
+                                                       chip.nチャンネル番号 = 8;                // 拡張BPM\r
+                                                       chip.n整数値 = 0;\r
+                                                       chip.n整数値・内部番号 = cbpm.n内部番号;\r
+                                                       this.listChip.Insert( 0, chip );\r
                                                }\r
-                                               if( this.listBMP.ContainsKey( 0 ) )\r
+                                               if ( this.listBMP.ContainsKey( 0 ) )\r
                                                {\r
-                                                       CChip chip4 = new CChip();\r
-                                                       chip4.n発声位置 = 0;\r
-                                                       chip4.nチャンネル番号 = 4;\r
-                                                       chip4.n整数値 = 0;\r
-                                                       chip4.n整数値・内部番号 = 0;\r
-                                                       CChip chip3 = chip4;\r
-                                                       this.listChip.Insert( 0, chip3 );\r
+                                                       CChip chip = new CChip();\r
+                                                       chip.n発声位置 = 0;\r
+                                                       chip.nチャンネル番号 = 4;                // BGA (レイヤBGA1)\r
+                                                       chip.n整数値 = 0;\r
+                                                       chip.n整数値・内部番号 = 0;\r
+                                                       this.listChip.Insert( 0, chip );\r
                                                }\r
-                                               foreach( CWAV cwav in this.listWAV.Values )\r
+                                               #endregion\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "前準備完了時間:           {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
+                                               #region [ CWAV初期化 ]\r
+                                               foreach ( CWAV cwav in this.listWAV.Values )\r
                                                {\r
-                                                       if( cwav.nチップサイズ < 0 )\r
+                                                       if ( cwav.nチップサイズ < 0 )\r
                                                        {\r
                                                                cwav.nチップサイズ = 100;\r
                                                        }\r
-                                                       if( cwav.n位置 <= -10000 )\r
+                                                       if ( cwav.n位置 <= -10000 )\r
                                                        {\r
                                                                cwav.n位置 = 0;\r
                                                        }\r
-                                                       if( cwav.n音量 < 0 )\r
+                                                       if ( cwav.n音量 < 0 )\r
                                                        {\r
                                                                cwav.n音量 = 100;\r
                                                        }\r
                                                }\r
+                                               #endregion\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "CWAV前準備時間:           {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
                                                #region [ チップ倍率設定 ]                                               // #28145 2012.4.22 yyagi 二重ループを1重ループに変更して高速化)\r
-                                               //foreach( CWAV cwav2 in this.listWAV.Values )\r
+                                               //foreach ( CWAV cwav in this.listWAV.Values )\r
                                                //{\r
-                                               //    foreach( CChip chip5 in this.listChip )\r
+                                               //    foreach( CChip chip in this.listChip )\r
                                                //    {\r
-                                               //        if( chip5.n整数値・内部番号 == cwav2.n内部番号 )\r
+                                               //        if( chip.n整数値・内部番号 == cwav.n内部番号 )\r
                                                //        {\r
-                                               //            chip5.dbチップサイズ倍率 = ( (double) cwav2.nチップサイズ ) / 100.0;\r
+                                               //            chip.dbチップサイズ倍率 = ( (double) cwav.nチップサイズ ) / 100.0;\r
+                                               //            if (chip.nチャンネル番号 == 0x01 ) // BGMだったら\r
+                                               //            {\r
+                                               //                cwav.bIsOnBGMLane = true;\r
+                                               //            }\r
                                                //        }\r
                                                //    }\r
                                                //}\r
                                                foreach ( CChip chip in this.listChip )\r
                                                {\r
                                                        if ( this.listWAV.ContainsKey( chip.n整数値・内部番号 ) )\r
+                                                       //foreach ( CWAV cwav in this.listWAV.Values )\r
                                                        {\r
                                                                CWAV cwav = this.listWAV[ chip.n整数値・内部番号 ];\r
+                                                               //      if ( chip.n整数値・内部番号 == cwav.n内部番号 )\r
+                                                               //      {\r
                                                                chip.dbチップサイズ倍率 = ( (double) cwav.nチップサイズ ) / 100.0;\r
+                                                               //if ( chip.nチャンネル番号 == 0x01 )    // BGMだったら\r
+                                                               //{\r
+                                                               //      cwav.bIsOnBGMLane = true;\r
+                                                               //}\r
+                                                               //      }\r
                                                        }\r
                                                }\r
                                                #endregion\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "CWAV全準備時間:           {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
+                                               #region [ 必要に応じて空打ち音を0小節に定義する ]\r
                                                for ( int m = 0xb1; m <= 0xbc; m++ )                    // #28146 2012.4.21 yyagi; bb -> bc\r
                                                {\r
-                                                       foreach( CChip chip6 in this.listChip )\r
+                                                       foreach ( CChip chip in this.listChip )\r
                                                        {\r
-                                                               if( chip6.nチャンネル番号 == m )\r
+                                                               if ( chip.nチャンネル番号 == m )\r
                                                                {\r
-                                                                       CChip chip7 = new CChip();\r
-                                                                       chip7.n発声位置 = 0;\r
-                                                                       chip7.nチャンネル番号 = chip6.nチャンネル番号;\r
-                                                                       chip7.n整数値 = chip6.n整数値;\r
-                                                                       chip7.n整数値・内部番号 = chip6.n整数値・内部番号;\r
-                                                                       this.listChip.Insert( 0, chip7 );\r
+                                                                       CChip c = new CChip();\r
+                                                                       c.n発声位置 = 0;\r
+                                                                       c.nチャンネル番号 = chip.nチャンネル番号;\r
+                                                                       c.n整数値 = chip.n整数値;\r
+                                                                       c.n整数値・内部番号 = chip.n整数値・内部番号;\r
+                                                                       this.listChip.Insert( 0, c );\r
                                                                        break;\r
                                                                }\r
                                                        }\r
                                                }\r
-                                               if( this.listChip.Count > 0 )\r
+                                               #endregion\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "空打確認時間:             {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
+                                               #region [ 拍子・拍線の挿入 ]\r
+                                               if ( this.listChip.Count > 0 )\r
                                                {\r
-                                                       this.listChip.Sort();\r
-                                                       double num4 = 1.0;\r
-                                                       int num5 = ( this.listChip[ this.listChip.Count - 1 ].n発声位置 + 384 ) - ( this.listChip[ this.listChip.Count - 1 ].n発声位置 % 384 );\r
-                                                       for( int num6 = 0; num6 <= num5; num6 += 384 )\r
+                                                       this.listChip.Sort();           // 高速化のためにはこれを削りたいが、listChipの最後がn発声位置の終端である必要があるので、\r
+                                                       // 保守性確保を優先してここでのソートは残しておく\r
+                                                       // なお、093時点では、このソートを削除しても動作するようにはしてある。\r
+                                                       // (ここまでの一部チップ登録を、listChip.Add(c)から同Insert(0,c)に変更してある)\r
+                                                       // これにより、数ms程度ながらここでのソートも高速化されている。\r
+                                                       double barlength = 1.0;\r
+                                                       int nEndOfSong = ( this.listChip[ this.listChip.Count - 1 ].n発声位置 + 384 ) - ( this.listChip[ this.listChip.Count - 1 ].n発声位置 % 384 );\r
+                                                       for ( int tick384 = 0; tick384 <= nEndOfSong; tick384 += 384 )  // 小節線の挿入 (後に出てくる拍子線とループをまとめようとするなら、forループの終了条件の微妙な違いに注意が必要)\r
                                                        {\r
-                                                               CChip chip8 = new CChip();\r
-                                                               chip8.n発声位置 = num6;\r
-                                                               chip8.nチャンネル番号 = 0x50;\r
-                                                               chip8.n整数値 = 36 * 36 - 1;\r
-                                                               this.listChip.Add( chip8 );\r
+                                                               CChip chip = new CChip();\r
+                                                               chip.n発声位置 = tick384;\r
+                                                               chip.nチャンネル番号 = 0x50;     // 小節線\r
+                                                               chip.n整数値 = 36 * 36 - 1;\r
+                                                               this.listChip.Add( chip );\r
                                                        }\r
-                                                       this.listChip.Sort();\r
-                                                       int num7 = 0;\r
-                                                       int num8 = 0;\r
-                                                       for( int num9 = 0; num9 < num5; num9 += 384 )\r
+                                                       //this.listChip.Sort();                         // ここでのソートは不要。ただし最後にソートすること\r
+                                                       int nChipNo_BarLength = 0;\r
+                                                       int nChipNo_C1 = 0;\r
+                                                       for ( int tick384 = 0; tick384 < nEndOfSong; tick384 += 384 )\r
                                                        {\r
-                                                               int num10 = 0;\r
-                                                               while( ( num8 < this.listChip.Count ) && ( this.listChip[ num8 ].n発声位置 < ( num9 + 384 ) ) )\r
+                                                               int n発声位置_C1_同一小節内 = 0;\r
+                                                               while ( ( nChipNo_C1 < this.listChip.Count ) && ( this.listChip[ nChipNo_C1 ].n発声位置 < ( tick384 + 384 ) ) )\r
                                                                {\r
-                                                                       if( this.listChip[ num8 ].nチャンネル番号 == 0xc1 )\r
+                                                                       if ( this.listChip[ nChipNo_C1 ].nチャンネル番号 == 0xc1 )                               // 拍線シフトの検出\r
                                                                        {\r
-                                                                               num10 = this.listChip[ num8 ].n発声位置 - num9;\r
+                                                                               n発声位置_C1_同一小節内 = this.listChip[ nChipNo_C1 ].n発声位置 - tick384;\r
                                                                        }\r
-                                                                       num8++;\r
+                                                                       nChipNo_C1++;\r
                                                                }\r
-                                                               if( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) )\r
+                                                               if ( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) )\r
                                                                {\r
-                                                                       num4 = 1.0;\r
+                                                                       barlength = 1.0;\r
                                                                }\r
-                                                               while( ( num7 < this.listChip.Count ) && ( this.listChip[ num7 ].n発声位置 <= num9 ) )\r
+                                                               while ( ( nChipNo_BarLength < this.listChip.Count ) && ( this.listChip[ nChipNo_BarLength ].n発声位置 <= tick384 ) )\r
                                                                {\r
-                                                                       if( this.listChip[ num7 ].nチャンネル番号 == 2 )\r
+                                                                       if ( this.listChip[ nChipNo_BarLength ].nチャンネル番号 == 0x02 )                // bar lengthの検出\r
                                                                        {\r
-                                                                               num4 = this.listChip[ num7 ].db実数値;\r
+                                                                               barlength = this.listChip[ nChipNo_BarLength ].db実数値;\r
                                                                        }\r
-                                                                       num7++;\r
+                                                                       nChipNo_BarLength++;\r
                                                                }\r
-                                                               for( int num11 = 0; num11 < 100; num11++ )\r
+                                                               for ( int i = 0; i < 100; i++ )                                                         // 拍線の挿入\r
                                                                {\r
-                                                                       int num12 = (int) ( ( (double) ( 384 * num11 ) ) / ( 4.0 * num4 ) );\r
-                                                                       if( ( num12 + num10 ) >= 384 )\r
+                                                                       int tickBeat = (int) ( ( (double) ( 384 * i ) ) / ( 4.0 * barlength ) );\r
+                                                                       if ( ( tickBeat + n発声位置_C1_同一小節内 ) >= 384 )\r
                                                                        {\r
                                                                                break;\r
                                                                        }\r
-                                                                       if( ( ( num12 + num10 ) % 384 ) != 0 )\r
+                                                                       if ( ( ( tickBeat + n発声位置_C1_同一小節内 ) % 384 ) != 0 )\r
                                                                        {\r
-                                                                               CChip chip9 = new CChip();\r
-                                                                               chip9.n発声位置 = ( num9 + num12 ) + num10;\r
-                                                                               chip9.nチャンネル番号 = 0x51;\r
-                                                                               chip9.n整数値 = 36 * 36 - 1;\r
-                                                                               this.listChip.Add( chip9 );\r
+                                                                               CChip chip = new CChip();\r
+                                                                               chip.n発声位置 = tick384 + ( tickBeat + n発声位置_C1_同一小節内 );\r
+                                                                               chip.nチャンネル番号 = 0x51;                                             // beat line 拍線\r
+                                                                               chip.n整数値 = 36 * 36 - 1;\r
+                                                                               this.listChip.Add( chip );\r
                                                                        }\r
                                                                }\r
                                                        }\r
                                                        this.listChip.Sort();\r
                                                }\r
+                                               #endregion\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "拍子・拍線挿入時間:       {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
                                                #region [ C2 [拍線・小節線表示指定] の処理 ]               // #28145 2012.4.21 yyagi; 2重ループをほぼ1重にして高速化\r
                                                bool bShowBeatBarLine = true;\r
                                                for ( int i = 0; i < this.listChip.Count; i++ )\r
@@ -2814,7 +2653,7 @@ namespace DTXMania
                                                                }\r
                                                                startIndex++;   // 1つ小さく過ぎているので、戻す\r
                                                        }\r
-                                                       for ( int j = startIndex; j <= i; j++ ) \r
+                                                       for ( int j = startIndex; j <= i; j++ )\r
                                                        {\r
                                                                if ( ( ( this.listChip[ j ].nチャンネル番号 == 0x50 ) || ( this.listChip[ j ].nチャンネル番号 == 0x51 ) ) &&\r
                                                                        ( this.listChip[ j ].n整数値 == ( 36 * 36 - 1 ) ) )\r
@@ -2824,76 +2663,80 @@ namespace DTXMania
                                                        }\r
                                                }\r
                                                #endregion\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "C2 [拍線・小節線表示指定]:  {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
+                                               #region [ 発声時刻の計算 ]\r
                                                double bpm = 120.0;\r
-                                               double num15 = 1.0;\r
-                                               int num16 = 0;\r
-                                               int num17 = 0;\r
+                                               double dbBarLength = 1.0;\r
+                                               int n発声位置 = 0;\r
+                                               int ms = 0;\r
                                                int nBar = 0;\r
-                                               foreach( CChip chip10 in this.listChip )\r
+                                               foreach ( CChip chip in this.listChip )\r
                                                {\r
-                                                       chip10.n発声時刻ms = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );\r
-                                                       if( ( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) ) && ( ( num15 != 1.0 ) && ( ( chip10.n発声位置 / 384) != nBar ) ) )\r
+                                                       chip.n発声時刻ms = ms + ( (int) ( ( ( 0x271 * ( chip.n発声位置 - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                       if ( ( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) ) && ( ( dbBarLength != 1.0 ) && ( ( chip.n発声位置 / 384 ) != nBar ) ) )\r
                                                        {\r
-                                                               num16 = chip10.n発声位置;\r
-                                                               num17 = chip10.n発声時刻ms;\r
-                                                               num15 = 1.0;\r
+                                                               n発声位置 = chip.n発声位置;\r
+                                                               ms = chip.n発声時刻ms;\r
+                                                               dbBarLength = 1.0;\r
                                                        }\r
-                                                       nBar = chip10.n発声位置 / 384;\r
-                                                       num26 = chip10.nチャンネル番号;\r
-                                                       switch( num26 )\r
+                                                       nBar = chip.n発声位置 / 384;\r
+                                                       ch = chip.nチャンネル番号;\r
+                                                       switch ( ch )\r
                                                        {\r
-                                                               case 0x02:\r
+                                                               case 0x02:      // BarLength\r
                                                                        {\r
-                                                                               num16 = chip10.n発声位置;\r
-                                                                               num17 = chip10.n発声時刻ms;\r
-                                                                               num15 = chip10.db実数値;\r
+                                                                               n発声位置 = chip.n発声位置;\r
+                                                                               ms = chip.n発声時刻ms;\r
+                                                                               dbBarLength = chip.db実数値;\r
                                                                                continue;\r
                                                                        }\r
-                                                               case 0x03:\r
+                                                               case 0x03:      // BPM\r
                                                                        {\r
-                                                                               num16 = chip10.n発声位置;\r
-                                                                               num17 = chip10.n発声時刻ms;\r
-                                                                               bpm = this.BASEBPM + chip10.n整数値;\r
+                                                                               n発声位置 = chip.n発声位置;\r
+                                                                               ms = chip.n発声時刻ms;\r
+                                                                               bpm = this.BASEBPM + chip.n整数値;\r
                                                                                continue;\r
                                                                        }\r
-                                                               case 0x04:\r
-                                                               case 0x07:\r
-                                                               case 0x55:\r
-                                                               case 0x56:\r
-                                                               case 0x57:\r
-                                                               case 0x58:\r
-                                                               case 0x59:\r
-                                                               case 0x60:\r
+                                                               case 0x04:      // BGA (レイヤBGA1)\r
+                                                               case 0x07:      // レイヤBGA2\r
+                                                               case 0x55:      // レイヤBGA3\r
+                                                               case 0x56:      // レイヤBGA4\r
+                                                               case 0x57:      // レイヤBGA5\r
+                                                               case 0x58:      // レイヤBGA6\r
+                                                               case 0x59:      // レイヤBGA7\r
+                                                               case 0x60:      // レイヤBGA8\r
                                                                        break;\r
 \r
-                                                               case 0x05:\r
-                                                               case 0x06:\r
-                                                               case 0x5A:\r
-                                                               case 0x5b:\r
-                                                               case 0x5c:\r
-                                                               case 0x5d:\r
-                                                               case 0x5e:\r
-                                                               case 0x5f:\r
+                                                               case 0x05:      // Extended Object (非対応)\r
+                                                               case 0x06:      // Missアニメ (非対応)\r
+                                                               case 0x5A:      // 未定義\r
+                                                               case 0x5b:      // 未定義\r
+                                                               case 0x5c:      // 未定義\r
+                                                               case 0x5d:      // 未定義\r
+                                                               case 0x5e:      // 未定義\r
+                                                               case 0x5f:      // 未定義\r
                                                                        {\r
                                                                                continue;\r
                                                                        }\r
-                                                               case 8:\r
+                                                               case 0x08:      // 拡張BPM\r
                                                                        {\r
-                                                                               num16 = chip10.n発声位置;\r
-                                                                               num17 = chip10.n発声時刻ms;\r
-                                                                               if( this.listBPM.ContainsKey( chip10.n整数値・内部番号 ) )\r
+                                                                               n発声位置 = chip.n発声位置;\r
+                                                                               ms = chip.n発声時刻ms;\r
+                                                                               if ( this.listBPM.ContainsKey( chip.n整数値・内部番号 ) )\r
                                                                                {\r
-                                                                                       bpm = ( ( this.listBPM[ chip10.n整数値・内部番号 ].n表記上の番号 == 0 ) ? 0.0 : this.BASEBPM ) + this.listBPM[ chip10.n整数値・内部番号 ].dbBPM値;\r
+                                                                                       bpm = ( ( this.listBPM[ chip.n整数値・内部番号 ].n表記上の番号 == 0 ) ? 0.0 : this.BASEBPM ) + this.listBPM[ chip.n整数値・内部番号 ].dbBPM値;\r
                                                                                }\r
                                                                                continue;\r
                                                                        }\r
-                                                               case 0x54:\r
+                                                               case 0x54:      // 動画再生\r
                                                                        {\r
-                                                                               if( this.listAVIPAN.ContainsKey( chip10.n整数値 ) )\r
+                                                                               if ( this.listAVIPAN.ContainsKey( chip.n整数値 ) )\r
                                                                                {\r
-                                                                                       int num21 = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );\r
-                                                                                       int num22 = num17 + ( (int) ( ( ( 0x271 * ( ( chip10.n発声位置 + this.listAVIPAN[ chip10.n整数値 ].n移動時間ct ) - num16 ) ) * num15 ) / bpm ) );\r
-                                                                                       chip10.n総移動時間 = num22 - num21;\r
+                                                                                       int num21 = ms + ( (int) ( ( ( 0x271 * ( chip.n発声位置 - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                                                       int num22 = ms + ( (int) ( ( ( 0x271 * ( ( chip.n発声位置 + this.listAVIPAN[ chip.n整数値 ].n移動時間ct ) - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                                                       chip.n総移動時間 = num22 - num21;\r
                                                                                }\r
                                                                                continue;\r
                                                                        }\r
@@ -2902,49 +2745,65 @@ namespace DTXMania
                                                                                continue;\r
                                                                        }\r
                                                        }\r
-                                                       if( this.listBGAPAN.ContainsKey( chip10.n整数値 ) )\r
+                                                       if ( this.listBGAPAN.ContainsKey( chip.n整数値 ) )\r
                                                        {\r
-                                                               int num19 = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );\r
-                                                               int num20 = num17 + ( (int) ( ( ( 0x271 * ( ( chip10.n発声位置 + this.listBGAPAN[ chip10.n整数値 ].n移動時間ct ) - num16 ) ) * num15 ) / bpm ) );\r
-                                                               chip10.n総移動時間 = num20 - num19;\r
+                                                               int num19 = ms + ( (int) ( ( ( 0x271 * ( chip.n発声位置 - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                               int num20 = ms + ( (int) ( ( ( 0x271 * ( ( chip.n発声位置 + this.listBGAPAN[ chip.n整数値 ].n移動時間ct ) - n発声位置 ) ) * dbBarLength ) / bpm ) );\r
+                                                               chip.n総移動時間 = num20 - num19;\r
                                                        }\r
                                                }\r
-                                               if( this.db再生速度 > 0.0 )\r
+                                               if ( this.db再生速度 > 0.0 )\r
                                                {\r
-                                                       foreach( CChip chip11 in this.listChip )\r
+                                                       foreach ( CChip chip in this.listChip )\r
                                                        {\r
-                                                               chip11.n発声時刻ms = (int) ( ( (double) chip11.n発声時刻ms ) / this.db再生速度 );\r
+                                                               chip.n発声時刻ms = (int) ( ( (double) chip.n発声時刻ms ) / this.db再生速度 );\r
                                                        }\r
                                                }\r
+                                               #endregion\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "発声時刻計算:             {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
                                                this.nBGMAdjust = 0;\r
                                                this.t各自動再生音チップの再生時刻を変更する( nBGMAdjust );\r
-                                               for( int n = 0; n < 12; n++ )\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "再生時刻変更:             {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
+                                               #region [ 可視チップ数カウント ]\r
+                                               for ( int n = 0; n < 12; n++ )\r
                                                {\r
                                                        this.n可視チップ数[ n ] = 0;\r
                                                }\r
-                                               foreach( CChip chip12 in this.listChip )\r
+                                               foreach ( CChip chip in this.listChip )\r
                                                {\r
-                                                       int num24 = chip12.nチャンネル番号;\r
-                                                       if( ( 0x11 <= num24 ) && ( num24 <= 0x1a ) )\r
+                                                       int c = chip.nチャンネル番号;\r
+                                                       if ( ( 0x11 <= c ) && ( c <= 0x1a ) )\r
                                                        {\r
-                                                               this.n可視チップ数[ num24 - 0x11 ]++;\r
+                                                               this.n可視チップ数[ c - 0x11 ]++;\r
                                                        }\r
-                                                       if( ( 0x20 <= num24 ) && ( num24 <= 0x27 ) )\r
+                                                       if ( ( 0x20 <= c ) && ( c <= 0x27 ) )\r
                                                        {\r
                                                                this.n可視チップ数.Guitar++;\r
                                                        }\r
-                                                       if( ( 0xA0 <= num24 ) && ( num24 <= 0xa7 ) )\r
+                                                       if ( ( 0xA0 <= c ) && ( c <= 0xa7 ) )\r
                                                        {\r
                                                                this.n可視チップ数.Bass++;\r
                                                        }\r
                                                }\r
-                                               foreach( CChip chip13 in this.listChip )\r
+                                               #endregion\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "可視チップ数カウント      {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
+                                               foreach ( CChip chip in this.listChip )\r
                                                {\r
-                                                       if( ( chip13.bWAVを使うチャンネルである && this.listWAV.ContainsKey( chip13.n整数値・内部番号 ) ) && !this.listWAV[ chip13.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Contains( chip13.nチャンネル番号 ) )\r
+                                                       if ( ( chip.bWAVを使うチャンネルである && this.listWAV.ContainsKey( chip.n整数値・内部番号 ) ) && !this.listWAV[ chip.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Contains( chip.nチャンネル番号 ) )\r
                                                        {\r
-                                                               this.listWAV[ chip13.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Add( chip13.nチャンネル番号 );\r
+                                                               this.listWAV[ chip.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Add( chip.nチャンネル番号 );\r
                                                        }\r
                                                }\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "ch番号集合確認:           {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
+                                               #region [ hash値計算 ]\r
                                                byte[] buffer = null;\r
                                                try\r
                                                {\r
@@ -2953,63 +2812,67 @@ namespace DTXMania
                                                        stream.Read( buffer, 0, (int) stream.Length );\r
                                                        stream.Close();\r
                                                }\r
-                                               catch( Exception exception )\r
+                                               catch ( Exception exception )\r
                                                {\r
                                                        Trace.TraceError( exception.Message );\r
                                                        Trace.TraceError( "DTXのハッシュの計算に失敗しました。({0})", this.strファイル名の絶対パス );\r
                                                }\r
-                                               if( buffer != null )\r
+                                               if ( buffer != null )\r
                                                {\r
                                                        byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash( buffer );\r
-                                                       StringBuilder builder4 = new StringBuilder();\r
-                                                       foreach( byte num25 in buffer2 )\r
+                                                       StringBuilder sb = new StringBuilder();\r
+                                                       foreach ( byte b in buffer2 )\r
                                                        {\r
-                                                               builder4.Append( num25.ToString( "x2" ) );\r
+                                                               sb.Append( b.ToString( "x2" ) );\r
                                                        }\r
-                                                       this.strハッシュofDTXファイル = builder4.ToString();\r
+                                                       this.strハッシュofDTXファイル = sb.ToString();\r
                                                }\r
                                                else\r
                                                {\r
                                                        this.strハッシュofDTXファイル = "00000000000000000000000000000000";\r
                                                }\r
+                                               #endregion\r
+                                               //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               //Trace.TraceInformation( "hash計算:                 {0}", span.ToString() );\r
+                                               //timeBeginLoad = DateTime.Now;\r
                                                #region [ bLogDTX詳細ログ出力 ]\r
                                                if ( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )\r
                                                {\r
-                                                       foreach( CWAV cwav3 in this.listWAV.Values )\r
+                                                       foreach ( CWAV cwav in this.listWAV.Values )\r
                                                        {\r
-                                                               Trace.TraceInformation( cwav3.ToString() );\r
+                                                               Trace.TraceInformation( cwav.ToString() );\r
                                                        }\r
-                                                       foreach( CAVI cavi in this.listAVI.Values )\r
+                                                       foreach ( CAVI cavi in this.listAVI.Values )\r
                                                        {\r
                                                                Trace.TraceInformation( cavi.ToString() );\r
                                                        }\r
-                                                       foreach( CAVIPAN cavipan in this.listAVIPAN.Values )\r
+                                                       foreach ( CAVIPAN cavipan in this.listAVIPAN.Values )\r
                                                        {\r
                                                                Trace.TraceInformation( cavipan.ToString() );\r
                                                        }\r
-                                                       foreach( CBGA cbga in this.listBGA.Values )\r
+                                                       foreach ( CBGA cbga in this.listBGA.Values )\r
                                                        {\r
                                                                Trace.TraceInformation( cbga.ToString() );\r
                                                        }\r
-                                                       foreach( CBGAPAN cbgapan in this.listBGAPAN.Values )\r
+                                                       foreach ( CBGAPAN cbgapan in this.listBGAPAN.Values )\r
                                                        {\r
                                                                Trace.TraceInformation( cbgapan.ToString() );\r
                                                        }\r
-                                                       foreach( CBMP cbmp in this.listBMP.Values )\r
+                                                       foreach ( CBMP cbmp in this.listBMP.Values )\r
                                                        {\r
                                                                Trace.TraceInformation( cbmp.ToString() );\r
                                                        }\r
-                                                       foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
+                                                       foreach ( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
                                                        {\r
                                                                Trace.TraceInformation( cbmptex.ToString() );\r
                                                        }\r
-                                                       foreach( CBPM cbpm3 in this.listBPM.Values )\r
+                                                       foreach ( CBPM cbpm3 in this.listBPM.Values )\r
                                                        {\r
                                                                Trace.TraceInformation( cbpm3.ToString() );\r
                                                        }\r
-                                                       foreach( CChip chip14 in this.listChip )\r
+                                                       foreach ( CChip chip in this.listChip )\r
                                                        {\r
-                                                               Trace.TraceInformation( chip14.ToString() );\r
+                                                               Trace.TraceInformation( chip.ToString() );\r
                                                        }\r
                                                }\r
                                                #endregion\r
index ee96e48..9717e0c 100644 (file)
@@ -222,6 +222,8 @@ namespace DTXMania
 \r
                                case CStage.Eフェーズ.NOWLOADING_DTXファイルを読み込む:\r
                                        {\r
+                                               DateTime timeBeginLoad = DateTime.Now;\r
+                                               TimeSpan span;\r
                                                str = null;\r
                                                if( !CDTXMania.bコンパクトモード )\r
                                                        str = CDTXMania.stage選曲.r確定されたスコア.ファイル情報.ファイルの絶対パス;\r
@@ -240,12 +242,19 @@ namespace DTXMania
                                                Trace.TraceInformation( "FILE: {0}", new object[] { CDTXMania.DTX.strファイル名の絶対パス } );\r
                                                Trace.TraceInformation( "---------------------------" );\r
 \r
-                                               if( CDTXMania.bコンパクトモード )\r
+                                               span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               Trace.TraceInformation( "DTX読込所要時間:           {0}", span.ToString() );\r
+\r
+                                               if ( CDTXMania.bコンパクトモード )\r
                                                        CDTXMania.DTX.MIDIレベル = 1;\r
                                                else\r
                                                        CDTXMania.DTX.MIDIレベル = ( CDTXMania.stage選曲.r確定された曲.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) ? CDTXMania.stage選曲.n現在選択中の曲の難易度 : 0;\r
 \r
+                                               DateTime timeBeginLoadWAV = DateTime.Now;\r
                                                CDTXMania.DTX.tWAVの読み込み();\r
+                                               span = (TimeSpan) ( DateTime.Now - timeBeginLoadWAV );\r
+                                               Trace.TraceInformation( "WAV読込所要時間({0,4}):     {1}", CDTXMania.DTX.listWAV.Count, span.ToString() );\r
+\r
                                                CDTXMania.DTX.tギターとベースのランダム化( E楽器パート.GUITAR, CDTXMania.ConfigIni.eRandom.Guitar );\r
                                                CDTXMania.DTX.tギターとベースのランダム化( E楽器パート.BASS, CDTXMania.ConfigIni.eRandom.Bass );\r
 \r
@@ -254,11 +263,17 @@ namespace DTXMania
                                                else\r
                                                        CDTXMania.stage演奏ドラム画面.On活性化();\r
 \r
-                                               if( CDTXMania.ConfigIni.bBGA有効 )\r
+                                               DateTime timeBeginLoadBMPAVI = DateTime.Now;\r
+                                               if ( CDTXMania.ConfigIni.bBGA有効 )\r
                                                        CDTXMania.DTX.tBMP_BMPTEXの読み込み();\r
 \r
                                                if( CDTXMania.ConfigIni.bAVI有効 )\r
                                                        CDTXMania.DTX.tAVIの読み込み();\r
+                                               span = (TimeSpan) ( DateTime.Now - timeBeginLoadBMPAVI );\r
+                                               Trace.TraceInformation( "BMP/AVI読込所要時間({0,4}): {1}", ( CDTXMania.DTX.listBMP.Count + CDTXMania.DTX.listBMPTEX.Count + CDTXMania.DTX.listAVI.Count ), span.ToString() );\r
+\r
+                                               span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
+                                               Trace.TraceInformation( "総読込時間:                {0}", span.ToString() ); \r
 \r
                                                CDTXMania.Timer.t更新();\r
                                                base.eフェーズID = CStage.Eフェーズ.NOWLOADING_システムサウンドBGMの完了を待つ;\r
index 263dfae..2a46672 100644 (file)
@@ -1251,7 +1251,7 @@ for (int i = 0; i < 3; i++) {
                }\r
                public static CTexture tテクスチャの生成( string fileName, bool b黒を透過する )\r
                {\r
-                       if( app == null )\r
+                       if ( app == null )\r
                        {\r
                                return null;\r
                        }\r
@@ -1259,9 +1259,9 @@ for (int i = 0; i < 3; i++) {
                        {\r
                                return new CTexture( app.Device, fileName, TextureFormat, b黒を透過する );\r
                        }\r
-                       catch( CTextureCreateFailedException )\r
+                       catch ( CTextureCreateFailedException )\r
                        {\r
-                               Trace.TraceError( "テクスチャの生成に失敗しました。({0})", new object[] { fileName } );\r
+                               Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );\r
                                return null;\r
                        }\r
                }\r
@@ -1269,16 +1269,58 @@ for (int i = 0; i < 3; i++) {
                {\r
                        CDTXMania.t安全にDisposeする( ref tx );\r
                }\r
-               \r
+\r
+               public static CTexture tテクスチャの生成( byte[] txData )\r
+               {\r
+                       return tテクスチャの生成( txData, false );\r
+               }\r
+               public static CTexture tテクスチャの生成( byte[] txData, bool b黒を透過する )\r
+               {\r
+                       if ( app == null )\r
+                       {\r
+                               return null;\r
+                       }\r
+                       try\r
+                       {\r
+                               return new CTexture( app.Device, txData, TextureFormat, b黒を透過する );\r
+                       }\r
+                       catch ( CTextureCreateFailedException )\r
+                       {\r
+                               Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );\r
+                               return null;\r
+                       }\r
+               }\r
+\r
+               public static CTexture tテクスチャの生成( Bitmap bitmap )\r
+               {\r
+                       return tテクスチャの生成( bitmap, false );\r
+               }\r
+               public static CTexture tテクスチャの生成( Bitmap bitmap, bool b黒を透過する )\r
+               {\r
+                       if ( app == null )\r
+                       {\r
+                               return null;\r
+                       }\r
+                       try\r
+                       {\r
+                               return new CTexture( app.Device, bitmap, TextureFormat, b黒を透過する );\r
+                       }\r
+                       catch ( CTextureCreateFailedException )\r
+                       {\r
+                               Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );\r
+                               return null;\r
+                       }\r
+               }\r
+\r
                /// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>\r
                public static void t安全にDisposeする<T>( ref T obj )\r
                {\r
-                       if( obj == null )\r
+                       if ( obj == null )\r
                                return;\r
 \r
                        var d = obj as IDisposable;\r
 \r
-                       if( d != null )\r
+                       if ( d != null )\r
                                d.Dispose();\r
 \r
                        obj = default( T );\r
index 5e3a171..0090651 100644 (file)
@@ -10,7 +10,7 @@ using System.Resources;
 [assembly: AssemblyDescription("")]\r
 [assembly: AssemblyConfiguration("")]\r
 [assembly: AssemblyCompany("")]\r
-[assembly: AssemblyProduct( "FDKライブラリ ver.19" )]\r
+[assembly: AssemblyProduct( "FDKライブラリ ver.20" )]\r
 [assembly: AssemblyCopyright( "Copyright(C) 2000-2012 DTXMania Group" )]\r
 [assembly: AssemblyTrademark("")]\r
 [assembly: AssemblyCulture("")]\r
@@ -34,6 +34,6 @@ using System.Resources;
 // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \r
 // 既定値にすることができます:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion( "19.0.0.0" )]\r
-[assembly: AssemblyFileVersion( "19.0.0.0" )]\r
+[assembly: AssemblyVersion( "20.0.0.0" )]\r
+[assembly: AssemblyFileVersion( "20.0.0.0" )]\r
 [assembly: NeutralResourcesLanguageAttribute("ja-JP")]\r
index 31145ef..2dc6b9b 100644 (file)
@@ -214,6 +214,8 @@ namespace FDK
                [return: MarshalAs( UnmanagedType.Bool )]\r
                [DllImport( "user32.dll", CharSet = CharSet.Auto, SetLastError = true )]\r
                public static extern bool SystemParametersInfo( uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni );\r
+               [DllImport( "kernel32" )]\r
+               public static extern void GetSystemInfo( ref SYSTEM_INFO ptmpsi );\r
                //-----------------\r
                #endregion\r
 \r
@@ -300,6 +302,20 @@ namespace FDK
                                }\r
                        }\r
                }\r
+               [StructLayout( LayoutKind.Sequential )]\r
+               public struct SYSTEM_INFO\r
+               {\r
+                       public uint dwOemId;\r
+                       public uint dwPageSize;\r
+                       public uint lpMinimumApplicationAddress;\r
+                       public uint lpMaximumApplicationAddress;\r
+                       public uint dwActiveProcessorMask;\r
+                       public uint dwNumberOfProcessors;\r
+                       public uint dwProcessorType;\r
+                       public uint dwAllocationGranularity;\r
+                       public uint dwProcessorLevel;\r
+                       public uint dwProcessorRevision;\r
+               }\r
                //-----------------\r
                #endregion\r
 \r
index 6f09e75..8d14374 100644 (file)
@@ -75,6 +75,7 @@ namespace FDK
                        this.b加算合成 = false;\r
                        this.fZ軸中心回転 = 0f;\r
                        this.vc拡大縮小倍率 = new Vector3( 1f, 1f, 1f );\r
+                       this._txData = null;\r
                }\r
                \r
                /// <summary>\r
@@ -143,6 +144,14 @@ namespace FDK
                        : this( device, strファイル名, format, b黒を透過する, Pool.Managed )\r
                {\r
                }\r
+               public CTexture( Device device, byte[] txData, Format format, bool b黒を透過する )\r
+                       : this( device, txData, format, b黒を透過する, Pool.Managed )\r
+               {\r
+               }\r
+               public CTexture( Device device, Bitmap bitmap, Format format, bool b黒を透過する )\r
+                       : this( device, bitmap, format, b黒を透過する, Pool.Managed )\r
+               {\r
+               }\r
                \r
                /// <summary>\r
                /// <para>空のテクスチャを作成する。</para>\r
@@ -196,7 +205,7 @@ namespace FDK
                                throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n({0}x{1}, {2})", n幅, n高さ, format ) );\r
                        }\r
                }\r
-               \r
+\r
                /// <summary>\r
                /// <para>画像ファイルからテクスチャを生成する。</para>\r
                /// <para>利用可能な画像形式は、BMP, JPG, PNG, TGA, DDS, PPM, DIB, HDR, PFM のいずれか。</para>\r
@@ -213,30 +222,93 @@ namespace FDK
                public CTexture( Device device, string strファイル名, Format format, bool b黒を透過する, Pool pool )\r
                        : this()\r
                {\r
+                       MakeTexture( device, strファイル名, format, b黒を透過する, pool );\r
+               }\r
+               public void MakeTexture( Device device, string strファイル名, Format format, bool b黒を透過する, Pool pool )\r
+               {\r
+                       if ( !File.Exists( strファイル名 ) )               // #27122 2012.1.13 from: ImageInformation では FileNotFound 例外は返ってこないので、ここで自分でチェックする。わかりやすいログのために。\r
+                               throw new FileNotFoundException( string.Format( "ファイルが存在しません。\n[{0}]", strファイル名 ) );\r
+\r
+                       _txData = File.ReadAllBytes( strファイル名 );\r
+                       MakeTexture( device, _txData, format, b黒を透過する, pool );\r
+               }\r
+\r
+               public CTexture( Device device, byte[] txData, Format format, bool b黒を透過する, Pool pool )\r
+                       : this()\r
+               {\r
+                       MakeTexture( device, txData, format, b黒を透過する, pool );\r
+               }\r
+               public void MakeTexture( Device device, byte[] txData, Format format, bool b黒を透過する, Pool pool )\r
+               {\r
                        try\r
                        {\r
-                               if( !File.Exists( strファイル名 ) )                // #27122 2012.1.13 from: ImageInformation では FileNotFound 例外は返ってこないので、ここで自分でチェックする。わかりやすいログのために。\r
-                                       throw new FileNotFoundException( string.Format( "ファイルが存在しません。\n[{0}]", strファイル名 ) );\r
-\r
-                               var information = ImageInformation.FromFile( strファイル名 );\r
-                               \r
+                               var information = ImageInformation.FromMemory( txData );\r
                                this.sz画像サイズ = new Size( information.Width, information.Height );\r
-                               this.szテクスチャサイズ = this.t指定されたサイズを超えない最適なテクスチャサイズを返す( device, this.sz画像サイズ );\r
                                this.rc全画像 = new Rectangle( 0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height );\r
+                               int colorKey = ( b黒を透過する ) ? unchecked( (int) 0xFF000000 ) : 0;\r
+                               this.szテクスチャサイズ = this.t指定されたサイズを超えない最適なテクスチャサイズを返す( device, this.sz画像サイズ );\r
 #if TEST_Direct3D9Ex\r
                                pool = poolvar;\r
 #endif\r
-                               int colorKey = ( b黒を透過する ) ? unchecked( (int) 0xFF000000 ) : 0;\r
-                               this.texture = Texture.FromFile( device, strファイル名, this.sz画像サイズ.Width, this.sz画像サイズ.Height, 1, Usage.None, format, pool, Filter.Point, Filter.None, colorKey );\r
+                               //                              lock ( lockobj )\r
+                               //                              {\r
+                               //Trace.TraceInformation( "CTexture() start: " );\r
+                               this.texture = Texture.FromMemory( device, txData, this.sz画像サイズ.Width, this.sz画像サイズ.Height, 1, Usage.None, format, pool, Filter.Point, Filter.None, colorKey );\r
+                               //Trace.TraceInformation( "CTexture() end:   " );\r
+                               //                              }\r
                        }\r
                        catch\r
                        {\r
                                this.Dispose();\r
-                               throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n{0}", strファイル名 ) );\r
+                               // throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n{0}", strファイル名 ) );\r
+                               throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n" ) );\r
                        }\r
                }\r
 \r
+               public CTexture( Device device, Bitmap bitmap, Format format, bool b黒を透過する, Pool pool )\r
+                       : this()\r
+               {\r
+                       MakeTexture( device, bitmap, format, b黒を透過する, pool );\r
+               }\r
+               public void MakeTexture( Device device, Bitmap bitmap, Format format, bool b黒を透過する, Pool pool )\r
+               {\r
+                       try\r
+                       {\r
+                               this.sz画像サイズ = new Size( bitmap.Width, bitmap.Height );\r
+                               this.rc全画像 = new Rectangle( 0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height );\r
+                               int colorKey = ( b黒を透過する ) ? unchecked( (int) 0xFF000000 ) : 0;\r
+                               this.szテクスチャサイズ = this.t指定されたサイズを超えない最適なテクスチャサイズを返す( device, this.sz画像サイズ );\r
+#if TEST_Direct3D9Ex\r
+                               pool = poolvar;\r
+#endif\r
+                               //Trace.TraceInformation( "CTExture() start: " );\r
+                               unsafe  // Bitmapの内部データ(a8r8g8b8)を自前でゴリゴリコピーする\r
+                               {\r
+                                       this.texture = new Texture( device, this.sz画像サイズ.Width, this.sz画像サイズ.Height, 1, Usage.None, format, pool );\r
+                                       BitmapData srcBufData = bitmap.LockBits( new Rectangle( 0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height ), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb );\r
+                                       DataRectangle destDataRectangle = texture.LockRectangle( 0, LockFlags.None );\r
+\r
+                                       IntPtr src_scan0 = (IntPtr) ( (Int64) srcBufData.Scan0 );\r
+                                       destDataRectangle.Data.WriteRange( src_scan0, this.sz画像サイズ.Width * 4 * this.sz画像サイズ.Height );\r
 \r
+                                       //for ( int y = 0; y < this.sz画像サイズ.Height; y++ )\r
+                                       //{\r
+                                       //      IntPtr src_scan0 = (IntPtr) ( (Int64) srcBufData.Scan0 + y * srcBufData.Stride );\r
+                                       //      destDataRectangle.Data.WriteRange( src_scan0, this.sz画像サイズ.Width * 4  );\r
+                                       //}\r
+\r
+                                       texture.UnlockRectangle( 0 );\r
+                                       bitmap.UnlockBits( srcBufData );\r
+                               }\r
+                               //Trace.TraceInformation( "CTExture() End: " );\r
+                       }\r
+                       catch\r
+                       {\r
+                               this.Dispose();\r
+                               // throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n{0}", strファイル名 ) );\r
+                               throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n" ) );\r
+                       }\r
+               }\r
                // メソッド\r
 \r
                /// <summary>\r
@@ -480,6 +552,8 @@ namespace FDK
 #else\r
                        Pool.Managed;\r
 #endif\r
+               byte[] _txData;\r
+               static object lockobj = new object();\r
 \r
                private void tレンダリングステートの設定( Device device )\r
                {\r
index d6e0fe2..98717a9 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index 6a6db8a..36521c4 100644 (file)
Binary files a/実行時フォルダ/FDK.dll and b/実行時フォルダ/FDK.dll differ