OSDN Git Service

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