OSDN Git Service

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