OSDN Git Service

#24820 Config.iniのHHGroupの説明が古かったのを修正。また、一部説明の英文化を進めた。
[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 class CStage演奏画面共通 : CStage\r
21         {\r
22                 // プロパティ\r
23 \r
24                 public bool bAUTOでないチップが1つでもバーを通過した\r
25                 {\r
26                         get;\r
27                         protected set;\r
28                 }\r
29 \r
30                 // メソッド\r
31 \r
32                 #region [ t演奏結果を格納する・ドラム() ]\r
33                 public void t演奏結果を格納する・ドラム( out CScoreIni.C演奏記録 Drums )\r
34                 {\r
35                         Drums = new CScoreIni.C演奏記録();\r
36 \r
37                         if ( CDTXMania.DTX.bチップがある.Drums && !CDTXMania.ConfigIni.bギタレボモード )\r
38                         {\r
39                                 Drums.nスコア = (long) this.actScore.Get( E楽器パート.DRUMS );\r
40                                 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Drums, CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数・Auto含まない.Drums.Perfect, this.actCombo.n現在のコンボ数.Drums最高値, E楽器パート.DRUMS, bIsAutoPlay );\r
41                                 Drums.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.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
42                                 Drums.nPerfect数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Perfect : this.nヒット数・Auto含まない.Drums.Perfect;\r
43                                 Drums.nGreat数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Great : this.nヒット数・Auto含まない.Drums.Great;\r
44                                 Drums.nGood数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Good : this.nヒット数・Auto含まない.Drums.Good;\r
45                                 Drums.nPoor数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Poor : this.nヒット数・Auto含まない.Drums.Poor;\r
46                                 Drums.nMiss数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Miss : this.nヒット数・Auto含まない.Drums.Miss;\r
47                                 Drums.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Drums.Perfect;\r
48                                 Drums.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Drums.Great;\r
49                                 Drums.nGood数・Auto含まない = this.nヒット数・Auto含まない.Drums.Good;\r
50                                 Drums.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Drums.Poor;\r
51                                 Drums.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Drums.Miss;\r
52                                 Drums.n最大コンボ数 = this.actCombo.n現在のコンボ数.Drums最高値;\r
53                                 Drums.n全チップ数 = CDTXMania.DTX.n可視チップ数.Drums;\r
54                                 for ( int i = 0; i < (int) Eレーン.MAX;  i++ )\r
55                                 {\r
56                                         Drums.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
57                                 }\r
58                                 Drums.bTight = CDTXMania.ConfigIni.bTight;\r
59                                 for ( int i = 0; i < 3; i++ )\r
60                                 {\r
61                                         Drums.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
62                                         Drums.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
63                                         Drums.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
64                                         Drums.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
65                                         Drums.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
66                                         Drums.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
67                                         Drums.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
68                                 }\r
69                                 Drums.eDark = CDTXMania.ConfigIni.eDark;\r
70                                 Drums.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
71                                 Drums.n演奏速度分母 = 20;\r
72                                 Drums.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
73                                 Drums.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
74                                 Drums.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
75                                 Drums.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
76                                 Drums.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
77                                 Drums.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
78                                 Drums.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
79                                 Drums.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
80                                 Drums.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
81                                 Drums.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
82                                 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;\r
83                                 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;\r
84                                 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;\r
85                                 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;\r
86                                 Drums.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
87                                 Drums.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
88                                 Drums.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
89                                 Drums.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
90                                 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;\r
91                                 Drums.最終更新日時 = DateTime.Now.ToString();\r
92                                 Drums.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Drums );\r
93                         }\r
94                 }\r
95                 #endregion\r
96                 #region [ t演奏結果を格納する・ギター() ]\r
97                 public void t演奏結果を格納する・ギター( out CScoreIni.C演奏記録 Guitar )\r
98                 {\r
99                         Guitar = new CScoreIni.C演奏記録();\r
100 \r
101                         if ( CDTXMania.DTX.bチップがある.Guitar )\r
102                         {\r
103                                 Guitar.nスコア = (long) this.actScore.Get( E楽器パート.GUITAR );\r
104                                 Guitar.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Guitar, CDTXMania.DTX.n可視チップ数.Guitar, this.nヒット数・Auto含まない.Guitar.Perfect, this.actCombo.n現在のコンボ数.Guitar最高値, E楽器パート.GUITAR, bIsAutoPlay );\r
105                                 Guitar.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.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
106                                 Guitar.nPerfect数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Perfect : this.nヒット数・Auto含まない.Guitar.Perfect;\r
107                                 Guitar.nGreat数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Great : this.nヒット数・Auto含まない.Guitar.Great;\r
108                                 Guitar.nGood数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Good : this.nヒット数・Auto含まない.Guitar.Good;\r
109                                 Guitar.nPoor数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Poor : this.nヒット数・Auto含まない.Guitar.Poor;\r
110                                 Guitar.nMiss数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Miss : this.nヒット数・Auto含まない.Guitar.Miss;\r
111                                 Guitar.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Perfect;\r
112                                 Guitar.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Great;\r
113                                 Guitar.nGood数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Good;\r
114                                 Guitar.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Poor;\r
115                                 Guitar.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Miss;\r
116                                 Guitar.n最大コンボ数 = this.actCombo.n現在のコンボ数.Guitar最高値;\r
117                                 Guitar.n全チップ数 = CDTXMania.DTX.n可視チップ数.Guitar;\r
118                                 for ( int i = 0; i < (int) Eレーン.MAX; i++ )\r
119                                 {\r
120                                         Guitar.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
121                                 }\r
122                                 Guitar.bTight = CDTXMania.ConfigIni.bTight;\r
123                                 for ( int i = 0; i < 3; i++ )\r
124                                 {\r
125                                         Guitar.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
126                                         Guitar.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
127                                         Guitar.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
128                                         Guitar.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
129                                         Guitar.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
130                                         Guitar.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
131                                         Guitar.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
132                                 }\r
133                                 Guitar.eDark = CDTXMania.ConfigIni.eDark;\r
134                                 Guitar.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
135                                 Guitar.n演奏速度分母 = 20;\r
136                                 Guitar.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
137                                 Guitar.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
138                                 Guitar.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
139                                 Guitar.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
140                                 Guitar.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
141                                 Guitar.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
142                                 Guitar.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
143                                 Guitar.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
144                                 Guitar.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
145                                 Guitar.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
146                                 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;\r
147                                 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;\r
148                                 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;\r
149                                 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;\r
150                                 Guitar.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
151                                 Guitar.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
152                                 Guitar.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
153                                 Guitar.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
154                                 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;\r
155                                 Guitar.最終更新日時 = DateTime.Now.ToString();\r
156                                 Guitar.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Guitar );\r
157                         }\r
158                 }\r
159                 #endregion\r
160                 #region [ t演奏結果を格納する・ベース() ]\r
161                 public void t演奏結果を格納する・ベース( out CScoreIni.C演奏記録 Bass )\r
162                 {\r
163                         Bass = new CScoreIni.C演奏記録();\r
164 \r
165                         if ( CDTXMania.DTX.bチップがある.Bass )\r
166                         {\r
167                                 Bass.nスコア = (long) this.actScore.Get( E楽器パート.BASS );\r
168                                 Bass.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Bass, CDTXMania.DTX.n可視チップ数.Bass, this.nヒット数・Auto含まない.Bass.Perfect, this.actCombo.n現在のコンボ数.Bass最高値, E楽器パート.BASS, bIsAutoPlay );\r
169                                 Bass.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.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
170                                 Bass.nPerfect数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Perfect : this.nヒット数・Auto含まない.Bass.Perfect;\r
171                                 Bass.nGreat数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Great : this.nヒット数・Auto含まない.Bass.Great;\r
172                                 Bass.nGood数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Good : this.nヒット数・Auto含まない.Bass.Good;\r
173                                 Bass.nPoor数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Poor : this.nヒット数・Auto含まない.Bass.Poor;\r
174                                 Bass.nMiss数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Miss : this.nヒット数・Auto含まない.Bass.Miss;\r
175                                 Bass.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Bass.Perfect;\r
176                                 Bass.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Bass.Great;\r
177                                 Bass.nGood数・Auto含まない = this.nヒット数・Auto含まない.Bass.Good;\r
178                                 Bass.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Bass.Poor;\r
179                                 Bass.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Bass.Miss;\r
180                                 Bass.n最大コンボ数 = this.actCombo.n現在のコンボ数.Bass最高値;\r
181                                 Bass.n全チップ数 = CDTXMania.DTX.n可視チップ数.Bass;\r
182                                 for ( int i = 0; i < (int) Eレーン.MAX; i++ )\r
183                                 {\r
184                                         Bass.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
185                                 }\r
186                                 Bass.bTight = CDTXMania.ConfigIni.bTight;\r
187                                 for ( int i = 0; i < 3; i++ )\r
188                                 {\r
189                                         Bass.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
190                                         Bass.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
191                                         Bass.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
192                                         Bass.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
193                                         Bass.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
194                                         Bass.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
195                                         Bass.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
196                                 }\r
197                                 Bass.eDark = CDTXMania.ConfigIni.eDark;\r
198                                 Bass.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
199                                 Bass.n演奏速度分母 = 20;\r
200                                 Bass.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
201                                 Bass.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
202                                 Bass.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
203                                 Bass.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
204                                 Bass.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
205                                 Bass.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
206                                 Bass.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
207                                 Bass.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
208                                 Bass.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
209                                 Bass.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
210                                 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass;                        // #24280 2011.1.29 yyagi\r
211                                 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass;                          //\r
212                                 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass;          //\r
213                                 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass;                                    //\r
214                                 Bass.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
215                                 Bass.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
216                                 Bass.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
217                                 Bass.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
218                                 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;\r
219                                 Bass.最終更新日時 = DateTime.Now.ToString();\r
220                                 Bass.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Bass );\r
221                         }\r
222                 }\r
223                 #endregion\r
224 \r
225                 // CStage 実装\r
226 \r
227                 public override void On活性化()\r
228                 {\r
229                         listChip = CDTXMania.DTX.listChip;\r
230                         listWAV = CDTXMania.DTX.listWAV;\r
231 \r
232                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;\r
233                         this.n現在のトップChip = ( listChip.Count > 0 ) ? 0 : -1;\r
234                         this.L最後に再生したHHの実WAV番号 = new List<int>( 16 );\r
235                         this.n最後に再生したHHのチャンネル番号 = 0;\r
236                         this.n最後に再生した実WAV番号.Guitar = -1;\r
237                         this.n最後に再生した実WAV番号.Bass = -1;\r
238                         for ( int i = 0; i < 50; i++ )\r
239                         {\r
240                                 this.n最後に再生したBGMの実WAV番号[ i ] = -1;\r
241                         }\r
242                         this.r次にくるギターChip = null;\r
243                         this.r次にくるベースChip = null;\r
244                         for ( int j = 0; j < 10; j++ )\r
245                         {\r
246                                 this.r現在の空うちドラムChip[ j ] = null;\r
247                         }\r
248                         this.r現在の空うちギターChip = null;\r
249                         this.r現在の空うちベースChip = null;\r
250                         for ( int k = 0; k < 3; k++ )\r
251                         {\r
252                                 //for ( int n = 0; n < 5; n++ )\r
253                                 //{\r
254                                         this.nヒット数・Auto含まない[ k ] = new CHITCOUNTOFRANK();\r
255                                         this.nヒット数・Auto含む[ k ] = new CHITCOUNTOFRANK();\r
256                                 //}\r
257                                 this.queWailing[ k ] = new Queue<CDTX.CChip>();\r
258                                 this.r現在の歓声Chip[ k ] = null;\r
259                         }\r
260                         for ( int i = 0; i < 3; i++ )\r
261                         {\r
262                                 this.b演奏にキーボードを使った[ i ] = false;\r
263                                 this.b演奏にジョイパッドを使った[ i ] = false;\r
264                                 this.b演奏にMIDI入力を使った[ i ] = false;\r
265                                 this.b演奏にマウスを使った[ i ] = false;\r
266                         }\r
267                         this.bAUTOでないチップが1つでもバーを通過した = false;\r
268                         base.On活性化();\r
269                         this.tステータスパネルの選択();\r
270                         this.tパネル文字列の設定();\r
271 \r
272                         this.nInputAdjustTimeMs.Drums = CDTXMania.ConfigIni.nInputAdjustTimeMs.Drums;           // #23580 2011.1.3 yyagi\r
273                         this.nInputAdjustTimeMs.Guitar = CDTXMania.ConfigIni.nInputAdjustTimeMs.Guitar;         //        2011.1.7 ikanick 修正\r
274                         this.nInputAdjustTimeMs.Bass = CDTXMania.ConfigIni.nInputAdjustTimeMs.Bass;                     //\r
275                         this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;                                                                       // #24239 2011.1.23 yyagi\r
276                         //this.bIsAutoPlay.Guitar = CDTXMania.ConfigIni.bギターが全部オートプレイである;\r
277                         //this.bIsAutoPlay.Bass = CDTXMania.ConfigIni.bベースが全部オートプレイである;\r
278 //                      this.nRisky = CDTXMania.ConfigIni.nRisky;                                                                                       // #23559 2011.7.28 yyagi\r
279                         actGauge.Init( CDTXMania.ConfigIni.nRisky );                                                                    // #23559 2011.7.28 yyagi\r
280                         this.nPolyphonicSounds = CDTXMania.ConfigIni.nPoliphonicSounds;\r
281 \r
282                         CDTXMania.Skin.tRemoveMixerAll();       // 効果音のストリームをミキサーから解除しておく\r
283 \r
284                         queueMixerSound = new Queue<stmixer>( 64 );\r
285                         bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );\r
286 \r
287                         #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]\r
288                         foreach ( CDTX.CChip pChip in listChip )\r
289                         {\r
290 //                              Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 +  ", time=" + pChip.n発声時刻ms );\r
291                                 if ( pChip.n発声時刻ms <= 0 )\r
292                                 {\r
293                                         if ( pChip.nチャンネル番号 == 0xDA )\r
294                                         {\r
295                                                 pChip.bHit = true;\r
296 //                                              Debug.WriteLine( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );\r
297                                                 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )\r
298                                                 {\r
299                                                         CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];\r
300                                                         for ( int i = 0; i < nPolyphonicSounds; i++ )\r
301                                                         {\r
302                                                                 if ( wc.rSound[ i ] != null )\r
303                                                                 {\r
304                                                                         CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );\r
305                                                                         //AddMixer( wc.rSound[ i ] );           // 最初はqueueを介さず直接ミキサー登録する\r
306                                                                 }\r
307                                                         }\r
308                                                 }\r
309                                         }\r
310                                 }\r
311                                 else\r
312                                 {\r
313                                         break;\r
314                                 }\r
315                         }\r
316                         #endregion\r
317 \r
318                         if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え\r
319                         {\r
320                                 CDTXMania.DTX.SwapGuitarBassInfos();\r
321                         }\r
322                         this.sw = new Stopwatch();\r
323                         this.sw2 = new Stopwatch();\r
324 //                      this.gclatencymode = GCSettings.LatencyMode;\r
325 //                      GCSettings.LatencyMode = GCLatencyMode.Batch;   // 演奏画面中はGCを抑止する\r
326                 }\r
327                 public override void On非活性化()\r
328                 {\r
329                         this.L最後に再生したHHの実WAV番号.Clear();   // #23921 2011.1.4 yyagi\r
330                         this.L最後に再生したHHの実WAV番号 = null;    //\r
331                         for ( int i = 0; i < 3; i++ )\r
332                         {\r
333                                 this.queWailing[ i ].Clear();\r
334                                 this.queWailing[ i ] = null;\r
335                         }\r
336                         this.ctWailingチップ模様アニメ = null;\r
337                         this.ctチップ模様アニメ.Drums = null;\r
338                         this.ctチップ模様アニメ.Guitar = null;\r
339                         this.ctチップ模様アニメ.Bass = null;\r
340                         //listWAV.Clear();\r
341                         listWAV = null;\r
342                         listChip = null;\r
343                         queueMixerSound.Clear();\r
344                         queueMixerSound = null;\r
345 //                      GCSettings.LatencyMode = this.gclatencymode;\r
346                         base.On非活性化();\r
347                 }\r
348                 public override void OnManagedリソースの作成()\r
349                 {\r
350                         if ( !base.b活性化してない )\r
351                         {\r
352                                 this.t背景テクスチャの生成();\r
353 \r
354                                 this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );\r
355 \r
356                                 base.OnManagedリソースの作成();\r
357                         }\r
358                 }\r
359                 public override void OnManagedリソースの解放()\r
360                 {\r
361                         if ( !base.b活性化してない )\r
362                         {\r
363                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
364 \r
365                                 CDTXMania.tテクスチャの解放( ref this.txWailing枠 );\r
366                                 base.OnManagedリソースの解放();\r
367                         }\r
368                 }\r
369 \r
370                 // その他\r
371 \r
372                 #region [ protected ]\r
373                 //-----------------\r
374                 protected class CHITCOUNTOFRANK\r
375                 {\r
376                         // Fields\r
377                         public int Good;\r
378                         public int Great;\r
379                         public int Miss;\r
380                         public int Perfect;\r
381                         public int Poor;\r
382 \r
383                         // Properties\r
384                         public int this[ int index ]\r
385                         {\r
386                                 get\r
387                                 {\r
388                                         switch ( index )\r
389                                         {\r
390                                                 case 0:\r
391                                                         return this.Perfect;\r
392 \r
393                                                 case 1:\r
394                                                         return this.Great;\r
395 \r
396                                                 case 2:\r
397                                                         return this.Good;\r
398 \r
399                                                 case 3:\r
400                                                         return this.Poor;\r
401 \r
402                                                 case 4:\r
403                                                         return this.Miss;\r
404                                         }\r
405                                         throw new IndexOutOfRangeException();\r
406                                 }\r
407                                 set\r
408                                 {\r
409                                         switch ( index )\r
410                                         {\r
411                                                 case 0:\r
412                                                         this.Perfect = value;\r
413                                                         return;\r
414 \r
415                                                 case 1:\r
416                                                         this.Great = value;\r
417                                                         return;\r
418 \r
419                                                 case 2:\r
420                                                         this.Good = value;\r
421                                                         return;\r
422 \r
423                                                 case 3:\r
424                                                         this.Poor = value;\r
425                                                         return;\r
426 \r
427                                                 case 4:\r
428                                                         this.Miss = value;\r
429                                                         return;\r
430                                         }\r
431                                         throw new IndexOutOfRangeException();\r
432                                 }\r
433                         }\r
434                 }\r
435 \r
436                 [StructLayout( LayoutKind.Sequential )]\r
437                 protected struct STKARAUCHI\r
438                 {\r
439                         public CDTX.CChip HH;\r
440                         public CDTX.CChip SD;\r
441                         public CDTX.CChip BD;\r
442                         public CDTX.CChip HT;\r
443                         public CDTX.CChip LT;\r
444                         public CDTX.CChip FT;\r
445                         public CDTX.CChip CY;\r
446                         public CDTX.CChip HHO;\r
447                         public CDTX.CChip RD;\r
448                         public CDTX.CChip LC;\r
449                         public CDTX.CChip this[ int index ]\r
450                         {\r
451                                 get\r
452                                 {\r
453                                         switch ( index )\r
454                                         {\r
455                                                 case 0:\r
456                                                         return this.HH;\r
457 \r
458                                                 case 1:\r
459                                                         return this.SD;\r
460 \r
461                                                 case 2:\r
462                                                         return this.BD;\r
463 \r
464                                                 case 3:\r
465                                                         return this.HT;\r
466 \r
467                                                 case 4:\r
468                                                         return this.LT;\r
469 \r
470                                                 case 5:\r
471                                                         return this.FT;\r
472 \r
473                                                 case 6:\r
474                                                         return this.CY;\r
475 \r
476                                                 case 7:\r
477                                                         return this.HHO;\r
478 \r
479                                                 case 8:\r
480                                                         return this.RD;\r
481 \r
482                                                 case 9:\r
483                                                         return this.LC;\r
484                                         }\r
485                                         throw new IndexOutOfRangeException();\r
486                                 }\r
487                                 set\r
488                                 {\r
489                                         switch ( index )\r
490                                         {\r
491                                                 case 0:\r
492                                                         this.HH = value;\r
493                                                         return;\r
494 \r
495                                                 case 1:\r
496                                                         this.SD = value;\r
497                                                         return;\r
498 \r
499                                                 case 2:\r
500                                                         this.BD = value;\r
501                                                         return;\r
502 \r
503                                                 case 3:\r
504                                                         this.HT = value;\r
505                                                         return;\r
506 \r
507                                                 case 4:\r
508                                                         this.LT = value;\r
509                                                         return;\r
510 \r
511                                                 case 5:\r
512                                                         this.FT = value;\r
513                                                         return;\r
514 \r
515                                                 case 6:\r
516                                                         this.CY = value;\r
517                                                         return;\r
518 \r
519                                                 case 7:\r
520                                                         this.HHO = value;\r
521                                                         return;\r
522 \r
523                                                 case 8:\r
524                                                         this.RD = value;\r
525                                                         return;\r
526 \r
527                                                 case 9:\r
528                                                         this.LC = value;\r
529                                                         return;\r
530                                         }\r
531                                         throw new IndexOutOfRangeException();\r
532                                 }\r
533                         }\r
534                 }\r
535 \r
536                 protected struct stmixer\r
537                 {\r
538                         internal bool bIsAdd;\r
539                         internal CSound csound;\r
540                 };\r
541 \r
542                 protected CAct演奏AVI actAVI;\r
543                 protected CAct演奏BGA actBGA;\r
544 \r
545                 protected CAct演奏チップファイアGB actChipFireGB;\r
546                 protected CAct演奏Combo共通 actCombo;\r
547                 protected CAct演奏Danger共通 actDANGER;\r
548                 protected CActFIFOBlack actFI;\r
549                 protected CActFIFOBlack actFO;\r
550                 protected CActFIFOWhite actFOClear;\r
551                 protected CAct演奏ゲージ共通 actGauge;\r
552 \r
553                 protected CAct演奏判定文字列共通 actJudgeString;\r
554                 protected CAct演奏DrumsレーンフラッシュD actLaneFlushD;\r
555                 protected CAct演奏レーンフラッシュGB共通 actLaneFlushGB;\r
556                 protected CAct演奏パネル文字列 actPanel;\r
557                 protected CAct演奏演奏情報 actPlayInfo;\r
558                 protected CAct演奏RGB共通 actRGB;\r
559                 protected CAct演奏スコア共通 actScore;\r
560                 protected CAct演奏ステージ失敗 actStageFailed;\r
561                 protected CAct演奏ステータスパネル共通 actStatusPanels;\r
562                 protected CAct演奏WailingBonus共通 actWailingBonus;\r
563                 protected CAct演奏スクロール速度 act譜面スクロール速度;\r
564                 protected bool bPAUSE;\r
565                 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;\r
566                 protected STDGBVALUE<bool> b演奏にキーボードを使った;\r
567                 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;\r
568                 protected STDGBVALUE<bool> b演奏にマウスを使った;\r
569                 protected CCounter ctWailingチップ模様アニメ;\r
570                 protected STDGBVALUE<CCounter> ctチップ模様アニメ;\r
571 \r
572                 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;\r
573                 protected readonly int[,] nBGAスコープチャンネルマップ = new int[ , ] { { 0xc4, 0xc7, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0 }, { 4, 7, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60 } };\r
574                 protected readonly int[] nチャンネル0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 8, 0 };\r
575                 protected readonly int[] nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };\r
576                 protected readonly int[] nパッド0Atoチャンネル0A = new int[] { 0x11, 0x12, 0x13, 20, 0x15, 0x17, 0x16, 0x18, 0x19, 0x1a };\r
577                 protected readonly int[] nパッド0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 8, 0 };        // パッド画像のヒット処理用\r
578                 protected readonly int[] nパッド0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 7, 0 };        \r
579                 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数・Auto含まない;\r
580                 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数・Auto含む;\r
581                 protected int n現在のトップChip = -1;\r
582                 protected int[] n最後に再生したBGMの実WAV番号 = new int[ 50 ];\r
583                 protected int n最後に再生したHHのチャンネル番号;\r
584                 protected List<int> L最後に再生したHHの実WAV番号;            // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.\r
585                 protected STLANEVALUE<int> n最後に再生した実WAV番号;  // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"\r
586                                                                                                                                 //                                                      into "n最後に再生した実WAV番号";\r
587 //              protected int n最後に再生した実WAV番号.GUITAR;\r
588 //              protected int n最後に再生した実WAV番号.BASS;\r
589 \r
590                 protected volatile Queue<stmixer> queueMixerSound;              // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する\r
591                 protected DateTime dtLastQueueOperation;                                //\r
592                 protected bool bIsDirectSound;                                                  //\r
593 \r
594                 protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;\r
595                 protected STDGBVALUE<CDTX.CChip> r現在の歓声Chip;\r
596                 protected CDTX.CChip r現在の空うちギターChip;\r
597                 protected STKARAUCHI r現在の空うちドラムChip;\r
598                 protected CDTX.CChip r現在の空うちベースChip;\r
599                 protected CDTX.CChip r次にくるギターChip;\r
600                 protected CDTX.CChip r次にくるベースChip;\r
601                 protected CTexture txWailing枠;\r
602                 protected CTexture txチップ;\r
603                 protected CTexture txヒットバー;\r
604 \r
605                 protected CTexture tx背景;\r
606 \r
607                 protected STDGBVALUE<int> nInputAdjustTimeMs;           // #23580 2011.1.3 yyagi\r
608                 protected STAUTOPLAY bIsAutoPlay;               // #24239 2011.1.23 yyagi\r
609 //              protected int nRisky_InitialVar, nRiskyTime;            // #23559 2011.7.28 yyagi → CAct演奏ゲージ共通クラスに隠蔽\r
610                 protected int nPolyphonicSounds;\r
611                 protected List<CDTX.CChip> listChip;\r
612                 protected Dictionary<int, CDTX.CWAV> listWAV;\r
613 \r
614                 protected Stopwatch sw;         // 2011.6.13 最適化検討用のストップウォッチ\r
615                 protected Stopwatch sw2;\r
616                 protected GCLatencyMode gclatencymode;\r
617 \r
618                 public void AddMixer( CSound cs )\r
619                 {\r
620                         stmixer stm = new stmixer()\r
621                         {\r
622                                 bIsAdd = true,\r
623                                 csound = cs\r
624                         };\r
625                         queueMixerSound.Enqueue( stm );\r
626 //              Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));\r
627                 }\r
628                 public void RemoveMixer( CSound cs )\r
629                 {\r
630                         stmixer stm = new stmixer()\r
631                         {\r
632                                 bIsAdd = false,\r
633                                 csound = cs\r
634                         };\r
635                         queueMixerSound.Enqueue( stm );\r
636 //              Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));\r
637                 }\r
638 \r
639                 protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime )\r
640                 {\r
641                         if ( pChip != null )\r
642                         {\r
643                                 pChip.nLag = (int) ( nTime + nInputAdjustTime - pChip.n発声時刻ms );                // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature\r
644                                 int nDeltaTime = Math.Abs( pChip.nLag );\r
645                                 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));\r
646                                 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )\r
647                                 {\r
648                                         return E判定.Perfect;\r
649                                 }\r
650                                 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )\r
651                                 {\r
652                                         return E判定.Great;\r
653                                 }\r
654                                 if ( nDeltaTime <= CDTXMania.nGood範囲ms )\r
655                                 {\r
656                                         return E判定.Good;\r
657                                 }\r
658                                 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )\r
659                                 {\r
660                                         return E判定.Poor;\r
661                                 }\r
662                         }\r
663                         return E判定.Miss;\r
664                 }\r
665                 protected CDTX.CChip r空うちChip( E楽器パート part, Eパッド pad )\r
666                 {\r
667                         switch ( part )\r
668                         {\r
669                                 case E楽器パート.DRUMS:\r
670                                         switch ( pad )\r
671                                         {\r
672                                                 case Eパッド.HH:\r
673                                                         if ( this.r現在の空うちドラムChip.HH != null )\r
674                                                         {\r
675                                                                 return this.r現在の空うちドラムChip.HH;\r
676                                                         }\r
677                                                         if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )\r
678                                                         {\r
679                                                                 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )\r
680                                                                 {\r
681                                                                         return this.r現在の空うちドラムChip.HHO;\r
682                                                                 }\r
683                                                                 if ( this.r現在の空うちドラムChip.HHO != null )\r
684                                                                 {\r
685                                                                         return this.r現在の空うちドラムChip.HHO;\r
686                                                                 }\r
687                                                         }\r
688                                                         return this.r現在の空うちドラムChip.LC;\r
689 \r
690                                                 case Eパッド.SD:\r
691                                                         return this.r現在の空うちドラムChip.SD;\r
692 \r
693                                                 case Eパッド.BD:\r
694                                                         return this.r現在の空うちドラムChip.BD;\r
695 \r
696                                                 case Eパッド.HT:\r
697                                                         return this.r現在の空うちドラムChip.HT;\r
698 \r
699                                                 case Eパッド.LT:\r
700                                                         if ( this.r現在の空うちドラムChip.LT != null )\r
701                                                         {\r
702                                                                 return this.r現在の空うちドラムChip.LT;\r
703                                                         }\r
704                                                         if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )\r
705                                                         {\r
706                                                                 return this.r現在の空うちドラムChip.FT;\r
707                                                         }\r
708                                                         return null;\r
709 \r
710                                                 case Eパッド.FT:\r
711                                                         if ( this.r現在の空うちドラムChip.FT != null )\r
712                                                         {\r
713                                                                 return this.r現在の空うちドラムChip.FT;\r
714                                                         }\r
715                                                         if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )\r
716                                                         {\r
717                                                                 return this.r現在の空うちドラムChip.LT;\r
718                                                         }\r
719                                                         return null;\r
720 \r
721                                                 case Eパッド.CY:\r
722                                                         if ( this.r現在の空うちドラムChip.CY != null )\r
723                                                         {\r
724                                                                 return this.r現在の空うちドラムChip.CY;\r
725                                                         }\r
726                                                         if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )\r
727                                                         {\r
728                                                                 return this.r現在の空うちドラムChip.RD;\r
729                                                         }\r
730                                                         return null;\r
731 \r
732                                                 case Eパッド.HHO:\r
733                                                         if ( this.r現在の空うちドラムChip.HHO != null )\r
734                                                         {\r
735                                                                 return this.r現在の空うちドラムChip.HHO;\r
736                                                         }\r
737                                                         if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )\r
738                                                         {\r
739                                                                 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )\r
740                                                                 {\r
741                                                                         return this.r現在の空うちドラムChip.HH;\r
742                                                                 }\r
743                                                                 if ( this.r現在の空うちドラムChip.HH != null )\r
744                                                                 {\r
745                                                                         return this.r現在の空うちドラムChip.HH;\r
746                                                                 }\r
747                                                         }\r
748                                                         return this.r現在の空うちドラムChip.LC;\r
749 \r
750                                                 case Eパッド.RD:\r
751                                                         if ( this.r現在の空うちドラムChip.RD != null )\r
752                                                         {\r
753                                                                 return this.r現在の空うちドラムChip.RD;\r
754                                                         }\r
755                                                         if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )\r
756                                                         {\r
757                                                                 return this.r現在の空うちドラムChip.CY;\r
758                                                         }\r
759                                                         return null;\r
760 \r
761                                                 case Eパッド.LC:\r
762                                                         if ( this.r現在の空うちドラムChip.LC != null )\r
763                                                         {\r
764                                                                 return this.r現在の空うちドラムChip.LC;\r
765                                                         }\r
766                                                         if ( ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける ) && ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.全部共通 ) )\r
767                                                         {\r
768                                                                 return null;\r
769                                                         }\r
770                                                         if ( this.r現在の空うちドラムChip.HH != null )\r
771                                                         {\r
772                                                                 return this.r現在の空うちドラムChip.HH;\r
773                                                         }\r
774                                                         return this.r現在の空うちドラムChip.HHO;\r
775                                         }\r
776                                         break;\r
777 \r
778                                 case E楽器パート.GUITAR:\r
779                                         return this.r現在の空うちギターChip;\r
780 \r
781                                 case E楽器パート.BASS:\r
782                                         return this.r現在の空うちベースChip;\r
783                         }\r
784                         return null;\r
785                 }\r
786                 protected CDTX.CChip r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( long nTime, int nChannel, int nInputAdjustTime )\r
787                 {\r
788                         sw2.Start();\r
789 //Trace.TraceInformation( "NTime={0}, nChannel={1:x2}", nTime, nChannel );\r
790                         nTime += nInputAdjustTime;                                              // #24239 2011.1.23 yyagi InputAdjust\r
791 \r
792                         int nIndex_InitialPositionSearchingToPast;\r
793                         if ( this.n現在のトップChip == -1 )                               // 演奏データとして1個もチップがない場合は\r
794                         {\r
795                                 sw2.Stop();\r
796                                 return null;\r
797                         }\r
798                         int count = listChip.Count;\r
799                         int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;\r
800                         if ( this.n現在のトップChip >= count )                    // その時点で演奏すべきチップが既に全部無くなっていたら\r
801                         {\r
802                                 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;\r
803                         }\r
804                         //int nIndex_NearestChip_Future;        // = nIndex_InitialPositionSearchingToFuture;\r
805                         //while ( nIndex_NearestChip_Future < count )           // 未来方向への検索\r
806                         for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++)\r
807                         {\r
808                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];\r
809                                 if ( ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) ) )\r
810                                 {\r
811                                         if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
812                                         {\r
813                                                 if ( chip.n発声時刻ms > nTime )\r
814                                                 {\r
815                                                         break;\r
816                                                 }\r
817                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
818                                         }\r
819                                         continue;       // ほんの僅かながら高速化\r
820                                 }\r
821                                 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
822                                 {\r
823                                         if ( chip.n発声時刻ms > nTime )\r
824                                         {\r
825                                                 break;\r
826                                         }\r
827                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
828                                 }\r
829                                 else if ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
830                                 {\r
831                                         if ( chip.n発声時刻ms > nTime )\r
832                                         {\r
833                                                 break;\r
834                                         }\r
835                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
836                                 }\r
837                                 // nIndex_NearestChip_Future++;\r
838                         }\r
839                         int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;\r
840                         //while ( nIndex_NearestChip_Past >= 0 )                        // 過去方向への検索\r
841                         for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )\r
842                         {\r
843                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];\r
844                                 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )\r
845                                 {\r
846                                         if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
847                                         {\r
848                                                 break;\r
849                                         }\r
850                                 }\r
851                                 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
852                                 {\r
853                                         if ( ( 0x20 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0x28 ) )\r
854                                         {\r
855                                                 break;\r
856                                         }\r
857                                 }\r
858                                 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
859                                         && ( ( 0xa0 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0xa8 ) ) )\r
860                                 {\r
861                                         break;\r
862                                 }\r
863                                 // nIndex_NearestChip_Past--;\r
864                         }\r
865 \r
866                         if ( nIndex_NearestChip_Future >= count )\r
867                         {\r
868                                 if ( nIndex_NearestChip_Past < 0 )      // 検索対象が過去未来どちらにも見つからなかった場合\r
869                                 {\r
870                                         return null;\r
871                                 }\r
872                                 else                                                            // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合\r
873                                 {\r
874                                         sw2.Stop();\r
875                                         return listChip[ nIndex_NearestChip_Past ];\r
876                                 }\r
877                         }\r
878                         else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合\r
879                         {\r
880                                 sw2.Stop();\r
881                                 return listChip[ nIndex_NearestChip_Future ];\r
882                         }\r
883                                                                                                         // 検索対象が過去未来の双方に見つかったなら、より近い方を採用する\r
884                         CDTX.CChip nearestChip_Future = listChip[ nIndex_NearestChip_Future ];\r
885                         CDTX.CChip nearestChip_Past   = listChip[ nIndex_NearestChip_Past ];\r
886                         int nDiffTime_Future = Math.Abs( (int) ( nTime - nearestChip_Future.n発声時刻ms ) );\r
887                         int nDiffTime_Past   = Math.Abs( (int) ( nTime - nearestChip_Past.n発声時刻ms ) );\r
888                         if ( nDiffTime_Future >= nDiffTime_Past )\r
889                         {\r
890                                 sw2.Stop();\r
891                                 return nearestChip_Past;\r
892                         }\r
893                         sw2.Stop();\r
894                         return nearestChip_Future;\r
895                 }\r
896                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part )\r
897                 {\r
898                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, CDTXMania.ConfigIni.n手動再生音量, false, false );\r
899                 }\r
900                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量 )\r
901                 {\r
902                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, false, false );\r
903                 }\r
904                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ )\r
905                 {\r
906                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, bモニタ, false );\r
907                 }\r
908                 protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )\r
909                 {\r
910                         // mute sound (auto)\r
911                         // 4A: HH\r
912                         // 4B: CY\r
913                         // 4C: RD\r
914                         // 4D: LC\r
915                         // 2A: Gt\r
916                         // AA: Bs\r
917                         //\r
918 \r
919                         if ( pChip != null )\r
920                         {\r
921                                 bool overwrite = false;\r
922                                 switch ( part )\r
923                                 {\r
924                                         case E楽器パート.DRUMS:\r
925                                         #region [ DRUMS ]\r
926                                                 {\r
927                                                         int index = pChip.nチャンネル番号;\r
928                                                         if ( ( 0x11 <= index ) && ( index <= 0x1a ) )\r
929                                                         {\r
930                                                                 index -= 0x11;\r
931                                                         }\r
932                                                         else if ( ( 0x31 <= index ) && ( index <= 0x3a ) )\r
933                                                         {\r
934                                                                 index -= 0x31;\r
935                                                         }\r
936                                                         // mute sound (auto)\r
937                                                         // 4A: 84: HH (HO/HC)\r
938                                                         // 4B: 85: CY\r
939                                                         // 4C: 86: RD\r
940                                                         // 4D: 87: LC\r
941                                                         // 2A: 88: Gt\r
942                                                         // AA: 89: Bs\r
943                                                         else if ( 0x84 == index )       // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要\r
944                                                         {\r
945                                                                 index = 0;\r
946                                                         }\r
947                                                         else if ( ( 0x85 <= index ) && ( index <= 0x87 ) )      // 仮に今だけ追加\r
948                                                         {\r
949                                                                 //            CY    RD    LC\r
950                                                                 int[] ch = { 0x16, 0x19, 0x1A };\r
951                                                                 pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x85 ];\r
952                                                                 index = pChip.nチャンネル番号 - 0x11;\r
953                                                                 overwrite = true;\r
954                                                         }\r
955                                                         else\r
956                                                         {\r
957                                                                 return;\r
958                                                         }\r
959                                                         int nLane = this.nチャンネル0Atoレーン07[ index ];\r
960                                                         if ( ( nLane == 1 ) &&  // 今回演奏するのがHC or HO\r
961                                                                 ( index == 0 || ( index == 7 && this.n最後に再生したHHのチャンネル番号 != 0x18 && this.n最後に再生したHHのチャンネル番号 != 0x38 ) )\r
962                                                                 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない\r
963                                                         )\r
964                                                         // #24772 2011.4.4 yyagi\r
965                                                         // == HH mute condition == \r
966                                                         //                      current HH              So, the mute logics are:\r
967                                                         //                              HC      HO              1) All played HC/HOs should be queueing\r
968                                                         // last HH      HC  Yes Yes             2) If you aren't in "both current/last HH are HO", queued HH should be muted.\r
969                                                         //                      HO      Yes     No\r
970                                                         {\r
971                                                                 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。\r
972 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
973                                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)\r
974                                                                 {\r
975 #endif\r
976                                                                 for ( int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++ )          // #23921 2011.1.4 yyagi\r
977                                                                 {\r
978                                                                         // CDTXMania.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号);\r
979                                                                         CDTXMania.DTX.tWavの再生停止( this.L最後に再生したHHの実WAV番号[ i ] ); // #23921 yyagi ストック分全て消音する\r
980                                                                 }\r
981                                                                 this.L最後に再生したHHの実WAV番号.Clear();\r
982 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
983                                                                 }\r
984 #endif\r
985                                                                 //this.n最後に再生したHHの実WAV番号 = pChip.n整数値・内部番号;\r
986                                                                 this.n最後に再生したHHのチャンネル番号 = pChip.nチャンネル番号;\r
987                                                         }\r
988 #if TEST_NOTEOFFMODE    // 2011.1.4 yyagi test\r
989                                                         if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)\r
990                                                         {\r
991 #endif\r
992                                                         if ( index == 0 || index == 7 || index == 0x20 || index == 0x27 )                       // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく\r
993                                                         {                                                                                                                                                       // #24772 HC, 不可視HCも消音キューに追加\r
994                                                                 if ( this.L最後に再生したHHの実WAV番号.Count >= 16 ) // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える\r
995                                                                 {                                                                                                       // (ストックが増えてList<>のrealloc()が発生するのを予防する)\r
996                                                                         this.L最後に再生したHHの実WAV番号.RemoveAt( 0 );\r
997                                                                 }\r
998                                                                 if ( !this.L最後に再生したHHの実WAV番号.Contains( pChip.n整数値・内部番号 ) )        // チップ音がまだストックされてなければ\r
999                                                                 {\r
1000                                                                         this.L最後に再生したHHの実WAV番号.Add( pChip.n整数値・内部番号 );                    // ストックする\r
1001                                                                 }\r
1002                                                         }\r
1003 #if TEST_NOTEOFFMODE    // 2011.1.4 yyagi test\r
1004                                                         }\r
1005 #endif\r
1006                                                         if ( overwrite )\r
1007                                                         {\r
1008                                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号[index] );\r
1009                                                         }\r
1010                                                         CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, nLane, n音量, bモニタ );\r
1011                                                         this.n最後に再生した実WAV番号[ nLane ] = pChip.n整数値・内部番号;             // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意\r
1012                                                         return;\r
1013                                                 }\r
1014                                         #endregion\r
1015                                         case E楽器パート.GUITAR:\r
1016                                         #region [ GUITAR ]\r
1017 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
1018                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.Guitar) {\r
1019 #endif\r
1020                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );\r
1021 #if TEST_NOTEOFFMODE\r
1022                                                 }\r
1023 #endif\r
1024                                                 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Guitar, n音量, bモニタ, b音程をずらして再生 );\r
1025                                                 this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;\r
1026                                                 return;\r
1027                                         #endregion\r
1028                                         case E楽器パート.BASS:\r
1029                                         #region [ BASS ]\r
1030 #if TEST_NOTEOFFMODE\r
1031                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.Bass) {\r
1032 #endif\r
1033                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Bass );\r
1034 #if TEST_NOTEOFFMODE\r
1035                                                 }\r
1036 #endif\r
1037                                                 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Bass, n音量, bモニタ, b音程をずらして再生 );\r
1038                                                 this.n最後に再生した実WAV番号.Bass = pChip.n整数値・内部番号;\r
1039                                                 return;\r
1040                                         #endregion\r
1041 \r
1042                                         default:\r
1043                                                 break;\r
1044                                 }\r
1045                         }\r
1046                 }\r
1047                 protected void tステータスパネルの選択()\r
1048                 {\r
1049                         if ( CDTXMania.bコンパクトモード )\r
1050                         {\r
1051                                 this.actStatusPanels.tラベル名からステータスパネルを決定する( null );\r
1052                         }\r
1053                         else if ( CDTXMania.stage選曲.r確定された曲 != null )\r
1054                         {\r
1055                                 this.actStatusPanels.tラベル名からステータスパネルを決定する( CDTXMania.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.stage選曲.n確定された曲の難易度 ] );\r
1056                         }\r
1057                 }\r
1058                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip )\r
1059                 {\r
1060                         return tチップのヒット処理( nHitTime, pChip, true );\r
1061                 }\r
1062                 protected abstract E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, bool bCorrectLane );\r
1063                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode )          // E楽器パート screenmode\r
1064                 {\r
1065                         return tチップのヒット処理( nHitTime, pChip, screenmode, true );\r
1066                 }\r
1067                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode, bool bCorrectLane )\r
1068                 {\r
1069                         pChip.bHit = true;\r
1070 #region [メソッド化する前の記述(注釈化)]\r
1071 //            bool bPChipIsAutoPlay = false;\r
1072 //            bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
1073 //            bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
1074 //            bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
1075 //            bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
1076 //            bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
1077 //            if ( pChip.e楽器パート == E楽器パート.DRUMS )\r
1078 //            {\r
1079 //                if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )\r
1080 //                {\r
1081 //                    bPChipIsAutoPlay = true;\r
1082 //                }\r
1083 //            }\r
1084 //            else if ( pChip.e楽器パート == E楽器パート.GUITAR )\r
1085 //            {\r
1086 ////Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );\r
1087 ////Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);\r
1088 //                bPChipIsAutoPlay = true;\r
1089 //                if ( !bIsAutoPlay[ (int) Eレーン.GtPick ] ) bPChipIsAutoPlay = false;\r
1090 //                else\r
1091 //                {\r
1092 //                    if ( bGtBsR  && !bIsAutoPlay[ (int) Eレーン.GtR ] ) bPChipIsAutoPlay = false;\r
1093 //                    else if ( bGtBsG && !bIsAutoPlay[ (int) Eレーン.GtG ] ) bPChipIsAutoPlay = false;\r
1094 //                    else if ( bGtBsB && !bIsAutoPlay[ (int) Eレーン.GtB ] ) bPChipIsAutoPlay = false;\r
1095 //                    else if ( bGtBsW && !bIsAutoPlay[ (int) Eレーン.GtW ] ) bPChipIsAutoPlay = false;\r
1096 //                    else if ( bGtBsO &&\r
1097 //                        ( !bIsAutoPlay[ (int) Eレーン.GtR] || !bIsAutoPlay[ (int) Eレーン.GtG] || !bIsAutoPlay[ (int) Eレーン.GtB] ) )\r
1098 //                        bPChipIsAutoPlay = false;\r
1099 //                }\r
1100 //            }\r
1101 //            else if ( pChip.e楽器パート == E楽器パート.BASS )\r
1102 //            {\r
1103 //                bPChipIsAutoPlay = true;\r
1104 //                if ( !bIsAutoPlay[ (int) Eレーン.BsPick ] ) bPChipIsAutoPlay = false;\r
1105 //                else\r
1106 //                {\r
1107 //                    if ( bGtBsR && !bIsAutoPlay[ (int) Eレーン.BsR ] ) bPChipIsAutoPlay = false;\r
1108 //                    else if ( bGtBsG && bIsAutoPlay[ (int) Eレーン.BsG ] ) bPChipIsAutoPlay = false;\r
1109 //                    else if ( bGtBsB && bIsAutoPlay[ (int) Eレーン.BsB ] ) bPChipIsAutoPlay = false;\r
1110 //                    else if ( bGtBsW && bIsAutoPlay[ (int) Eレーン.BsW ] ) bPChipIsAutoPlay = false;\r
1111 //                    else if ( bGtBsO &&\r
1112 //                        ( !bIsAutoPlay[ (int) Eレーン.BsR ] || !bIsAutoPlay[ (int) Eレーン.BsG ] || !bIsAutoPlay[ (int) Eレーン.BsB ] ) )\r
1113 //                        bPChipIsAutoPlay = false;\r
1114 //                }\r
1115 //            }\r
1116 //            else\r
1117 //            {\r
1118 //                this.bAUTOでないチップが1つでもバーを通過した = true;\r
1119 //            }\r
1120 ////Trace.TraceInformation( "ch={0:x2}, flag={1}",  pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );\r
1121 #endregion\r
1122                         if ( pChip.e楽器パート == E楽器パート.UNKNOWN )\r
1123                         {\r
1124                                 this.bAUTOでないチップが1つでもバーを通過した = true;\r
1125                         }\r
1126                         bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );\r
1127 \r
1128                         pChip.bIsAutoPlayed = bPChipIsAutoPlay;                 // 2011.6.10 yyagi\r
1129                         E判定 eJudgeResult = E判定.Auto;\r
1130                         switch ( pChip.e楽器パート )\r
1131                         {\r
1132                                 case E楽器パート.DRUMS:\r
1133                                         {\r
1134                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;\r
1135                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1136                                                 this.actJudgeString.Start( this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ], bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1137                                         }\r
1138                                         break;\r
1139 \r
1140                                 case E楽器パート.GUITAR:\r
1141                                         {\r
1142                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Guitar;\r
1143                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1144                                                 this.actJudgeString.Start( 10, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1145                                                 break;\r
1146                                         }\r
1147 \r
1148                                 case E楽器パート.BASS:\r
1149                                         {\r
1150                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Bass;\r
1151                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1152                                                 this.actJudgeString.Start( 11, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1153                                         }\r
1154                                         break;\r
1155                         }\r
1156                         if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )\r
1157                         {\r
1158                                 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );\r
1159                                 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );\r
1160                         }\r
1161 \r
1162                         switch ( pChip.e楽器パート )\r
1163                         {\r
1164                                 case E楽器パート.DRUMS:\r
1165                                         switch ( eJudgeResult )\r
1166                                         {\r
1167                                                 case E判定.Miss:\r
1168                                                 case E判定.Bad:\r
1169                                                         this.nヒット数・Auto含む.Drums.Miss++;\r
1170                                                         if ( !bPChipIsAutoPlay )\r
1171                                                         {\r
1172                                                                 this.nヒット数・Auto含まない.Drums.Miss++;\r
1173                                                         }\r
1174                                                         break;\r
1175                                                 default:\r
1176                                                         this.nヒット数・Auto含む.Drums[ (int) eJudgeResult ]++;\r
1177                                                         if ( !bPChipIsAutoPlay )\r
1178                                                         {\r
1179                                                                 this.nヒット数・Auto含まない.Drums[ (int) eJudgeResult ]++;\r
1180                                                         }\r
1181                                                         break;\r
1182                                         }\r
1183 \r
1184                                         if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )\r
1185                                         {\r
1186                                                 switch ( eJudgeResult )\r
1187                                                 {\r
1188                                                         case E判定.Perfect:\r
1189                                                         case E判定.Great:\r
1190                                                         case E判定.Good:\r
1191                                                                 this.actCombo.n現在のコンボ数.Drums++;\r
1192                                                                 break;\r
1193 \r
1194                                                         default:\r
1195                                                                 this.actCombo.n現在のコンボ数.Drums = 0;\r
1196                                                                 break;\r
1197                                                 }\r
1198                                         }\r
1199                                         break;\r
1200 \r
1201                                 case E楽器パート.GUITAR:\r
1202                                 case E楽器パート.BASS:\r
1203                                         int indexInst = (int) pChip.e楽器パート;\r
1204                                         switch ( eJudgeResult )\r
1205                                         {\r
1206                                                 case E判定.Miss:\r
1207                                                 case E判定.Bad:\r
1208                                                         this.nヒット数・Auto含む[ indexInst ].Miss++;\r
1209                                                         if ( !bPChipIsAutoPlay )\r
1210                                                         {\r
1211                                                                 this.nヒット数・Auto含まない[ indexInst ].Miss++;\r
1212                                                         }\r
1213                                                         break;\r
1214                                                 default:        // #24068 2011.1.10 ikanick changed\r
1215                                                         // #24167 2011.1.16 yyagi changed\r
1216                                                         this.nヒット数・Auto含む[ indexInst ][ (int) eJudgeResult ]++;\r
1217                                                         if ( !bPChipIsAutoPlay )\r
1218                                                         {\r
1219                                                                 this.nヒット数・Auto含まない[ indexInst ][ (int) eJudgeResult ]++;\r
1220                                                         }\r
1221                                                         break;\r
1222                                         }\r
1223                                         switch ( eJudgeResult )\r
1224                                         {\r
1225                                                 case E判定.Perfect:\r
1226                                                 case E判定.Great:\r
1227                                                 case E判定.Good:\r
1228                                                         this.actCombo.n現在のコンボ数[ indexInst ]++;\r
1229                                                         break;\r
1230 \r
1231                                                 default:\r
1232                                                         this.actCombo.n現在のコンボ数[ indexInst ] = 0;\r
1233                                                         break;\r
1234                                         }\r
1235                                         break;\r
1236 \r
1237                                 default:\r
1238                                         break;\r
1239                         }\r
1240                         if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )\r
1241                         {\r
1242                                 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];\r
1243                                 long nScoreDelta = 0;\r
1244                                 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };\r
1245                                 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )\r
1246                                 {\r
1247                                         nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * nCombos;\r
1248                                 }\r
1249                                 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )\r
1250                                 {\r
1251                                         nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * 500L;\r
1252                                 }\r
1253                                 this.actScore.Add( pChip.e楽器パート, bIsAutoPlay, nScoreDelta );\r
1254                         }\r
1255                         return eJudgeResult;\r
1256                 }\r
1257                 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part );\r
1258                 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane );\r
1259                 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )\r
1260                 {\r
1261                         this.tチップのヒット処理・BadならびにTight時のMiss( part, 0, screenmode );\r
1262                 }\r
1263                 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )\r
1264                 {\r
1265                         this.bAUTOでないチップが1つでもバーを通過した = true;\r
1266                         //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );\r
1267                         actGauge.Damage( screenmode, part, E判定.Miss );\r
1268                         switch ( part )\r
1269                         {\r
1270                                 case E楽器パート.DRUMS:\r
1271                                         if ( ( nLane >= 0 ) && ( nLane <= 7 ) )\r
1272                                         {\r
1273                                                 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );\r
1274                                         }\r
1275                                         this.actCombo.n現在のコンボ数.Drums = 0;\r
1276                                         return;\r
1277 \r
1278                                 case E楽器パート.GUITAR:\r
1279                                         this.actJudgeString.Start( 10, E判定.Bad, 999 );\r
1280                                         this.actCombo.n現在のコンボ数.Guitar = 0;\r
1281                                         return;\r
1282 \r
1283                                 case E楽器パート.BASS:\r
1284                                         this.actJudgeString.Start( 11, E判定.Bad, 999 );\r
1285                                         this.actCombo.n現在のコンボ数.Bass = 0;\r
1286                                         break;\r
1287 \r
1288                                 default:\r
1289                                         return;\r
1290                         }\r
1291                 }\r
1292         \r
1293                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )\r
1294                 {\r
1295                         return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );\r
1296                 }\r
1297                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )\r
1298                 {\r
1299                         sw2.Start();\r
1300 //Trace.TraceInformation( "nTime={0}, nChannel={1:x2}, 現在のTop={2}", nTime, nChannel,CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms );\r
1301                         nTime += nInputAdjustTime;\r
1302 \r
1303                         int nIndex_InitialPositionSearchingToPast;\r
1304                         int nTimeDiff;\r
1305                         if ( this.n現在のトップChip == -1 )                       // 演奏データとして1個もチップがない場合は\r
1306                         {\r
1307                                 sw2.Stop();\r
1308                                 return null;\r
1309                         }\r
1310                         int count = listChip.Count;\r
1311                         int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;\r
1312                         if ( this.n現在のトップChip >= count )            // その時点で演奏すべきチップが既に全部無くなっていたら\r
1313                         {\r
1314                                 nIndex_NearestChip_Future  = nIndex_InitialPositionSearchingToPast = count - 1;\r
1315                         }\r
1316                         // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;\r
1317 //                      while ( nIndex_NearestChip_Future < count )     // 未来方向への検索\r
1318                         for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )\r
1319                         {\r
1320                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];\r
1321                                 if ( !chip.bHit )\r
1322                                 {\r
1323                                         if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )\r
1324                                         {\r
1325                                                 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1326                                                 {\r
1327                                                         if ( chip.n発声時刻ms > nTime )\r
1328                                                         {\r
1329                                                                 break;\r
1330                                                         }\r
1331                                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1332                                                 }\r
1333                                                 continue;\r
1334                                         }\r
1335                                         else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1336                                         {\r
1337                                                 if ( chip.n発声時刻ms > nTime )\r
1338                                                 {\r
1339                                                         break;\r
1340                                                 }\r
1341                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1342                                         }\r
1343                                         else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1344                                         {\r
1345                                                 if ( chip.n発声時刻ms > nTime )\r
1346                                                 {\r
1347                                                         break;\r
1348                                                 }\r
1349                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1350                                         }\r
1351                                 }\r
1352 //                              nIndex_NearestChip_Future++;\r
1353                         }\r
1354                         int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;\r
1355 //                      while ( nIndex_NearestChip_Past >= 0 )          // 過去方向への検索\r
1356                         for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )\r
1357                         {\r
1358                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];\r
1359                                 if ( (!chip.bHit) &&\r
1360                                                 (\r
1361                                                         ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&\r
1362                                                                 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1363                                                         )\r
1364                                                         ||\r
1365                                                         (\r
1366                                                                 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||\r
1367                                                                 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1368                                                         )\r
1369                                                         ||\r
1370                                                         (\r
1371                                                                 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||\r
1372                                                                 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1373                                                         )\r
1374                                                 )\r
1375                                         )\r
1376                                         {\r
1377                                                 break;\r
1378                                         }\r
1379 //                              nIndex_NearestChip_Past--;\r
1380                         }\r
1381                         if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) )        // 検索対象が過去未来どちらにも見つからなかった場合\r
1382                         {\r
1383                                 sw2.Stop();\r
1384                                 return null;\r
1385                         }\r
1386                         CDTX.CChip nearestChip; // = null;      // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除\r
1387                         if ( nIndex_NearestChip_Future >= count )                                                                                       // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合\r
1388                         {\r
1389                                 nearestChip = listChip[ nIndex_NearestChip_Past ];\r
1390 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1391                         }\r
1392                         else if ( nIndex_NearestChip_Past < 0 )                                                                                         // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合\r
1393                         {\r
1394                                 nearestChip = listChip[ nIndex_NearestChip_Future ];\r
1395 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1396                         }\r
1397                         else\r
1398                         {\r
1399                                 int nTimeDiff_Future = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );\r
1400                                 int nTimeDiff_Past   = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Past   ].n発声時刻ms ) );\r
1401                                 if ( nTimeDiff_Future < nTimeDiff_Past )\r
1402                                 {\r
1403                                         nearestChip = listChip[ nIndex_NearestChip_Future ];\r
1404 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1405                                 }\r
1406                                 else\r
1407                                 {\r
1408                                         nearestChip = listChip[ nIndex_NearestChip_Past ];\r
1409 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1410                                 }\r
1411                         }\r
1412                         nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1413                         if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) )                                   // チップは見つかったが、検索範囲時間外だった場合\r
1414                         {\r
1415                                 sw2.Stop();\r
1416                                 return null;\r
1417                         }\r
1418                         sw2.Stop();\r
1419                         return nearestChip;\r
1420                 }\r
1421 \r
1422                 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )\r
1423                 {\r
1424                         switch ( (int) inst )\r
1425                         {\r
1426                                 case (int)E楽器パート.GUITAR:\r
1427                                         return r次にくるギターChipを更新して返す();\r
1428                                 case (int)E楽器パート.BASS:\r
1429                                         return r次にくるベースChipを更新して返す();\r
1430                                 default:\r
1431                                         return null;\r
1432                         }\r
1433                 }\r
1434                 protected CDTX.CChip r次にくるギターChipを更新して返す()\r
1435                 {\r
1436                         int nInputAdjustTime = this.bIsAutoPlay.GtPick ? 0 : this.nInputAdjustTimeMs.Guitar;\r
1437                         this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0x2f, nInputAdjustTime, 500 );\r
1438                         return this.r次にくるギターChip;\r
1439                 }\r
1440                 protected CDTX.CChip r次にくるベースChipを更新して返す()\r
1441                 {\r
1442                         int nInputAdjustTime = this.bIsAutoPlay.BsPick ? 0 : this.nInputAdjustTimeMs.Bass;\r
1443                         this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0xaf, nInputAdjustTime, 500 );\r
1444                         return this.r次にくるベースChip;\r
1445                 }\r
1446 \r
1447                 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus )           // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1448                 {\r
1449                         int part, offset = plusminus;\r
1450                         if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) )      // Guitar InputAdjustTime\r
1451                         {\r
1452                                 part = (int) E楽器パート.GUITAR;\r
1453                         }\r
1454                         else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) )     // Bass InputAdjustTime\r
1455                         {\r
1456                                 part = (int) E楽器パート.BASS;\r
1457                         }\r
1458                         else    // Drums InputAdjustTime\r
1459                         {\r
1460                                 part = (int) E楽器パート.DRUMS;\r
1461                         }\r
1462                         if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )\r
1463                         {\r
1464                                 offset *= 10;\r
1465                         }\r
1466 \r
1467                         this.nInputAdjustTimeMs[ part ] += offset;\r
1468                         if ( this.nInputAdjustTimeMs[ part ] > 0 )\r
1469                         {\r
1470                                 this.nInputAdjustTimeMs[ part ] = 0;\r
1471                         }\r
1472                         else if ( this.nInputAdjustTimeMs[ part ] < -99 )\r
1473                         {\r
1474                                 this.nInputAdjustTimeMs[ part ] = -99;\r
1475                         }\r
1476                         CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];\r
1477                 }\r
1478 \r
1479                 protected abstract void t入力処理・ドラム();\r
1480                 protected abstract void ドラムスクロール速度アップ();\r
1481                 protected abstract void ドラムスクロール速度ダウン();\r
1482                 protected void tキー入力()\r
1483                 {\r
1484                         IInputDevice keyboard = CDTXMania.Input管理.Keyboard;\r
1485                         if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&\r
1486                                 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1487                         {       // shift+f1 (pause)\r
1488                                 this.bPAUSE = !this.bPAUSE;\r
1489                                 if ( this.bPAUSE )\r
1490                                 {\r
1491                     CSound管理.rc演奏用タイマ.t一時停止();\r
1492                                         CDTXMania.Timer.t一時停止();\r
1493                                         CDTXMania.DTX.t全チップの再生一時停止();\r
1494                                 }\r
1495                                 else\r
1496                                 {\r
1497                     CSound管理.rc演奏用タイマ.t再開();\r
1498                                         CDTXMania.Timer.t再開();\r
1499                                         CDTXMania.DTX.t全チップの再生再開();\r
1500                                 }\r
1501                         }\r
1502                         if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1503                         {\r
1504                                 this.t入力処理・ドラム();\r
1505                                 this.t入力処理・ギターベース( E楽器パート.GUITAR );\r
1506                                 this.t入力処理・ギターベース( E楽器パート.BASS );\r
1507                                 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1508                                 {       // shift (+ctrl) + UpArrow (BGMAdjust)\r
1509                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );\r
1510                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1511                                 }\r
1512                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1513                                 {       // shift + DownArrow (BGMAdjust)\r
1514                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );\r
1515                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1516                                 }\r
1517                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )\r
1518                                 {       // UpArrow(scrollspeed up)\r
1519                                         ドラムスクロール速度アップ();\r
1520                                 }\r
1521                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )\r
1522                                 {       // DownArrow (scrollspeed down)\r
1523                                         ドラムスクロール速度ダウン();\r
1524                                 }\r
1525                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )\r
1526                                 {       // del (debug info)\r
1527                                         CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;\r
1528                                 }\r
1529                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) )           // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1530                                 {\r
1531                                         ChangeInputAdjustTimeInPlaying( keyboard, -1 );\r
1532                                 }\r
1533                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) )          // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1534                                 {\r
1535                                         ChangeInputAdjustTimeInPlaying( keyboard, +1 );\r
1536                                 }\r
1537                                 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )\r
1538                                 {       // escape (exit)\r
1539                                         this.actFO.tフェードアウト開始();\r
1540                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
1541                                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;\r
1542                                 }\r
1543                         }\r
1544                 }\r
1545 \r
1546                 protected void t入力メソッド記憶( E楽器パート part )\r
1547                 {\r
1548                         if ( CDTXMania.Pad.st検知したデバイス.Keyboard )\r
1549                         {\r
1550                                 this.b演奏にキーボードを使った[ (int) part ] = true;\r
1551                         }\r
1552                         if ( CDTXMania.Pad.st検知したデバイス.Joypad )\r
1553                         {\r
1554                                 this.b演奏にジョイパッドを使った[ (int) part ] = true;\r
1555                         }\r
1556                         if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )\r
1557                         {\r
1558                                 this.b演奏にMIDI入力を使った[ (int) part ] = true;\r
1559                         }\r
1560                         if ( CDTXMania.Pad.st検知したデバイス.Mouse )\r
1561                         {\r
1562                                 this.b演奏にマウスを使った[ (int) part ] = true;\r
1563                         }\r
1564                 }\r
1565 \r
1566 \r
1567                 protected abstract void t進行描画・AVI();\r
1568                 protected void t進行描画・AVI(int x, int y)\r
1569                 {\r
1570                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )\r
1571                         {\r
1572                                 this.actAVI.t進行描画( x, y );\r
1573                         }\r
1574                 }\r
1575                 protected abstract void t進行描画・BGA();\r
1576                 protected void t進行描画・BGA(int x, int y)\r
1577                 {\r
1578                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )\r
1579                         {\r
1580                                 this.actBGA.t進行描画( x, y );\r
1581                         }\r
1582                 }\r
1583                 protected abstract void t進行描画・DANGER();\r
1584                 protected void t進行描画・MIDIBGM()\r
1585                 {\r
1586                         if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )\r
1587                         {\r
1588                                 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;\r
1589                         }\r
1590                 }\r
1591                 protected void t進行描画・RGBボタン()\r
1592                 {\r
1593                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
1594                         {\r
1595                                 this.actRGB.On進行描画();\r
1596                         }\r
1597                 }\r
1598                 protected void t進行描画・STAGEFAILED()\r
1599                 {\r
1600                         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
1601                         {\r
1602                                 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;\r
1603                                 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;\r
1604                                 this.actFO.tフェードアウト開始();\r
1605                         }\r
1606                 }\r
1607                 protected void t進行描画・WailingBonus()\r
1608                 {\r
1609                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1610                         {\r
1611                                 this.actWailingBonus.On進行描画();\r
1612                         }\r
1613                 }\r
1614                 protected abstract void t進行描画・Wailing枠();\r
1615                 protected void t進行描画・Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)\r
1616                 {\r
1617                         if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )\r
1618                         {\r
1619                                 if ( this.txWailing枠 != null )\r
1620                                 {\r
1621                                         if ( CDTXMania.DTX.bチップがある.Guitar )\r
1622                                         {\r
1623                                                 this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );\r
1624                                         }\r
1625                                         if ( CDTXMania.DTX.bチップがある.Bass )\r
1626                                         {\r
1627                                                 this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );\r
1628                                         }\r
1629                                 }\r
1630                         }\r
1631                 }\r
1632 \r
1633 \r
1634                 protected void t進行描画・チップファイアGB()\r
1635                 {\r
1636                         this.actChipFireGB.On進行描画();\r
1637                 }\r
1638                 protected abstract void t進行描画・パネル文字列();\r
1639                 protected void t進行描画・パネル文字列(int x, int y)\r
1640                 {\r
1641                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1642                         {\r
1643                                 this.actPanel.t進行描画( x, y );\r
1644                         }\r
1645                 }\r
1646                 protected void tパネル文字列の設定()\r
1647                 {\r
1648                         this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );\r
1649                 }\r
1650 \r
1651 \r
1652                 protected void t進行描画・ゲージ()\r
1653                 {\r
1654                         if ( ( ( CDTXMania.ConfigIni.eDark != Eダークモード.HALF ) && ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) ) && ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) )\r
1655                         {\r
1656                                 this.actGauge.On進行描画();\r
1657                         }\r
1658                 }\r
1659                 protected void t進行描画・コンボ()\r
1660                 {\r
1661                         this.actCombo.On進行描画();\r
1662                 }\r
1663                 protected void t進行描画・スコア()\r
1664                 {\r
1665                         this.actScore.On進行描画();\r
1666                 }\r
1667                 protected void t進行描画・ステータスパネル()\r
1668                 {\r
1669                         this.actStatusPanels.On進行描画();\r
1670                 }\r
1671                 protected bool t進行描画・チップ( E楽器パート ePlayMode )\r
1672                 {\r
1673                         if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1674                         {\r
1675                                 return true;\r
1676                         }\r
1677                         if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= listChip.Count ) )\r
1678                         {\r
1679                                 return true;\r
1680                         }\r
1681                         if ( this.n現在のトップChip == -1 )\r
1682                         {\r
1683                                 return true;\r
1684                         }\r
1685 \r
1686                         //double speed = 264.0; // BPM150の時の1小節の長さ[dot]\r
1687                         const double speed = 234.0;     // BPM150の時の1小節の長さ[dot]\r
1688 \r
1689                         double ScrollSpeedDrums = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums + 1.0 ) * 0.5 * 37.5 * speed / 60000.0;\r
1690                         double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1691                         double ScrollSpeedBass = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1692 \r
1693                         CDTX dTX = CDTXMania.DTX;\r
1694                         CConfigIni configIni = CDTXMania.ConfigIni;\r
1695                         for ( int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )\r
1696                         {\r
1697                                 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];\r
1698 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );\r
1699                                 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedDrums );\r
1700                                 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedGuitar );\r
1701                                 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedBass );\r
1702                                 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 )\r
1703                                 {\r
1704                                         break;\r
1705                                 }\r
1706 //                              if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )\r
1707                                 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正\r
1708                                 if ( ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Drums < -65 ) && dTX.listChip[ this.n現在のトップChip ].bHit )\r
1709                                 {\r
1710 //                                      nCurrentTopChip = ++this.n現在のトップChip;\r
1711                                         ++this.n現在のトップChip;\r
1712                                         continue;\r
1713                                 }\r
1714 \r
1715                                 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );\r
1716 \r
1717                                 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];\r
1718 \r
1719                                 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&\r
1720                                         ( ( pChip.nバーからの距離dot.Drums < 0 ) && ( this.e指定時刻からChipのJUDGEを返す( CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )\r
1721                                 {\r
1722                                         this.tチップのヒット処理( CSound管理.rc演奏用タイマ.n現在時刻, pChip );\r
1723                                 }\r
1724                                 switch ( pChip.nチャンネル番号 )\r
1725                                 {\r
1726                                         #region [ 01: BGM ]\r
1727                                         case 0x01:      // BGM\r
1728                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1729                                                 {\r
1730                                                         pChip.bHit = true;\r
1731                                                         if ( configIni.bBGM音を発声する )\r
1732                                                         {\r
1733                                                                 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
1734                                                         }\r
1735                                                 }\r
1736                                                 break;\r
1737                                         #endregion\r
1738                                         #region [ 03: BPM変更 ]\r
1739                                         case 0x03:      // BPM変更\r
1740                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1741                                                 {\r
1742                                                         pChip.bHit = true;\r
1743                                                         this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1744                                                 }\r
1745                                                 break;\r
1746                                         #endregion\r
1747                                         #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]\r
1748                                         case 0x04:      // レイヤーBGA\r
1749                                         case 0x07:\r
1750                                         case 0x55:\r
1751                                         case 0x56:\r
1752                                         case 0x57:\r
1753                                         case 0x58:\r
1754                                         case 0x59:\r
1755                                         case 0x60:\r
1756                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1757                                                 {\r
1758                                                         pChip.bHit = true;\r
1759                                                         if ( configIni.bBGA有効 )\r
1760                                                         {\r
1761                                                                 switch ( pChip.eBGA種別 )\r
1762                                                                 {\r
1763                                                                         case EBGA種別.BMPTEX:\r
1764                                                                                 if ( pChip.rBMPTEX != null )\r
1765                                                                                 {\r
1766                                                                                         this.actBGA.Start( pChip.nチャンネル番号, 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
1767                                                                                 }\r
1768                                                                                 break;\r
1769 \r
1770                                                                         case EBGA種別.BGA:\r
1771                                                                                 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1772                                                                                 {\r
1773                                                                                         this.actBGA.Start( pChip.nチャンネル番号, 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
1774                                                                                 }\r
1775                                                                                 break;\r
1776 \r
1777                                                                         case EBGA種別.BGAPAN:\r
1778                                                                                 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1779                                                                                 {\r
1780                                                                                         this.actBGA.Start( pChip.nチャンネル番号, 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
1781                                                                                 }\r
1782                                                                                 break;\r
1783 \r
1784                                                                         default:\r
1785                                                                                 if ( pChip.rBMP != null )\r
1786                                                                                 {\r
1787                                                                                         this.actBGA.Start( pChip.nチャンネル番号, pChip.rBMP, null, pChip.rBMP.n幅, pChip.rBMP.n高さ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\r
1788                                                                                 }\r
1789                                                                                 break;\r
1790                                                                 }\r
1791                                                         }\r
1792                                                 }\r
1793                                                 break;\r
1794                                         #endregion\r
1795                                         #region [ 08: BPM変更(拡張) ]\r
1796                                         case 0x08:      // BPM変更(拡張)\r
1797                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1798                                                 {\r
1799                                                         pChip.bHit = true;\r
1800                                                         if ( dTX.listBPM.ContainsKey( pChip.n整数値・内部番号 ) )\r
1801                                                         {\r
1802                                                                 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値・内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1803                                                         }\r
1804                                                 }\r
1805                                                 break;\r
1806                                         #endregion\r
1807                                         #region [ 11-1a: ドラム演奏 ]\r
1808                                         case 0x11:      // ドラム演奏\r
1809                                         case 0x12:\r
1810                                         case 0x13:\r
1811                                         case 0x14:\r
1812                                         case 0x15:\r
1813                                         case 0x16:\r
1814                                         case 0x17:\r
1815                                         case 0x18:\r
1816                                         case 0x19:\r
1817                                         case 0x1a:\r
1818                                                 this.t進行描画・チップ・ドラムス( configIni, ref dTX, ref pChip );\r
1819                                                 break;\r
1820                                         #endregion\r
1821                                         #region [ 1f: フィルインサウンド(ドラム) ]\r
1822                                         case 0x1f:      // フィルインサウンド(ドラム)\r
1823                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1824                                                 {\r
1825                                                         pChip.bHit = true;\r
1826                                                         this.r現在の歓声Chip.Drums = pChip;\r
1827                                                 }\r
1828                                                 break;\r
1829                                         #endregion\r
1830                                         #region [ 20-27: ギター演奏 ]\r
1831                                         case 0x20:      // ギター演奏\r
1832                                         case 0x21:\r
1833                                         case 0x22:\r
1834                                         case 0x23:\r
1835                                         case 0x24:\r
1836                                         case 0x25:\r
1837                                         case 0x26:\r
1838                                         case 0x27:\r
1839                                                 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );\r
1840                                                 break;\r
1841                                         #endregion\r
1842                                         #region [ 28: ウェイリング(ギター) ]\r
1843                                         case 0x28:      // ウェイリング(ギター)\r
1844                                                 this.t進行描画・チップ・ギター・ウェイリング( configIni, ref dTX, ref pChip );\r
1845                                                 break;\r
1846                                         #endregion\r
1847                                         #region [ 2f: ウェイリングサウンド(ギター) ]\r
1848                                         case 0x2f:      // ウェイリングサウンド(ギター)\r
1849                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
1850                                                 {\r
1851                                                         pChip.bHit = true;\r
1852                                                         this.r現在の歓声Chip.Guitar = pChip;\r
1853                                                 }\r
1854                                                 break;\r
1855                                         #endregion\r
1856                                         #region [ 31-3a: 不可視チップ配置(ドラム) ]\r
1857                                         case 0x31:      // 不可視チップ配置(ドラム)\r
1858                                         case 0x32:\r
1859                                         case 0x33:\r
1860                                         case 0x34:\r
1861                                         case 0x35:\r
1862                                         case 0x36:\r
1863                                         case 0x37:\r
1864                                         case 0x38:\r
1865                                         case 0x39:\r
1866                                         case 0x3a:\r
1867                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1868                                                 {\r
1869                                                         pChip.bHit = true;\r
1870                                                 }\r
1871                                                 break;\r
1872                                         #endregion\r
1873                                         #region [ 50: 小節線 ]\r
1874                                         case 0x50:      // 小節線\r
1875                                                 {\r
1876                                                         this.t進行描画・チップ・小節線( configIni, ref dTX, ref pChip );\r
1877                                                         break;\r
1878                                                 }\r
1879                                         #endregion\r
1880                                         #region [ 51: 拍線 ]\r
1881                                         case 0x51:      // 拍線\r
1882                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1883                                                 {\r
1884                                                         pChip.bHit = true;\r
1885                                                 }\r
1886                                                 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )\r
1887                                                 {\r
1888                                                         this.txチップ.t2D描画( CDTXMania.app.Device, 0x23, configIni.bReverse.Drums ? ( ( 0x38 + pChip.nバーからの距離dot.Drums ) - 1 ) : ( ( 0x1a6 - pChip.nバーからの距離dot.Drums ) - 1 ), new Rectangle( 0, 0x1bf, 0x128, 1 ) );\r
1889                                                 }\r
1890                                                 break;\r
1891                                         #endregion\r
1892                                         #region [ 52: MIDIコーラス ]\r
1893                                         case 0x52:      // MIDIコーラス\r
1894                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1895                                                 {\r
1896                                                         pChip.bHit = true;\r
1897                                                 }\r
1898                                                 break;\r
1899                                         #endregion\r
1900                                         #region [ 53: フィルイン ]\r
1901                                         case 0x53:      // フィルイン\r
1902                                                 this.t進行描画・チップ・フィルイン( configIni, ref dTX, ref pChip );\r
1903                                                 break;\r
1904                                         #endregion\r
1905                                         #region [ 54: 動画再生 ]\r
1906                                         case 0x54:      // 動画再生\r
1907                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1908                                                 {\r
1909                                                         pChip.bHit = true;\r
1910                                                         if ( configIni.bAVI有効 )\r
1911                                                         {\r
1912                                                                 switch ( pChip.eAVI種別 )\r
1913                                                                 {\r
1914                                                                         case EAVI種別.AVI:\r
1915                                                                                 if ( pChip.rAVI != null )\r
1916                                                                                 {\r
1917                                                                                         this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, 0x116, 0x163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );\r
1918                                                                                 }\r
1919                                                                                 break;\r
1920 \r
1921                                                                         case EAVI種別.AVIPAN:\r
1922                                                                                 if ( pChip.rAVIPan != null )\r
1923                                                                                 {\r
1924                                                                                         this.actAVI.Start( pChip.nチャンネル番号, 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
1925                                                                                 }\r
1926                                                                                 break;\r
1927                                                                 }\r
1928                                                         }\r
1929                                                 }\r
1930                                                 break;\r
1931                                         #endregion\r
1932                                         #region [ 61-92: 自動再生(BGM, SE) ]\r
1933                                         case 0x61:\r
1934                                         case 0x62:\r
1935                                         case 0x63:\r
1936                                         case 0x64:      // 自動再生(BGM, SE)\r
1937                                         case 0x65:\r
1938                                         case 0x66:\r
1939                                         case 0x67:\r
1940                                         case 0x68:\r
1941                                         case 0x69:\r
1942                                         case 0x70:\r
1943                                         case 0x71:\r
1944                                         case 0x72:\r
1945                                         case 0x73:\r
1946                                         case 0x74:\r
1947                                         case 0x75:\r
1948                                         case 0x76:\r
1949                                         case 0x77:\r
1950                                         case 0x78:\r
1951                                         case 0x79:\r
1952                                         case 0x80:\r
1953                                         case 0x81:\r
1954                                         case 0x82:\r
1955                                         case 0x83:\r
1956                                         case 0x90:\r
1957                                         case 0x91:\r
1958                                         case 0x92:\r
1959                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1960                                                 {\r
1961                                                         pChip.bHit = true;\r
1962                                                         if ( configIni.bBGM音を発声する )\r
1963                                                         {\r
1964                                                                 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );\r
1965                                                                 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, ( int ) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
1966                                                                 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値・内部番号;\r
1967                                                         }\r
1968                                                 }\r
1969                                                 break;\r
1970                                         #endregion\r
1971 \r
1972 \r
1973                                         #region [ 84-89: 仮: override sound ]  // #26338 2011.11.8 yyagi\r
1974                                         case 0x84:      // HH (HO/HC)\r
1975                                         case 0x85:      // CY\r
1976                                         case 0x86:      // RD\r
1977                                         case 0x87:      // LC\r
1978                                         case 0x88:      // Guitar\r
1979                                         case 0x89:      // Bass\r
1980                                         // mute sound (auto)\r
1981                                         // 4A: 84: HH (HO/HC)\r
1982                                         // 4B: 85: CY\r
1983                                         // 4C: 86: RD\r
1984                                         // 4D: 87: LC\r
1985                                         // 2A: 88: Gt\r
1986                                         // AA: 89: Bs\r
1987 \r
1988                                         //      CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );\r
1989                                         //      CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );\r
1990                                         //      this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;\r
1991 \r
1992                                         //      protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )\r
1993                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1994                                                 {\r
1995                                                         pChip.bHit = true;\r
1996                                                         E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };\r
1997 \r
1998                                                         E楽器パート pp =  p[ pChip.nチャンネル番号 - 0x84 ];\r
1999                                                         \r
2000 //                                                      if ( pp == E楽器パート.DRUMS ) {                   // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。\r
2001 //                                                              //            HC    CY    RD    LC\r
2002 //                                                              int[] ch = { 0x11, 0x16, 0x19, 0x1A };\r
2003 //                                                              pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ]; \r
2004 //                                                      }\r
2005                                                         this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量( pp ) );\r
2006                                                 }\r
2007                                                 break;\r
2008                                         #endregion\r
2009 \r
2010                                         #region [ a0-a7: ベース演奏 ]\r
2011                                         case 0xa0:      // ベース演奏\r
2012                                         case 0xa1:\r
2013                                         case 0xa2:\r
2014                                         case 0xa3:\r
2015                                         case 0xa4:\r
2016                                         case 0xa5:\r
2017                                         case 0xa6:\r
2018                                         case 0xa7:\r
2019                                                 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.BASS );\r
2020                                                 break;\r
2021                                         #endregion\r
2022                                         #region [ a8: ウェイリング(ベース) ]\r
2023                                         case 0xa8:      // ウェイリング(ベース)\r
2024                                                 this.t進行描画・チップ・ベース・ウェイリング( configIni, ref dTX, ref pChip );\r
2025                                                 break;\r
2026                                         #endregion\r
2027                                         #region [ af: ウェイリングサウンド(ベース) ]\r
2028                                         case 0xaf:      // ウェイリングサウンド(ベース)\r
2029                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2030                                                 {\r
2031                                                         pChip.bHit = true;\r
2032                                                         this.r現在の歓声Chip.Bass = pChip;\r
2033                                                 }\r
2034                                                 break;\r
2035                                         #endregion\r
2036                                         #region [ b1-b9, bc: 空打ち音設定(ドラム) ]\r
2037                                         case 0xb1:      // 空打ち音設定(ドラム)\r
2038                                         case 0xb2:\r
2039                                         case 0xb3:\r
2040                                         case 0xb4:\r
2041                                         case 0xb5:\r
2042                                         case 0xb6:\r
2043                                         case 0xb7:\r
2044                                         case 0xb8:\r
2045                                         case 0xb9:\r
2046                                         case 0xbc:\r
2047                                                 this.t進行描画・チップ・空打ち音設定・ドラム( configIni, ref dTX, ref pChip );\r
2048                                                 break;\r
2049                                         #endregion\r
2050                                         #region [ ba: 空打ち音設定(ギター) ]\r
2051                                         case 0xba:      // 空打ち音設定(ギター)\r
2052                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
2053                                                 {\r
2054                                                         pChip.bHit = true;\r
2055                                                         this.r現在の空うちギターChip = pChip;\r
2056                                                         pChip.nチャンネル番号 = 0x20;\r
2057                                                 }\r
2058                                                 break;\r
2059                                         #endregion\r
2060                                         #region [ bb: 空打ち音設定(ベース) ]\r
2061                                         case 0xbb:      // 空打ち音設定(ベース)\r
2062                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2063                                                 {\r
2064                                                         pChip.bHit = true;\r
2065                                                         this.r現在の空うちベースChip = pChip;\r
2066                                                         pChip.nチャンネル番号 = 0xA0;\r
2067                                                 }\r
2068                                                 break;\r
2069                                         #endregion\r
2070                                         #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]\r
2071                                         case 0xc4:\r
2072                                         case 0xc7:\r
2073                                         case 0xd5:\r
2074                                         case 0xd6:      // BGA画像入れ替え\r
2075                                         case 0xd7:\r
2076                                         case 0xd8:\r
2077                                         case 0xd9:\r
2078                                         case 0xe0:\r
2079                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2080                                                 {\r
2081                                                         pChip.bHit = true;\r
2082                                                         if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )\r
2083                                                         {\r
2084                                                                 for ( int i = 0; i < 8; i++ )\r
2085                                                                 {\r
2086                                                                         if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )\r
2087                                                                         {\r
2088                                                                                 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );\r
2089                                                                         }\r
2090                                                                 }\r
2091                                                         }\r
2092                                                 }\r
2093                                                 break;\r
2094                                         #endregion\r
2095                                         #region [ da: ミキサーへチップ音追加 ]\r
2096                                         case 0xDA:\r
2097                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2098                                                 {\r
2099 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );\r
2100                                                         pChip.bHit = true;\r
2101                                                         if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )   // 参照が遠いので後日最適化する\r
2102                                                         {\r
2103                                                                 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];\r
2104                                                                 for ( int i = 0; i < nPolyphonicSounds; i++ )\r
2105                                                                 {\r
2106                                                                         if ( wc.rSound[ i ] != null )\r
2107                                                                         {\r
2108                                                                                 //CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );\r
2109                                                                                 AddMixer( wc.rSound[ i ] );\r
2110                                                                         }\r
2111                                                                 }\r
2112                                                         }\r
2113                                                 }\r
2114                                                 break;\r
2115                                         #endregion\r
2116                                         #region [ db: ミキサーからチップ音削除 ]\r
2117                                         case 0xDB:\r
2118                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2119                                                 {\r
2120 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );\r
2121                                                         pChip.bHit = true;\r
2122                                                         if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )   // 参照が遠いので後日最適化する\r
2123                                                         {\r
2124                                                             CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];\r
2125                                                             for ( int i = 0; i < nPolyphonicSounds; i++ )\r
2126                                                             {\r
2127                                                                         if ( wc.rSound[ i ] != null )\r
2128                                                                         {\r
2129                                                                                 //CDTXMania.Sound管理.RemoveMixer( wc.rSound[ i ] );\r
2130                                                                                 RemoveMixer( wc.rSound[ i ] );\r
2131                                                                         }\r
2132                                                             }\r
2133                                                         }\r
2134                                                 }\r
2135                                                 break;\r
2136                                         #endregion\r
2137                                         #region [ その他(未定義) ]\r
2138                                         default:\r
2139                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2140                                                 {\r
2141                                                         pChip.bHit = true;\r
2142                                                 }\r
2143                                                 break;\r
2144                                         #endregion \r
2145                                 }\r
2146                         }\r
2147                         return false;\r
2148                 }\r
2149 \r
2150                 private bool bCheckAutoPlay( CDTX.CChip pChip )\r
2151                 {\r
2152                         bool bPChipIsAutoPlay = false;\r
2153                         bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2154                         bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2155                         bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2156                         bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2157                         bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2158                         //if ( (\r
2159                         //        ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||\r
2160                         //        ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||\r
2161                         //        ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )\r
2162                         //  )\r
2163                         ////                            if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])\r
2164                         //{\r
2165                         //    bPChipIsAutoPlay = true;\r
2166                         //}\r
2167                         if ( pChip.e楽器パート == E楽器パート.DRUMS )\r
2168                         {\r
2169                                 if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )\r
2170                                 {\r
2171                                         bPChipIsAutoPlay = true;\r
2172                                 }\r
2173                         }\r
2174                         else if ( pChip.e楽器パート == E楽器パート.GUITAR )\r
2175                         {\r
2176                                 //Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );\r
2177                                 //Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);\r
2178                                 bPChipIsAutoPlay = true;\r
2179                                 if ( bIsAutoPlay[ (int) Eレーン.GtPick ] == false ) bPChipIsAutoPlay = false;\r
2180                                 else\r
2181                                 {\r
2182                                         if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.GtR ] == false ) bPChipIsAutoPlay = false;\r
2183                                         else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.GtG ] == false ) bPChipIsAutoPlay = false;\r
2184                                         else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.GtB ] == false ) bPChipIsAutoPlay = false;\r
2185                                         else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.GtW ] == false ) bPChipIsAutoPlay = false;\r
2186                                         else if ( bGtBsO == true &&\r
2187                                                 ( bIsAutoPlay[ (int) Eレーン.GtR ] == false || bIsAutoPlay[ (int) Eレーン.GtG ] == false || bIsAutoPlay[ (int) Eレーン.GtB ] == false ) )\r
2188                                                 bPChipIsAutoPlay = false;\r
2189                                 }\r
2190                                 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );\r
2191                         }\r
2192                         else if ( pChip.e楽器パート == E楽器パート.BASS )\r
2193                         {\r
2194                                 bPChipIsAutoPlay = true;\r
2195                                 if ( bIsAutoPlay[ (int) Eレーン.BsPick ] == false ) bPChipIsAutoPlay = false;\r
2196                                 else\r
2197                                 {\r
2198                                         if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.BsR ] == false ) bPChipIsAutoPlay = false;\r
2199                                         else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.BsG ] == false ) bPChipIsAutoPlay = false;\r
2200                                         else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.BsB ] == false ) bPChipIsAutoPlay = false;\r
2201                                         else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.BsW ] == false ) bPChipIsAutoPlay = false;\r
2202                                         else if ( bGtBsO == true &&\r
2203                                                 ( bIsAutoPlay[ (int) Eレーン.BsR ] == false || bIsAutoPlay[ (int) Eレーン.BsG ] == false || bIsAutoPlay[ (int) Eレーン.BsB ] == false ) )\r
2204                                                 bPChipIsAutoPlay = false;\r
2205                                 }\r
2206                         }\r
2207                         return bPChipIsAutoPlay;\r
2208                 }\r
2209 \r
2210                 protected abstract void t進行描画・チップ・ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2211                 //protected abstract void t進行描画・チップ・ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2212                 protected abstract void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst );\r
2213 \r
2214                 protected void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst,\r
2215                         int barYNormal, int barYReverse, int showRangeY0, int showRangeY1, int openXg, int openXb,\r
2216                         int rectOpenOffsetX, int rectOpenOffsetY, int openChipWidth, int chipHeight,\r
2217                         int chipWidth, int guitarNormalX, int guitarLeftyX, int bassNormalX, int bassLeftyX, int drawDeltaX, int chipTexDeltaX )\r
2218                 {\r
2219                         int instIndex = (int) inst;\r
2220                         if ( configIni.bGuitar有効 )\r
2221                         {\r
2222                                 #region [ Hidden/Sudden処理 ]\r
2223                                 if ( configIni.bSudden[ instIndex ] )\r
2224                                 {\r
2225                                         pChip.b可視 = pChip.nバーからの距離dot[ instIndex ] < 200;\r
2226                                 }\r
2227                                 if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 ) )\r
2228                                 {\r
2229                                         pChip.b可視 = false;\r
2230                                 }\r
2231                                 #endregion\r
2232 \r
2233                                 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2234                                 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2235                                 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2236                                 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2237                                 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2238 \r
2239                                 #region [ chip描画 ]\r
2240                                 int OPEN = ( inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;\r
2241                                 if ( !pChip.bHit && pChip.b可視 )\r
2242                                 {\r
2243                                         int y = configIni.bReverse[ instIndex ] ? ( barYReverse - pChip.nバーからの距離dot[ instIndex ] ) : ( barYNormal + pChip.nバーからの距離dot[ instIndex ] );\r
2244                                         if ( ( showRangeY0 < y ) && ( y < showRangeY1 ) )\r
2245                                         {\r
2246                                                 if ( this.txチップ != null )\r
2247                                                 {\r
2248                                                         int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;\r
2249                                                         if ( pChip.nチャンネル番号 == OPEN )\r
2250                                                         {\r
2251                                                                 int xo = ( inst == E楽器パート.GUITAR ) ? openXg : openXb;\r
2252                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, xo, y - 2, new Rectangle( rectOpenOffsetX, rectOpenOffsetY + ( ( nアニメカウンタ現在の値 % 5 ) * chipHeight ), openChipWidth, chipHeight ) );\r
2253                                                         }\r
2254                                                         Rectangle rc = new Rectangle( rectOpenOffsetX, nアニメカウンタ現在の値 * chipHeight, chipWidth, chipHeight );\r
2255                                                         int x;\r
2256                                                         if ( inst == E楽器パート.GUITAR )\r
2257                                                         {\r
2258                                                                 x = ( configIni.bLeft.Guitar ) ? guitarLeftyX : guitarNormalX;\r
2259                                                         }\r
2260                                                         else\r
2261                                                         {\r
2262                                                                 x = ( configIni.bLeft.Bass ) ? bassLeftyX : bassNormalX;\r
2263                                                         }\r
2264                                                         int deltaX = ( configIni.bLeft[ instIndex ] ) ? -drawDeltaX : +drawDeltaX;\r
2265 \r
2266 //Trace.TraceInformation( "chip={0:x2}, E楽器パート={1}, x={2}", pChip.nチャンネル番号, inst, x );\r
2267                                                         if ( bChipHasR )\r
2268                                                         {\r
2269                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );\r
2270                                                         }\r
2271                                                         rc.X += chipTexDeltaX;\r
2272                                                         x += deltaX;\r
2273                                                         if ( bChipHasG )\r
2274                                                         {\r
2275                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );\r
2276                                                         }\r
2277                                                         rc.X += chipTexDeltaX;\r
2278                                                         x += deltaX;\r
2279                                                         if ( bChipHasB )\r
2280                                                         {\r
2281                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );\r
2282                                                         }\r
2283                                                 }\r
2284                                         }\r
2285                                 }\r
2286                                 #endregion\r
2287                                 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
2288                                 if ( ( !pChip.bHit ) && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )\r
2289                                 {\r
2290                                         int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3;   // lane offset\r
2291                                         bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;\r
2292                                         bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;\r
2293                                         bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;\r
2294                                         bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;\r
2295                                         bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );\r
2296                                         bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );\r
2297                                         bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );\r
2298 \r
2299                                         #region [ Chip Fire effects ]\r
2300                                         bool bSuccessOPEN = bChipIsO && ( autoR || !pushingR ) && ( autoG || !pushingG ) && ( autoB || !pushingB );\r
2301                                         if ( ( bChipHasR && ( autoR || pushingR ) && autoPick ) || bSuccessOPEN )\r
2302                                         {\r
2303                                                 this.actChipFireGB.Start( 0 + lo );\r
2304                                         }\r
2305                                         if ( ( bChipHasG && ( autoG || pushingG ) && autoPick ) || bSuccessOPEN )\r
2306                                         {\r
2307                                                 this.actChipFireGB.Start( 1 + lo );\r
2308                                         }\r
2309                                         if ( ( bChipHasB && ( autoB || pushingB ) && autoPick ) || bSuccessOPEN )\r
2310                                         {\r
2311                                                 this.actChipFireGB.Start( 2 + lo );\r
2312                                         }\r
2313                                         #endregion\r
2314                                         if ( autoPick )\r
2315                                         {\r
2316                                                 bool bMiss = true;\r
2317                                                 if ( bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB )           // autoレーンとチップレーン一致時はOK\r
2318                                                 {                                                                                                                                                       // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。\r
2319                                                         bMiss = false;\r
2320                                                 }\r
2321                                                 else if ( ( autoR || ( bChipHasR == pushingR ) ) && ( autoG || ( bChipHasG == pushingG ) ) && ( autoB || ( bChipHasB == pushingB ) ) )\r
2322                                                         // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )\r
2323                                                 {\r
2324                                                         bMiss = false;\r
2325                                                 }\r
2326                                                 else if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ) // OPEN時\r
2327                                                 {\r
2328                                                         bMiss = false;\r
2329                                                 }\r
2330                                                 pChip.bHit = true;\r
2331                                                 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );\r
2332                                                 this.r次にくるギターChip = null;\r
2333                                                 if ( !bMiss )\r
2334                                                 {\r
2335                                                         this.tチップのヒット処理( pChip.n発声時刻ms, pChip );\r
2336                                                 }\r
2337                                                 else\r
2338                                                 {\r
2339                                                         pChip.nLag = 0;         // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入\r
2340                                                         this.tチップのヒット処理( pChip.n発声時刻ms, pChip, false );\r
2341                                                 }\r
2342                                                 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;\r
2343                                                 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( pChip.n発声時刻ms, chWailingChip, this.nInputAdjustTimeMs[ instIndex ], 140 );\r
2344                                                 if ( item != null && !bMiss )\r
2345                                                 {\r
2346                                                         this.queWailing[ instIndex ].Enqueue( item );\r
2347                                                 }\r
2348                                         }\r
2349                                 }\r
2350                                 return;\r
2351                         }       // end of "if configIni.bGuitar有効"\r
2352                         if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )      // Guitar/Bass無効の場合は、自動演奏する\r
2353                         {\r
2354                                 pChip.bHit = true;\r
2355                                 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );\r
2356                         }\r
2357                 }\r
2358 \r
2359                 \r
2360                 protected virtual void t進行描画・チップ・ギターベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )\r
2361                 {\r
2362                         int indexInst = (int) inst;\r
2363                         if ( configIni.bGuitar有効 )\r
2364                         {\r
2365                                 #region [ Sudden/Hidden処理 ]\r
2366                                 if ( configIni.bSudden[indexInst] )\r
2367                                 {\r
2368                                         pChip.b可視 = pChip.nバーからの距離dot[indexInst] < 200;\r
2369                                 }\r
2370                                 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 ) )\r
2371                                 {\r
2372                                         pChip.b可視 = false;\r
2373                                 }\r
2374                                 #endregion\r
2375                                 //\r
2376                                 // ここにチップ更新処理が入る(overrideで入れる)。といっても座標とチップサイズが違うだけで処理はまるまる同じ。\r
2377                                 //\r
2378                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )\r
2379                                 {\r
2380                                         if ( pChip.nバーからの距離dot[indexInst] < -234 )        // #25253 2011.5.29 yyagi: Don't set pChip.bHit=true for wailing at once. It need to 1sec-delay (234pix per 1sec). \r
2381                                         {\r
2382                                                 pChip.bHit = true;\r
2383                                         }\r
2384                                         bool autoW = ( inst == E楽器パート.GUITAR ) ? configIni.bAutoPlay.GtW : configIni.bAutoPlay.BsW;\r
2385                                         //if ( configIni.bAutoPlay[ ((int) Eレーン.Guitar - 1) + indexInst ] )       // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
2386                                         if ( autoW )\r
2387                                         {\r
2388                                         //    pChip.bHit = true;                                                                // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.\r
2389                                         //    this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );\r
2390                                         // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.\r
2391                                         // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time\r
2392                                                 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
2393                                                 DoWailingFromQueue( inst, nTimeStamp_Wailed, autoW );\r
2394                                         }\r
2395                                 }\r
2396                                 return;\r
2397                         }\r
2398                         pChip.bHit = true;\r
2399                 }\r
2400                 protected virtual void t進行描画・チップ・ギター・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2401                 {\r
2402                         t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );\r
2403                 }\r
2404                 protected abstract void t進行描画・チップ・フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2405                 protected abstract void t進行描画・チップ・小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2406                 //protected abstract void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2407                 protected virtual void t進行描画・チップ・ベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2408                 {\r
2409                         t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS );\r
2410                 }\r
2411                 protected abstract void t進行描画・チップ・空打ち音設定・ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2412                 protected void t進行描画・チップアニメ()\r
2413                 {\r
2414                         for ( int i = 0; i < 3; i++ )                   // 0=drums, 1=guitar, 2=bass\r
2415                         {\r
2416                                 if ( this.ctチップ模様アニメ[ i ] != null )\r
2417                                 {\r
2418                                         this.ctチップ模様アニメ[ i ].t進行Loop();\r
2419                                 }\r
2420                         }\r
2421                         if ( this.ctWailingチップ模様アニメ != null )\r
2422                         {\r
2423                                 this.ctWailingチップ模様アニメ.t進行Loop();\r
2424                         }\r
2425                 }\r
2426 \r
2427                 protected bool t進行描画・フェードイン・アウト()\r
2428                 {\r
2429                         switch ( base.eフェーズID )\r
2430                         {\r
2431                                 case CStage.Eフェーズ.共通_フェードイン:\r
2432                                         if ( this.actFI.On進行描画() != 0 )\r
2433                                         {\r
2434                                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
2435                                         }\r
2436                                         break;\r
2437 \r
2438                                 case CStage.Eフェーズ.共通_フェードアウト:\r
2439                                 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:\r
2440                                         if ( this.actFO.On進行描画() != 0 )\r
2441                                         {\r
2442                                                 return true;\r
2443                                         }\r
2444                                         break;\r
2445 \r
2446                                 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:\r
2447                                         if ( this.actFOClear.On進行描画() == 0 )\r
2448                                         {\r
2449                                                 break;\r
2450                                         }\r
2451                                         return true;\r
2452                 \r
2453                         }\r
2454                         return false;\r
2455                 }\r
2456                 protected void t進行描画・レーンフラッシュD()\r
2457                 {\r
2458                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
2459                         {\r
2460                                 this.actLaneFlushD.On進行描画();\r
2461                         }\r
2462                 }\r
2463                 protected void t進行描画・レーンフラッシュGB()\r
2464                 {\r
2465                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )\r
2466                         {\r
2467                                 this.actLaneFlushGB.On進行描画();\r
2468                         }\r
2469                 }\r
2470                 protected abstract void t進行描画・演奏情報();\r
2471                 protected void t進行描画・演奏情報(int x, int y)\r
2472                 {\r
2473                         if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )\r
2474                         {\r
2475                                 this.actPlayInfo.t進行描画( x, y );\r
2476                         }\r
2477                 }\r
2478                 protected void t進行描画・背景()\r
2479                 {\r
2480                         if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )\r
2481                         {\r
2482                                 if ( this.tx背景 != null )\r
2483                                 {\r
2484                                         this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
2485                                 }\r
2486                         }\r
2487                         else\r
2488                         {\r
2489                                 CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );\r
2490                         }\r
2491                 }\r
2492 \r
2493                 protected void t進行描画・判定ライン()\r
2494                 {\r
2495                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
2496                         {\r
2497                                 int y = CDTXMania.ConfigIni.bReverse.Drums ? 0x35 : 0x1a3;\r
2498                                 for ( int i = 0x20; i < 0x14f; i += 8 )\r
2499                                 {\r
2500                                         if ( this.txヒットバー != null )\r
2501                                         {\r
2502                                                 this.txヒットバー.t2D描画( CDTXMania.app.Device, i, y, new Rectangle( 0, 0, ( ( i + 8 ) >= 0x14f ) ? ( 7 - ( ( i + 8 ) - 0x14f ) ) : 8, 8 ) );\r
2503                                         }\r
2504                                 }\r
2505                         }\r
2506                 }\r
2507                 protected void t進行描画・判定文字列()\r
2508                 {\r
2509                         this.actJudgeString.On進行描画();\r
2510                 }\r
2511                 protected void t進行描画・判定文字列1・通常位置指定の場合()\r
2512                 {\r
2513                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.判定ライン上または横 )\r
2514                         {\r
2515                                 this.actJudgeString.On進行描画();\r
2516                         }\r
2517                 }\r
2518                 protected void t進行描画・判定文字列2・判定ライン上指定の場合()\r
2519                 {\r
2520                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.判定ライン上または横 )\r
2521                         {\r
2522                                 this.actJudgeString.On進行描画();\r
2523                         }\r
2524                 }\r
2525 \r
2526                 protected void t進行描画・譜面スクロール速度()\r
2527                 {\r
2528                         this.act譜面スクロール速度.On進行描画();\r
2529                 }\r
2530 \r
2531                 protected abstract void t背景テクスチャの生成();\r
2532                 protected void t背景テクスチャの生成( string DefaultBgFilename, Rectangle bgrect, string bgfilename )\r
2533                 {\r
2534                         Bitmap image = null;\r
2535                         bool flag = true;\r
2536 \r
2537                         if ( bgfilename != null && File.Exists( bgfilename ) )\r
2538                         {\r
2539                                 try\r
2540                                 {\r
2541                                         Bitmap bitmap2 = null;\r
2542                                         bitmap2 = new Bitmap( bgfilename );\r
2543                                         if ( ( bitmap2.Size.Width == 0 ) && ( bitmap2.Size.Height == 0 ) )\r
2544                                         {\r
2545                                                 this.tx背景 = null;\r
2546                                                 return;\r
2547                                         }\r
2548                                         Bitmap bitmap3 = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height);\r
2549                                         Graphics graphics = Graphics.FromImage( bitmap3 );\r
2550                                         for ( int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height )\r
2551                                         {\r
2552                                                 for ( int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width )\r
2553                                                 {\r
2554                                                         graphics.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );\r
2555                                                 }\r
2556                                         }\r
2557                                         graphics.Dispose();\r
2558                                         bitmap2.Dispose();\r
2559                                         image = new Bitmap( CSkin.Path( DefaultBgFilename ) );\r
2560                                         graphics = Graphics.FromImage( image );\r
2561                                         ColorMatrix matrix2 = new ColorMatrix();\r
2562                                         matrix2.Matrix00 = 1f;\r
2563                                         matrix2.Matrix11 = 1f;\r
2564                                         matrix2.Matrix22 = 1f;\r
2565                                         matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;\r
2566                                         matrix2.Matrix44 = 1f;\r
2567                                         ColorMatrix newColorMatrix = matrix2;\r
2568                                         ImageAttributes imageAttr = new ImageAttributes();\r
2569                                         imageAttr.SetColorMatrix( newColorMatrix );\r
2570                                         graphics.DrawImage( bitmap3, new Rectangle( 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height ), 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height, GraphicsUnit.Pixel, imageAttr );\r
2571                                         imageAttr.Dispose();\r
2572                                         graphics.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );\r
2573                                         graphics.Dispose();\r
2574                                         bitmap3.Dispose();\r
2575                                         flag = false;\r
2576                                 }\r
2577                                 catch\r
2578                                 {\r
2579                                         Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );\r
2580                                 }\r
2581                         }\r
2582                         if ( flag )\r
2583                         {\r
2584                                 bgfilename = CSkin.Path( DefaultBgFilename );\r
2585                                 try\r
2586                                 {\r
2587                                         image = new Bitmap( bgfilename );\r
2588                                 }\r
2589                                 catch\r
2590                                 {\r
2591                                         Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );\r
2592                                         this.tx背景 = null;\r
2593                                         return;\r
2594                                 }\r
2595                         }\r
2596                         if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) )\r
2597                         {\r
2598                                 Graphics graphics2 = Graphics.FromImage( image );\r
2599                                 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );\r
2600                                 graphics2.Dispose();\r
2601                         }\r
2602                         try\r
2603                         {\r
2604                                 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );\r
2605                         }\r
2606                         catch ( CTextureCreateFailedException )\r
2607                         {\r
2608                                 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );\r
2609                                 this.tx背景 = null;\r
2610                         }\r
2611                         image.Dispose();\r
2612                 }\r
2613 \r
2614                 protected virtual void t入力処理・ギター()\r
2615                 {\r
2616                         t入力処理・ギターベース( E楽器パート.GUITAR );\r
2617                 }\r
2618                 protected virtual void t入力処理・ベース()\r
2619                 {\r
2620                         t入力処理・ギターベース( E楽器パート.BASS );\r
2621                 }\r
2622 \r
2623 \r
2624                 protected virtual void t入力処理・ギターベース(E楽器パート inst)\r
2625                 {\r
2626                         int indexInst = (int) inst;\r
2627                         #region [ スクロール速度変更 ]\r
2628                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )\r
2629                         {\r
2630                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1, 0x7cf );\r
2631                         }\r
2632                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )\r
2633                         {\r
2634                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );\r
2635                         }\r
2636                         #endregion\r
2637 \r
2638                         if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )\r
2639                         {\r
2640                                 return;\r
2641                         }\r
2642 \r
2643                         int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;\r
2644                         int G = R + 1;\r
2645                         int B = R + 2;\r
2646                         bool autoW =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtW : bIsAutoPlay.BsW;\r
2647                         bool autoR =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;\r
2648                         bool autoG =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;\r
2649                         bool autoB =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;\r
2650                         bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;\r
2651                         int nAutoW = ( autoW ) ? 8 : 0;\r
2652                         int nAutoR = ( autoR ) ? 4 : 0;\r
2653                         int nAutoG = ( autoG ) ? 2 : 0;\r
2654                         int nAutoB = ( autoB ) ? 1 : 0;\r
2655                         int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;\r
2656 \r
2657 //                      if ( bIsAutoPlay[ (int) Eレーン.Guitar - 1 + indexInst ] )   // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
2658 //                      {\r
2659                         CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);\r
2660                         if ( chip != null )     \r
2661                         {\r
2662                                 if ( ( chip.nチャンネル番号 & 4 ) != 0 && autoR )\r
2663                                 {\r
2664                                         this.actLaneFlushGB.Start( R );\r
2665                                         this.actRGB.Push( R );\r
2666                                 }\r
2667                                 if ( ( chip.nチャンネル番号 & 2 ) != 0 && autoG )\r
2668                                 {\r
2669                                         this.actLaneFlushGB.Start( G );\r
2670                                         this.actRGB.Push( G );\r
2671                                 }\r
2672                                 if ( ( chip.nチャンネル番号 & 1 ) != 0 && autoB )\r
2673                                 {\r
2674                                         this.actLaneFlushGB.Start( B );\r
2675                                         this.actRGB.Push( B );\r
2676                                 }\r
2677 //                      }\r
2678 \r
2679                         }\r
2680 //                      else\r
2681                         {\r
2682                                 int pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;\r
2683                                 this.t入力メソッド記憶( inst );\r
2684                                 int pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;\r
2685                                 this.t入力メソッド記憶( inst );\r
2686                                 int pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;\r
2687                                 this.t入力メソッド記憶( inst );\r
2688                                 int flagRGB = pushingR | pushingG | pushingB;\r
2689                                 if ( pushingR != 0 )\r
2690                                 {\r
2691                                         this.actLaneFlushGB.Start( R );\r
2692                                         this.actRGB.Push( R );\r
2693                                 }\r
2694                                 if ( pushingG != 0 )\r
2695                                 {\r
2696                                         this.actLaneFlushGB.Start( G );\r
2697                                         this.actRGB.Push( G );\r
2698                                 }\r
2699                                 if ( pushingB != 0 )\r
2700                                 {\r
2701                                         this.actLaneFlushGB.Start( B );\r
2702                                         this.actRGB.Push( B );\r
2703                                 }\r
2704                                 // auto pickだとここから先に行かないので注意\r
2705                                 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );\r
2706                                 if ( ( events != null ) && ( events.Count > 0 ) )\r
2707                                 {\r
2708                                         foreach ( STInputEvent eventPick in events )\r
2709                                         {\r
2710                                                 if ( !eventPick.b押された )\r
2711                                                 {\r
2712                                                         continue;\r
2713                                                 }\r
2714                                                 this.t入力メソッド記憶( inst );\r
2715                                                 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
2716                                                 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;\r
2717                                                 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] );      // E楽器パート.GUITARなチップ全てにヒットする\r
2718                                                 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );\r
2719 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号,  ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );\r
2720                                                 if ( ( pChip != null ) && ( ( ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F ) == ( ( flagRGB & ~nAutoMask) & 0x0F ) ) && ( e判定 != E判定.Miss ) )\r
2721                                                 {\r
2722                                                         bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2723                                                         bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2724                                                         bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2725                                                         bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2726                                                         bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2727                                                         bool bSuccessOPEN = bChipIsO && ( autoR || pushingR == 0 ) && ( autoG || pushingG == 0 ) && ( autoB || pushingB == 0 );\r
2728                                                         if ( ( bChipHasR && ( autoR || pushingR != 0 ) ) || bSuccessOPEN )\r
2729                                                         //if ( ( pushingR != 0 ) || autoR || ( flagRGB == 0 ) )\r
2730                                                         {\r
2731                                                                 this.actChipFireGB.Start( R );\r
2732                                                         }\r
2733                                                         if ( ( bChipHasG && ( autoG || pushingG != 0 ) ) || bSuccessOPEN )\r
2734                                                         //if ( ( pushingG != 0 ) || autoG || ( flagRGB == 0 ) )\r
2735                                                         {\r
2736                                                                 this.actChipFireGB.Start( G );\r
2737                                                         }\r
2738                                                         if ( ( bChipHasB && ( autoB || pushingB != 0 ) ) || bSuccessOPEN )\r
2739                                                         //if ( ( pushingB != 0 ) || autoB || ( flagRGB == 0 ) )\r
2740                                                         {\r
2741                                                                 this.actChipFireGB.Start( B );\r
2742                                                         }\r
2743                                                         this.tチップのヒット処理( nTime, pChip );\r
2744                                                         this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );\r
2745                                                         int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;\r
2746                                                         CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );\r
2747                                                         if ( item != null )\r
2748                                                         {\r
2749                                                                 this.queWailing[indexInst].Enqueue( item );\r
2750                                                         }\r
2751                                                         continue;\r
2752                                                 }\r
2753 \r
2754                                                 // 以下、間違いレーンでのピック時\r
2755                                                 CDTX.CChip NoChipPicked = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;\r
2756                                                 if ( ( NoChipPicked != null ) || ( ( NoChipPicked = this.r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )\r
2757                                                 {\r
2758                                                         this.tサウンド再生( NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );\r
2759                                                 }\r
2760                                                 if ( !CDTXMania.ConfigIni.bLight[indexInst] )\r
2761                                                 {\r
2762                                                         this.tチップのヒット処理・BadならびにTight時のMiss( inst );\r
2763                                                 }\r
2764                                         }\r
2765                                 }\r
2766                                 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );\r
2767                                 if ( ( list != null ) && ( list.Count > 0 ) )\r
2768                                 {\r
2769                                         foreach ( STInputEvent eventWailed in list )\r
2770                                         {\r
2771                                                 if ( !eventWailed.b押された )\r
2772                                                 {\r
2773                                                         continue;\r
2774                                                 }\r
2775                                                 DoWailingFromQueue( inst, eventWailed.nTimeStamp,  autoW );\r
2776                                         }\r
2777                                 }\r
2778                         }\r
2779                 }\r
2780 \r
2781                 private void DoWailingFromQueue( E楽器パート inst, long nTimeStamp_Wailed,  bool autoW )\r
2782                 {\r
2783                         int indexInst = (int) inst;\r
2784                         long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
2785                         CDTX.CChip chipWailing;\r
2786                         while ( ( this.queWailing[ indexInst ].Count > 0 ) && ( ( chipWailing = this.queWailing[ indexInst ].Dequeue() ) != null ) )\r
2787                         {\r
2788                                 if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 )            // #24245 2011.1.26 yyagi: 800 -> 1000\r
2789                                 {\r
2790                                         chipWailing.bHit = true;\r
2791                                         this.actWailingBonus.Start( inst, this.r現在の歓声Chip[ indexInst ] );\r
2792                                         //if ( !bIsAutoPlay[indexInst] )\r
2793                                         if ( !autoW )\r
2794                                         {\r
2795                                                 int nCombo = ( this.actCombo.n現在のコンボ数[ indexInst ] < 500 ) ? this.actCombo.n現在のコンボ数[ indexInst ] : 500;\r
2796                                                 this.actScore.Add( inst, bIsAutoPlay, nCombo * 3000L );         // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions\r
2797                                         }\r
2798                                 }\r
2799                         }\r
2800                 }\r
2801         #endregion\r
2802         }\r
2803 }\r