OSDN Git Service

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