OSDN Git Service

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