OSDN Git Service

#38362 FulAVIの仕様を全面変更。FullAVI改めForceScalingAVIがOnの時に、ScaledAVIX,Y,W,Hで指定した領域に旧AVIをアスペ...
[dtxmania/dtxmania.git] / DTXMania / コード / ステージ / 07.演奏 / CStage演奏画面共通.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Runtime;
5 using System.Runtime.InteropServices;
6 using System.Drawing;
7 using System.Drawing.Imaging;
8 using System.IO;
9 using System.Diagnostics;
10 using System.Threading;
11 using System.Threading.Tasks;
12
13 using SharpDX;
14 using SharpDX.Direct3D9;
15 using FDK;
16
17 using SlimDXKey = SlimDX.DirectInput.Key;
18
19 namespace DTXMania
20 {
21         /// <summary>
22         /// 演奏画面の共通クラス (ドラム演奏画面, ギター演奏画面の継承元)
23         /// </summary>
24         internal partial class CStage演奏画面共通 : CStage
25         {
26                 #region [Member_Activities]
27                 CAct演奏AVI actAVI;
28                 CAct演奏BGA actBGA;
29                 CAct演奏チップファイアGB actChipFireGB;
30                 CAct演奏Combo共通 actCombo;
31                 CAct演奏Danger共通 actDANGER;
32                 CActFIFOBlack actFI;
33                 CActFIFOBlack actFO;
34                 CActFIFOWhite actFOClear;
35                 CAct演奏ゲージ共通 actGauge;
36                 CAct演奏判定文字列共通 actJudgeString;
37                 CAct演奏DrumsレーンフラッシュD actLaneFlushD;
38                 CAct演奏レーンフラッシュGB共通 actLaneFlushGB;
39                 CActオプションパネル actOptionPanel;
40                 CAct演奏パネル文字列 actPanel;
41                 CAct演奏演奏情報 actPlayInfo;
42                 CAct演奏RGB共通 actRGB;
43                 CAct演奏スコア共通 actScore;
44                 CAct演奏ステージ失敗 actStageFailed;
45                 CAct演奏WailingBonus共通 actWailingBonus;
46                 CAct演奏スクロール速度 act譜面スクロール速度;
47                 CAct演奏DrumsチップファイアD actChipFireD;
48                 // #24074 2011.01.23 add ikanick
49                 CAct演奏グラフ actGraph;
50                 CAct演奏Drumsパッド actPad;
51                 CAct演奏Lane actLane;
52                 #endregion
53
54                 bool bPAUSE;
55                 STDGBSValue<bool> b演奏にMIDI入力を使った;
56                 STDGBSValue<bool> b演奏にキーボードを使った;
57                 STDGBSValue<bool> b演奏にジョイパッドを使った;
58                 STDGBSValue<bool> b演奏にマウスを使った;
59
60                 CCounter ctWailingチップ模様アニメ;
61                 STDGBSValue<CCounter> ctチップ模様アニメ;
62
63                 E演奏画面の戻り値 eフェードアウト完了時の戻り値;
64
65                 STDGBSValue<CHitCountOfRank> nヒット数_Auto含まない;
66                 STDGBSValue<CHitCountOfRank> nヒット数_Auto含む;
67                 // #35411 2015.08.21 chnmr0 add
68                 STDGBSValue<CHitCountOfRank> nヒット数_TargetGhost;
69                 STDGBSValue<int> nコンボ数_TargetGhost;
70                 STDGBSValue<int> n最大コンボ数_TargetGhost;
71                 int n現在のトップChip = -1;
72                 int[] n最後に再生したBGMの実WAV番号 = new int[50];
73                 EChannel e最後に再生したHHのチャンネル番号;
74                 // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.
75                 List<int> L最後に再生したHHの実WAV番号;
76                 // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"
77                 STPadValue<int> n最後に再生した実WAV番号;
78                 // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する
79                 volatile Queue<STMixer> queueMixerSound;
80                 DateTime dtLastQueueOperation;
81                 bool bIsDirectSound;
82                 double db再生速度;
83                 bool bValidScore;
84                 bool bフィルイン中; // drums only
85
86                 STDGBSValue<Queue<CChip>> queWailing;
87                 STDGBSValue<CChip> r現在の歓声Chip;
88                 STPadValue<CChip> r空打ちドラムチップ = new STPadValue<CChip>();
89                 CChip r現在の空うちギターChip;
90                 ST空打ち r現在の空うちドラムChip;
91                 CChip r現在の空うちベースChip;
92                 CChip r次にくるギターChip;
93                 CChip r次にくるベースChip;
94
95                 CTexture txWailing枠;
96                 CTexture txチップ;
97                 CTexture txチップGB;
98                 CTexture txヒットバー;
99                 CTexture txヒットバーGB;
100                 CTexture tx背景;
101
102                 CInvisibleChip cInvisibleChip;
103                 CWailingChip共通[] cWailingChip;
104
105                 STDGBSValue<CScoreIni.C演奏記録> record;
106
107                 long nLastSendMessageTime;
108
109 #if TEST_MEASUREFRAMEDRAWTIME
110                 Stopwatch sw = new Stopwatch();
111                 List<long> swlist = new List<long>(100000);
112                 List<long> tmlist = new List<long>(100000);
113 #endif
114
115                 public CStage演奏画面共通()
116                 {
117                         base.eステージID = CStage.Eステージ.演奏;
118                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
119                         base.b活性化してない = true;
120                         base.list子Activities.Add(this.actPad = new CAct演奏Drumsパッド());
121                         base.list子Activities.Add(this.actChipFireD = new CAct演奏DrumsチップファイアD());
122                         base.list子Activities.Add(this.actChipFireGB = new CAct演奏チップファイアGB());
123                         base.list子Activities.Add(this.actStageFailed = new CAct演奏ステージ失敗());
124                         base.list子Activities.Add(this.actDANGER = new CAct演奏Danger共通());
125                         base.list子Activities.Add(this.actAVI = new CAct演奏AVI());
126                         base.list子Activities.Add(this.actBGA = new CAct演奏BGA());
127                         base.list子Activities.Add(this.actPanel = new CAct演奏パネル文字列());
128                         base.list子Activities.Add(this.act譜面スクロール速度 = new CAct演奏スクロール速度());
129                         base.list子Activities.Add(this.actWailingBonus = new CAct演奏WailingBonus共通());
130                         base.list子Activities.Add(this.actScore = new CAct演奏スコア共通());
131                         base.list子Activities.Add(this.actRGB = new CAct演奏RGB共通());
132                         base.list子Activities.Add(this.actLaneFlushD = new CAct演奏DrumsレーンフラッシュD());
133                         base.list子Activities.Add(this.actLaneFlushGB = new CAct演奏レーンフラッシュGB共通());
134                         base.list子Activities.Add(this.actJudgeString = new CAct演奏判定文字列共通());
135                         base.list子Activities.Add(this.actGauge = new CAct演奏ゲージ共通());
136                         base.list子Activities.Add(this.actGraph = new CAct演奏グラフ());
137                         base.list子Activities.Add(this.actCombo = new CAct演奏Combo共通());
138                         base.list子Activities.Add(this.actPlayInfo = new CAct演奏演奏情報());
139                         base.list子Activities.Add(this.actFI = new CActFIFOBlack());
140                         base.list子Activities.Add(this.actFO = new CActFIFOBlack());
141                         base.list子Activities.Add(this.actFOClear = new CActFIFOWhite());
142                         base.list子Activities.Add(this.actLane = new CAct演奏Lane());
143                         list子Activities.Add(actOptionPanel = new CActオプションパネル(EOptionPanelDirection.Vertical));
144                 }
145
146                 #region [ PlayRecordSave ]
147                 private void t演奏結果を格納する_ドラム()
148                 {
149                         record.Drums = new CScoreIni.C演奏記録();
150                         CScoreIni.C演奏記録 Drums = Record.Drums;
151                         bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Drums);
152                         if (CDTXMania.Instance.DTX.bチップがある.Drums && CDTXMania.Instance.ConfigIni.bDrums有効)
153                         {
154                                 Drums.nスコア = (long)this.actScore.Get(EPart.Drums);
155                                 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Drums, CDTXMania.Instance.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect,
156                                                 this.actCombo.dgbコンボ数.Drums.n最高値,
157                                                 EPart.Drums);
158                                 Drums.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.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, EPart.Drums, true);
159                                 Drums.nPerfect数 = allauto ? this.nヒット数_Auto含む.Drums.Perfect : this.nヒット数_Auto含まない.Drums.Perfect;
160                                 Drums.nGreat数 = allauto ? this.nヒット数_Auto含む.Drums.Great : this.nヒット数_Auto含まない.Drums.Great;
161                                 Drums.nGood数 = allauto ? this.nヒット数_Auto含む.Drums.Good : this.nヒット数_Auto含まない.Drums.Good;
162                                 Drums.nPoor数 = allauto ? this.nヒット数_Auto含む.Drums.Poor : this.nヒット数_Auto含まない.Drums.Poor;
163                                 Drums.nMiss数 = allauto ? this.nヒット数_Auto含む.Drums.Miss : this.nヒット数_Auto含まない.Drums.Miss;
164                                 Drums.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Drums.Perfect;
165                                 Drums.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Drums.Great;
166                                 Drums.nGood数_Auto含まない = this.nヒット数_Auto含まない.Drums.Good;
167                                 Drums.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Drums.Poor;
168                                 Drums.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Drums.Miss;
169                                 Drums.n最大コンボ数 = this.actCombo.dgbコンボ数.Drums.n最高値;
170                                 Drums.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Drums;
171                                 for ( EPad i = EPad.Min; i < EPad.BassPadMax; i++ )
172                                 {
173                                         Drums.bAutoPlay[i] = CDTXMania.Instance.ConfigIni.bAutoPlay[i];
174                                 }
175                                 Drums.bTight = CDTXMania.Instance.ConfigIni.bTight;
176                                 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
177                                 {
178                                         Drums.eSudHidInv[i] = CDTXMania.Instance.ConfigIni.eSudHidInv[i];
179                                         Drums.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
180                                         Drums.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
181                                         Drums.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
182                                         Drums.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1)) * 0.5f;
183                                 }
184                                 Drums.eDark = CDTXMania.Instance.ConfigIni.eDark;
185                                 Drums.n演奏速度分子 = CDTXMania.Instance.ConfigIni.nPlaySpeed;
186                                 Drums.n演奏速度分母 = 20;
187                                 Drums.e譜面レーンタイプ.Drums = CDTXMania.Instance.DTX.n使用レーン数.Drums;
188                                 Drums.e譜面レーンタイプ.Guitar= CDTXMania.Instance.DTX.n使用レーン数.Guitar;
189                                 Drums.e譜面レーンタイプ.Bass  = CDTXMania.Instance.DTX.n使用レーン数.Bass;
190                                 Drums.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup.Value;
191                                 Drums.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup.Value;
192                                 Drums.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup.Value;
193                                 Drums.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH.Value;
194                                 Drums.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT.Value;
195                                 Drums.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY.Value;
196                                 Drums.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
197                                 Drums.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
198                                 Drums.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;
199                                 Drums.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;
200                                 Drums.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;
201                                 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;
202                                 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;
203                                 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;
204                                 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;
205                                 Drums.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
206                                 Drums.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
207                                 Drums.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
208                                 Drums.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
209                                 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;
210                                 Drums.最終更新日時 = DateTime.Now.ToString();
211                                 // #35461 chnmr0 add
212                                 Drums.nRisky = CDTXMania.Instance.ConfigIni.nRisky;
213                                 // #35417 chnmr0 add
214                                 Drums.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
215                         }
216                 }
217                 private void t演奏結果を格納する_ギター()
218                 {
219                         record.Guitar = new CScoreIni.C演奏記録();
220                         CScoreIni.C演奏記録 Guitar = Record.Guitar;
221                         bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Guitar);
222                         if (CDTXMania.Instance.DTX.bチップがある.Guitar)
223                         {
224                                 Guitar.nスコア = (long)this.actScore.Get(EPart.Guitar);
225                                 Guitar.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Guitar, CDTXMania.Instance.DTX.n可視チップ数.Guitar, this.nヒット数_Auto含まない.Guitar.Perfect, this.actCombo.dgbコンボ数.Guitar.n最高値, EPart.Guitar);
226                                 Guitar.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.DTX.n可視チップ数.Guitar, this.nヒット数_Auto含まない.Guitar.Perfect, this.nヒット数_Auto含まない.Guitar.Great, this.nヒット数_Auto含まない.Guitar.Good, this.nヒット数_Auto含まない.Guitar.Poor, this.nヒット数_Auto含まない.Guitar.Miss, EPart.Guitar, true);
227                                 Guitar.nPerfect数 = allauto ? this.nヒット数_Auto含む.Guitar.Perfect : this.nヒット数_Auto含まない.Guitar.Perfect;
228                                 Guitar.nGreat数 = allauto ? this.nヒット数_Auto含む.Guitar.Great : this.nヒット数_Auto含まない.Guitar.Great;
229                                 Guitar.nGood数 = allauto ? this.nヒット数_Auto含む.Guitar.Good : this.nヒット数_Auto含まない.Guitar.Good;
230                                 Guitar.nPoor数 = allauto ? this.nヒット数_Auto含む.Guitar.Poor : this.nヒット数_Auto含まない.Guitar.Poor;
231                                 Guitar.nMiss数 = allauto ? this.nヒット数_Auto含む.Guitar.Miss : this.nヒット数_Auto含まない.Guitar.Miss;
232                                 Guitar.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Perfect;
233                                 Guitar.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Great;
234                                 Guitar.nGood数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Good;
235                                 Guitar.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Poor;
236                                 Guitar.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Guitar.Miss;
237                                 Guitar.n最大コンボ数 = this.actCombo.dgbコンボ数.Guitar.n最高値;
238                                 Guitar.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Guitar;
239                                 for (EPad i = EPad.Min; i < EPad.BassPadMax; i++)
240                                 {
241                                         Guitar.bAutoPlay[i] = CDTXMania.Instance.ConfigIni.bAutoPlay[i];
242                                 }
243                                 Guitar.bTight = CDTXMania.Instance.ConfigIni.bTight;
244                                 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
245                                 {
246                                         Guitar.eSudHidInv[i] = CDTXMania.Instance.ConfigIni.eSudHidInv[i];
247                                         Guitar.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
248                                         Guitar.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
249                                         Guitar.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
250                                         Guitar.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1)) * 0.5f;
251                                 }
252                                 Guitar.eDark = CDTXMania.Instance.ConfigIni.eDark;
253                                 Guitar.n演奏速度分子 = CDTXMania.Instance.ConfigIni.nPlaySpeed;
254                                 Guitar.n演奏速度分母 = 20;
255                                 Guitar.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
256                                 Guitar.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
257                                 Guitar.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
258                                 Guitar.e譜面レーンタイプ.Drums = CDTXMania.Instance.DTX.n使用レーン数.Drums;
259                                 Guitar.e譜面レーンタイプ.Guitar = CDTXMania.Instance.DTX.n使用レーン数.Guitar;
260                                 Guitar.e譜面レーンタイプ.Bass = CDTXMania.Instance.DTX.n使用レーン数.Bass;
261                                 Guitar.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH;
262                                 Guitar.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT;
263                                 Guitar.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY;
264                                 Guitar.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
265                                 Guitar.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
266                                 Guitar.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;
267                                 Guitar.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;
268                                 Guitar.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;
269                                 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;
270                                 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;
271                                 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;
272                                 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;
273                                 Guitar.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
274                                 Guitar.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
275                                 Guitar.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
276                                 Guitar.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
277                                 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;
278                                 Guitar.最終更新日時 = DateTime.Now.ToString();
279                                 // #35417 chnmr0 add
280                                 Guitar.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
281                         }
282                 }
283                 private void t演奏結果を格納する_ベース()
284                 {
285                         record.Bass = new CScoreIni.C演奏記録();
286                         CScoreIni.C演奏記録 Bass = Record.Bass;
287                         bool allauto = CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Bass);
288                         if (CDTXMania.Instance.DTX.bチップがある.Bass)
289                         {
290                                 Bass.nスコア = (long)this.actScore.Get(EPart.Bass);
291                                 Bass.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す(CDTXMania.Instance.DTX.LEVEL.Bass, CDTXMania.Instance.DTX.n可視チップ数.Bass, this.nヒット数_Auto含まない.Bass.Perfect, this.actCombo.dgbコンボ数.Bass.n最高値, EPart.Bass);
292                                 Bass.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す(CDTXMania.Instance.DTX.n可視チップ数.Bass, this.nヒット数_Auto含まない.Bass.Perfect, this.nヒット数_Auto含まない.Bass.Great, this.nヒット数_Auto含まない.Bass.Good, this.nヒット数_Auto含まない.Bass.Poor, this.nヒット数_Auto含まない.Bass.Miss, EPart.Bass, true);
293                                 Bass.nPerfect数 = allauto ? this.nヒット数_Auto含む.Bass.Perfect : this.nヒット数_Auto含まない.Bass.Perfect;
294                                 Bass.nGreat数 = allauto ? this.nヒット数_Auto含む.Bass.Great : this.nヒット数_Auto含まない.Bass.Great;
295                                 Bass.nGood数 = allauto ? this.nヒット数_Auto含む.Bass.Good : this.nヒット数_Auto含まない.Bass.Good;
296                                 Bass.nPoor数 = allauto ? this.nヒット数_Auto含む.Bass.Poor : this.nヒット数_Auto含まない.Bass.Poor;
297                                 Bass.nMiss数 = allauto ? this.nヒット数_Auto含む.Bass.Miss : this.nヒット数_Auto含まない.Bass.Miss;
298                                 Bass.nPerfect数_Auto含まない = this.nヒット数_Auto含まない.Bass.Perfect;
299                                 Bass.nGreat数_Auto含まない = this.nヒット数_Auto含まない.Bass.Great;
300                                 Bass.nGood数_Auto含まない = this.nヒット数_Auto含まない.Bass.Good;
301                                 Bass.nPoor数_Auto含まない = this.nヒット数_Auto含まない.Bass.Poor;
302                                 Bass.nMiss数_Auto含まない = this.nヒット数_Auto含まない.Bass.Miss;
303                                 Bass.n最大コンボ数 = this.actCombo.dgbコンボ数.Bass.n最高値;
304                                 Bass.n全チップ数 = CDTXMania.Instance.DTX.n可視チップ数.Bass;
305                                 for (EPad i = EPad.Min; i < EPad.BassPadMax; i++)
306                                 {
307                                         Bass.bAutoPlay[i] = CDTXMania.Instance.ConfigIni.bAutoPlay[i];
308                                 }
309                                 Bass.bTight = CDTXMania.Instance.ConfigIni.bTight;
310                                 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
311                                 {
312                                         Bass.eSudHidInv[i] = CDTXMania.Instance.ConfigIni.eSudHidInv[i];
313                                         Bass.bReverse[i] = CDTXMania.Instance.ConfigIni.bReverse[i];
314                                         Bass.eRandom[i] = CDTXMania.Instance.ConfigIni.eRandom[i];
315                                         Bass.bLight[i] = CDTXMania.Instance.ConfigIni.bLight[i];
316                                         Bass.f譜面スクロール速度[i] = ((float)(CDTXMania.Instance.ConfigIni.nScrollSpeed[i] + 1)) * 0.5f;
317                                 }
318                                 Bass.eDark = CDTXMania.Instance.ConfigIni.eDark;
319                                 Bass.n演奏速度分子 = CDTXMania.Instance.ConfigIni.nPlaySpeed;
320                                 Bass.n演奏速度分母 = 20;
321                                 Bass.eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
322                                 Bass.eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
323                                 Bass.eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
324                                 Bass.e譜面レーンタイプ.Drums = CDTXMania.Instance.DTX.n使用レーン数.Drums;
325                                 Bass.e譜面レーンタイプ.Guitar = CDTXMania.Instance.DTX.n使用レーン数.Guitar;
326                                 Bass.e譜面レーンタイプ.Bass = CDTXMania.Instance.DTX.n使用レーン数.Bass;
327                                 Bass.eHitSoundPriorityHH = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH;
328                                 Bass.eHitSoundPriorityFT = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT;
329                                 Bass.eHitSoundPriorityCY = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY;
330                                 Bass.bGuitar有効 = CDTXMania.Instance.ConfigIni.bGuitar有効;
331                                 Bass.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;
332                                 Bass.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;
333                                 Bass.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;
334                                 // #24280 2011.1.29 yyagi
335                                 Bass.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;
336                                 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass;
337                                 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass;
338                                 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass;
339                                 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass;
340                                 Bass.nPerfectになる範囲ms = CDTXMania.Instance.nPerfect範囲ms;
341                                 Bass.nGreatになる範囲ms = CDTXMania.Instance.nGreat範囲ms;
342                                 Bass.nGoodになる範囲ms = CDTXMania.Instance.nGood範囲ms;
343                                 Bass.nPoorになる範囲ms = CDTXMania.Instance.nPoor範囲ms;
344                                 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;
345                                 Bass.最終更新日時 = DateTime.Now.ToString();
346                                 // #35417 chnmr0 add
347                                 Bass.bギターとベースを入れ替えた = CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
348                         }
349                 }
350                 #endregion
351
352                 // CStage 実装
353                 public override void On活性化()
354                 {
355                         if (base.b活性化してない)
356                         {
357                                 this.bフィルイン中 = false;
358                                 this.dtLastQueueOperation = DateTime.MinValue;
359                                 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;
360                                 this.n現在のトップChip = (CDTXMania.Instance.DTX.listChip.Count > 0) ? 0 : -1;
361                                 n最後に再生した実WAV番号 = new STPadValue<int>();
362                                 this.L最後に再生したHHの実WAV番号 = new List<int>(16);
363                                 this.e最後に再生したHHのチャンネル番号 = 0;
364                                 this.n最後に再生した実WAV番号.GtPick = -1;
365                                 this.n最後に再生した実WAV番号.BsPick = -1;
366                                 for (int i = 0; i < 50; i++)
367                                 {
368                                         this.n最後に再生したBGMの実WAV番号[i] = -1;
369                                 }
370                                 this.r次にくるギターChip = null;
371                                 this.r次にくるベースChip = null;
372                                 for (int j = 0; j < 10; j++)
373                                 {
374                                         this.r現在の空うちドラムChip[j] = null;
375                                 }
376                                 this.r現在の空うちギターChip = null;
377                                 this.r現在の空うちベースChip = null;
378                                 cInvisibleChip = new CInvisibleChip(CDTXMania.Instance.ConfigIni.nChipDisplayTimeMs, CDTXMania.Instance.ConfigIni.nChipFadeoutTimeMs);
379                                 this.n最大コンボ数_TargetGhost = new STDGBSValue<int>();
380
381                                 for (EPart k = EPart.Drums; k <= EPart.Bass; k++)
382                                 {
383                                         this.nヒット数_Auto含まない[k] = new CHitCountOfRank();
384                                         this.nヒット数_Auto含む[k] = new CHitCountOfRank();
385                                         this.nヒット数_TargetGhost[k] = new CHitCountOfRank();
386                                         this.queWailing[k] = new Queue<CChip>();
387                                         this.r現在の歓声Chip[k] = null;
388                                         if (CDTXMania.Instance.DTXVmode.Enabled)
389                                         {
390                                                 CDTXMania.Instance.ConfigIni.nScrollSpeed[k] = CDTXMania.Instance.ConfigIni.nViewerScrollSpeed[k];
391                                         }
392
393                                         this.b演奏にキーボードを使った[k] = false;
394                                         this.b演奏にジョイパッドを使った[k] = false;
395                                         this.b演奏にMIDI入力を使った[k] = false;
396                                         this.b演奏にマウスを使った[k] = false;
397                                 }
398
399                                 cInvisibleChip.Reset();
400                                 actGauge.Init(CDTXMania.Instance.ConfigIni.nRisky);
401                                 // 効果音のストリームをミキサーから解除しておく
402                                 CDTXMania.Instance.Skin.tRemoveMixerAll();
403                                 queueMixerSound = new Queue<STMixer>(64);
404                                 bIsDirectSound = (CDTXMania.Instance.Sound管理.CurrentSoundDeviceType == ESoundDeviceType.DirectSound);
405                                 this.bPAUSE = false;
406
407                                 if (CDTXMania.Instance.DTXVmode.Enabled)
408                                 {
409                                         db再生速度 = CDTXMania.Instance.DTX.dbDTXVPlaySpeed;
410                                         CDTXMania.Instance.ConfigIni.nPlaySpeed.Value = (int)(CDTXMania.Instance.DTX.dbDTXVPlaySpeed * 20 + 0.5);
411                                 }
412                                 else
413                                 {
414                                         db再生速度 = ((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0;
415                                 }
416
417                                 bValidScore = (CDTXMania.Instance.DTXVmode.Enabled || CDTXMania.Instance.DTX2WAVmode.Enabled) ? false : true;
418
419                                 cWailingChip = new CWailingChip共通[3];
420                                 // 0:未使用, 1:Gutiar, 2:Bass
421                                 cWailingChip[1] = new CWailingChip共通();
422                                 cWailingChip[2] = new CWailingChip共通();
423
424                                 #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]
425                                 foreach (CChip pChip in CDTXMania.Instance.DTX.listChip)
426                                 {
427                                         //                              Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 +  ", time=" + pChip.n発声時刻ms );
428                                         if (pChip.n発声時刻ms <= 0)
429                                         {
430                                                 if (pChip.eチャンネル番号 == EChannel.MixerAdd)
431                                                 {
432                                                         pChip.bHit = true;
433                                                         //                                              Trace.TraceInformation( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );
434                                                         if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号))
435                                                         {
436                                                                 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
437                                                                 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)
438                                                                 {
439                                                                         if (wc.rSound[i] != null)
440                                                                         {
441                                                                                 CDTXMania.Instance.Sound管理.AddMixer(wc.rSound[i], db再生速度, pChip.b演奏終了後も再生が続くチップである);
442                                                                                 //AddMixer( wc.rSound[ i ] );           // 最初はqueueを介さず直接ミキサー登録する
443                                                                         }
444                                                                 }
445                                                         }
446                                                 }
447                                         }
448                                         else
449                                         {
450                                                 break;
451                                         }
452                                 }
453                                 #endregion
454
455
456                                 if (CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass)  // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え
457                                 {
458                                         CDTXMania.Instance.DTX.SwapGuitarBassInfos();
459                                 }
460
461
462                                 for (EPart inst = EPart.Drums; inst <= EPart.Bass; ++inst)
463                                 {
464                                         // MODIFY_BEGIN #25398 2011.06.07 FROM
465                                         if (CDTXMania.Instance.bコンパクトモード)
466                                         {
467                                                 var score = new Cスコア();
468                                                 CDTXMania.Instance.Songs管理.tScoreIniを読み込んで譜面情報を設定する(CDTXMania.Instance.strコンパクトモードファイル + ".score.ini", ref score);
469                                                 this.actGraph.dbTarget[inst] = score.譜面情報.最大スキル[inst];
470                                         }
471                                         else
472                                         {
473                                                 if (CDTXMania.Instance.ConfigIni.b楽器有効(inst))
474                                                 {
475                                                         this.actGraph.dbTarget[inst] = CDTXMania.Instance.stage選曲.r確定されたスコア.譜面情報.最大スキル[inst];   // #24074 2011.01.23 add ikanick
476
477                                                         // ゴースト利用可のなとき、0で初期化
478                                                         if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] != ETargetGhostData.None)
479                                                         {
480                                                                 if (CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null)
481                                                                 {
482                                                                         this.actGraph.dbTarget[inst] = 0;
483                                                                 }
484                                                         }
485                                                 }
486                                         }
487                                         // MODIFY_END #25398
488                                 }
489
490                                 for (EPart part = EPart.Drums; part <= EPart.Bass; ++part)
491                                 {
492                                         if (CDTXMania.Instance.ConfigIni.b楽器有効(part))
493                                         {
494                                                 actOptionPanel.Pos[part] = new Coordinates.CXY(CDTXMania.Instance.ConfigIni.cdInstX[part][CDTXMania.Instance.ConfigIni.eActiveInst]
495                                                         - CDTXMania.Instance.Coordinates.ImgOptionPanel.W, 0);
496                                         }
497                                 }
498
499                                 base.On活性化();
500
501                                 // PANELの設定は、base.On活性化()の後に(actPanelの活性化の後)行うこと。
502                                 // さもないと、actPanelが活性化されていないため、パネル文字列の設定が機能しなくなる。
503                                 string strLabel = (CDTXMania.Instance.stage選曲.r確定された曲 == null)?
504                                         null : CDTXMania.Instance.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.Instance.stage選曲.n確定された曲の難易度 ];
505                                 string strPanel = CDTXMania.Instance.DTX.TITLE;
506                                 //string strSETDEFlabel = CDTXMania.Instance.stage選曲.r確定された曲.strタイトル;
507                                 if ( !string.IsNullOrWhiteSpace( strLabel ) && !strPanel.ToLower().Contains(strLabel.ToLower() )
508                                 //      && (strPanel == strSETDEFlabel)
509                                 )
510                                 {
511                                         strPanel += " (" + strLabel + ")";
512                                 }
513                                 this.actPanel.SetPanelString( strPanel );
514
515                                 nLastSendMessageTime = 0;
516
517 #if TEST_MEASUREFRAMEDRAWTIME
518                                 swlist.Clear();
519                                 swlist.Capacity = 100000;
520                                 sw.Reset();
521                                 sw.Start();
522                                 tmlist.Clear();
523                                 tmlist.Capacity = 100000;
524 #endif
525                         }
526                 }
527                 public override void On非活性化()
528                 {
529                         if (b活性化してる)
530                         {
531                                 // #23921 2011.1.4 yyagi
532                                 L最後に再生したHHの実WAV番号.Clear();
533                                 L最後に再生したHHの実WAV番号 = null;
534                                 for (EPart i = 0; i <= EPart.Bass; i++)
535                                 {
536                                         queWailing[i].Clear();
537                                         queWailing[i] = null;
538                                 }
539                                 ctWailingチップ模様アニメ = null;
540                                 ctチップ模様アニメ.Drums = null;
541                                 ctチップ模様アニメ.Guitar = null;
542                                 ctチップ模様アニメ.Bass = null;
543                                 queueMixerSound.Clear();
544                                 queueMixerSound = null;
545                                 cInvisibleChip.Dispose();
546                                 cInvisibleChip = null;
547                                 base.On非活性化();
548
549 #if TEST_MEASUREFRAMEDRAWTIME
550                                 sw.Stop();
551                                 Trace.TraceInformation("Freq={0:F10}", Stopwatch.Frequency);
552                                 Trace.TraceInformation("IsHighResolution=" + Stopwatch.IsHighResolution);
553                                 Trace.TraceInformation("Count=" + swlist.Count );
554                                 double last_d = 0;
555                                 long last_t = 0;
556                                 int p = 0;
557                                 foreach (long l in swlist)
558                                 {
559                                         double d = (double)l / Stopwatch.Frequency;
560                                         double d2 = d - last_d;
561                                         long t = tmlist[p++];
562                                         long t2 = t - last_t;
563                                         Trace.TraceInformation("{0:F10}, {1:F10}, {2:d6}, {3:d3}", d, d2, t, t2);
564                                         last_d = d;
565                                         last_t = t;
566                                 }
567                                 swlist.Clear();
568 #endif
569                         }
570                 }
571                 public override void OnManagedリソースの作成()
572                 {
573                         if (b活性化してる)
574                         {
575                                 txチップ = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums chips.png"));
576                                 txチップGB = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayGuitar chips.png"));
577                                 txヒットバー = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums hit-bar.png"));
578                                 txヒットバーGB = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlayDrums hit-bar guitar.png"));
579                                 txWailing枠 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenPlay wailing cursor.png"));
580                                 t背景テクスチャの生成();
581                                 base.OnManagedリソースの作成();
582                         }
583
584                 }
585                 public override void OnManagedリソースの解放()
586                 {
587                         if (b活性化してる)
588                         {
589                                 TextureFactory.tテクスチャの解放(ref this.tx背景);
590                                 TextureFactory.tテクスチャの解放(ref this.txWailing枠);
591                                 TextureFactory.tテクスチャの解放(ref this.txヒットバーGB);
592                                 TextureFactory.tテクスチャの解放(ref this.txヒットバー);
593                                 TextureFactory.tテクスチャの解放(ref this.txチップGB);
594                                 TextureFactory.tテクスチャの解放(ref this.txチップ);
595                                 base.OnManagedリソースの解放();
596                         }
597                 }
598                 public override int On進行描画()
599                 {
600                         if (b活性化してる)
601                         {
602                                 bool bIsFinishedPlaying = false;
603                                 bool bIsFinishedFadeout = false;
604
605                                 if (b初めての進行描画)
606                                 {
607                                         PrepareAVITexture();
608
609                                         CSound管理.rc演奏用タイマ.tリセット();
610                                         CDTXMania.Instance.Timer.tリセット();
611                                         if (CDTXMania.Instance.ConfigIni.bDrums有効)
612                                         {
613                                                 ctチップ模様アニメ.Drums = new CCounter(0, 48, 10, CDTXMania.Instance.Timer);
614                                         }
615                                         if (CDTXMania.Instance.ConfigIni.bGuitar有効)
616                                         {
617                                                 ctチップ模様アニメ.Guitar = new CCounter(0, 48, 20, CDTXMania.Instance.Timer);
618                                                 ctチップ模様アニメ.Bass = new CCounter(0, 48, 20, CDTXMania.Instance.Timer);
619                                                 ctWailingチップ模様アニメ = new CCounter(0, 4, 50, CDTXMania.Instance.Timer);
620                                         }
621
622                                         // this.actChipFireD.Start( Eレーン.HH );    // #31554 2013.6.12 yyagi
623                                         // 初チップヒット時のもたつき回避。最初にactChipFireD.Start()するときにJITが掛かって?
624                                         // ものすごく待たされる(2回目以降と比べると2,3桁tick違う)。そこで最初の画面フェードインの間に
625                                         // 一発Start()を掛けてJITの結果を生成させておく。
626
627                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
628                                         actFI.tフェードイン開始();
629
630                                         if (CDTXMania.Instance.DTXVmode.Enabled)
631                                         {
632                                                 #region [ DTXV用の再生設定にする(全AUTOなど) ]
633                                                 tDTXV用の設定();
634                                                 #endregion
635                                                 t演奏位置の変更(CDTXMania.Instance.DTXVmode.nStartBar);
636                                         }
637
638                                         CDTXMania.Instance.Sound管理.tDisableUpdateBufferAutomatically();
639                                         b初めての進行描画 = false;
640                                 }
641
642                                 #region [ stage failed ]
643                                 if (CDTXMania.Instance.ConfigIni.bStageFailed && (base.eフェーズID == CStage.Eフェーズ.共通_通常状態))
644                                 {
645                                         if (actGauge.IsFailed)
646                                         {
647                                                 actStageFailed.Start();
648                                                 CDTXMania.Instance.DTX.t全チップの再生停止();
649                                                 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED;
650                                         }
651                                 }
652                                 #endregion
653
654                                 // Background
655                                 if (CDTXMania.Instance.ConfigIni.eDark == EDark.Off)
656                                 {
657                                         if (tx背景 != null)
658                                         {
659                                                 tx背景.t2D描画(CDTXMania.Instance.Device, 0, 0);
660                                         }
661                                 }
662
663                                 if (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED &&
664                                         base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)
665                                 {
666                                         // AVI / BGA
667                                         //actAVI.t進行描画(
668                                         //      CDTXMania.Instance.ConfigIni.cdAVIX[CDTXMania.Instance.ConfigIni.eActiveInst],
669                                         //      CDTXMania.Instance.ConfigIni.cdAVIY[CDTXMania.Instance.ConfigIni.eActiveInst],
670                                         //      CDTXMania.Instance.Coordinates.Movie.W,
671                                         //      CDTXMania.Instance.Coordinates.Movie.H);
672                                         actAVI.t進行描画();
673                                         actBGA.On進行描画();
674                                         #region [MIDIBGM 処理?]
675                                         if (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED)
676                                         {
677                                                 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;
678                                         }
679                                         #endregion
680                     if (!CDTXMania.Instance.DTX2WAVmode.Enabled)
681                     {
682                         actLane.On進行描画();
683                         actLaneFlushGB.On進行描画();
684                         actPanel.On進行描画();
685                         actScore.On進行描画();
686                         actOptionPanel.On進行描画();
687                         actGauge.On進行描画();
688                         actGraph.On進行描画();
689                         actLaneFlushD.On進行描画();
690                                                 if (CDTXMania.Instance.ConfigIni.bStageFailed)  // #38693 2018.10.30 yyagi red-flashing only when StageFailed=ON
691                                                 {
692                                                         actDANGER.t進行描画(actGauge.IsDanger);
693                                                 }
694                     }
695                     act譜面スクロール速度.On進行描画();
696                                         t進行描画_判定ライン();
697                                         actWailingBonus.On進行描画();
698
699                                         // RGB, Judge, Combo (Priority Under Chip)
700                                         if (CDTXMania.Instance.ConfigIni.eJudgePriority == EJudgeDisplayPriority.Under)
701                                         {
702                                                 actRGB.On進行描画();
703                                                 actJudgeString.On進行描画();
704                                                 actCombo.On進行描画();
705                                         }
706                                         t進行描画_チップアニメ();
707                                         bIsFinishedPlaying = t進行描画_チップ();
708                                         actPad.On進行描画();
709
710                                         // RGB, Judge, Combo (Priority Over Chip)
711                                         if (CDTXMania.Instance.ConfigIni.eJudgePriority == EJudgeDisplayPriority.Over)
712                                         {
713                                                 actRGB.On進行描画();
714                                                 actJudgeString.On進行描画();
715                                                 actCombo.On進行描画();
716                                         }
717                     if (!CDTXMania.Instance.DTX2WAVmode.Enabled)
718                     {
719                         actChipFireD.On進行描画();
720                         actChipFireGB.On進行描画();
721                         actPlayInfo.On進行描画();
722                     }
723
724                                         // Wailing
725                                         if ((CDTXMania.Instance.ConfigIni.eDark != EDark.Full) &&
726                                                 CDTXMania.Instance.ConfigIni.bGuitar有効)
727                                         {
728                                                 int GtWailingFrameX = CDTXMania.Instance.ConfigIni.GetLaneX(ELane.GtW) +
729                                                         (CDTXMania.Instance.ConfigIni.GetLaneW(ELane.GtW) - CDTXMania.Instance.Coordinates.ImgGtWailingFrame.W) / 2;
730                                                 int BsWailingFrameX = CDTXMania.Instance.ConfigIni.GetLaneX(ELane.BsW) +
731                                                         (CDTXMania.Instance.ConfigIni.GetLaneW(ELane.BsW) - CDTXMania.Instance.Coordinates.ImgGtWailingFrame.W) / 2;
732                                                 int GtWailingFrameY = C演奏判定ライン座標共通.n判定ラインY座標(EPart.Guitar, true, true);
733                                                 int BsWailingFrameY = C演奏判定ライン座標共通.n判定ラインY座標(EPart.Bass, true, true);
734
735                                                 if (txWailing枠 != null)
736                                                 {
737                                                         if (CDTXMania.Instance.DTX.bチップがある.Guitar)
738                                                         {
739                                                                 txWailing枠.t2D描画(CDTXMania.Instance.Device, GtWailingFrameX, GtWailingFrameY);
740                                                         }
741                                                         if (CDTXMania.Instance.DTX.bチップがある.Bass)
742                                                         {
743                                                                 txWailing枠.t2D描画(CDTXMania.Instance.Device, BsWailingFrameX, BsWailingFrameY);
744                                                         }
745                                                 }
746                                         }
747                                 }
748
749                                 // Stage Failed
750                                 if (((base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED) ||
751                                         (base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)) &&
752                                         ((actStageFailed.On進行描画() != 0) &&
753                                         (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト)))
754                                 {
755                                         eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;
756                                         base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;
757                                         actFO.tフェードアウト開始();
758                                 }
759
760                                 bIsFinishedFadeout = this.t進行描画_フェードイン_アウト();
761                                 if (bIsFinishedPlaying && (base.eフェーズID == CStage.Eフェーズ.共通_通常状態))
762                                 {
763                                         if (CDTXMania.Instance.DTXVmode.Enabled)
764                                         {
765                                                 if (CDTXMania.Instance.Timer.b停止していない)
766                                                 {
767                                                         actPanel.Stop();
768                                                         CDTXMania.Instance.Timer.t一時停止();
769                                                 }
770                                                 Thread.Sleep(5);
771                                                 // DTXCからの次のメッセージを待ち続ける
772                                         }
773                     else if (CDTXMania.Instance.DTX2WAVmode.Enabled)
774                     {
775                                                 // すべての再生が終わるのを待って、録音を終了し、アプリを終了する
776                                                 bool bPlaying = true;
777                                                 while (bPlaying)
778                                                 {
779                                                         bPlaying = CDTXMania.Instance.DTX.tWavのいずれかが再生中();
780                                                         if (bPlaying)
781                                                         {
782                                                                 Thread.Sleep(5);
783                                                         }
784                                                 }
785
786                                                 FDK.CSound管理.t録音終了();
787
788                                                 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
789                                                 base.eフェーズID = CStage.Eフェーズ.共通_終了状態;
790                                                 return (int)this.eフェードアウト完了時の戻り値;
791                                         }
792                                         else
793                                         {
794                                                 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;
795                                                 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;
796                                                 this.actFOClear.tフェードアウト開始();
797                                                 t演奏結果を格納する_ドラム();
798                                                 t演奏結果を格納する_ギター();
799                                                 t演奏結果を格納する_ベース();
800
801                                                 if (CDTXMania.Instance.ConfigIni.bDrums有効)
802                                                 {
803                                                         for (EPad pad = EPad.DrumsPadMin; pad < EPad.DrumsPadMax; pad++)
804                                                         {
805                                                                 r空打ちドラムチップ[pad] = r空うちChip(EPart.Drums, pad);
806                                                                 if (r空打ちドラムチップ[pad] == null)
807                                                                 {
808                                                                         r空打ちドラムチップ[pad] = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(
809                                                                                         CSound管理.rc演奏用タイマ.n現在時刻,
810                                                                                         EnumConverter.ChannelFromPad(pad),
811                                                                                         CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums);
812                                                                 }
813                                                         }
814                                                 }
815
816                                                 if (CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass)      // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
817                                                 {
818                                                         CScoreIni.C演奏記録 t;
819                                                         t = record.Guitar;
820                                                         record.Guitar = record.Bass;
821                                                         record.Bass = t;
822
823                                                         // 譜面情報も元に戻す
824                                                         // #35417 2015.08.30 changed フラグにアクセスしている箇所が見つかったため有効化
825                                                         // #35417 2015.8.18 yyagi: AUTO系のフラグ入れ替えは削除可能!?。以後AUTOフラグに全くアクセスしておらず、意味がないため。
826                                                         // (直下でb全AUTOである にアクセスしているが、既に計算済みのクラスへのアクセスであり、ここでの交換対象ではない)
827                                                         CDTXMania.Instance.DTX.SwapGuitarBassInfos();
828                                                         // #24415 2011.2.27 yyagi
829                                                         // リザルト集計時のみ、Auto系のフラグも元に戻す。
830                                                         // これを戻すのは、リザルト集計後。
831                                                         // "case CStage.Eステージ.結果:"のところ。
832                                                         CDTXMania.Instance.ConfigIni.SwapGuitarBassInfos_AutoFlags();
833                                                 }
834                                         }
835                                 }
836                                 if (this.eフェードアウト完了時の戻り値 == E演奏画面の戻り値.再読込_再演奏)
837                                 {
838                                         bIsFinishedFadeout = true;
839                                 }
840                                 if (bIsFinishedFadeout)
841                                 {
842                                         return (int)this.eフェードアウト完了時の戻り値;
843                                 }
844
845                                 // DTX2WAVに進捗状況を送信。1秒ごとに1回ずつ送信する。
846                                 if (CDTXMania.Instance.DTX2WAVmode.Enabled)
847                                 {
848                                         if (nLastSendMessageTime + 1000 < CDTXMania.Instance.Timer.n現在時刻)
849                                         {
850                                                 int nEstimateTimeMs = (CDTXMania.Instance.DTX.listChip.Count > 0) ? CDTXMania.Instance.DTX.listChip[CDTXMania.Instance.DTX.listChip.Count - 1].n発声時刻ms : 0;
851                                                 CDTXMania.Instance.DTX2WAVmode.SendMessage2DTX2WAV("TIME," + CDTXMania.Instance.Timer.n現在時刻.ToString() + "," + nEstimateTimeMs.ToString());
852                                                 nLastSendMessageTime = CDTXMania.Instance.Timer.n現在時刻;
853                                         }
854                                 }
855
856                                 ManageMixerQueue();
857
858                                 // キー入力
859
860                                 if (CDTXMania.Instance.act現在入力を占有中のプラグイン == null)
861                                 {
862                                         this.tキー入力();
863                                 }
864
865 #if TEST_MEASUREFRAMEDRAWTIME
866                                 swlist.Add(sw.ElapsedTicks);
867                                 tmlist.Add(CSound管理.rc演奏用タイマ.n現在時刻ms);
868 #endif
869                         }
870                         return 0;
871                 }
872
873                 // その他
874                 public STPadValue<CChip> GetNoChipDrums()
875                 {
876                         return r空打ちドラムチップ;
877                 }
878                 public STDGBSValue<CScoreIni.C演奏記録> Record
879                 {
880                         get
881                         {
882                                 return record;
883                         }
884                 }
885                 public void AddMixer(CSound cs, bool _b演奏終了後も再生が続くチップである)
886                 {
887                         STMixer stm = new STMixer()
888                         {
889                                 bIsAdd = true,
890                                 csound = cs,
891                                 b演奏終了後も再生が続くチップである = _b演奏終了後も再生が続くチップである
892                         };
893                         queueMixerSound.Enqueue(stm);
894                         //              Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));
895                 }
896                 public void RemoveMixer(CSound cs)
897                 {
898                         STMixer stm = new STMixer()
899                         {
900                                 bIsAdd = false,
901                                 csound = cs,
902                                 b演奏終了後も再生が続くチップである = false
903                         };
904                         queueMixerSound.Enqueue(stm);
905                         //              Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));
906                 }
907                 public void ManageMixerQueue()
908                 {
909                         // もしサウンドの登録/削除が必要なら、実行する
910                         if (queueMixerSound.Count > 0)
911                         {
912                                 //Debug.WriteLine( "☆queueLength=" + queueMixerSound.Count );
913                                 DateTime dtnow = DateTime.Now;
914                                 TimeSpan ts = dtnow - dtLastQueueOperation;
915                                 int nInterval = ( CDTXMania.Instance.ConfigIni.bVSyncWait ) ? 7 : 1;
916                                 int nMaxDequeueCount = ( CDTXMania.Instance.ConfigIni.bVSyncWait ) ? 2 : 1;
917                                 if (ts.Milliseconds > nInterval)
918                                 {
919                                         for (int i = 0; i < nMaxDequeueCount && queueMixerSound.Count > 0; i++)
920                                         {
921                                                 dtLastQueueOperation = dtnow;
922                                                 STMixer stm = queueMixerSound.Dequeue();
923                                                 if (stm.bIsAdd)
924                                                 {
925                                                 //      var task = Task.Run(() =>
926                                                 //      {
927                                                            CDTXMania.Instance.Sound管理.AddMixer(stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである);
928                                                 //      });
929                                                 }
930                                                 else
931                                                 {
932                                                 //      var task = Task.Run(() =>
933                                                 //      {
934                                                                 CDTXMania.Instance.Sound管理.RemoveMixer(stm.csound);
935                                                 //      });
936                                                 }
937                                         }
938                                 }
939                         }
940                 }
941
942                 /// <summary>
943                 /// 演奏開始前に適切なサイズのAVIテクスチャを作成しておくことで、AVI再生開始時のもたつきをなくす
944                 /// </summary>
945                 protected void PrepareAVITexture()
946                 {
947                         if (CDTXMania.Instance.ConfigIni.bAVI)
948                         {
949                                 foreach (CChip pChip in CDTXMania.Instance.DTX.listChip)
950                                 {
951                                         if (pChip.eチャンネル番号 == EChannel.Movie || pChip.eチャンネル番号 == EChannel.MovieFull)
952                                         {
953                                                 // 最初に再生するAVIチップに合わせて、テクスチャを準備しておく
954                                                 if (pChip.rAVI != null)
955                                                 {
956                                                         this.actAVI.PrepareProperSizeTexture((int)pChip.rAVI.avi.nフレーム幅, (int)pChip.rAVI.avi.nフレーム高さ);
957                                                 }
958                                                 break;
959                                         }
960                                 }
961                         }
962                 }
963
964                 protected EJudge e指定時刻からChipのJUDGEを返す(long nTime, CChip pChip, int nInputAdjustTime, bool saveLag = true)
965                 {
966                         if (pChip != null)
967                         {
968                                 // #35411 2015.08.22 chnmr0 modified add check save lag flag for ghost
969                                 int lag = (int)(nTime + nInputAdjustTime - pChip.n発声時刻ms);
970                                 if (saveLag)
971                                 {
972                                         pChip.nLag = lag;
973                                         // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature
974                                         if (pChip.e楽器パート != EPart.Unknown)
975                                         {
976                                                 pChip.extendInfoForGhost = this.actCombo.dgbコンボ数[pChip.e楽器パート].n現在値 > 0 ? true : false;
977                                         }
978                                 }
979                                 // #35411 modify end
980
981                                 int nDeltaTime = Math.Abs(lag);
982                                 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));
983                                 if (nDeltaTime <= CDTXMania.Instance.nPerfect範囲ms)
984                                 {
985                                         return EJudge.Perfect;
986                                 }
987                                 if (nDeltaTime <= CDTXMania.Instance.nGreat範囲ms)
988                                 {
989                                         return EJudge.Great;
990                                 }
991                                 if (nDeltaTime <= CDTXMania.Instance.nGood範囲ms)
992                                 {
993                                         return EJudge.Good;
994                                 }
995                                 if (nDeltaTime <= CDTXMania.Instance.nPoor範囲ms)
996                                 {
997                                         return EJudge.Poor;
998                                 }
999                         }
1000                         return EJudge.Miss;
1001                 }
1002
1003                 protected CChip r空うちChip(EPart part, EPad pad)
1004                 {
1005                         switch (part)
1006                         {
1007                                 case EPart.Drums:
1008                                         switch (pad)
1009                                         {
1010                                                 case EPad.HH:
1011                                                         if (this.r現在の空うちドラムChip.HH != null)
1012                                                         {
1013                                                                 return this.r現在の空うちドラムChip.HH;
1014                                                         }
1015                                                         if (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.HO_HC)
1016                                                         {
1017                                                                 if (CDTXMania.Instance.ConfigIni.eHHGroup == EHHGroup.LC_HH)
1018                                                                 {
1019                                                                         return this.r現在の空うちドラムChip.HHO;
1020                                                                 }
1021                                                                 if (this.r現在の空うちドラムChip.HHO != null)
1022                                                                 {
1023                                                                         return this.r現在の空うちドラムChip.HHO;
1024                                                                 }
1025                                                         }
1026                                                         return this.r現在の空うちドラムChip.LC;
1027
1028                                                 case EPad.SD:
1029                                                         return this.r現在の空うちドラムChip.SD;
1030
1031                                                 case EPad.BD:
1032                                                         return this.r現在の空うちドラムChip.BD;
1033
1034                                                 case EPad.HT:
1035                                                         return this.r現在の空うちドラムChip.HT;
1036
1037                                                 case EPad.LT:
1038                                                         if (this.r現在の空うちドラムChip.LT != null)
1039                                                         {
1040                                                                 return this.r現在の空うちドラムChip.LT;
1041                                                         }
1042                                                         if (CDTXMania.Instance.ConfigIni.eFTGroup == EFTGroup.Group)
1043                                                         {
1044                                                                 return this.r現在の空うちドラムChip.FT;
1045                                                         }
1046                                                         return null;
1047
1048                                                 case EPad.FT:
1049                                                         if (this.r現在の空うちドラムChip.FT != null)
1050                                                         {
1051                                                                 return this.r現在の空うちドラムChip.FT;
1052                                                         }
1053                                                         if (CDTXMania.Instance.ConfigIni.eFTGroup == EFTGroup.Group)
1054                                                         {
1055                                                                 return this.r現在の空うちドラムChip.LT;
1056                                                         }
1057                                                         return null;
1058
1059                                                 case EPad.CY:
1060                                                         if (this.r現在の空うちドラムChip.CY != null)
1061                                                         {
1062                                                                 return this.r現在の空うちドラムChip.CY;
1063                                                         }
1064                                                         if (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group)
1065                                                         {
1066                                                                 return this.r現在の空うちドラムChip.RD;
1067                                                         }
1068                                                         return null;
1069
1070                                                 case EPad.HHO:
1071                                                         if (this.r現在の空うちドラムChip.HHO != null)
1072                                                         {
1073                                                                 return this.r現在の空うちドラムChip.HHO;
1074                                                         }
1075                                                         if (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.HO_HC)
1076                                                         {
1077                                                                 if (CDTXMania.Instance.ConfigIni.eHHGroup == EHHGroup.LC_HH)
1078                                                                 {
1079                                                                         return this.r現在の空うちドラムChip.HH;
1080                                                                 }
1081                                                                 if (this.r現在の空うちドラムChip.HH != null)
1082                                                                 {
1083                                                                         return this.r現在の空うちドラムChip.HH;
1084                                                                 }
1085                                                         }
1086                                                         return this.r現在の空うちドラムChip.LC;
1087
1088                                                 case EPad.RD:
1089                                                         if (this.r現在の空うちドラムChip.RD != null)
1090                                                         {
1091                                                                 return this.r現在の空うちドラムChip.RD;
1092                                                         }
1093                                                         if (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group)
1094                                                         {
1095                                                                 return this.r現在の空うちドラムChip.CY;
1096                                                         }
1097                                                         return null;
1098
1099                                                 case EPad.LC:
1100                                                         if (this.r現在の空うちドラムChip.LC != null)
1101                                                         {
1102                                                                 return this.r現在の空うちドラムChip.LC;
1103                                                         }
1104                                                         if ((CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.HO_HC) && (CDTXMania.Instance.ConfigIni.eHHGroup != EHHGroup.Group))
1105                                                         {
1106                                                                 return null;
1107                                                         }
1108                                                         if (this.r現在の空うちドラムChip.HH != null)
1109                                                         {
1110                                                                 return this.r現在の空うちドラムChip.HH;
1111                                                         }
1112                                                         return this.r現在の空うちドラムChip.HHO;
1113                                         }
1114                                         break;
1115
1116                                 case EPart.Guitar:
1117                                         return this.r現在の空うちギターChip;
1118
1119                                 case EPart.Bass:
1120                                         return this.r現在の空うちベースChip;
1121                         }
1122                         return null;
1123                 }
1124
1125                 protected CChip r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(long nTime, EChannel eChannel, int nInputAdjustTime)
1126                 {
1127                         return r指定時刻に一番近い未ヒットChip(nTime, eChannel, nInputAdjustTime, 0, HitState.DontCare);
1128                 }
1129
1130                 protected void tサウンド再生(CChip rChip, long n再生開始システム時刻ms, EPart part)
1131                 {
1132                         this.tサウンド再生(rChip, n再生開始システム時刻ms, part, CDTXMania.Instance.ConfigIni.nChipVolume);
1133                 }
1134
1135                 protected void tサウンド再生(CChip pChip, long n再生開始システム時刻ms, EPart part, int n音量, bool bモニタ = false, bool b音程をずらして再生 = false)
1136                 {
1137                         // mute sound (auto)
1138                         // 4A: HH
1139                         // 4B: CY
1140                         // 4C: RD
1141                         // 4D: LC
1142                         // 2A: Gt
1143                         // AA: Bs
1144                         //
1145
1146                         if (pChip != null)
1147                         {
1148                                 bool overwrite = false;
1149                                 switch (part)
1150                                 {
1151                                         case EPart.Drums:
1152                                                 #region [ DRUMS ]
1153                                                 {
1154                                                         int index = -1;
1155                                                         if (pChip.bDrums可視チップ_LP_LBD含まない)
1156                                                         {
1157                                                                 index = pChip.nDrumsIndex;
1158                                                         }
1159                                                         else if (pChip.bDrums不可視チップ_LP_LBD含まない)
1160                                                         {
1161                                                                 index = pChip.nDrumsIndexHidden;
1162                                                         }
1163                                                         // mute sound (auto)
1164                                                         // 4A: 84: HH (HO/HC)
1165                                                         // 4B: 85: CY
1166                                                         // 4C: 86: RD
1167                                                         // 4D: 87: LC
1168                                                         // 2A: 88: Gt
1169                                                         // AA: 89: Bs
1170                                                         else if (EChannel.SE24 == pChip.eチャンネル番号)  // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要
1171                                                         {
1172                                                                 index = 0;
1173                                                         }
1174                                                         else if ((EChannel.SE25 <= pChip.eチャンネル番号) && (pChip.eチャンネル番号 <= EChannel.SE27))  // 仮に今だけ追加
1175                                                         {
1176                                                                 pChip.ConvertSE25_26_27toCY_RCY_LCY();
1177                                                                 index = pChip.nDrumsIndex;
1178                                                                 overwrite = true;
1179                                                         }
1180                                                         else
1181                                                         {
1182                                                                 return;
1183                                                         }
1184                                                         EChannel actChannel = EChannel.HiHatClose + index;
1185                                                         ELane nLane = EnumConverter.LaneFromChannel(actChannel);
1186                                                         if ((nLane == ELane.HH) && // 今回演奏するのがHC or HO
1187                                                                         (index == 0 || (index == 7 &&
1188                                                                         this.e最後に再生したHHのチャンネル番号 != EChannel.HiHatOpen &&
1189                                                                         this.e最後に再生したHHのチャンネル番号 != EChannel.HiHatOpen_Hidden))
1190                                                         // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない
1191                                                         )
1192                                                         // #24772 2011.4.4 yyagi
1193                                                         // == HH mute condition == 
1194                                                         //                      current HH              So, the mute logics are:
1195                                                         //                              HC      HO              1) All played HC/HOs should be queueing
1196                                                         // last HH      HC  Yes Yes             2) If you aren't in "both current/last HH are HO", queued HH should be muted.
1197                                                         //                      HO      Yes     No
1198                                                         {
1199                                                                 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。
1200                                                                 for (int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++)      // #23921 2011.1.4 yyagi
1201                                                                 {
1202                                                                         CDTXMania.Instance.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号[i]);    // #23921 yyagi ストック分全て消音する
1203                                                                 }
1204                                                                 this.L最後に再生したHHの実WAV番号.Clear();
1205                                                                 this.e最後に再生したHHのチャンネル番号 = pChip.eチャンネル番号;
1206                                                         }
1207                                                         if (index == 0 || index == 7)
1208                                                         {
1209                                                                 // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく
1210                                                                 // #24772 HC, 不可視HCも消音キューに追加
1211                                                                 if (this.L最後に再生したHHの実WAV番号.Count >= 16)
1212                                                                 {
1213                                                                         // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える
1214                                                                         // (ストックが増えてList<>のrealloc()が発生するのを予防する)
1215                                                                         this.L最後に再生したHHの実WAV番号.RemoveAt(0);
1216                                                                 }
1217                                                                 if (!this.L最後に再生したHHの実WAV番号.Contains(pChip.n整数値_内部番号))
1218                                                                 {
1219                                                                         // チップ音がまだストックされてなければストックする                                                             
1220                                                                         this.L最後に再生したHHの実WAV番号.Add(pChip.n整数値_内部番号);
1221                                                                 }
1222                                                         }
1223                                                         if (overwrite)
1224                                                         {
1225
1226                                                                 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号[EnumConverter.PadFromChannel(actChannel)]);
1227                                                         }
1228                                                         CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, n音量, bモニタ);
1229                                                         this.n最後に再生した実WAV番号[EnumConverter.PadFromLane(nLane)] = pChip.n整数値_内部番号;
1230                                                         // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意
1231                                                         return;
1232                                                 }
1233                                         #endregion
1234                                         case EPart.Guitar:
1235                                                 #region [ GUITAR ]
1236                                                 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号.GtPick);
1237                                                 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, n音量, bモニタ, b音程をずらして再生);
1238                                                 this.n最後に再生した実WAV番号.GtPick = pChip.n整数値_内部番号;
1239                                                 return;
1240                                         #endregion
1241                                         case EPart.Bass:
1242                                                 #region [ BASS ]
1243                                                 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生した実WAV番号.BsPick);
1244                                                 CDTXMania.Instance.DTX.tチップの再生(pChip, n再生開始システム時刻ms, n音量, bモニタ, b音程をずらして再生);
1245                                                 this.n最後に再生した実WAV番号.BsPick = pChip.n整数値_内部番号;
1246                                                 return;
1247                                         #endregion
1248
1249                                         default:
1250                                                 break;
1251                                 }
1252                         }
1253                 }
1254
1255                 protected EJudge tチップのヒット処理(long nHitTime, CChip pChip, bool bCorrectLane = true)
1256                 {
1257                         pChip.bHit = true;
1258                         if (pChip.e楽器パート != EPart.Unknown)
1259                         {
1260                                 cInvisibleChip.StartSemiInvisible(pChip.e楽器パート);
1261                         }
1262                         bool bPChipIsAutoPlay = pChip.bAssignAutoPlayState();// 2011.6.10 yyagi
1263                         EJudge eJudgeResult = EJudge.Auto;
1264
1265                         // ゴースト処理 #35411 2015.08.20 chnmr0
1266                         bool bIsPerfectGhost = CDTXMania.Instance.ConfigIni.eAutoGhost[pChip.e楽器パート] == EAutoGhostData.Perfect ||
1267                                                         CDTXMania.Instance.DTX.listAutoGhostLag[pChip.e楽器パート] == null;
1268                         int nInputAdjustTime = bPChipIsAutoPlay && bIsPerfectGhost ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[pChip.e楽器パート];
1269                         eJudgeResult = (bCorrectLane) ? this.e指定時刻からChipのJUDGEを返す(nHitTime, pChip, nInputAdjustTime) : EJudge.Miss;
1270
1271                         if (pChip.e楽器パート != EPart.Unknown)
1272                         {
1273                                 ELane nLane = ELane.Max;
1274                                 switch (pChip.e楽器パート)
1275                                 {
1276                                         case EPart.Drums:
1277                                                 nLane = EnumConverter.LaneFromChannel(pChip.eチャンネル番号);
1278                                                 break;
1279                                         case EPart.Guitar:
1280                                                 nLane = ELane.GtR;
1281                                                 break;
1282                                         case EPart.Bass:
1283                                                 nLane = ELane.BsR;
1284                                                 break;
1285                                 }
1286                                 this.actJudgeString.Start(nLane, bPChipIsAutoPlay && bIsPerfectGhost ? EJudge.Auto : eJudgeResult, pChip.nLag);
1287                         }
1288
1289                         // ダメージ
1290                         if (!bPChipIsAutoPlay && (pChip.e楽器パート != EPart.Unknown))
1291                         {
1292                                 actGauge.Damage(pChip.e楽器パート, eJudgeResult);
1293                         }
1294
1295                         // インビジブル
1296                         if (eJudgeResult == EJudge.Poor || eJudgeResult == EJudge.Miss || eJudgeResult == EJudge.Bad)
1297                         {
1298                                 cInvisibleChip.ShowChipTemporally(pChip.e楽器パート);
1299                         }
1300
1301                         // コンボ
1302                         if (pChip.e楽器パート != EPart.Unknown)
1303                         {
1304                                 switch (eJudgeResult)
1305                                 {
1306                                         case EJudge.Miss:
1307                                         case EJudge.Bad:
1308                                                 this.nヒット数_Auto含む[pChip.e楽器パート].Miss++;
1309                                                 if (!bPChipIsAutoPlay)
1310                                                 {
1311                                                         this.nヒット数_Auto含まない[pChip.e楽器パート].Miss++;
1312                                                 }
1313                                                 break;
1314                                         default:
1315                                                 // #24068 2011.1.10 ikanick changed (for Gt./Bs.)
1316                                                 // #24167 2011.1.16 yyagi changed  (for Gt./Bs.)
1317                                                 this.nヒット数_Auto含む[pChip.e楽器パート][(int)eJudgeResult]++;
1318                                                 if (!bPChipIsAutoPlay)
1319                                                 {
1320                                                         this.nヒット数_Auto含まない[pChip.e楽器パート][(int)eJudgeResult]++;
1321                                                 }
1322                                                 break;
1323                                 }
1324
1325                                 bool incrementCombo = false;
1326
1327                                 if (pChip.e楽器パート == EPart.Drums)
1328                                 {
1329                                         if (CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Drums) || !bPChipIsAutoPlay)
1330                                         {
1331                                                 // Dr. : 演奏したレーンだけコンボを増やす
1332                                                 incrementCombo = true;
1333                                         }
1334                                 }
1335                                 else if (pChip.e楽器パート == EPart.Guitar || pChip.e楽器パート == EPart.Bass)
1336                                 {
1337                                         incrementCombo = true;
1338                                 }
1339
1340                 if( incrementCombo == true )
1341                 {
1342                     switch (eJudgeResult)
1343                     {
1344                         case EJudge.Perfect:
1345                         case EJudge.Great:
1346                         case EJudge.Good:
1347                             this.actCombo.dgbコンボ数[pChip.e楽器パート].IncrementCombo();
1348                             break;
1349
1350                         default:
1351                             this.actCombo.dgbコンボ数[pChip.e楽器パート].ResetCombo();
1352                             break;
1353                     }
1354                 }
1355                         }
1356
1357                         // スコア
1358                         if ((!bPChipIsAutoPlay && (pChip.e楽器パート != EPart.Unknown)) && (eJudgeResult != EJudge.Miss) && (eJudgeResult != EJudge.Bad))
1359                         {
1360                                 int nCombos = this.actCombo.dgbコンボ数[pChip.e楽器パート].n現在値;
1361                                 long nScoreDelta = 0;
1362                                 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };
1363                                 if ((nCombos <= 500) || (eJudgeResult == EJudge.Good))
1364                                 {
1365                                         nScoreDelta = nComboScoreDelta[(int)eJudgeResult] * nCombos;
1366                                 }
1367                                 else if ((eJudgeResult == EJudge.Perfect) || (eJudgeResult == EJudge.Great))
1368                                 {
1369                                         nScoreDelta = nComboScoreDelta[(int)eJudgeResult] * 500L;
1370                                 }
1371                                 this.actScore.Add(pChip.e楽器パート, nScoreDelta);
1372                         }
1373
1374                         // グラフ
1375                         if (pChip.e楽器パート != EPart.Unknown)
1376                         {
1377                                 EPart inst = pChip.e楽器パート;
1378                                 // #24074 2011.01.23 add ikanick
1379                                 this.actGraph.dbCurrent[inst] =
1380                                                 CScoreIni.t演奏型スキルを計算して返す(
1381                                                 CDTXMania.Instance.DTX.n可視チップ数[inst],
1382                                                 this.nヒット数_Auto含まない[inst].Perfect,
1383                                                 this.nヒット数_Auto含まない[inst].Great,
1384                                                 this.nヒット数_Auto含まない[inst].Good,
1385                                                 this.nヒット数_Auto含まない[inst].Poor,
1386                                                 this.nヒット数_Auto含まない[inst].Miss,
1387                                                 inst, true);
1388
1389                                 // #35411 2015.09.07 add chnmr0
1390                                 if (
1391                                                 CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null &&
1392                                                 CDTXMania.Instance.ConfigIni.eTargetGhost[inst] == ETargetGhostData.Online &&
1393                                                 CDTXMania.Instance.DTX.n可視チップ数[inst] > 0)
1394                                 {
1395                                         // Online Stats の計算式
1396                                         this.actGraph.dbTarget[inst] = 100 *
1397                                                                                                         (this.nヒット数_Auto含まない[inst].Perfect * 17 +
1398                                                                                                          this.nヒット数_Auto含まない[inst].Great * 7 +
1399                                                                                                          this.actCombo.dgbコンボ数[inst].n最高値 * 3) /
1400                                                                                                          (20.0 * CDTXMania.Instance.DTX.n可視チップ数[inst]);
1401                                 }
1402                         }
1403                         return eJudgeResult;
1404                 }
1405
1406                 private void tチップのヒット処理_BadならびにTight時のMiss(EPart part, ELane nLane = ELane.LC)
1407                 {
1408                         cInvisibleChip.StartSemiInvisible(part);
1409                         cInvisibleChip.ShowChipTemporally(part);
1410                         actGauge.Damage(part, EJudge.Miss);
1411                         switch (part)
1412                         {
1413                                 case EPart.Drums:
1414                                         this.actJudgeString.Start(nLane, CDTXMania.Instance.ConfigIni.bAutoPlay[EnumConverter.PadFromLane(nLane)] ?
1415                                                         EJudge.Auto : EJudge.Miss, 999);
1416                                         this.actCombo.dgbコンボ数.Drums.ResetCombo();
1417                                         return;
1418
1419                                 case EPart.Guitar:
1420                                         this.actJudgeString.Start(ELane.GtR, EJudge.Bad, 999);
1421                                         this.actCombo.dgbコンボ数.Guitar.ResetCombo();
1422                                         return;
1423
1424                                 case EPart.Bass:
1425                                         this.actJudgeString.Start(ELane.BsR, EJudge.Bad, 999);
1426                                         this.actCombo.dgbコンボ数.Bass.ResetCombo();
1427                                         break;
1428
1429                                 default:
1430                                         return;
1431                         }
1432                 }
1433
1434                 /// <summary>
1435                 /// 指定時刻に一番近いまだヒットしていないチップを返す。
1436                 /// </summary>
1437                 /// <param name="nTime">指定時刻</param>
1438                 /// <param name="search">検索するチャネル。Gt.WailingSound/Bs.WailingSoundを渡した場合、Open~RGBが検索対象になる。</param>
1439                 /// <param name="nInputAdjustTime"></param>
1440                 /// <param name="n検索範囲時間ms">指定時刻から検索する範囲ms</param>
1441                 /// <returns></returns>
1442                 protected CChip r指定時刻に一番近い未ヒットChip(long nTime, EChannel search, int nInputAdjustTime, int n検索範囲時間ms = 0, HitState hs = HitState.NotHit)
1443                 {
1444                         CChip ret = null;
1445
1446                         nTime += nInputAdjustTime;
1447                         if (this.n現在のトップChip >= 0 && this.n現在のトップChip <= CDTXMania.Instance.DTX.listChip.Count)
1448                         {
1449                                 int idxFuture = -1;
1450                                 int idxPast = -1;
1451                                 int idxPastStart = CDTXMania.Instance.DTX.listChip.Count - 1;
1452                                 Func<CChip, Func<CChip, bool>, bool> Found = (chip, futureOrPast) =>
1453                                 {
1454                                         return futureOrPast(chip) &&
1455                                                         ((hs == HitState.NotHit && !chip.bHit) || (hs == HitState.Hit && chip.bHit) || (hs == HitState.DontCare)) &&
1456                                                         !chip.b空打ちチップである &&
1457                                                         (
1458                                                         ((search == chip.eチャンネル番号 || search + 0x20 == chip.eチャンネル番号) && chip.bDrums可視チップ_LP_LBD含まない) ||
1459                                                         (search == chip.eチャンネル番号 && chip.bGuitar可視チップ_Wailing含む) ||
1460                                                         (search == chip.eチャンネル番号 && chip.bBass可視チップ_Wailing含む) ||
1461                                                         (search == EChannel.Guitar_WailingSound && chip.bGuitar可視チップ) ||
1462                                                         (search == EChannel.Bass_WailingSound && chip.bBass可視チップ)
1463                                                         );
1464                                 };
1465                                 Func<CChip, bool> Future = (chip) => { return chip.n発声時刻ms > nTime; };
1466                                 Func<CChip, bool> Past = (chip) => { return chip.n発声時刻ms <= nTime; };
1467                                 Func<CChip, bool> OutOfRange = (chip) => { return n検索範囲時間ms > 0 && Math.Abs(nTime - chip.n発声時刻ms) > n検索範囲時間ms; };
1468
1469                                 // // 未来方向への検索
1470                                 for (int i = this.n現在のトップChip; i < CDTXMania.Instance.DTX.listChip.Count; ++i)
1471                                 {
1472                                         CChip chip = CDTXMania.Instance.DTX.listChip[i];
1473                                         if (Future(chip) && OutOfRange(chip))
1474                                         {
1475                                                 //break;
1476                                         }
1477                                         if (Found(chip, Future))
1478                                         {
1479                                                 idxFuture = i;
1480                                                 idxPastStart = i;
1481                                                 break;
1482                                         }
1483                                 }
1484
1485                                 // 過去方向への検索
1486                                 for (int i = idxPastStart; i >= 0; i--)
1487                                 {
1488                                         CChip chip = CDTXMania.Instance.DTX.listChip[i];
1489                                         if (Past(chip) && OutOfRange(chip))
1490                                         {
1491                                                 //break;
1492                                         }
1493                                         if (Found(chip, Past))
1494                                         {
1495                                                 idxPast = i;
1496                                                 break;
1497                                         }
1498                                 }
1499
1500                                 if (idxFuture < 0 && idxPast < 0)
1501                                 {
1502                                         // 検索対象が過去未来どちらにも見つからなかった
1503                                 }
1504                                 else if (idxPast >= 0)
1505                                 {
1506                                         // 過去方向には見つかった
1507                                         ret = CDTXMania.Instance.DTX.listChip[idxPast];
1508                                 }
1509                                 else if (idxFuture >= 0)
1510                                 {
1511                                         // 未来方向には見つかった
1512                                         ret = CDTXMania.Instance.DTX.listChip[idxFuture];
1513                                 }
1514                                 else
1515                                 {
1516                                         // どちらにも見つかった
1517                                         long nTimeDiff_Future = Math.Abs(nTime - CDTXMania.Instance.DTX.listChip[idxFuture].n発声時刻ms);
1518                                         long nTimeDiff_Past = Math.Abs(nTime - CDTXMania.Instance.DTX.listChip[idxPast].n発声時刻ms);
1519                                         if (nTimeDiff_Future < nTimeDiff_Past)
1520                                         {
1521                                                 ret = CDTXMania.Instance.DTX.listChip[idxFuture];
1522                                         }
1523                                         else
1524                                         {
1525                                                 ret = CDTXMania.Instance.DTX.listChip[idxPast];
1526                                         }
1527                                 }
1528
1529                                 if (ret != null)
1530                                 {
1531                                         if (OutOfRange(ret))
1532                                         {
1533                                                 // チップは見つかったが、検索範囲時間外だった場合
1534                                                 ret = null;
1535                                         }
1536                                 }
1537                         }
1538                         return ret;
1539                 }
1540
1541                 protected CChip r次に来る指定楽器Chipを更新して返す(EPart inst)
1542                 {
1543                         CChip ret = null;
1544                         int nInputAdjustTime;
1545                         if (inst == EPart.Guitar)
1546                         {
1547                                 nInputAdjustTime = CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick ?
1548                                                 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Guitar;
1549                                 ret = this.r指定時刻に一番近い未ヒットChip(CSound管理.rc演奏用タイマ.n現在時刻, EChannel.Guitar_WailingSound, nInputAdjustTime, 500);
1550                                 this.r次にくるギターChip = ret;
1551                         }
1552                         else if (inst == EPart.Bass)
1553                         {
1554                                 nInputAdjustTime = CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick ?
1555                                                 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Bass;
1556                                 ret = this.r指定時刻に一番近い未ヒットChip(CSound管理.rc演奏用タイマ.n現在時刻, EChannel.Bass_WailingSound, nInputAdjustTime, 500);
1557                                 this.r次にくるベースChip = ret;
1558                         }
1559                         return ret;
1560                 }
1561
1562                 protected void ChangeInputAdjustTimeInPlaying(IInputDevice keyboard, int plusminus)     // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
1563                 {
1564                         EPart part;
1565                         int offset = plusminus;
1566                         if (keyboard.bキーが押されている((int)SlimDXKey.LeftShift) || keyboard.bキーが押されている((int)SlimDXKey.RightShift))  // Guitar InputAdjustTime
1567                         {
1568                                 part = EPart.Guitar;
1569                         }
1570                         else if (keyboard.bキーが押されている((int)SlimDXKey.LeftAlt) || keyboard.bキーが押されている((int)SlimDXKey.RightAlt)) // Bass InputAdjustTime
1571                         {
1572                                 part = EPart.Bass;
1573                         }
1574                         else
1575                         {
1576                                 // Drums InputAdjustTime
1577                                 part = EPart.Drums;
1578                         }
1579                         if (!keyboard.bキーが押されている((int)SlimDXKey.LeftControl) && !keyboard.bキーが押されている((int)SlimDXKey.RightControl))
1580                         {
1581                                 offset *= 10;
1582                         }
1583
1584                         CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[part].Value = CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[part] + offset;
1585                 }
1586
1587                 private void t入力処理_ドラム()
1588                 {
1589                         for (EPad ePad = EPad.DrumsPadMin; ePad < EPad.DrumsPadMax; ePad++)        // #27029 2012.1.4 from: <10 to <=10; Eパッドの要素が1つ(HP)増えたため。
1590                                                                                                                                                                          //               2012.1.5 yyagi: (int)Eパッド.MAX に変更。Eパッドの要素数への依存を無くすため。
1591                         {
1592                                 List<STInputEvent> listInputEvent = CDTXMania.Instance.Pad.GetEvents(ePad);
1593
1594                                 if ((listInputEvent == null) || (listInputEvent.Count == 0))
1595                                 {
1596                                         continue;
1597                                 }
1598
1599                                 this.t入力メソッド記憶(EPart.Drums);
1600
1601                                 #region [ 打ち分けグループ調整 ]
1602                                 //-----------------------------
1603                                 EHHGroup eHHGroup = CDTXMania.Instance.ConfigIni.eHHGroup;
1604                                 EFTGroup eFTGroup = CDTXMania.Instance.ConfigIni.eFTGroup;
1605                                 ECYGroup eCYGroup = CDTXMania.Instance.ConfigIni.eCYGroup;
1606
1607                                 if (!CDTXMania.Instance.DTX.bチップがある.Ride && (eCYGroup == ECYGroup.Off))
1608                                 {
1609                                         eCYGroup = ECYGroup.Group;
1610                                 }
1611                                 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (eHHGroup == EHHGroup.Off))
1612                                 {
1613                                         eHHGroup = EHHGroup.LC_HH;
1614                                 }
1615                                 if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (eHHGroup == EHHGroup.HO_HC))
1616                                 {
1617                                         eHHGroup = EHHGroup.Group;
1618                                 }
1619                                 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (eHHGroup == EHHGroup.Off))
1620                                 {
1621                                         eHHGroup = EHHGroup.HO_HC;
1622                                 }
1623                                 if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (eHHGroup == EHHGroup.LC_HH))
1624                                 {
1625                                         eHHGroup = EHHGroup.Group;
1626                                 }
1627                                 //-----------------------------
1628                                 #endregion
1629
1630                                 foreach (STInputEvent inputEvent in listInputEvent)
1631                                 {
1632                                         if (!inputEvent.b押された)
1633                                                 continue;
1634
1635                                         long nTime = inputEvent.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
1636                                         EPad nPad09 = (ePad == EPad.HP) ? EPad.BD : ePad;      // #27029 2012.1.5 yyagi
1637                                         int nInputAdjustTime = CDTXMania.Instance.ConfigIni.bAutoPlay[nPad09] ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums;
1638                                         bool bHitted = false;
1639
1640                                         #region [ (A) ヒットしていればヒット処理して次の inputEvent へ ]
1641                                         //-----------------------------
1642                                         switch (ePad)
1643                                         {
1644                                                 case EPad.HH:
1645                                                         #region [ HHとLC(groupingしている場合) のヒット処理 ]
1646                                                         //-----------------------------
1647                                                         {
1648                                                                 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HH)
1649                                                                         continue;   // 電子ドラムによる意図的なクロストークを無効にする
1650
1651                                                                 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);    // HiHat Close
1652                                                                 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HiHat Open
1653                                                                 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);    // LC
1654                                                                 EJudge e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : EJudge.Miss;
1655                                                                 EJudge e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : EJudge.Miss;
1656                                                                 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
1657                                                                 switch (eHHGroup)
1658                                                                 {
1659                                                                         case EHHGroup.HO_HC:
1660                                                                                 #region [ HCとLCのヒット処理 ]
1661                                                                                 //-----------------------------
1662                                                                                 if ((e判定HC != EJudge.Miss) && (e判定LC != EJudge.Miss))
1663                                                                                 {
1664                                                                                         if (chipHC.n発声位置 < chipLC.n発声位置)
1665                                                                                         {
1666                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1667                                                                                         }
1668                                                                                         else if (chipHC.n発声位置 > chipLC.n発声位置)
1669                                                                                         {
1670                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1671                                                                                         }
1672                                                                                         else
1673                                                                                         {
1674                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1675                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1676                                                                                         }
1677                                                                                         bHitted = true;
1678                                                                                 }
1679                                                                                 else if (e判定HC != EJudge.Miss)
1680                                                                                 {
1681                                                                                         this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1682                                                                                         bHitted = true;
1683                                                                                 }
1684                                                                                 else if (e判定LC != EJudge.Miss)
1685                                                                                 {
1686                                                                                         this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1687                                                                                         bHitted = true;
1688                                                                                 }
1689                                                                                 if (!bHitted)
1690                                                                                         break;
1691                                                                                 continue;
1692                                                                         //-----------------------------
1693                                                                         #endregion
1694
1695                                                                         case EHHGroup.LC_HH:
1696                                                                                 #region [ HCとHOのヒット処理 ]
1697                                                                                 //-----------------------------
1698                                                                                 if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
1699                                                                                 {
1700                                                                                         if (chipHC.n発声位置 < chipHO.n発声位置)
1701                                                                                         {
1702                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1703                                                                                         }
1704                                                                                         else if (chipHC.n発声位置 > chipHO.n発声位置)
1705                                                                                         {
1706                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1707                                                                                         }
1708                                                                                         else
1709                                                                                         {
1710                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1711                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1712                                                                                         }
1713                                                                                         bHitted = true;
1714                                                                                 }
1715                                                                                 else if (e判定HC != EJudge.Miss)
1716                                                                                 {
1717                                                                                         this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1718                                                                                         bHitted = true;
1719                                                                                 }
1720                                                                                 else if (e判定HO != EJudge.Miss)
1721                                                                                 {
1722                                                                                         this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1723                                                                                         bHitted = true;
1724                                                                                 }
1725                                                                                 if (!bHitted)
1726                                                                                         break;
1727                                                                                 continue;
1728                                                                         //-----------------------------
1729                                                                         #endregion
1730
1731                                                                         case EHHGroup.Group:
1732                                                                                 #region [ HC,HO,LCのヒット処理 ]
1733                                                                                 //-----------------------------
1734                                                                                 if (((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss)) && (e判定LC != EJudge.Miss))
1735                                                                                 {
1736                                                                                         CChip chip;
1737                                                                                         CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC };
1738                                                                                         // ここから、chipArrayをn発生位置の小さい順に並び替える
1739                                                                                         if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
1740                                                                                         {
1741                                                                                                 chip = chipArray[1];
1742                                                                                                 chipArray[1] = chipArray[2];
1743                                                                                                 chipArray[2] = chip;
1744                                                                                         }
1745                                                                                         if (chipArray[0].n発声位置 > chipArray[1].n発声位置)
1746                                                                                         {
1747                                                                                                 chip = chipArray[0];
1748                                                                                                 chipArray[0] = chipArray[1];
1749                                                                                                 chipArray[1] = chip;
1750                                                                                         }
1751                                                                                         if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
1752                                                                                         {
1753                                                                                                 chip = chipArray[1];
1754                                                                                                 chipArray[1] = chipArray[2];
1755                                                                                                 chipArray[2] = chip;
1756                                                                                         }
1757                                                                                         this.tドラムヒット処理(nTime, EPad.HH, chipArray[0], inputEvent.nVelocity);
1758                                                                                         if (chipArray[0].n発声位置 == chipArray[1].n発声位置)
1759                                                                                         {
1760                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipArray[1], inputEvent.nVelocity);
1761                                                                                         }
1762                                                                                         if (chipArray[0].n発声位置 == chipArray[2].n発声位置)
1763                                                                                         {
1764                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipArray[2], inputEvent.nVelocity);
1765                                                                                         }
1766                                                                                         bHitted = true;
1767                                                                                 }
1768                                                                                 else if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
1769                                                                                 {
1770                                                                                         if (chipHC.n発声位置 < chipHO.n発声位置)
1771                                                                                         {
1772                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1773                                                                                         }
1774                                                                                         else if (chipHC.n発声位置 > chipHO.n発声位置)
1775                                                                                         {
1776                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1777                                                                                         }
1778                                                                                         else
1779                                                                                         {
1780                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1781                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1782                                                                                         }
1783                                                                                         bHitted = true;
1784                                                                                 }
1785                                                                                 else if ((e判定HC != EJudge.Miss) && (e判定LC != EJudge.Miss))
1786                                                                                 {
1787                                                                                         if (chipHC.n発声位置 < chipLC.n発声位置)
1788                                                                                         {
1789                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1790                                                                                         }
1791                                                                                         else if (chipHC.n発声位置 > chipLC.n発声位置)
1792                                                                                         {
1793                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1794                                                                                         }
1795                                                                                         else
1796                                                                                         {
1797                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1798                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1799                                                                                         }
1800                                                                                         bHitted = true;
1801                                                                                 }
1802                                                                                 else if ((e判定HO != EJudge.Miss) && (e判定LC != EJudge.Miss))
1803                                                                                 {
1804                                                                                         if (chipHO.n発声位置 < chipLC.n発声位置)
1805                                                                                         {
1806                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1807                                                                                         }
1808                                                                                         else if (chipHO.n発声位置 > chipLC.n発声位置)
1809                                                                                         {
1810                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1811                                                                                         }
1812                                                                                         else
1813                                                                                         {
1814                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1815                                                                                                 this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1816                                                                                         }
1817                                                                                         bHitted = true;
1818                                                                                 }
1819                                                                                 else if (e判定HC != EJudge.Miss)
1820                                                                                 {
1821                                                                                         this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1822                                                                                         bHitted = true;
1823                                                                                 }
1824                                                                                 else if (e判定HO != EJudge.Miss)
1825                                                                                 {
1826                                                                                         this.tドラムヒット処理(nTime, EPad.HH, chipHO, inputEvent.nVelocity);
1827                                                                                         bHitted = true;
1828                                                                                 }
1829                                                                                 else if (e判定LC != EJudge.Miss)
1830                                                                                 {
1831                                                                                         this.tドラムヒット処理(nTime, EPad.HH, chipLC, inputEvent.nVelocity);
1832                                                                                         bHitted = true;
1833                                                                                 }
1834                                                                                 if (!bHitted)
1835                                                                                         break;
1836                                                                                 continue;
1837                                                                         //-----------------------------
1838                                                                         #endregion
1839
1840                                                                         default:
1841                                                                                 #region [ 全部打ち分け時のヒット処理 ]
1842                                                                                 //-----------------------------
1843                                                                                 if (e判定HC != EJudge.Miss)
1844                                                                                 {
1845                                                                                         this.tドラムヒット処理(nTime, EPad.HH, chipHC, inputEvent.nVelocity);
1846                                                                                         bHitted = true;
1847                                                                                 }
1848                                                                                 if (!bHitted)
1849                                                                                         break;
1850                                                                                 continue;
1851                                                                                 //-----------------------------
1852                                                                                 #endregion
1853                                                                 }
1854                                                                 if (!bHitted)
1855                                                                         break;
1856                                                                 continue;
1857                                                         }
1858                                                 //-----------------------------
1859                                                 #endregion
1860
1861                                                 case EPad.SD:
1862                                                         #region [ SDのヒット処理 ]
1863                                                         //-----------------------------
1864                                                         if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.SD)   // #23857 2010.12.12 yyagi: to support VelocityMin
1865                                                                 continue;   // 電子ドラムによる意図的なクロストークを無効にする
1866                                                         if (!this.tドラムヒット処理(nTime, EPad.SD, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Snare, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
1867                                                                 break;
1868                                                         continue;
1869                                                 //-----------------------------
1870                                                 #endregion
1871
1872                                                 case EPad.BD:
1873                                                         #region [ BDのヒット処理 ]
1874                                                         //-----------------------------
1875                                                         if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.BD)   // #23857 2010.12.12 yyagi: to support VelocityMin
1876                                                                 continue;   // 電子ドラムによる意図的なクロストークを無効にする
1877                                                         if (!this.tドラムヒット処理(nTime, EPad.BD, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.BassDrum, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
1878                                                                 break;
1879                                                         continue;
1880                                                 //-----------------------------
1881                                                 #endregion
1882
1883                                                 case EPad.HT:
1884                                                         #region [ HTのヒット処理 ]
1885                                                         //-----------------------------
1886                                                         if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HT)   // #23857 2010.12.12 yyagi: to support VelocityMin
1887                                                                 continue;   // 電子ドラムによる意図的なクロストークを無効にする
1888                                                         if (this.tドラムヒット処理(nTime, EPad.HT, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HighTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
1889                                                                 continue;
1890                                                         break;
1891                                                 //-----------------------------
1892                                                 #endregion
1893
1894                                                 case EPad.LT:
1895                                                         #region [ LTとFT(groupingしている場合)のヒット処理 ]
1896                                                         //-----------------------------
1897                                                         {
1898                                                                 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.LT)   // #23857 2010.12.12 yyagi: to support VelocityMin
1899                                                                         continue;   // 電子ドラムによる意図的なクロストークを無効にする
1900                                                                 CChip chipLT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LowTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
1901                                                                 CChip chipFT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.FloorTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
1902                                                                 EJudge e判定LT = (chipLT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLT, nInputAdjustTime) : EJudge.Miss;
1903                                                                 EJudge e判定FT = (chipFT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipFT, nInputAdjustTime) : EJudge.Miss;
1904                                                                 switch (eFTGroup)
1905                                                                 {
1906                                                                         case EFTGroup.Off:
1907                                                                                 #region [ LTのヒット処理 ]
1908                                                                                 //-----------------------------
1909                                                                                 if (e判定LT != EJudge.Miss)
1910                                                                                 {
1911                                                                                         this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
1912                                                                                         bHitted = true;
1913                                                                                 }
1914                                                                                 break;
1915                                                                         //-----------------------------
1916                                                                         #endregion
1917
1918                                                                         case EFTGroup.Group:
1919                                                                                 #region [ LTとFTのヒット処理 ]
1920                                                                                 //-----------------------------
1921                                                                                 if ((e判定LT != EJudge.Miss) && (e判定FT != EJudge.Miss))
1922                                                                                 {
1923                                                                                         if (chipLT.n発声位置 < chipFT.n発声位置)
1924                                                                                         {
1925                                                                                                 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
1926                                                                                         }
1927                                                                                         else if (chipLT.n発声位置 > chipFT.n発声位置)
1928                                                                                         {
1929                                                                                                 this.tドラムヒット処理(nTime, EPad.LT, chipFT, inputEvent.nVelocity);
1930                                                                                         }
1931                                                                                         else
1932                                                                                         {
1933                                                                                                 this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
1934                                                                                                 this.tドラムヒット処理(nTime, EPad.LT, chipFT, inputEvent.nVelocity);
1935                                                                                         }
1936                                                                                         bHitted = true;
1937                                                                                 }
1938                                                                                 else if (e判定LT != EJudge.Miss)
1939                                                                                 {
1940                                                                                         this.tドラムヒット処理(nTime, EPad.LT, chipLT, inputEvent.nVelocity);
1941                                                                                         bHitted = true;
1942                                                                                 }
1943                                                                                 else if (e判定FT != EJudge.Miss)
1944                                                                                 {
1945                                                                                         this.tドラムヒット処理(nTime, EPad.LT, chipFT, inputEvent.nVelocity);
1946                                                                                         bHitted = true;
1947                                                                                 }
1948                                                                                 break;
1949                                                                                 //-----------------------------
1950                                                                                 #endregion
1951                                                                 }
1952                                                                 if (!bHitted)
1953                                                                         break;
1954                                                                 continue;
1955                                                         }
1956                                                 //-----------------------------
1957                                                 #endregion
1958
1959                                                 case EPad.FT:
1960                                                         #region [ FTとLT(groupingしている場合)のヒット処理 ]
1961                                                         //-----------------------------
1962                                                         {
1963                                                                 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.FT)   // #23857 2010.12.12 yyagi: to support VelocityMin
1964                                                                         continue;   // 電子ドラムによる意図的なクロストークを無効にする
1965                                                                 CChip chipLT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LowTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
1966                                                                 CChip chipFT = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.FloorTom, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
1967                                                                 EJudge e判定LT = (chipLT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLT, nInputAdjustTime) : EJudge.Miss;
1968                                                                 EJudge e判定FT = (chipFT != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipFT, nInputAdjustTime) : EJudge.Miss;
1969                                                                 switch (eFTGroup)
1970                                                                 {
1971                                                                         case EFTGroup.Off:
1972                                                                                 #region [ FTのヒット処理 ]
1973                                                                                 //-----------------------------
1974                                                                                 if (e判定FT != EJudge.Miss)
1975                                                                                 {
1976                                                                                         this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
1977                                                                                         bHitted = true;
1978                                                                                 }
1979                                                                                 //-----------------------------
1980                                                                                 #endregion
1981                                                                                 break;
1982
1983                                                                         case EFTGroup.Group:
1984                                                                                 #region [ FTとLTのヒット処理 ]
1985                                                                                 //-----------------------------
1986                                                                                 if ((e判定LT != EJudge.Miss) && (e判定FT != EJudge.Miss))
1987                                                                                 {
1988                                                                                         if (chipLT.n発声位置 < chipFT.n発声位置)
1989                                                                                         {
1990                                                                                                 this.tドラムヒット処理(nTime, EPad.FT, chipLT, inputEvent.nVelocity);
1991                                                                                         }
1992                                                                                         else if (chipLT.n発声位置 > chipFT.n発声位置)
1993                                                                                         {
1994                                                                                                 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
1995                                                                                         }
1996                                                                                         else
1997                                                                                         {
1998                                                                                                 this.tドラムヒット処理(nTime, EPad.FT, chipLT, inputEvent.nVelocity);
1999                                                                                                 this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
2000                                                                                         }
2001                                                                                         bHitted = true;
2002                                                                                 }
2003                                                                                 else if (e判定LT != EJudge.Miss)
2004                                                                                 {
2005                                                                                         this.tドラムヒット処理(nTime, EPad.FT, chipLT, inputEvent.nVelocity);
2006                                                                                         bHitted = true;
2007                                                                                 }
2008                                                                                 else if (e判定FT != EJudge.Miss)
2009                                                                                 {
2010                                                                                         this.tドラムヒット処理(nTime, EPad.FT, chipFT, inputEvent.nVelocity);
2011                                                                                         bHitted = true;
2012                                                                                 }
2013                                                                                 //-----------------------------
2014                                                                                 #endregion
2015                                                                                 break;
2016                                                                 }
2017                                                                 if (!bHitted)
2018                                                                         break;
2019                                                                 continue;
2020                                                         }
2021                                                 //-----------------------------
2022                                                 #endregion
2023
2024                                                 case EPad.CY:
2025                                                         #region [ CY(とLCとRD:groupingしている場合)のヒット処理 ]
2026                                                         //-----------------------------
2027                                                         {
2028                                                                 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.CY)   // #23857 2010.12.12 yyagi: to support VelocityMin
2029                                                                         continue;   // 電子ドラムによる意図的なクロストークを無効にする
2030                                                                 CChip chipCY = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2031                                                                 CChip chipRD = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2032                                                                 CChip chipLC = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
2033                                                                 EJudge e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : EJudge.Miss;
2034                                                                 EJudge e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : EJudge.Miss;
2035                                                                 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
2036                                                                 CChip[] chipArray = new CChip[] { chipCY, chipRD, chipLC };
2037                                                                 EJudge[] e判定Array = new EJudge[] { e判定CY, e判定RD, e判定LC };
2038                                                                 const int NumOfChips = 3;   // chipArray.GetLength(0)
2039
2040                                                                 // CY/RD/LC群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
2041                                                                 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
2042                                                                 switch (eCYGroup)
2043                                                                 {
2044                                                                         case ECYGroup.Off:
2045                                                                                 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2046                                                                                 {
2047                                                                                         if (e判定CY != EJudge.Miss)
2048                                                                                         {
2049                                                                                                 this.tドラムヒット処理(nTime, EPad.CY, chipCY, inputEvent.nVelocity);
2050                                                                                                 bHitted = true;
2051                                                                                         }
2052                                                                                         if (!bHitted)
2053                                                                                                 break;
2054                                                                                         continue;
2055                                                                                 }
2056                                                                                 for (int i = 0; i < NumOfChips; i++)
2057                                                                                 {
2058                                                                                         if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipLC)))
2059                                                                                         {
2060                                                                                                 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2061                                                                                                 bHitted = true;
2062                                                                                                 break;
2063                                                                                         }
2064                                                                                         //num10++;
2065                                                                                 }
2066                                                                                 if (e判定CY != EJudge.Miss)
2067                                                                                 {
2068                                                                                         this.tドラムヒット処理(nTime, EPad.CY, chipCY, inputEvent.nVelocity);
2069                                                                                         bHitted = true;
2070                                                                                 }
2071                                                                                 if (!bHitted)
2072                                                                                         break;
2073                                                                                 continue;
2074
2075                                                                         case ECYGroup.Group:
2076                                                                                 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2077                                                                                 {
2078                                                                                         for (int i = 0; i < NumOfChips; i++)
2079                                                                                         {
2080                                                                                                 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipRD)))
2081                                                                                                 {
2082                                                                                                         this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2083                                                                                                         bHitted = true;
2084                                                                                                         break;
2085                                                                                                 }
2086                                                                                         }
2087                                                                                         if (!bHitted)
2088                                                                                                 break;
2089                                                                                         continue;
2090                                                                                 }
2091                                                                                 for (int i = 0; i < NumOfChips; i++)
2092                                                                                 {
2093                                                                                         if (e判定Array[i] != EJudge.Miss)
2094                                                                                         {
2095                                                                                                 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2096                                                                                                 bHitted = true;
2097                                                                                                 break;
2098                                                                                         }
2099                                                                                 }
2100                                                                                 if (!bHitted)
2101                                                                                         break;
2102                                                                                 continue;
2103                                                                 }
2104                                                                 if (!bHitted)
2105                                                                         break;
2106                                                                 continue;
2107                                                         }
2108                                                 //-----------------------------
2109                                                 #endregion
2110
2111                                                 case EPad.HHO:
2112                                                         #region [ HO(とHCとLC:groupingしている場合)のヒット処理 ]
2113                                                         //-----------------------------
2114                                                         {
2115                                                                 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.HH)
2116                                                                         continue;   // 電子ドラムによる意図的なクロストークを無効にする
2117
2118                                                                 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2119                                                                 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2120                                                                 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2121                                                                 EJudge e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : EJudge.Miss;
2122                                                                 EJudge e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : EJudge.Miss;
2123                                                                 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
2124                                                                 switch (eHHGroup)
2125                                                                 {
2126                                                                         case EHHGroup.Off:
2127                                                                                 if (e判定HO != EJudge.Miss)
2128                                                                                 {
2129                                                                                         this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2130                                                                                         bHitted = true;
2131                                                                                 }
2132                                                                                 if (!bHitted)
2133                                                                                         break;
2134                                                                                 continue;
2135
2136                                                                         case EHHGroup.HO_HC:
2137                                                                                 if ((e判定HO != EJudge.Miss) && (e判定LC != EJudge.Miss))
2138                                                                                 {
2139                                                                                         if (chipHO.n発声位置 < chipLC.n発声位置)
2140                                                                                         {
2141                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2142                                                                                         }
2143                                                                                         else if (chipHO.n発声位置 > chipLC.n発声位置)
2144                                                                                         {
2145                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2146                                                                                         }
2147                                                                                         else
2148                                                                                         {
2149                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2150                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2151                                                                                         }
2152                                                                                         bHitted = true;
2153                                                                                 }
2154                                                                                 else if (e判定HO != EJudge.Miss)
2155                                                                                 {
2156                                                                                         this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2157                                                                                         bHitted = true;
2158                                                                                 }
2159                                                                                 else if (e判定LC != EJudge.Miss)
2160                                                                                 {
2161                                                                                         this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2162                                                                                         bHitted = true;
2163                                                                                 }
2164                                                                                 if (!bHitted)
2165                                                                                         break;
2166                                                                                 continue;
2167
2168                                                                         case EHHGroup.LC_HH:
2169                                                                                 if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
2170                                                                                 {
2171                                                                                         if (chipHC.n発声位置 < chipHO.n発声位置)
2172                                                                                         {
2173                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2174                                                                                         }
2175                                                                                         else if (chipHC.n発声位置 > chipHO.n発声位置)
2176                                                                                         {
2177                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2178                                                                                         }
2179                                                                                         else
2180                                                                                         {
2181                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2182                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2183                                                                                         }
2184                                                                                         bHitted = true;
2185                                                                                 }
2186                                                                                 else if (e判定HC != EJudge.Miss)
2187                                                                                 {
2188                                                                                         this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2189                                                                                         bHitted = true;
2190                                                                                 }
2191                                                                                 else if (e判定HO != EJudge.Miss)
2192                                                                                 {
2193                                                                                         this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2194                                                                                         bHitted = true;
2195                                                                                 }
2196                                                                                 if (!bHitted)
2197                                                                                         break;
2198                                                                                 continue;
2199
2200                                                                         case EHHGroup.Group:
2201                                                                                 if (((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss)) && (e判定LC != EJudge.Miss))
2202                                                                                 {
2203                                                                                         CChip chip;
2204                                                                                         CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC };
2205                                                                                         // ここから、chipArrayをn発生位置の小さい順に並び替える
2206                                                                                         if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
2207                                                                                         {
2208                                                                                                 chip = chipArray[1];
2209                                                                                                 chipArray[1] = chipArray[2];
2210                                                                                                 chipArray[2] = chip;
2211                                                                                         }
2212                                                                                         if (chipArray[0].n発声位置 > chipArray[1].n発声位置)
2213                                                                                         {
2214                                                                                                 chip = chipArray[0];
2215                                                                                                 chipArray[0] = chipArray[1];
2216                                                                                                 chipArray[1] = chip;
2217                                                                                         }
2218                                                                                         if (chipArray[1].n発声位置 > chipArray[2].n発声位置)
2219                                                                                         {
2220                                                                                                 chip = chipArray[1];
2221                                                                                                 chipArray[1] = chipArray[2];
2222                                                                                                 chipArray[2] = chip;
2223                                                                                         }
2224                                                                                         this.tドラムヒット処理(nTime, EPad.HHO, chipArray[0], inputEvent.nVelocity);
2225                                                                                         if (chipArray[0].n発声位置 == chipArray[1].n発声位置)
2226                                                                                         {
2227                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipArray[1], inputEvent.nVelocity);
2228                                                                                         }
2229                                                                                         if (chipArray[0].n発声位置 == chipArray[2].n発声位置)
2230                                                                                         {
2231                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipArray[2], inputEvent.nVelocity);
2232                                                                                         }
2233                                                                                         bHitted = true;
2234                                                                                 }
2235                                                                                 else if ((e判定HC != EJudge.Miss) && (e判定HO != EJudge.Miss))
2236                                                                                 {
2237                                                                                         if (chipHC.n発声位置 < chipHO.n発声位置)
2238                                                                                         {
2239                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2240                                                                                         }
2241                                                                                         else if (chipHC.n発声位置 > chipHO.n発声位置)
2242                                                                                         {
2243                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2244                                                                                         }
2245                                                                                         else
2246                                                                                         {
2247                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2248                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2249                                                                                         }
2250                                                                                         bHitted = true;
2251                                                                                 }
2252                                                                                 else if ((e判定HC != EJudge.Miss) && (e判定LC != EJudge.Miss))
2253                                                                                 {
2254                                                                                         if (chipHC.n発声位置 < chipLC.n発声位置)
2255                                                                                         {
2256                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2257                                                                                         }
2258                                                                                         else if (chipHC.n発声位置 > chipLC.n発声位置)
2259                                                                                         {
2260                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2261                                                                                         }
2262                                                                                         else
2263                                                                                         {
2264                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2265                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2266                                                                                         }
2267                                                                                         bHitted = true;
2268                                                                                 }
2269                                                                                 else if ((e判定HO != EJudge.Miss) && (e判定LC != EJudge.Miss))
2270                                                                                 {
2271                                                                                         if (chipHO.n発声位置 < chipLC.n発声位置)
2272                                                                                         {
2273                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2274                                                                                         }
2275                                                                                         else if (chipHO.n発声位置 > chipLC.n発声位置)
2276                                                                                         {
2277                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2278                                                                                         }
2279                                                                                         else
2280                                                                                         {
2281                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2282                                                                                                 this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2283                                                                                         }
2284                                                                                         bHitted = true;
2285                                                                                 }
2286                                                                                 else if (e判定HC != EJudge.Miss)
2287                                                                                 {
2288                                                                                         this.tドラムヒット処理(nTime, EPad.HHO, chipHC, inputEvent.nVelocity);
2289                                                                                         bHitted = true;
2290                                                                                 }
2291                                                                                 else if (e判定HO != EJudge.Miss)
2292                                                                                 {
2293                                                                                         this.tドラムヒット処理(nTime, EPad.HHO, chipHO, inputEvent.nVelocity);
2294                                                                                         bHitted = true;
2295                                                                                 }
2296                                                                                 else if (e判定LC != EJudge.Miss)
2297                                                                                 {
2298                                                                                         this.tドラムヒット処理(nTime, EPad.HHO, chipLC, inputEvent.nVelocity);
2299                                                                                         bHitted = true;
2300                                                                                 }
2301                                                                                 if (!bHitted)
2302                                                                                         break;
2303                                                                                 continue;
2304                                                                 }
2305                                                                 if (!bHitted)
2306                                                                         break;
2307                                                                 continue;
2308                                                         }
2309                                                 //-----------------------------
2310                                                 #endregion
2311
2312                                                 case EPad.RD:
2313                                                         #region [ RD(とCYとLC:groupingしている場合)のヒット処理 ]
2314                                                         //-----------------------------
2315                                                         {
2316                                                                 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.RD)   // #23857 2010.12.12 yyagi: to support VelocityMin
2317                                                                         continue;   // 電子ドラムによる意図的なクロストークを無効にする
2318                                                                 CChip chipCY = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2319                                                                 CChip chipRD = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);
2320                                                                 CChip chipLC = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
2321                                                                 EJudge e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : EJudge.Miss;
2322                                                                 EJudge e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : EJudge.Miss;
2323                                                                 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
2324                                                                 CChip[] chipArray = new CChip[] { chipCY, chipRD, chipLC };
2325                                                                 EJudge[] e判定Array = new EJudge[] { e判定CY, e判定RD, e判定LC };
2326                                                                 const int NumOfChips = 3;   // chipArray.GetLength(0)
2327
2328                                                                 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
2329                                                                 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
2330                                                                 switch (eCYGroup)
2331                                                                 {
2332                                                                         case ECYGroup.Off:
2333                                                                                 if (e判定RD != EJudge.Miss)
2334                                                                                 {
2335                                                                                         this.tドラムヒット処理(nTime, EPad.RD, chipRD, inputEvent.nVelocity);
2336                                                                                         bHitted = true;
2337                                                                                 }
2338                                                                                 break;
2339
2340                                                                         case ECYGroup.Group:
2341                                                                                 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2342                                                                                 {
2343                                                                                         for (int i = 0; i < NumOfChips; i++)
2344                                                                                         {
2345                                                                                                 if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] == chipCY) || (chipArray[i] == chipRD)))
2346                                                                                                 {
2347                                                                                                         this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2348                                                                                                         bHitted = true;
2349                                                                                                         break;
2350                                                                                                 }
2351                                                                                         }
2352                                                                                         break;
2353                                                                                 }
2354                                                                                 for (int i = 0; i < NumOfChips; i++)
2355                                                                                 {
2356                                                                                         if (e判定Array[i] != EJudge.Miss)
2357                                                                                         {
2358                                                                                                 this.tドラムヒット処理(nTime, EPad.CY, chipArray[i], inputEvent.nVelocity);
2359                                                                                                 bHitted = true;
2360                                                                                                 break;
2361                                                                                         }
2362                                                                                 }
2363                                                                                 break;
2364                                                                 }
2365                                                                 if (bHitted)
2366                                                                 {
2367                                                                         continue;
2368                                                                 }
2369                                                                 break;
2370                                                         }
2371                                                 //-----------------------------
2372                                                 #endregion
2373
2374                                                 case EPad.LC:
2375                                                         #region [ LC(とHC/HOとCYと:groupingしている場合)のヒット処理 ]
2376                                                         //-----------------------------
2377                                                         {
2378                                                                 if (inputEvent.nVelocity <= CDTXMania.Instance.ConfigIni.nVelocityMin.LC)   // #23857 2010.12.12 yyagi: to support VelocityMin
2379                                                                         continue;   // 電子ドラムによる意図的なクロストークを無効にする
2380                                                                 CChip chipHC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatClose, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);    // HC
2381                                                                 CChip chipHO = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.HiHatOpen, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1); // HO
2382                                                                 CChip chipLC = this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.LeftCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1);    // LC
2383                                                                 CChip chipCY = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.Cymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
2384                                                                 CChip chipRD = CDTXMania.Instance.ConfigIni.bCymbalFree ? this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.RideCymbal, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1) : null;
2385                                                                 EJudge e判定HC = (chipHC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHC, nInputAdjustTime) : EJudge.Miss;
2386                                                                 EJudge e判定HO = (chipHO != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipHO, nInputAdjustTime) : EJudge.Miss;
2387                                                                 EJudge e判定LC = (chipLC != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipLC, nInputAdjustTime) : EJudge.Miss;
2388                                                                 EJudge e判定CY = (chipCY != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipCY, nInputAdjustTime) : EJudge.Miss;
2389                                                                 EJudge e判定RD = (chipRD != null) ? this.e指定時刻からChipのJUDGEを返す(nTime, chipRD, nInputAdjustTime) : EJudge.Miss;
2390                                                                 CChip[] chipArray = new CChip[] { chipHC, chipHO, chipLC, chipCY, chipRD };
2391                                                                 EJudge[] e判定Array = new EJudge[] { e判定HC, e判定HO, e判定LC, e判定CY, e判定RD };
2392                                                                 const int NumOfChips = 5;   // chipArray.GetLength(0)
2393
2394                                                                 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
2395                                                                 SortChipsByNTime(chipArray, e判定Array, NumOfChips);
2396                                                                 switch (eHHGroup)
2397                                                                 {
2398                                                                         case EHHGroup.Off:
2399                                                                         case EHHGroup.LC_HH:
2400                                                                                 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2401                                                                                 {
2402                                                                                         if (e判定LC != EJudge.Miss)
2403                                                                                         {
2404                                                                                                 this.tドラムヒット処理(nTime, EPad.LC, chipLC, inputEvent.nVelocity);
2405                                                                                                 bHitted = true;
2406                                                                                         }
2407                                                                                         if (!bHitted)
2408                                                                                                 break;
2409                                                                                         continue;
2410                                                                                 }
2411                                                                                 for (int i = 0; i < NumOfChips; i++)
2412                                                                                 {
2413                                                                                         if ((e判定Array[i] != EJudge.Miss) && (((chipArray[i] == chipLC) || (chipArray[i] == chipCY)) || ((chipArray[i] == chipRD) && (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group))))
2414                                                                                         {
2415                                                                                                 this.tドラムヒット処理(nTime, EPad.LC, chipArray[i], inputEvent.nVelocity);
2416                                                                                                 bHitted = true;
2417                                                                                                 break;
2418                                                                                         }
2419                                                                                 }
2420                                                                                 if (!bHitted)
2421                                                                                         break;
2422                                                                                 continue;
2423
2424                                                                         case EHHGroup.HO_HC:
2425                                                                         case EHHGroup.Group:
2426                                                                                 if (!CDTXMania.Instance.ConfigIni.bCymbalFree)
2427                                                                                 {
2428                                                                                         for (int i = 0; i < NumOfChips; i++)
2429                                                                                         {
2430                                                                                                 if ((e判定Array[i] != EJudge.Miss) && (((chipArray[i] == chipLC) || (chipArray[i] == chipHC)) || (chipArray[i] == chipHO)))
2431                                                                                                 {
2432                                                                                                         this.tドラムヒット処理(nTime, EPad.LC, chipArray[i], inputEvent.nVelocity);
2433                                                                                                         bHitted = true;
2434                                                                                                         break;
2435                                                                                                 }
2436                                                                                         }
2437                                                                                         if (!bHitted)
2438                                                                                                 break;
2439                                                                                         continue;
2440                                                                                 }
2441                                                                                 for (int i = 0; i < NumOfChips; i++)
2442                                                                                 {
2443                                                                                         if ((e判定Array[i] != EJudge.Miss) && ((chipArray[i] != chipRD) || (CDTXMania.Instance.ConfigIni.eCYGroup == ECYGroup.Group)))
2444                                                                                         {
2445                                                                                                 this.tドラムヒット処理(nTime, EPad.LC, chipArray[i], inputEvent.nVelocity);
2446                                                                                                 bHitted = true;
2447                                                                                                 break;
2448                                                                                         }
2449                                                                                 }
2450                                                                                 if (!bHitted)
2451                                                                                         break;
2452                                                                                 continue;
2453                                                                 }
2454                                                                 if (!bHitted)
2455                                                                         break;
2456
2457                                                                 break;
2458                                                         }
2459                                                 //-----------------------------
2460                                                 #endregion
2461
2462                                                 case EPad.HP:       // #27029 2012.1.4 from
2463                                                         #region [ HPのヒット処理 ]
2464                                                         //-----------------
2465                                                         if (CDTXMania.Instance.ConfigIni.eBDGroup == EBDGroup.Group)
2466                                                         {
2467                                                                 #region [ BDとみなしてヒット処理 ]
2468                                                                 //-----------------
2469                                                                 if (!this.tドラムヒット処理(nTime, EPad.BD, this.r指定時刻に一番近い未ヒットChip(nTime, EChannel.BassDrum, nInputAdjustTime, CDTXMania.Instance.nPoor範囲ms + 1), inputEvent.nVelocity))
2470                                                                         break;
2471                                                                 continue;
2472                                                                 //-----------------
2473                                                                 #endregion
2474                                                         }
2475                                                         else
2476                                                         {
2477                                                                 #region [ HPのヒット処理 ]
2478                                                                 //-----------------
2479                                                                 continue;   // 何もしない。この入力を完全に無視するので、break しないこと。
2480                                                                                                                 //-----------------
2481                                                                 #endregion
2482                                                         }
2483                                                         //-----------------
2484                                                         #endregion
2485                                         }
2486                                         //-----------------------------
2487                                         #endregion
2488                                         #region [ (B) ヒットしてなかった場合は、レーンフラッシュ、パッドアニメ、空打ち音再生を実行 ]
2489                                         //-----------------------------
2490                                         EPad pad = ePad; // 以下、nPad の代わりに pad を用いる。(成りすまし用)
2491
2492                                         if (ePad == EPad.HP)
2493                                         {
2494                                                 // #27029 2012.1.4 from: HP&BD 時の HiHatPedal の場合は BD に成りすます。
2495                                                 pad = EPad.BD;
2496                                                 //( HP|BD 時のHP入力はここまでこないので無視。)
2497                                         }
2498
2499                                         // レーンフラッシュ
2500                                         this.actLaneFlushD.Start(EnumConverter.LaneFromPad(pad), ((float)inputEvent.nVelocity) / 127f);
2501
2502                                         // パッド画像のヒット処理用
2503
2504                                         // パッドアニメ
2505                                         this.actPad.Hit(pad);
2506
2507                                         // 空打ち音
2508                                         if (CDTXMania.Instance.ConfigIni.bDrumsHitSound)
2509                                         {
2510                                                 CChip rChip = this.r空うちChip(EPart.Drums, pad);
2511                                                 if (rChip != null)
2512                                                 {
2513                                                         // (B1) 空打ち音が譜面で指定されているのでそれを再生する。
2514                                                         this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, EPart.Drums, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
2515                                                 }
2516                                                 else
2517                                                 {
2518                                                         #region [ (B2) 空打ち音が指定されていないので一番近いチップを探して再生する。]
2519                                                         switch (pad)
2520                                                         {
2521                                                                 case EPad.HH:
2522                                                                         {
2523                                                                                 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatClose, nInputAdjustTime);
2524                                                                                 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatOpen, nInputAdjustTime);
2525                                                                                 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LeftCymbal, nInputAdjustTime);
2526                                                                                 switch (CDTXMania.Instance.ConfigIni.eHHGroup.Value)
2527                                                                                 {
2528                                                                                         case EHHGroup.HO_HC:
2529                                                                                                 rChip = (chipHC != null) ? chipHC : chipLC;
2530                                                                                                 break;
2531
2532                                                                                         case EHHGroup.LC_HH:
2533                                                                                                 rChip = (chipHC != null) ? chipHC : chipHO;
2534                                                                                                 break;
2535
2536                                                                                         case EHHGroup.Group:
2537                                                                                                 if (chipHC != null)
2538                                                                                                 {
2539                                                                                                         rChip = chipHC;
2540                                                                                                 }
2541                                                                                                 else if (chipHO == null)
2542                                                                                                 {
2543                                                                                                         rChip = chipLC;
2544                                                                                                 }
2545                                                                                                 else if (chipLC == null)
2546                                                                                                 {
2547                                                                                                         rChip = chipHO;
2548                                                                                                 }
2549                                                                                                 else if (chipHO.n発声位置 < chipLC.n発声位置)
2550                                                                                                 {
2551                                                                                                         rChip = chipHO;
2552                                                                                                 }
2553                                                                                                 else
2554                                                                                                 {
2555                                                                                                         rChip = chipLC;
2556                                                                                                 }
2557                                                                                                 break;
2558
2559                                                                                         default:
2560                                                                                                 rChip = chipHC;
2561                                                                                                 break;
2562                                                                                 }
2563                                                                         }
2564                                                                         break;
2565
2566                                                                 case EPad.LT:
2567                                                                         {
2568                                                                                 CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LowTom, nInputAdjustTime);
2569                                                                                 CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.FloorTom, nInputAdjustTime);
2570                                                                                 if (CDTXMania.Instance.ConfigIni.eFTGroup != EFTGroup.Off)
2571                                                                                         rChip = (chipLT != null) ? chipLT : chipFT;
2572                                                                                 else
2573                                                                                         rChip = chipLT;
2574                                                                         }
2575                                                                         break;
2576
2577                                                                 case EPad.FT:
2578                                                                         {
2579                                                                                 CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LowTom, nInputAdjustTime);
2580                                                                                 CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.FloorTom, nInputAdjustTime);
2581                                                                                 if (CDTXMania.Instance.ConfigIni.eFTGroup != EFTGroup.Off)
2582                                                                                         rChip = (chipFT != null) ? chipFT : chipLT;
2583                                                                                 else
2584                                                                                         rChip = chipFT;
2585                                                                         }
2586                                                                         break;
2587
2588                                                                 case EPad.CY:
2589                                                                         {
2590                                                                                 CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.Cymbal, nInputAdjustTime);
2591                                                                                 CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.RideCymbal, nInputAdjustTime);
2592                                                                                 if (CDTXMania.Instance.ConfigIni.eCYGroup != ECYGroup.Off)
2593                                                                                         rChip = (chipCY != null) ? chipCY : chipRD;
2594                                                                                 else
2595                                                                                         rChip = chipCY;
2596                                                                         }
2597                                                                         break;
2598
2599                                                                 case EPad.HHO:
2600                                                                         {
2601                                                                                 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatClose, nInputAdjustTime);
2602                                                                                 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatOpen, nInputAdjustTime);
2603                                                                                 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LeftCymbal, nInputAdjustTime);
2604                                                                                 switch (CDTXMania.Instance.ConfigIni.eHHGroup.Value)
2605                                                                                 {
2606                                                                                         case EHHGroup.Off:
2607                                                                                                 rChip = chipHO;
2608                                                                                                 break;
2609
2610                                                                                         case EHHGroup.HO_HC:
2611                                                                                                 rChip = (chipHO != null) ? chipHO : chipLC;
2612                                                                                                 break;
2613
2614                                                                                         case EHHGroup.LC_HH:
2615                                                                                                 rChip = (chipHO != null) ? chipHO : chipHC;
2616                                                                                                 break;
2617
2618                                                                                         case EHHGroup.Group:
2619                                                                                                 if (chipHO != null)
2620                                                                                                 {
2621                                                                                                         rChip = chipHO;
2622                                                                                                 }
2623                                                                                                 else if (chipHC == null)
2624                                                                                                 {
2625                                                                                                         rChip = chipLC;
2626                                                                                                 }
2627                                                                                                 else if (chipLC == null)
2628                                                                                                 {
2629                                                                                                         rChip = chipHC;
2630                                                                                                 }
2631                                                                                                 else if (chipHC.n発声位置 < chipLC.n発声位置)
2632                                                                                                 {
2633                                                                                                         rChip = chipHC;
2634                                                                                                 }
2635                                                                                                 else
2636                                                                                                 {
2637                                                                                                         rChip = chipLC;
2638                                                                                                 }
2639                                                                                                 break;
2640                                                                                 }
2641                                                                         }
2642                                                                         break;
2643
2644                                                                 case EPad.RD:
2645                                                                         {
2646                                                                                 CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.Cymbal, nInputAdjustTime);
2647                                                                                 CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.RideCymbal, nInputAdjustTime);
2648                                                                                 if (CDTXMania.Instance.ConfigIni.eCYGroup != ECYGroup.Off)
2649                                                                                         rChip = (chipRD != null) ? chipRD : chipCY;
2650                                                                                 else
2651                                                                                         rChip = chipRD;
2652                                                                         }
2653                                                                         break;
2654
2655                                                                 case EPad.LC:
2656                                                                         {
2657                                                                                 CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatClose, nInputAdjustTime);
2658                                                                                 CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.HiHatOpen, nInputAdjustTime);
2659                                                                                 CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EChannel.LeftCymbal, nInputAdjustTime);
2660                                                                                 switch (CDTXMania.Instance.ConfigIni.eHHGroup.Value)
2661                                                                                 {
2662                                                                                         case EHHGroup.Off:
2663                                                                                         case EHHGroup.LC_HH:
2664                                                                                                 rChip = chipLC;
2665                                                                                                 break;
2666
2667                                                                                         case EHHGroup.HO_HC:
2668                                                                                         case EHHGroup.Group:
2669                                                                                                 if (chipLC != null)
2670                                                                                                 {
2671                                                                                                         rChip = chipLC;
2672                                                                                                 }
2673                                                                                                 else if (chipHC == null)
2674                                                                                                 {
2675                                                                                                         rChip = chipHO;
2676                                                                                                 }
2677                                                                                                 else if (chipHO == null)
2678                                                                                                 {
2679                                                                                                         rChip = chipHC;
2680                                                                                                 }
2681                                                                                                 else if (chipHC.n発声位置 < chipHO.n発声位置)
2682                                                                                                 {
2683                                                                                                         rChip = chipHC;
2684                                                                                                 }
2685                                                                                                 else
2686                                                                                                 {
2687                                                                                                         rChip = chipHO;
2688                                                                                                 }
2689                                                                                                 break;
2690                                                                                 }
2691                                                                         }
2692                                                                         break;
2693
2694                                                                 default:
2695                                                                         rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, EnumConverter.ChannelFromPad(pad), nInputAdjustTime);
2696                                                                         break;
2697                                                         }
2698                                                         if (rChip != null)
2699                                                         {
2700                                                                 // 空打ち音が見つかったので再生する。
2701                                                                 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, EPart.Drums, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
2702                                                         }
2703                                                         //-----------------
2704                                                         #endregion
2705                                                 }
2706                                         }
2707
2708                                         // BAD or TIGHT 時の処理。
2709                                         if (CDTXMania.Instance.ConfigIni.bTight)
2710                                                 this.tチップのヒット処理_BadならびにTight時のMiss(EPart.Drums, EnumConverter.LaneFromPad(pad));//nパッド0Atoレーン07[(int)pad]
2711                                                                                                                                                                                                                                                                                                                                                                                 //-----------------------------
2712                                         #endregion
2713                                 }
2714                         }
2715                 }
2716
2717                 private void ドラムスクロール速度アップ()
2718                 {
2719                         int scrollSpeed = CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums;
2720                         CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums.Value = scrollSpeed + 1;
2721                         float f = (float)CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums / (scrollSpeed + 1);
2722                         if (scrollSpeed < CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums)
2723                         {
2724                                 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value = ((int)(f * (CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums + 1) + 0.5));
2725                         }
2726                 }
2727
2728                 private void ドラムスクロール速度ダウン()
2729                 {
2730                         int scrollSpeed = CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums;
2731                         CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums.Value = (scrollSpeed - 1);
2732                         float f = (float)CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums / (scrollSpeed + 1);
2733                         if (scrollSpeed > CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums)
2734                         {
2735                                 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value = ((int)(f * (CDTXMania.Instance.ConfigIni.nScrollSpeed.Drums + 1) + 0.5));
2736                         }
2737                 }
2738
2739                 private int nStartTime_ = 0;
2740
2741                 protected void tキー入力()
2742                 {
2743                         IInputDevice keyboard = CDTXMania.Instance.Input管理.Keyboard;
2744                         if (keyboard.bキーが押された((int)SlimDXKey.F1) &&
2745                                         (keyboard.bキーが押されている((int)SlimDXKey.RightShift) || keyboard.bキーが押されている((int)SlimDXKey.LeftShift)))
2746                         {   // shift+f1 (pause)
2747                                 this.bPAUSE = !this.bPAUSE;
2748                                 if (this.bPAUSE)
2749                                 {
2750                                         nStartTime_ = (int)CSound管理.rc演奏用タイマ.n現在時刻;
2751                                         CSound管理.rc演奏用タイマ.t一時停止();
2752                                         CDTXMania.Instance.Timer.t一時停止();
2753                                         CDTXMania.Instance.DTX.t全チップの再生一時停止();
2754                                         CDTXMania.Instance.DTX.t全AVIの一時停止();
2755                                 }
2756                                 else
2757                                 {
2758                                         CDTXMania.Instance.DTX.t全AVIの再生再開();
2759                                         // CDTXMania.Instance.DTX.t全チップの再生再開();
2760                                         #region [ PAUSE連打でのBGMずれ対策 (AVIはずれたままになるが無視・・・) ]
2761
2762                                         List<CSound> pausedCSound = new List<CSound>();
2763                                         for (int i = this.n現在のトップChip; i >= 0; i--)
2764                                         {
2765                                                 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
2766                                                 int nDuration = pChip.GetDuration();
2767
2768                                                 if ((pChip.n発声時刻ms + nDuration > 0) && (pChip.n発声時刻ms <= nStartTime_) && (nStartTime_ <= pChip.n発声時刻ms + nDuration))
2769                                                 {
2770                                                         if (pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである) // wav系チャンネル、且つ、空打ちチップではない
2771                                                         {
2772                                                                 CDTX.CWAV wc;
2773                                                                 bool b = CDTXMania.Instance.DTX.listWAV.TryGetValue(pChip.n整数値_内部番号, out wc);
2774                                                                 if (!b) continue;
2775
2776                                                                 if ((wc.bIsBGMSound && CDTXMania.Instance.ConfigIni.bBGMPlay) || (!wc.bIsBGMSound))
2777                                                                 {
2778                                                                         CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
2779                                                                         #region [ PAUSEする ]
2780                                                                         int j = wc.n現在再生中のサウンド番号;
2781                                                                         if (wc.rSound[j] != null)
2782                                                                         {
2783                                                                                 wc.rSound[j].t再生を一時停止する();
2784                                                                                 wc.rSound[j].t再生位置を変更する(nStartTime_ - pChip.n発声時刻ms);
2785                                                                                 pausedCSound.Add(wc.rSound[j]);
2786                                                                         }
2787                                                                         #endregion
2788                                                                 }
2789                                                         }
2790                                                 }
2791                                         }
2792                                         foreach (CSound cs in pausedCSound)
2793                                         {
2794                                                 cs.tサウンドを再生する();
2795                                         }
2796
2797                                         #endregion
2798                                         CDTXMania.Instance.Timer.t再開();
2799                                         CSound管理.rc演奏用タイマ.t再開();
2800                                 }
2801                         }
2802                         if ((!this.bPAUSE && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED)) && (base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
2803                         {
2804                                 if (CDTXMania.Instance.ConfigIni.bDrums有効)
2805                                 {
2806                                         this.t入力処理_ドラム();
2807                                 }
2808                                 if (CDTXMania.Instance.ConfigIni.bGuitar有効)
2809                                 {
2810                                         this.t入力処理_ギターベース(EPart.Guitar);
2811                                         this.t入力処理_ギターベース(EPart.Bass);
2812                                 }
2813
2814                                 if (keyboard.bキーが押された((int)SlimDXKey.UpArrow) && (keyboard.bキーが押されている((int)SlimDXKey.RightShift) || keyboard.bキーが押されている((int)SlimDXKey.LeftShift)))
2815                                 {   // shift (+ctrl) + UpArrow (BGMAdjust)
2816                                         CDTXMania.Instance.DTX.t各自動再生音チップの再生時刻を変更する((keyboard.bキーが押されている((int)SlimDXKey.LeftControl) || keyboard.bキーが押されている((int)SlimDXKey.RightControl)) ? 1 : 10);
2817                                         CDTXMania.Instance.DTX.tWave再生位置自動補正();
2818                                 }
2819                                 else if (keyboard.bキーが押された((int)SlimDXKey.DownArrow) && (keyboard.bキーが押されている((int)SlimDXKey.RightShift) || keyboard.bキーが押されている((int)SlimDXKey.LeftShift)))
2820                                 {   // shift + DownArrow (BGMAdjust)
2821                                         CDTXMania.Instance.DTX.t各自動再生音チップの再生時刻を変更する((keyboard.bキーが押されている((int)SlimDXKey.LeftControl) || keyboard.bキーが押されている((int)SlimDXKey.RightControl)) ? -1 : -10);
2822                                         CDTXMania.Instance.DTX.tWave再生位置自動補正();
2823                                 }
2824                                 else if (keyboard.bキーが押された((int)SlimDXKey.UpArrow))
2825                                 {   // UpArrow(scrollspeed up)
2826                                         ドラムスクロール速度アップ();
2827                                 }
2828                                 else if (keyboard.bキーが押された((int)SlimDXKey.DownArrow))
2829                                 {   // DownArrow (scrollspeed down)
2830                                         ドラムスクロール速度ダウン();
2831                                 }
2832                                 else if (keyboard.bキーが押された((int)SlimDXKey.Delete))
2833                                 {   // del (debug info)
2834                                         CDTXMania.Instance.ConfigIni.bDebugInfo.Value = !CDTXMania.Instance.ConfigIni.bDebugInfo;
2835                                 }
2836                                 else if (keyboard.bキーが押された((int)SlimDXKey.LeftArrow))      // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
2837                                 {
2838                                         ChangeInputAdjustTimeInPlaying(keyboard, -1);
2839                                 }
2840                                 else if (keyboard.bキーが押された((int)SlimDXKey.RightArrow))     // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.
2841                                 {
2842                                         ChangeInputAdjustTimeInPlaying(keyboard, +1);
2843                                 }
2844                                 else if (keyboard.bキーが押された((int)SlimDXKey.F5))
2845                                 {
2846                                         int nVal = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums - 1;
2847                                         CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value =
2848                                         CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Guitar.Value =
2849                                         CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Bass.Value = nVal;
2850                                 }
2851                                 else if (keyboard.bキーが押された((int)SlimDXKey.F6))
2852                                 {
2853                                         int nVal = CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums + 1;
2854                                         CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Drums.Value =
2855                                         CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Guitar.Value =
2856                                         CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset.Bass.Value = nVal;
2857                                 }
2858                                 else if ((base.eフェーズID == CStage.Eフェーズ.共通_通常状態) &&
2859                                                 (keyboard.bキーが押された((int)SlimDXKey.Escape) ||
2860                                                 CDTXMania.Instance.Pad.bCancelPadIsPressedGB()))
2861                                 {
2862                                         // escape (exit)
2863                                         this.actFO.tフェードアウト開始();
2864                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
2865                                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;
2866                                 }
2867                         }
2868                 }
2869
2870                 protected void t入力メソッド記憶(EPart part)
2871                 {
2872                         if (CDTXMania.Instance.Pad.st検知したデバイス.Keyboard)
2873                         {
2874                                 this.b演奏にキーボードを使った[part] = true;
2875                         }
2876                         if (CDTXMania.Instance.Pad.st検知したデバイス.Joypad)
2877                         {
2878                                 this.b演奏にジョイパッドを使った[part] = true;
2879                         }
2880                         if (CDTXMania.Instance.Pad.st検知したデバイス.MIDIIN)
2881                         {
2882                                 this.b演奏にMIDI入力を使った[part] = true;
2883                         }
2884                         if (CDTXMania.Instance.Pad.st検知したデバイス.Mouse)
2885                         {
2886                                 this.b演奏にマウスを使った[part] = true;
2887                         }
2888                 }
2889
2890                 /// <summary>
2891                 /// チップに関連する処理を行う。
2892                 /// </summary>
2893                 /// <returns>演奏が終了したかどうかを示す値</returns>
2894                 protected bool t進行描画_チップ()
2895                 {
2896                         if ((base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED) || (base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト))
2897                         {
2898                                 return true;
2899                         }
2900                         if ((this.n現在のトップChip == -1) || (this.n現在のトップChip >= CDTXMania.Instance.DTX.listChip.Count))
2901                         {
2902                                 return true;
2903                         }
2904                         if (this.n現在のトップChip == -1)
2905                         {
2906                                 return true;
2907                         }
2908
2909                         //CDTX dTX = CDTXMania.Instance.DTX;
2910                         //CConfigIni configIni = CDTXMania.Instance.ConfigIni;
2911                         for (int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < CDTXMania.Instance.DTX.listChip.Count; nCurrentTopChip++)
2912                         {
2913                                 CChip pChip = CDTXMania.Instance.DTX.listChip[nCurrentTopChip];
2914                                 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );
2915                                 pChip.CalcDistanceFromBar(CSound管理.rc演奏用タイマ.n現在時刻, this.act譜面スクロール速度.db現在の譜面スクロール速度);
2916                                 if (Math.Min(Math.Min(pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar), pChip.nバーからの距離dot.Bass) > 450 * Scale.Y)
2917                                 {
2918                                         break;
2919                                 }
2920                                 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正
2921                                 if ((CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].nバーからの距離dot.Drums < -65 * Scale.Y) &&   // 小節線の消失処理などに影響するため、
2922                                                 (CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].nバーからの距離dot.Guitar < -65 * Scale.Y) &&  // Drumsのスクロールスピードだけには依存させない。
2923                                                 (CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].nバーからの距離dot.Bass < -65 * Scale.Y) &&
2924                                                 CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].bHit)
2925                                 {
2926                                         ++this.n現在のトップChip;
2927                                         continue;
2928                                 }
2929                                 bool bPChipIsAutoPlay = pChip.bAssignAutoPlayState();
2930
2931                                 int nInputAdjustTime = (bPChipIsAutoPlay || (pChip.e楽器パート == EPart.Unknown)) ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[pChip.e楽器パート];
2932
2933                                 EPart inst = pChip.e楽器パート;
2934                                 if (((pChip.e楽器パート != EPart.Unknown) && !pChip.bHit) &&
2935                                                                 ((pChip.nバーからの距離dot[inst] < -40 * Scale.Y) &&
2936                                                 (this.e指定時刻からChipのJUDGEを返す(CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime) == EJudge.Miss)))
2937                                 {
2938                                         this.tチップのヒット処理(CSound管理.rc演奏用タイマ.n現在時刻, pChip);    //チップ消失(Hitせずスルーした場合)
2939                                 }
2940                                 if (((pChip.e楽器パート != EPart.Unknown) && !pChip.bHit) &&
2941                                                 ((pChip.nバーからの距離dot[inst] + CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[inst] < 0)))
2942                                 {
2943                                         //Debug.WriteLine( "透明度=" + pChip.n透明度 );
2944                                         pChip.n透明度 -= 12;       // チップが判定バーを越えたら、徐々に透明にする。VSyncWaitの有無で加減が変わるが・・
2945                                         if (pChip.n透明度 < 0)
2946                                         {
2947                                                 pChip.n透明度 = 0;
2948                                         }
2949                                 }
2950
2951                                 // #35411 chnmr0 add (ターゲットゴースト)
2952                                 if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] != ETargetGhostData.None &&
2953                                                                  CDTXMania.Instance.DTX.listTargetGhsotLag[inst] != null &&
2954                                                                  pChip.e楽器パート != EPart.Unknown &&
2955                                                                  pChip.nバーからの距離dot[inst] < 0)
2956                                 {
2957                                         if (!pChip.bTargetGhost判定済み)
2958                                         {
2959                                                 pChip.bTargetGhost判定済み = true;
2960
2961                                                 int ghostLag = 128;
2962                                                 if (0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.Instance.DTX.listTargetGhsotLag[inst].Count)
2963                                                 {
2964                                                         ghostLag = CDTXMania.Instance.DTX.listTargetGhsotLag[inst][pChip.n楽器パートでの出現順];
2965                                                         // 上位8ビットが1ならコンボが途切れている(ギターBAD空打ちでコンボ数を再現するための措置)
2966                                                         if (ghostLag > 255)
2967                                                         {
2968                                                                 this.nコンボ数_TargetGhost[inst] = 0;
2969                                                         }
2970                                                         ghostLag = (ghostLag & 255) - 128;
2971                                                 }
2972                                                 else if (CDTXMania.Instance.ConfigIni.eTargetGhost[inst] == ETargetGhostData.Perfect)
2973                                                 {
2974                                                         ghostLag = 0;
2975                                                 }
2976
2977                                                 if (ghostLag <= 127)
2978                                                 {
2979                                                         EJudge eJudge = this.e指定時刻からChipのJUDGEを返す(pChip.n発声時刻ms + ghostLag, pChip, 0, false);
2980                                                         this.nヒット数_TargetGhost[inst][(int)eJudge]++;
2981                                                         if (eJudge == EJudge.Miss || eJudge == EJudge.Poor)
2982                                                         {
2983                                                                 this.n最大コンボ数_TargetGhost[inst] = Math.Max(this.n最大コンボ数_TargetGhost[inst], this.nコンボ数_TargetGhost[inst]);
2984                                                                 this.nコンボ数_TargetGhost[inst] = 0;
2985                                                         }
2986                                                         else
2987                                                         {
2988                                                                 this.nコンボ数_TargetGhost[inst]++;
2989                                                         }
2990                                                 }
2991                                         }
2992                                 }
2993
2994                                 if (pChip[EChannel.BGM] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
2995                                 {
2996                                         pChip.bHit = true;
2997                                         if (CDTXMania.Instance.ConfigIni.bBGMPlay)
2998                                         {
2999                                                 //long t = CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms;
3000                                                 //Trace.TraceInformation( "BGM再生開始: 演奏タイマのn前回リセットしたときのシステム時刻=" + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + ", pChip.n発生時刻ms=" + pChip.n発声時刻ms + ", 合計=" + t );
3001                                                 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
3002                                         }
3003                                 }
3004                                 else if (pChip[EChannel.BPM] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3005                                 {
3006                                         pChip.bHit = true;
3007                                         this.actPlayInfo.dbBPM = (pChip.n整数値 * (((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0)) + CDTXMania.Instance.DTX.BASEBPM;
3008                                 }
3009                                 else if (pChip.bBGALayer && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3010                                 {
3011                                         pChip.bHit = true;
3012                                         if (CDTXMania.Instance.ConfigIni.bBGA)
3013                                         {
3014                                                 switch (pChip.eBGA種別)
3015                                                 {
3016                                                         case EBGAType.BMPTEX:
3017                                                                 if (pChip.rBMPTEX != null)
3018                                                                 {
3019                                                                         this.actBGA.Start(pChip, null, pChip.rBMPTEX, pChip.rBMPTEX.tx画像.sz画像サイズ.Width, pChip.rBMPTEX.tx画像.sz画像サイズ.Height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
3020                                                                 }
3021                                                                 break;
3022
3023                                                         case EBGAType.BGA:
3024                                                                 if ((pChip.rBGA != null) && ((pChip.rBMP != null) || (pChip.rBMPTEX != null)))
3025                                                                 {
3026                                                                         this.actBGA.Start(pChip, pChip.rBMP, pChip.rBMPTEX, pChip.rBGA.pt画像側右下座標.X - pChip.rBGA.pt画像側左上座標.X, pChip.rBGA.pt画像側右下座標.Y - pChip.rBGA.pt画像側左上座標.Y, 0, 0, pChip.rBGA.pt画像側左上座標.X, pChip.rBGA.pt画像側左上座標.Y, 0, 0, pChip.rBGA.pt表示座標.X, pChip.rBGA.pt表示座標.Y, 0, 0, 0);
3027                                                                 }
3028                                                                 break;
3029
3030                                                         case EBGAType.BGAPAN:
3031                                                                 if ((pChip.rBGAPan != null) && ((pChip.rBMP != null) || (pChip.rBMPTEX != null)))
3032                                                                 {
3033                                                                         this.actBGA.Start(pChip, pChip.rBMP, pChip.rBMPTEX, pChip.rBGAPan.sz開始サイズ.Width, pChip.rBGAPan.sz開始サイズ.Height, pChip.rBGAPan.sz終了サイズ.Width, pChip.rBGAPan.sz終了サイズ.Height, pChip.rBGAPan.pt画像側開始位置.X, pChip.rBGAPan.pt画像側開始位置.Y, pChip.rBGAPan.pt画像側終了位置.X, pChip.rBGAPan.pt画像側終了位置.Y, pChip.rBGAPan.pt表示側開始位置.X, pChip.rBGAPan.pt表示側開始位置.Y, pChip.rBGAPan.pt表示側終了位置.X, pChip.rBGAPan.pt表示側終了位置.Y, pChip.n総移動時間);
3034                                                                 }
3035                                                                 break;
3036
3037                                                         default:
3038                                                                 if (pChip.rBMP != null)
3039                                                                 {
3040                                                                         this.actBGA.Start(pChip, pChip.rBMP, null, pChip.rBMP.n幅, pChip.rBMP.n高さ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
3041                                                                 }
3042                                                                 break;
3043                                                 }
3044                                         }
3045                                 }
3046                                 else if (pChip[EChannel.BPMEx] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3047                                 {
3048                                         pChip.bHit = true;
3049                                         if (CDTXMania.Instance.DTX.listBPM.ContainsKey(pChip.n整数値_内部番号))
3050                                         {
3051                                                 this.actPlayInfo.dbBPM = (CDTXMania.Instance.DTX.listBPM[pChip.n整数値_内部番号].dbBPM値 *
3052                                                                 (((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0)) +
3053                                                                 CDTXMania.Instance.DTX.BASEBPM;
3054                                         }
3055                                 }
3056                                 else if (pChip.bDrums可視チップ && pChip.b空打ちチップである)
3057                                 {
3058                                         if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3059                                         {
3060                                                 pChip.bHit = true;
3061                                                 if (CDTXMania.Instance.ConfigIni.bDrums有効)
3062                                                 {
3063                                                         this.r現在の空うちドラムChip[(int)(EnumConverter.PadFromChannel(pChip.eチャンネル番号) - EPad.DrumsPadMin)] = pChip;
3064                                                 }
3065                                         }
3066                                 }
3067                                 else if (pChip.bDrums可視チップ_LP_LBD含まない)
3068                                 {
3069                                         this.t進行描画_チップ_ドラムス(ref pChip);
3070                                 }
3071                                 else if (pChip[EChannel.DrumsFillin] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3072                                 {
3073                                         pChip.bHit = true;
3074                                         this.r現在の歓声Chip.Drums = pChip;
3075                                 }
3076                                 else if (pChip.bGuitar可視チップ)
3077                                 {
3078                                         this.t進行描画_チップ_ギターベース(ref pChip, EPart.Guitar);
3079                                 }
3080                                 else if (pChip[EChannel.Guitar_Wailing])
3081                                 {
3082                                         this.t進行描画_チップ_ウェイリング(ref pChip);
3083                                 }
3084                                 else if (pChip[EChannel.Guitar_WailingSound] && !pChip.bHit && (pChip.nバーからの距離dot.Guitar < 0))
3085                                 {
3086                                         pChip.bHit = true;
3087                                         this.r現在の歓声Chip.Guitar = pChip;
3088                                 }
3089                                 else if (pChip.bDrums不可視チップ && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3090                                 {
3091                                         pChip.bHit = true;
3092                                 }
3093                                 else if (pChip[EChannel.BarLine] || pChip[EChannel.BeatLine])// 小節線
3094                                 {
3095                                         this.t進行描画_チップ_小節線_拍線(ref pChip);
3096                                 }
3097                                 else if (pChip[EChannel.MIDIChorus] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3098                                 {
3099                                         pChip.bHit = true;
3100                                 }
3101                                 else if (pChip[EChannel.FillIn])
3102                                 {
3103                                         this.t進行描画_チップ_フィルイン(ref pChip);
3104                                 }
3105                                 else if (pChip.bMovie && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))            // 動画全般
3106                                 {
3107                                         pChip.bHit = true;
3108                                         if (CDTXMania.Instance.ConfigIni.bAVI)
3109                                         {
3110                                                 if (CDTXMania.Instance.DTX.bチップがある.BGA)
3111                                                 {
3112                                                         this.actAVI.bHasBGA = true;
3113                                                 }
3114                                                 //this.actAVI.bFullScreenMovieCentering = (pChip.eチャンネル番号 == EChannel.MovieFull) ? true : CDTXMania.Instance.ConfigIni.bForceFullMovieCentering.Both;
3115                                                 //this.actAVI.bFullScreenMovieCentering = true;
3116                                                 //if (CDTXMania.Instance.ConfigIni.bForceScalingAVI)
3117                                                 //{
3118                                                 //      //if (!this.actAVI.bFullScreenMovieCentering)
3119                                                 //      //{
3120                                                 //              this.actAVI.nFullScreenMovieX = CDTXMania.Instance.ConfigIni.cdForceScaledMovieX.Both;
3121                                                 //              this.actAVI.nFullScreenMovieY = CDTXMania.Instance.ConfigIni.cdForceScaledMovieY.Both;
3122                                                 //      //}
3123                                                 //}
3124                                                 //if (pChip.eチャンネル番号 == EChannel.MovieFull || CDTXMania.Instance.ConfigIni.bForceScalingAVI)
3125                                                 //if (pChip.eチャンネル番号 == EChannel.MovieFull)
3126                                                 //{
3127                                                 //      this.actAVI.bFullScreenMovie = true;
3128                                                 //}
3129
3130                                                 if (pChip.eチャンネル番号 == EChannel.MovieFull)                 // 新movie(Fullscreen movie)の場合
3131                                                 {
3132                                                         this.actAVI.X      = 0;
3133                                                         this.actAVI.Y      = 0;
3134                                                         this.actAVI.Width  = SampleFramework.GameWindowSize.Width;
3135                                                         this.actAVI.Height = SampleFramework.GameWindowSize.Height;
3136 //Trace.TraceInformation("MovieFull:{0},{1},{2},{3}", this.actAVI.X, this.actAVI.Y, this.actAVI.Width, this.actAVI.Height);
3137                                                 }
3138                                                 else if (CDTXMania.Instance.ConfigIni.bForceScalingAVI)         // 旧AVIを拡大表示する場合
3139                                                 {
3140                                                         this.actAVI.X      = CDTXMania.Instance.ConfigIni.cdForceScaledMovieX[CDTXMania.Instance.ConfigIni.eActiveInst];
3141                                                         this.actAVI.Y      = CDTXMania.Instance.ConfigIni.cdForceScaledMovieY[CDTXMania.Instance.ConfigIni.eActiveInst];
3142                                                         this.actAVI.Width  = CDTXMania.Instance.ConfigIni.cdForceScaledMovieW[CDTXMania.Instance.ConfigIni.eActiveInst];
3143                                                         this.actAVI.Height = CDTXMania.Instance.ConfigIni.cdForceScaledMovieH[CDTXMania.Instance.ConfigIni.eActiveInst];
3144 //Trace.TraceInformation("ScaledAVI:{0},{1},{2},{3}", this.actAVI.X, this.actAVI.Y, this.actAVI.Width, this.actAVI.Height);
3145                                                 }
3146                                                 else                                                                                                            // 旧AVIをそのまま表示する場合
3147                                                 {
3148                                                         this.actAVI.X      = CDTXMania.Instance.ConfigIni.cdAVIX[CDTXMania.Instance.ConfigIni.eActiveInst];
3149                                                         this.actAVI.Y      = CDTXMania.Instance.ConfigIni.cdAVIY[CDTXMania.Instance.ConfigIni.eActiveInst];
3150                                                         this.actAVI.Width  = CDTXMania.Instance.Coordinates.Movie.W;
3151                                                         this.actAVI.Height = CDTXMania.Instance.Coordinates.Movie.H;
3152 //Trace.TraceInformation("NormalAVI:{0},{1},{2},{3}", this.actAVI.X, this.actAVI.Y, this.actAVI.Width, this.actAVI.Height);
3153                                                 }
3154
3155                                                 int startWidth  = !this.actAVI.bFullScreenMovie ? 278 : SampleFramework.GameWindowSize.Width;
3156                                                 int startHeight = !this.actAVI.bFullScreenMovie ? 355 : SampleFramework.GameWindowSize.Height;
3157
3158                                                 switch (pChip.eAVI種別)
3159                                                 {
3160                                                         case EAVIType.AVI:
3161                                                                 {
3162                                                                         this.actAVI.Start(pChip.eチャンネル番号, pChip.rAVI, startWidth, startHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms);
3163                                                                 }
3164                                                                 break;
3165
3166                                                         case EAVIType.AVIPAN:
3167                                                                 if (pChip.rAVIPan != null)
3168                                                                 {
3169                                                                         this.actAVI.Start(pChip.eチャンネル番号, pChip.rAVI, pChip.rAVIPan.sz開始サイズ.Width, pChip.rAVIPan.sz開始サイズ.Height, pChip.rAVIPan.sz終了サイズ.Width, pChip.rAVIPan.sz終了サイズ.Height, pChip.rAVIPan.pt動画側開始位置.X, pChip.rAVIPan.pt動画側開始位置.Y, pChip.rAVIPan.pt動画側終了位置.X, pChip.rAVIPan.pt動画側終了位置.Y, pChip.rAVIPan.pt表示側開始位置.X, pChip.rAVIPan.pt表示側開始位置.Y, pChip.rAVIPan.pt表示側終了位置.X, pChip.rAVIPan.pt表示側終了位置.Y, pChip.n総移動時間, pChip.n発声時刻ms);
3170                                                                 }
3171                                                                 break;
3172                                                 }
3173                                         }
3174                                 }
3175                                 else if (pChip.bSE && !pChip.bOverrideSE && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3176                                 {
3177                                         pChip.bHit = true;
3178                                         if (CDTXMania.Instance.ConfigIni.bBGMPlay)
3179                                         {
3180                                                 CDTXMania.Instance.DTX.tWavの再生停止(this.n最後に再生したBGMの実WAV番号[pChip.eチャンネル番号 - EChannel.SE01]);
3181                                                 CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
3182                                                 this.n最後に再生したBGMの実WAV番号[pChip.eチャンネル番号 - EChannel.SE01] = pChip.n整数値_内部番号;
3183                                         }
3184                                 }
3185                                 else if (pChip.bOverrideSE && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3186                                 {
3187                                         // override sound
3188                                         // mute sound (auto)
3189                                         // 4A: 84: HH (HO/HC)
3190                                         // 4B: 85: CY
3191                                         // 4C: 86: RD
3192                                         // 4D: 87: LC
3193                                         // 2A: 88: Gt
3194                                         // AA: 89: Bs
3195
3196                                         //      CDTXMania.Instance.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );
3197                                         //      CDTXMania.Instance.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );
3198                                         //      this.n最後に再生した実WAV番号.Guitar = pChip.n整数値_内部番号;
3199
3200                                         //      protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )
3201                                         pChip.bHit = true;
3202                                         EPart[] p = { EPart.Drums, EPart.Drums, EPart.Drums, EPart.Drums, EPart.Guitar, EPart.Bass };
3203
3204                                         EPart pp = p[pChip.eチャンネル番号 - EChannel.SE24];
3205
3206                                         //                                                      if ( pp == E楽器パート.DRUMS ) {                   // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。
3207                                         //                                                              //            HC    CY    RD    LC
3208                                         //                                                              int[] ch = { 0x11, 0x16, 0x19, 0x1A };
3209                                         //                                                              pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ]; 
3210                                         //                                                      }
3211                                         this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, CDTXMania.Instance.DTX.nモニタを考慮した音量(pp));
3212                                 }
3213
3214                                 else if (pChip.bBass可視チップ)
3215                                 {
3216                                         this.t進行描画_チップ_ギターベース(ref pChip, EPart.Bass);
3217                                 }
3218                                 else if (pChip[EChannel.Bass_Wailing])
3219                                 {
3220                                         this.t進行描画_チップ_ウェイリング(ref pChip);
3221                                 }
3222                                 else if (pChip[EChannel.Bass_WailingSound] && !pChip.bHit && (pChip.nバーからの距離dot.Bass < 0))
3223                                 {
3224                                         pChip.bHit = true;
3225                                         this.r現在の歓声Chip.Bass = pChip;
3226                                 }
3227                                 else if (pChip[EChannel.Guitar_NoChip] && !pChip.bHit && (pChip.nバーからの距離dot.Guitar < 0))
3228                                 {
3229                                         pChip.bHit = true;
3230                                         this.r現在の空うちギターChip = pChip;
3231                                         pChip.ConvertGBNoChip();
3232                                 }
3233                                 else if (pChip[EChannel.Bass_NoChip] && !pChip.bHit && (pChip.nバーからの距離dot.Bass < 0))
3234                                 {
3235                                         pChip.bHit = true;
3236                                         this.r現在の空うちベースChip = pChip;
3237                                         pChip.ConvertGBNoChip();
3238                                 }
3239                                 else if (pChip.bBGALayerSwap && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3240                                 {
3241                                         pChip.bHit = true;
3242                                         if ((CDTXMania.Instance.ConfigIni.bBGA && (pChip.eBGA種別 == EBGAType.BMP)) || (pChip.eBGA種別 == EBGAType.BMPTEX))
3243                                         {
3244                                                 this.actBGA.ChangeScope(pChip);
3245                                         }
3246                                 }
3247                                 else if (pChip[EChannel.MixerAdd] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3248                                 {
3249                                         //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
3250                                         pChip.bHit = true;
3251                                         if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号))    // 参照が遠いので後日最適化する
3252                                         {
3253                                                 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
3254                                                 //Debug.Write( "[AddMixer] BAR=" + pChip.n発声位置 / 384 + ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
3255
3256                                                 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)
3257                                                 {
3258                                                         if (wc.rSound[i] != null)
3259                                                         {
3260                                                                 //CDTXMania.Instance.Sound管理.AddMixer( wc.rSound[ i ] );
3261                                                                 AddMixer(wc.rSound[i], pChip.b演奏終了後も再生が続くチップである);
3262                                                         }
3263                                                         //else
3264                                                         //{
3265                                                         //    Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
3266                                                         //    break;
3267                                                         //}
3268                                                         //if ( i == nPolyphonicSounds - 1 )
3269                                                         //{
3270                                                         //    Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
3271                                                         //}
3272                                                 }
3273                                         }
3274                                 }
3275                                 else if (pChip[EChannel.MixerRemove] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3276                                 {
3277                                         //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );
3278                                         pChip.bHit = true;
3279                                         if (CDTXMania.Instance.DTX.listWAV.ContainsKey(pChip.n整数値_内部番号))    // 参照が遠いので後日最適化する
3280                                         {
3281                                                 CDTX.CWAV wc = CDTXMania.Instance.DTX.listWAV[pChip.n整数値_内部番号];
3282                                                 //Debug.Write( "[DelMixer] BAR=" + pChip.n発声位置 / 384 +  ", wav=" + Path.GetFileName( wc.strファイル名 ) + ", time=" + pChip.n発声時刻ms );
3283                                                 for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)
3284                                                 {
3285                                                         if (wc.rSound[i] != null)
3286                                                         {
3287                                                                 //CDTXMania.Instance.Sound管理.RemoveMixer( wc.rSound[ i ] );
3288                                                                 if (!wc.rSound[i].b演奏終了後も再生が続くチップである)   // #32248 2013.10.16 yyagi
3289                                                                 {                                                           // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。
3290                                                                         RemoveMixer(wc.rSound[i]);                          // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)
3291                                                                 }                                                           // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。
3292                                                         }
3293                                                         //else
3294                                                         //{
3295                                                         //    Debug.WriteLine( ", nPoly=" + i + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
3296                                                         //    break;
3297                                                         //}
3298                                                         //if ( i == nPolyphonicSounds - 1 )
3299                                                         //{
3300                                                         //    Debug.WriteLine( ", nPoly=" + nPolyphonicSounds + ", Mix=" + CDTXMania.Instance.Sound管理.GetMixingStreams() );
3301                                                         //}
3302                                                 }
3303                                         }
3304                                 }
3305                                 else if ( pChip[ EChannel.Click ] && !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
3306                                 {
3307                                         pChip.bHit = true;
3308                                         if ( CDTXMania.Instance.ConfigIni.eClickType != EClickType.Off )
3309                                         {
3310                                                 switch (pChip.n整数値)
3311                                                 {
3312                                                         case 1:
3313                                                                 CDTXMania.Instance.Skin.soundClickHigh.t再生する();
3314                                                                 break;
3315                                                         case 2:
3316                                                                 CDTXMania.Instance.Skin.soundClickLow.t再生する();
3317                                                                 break;
3318                                                 }
3319                                         }
3320                                 }
3321                                 else if (pChip[EChannel.FirstSoundChip] && !pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3322                                 {
3323                                         pChip.bHit = true;
3324                                         if (CDTXMania.Instance.DTX2WAVmode.Enabled)
3325                                         {
3326                                                 FDK.CSound管理.t録音開始();
3327                                                 Trace.TraceInformation("録音を開始しました。");
3328                                         }
3329                                 }
3330                                 else if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
3331                                 {
3332                                         // other chips
3333                                         pChip.bHit = true;
3334                                 }
3335                         }
3336                         return false;
3337                 }
3338
3339                 public void t再読込()
3340                 {
3341                         CDTXMania.Instance.DTX.t全チップの再生停止とミキサーからの削除();
3342                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.再読込_再演奏;
3343                         base.eフェーズID = CStage.Eフェーズ.演奏_再読込;
3344                         this.bPAUSE = false;
3345
3346                         // #34048 2014.7.16 yyagi
3347                         #region [ 読み込み画面に遷移する前に、設定変更した可能性があるパラメータをConfigIniクラスに書き戻す ]
3348                         for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
3349                         {
3350                                 CDTXMania.Instance.ConfigIni.nViewerScrollSpeed[i] = CDTXMania.Instance.ConfigIni.nScrollSpeed[i];
3351                         }
3352                         CDTXMania.Instance.ConfigIni.bDebugInfo = CDTXMania.Instance.ConfigIni.bViewerShowDebugStatus;
3353                         #endregion
3354                 }
3355
3356                 public void t停止()
3357                 {
3358                         CDTXMania.Instance.DTX.t全チップの再生停止とミキサーからの削除();
3359                         this.actAVI.Stop();
3360                         this.actBGA.Stop();
3361                         this.actPanel.Stop();               // PANEL表示停止
3362                         CDTXMania.Instance.Timer.t一時停止();       // 再生時刻カウンタ停止
3363
3364                         this.n現在のトップChip = CDTXMania.Instance.DTX.listChip.Count - 1;   // 終端にシーク
3365
3366                         // 自分自身のOn活性化()相当の処理もすべき。
3367                 }
3368
3369                 /// <summary>
3370                 /// 演奏位置を変更する。
3371                 /// </summary>
3372                 /// <param name="nStartBar">演奏開始小節番号</param>
3373                 /// <param name="bResetHitStatus">演奏済み情報(bHit)をクリアするかどうか</param>
3374                 public void t演奏位置の変更(int nStartBar)
3375                 {
3376                         // まず全サウンドオフにする
3377                         CDTXMania.Instance.DTX.t全チップの再生停止();
3378                         this.actAVI.Stop();
3379                         this.actBGA.Stop();
3380
3381                         #region [ 再生開始小節の変更 ]
3382                         // +1が必要
3383                         nStartBar++;
3384
3385                         #region [ 演奏済みフラグのついたChipをリセットする ]
3386                         for (int i = 0; i < CDTXMania.Instance.DTX.listChip.Count; i++)
3387                         {
3388                                 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
3389                                 if (pChip.bHit)
3390                                 {
3391                                         CChip p = (CChip)pChip.Clone();
3392                                         p.bHit = false;
3393                                         CDTXMania.Instance.DTX.listChip[i] = p;
3394                                 }
3395                         }
3396                         #endregion
3397
3398                         #region [ 処理を開始するチップの特定 ]
3399                         //for ( int i = this.n現在のトップChip; i < CDTXMania.Instance.DTX.listChip.Count; i++ )
3400                         bool bSuccessSeek = false;
3401                         for (int i = 0; i < CDTXMania.Instance.DTX.listChip.Count; i++)
3402                         {
3403                                 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
3404                                 if (pChip.n発声位置 < 384 * nStartBar)
3405                                 {
3406                                         continue;
3407                                 }
3408                                 else
3409                                 {
3410                                         bSuccessSeek = true;
3411                                         this.n現在のトップChip = i;
3412                                         break;
3413                                 }
3414                         }
3415                         if (!bSuccessSeek)
3416                         {
3417                                 // this.n現在のトップChip = CDTXMania.Instance.DTX.listChip.Count - 1;
3418                                 this.n現在のトップChip = 0;       // 対象小節が存在しないなら、最初から再生
3419                         }
3420                         #endregion
3421
3422                         #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]
3423                         int nStartTime = CDTXMania.Instance.DTX.listChip[this.n現在のトップChip].n発声時刻ms;
3424
3425                         CSound管理.rc演奏用タイマ.tリセット();  // これでPAUSE解除されるので、次のPAUSEチェックは不要
3426                                                                                                                                         //if ( !this.bPAUSE )
3427                                                                                                                                         //{
3428                         CSound管理.rc演奏用タイマ.t一時停止();
3429                         //}
3430                         CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
3431                         #endregion
3432
3433                         List<CSound> pausedCSound = new List<CSound>();
3434
3435                         #region [ BGMやギターなど、演奏開始のタイミングで再生がかかっているサウンドのの途中再生開始 ] // (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと)
3436                         for (int i = this.n現在のトップChip; i >= 0; i--)
3437                         {
3438                                 CChip pChip = CDTXMania.Instance.DTX.listChip[i];
3439                                 int nDuration = pChip.GetDuration();
3440
3441                                 if ((pChip.n発声時刻ms + nDuration > 0) && (pChip.n発声時刻ms <= nStartTime) && (nStartTime <= pChip.n発声時刻ms + nDuration))
3442                                 {
3443                                         if (pChip.bWAVを使うチャンネルである && !pChip.b空打ちチップである) // wav系チャンネル、且つ、空打ちチップではない
3444                                         {
3445                                                 CDTX.CWAV wc;
3446                                                 bool b = CDTXMania.Instance.DTX.listWAV.TryGetValue(pChip.n整数値_内部番号, out wc);
3447                                                 if (!b) continue;
3448
3449                                                 if ((wc.bIsBGMSound && CDTXMania.Instance.ConfigIni.bBGMPlay) || (!wc.bIsBGMSound))
3450                                                 {
3451                                                         CDTXMania.Instance.DTX.tチップの再生(pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
3452                                                         #region [ PAUSEする ]
3453                                                         int j = wc.n現在再生中のサウンド番号;
3454                                                         if (wc.rSound[j] != null)
3455                                                         {
3456                                                                 wc.rSound[j].t再生を一時停止する();
3457                                                                 wc.rSound[j].t再生位置を変更する(nStartTime - pChip.n発声時刻ms);
3458                                                                 pausedCSound.Add(wc.rSound[j]);
3459                                                         }
3460                                                         #endregion
3461                                                 }
3462                                         }
3463                                 }
3464                         }
3465                         #endregion
3466                         #region [ 演奏開始時点で既に表示されているBGAとAVIの、シークと再生 ]
3467                         this.actBGA.SkipStart(nStartTime);
3468                         this.actAVI.SkipStart(nStartTime);
3469                         #endregion
3470                         #region [ PAUSEしていたサウンドを一斉に再生再開する(ただしタイマを止めているので、ここではまだ再生開始しない) ]
3471                         foreach (CSound cs in pausedCSound)
3472                         {
3473                                 cs.tサウンドを再生する();
3474                         }
3475                         pausedCSound.Clear();
3476                         pausedCSound = null;
3477                         #endregion
3478                         #region [ タイマを再開して、PAUSEから復帰する ]
3479                         CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;
3480                         CDTXMania.Instance.Timer.tリセット();                       // これでPAUSE解除されるので、3行先の再開()は不要
3481                         CDTXMania.Instance.Timer.n現在時刻 = nStartTime;                // Debug表示のTime: 表記を正しくするために必要
3482                         CSound管理.rc演奏用タイマ.t再開();
3483                         //CDTXMania.Instance.Timer.t再開();
3484                         this.bPAUSE = false;                                // システムがPAUSE状態だったら、強制解除
3485                         this.actPanel.Start();
3486                         #endregion
3487                         #endregion
3488                 }
3489
3490
3491                 /// <summary>
3492                 /// DTXV用の設定をする。(全AUTOなど)
3493                 /// 元の設定のバックアップなどはしないので、あとでConfig.iniを上書き保存しないこと。
3494                 /// </summary>
3495                 protected void tDTXV用の設定()
3496                 {
3497                         for (EPad i = EPad.Min; i < EPad.Max; ++i)
3498                         {
3499                                 CDTXMania.Instance.ConfigIni.bAutoPlay[i].Value = true;
3500                         }
3501                         CDTXMania.Instance.ConfigIni.bAVI.Value = true;
3502                         CDTXMania.Instance.ConfigIni.bBGA.Value = true;
3503                         for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
3504                         {
3505                                 CDTXMania.Instance.ConfigIni.bGraph[i].Value = false;
3506                                 CDTXMania.Instance.ConfigIni.eSudHidInv[i].Value = ESudHidInv.Off;
3507                                 CDTXMania.Instance.ConfigIni.bLight[i].Value = false;
3508                                 CDTXMania.Instance.ConfigIni.bReverse[i].Value = false;
3509                                 CDTXMania.Instance.ConfigIni.eRandom[i].Value = ERandom.Off;
3510                                 CDTXMania.Instance.ConfigIni.nMinComboDisp[i].Value = 65535;
3511                                 CDTXMania.Instance.ConfigIni.bDisplayJudge[i].Value = false;
3512                                 CDTXMania.Instance.ConfigIni.bDisplayCombo[i].Value = false;
3513                         }
3514                         CDTXMania.Instance.ConfigIni.eDark.Value = EDark.Off;
3515                         CDTXMania.Instance.ConfigIni.bDebugInfo.Value = CDTXMania.Instance.ConfigIni.bViewerShowDebugStatus;
3516                         CDTXMania.Instance.ConfigIni.bFillin.Value = true;
3517                         CDTXMania.Instance.ConfigIni.bScoreIni.Value = false;
3518                         CDTXMania.Instance.ConfigIni.bStageFailed.Value = false;
3519                         CDTXMania.Instance.ConfigIni.bTight.Value = false;
3520                         CDTXMania.Instance.ConfigIni.bStoicMode.Value = false;
3521                         CDTXMania.Instance.ConfigIni.bDrumsHitSound.Value = true;
3522                         CDTXMania.Instance.ConfigIni.bBGMPlay.Value = true;
3523                         CDTXMania.Instance.ConfigIni.nRisky.Value = 0;
3524                         CDTXMania.Instance.ConfigIni.nShowLagType.Value = EShowLagType.Off;
3525                 }
3526
3527                 private void t進行描画_チップ_ウェイリング(ref CChip pChip)
3528                 {
3529                         if (CDTXMania.Instance.ConfigIni.bGuitar有効 && (!CDTXMania.Instance.DTX2WAVmode.Enabled))
3530                         {
3531                                 EPart indexInst = pChip.bGuitar可視チップ_Wailing含む ? EPart.Guitar : EPart.Bass;
3532                                 #region [ Sud Hid Inv 処理 ]
3533                                 if (
3534                                         CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.FullInv ||
3535                                         CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.SemiInv)
3536                                 {
3537                                         cInvisibleChip.SetInvisibleStatus(ref pChip);
3538                                 }
3539                                 else
3540                                 {
3541                                         if (CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.Sudden ||
3542                                                 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.SudHid)
3543                                         {
3544                                                 pChip.b可視 = (pChip.nバーからの距離dot[indexInst] < CDTXMania.Instance.ConfigIni.nSuddenFrom[indexInst]);
3545                                         }
3546                                         if (CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.Hidden ||
3547                                                 CDTXMania.Instance.ConfigIni.eSudHidInv[indexInst] == ESudHidInv.SudHid)
3548                                         {
3549                                                 pChip.b可視 = pChip.nバーからの距離dot[indexInst] >= CDTXMania.Instance.ConfigIni.nHiddenFrom[indexInst];
3550                                         }
3551                                 }
3552                                 #endregion
3553                                 cWailingChip[(int)indexInst].t進行描画_チップ_ウェイリング(ref pChip, ref txチップGB, ref ctWailingチップ模様アニメ);
3554
3555                                 if (!pChip.bHit && (pChip.nバーからの距離dot[indexInst] < 0))
3556                                 {
3557                                         if (pChip.nバーからの距離dot[indexInst] < -234 * Scale.Y)  // #25253 2011.5.29 yyagi: Don't set pChip.bHit=true for wailing at once. It need to 1sec-delay (234pix per 1sec). 
3558                                         {
3559                                                 pChip.bHit = true;
3560                                         }
3561                                         bool autoW = (indexInst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail : CDTXMania.Instance.ConfigIni.bAutoPlay.BsWail;
3562                                         if (autoW)
3563                                         {
3564                                                 // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.
3565                                                 // pChip.bHit = true;
3566                                                 // this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );
3567                                                 // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.
3568                                                 // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time
3569                                                 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
3570                                                 DoWailingFromQueue(indexInst, nTimeStamp_Wailed, autoW);
3571                                         }
3572                                         cInvisibleChip.StartSemiInvisible(indexInst);
3573                                 }
3574                                 return;
3575                         }
3576                         pChip.bHit = true;
3577                 }
3578
3579                 protected void t進行描画_チップアニメ()
3580                 {
3581                         for (EPart i = EPart.Drums; i <= EPart.Bass; i++)            // 0=drums, 1=guitar, 2=bass
3582                         {
3583                                 if (this.ctチップ模様アニメ[i] != null)
3584                                 {
3585                                         this.ctチップ模様アニメ[i].t進行Loop();
3586                                 }
3587                         }
3588                         if (this.ctWailingチップ模様アニメ != null)
3589                         {
3590                                 this.ctWailingチップ模様アニメ.t進行Loop();
3591                         }
3592                 }
3593
3594                 protected bool t進行描画_フェードイン_アウト()
3595                 {
3596                         switch (base.eフェーズID)
3597                         {
3598                                 case CStage.Eフェーズ.共通_フェードイン:
3599                                         if (this.actFI.On進行描画() != 0)
3600                                         {
3601                                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
3602                                         }
3603                                         break;
3604
3605                                 case CStage.Eフェーズ.共通_フェードアウト:
3606                                 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:
3607                                         if (this.actFO.On進行描画() != 0)
3608                                         {
3609                                                 return true;
3610                                         }
3611                                         break;
3612
3613                                 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:
3614                                         if (this.actFOClear.On進行描画() == 0)
3615                                         {
3616                                                 break;
3617                                         }
3618                                         return true;
3619
3620                         }
3621                         return false;
3622                 }
3623
3624                 protected virtual void t入力処理_ギターベース(EPart inst)
3625                 {
3626                         #region [ スクロール速度変更 ]
3627                         int scrollSpeed = CDTXMania.Instance.ConfigIni.nScrollSpeed[inst];
3628                         bool scrollSpeedChanged = false;
3629                         float f = (float)CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[inst] / (scrollSpeed + 1);
3630                         if (
3631                                 CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtDecide : EPad.BsDecide) &&
3632                                 CDTXMania.Instance.Pad.b押された(inst == EPart.Guitar ? EPad.GtB : EPad.BsB)
3633                                 )
3634                         {
3635                                 CDTXMania.Instance.ConfigIni.nScrollSpeed[inst].Value = scrollSpeed + 1;
3636                                 if (scrollSpeed < CDTXMania.Instance.ConfigIni.nScrollSpeed[inst])
3637                                 {
3638                                         scrollSpeedChanged = true;
3639                                 }
3640                         }
3641                         if (
3642                                 CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtDecide : EPad.BsDecide) &&
3643                                 CDTXMania.Instance.Pad.b押された(inst == EPart.Guitar ? EPad.GtR : EPad.BsR)
3644                                 )
3645                         {
3646                                 CDTXMania.Instance.ConfigIni.nScrollSpeed[inst].Value = scrollSpeed - 1;
3647                                 if (scrollSpeed > CDTXMania.Instance.ConfigIni.nScrollSpeed[inst])
3648                                 {
3649                                         scrollSpeedChanged = true;
3650                                 }
3651                         }
3652                         if (scrollSpeedChanged)
3653                         {
3654                                 // 判定ラインも付随
3655                                 CDTXMania.Instance.ConfigIni.nJudgeLinePosOffset[inst].Value = (int)(f * CDTXMania.Instance.ConfigIni.nScrollSpeed[inst] + 0.5);
3656                         }
3657                         #endregion
3658
3659                         if (!CDTXMania.Instance.ConfigIni.bGuitar有効 || !CDTXMania.Instance.DTX.bチップがある[inst])
3660                         {
3661                                 return;
3662                         }
3663
3664                         int R = (inst == EPart.Guitar) ? 0 : 3;
3665                         int G = R + 1;
3666                         int B = R + 2;
3667                         bool autoW = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail : CDTXMania.Instance.ConfigIni.bAutoPlay.BsWail;
3668                         bool autoR = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtR : CDTXMania.Instance.ConfigIni.bAutoPlay.BsR;
3669                         bool autoG = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtG : CDTXMania.Instance.ConfigIni.bAutoPlay.BsG;
3670                         bool autoB = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtB : CDTXMania.Instance.ConfigIni.bAutoPlay.BsB;
3671                         bool autoPick = (inst == EPart.Guitar) ? CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick : CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick;
3672                         int nAutoW = (autoW) ? 8 : 0;
3673                         int nAutoR = (autoR) ? 4 : 0;
3674                         int nAutoG = (autoG) ? 2 : 0;
3675                         int nAutoB = (autoB) ? 1 : 0;
3676                         int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;
3677
3678                         CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);
3679                         if (chip != null)
3680                         {
3681                                 if ((chip.bGuitarBass_R) && autoR)
3682                                 {
3683                                         this.actLaneFlushGB.Start(R);
3684                                         this.actRGB.Push(R);
3685                                 }
3686                                 if ((chip.bGuitarBass_G) && autoG)
3687                                 {
3688                                         this.actLaneFlushGB.Start(G);
3689                                         this.actRGB.Push(G);
3690                                 }
3691                                 if ((chip.bGuitarBass_B) && autoB)
3692                                 {
3693                                         this.actLaneFlushGB.Start(B);
3694                                         this.actRGB.Push(B);
3695                                 }
3696                         }
3697
3698                         int pressingR = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtR : EPad.BsR) ? 4 : 0;
3699                         this.t入力メソッド記憶(inst);
3700                         int pressingG = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtG : EPad.BsG) ? 2 : 0;
3701                         this.t入力メソッド記憶(inst);
3702                         int pressingB = CDTXMania.Instance.Pad.b押されている(inst == EPart.Guitar ? EPad.GtB : EPad.BsB) ? 1 : 0;
3703                         this.t入力メソッド記憶(inst);
3704                         int pressingRGB = pressingR | pressingG | pressingB;
3705                         if (pressingR != 0)
3706                         {
3707                                 this.actLaneFlushGB.Start(R);
3708                                 this.actRGB.Push(R);
3709                         }
3710                         if (pressingG != 0)
3711                         {
3712                                 this.actLaneFlushGB.Start(G);
3713                                 this.actRGB.Push(G);
3714                         }
3715                         if (pressingB != 0)
3716                         {
3717                                 this.actLaneFlushGB.Start(B);
3718                                 this.actRGB.Push(B);
3719                         }
3720                         // auto pickだとここから先に行かないので注意
3721                         List<STInputEvent> events = CDTXMania.Instance.Pad.GetEvents(inst == EPart.Guitar ? EPad.GtPick : EPad.BsPick);
3722                         if ((events != null) && (events.Count > 0))
3723                         {
3724                                 foreach (STInputEvent eventPick in events)
3725                                 {
3726                                         if (!eventPick.b押された)
3727                                         {
3728                                                 continue;
3729                                         }
3730                                         this.t入力メソッド記憶(inst);
3731                                         long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
3732                                         EChannel chWailingSound = (inst == EPart.Guitar) ? EChannel.Guitar_WailingSound : EChannel.Bass_WailingSound;
3733
3734                                         // WailingSound チャンネルでE楽器パート.GUITARなチップ全てにヒットする
3735                                         CChip pChip = this.r指定時刻に一番近い未ヒットChip(
3736                                                         nTime, chWailingSound,
3737                                                         CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst],
3738                                                         CDTXMania.Instance.nPoor範囲ms + 1);
3739
3740                                         EJudge e判定 = this.e指定時刻からChipのJUDGEを返す(nTime, pChip,
3741                                                         CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst]);
3742                                         //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号,  ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );
3743                                         if (
3744                                                         (pChip != null) &&
3745                                                         ((((int)pChip.eチャンネル番号 & ~nAutoMask) & 0x0F) == ((pressingRGB & ~nAutoMask) & 0x0F)) &&
3746                                                         (e判定 != EJudge.Miss))
3747                                         {
3748                                                 bool bChipHasR = pChip.bGuitarBass_R;
3749                                                 bool bChipHasG = pChip.bGuitarBass_G;
3750                                                 bool bChipHasB = pChip.bGuitarBass_B;
3751                                                 bool bChipHasW = pChip.bGuitarBass_Wailing;
3752                                                 bool bChipIsO = pChip.bGuitarBass_Open;
3753                                                 bool bSuccessOPEN = bChipIsO && (autoR || pressingR == 0) && (autoG || pressingG == 0) && (autoB || pressingB == 0);
3754                                                 if ((bChipHasR && (autoR || pressingR != 0)) || bSuccessOPEN)
3755                                                 {
3756                                                         this.actChipFireGB.Start(R);
3757                                                 }
3758                                                 if ((bChipHasG && (autoG || pressingG != 0)) || bSuccessOPEN)
3759                                                 {
3760                                                         this.actChipFireGB.Start(G);
3761                                                 }
3762                                                 if ((bChipHasB && (autoB || pressingB != 0)) || bSuccessOPEN)
3763                                                 {
3764                                                         this.actChipFireGB.Start(B);
3765                                                 }
3766                                                 this.tチップのヒット処理(nTime, pChip);
3767                                                 this.tサウンド再生(pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound[inst], e判定 == EJudge.Poor);
3768                                                 EChannel chWailingChip = (inst == EPart.Guitar) ? EChannel.Guitar_Wailing : EChannel.Bass_Wailing;
3769                                                 CChip item = this.r指定時刻に一番近い未ヒットChip(nTime, chWailingChip, CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst], 140);
3770                                                 if (item != null)
3771                                                 {
3772                                                         this.queWailing[inst].Enqueue(item);
3773                                                 }
3774                                                 continue;
3775                                         }
3776
3777                                         // 以下、間違いレーンでのピック時
3778                                         CChip NoChipPicked = (inst == EPart.Guitar) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;
3779                                         if ((NoChipPicked != null) || ((NoChipPicked = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nTime, chWailingSound, CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs[inst])) != null))
3780                                         {
3781                                                 this.tサウンド再生(NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound[inst], true);
3782                                         }
3783                                         if (!CDTXMania.Instance.ConfigIni.bLight[inst])
3784                                         {
3785                                                 this.tチップのヒット処理_BadならびにTight時のMiss(inst);
3786                                         }
3787                                 }
3788                         }
3789                         List<STInputEvent> list = CDTXMania.Instance.Pad.GetEvents(inst == EPart.Guitar ? EPad.GtWail : EPad.BsWail);
3790                         if ((list != null) && (list.Count > 0))
3791                         {
3792                                 foreach (STInputEvent eventWailed in list)
3793                                 {
3794                                         if (!eventWailed.b押された)
3795                                         {
3796                                                 continue;
3797                                         }
3798                                         DoWailingFromQueue(inst, eventWailed.nTimeStamp, autoW);
3799                                 }
3800                         }
3801                 }
3802
3803                 private void DoWailingFromQueue(EPart inst, long nTimeStamp_Wailed, bool autoW)
3804                 {
3805                         long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
3806                         CChip chipWailing;
3807                         while ((this.queWailing[inst].Count > 0) && ((chipWailing = this.queWailing[inst].Dequeue()) != null))
3808                         {
3809                                 if ((nTimeWailed - chipWailing.n発声時刻ms) <= 1000)        // #24245 2011.1.26 yyagi: 800 -> 1000
3810                                 {
3811                                         chipWailing.bHit = true;
3812                                         this.actWailingBonus.Start(inst, this.r現在の歓声Chip[inst]);
3813                                         if (!autoW)
3814                                         {
3815                                                 int nCombo = (this.actCombo.dgbコンボ数[inst].n現在値 < 500) ? this.actCombo.dgbコンボ数[inst].n現在値 : 500;
3816                                                 // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions
3817                                                 this.actScore.Add(inst, nCombo * 3000L);
3818                                         }
3819                                 }
3820                         }
3821                 }
3822
3823
3824
3825                 // t入力処理・ドラム()からメソッドを抽出したもの。
3826                 /// <summary>
3827                 /// chipArrayの中を, n発生位置の小さい順に並べる + nullを大きい方に退かす。セットでe判定Arrayも並べ直す。
3828                 /// </summary>
3829                 /// <param name="chipArray">ソート対象chip群</param>
3830                 /// <param name="e判定Array">ソート対象e判定群</param>
3831                 /// <param name="NumOfChips">チップ数</param>
3832                 private static void SortChipsByNTime(CChip[] chipArray, EJudge[] e判定Array, int NumOfChips)
3833                 {
3834                         for (int i = 0; i < NumOfChips - 1; i++)
3835                         {
3836                                 for (int j = NumOfChips - 1; j > i; j--)
3837                                 {
3838                                         if ((chipArray[j - 1] == null) || ((chipArray[j] != null) && (chipArray[j - 1].n発声位置 > chipArray[j].n発声位置)))
3839                                         {
3840                                                 // swap
3841                                                 CChip chipTemp = chipArray[j - 1];
3842                                                 chipArray[j - 1] = chipArray[j];
3843                                                 chipArray[j] = chipTemp;
3844                                                 EJudge e判定Temp = e判定Array[j - 1];
3845                                                 e判定Array[j - 1] = e判定Array[j];
3846                                                 e判定Array[j] = e判定Temp;
3847                                         }
3848                                 }
3849                         }
3850                 }
3851                 private bool tドラムヒット処理(long nHitTime, EPad type, CChip pChip, int n強弱度合い0to127)
3852                 {
3853                         if (pChip == null)
3854                         {
3855                                 return false;
3856                         }
3857                         // Ech定義 channel = pChip.eチャンネル番号;
3858                         int index = -1;
3859                         if (pChip.bDrums可視チップ_LP_LBD含まない)
3860                         {
3861                                 index = pChip.nDrumsIndex;
3862                         }
3863                         else if (pChip.bDrums不可視チップ_LP_LBD含まない)
3864                         {
3865                                 index = pChip.nDrumsIndexHidden;
3866                         }
3867                         ELane eLane = EnumConverter.LaneFromChannel(index + EChannel.HiHatClose);// nチャンネル0Atoレーン07[index];
3868                         EPad ePad = EnumConverter.PadFromChannel(index + EChannel.HiHatClose); //nチャンネル0Atoパッド08[index];
3869                         bool bPChipIsAutoPlay = CDTXMania.Instance.ConfigIni.bAutoPlay[ePad];
3870                         int nInputAdjustTime = bPChipIsAutoPlay ? 0 : CDTXMania.Instance.ConfigIni.nInputAdjustTimeMs.Drums;
3871                         EJudge e判定 = this.e指定時刻からChipのJUDGEを返す(nHitTime, pChip, nInputAdjustTime);
3872                         if (e判定 == EJudge.Miss)
3873                         {
3874                                 return false;
3875                         }
3876                         this.tチップのヒット処理(nHitTime, pChip);
3877                         this.actLaneFlushD.Start(eLane, ((float)n強弱度合い0to127) / 127f);
3878                         this.actPad.Hit(ePad);
3879                         if ((e判定 != EJudge.Poor) && (e判定 != EJudge.Miss))
3880                         {
3881                                 bool flag = this.bフィルイン中;
3882                                 bool flag2 = this.bフィルイン中 && this.bフィルイン区間の最後のChipである(pChip);
3883                                 // bool flag3 = flag2;
3884                                 // #31602 2013.6.24 yyagi 判定ラインの表示位置をずらしたら、チップのヒットエフェクトの表示もずらすために、nJudgeLine..を追加
3885                                 this.actChipFireD.Start(eLane, flag, flag2, flag2);
3886                         }
3887                         if (CDTXMania.Instance.ConfigIni.bDrumsHitSound)
3888                         {
3889                                 CChip rChip = null;
3890                                 bool bIsChipsoundPriorToPad = true;
3891                                 if (((type == EPad.HH) || (type == EPad.HHO)) || (type == EPad.LC))
3892                                 {
3893                                         bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityHH == EHitSoundPriority.Chip;
3894                                 }
3895                                 else if ((type == EPad.LT) || (type == EPad.FT))
3896                                 {
3897                                         bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityFT == EHitSoundPriority.Chip;
3898                                 }
3899                                 else if ((type == EPad.CY) || (type == EPad.RD))
3900                                 {
3901                                         bIsChipsoundPriorToPad = CDTXMania.Instance.ConfigIni.eHitSoundPriorityCY == EHitSoundPriority.Chip;
3902                                 }
3903                                 if (bIsChipsoundPriorToPad)
3904                                 {
3905                                         rChip = pChip;
3906                                 }
3907                                 else
3908                                 {
3909                                         EPad hH = type;
3910                                         if (!CDTXMania.Instance.DTX.bチップがある.HHOpen && (type == EPad.HHO))
3911                                         {
3912                                                 hH = EPad.HH;
3913                                         }
3914                                         if (!CDTXMania.Instance.DTX.bチップがある.Ride && (type == EPad.RD))
3915                                         {
3916                                                 hH = EPad.CY;
3917                                         }
3918                                         if (!CDTXMania.Instance.DTX.bチップがある.LeftCymbal && (type == EPad.LC))
3919                                         {
3920                                                 hH = EPad.HH;
3921                                         }
3922                                         rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮(nHitTime, EnumConverter.ChannelFromPad(hH), nInputAdjustTime);
3923                                         if (rChip == null)
3924                                         {
3925                                                 rChip = pChip;
3926                                         }
3927                                 }
3928                                 this.tサウンド再生(rChip, CSound管理.rc演奏用タイマ.nシステム時刻, EPart.Drums, CDTXMania.Instance.ConfigIni.nChipVolume, CDTXMania.Instance.ConfigIni.bEmphasizePlaySound.Drums);
3929                         }
3930                         return true;
3931                 }
3932
3933                 protected bool bフィルイン区間の最後のChipである(CChip pChip)
3934                 {
3935                         if (pChip == null)
3936                         {
3937                                 return false;
3938                         }
3939                         int num = pChip.n発声位置;
3940                         for (int i = CDTXMania.Instance.DTX.listChip.IndexOf(pChip) + 1; i < CDTXMania.Instance.DTX.listChip.Count; i++)
3941                         {
3942                                 pChip = CDTXMania.Instance.DTX.listChip[i];
3943                                 if ((pChip[EChannel.FillIn]) && (pChip.n整数値 == 2))
3944                                 {
3945                                         return true;
3946                                 }
3947                                 if ((pChip.bDrums可視チップ_LP_LBD含まない) && (pChip.n発声位置 - num) > 0x18)
3948                                 {
3949                                         return false;
3950                                 }
3951                         }
3952                         return true;
3953                 }
3954
3955                 private void t進行描画_チップ_フィルイン(ref CChip pChip)
3956                 {
3957                         if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
3958                         {
3959                                 pChip.bHit = true;
3960
3961                                 if (CDTXMania.Instance.ConfigIni.bDrums有効)
3962                                 {
3963                                         switch (pChip.n整数値)
3964                                         {
3965                                                 case 0x01:  // フィルイン開始
3966                                                         if (CDTXMania.Instance.ConfigIni.bFillin)
3967                                                         {
3968                                                                 this.bフィルイン中 = true;
3969                                                         }
3970                                                         break;
3971
3972                                                 case 0x02:  // フィルイン終了
3973                                                         if (CDTXMania.Instance.ConfigIni.bFillin)
3974                                                         {
3975                                                                 this.bフィルイン中 = false;
3976                                                         }
3977                                                         if (((this.actCombo.dgbコンボ数.Drums.n現在値 > 0) || CDTXMania.Instance.ConfigIni.bIsAutoPlay(EPart.Drums)) && CDTXMania.Instance.ConfigIni.bAudience)
3978                                                         {
3979                                                                 if (this.r現在の歓声Chip.Drums != null)
3980                                                                 {
3981                                                                         CDTXMania.Instance.DTX.tチップの再生(this.r現在の歓声Chip.Drums, CSound管理.rc演奏用タイマ.nシステム時刻, CDTXMania.Instance.DTX.nモニタを考慮した音量(EPart.Unknown));
3982                                                                 }
3983                                                                 else
3984                                                                 {
3985                                                                         CDTXMania.Instance.Skin.sound歓声音.n位置_次に鳴るサウンド = 0;
3986                                                                         CDTXMania.Instance.Skin.sound歓声音.t再生する();
3987                                                                 }
3988                                                         }
3989                                                         break;
3990 #if TEST_NOTEOFFMODE  // 2011.1.1 yyagi TEST
3991                                                                 case 0x04:      // HH消音あり(従来同等)
3992                                                                         CDTXMania.Instance.DTX.b演奏で直前の音を消音する.HH = true;
3993                                                                         break;
3994                                                                 case 0x05:      // HH消音無し
3995                                                                         CDTXMania.Instance.DTX.b演奏で直前の音を消音する.HH = false;
3996                                                                         break;
3997                                                                 case 0x06:      // ギター消音あり(従来同等)
3998                                                                         CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Gutiar = true;
3999                                                                         break;
4000                                                                 case 0x07:      // ギター消音無し
4001                                                                         CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Gutiar = false;
4002                                                                         break;
4003                                                                 case 0x08:      // ベース消音あり(従来同等)
4004                                                                         CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Bass = true;
4005                                                                         break;
4006                                                                 case 0x09:      // ベース消音無し
4007                                                                         CDTXMania.Instance.DTX.b演奏で直前の音を消音する.Bass = false;
4008                                                                         break;
4009 #endif
4010                                         }
4011                                 }
4012                         }
4013                 }
4014         }
4015 }