OSDN Git Service

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