OSDN Git Service

#34198 DirectShow による動画の再生を行うクラス CAviDS を追加し、これを利用するように変更した。
[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.InteropServices;\r
5 using System.Drawing;\r
6 using System.Drawing.Imaging;\r
7 using System.IO;\r
8 using System.Diagnostics;\r
9 using System.Threading;\r
10 using SlimDX;\r
11 using SlimDX.Direct3D9;\r
12 using FDK;\r
13 \r
14 namespace DTXMania\r
15 {\r
16         internal class CStage演奏ドラム画面 : CStage演奏画面共通\r
17         {\r
18                 // コンストラクタ\r
19 \r
20                 public CStage演奏ドラム画面()\r
21                 {\r
22                         base.eステージID = CStage.Eステージ.演奏;\r
23                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
24                         base.b活性化してない = true;\r
25                         base.list子Activities.Add( this.actPad = new CAct演奏Drumsパッド() );\r
26                         base.list子Activities.Add( this.actCombo = new CAct演奏DrumsコンボDGB() );\r
27                         base.list子Activities.Add( this.actDANGER = new CAct演奏DrumsDanger() );\r
28                         base.list子Activities.Add( this.actChipFireD = new CAct演奏DrumsチップファイアD() );\r
29             base.list子Activities.Add( this.actChipFireGB = new CAct演奏DrumsチップファイアGB());\r
30             base.list子Activities.Add( this.actGauge = new CAct演奏Drumsゲージ() );\r
31             base.list子Activities.Add( this.actGraph = new CAct演奏Drumsグラフ() ); // #24074 2011.01.23 add ikanick\r
32                         base.list子Activities.Add( this.actJudgeString = new CAct演奏Drums判定文字列() );\r
33                         base.list子Activities.Add( this.actLaneFlushD = new CAct演奏DrumsレーンフラッシュD() );\r
34                         base.list子Activities.Add( this.actLaneFlushGB = new CAct演奏DrumsレーンフラッシュGB() );\r
35                         base.list子Activities.Add( this.actRGB = new CAct演奏DrumsRGB() );\r
36                         base.list子Activities.Add( this.actScore = new CAct演奏Drumsスコア() );\r
37                         base.list子Activities.Add( this.actStatusPanels = new CAct演奏Drumsステータスパネル() );\r
38                         base.list子Activities.Add( this.actWailingBonus = new CAct演奏DrumsWailingBonus() );\r
39                         base.list子Activities.Add( this.act譜面スクロール速度 = new CAct演奏スクロール速度() );\r
40                         base.list子Activities.Add( this.actAVI = new CAct演奏AVI() );\r
41                         base.list子Activities.Add( this.actBGA = new CAct演奏BGA() );\r
42                         base.list子Activities.Add( this.actPanel = new CAct演奏パネル文字列() );\r
43                         base.list子Activities.Add( this.actStageFailed = new CAct演奏ステージ失敗() );\r
44                         base.list子Activities.Add( this.actPlayInfo = new CAct演奏演奏情報() );\r
45                         base.list子Activities.Add( this.actFI = new CActFIFOBlack() );\r
46                         base.list子Activities.Add( this.actFO = new CActFIFOBlack() );\r
47                         base.list子Activities.Add( this.actFOClear = new CActFIFOWhite() );\r
48                 }\r
49 \r
50 \r
51                 // メソッド\r
52 \r
53                 public void t演奏結果を格納する( out CScoreIni.C演奏記録 Drums, out CScoreIni.C演奏記録 Guitar, out CScoreIni.C演奏記録 Bass, out CDTX.CChip[] r空打ちドラムチップ )\r
54                 {\r
55                         base.t演奏結果を格納する_ドラム( out Drums );\r
56                         base.t演奏結果を格納する_ギター( out Guitar );\r
57                         base.t演奏結果を格納する_ベース( out Bass );\r
58 \r
59                         r空打ちドラムチップ = new CDTX.CChip[ 10 ];\r
60                         for ( int i = 0; i < 10; i++ )\r
61                         {\r
62                                 r空打ちドラムチップ[ i ] = this.r空うちChip( E楽器パート.DRUMS, (Eパッド) i );\r
63                                 if( r空打ちドラムチップ[ i ] == null )\r
64                                 {\r
65                                         r空打ちドラムチップ[ i ] = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( CSound管理.rc演奏用タイマ.n現在時刻, this.nパッド0Atoチャンネル0A[ i ], this.nInputAdjustTimeMs.Drums );\r
66                                 }\r
67                         }\r
68 \r
69 //                      if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass )         // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える\r
70 //                      {\r
71 //                              CScoreIni.C演奏記録 t;\r
72 //                              t = Guitar;\r
73 //                              Guitar = Bass;\r
74 //                              Bass = t;\r
75 //                      \r
76 //                              CDTXMania.DTX.SwapGuitarBassInfos();                    // 譜面情報も元に戻す\r
77 //                      }\r
78                 }\r
79 \r
80 \r
81                 // CStage 実装\r
82 \r
83                 public override void On活性化()\r
84                 {\r
85                         this.bフィルイン中 = false;\r
86                         base.On活性化();\r
87 \r
88                         // MODIFY_BEGIN #25398 2011.06.07 FROM\r
89                         if( CDTXMania.bコンパクトモード )\r
90                         {\r
91                                 var score = new Cスコア();\r
92                                 CDTXMania.Songs管理.tScoreIniを読み込んで譜面情報を設定する( CDTXMania.strコンパクトモードファイル + ".score.ini", ref score );\r
93                                 this.actGraph.dbグラフ値目標_渡 = score.譜面情報.最大スキル[ 0 ];\r
94                         }\r
95                         else\r
96                         {\r
97                                 this.actGraph.dbグラフ値目標_渡 = CDTXMania.stage選曲.r確定されたスコア.譜面情報.最大スキル[ 0 ];     // #24074 2011.01.23 add ikanick\r
98 \r
99                 // #35411 2015.08.21 chnmr0 add\r
100                 // ゴースト利用可のなとき、0で初期化\r
101                 if (CDTXMania.ConfigIni.eTargetGhost.Drums != ETargetGhostData.NONE)\r
102                 {\r
103                     if (CDTXMania.listTargetGhsotLag[(int)E楽器パート.DRUMS] != null)\r
104                     {\r
105                         this.actGraph.dbグラフ値目標_渡 = 0;\r
106                     }\r
107                 }\r
108                         }\r
109                         // MODIFY_END #25398\r
110                         dtLastQueueOperation = DateTime.MinValue;\r
111                 }\r
112                 public override void On非活性化()\r
113                 {\r
114                         base.On非活性化();\r
115                 }\r
116                 public override void OnManagedリソースの作成()\r
117                 {\r
118                         if( !base.b活性化してない )\r
119                         {\r
120                                 //this.t背景テクスチャの生成();\r
121                                 this.txチップ = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlayDrums chips.png" ) );\r
122                                 this.txヒットバー = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlayDrums hit-bar.png" ) );\r
123                                 this.txヒットバーGB = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlayDrums hit-bar guitar.png" ) );\r
124                                 //this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );\r
125                                 this.txレーンフレームGB = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlayDrums lane parts guitar.png" ) );\r
126                                 if( this.txレーンフレームGB != null )\r
127                                 {\r
128                                         this.txレーンフレームGB.n透明度 = 0xff - CDTXMania.ConfigIni.n背景の透過度;\r
129                                 }\r
130                                 base.OnManagedリソースの作成();\r
131                         }\r
132                 }\r
133                 public override void OnManagedリソースの解放()\r
134                 {\r
135                         if( !base.b活性化してない )\r
136                         {\r
137                                 //CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
138                                 CDTXMania.tテクスチャの解放( ref this.txヒットバー );\r
139                                 CDTXMania.tテクスチャの解放( ref this.txヒットバーGB );\r
140                                 CDTXMania.tテクスチャの解放( ref this.txチップ );\r
141                                 CDTXMania.tテクスチャの解放( ref this.txレーンフレームGB );\r
142                                 //CDTXMania.tテクスチャの解放( ref this.txWailing枠 );\r
143                                 base.OnManagedリソースの解放();\r
144                         }\r
145                 }\r
146                 public override int On進行描画()\r
147                 {\r
148                         base.sw.Start();\r
149                         if( !base.b活性化してない )\r
150                         {\r
151                                 bool bIsFinishedPlaying = false;\r
152                                 bool bIsFinishedFadeout = false;\r
153                                 #region [ 初めての進行描画 ]\r
154                                 if ( base.b初めての進行描画 )\r
155                                 {\r
156                     CSound管理.rc演奏用タイマ.tリセット();\r
157                                         CDTXMania.Timer.tリセット();\r
158                                         this.ctチップ模様アニメ.Drums = new CCounter( 0, 0x30, 10, CDTXMania.Timer );\r
159                                         this.ctチップ模様アニメ.Guitar = new CCounter( 0, 0x17, 20, CDTXMania.Timer );\r
160                                         this.ctチップ模様アニメ.Bass = new CCounter( 0, 0x17, 20, CDTXMania.Timer );\r
161                                         this.ctWailingチップ模様アニメ = new CCounter( 0, 4, 50, CDTXMania.Timer );\r
162 \r
163                                         // this.actChipFireD.Start( Eレーン.HH );    // #31554 2013.6.12 yyagi\r
164                                         // 初チップヒット時のもたつき回避。最初にactChipFireD.Start()するときにJITが掛かって?\r
165                                         // ものすごく待たされる(2回目以降と比べると2,3桁tick違う)。そこで最初の画面フェードインの間に\r
166                                         // 一発Start()を掛けてJITの結果を生成させておく。\r
167 \r
168                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
169                                         this.actFI.tフェードイン開始();\r
170 \r
171                                         if ( CDTXMania.DTXVmode.Enabled )                       // DTXVモードなら\r
172                                         {\r
173                                                 #region [ DTXV用の再生設定にする(全AUTOなど) ]\r
174                                                 tDTXV用の設定();\r
175                                                 #endregion\r
176                                                 t演奏位置の変更( CDTXMania.DTXVmode.nStartBar );\r
177                                         }\r
178 \r
179                                         CDTXMania.Sound管理.tDisableUpdateBufferAutomatically();\r
180                                         base.b初めての進行描画 = false;\r
181                                 }\r
182                                 #endregion\r
183                                 if ( ( CDTXMania.ConfigIni.bSTAGEFAILED有効 && this.actGauge.IsFailed( E楽器パート.DRUMS ) ) && ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) )\r
184                                 {\r
185                                         this.actStageFailed.Start();\r
186                                         CDTXMania.DTX.t全チップの再生停止();\r
187                                         base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED;\r
188                                 }\r
189                                 this.t進行描画_AVI();\r
190                                 this.t進行描画_背景();\r
191                                 this.t進行描画_MIDIBGM();\r
192                                 this.t進行描画_パネル文字列();\r
193                                 this.t進行描画_スコア();\r
194                                 this.t進行描画_BGA();\r
195                                 this.t進行描画_ステータスパネル();\r
196                                 this.t進行描画_ギターベースフレーム();\r
197                                 this.t進行描画_レーンフラッシュGB();\r
198                 this.t進行描画_ギターベース判定ライン();\r
199                 this.t進行描画_ゲージ();\r
200                 this.t進行描画_グラフ();   // #24074 2011.01.23 add ikanick\r
201                                 this.t進行描画_レーンフラッシュD();\r
202                                 this.t進行描画_DANGER();\r
203                                 this.t進行描画_判定ライン();\r
204                                 if ( this.e判定表示優先度 == E判定表示優先度.Chipより下 )\r
205                                 {\r
206                                         this.t進行描画_RGBボタン();\r
207                                         this.t進行描画_判定文字列1_通常位置指定の場合();\r
208                                         this.t進行描画_コンボ();\r
209                                 }\r
210                                 this.t進行描画_WailingBonus();\r
211                                 this.t進行描画_譜面スクロール速度();\r
212                                 this.t進行描画_チップアニメ();\r
213                                 bIsFinishedPlaying = this.t進行描画_チップ(E楽器パート.DRUMS);\r
214                                 this.t進行描画_演奏情報();\r
215                                 this.t進行描画_ドラムパッド();\r
216                                 if ( this.e判定表示優先度 == E判定表示優先度.Chipより上 )\r
217                                 {\r
218                                         this.t進行描画_RGBボタン();\r
219                                         this.t進行描画_判定文字列1_通常位置指定の場合();\r
220                                         this.t進行描画_コンボ();\r
221                                 }\r
222                                 this.t進行描画_判定文字列2_判定ライン上指定の場合();\r
223                                 this.t進行描画_Wailing枠();\r
224                                 this.t進行描画_チップファイアD();\r
225                                 this.t進行描画_チップファイアGB();\r
226                                 this.t進行描画_STAGEFAILED();\r
227                                 bIsFinishedFadeout = this.t進行描画_フェードイン_アウト();\r
228                                 if( bIsFinishedPlaying && ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) )\r
229                                 {\r
230                                         if ( CDTXMania.DTXVmode.Enabled )\r
231                                         {\r
232                                                 if ( CDTXMania.Timer.b停止していない )\r
233                                                 {\r
234                                                         this.actPanel.Stop();                           // PANEL表示停止\r
235                                                     CDTXMania.Timer.t一時停止();            // 再生時刻カウンタ停止\r
236                                                 }\r
237                                                 Thread.Sleep( 5 );\r
238                                                 // DTXCからの次のメッセージを待ち続ける\r
239                                         }\r
240                                         else\r
241                                         {\r
242                                                 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;\r
243                                                 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;\r
244                                                 this.actFOClear.tフェードアウト開始();\r
245                                         }\r
246                                 }\r
247                                 if ( this.eフェードアウト完了時の戻り値 == E演奏画面の戻り値.再読込_再演奏)\r
248                                 {\r
249                                         bIsFinishedFadeout = true;\r
250                                 }\r
251                                 if( bIsFinishedFadeout )\r
252                                 {\r
253                                         Debug.WriteLine( "Total On進行描画=" + sw.ElapsedMilliseconds + "ms" );\r
254                                         return (int) this.eフェードアウト完了時の戻り値;\r
255                                 }\r
256 \r
257                                 ManageMixerQueue();\r
258 \r
259                                 // キー入力\r
260 \r
261                                 if( CDTXMania.act現在入力を占有中のプラグイン == null )\r
262                                         this.tキー入力();\r
263                         }\r
264                         base.sw.Stop();\r
265                         return 0;\r
266                 }\r
267 \r
268                 // その他\r
269 \r
270                 #region [ private ]\r
271                 //-----------------\r
272 \r
273                 private CAct演奏DrumsチップファイアD actChipFireD;\r
274                 private CAct演奏Drumsグラフ actGraph;   // #24074 2011.01.23 add ikanick\r
275                 private CAct演奏Drumsパッド actPad;\r
276                 private bool bフィルイン中;\r
277                 private readonly Eパッド[] eチャンネルtoパッド = new Eパッド[]\r
278                 {\r
279                         Eパッド.HH, Eパッド.SD, Eパッド.BD, Eパッド.HT,\r
280                         Eパッド.LT, Eパッド.CY, Eパッド.FT, Eパッド.HHO,\r
281                         Eパッド.RD, Eパッド.LC\r
282                 };\r
283                 private readonly int[] nチャンネルtoX座標 = new int[] { 76, 110, 145, 192, 226, 294, 260, 79, 300, 35 };\r
284                 private CTexture txヒットバーGB;\r
285                 private CTexture txレーンフレームGB;\r
286                 //-----------------\r
287 \r
288                 private bool bフィルイン区間の最後のChipである( CDTX.CChip pChip )\r
289                 {\r
290                         if( pChip == null )\r
291                         {\r
292                                 return false;\r
293                         }\r
294                         int num = pChip.n発声位置;\r
295                         for( int i = listChip.IndexOf( pChip ) + 1; i < listChip.Count; i++ )\r
296                         {\r
297                                 pChip = listChip[ i ];\r
298                                 if( ( pChip.nチャンネル番号 == 0x53 ) && ( pChip.n整数値 == 2 ) )\r
299                                 {\r
300                                         return true;\r
301                                 }\r
302                                 if( ( ( pChip.nチャンネル番号 >= 0x11 ) && ( pChip.nチャンネル番号 <= 0x19 ) ) && ( ( pChip.n発声位置 - num ) > 0x18 ) )\r
303                                 {\r
304                                         return false;\r
305                                 }\r
306                         }\r
307                         return true;\r
308                 }\r
309 \r
310                 protected override E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, bool bCorrectLane )\r
311                 {\r
312                         E判定 eJudgeResult = tチップのヒット処理( nHitTime, pChip, E楽器パート.DRUMS, bCorrectLane );\r
313                         // #24074 2011.01.23 add ikanick\r
314                         this.actGraph.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
315                         // #35411 2015.09.07 add chnmr0\r
316                         if( CDTXMania.listTargetGhsotLag.Drums != null &&\r
317                 CDTXMania.ConfigIni.eTargetGhost.Drums == ETargetGhostData.ONLINE &&\r
318                                 CDTXMania.DTX.n可視チップ数.Drums > 0 )\r
319                         {\r
320                                 // Online Stats の計算式\r
321                                 this.actGraph.dbグラフ値現在_渡 = 100 *\r
322                                                                 (this.nヒット数_Auto含まない.Drums.Perfect * 17 +\r
323                                                                  this.nヒット数_Auto含まない.Drums.Great * 7 +\r
324                                                                  this.actCombo.n現在のコンボ数.Drums最高値 * 3) / (20.0 * CDTXMania.DTX.n可視チップ数.Drums);\r
325                         }\r
326                         return eJudgeResult;\r
327                 }\r
328 \r
329                 protected override void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part )\r
330                 {\r
331                         this.tチップのヒット処理_BadならびにTight時のMiss( part, 0, E楽器パート.DRUMS );\r
332                 }\r
333                 protected override void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part, int nLane )\r
334                 {\r
335                         this.tチップのヒット処理_BadならびにTight時のMiss( part, nLane, E楽器パート.DRUMS );\r
336                 }\r
337 \r
338                 private bool tドラムヒット処理( long nHitTime, Eパッド type, CDTX.CChip pChip, int n強弱度合い0to127 )\r
339                 {\r
340                         if( pChip == null )\r
341                         {\r
342                                 return false;\r
343                         }\r
344                         int index = pChip.nチャンネル番号;\r
345                         if ( ( index >= 0x11 ) && ( index <= 0x1a ) )\r
346                         {\r
347                                 index -= 0x11;\r
348                         }\r
349                         else if ( ( index >= 0x31 ) && ( index <= 0x3a ) )\r
350                         {\r
351                                 index -= 0x31;\r
352                         }\r
353                         int nLane = this.nチャンネル0Atoレーン07[ index ];\r
354                         int nPad = this.nチャンネル0Atoパッド08[ index ];\r
355                         bool bPChipIsAutoPlay = bIsAutoPlay[ nLane ];\r
356                         int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;\r
357                         E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime );\r
358                         if( e判定 == E判定.Miss )\r
359                         {\r
360                                 return false;\r
361                         }\r
362                         this.tチップのヒット処理( nHitTime, pChip );\r
363                         this.actLaneFlushD.Start( (Eレーン) nLane, ( (float) n強弱度合い0to127 ) / 127f );\r
364                         this.actPad.Hit( nPad );\r
365                         if( ( e判定 != E判定.Poor ) && ( e判定 != E判定.Miss ) )\r
366                         {\r
367                                 bool flag = this.bフィルイン中;\r
368                                 bool flag2 = this.bフィルイン中 && this.bフィルイン区間の最後のChipである( pChip );\r
369                                 // bool flag3 = flag2;\r
370                                 // #31602 2013.6.24 yyagi 判定ラインの表示位置をずらしたら、チップのヒットエフェクトの表示もずらすために、nJudgeLine..を追加\r
371                                 this.actChipFireD.Start( (Eレーン)nLane, flag, flag2, flag2, 演奏判定ライン座標.nJudgeLinePosY_delta.Drums );\r
372                         }\r
373                         if( CDTXMania.ConfigIni.bドラム打音を発声する )\r
374                         {\r
375                                 CDTX.CChip rChip = null;\r
376                                 bool bIsChipsoundPriorToPad = true;\r
377                                 if( ( ( type == Eパッド.HH ) || ( type == Eパッド.HHO ) ) || ( type == Eパッド.LC ) )\r
378                                 {\r
379                                         bIsChipsoundPriorToPad = CDTXMania.ConfigIni.eHitSoundPriorityHH == E打ち分け時の再生の優先順位.ChipがPadより優先;\r
380                                 }\r
381                                 else if( ( type == Eパッド.LT ) || ( type == Eパッド.FT ) )\r
382                                 {\r
383                                         bIsChipsoundPriorToPad = CDTXMania.ConfigIni.eHitSoundPriorityFT == E打ち分け時の再生の優先順位.ChipがPadより優先;\r
384                                 }\r
385                                 else if( ( type == Eパッド.CY ) || ( type == Eパッド.RD ) )\r
386                                 {\r
387                                         bIsChipsoundPriorToPad = CDTXMania.ConfigIni.eHitSoundPriorityCY == E打ち分け時の再生の優先順位.ChipがPadより優先;\r
388                                 }\r
389                                 if( bIsChipsoundPriorToPad )\r
390                                 {\r
391                                         rChip = pChip;\r
392                                 }\r
393                                 else\r
394                                 {\r
395                                         Eパッド hH = type;\r
396                                         if( !CDTXMania.DTX.bチップがある.HHOpen && ( type == Eパッド.HHO ) )\r
397                                         {\r
398                                                 hH = Eパッド.HH;\r
399                                         }\r
400                                         if( !CDTXMania.DTX.bチップがある.Ride && ( type == Eパッド.RD ) )\r
401                                         {\r
402                                                 hH = Eパッド.CY;\r
403                                         }\r
404                                         if( !CDTXMania.DTX.bチップがある.LeftCymbal && ( type == Eパッド.LC ) )\r
405                                         {\r
406                                                 hH = Eパッド.HH;\r
407                                         }\r
408                                         rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nHitTime, this.nパッド0Atoチャンネル0A[ (int) hH ], nInputAdjustTime );\r
409                                         if( rChip == null )\r
410                                         {\r
411                                                 rChip = pChip;\r
412                                         }\r
413                                 }\r
414                                 this.tサウンド再生( rChip, CSound管理.rc演奏用タイマ.nシステム時刻, E楽器パート.DRUMS, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する.Drums );\r
415                         }\r
416                         return true;\r
417                 }\r
418 \r
419                 protected override void ドラムスクロール速度アップ()\r
420                 {\r
421                         CDTXMania.ConfigIni.n譜面スクロール速度.Drums = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度.Drums + 1, 1999 );\r
422                 }\r
423                 protected override void ドラムスクロール速度ダウン()\r
424                 {\r
425                         CDTXMania.ConfigIni.n譜面スクロール速度.Drums = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度.Drums - 1, 0 );\r
426                 }\r
427 \r
428         \r
429                 protected override void t進行描画_AVI()\r
430                 {\r
431                         base.t進行描画_AVI( 1153, 128 );\r
432                 }\r
433                 protected override void t進行描画_BGA()\r
434                 {\r
435                         base.t進行描画_BGA( 1153, 128 );\r
436                 }\r
437                 protected override void t進行描画_DANGER()\r
438                 {\r
439 //                      this.actDANGER.t進行描画( this.actGauge.db現在のゲージ値.Drums < 0.3, false, false );\r
440                         this.actDANGER.t進行描画( this.actGauge.IsDanger(E楽器パート.DRUMS), false, false );\r
441                 }\r
442 \r
443                 protected override void t進行描画_Wailing枠()\r
444                 {\r
445                         int yG = this.演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, bReverse[ (int) E楽器パート.GUITAR ], true );\r
446                         int yB = this.演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS,   false, bReverse[ (int) E楽器パート.BASS   ], true );\r
447                         base.t進行描画_Wailing枠(\r
448                                 (int) ( 587 * Scale.X ),\r
449                                 (int) ( 478 * Scale.X ),\r
450                                 yG,\r
451                                 yB\r
452                         //      CDTXMania.ConfigIni.bReverse.Guitar ? ( 400 - this.txWailing枠.sz画像サイズ.Height ) : 69,        // 350:69\r
453                         //      CDTXMania.ConfigIni.bReverse.Bass ? ( 400 - this.txWailing枠.sz画像サイズ.Height ) : 69           // 350:69\r
454                         );\r
455                 }\r
456                 private void t進行描画_ギターベースフレーム()\r
457                 {\r
458                         if( ( ( CDTXMania.ConfigIni.eDark != Eダークモード.HALF ) && ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) ) && CDTXMania.ConfigIni.bGuitar有効 )\r
459                         {\r
460                                 if( CDTXMania.DTX.bチップがある.Guitar )\r
461                                 {\r
462                                         for ( int i = 0; i < 355; i += 0x80 )\r
463                                         {\r
464                                                 Rectangle rectangle = new Rectangle( 0, 0, (int) ( 0x6d * Scale.X ), (int) ( 0x80 * Scale.Y ) );\r
465                                                 if ( ( i + 0x80 ) > 355 )\r
466                                                 {\r
467                                                         rectangle.Height -= (int) ( ( i + 0x80 - 355 ) * Scale.Y );\r
468                                                 }\r
469                                                 if ( this.txレーンフレームGB != null )\r
470                                                 {\r
471                                                         this.txレーンフレームGB.t2D描画(\r
472                                                                 CDTXMania.app.Device,\r
473                                                                 0x1fb * Scale.X,\r
474                                                                 ( 0x39 + i ) * Scale.Y,\r
475                                                                 rectangle\r
476                                                         );\r
477                                                 }\r
478                                         }\r
479                                 }\r
480                                 if( CDTXMania.DTX.bチップがある.Bass )\r
481                                 {\r
482                                         for ( int j = 0; j < 355; j += 0x80 )\r
483                                         {\r
484                                                 Rectangle rectangle2 = new Rectangle( 0, 0, (int) ( 0x6d * Scale.X ), (int) ( 0x80 * Scale.Y ) );\r
485                                                 if ( ( j + 0x80 ) > 355 )\r
486                                                 {\r
487                                                         rectangle2.Height -= (int) ( ( j + 0x80 - 355 ) * Scale.Y );\r
488                                                 }\r
489                                                 if ( this.txレーンフレームGB != null )\r
490                                                 {\r
491                                                         this.txレーンフレームGB.t2D描画( CDTXMania.app.Device,\r
492                                                                 0x18e * Scale.X,\r
493                                                                 ( 0x39 + j ) * Scale.Y,\r
494                                                                 rectangle2\r
495                                                         );\r
496                                                 }\r
497                                         }\r
498                                 }\r
499                         }\r
500                 }\r
501                 private void t進行描画_ギターベース判定ライン()          // yyagi: ギタレボモードとは座標が違うだけですが、まとめづらかったのでそのまま放置してます。\r
502                 {\r
503                         if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )\r
504                         {\r
505                                 if ( CDTXMania.DTX.bチップがある.Guitar )\r
506                                 {\r
507                                         int y = this.演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, bReverse[ (int) E楽器パート.GUITAR ] ) - (int)(3 * Scale.Y);\r
508                                                                                                                                 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする\r
509                                         if ( this.txヒットバーGB != null )\r
510                                         {\r
511                                                 for ( int i = 0; i < 3; i++ )\r
512                                                 {\r
513                                                         this.txヒットバーGB.t2D描画( CDTXMania.app.Device,\r
514                                                                 ( 509 + ( 26 * i ) ) * Scale.X,\r
515                                                                 y\r
516                                                         );\r
517                                                         this.txヒットバーGB.t2D描画( CDTXMania.app.Device,\r
518                                                                 ( ( 509 + ( 26 * i ) ) + 16 ) * Scale.X,\r
519                                                                 y,\r
520                                                                 new Rectangle( 0, 0, (int) ( 10 * Scale.X ), (int) ( 16 * Scale.Y ) ) );\r
521                                                 }\r
522                                         }\r
523                                 }\r
524                                 if ( CDTXMania.DTX.bチップがある.Bass )\r
525                                 {\r
526                                         int y = this.演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS,   false, bReverse[ (int) E楽器パート.BASS   ] ) - (int)(3 * Scale.Y);\r
527                                                                                                                                 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする\r
528                                         if ( this.txヒットバーGB != null )\r
529                                         {\r
530                                                 for ( int j = 0; j < 3; j++ )\r
531                                                 {\r
532                                                         this.txヒットバーGB.t2D描画( CDTXMania.app.Device,\r
533                                                                 ( 400 + ( 26 * j ) ) * Scale.X,\r
534                                                                 y );\r
535                                                         this.txヒットバーGB.t2D描画( CDTXMania.app.Device,\r
536                                                                 ( ( 400 + ( 26 * j ) ) + 16 ) * Scale.X,\r
537                                                                 y,\r
538                                                                 new Rectangle( 0, 0, (int) ( 10 * Scale.X ), (int) ( 16 * Scale.Y ) ) );\r
539                                                 }\r
540                                         }\r
541                                 }\r
542                         }\r
543                 }\r
544 \r
545                 private void t進行描画_グラフ()\r
546         {\r
547                         if ( !CDTXMania.ConfigIni.bストイックモード && !CDTXMania.ConfigIni.bドラムが全部オートプレイである && CDTXMania.ConfigIni.bGraph.Drums )\r
548                         {\r
549                 this.actGraph.On進行描画();\r
550             }\r
551         }\r
552 \r
553                 private void t進行描画_チップファイアD()\r
554                 {\r
555                         this.actChipFireD.On進行描画();\r
556                 }\r
557 \r
558                 private void t進行描画_ドラムパッド()\r
559                 {\r
560                         if( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
561                         {\r
562                                 this.actPad.On進行描画();\r
563                         }\r
564                 }\r
565                 protected override void t進行描画_パネル文字列()\r
566                 {\r
567                         base.t進行描画_パネル文字列( 336, 427+1 );\r
568                 }\r
569 \r
570                 protected override void t進行描画_演奏情報()\r
571                 {\r
572                         base.t進行描画_演奏情報( 338, 57 );\r
573                 }\r
574 \r
575                 protected override void t入力処理_ドラム()\r
576                 {\r
577                         for( int nPad = 0; nPad < (int) Eパッド.MAX; nPad++ )                // #27029 2012.1.4 from: <10 to <=10; Eパッドの要素が1つ(HP)増えたため。\r
578                                                                                                                                                 //                2012.1.5 yyagi: (int)Eパッド.MAX に変更。Eパッドの要素数への依存を無くすため。\r
579                         {\r
580                                 List<STInputEvent> listInputEvent = CDTXMania.Pad.GetEvents( E楽器パート.DRUMS, (Eパッド) nPad );\r
581 \r
582                                 if( ( listInputEvent == null ) || ( listInputEvent.Count == 0 ) )\r
583                                         continue;\r
584 \r
585                                 this.t入力メソッド記憶( E楽器パート.DRUMS );\r
586 \r
587                                 #region [ 打ち分けグループ調整 ]\r
588                                 //-----------------------------\r
589                                 EHHGroup eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
590                                 EFTGroup eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
591                                 ECYGroup eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
592 \r
593                                 if( !CDTXMania.DTX.bチップがある.Ride && ( eCYGroup == ECYGroup.打ち分ける ) )\r
594                                 {\r
595                                         eCYGroup = ECYGroup.共通;\r
596                                 }\r
597                                 if( !CDTXMania.DTX.bチップがある.HHOpen && ( eHHGroup == EHHGroup.全部打ち分ける ) )\r
598                                 {\r
599                                         eHHGroup = EHHGroup.左シンバルのみ打ち分ける;\r
600                                 }\r
601                                 if( !CDTXMania.DTX.bチップがある.HHOpen && ( eHHGroup == EHHGroup.ハイハットのみ打ち分ける ) )\r
602                                 {\r
603                                         eHHGroup = EHHGroup.全部共通;\r
604                                 }\r
605                                 if( !CDTXMania.DTX.bチップがある.LeftCymbal && ( eHHGroup == EHHGroup.全部打ち分ける ) )\r
606                                 {\r
607                                         eHHGroup = EHHGroup.ハイハットのみ打ち分ける;\r
608                                 }\r
609                                 if( !CDTXMania.DTX.bチップがある.LeftCymbal && ( eHHGroup == EHHGroup.左シンバルのみ打ち分ける ) )\r
610                                 {\r
611                                         eHHGroup = EHHGroup.全部共通;\r
612                                 }\r
613                                 //-----------------------------\r
614                                 #endregion\r
615 \r
616                                 foreach( STInputEvent inputEvent in listInputEvent )\r
617                                 {\r
618                                         if( !inputEvent.b押された )\r
619                                                 continue;\r
620 \r
621                                         long nTime = inputEvent.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
622                                         int nPad09 = ( nPad == (int) Eパッド.HP ) ? (int) Eパッド.BD : nPad;              // #27029 2012.1.5 yyagi\r
623                                         int nInputAdjustTime = bIsAutoPlay[ this.nチャンネル0Atoレーン07[ (int) nPad09 ] ] ? 0 : nInputAdjustTimeMs.Drums;\r
624 \r
625                                         bool bHitted = false;\r
626 \r
627                                         #region [ (A) ヒットしていればヒット処理して次の inputEvent へ ]\r
628                                         //-----------------------------\r
629                                         switch( ( (Eパッド) nPad ) )\r
630                                         {\r
631                                                 case Eパッド.HH:\r
632                                                         #region [ HHとLC(groupingしている場合) のヒット処理 ]\r
633                                                         //-----------------------------\r
634                                                         {\r
635                                                                 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.HH )\r
636                                                                         continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
637 \r
638                                                                 CDTX.CChip chipHC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x11, nInputAdjustTime ); // HiHat Close\r
639                                                                 CDTX.CChip chipHO = this.r指定時刻に一番近い未ヒットChip( nTime, 0x18, nInputAdjustTime ); // HiHat Open\r
640                                                                 CDTX.CChip chipLC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ); // LC\r
641                                                                 E判定 e判定HC = ( chipHC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHC, nInputAdjustTime ) : E判定.Miss;\r
642                                                                 E判定 e判定HO = ( chipHO != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHO, nInputAdjustTime ) : E判定.Miss;\r
643                                                                 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;\r
644                                                                 switch( eHHGroup )\r
645                                                                 {\r
646                                                                         case EHHGroup.ハイハットのみ打ち分ける:\r
647                                                                                 #region [ HCとLCのヒット処理 ]\r
648                                                                                 //-----------------------------\r
649                                                                                 if( ( e判定HC != E判定.Miss ) && ( e判定LC != E判定.Miss ) )\r
650                                                                                 {\r
651                                                                                         if( chipHC.n発声位置 < chipLC.n発声位置 )\r
652                                                                                         {\r
653                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
654                                                                                         }\r
655                                                                                         else if( chipHC.n発声位置 > chipLC.n発声位置 )\r
656                                                                                         {\r
657                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );\r
658                                                                                         }\r
659                                                                                         else\r
660                                                                                         {\r
661                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
662                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );\r
663                                                                                         }\r
664                                                                                         bHitted = true;\r
665                                                                                 }\r
666                                                                                 else if( e判定HC != E判定.Miss )\r
667                                                                                 {\r
668                                                                                         this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
669                                                                                         bHitted = true;\r
670                                                                                 }\r
671                                                                                 else if( e判定LC != E判定.Miss )\r
672                                                                                 {\r
673                                                                                         this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );\r
674                                                                                         bHitted = true;\r
675                                                                                 }\r
676                                                                                 if( !bHitted )\r
677                                                                                         break;\r
678                                                                                 continue;\r
679                                                                         //-----------------------------\r
680                                                                                 #endregion\r
681 \r
682                                                                         case EHHGroup.左シンバルのみ打ち分ける:\r
683                                                                                 #region [ HCとHOのヒット処理 ]\r
684                                                                                 //-----------------------------\r
685                                                                                 if( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) )\r
686                                                                                 {\r
687                                                                                         if( chipHC.n発声位置 < chipHO.n発声位置 )\r
688                                                                                         {\r
689                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
690                                                                                         }\r
691                                                                                         else if( chipHC.n発声位置 > chipHO.n発声位置 )\r
692                                                                                         {\r
693                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );\r
694                                                                                         }\r
695                                                                                         else\r
696                                                                                         {\r
697                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
698                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );\r
699                                                                                         }\r
700                                                                                         bHitted = true;\r
701                                                                                 }\r
702                                                                                 else if( e判定HC != E判定.Miss )\r
703                                                                                 {\r
704                                                                                         this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
705                                                                                         bHitted = true;\r
706                                                                                 }\r
707                                                                                 else if( e判定HO != E判定.Miss )\r
708                                                                                 {\r
709                                                                                         this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );\r
710                                                                                         bHitted = true;\r
711                                                                                 }\r
712                                                                                 if( !bHitted )\r
713                                                                                         break;\r
714                                                                                 continue;\r
715                                                                         //-----------------------------\r
716                                                                                 #endregion\r
717 \r
718                                                                         case EHHGroup.全部共通:\r
719                                                                                 #region [ HC,HO,LCのヒット処理 ]\r
720                                                                                 //-----------------------------\r
721                                                                                 if( ( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) ) && ( e判定LC != E判定.Miss ) )\r
722                                                                                 {\r
723                                                                                         CDTX.CChip chip;\r
724                                                                                         CDTX.CChip[] chipArray = new CDTX.CChip[] { chipHC, chipHO, chipLC };\r
725                                                                                         // ここから、chipArrayをn発生位置の小さい順に並び替える\r
726                                                                                         if( chipArray[ 1 ].n発声位置 > chipArray[ 2 ].n発声位置 )\r
727                                                                                         {\r
728                                                                                                 chip = chipArray[ 1 ];\r
729                                                                                                 chipArray[ 1 ] = chipArray[ 2 ];\r
730                                                                                                 chipArray[ 2 ] = chip;\r
731                                                                                         }\r
732                                                                                         if( chipArray[ 0 ].n発声位置 > chipArray[ 1 ].n発声位置 )\r
733                                                                                         {\r
734                                                                                                 chip = chipArray[ 0 ];\r
735                                                                                                 chipArray[ 0 ] = chipArray[ 1 ];\r
736                                                                                                 chipArray[ 1 ] = chip;\r
737                                                                                         }\r
738                                                                                         if( chipArray[ 1 ].n発声位置 > chipArray[ 2 ].n発声位置 )\r
739                                                                                         {\r
740                                                                                                 chip = chipArray[ 1 ];\r
741                                                                                                 chipArray[ 1 ] = chipArray[ 2 ];\r
742                                                                                                 chipArray[ 2 ] = chip;\r
743                                                                                         }\r
744                                                                                         this.tドラムヒット処理( nTime, Eパッド.HH, chipArray[ 0 ], inputEvent.nVelocity );\r
745                                                                                         if( chipArray[ 0 ].n発声位置 == chipArray[ 1 ].n発声位置 )\r
746                                                                                         {\r
747                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipArray[ 1 ], inputEvent.nVelocity );\r
748                                                                                         }\r
749                                                                                         if( chipArray[ 0 ].n発声位置 == chipArray[ 2 ].n発声位置 )\r
750                                                                                         {\r
751                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipArray[ 2 ], inputEvent.nVelocity );\r
752                                                                                         }\r
753                                                                                         bHitted = true;\r
754                                                                                 }\r
755                                                                                 else if( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) )\r
756                                                                                 {\r
757                                                                                         if( chipHC.n発声位置 < chipHO.n発声位置 )\r
758                                                                                         {\r
759                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
760                                                                                         }\r
761                                                                                         else if( chipHC.n発声位置 > chipHO.n発声位置 )\r
762                                                                                         {\r
763                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );\r
764                                                                                         }\r
765                                                                                         else\r
766                                                                                         {\r
767                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
768                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );\r
769                                                                                         }\r
770                                                                                         bHitted = true;\r
771                                                                                 }\r
772                                                                                 else if( ( e判定HC != E判定.Miss ) && ( e判定LC != E判定.Miss ) )\r
773                                                                                 {\r
774                                                                                         if( chipHC.n発声位置 < chipLC.n発声位置 )\r
775                                                                                         {\r
776                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
777                                                                                         }\r
778                                                                                         else if( chipHC.n発声位置 > chipLC.n発声位置 )\r
779                                                                                         {\r
780                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );\r
781                                                                                         }\r
782                                                                                         else\r
783                                                                                         {\r
784                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
785                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );\r
786                                                                                         }\r
787                                                                                         bHitted = true;\r
788                                                                                 }\r
789                                                                                 else if( ( e判定HO != E判定.Miss ) && ( e判定LC != E判定.Miss ) )\r
790                                                                                 {\r
791                                                                                         if( chipHO.n発声位置 < chipLC.n発声位置 )\r
792                                                                                         {\r
793                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );\r
794                                                                                         }\r
795                                                                                         else if( chipHO.n発声位置 > chipLC.n発声位置 )\r
796                                                                                         {\r
797                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );\r
798                                                                                         }\r
799                                                                                         else\r
800                                                                                         {\r
801                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );\r
802                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );\r
803                                                                                         }\r
804                                                                                         bHitted = true;\r
805                                                                                 }\r
806                                                                                 else if( e判定HC != E判定.Miss )\r
807                                                                                 {\r
808                                                                                         this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
809                                                                                         bHitted = true;\r
810                                                                                 }\r
811                                                                                 else if( e判定HO != E判定.Miss )\r
812                                                                                 {\r
813                                                                                         this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );\r
814                                                                                         bHitted = true;\r
815                                                                                 }\r
816                                                                                 else if( e判定LC != E判定.Miss )\r
817                                                                                 {\r
818                                                                                         this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );\r
819                                                                                         bHitted = true;\r
820                                                                                 }\r
821                                                                                 if( !bHitted )\r
822                                                                                         break;\r
823                                                                                 continue;\r
824                                                                         //-----------------------------\r
825                                                                                 #endregion\r
826 \r
827                                                                         default:\r
828                                                                                 #region [ 全部打ち分け時のヒット処理 ]\r
829                                                                                 //-----------------------------\r
830                                                                                 if( e判定HC != E判定.Miss )\r
831                                                                                 {\r
832                                                                                         this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );\r
833                                                                                         bHitted = true;\r
834                                                                                 }\r
835                                                                                 if( !bHitted )\r
836                                                                                         break;\r
837                                                                                 continue;\r
838                                                                         //-----------------------------\r
839                                                                                 #endregion\r
840                                                                 }\r
841                                                                 if( !bHitted )\r
842                                                                         break;\r
843                                                                 continue;\r
844                                                         }\r
845                                                 //-----------------------------\r
846                                                         #endregion\r
847 \r
848                                                 case Eパッド.SD:\r
849                                                         #region [ SDのヒット処理 ]\r
850                                                         //-----------------------------\r
851                                                         if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.SD )       // #23857 2010.12.12 yyagi: to support VelocityMin\r
852                                                                 continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
853                                                         if( !this.tドラムヒット処理( nTime, Eパッド.SD, this.r指定時刻に一番近い未ヒットChip( nTime, 0x12, nInputAdjustTime ), inputEvent.nVelocity ) )\r
854                                                                 break;\r
855                                                         continue;\r
856                                                 //-----------------------------\r
857                                                         #endregion\r
858 \r
859                                                 case Eパッド.BD:\r
860                                                         #region [ BDのヒット処理 ]\r
861                                                         //-----------------------------\r
862                                                         if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.BD )       // #23857 2010.12.12 yyagi: to support VelocityMin\r
863                                                                 continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
864                                                         if( !this.tドラムヒット処理( nTime, Eパッド.BD, this.r指定時刻に一番近い未ヒットChip( nTime, 0x13, nInputAdjustTime ), inputEvent.nVelocity ) )\r
865                                                                 break;\r
866                                                         continue;\r
867                                                         //-----------------------------\r
868                                                         #endregion\r
869 \r
870                                                 case Eパッド.HT:\r
871                                                         #region [ HTのヒット処理 ]\r
872                                                         //-----------------------------\r
873                                                         if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.HT )       // #23857 2010.12.12 yyagi: to support VelocityMin\r
874                                                                 continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
875                                                         if( this.tドラムヒット処理( nTime, Eパッド.HT, this.r指定時刻に一番近い未ヒットChip( nTime, 20, nInputAdjustTime ), inputEvent.nVelocity ) )\r
876                                                                 continue;\r
877                                                         break;\r
878                                                 //-----------------------------\r
879                                                         #endregion\r
880 \r
881                                                 case Eパッド.LT:\r
882                                                         #region [ LTとFT(groupingしている場合)のヒット処理 ]\r
883                                                         //-----------------------------\r
884                                                         {\r
885                                                                 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.LT )       // #23857 2010.12.12 yyagi: to support VelocityMin\r
886                                                                         continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
887                                                                 CDTX.CChip chipLT = this.r指定時刻に一番近い未ヒットChip( nTime, 0x15, nInputAdjustTime ); // LT\r
888                                                                 CDTX.CChip chipFT = this.r指定時刻に一番近い未ヒットChip( nTime, 0x17, nInputAdjustTime ); // FT\r
889                                                                 E判定 e判定LT = ( chipLT != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLT, nInputAdjustTime ) : E判定.Miss;\r
890                                                                 E判定 e判定FT = ( chipFT != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipFT, nInputAdjustTime ) : E判定.Miss;\r
891                                                                 switch( eFTGroup )\r
892                                                                 {\r
893                                                                         case EFTGroup.打ち分ける:\r
894                                                                                 #region [ LTのヒット処理 ]\r
895                                                                                 //-----------------------------\r
896                                                                                 if( e判定LT != E判定.Miss )\r
897                                                                                 {\r
898                                                                                         this.tドラムヒット処理( nTime, Eパッド.LT, chipLT, inputEvent.nVelocity );\r
899                                                                                         bHitted = true;\r
900                                                                                 }\r
901                                                                                 break;\r
902                                                                         //-----------------------------\r
903                                                                                 #endregion\r
904 \r
905                                                                         case EFTGroup.共通:\r
906                                                                                 #region [ LTとFTのヒット処理 ]\r
907                                                                                 //-----------------------------\r
908                                                                                 if( ( e判定LT != E判定.Miss ) && ( e判定FT != E判定.Miss ) )\r
909                                                                                 {\r
910                                                                                         if( chipLT.n発声位置 < chipFT.n発声位置 )\r
911                                                                                         {\r
912                                                                                                 this.tドラムヒット処理( nTime, Eパッド.LT, chipLT, inputEvent.nVelocity );\r
913                                                                                         }\r
914                                                                                         else if( chipLT.n発声位置 > chipFT.n発声位置 )\r
915                                                                                         {\r
916                                                                                                 this.tドラムヒット処理( nTime, Eパッド.LT, chipFT, inputEvent.nVelocity );\r
917                                                                                         }\r
918                                                                                         else\r
919                                                                                         {\r
920                                                                                                 this.tドラムヒット処理( nTime, Eパッド.LT, chipLT, inputEvent.nVelocity );\r
921                                                                                                 this.tドラムヒット処理( nTime, Eパッド.LT, chipFT, inputEvent.nVelocity );\r
922                                                                                         }\r
923                                                                                         bHitted = true;\r
924                                                                                 }\r
925                                                                                 else if( e判定LT != E判定.Miss )\r
926                                                                                 {\r
927                                                                                         this.tドラムヒット処理( nTime, Eパッド.LT, chipLT, inputEvent.nVelocity );\r
928                                                                                         bHitted = true;\r
929                                                                                 }\r
930                                                                                 else if( e判定FT != E判定.Miss )\r
931                                                                                 {\r
932                                                                                         this.tドラムヒット処理( nTime, Eパッド.LT, chipFT, inputEvent.nVelocity );\r
933                                                                                         bHitted = true;\r
934                                                                                 }\r
935                                                                                 break;\r
936                                                                         //-----------------------------\r
937                                                                                 #endregion\r
938                                                                 }\r
939                                                                 if( !bHitted )\r
940                                                                         break;\r
941                                                                 continue;\r
942                                                         }\r
943                                                         //-----------------------------\r
944                                                         #endregion\r
945 \r
946                                                 case Eパッド.FT:\r
947                                                         #region [ FTとLT(groupingしている場合)のヒット処理 ]\r
948                                                         //-----------------------------\r
949                                                         {\r
950                                                                 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.FT )       // #23857 2010.12.12 yyagi: to support VelocityMin\r
951                                                                         continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
952                                                                 CDTX.CChip chipLT = this.r指定時刻に一番近い未ヒットChip( nTime, 0x15, nInputAdjustTime ); // LT\r
953                                                                 CDTX.CChip chipFT = this.r指定時刻に一番近い未ヒットChip( nTime, 0x17, nInputAdjustTime ); // FT\r
954                                                                 E判定 e判定LT = ( chipLT != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLT, nInputAdjustTime ) : E判定.Miss;\r
955                                                                 E判定 e判定FT = ( chipFT != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipFT, nInputAdjustTime ) : E判定.Miss;\r
956                                                                 switch( eFTGroup )\r
957                                                                 {\r
958                                                                         case EFTGroup.打ち分ける:\r
959                                                                                 #region [ FTのヒット処理 ]\r
960                                                                                 //-----------------------------\r
961                                                                                 if( e判定FT != E判定.Miss )\r
962                                                                                 {\r
963                                                                                         this.tドラムヒット処理( nTime, Eパッド.FT, chipFT, inputEvent.nVelocity );\r
964                                                                                         bHitted = true;\r
965                                                                                 }\r
966                                                                                 //-----------------------------\r
967                                                                                 #endregion\r
968                                                                                 break;\r
969 \r
970                                                                         case EFTGroup.共通:\r
971                                                                                 #region [ FTとLTのヒット処理 ]\r
972                                                                                 //-----------------------------\r
973                                                                                 if( ( e判定LT != E判定.Miss ) && ( e判定FT != E判定.Miss ) )\r
974                                                                                 {\r
975                                                                                         if( chipLT.n発声位置 < chipFT.n発声位置 )\r
976                                                                                         {\r
977                                                                                                 this.tドラムヒット処理( nTime, Eパッド.FT, chipLT, inputEvent.nVelocity );\r
978                                                                                         }\r
979                                                                                         else if( chipLT.n発声位置 > chipFT.n発声位置 )\r
980                                                                                         {\r
981                                                                                                 this.tドラムヒット処理( nTime, Eパッド.FT, chipFT, inputEvent.nVelocity );\r
982                                                                                         }\r
983                                                                                         else\r
984                                                                                         {\r
985                                                                                                 this.tドラムヒット処理( nTime, Eパッド.FT, chipLT, inputEvent.nVelocity );\r
986                                                                                                 this.tドラムヒット処理( nTime, Eパッド.FT, chipFT, inputEvent.nVelocity );\r
987                                                                                         }\r
988                                                                                         bHitted = true;\r
989                                                                                 }\r
990                                                                                 else if( e判定LT != E判定.Miss )\r
991                                                                                 {\r
992                                                                                         this.tドラムヒット処理( nTime, Eパッド.FT, chipLT, inputEvent.nVelocity );\r
993                                                                                         bHitted = true;\r
994                                                                                 }\r
995                                                                                 else if( e判定FT != E判定.Miss )\r
996                                                                                 {\r
997                                                                                         this.tドラムヒット処理( nTime, Eパッド.FT, chipFT, inputEvent.nVelocity );\r
998                                                                                         bHitted = true;\r
999                                                                                 }\r
1000                                                                                 //-----------------------------\r
1001                                                                                 #endregion\r
1002                                                                                 break;\r
1003                                                                 }\r
1004                                                                 if( !bHitted )\r
1005                                                                         break;\r
1006                                                                 continue;\r
1007                                                         }\r
1008                                                         //-----------------------------\r
1009                                                         #endregion\r
1010 \r
1011                                                 case Eパッド.CY:\r
1012                                                         #region [ CY(とLCとRD:groupingしている場合)のヒット処理 ]\r
1013                                                         //-----------------------------\r
1014                                                         {\r
1015                                                                 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.CY )       // #23857 2010.12.12 yyagi: to support VelocityMin\r
1016                                                                         continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
1017                                                                 CDTX.CChip chipCY = this.r指定時刻に一番近い未ヒットChip( nTime, 0x16, nInputAdjustTime ); // CY\r
1018                                                                 CDTX.CChip chipRD = this.r指定時刻に一番近い未ヒットChip( nTime, 0x19, nInputAdjustTime ); // RD\r
1019                                                                 CDTX.CChip chipLC = CDTXMania.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ) : null;\r
1020                                                                 E判定 e判定CY = ( chipCY != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipCY, nInputAdjustTime ) : E判定.Miss;\r
1021                                                                 E判定 e判定RD = ( chipRD != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipRD, nInputAdjustTime ) : E判定.Miss;\r
1022                                                                 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;\r
1023                                                                 CDTX.CChip[] chipArray = new CDTX.CChip[] { chipCY, chipRD, chipLC };\r
1024                                                                 E判定[] e判定Array = new E判定[] { e判定CY, e判定RD, e判定LC };\r
1025                                                                 const int NumOfChips = 3;       // chipArray.GetLength(0)\r
1026 \r
1027                                                                 //num8 = 0;\r
1028                                                                 //while( num8 < 2 )\r
1029 \r
1030                                                                 // CY/RD/LC群を, n発生位置の小さい順に並べる + nullを大きい方に退かす\r
1031                                                                 SortChipsByNTime( chipArray, e判定Array, NumOfChips );\r
1032                                                                 //for ( int i = 0; i < NumOfChips - 1; i++ )\r
1033                                                                 //{\r
1034                                                                 //    //num9 = 2;\r
1035                                                                 //    //while( num9 > num8 )\r
1036                                                                 //    for ( int j = NumOfChips - 1; j > i; j-- )\r
1037                                                                 //    {\r
1038                                                                 //        if ( ( chipArray[ j - 1 ] == null ) || ( ( chipArray[ j ] != null ) && ( chipArray[ j - 1 ].n発声位置 > chipArray[ j ].n発声位置 ) ) )\r
1039                                                                 //        {\r
1040                                                                 //            // swap\r
1041                                                                 //            CDTX.CChip chipTemp = chipArray[ j - 1 ];\r
1042                                                                 //            chipArray[ j - 1 ] = chipArray[ j ];\r
1043                                                                 //            chipArray[ j ] = chipTemp;\r
1044                                                                 //            E判定 e判定Temp = e判定Array[ j - 1 ];\r
1045                                                                 //            e判定Array[ j - 1 ] = e判定Array[ j ];\r
1046                                                                 //            e判定Array[ j ] = e判定Temp;\r
1047                                                                 //        }\r
1048                                                                 //        //num9--;\r
1049                                                                 //    }\r
1050                                                                 //    //num8++;\r
1051                                                                 //}\r
1052                                                                 switch( eCYGroup )\r
1053                                                                 {\r
1054                                                                         case ECYGroup.打ち分ける:\r
1055                                                                                 if( !CDTXMania.ConfigIni.bシンバルフリー )\r
1056                                                                                 {\r
1057                                                                                         if( e判定CY != E判定.Miss )\r
1058                                                                                         {\r
1059                                                                                                 this.tドラムヒット処理( nTime, Eパッド.CY, chipCY, inputEvent.nVelocity );\r
1060                                                                                                 bHitted = true;\r
1061                                                                                         }\r
1062                                                                                         if( !bHitted )\r
1063                                                                                                 break;\r
1064                                                                                         continue;\r
1065                                                                                 }\r
1066                                                                                 //num10 = 0;\r
1067                                                                                 //while ( num10 < NumOfChips )\r
1068                                                                                 for( int i = 0; i < NumOfChips; i++ )\r
1069                                                                                 {\r
1070                                                                                         if( ( e判定Array[ i ] != E判定.Miss ) && ( ( chipArray[ i ] == chipCY ) || ( chipArray[ i ] == chipLC ) ) )\r
1071                                                                                         {\r
1072                                                                                                 this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );\r
1073                                                                                                 bHitted = true;\r
1074                                                                                                 break;\r
1075                                                                                         }\r
1076                                                                                         //num10++;\r
1077                                                                                 }\r
1078                                                                                 if( e判定CY != E判定.Miss )\r
1079                                                                                 {\r
1080                                                                                         this.tドラムヒット処理( nTime, Eパッド.CY, chipCY, inputEvent.nVelocity );\r
1081                                                                                         bHitted = true;\r
1082                                                                                 }\r
1083                                                                                 if( !bHitted )\r
1084                                                                                         break;\r
1085                                                                                 continue;\r
1086 \r
1087                                                                         case ECYGroup.共通:\r
1088                                                                                 if( !CDTXMania.ConfigIni.bシンバルフリー )\r
1089                                                                                 {\r
1090                                                                                         //num12 = 0;\r
1091                                                                                         //while ( num12 < NumOfChips )\r
1092                                                                                         for( int i = 0; i < NumOfChips; i++ )\r
1093                                                                                         {\r
1094                                                                                                 if( ( e判定Array[ i ] != E判定.Miss ) && ( ( chipArray[ i ] == chipCY ) || ( chipArray[ i ] == chipRD ) ) )\r
1095                                                                                                 {\r
1096                                                                                                         this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );\r
1097                                                                                                         bHitted = true;\r
1098                                                                                                         break;\r
1099                                                                                                 }\r
1100                                                                                                 //num12++;\r
1101                                                                                         }\r
1102                                                                                         if( !bHitted )\r
1103                                                                                                 break;\r
1104                                                                                         continue;\r
1105                                                                                 }\r
1106                                                                                 //num11 = 0;\r
1107                                                                                 //while ( num11 < NumOfChips )\r
1108                                                                                 for( int i = 0; i < NumOfChips; i++ )\r
1109                                                                                 {\r
1110                                                                                         if( e判定Array[ i ] != E判定.Miss )\r
1111                                                                                         {\r
1112                                                                                                 this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );\r
1113                                                                                                 bHitted = true;\r
1114                                                                                                 break;\r
1115                                                                                         }\r
1116                                                                                         //num11++;\r
1117                                                                                 }\r
1118                                                                                 if( !bHitted )\r
1119                                                                                         break;\r
1120                                                                                 continue;\r
1121                                                                 }\r
1122                                                                 if( !bHitted )\r
1123                                                                         break;\r
1124                                                                 continue;\r
1125                                                         }\r
1126                                                         //-----------------------------\r
1127                                                         #endregion\r
1128 \r
1129                                                 case Eパッド.HHO:\r
1130                                                         #region [ HO(とHCとLC:groupingしている場合)のヒット処理 ]\r
1131                                                         //-----------------------------\r
1132                                                         {\r
1133                                                                 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.HH )\r
1134                                                                         continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
1135 \r
1136                                                                 CDTX.CChip chipHC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x11, nInputAdjustTime ); // HC\r
1137                                                                 CDTX.CChip chipHO = this.r指定時刻に一番近い未ヒットChip( nTime, 0x18, nInputAdjustTime ); // HO\r
1138                                                                 CDTX.CChip chipLC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ); // LC\r
1139                                                                 E判定 e判定HC = ( chipHC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHC, nInputAdjustTime ) : E判定.Miss;\r
1140                                                                 E判定 e判定HO = ( chipHO != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHO, nInputAdjustTime ) : E判定.Miss;\r
1141                                                                 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;\r
1142                                                                 switch( eHHGroup )\r
1143                                                                 {\r
1144                                                                         case EHHGroup.全部打ち分ける:\r
1145                                                                                 if( e判定HO != E判定.Miss )\r
1146                                                                                 {\r
1147                                                                                         this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1148                                                                                         bHitted = true;\r
1149                                                                                 }\r
1150                                                                                 if( !bHitted )\r
1151                                                                                         break;\r
1152                                                                                 continue;\r
1153 \r
1154                                                                         case EHHGroup.ハイハットのみ打ち分ける:\r
1155                                                                                 if( ( e判定HO != E判定.Miss ) && ( e判定LC != E判定.Miss ) )\r
1156                                                                                 {\r
1157                                                                                         if( chipHO.n発声位置 < chipLC.n発声位置 )\r
1158                                                                                         {\r
1159                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1160                                                                                         }\r
1161                                                                                         else if( chipHO.n発声位置 > chipLC.n発声位置 )\r
1162                                                                                         {\r
1163                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );\r
1164                                                                                         }\r
1165                                                                                         else\r
1166                                                                                         {\r
1167                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1168                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );\r
1169                                                                                         }\r
1170                                                                                         bHitted = true;\r
1171                                                                                 }\r
1172                                                                                 else if( e判定HO != E判定.Miss )\r
1173                                                                                 {\r
1174                                                                                         this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1175                                                                                         bHitted = true;\r
1176                                                                                 }\r
1177                                                                                 else if( e判定LC != E判定.Miss )\r
1178                                                                                 {\r
1179                                                                                         this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );\r
1180                                                                                         bHitted = true;\r
1181                                                                                 }\r
1182                                                                                 if( !bHitted )\r
1183                                                                                         break;\r
1184                                                                                 continue;\r
1185 \r
1186                                                                         case EHHGroup.左シンバルのみ打ち分ける:\r
1187                                                                                 if( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) )\r
1188                                                                                 {\r
1189                                                                                         if( chipHC.n発声位置 < chipHO.n発声位置 )\r
1190                                                                                         {\r
1191                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );\r
1192                                                                                         }\r
1193                                                                                         else if( chipHC.n発声位置 > chipHO.n発声位置 )\r
1194                                                                                         {\r
1195                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1196                                                                                         }\r
1197                                                                                         else\r
1198                                                                                         {\r
1199                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );\r
1200                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1201                                                                                         }\r
1202                                                                                         bHitted = true;\r
1203                                                                                 }\r
1204                                                                                 else if( e判定HC != E判定.Miss )\r
1205                                                                                 {\r
1206                                                                                         this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );\r
1207                                                                                         bHitted = true;\r
1208                                                                                 }\r
1209                                                                                 else if( e判定HO != E判定.Miss )\r
1210                                                                                 {\r
1211                                                                                         this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1212                                                                                         bHitted = true;\r
1213                                                                                 }\r
1214                                                                                 if( !bHitted )\r
1215                                                                                         break;\r
1216                                                                                 continue;\r
1217 \r
1218                                                                         case EHHGroup.全部共通:\r
1219                                                                                 if( ( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) ) && ( e判定LC != E判定.Miss ) )\r
1220                                                                                 {\r
1221                                                                                         CDTX.CChip chip;\r
1222                                                                                         CDTX.CChip[] chipArray = new CDTX.CChip[] { chipHC, chipHO, chipLC };\r
1223                                                                                         // ここから、chipArrayをn発生位置の小さい順に並び替える\r
1224                                                                                         if( chipArray[ 1 ].n発声位置 > chipArray[ 2 ].n発声位置 )\r
1225                                                                                         {\r
1226                                                                                                 chip = chipArray[ 1 ];\r
1227                                                                                                 chipArray[ 1 ] = chipArray[ 2 ];\r
1228                                                                                                 chipArray[ 2 ] = chip;\r
1229                                                                                         }\r
1230                                                                                         if( chipArray[ 0 ].n発声位置 > chipArray[ 1 ].n発声位置 )\r
1231                                                                                         {\r
1232                                                                                                 chip = chipArray[ 0 ];\r
1233                                                                                                 chipArray[ 0 ] = chipArray[ 1 ];\r
1234                                                                                                 chipArray[ 1 ] = chip;\r
1235                                                                                         }\r
1236                                                                                         if( chipArray[ 1 ].n発声位置 > chipArray[ 2 ].n発声位置 )\r
1237                                                                                         {\r
1238                                                                                                 chip = chipArray[ 1 ];\r
1239                                                                                                 chipArray[ 1 ] = chipArray[ 2 ];\r
1240                                                                                                 chipArray[ 2 ] = chip;\r
1241                                                                                         }\r
1242                                                                                         this.tドラムヒット処理( nTime, Eパッド.HHO, chipArray[ 0 ], inputEvent.nVelocity );\r
1243                                                                                         if( chipArray[ 0 ].n発声位置 == chipArray[ 1 ].n発声位置 )\r
1244                                                                                         {\r
1245                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipArray[ 1 ], inputEvent.nVelocity );\r
1246                                                                                         }\r
1247                                                                                         if( chipArray[ 0 ].n発声位置 == chipArray[ 2 ].n発声位置 )\r
1248                                                                                         {\r
1249                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipArray[ 2 ], inputEvent.nVelocity );\r
1250                                                                                         }\r
1251                                                                                         bHitted = true;\r
1252                                                                                 }\r
1253                                                                                 else if( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) )\r
1254                                                                                 {\r
1255                                                                                         if( chipHC.n発声位置 < chipHO.n発声位置 )\r
1256                                                                                         {\r
1257                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );\r
1258                                                                                         }\r
1259                                                                                         else if( chipHC.n発声位置 > chipHO.n発声位置 )\r
1260                                                                                         {\r
1261                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1262                                                                                         }\r
1263                                                                                         else\r
1264                                                                                         {\r
1265                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );\r
1266                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1267                                                                                         }\r
1268                                                                                         bHitted = true;\r
1269                                                                                 }\r
1270                                                                                 else if( ( e判定HC != E判定.Miss ) && ( e判定LC != E判定.Miss ) )\r
1271                                                                                 {\r
1272                                                                                         if( chipHC.n発声位置 < chipLC.n発声位置 )\r
1273                                                                                         {\r
1274                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );\r
1275                                                                                         }\r
1276                                                                                         else if( chipHC.n発声位置 > chipLC.n発声位置 )\r
1277                                                                                         {\r
1278                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );\r
1279                                                                                         }\r
1280                                                                                         else\r
1281                                                                                         {\r
1282                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );\r
1283                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );\r
1284                                                                                         }\r
1285                                                                                         bHitted = true;\r
1286                                                                                 }\r
1287                                                                                 else if( ( e判定HO != E判定.Miss ) && ( e判定LC != E判定.Miss ) )\r
1288                                                                                 {\r
1289                                                                                         if( chipHO.n発声位置 < chipLC.n発声位置 )\r
1290                                                                                         {\r
1291                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1292                                                                                         }\r
1293                                                                                         else if( chipHO.n発声位置 > chipLC.n発声位置 )\r
1294                                                                                         {\r
1295                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );\r
1296                                                                                         }\r
1297                                                                                         else\r
1298                                                                                         {\r
1299                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1300                                                                                                 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );\r
1301                                                                                         }\r
1302                                                                                         bHitted = true;\r
1303                                                                                 }\r
1304                                                                                 else if( e判定HC != E判定.Miss )\r
1305                                                                                 {\r
1306                                                                                         this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );\r
1307                                                                                         bHitted = true;\r
1308                                                                                 }\r
1309                                                                                 else if( e判定HO != E判定.Miss )\r
1310                                                                                 {\r
1311                                                                                         this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );\r
1312                                                                                         bHitted = true;\r
1313                                                                                 }\r
1314                                                                                 else if( e判定LC != E判定.Miss )\r
1315                                                                                 {\r
1316                                                                                         this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );\r
1317                                                                                         bHitted = true;\r
1318                                                                                 }\r
1319                                                                                 if( !bHitted )\r
1320                                                                                         break;\r
1321                                                                                 continue;\r
1322                                                                 }\r
1323                                                                 if( !bHitted )\r
1324                                                                         break;\r
1325                                                                 continue;\r
1326                                                         }\r
1327                                                         //-----------------------------\r
1328                                                         #endregion\r
1329 \r
1330                                                 case Eパッド.RD:\r
1331                                                         #region [ RD(とCYとLC:groupingしている場合)のヒット処理 ]\r
1332                                                         //-----------------------------\r
1333                                                         {\r
1334                                                                 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.RD )       // #23857 2010.12.12 yyagi: to support VelocityMin\r
1335                                                                         continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
1336                                                                 CDTX.CChip chipCY = this.r指定時刻に一番近い未ヒットChip( nTime, 0x16, nInputAdjustTime ); // CY\r
1337                                                                 CDTX.CChip chipRD = this.r指定時刻に一番近い未ヒットChip( nTime, 0x19, nInputAdjustTime ); // RD\r
1338                                                                 CDTX.CChip chipLC = CDTXMania.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ) : null;\r
1339                                                                 E判定 e判定CY = ( chipCY != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipCY, nInputAdjustTime ) : E判定.Miss;\r
1340                                                                 E判定 e判定RD = ( chipRD != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipRD, nInputAdjustTime ) : E判定.Miss;\r
1341                                                                 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;\r
1342                                                                 CDTX.CChip[] chipArray = new CDTX.CChip[] { chipCY, chipRD, chipLC };\r
1343                                                                 E判定[] e判定Array = new E判定[] { e判定CY, e判定RD, e判定LC };\r
1344                                                                 const int NumOfChips = 3;       // chipArray.GetLength(0)\r
1345 \r
1346                                                                 //num13 = 0;\r
1347                                                                 //while( num13 < 2 )\r
1348 \r
1349                                                                 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす\r
1350                                                                 SortChipsByNTime( chipArray, e判定Array, NumOfChips );\r
1351                                                                 //for ( int i = 0; i < NumOfChips - 1; i++ )\r
1352                                                                 //{\r
1353                                                                 //    // num14 = 2;\r
1354                                                                 //    // while( num14 > num13 )\r
1355                                                                 //    for (int j = NumOfChips - 1; j > i; j--)\r
1356                                                                 //    {\r
1357                                                                 //        if( ( chipArray[ j - 1 ] == null ) || ( ( chipArray[ j ] != null ) && ( chipArray[ j - 1 ].n発声位置 > chipArray[ j ].n発声位置 ) ) )\r
1358                                                                 //        {\r
1359                                                                 //            CDTX.CChip chipTemp = chipArray[ j - 1 ];\r
1360                                                                 //            chipArray[ j - 1 ] = chipArray[ j ];\r
1361                                                                 //            chipArray[ j ] = chipTemp;\r
1362                                                                 //            E判定 e判定Temp = e判定Array[ j - 1 ];\r
1363                                                                 //            e判定Array[ j - 1 ] = e判定Array[ j ];\r
1364                                                                 //            e判定Array[ j ] = e判定Temp;\r
1365                                                                 //        }\r
1366                                                                 //        //num14--;\r
1367                                                                 //    }\r
1368                                                                 //    // num13++;\r
1369                                                                 //}\r
1370                                                                 switch( eCYGroup )\r
1371                                                                 {\r
1372                                                                         case ECYGroup.打ち分ける:\r
1373                                                                                 if( e判定RD != E判定.Miss )\r
1374                                                                                 {\r
1375                                                                                         this.tドラムヒット処理( nTime, Eパッド.RD, chipRD, inputEvent.nVelocity );\r
1376                                                                                         bHitted = true;\r
1377                                                                                 }\r
1378                                                                                 break;\r
1379 \r
1380                                                                         case ECYGroup.共通:\r
1381                                                                                 if( !CDTXMania.ConfigIni.bシンバルフリー )\r
1382                                                                                 {\r
1383                                                                                         //num16 = 0;\r
1384                                                                                         //while( num16 < 3 )\r
1385                                                                                         for( int i = 0; i < NumOfChips; i++ )\r
1386                                                                                         {\r
1387                                                                                                 if( ( e判定Array[ i ] != E判定.Miss ) && ( ( chipArray[ i ] == chipCY ) || ( chipArray[ i ] == chipRD ) ) )\r
1388                                                                                                 {\r
1389                                                                                                         this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );\r
1390                                                                                                         bHitted = true;\r
1391                                                                                                         break;\r
1392                                                                                                 }\r
1393                                                                                                 //num16++;\r
1394                                                                                         }\r
1395                                                                                         break;\r
1396                                                                                 }\r
1397                                                                                 //num15 = 0;\r
1398                                                                                 //while( num15 < 3 )\r
1399                                                                                 for( int i = 0; i < NumOfChips; i++ )\r
1400                                                                                 {\r
1401                                                                                         if( e判定Array[ i ] != E判定.Miss )\r
1402                                                                                         {\r
1403                                                                                                 this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );\r
1404                                                                                                 bHitted = true;\r
1405                                                                                                 break;\r
1406                                                                                         }\r
1407                                                                                         //num15++;\r
1408                                                                                 }\r
1409                                                                                 break;\r
1410                                                                 }\r
1411                                                                 if( bHitted )\r
1412                                                                 {\r
1413                                                                         continue;\r
1414                                                                 }\r
1415                                                                 break;\r
1416                                                         }\r
1417                                                         //-----------------------------\r
1418                                                         #endregion\r
1419 \r
1420                                                 case Eパッド.LC:\r
1421                                                         #region [ LC(とHC/HOとCYと:groupingしている場合)のヒット処理 ]\r
1422                                                         //-----------------------------\r
1423                                                         {\r
1424                                                                 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.LC )       // #23857 2010.12.12 yyagi: to support VelocityMin\r
1425                                                                         continue;       // 電子ドラムによる意図的なクロストークを無効にする\r
1426                                                                 CDTX.CChip chipHC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x11, nInputAdjustTime ); // HC\r
1427                                                                 CDTX.CChip chipHO = this.r指定時刻に一番近い未ヒットChip( nTime, 0x18, nInputAdjustTime ); // HO\r
1428                                                                 CDTX.CChip chipLC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ); // LC\r
1429                                                                 CDTX.CChip chipCY = CDTXMania.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip( nTime, 0x16, nInputAdjustTime ) : null;\r
1430                                                                 CDTX.CChip chipRD = CDTXMania.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip( nTime, 0x19, nInputAdjustTime ) : null;\r
1431                                                                 E判定 e判定HC = ( chipHC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHC, nInputAdjustTime ) : E判定.Miss;\r
1432                                                                 E判定 e判定HO = ( chipHO != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHO, nInputAdjustTime ) : E判定.Miss;\r
1433                                                                 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;\r
1434                                                                 E判定 e判定CY = ( chipCY != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipCY, nInputAdjustTime ) : E判定.Miss;\r
1435                                                                 E判定 e判定RD = ( chipRD != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipRD, nInputAdjustTime ) : E判定.Miss;\r
1436                                                                 CDTX.CChip[] chipArray = new CDTX.CChip[] { chipHC, chipHO, chipLC, chipCY, chipRD };\r
1437                                                                 E判定[]  e判定Array = new E判定[] { e判定HC, e判定HO, e判定LC, e判定CY, e判定RD };\r
1438                                                                 const int NumOfChips = 5;       // chipArray.GetLength(0)\r
1439 \r
1440                                                                 //num3 = 0;\r
1441                                                                 //while( num3 < 4 )\r
1442 \r
1443                                                                 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす\r
1444                                                                 SortChipsByNTime( chipArray, e判定Array, NumOfChips );\r
1445                                                                 //for ( int i = 0; i < NumOfChips - 1; i++ )\r
1446                                                                 //{\r
1447                                                                 //    //num4 = 4;\r
1448                                                                 //    //while( num4 > num3 )\r
1449                                                                 //    for ( int j = NumOfChips - 1; j > i; j-- )\r
1450                                                                 //    {\r
1451                                                                 //        if( ( chipArray[ j - 1 ] == null ) || ( ( chipArray[ j ] != null ) && ( chipArray[ j - 1 ].n発声位置 > chipArray[ j ].n発声位置 ) ) )\r
1452                                                                 //        {\r
1453                                                                 //            // swap\r
1454                                                                 //            CDTX.CChip chipTemp = chipArray[ j - 1 ];\r
1455                                                                 //            chipArray[ j - 1 ] = chipArray[ j ];\r
1456                                                                 //            chipArray[ j ] = chipTemp;\r
1457                                                                 //            E判定 e判定Temp = e判定Array[ j - 1 ];\r
1458                                                                 //            e判定Array[ j - 1 ] = e判定Array[ j ];\r
1459                                                                 //            e判定Array[ j ] = e判定Temp;\r
1460                                                                 //        }\r
1461                                                                 //        //num4--;\r
1462                                                                 //    }\r
1463                                                                 //    //num3++;\r
1464                                                                 //}\r
1465                                                                 switch( eHHGroup )\r
1466                                                                 {\r
1467                                                                         case EHHGroup.全部打ち分ける:\r
1468                                                                         case EHHGroup.左シンバルのみ打ち分ける:\r
1469                                                                                 if( !CDTXMania.ConfigIni.bシンバルフリー )\r
1470                                                                                 {\r
1471                                                                                         if( e判定LC != E判定.Miss )\r
1472                                                                                         {\r
1473                                                                                                 this.tドラムヒット処理( nTime, Eパッド.LC, chipLC, inputEvent.nVelocity );\r
1474                                                                                                 bHitted = true;\r
1475                                                                                         }\r
1476                                                                                         if( !bHitted )\r
1477                                                                                                 break;\r
1478                                                                                         continue;\r
1479                                                                                 }\r
1480                                                                                 //num5 = 0;\r
1481                                                                                 //while( num5 < 5 )\r
1482                                                                                 for( int i = 0; i < NumOfChips; i++ )\r
1483                                                                                 {\r
1484                                                                                         if( ( e判定Array[ i ] != E判定.Miss ) && ( ( ( chipArray[ i ] == chipLC ) || ( chipArray[ i ] == chipCY ) ) || ( ( chipArray[ i ] == chipRD ) && ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 ) ) ) )\r
1485                                                                                         {\r
1486                                                                                                 this.tドラムヒット処理( nTime, Eパッド.LC, chipArray[ i ], inputEvent.nVelocity );\r
1487                                                                                                 bHitted = true;\r
1488                                                                                                 break;\r
1489                                                                                         }\r
1490                                                                                         //num5++;\r
1491                                                                                 }\r
1492                                                                                 if( !bHitted )\r
1493                                                                                         break;\r
1494                                                                                 continue;\r
1495 \r
1496                                                                         case EHHGroup.ハイハットのみ打ち分ける:\r
1497                                                                         case EHHGroup.全部共通:\r
1498                                                                                 if( !CDTXMania.ConfigIni.bシンバルフリー )\r
1499                                                                                 {\r
1500                                                                                         //num7 = 0;\r
1501                                                                                         //while( num7 < 5 )\r
1502                                                                                         for( int i = 0; i < NumOfChips; i++ )\r
1503                                                                                         {\r
1504                                                                                                 if( ( e判定Array[ i ] != E判定.Miss ) && ( ( ( chipArray[ i ] == chipLC ) || ( chipArray[ i ] == chipHC ) ) || ( chipArray[ i ] == chipHO ) ) )\r
1505                                                                                                 {\r
1506                                                                                                         this.tドラムヒット処理( nTime, Eパッド.LC, chipArray[ i ], inputEvent.nVelocity );\r
1507                                                                                                         bHitted = true;\r
1508                                                                                                         break;\r
1509                                                                                                 }\r
1510                                                                                                 //num7++;\r
1511                                                                                         }\r
1512                                                                                         if( !bHitted )\r
1513                                                                                                 break;\r
1514                                                                                         continue;\r
1515                                                                                 }\r
1516                                                                                 //num6 = 0;\r
1517                                                                                 //while( num6 < 5 )\r
1518                                                                                 for( int i = 0; i < NumOfChips; i++ )\r
1519                                                                                 {\r
1520                                                                                         if( ( e判定Array[ i ] != E判定.Miss ) && ( ( chipArray[ i ] != chipRD ) || ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 ) ) )\r
1521                                                                                         {\r
1522                                                                                                 this.tドラムヒット処理( nTime, Eパッド.LC, chipArray[ i ], inputEvent.nVelocity );\r
1523                                                                                                 bHitted = true;\r
1524                                                                                                 break;\r
1525                                                                                         }\r
1526                                                                                         //num6++;\r
1527                                                                                 }\r
1528                                                                                 if( !bHitted )\r
1529                                                                                         break;\r
1530                                                                                 continue;\r
1531                                                                 }\r
1532                                                                 if( !bHitted )\r
1533                                                                         break;\r
1534 \r
1535                                                                 break;\r
1536                                                         }\r
1537                                                         //-----------------------------\r
1538                                                         #endregion\r
1539 \r
1540                                                 case Eパッド.HP:             // #27029 2012.1.4 from\r
1541                                                         #region [ HPのヒット処理 ]\r
1542                                                         //-----------------\r
1543                                                         if( CDTXMania.ConfigIni.eBDGroup == EBDGroup.どっちもBD )\r
1544                                                         {\r
1545                                                                 #region [ BDとみなしてヒット処理 ]\r
1546                                                                 //-----------------\r
1547                                                                 if( !this.tドラムヒット処理( nTime, Eパッド.BD, this.r指定時刻に一番近い未ヒットChip( nTime, 0x13, nInputAdjustTime ), inputEvent.nVelocity ) )\r
1548                                                                         break;\r
1549                                                                 continue;\r
1550                                                                 //-----------------\r
1551                                                                 #endregion\r
1552                                                         }\r
1553                                                         else\r
1554                                                         {\r
1555                                                                 #region [ HPのヒット処理 ]\r
1556                                                                 //-----------------\r
1557                                                                 continue;       // 何もしない。この入力を完全に無視するので、break しないこと。\r
1558                                                                 //-----------------\r
1559                                                                 #endregion\r
1560                                                         }\r
1561                                                         //-----------------\r
1562                                                         #endregion\r
1563                                         }\r
1564                                         //-----------------------------\r
1565                                         #endregion\r
1566                                         #region [ (B) ヒットしてなかった場合は、レーンフラッシュ、パッドアニメ、空打ち音再生を実行 ]\r
1567                                         //-----------------------------\r
1568                                         int pad = nPad; // 以下、nPad の代わりに pad を用いる。(成りすまし用)\r
1569 \r
1570                                         if( nPad == (int) Eパッド.HP )       // #27029 2012.1.4 from: HP&BD 時の HiHatPedal の場合は BD に成りすます。\r
1571                                                 pad = (int) Eパッド.BD;              //( HP|BD 時のHP入力はここまでこないので無視。)\r
1572 \r
1573                                         // レーンフラッシュ\r
1574                                         this.actLaneFlushD.Start( (Eレーン) this.nパッド0Atoレーン07[ pad ], ( (float) inputEvent.nVelocity ) / 127f );\r
1575 \r
1576                                         // パッドアニメ\r
1577                                         this.actPad.Hit( this.nパッド0Atoパッド08[ pad ] );\r
1578 \r
1579                                         // 空打ち音\r
1580                                         if( CDTXMania.ConfigIni.bドラム打音を発声する )\r
1581                                         {\r
1582                                                 CDTX.CChip rChip = this.r空うちChip( E楽器パート.DRUMS, (Eパッド) pad );\r
1583                                                 if( rChip != null )\r
1584                                                 {\r
1585                                                         #region [ (B1) 空打ち音が譜面で指定されているのでそれを再生する。]\r
1586                                                         //-----------------\r
1587                                                         this.tサウンド再生( rChip, CSound管理.rc演奏用タイマ.nシステム時刻, E楽器パート.DRUMS, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する.Drums );\r
1588                                                         //-----------------\r
1589                                                         #endregion\r
1590                                                 }\r
1591                                                 else\r
1592                                                 {\r
1593                                                         #region [ (B2) 空打ち音が指定されていないので一番近いチップを探して再生する。]\r
1594                                                         //-----------------\r
1595                                                         switch( ( (Eパッド) pad ) )\r
1596                                                         {\r
1597                                                                 case Eパッド.HH:\r
1598                                                                         #region [ *** ]\r
1599                                                                         //-----------------------------\r
1600                                                                         {\r
1601                                                                                 CDTX.CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 0 ], nInputAdjustTime );\r
1602                                                                                 CDTX.CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 7 ], nInputAdjustTime );\r
1603                                                                                 CDTX.CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 9 ], nInputAdjustTime );\r
1604                                                                                 switch( CDTXMania.ConfigIni.eHHGroup )\r
1605                                                                                 {\r
1606                                                                                         case EHHGroup.ハイハットのみ打ち分ける:\r
1607                                                                                                 rChip = ( chipHC != null ) ? chipHC : chipLC;\r
1608                                                                                                 break;\r
1609 \r
1610                                                                                         case EHHGroup.左シンバルのみ打ち分ける:\r
1611                                                                                                 rChip = ( chipHC != null ) ? chipHC : chipHO;\r
1612                                                                                                 break;\r
1613 \r
1614                                                                                         case EHHGroup.全部共通:\r
1615                                                                                                 if( chipHC != null )\r
1616                                                                                                 {\r
1617                                                                                                         rChip = chipHC;\r
1618                                                                                                 }\r
1619                                                                                                 else if( chipHO == null )\r
1620                                                                                                 {\r
1621                                                                                                         rChip = chipLC;\r
1622                                                                                                 }\r
1623                                                                                                 else if( chipLC == null )\r
1624                                                                                                 {\r
1625                                                                                                         rChip = chipHO;\r
1626                                                                                                 }\r
1627                                                                                                 else if( chipHO.n発声位置 < chipLC.n発声位置 )\r
1628                                                                                                 {\r
1629                                                                                                         rChip = chipHO;\r
1630                                                                                                 }\r
1631                                                                                                 else\r
1632                                                                                                 {\r
1633                                                                                                         rChip = chipLC;\r
1634                                                                                                 }\r
1635                                                                                                 break;\r
1636 \r
1637                                                                                         default:\r
1638                                                                                                 rChip = chipHC;\r
1639                                                                                                 break;\r
1640                                                                                 }\r
1641                                                                         }\r
1642                                                                         //-----------------------------\r
1643                                                                         #endregion\r
1644                                                                         break;\r
1645 \r
1646                                                                 case Eパッド.LT:\r
1647                                                                         #region [ *** ]\r
1648                                                                         //-----------------------------\r
1649                                                                         {\r
1650                                                                                 CDTX.CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 4 ], nInputAdjustTime );\r
1651                                                                                 CDTX.CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 5 ], nInputAdjustTime );\r
1652                                                                                 if( CDTXMania.ConfigIni.eFTGroup != EFTGroup.打ち分ける )\r
1653                                                                                         rChip = ( chipLT != null ) ? chipLT : chipFT;\r
1654                                                                                 else\r
1655                                                                                         rChip = chipLT;\r
1656                                                                         }\r
1657                                                                         //-----------------------------\r
1658                                                                         #endregion\r
1659                                                                         break;\r
1660 \r
1661                                                                 case Eパッド.FT:\r
1662                                                                         #region [ *** ]\r
1663                                                                         //-----------------------------\r
1664                                                                         {\r
1665                                                                                 CDTX.CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 4 ], nInputAdjustTime );\r
1666                                                                                 CDTX.CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 5 ], nInputAdjustTime );\r
1667                                                                                 if( CDTXMania.ConfigIni.eFTGroup != EFTGroup.打ち分ける )\r
1668                                                                                         rChip = ( chipFT != null ) ? chipFT : chipLT;\r
1669                                                                                 else\r
1670                                                                                         rChip = chipFT;\r
1671                                                                         }\r
1672                                                                         //-----------------------------\r
1673                                                                         #endregion\r
1674                                                                         break;\r
1675 \r
1676                                                                 case Eパッド.CY:\r
1677                                                                         #region [ *** ]\r
1678                                                                         //-----------------------------\r
1679                                                                         {\r
1680                                                                                 CDTX.CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 6 ], nInputAdjustTime );\r
1681                                                                                 CDTX.CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 8 ], nInputAdjustTime );\r
1682                                                                                 if( CDTXMania.ConfigIni.eCYGroup != ECYGroup.打ち分ける )\r
1683                                                                                         rChip = ( chipCY != null ) ? chipCY : chipRD;\r
1684                                                                                 else\r
1685                                                                                         rChip = chipCY;\r
1686                                                                         }\r
1687                                                                         //-----------------------------\r
1688                                                                         #endregion\r
1689                                                                         break;\r
1690 \r
1691                                                                 case Eパッド.HHO:\r
1692                                                                         #region [ *** ]\r
1693                                                                         //-----------------------------\r
1694                                                                         {\r
1695                                                                                 CDTX.CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 0 ], nInputAdjustTime );\r
1696                                                                                 CDTX.CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 7 ], nInputAdjustTime );\r
1697                                                                                 CDTX.CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 9 ], nInputAdjustTime );\r
1698                                                                                 switch( CDTXMania.ConfigIni.eHHGroup )\r
1699                                                                                 {\r
1700                                                                                         case EHHGroup.全部打ち分ける:\r
1701                                                                                                 rChip = chipHO;\r
1702                                                                                                 break;\r
1703 \r
1704                                                                                         case EHHGroup.ハイハットのみ打ち分ける:\r
1705                                                                                                 rChip = ( chipHO != null ) ? chipHO : chipLC;\r
1706                                                                                                 break;\r
1707 \r
1708                                                                                         case EHHGroup.左シンバルのみ打ち分ける:\r
1709                                                                                                 rChip = ( chipHO != null ) ? chipHO : chipHC;\r
1710                                                                                                 break;\r
1711 \r
1712                                                                                         case EHHGroup.全部共通:\r
1713                                                                                                 if( chipHO != null )\r
1714                                                                                                 {\r
1715                                                                                                         rChip = chipHO;\r
1716                                                                                                 }\r
1717                                                                                                 else if( chipHC == null )\r
1718                                                                                                 {\r
1719                                                                                                         rChip = chipLC;\r
1720                                                                                                 }\r
1721                                                                                                 else if( chipLC == null )\r
1722                                                                                                 {\r
1723                                                                                                         rChip = chipHC;\r
1724                                                                                                 }\r
1725                                                                                                 else if( chipHC.n発声位置 < chipLC.n発声位置 )\r
1726                                                                                                 {\r
1727                                                                                                         rChip = chipHC;\r
1728                                                                                                 }\r
1729                                                                                                 else\r
1730                                                                                                 {\r
1731                                                                                                         rChip = chipLC;\r
1732                                                                                                 }\r
1733                                                                                                 break;\r
1734                                                                                 }\r
1735                                                                         }\r
1736                                                                         //-----------------------------\r
1737                                                                         #endregion\r
1738                                                                         break;\r
1739 \r
1740                                                                 case Eパッド.RD:\r
1741                                                                         #region [ *** ]\r
1742                                                                         //-----------------------------\r
1743                                                                         {\r
1744                                                                                 CDTX.CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 6 ], nInputAdjustTime );\r
1745                                                                                 CDTX.CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 8 ], nInputAdjustTime );\r
1746                                                                                 if( CDTXMania.ConfigIni.eCYGroup != ECYGroup.打ち分ける )\r
1747                                                                                         rChip = ( chipRD != null ) ? chipRD : chipCY;\r
1748                                                                                 else\r
1749                                                                                         rChip = chipRD;\r
1750                                                                         }\r
1751                                                                         //-----------------------------\r
1752                                                                         #endregion\r
1753                                                                         break;\r
1754 \r
1755                                                                 case Eパッド.LC:\r
1756                                                                         #region [ *** ]\r
1757                                                                         //-----------------------------\r
1758                                                                         {\r
1759                                                                                 CDTX.CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 0 ], nInputAdjustTime );\r
1760                                                                                 CDTX.CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 7 ], nInputAdjustTime );\r
1761                                                                                 CDTX.CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 9 ], nInputAdjustTime );\r
1762                                                                                 switch( CDTXMania.ConfigIni.eHHGroup )\r
1763                                                                                 {\r
1764                                                                                         case EHHGroup.全部打ち分ける:\r
1765                                                                                         case EHHGroup.左シンバルのみ打ち分ける:\r
1766                                                                                                 rChip = chipLC;\r
1767                                                                                                 break;\r
1768 \r
1769                                                                                         case EHHGroup.ハイハットのみ打ち分ける:\r
1770                                                                                         case EHHGroup.全部共通:\r
1771                                                                                                 if( chipLC != null )\r
1772                                                                                                 {\r
1773                                                                                                         rChip = chipLC;\r
1774                                                                                                 }\r
1775                                                                                                 else if( chipHC == null )\r
1776                                                                                                 {\r
1777                                                                                                         rChip = chipHO;\r
1778                                                                                                 }\r
1779                                                                                                 else if( chipHO == null )\r
1780                                                                                                 {\r
1781                                                                                                         rChip = chipHC;\r
1782                                                                                                 }\r
1783                                                                                                 else if( chipHC.n発声位置 < chipHO.n発声位置 )\r
1784                                                                                                 {\r
1785                                                                                                         rChip = chipHC;\r
1786                                                                                                 }\r
1787                                                                                                 else\r
1788                                                                                                 {\r
1789                                                                                                         rChip = chipHO;\r
1790                                                                                                 }\r
1791                                                                                                 break;\r
1792                                                                                 }\r
1793                                                                         }\r
1794                                                                         //-----------------------------\r
1795                                                                         #endregion\r
1796                                                                         break;\r
1797 \r
1798                                                                 default:\r
1799                                                                         #region [ *** ]\r
1800                                                                         //-----------------------------\r
1801                                                                         rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ pad ], nInputAdjustTime );\r
1802                                                                         //-----------------------------\r
1803                                                                         #endregion\r
1804                                                                         break;\r
1805                                                         }\r
1806                                                         if( rChip != null )\r
1807                                                         {\r
1808                                                                 // 空打ち音が見つかったので再生する。\r
1809                                                                 this.tサウンド再生( rChip, CSound管理.rc演奏用タイマ.nシステム時刻, E楽器パート.DRUMS, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する.Drums );\r
1810                                                         }\r
1811                                                         //-----------------\r
1812                                                         #endregion\r
1813                                                 }\r
1814                                         }\r
1815                                         \r
1816                                         // BAD or TIGHT 時の処理。\r
1817                                         if( CDTXMania.ConfigIni.bTight )\r
1818                                                 this.tチップのヒット処理_BadならびにTight時のMiss( E楽器パート.DRUMS, this.nパッド0Atoレーン07[ pad ] );\r
1819                                         //-----------------------------\r
1820                                         #endregion\r
1821                                 }\r
1822                         }\r
1823                 }\r
1824 \r
1825                 // t入力処理・ドラム()からメソッドを抽出したもの。\r
1826                 /// <summary>\r
1827                 /// chipArrayの中を, n発生位置の小さい順に並べる + nullを大きい方に退かす。セットでe判定Arrayも並べ直す。\r
1828                 /// </summary>\r
1829                 /// <param name="chipArray">ソート対象chip群</param>\r
1830                 /// <param name="e判定Array">ソート対象e判定群</param>\r
1831                 /// <param name="NumOfChips">チップ数</param>\r
1832                 private static void SortChipsByNTime( CDTX.CChip[] chipArray, E判定[] e判定Array, int NumOfChips )\r
1833                 {\r
1834                         for ( int i = 0; i < NumOfChips - 1; i++ )\r
1835                         {\r
1836                                 //num9 = 2;\r
1837                                 //while( num9 > num8 )\r
1838                                 for ( int j = NumOfChips - 1; j > i; j-- )\r
1839                                 {\r
1840                                         if ( ( chipArray[ j - 1 ] == null ) || ( ( chipArray[ j ] != null ) && ( chipArray[ j - 1 ].n発声位置 > chipArray[ j ].n発声位置 ) ) )\r
1841                                         {\r
1842                                                 // swap\r
1843                                                 CDTX.CChip chipTemp = chipArray[ j - 1 ];\r
1844                                                 chipArray[ j - 1 ] = chipArray[ j ];\r
1845                                                 chipArray[ j ] = chipTemp;\r
1846                                                 E判定 e判定Temp = e判定Array[ j - 1 ];\r
1847                                                 e判定Array[ j - 1 ] = e判定Array[ j ];\r
1848                                                 e判定Array[ j ] = e判定Temp;\r
1849                                         }\r
1850                                         //num9--;\r
1851                                 }\r
1852                                 //num8++;\r
1853                         }\r
1854                 }\r
1855 \r
1856                 protected override void t背景テクスチャの生成()\r
1857                 {\r
1858                         Rectangle bgrect = new Rectangle( (int) ( 338 * Scale.X ), (int) ( 57 * Scale.Y ), (int) ( 278 * Scale.X ), (int) ( 355 * Scale.Y ) );\r
1859                         string DefaultBgFilename   = @"Graphics\ScreenPlayDrums-background.png";\r
1860                         string DefaultLaneFilename = @"Graphics\ScreenPlayDrums_Lane_parts_drums.png";\r
1861                         string BgFilename = "";\r
1862                         if ( ( ( CDTXMania.DTX.BACKGROUND != null ) && ( CDTXMania.DTX.BACKGROUND.Length > 0 ) ) && !CDTXMania.ConfigIni.bストイックモード )\r
1863                         {\r
1864                                 BgFilename = CDTXMania.DTX.strフォルダ名 + CDTXMania.DTX.BACKGROUND;\r
1865                         }\r
1866                         base.t背景テクスチャの生成( DefaultBgFilename, DefaultLaneFilename, bgrect, BgFilename );\r
1867                 }\r
1868 \r
1869                 protected override void t進行描画_チップ_ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
1870                 {\r
1871                         if ( configIni.bDrums有効 )\r
1872                         {\r
1873                                 #region [ Invisible処理 ]\r
1874                                 if ( configIni.eInvisible.Drums != EInvisible.OFF )\r
1875                                 {\r
1876                                         cInvisibleChip.SetInvisibleStatus( ref pChip );\r
1877                                 }\r
1878                                 #endregion\r
1879                                 else\r
1880                                 {\r
1881                                         #region [ Sudden処理 ]\r
1882                                         if ( configIni.bSudden.Drums )\r
1883                                         {\r
1884                                                 if ( pChip.nバーからの距離dot.Drums < 200 * Scale.Y )\r
1885                                                 {\r
1886                                                         pChip.b可視 = true;\r
1887                                                         pChip.n透明度 = 0xff;\r
1888                                                 }\r
1889                                                 else if ( pChip.nバーからの距離dot.Drums < 250 * Scale.Y )\r
1890                                                 {\r
1891                                                         pChip.b可視 = true;\r
1892                                                         pChip.n透明度 = 0xff - ( (int) ( ( ( (double) ( pChip.nバーからの距離dot.Drums - 200 * Scale.Y ) ) * 255.0 ) / 50.0 ) );\r
1893                                                 }\r
1894                                                 else\r
1895                                                 {\r
1896                                                         pChip.b可視 = false;\r
1897                                                         pChip.n透明度 = 0;\r
1898                                                 }\r
1899                                         }\r
1900                                         #endregion\r
1901                                         #region [ Hidden処理 ]\r
1902                                         if ( configIni.bHidden.Drums )\r
1903                                         {\r
1904                                                 if ( pChip.nバーからの距離dot.Drums < 100 * Scale.Y )\r
1905                                                 {\r
1906                                                         pChip.b可視 = false;\r
1907                                                 }\r
1908                                                 else if ( pChip.nバーからの距離dot.Drums < 150 * Scale.Y )\r
1909                                                 {\r
1910                                                         pChip.b可視 = true;\r
1911                                                         pChip.n透明度 = (int) ( ( ( (double) ( pChip.nバーからの距離dot.Drums - 100 * Scale.Y ) ) * 255.0 ) / 50.0 );\r
1912                                                 }\r
1913                                         }\r
1914                                         #endregion\r
1915                                 }\r
1916                                 if ( !pChip.bHit && pChip.b可視 )\r
1917                                 {\r
1918                                         if ( this.txチップ != null )\r
1919                                         {\r
1920                                                 this.txチップ.n透明度 = pChip.n透明度;\r
1921                                         }\r
1922                                         int x = this.nチャンネルtoX座標[ pChip.nチャンネル番号 - 0x11 ];\r
1923                                         int y = configIni.bReverse.Drums ?\r
1924                                                 (int) ( 0x38 * Scale.Y + pChip.nバーからの距離dot.Drums ) :\r
1925                                                 (int) ( 0x1a6 * Scale.Y - pChip.nバーからの距離dot.Drums );\r
1926                                         x = (int) ( x * Scale.X );\r
1927                                         if ( this.txチップ != null )\r
1928                                         {\r
1929                                                 this.txチップ.vc拡大縮小倍率 = new Vector3( (float) pChip.dbチップサイズ倍率, (float) pChip.dbチップサイズ倍率, 1f );\r
1930                                         }\r
1931                                         int num9 = this.ctチップ模様アニメ.Drums.n現在の値;\r
1932                                         switch ( pChip.nチャンネル番号 )\r
1933                                         {\r
1934                                                         // HH\r
1935                                                 case 0x11:\r
1936                                                         x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
1937                                                         if ( this.txチップ != null )\r
1938                                                         {\r
1939                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
1940                                                                         x,\r
1941                                                                         y - 9,\r
1942                                                                         new Rectangle(\r
1943                                                                                 (int) ( 44 * Scale.X ),\r
1944                                                                                 (int) ( num9 * (18-2) ),\r
1945                                                                                 (int) ( 32 * Scale.X ),\r
1946                                                                                 (int) ( 18 )\r
1947                                                                         )\r
1948                                                                 );\r
1949                                                         }\r
1950                                                         break;\r
1951 \r
1952                                                         // SD\r
1953                                                 case 0x12:\r
1954                                                         x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
1955                                                         if ( this.txチップ != null )\r
1956                                                         {\r
1957                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
1958                                                                         x,\r
1959                                                                         y - 9,\r
1960                                                                         new Rectangle(\r
1961                                                                                 (int) ( 0x4c * Scale.X ),\r
1962                                                                                 (int) ( num9 * (18 - 2) ),\r
1963                                                                                 (int) ( 0x20 * Scale.X ),\r
1964                                                                                 (int) ( 18 ) ) );\r
1965                                                         }\r
1966                                                         break;\r
1967                                                 \r
1968                                                         // BD\r
1969                                                 case 0x13:\r
1970                                                         x += (int) ( 0x16 * Scale.X ) - ( (int) ( ( 44.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
1971                                                         if ( this.txチップ != null )\r
1972                                                         {\r
1973                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
1974                                                                         x,\r
1975                                                                         y - 11,\r
1976                                                                         new Rectangle(\r
1977                                                                                 (int) ( 0 * Scale.X ),\r
1978                                                                                 (int) ( num9 * (22-2) ),\r
1979                                                                                 (int) ( 44 * Scale.X ),\r
1980                                                                                 (int) ( 22 )\r
1981                                                                         )\r
1982                                                                 );\r
1983                                                         }\r
1984                                                         break;\r
1985 \r
1986                                                         // HT\r
1987                                                 case 0x14:\r
1988                                                         x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
1989                                                         if ( this.txチップ != null )\r
1990                                                         {\r
1991                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
1992                                                                         x,\r
1993                                                                         y - 9,\r
1994                                                                         new Rectangle(\r
1995                                                                                 (int) ( 0x6c * Scale.X ),\r
1996                                                                                 (int) ( num9 * (18 - 2) ),\r
1997                                                                                 (int) ( 0x20 * Scale.X ),\r
1998                                                                                 (int) ( 18 ) ) );\r
1999                                                         }\r
2000                                                         break;\r
2001 \r
2002                                                         // LT\r
2003                                                 case 0x15:\r
2004                                                         x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
2005                                                         if ( this.txチップ != null )\r
2006                                                         {\r
2007                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2008                                                                         x,\r
2009                                                                         y - 9,\r
2010                                                                         new Rectangle(\r
2011                                                                                 (int) ( 140 * Scale.X ),\r
2012                                                                                 (int) ( num9 * (18 - 2) ),\r
2013                                                                                 (int) ( 0x20 * Scale.X ),\r
2014                                                                                 (int) ( 18 ) ) );\r
2015                                                         }\r
2016                                                         break;\r
2017 \r
2018                                                         // CY\r
2019                                                 case 0x16:\r
2020                                                         x += (int) ( 0x13 * Scale.X ) - ( (int) ( ( 38.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
2021                                                         if ( this.txチップ != null )\r
2022                                                         {\r
2023                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2024                                                                         x,\r
2025                                                                         y - 46,\r
2026                                                                         new Rectangle(\r
2027                                                                                 (int) ( 0xcc * Scale.X ),\r
2028                                                                                 (int) ( 786 ),\r
2029                                                                                 (int) ( 0x26 * Scale.X ),\r
2030                                                                                 (int) ( 78 ) ) );\r
2031 \r
2032                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2033                                                                         x,\r
2034                                                                         y - 9, \r
2035                                                                         new Rectangle(\r
2036                                                                                 (int) ( 0xcc * Scale.X ),\r
2037                                                                                 (int) ( num9 * (18 - 2) ),\r
2038                                                                                 (int) ( 0x26 * Scale.X ),\r
2039                                                                                 (int) ( 18 ) ) );\r
2040                                                         }\r
2041                                                         break;\r
2042 \r
2043                                                         // FT\r
2044                                                 case 0x17:\r
2045                                                         x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
2046                                                         if ( this.txチップ != null )\r
2047                                                         {\r
2048                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2049                                                                         x,\r
2050                                                                         y - 9,\r
2051                                                                         new Rectangle( \r
2052                                                                                 (int) ( 0xac * Scale.X ),\r
2053                                                                                 (int) ( num9 * (18 - 2) ),\r
2054                                                                                 (int) ( 0x20 * Scale.X ),\r
2055                                                                                 (int) ( 18 ) ) );\r
2056                                                         }\r
2057                                                         break;\r
2058 \r
2059                                                         // HHO\r
2060                                                 case 0x18:\r
2061                                                         x += (int) ( 13 * Scale.X ) - ( (int) ( ( 26.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
2062                                                         if ( this.txチップ != null )\r
2063                                                         {\r
2064                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2065                                                                         x,\r
2066                                                                         y - 9,\r
2067                                                                         new Rectangle(\r
2068                                                                                 (int) ( 0xf2 * Scale.X ),\r
2069                                                                                 (int) ( num9 * (18 - 2) ),\r
2070                                                                                 (int) ( 0x1a * Scale.X ),\r
2071                                                                                 (int) ( 18 )\r
2072                                                                                 ) );\r
2073                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2074                                                                         x,\r
2075                                                                         y - 16,\r
2076                                                                         new Rectangle(\r
2077                                                                                 (int) ( 0xf2 * Scale.X ),\r
2078                                                                                 (int) ( 790 ),\r
2079                                                                                 (int) ( 0x1a * Scale.X ),\r
2080                                                                                 (int) ( 30 )\r
2081                                                                                 ) );\r
2082                                                         }\r
2083                                                         break;\r
2084 \r
2085                                                         // RCY\r
2086                                                 case 0x19:\r
2087                                                         x += (int) ( 13 * Scale.X ) - ( (int) ( ( 26.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
2088                                                         if ( this.txチップ != null )\r
2089                                                         {\r
2090                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2091                                                                         x,\r
2092                                                                         y - 9,\r
2093                                                                         new Rectangle( \r
2094                                                                                 (int) ( 0xf2 * Scale.X ),\r
2095                                                                                 (int) ( num9 * ( 18 - 2 ) ),\r
2096                                                                                 (int) ( 0x1a * Scale.X ),\r
2097                                                                                 (int) ( 18 )\r
2098                                                                                 ) );\r
2099                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2100                                                                         x,\r
2101                                                                         y - 16,\r
2102                                                                         new Rectangle( \r
2103                                                                                 (int) ( 0xf2 * Scale.X ), \r
2104                                                                                 (int) ( 790 ),\r
2105                                                                                 (int) ( 0x1a * Scale.X ),\r
2106                                                                                 (int) ( 30 )\r
2107                                                                                 ) );\r
2108                                                         }\r
2109                                                         break;\r
2110 \r
2111                                                         // LCY\r
2112                                                 case 0x1a:\r
2113                                                         x += (int) ( 0x13 * Scale.X ) - ( (int) ( ( 38.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );\r
2114                                                         if ( this.txチップ != null )\r
2115                                                         {\r
2116                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2117                                                                         x,\r
2118                                                                         y - 46,\r
2119                                                                         new Rectangle(\r
2120                                                                                 (int) ( 0xcc * Scale.X ),\r
2121                                                                                 (int) ( 786 ),\r
2122                                                                                 (int) ( 0x26 * Scale.X ),\r
2123                                                                                 (int) ( 78 )\r
2124                                                                                 ) );\r
2125                                                                 this.txチップ.t2D描画( CDTXMania.app.Device,\r
2126                                                                         x,\r
2127                                                                         y - 9,\r
2128                                                                         new Rectangle(\r
2129                                                                                 (int) ( 0xcc * Scale.X ),\r
2130                                                                                 (int) ( num9 * (18 - 2) ),\r
2131                                                                                 (int) ( 0x26 * Scale.X ),\r
2132                                                                                 (int) ( 18 )\r
2133                                                                                 ) );\r
2134                                                         }\r
2135                                                         break;\r
2136                                         }\r
2137                                         if ( this.txチップ != null )\r
2138                                         {\r
2139                                                 this.txチップ.vc拡大縮小倍率 = new Vector3( 1f, 1f, 1f );\r
2140                                                 this.txチップ.n透明度 = 0xff;\r
2141                                         }\r
2142                                 }\r
2143 \r
2144                                 int indexSevenLanes = this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ];\r
2145                                 // #35411 chnmr0 modified\r
2146                                 bool autoPlayCondition = ( configIni.bAutoPlay[ indexSevenLanes ] && !pChip.bHit );\r
2147                 bool UsePerfectGhost = true;\r
2148                 long ghostLag = 0;\r
2149 \r
2150                 if( CDTXMania.ConfigIni.eAutoGhost.Drums != EAutoGhostData.PERFECT &&\r
2151                     CDTXMania.listAutoGhostLag.Drums != null &&\r
2152                     0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.listAutoGhostLag.Drums.Count)\r
2153 \r
2154                 {\r
2155                     // ゴーストデータが有効 : ラグに合わせて判定\r
2156                                         ghostLag = CDTXMania.listAutoGhostLag.Drums[pChip.n楽器パートでの出現順];\r
2157                                         ghostLag = (ghostLag & 255) - 128;\r
2158                                         ghostLag -= this.nInputAdjustTimeMs.Drums;\r
2159                                         autoPlayCondition &= !pChip.bHit && (ghostLag + pChip.n発声時刻ms <= CSound管理.rc演奏用タイマ.n現在時刻ms);\r
2160                     UsePerfectGhost = false;\r
2161                 }\r
2162                 if( UsePerfectGhost )\r
2163                 {\r
2164                     // 従来の AUTO : バー下で判定\r
2165                     autoPlayCondition &= ( pChip.nバーからの距離dot.Drums < 0 );\r
2166                 }\r
2167 \r
2168                                 if ( autoPlayCondition )\r
2169                                 {\r
2170                                         pChip.bHit = true;\r
2171                                         this.actLaneFlushD.Start( (Eレーン) indexSevenLanes, ( (float) CInput管理.n通常音量 ) / 127f );\r
2172                                         bool flag = this.bフィルイン中;\r
2173                                         bool flag2 = this.bフィルイン中 && this.bフィルイン区間の最後のChipである( pChip );\r
2174                                         //bool flag3 = flag2;\r
2175                                         // #31602 2013.6.24 yyagi 判定ラインの表示位置をずらしたら、チップのヒットエフェクトの表示もずらすために、nJudgeLine..を追加\r
2176                                         this.actChipFireD.Start( (Eレーン)indexSevenLanes, flag, flag2, flag2, 演奏判定ライン座標.nJudgeLinePosY_delta.Drums );\r
2177                                         this.actPad.Hit( this.nチャンネル0Atoパッド08[ pChip.nチャンネル番号 - 0x11 ] );\r
2178                                         this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms + ghostLag, E楽器パート.DRUMS, dTX.nモニタを考慮した音量( E楽器パート.DRUMS ) );\r
2179                                         this.tチップのヒット処理(pChip.n発声時刻ms + ghostLag, pChip);\r
2180                                         cInvisibleChip.StartSemiInvisible( E楽器パート.DRUMS );\r
2181                                 }\r
2182                 // #35411 modify end\r
2183                 \r
2184                 // #35411 2015.08.21 chnmr0 add\r
2185                 // 目標値グラフにゴーストの達成率を渡す\r
2186                 if (CDTXMania.ConfigIni.eTargetGhost.Drums != ETargetGhostData.NONE &&\r
2187                     CDTXMania.listTargetGhsotLag.Drums != null)\r
2188                 {\r
2189                     double val = 0;\r
2190                     if (CDTXMania.ConfigIni.eTargetGhost.Drums == ETargetGhostData.ONLINE)\r
2191                     {\r
2192                         if (CDTXMania.DTX.n可視チップ数.Drums > 0)\r
2193                         {\r
2194                                 // Online Stats の計算式\r
2195                             val = 100 *\r
2196                                 (this.nヒット数_TargetGhost.Drums.Perfect * 17 +\r
2197                                  this.nヒット数_TargetGhost.Drums.Great * 7 +\r
2198                                  this.n最大コンボ数_TargetGhost.Drums * 3) / (20.0 * CDTXMania.DTX.n可視チップ数.Drums);\r
2199                         }\r
2200                     }\r
2201                     else\r
2202                     {\r
2203                         val = CScoreIni.t演奏型スキルを計算して返す(\r
2204                             CDTXMania.DTX.n可視チップ数.Drums,\r
2205                             this.nヒット数_TargetGhost.Drums.Perfect,\r
2206                             this.nヒット数_TargetGhost.Drums.Great,\r
2207                             this.nヒット数_TargetGhost.Drums.Good,\r
2208                             this.nヒット数_TargetGhost.Drums.Poor,\r
2209                             this.nヒット数_TargetGhost.Drums.Miss,\r
2210                             E楽器パート.DRUMS, new STAUTOPLAY());\r
2211                     }\r
2212                     if (val < 0) val = 0;\r
2213                     if (val > 100) val = 100;\r
2214                     this.actGraph.dbグラフ値目標_渡 = val;\r
2215                 }\r
2216                                 //break;\r
2217                                 return;\r
2218                         }       // end of "if configIni.bDrums有効"\r
2219                         if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2220                         {\r
2221                                 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, E楽器パート.DRUMS, dTX.nモニタを考慮した音量( E楽器パート.DRUMS ) );\r
2222                                 pChip.bHit = true;\r
2223                         }\r
2224                 }\r
2225                 protected override void t進行描画_チップ_ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )\r
2226                 {\r
2227                         base.t進行描画_チップ_ギターベース( configIni, ref dTX, ref pChip, inst,\r
2228                                 演奏判定ライン座標.n判定ラインY座標( inst, false, false ),              // 95  Normal\r
2229                                 演奏判定ライン座標.n判定ラインY座標( inst, false, true ),               // 374 Reverse\r
2230                                 (int) ( 57 * Scale.Y ), (int) ( 412 * Scale.Y ),                                // チップのY軸表示範囲\r
2231                                 509, 400,                                       // openチップのX座標(Gt, Bs)\r
2232                                 268, 144, 76, 6, 24,            // オープンチップregionの x, y, w, h, 通常チップのw\r
2233                                 509, 561, 400, 452,                     // GtのX, Gt左利きのX, BsのX, Bs左利きのX,\r
2234                                 26, 24                                          // 描画のX座標間隔, テクスチャのX座標間隔\r
2235                         );\r
2236                 }\r
2237 #if false\r
2238                 protected override void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )\r
2239                 {\r
2240                         int instIndex = (int) inst;\r
2241                         if ( configIni.bGuitar有効 )\r
2242                         {\r
2243                                 if ( configIni.bSudden[ instIndex ] )\r
2244                                 {\r
2245                                         pChip.b可視 = pChip.nバーからの距離dot[ instIndex ] < 200;\r
2246                                 }\r
2247                                 if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 ) )\r
2248                                 {\r
2249                                         pChip.b可視 = false;\r
2250                                 }\r
2251 \r
2252                                 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2253                                 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2254                                 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2255                                 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2256                                 bool bChipIsO  = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2257 \r
2258                                 int OPEN = (inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;\r
2259                                 if ( !pChip.bHit && pChip.b可視 )\r
2260                                 {\r
2261                                         int y = configIni.bReverse[ instIndex ] ? ( 374 - pChip.nバーからの距離dot[ instIndex ] ) : ( 95 + pChip.nバーからの距離dot[ instIndex ] );\r
2262                                         if ( ( y > 57 ) && ( y < 412 ) )\r
2263                                         {\r
2264                                                 if ( this.txチップ != null )\r
2265                                                 {\r
2266                                                         int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;\r
2267                                                         if ( pChip.nチャンネル番号 == OPEN )\r
2268                                                         {\r
2269                                                                 int xo = ( inst == E楽器パート.GUITAR ) ? 509 : 400;\r
2270                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, xo, y - 2, new Rectangle( 268, 144 + ( ( nアニメカウンタ現在の値 % 5 ) * 6 ), 76, 6 ) );\r
2271                                                         }\r
2272                                                         Rectangle rc = new Rectangle( 268, nアニメカウンタ現在の値 * 6, 24, 6 );\r
2273                                                         int x;\r
2274                                                         if ( inst == E楽器パート.GUITAR )\r
2275                                                         {\r
2276                                                                 x = ( configIni.bLeft.Guitar ) ? 561 : 509;\r
2277                                                         }\r
2278                                                         else\r
2279                                                         {\r
2280                                                                 x = ( configIni.bLeft.Bass ) ? 452 : 400;\r
2281                                                         }\r
2282                                                         int deltaX = ( configIni.bLeft[ instIndex ] ) ? -26 : +26;\r
2283 \r
2284                                                         if ( bChipHasR )\r
2285                                                         {\r
2286                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - 3, rc );\r
2287                                                         }\r
2288                                                         rc.X += 24;\r
2289                                                         x += deltaX;\r
2290                                                         if ( bChipHasG )\r
2291                                                         {\r
2292                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - 3, rc );\r
2293                                                         }\r
2294                                                         rc.X += 24;\r
2295                                                         x += deltaX;\r
2296                                                         if ( bChipHasB )\r
2297                                                         {\r
2298                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - 3, rc );\r
2299                                                         }\r
2300                                                 }\r
2301                                         }\r
2302                                 }\r
2303                                 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
2304                                 if ( ( !pChip.bHit ) && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )\r
2305                                 {\r
2306                                         int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3;   // lane offset\r
2307                                         bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;\r
2308                                         bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;\r
2309                                         bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;\r
2310                                         if ( ( bChipHasR || bChipIsO ) && autoR )\r
2311                                         {\r
2312                                                 this.actChipFireGB.Start( 0 + lo);\r
2313                                         }\r
2314                                         if ( ( bChipHasG || bChipIsO ) && autoG )\r
2315                                         {\r
2316                                                 this.actChipFireGB.Start( 1 + lo );\r
2317                                         }\r
2318                                         if ( ( bChipHasB || bChipIsO ) && autoB )\r
2319                                         {\r
2320                                                 this.actChipFireGB.Start( 2 + lo );\r
2321                                         }\r
2322                                         if ( (inst == E楽器パート.GUITAR && bIsAutoPlay.GtPick ) || (inst == E楽器パート.BASS && bIsAutoPlay.BsPick ) )\r
2323                                         {\r
2324                                                 bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );\r
2325                                                 bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );\r
2326                                                 bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );\r
2327                                                 bool bMiss = true;\r
2328                                                 if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ||\r
2329                                                         ( ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )\r
2330                                                 )\r
2331                                                 {\r
2332                                                         bMiss = false;\r
2333                                                 }\r
2334                                                 pChip.bHit = true;\r
2335                                                 this.tサウンド再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );\r
2336                                                 this.r次にくるギターChip = null;\r
2337                                                 this.tチップのヒット処理( pChip.n発声時刻ms, pChip );\r
2338                                         }\r
2339                                 }\r
2340                                 //break;\r
2341                                 return;\r
2342                         }       // end of "if configIni.bGuitar有効"\r
2343                         if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )      // Guitar/Bass無効の場合は、自動演奏する\r
2344                         {\r
2345                                 pChip.bHit = true;\r
2346                                 this.tサウンド再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );\r
2347                         }\r
2348                 }\r
2349 #endif\r
2350                 protected void t進行描画_チップ_ギター_ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2351                 {\r
2352                         //if ( configIni.bGuitar有効 )\r
2353                         //{\r
2354                         //    // 後日、以下の部分を何とかCStage演奏画面共通.csに移したい。\r
2355                         //    if ( !pChip.bHit && pChip.b可視 )\r
2356                         //    {\r
2357                         //        if ( this.txチップ != null )\r
2358                         //        {\r
2359                         //            this.txチップ.n透明度 = pChip.n透明度;\r
2360                         //        }\r
2361                         //        int[] y_base = {\r
2362                         //            演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, false ),     // 95\r
2363                         //            演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, true )               // 374\r
2364                         //        };                    // ドラム画面かギター画面かで変わる値\r
2365                         //        //int[] y_base = { 0x5f, 0x176 };             // 判定バーのY座標: ドラム画面かギター画面かで変わる値\r
2366                         //        int offset = (int) ( 0x39 * Scale.Y );        // ドラム画面かギター画面かで変わる値\r
2367 \r
2368                         //        const int WailingWidth  = (int) ( 20 * Scale.X );             // ウェイリングチップ画像の幅: 4種全て同じ値\r
2369                         //        const int WailingHeight = (int) ( 50 * Scale.Y );             // ウェイリングチップ画像の高さ: 4種全て同じ値\r
2370                         //        const int baseTextureOffsetX = (int) ( 268 * Scale.X );       // テクスチャ画像中のウェイリングチップ画像の位置X: ドラム画面かギター画面かで変わる値\r
2371                         //        const int baseTextureOffsetY = (int) ( 174 * Scale.Y );       // テクスチャ画像中のウェイリングチップ画像の位置Y: ドラム画面かギター画面かで変わる値\r
2372                         //        const int drawX = (int) ( 588 * Scale.X );                            // ウェイリングチップ描画位置X座標: 4種全て異なる値\r
2373 \r
2374                         //        const int numA = (int) ( 26 * Scale.Y );                              // ドラム画面かギター画面かで変わる値\r
2375                         //        int y = configIni.bReverse.Guitar ?\r
2376                         //            ( y_base[1] - (int) ( pChip.nバーからの距離dot.Guitar * Scale.Y ) ) :\r
2377                         //            ( y_base[0] + (int) ( pChip.nバーからの距離dot.Guitar * Scale.Y ) );\r
2378                         //        int numB = y - offset;                                // 4種全て同じ定義\r
2379                         //        int numC = 0;                                         // 4種全て同じ初期値\r
2380                         //        const int showRangeY1 = (int) ( 355 * Scale.Y );                              // ドラム画面かギター画面かで変わる値\r
2381                         //        if ( ( numB < ( showRangeY1 + numA ) ) && ( numB > -numA ) )  // 以下のロジックは4種全て同じ\r
2382                         //        {\r
2383                         //            int c = this.ctWailingチップ模様アニメ.n現在の値;\r
2384                         //            Rectangle rect = new Rectangle(\r
2385                         //                baseTextureOffsetX + ( c * WailingWidth ),\r
2386                         //                baseTextureOffsetY,\r
2387                         //                WailingWidth,\r
2388                         //                WailingHeight\r
2389                         //            );\r
2390                         //            if ( numB < numA )\r
2391                         //            {\r
2392                         //                rect.Y += numA - numB;\r
2393                         //                rect.Height -= numA - numB;\r
2394                         //                numC = numA - numB;\r
2395                         //            }\r
2396                         //            if ( numB > ( showRangeY1 - numA ) )\r
2397                         //            {\r
2398                         //                rect.Height -= numB - ( showRangeY1 - numA );\r
2399                         //            }\r
2400                         //            if ( ( rect.Bottom > rect.Top ) && ( this.txチップ != null ) )\r
2401                         //            {\r
2402                         //                this.txチップ.t2D描画( CDTXMania.app.Device,\r
2403                         //                    drawX,\r
2404                         //                    ( ( y - numA ) + numC ),\r
2405                         //                    rect\r
2406                         //                );\r
2407                         //            }\r
2408                         //        }\r
2409                         //    }\r
2410                         //}\r
2411                         base.t進行描画_チップ_ギター_ウェイリング( configIni, ref dTX, ref pChip, false );\r
2412                 }\r
2413                 protected override void t進行描画_チップ_フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2414                 {\r
2415                         if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2416                         {\r
2417                                 pChip.bHit = true;\r
2418                                 switch ( pChip.n整数値 )\r
2419                                 {\r
2420                                         case 0x01:      // フィルイン開始\r
2421                                                 if ( configIni.bフィルイン有効 )\r
2422                                                 {\r
2423                                                         this.bフィルイン中 = true;\r
2424                                                 }\r
2425                                                 break;\r
2426 \r
2427                                         case 0x02:      // フィルイン終了\r
2428                                                 if ( configIni.bフィルイン有効 )\r
2429                                                 {\r
2430                                                         this.bフィルイン中 = false;\r
2431                                                 }\r
2432                                                 if ( ( ( this.actCombo.n現在のコンボ数.Drums > 0 ) || configIni.bドラムが全部オートプレイである ) && configIni.b歓声を発声する )\r
2433                                                 {\r
2434                                                         if ( this.r現在の歓声Chip.Drums != null )\r
2435                                                         {\r
2436                                                                 dTX.tチップの再生( this.r現在の歓声Chip.Drums, CSound管理.rc演奏用タイマ.nシステム時刻, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
2437                                                         }\r
2438                                                         else\r
2439                                                         {\r
2440                                                                 CDTXMania.Skin.sound歓声音.n位置_次に鳴るサウンド = 0;\r
2441                                                                 CDTXMania.Skin.sound歓声音.t再生する();\r
2442                                                         }\r
2443                                                 }\r
2444                                                 break;\r
2445 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi TEST\r
2446                                                                 case 0x04:      // HH消音あり(従来同等)\r
2447                                                                         CDTXMania.DTX.b演奏で直前の音を消音する.HH = true;\r
2448                                                                         break;\r
2449                                                                 case 0x05:      // HH消音無し\r
2450                                                                         CDTXMania.DTX.b演奏で直前の音を消音する.HH = false;\r
2451                                                                         break;\r
2452                                                                 case 0x06:      // ギター消音あり(従来同等)\r
2453                                                                         CDTXMania.DTX.b演奏で直前の音を消音する.Gutiar = true;\r
2454                                                                         break;\r
2455                                                                 case 0x07:      // ギター消音無し\r
2456                                                                         CDTXMania.DTX.b演奏で直前の音を消音する.Gutiar = false;\r
2457                                                                         break;\r
2458                                                                 case 0x08:      // ベース消音あり(従来同等)\r
2459                                                                         CDTXMania.DTX.b演奏で直前の音を消音する.Bass = true;\r
2460                                                                         break;\r
2461                                                                 case 0x09:      // ベース消音無し\r
2462                                                                         CDTXMania.DTX.b演奏で直前の音を消音する.Bass = false;\r
2463                                                                         break;\r
2464 #endif\r
2465                                 }\r
2466                         }\r
2467                 }\r
2468 #if false\r
2469                 protected override void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2470                 {\r
2471                         if ( configIni.bGuitar有効 )\r
2472                         {\r
2473                                 if ( configIni.bSudden.Bass )\r
2474                                 {\r
2475                                         pChip.b可視 = pChip.nバーからの距離dot.Bass < 200;\r
2476                                 }\r
2477                                 if ( configIni.bHidden.Bass && ( pChip.nバーからの距離dot.Bass < 100 ) )\r
2478                                 {\r
2479                                         pChip.b可視 = false;\r
2480                                 }\r
2481 \r
2482                                 bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2483                                 bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2484                                 bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2485                                 bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2486                                 bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 ); \r
2487                                 if ( !pChip.bHit && pChip.b可視 )\r
2488                                 {\r
2489                                         int y = configIni.bReverse.Bass ? ( 374 - pChip.nバーからの距離dot.Bass ) : ( 95 + pChip.nバーからの距離dot.Bass );\r
2490                                         if ( ( y > 57 ) && ( y < 412 ) )\r
2491                                         {\r
2492                                                 int nアニメカウンタ現在の値 = this.ctチップ模様アニメ.Bass.n現在の値;\r
2493                                                 if ( pChip.nチャンネル番号 == 0xA0 )\r
2494                                                 {\r
2495                                                         if ( this.txチップ != null )\r
2496                                                         {\r
2497                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, 400, y - 2, new Rectangle( 268, 144 + ( ( nアニメカウンタ現在の値 % 5 ) * 6 ), 76, 6 ) );\r
2498                                                         }\r
2499                                                 }\r
2500                                                 else if ( this.txチップ != null )\r
2501                                                 {\r
2502                                                         int x = ( configIni.bLeft.Bass ) ? 452 : 400;\r
2503                                                         int deltaX = ( configIni.bLeft.Bass ) ? -24 : +24;\r
2504                                                         Rectangle rc = new Rectangle( 268, nアニメカウンタ現在の値 * 6, 24, 6 );\r
2505                                                         if ( bGtBsR )\r
2506                                                         {\r
2507                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, 400, y - 3, rc );\r
2508                                                         }\r
2509                                                         rc.X += 24;\r
2510                                                         x += deltaX;\r
2511                                                         if ( bGtBsG )\r
2512                                                         {\r
2513                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, 0x1aa, y - 3, rc );\r
2514                                                         }\r
2515                                                         rc.X += 24;\r
2516                                                         x += deltaX;\r
2517                                                         if ( bGtBsB )\r
2518                                                         {\r
2519                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, 0x1c4, y - 3, rc );\r
2520                                                         }\r
2521                                                 }\r
2522                                         }\r
2523                                 }\r
2524                                 if ( ( configIni.bAutoPlay.Bass && !pChip.bHit ) && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2525                                 {\r
2526                                         if ( ( bGtBsR || ( pChip.nチャンネル番号 == 0xA0 ) ) && bIsAutoPlay.BsR )\r
2527                                         {\r
2528                                                 this.actChipFireGB.Start( 3 );\r
2529                                         }\r
2530                                         if ( ( bGtBsG || ( pChip.nチャンネル番号 == 0xA0 ) ) && bIsAutoPlay.BsG )\r
2531                                         {\r
2532                                                 this.actChipFireGB.Start( 4 );\r
2533                                         }\r
2534                                         if ( ( bGtBsB || ( pChip.nチャンネル番号 == 0xA0 ) ) && bIsAutoPlay.BsB )\r
2535                                         {\r
2536                                                 this.actChipFireGB.Start( 5 );\r
2537                                         }\r
2538                                         if ( bIsAutoPlay.BsPick )\r
2539                                         {\r
2540                                                 pChip.bHit = true;\r
2541                                                 this.tサウンド再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, E楽器パート.BASS, dTX.nモニタを考慮した音量( E楽器パート.BASS ) );\r
2542                                                 this.r次にくるベースChip = null;\r
2543                                                 this.tチップのヒット処理( pChip.n発声時刻ms, pChip );\r
2544                                         }\r
2545                                 }\r
2546                                 return;\r
2547                         }\r
2548                         if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2549                         {\r
2550                                 this.tサウンド再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, E楽器パート.BASS, dTX.nモニタを考慮した音量( E楽器パート.BASS ) );\r
2551                                 pChip.bHit = true;\r
2552                         }\r
2553                 }\r
2554 #endif\r
2555                 protected void t進行描画_チップ_ベース_ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2556                 {\r
2557                         //if ( configIni.bGuitar有効 )\r
2558                         //{\r
2559                         //    // 後日、以下の部分を何とかCStage演奏画面共通.csに移したい。\r
2560                         //    if ( !pChip.bHit && pChip.b可視 )\r
2561                         //    {\r
2562                         //        if ( this.txチップ != null )\r
2563                         //        {\r
2564                         //            this.txチップ.n透明度 = pChip.n透明度;\r
2565                         //        }\r
2566                         //        int[] y_base = {\r
2567                         //            演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, false ),\r
2568                         //            演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, true )\r
2569                         //        };                    // ドラム画面かギター画面かで変わる値\r
2570                         //        //int[] y_base = { 0x5f, 0x176 };             // 判定バーのY座標: ドラム画面かギター画面かで変わる値\r
2571                         //        int offset = (int) ( 0x39 * Scale.Y );                                        // ドラム画面かギター画面かで変わる値\r
2572 \r
2573                         //        const int WailingWidth  = (int) ( 20 * Scale.X );             // ウェイリングチップ画像の幅: 4種全て同じ値\r
2574                         //        const int WailingHeight = (int) ( 50 * Scale.Y );             // ウェイリングチップ画像の高さ: 4種全て同じ値\r
2575                         //        const int baseTextureOffsetX = (int) ( 268 * Scale.X );       // テクスチャ画像中のウェイリングチップ画像の位置X: ドラム画面かギター画面かで変わる値\r
2576                         //        const int baseTextureOffsetY = (int) ( 174 * Scale.Y );       // テクスチャ画像中のウェイリングチップ画像の位置Y: ドラム画面かギター画面かで変わる値\r
2577                         //        const int drawX = (int) ( 479 * Scale.X );                            // ウェイリングチップ描画位置X座標: 4種全て異なる値\r
2578 \r
2579                         //        const int numA = (int) ( 26 * Scale.Y );                              // ドラム画面かギター画面かで変わる値\r
2580                         //        int y = configIni.bReverse.Bass ?\r
2581                         //            ( y_base[ 1 ] - (int) ( pChip.nバーからの距離dot.Bass * Scale.Y ) ) :\r
2582                         //            ( y_base[ 0 ] + (int) ( pChip.nバーからの距離dot.Bass * Scale.Y ) );\r
2583                         //        int numB = y - offset;                                // 4種全て同じ定義\r
2584                         //        int numC = 0;                                         // 4種全て同じ初期値\r
2585                         //        const int showRangeY1 = (int) ( 355 * Scale.Y );                              // ドラム画面かギター画面かで変わる値\r
2586                         //        if ( ( numB < ( showRangeY1 + numA ) ) && ( numB > -numA ) )  // 以下のロジックは4種全て同じ\r
2587                         //        {\r
2588                         //            int c = this.ctWailingチップ模様アニメ.n現在の値;\r
2589                         //            Rectangle rect = new Rectangle(\r
2590                         //                baseTextureOffsetX + ( c * WailingWidth ),\r
2591                         //                baseTextureOffsetY,\r
2592                         //                WailingWidth,\r
2593                         //                WailingHeight\r
2594                         //            );\r
2595                         //            if ( numB < numA )\r
2596                         //            {\r
2597                         //                rect.Y += numA - numB;\r
2598                         //                rect.Height -= numA - numB;\r
2599                         //                numC = numA - numB;\r
2600                         //            }\r
2601                         //            if ( numB > ( showRangeY1 - numA ) )\r
2602                         //            {\r
2603                         //                rect.Height -= numB - ( showRangeY1 - numA );\r
2604                         //            }\r
2605                         //            if ( ( rect.Bottom > rect.Top ) && ( this.txチップ != null ) )\r
2606                         //            {\r
2607                         //                this.txチップ.t2D描画( CDTXMania.app.Device,\r
2608                         //                    drawX,\r
2609                         //                    ( ( y - numA ) + numC ),\r
2610                         //                    rect );\r
2611                         //            }\r
2612                         //        }\r
2613                         //    }\r
2614                         //}\r
2615                         base.t進行描画_チップ_ベース_ウェイリング( configIni, ref dTX, ref pChip, false );\r
2616                 }\r
2617                 protected override void t進行描画_チップ_空打ち音設定_ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2618                 {\r
2619                         if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2620                         {\r
2621                                 pChip.bHit = true;\r
2622                                 this.r現在の空うちドラムChip[ (int) this.eチャンネルtoパッド[ pChip.nチャンネル番号 - 0x11 ] ] = pChip;\r
2623                                 //pChip.nチャンネル番号 = ( pChip.nチャンネル番号 != 0xbc ) ? ( ( pChip.nチャンネル番号 - 0xb1 ) + 0x11 ) : 0x1a;\r
2624                         }\r
2625                 }\r
2626                 protected override void t進行描画_チップ_小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2627                 {\r
2628                         int n小節番号plus1 = pChip.n発声位置 / 384;\r
2629                         if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2630                         {\r
2631                                 pChip.bHit = true;\r
2632                                 this.actPlayInfo.n小節番号 = n小節番号plus1 - 1;\r
2633                                 if ( configIni.bWave再生位置自動調整機能有効 && ( bIsDirectSound || bUseOSTimer ) )\r
2634                                 {\r
2635                                         dTX.tWave再生位置自動補正();\r
2636                                 }\r
2637 //#if DEBUG\r
2638 //                {\r
2639 //                    dTX.tWaveBGM再生位置表示();         //デバッグ用\r
2640 //                }\r
2641 //#endif\r
2642                         }\r
2643                         #region [ Drumsの小節線と、小節番号 ]\r
2644                         if ( configIni.bDrums有効 )\r
2645                         {\r
2646                                 if ( configIni.b演奏情報を表示する && ( configIni.eDark == Eダークモード.OFF ) )\r
2647                                 {\r
2648                                         int n小節番号 = n小節番号plus1 - 1;\r
2649                                         CDTXMania.act文字コンソール.tPrint(\r
2650                                                 (int) ( 0x14d * Scale.X ),\r
2651                                                 configIni.bReverse.Drums ?\r
2652                                                         (int) ( 0x38 * Scale.Y + pChip.nバーからの距離dot.Drums ) :\r
2653                                                         (int) ( 0x195 * Scale.Y - pChip.nバーからの距離dot.Drums ),\r
2654                                                 C文字コンソール.Eフォント種別.白,\r
2655                                                 n小節番号.ToString()\r
2656                                         );\r
2657                                 }\r
2658                                 if ( ( ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 ) && ( this.txチップ != null ) )\r
2659                                 {\r
2660                                         this.txチップ.n透明度 = 255;\r
2661                                         this.txチップ.t2D描画( CDTXMania.app.Device,\r
2662                                                 0x23 * Scale.X,\r
2663                                                 configIni.bReverse.Drums ?\r
2664                                                         //( int ) ( ( ( 0x38 + pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ) :\r
2665                                                         //( int ) ( ( ( 0x1a6 - pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ),\r
2666                                                         (int) ( 0x37 * Scale.Y + pChip.nバーからの距離dot.Drums ) :\r
2667                                                         (int) ( 0x1a5 * Scale.Y - pChip.nバーからの距離dot.Drums ),\r
2668                                                 new Rectangle( 0, ( int ) ( 0x1bc * Scale.Y ), ( int ) ( 0x128 * Scale.X ), ( int ) ( 2 * Scale.Y ) ) );\r
2669                                 }\r
2670                         }\r
2671                         #endregion\r
2672                         if ( ( pChip.b可視 && configIni.bGuitar有効 ) && ( configIni.eDark != Eダークモード.FULL ) && ( this.txチップ != null ) )\r
2673                         {\r
2674                                 this.txチップ.n透明度 = 255;\r
2675                                 #region [ Guitarの小節線 ]\r
2676                                 //int y = configIni.bReverse.Guitar ? ( ( 0x176 - pChip.nバーからの距離dot.Guitar ) - 1 ) : ( ( 0x5f + pChip.nバーからの距離dot.Guitar ) - 1 );\r
2677                                 int y = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, configIni.bReverse.Guitar );\r
2678                                 if ( configIni.bReverse.Guitar )\r
2679                                 {\r
2680                                         y = y - (int) ( pChip.nバーからの距離dot.Guitar ) - 1;\r
2681                                 }\r
2682                                 else\r
2683                                 {\r
2684                                         y = y + (int) ( pChip.nバーからの距離dot.Guitar ) - 1;\r
2685                                 }\r
2686                                 int n小節線消失距離dot;\r
2687                                 // Reverse時の小節線消失位置を、RGBボタンの真ん中程度に。\r
2688                                 // 非Reverse時の消失処理は、従来通りt進行描画・チップ()にお任せ。\r
2689                                 n小節線消失距離dot = configIni.bReverse.Guitar ?\r
2690                                         (int) ( -100 * Scale.Y ):\r
2691                                         ( configIni.e判定位置.Guitar == E判定位置.標準 ) ? (int) ( -50 * Scale.Y ) : (int) ( -25 * Scale.Y );\r
2692 \r
2693                                 if ( ( dTX.bチップがある.Guitar ) &&\r
2694                                         ( 0x39 * Scale.Y < y ) && ( ( y < 0x19c * Scale.Y ) ) &&\r
2695                                         ( pChip.nバーからの距離dot.Guitar >= n小節線消失距離dot )\r
2696                                         )\r
2697                                 {\r
2698                                         this.txチップ.t2D描画(\r
2699                                                 CDTXMania.app.Device,\r
2700                                                 0x1fb * Scale.X,\r
2701                                                 y,\r
2702                                                 new Rectangle(\r
2703                                                         0,\r
2704                                                         (int) ( 450 * Scale.Y ),\r
2705                                                         (int) ( 0x4e * Scale.X ),\r
2706                                                         (int) ( 1 * Scale.Y )\r
2707                                                 )\r
2708                                         );\r
2709                                 }\r
2710                                 #endregion\r
2711                                 #region [ Bassの小節線 ]\r
2712                                 //y = configIni.bReverse.Bass ? ( ( 0x176 - pChip.nバーからの距離dot.Bass ) - 1 ) : ( ( 0x5f + pChip.nバーからの距離dot.Bass ) - 1 );\r
2713                                 y = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, configIni.bReverse.Bass );\r
2714                                 if ( configIni.bReverse.Bass )\r
2715                                 {\r
2716                                         y = y - (int) ( pChip.nバーからの距離dot.Bass ) - 1;\r
2717                                 }\r
2718                                 else\r
2719                                 {\r
2720                                         y = y + (int) ( pChip.nバーからの距離dot.Bass ) - 1;\r
2721                                 }\r
2722                                 n小節線消失距離dot = configIni.bReverse.Bass ?\r
2723                                         (int) ( -100 * Scale.Y ) :\r
2724                                         ( configIni.e判定位置.Bass == E判定位置.標準 ) ? (int) ( -50 * Scale.Y ) : (int) ( -25 * Scale.Y );\r
2725 \r
2726                                 if ( ( dTX.bチップがある.Bass ) &&\r
2727                                         ( 0x39 * Scale.Y < y ) && ( y < 0x19c * Scale.Y ) &&\r
2728                                         ( pChip.nバーからの距離dot.Bass >= n小節線消失距離dot )\r
2729                                         )\r
2730                                 {\r
2731                                         this.txチップ.t2D描画(\r
2732                                                 CDTXMania.app.Device,\r
2733                                                 0x18e * Scale.X,\r
2734                                                 y,\r
2735                                                 new Rectangle(\r
2736                                                         0,\r
2737                                                         (int) ( 450 * Scale.Y ),\r
2738                                                         (int) ( 0x4e * Scale.X ),\r
2739                                                         (int) ( 1 * Scale.Y )\r
2740                                                 )\r
2741                                         );\r
2742                                 }\r
2743                                 #endregion\r
2744                         }\r
2745                 }\r
2746                 #endregion\r
2747         }\r
2748 }\r