OSDN Git Service

DTXManiaプロジェクトについて、トークンに含まれる全角中点「・」を、半角下線「_」に置換した。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 07.演奏 / CStage演奏画面共通.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Runtime;\r
5 using System.Runtime.InteropServices;\r
6 using System.Drawing;\r
7 using System.Drawing.Imaging;\r
8 using System.IO;\r
9 using System.Diagnostics;\r
10 using System.Threading;\r
11 using SlimDX;\r
12 using SlimDX.Direct3D9;\r
13 using FDK;\r
14 \r
15 namespace DTXMania\r
16 {\r
17         /// <summary>\r
18         /// 演奏画面の共通クラス (ドラム演奏画面, ギター演奏画面の継承元)\r
19         /// </summary>\r
20         internal abstract class CStage演奏画面共通 : CStage\r
21         {\r
22                 // プロパティ\r
23 \r
24                 public bool bAUTOでないチップが1つでもバーを通過した // 誰も参照していない??\r
25                 {\r
26                         get;\r
27                         protected set;\r
28                 }\r
29 \r
30                 // メソッド\r
31 \r
32                 #region [ t演奏結果を格納する_ドラム() ]\r
33                 public void t演奏結果を格納する_ドラム( out CScoreIni.C演奏記録 Drums )\r
34                 {\r
35                         Drums = new CScoreIni.C演奏記録();\r
36 \r
37                         if ( CDTXMania.DTX.bチップがある.Drums && !CDTXMania.ConfigIni.bギタレボモード )\r
38                         {\r
39                                 Drums.nスコア = (long) this.actScore.Get( E楽器パート.DRUMS );\r
40                                 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Drums, CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect, this.actCombo.n現在のコンボ数.Drums最高値, E楽器パート.DRUMS, bIsAutoPlay );\r
41                                 Drums.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect, this.nヒット数_Auto含まない.Drums.Great, this.nヒット数_Auto含まない.Drums.Good, this.nヒット数_Auto含まない.Drums.Poor, this.nヒット数_Auto含まない.Drums.Miss, E楽器パート.DRUMS, bIsAutoPlay );\r
42                                 Drums.nPerfect数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Perfect : this.nヒット数_Auto含まない.Drums.Perfect;\r
43                                 Drums.nGreat数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Great : this.nヒット数_Auto含まない.Drums.Great;\r
44                                 Drums.nGood数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Good : this.nヒット数_Auto含まない.Drums.Good;\r
45                                 Drums.nPoor数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Poor : this.nヒット数_Auto含まない.Drums.Poor;\r
46                                 Drums.nMiss数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数_Auto含む.Drums.Miss : this.nヒット数_Auto含まない.Drums.Miss;\r
47                                 Drums.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Drums.Perfect;\r
48                                 Drums.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Drums.Great;\r
49                                 Drums.nGood数_Auto含まない = this.nヒット数_Auto含まない.Drums.Good;\r
50                                 Drums.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Drums.Poor;\r
51                                 Drums.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Drums.Miss;\r
52                                 Drums.n最大コンボ数 = this.actCombo.n現在のコンボ数.Drums最高値;\r
53                                 Drums.n全チップ数 = CDTXMania.DTX.n可視チップ数.Drums;\r
54                                 for ( int i = 0; i < (int) Eレーン.MAX;  i++ )\r
55                                 {\r
56                                         Drums.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
57                                 }\r
58                                 Drums.bTight = CDTXMania.ConfigIni.bTight;\r
59                                 for ( int i = 0; i < 3; i++ )\r
60                                 {\r
61                                         Drums.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
62                                         Drums.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
63                                         Drums.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];\r
64                                         Drums.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
65                                         Drums.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
66                                         Drums.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
67                                         Drums.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
68                                         Drums.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
69                                 }\r
70                                 Drums.eDark = CDTXMania.ConfigIni.eDark;\r
71                                 Drums.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
72                                 Drums.n演奏速度分母 = 20;\r
73                                 Drums.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
74                                 Drums.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
75                                 Drums.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
76                                 Drums.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
77                                 Drums.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
78                                 Drums.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
79                                 Drums.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
80                                 Drums.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
81                                 Drums.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
82                                 Drums.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
83                                 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;\r
84                                 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;\r
85                                 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;\r
86                                 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;\r
87                                 Drums.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
88                                 Drums.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
89                                 Drums.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
90                                 Drums.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
91                                 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;\r
92                                 Drums.最終更新日時 = DateTime.Now.ToString();\r
93                                 Drums.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Drums );\r
94                         }\r
95                 }\r
96                 #endregion\r
97                 #region [ t演奏結果を格納する_ギター() ]\r
98                 public void t演奏結果を格納する_ギター( out CScoreIni.C演奏記録 Guitar )\r
99                 {\r
100                         Guitar = new CScoreIni.C演奏記録();\r
101 \r
102                         if ( CDTXMania.DTX.bチップがある.Guitar )\r
103                         {\r
104                                 Guitar.nスコア = (long) this.actScore.Get( E楽器パート.GUITAR );\r
105                                 Guitar.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Guitar, CDTXMania.DTX.n可視チップ数.Guitar, this.nヒット数_Auto含まない.Guitar.Perfect, this.actCombo.n現在のコンボ数.Guitar最高値, E楽器パート.GUITAR, bIsAutoPlay );\r
106                                 Guitar.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.DTX.n可視チップ数.Guitar, this.nヒット数_Auto含まない.Guitar.Perfect, this.nヒット数_Auto含まない.Guitar.Great, this.nヒット数_Auto含まない.Guitar.Good, this.nヒット数_Auto含まない.Guitar.Poor, this.nヒット数_Auto含まない.Guitar.Miss, E楽器パート.GUITAR, bIsAutoPlay );\r
107                                 Guitar.nPerfect数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Perfect : this.nヒット数_Auto含まない.Guitar.Perfect;\r
108                                 Guitar.nGreat数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Great : this.nヒット数_Auto含まない.Guitar.Great;\r
109                                 Guitar.nGood数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Good : this.nヒット数_Auto含まない.Guitar.Good;\r
110                                 Guitar.nPoor数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Poor : this.nヒット数_Auto含まない.Guitar.Poor;\r
111                                 Guitar.nMiss数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数_Auto含む.Guitar.Miss : this.nヒット数_Auto含まない.Guitar.Miss;\r
112                                 Guitar.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Perfect;\r
113                                 Guitar.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Great;\r
114                                 Guitar.nGood数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Good;\r
115                                 Guitar.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Poor;\r
116                                 Guitar.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Miss;\r
117                                 Guitar.n最大コンボ数 = this.actCombo.n現在のコンボ数.Guitar最高値;\r
118                                 Guitar.n全チップ数 = CDTXMania.DTX.n可視チップ数.Guitar;\r
119                                 for ( int i = 0; i < (int) Eレーン.MAX; i++ )\r
120                                 {\r
121                                         Guitar.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
122                                 }\r
123                                 Guitar.bTight = CDTXMania.ConfigIni.bTight;\r
124                                 for ( int i = 0; i < 3; i++ )\r
125                                 {\r
126                                         Guitar.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
127                                         Guitar.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
128                                         Guitar.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];\r
129                                         Guitar.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
130                                         Guitar.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
131                                         Guitar.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
132                                         Guitar.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
133                                         Guitar.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
134                                 }\r
135                                 Guitar.eDark = CDTXMania.ConfigIni.eDark;\r
136                                 Guitar.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
137                                 Guitar.n演奏速度分母 = 20;\r
138                                 Guitar.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
139                                 Guitar.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
140                                 Guitar.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
141                                 Guitar.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
142                                 Guitar.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
143                                 Guitar.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
144                                 Guitar.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
145                                 Guitar.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
146                                 Guitar.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
147                                 Guitar.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
148                                 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;\r
149                                 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;\r
150                                 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;\r
151                                 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;\r
152                                 Guitar.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
153                                 Guitar.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
154                                 Guitar.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
155                                 Guitar.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
156                                 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;\r
157                                 Guitar.最終更新日時 = DateTime.Now.ToString();\r
158                                 Guitar.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Guitar );\r
159                         }\r
160                 }\r
161                 #endregion\r
162                 #region [ t演奏結果を格納する_ベース() ]\r
163                 public void t演奏結果を格納する_ベース( out CScoreIni.C演奏記録 Bass )\r
164                 {\r
165                         Bass = new CScoreIni.C演奏記録();\r
166 \r
167                         if ( CDTXMania.DTX.bチップがある.Bass )\r
168                         {\r
169                                 Bass.nスコア = (long) this.actScore.Get( E楽器パート.BASS );\r
170                                 Bass.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Bass, CDTXMania.DTX.n可視チップ数.Bass, this.nヒット数_Auto含まない.Bass.Perfect, this.actCombo.n現在のコンボ数.Bass最高値, E楽器パート.BASS, bIsAutoPlay );\r
171                                 Bass.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.DTX.n可視チップ数.Bass, this.nヒット数_Auto含まない.Bass.Perfect, this.nヒット数_Auto含まない.Bass.Great, this.nヒット数_Auto含まない.Bass.Good, this.nヒット数_Auto含まない.Bass.Poor, this.nヒット数_Auto含まない.Bass.Miss, E楽器パート.BASS, bIsAutoPlay );\r
172                                 Bass.nPerfect数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Perfect : this.nヒット数_Auto含まない.Bass.Perfect;\r
173                                 Bass.nGreat数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Great : this.nヒット数_Auto含まない.Bass.Great;\r
174                                 Bass.nGood数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Good : this.nヒット数_Auto含まない.Bass.Good;\r
175                                 Bass.nPoor数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Poor : this.nヒット数_Auto含まない.Bass.Poor;\r
176                                 Bass.nMiss数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数_Auto含む.Bass.Miss : this.nヒット数_Auto含まない.Bass.Miss;\r
177                                 Bass.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Bass.Perfect;\r
178                                 Bass.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Bass.Great;\r
179                                 Bass.nGood数_Auto含まない = this.nヒット数_Auto含まない.Bass.Good;\r
180                                 Bass.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Bass.Poor;\r
181                                 Bass.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Bass.Miss;\r
182                                 Bass.n最大コンボ数 = this.actCombo.n現在のコンボ数.Bass最高値;\r
183                                 Bass.n全チップ数 = CDTXMania.DTX.n可視チップ数.Bass;\r
184                                 for ( int i = 0; i < (int) Eレーン.MAX; i++ )\r
185                                 {\r
186                                         Bass.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
187                                 }\r
188                                 Bass.bTight = CDTXMania.ConfigIni.bTight;\r
189                                 for ( int i = 0; i < 3; i++ )\r
190                                 {\r
191                                         Bass.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
192                                         Bass.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
193                                         Bass.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];\r
194                                         Bass.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
195                                         Bass.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
196                                         Bass.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
197                                         Bass.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
198                                         Bass.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
199                                 }\r
200                                 Bass.eDark = CDTXMania.ConfigIni.eDark;\r
201                                 Bass.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
202                                 Bass.n演奏速度分母 = 20;\r
203                                 Bass.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
204                                 Bass.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
205                                 Bass.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
206                                 Bass.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
207                                 Bass.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
208                                 Bass.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
209                                 Bass.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
210                                 Bass.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
211                                 Bass.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
212                                 Bass.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
213                                 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass;                        // #24280 2011.1.29 yyagi\r
214                                 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass;                          //\r
215                                 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass;          //\r
216                                 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass;                                    //\r
217                                 Bass.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
218                                 Bass.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
219                                 Bass.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
220                                 Bass.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
221                                 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;\r
222                                 Bass.最終更新日時 = DateTime.Now.ToString();\r
223                                 Bass.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Bass );\r
224                         }\r
225                 }\r
226                 #endregion\r
227 \r
228                 // CStage 実装\r
229 \r
230                 public override void On活性化()\r
231                 {\r
232                         listChip = CDTXMania.DTX.listChip;\r
233                         listWAV = CDTXMania.DTX.listWAV;\r
234 \r
235                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;\r
236                         this.n現在のトップChip = ( listChip.Count > 0 ) ? 0 : -1;\r
237                         this.L最後に再生したHHの実WAV番号 = new List<int>( 16 );\r
238                         this.n最後に再生したHHのチャンネル番号 = 0;\r
239                         this.n最後に再生した実WAV番号.Guitar = -1;\r
240                         this.n最後に再生した実WAV番号.Bass = -1;\r
241                         for ( int i = 0; i < 50; i++ )\r
242                         {\r
243                                 this.n最後に再生したBGMの実WAV番号[ i ] = -1;\r
244                         }\r
245                         this.r次にくるギターChip = null;\r
246                         this.r次にくるベースChip = null;\r
247                         for ( int j = 0; j < 10; j++ )\r
248                         {\r
249                                 this.r現在の空うちドラムChip[ j ] = null;\r
250                         }\r
251                         this.r現在の空うちギターChip = null;\r
252                         this.r現在の空うちベースChip = null;\r
253                         cInvisibleChip = new CInvisibleChip( CDTXMania.ConfigIni.nDisplayTimesMs, CDTXMania.ConfigIni.nFadeoutTimeMs );\r
254                         this.演奏判定ライン座標 = new C演奏判定ライン座標共通();\r
255                         for ( int k = 0; k < 3; k++ )\r
256                         {\r
257                                 //for ( int n = 0; n < 5; n++ )\r
258                                 //{\r
259                                         this.nヒット数_Auto含まない[ k ] = new CHITCOUNTOFRANK();\r
260                                         this.nヒット数_Auto含む[ k ] = new CHITCOUNTOFRANK();\r
261                                 //}\r
262                                 this.queWailing[ k ] = new Queue<CDTX.CChip>();\r
263                                 this.r現在の歓声Chip[ k ] = null;\r
264                                 cInvisibleChip.eInvisibleMode[ k ] = CDTXMania.ConfigIni.eInvisible[ k ];\r
265                                 if ( CDTXMania.DTXVmode.Enabled )\r
266                                 {\r
267                                         CDTXMania.ConfigIni.n譜面スクロール速度[ k ] = CDTXMania.ConfigIni.nViewerScrollSpeed[ k ];\r
268                                 }\r
269 \r
270                                 this.nInputAdjustTimeMs[ k ] = CDTXMania.ConfigIni.nInputAdjustTimeMs[ k ];                     // #23580 2011.1.3 yyagi\r
271                                                                                                                                                                                                         //        2011.1.7 ikanick 修正\r
272                                 //this.nJudgeLinePosY_delta[ k ] = CDTXMania.ConfigIni.nJudgeLinePosOffset[ k ];                // #31602 2013.6.23 yyagi\r
273 \r
274                                 this.演奏判定ライン座標.n判定位置[ k ] = CDTXMania.ConfigIni.e判定位置[ k ];\r
275                                 this.演奏判定ライン座標.nJudgeLinePosY_delta[ k ] = CDTXMania.ConfigIni.nJudgeLinePosOffset[ k ];\r
276                                 this.bReverse[ k ]             = CDTXMania.ConfigIni.bReverse[ k ];                                     //\r
277 \r
278                         }\r
279                         actCombo.演奏判定ライン座標 = 演奏判定ライン座標;\r
280                         for ( int i = 0; i < 3; i++ )\r
281                         {\r
282                                 this.b演奏にキーボードを使った[ i ] = false;\r
283                                 this.b演奏にジョイパッドを使った[ i ] = false;\r
284                                 this.b演奏にMIDI入力を使った[ i ] = false;\r
285                                 this.b演奏にマウスを使った[ i ] = false;\r
286                         }\r
287                         this.bAUTOでないチップが1つでもバーを通過した = false;\r
288                         cInvisibleChip.Reset();\r
289                         base.On活性化();\r
290                         this.tステータスパネルの選択();\r
291                         this.tパネル文字列の設定();\r
292                         //this.演奏判定ライン座標();\r
293 \r
294                         this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;                                                                       // #24239 2011.1.23 yyagi\r
295 \r
296                         \r
297                         //this.bIsAutoPlay.Guitar = CDTXMania.ConfigIni.bギターが全部オートプレイである;\r
298                         //this.bIsAutoPlay.Bass = CDTXMania.ConfigIni.bベースが全部オートプレイである;\r
299 //                      this.nRisky = CDTXMania.ConfigIni.nRisky;                                                                                       // #23559 2011.7.28 yyagi\r
300                         actGauge.Init( CDTXMania.ConfigIni.nRisky );                                                                    // #23559 2011.7.28 yyagi\r
301                         this.nPolyphonicSounds = CDTXMania.ConfigIni.nPoliphonicSounds;\r
302                         e判定表示優先度 = CDTXMania.ConfigIni.e判定表示優先度;\r
303 \r
304                         CDTXMania.Skin.tRemoveMixerAll();       // 効果音のストリームをミキサーから解除しておく\r
305 \r
306                         queueMixerSound = new Queue<stmixer>( 64 );\r
307                         bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );\r
308                         bUseOSTimer = CDTXMania.ConfigIni.bUseOSTimer;\r
309                         this.bPAUSE = false;\r
310                         if ( CDTXMania.DTXVmode.Enabled )\r
311                         {\r
312                                 db再生速度 = CDTXMania.DTX.dbDTXVPlaySpeed;\r
313                                 CDTXMania.ConfigIni.n演奏速度 = (int) (CDTXMania.DTX.dbDTXVPlaySpeed * 20 + 0.5 );\r
314                         }\r
315                         else\r
316                         {\r
317                                 db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;\r
318                         }\r
319                         bValidScore = ( CDTXMania.DTXVmode.Enabled ) ? false : true;\r
320 \r
321                         cWailingChip = new CWailingChip共通[ 3 ];     // 0:未使用, 1:Gutiar, 2:Bass\r
322                         if ( CDTXMania.ConfigIni.bDrums有効 )\r
323                         {\r
324                                 cWailingChip[ 1 ] = new CWailngChip_Guitar_Drum画面( ref 演奏判定ライン座標 );\r
325                                 cWailingChip[ 2 ] = new CWailngChip_Bass_Drum画面( ref 演奏判定ライン座標 );\r
326                         }\r
327                         else\r
328                         {\r
329                                 cWailingChip[ 1 ] = new CWailngChip_Guitar_GR画面( ref 演奏判定ライン座標 );\r
330                                 cWailingChip[ 2 ] = new CWailngChip_Bass_GR画面( ref 演奏判定ライン座標 );\r
331                         }\r
332 \r
333                         #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]\r
334                         foreach ( CDTX.CChip pChip in listChip )\r
335                         {\r
336 //                              Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 +  ", time=" + pChip.n発声時刻ms );\r
337                                 if ( pChip.n発声時刻ms <= 0 )\r
338                                 {\r
339                                         if ( pChip.nチャンネル番号 == 0xDA )\r
340                                         {\r
341                                                 pChip.bHit = true;\r
342 //                                              Trace.TraceInformation( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );\r
343                                                 if ( listWAV.ContainsKey( pChip.n整数値_内部番号 ) )\r
344                                                 {\r
345                                                         CDTX.CWAV wc = listWAV[ pChip.n整数値_内部番号 ];\r
346                                                         for ( int i = 0; i < nPolyphonicSounds; i++ )\r
347                                                         {\r
348                                                                 if ( wc.rSound[ i ] != null )\r
349                                                                 {\r
350                                                                         CDTXMania.Sound管理.AddMixer( wc.rSound[ i ], db再生速度, pChip.b演奏終了後も再生が続くチップである );\r
351                                                                         //AddMixer( wc.rSound[ i ] );           // 最初はqueueを介さず直接ミキサー登録する\r
352                                                                 }\r
353                                                         }\r
354                                                 }\r
355                                         }\r
356                                 }\r
357                                 else\r
358                                 {\r
359                                         break;\r
360                                 }\r
361                         }\r
362                         #endregion\r
363 \r
364                         if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え\r
365                         {\r
366                                 CDTXMania.DTX.SwapGuitarBassInfos();\r
367                         }\r
368                         this.sw = new Stopwatch();\r
369                         this.sw2 = new Stopwatch();\r
370 //                      this.gclatencymode = GCSettings.LatencyMode;\r
371 //                      GCSettings.LatencyMode = GCLatencyMode.Batch;   // 演奏画面中はGCを抑止する\r
372                 }\r
373                 public override void On非活性化()\r
374                 {\r
375                         this.L最後に再生したHHの実WAV番号.Clear();   // #23921 2011.1.4 yyagi\r
376                         this.L最後に再生したHHの実WAV番号 = null;    //\r
377                         for ( int i = 0; i < 3; i++ )\r
378                         {\r
379                                 this.queWailing[ i ].Clear();\r
380                                 this.queWailing[ i ] = null;\r
381                         }\r
382                         this.ctWailingチップ模様アニメ = null;\r
383                         this.ctチップ模様アニメ.Drums = null;\r
384                         this.ctチップ模様アニメ.Guitar = null;\r
385                         this.ctチップ模様アニメ.Bass = null;\r
386                         //listWAV.Clear();\r
387                         listWAV = null;\r
388                         listChip = null;\r
389                         queueMixerSound.Clear();\r
390                         queueMixerSound = null;\r
391                         cInvisibleChip.Dispose();\r
392                         cInvisibleChip = null;\r
393 //                      GCSettings.LatencyMode = this.gclatencymode;\r
394                         base.On非活性化();\r
395                 }\r
396                 public override void OnManagedリソースの作成()\r
397                 {\r
398                         if ( !base.b活性化してない )\r
399                         {\r
400                                 this.t背景テクスチャの生成();\r
401 \r
402                                 this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );\r
403 \r
404                                 base.OnManagedリソースの作成();\r
405                         }\r
406                 }\r
407                 public override void OnManagedリソースの解放()\r
408                 {\r
409                         if ( !base.b活性化してない )\r
410                         {\r
411                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
412 \r
413                                 CDTXMania.tテクスチャの解放( ref this.txWailing枠 );\r
414                                 base.OnManagedリソースの解放();\r
415                         }\r
416                 }\r
417 \r
418                 // その他\r
419 \r
420                 #region [ protected ]\r
421                 //-----------------\r
422                 protected class CHITCOUNTOFRANK\r
423                 {\r
424                         // Fields\r
425                         public int Good;\r
426                         public int Great;\r
427                         public int Miss;\r
428                         public int Perfect;\r
429                         public int Poor;\r
430 \r
431                         // Properties\r
432                         public int this[ int index ]\r
433                         {\r
434                                 get\r
435                                 {\r
436                                         switch ( index )\r
437                                         {\r
438                                                 case 0:\r
439                                                         return this.Perfect;\r
440 \r
441                                                 case 1:\r
442                                                         return this.Great;\r
443 \r
444                                                 case 2:\r
445                                                         return this.Good;\r
446 \r
447                                                 case 3:\r
448                                                         return this.Poor;\r
449 \r
450                                                 case 4:\r
451                                                         return this.Miss;\r
452                                         }\r
453                                         throw new IndexOutOfRangeException();\r
454                                 }\r
455                                 set\r
456                                 {\r
457                                         switch ( index )\r
458                                         {\r
459                                                 case 0:\r
460                                                         this.Perfect = value;\r
461                                                         return;\r
462 \r
463                                                 case 1:\r
464                                                         this.Great = value;\r
465                                                         return;\r
466 \r
467                                                 case 2:\r
468                                                         this.Good = value;\r
469                                                         return;\r
470 \r
471                                                 case 3:\r
472                                                         this.Poor = value;\r
473                                                         return;\r
474 \r
475                                                 case 4:\r
476                                                         this.Miss = value;\r
477                                                         return;\r
478                                         }\r
479                                         throw new IndexOutOfRangeException();\r
480                                 }\r
481                         }\r
482                 }\r
483 \r
484                 [StructLayout( LayoutKind.Sequential )]\r
485                 protected struct STKARAUCHI\r
486                 {\r
487                         public CDTX.CChip HH;\r
488                         public CDTX.CChip SD;\r
489                         public CDTX.CChip BD;\r
490                         public CDTX.CChip HT;\r
491                         public CDTX.CChip LT;\r
492                         public CDTX.CChip FT;\r
493                         public CDTX.CChip CY;\r
494                         public CDTX.CChip HHO;\r
495                         public CDTX.CChip RD;\r
496                         public CDTX.CChip LC;\r
497                         public CDTX.CChip this[ int index ]\r
498                         {\r
499                                 get\r
500                                 {\r
501                                         switch ( index )\r
502                                         {\r
503                                                 case 0:\r
504                                                         return this.HH;\r
505 \r
506                                                 case 1:\r
507                                                         return this.SD;\r
508 \r
509                                                 case 2:\r
510                                                         return this.BD;\r
511 \r
512                                                 case 3:\r
513                                                         return this.HT;\r
514 \r
515                                                 case 4:\r
516                                                         return this.LT;\r
517 \r
518                                                 case 5:\r
519                                                         return this.FT;\r
520 \r
521                                                 case 6:\r
522                                                         return this.CY;\r
523 \r
524                                                 case 7:\r
525                                                         return this.HHO;\r
526 \r
527                                                 case 8:\r
528                                                         return this.RD;\r
529 \r
530                                                 case 9:\r
531                                                         return this.LC;\r
532                                         }\r
533                                         throw new IndexOutOfRangeException();\r
534                                 }\r
535                                 set\r
536                                 {\r
537                                         switch ( index )\r
538                                         {\r
539                                                 case 0:\r
540                                                         this.HH = value;\r
541                                                         return;\r
542 \r
543                                                 case 1:\r
544                                                         this.SD = value;\r
545                                                         return;\r
546 \r
547                                                 case 2:\r
548                                                         this.BD = value;\r
549                                                         return;\r
550 \r
551                                                 case 3:\r
552                                                         this.HT = value;\r
553                                                         return;\r
554 \r
555                                                 case 4:\r
556                                                         this.LT = value;\r
557                                                         return;\r
558 \r
559                                                 case 5:\r
560                                                         this.FT = value;\r
561                                                         return;\r
562 \r
563                                                 case 6:\r
564                                                         this.CY = value;\r
565                                                         return;\r
566 \r
567                                                 case 7:\r
568                                                         this.HHO = value;\r
569                                                         return;\r
570 \r
571                                                 case 8:\r
572                                                         this.RD = value;\r
573                                                         return;\r
574 \r
575                                                 case 9:\r
576                                                         this.LC = value;\r
577                                                         return;\r
578                                         }\r
579                                         throw new IndexOutOfRangeException();\r
580                                 }\r
581                         }\r
582                 }\r
583 \r
584                 protected struct stmixer\r
585                 {\r
586                         internal bool bIsAdd;\r
587                         internal CSound csound;\r
588                         internal bool b演奏終了後も再生が続くチップである;\r
589                 };\r
590 \r
591                 protected CAct演奏AVI actAVI;\r
592                 protected CAct演奏BGA actBGA;\r
593 \r
594                 protected CAct演奏チップファイアGB actChipFireGB;\r
595                 protected CAct演奏Combo共通 actCombo;\r
596                 protected CAct演奏Danger共通 actDANGER;\r
597                 protected CActFIFOBlack actFI;\r
598                 protected CActFIFOBlack actFO;\r
599                 protected CActFIFOWhite actFOClear;\r
600                 protected CAct演奏ゲージ共通 actGauge;\r
601 \r
602                 protected CAct演奏判定文字列共通 actJudgeString;\r
603                 protected CAct演奏DrumsレーンフラッシュD actLaneFlushD;\r
604                 protected CAct演奏レーンフラッシュGB共通 actLaneFlushGB;\r
605                 protected CAct演奏パネル文字列 actPanel;\r
606                 protected CAct演奏演奏情報 actPlayInfo;\r
607                 protected CAct演奏RGB共通 actRGB;\r
608                 protected CAct演奏スコア共通 actScore;\r
609                 protected CAct演奏ステージ失敗 actStageFailed;\r
610                 protected CAct演奏ステータスパネル共通 actStatusPanels;\r
611                 protected CAct演奏WailingBonus共通 actWailingBonus;\r
612                 protected CAct演奏スクロール速度 act譜面スクロール速度;\r
613                 public    C演奏判定ライン座標共通 演奏判定ライン座標;\r
614                 protected bool bPAUSE;\r
615                 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;\r
616                 protected STDGBVALUE<bool> b演奏にキーボードを使った;\r
617                 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;\r
618                 protected STDGBVALUE<bool> b演奏にマウスを使った;\r
619                 protected CCounter ctWailingチップ模様アニメ;\r
620                 protected STDGBVALUE<CCounter> ctチップ模様アニメ;\r
621 \r
622                 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;\r
623                 protected readonly int[,] nBGAスコープチャンネルマップ = new int[ , ] { { 0xc4, 0xc7, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0 }, { 4, 7, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60 } };\r
624                 protected readonly int[] nチャンネル0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 8, 0 };\r
625                 protected readonly int[] nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };\r
626                 protected readonly int[] nパッド0Atoチャンネル0A = new int[] { 0x11, 0x12, 0x13, 20, 0x15, 0x17, 0x16, 0x18, 0x19, 0x1a };\r
627                 protected readonly int[] nパッド0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 8, 0 };        // パッド画像のヒット処理用\r
628                 protected readonly int[] nパッド0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 7, 0 };        \r
629                 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数_Auto含まない;\r
630                 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数_Auto含む;\r
631                 protected int n現在のトップChip = -1;\r
632                 protected int[] n最後に再生したBGMの実WAV番号 = new int[ 50 ];\r
633                 protected int n最後に再生したHHのチャンネル番号;\r
634                 protected List<int> L最後に再生したHHの実WAV番号;            // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.\r
635                 protected STLANEVALUE<int> n最後に再生した実WAV番号;  // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"\r
636                                                                                                                                 //                                                      into "n最後に再生した実WAV番号";\r
637 //              protected int n最後に再生した実WAV番号.GUITAR;\r
638 //              protected int n最後に再生した実WAV番号.BASS;\r
639 \r
640                 protected volatile Queue<stmixer> queueMixerSound;              // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する\r
641                 protected DateTime dtLastQueueOperation;                                //\r
642                 protected bool bIsDirectSound;                                                  //\r
643                 protected double db再生速度;\r
644                 protected bool bValidScore;\r
645 //              protected bool bDTXVmode;\r
646 //              protected STDGBVALUE<int> nJudgeLinePosY_delta;                 // #31602 2013.6.23 yyagi 表示遅延対策として、判定ラインの表示位置をずらす機能を追加する\r
647                 protected STDGBVALUE<bool> bReverse;\r
648 \r
649                 protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;\r
650                 protected STDGBVALUE<CDTX.CChip> r現在の歓声Chip;\r
651                 protected CDTX.CChip r現在の空うちギターChip;\r
652                 protected STKARAUCHI r現在の空うちドラムChip;\r
653                 protected CDTX.CChip r現在の空うちベースChip;\r
654                 protected CDTX.CChip r次にくるギターChip;\r
655                 protected CDTX.CChip r次にくるベースChip;\r
656                 protected CTexture txWailing枠;\r
657                 protected CTexture txチップ;\r
658                 protected CTexture txヒットバー;\r
659 \r
660                 protected CTexture tx背景;\r
661 \r
662                 protected STDGBVALUE<int> nInputAdjustTimeMs;           // #23580 2011.1.3 yyagi\r
663                 protected STAUTOPLAY bIsAutoPlay;               // #24239 2011.1.23 yyagi\r
664 //              protected int nRisky_InitialVar, nRiskyTime;            // #23559 2011.7.28 yyagi → CAct演奏ゲージ共通クラスに隠蔽\r
665                 protected int nPolyphonicSounds;\r
666                 protected List<CDTX.CChip> listChip;\r
667                 protected Dictionary<int, CDTX.CWAV> listWAV;\r
668                 protected CInvisibleChip cInvisibleChip;\r
669                 protected bool bUseOSTimer;\r
670                 protected E判定表示優先度 e判定表示優先度;\r
671                 protected CWailingChip共通[] cWailingChip;\r
672 \r
673                 protected Stopwatch sw;         // 2011.6.13 最適化検討用のストップウォッチ\r
674                 protected Stopwatch sw2;\r
675 //              protected GCLatencyMode gclatencymode;\r
676 \r
677                 public void AddMixer( CSound cs, bool _b演奏終了後も再生が続くチップである )\r
678                 {\r
679                         stmixer stm = new stmixer()\r
680                         {\r
681                                 bIsAdd = true,\r
682                                 csound = cs,\r
683                                 b演奏終了後も再生が続くチップである = _b演奏終了後も再生が続くチップである\r
684                         };\r
685                         queueMixerSound.Enqueue( stm );\r
686 //              Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));\r
687                 }\r
688                 public void RemoveMixer( CSound cs )\r
689                 {\r
690                         stmixer stm = new stmixer()\r
691                         {\r
692                                 bIsAdd = false,\r
693                                 csound = cs,\r
694                                 b演奏終了後も再生が続くチップである = false\r
695                         };\r
696                         queueMixerSound.Enqueue( stm );\r
697 //              Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));\r
698                 }\r
699                 public void ManageMixerQueue()\r
700                 {\r
701                         // もしサウンドの登録/削除が必要なら、実行する\r
702                         if ( queueMixerSound.Count > 0 )\r
703                         {\r
704                                 //Debug.WriteLine( "☆queueLength=" + queueMixerSound.Count );\r
705                                 DateTime dtnow = DateTime.Now;\r
706                                 TimeSpan ts = dtnow - dtLastQueueOperation;\r
707                                 if ( ts.Milliseconds > 7 )\r
708                                 {\r
709                                         for ( int i = 0; i < 2 && queueMixerSound.Count > 0; i++ )\r
710                                         {\r
711                                                 dtLastQueueOperation = dtnow;\r
712                                                 stmixer stm = queueMixerSound.Dequeue();\r
713                                                 if ( stm.bIsAdd )\r
714                                                 {\r
715                                                         CDTXMania.Sound管理.AddMixer( stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである );\r
716                                                 }\r
717                                                 else\r
718                                                 {\r
719                                                         CDTXMania.Sound管理.RemoveMixer( stm.csound );\r
720                                                 }\r
721                                         }\r
722                                 }\r
723                         }\r
724                 }\r
725 \r
726                 protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime )\r
727                 {\r
728                         if ( pChip != null )\r
729                         {\r
730                                 pChip.nLag = (int) ( nTime + nInputAdjustTime - pChip.n発声時刻ms );                // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature\r
731                                 int nDeltaTime = Math.Abs( pChip.nLag );\r
732                                 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));\r
733                                 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )\r
734                                 {\r
735                                         return E判定.Perfect;\r
736                                 }\r
737                                 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )\r
738                                 {\r
739                                         return E判定.Great;\r
740                                 }\r
741                                 if ( nDeltaTime <= CDTXMania.nGood範囲ms )\r
742                                 {\r
743                                         return E判定.Good;\r
744                                 }\r
745                                 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )\r
746                                 {\r
747                                         return E判定.Poor;\r
748                                 }\r
749                         }\r
750                         return E判定.Miss;\r
751                 }\r
752                 protected CDTX.CChip r空うちChip( E楽器パート part, Eパッド pad )\r
753                 {\r
754                         switch ( part )\r
755                         {\r
756                                 case E楽器パート.DRUMS:\r
757                                         switch ( pad )\r
758                                         {\r
759                                                 case Eパッド.HH:\r
760                                                         if ( this.r現在の空うちドラムChip.HH != null )\r
761                                                         {\r
762                                                                 return this.r現在の空うちドラムChip.HH;\r
763                                                         }\r
764                                                         if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )\r
765                                                         {\r
766                                                                 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )\r
767                                                                 {\r
768                                                                         return this.r現在の空うちドラムChip.HHO;\r
769                                                                 }\r
770                                                                 if ( this.r現在の空うちドラムChip.HHO != null )\r
771                                                                 {\r
772                                                                         return this.r現在の空うちドラムChip.HHO;\r
773                                                                 }\r
774                                                         }\r
775                                                         return this.r現在の空うちドラムChip.LC;\r
776 \r
777                                                 case Eパッド.SD:\r
778                                                         return this.r現在の空うちドラムChip.SD;\r
779 \r
780                                                 case Eパッド.BD:\r
781                                                         return this.r現在の空うちドラムChip.BD;\r
782 \r
783                                                 case Eパッド.HT:\r
784                                                         return this.r現在の空うちドラムChip.HT;\r
785 \r
786                                                 case Eパッド.LT:\r
787                                                         if ( this.r現在の空うちドラムChip.LT != null )\r
788                                                         {\r
789                                                                 return this.r現在の空うちドラムChip.LT;\r
790                                                         }\r
791                                                         if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )\r
792                                                         {\r
793                                                                 return this.r現在の空うちドラムChip.FT;\r
794                                                         }\r
795                                                         return null;\r
796 \r
797                                                 case Eパッド.FT:\r
798                                                         if ( this.r現在の空うちドラムChip.FT != null )\r
799                                                         {\r
800                                                                 return this.r現在の空うちドラムChip.FT;\r
801                                                         }\r
802                                                         if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )\r
803                                                         {\r
804                                                                 return this.r現在の空うちドラムChip.LT;\r
805                                                         }\r
806                                                         return null;\r
807 \r
808                                                 case Eパッド.CY:\r
809                                                         if ( this.r現在の空うちドラムChip.CY != null )\r
810                                                         {\r
811                                                                 return this.r現在の空うちドラムChip.CY;\r
812                                                         }\r
813                                                         if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )\r
814                                                         {\r
815                                                                 return this.r現在の空うちドラムChip.RD;\r
816                                                         }\r
817                                                         return null;\r
818 \r
819                                                 case Eパッド.HHO:\r
820                                                         if ( this.r現在の空うちドラムChip.HHO != null )\r
821                                                         {\r
822                                                                 return this.r現在の空うちドラムChip.HHO;\r
823                                                         }\r
824                                                         if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )\r
825                                                         {\r
826                                                                 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )\r
827                                                                 {\r
828                                                                         return this.r現在の空うちドラムChip.HH;\r
829                                                                 }\r
830                                                                 if ( this.r現在の空うちドラムChip.HH != null )\r
831                                                                 {\r
832                                                                         return this.r現在の空うちドラムChip.HH;\r
833                                                                 }\r
834                                                         }\r
835                                                         return this.r現在の空うちドラムChip.LC;\r
836 \r
837                                                 case Eパッド.RD:\r
838                                                         if ( this.r現在の空うちドラムChip.RD != null )\r
839                                                         {\r
840                                                                 return this.r現在の空うちドラムChip.RD;\r
841                                                         }\r
842                                                         if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )\r
843                                                         {\r
844                                                                 return this.r現在の空うちドラムChip.CY;\r
845                                                         }\r
846                                                         return null;\r
847 \r
848                                                 case Eパッド.LC:\r
849                                                         if ( this.r現在の空うちドラムChip.LC != null )\r
850                                                         {\r
851                                                                 return this.r現在の空うちドラムChip.LC;\r
852                                                         }\r
853                                                         if ( ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける ) && ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.全部共通 ) )\r
854                                                         {\r
855                                                                 return null;\r
856                                                         }\r
857                                                         if ( this.r現在の空うちドラムChip.HH != null )\r
858                                                         {\r
859                                                                 return this.r現在の空うちドラムChip.HH;\r
860                                                         }\r
861                                                         return this.r現在の空うちドラムChip.HHO;\r
862                                         }\r
863                                         break;\r
864 \r
865                                 case E楽器パート.GUITAR:\r
866                                         return this.r現在の空うちギターChip;\r
867 \r
868                                 case E楽器パート.BASS:\r
869                                         return this.r現在の空うちベースChip;\r
870                         }\r
871                         return null;\r
872                 }\r
873                 protected CDTX.CChip r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( long nTime, int nChannel, int nInputAdjustTime )\r
874                 {\r
875                         sw2.Start();\r
876 //Trace.TraceInformation( "NTime={0}, nChannel={1:x2}", nTime, nChannel );\r
877                         nTime += nInputAdjustTime;                                              // #24239 2011.1.23 yyagi InputAdjust\r
878 \r
879                         int nIndex_InitialPositionSearchingToPast;\r
880                         if ( this.n現在のトップChip == -1 )                               // 演奏データとして1個もチップがない場合は\r
881                         {\r
882                                 sw2.Stop();\r
883                                 return null;\r
884                         }\r
885                         int count = listChip.Count;\r
886                         int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;\r
887                         if ( this.n現在のトップChip >= count )                    // その時点で演奏すべきチップが既に全部無くなっていたら\r
888                         {\r
889                                 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;\r
890                         }\r
891                         //int nIndex_NearestChip_Future;        // = nIndex_InitialPositionSearchingToFuture;\r
892                         //while ( nIndex_NearestChip_Future < count )           // 未来方向への検索\r
893                         for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++)\r
894                         {\r
895                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];\r
896                                 if ( chip.b空打ちチップである )\r
897                                 {\r
898                                         continue;\r
899                                 }\r
900                                 if ( ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) ) )\r
901                                 {\r
902                                         if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
903                                         {\r
904                                                 if ( chip.n発声時刻ms > nTime )\r
905                                                 {\r
906                                                         break;\r
907                                                 }\r
908                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
909                                         }\r
910                                         continue;       // ほんの僅かながら高速化\r
911                                 }\r
912                                 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
913                                 {\r
914                                         if ( chip.n発声時刻ms > nTime )\r
915                                         {\r
916                                                 break;\r
917                                         }\r
918                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
919                                 }\r
920                                 else if ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
921                                 {\r
922                                         if ( chip.n発声時刻ms > nTime )\r
923                                         {\r
924                                                 break;\r
925                                         }\r
926                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
927                                 }\r
928                                 // nIndex_NearestChip_Future++;\r
929                         }\r
930                         int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;\r
931                         //while ( nIndex_NearestChip_Past >= 0 )                        // 過去方向への検索\r
932                         for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )\r
933                         {\r
934                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];\r
935                                 if ( chip.b空打ちチップである )\r
936                                 {\r
937                                         continue;\r
938                                 }\r
939                                 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )\r
940                                 {\r
941                                         if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
942                                         {\r
943                                                 break;\r
944                                         }\r
945                                 }\r
946                                 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
947                                 {\r
948                                         if ( ( 0x20 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0x28 ) )\r
949                                         {\r
950                                                 break;\r
951                                         }\r
952                                 }\r
953                                 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
954                                         && ( ( 0xa0 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0xa8 ) ) )\r
955                                 {\r
956                                         break;\r
957                                 }\r
958                                 // nIndex_NearestChip_Past--;\r
959                         }\r
960 \r
961                         if ( nIndex_NearestChip_Future >= count )\r
962                         {\r
963                                 if ( nIndex_NearestChip_Past < 0 )      // 検索対象が過去未来どちらにも見つからなかった場合\r
964                                 {\r
965                                         return null;\r
966                                 }\r
967                                 else                                                            // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合\r
968                                 {\r
969                                         sw2.Stop();\r
970                                         return listChip[ nIndex_NearestChip_Past ];\r
971                                 }\r
972                         }\r
973                         else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合\r
974                         {\r
975                                 sw2.Stop();\r
976                                 return listChip[ nIndex_NearestChip_Future ];\r
977                         }\r
978                                                                                                         // 検索対象が過去未来の双方に見つかったなら、より近い方を採用する\r
979                         CDTX.CChip nearestChip_Future = listChip[ nIndex_NearestChip_Future ];\r
980                         CDTX.CChip nearestChip_Past   = listChip[ nIndex_NearestChip_Past ];\r
981                         int nDiffTime_Future = Math.Abs( (int) ( nTime - nearestChip_Future.n発声時刻ms ) );\r
982                         int nDiffTime_Past   = Math.Abs( (int) ( nTime - nearestChip_Past.n発声時刻ms ) );\r
983                         if ( nDiffTime_Future >= nDiffTime_Past )\r
984                         {\r
985                                 sw2.Stop();\r
986                                 return nearestChip_Past;\r
987                         }\r
988                         sw2.Stop();\r
989                         return nearestChip_Future;\r
990                 }\r
991                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part )\r
992                 {\r
993                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, CDTXMania.ConfigIni.n手動再生音量, false, false );\r
994                 }\r
995                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量 )\r
996                 {\r
997                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, false, false );\r
998                 }\r
999                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ )\r
1000                 {\r
1001                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, bモニタ, false );\r
1002                 }\r
1003                 protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )\r
1004                 {\r
1005                         // mute sound (auto)\r
1006                         // 4A: HH\r
1007                         // 4B: CY\r
1008                         // 4C: RD\r
1009                         // 4D: LC\r
1010                         // 2A: Gt\r
1011                         // AA: Bs\r
1012                         //\r
1013 \r
1014                         if ( pChip != null )\r
1015                         {\r
1016                                 bool overwrite = false;\r
1017                                 switch ( part )\r
1018                                 {\r
1019                                         case E楽器パート.DRUMS:\r
1020                                         #region [ DRUMS ]\r
1021                                                 {\r
1022                                                         int index = pChip.nチャンネル番号;\r
1023                                                         if ( ( 0x11 <= index ) && ( index <= 0x1a ) )\r
1024                                                         {\r
1025                                                                 index -= 0x11;\r
1026                                                         }\r
1027                                                         else if ( ( 0x31 <= index ) && ( index <= 0x3a ) )\r
1028                                                         {\r
1029                                                                 index -= 0x31;\r
1030                                                         }\r
1031                                                         // mute sound (auto)\r
1032                                                         // 4A: 84: HH (HO/HC)\r
1033                                                         // 4B: 85: CY\r
1034                                                         // 4C: 86: RD\r
1035                                                         // 4D: 87: LC\r
1036                                                         // 2A: 88: Gt\r
1037                                                         // AA: 89: Bs\r
1038                                                         else if ( 0x84 == index )       // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要\r
1039                                                         {\r
1040                                                                 index = 0;\r
1041                                                         }\r
1042                                                         else if ( ( 0x85 <= index ) && ( index <= 0x87 ) )      // 仮に今だけ追加\r
1043                                                         {\r
1044                                                                 //            CY    RD    LC\r
1045                                                                 int[] ch = { 0x16, 0x19, 0x1A };\r
1046                                                                 pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x85 ];\r
1047                                                                 index = pChip.nチャンネル番号 - 0x11;\r
1048                                                                 overwrite = true;\r
1049                                                         }\r
1050                                                         else\r
1051                                                         {\r
1052                                                                 return;\r
1053                                                         }\r
1054                                                         int nLane = this.nチャンネル0Atoレーン07[ index ];\r
1055                                                         if ( ( nLane == 1 ) &&  // 今回演奏するのがHC or HO\r
1056                                                                 ( index == 0 || ( index == 7 && this.n最後に再生したHHのチャンネル番号 != 0x18 && this.n最後に再生したHHのチャンネル番号 != 0x38 ) )\r
1057                                                                 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない\r
1058                                                         )\r
1059                                                         // #24772 2011.4.4 yyagi\r
1060                                                         // == HH mute condition == \r
1061                                                         //                      current HH              So, the mute logics are:\r
1062                                                         //                              HC      HO              1) All played HC/HOs should be queueing\r
1063                                                         // last HH      HC  Yes Yes             2) If you aren't in "both current/last HH are HO", queued HH should be muted.\r
1064                                                         //                      HO      Yes     No\r
1065                                                         {\r
1066                                                                 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。\r
1067 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
1068                                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)\r
1069                                                                 {\r
1070 #endif\r
1071                                                                 for ( int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++ )          // #23921 2011.1.4 yyagi\r
1072                                                                 {\r
1073                                                                         // CDTXMania.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号);\r
1074                                                                         CDTXMania.DTX.tWavの再生停止( this.L最後に再生したHHの実WAV番号[ i ] ); // #23921 yyagi ストック分全て消音する\r
1075                                                                 }\r
1076                                                                 this.L最後に再生したHHの実WAV番号.Clear();\r
1077 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
1078                                                                 }\r
1079 #endif\r
1080                                                                 //this.n最後に再生したHHの実WAV番号 = pChip.n整数値_内部番号;\r
1081                                                                 this.n最後に再生したHHのチャンネル番号 = pChip.nチャンネル番号;\r
1082                                                         }\r
1083 #if TEST_NOTEOFFMODE    // 2011.1.4 yyagi test\r
1084                                                         if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)\r
1085                                                         {\r
1086 #endif\r
1087                                                         if ( index == 0 || index == 7 || index == 0x20 || index == 0x27 )                       // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく\r
1088                                                         {                                                                                                                                                       // #24772 HC, 不可視HCも消音キューに追加\r
1089                                                                 if ( this.L最後に再生したHHの実WAV番号.Count >= 16 ) // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える\r
1090                                                                 {                                                                                                       // (ストックが増えてList<>のrealloc()が発生するのを予防する)\r
1091                                                                         this.L最後に再生したHHの実WAV番号.RemoveAt( 0 );\r
1092                                                                 }\r
1093                                                                 if ( !this.L最後に再生したHHの実WAV番号.Contains( pChip.n整数値_内部番号 ) )  // チップ音がまだストックされてなければ\r
1094                                                                 {\r
1095                                                                         this.L最後に再生したHHの実WAV番号.Add( pChip.n整数値_内部番号 );                      // ストックする\r
1096                                                                 }\r
1097                                                         }\r
1098 #if TEST_NOTEOFFMODE    // 2011.1.4 yyagi test\r
1099                                                         }\r
1100 #endif\r
1101                                                         if ( overwrite )\r
1102                                                         {\r
1103                                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号[index] );\r
1104                                                         }\r
1105                                                         CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, nLane, n音量, bモニタ );\r
1106                                                         this.n最後に再生した実WAV番号[ nLane ] = pChip.n整数値_内部番号;               // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意\r
1107                                                         return;\r
1108                                                 }\r
1109                                         #endregion\r
1110                                         case E楽器パート.GUITAR:\r
1111                                         #region [ GUITAR ]\r
1112 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
1113                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.Guitar) {\r
1114 #endif\r
1115                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );\r
1116 #if TEST_NOTEOFFMODE\r
1117                                                 }\r
1118 #endif\r
1119                                                 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Guitar, n音量, bモニタ, b音程をずらして再生 );\r
1120                                                 this.n最後に再生した実WAV番号.Guitar = pChip.n整数値_内部番号;\r
1121                                                 return;\r
1122                                         #endregion\r
1123                                         case E楽器パート.BASS:\r
1124                                         #region [ BASS ]\r
1125 #if TEST_NOTEOFFMODE\r
1126                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.Bass) {\r
1127 #endif\r
1128                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Bass );\r
1129 #if TEST_NOTEOFFMODE\r
1130                                                 }\r
1131 #endif\r
1132                                                 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Bass, n音量, bモニタ, b音程をずらして再生 );\r
1133                                                 this.n最後に再生した実WAV番号.Bass = pChip.n整数値_内部番号;\r
1134                                                 return;\r
1135                                         #endregion\r
1136 \r
1137                                         default:\r
1138                                                 break;\r
1139                                 }\r
1140                         }\r
1141                 }\r
1142                 protected void tステータスパネルの選択()\r
1143                 {\r
1144                         if ( CDTXMania.bコンパクトモード )\r
1145                         {\r
1146                                 this.actStatusPanels.tラベル名からステータスパネルを決定する( null );\r
1147                         }\r
1148                         else if ( CDTXMania.stage選曲.r確定された曲 != null )\r
1149                         {\r
1150                                 this.actStatusPanels.tラベル名からステータスパネルを決定する( CDTXMania.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.stage選曲.n確定された曲の難易度 ] );\r
1151                         }\r
1152                 }\r
1153                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip )\r
1154                 {\r
1155                         return tチップのヒット処理( nHitTime, pChip, true );\r
1156                 }\r
1157                 protected abstract E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, bool bCorrectLane );\r
1158                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode )          // E楽器パート screenmode\r
1159                 {\r
1160                         return tチップのヒット処理( nHitTime, pChip, screenmode, true );\r
1161                 }\r
1162                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode, bool bCorrectLane )\r
1163                 {\r
1164                         pChip.bHit = true;\r
1165 #region [メソッド化する前の記述(注釈化)]\r
1166 //            bool bPChipIsAutoPlay = false;\r
1167 //            bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
1168 //            bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
1169 //            bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
1170 //            bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
1171 //            bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
1172 //            if ( pChip.e楽器パート == E楽器パート.DRUMS )\r
1173 //            {\r
1174 //                if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )\r
1175 //                {\r
1176 //                    bPChipIsAutoPlay = true;\r
1177 //                }\r
1178 //            }\r
1179 //            else if ( pChip.e楽器パート == E楽器パート.GUITAR )\r
1180 //            {\r
1181 ////Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );\r
1182 ////Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);\r
1183 //                bPChipIsAutoPlay = true;\r
1184 //                if ( !bIsAutoPlay[ (int) Eレーン.GtPick ] ) bPChipIsAutoPlay = false;\r
1185 //                else\r
1186 //                {\r
1187 //                    if ( bGtBsR  && !bIsAutoPlay[ (int) Eレーン.GtR ] ) bPChipIsAutoPlay = false;\r
1188 //                    else if ( bGtBsG && !bIsAutoPlay[ (int) Eレーン.GtG ] ) bPChipIsAutoPlay = false;\r
1189 //                    else if ( bGtBsB && !bIsAutoPlay[ (int) Eレーン.GtB ] ) bPChipIsAutoPlay = false;\r
1190 //                    else if ( bGtBsW && !bIsAutoPlay[ (int) Eレーン.GtW ] ) bPChipIsAutoPlay = false;\r
1191 //                    else if ( bGtBsO &&\r
1192 //                        ( !bIsAutoPlay[ (int) Eレーン.GtR] || !bIsAutoPlay[ (int) Eレーン.GtG] || !bIsAutoPlay[ (int) Eレーン.GtB] ) )\r
1193 //                        bPChipIsAutoPlay = false;\r
1194 //                }\r
1195 //            }\r
1196 //            else if ( pChip.e楽器パート == E楽器パート.BASS )\r
1197 //            {\r
1198 //                bPChipIsAutoPlay = true;\r
1199 //                if ( !bIsAutoPlay[ (int) Eレーン.BsPick ] ) bPChipIsAutoPlay = false;\r
1200 //                else\r
1201 //                {\r
1202 //                    if ( bGtBsR && !bIsAutoPlay[ (int) Eレーン.BsR ] ) bPChipIsAutoPlay = false;\r
1203 //                    else if ( bGtBsG && bIsAutoPlay[ (int) Eレーン.BsG ] ) bPChipIsAutoPlay = false;\r
1204 //                    else if ( bGtBsB && bIsAutoPlay[ (int) Eレーン.BsB ] ) bPChipIsAutoPlay = false;\r
1205 //                    else if ( bGtBsW && bIsAutoPlay[ (int) Eレーン.BsW ] ) bPChipIsAutoPlay = false;\r
1206 //                    else if ( bGtBsO &&\r
1207 //                        ( !bIsAutoPlay[ (int) Eレーン.BsR ] || !bIsAutoPlay[ (int) Eレーン.BsG ] || !bIsAutoPlay[ (int) Eレーン.BsB ] ) )\r
1208 //                        bPChipIsAutoPlay = false;\r
1209 //                }\r
1210 //            }\r
1211 //            else\r
1212 //            {\r
1213 //                this.bAUTOでないチップが1つでもバーを通過した = true;\r
1214 //            }\r
1215 ////Trace.TraceInformation( "ch={0:x2}, flag={1}",  pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );\r
1216 #endregion\r
1217                         if ( pChip.e楽器パート == E楽器パート.UNKNOWN )\r
1218                         {\r
1219                                 this.bAUTOでないチップが1つでもバーを通過した = true;\r
1220                         }\r
1221                         else\r
1222                         {\r
1223                                 cInvisibleChip.StartSemiInvisible( pChip.e楽器パート );\r
1224                         }\r
1225                         bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );\r
1226 \r
1227                         pChip.bIsAutoPlayed = bPChipIsAutoPlay;                 // 2011.6.10 yyagi\r
1228                         E判定 eJudgeResult = E判定.Auto;\r
1229                         switch ( pChip.e楽器パート )\r
1230                         {\r
1231                                 case E楽器パート.DRUMS:\r
1232                                         {\r
1233                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;\r
1234                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1235                                                 this.actJudgeString.Start( this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ], bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1236                                         }\r
1237                                         break;\r
1238 \r
1239                                 case E楽器パート.GUITAR:\r
1240                                         {\r
1241                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Guitar;\r
1242                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1243                                                 this.actJudgeString.Start( 10, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1244                                                 break;\r
1245                                         }\r
1246 \r
1247                                 case E楽器パート.BASS:\r
1248                                         {\r
1249                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Bass;\r
1250                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1251                                                 this.actJudgeString.Start( 11, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1252                                         }\r
1253                                         break;\r
1254                         }\r
1255                         if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )\r
1256                         {\r
1257                                 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );\r
1258                                 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );\r
1259                         }\r
1260                         if ( eJudgeResult == E判定.Poor || eJudgeResult == E判定.Miss || eJudgeResult == E判定.Bad )\r
1261                         {\r
1262                                 cInvisibleChip.ShowChipTemporally( pChip.e楽器パート );\r
1263                         }\r
1264                         switch ( pChip.e楽器パート )\r
1265                         {\r
1266                                 case E楽器パート.DRUMS:\r
1267                                         switch ( eJudgeResult )\r
1268                                         {\r
1269                                                 case E判定.Miss:\r
1270                                                 case E判定.Bad:\r
1271                                                         this.nヒット数_Auto含む.Drums.Miss++;\r
1272                                                         if ( !bPChipIsAutoPlay )\r
1273                                                         {\r
1274                                                                 this.nヒット数_Auto含まない.Drums.Miss++;\r
1275                                                         }\r
1276                                                         break;\r
1277                                                 default:\r
1278                                                         this.nヒット数_Auto含む.Drums[ (int) eJudgeResult ]++;\r
1279                                                         if ( !bPChipIsAutoPlay )\r
1280                                                         {\r
1281                                                                 this.nヒット数_Auto含まない.Drums[ (int) eJudgeResult ]++;\r
1282                                                         }\r
1283                                                         break;\r
1284                                         }\r
1285 \r
1286                                         if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )\r
1287                                         {\r
1288                                                 switch ( eJudgeResult )\r
1289                                                 {\r
1290                                                         case E判定.Perfect:\r
1291                                                         case E判定.Great:\r
1292                                                         case E判定.Good:\r
1293                                                                 this.actCombo.n現在のコンボ数.Drums++;\r
1294                                                                 break;\r
1295 \r
1296                                                         default:\r
1297                                                                 this.actCombo.n現在のコンボ数.Drums = 0;\r
1298                                                                 break;\r
1299                                                 }\r
1300                                         }\r
1301                                         break;\r
1302 \r
1303                                 case E楽器パート.GUITAR:\r
1304                                 case E楽器パート.BASS:\r
1305                                         int indexInst = (int) pChip.e楽器パート;\r
1306                                         switch ( eJudgeResult )\r
1307                                         {\r
1308                                                 case E判定.Miss:\r
1309                                                 case E判定.Bad:\r
1310                                                         this.nヒット数_Auto含む[ indexInst ].Miss++;\r
1311                                                         if ( !bPChipIsAutoPlay )\r
1312                                                         {\r
1313                                                                 this.nヒット数_Auto含まない[ indexInst ].Miss++;\r
1314                                                         }\r
1315                                                         break;\r
1316                                                 default:        // #24068 2011.1.10 ikanick changed\r
1317                                                         // #24167 2011.1.16 yyagi changed\r
1318                                                         this.nヒット数_Auto含む[ indexInst ][ (int) eJudgeResult ]++;\r
1319                                                         if ( !bPChipIsAutoPlay )\r
1320                                                         {\r
1321                                                                 this.nヒット数_Auto含まない[ indexInst ][ (int) eJudgeResult ]++;\r
1322                                                         }\r
1323                                                         break;\r
1324                                         }\r
1325                                         switch ( eJudgeResult )\r
1326                                         {\r
1327                                                 case E判定.Perfect:\r
1328                                                 case E判定.Great:\r
1329                                                 case E判定.Good:\r
1330                                                         this.actCombo.n現在のコンボ数[ indexInst ]++;\r
1331                                                         break;\r
1332 \r
1333                                                 default:\r
1334                                                         this.actCombo.n現在のコンボ数[ indexInst ] = 0;\r
1335                                                         break;\r
1336                                         }\r
1337                                         break;\r
1338 \r
1339                                 default:\r
1340                                         break;\r
1341                         }\r
1342                         if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )\r
1343                         {\r
1344                                 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];\r
1345                                 long nScoreDelta = 0;\r
1346                                 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };\r
1347                                 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )\r
1348                                 {\r
1349                                         nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * nCombos;\r
1350                                 }\r
1351                                 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )\r
1352                                 {\r
1353                                         nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * 500L;\r
1354                                 }\r
1355                                 this.actScore.Add( pChip.e楽器パート, bIsAutoPlay, nScoreDelta );\r
1356                         }\r
1357                         return eJudgeResult;\r
1358                 }\r
1359                 protected abstract void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part );\r
1360                 protected abstract void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part, int nLane );\r
1361                 protected void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )\r
1362                 {\r
1363                         this.tチップのヒット処理_BadならびにTight時のMiss( part, 0, screenmode );\r
1364                 }\r
1365                 protected void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )\r
1366                 {\r
1367                         this.bAUTOでないチップが1つでもバーを通過した = true;\r
1368                         cInvisibleChip.StartSemiInvisible( part );\r
1369                         cInvisibleChip.ShowChipTemporally( part );\r
1370                         //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );\r
1371                         actGauge.Damage( screenmode, part, E判定.Miss );\r
1372                         switch ( part )\r
1373                         {\r
1374                                 case E楽器パート.DRUMS:\r
1375                                         if ( ( nLane >= 0 ) && ( nLane <= 7 ) )\r
1376                                         {\r
1377                                                 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );\r
1378                                         }\r
1379                                         this.actCombo.n現在のコンボ数.Drums = 0;\r
1380                                         return;\r
1381 \r
1382                                 case E楽器パート.GUITAR:\r
1383                                         this.actJudgeString.Start( 10, E判定.Bad, 999 );\r
1384                                         this.actCombo.n現在のコンボ数.Guitar = 0;\r
1385                                         return;\r
1386 \r
1387                                 case E楽器パート.BASS:\r
1388                                         this.actJudgeString.Start( 11, E判定.Bad, 999 );\r
1389                                         this.actCombo.n現在のコンボ数.Bass = 0;\r
1390                                         break;\r
1391 \r
1392                                 default:\r
1393                                         return;\r
1394                         }\r
1395                 }\r
1396         \r
1397                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )\r
1398                 {\r
1399                         return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );\r
1400                 }\r
1401                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )\r
1402                 {\r
1403                         sw2.Start();\r
1404 //Trace.TraceInformation( "nTime={0}, nChannel={1:x2}, 現在のTop={2}", nTime, nChannel,CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms );\r
1405                         nTime += nInputAdjustTime;\r
1406 \r
1407                         int nIndex_InitialPositionSearchingToPast;\r
1408                         int nTimeDiff;\r
1409                         if ( this.n現在のトップChip == -1 )                       // 演奏データとして1個もチップがない場合は\r
1410                         {\r
1411                                 sw2.Stop();\r
1412                                 return null;\r
1413                         }\r
1414                         int count = listChip.Count;\r
1415                         int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;\r
1416                         if ( this.n現在のトップChip >= count )            // その時点で演奏すべきチップが既に全部無くなっていたら\r
1417                         {\r
1418                                 nIndex_NearestChip_Future  = nIndex_InitialPositionSearchingToPast = count - 1;\r
1419                         }\r
1420                         // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;\r
1421 //                      while ( nIndex_NearestChip_Future < count )     // 未来方向への検索\r
1422                         for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )\r
1423                         {\r
1424                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];\r
1425                                 if ( !chip.bHit )\r
1426                                 {\r
1427                                         if ( chip.b空打ちチップである )\r
1428                                         {\r
1429                                                 continue;\r
1430                                         }\r
1431                                         if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )\r
1432                                         {\r
1433                                                 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1434                                                 {\r
1435                                                         if ( chip.n発声時刻ms > nTime )\r
1436                                                         {\r
1437                                                                 break;\r
1438                                                         }\r
1439                                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1440                                                 }\r
1441                                                 continue;\r
1442                                         }\r
1443                                         else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1444                                         {\r
1445                                                 if ( chip.n発声時刻ms > nTime )\r
1446                                                 {\r
1447                                                         break;\r
1448                                                 }\r
1449                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1450                                         }\r
1451                                         else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1452                                         {\r
1453                                                 if ( chip.n発声時刻ms > nTime )\r
1454                                                 {\r
1455                                                         break;\r
1456                                                 }\r
1457                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1458                                         }\r
1459                                 }\r
1460 //                              nIndex_NearestChip_Future++;\r
1461                         }\r
1462                         int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;\r
1463 //                      while ( nIndex_NearestChip_Past >= 0 )          // 過去方向への検索\r
1464                         for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )\r
1465                         {\r
1466                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];\r
1467                                 if ( chip.b空打ちチップである )\r
1468                                 {\r
1469                                         continue;\r
1470                                 }\r
1471                                 if ( ( !chip.bHit ) &&\r
1472                                                 (\r
1473                                                         ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&\r
1474                                                                 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1475                                                         )\r
1476                                                         ||\r
1477                                                         (\r
1478                                                                 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||\r
1479                                                                 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1480                                                         )\r
1481                                                         ||\r
1482                                                         (\r
1483                                                                 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||\r
1484                                                                 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1485                                                         )\r
1486                                                 )\r
1487                                         )\r
1488                                         {\r
1489                                                 break;\r
1490                                         }\r
1491 //                              nIndex_NearestChip_Past--;\r
1492                         }\r
1493                         if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) )        // 検索対象が過去未来どちらにも見つからなかった場合\r
1494                         {\r
1495                                 sw2.Stop();\r
1496                                 return null;\r
1497                         }\r
1498                         CDTX.CChip nearestChip; // = null;      // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除\r
1499                         if ( nIndex_NearestChip_Future >= count )                                                                                       // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合\r
1500                         {\r
1501                                 nearestChip = listChip[ nIndex_NearestChip_Past ];\r
1502 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1503                         }\r
1504                         else if ( nIndex_NearestChip_Past < 0 )                                                                                         // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合\r
1505                         {\r
1506                                 nearestChip = listChip[ nIndex_NearestChip_Future ];\r
1507 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1508                         }\r
1509                         else\r
1510                         {\r
1511                                 int nTimeDiff_Future = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );\r
1512                                 int nTimeDiff_Past   = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Past   ].n発声時刻ms ) );\r
1513                                 if ( nTimeDiff_Future < nTimeDiff_Past )\r
1514                                 {\r
1515                                         nearestChip = listChip[ nIndex_NearestChip_Future ];\r
1516 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1517                                 }\r
1518                                 else\r
1519                                 {\r
1520                                         nearestChip = listChip[ nIndex_NearestChip_Past ];\r
1521 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1522                                 }\r
1523                         }\r
1524                         nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1525                         if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) )                                   // チップは見つかったが、検索範囲時間外だった場合\r
1526                         {\r
1527                                 sw2.Stop();\r
1528                                 return null;\r
1529                         }\r
1530                         sw2.Stop();\r
1531                         return nearestChip;\r
1532                 }\r
1533 \r
1534                 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )\r
1535                 {\r
1536                         switch ( (int) inst )\r
1537                         {\r
1538                                 case (int)E楽器パート.GUITAR:\r
1539                                         return r次にくるギターChipを更新して返す();\r
1540                                 case (int)E楽器パート.BASS:\r
1541                                         return r次にくるベースChipを更新して返す();\r
1542                                 default:\r
1543                                         return null;\r
1544                         }\r
1545                 }\r
1546                 protected CDTX.CChip r次にくるギターChipを更新して返す()\r
1547                 {\r
1548                         int nInputAdjustTime = this.bIsAutoPlay.GtPick ? 0 : this.nInputAdjustTimeMs.Guitar;\r
1549                         this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0x2f, nInputAdjustTime, 500 );\r
1550                         return this.r次にくるギターChip;\r
1551                 }\r
1552                 protected CDTX.CChip r次にくるベースChipを更新して返す()\r
1553                 {\r
1554                         int nInputAdjustTime = this.bIsAutoPlay.BsPick ? 0 : this.nInputAdjustTimeMs.Bass;\r
1555                         this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0xaf, nInputAdjustTime, 500 );\r
1556                         return this.r次にくるベースChip;\r
1557                 }\r
1558 \r
1559                 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus )           // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1560                 {\r
1561                         int part, offset = plusminus;\r
1562                         if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) )      // Guitar InputAdjustTime\r
1563                         {\r
1564                                 part = (int) E楽器パート.GUITAR;\r
1565                         }\r
1566                         else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) )     // Bass InputAdjustTime\r
1567                         {\r
1568                                 part = (int) E楽器パート.BASS;\r
1569                         }\r
1570                         else    // Drums InputAdjustTime\r
1571                         {\r
1572                                 part = (int) E楽器パート.DRUMS;\r
1573                         }\r
1574                         if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )\r
1575                         {\r
1576                                 offset *= 10;\r
1577                         }\r
1578 \r
1579                         this.nInputAdjustTimeMs[ part ] += offset;\r
1580                         if ( this.nInputAdjustTimeMs[ part ] > 99 )\r
1581                         {\r
1582                                 this.nInputAdjustTimeMs[ part ] = 99;\r
1583                         }\r
1584                         else if ( this.nInputAdjustTimeMs[ part ] < -99 )\r
1585                         {\r
1586                                 this.nInputAdjustTimeMs[ part ] = -99;\r
1587                         }\r
1588                         CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];\r
1589                 }\r
1590 \r
1591                 protected abstract void t入力処理_ドラム();\r
1592                 protected abstract void ドラムスクロール速度アップ();\r
1593                 protected abstract void ドラムスクロール速度ダウン();\r
1594                 protected void tキー入力()\r
1595                 {\r
1596                         IInputDevice keyboard = CDTXMania.Input管理.Keyboard;\r
1597                         if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&\r
1598                                 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1599                         {       // shift+f1 (pause)\r
1600                                 this.bPAUSE = !this.bPAUSE;\r
1601                                 if ( this.bPAUSE )\r
1602                                 {\r
1603                     CSound管理.rc演奏用タイマ.t一時停止();\r
1604                                         CDTXMania.Timer.t一時停止();\r
1605                                         CDTXMania.DTX.t全チップの再生一時停止();\r
1606                                 }\r
1607                                 else\r
1608                                 {\r
1609                     CSound管理.rc演奏用タイマ.t再開();\r
1610                                         CDTXMania.Timer.t再開();\r
1611                                         CDTXMania.DTX.t全チップの再生再開();\r
1612                                 }\r
1613                         }\r
1614                         if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1615                         {\r
1616                                 this.t入力処理_ドラム();\r
1617                                 this.t入力処理_ギターベース( E楽器パート.GUITAR );\r
1618                                 this.t入力処理_ギターベース( E楽器パート.BASS );\r
1619                                 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1620                                 {       // shift (+ctrl) + UpArrow (BGMAdjust)\r
1621                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );\r
1622                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1623                                 }\r
1624                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1625                                 {       // shift + DownArrow (BGMAdjust)\r
1626                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );\r
1627                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1628                                 }\r
1629                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )\r
1630                                 {       // UpArrow(scrollspeed up)\r
1631                                         ドラムスクロール速度アップ();\r
1632                                 }\r
1633                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )\r
1634                                 {       // DownArrow (scrollspeed down)\r
1635                                         ドラムスクロール速度ダウン();\r
1636                                 }\r
1637                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )\r
1638                                 {       // del (debug info)\r
1639                                         CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;\r
1640                                 }\r
1641                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) )           // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1642                                 {\r
1643                                         ChangeInputAdjustTimeInPlaying( keyboard, -1 );\r
1644                                 }\r
1645                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) )          // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1646                                 {\r
1647                                         ChangeInputAdjustTimeInPlaying( keyboard, +1 );\r
1648                                 }\r
1649                                 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )\r
1650                                 {       // escape (exit)\r
1651                                         this.actFO.tフェードアウト開始();\r
1652                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
1653                                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;\r
1654                                 }\r
1655                         }\r
1656                 }\r
1657 \r
1658                 protected void t入力メソッド記憶( E楽器パート part )\r
1659                 {\r
1660                         if ( CDTXMania.Pad.st検知したデバイス.Keyboard )\r
1661                         {\r
1662                                 this.b演奏にキーボードを使った[ (int) part ] = true;\r
1663                         }\r
1664                         if ( CDTXMania.Pad.st検知したデバイス.Joypad )\r
1665                         {\r
1666                                 this.b演奏にジョイパッドを使った[ (int) part ] = true;\r
1667                         }\r
1668                         if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )\r
1669                         {\r
1670                                 this.b演奏にMIDI入力を使った[ (int) part ] = true;\r
1671                         }\r
1672                         if ( CDTXMania.Pad.st検知したデバイス.Mouse )\r
1673                         {\r
1674                                 this.b演奏にマウスを使った[ (int) part ] = true;\r
1675                         }\r
1676                 }\r
1677 \r
1678 \r
1679                 protected abstract void t進行描画_AVI();\r
1680                 protected void t進行描画_AVI(int x, int y)\r
1681                 {\r
1682                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )\r
1683                         {\r
1684                                 this.actAVI.t進行描画( (int) ( x * Scale.X ), (int) ( y * Scale.Y ) );\r
1685                         }\r
1686                 }\r
1687                 protected abstract void t進行描画_BGA();\r
1688                 protected void t進行描画_BGA(int x, int y)\r
1689                 {\r
1690                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )\r
1691                         {\r
1692                                 this.actBGA.t進行描画( x, y );\r
1693                         }\r
1694                 }\r
1695                 protected abstract void t進行描画_DANGER();\r
1696                 protected void t進行描画_MIDIBGM()\r
1697                 {\r
1698                         if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )\r
1699                         {\r
1700                                 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;\r
1701                         }\r
1702                 }\r
1703                 protected void t進行描画_RGBボタン()\r
1704                 {\r
1705                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
1706                         {\r
1707                                 this.actRGB.t進行描画( 演奏判定ライン座標 );\r
1708                         }\r
1709                 }\r
1710                 protected void t進行描画_STAGEFAILED()\r
1711                 {\r
1712                         if ( ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( ( this.actStageFailed.On進行描画() != 0 ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) )\r
1713                         {\r
1714                                 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;\r
1715                                 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;\r
1716                                 this.actFO.tフェードアウト開始();\r
1717                         }\r
1718                 }\r
1719                 protected void t進行描画_WailingBonus()\r
1720                 {\r
1721                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1722                         {\r
1723                                 this.actWailingBonus.On進行描画();\r
1724                         }\r
1725                 }\r
1726                 protected abstract void t進行描画_Wailing枠();\r
1727                 protected void t進行描画_Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)\r
1728                 {\r
1729                         if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )\r
1730                         {\r
1731                                 if ( this.txWailing枠 != null )\r
1732                                 {\r
1733                                         if ( CDTXMania.DTX.bチップがある.Guitar )\r
1734                                         {\r
1735                                                 this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );\r
1736                                         }\r
1737                                         if ( CDTXMania.DTX.bチップがある.Bass )\r
1738                                         {\r
1739                                                 this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );\r
1740                                         }\r
1741                                 }\r
1742                         }\r
1743                 }\r
1744 \r
1745 \r
1746                 protected void t進行描画_チップファイアGB()\r
1747                 {\r
1748                         this.actChipFireGB.On進行描画();\r
1749                 }\r
1750                 protected abstract void t進行描画_パネル文字列();\r
1751                 protected void t進行描画_パネル文字列(int x, int y)\r
1752                 {\r
1753                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1754                         {\r
1755                                 this.actPanel.t進行描画( x, y );\r
1756                         }\r
1757                 }\r
1758                 protected void tパネル文字列の設定()\r
1759                 {\r
1760                         this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );\r
1761                 }\r
1762 \r
1763 \r
1764                 protected void t進行描画_ゲージ()\r
1765                 {\r
1766                         if ( ( ( CDTXMania.ConfigIni.eDark != Eダークモード.HALF ) && ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) ) && ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) )\r
1767                         {\r
1768                                 this.actGauge.On進行描画();\r
1769                         }\r
1770                 }\r
1771                 protected void t進行描画_コンボ()\r
1772                 {\r
1773                         this.actCombo.On進行描画();\r
1774                 }\r
1775                 protected void t進行描画_スコア()\r
1776                 {\r
1777                         this.actScore.On進行描画();\r
1778                 }\r
1779                 protected void t進行描画_ステータスパネル()\r
1780                 {\r
1781                         this.actStatusPanels.On進行描画();\r
1782                 }\r
1783                 protected bool t進行描画_チップ( E楽器パート ePlayMode )\r
1784                 {\r
1785                         if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1786                         {\r
1787                                 return true;\r
1788                         }\r
1789                         if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= listChip.Count ) )\r
1790                         {\r
1791                                 return true;\r
1792                         }\r
1793                         if ( this.n現在のトップChip == -1 )\r
1794                         {\r
1795                                 return true;\r
1796                         }\r
1797 \r
1798                         //double speed = 264.0; // BPM150の時の1小節の長さ[dot]\r
1799                         const double speed = 234.0 * Scale.Y;   // BPM150の時の1小節の長さ[dot]\r
1800 \r
1801                         double ScrollSpeedDrums =  ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums  + 1.0 ) * 0.5       * 37.5 * speed / 60000.0;\r
1802                         double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1803                         double ScrollSpeedBass =   ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass   + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1804 \r
1805                         CDTX dTX = CDTXMania.DTX;\r
1806                         CConfigIni configIni = CDTXMania.ConfigIni;\r
1807                         for ( int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )\r
1808                         {\r
1809                                 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];\r
1810 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );\r
1811                                 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedDrums );\r
1812                                 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedGuitar );\r
1813                                 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedBass );\r
1814                                 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 * Scale.Y )\r
1815                                 {\r
1816                                         break;\r
1817                                 }\r
1818 //                              if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )\r
1819                                 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正\r
1820 \r
1821                                 if (( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Drums < -65 * Scale.Y ) && // 小節線の消失処理などに影響するため、\r
1822                                         ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Guitar < -65 * Scale.Y ) &&    // Drumsのスクロールスピードだけには依存させない。\r
1823                                         ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Bass < -65 * Scale.Y ) && \r
1824                                         dTX.listChip[ this.n現在のトップChip ].bHit )\r
1825                                 {\r
1826                                         //                                      nCurrentTopChip = ++this.n現在のトップChip;\r
1827                                         ++this.n現在のトップChip;\r
1828                                         continue;\r
1829                                 }\r
1830                                 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );\r
1831 \r
1832                                 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];\r
1833 \r
1834                                 int instIndex = (int) pChip.e楽器パート;\r
1835                                 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&\r
1836                                     ( ( pChip.nバーからの距離dot[ instIndex ] < -40 * Scale.Y ) && ( this.e指定時刻からChipのJUDGEを返す( CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )\r
1837                                 {\r
1838                                     this.tチップのヒット処理( CSound管理.rc演奏用タイマ.n現在時刻, pChip );\r
1839                                 }\r
1840                                 switch ( pChip.nチャンネル番号 )\r
1841                                 {\r
1842                                         #region [ 01: BGM ]\r
1843                                         case 0x01:      // BGM\r
1844                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1845                                                 {\r
1846                                                         pChip.bHit = true;\r
1847                                                         if ( configIni.bBGM音を発声する )\r
1848                                                         {\r
1849 //long t = CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms;\r
1850 //Trace.TraceInformation( "BGM再生開始: 演奏タイマのn前回リセットしたときのシステム時刻=" + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + ", pChip.n発生時刻ms=" + pChip.n発声時刻ms + ", 合計=" + t );\r
1851                                                                 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
1852                                                         }\r
1853                                                 }\r
1854                                                 break;\r
1855                                         #endregion\r
1856                                         #region [ 03: BPM変更 ]\r
1857                                         case 0x03:      // BPM変更\r
1858                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1859                                                 {\r
1860                                                         pChip.bHit = true;\r
1861                                                         this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1862                                                 }\r
1863                                                 break;\r
1864                                         #endregion\r
1865                                         #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]\r
1866                                         case 0x04:      // レイヤーBGA\r
1867                                         case 0x07:\r
1868                                         case 0x55:\r
1869                                         case 0x56:\r
1870                                         case 0x57:\r
1871                                         case 0x58:\r
1872                                         case 0x59:\r
1873                                         case 0x60:\r
1874                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1875                                                 {\r
1876                                                         pChip.bHit = true;\r
1877                                                         if ( configIni.bBGA有効 )\r
1878                                                         {\r
1879                                                                 switch ( pChip.eBGA種別 )\r
1880                                                                 {\r
1881                                                                         case EBGA種別.BMPTEX:\r
1882                                                                                 if ( pChip.rBMPTEX != null )\r
1883                                                                                 {\r
1884                                                                                         this.actBGA.Start( pChip.nチャンネル番号, null, pChip.rBMPTEX, pChip.rBMPTEX.tx画像.sz画像サイズ.Width, pChip.rBMPTEX.tx画像.sz画像サイズ.Height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\r
1885                                                                                 }\r
1886                                                                                 break;\r
1887 \r
1888                                                                         case EBGA種別.BGA:\r
1889                                                                                 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1890                                                                                 {\r
1891                                                                                         this.actBGA.Start( pChip.nチャンネル番号, pChip.rBMP, pChip.rBMPTEX, pChip.rBGA.pt画像側右下座標.X - pChip.rBGA.pt画像側左上座標.X, pChip.rBGA.pt画像側右下座標.Y - pChip.rBGA.pt画像側左上座標.Y, 0, 0, pChip.rBGA.pt画像側左上座標.X, pChip.rBGA.pt画像側左上座標.Y, 0, 0, pChip.rBGA.pt表示座標.X, pChip.rBGA.pt表示座標.Y, 0, 0, 0 );\r
1892                                                                                 }\r
1893                                                                                 break;\r
1894 \r
1895                                                                         case EBGA種別.BGAPAN:\r
1896                                                                                 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1897                                                                                 {\r
1898                                                                                         this.actBGA.Start( pChip.nチャンネル番号, pChip.rBMP, pChip.rBMPTEX, pChip.rBGAPan.sz開始サイズ.Width, pChip.rBGAPan.sz開始サイズ.Height, pChip.rBGAPan.sz終了サイズ.Width, pChip.rBGAPan.sz終了サイズ.Height, pChip.rBGAPan.pt画像側開始位置.X, pChip.rBGAPan.pt画像側開始位置.Y, pChip.rBGAPan.pt画像側終了位置.X, pChip.rBGAPan.pt画像側終了位置.Y, pChip.rBGAPan.pt表示側開始位置.X, pChip.rBGAPan.pt表示側開始位置.Y, pChip.rBGAPan.pt表示側終了位置.X, pChip.rBGAPan.pt表示側終了位置.Y, pChip.n総移動時間 );\r
1899                                                                                 }\r
1900                                                                                 break;\r
1901 \r
1902                                                                         default:\r
1903                                                                                 if ( pChip.rBMP != null )\r
1904                                                                                 {\r
1905                                                                                         this.actBGA.Start( pChip.nチャンネル番号, pChip.rBMP, null, pChip.rBMP.n幅, pChip.rBMP.n高さ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\r
1906                                                                                 }\r
1907                                                                                 break;\r
1908                                                                 }\r
1909                                                         }\r
1910                                                 }\r
1911                                                 break;\r
1912                                         #endregion\r
1913                                         #region [ 08: BPM変更(拡張) ]\r
1914                                         case 0x08:      // BPM変更(拡張)\r
1915                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1916                                                 {\r
1917                                                         pChip.bHit = true;\r
1918                                                         if ( dTX.listBPM.ContainsKey( pChip.n整数値_内部番号 ) )\r
1919                                                         {\r
1920                                                                 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値_内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1921                                                         }\r
1922                                                 }\r
1923                                                 break;\r
1924                                         #endregion\r
1925                                         #region [ 11-1a: ドラム演奏 ]\r
1926                                         case 0x11:      // ドラム演奏\r
1927                                         case 0x12:\r
1928                                         case 0x13:\r
1929                                         case 0x14:\r
1930                                         case 0x15:\r
1931                                         case 0x16:\r
1932                                         case 0x17:\r
1933                                         case 0x18:\r
1934                                         case 0x19:\r
1935                                         case 0x1a:\r
1936                                                 if ( pChip.b空打ちチップである )\r
1937                                                 {\r
1938                                                         this.t進行描画_チップ_空打ち音設定_ドラム( configIni, ref dTX, ref pChip );\r
1939                                                 }\r
1940                                                 else\r
1941                                                 {\r
1942                                                         this.t進行描画_チップ_ドラムス( configIni, ref dTX, ref pChip );\r
1943                                                 }\r
1944                                                 break;\r
1945                                         #endregion\r
1946                                         #region [ 1f: フィルインサウンド(ドラム) ]\r
1947                                         case 0x1f:      // フィルインサウンド(ドラム)\r
1948                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1949                                                 {\r
1950                                                         pChip.bHit = true;\r
1951                                                         this.r現在の歓声Chip.Drums = pChip;\r
1952                                                 }\r
1953                                                 break;\r
1954                                         #endregion\r
1955                                         #region [ 20-27: ギター演奏 ]\r
1956                                         case 0x20:      // ギター演奏\r
1957                                         case 0x21:\r
1958                                         case 0x22:\r
1959                                         case 0x23:\r
1960                                         case 0x24:\r
1961                                         case 0x25:\r
1962                                         case 0x26:\r
1963                                         case 0x27:\r
1964                                                 this.t進行描画_チップ_ギターベース( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );\r
1965                                                 break;\r
1966                                         #endregion\r
1967                                         #region [ 28: ウェイリング(ギター) ]\r
1968                                         case 0x28:      // ウェイリング(ギター)\r
1969                                                 this.t進行描画_チップ_ギター_ウェイリング( configIni, ref dTX, ref pChip, !CDTXMania.ConfigIni.bDrums有効 );\r
1970                                                 break;\r
1971                                         #endregion\r
1972                                         #region [ 2f: ウェイリングサウンド(ギター) ]\r
1973                                         case 0x2f:      // ウェイリングサウンド(ギター)\r
1974                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
1975                                                 {\r
1976                                                         pChip.bHit = true;\r
1977                                                         this.r現在の歓声Chip.Guitar = pChip;\r
1978                                                 }\r
1979                                                 break;\r
1980                                         #endregion\r
1981                                         #region [ 31-3a: 不可視チップ配置(ドラム) ]\r
1982                                         case 0x31:      // 不可視チップ配置(ドラム)\r
1983                                         case 0x32:\r
1984                                         case 0x33:\r
1985                                         case 0x34:\r
1986                                         case 0x35:\r
1987                                         case 0x36:\r
1988                                         case 0x37:\r
1989                                         case 0x38:\r
1990                                         case 0x39:\r
1991                                         case 0x3a:\r
1992                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1993                                                 {\r
1994                                                         pChip.bHit = true;\r
1995                                                 }\r
1996                                                 break;\r
1997                                         #endregion\r
1998                                         #region [ 50: 小節線 ]\r
1999                                         case 0x50:      // 小節線\r
2000                                                 {\r
2001                                                         this.t進行描画_チップ_小節線( configIni, ref dTX, ref pChip );\r
2002                                                         break;\r
2003                                                 }\r
2004                                         #endregion\r
2005                                         #region [ 51: 拍線 ]\r
2006                                         case 0x51:      // 拍線\r
2007                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2008                                                 {\r
2009                                                         pChip.bHit = true;\r
2010                                                 }\r
2011                                                 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )\r
2012                                                 {\r
2013                                                         this.txチップ.t2D描画( CDTXMania.app.Device,\r
2014                                                                 0x23 * Scale.X,\r
2015                                                                 configIni.bReverse.Drums ?\r
2016                                                                         //(int) ( ( ( 0x38 + pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ) :\r
2017                                                                         //(int) ( ( ( 0x1a6 - pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ),\r
2018                                                                         (int) ( 0x37 * Scale.Y + pChip.nバーからの距離dot.Drums ) :\r
2019                                                                         (int) ( 0x1a5 * Scale.Y - pChip.nバーからの距離dot.Drums ),\r
2020                                                                 new Rectangle( 0, (int) ( 0x1bf * Scale.Y ), (int) ( 0x128 * Scale.X ), (int) ( 1 * Scale.Y ) )\r
2021                                                         );\r
2022                                                 }\r
2023                                                 break;\r
2024                                         #endregion\r
2025                                         #region [ 52: MIDIコーラス ]\r
2026                                         case 0x52:      // MIDIコーラス\r
2027                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2028                                                 {\r
2029                                                         pChip.bHit = true;\r
2030                                                 }\r
2031                                                 break;\r
2032                                         #endregion\r
2033                                         #region [ 53: フィルイン ]\r
2034                                         case 0x53:      // フィルイン\r
2035                                                 this.t進行描画_チップ_フィルイン( configIni, ref dTX, ref pChip );\r
2036                                                 break;\r
2037                                         #endregion\r
2038                                         #region [ 54: 動画再生(BGA領域), 5A: 動画再生(全画面) ]\r
2039                                         case (int) Ech定義.Movie:             // 動画再生 (BGA領域)\r
2040                                         case (int) Ech定義.MovieFull: // 動画再生 (全画面)\r
2041                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2042                                                 {\r
2043                                                         pChip.bHit = true;\r
2044                                                         if ( configIni.bAVI有効 )\r
2045                                                         {\r
2046                                                                 if ( CDTXMania.DTX.bチップがある.BGA )\r
2047                                                                 {\r
2048                                                                         this.actAVI.bHasBGA = true;\r
2049                                                                 }\r
2050                                                                 if ( pChip.nチャンネル番号 == (int) Ech定義.MovieFull || CDTXMania.ConfigIni.bForceAVIFullscreen )\r
2051                                                                 {\r
2052                                                                         this.actAVI.bFullScreenMovie = true;\r
2053                                                                 }\r
2054                                                                 switch ( pChip.eAVI種別 )\r
2055                                                                 {\r
2056                                                                         case EAVI種別.AVI:\r
2057                                                                                 //if ( pChip.rAVI != null )\r
2058                                                                                 {\r
2059                                                                                         //int startWidth = ( CDTXMania.DTX.bチップがある.BGA ) ? 278 : SampleFramework.GameWindowSize.Width;\r
2060                                                                                         //int startHeight = ( CDTXMania.DTX.bチップがある.BGA ) ? 355 : SampleFramework.GameWindowSize.Height;\r
2061                                                                                         int startWidth  = !this.actAVI.bFullScreenMovie ? 278 : SampleFramework.GameWindowSize.Width;\r
2062                                                                                         int startHeight = !this.actAVI.bFullScreenMovie ? 355 : SampleFramework.GameWindowSize.Height;\r
2063                                                                                         this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, startWidth, startHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );\r
2064                                                                                 }\r
2065                                                                                 break;\r
2066 \r
2067                                                                         case EAVI種別.AVIPAN:\r
2068                                                                                 if ( pChip.rAVIPan != null )\r
2069                                                                                 {\r
2070                                                                                         this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, pChip.rAVIPan.sz開始サイズ.Width, pChip.rAVIPan.sz開始サイズ.Height, pChip.rAVIPan.sz終了サイズ.Width, pChip.rAVIPan.sz終了サイズ.Height, pChip.rAVIPan.pt動画側開始位置.X, pChip.rAVIPan.pt動画側開始位置.Y, pChip.rAVIPan.pt動画側終了位置.X, pChip.rAVIPan.pt動画側終了位置.Y, pChip.rAVIPan.pt表示側開始位置.X, pChip.rAVIPan.pt表示側開始位置.Y, pChip.rAVIPan.pt表示側終了位置.X, pChip.rAVIPan.pt表示側終了位置.Y, pChip.n総移動時間, pChip.n発声時刻ms );\r
2071                                                                                 }\r
2072                                                                                 break;\r
2073                                                                 }\r
2074                                                         }\r
2075                                                 }\r
2076                                                 break;\r
2077                                         #endregion\r
2078                                         #region [ 61-92: 自動再生(BGM, SE) ]\r
2079                                         case 0x61:\r
2080                                         case 0x62:\r
2081                                         case 0x63:\r
2082                                         case 0x64:      // 自動再生(BGM, SE)\r
2083                                         case 0x65:\r
2084                                         case 0x66:\r
2085                                         case 0x67:\r
2086                                         case 0x68:\r
2087                                         case 0x69:\r
2088                                         case 0x70:\r
2089                                         case 0x71:\r
2090                                         case 0x72:\r
2091                                         case 0x73:\r
2092                                         case 0x74:\r
2093                                         case 0x75:\r
2094                                         case 0x76:\r
2095                                         case 0x77:\r
2096                                         case 0x78:\r
2097                                         case 0x79:\r
2098                                         case 0x80:\r
2099                                         case 0x81:\r
2100                                         case 0x82:\r
2101                                         case 0x83:\r
2102                                         case 0x90:\r
2103                                         case 0x91:\r
2104                                         case 0x92:\r
2105                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2106                                                 {\r
2107                                                         pChip.bHit = true;\r
2108                                                         if ( configIni.bBGM音を発声する )\r
2109                                                         {\r
2110                                                                 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );\r
2111                                                                 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, ( int ) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
2112                                                                 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値_内部番号;\r
2113                                                         }\r
2114                                                 }\r
2115                                                 break;\r
2116                                         #endregion\r
2117 \r
2118 \r
2119                                         #region [ 84-89: 仮: override sound ]  // #26338 2011.11.8 yyagi\r
2120                                         case 0x84:      // HH (HO/HC)\r
2121                                         case 0x85:      // CY\r
2122                                         case 0x86:      // RD\r
2123                                         case 0x87:      // LC\r
2124                                         case 0x88:      // Guitar\r
2125                                         case 0x89:      // Bass\r
2126                                         // mute sound (auto)\r
2127                                         // 4A: 84: HH (HO/HC)\r
2128                                         // 4B: 85: CY\r
2129                                         // 4C: 86: RD\r
2130                                         // 4D: 87: LC\r
2131                                         // 2A: 88: Gt\r
2132                                         // AA: 89: Bs\r
2133 \r
2134                                         //      CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );\r
2135                                         //      CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );\r
2136                                         //      this.n最後に再生した実WAV番号.Guitar = pChip.n整数値_内部番号;\r
2137 \r
2138                                         //      protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )\r
2139                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2140                                                 {\r
2141                                                         pChip.bHit = true;\r
2142                                                         E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };\r
2143 \r
2144                                                         E楽器パート pp =  p[ pChip.nチャンネル番号 - 0x84 ];\r
2145                                                         \r
2146 //                                                      if ( pp == E楽器パート.DRUMS ) {                   // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。\r
2147 //                                                              //            HC    CY    RD    LC\r
2148 //                                                              int[] ch = { 0x11, 0x16, 0x19, 0x1A };\r
2149 //                                                              pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ]; \r
2150 //                                                      }\r
2151                                                         this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量( pp ) );\r
2152                                                 }\r
2153                                                 break;\r
2154                                         #endregion\r
2155 \r
2156                                         #region [ a0-a7: ベース演奏 ]\r
2157                                         case 0xa0:      // ベース演奏\r
2158                                         case 0xa1:\r
2159                                         case 0xa2:\r
2160                                         case 0xa3:\r
2161                                         case 0xa4:\r
2162                                         case 0xa5:\r
2163                                         case 0xa6:\r
2164                                         case 0xa7:\r
2165                                                 this.t進行描画_チップ_ギターベース( configIni, ref dTX, ref pChip, E楽器パート.BASS );\r
2166                                                 break;\r
2167                                         #endregion\r
2168                                         #region [ a8: ウェイリング(ベース) ]\r
2169                                         case 0xa8:      // ウェイリング(ベース)\r
2170                                                 this.t進行描画_チップ_ベース_ウェイリング( configIni, ref dTX, ref pChip, !CDTXMania.ConfigIni.bDrums有効 );\r
2171                                                 break;\r
2172                                         #endregion\r
2173                                         #region [ af: ウェイリングサウンド(ベース) ]\r
2174                                         case 0xaf:      // ウェイリングサウンド(ベース)\r
2175                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2176                                                 {\r
2177                                                         pChip.bHit = true;\r
2178                                                         this.r現在の歓声Chip.Bass = pChip;\r
2179                                                 }\r
2180                                                 break;\r
2181                                         #endregion\r
2182                                         #region [ b1-b9, bc: 空打ち音設定(ドラム) ]\r
2183                                         case 0xb1:      // 空打ち音設定(ドラム)\r
2184                                         case 0xb2:\r
2185                                         case 0xb3:\r
2186                                         case 0xb4:\r
2187                                         case 0xb5:\r
2188                                         case 0xb6:\r
2189                                         case 0xb7:\r
2190                                         case 0xb8:\r
2191                                         case 0xb9:\r
2192                                         case 0xbc:\r
2193                                                 // ここには来なくなったはずだが、一応残しておく\r
2194                                                 this.t進行描画_チップ_空打ち音設定_ドラム( configIni, ref dTX, ref pChip );\r
2195                                                 break;\r
2196                                         #endregion\r
2197                                         #region [ ba: 空打ち音設定(ギター) ]\r
2198                                         case 0xba:      // 空打ち音設定(ギター)\r
2199                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
2200                                                 {\r
2201                                                         pChip.bHit = true;\r
2202                                                         this.r現在の空うちギターChip = pChip;\r
2203                                                         pChip.nチャンネル番号 = 0x20;\r
2204                                                 }\r
2205                                                 break;\r
2206                                         #endregion\r
2207                                         #region [ bb: 空打ち音設定(ベース) ]\r
2208                                         case 0xbb:      // 空打ち音設定(ベース)\r
2209                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2210                                                 {\r
2211                                                         pChip.bHit = true;\r
2212                                                         this.r現在の空うちベースChip = pChip;\r
2213                                                         pChip.nチャンネル番号 = 0xA0;\r
2214                                                 }\r
2215                                                 break;\r
2216                                         #endregion\r
2217                                         #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]\r
2218                                         case 0xc4:\r
2219                                         case 0xc7:\r
2220                                         case 0xd5:\r
2221                                         case 0xd6:      // BGA画像入れ替え\r
2222                                         case 0xd7:\r
2223                                         case 0xd8:\r
2224                                         case 0xd9:\r
2225                                         case 0xe0:\r
2226                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2227                                                 {\r
2228                                                         pChip.bHit = true;\r
2229                                                         if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )\r
2230                                                         {\r
2231                                                                 for ( int i = 0; i < 8; i++ )\r
2232                                                                 {\r
2233                                                                         if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )\r
2234                                                                         {\r
2235                                                                                 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );\r
2236                                                                         }\r
2237                                                                 }\r
2238                                                         }\r
2239                                                 }\r
2240                                                 break;\r
2241                                         #endregion\r
2242                                         #region [ da: ミキサーへチップ音追加 ]\r
2243                                         case 0xDA:\r
2244                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2245                                                 {\r
2246 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );\r
2247                                                         pChip.bHit = true;\r
2248                                                         if ( listWAV.ContainsKey( pChip.n整数値_内部番号 ) )     // 参照が遠いので後日最適化する\r
2249                                                         {\r
2250                                                                 CDTX.CWAV wc = listWAV[ pChip.n整数値_内部番号 ];\r
2251 //Debug.Write( "[AddMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );\r
2252 \r
2253                                                                 for ( int i = 0; i < nPolyphonicSounds; i++ )\r
2254                                                                 {\r
2255                                                                         if ( wc.rSound[ i ] != null )\r
2256                                                                         {\r
2257                                                                                 //CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );\r
2258                                                                                 AddMixer( wc.rSound[ i ], pChip.b演奏終了後も再生が続くチップである );\r
2259                                                                         }\r
2260                                                                         //else\r
2261                                                                         //{\r
2262                                                                         //    Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Sound管理.GetMixingStreams() );\r
2263                                                                         //    break;\r
2264                                                                         //}\r
2265                                                                         //if ( i == nPolyphonicSounds - 1 )\r
2266                                                                         //{\r
2267                                                                         //    Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Sound管理.GetMixingStreams() );\r
2268                                                                         //}\r
2269                                                                 }\r
2270                                                         }\r
2271                                                 }\r
2272                                                 break;\r
2273                                         #endregion\r
2274                                         #region [ db: ミキサーからチップ音削除 ]\r
2275                                         case 0xDB:\r
2276                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2277                                                 {\r
2278 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );\r
2279                                                         pChip.bHit = true;\r
2280                                                         if ( listWAV.ContainsKey( pChip.n整数値_内部番号) )      // 参照が遠いので後日最適化する\r
2281                                                         {\r
2282                                                             CDTX.CWAV wc = listWAV[ pChip.n整数値_内部番号];\r
2283 //Debug.Write( "[DelMixer] BAR=" + pChip.n発声位置 / 384 +  ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );\r
2284                                                                 for ( int i = 0; i < nPolyphonicSounds; i++ )\r
2285                                                             {\r
2286                                                                         if ( wc.rSound[ i ] != null )\r
2287                                                                         {\r
2288                                                                                 //CDTXMania.Sound管理.RemoveMixer( wc.rSound[ i ] );\r
2289                                                                                 if ( !wc.rSound[ i ].b演奏終了後も再生が続くチップである )     // #32248 2013.10.16 yyagi\r
2290                                                                                 {                                                                                                                       // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。\r
2291                                                                                         RemoveMixer( wc.rSound[ i ] );                                                  // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)\r
2292                                                                                 }                                                                                                                       // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。\r
2293                                                                         }\r
2294                                                                         //else\r
2295                                                                         //{\r
2296                                                                         //    Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Sound管理.GetMixingStreams() );\r
2297                                                                         //    break;\r
2298                                                                         //}\r
2299                                                                         //if ( i == nPolyphonicSounds - 1 )\r
2300                                                                         //{\r
2301                                                                         //    Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Sound管理.GetMixingStreams() );\r
2302                                                                         //}\r
2303                                                                 }\r
2304                                                         }\r
2305                                                 }\r
2306                                                 break;\r
2307                                         #endregion\r
2308                                         #region [ その他(未定義) ]\r
2309                                         default:\r
2310                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2311                                                 {\r
2312                                                         pChip.bHit = true;\r
2313                                                 }\r
2314                                                 break;\r
2315                                         #endregion \r
2316                                 }\r
2317                         }\r
2318                         return false;\r
2319                 }\r
2320 \r
2321                 public void t再読込()\r
2322                 {\r
2323                         CDTXMania.DTX.t全チップの再生停止とミキサーからの削除();\r
2324                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.再読込_再演奏;\r
2325                         base.eフェーズID = CStage.Eフェーズ.演奏_再読込;\r
2326                         this.bPAUSE = false;\r
2327 \r
2328                         // #34048 2014.7.16 yyagi\r
2329                         #region [ 読み込み画面に遷移する前に、設定変更した可能性があるパラメータをConfigIniクラスに書き戻す ]\r
2330                         for ( int i = 0; i < 3; i++ )\r
2331                         {\r
2332                                 CDTXMania.ConfigIni.nViewerScrollSpeed[ i ] = CDTXMania.ConfigIni.n譜面スクロール速度[ i ];\r
2333                         }\r
2334                         CDTXMania.ConfigIni.b演奏情報を表示する = CDTXMania.ConfigIni.bViewerShowDebugStatus;\r
2335                         #endregion\r
2336                 }\r
2337 \r
2338                 public void t停止()\r
2339                 {\r
2340                         CDTXMania.DTX.t全チップの再生停止とミキサーからの削除();\r
2341                         this.actAVI.Stop();\r
2342                         this.actBGA.Stop();\r
2343                         this.actPanel.Stop();                           // PANEL表示停止\r
2344                         CDTXMania.Timer.t一時停止();                // 再生時刻カウンタ停止\r
2345 \r
2346                         this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;        // 終端にシーク\r
2347 \r
2348                         // 自分自身のOn活性化()相当の処理もすべき。\r
2349                 }\r
2350 \r
2351                 public void t演奏位置の変更( int nStartBar )\r
2352                 {\r
2353                         // まず全サウンドオフにする\r
2354                         CDTXMania.DTX.t全チップの再生停止();\r
2355                         this.actAVI.Stop();\r
2356                         this.actBGA.Stop();\r
2357 \r
2358                         #region [ 再生開始小節の変更 ]\r
2359                         nStartBar++;                                                                    // +1が必要\r
2360 \r
2361                         #region [ 演奏済みフラグのついたChipをリセットする ]\r
2362                         for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )\r
2363                         {\r
2364                                 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
2365                                 if ( pChip.bHit )\r
2366                                 {\r
2367                                         CDTX.CChip p = (CDTX.CChip) pChip.Clone();\r
2368                                         p.bHit = false;\r
2369                                         CDTXMania.DTX.listChip[ i ] = p;\r
2370                                 }\r
2371                         }\r
2372                         #endregion\r
2373 \r
2374                         #region [ 処理を開始するチップの特定 ]\r
2375                         //for ( int i = this.n現在のトップChip; i < CDTXMania.DTX.listChip.Count; i++ )\r
2376                         bool bSuccessSeek = false;\r
2377                         for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )\r
2378                         {\r
2379                                 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
2380                                 if ( pChip.n発声位置 < 384 * nStartBar )\r
2381                                 {\r
2382                                         continue;\r
2383                                 }\r
2384                                 else\r
2385                                 {\r
2386                                         bSuccessSeek = true;\r
2387                                         this.n現在のトップChip = i;\r
2388                                         break;\r
2389                                 }\r
2390                         }\r
2391                         if ( !bSuccessSeek )\r
2392                         {\r
2393                                 // this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;\r
2394                                 this.n現在のトップChip = 0;               // 対象小節が存在しないなら、最初から再生\r
2395                         }\r
2396                         #endregion\r
2397 \r
2398                         #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]\r
2399                         int nStartTime = CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms;\r
2400 \r
2401                         CSound管理.rc演奏用タイマ.tリセット();      // これでPAUSE解除されるので、次のPAUSEチェックは不要\r
2402                         //if ( !this.bPAUSE )\r
2403                         //{\r
2404                                 CSound管理.rc演奏用タイマ.t一時停止();\r
2405                         //}\r
2406                         CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
2407                         #endregion\r
2408 \r
2409                         List<CSound> pausedCSound = new List<CSound>();\r
2410 \r
2411                         #region [ BGMやギターなど、演奏開始のタイミングで再生がかかっているサウンドのの途中再生開始 ] // (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと)\r
2412                         for ( int i = this.n現在のトップChip; i >= 0; i-- )\r
2413                         {\r
2414                                 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
2415                                 int nDuration = pChip.GetDuration();\r
2416 \r
2417                                 if ( ( pChip.n発声時刻ms + nDuration > 0 ) && ( pChip.n発声時刻ms <= nStartTime ) && ( nStartTime <= pChip.n発声時刻ms + nDuration ) )\r
2418                                 {\r
2419                                         if ( pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである )       // wav系チャンネル、且つ、空打ちチップではない\r
2420                                         {\r
2421                                                 CDTX.CWAV wc;\r
2422                                                 bool b = CDTXMania.DTX.listWAV.TryGetValue( pChip.n整数値_内部番号, out wc );\r
2423                                                 if ( !b ) continue;\r
2424 \r
2425                                                 if ( ( wc.bIsBGMSound && CDTXMania.ConfigIni.bBGM音を発声する ) || ( !wc.bIsBGMSound ) )\r
2426                                                 {\r
2427                                                         CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
2428                                                         #region [ PAUSEする ]\r
2429                                                         int j = wc.n現在再生中のサウンド番号;\r
2430                                                         if ( wc.rSound[ j ] != null )\r
2431                                                         {\r
2432                                                             wc.rSound[ j ].t再生を一時停止する();\r
2433                                                             wc.rSound[ j ].t再生位置を変更する( nStartTime - pChip.n発声時刻ms );\r
2434                                                             pausedCSound.Add( wc.rSound[ j ] );\r
2435                                                         }\r
2436                                                         #endregion\r
2437                                                 }\r
2438                                         }\r
2439                                 }\r
2440                         }\r
2441                         #endregion\r
2442                         #region [ 演奏開始時点で既に表示されているBGAとAVIの、シークと再生 ]\r
2443                         this.actBGA.SkipStart( nStartTime );\r
2444                         this.actAVI.SkipStart( nStartTime );\r
2445                         #endregion\r
2446                         #region [ PAUSEしていたサウンドを一斉に再生再開する(ただしタイマを止めているので、ここではまだ再生開始しない) ]\r
2447                         foreach ( CSound cs in pausedCSound )\r
2448                         {\r
2449                                 cs.tサウンドを再生する();\r
2450                         }\r
2451                         pausedCSound.Clear();\r
2452                         pausedCSound = null;\r
2453                         #endregion\r
2454                         #region [ タイマを再開して、PAUSEから復帰する ]\r
2455                         CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
2456                         CDTXMania.Timer.tリセット();                                                // これでPAUSE解除されるので、3行先の再開()は不要\r
2457                         CDTXMania.Timer.n現在時刻 = nStartTime;                             // Debug表示のTime: 表記を正しくするために必要\r
2458                         CSound管理.rc演奏用タイマ.t再開();\r
2459                         //CDTXMania.Timer.t再開();\r
2460                         this.bPAUSE = false;                                                            // システムがPAUSE状態だったら、強制解除\r
2461                         this.actPanel.Start();\r
2462                         #endregion\r
2463                         #endregion\r
2464                 }\r
2465 \r
2466 \r
2467                 /// <summary>\r
2468                 /// DTXV用の設定をする。(全AUTOなど)\r
2469                 /// 元の設定のバックアップなどはしないので、あとでConfig.iniを上書き保存しないこと。\r
2470                 /// </summary>\r
2471                 protected void tDTXV用の設定()\r
2472                 {\r
2473                         CDTXMania.ConfigIni.bAutoPlay.HH = true;\r
2474                         CDTXMania.ConfigIni.bAutoPlay.SD = true;\r
2475                         CDTXMania.ConfigIni.bAutoPlay.BD = true;\r
2476                         CDTXMania.ConfigIni.bAutoPlay.HT = true;\r
2477                         CDTXMania.ConfigIni.bAutoPlay.LT = true;\r
2478                         CDTXMania.ConfigIni.bAutoPlay.CY = true;\r
2479                         CDTXMania.ConfigIni.bAutoPlay.FT = true;\r
2480                         CDTXMania.ConfigIni.bAutoPlay.RD = true;\r
2481                         CDTXMania.ConfigIni.bAutoPlay.LC = true;\r
2482                         CDTXMania.ConfigIni.bAutoPlay.GtR = true;\r
2483                         CDTXMania.ConfigIni.bAutoPlay.GtB = true;\r
2484                         CDTXMania.ConfigIni.bAutoPlay.GtB = true;\r
2485                         CDTXMania.ConfigIni.bAutoPlay.GtPick = true;\r
2486                         CDTXMania.ConfigIni.bAutoPlay.GtW = true;\r
2487                         CDTXMania.ConfigIni.bAutoPlay.BsR = true;\r
2488                         CDTXMania.ConfigIni.bAutoPlay.BsB = true;\r
2489                         CDTXMania.ConfigIni.bAutoPlay.BsB = true;\r
2490                         CDTXMania.ConfigIni.bAutoPlay.BsPick = true;\r
2491                         CDTXMania.ConfigIni.bAutoPlay.BsW = true;\r
2492 \r
2493                         this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;\r
2494 \r
2495                         CDTXMania.ConfigIni.bAVI有効 = true;\r
2496                         CDTXMania.ConfigIni.bBGA有効 = true;\r
2497                         for ( int i = 0; i < 3; i++ )\r
2498                         {\r
2499                                 CDTXMania.ConfigIni.bGraph[ i ] = false;\r
2500                                 CDTXMania.ConfigIni.bHidden[ i ] = false;\r
2501                                 CDTXMania.ConfigIni.bLeft[ i ] = false;\r
2502                                 CDTXMania.ConfigIni.bLight[ i ] = false;\r
2503                                 CDTXMania.ConfigIni.bReverse[ i ] = false;\r
2504                                 CDTXMania.ConfigIni.bSudden[ i ] = false;\r
2505                                 CDTXMania.ConfigIni.eInvisible[ i ] = EInvisible.OFF;\r
2506                                 CDTXMania.ConfigIni.eRandom[ i ] = Eランダムモード.OFF;\r
2507                                 CDTXMania.ConfigIni.n表示可能な最小コンボ数[ i ] = 65535;\r
2508                                 CDTXMania.ConfigIni.判定文字表示位置[ i ] = E判定文字表示位置.表示OFF;\r
2509                                 // CDTXMania.ConfigIni.n譜面スクロール速度[ i ] = CDTXMania.ConfigIni.nViewerScrollSpeed[ i ]; // これだけはOn活性化()で行うこと。\r
2510                                                                                                                                                                                                                                 // そうしないと、演奏開始直後にスクロール速度が変化して見苦しい。\r
2511                         }\r
2512 \r
2513                         CDTXMania.ConfigIni.eDark = Eダークモード.OFF;\r
2514 \r
2515                         CDTXMania.ConfigIni.b演奏情報を表示する = CDTXMania.ConfigIni.bViewerShowDebugStatus;\r
2516                         CDTXMania.ConfigIni.bフィルイン有効 = true;\r
2517                         CDTXMania.ConfigIni.bScoreIniを出力する = false;\r
2518                         CDTXMania.ConfigIni.bSTAGEFAILED有効 = false;\r
2519                         CDTXMania.ConfigIni.bTight = false;\r
2520                         CDTXMania.ConfigIni.bストイックモード = false;\r
2521                         CDTXMania.ConfigIni.bドラム打音を発声する = true;\r
2522                         CDTXMania.ConfigIni.bBGM音を発声する = true;\r
2523 \r
2524                         CDTXMania.ConfigIni.nRisky = 0;\r
2525                         CDTXMania.ConfigIni.nShowLagType = 0;\r
2526                         CDTXMania.ConfigIni.ドラムコンボ文字の表示位置 = Eドラムコンボ文字の表示位置.OFF;\r
2527                 }\r
2528 \r
2529 \r
2530                 private bool bCheckAutoPlay( CDTX.CChip pChip )\r
2531                 {\r
2532                         bool bPChipIsAutoPlay = false;\r
2533                         bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2534                         bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2535                         bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2536                         bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2537                         bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2538                         //if ( (\r
2539                         //        ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||\r
2540                         //        ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||\r
2541                         //        ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )\r
2542                         //  )\r
2543                         ////                            if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])\r
2544                         //{\r
2545                         //    bPChipIsAutoPlay = true;\r
2546                         //}\r
2547                         if ( pChip.e楽器パート == E楽器パート.DRUMS )\r
2548                         {\r
2549                                 if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )\r
2550                                 {\r
2551                                         bPChipIsAutoPlay = true;\r
2552                                 }\r
2553                         }\r
2554                         else if ( pChip.e楽器パート == E楽器パート.GUITAR )\r
2555                         {\r
2556                                 //Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );\r
2557                                 //Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);\r
2558                                 bPChipIsAutoPlay = true;\r
2559                                 if ( bIsAutoPlay[ (int) Eレーン.GtPick ] == false ) bPChipIsAutoPlay = false;\r
2560                                 else\r
2561                                 {\r
2562                                         if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.GtR ] == false ) bPChipIsAutoPlay = false;\r
2563                                         else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.GtG ] == false ) bPChipIsAutoPlay = false;\r
2564                                         else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.GtB ] == false ) bPChipIsAutoPlay = false;\r
2565                                         else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.GtW ] == false ) bPChipIsAutoPlay = false;\r
2566                                         else if ( bGtBsO == true &&\r
2567                                                 ( bIsAutoPlay[ (int) Eレーン.GtR ] == false || bIsAutoPlay[ (int) Eレーン.GtG ] == false || bIsAutoPlay[ (int) Eレーン.GtB ] == false ) )\r
2568                                                 bPChipIsAutoPlay = false;\r
2569                                 }\r
2570                                 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );\r
2571                         }\r
2572                         else if ( pChip.e楽器パート == E楽器パート.BASS )\r
2573                         {\r
2574                                 bPChipIsAutoPlay = true;\r
2575                                 if ( bIsAutoPlay[ (int) Eレーン.BsPick ] == false ) bPChipIsAutoPlay = false;\r
2576                                 else\r
2577                                 {\r
2578                                         if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.BsR ] == false ) bPChipIsAutoPlay = false;\r
2579                                         else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.BsG ] == false ) bPChipIsAutoPlay = false;\r
2580                                         else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.BsB ] == false ) bPChipIsAutoPlay = false;\r
2581                                         else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.BsW ] == false ) bPChipIsAutoPlay = false;\r
2582                                         else if ( bGtBsO == true &&\r
2583                                                 ( bIsAutoPlay[ (int) Eレーン.BsR ] == false || bIsAutoPlay[ (int) Eレーン.BsG ] == false || bIsAutoPlay[ (int) Eレーン.BsB ] == false ) )\r
2584                                                 bPChipIsAutoPlay = false;\r
2585                                 }\r
2586                         }\r
2587                         return bPChipIsAutoPlay;\r
2588                 }\r
2589 \r
2590                 protected abstract void t進行描画_チップ_ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2591                 //protected abstract void t進行描画_チップ_ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2592                 protected abstract void t進行描画_チップ_ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst );\r
2593                 /// <summary>\r
2594                 /// ギター・ベースのチップ表示\r
2595                 /// </summary>\r
2596                 /// <param name="configIni"></param>\r
2597                 /// <param name="dTX"></param>\r
2598                 /// <param name="pChip">描画するチップ</param>\r
2599                 /// <param name="inst">楽器種別</param>\r
2600                 /// <param name="barYNormal">Normal時判定ライン表示Y座標</param>\r
2601                 /// <param name="barYReverse">Reverse時判定ライン表示Y座標</param>\r
2602                 /// <param name="showRangeY0">チップ表示Y座標範囲(最小値)</param>\r
2603                 /// <param name="showRangeY1">チップ表示Y座標範囲(最大値)</param>\r
2604                 /// <param name="openXg">オープンチップの表示X座標(ギター用)</param>\r
2605                 /// <param name="openXb">オープンチップの表示X座標(ベース用)</param>\r
2606                 /// <param name="rectOpenOffsetX">テクスチャ内のオープンチップregionのx座標</param>\r
2607                 /// <param name="rectOpenOffsetY">テクスチャ内のオープンチップregionのy座標</param>\r
2608                 /// <param name="openChipWidth">テクスチャ内のオープンチップregionのwidth</param>\r
2609                 /// <param name="chipHeight">テクスチャ内のチップのheight</param>\r
2610                 /// <param name="chipWidth">テクスチャ内のチップのwidth</param>\r
2611                 /// <param name="guitarNormalX">ギターチップ描画のx座標(Normal)</param>\r
2612                 /// <param name="guitarLeftyX">ギターチップ描画のx座標(Lefty)</param>\r
2613                 /// <param name="bassNormalX">ベースチップ描画のx座標(Normal)</param>\r
2614                 /// <param name="bassLeftyX">ベースチップ描画のx座標(Lefty)</param>\r
2615                 /// <param name="drawDeltaX">描画のX座標間隔(R,G,B...)</param>\r
2616                 /// <param name="chipTexDeltaX">テクスチャののX座標間隔(R,G,B...)</param>\r
2617                 protected void t進行描画_チップ_ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst,\r
2618                         int barYNormal, int barYReverse,\r
2619                         int showRangeY0, int showRangeY1, int openXg, int openXb,\r
2620                         int rectOpenOffsetX, int rectOpenOffsetY, int openChipWidth, int chipHeight, int chipWidth,\r
2621                         int guitarNormalX, int guitarLeftyX, int bassNormalX, int bassLeftyX, int drawDeltaX, int chipTexDeltaX )\r
2622                 {\r
2623                         int instIndex = (int) inst;\r
2624                         if ( configIni.bGuitar有効 )\r
2625                         {\r
2626                                 #region [ Invisible処理 ]\r
2627                                 if ( configIni.eInvisible[ instIndex ] != EInvisible.OFF )\r
2628                                 {\r
2629                                         cInvisibleChip.SetInvisibleStatus( ref pChip );\r
2630                                 }\r
2631                                 #endregion\r
2632                                 else\r
2633                                 {\r
2634                                         #region [ Hidden/Sudden処理 ]\r
2635                                         if ( configIni.bSudden[ instIndex ] )\r
2636                                         {\r
2637                                                 pChip.b可視 = ( pChip.nバーからの距離dot[ instIndex ] < 200 * Scale.Y );\r
2638                                         }\r
2639                                         if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 * Scale.Y ) )\r
2640                                         {\r
2641                                                 pChip.b可視 = false;\r
2642                                         }\r
2643                                         #endregion\r
2644                                 }\r
2645 \r
2646                                 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2647                                 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2648                                 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2649                                 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2650                                 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2651 \r
2652                                 #region [ chip描画 ]\r
2653                                 int OPEN = ( inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;\r
2654                                 if ( !pChip.bHit && pChip.b可視 )\r
2655                                 {\r
2656                                         if ( this.txチップ != null )\r
2657                                         {\r
2658                                                 this.txチップ.n透明度 = pChip.n透明度;\r
2659                                         }\r
2660                                         int y = configIni.bReverse[ instIndex ] ?\r
2661                                                 (int) ( barYReverse - pChip.nバーからの距離dot[ instIndex ] ) :\r
2662                                                 (int) ( barYNormal  + pChip.nバーからの距離dot[ instIndex ] );\r
2663                                         int n小節線消失距離dot = configIni.bReverse[ instIndex ] ?\r
2664                                                 (int) ( -100 * Scale.Y ) :\r
2665                                                 ( configIni.e判定位置[ instIndex ] == E判定位置.標準 ) ? (int) ( -36 * Scale.Y ) : (int) ( -25 * Scale.Y );\r
2666                                         if ( configIni.bReverse[ instIndex ] )\r
2667                                         {\r
2668                                                 //showRangeY1 = barYReverse - n小節線消失距離dot;\r
2669                                         }\r
2670                                         else\r
2671                                         {\r
2672                                                 showRangeY0 = barYNormal + n小節線消失距離dot;\r
2673                                         }\r
2674                                         if ( ( showRangeY0 < y ) && ( y < showRangeY1 ) )\r
2675                                         {\r
2676                                                 if ( this.txチップ != null )\r
2677                                                 {\r
2678                                                         int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;\r
2679                                                         #region [ OPENチップの描画 ]\r
2680                                                         if ( pChip.nチャンネル番号 == OPEN )\r
2681                                                         {\r
2682                                                                 int xo = ( inst == E楽器パート.GUITAR ) ? openXg : openXb;\r
2683                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2684                                                                         xo * Scale.X,\r
2685                                                                         y - ( 2 * Scale.Y ),\r
2686                                                                         new Rectangle(\r
2687                                                                                 (int) ( rectOpenOffsetX * Scale.X ),\r
2688                                                                                 (int) ( rectOpenOffsetY * Scale.Y ) + (int) ( ( ( nアニメカウンタ現在の値 % 5 ) * chipHeight * Scale.Y ) ),\r
2689                                                                                 (int) ( openChipWidth * Scale.X ),\r
2690                                                                                 (int) ( chipHeight * Scale.Y )\r
2691                                                                         )\r
2692                                                                 );\r
2693                                                         }\r
2694                                                         #endregion\r
2695                                                         Rectangle rc = new Rectangle(\r
2696                                                                 (int) ( rectOpenOffsetX * Scale.X ),\r
2697                                                                 (int) ( nアニメカウンタ現在の値 * chipHeight * Scale.Y ),\r
2698                                                                 (int) ( chipWidth * Scale.X ),\r
2699                                                                 (int) ( chipHeight * Scale.Y )\r
2700                                                         );\r
2701                                                         #region [ RGBチップのX座標初期化 ]\r
2702                                                         int x;\r
2703                                                         if ( inst == E楽器パート.GUITAR )\r
2704                                                         {\r
2705                                                                 x = ( configIni.bLeft.Guitar ) ? guitarLeftyX : guitarNormalX;\r
2706                                                         }\r
2707                                                         else\r
2708                                                         {\r
2709                                                                 x = ( configIni.bLeft.Bass ) ? bassLeftyX : bassNormalX;\r
2710                                                         }\r
2711                                                         int deltaX = ( configIni.bLeft[ instIndex ] ) ? -drawDeltaX : +drawDeltaX;\r
2712                                                         #endregion\r
2713                                                         //Trace.TraceInformation( "chip={0:x2}, E楽器パート={1}, x={2}", pChip.nチャンネル番号, inst, x );\r
2714                                                         #region [ Rチップ描画 ]\r
2715                                                         if ( bChipHasR )\r
2716                                                         {\r
2717                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2718                                                                         x * Scale.X,\r
2719                                                                         y - ( chipHeight / 2 ) * Scale.Y,\r
2720                                                                         rc\r
2721                                                                 );\r
2722                                                         }\r
2723                                                         #endregion\r
2724                                                         #region [ Gチップ描画 ]\r
2725                                                         rc.X += (int) ( chipTexDeltaX * Scale.X );\r
2726                                                         x += deltaX;\r
2727                                                         if ( bChipHasG )\r
2728                                                         {\r
2729                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2730                                                                         x * Scale.X,\r
2731                                                                         y - ( chipHeight / 2 ) * Scale.Y,\r
2732                                                                         rc\r
2733                                                                 );\r
2734                                                         }\r
2735                                                         #endregion\r
2736                                                         #region [ Bチップ描画 ]\r
2737                                                         rc.X += (int) ( chipTexDeltaX * Scale.X );\r
2738                                                         x += deltaX;\r
2739                                                         if ( bChipHasB )\r
2740                                                         {\r
2741                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2742                                                                         x * Scale.X,\r
2743                                                                         y - ( chipHeight / 2 ) * Scale.Y,\r
2744                                                                         rc\r
2745                                                                 );\r
2746                                                         }\r
2747                                                         #endregion\r
2748                                                 }\r
2749                                         }\r
2750                                 }\r
2751                                 #endregion\r
2752                                 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
2753                                 if ( ( !pChip.bHit ) && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )\r
2754                                 {\r
2755                                         int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3;   // lane offset\r
2756                                         bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;\r
2757                                         bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;\r
2758                                         bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;\r
2759                                         bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;\r
2760                                         bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );\r
2761                                         bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );\r
2762                                         bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );\r
2763 \r
2764                                         cInvisibleChip.StartSemiInvisible( inst );\r
2765                                         #region [ Chip Fire effects (auto時用) ]\r
2766                                         bool bSuccessOPEN = bChipIsO && ( autoR || !pushingR ) && ( autoG || !pushingG ) && ( autoB || !pushingB );\r
2767                                         if ( autoPick )                 // autoPickでない時の処理は、 t入力処理・ギターベース(E楽器パート) で行う\r
2768                                         {\r
2769                                                 if ( ( bChipHasR && ( autoR || pushingR ) ) || bSuccessOPEN )\r
2770                                                 {\r
2771                                                         this.actChipFireGB.Start( 0 + lo, 演奏判定ライン座標 );\r
2772                                                 }\r
2773                                                 if ( ( bChipHasG && ( autoG || pushingG ) ) || bSuccessOPEN )\r
2774                                                 {\r
2775                                                         this.actChipFireGB.Start( 1 + lo, 演奏判定ライン座標 );\r
2776                                                 }\r
2777                                                 if ( ( bChipHasB && ( autoB || pushingB ) ) || bSuccessOPEN )\r
2778                                                 {\r
2779                                                         this.actChipFireGB.Start( 2 + lo, 演奏判定ライン座標 );\r
2780                                                 }\r
2781                                         }\r
2782                                         #endregion\r
2783                                         #region [ autopick ]\r
2784                                         if ( autoPick )\r
2785                                         {\r
2786                                                 bool bMiss = true;\r
2787                                                 if ( bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB )           // autoレーンとチップレーン一致時はOK\r
2788                                                 {                                                                                                                                                       // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。\r
2789                                                         bMiss = false;\r
2790                                                 }\r
2791                                                 else if ( ( autoR || ( bChipHasR == pushingR ) ) && ( autoG || ( bChipHasG == pushingG ) ) && ( autoB || ( bChipHasB == pushingB ) ) )\r
2792                                                         // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )\r
2793                                                 {\r
2794                                                         bMiss = false;\r
2795                                                 }\r
2796                                                 else if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ) // OPEN時\r
2797                                                 {\r
2798                                                         bMiss = false;\r
2799                                                 }\r
2800                                                 pChip.bHit = true;\r
2801                                                 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );\r
2802                                                 this.r次にくるギターChip = null;\r
2803                                                 if ( !bMiss )\r
2804                                                 {\r
2805                                                         this.tチップのヒット処理( pChip.n発声時刻ms, pChip );\r
2806                                                 }\r
2807                                                 else\r
2808                                                 {\r
2809                                                         pChip.nLag = 0;         // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入\r
2810                                                         this.tチップのヒット処理( pChip.n発声時刻ms, pChip, false );\r
2811                                                 }\r
2812                                                 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;\r
2813                                                 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( pChip.n発声時刻ms, chWailingChip, this.nInputAdjustTimeMs[ instIndex ], 140 );\r
2814                                                 if ( item != null && !bMiss )\r
2815                                                 {\r
2816                                                         this.queWailing[ instIndex ].Enqueue( item );\r
2817                                                 }\r
2818                                         }\r
2819                                         #endregion\r
2820                                 }\r
2821                                 return;\r
2822                         }       // end of "if configIni.bGuitar有効"\r
2823                         if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )      // Guitar/Bass無効の場合は、自動演奏する\r
2824                         {\r
2825                                 pChip.bHit = true;\r
2826                                 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );\r
2827                         }\r
2828                 }\r
2829 \r
2830                 \r
2831                 protected virtual void t進行描画_チップ_ギターベース_ウェイリング(\r
2832                         CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst, bool bGRmode )\r
2833                 {\r
2834                         int indexInst = (int) inst;\r
2835                         if ( configIni.bGuitar有効 )\r
2836                         {\r
2837                                 #region [ Invisible処理 ]\r
2838                                 if ( configIni.eInvisible[ indexInst ] != EInvisible.OFF )\r
2839                                 {\r
2840                                         cInvisibleChip.SetInvisibleStatus( ref pChip );\r
2841                                 }\r
2842                                 #endregion\r
2843                                 #region [ Sudden/Hidden処理 ]\r
2844                                 if ( configIni.bSudden[indexInst] )\r
2845                                 {\r
2846                                         pChip.b可視 = ( pChip.nバーからの距離dot[indexInst] < 200 * Scale.Y );\r
2847                                 }\r
2848                                 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 * Scale.Y ) )\r
2849                                 {\r
2850                                         pChip.b可視 = false;\r
2851                                 }\r
2852                                 #endregion\r
2853 \r
2854                                 cWailingChip[ indexInst ].t進行描画_チップ_ギターベース_ウェイリング(\r
2855                                         configIni, ref dTX, ref pChip,\r
2856                                         ref txチップ, ref 演奏判定ライン座標, ref ctWailingチップ模様アニメ\r
2857                                 );\r
2858 \r
2859                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )\r
2860                                 {\r
2861                                         if ( pChip.nバーからの距離dot[indexInst] < -234 * Scale.Y )      // #25253 2011.5.29 yyagi: Don't set pChip.bHit=true for wailing at once. It need to 1sec-delay (234pix per 1sec). \r
2862                                         {\r
2863                                                 pChip.bHit = true;\r
2864                                         }\r
2865                                         bool autoW = ( inst == E楽器パート.GUITAR ) ? configIni.bAutoPlay.GtW : configIni.bAutoPlay.BsW;\r
2866                                         //if ( configIni.bAutoPlay[ ((int) Eレーン.Guitar - 1) + indexInst ] )       // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
2867                                         if ( autoW )\r
2868                                         {\r
2869                                         //    pChip.bHit = true;                                                                // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.\r
2870                                         //    this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );\r
2871                                         // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.\r
2872                                         // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time\r
2873                                                 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
2874                                                 DoWailingFromQueue( inst, nTimeStamp_Wailed, autoW );\r
2875                                         }\r
2876                                         cInvisibleChip.StartSemiInvisible( inst );\r
2877                                 }\r
2878                                 return;\r
2879                         }\r
2880                         pChip.bHit = true;\r
2881                 }\r
2882                 protected virtual void t進行描画_チップ_ギター_ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, bool bGRmode )\r
2883                 {\r
2884                         t進行描画_チップ_ギターベース_ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR, bGRmode );\r
2885                 }\r
2886                 protected abstract void t進行描画_チップ_フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2887                 protected abstract void t進行描画_チップ_小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2888                 //protected abstract void t進行描画_チップ_ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2889                 protected virtual void t進行描画_チップ_ベース_ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, bool bGRmode )\r
2890                 {\r
2891                         t進行描画_チップ_ギターベース_ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS, bGRmode );\r
2892                 }\r
2893 \r
2894         \r
2895                 \r
2896                 protected abstract void t進行描画_チップ_空打ち音設定_ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2897                 protected void t進行描画_チップアニメ()\r
2898                 {\r
2899                         for ( int i = 0; i < 3; i++ )                   // 0=drums, 1=guitar, 2=bass\r
2900                         {\r
2901                                 if ( this.ctチップ模様アニメ[ i ] != null )\r
2902                                 {\r
2903                                         this.ctチップ模様アニメ[ i ].t進行Loop();\r
2904                                 }\r
2905                         }\r
2906                         if ( this.ctWailingチップ模様アニメ != null )\r
2907                         {\r
2908                                 this.ctWailingチップ模様アニメ.t進行Loop();\r
2909                         }\r
2910                 }\r
2911 \r
2912                 protected bool t進行描画_フェードイン_アウト()\r
2913                 {\r
2914                         switch ( base.eフェーズID )\r
2915                         {\r
2916                                 case CStage.Eフェーズ.共通_フェードイン:\r
2917                                         if ( this.actFI.On進行描画() != 0 )\r
2918                                         {\r
2919                                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
2920                                         }\r
2921                                         break;\r
2922 \r
2923                                 case CStage.Eフェーズ.共通_フェードアウト:\r
2924                                 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:\r
2925                                         if ( this.actFO.On進行描画() != 0 )\r
2926                                         {\r
2927                                                 return true;\r
2928                                         }\r
2929                                         break;\r
2930 \r
2931                                 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:\r
2932                                         if ( this.actFOClear.On進行描画() == 0 )\r
2933                                         {\r
2934                                                 break;\r
2935                                         }\r
2936                                         return true;\r
2937                 \r
2938                         }\r
2939                         return false;\r
2940                 }\r
2941                 protected void t進行描画_レーンフラッシュD()\r
2942                 {\r
2943                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
2944                         {\r
2945                                 this.actLaneFlushD.On進行描画();\r
2946                         }\r
2947                 }\r
2948                 protected void t進行描画_レーンフラッシュGB()\r
2949                 {\r
2950                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )\r
2951                         {\r
2952                                 this.actLaneFlushGB.On進行描画();\r
2953                         }\r
2954                 }\r
2955                 protected abstract void t進行描画_演奏情報();\r
2956                 protected void t進行描画_演奏情報(int x, int y)\r
2957                 {\r
2958                         if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )\r
2959                         {\r
2960                                 this.actPlayInfo.t進行描画( x, y );\r
2961                         }\r
2962                 }\r
2963                 protected void t進行描画_背景()\r
2964                 {\r
2965                         if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )\r
2966                         {\r
2967                                 if ( this.tx背景 != null )\r
2968                                 {\r
2969                                         this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
2970                                 }\r
2971                         }\r
2972                         else\r
2973                         {\r
2974                                 // FullHD版では、背景描画のさらに奥でAVI描画をするため、\r
2975                                 // Dark!=OFF時下記の画面クリアをすると、AVI描画がクリアされてしまう\r
2976                                 // CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );\r
2977                         }\r
2978                 }\r
2979 \r
2980                 protected void t進行描画_判定ライン()\r
2981                 {\r
2982                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
2983                         {\r
2984                                 int y = CDTXMania.ConfigIni.bReverse.Drums ? (int) ( 53 * Scale.Y ) - 演奏判定ライン座標.nJudgeLinePosY_delta.Drums : (int) ( 419 * Scale.Y ) + 演奏判定ライン座標.nJudgeLinePosY_delta.Drums;\r
2985                                                                                                                                 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする\r
2986                                 if ( this.txヒットバー != null )\r
2987                                 {\r
2988                                         for ( int i = 32; i < 335; i += 8 )\r
2989                                         {\r
2990                                                 this.txヒットバー.t2D描画( CDTXMania.app.Device,\r
2991                                                         i * Scale.X,\r
2992                                                         y,\r
2993                                                         new Rectangle( 0, 0, ( ( i + 8 ) >= 335 ) ? (int) ( ( 7 - ( ( i + 8 ) - 335 ) ) * Scale.X ) : (int) ( 8 * Scale.X ), (int) ( 8 * Scale.Y ) ) );\r
2994                                         }\r
2995                                 }\r
2996                         }\r
2997                 }\r
2998                 protected void t進行描画_判定文字列()\r
2999                 {\r
3000                         this.actJudgeString.t進行描画( 演奏判定ライン座標 );\r
3001                 }\r
3002                 protected void t進行描画_判定文字列1_通常位置指定の場合()\r
3003                 {\r
3004                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.コンボ下 )     // 判定ライン上または横\r
3005                         {\r
3006                                 this.actJudgeString.t進行描画( 演奏判定ライン座標 );\r
3007                         }\r
3008                 }\r
3009                 protected void t進行描画_判定文字列2_判定ライン上指定の場合()\r
3010                 {\r
3011                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.コンボ下 )     // 判定ライン上または横\r
3012                         {\r
3013                                 this.actJudgeString.t進行描画( 演奏判定ライン座標 );\r
3014                         }\r
3015                 }\r
3016 \r
3017                 protected void t進行描画_譜面スクロール速度()\r
3018                 {\r
3019                         this.act譜面スクロール速度.On進行描画();\r
3020                 }\r
3021 \r
3022                 protected abstract void t背景テクスチャの生成();\r
3023                 protected void t背景テクスチャの生成( string DefaultBgFilename, string DefaultLaneFilename, Rectangle bgrect, string bgfilename )\r
3024                 {                                                                       // Default...: レーン等があるレイヤー                bgfilename: DTXファイルで指定する背景\r
3025                         Bitmap image = null;\r
3026                         bool bSuccessLoadDTXbgfile = false;\r
3027 \r
3028                         int[] offsetX = new int[2]{ 96, 506 };\r
3029                         //int nLanePosition = (int) CDTXMania.ConfigIni.eドラムレーン表示位置;\r
3030                         int nLanePosition = (int) Eドラムレーン表示位置.Left;\r
3031                         \r
3032                         if ( bgfilename != null && File.Exists( bgfilename ) && !CDTXMania.DTX.bチップがある.Movie )\r
3033                         {\r
3034                                 try\r
3035                                 {\r
3036                                         #region [ DTXデータで指定されている背景画像を読み込む ]\r
3037                                         Bitmap bitmap1 = null;\r
3038                                         bitmap1 = new Bitmap( bgfilename );\r
3039                                         if ( ( bitmap1.Size.Width == 0 ) && ( bitmap1.Size.Height == 0 ) )\r
3040                                         {\r
3041                                                 this.tx背景 = null;\r
3042                                                 return;\r
3043                                         }\r
3044                                         #endregion\r
3045 \r
3046                                         int newWidth = (int) ( bitmap1.Width * Scale.X );\r
3047                                         int newHeight = (int) ( bitmap1.Height * Scale.Y );\r
3048                                         Bitmap bitmap2;\r
3049 \r
3050                                         #region [ 背景画像がVGAサイズ以下なら、FullHDサイズに拡大する ]\r
3051                                         if ( bitmap1.Width <= 640 && bitmap1.Height <= 480 )\r
3052                                         {\r
3053                                                 bitmap2 = new Bitmap( newWidth, newHeight );\r
3054                                                 Graphics graphic2 = Graphics.FromImage( bitmap2 );\r
3055                                                 graphic2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;\r
3056                                                 graphic2.DrawImage( bitmap1, 0, 0, newWidth, newHeight );\r
3057                                                 graphic2.Dispose();\r
3058                                         }\r
3059                                         else\r
3060                                         {\r
3061                                                 bitmap2 = (Bitmap) bitmap1.Clone();\r
3062                                         }\r
3063                                         bitmap1.Dispose();\r
3064                                         #endregion\r
3065 \r
3066                                         #region [ 実背景に格子状に配置するよう、コピーしていく ]\r
3067                                         Bitmap bitmap3 = new Bitmap( SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height );\r
3068                                         Graphics graphics3 = Graphics.FromImage( bitmap3 );\r
3069                                         for ( int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height )\r
3070                                         {\r
3071                                                 for ( int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width )\r
3072                                                 {\r
3073                                                         graphics3.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );\r
3074                                                 }\r
3075                                         }\r
3076                                         graphics3.Dispose();\r
3077                                         bitmap2.Dispose();\r
3078                                         #endregion\r
3079 \r
3080                                         #region [ レーン外・レーンそのもののフレームを合成 ]\r
3081                                         image = new Bitmap( CSkin.Path( DefaultBgFilename ) );  // レーン外のフレーム\r
3082                                         graphics3 = Graphics.FromImage( image );\r
3083 \r
3084                                         #region [ レーンのフレームがあれば、それを合成 ]\r
3085                                         if ( DefaultLaneFilename != "" )\r
3086                                         {\r
3087                                                 Bitmap bmLane = new Bitmap( CSkin.Path( DefaultLaneFilename ) );\r
3088                                                 graphics3.DrawImage( bmLane, offsetX[ nLanePosition ], 0 );\r
3089                                                 bmLane.Dispose();\r
3090                                         }\r
3091                                         #endregion\r
3092                 \r
3093                                         ColorMatrix matrix2 = new ColorMatrix();\r
3094                                         matrix2.Matrix00 = 1f;\r
3095                                         matrix2.Matrix11 = 1f;\r
3096                                         matrix2.Matrix22 = 1f;\r
3097                                         matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;\r
3098                                         matrix2.Matrix44 = 1f;\r
3099                                         ColorMatrix newColorMatrix = matrix2;\r
3100                                         ImageAttributes imageAttr = new ImageAttributes();\r
3101                                         imageAttr.SetColorMatrix( newColorMatrix );\r
3102                                         graphics3.DrawImage( bitmap3, new Rectangle( 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height ), 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height, GraphicsUnit.Pixel, imageAttr );\r
3103                                 //      graphics3.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );\r
3104                                         bitmap3.Dispose();\r
3105                                         #endregion\r
3106 \r
3107                                         imageAttr.Dispose();\r
3108                                         graphics3.Dispose();\r
3109                                         bSuccessLoadDTXbgfile = true;\r
3110                                 }\r
3111                                 catch\r
3112                                 {\r
3113                                         Trace.TraceError( "背景画像とレーン画像の合成に失敗しました。({0})", bgfilename );\r
3114                                 }\r
3115                         }\r
3116                         #region [ DTXデータで指定する背景画像を合成しない場合は、レーン画像単体を背景画像とする ]\r
3117                         if ( !bSuccessLoadDTXbgfile )\r
3118                         {\r
3119                                 bgfilename = CSkin.Path( DefaultBgFilename );\r
3120                                 try\r
3121                                 {\r
3122                                         image = new Bitmap( bgfilename );\r
3123 \r
3124                                         if ( DefaultLaneFilename != "" )\r
3125                                         {\r
3126                                                 Bitmap bmLane = new Bitmap( CSkin.Path( DefaultLaneFilename ) );\r
3127                                                 Graphics g = Graphics.FromImage( image );\r
3128                                                 g.DrawImage( bmLane, offsetX[ nLanePosition ], 0 );\r
3129                                                 g.Dispose();\r
3130                                                 bmLane.Dispose();\r
3131                                         }\r
3132                                 }\r
3133                                 catch\r
3134                                 {\r
3135                                         Trace.TraceError( "レーン画像の読み込みに失敗しました。({0})", bgfilename );\r
3136                                         this.tx背景 = null;\r
3137                                         return;\r
3138                                 }\r
3139                         }\r
3140                         #endregion\r
3141                         #region [ BGA画像を表示する予定がある場合は、背景画像からあらかじめその領域を黒抜きにしておく ]\r
3142                         if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) || CDTXMania.DTX.listAVI.Count > 0 )\r
3143                         {\r
3144                                 Graphics graphics2 = Graphics.FromImage( image );\r
3145                                 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );\r
3146                                 graphics2.Dispose();\r
3147                         }\r
3148                         #endregion\r
3149                         #region [ 背景画像をテクスチャにする。背景動画の表示予定がある場合は、更に透明度を付与する。 ]\r
3150                         try\r
3151                         {\r
3152                                 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );\r
3153                                 if ( CDTXMania.DTX.bMovieをFullscreen再生する )                                            // Fullscreen動画再生が発生する場合は、動画レイヤーに対してレーン+背景レイヤーに透明度を設定する\r
3154                                 {\r
3155                                         this.tx背景.n透明度 = 255 - CDTXMania.ConfigIni.n背景の透過度;       // 背景動画用\r
3156                                 }\r
3157                         }\r
3158                         catch ( CTextureCreateFailedException )\r
3159                         {\r
3160                                 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );\r
3161                                 this.tx背景 = null;\r
3162                         }\r
3163                         #endregion\r
3164                         image.Dispose();\r
3165                 }\r
3166 \r
3167                 protected virtual void t入力処理_ギター()\r
3168                 {\r
3169                         t入力処理_ギターベース( E楽器パート.GUITAR );\r
3170                 }\r
3171                 protected virtual void t入力処理_ベース()\r
3172                 {\r
3173                         t入力処理_ギターベース( E楽器パート.BASS );\r
3174                 }\r
3175 \r
3176 \r
3177                 protected virtual void t入力処理_ギターベース(E楽器パート inst)\r
3178                 {\r
3179                         int indexInst = (int) inst;\r
3180                         #region [ スクロール速度変更 ]\r
3181                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )\r
3182                         {\r
3183                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1, 0x7cf );\r
3184                         }\r
3185                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )\r
3186                         {\r
3187                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );\r
3188                         }\r
3189                         #endregion\r
3190 \r
3191                         if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )\r
3192                         {\r
3193                                 return;\r
3194                         }\r
3195 \r
3196                         int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;\r
3197                         int G = R + 1;\r
3198                         int B = R + 2;\r
3199                         bool autoW =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtW : bIsAutoPlay.BsW;\r
3200                         bool autoR =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;\r
3201                         bool autoG =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;\r
3202                         bool autoB =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;\r
3203                         bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;\r
3204                         int nAutoW = ( autoW ) ? 8 : 0;\r
3205                         int nAutoR = ( autoR ) ? 4 : 0;\r
3206                         int nAutoG = ( autoG ) ? 2 : 0;\r
3207                         int nAutoB = ( autoB ) ? 1 : 0;\r
3208                         int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;\r
3209 \r
3210 //                      if ( bIsAutoPlay[ (int) Eレーン.Guitar - 1 + indexInst ] )   // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
3211 //                      {\r
3212                         CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);\r
3213                         if ( chip != null )     \r
3214                         {\r
3215                                 if ( ( chip.nチャンネル番号 & 4 ) != 0 && autoR )\r
3216                                 {\r
3217                                         this.actLaneFlushGB.Start( R );\r
3218                                         this.actRGB.Push( R );\r
3219                                 }\r
3220                                 if ( ( chip.nチャンネル番号 & 2 ) != 0 && autoG )\r
3221                                 {\r
3222                                         this.actLaneFlushGB.Start( G );\r
3223                                         this.actRGB.Push( G );\r
3224                                 }\r
3225                                 if ( ( chip.nチャンネル番号 & 1 ) != 0 && autoB )\r
3226                                 {\r
3227                                         this.actLaneFlushGB.Start( B );\r
3228                                         this.actRGB.Push( B );\r
3229                                 }\r
3230 //                      }\r
3231 \r
3232                         }\r
3233 //                      else\r
3234                         {\r
3235                                 int pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;\r
3236                                 this.t入力メソッド記憶( inst );\r
3237                                 int pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;\r
3238                                 this.t入力メソッド記憶( inst );\r
3239                                 int pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;\r
3240                                 this.t入力メソッド記憶( inst );\r
3241                                 int flagRGB = pushingR | pushingG | pushingB;\r
3242                                 if ( pushingR != 0 )\r
3243                                 {\r
3244                                         this.actLaneFlushGB.Start( R );\r
3245                                         this.actRGB.Push( R );\r
3246                                 }\r
3247                                 if ( pushingG != 0 )\r
3248                                 {\r
3249                                         this.actLaneFlushGB.Start( G );\r
3250                                         this.actRGB.Push( G );\r
3251                                 }\r
3252                                 if ( pushingB != 0 )\r
3253                                 {\r
3254                                         this.actLaneFlushGB.Start( B );\r
3255                                         this.actRGB.Push( B );\r
3256                                 }\r
3257                                 // auto pickだとここから先に行かないので注意\r
3258                                 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );\r
3259                                 if ( ( events != null ) && ( events.Count > 0 ) )\r
3260                                 {\r
3261                                         foreach ( STInputEvent eventPick in events )\r
3262                                         {\r
3263                                                 if ( !eventPick.b押された )\r
3264                                                 {\r
3265                                                         continue;\r
3266                                                 }\r
3267                                                 this.t入力メソッド記憶( inst );\r
3268                                                 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
3269                                                 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;\r
3270                                                 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] );      // E楽器パート.GUITARなチップ全てにヒットする\r
3271                                                 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );\r
3272 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号,  ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );\r
3273                                                 if ( ( pChip != null ) && ( ( ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F ) == ( ( flagRGB & ~nAutoMask) & 0x0F ) ) && ( e判定 != E判定.Miss ) )\r
3274                                                 {\r
3275                                                         bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
3276                                                         bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
3277                                                         bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
3278                                                         bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
3279                                                         bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
3280                                                         bool bSuccessOPEN = bChipIsO && ( autoR || pushingR == 0 ) && ( autoG || pushingG == 0 ) && ( autoB || pushingB == 0 );\r
3281                                                         if ( ( bChipHasR && ( autoR || pushingR != 0 ) ) || bSuccessOPEN )\r
3282                                                         //if ( ( pushingR != 0 ) || autoR || ( flagRGB == 0 ) )\r
3283                                                         {\r
3284                                                                 this.actChipFireGB.Start( R, 演奏判定ライン座標 );\r
3285                                                         }\r
3286                                                         if ( ( bChipHasG && ( autoG || pushingG != 0 ) ) || bSuccessOPEN )\r
3287                                                         //if ( ( pushingG != 0 ) || autoG || ( flagRGB == 0 ) )\r
3288                                                         {\r
3289                                                                 this.actChipFireGB.Start( G, 演奏判定ライン座標 );\r
3290                                                         }\r
3291                                                         if ( ( bChipHasB && ( autoB || pushingB != 0 ) ) || bSuccessOPEN )\r
3292                                                         //if ( ( pushingB != 0 ) || autoB || ( flagRGB == 0 ) )\r
3293                                                         {\r
3294                                                                 this.actChipFireGB.Start( B, 演奏判定ライン座標 );\r
3295                                                         }\r
3296                                                         this.tチップのヒット処理( nTime, pChip );\r
3297                                                         this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );\r
3298                                                         int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;\r
3299                                                         CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );\r
3300                                                         if ( item != null )\r
3301                                                         {\r
3302                                                                 this.queWailing[indexInst].Enqueue( item );\r
3303                                                         }\r
3304                                                         continue;\r
3305                                                 }\r
3306 \r
3307                                                 // 以下、間違いレーンでのピック時\r
3308                                                 CDTX.CChip NoChipPicked = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;\r
3309                                                 if ( ( NoChipPicked != null ) || ( ( NoChipPicked = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )\r
3310                                                 {\r
3311                                                         this.tサウンド再生( NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );\r
3312                                                 }\r
3313                                                 if ( !CDTXMania.ConfigIni.bLight[indexInst] )\r
3314                                                 {\r
3315                                                         this.tチップのヒット処理_BadならびにTight時のMiss( inst );\r
3316                                                 }\r
3317                                         }\r
3318                                 }\r
3319                                 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );\r
3320                                 if ( ( list != null ) && ( list.Count > 0 ) )\r
3321                                 {\r
3322                                         foreach ( STInputEvent eventWailed in list )\r
3323                                         {\r
3324                                                 if ( !eventWailed.b押された )\r
3325                                                 {\r
3326                                                         continue;\r
3327                                                 }\r
3328                                                 DoWailingFromQueue( inst, eventWailed.nTimeStamp,  autoW );\r
3329                                         }\r
3330                                 }\r
3331                         }\r
3332                 }\r
3333 \r
3334                 private void DoWailingFromQueue( E楽器パート inst, long nTimeStamp_Wailed,  bool autoW )\r
3335                 {\r
3336                         int indexInst = (int) inst;\r
3337                         long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
3338                         CDTX.CChip chipWailing;\r
3339                         while ( ( this.queWailing[ indexInst ].Count > 0 ) && ( ( chipWailing = this.queWailing[ indexInst ].Dequeue() ) != null ) )\r
3340                         {\r
3341                                 if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 )            // #24245 2011.1.26 yyagi: 800 -> 1000\r
3342                                 {\r
3343                                         chipWailing.bHit = true;\r
3344                                         this.actWailingBonus.Start( inst, this.r現在の歓声Chip[ indexInst ] );\r
3345                                         //if ( !bIsAutoPlay[indexInst] )\r
3346                                         if ( !autoW )\r
3347                                         {\r
3348                                                 int nCombo = ( this.actCombo.n現在のコンボ数[ indexInst ] < 500 ) ? this.actCombo.n現在のコンボ数[ indexInst ] : 500;\r
3349                                                 this.actScore.Add( inst, bIsAutoPlay, nCombo * 3000L );         // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions\r
3350                                         }\r
3351                                 }\r
3352                         }\r
3353                 }\r
3354         #endregion\r
3355         }\r
3356 }\r