OSDN Git Service

#36057 コンフィグまわりのリファクタ(リソース不完全なので注意)
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / スコア、曲 / CChip.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Linq;\r
4 using System.Text;\r
5 using System.Threading.Tasks;\r
6 \r
7 namespace DTXMania\r
8 {\r
9         public class CChip : IComparable<CChip>, ICloneable\r
10         {\r
11                 public bool bHit { get; set; }\r
12                 public bool b可視 { get; set; }\r
13                 public int n透明度 { get; set; }\r
14                 public int nLag { get; set; }       // 2011.2.1 yyagi\r
15                 public int n楽器パートでの出現順 { get; set; }               // #35411 2015.08.20 chnmr0\r
16                 public bool bTargetGhost判定済み { get; set; }               // #35411 2015.08.22 chnmr0\r
17                 public bool extendInfoForGhost { get; set; } // 2015.9.29 chnmr0\r
18 \r
19                 public bool bIsAutoPlayed { get; private set; }             // 2011.6.10 yyagi          \r
20                 public double dbチップサイズ倍率 { get; private set; }\r
21                 public double db実数値 { get; private set; }\r
22                 public EAVIType eAVI種別 { get; private set; }\r
23                 public EBGAType eBGA種別 { get; private set; }\r
24                 public EPart e楽器パート { get; private set; }\r
25                 public EChannel eチャンネル番号 { get; private set; }\r
26 \r
27                 /// <summary>\r
28                 /// バーからの距離(スクロールスピードを反映したチップの発声時刻)\r
29                 /// プロパティに対してインデクサsetできないためまずフィールドとして持ち、プロパティでアクセスできるようにします。\r
30                 /// </summary>\r
31                 private STDGBSValue<int> nバーからの距離dotInternal;\r
32                 public int n整数値 { get; private set; }\r
33                 public int n整数値_内部番号 { get; private set; }\r
34                 public int n総移動時間 { get; private set; }\r
35                 public int n発声位置 { get; private set; }\r
36                 public int n発声時刻ms { get; private set; }\r
37                 public CDTX.CAVI rAVI { get; private set; }\r
38                 public CDTX.CAVIPAN rAVIPan { get; private set; }\r
39                 public CDTX.CBGA rBGA { get; private set; }\r
40                 public CDTX.CBGAPAN rBGAPan { get; private set; }\r
41                 public CDTX.CBMP rBMP { get; private set; }\r
42                 public CDTX.CBMPTEX rBMPTEX { get; private set; }\r
43                 public bool b演奏終了後も再生が続くチップである { get; private set; }  // #32248 2013.10.14 yyagi\r
44                 public bool b空打ちチップである { get; private set; }          // #34029 2014.7.15 yyagi\r
45 \r
46                 public STDGBSValue<int> nバーからの距離dot\r
47                 {\r
48                         get\r
49                         {\r
50                                 return nバーからの距離dotInternal;\r
51                         }\r
52                 }\r
53 \r
54                 /// <summary>\r
55                 /// このチップがベースBPM、拡張BPM指示チップであることを示す。\r
56                 /// </summary>\r
57                 public bool bBPMチップである\r
58                 {\r
59                         get\r
60                         {\r
61                                 return (\r
62                                         this.eチャンネル番号 == EChannel.BPM ||\r
63                                         this.eチャンネル番号 == EChannel.BPMEx\r
64                                 );\r
65                         }\r
66                 }\r
67 \r
68                 /// <summary>\r
69                 /// 可視 HHC~LBD\r
70                 /// </summary>\r
71                 public bool bDrums可視チップ\r
72                 {\r
73                         get\r
74                         {\r
75                                 return EChannel.HiHatClose <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftBassDrum;\r
76                         }\r
77                 }\r
78 \r
79 \r
80                 /// <summary>\r
81                 /// 可視 HHC~LCY\r
82                 /// </summary>\r
83                 public bool bDrums可視チップ_LP_LBD含まない\r
84                 {\r
85                         get\r
86                         {\r
87                                 return EChannel.HiHatClose <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftCymbal;\r
88                         }\r
89                 }\r
90 \r
91                 /// <summary>\r
92                 /// 不可視 HHC~LBD\r
93                 /// </summary>\r
94                 public bool bDrums不可視チップ\r
95                 {\r
96                         get\r
97                         {\r
98                                 return EChannel.HiHatClose_Hidden <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftBassDrum_Hidden;\r
99                         }\r
100                 }\r
101 \r
102                 /// <summary>\r
103                 /// 不可視 HHC~LCY\r
104                 /// </summary>\r
105                 public bool bDrums不可視チップ_LP_LBD含まない\r
106                 {\r
107                         get\r
108                         {\r
109                                 return EChannel.HiHatClose_Hidden <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftCymbal_Hidden;\r
110                         }\r
111                 }\r
112 \r
113                 /// <summary>\r
114                 /// 空打ち HHC~LBD\r
115                 /// </summary>\r
116                 public bool bDrums空打ちチップ\r
117                 {\r
118                         get\r
119                         {\r
120                                 return\r
121                                         (EChannel.HiHatClose_NoChip <= eチャンネル番号 && eチャンネル番号 <= EChannel.RideCymbal_NoChip) ||\r
122                                         (EChannel.LeftCymbal_NoChip <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftBassDrum_NoChip);\r
123                         }\r
124                 }\r
125 \r
126                 /// <summary>\r
127                 /// このチップがギター/バスチップであることが前提で、\r
128                 /// そのRGBパターンを返す。\r
129                 /// </summary>\r
130                 public Eレーンビットパターン eRGBビットパターン\r
131                 {\r
132                         get\r
133                         {\r
134                                 return (Eレーンビットパターン)((int)eチャンネル番号 & 7);\r
135                         }\r
136                 }\r
137 \r
138                 /// <summary>\r
139                 /// Bass 可視チップであり、上位ビットのみ受け取る。\r
140                 /// Bass 可視チップ判定に使用してはならない。\r
141                 /// </summary>\r
142                 public int nGuitarBassUpper4Bit\r
143                 {\r
144                         get\r
145                         {\r
146                                 return (int)eチャンネル番号 & 0xF0;\r
147                         }\r
148                 }\r
149 \r
150                 /// <summary>\r
151                 /// Gutiar Open ~ Guitar RGB\r
152                 /// </summary>\r
153                 public bool bGuitar可視チップ\r
154                 {\r
155                         get\r
156                         {\r
157                                 return EChannel.Guitar_Open <= eチャンネル番号 && eチャンネル番号 <= EChannel.Guitar_RGB;\r
158                         }\r
159                 }\r
160 \r
161                 public bool bGuitar可視チップ_Wailing含む\r
162                 {\r
163                         get\r
164                         {\r
165                                 return EChannel.Guitar_Open <= eチャンネル番号 && eチャンネル番号 <= EChannel.Guitar_Wailing;\r
166                         }\r
167                 }\r
168 \r
169                 /// <summary>\r
170                 /// Bass Open ~ Bass RGB\r
171                 /// </summary>\r
172                 public bool bBass可視チップ\r
173                 {\r
174                         get\r
175                         {\r
176                                 return EChannel.Bass_Open <= eチャンネル番号 && eチャンネル番号 <= EChannel.Bass_RGB;\r
177                         }\r
178                 }\r
179 \r
180                 public bool bBass可視チップ_Wailing含む\r
181                 {\r
182                         get\r
183                         {\r
184                                 return EChannel.Bass_Open <= eチャンネル番号 && eチャンネル番号 <= EChannel.Bass_Wailing;\r
185                         }\r
186                 }\r
187 \r
188                 public static bool bBass可視チップ_Wailing含む_st(EChannel e)\r
189                 {\r
190                         return EChannel.Bass_Open <= e && e <= EChannel.Bass_Wailing;\r
191                 }\r
192 \r
193                 /// <summary>\r
194                 /// Guitar or Bass Open ~ RGB\r
195                 /// </summary>\r
196                 public bool bGuitarBass可視チップ\r
197                 {\r
198                         get\r
199                         {\r
200                                 return bGuitar可視チップ || bBass可視チップ;\r
201                         }\r
202                 }\r
203 \r
204                 public bool bGuitarBass可視チップ_Wailing含む\r
205                 {\r
206                         get\r
207                         {\r
208                                 return bGuitar可視チップ_Wailing含む || bBass可視チップ_Wailing含む;\r
209                         }\r
210                 }\r
211 \r
212                 /// <summary>\r
213                 /// Guitar or Bass has R pattern\r
214                 /// </summary>\r
215                 public bool bGuitarBass_R\r
216                 {\r
217                         get\r
218                         {\r
219                                 return bGuitarBass可視チップ && (((int)eチャンネル番号 & 4) > 0);\r
220                         }\r
221                 }\r
222 \r
223                 public bool bGuitarBass_G\r
224                 {\r
225                         get\r
226                         {\r
227                                 return bGuitarBass可視チップ && (((int)eチャンネル番号 & 2) > 0);\r
228                         }\r
229                 }\r
230 \r
231                 public bool bGuitarBass_B\r
232                 {\r
233                         get\r
234                         {\r
235                                 return bGuitarBass可視チップ && (((int)eチャンネル番号 & 1) > 0);\r
236                         }\r
237                 }\r
238 \r
239                 public bool bGuitarBass_Wailing\r
240                 {\r
241                         get\r
242                         {\r
243                                 return bGuitarBass可視チップ_Wailing含む && (((int)eチャンネル番号 & 0x0F) == 0x08);\r
244                         }\r
245                 }\r
246 \r
247                 public bool bGuitarBass_Open\r
248                 {\r
249                         get\r
250                         {\r
251                                 return bGuitarBass可視チップ && (((int)eチャンネル番号 & 0x0F) == 0x00);\r
252                         }\r
253                 }\r
254 \r
255                 public bool this[EChannel x]\r
256                 {\r
257                         get\r
258                         {\r
259                                 return eチャンネル番号 == x;\r
260                         }\r
261                 }\r
262 \r
263                 public bool bBGALayer\r
264                 {\r
265                         get\r
266                         {\r
267                                 return\r
268                                         ((eチャンネル番号 == EChannel.BGALayer1) ||\r
269                                         (eチャンネル番号 == EChannel.BGALayer2) ||\r
270                                         ((EChannel.BGALayer3 <= eチャンネル番号) && (eチャンネル番号 <= EChannel.BGALayer7)) ||\r
271                                         (eチャンネル番号 == EChannel.BGALayer8));\r
272                         }\r
273                 }\r
274 \r
275                 public bool bBGALayerSwap\r
276                 {\r
277                         get\r
278                         {\r
279                                 return\r
280                                         ((eチャンネル番号 == EChannel.BGALayer1_Swap) ||\r
281                                         (eチャンネル番号 == EChannel.BGALayer2_Swap) ||\r
282                                         ((EChannel.BGALayer3_Swap <= eチャンネル番号) && (eチャンネル番号 <= EChannel.BGALayer7_Swap)) ||\r
283                                         (eチャンネル番号 == EChannel.BGALayer8_Swap));\r
284                         }\r
285                 }\r
286 \r
287                 public void DecideInstrumentPart()\r
288                 {\r
289                         if (bDrums可視チップ)\r
290                         {\r
291                                 e楽器パート = EPart.Drums;\r
292                         }\r
293                         else if (bGuitar可視チップ)\r
294                         {\r
295                                 e楽器パート = EPart.Guitar;\r
296                         }\r
297                         else if (bBass可視チップ)\r
298                         {\r
299                                 e楽器パート = EPart.Bass;\r
300                         }\r
301                         else\r
302                         {\r
303                                 e楽器パート = EPart.Unknown;\r
304                         }\r
305                 }\r
306 \r
307                 /// <summary>\r
308                 /// #34029 2014.7.15 yyagi\r
309                 /// ドラムの空打ち音だったら、フラグを立てたうえで、通常チップのチャンネル番号に変更。ギターベースの空打ち音はとりあえずフラグを立てるだけ。\r
310                 /// </summary>\r
311                 public void ConvertNoChip()\r
312                 {\r
313                         if (EChannel.HiHatClose_NoChip <= eチャンネル番号 && eチャンネル番号 <= EChannel.RideCymbal_NoChip)\r
314                         {\r
315                                 b空打ちチップである = true;\r
316                                 eチャンネル番号 = eチャンネル番号 - 0xB0 + 0x10;\r
317                         }\r
318                         else if (this[EChannel.Guitar_NoChip] || this[EChannel.Bass_NoChip])\r
319                         {\r
320                                 b空打ちチップである = true;\r
321                         }\r
322                         else if (this[EChannel.LeftCymbal_NoChip])\r
323                         {\r
324                                 b空打ちチップである = true;\r
325                                 eチャンネル番号 = EChannel.LeftCymbal;\r
326                         }\r
327                         else if (this[EChannel.LeftPedal_NoChip])\r
328                         {\r
329                                 b空打ちチップである = true;\r
330                                 eチャンネル番号 = EChannel.LeftPedal;\r
331                         }\r
332                         else if (this[EChannel.LeftBassDrum_NoChip])\r
333                         {\r
334                                 b空打ちチップである = true;\r
335                                 eチャンネル番号 = EChannel.LeftBassDrum;\r
336                         }\r
337                 }\r
338 \r
339                 public void ConvertGBNoChip()\r
340                 {\r
341                         if (this[EChannel.Guitar_NoChip] || this[EChannel.Bass_NoChip])\r
342                         {\r
343                                 eチャンネル番号 = this[EChannel.Guitar_NoChip] ? EChannel.Guitar_Open : EChannel.Bass_Open;\r
344                         }\r
345                 }\r
346 \r
347 \r
348                 /// <summary>\r
349                 /// このチップが音声と関連付けられたチップであることを示す。\r
350                 /// </summary>\r
351                 public bool bWAVを使うチャンネルである\r
352                 {\r
353                         get\r
354                         {\r
355                                 bool ret = false;\r
356                                 EChannel x = eチャンネル番号;\r
357 \r
358                                 if (x == EChannel.BGM ||\r
359                                         (EChannel.HiHatClose <= x && x <= EChannel.LeftBassDrum) ||\r
360                                         (EChannel.DrumsFillin == x) ||\r
361                                         (EChannel.Guitar_Open <= x && x <= EChannel.Guitar_Wailing) || x == EChannel.Guitar_WailingSound ||\r
362                                         (EChannel.HiHatClose_Hidden <= x && x <= EChannel.LeftBassDrum_Hidden) ||\r
363                                         (EChannel.SE01 <= x && x <= EChannel.SE09) ||\r
364                                         (EChannel.SE10 <= x && x <= EChannel.SE19) ||\r
365                                         (EChannel.SE20 <= x && x <= EChannel.SE29) ||\r
366                                         (EChannel.SE30 <= x && x <= EChannel.SE32) ||\r
367                                         (EChannel.Bass_Open <= x && x <= EChannel.Bass_Wailing) || x == EChannel.Bass_WailingSound ||\r
368                                         (EChannel.HiHatClose_NoChip <= x && x <= EChannel.LeftBassDrum_NoChip)\r
369                                         )\r
370                                 {\r
371                                         ret = true;\r
372                                 }\r
373                                 return ret;\r
374                         }\r
375                 }\r
376 \r
377                 public bool bMovie\r
378                 {\r
379                         get\r
380                         {\r
381                                 return eチャンネル番号 == EChannel.MovieFull || eチャンネル番号 == EChannel.Movie;\r
382                         }\r
383                 }\r
384 \r
385                 public bool bSE\r
386                 {\r
387                         get\r
388                         {\r
389                                 if (((EChannel.SE01 <= eチャンネル番号) && (eチャンネル番号 <= EChannel.SE09)) ||\r
390                                                 ((EChannel.SE10 <= eチャンネル番号) && (eチャンネル番号 <= EChannel.SE19)) ||\r
391                                                 ((EChannel.SE20 <= eチャンネル番号) && (eチャンネル番号 <= EChannel.SE29)) ||\r
392                                                 ((EChannel.SE30 <= eチャンネル番号) && (eチャンネル番号 <= EChannel.SE32)))\r
393                                 {\r
394                                         return true;\r
395                                 }\r
396                                 else\r
397                                 {\r
398                                         return false;\r
399                                 }\r
400                         }\r
401                 }\r
402 \r
403                 public bool bOverrideSE\r
404                 {\r
405                         get\r
406                         {\r
407                                 return EChannel.SE24 <= eチャンネル番号 && eチャンネル番号 <= EChannel.SE29;\r
408                         }\r
409                 }\r
410 \r
411                 public int nBGALayerIndex\r
412                 {\r
413                         get\r
414                         {\r
415                                 int ret = -1;\r
416                                 switch (eチャンネル番号)\r
417                                 {\r
418                                         case EChannel.BGALayer1: ret = 0; break;\r
419                                         case EChannel.BGALayer2: ret = 1; break;\r
420                                         case EChannel.BGALayer3: ret = 2; break;\r
421                                         case EChannel.BGALayer4: ret = 3; break;\r
422                                         case EChannel.BGALayer5: ret = 4; break;\r
423                                         case EChannel.BGALayer6: ret = 5; break;\r
424                                         case EChannel.BGALayer7: ret = 6; break;\r
425                                         case EChannel.BGALayer8: ret = 7; break;\r
426                                 }\r
427                                 return ret;\r
428                         }\r
429                 }\r
430 \r
431                 public int nBGALayerSwapIndex\r
432                 {\r
433                         get\r
434                         {\r
435                                 int ret = -1;\r
436                                 switch (eチャンネル番号)\r
437                                 {\r
438                                         case EChannel.BGALayer1_Swap: ret = 0; break;\r
439                                         case EChannel.BGALayer2_Swap: ret = 1; break;\r
440                                         case EChannel.BGALayer3_Swap: ret = 2; break;\r
441                                         case EChannel.BGALayer4_Swap: ret = 3; break;\r
442                                         case EChannel.BGALayer5_Swap: ret = 4; break;\r
443                                         case EChannel.BGALayer6_Swap: ret = 5; break;\r
444                                         case EChannel.BGALayer7_Swap: ret = 6; break;\r
445                                         case EChannel.BGALayer8_Swap: ret = 7; break;\r
446                                 }\r
447                                 return ret;\r
448                         }\r
449                 }\r
450 \r
451                 public int nDrumsIndex\r
452                 {\r
453                         get\r
454                         {\r
455                                 int ret = -1;\r
456                                 switch (eチャンネル番号)\r
457                                 {\r
458                                         case EChannel.HiHatClose: ret = 0; break;\r
459                                         case EChannel.Snare: ret = 1; break;\r
460                                         case EChannel.BassDrum: ret = 2; break;\r
461                                         case EChannel.HighTom: ret = 3; break;\r
462                                         case EChannel.LowTom: ret = 4; break;\r
463                                         case EChannel.Cymbal: ret = 5; break;\r
464                                         case EChannel.FloorTom: ret = 6; break;\r
465                                         case EChannel.HiHatOpen: ret = 7; break;\r
466                                         case EChannel.RideCymbal: ret = 8; break;\r
467                                         case EChannel.LeftCymbal: ret = 9; break;\r
468                                         case EChannel.LeftPedal: ret = 10; break;\r
469                                         case EChannel.LeftBassDrum: ret = 11; break;\r
470                                 }\r
471                                 return ret;\r
472                         }\r
473                 }\r
474 \r
475                 public int nDrumsIndexHidden\r
476                 {\r
477                         get\r
478                         {\r
479                                 int ret = -1;\r
480                                 switch (eチャンネル番号)\r
481                                 {\r
482                                         case EChannel.HiHatClose_Hidden: ret = 0; break;\r
483                                         case EChannel.Snare_Hidden: ret = 1; break;\r
484                                         case EChannel.BassDrum_Hidden: ret = 2; break;\r
485                                         case EChannel.HighTom_Hidden: ret = 3; break;\r
486                                         case EChannel.LowTom_Hidden: ret = 4; break;\r
487                                         case EChannel.Cymbal_Hidden: ret = 5; break;\r
488                                         case EChannel.FloorTom_Hidden: ret = 6; break;\r
489                                         case EChannel.HiHatOpen_Hidden: ret = 7; break;\r
490                                         case EChannel.RideCymbal_Hidden: ret = 8; break;\r
491                                         case EChannel.LeftCymbal_Hidden: ret = 9; break;\r
492                                         case EChannel.LeftPedal_Hidden: ret = 10; break;\r
493                                         case EChannel.LeftBassDrum_Hidden: ret = 11; break;\r
494                                 }\r
495                                 return ret;\r
496                         }\r
497                 }\r
498 \r
499                 /// <summary>\r
500                 /// このチップが持つチャンネルの ESoundChipType を返す。\r
501                 ///  チャンネル番号→Chipの種類、の変換。今後の拡張を容易にするために追加\r
502                 /// </summary>\r
503                 public ESoundChipType ESoundChipTypeを得る\r
504                 {\r
505                         get\r
506                         {\r
507                                 switch (this.eチャンネル番号)\r
508                                 {\r
509                                         #region [ Drums ]\r
510                                         case EChannel.HiHatClose:\r
511                                         case EChannel.Snare:\r
512                                         case EChannel.BassDrum:\r
513                                         case EChannel.HighTom:\r
514                                         case EChannel.LowTom:\r
515                                         case EChannel.Cymbal:\r
516                                         case EChannel.FloorTom:\r
517                                         case EChannel.HiHatOpen:\r
518                                         case EChannel.RideCymbal:\r
519                                         case EChannel.LeftCymbal:\r
520                                         case EChannel.LeftPedal:\r
521                                         case EChannel.LeftBassDrum:\r
522 \r
523                                         case EChannel.HiHatClose_Hidden:\r
524                                         case EChannel.Snare_Hidden:\r
525                                         case EChannel.BassDrum_Hidden:\r
526                                         case EChannel.HighTom_Hidden:\r
527                                         case EChannel.LowTom_Hidden:\r
528                                         case EChannel.Cymbal_Hidden:\r
529                                         case EChannel.FloorTom_Hidden:\r
530                                         case EChannel.HiHatOpen_Hidden:\r
531                                         case EChannel.RideCymbal_Hidden:\r
532                                         case EChannel.LeftCymbal_Hidden:\r
533                                         case EChannel.LeftPedal_Hidden:\r
534                                         case EChannel.LeftBassDrum_Hidden:\r
535 \r
536                                         case EChannel.HiHatClose_NoChip:\r
537                                         case EChannel.Snare_NoChip:\r
538                                         case EChannel.BassDrum_NoChip:\r
539                                         case EChannel.HighTom_NoChip:\r
540                                         case EChannel.LowTom_NoChip:\r
541                                         case EChannel.Cymbal_NoChip:\r
542                                         case EChannel.FloorTom_NoChip:\r
543                                         case EChannel.HiHatOpen_NoChip:\r
544                                         case EChannel.RideCymbal_NoChip:\r
545                                         case EChannel.LeftCymbal_NoChip:\r
546                                         case EChannel.LeftPedal_NoChip:\r
547                                         case EChannel.LeftBassDrum_NoChip:\r
548 \r
549                                                 return ESoundChipType.Drums;\r
550                                         #endregion\r
551 \r
552                                         #region [ Guitar ]\r
553                                         case EChannel.Guitar_Open:\r
554                                         case EChannel.Guitar_xxB:\r
555                                         case EChannel.Guitar_xGx:\r
556                                         case EChannel.Guitar_xGB:\r
557                                         case EChannel.Guitar_Rxx:\r
558                                         case EChannel.Guitar_RxB:\r
559                                         case EChannel.Guitar_RGx:\r
560                                         case EChannel.Guitar_RGB:\r
561                                         case EChannel.Guitar_Wailing:\r
562                                         case EChannel.Guitar_WailingSound:\r
563                                         case EChannel.Guitar_NoChip:\r
564                                                 return ESoundChipType.Guitar;\r
565                                         #endregion\r
566 \r
567                                         #region [ Bass ]\r
568                                         case EChannel.Bass_Open:\r
569                                         case EChannel.Bass_xxB:\r
570                                         case EChannel.Bass_xGx:\r
571                                         case EChannel.Bass_xGB:\r
572                                         case EChannel.Bass_Rxx:\r
573                                         case EChannel.Bass_RxB:\r
574                                         case EChannel.Bass_RGx:\r
575                                         case EChannel.Bass_RGB:\r
576                                         case EChannel.Bass_Wailing:\r
577                                         case EChannel.Bass_WailingSound:\r
578                                         case EChannel.Bass_NoChip:\r
579                                                 return ESoundChipType.Bass;\r
580                                         #endregion\r
581 \r
582                                         #region [ SE ]\r
583                                         case EChannel.SE01:\r
584                                         case EChannel.SE02:\r
585                                         case EChannel.SE03:\r
586                                         case EChannel.SE04:\r
587                                         case EChannel.SE05:\r
588                                         case EChannel.SE06:\r
589                                         case EChannel.SE07:\r
590                                         case EChannel.SE08:\r
591                                         case EChannel.SE09:\r
592                                         case EChannel.SE10:\r
593                                         case EChannel.SE11:\r
594                                         case EChannel.SE12:\r
595                                         case EChannel.SE13:\r
596                                         case EChannel.SE14:\r
597                                         case EChannel.SE15:\r
598                                         case EChannel.SE16:\r
599                                         case EChannel.SE17:\r
600                                         case EChannel.SE18:\r
601                                         case EChannel.SE19:\r
602                                         case EChannel.SE20:\r
603                                         case EChannel.SE21:\r
604                                         case EChannel.SE22:\r
605                                         case EChannel.SE23:\r
606                                         case EChannel.SE24:\r
607                                         case EChannel.SE25:\r
608                                         case EChannel.SE26:\r
609                                         case EChannel.SE27:\r
610                                         case EChannel.SE28:\r
611                                         case EChannel.SE29:\r
612                                         case EChannel.SE30:\r
613                                         case EChannel.SE31:\r
614                                         case EChannel.SE32:\r
615                                                 return ESoundChipType.SE;\r
616                                         #endregion\r
617 \r
618                                         #region [ BGM ]\r
619                                         case EChannel.BGM:\r
620                                                 return ESoundChipType.BGM;\r
621                                         #endregion\r
622 \r
623                                         #region [ その他 ]\r
624                                         default:\r
625                                                 return ESoundChipType.Unknown;\r
626                                                 #endregion\r
627                                 }\r
628                         }\r
629                 }\r
630                 public bool bIsVisibleChip\r
631                 {\r
632                         get\r
633                         {\r
634                                 switch (this.eチャンネル番号)\r
635                                 {\r
636                                         case EChannel.HiHatClose:\r
637                                         case EChannel.Snare:\r
638                                         case EChannel.BassDrum:\r
639                                         case EChannel.HighTom:\r
640                                         case EChannel.LowTom:\r
641                                         case EChannel.Cymbal:\r
642                                         case EChannel.FloorTom:\r
643                                         case EChannel.HiHatOpen:\r
644                                         case EChannel.RideCymbal:\r
645                                         case EChannel.LeftCymbal:\r
646                                         case EChannel.LeftPedal:\r
647                                         case EChannel.LeftBassDrum:\r
648 \r
649                                         case EChannel.Guitar_Open:\r
650                                         case EChannel.Guitar_xxB:\r
651                                         case EChannel.Guitar_xGx:\r
652                                         case EChannel.Guitar_xGB:\r
653                                         case EChannel.Guitar_Rxx:\r
654                                         case EChannel.Guitar_RxB:\r
655                                         case EChannel.Guitar_RGx:\r
656                                         case EChannel.Guitar_RGB:\r
657 \r
658                                         case EChannel.Bass_Open:\r
659                                         case EChannel.Bass_xxB:\r
660                                         case EChannel.Bass_xGx:\r
661                                         case EChannel.Bass_xGB:\r
662                                         case EChannel.Bass_Rxx:\r
663                                         case EChannel.Bass_RxB:\r
664                                         case EChannel.Bass_RGx:\r
665                                         case EChannel.Bass_RGB:\r
666                                                 return true;\r
667 \r
668                                         default:\r
669                                                 return false;\r
670                                 }\r
671                         }\r
672                 }\r
673 \r
674 \r
675                 /// <summary>\r
676                 /// これが本当に一意なWAV番号となる。(無限定義の場合、chip.n整数値 は一意である保証がない。)\r
677                 /// </summary>\r
678                 /// <param name="index"></param>\r
679                 public void AssignInfiniteManageWAV(int index)\r
680                 {\r
681                         if (bWAVを使うチャンネルである)\r
682                         {\r
683                                 n整数値_内部番号 = index;// \r
684                         }\r
685                 }\r
686 \r
687                 /// <summary>\r
688                 /// // これが本当に一意なBPM番号となる。(無限WAVも参照)\r
689                 /// </summary>\r
690                 /// <param name="index"></param>\r
691                 public void AssignInfiniteManageBPM(int index)\r
692                 {\r
693                         if (bBPMチップである)\r
694                         {\r
695                                 n整数値_内部番号 = index;\r
696                         }\r
697                 }\r
698 \r
699                 public void AdjustPlayPositionForFillin(int index)\r
700                 {\r
701                         if (this[EChannel.FillIn])\r
702                         {\r
703                                 // ずらすのは、フィルインONチップと同じ位置にいるチップでも確実にフィルインが発動し、\r
704                                 // 同様に、フィルインOFFチップと同じ位置にいるチップでも確実にフィルインが終了するようにするため。\r
705 \r
706                                 if ((index > 0) && (index != 2))\r
707                                 {\r
708                                         n発声位置 -= 32;  // 384÷32=12 ということで、フィルインONチップは12分音符ほど前へ移動。\r
709                                 }\r
710                                 else if (index == 2)\r
711                                 {\r
712                                         n発声位置 += 32;  // 同じく、フィルインOFFチップは12分音符ほど後ろへ移動。\r
713                                 }\r
714                         }\r
715                 }\r
716 \r
717                 /// <summary>\r
718                 /// #BPMzz 行より前の行に出現した #BPMzz では、整数値・内部番号は -zz に初期化されている。\r
719                 /// </summary>\r
720                 /// <param name="zz"></param>\r
721                 /// <param name="newIndex"></param>\r
722                 public void AdjustInfiniteManageIntInternalIndex(bool chipCond, int zz, int newIndex)\r
723                 {\r
724                         if (chipCond && n整数値_内部番号 == -zz)\r
725                         {\r
726                                 n整数値_内部番号 = newIndex;\r
727                         }\r
728                 }\r
729 \r
730                 public void AddPlayPositionMsForSE(int increment)\r
731                 {\r
732                         if (this[EChannel.BGM] || bSE)\r
733                         {\r
734                                 n発声時刻ms += increment;\r
735                         }\r
736                 }\r
737 \r
738                 public void ApplyAVI(\r
739                         Dictionary<int, CDTX.CAVI> listAVI,\r
740                         Dictionary<int, CDTX.CAVIPAN> listAVIPAN\r
741                         )\r
742                 {\r
743                         if (bMovie)\r
744                         {\r
745                                 eAVI種別 = EAVIType.Unknown;\r
746                                 rAVI = null;\r
747                                 rAVIPan = null;\r
748                                 if (listAVIPAN.ContainsKey(n整数値))\r
749                                 {\r
750                                         CDTX.CAVIPAN cavipan = listAVIPAN[n整数値];\r
751                                         if (listAVI.ContainsKey(cavipan.nAVI番号) && (listAVI[cavipan.nAVI番号].avi != null))\r
752                                         {\r
753                                                 eAVI種別 = EAVIType.AVIPAN;\r
754                                                 rAVI = listAVI[cavipan.nAVI番号];\r
755                                                 rAVIPan = cavipan;\r
756                                                 return;\r
757                                         }\r
758                                 }\r
759                                 if (listAVI.ContainsKey(n整数値) && (listAVI[n整数値].avi != null))\r
760                                 {\r
761                                         eAVI種別 = EAVIType.AVI;\r
762                                         rAVI = listAVI[n整数値];\r
763                                 }\r
764                         }\r
765                 }\r
766 \r
767 \r
768                 public void ApplyBMP_BMPTEX(\r
769                         Dictionary<int, CDTX.CBGA> listBGA,\r
770                         Dictionary<int, CDTX.CBGAPAN> listBGAPAN,\r
771                         Dictionary<int, CDTX.CBMP> listBMP,\r
772                         Dictionary<int, CDTX.CBMPTEX> listBMPTEX)\r
773                 {\r
774                         if (bBGALayer)\r
775                         {\r
776                                 eBGA種別 = EBGAType.Unknown;\r
777                                 rBMP = null;\r
778                                 rBMPTEX = null;\r
779                                 rBGA = null;\r
780                                 rBGAPan = null;\r
781 \r
782                                 #region [ BGAPAN ]\r
783                                 if (listBGAPAN.ContainsKey(n整数値))\r
784                                 {\r
785                                         CDTX.CBGAPAN cbgapan = listBGAPAN[n整数値];\r
786                                         if (listBMPTEX.ContainsKey(cbgapan.nBMP番号) && listBMPTEX[cbgapan.nBMP番号].bUse)\r
787                                         {\r
788                                                 eBGA種別 = EBGAType.BGAPAN;\r
789                                                 rBMPTEX = listBMPTEX[cbgapan.nBMP番号];\r
790                                                 rBGAPan = cbgapan;\r
791                                                 return;\r
792                                         }\r
793                                         if (listBMP.ContainsKey(cbgapan.nBMP番号) && listBMP[cbgapan.nBMP番号].bUse)\r
794                                         {\r
795                                                 eBGA種別 = EBGAType.BGAPAN;\r
796                                                 rBMP = listBMP[cbgapan.nBMP番号];\r
797                                                 rBGAPan = cbgapan;\r
798                                                 return;\r
799                                         }\r
800                                 }\r
801                                 #endregion\r
802 \r
803                                 #region [ BGA ]\r
804                                 if (listBGA.ContainsKey(n整数値))\r
805                                 {\r
806                                         CDTX.CBGA cbga = listBGA[n整数値];\r
807                                         if (listBMPTEX.ContainsKey(cbga.nBMP番号) && listBMPTEX[cbga.nBMP番号].bUse)\r
808                                         {\r
809                                                 eBGA種別 = EBGAType.BGA;\r
810                                                 rBMPTEX = listBMPTEX[cbga.nBMP番号];\r
811                                                 rBGA = cbga;\r
812                                                 return;\r
813                                         }\r
814                                         if (listBMP.ContainsKey(cbga.nBMP番号) && listBMP[cbga.nBMP番号].bUse)\r
815                                         {\r
816                                                 eBGA種別 = EBGAType.BGA;\r
817                                                 rBMP = listBMP[cbga.nBMP番号];\r
818                                                 rBGA = cbga;\r
819                                                 return;\r
820                                         }\r
821                                 }\r
822                                 #endregion\r
823 \r
824                                 #region [ BMPTEX ]\r
825                                 if (listBMPTEX.ContainsKey(n整数値) && listBMPTEX[n整数値].bUse)\r
826                                 {\r
827                                         eBGA種別 = EBGAType.BMPTEX;\r
828                                         rBMPTEX = listBMPTEX[n整数値];\r
829                                         return;\r
830                                 }\r
831                                 #endregion\r
832 \r
833                                 #region [ BMP ]\r
834                                 if (listBMP.ContainsKey(n整数値) && listBMP[n整数値].bUse)\r
835                                 {\r
836                                         eBGA種別 = EBGAType.BMP;\r
837                                         rBMP = listBMP[n整数値];\r
838                                         return;\r
839                                 }\r
840                                 #endregion\r
841                         }\r
842                         #region [ BGA入れ替え ]\r
843                         if (bBGALayerSwap)\r
844                         {\r
845                                 eBGA種別 = EBGAType.Unknown;\r
846                                 rBMP = null;\r
847                                 rBMPTEX = null;\r
848                                 rBGA = null;\r
849                                 rBGAPan = null;\r
850                                 if (listBMPTEX.ContainsKey(n整数値) && listBMPTEX[n整数値].bUse)\r
851                                 {\r
852                                         eBGA種別 = EBGAType.BMPTEX;\r
853                                         rBMPTEX = listBMPTEX[n整数値];\r
854                                 }\r
855                                 else if (listBMP.ContainsKey(n整数値) && listBMP[n整数値].bUse)\r
856                                 {\r
857                                         eBGA種別 = EBGAType.BMP;\r
858                                         rBMP = listBMP[n整数値];\r
859                                 }\r
860                         }\r
861                         #endregion\r
862                 }\r
863 \r
864                 public void SetDBChipSizeFactor(double newFactor)\r
865                 {\r
866                         dbチップサイズ倍率 = newFactor;\r
867                 }\r
868 \r
869 \r
870                 public void SetSoundAfterPlayEnd(bool newBSound)\r
871                 {\r
872                         b演奏終了後も再生が続くチップである = newBSound;\r
873                 }\r
874 \r
875                 public void CalculatePlayPositionMs(\r
876                         EDTX種別 type,\r
877                         double basebpm,\r
878                         Dictionary<int, CDTX.CBPM> listBPM,\r
879                         Dictionary<int, CDTX.CAVIPAN> listAVIPAN,\r
880                         Dictionary<int, CDTX.CBGAPAN> listBGAPAN,\r
881                         ref double bpm,\r
882                         ref double dbBarLength,\r
883                         ref int basePlayPosition,\r
884                         ref int ms,\r
885                         ref int nBar)\r
886                 {\r
887                         n発声時刻ms = ms + ((int)(((0x271 * (n発声位置 - basePlayPosition)) * dbBarLength) / bpm));\r
888                         if (((type == EDTX種別.BMS) || (type == EDTX種別.BME)) &&\r
889                                 ((dbBarLength != 1.0) && ((n発声位置 / 384) != nBar)))\r
890                         {\r
891                                 basePlayPosition = n発声位置;\r
892                                 ms = n発声時刻ms;\r
893                                 dbBarLength = 1.0;\r
894                         }\r
895                         nBar = n発声位置 / 384;\r
896 \r
897                         if (this[EChannel.BarLength])\r
898                         {\r
899                                 basePlayPosition = n発声位置;\r
900                                 ms = n発声時刻ms;\r
901                                 dbBarLength = db実数値;\r
902                         }\r
903                         else if (this[EChannel.BPM])\r
904                         {\r
905                                 basePlayPosition = n発声位置;\r
906                                 ms = n発声時刻ms;\r
907                                 bpm = basebpm + n整数値;\r
908                         }\r
909                         else if (this[EChannel.BPMEx])\r
910                         {\r
911                                 basePlayPosition = n発声位置;\r
912                                 ms = n発声時刻ms;\r
913                                 if (listBPM.ContainsKey(n整数値_内部番号))\r
914                                 {\r
915                                         bpm = ((listBPM[n整数値_内部番号].n表記上の番号 == 0) ? 0.0 : basebpm) + listBPM[n整数値_内部番号].dbBPM値;\r
916                                 }\r
917                         }\r
918                         else if (bMovie)\r
919                         {\r
920                                 if (listAVIPAN.ContainsKey(n整数値))\r
921                                 {\r
922                                         int num21 = ms + ((int)(((0x271 * (n発声位置 - basePlayPosition)) * dbBarLength) / bpm));\r
923                                         int num22 = ms + ((int)(((0x271 * ((n発声位置 + listAVIPAN[n整数値].n移動時間ct) - basePlayPosition)) * dbBarLength) / bpm));\r
924                                         n総移動時間 = num22 - num21;\r
925                                 }\r
926                         }\r
927                         else if (bBGALayer)\r
928                         {\r
929                                 if (listBGAPAN.ContainsKey(n整数値))\r
930                                 {\r
931                                         int num19 = ms + ((int)(((0x271 * (n発声位置 - basePlayPosition)) * dbBarLength) / bpm));\r
932                                         int num20 = ms + ((int)(((0x271 * ((n発声位置 + listBGAPAN[n整数値].n移動時間ct) - basePlayPosition)) * dbBarLength) / bpm));\r
933                                         n総移動時間 = num20 - num19;\r
934                                 }\r
935                         }\r
936                 }\r
937 \r
938                 public void ConvertSE25_26_27toCY_RCY_LCY()\r
939                 {\r
940                         EChannel to = eチャンネル番号;\r
941                         switch (eチャンネル番号)\r
942                         {\r
943                                 case EChannel.SE25: to = EChannel.Cymbal; break;\r
944                                 case EChannel.SE26: to = EChannel.RideCymbal; break;\r
945                                 case EChannel.SE27: to = EChannel.LeftCymbal; break;\r
946                         }\r
947                         eチャンネル番号 = to;\r
948                 }\r
949 \r
950                 /// <summary>\r
951                 /// 演奏速度を適用。2回以上呼ぶとさらに短くなる。\r
952                 /// </summary>\r
953                 /// <param name="factor"></param>\r
954                 public void ApplyPlaySpeed(double factor)\r
955                 {\r
956                         if (factor > 0)\r
957                         {\r
958                                 n発声時刻ms = (int)((double)n発声時刻ms / factor);\r
959                         }\r
960                 }\r
961 \r
962                 public void CalcDistanceFromBar(long currentTime, STDGBSValue<double> ScrollSpeedInSetting)\r
963                 {\r
964                         const double speed = 526.5;// BPM150の時の1小節の長さ[dot]\r
965                         double ScrollSpeedDrums = (ScrollSpeedInSetting.Drums + 1.0) * 0.5 * 37.5 * speed / 60000.0;\r
966                         double ScrollSpeedGuitar = (ScrollSpeedInSetting.Guitar + 1.0) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
967                         double ScrollSpeedBass = (ScrollSpeedInSetting.Bass + 1.0) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
968 \r
969                         //STDGBVALUE<int> newDot = new STDGBVALUE<int>();\r
970 \r
971                         nバーからの距離dotInternal.Drums = (int)((n発声時刻ms - currentTime) * ScrollSpeedDrums);\r
972                         nバーからの距離dotInternal.Guitar = (int)((n発声時刻ms - currentTime) * ScrollSpeedGuitar);\r
973                         nバーからの距離dotInternal.Bass = (int)((n発声時刻ms - currentTime) * ScrollSpeedBass);\r
974 \r
975                         //nバーからの距離dot = newDot;\r
976                 }\r
977 \r
978                 public void RandomizeRGB(ERandom eRandom, int seed, bool existOpen)\r
979                 {\r
980                         int[,] nランダムレーン候補 = new int[,]\r
981                         {\r
982                                         { 0, 1, 2, 3, 4, 5, 6, 7 },\r
983                                         { 0, 2, 1, 3, 4, 6, 5, 7 },\r
984                                         { 0, 1, 4, 5, 2, 3, 6, 7 },\r
985                                         { 0, 2, 4, 6, 1, 3, 5, 7 },\r
986                                         { 0, 4, 1, 5, 2, 6, 3, 7 },\r
987                                         { 0, 4, 2, 6, 1, 5, 3, 7 }\r
988                                 };\r
989                         Eレーンビットパターン nRGBレーンビットパターン;\r
990                         Eレーンビットパターン n新RGBレーンビットパターン = Eレーンビットパターン.OPEN;// 「未割り当てのローカル変数」ビルドエラー回避のために0を初期値に設定\r
991                         int nランダム化前BassFlag = nGuitarBassUpper4Bit;\r
992                         bool bAdjustRandomLane = true;\r
993 \r
994                         if (bGuitarBass可視チップ)\r
995                         {\r
996                                 switch (eRandom)\r
997                                 {\r
998                                         case ERandom.Random:    // 1小節単位でレーンのR/G/Bがランダムに入れ替わる\r
999                                                 eチャンネル番号 = (EChannel)((nGuitarBassUpper4Bit) | nランダムレーン候補[seed, (int)eRGBビットパターン]);\r
1000                                                 return;\r
1001 \r
1002                                         case ERandom.Super: // チップごとにR/G/Bがランダムで入れ替わる(レーンの本数までは変わらない)。\r
1003                                                 eチャンネル番号 = (EChannel)((nGuitarBassUpper4Bit) | nランダムレーン候補[CDTXMania.Instance.Random.Next(6), (int)eRGBビットパターン]);\r
1004                                                 return;\r
1005 \r
1006                                         case ERandom.Hyper: // レーンの本数も変わる\r
1007                                                 nRGBレーンビットパターン = eRGBビットパターン;\r
1008                                                 // n新RGBレーンビットパターン = (int)Eレーンビットパターン.OPEN;   // この値は結局未使用なので削除\r
1009                                                 if (\r
1010                                                         (nRGBレーンビットパターン != Eレーンビットパターン.xxB) &&\r
1011                                                         (nRGBレーンビットパターン != Eレーンビットパターン.xGx) &&\r
1012                                                         (nRGBレーンビットパターン != Eレーンビットパターン.Rxx))    // xxB, xGx, Rxx レーン1本相当\r
1013                                                 {\r
1014                                                 }\r
1015                                                 else\r
1016                                                 {\r
1017                                                         n新RGBレーンビットパターン = (Eレーンビットパターン)CDTXMania.Instance.Random.Next(6) + 1;   // レーン1本相当なら、レーン1本か2本(1~6)に変化して終了\r
1018                                                         bAdjustRandomLane = false;\r
1019                                                 }\r
1020                                                 break;\r
1021 \r
1022                                         default:\r
1023                                                 return;\r
1024                                 }\r
1025                                 if (bAdjustRandomLane)\r
1026                                 {\r
1027                                         switch (nRGBレーンビットパターン)\r
1028                                         {\r
1029                                                 case Eレーンビットパターン.xGB: // xGB        レーン2本相当\r
1030                                                 case Eレーンビットパターン.RxB: // RxB\r
1031                                                 case Eレーンビットパターン.RGx: // RGx\r
1032                                                         n新RGBレーンビットパターン = existOpen ? (Eレーンビットパターン)(CDTXMania.Instance.Random.Next(8)) : (Eレーンビットパターン)(CDTXMania.Instance.Random.Next(7) + 1);  // OPENあり譜面ならOPENを含むランダム, OPENなし譜面ならOPENを含まないランダム\r
1033                                                         break;\r
1034 \r
1035                                                 default:\r
1036                                                         if (nRGBレーンビットパターン == Eレーンビットパターン.RGB)  // RGB レーン3本相当\r
1037                                                         {\r
1038                                                                 if (existOpen)  // OPENあり譜面の場合\r
1039                                                                 {\r
1040                                                                         int n乱数パーセント = CDTXMania.Instance.Random.Next(100);\r
1041                                                                         if (n乱数パーセント < 30)\r
1042                                                                         {\r
1043                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.OPEN;\r
1044                                                                         }\r
1045                                                                         else if (n乱数パーセント < 60)\r
1046                                                                         {\r
1047                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.RGB;\r
1048                                                                         }\r
1049                                                                         else if (n乱数パーセント < 85)\r
1050                                                                         {\r
1051                                                                                 switch (CDTXMania.Instance.Random.Next(3))\r
1052                                                                                 {\r
1053                                                                                         case 0:\r
1054                                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.xGB;\r
1055                                                                                                 break;\r
1056 \r
1057                                                                                         case 1:\r
1058                                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.RxB;\r
1059                                                                                                 break;\r
1060                                                                                 }\r
1061                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.RGx;\r
1062                                                                         }\r
1063                                                                         else  // OPENでない場合\r
1064                                                                         {\r
1065                                                                                 switch (CDTXMania.Instance.Random.Next(3))\r
1066                                                                                 {\r
1067                                                                                         case 0:\r
1068                                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.xxB;\r
1069                                                                                                 break;\r
1070 \r
1071                                                                                         case 1:\r
1072                                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.xGx;\r
1073                                                                                                 break;\r
1074                                                                                 }\r
1075                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.Rxx;\r
1076                                                                         }\r
1077                                                                 }\r
1078                                                                 else  // OPENなし譜面の場合\r
1079                                                                 {\r
1080                                                                         int n乱数パーセント = CDTXMania.Instance.Random.Next(100);\r
1081                                                                         if (n乱数パーセント < 60)\r
1082                                                                         {\r
1083                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.RGB;\r
1084                                                                         }\r
1085                                                                         else if (n乱数パーセント < 85)\r
1086                                                                         {\r
1087                                                                                 switch (CDTXMania.Instance.Random.Next(3))\r
1088                                                                                 {\r
1089                                                                                         case 0:\r
1090                                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.xGB;\r
1091                                                                                                 break;\r
1092 \r
1093                                                                                         case 1:\r
1094                                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.RxB;\r
1095                                                                                                 break;\r
1096                                                                                 }\r
1097                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.RGx;\r
1098                                                                         }\r
1099                                                                         else\r
1100                                                                         {\r
1101                                                                                 switch (CDTXMania.Instance.Random.Next(3))\r
1102                                                                                 {\r
1103                                                                                         case 0:\r
1104                                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.xxB;\r
1105                                                                                                 break;\r
1106 \r
1107                                                                                         case 1:\r
1108                                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.xGx;\r
1109                                                                                                 break;\r
1110                                                                                 }\r
1111                                                                                 n新RGBレーンビットパターン = Eレーンビットパターン.Rxx;\r
1112                                                                         }\r
1113                                                                 }\r
1114                                                         }\r
1115                                                         break;\r
1116                                         }\r
1117                                 }\r
1118                                 eチャンネル番号 = (EChannel)((nランダム化前BassFlag) | (int)n新RGBレーンビットパターン);\r
1119                         }\r
1120                 }\r
1121 \r
1122                 public void SwapGB()\r
1123                 {\r
1124                         int offset = 0xA0 - 0x20;\r
1125                         if (bBass可視チップ)\r
1126                         {\r
1127                                 eチャンネル番号 -= offset;\r
1128                         }\r
1129                         else if (bGuitar可視チップ)\r
1130                         {\r
1131                                 eチャンネル番号 += offset;\r
1132                         }\r
1133                         DecideInstrumentPart();\r
1134                 }\r
1135 \r
1136                 public CChip()\r
1137                 {\r
1138                         this.nバーからの距離dotInternal = new STDGBSValue<int>()\r
1139                         {\r
1140                                 Drums = 0,\r
1141                                 Guitar = 0,\r
1142                                 Bass = 0,\r
1143                         };\r
1144                         b可視 = true;\r
1145                         dbチップサイズ倍率 = 1.0;\r
1146                         e楽器パート = EPart.Unknown;\r
1147                         n透明度 = 0xff;\r
1148                 }\r
1149 \r
1150                 public CChip(int playPosition, int intData, int intDataInternalIndex, EChannel channel)\r
1151                         : this(playPosition, intData, channel)\r
1152                 {\r
1153                         n整数値_内部番号 = intDataInternalIndex;\r
1154                 }\r
1155 \r
1156                 public CChip(int playPosition, int intData, EChannel channel)\r
1157                         : this()\r
1158                 {\r
1159                         n発声位置 = playPosition;\r
1160                         n整数値 = intData;\r
1161                         eチャンネル番号 = channel;\r
1162                 }\r
1163 \r
1164                 public CChip(int playPosition, double phraseLengthFactor, EChannel channel)\r
1165                         : this()\r
1166                 {\r
1167                         n発声位置 = playPosition;\r
1168                         db実数値 = phraseLengthFactor;\r
1169                         eチャンネル番号 = channel;\r
1170                 }\r
1171 \r
1172                 public CChip(EChannel channel)\r
1173                         : this()\r
1174                 {\r
1175                         eチャンネル番号 = channel;\r
1176                 }\r
1177 \r
1178                 public CChip(int playPosition, int intData, int intDataInternalIndex, EChannel channel,\r
1179                         int playPositionMs, bool bSoundAfterPlayEnd)\r
1180                         : this(playPosition, intData, intDataInternalIndex, channel)\r
1181                 {\r
1182                         n発声時刻ms = playPositionMs;\r
1183                         b演奏終了後も再生が続くチップである = bSoundAfterPlayEnd;\r
1184                 }\r
1185 \r
1186                 public override string ToString()\r
1187                 {\r
1188                         /*\r
1189                         string[] chToStr = \r
1190                         {\r
1191                                 "??", "バックコーラス", "小節長変更", "BPM変更", "BMPレイヤ1", "??", "??", "BMPレイヤ2",\r
1192                                 "BPM変更(拡張)", "??", "??", "??", "??", "??", "??", "??",\r
1193                                 "??", "HHClose", "Snare", "Kick", "HiTom", "LowTom", "Cymbal", "FloorTom",\r
1194                                 "HHOpen", "RideCymbal", "LeftCymbal", "LeftPedal", "LeftBassDrum", "", "", "ドラム歓声切替",\r
1195                                 "ギターOPEN", "ギター - - B", "ギター - G -", "ギター - G B", "ギター R - -", "ギター R - B", "ギター R G -", "ギター R G B",\r
1196                                 "ギターWailing", "??", "??", "??", "??", "??", "??", "ギターWailing音切替",\r
1197                                 "??", "HHClose(不可視)", "Snare(不可視)", "Kick(不可視)", "HiTom(不可視)", "LowTom(不可視)", "Cymbal(不可視)", "FloorTom(不可視)",\r
1198                                 "HHOpen(不可視)", "RideCymbal(不可視)", "LeftCymbal(不可視)", "??", "??", "??", "??", "??",\r
1199                                 "??", "??", "??", "??", "??", "??", "??", "??", \r
1200                                 "??", "??", "??", "??", "??", "??", "??", "??", \r
1201                                 "小節線", "拍線", "MIDIコーラス", "フィルイン", "AVI", "BMPレイヤ3", "BMPレイヤ4", "BMPレイヤ5",\r
1202                                 "BMPレイヤ6", "BMPレイヤ7", "AVIFull", "??", "??", "??", "??", "??", \r
1203                                 "BMPレイヤ8", "SE01", "SE02", "SE03", "SE04", "SE05", "SE06", "SE07",\r
1204                                 "SE08", "SE09", "??", "??", "??", "??", "??", "??", \r
1205                                 "SE10", "SE11", "SE12", "SE13", "SE14", "SE15", "SE16", "SE17",\r
1206                                 "SE18", "SE19", "??", "??", "??", "??", "??", "??", \r
1207                                 "SE20", "SE21", "SE22", "SE23", "SE24", "SE25", "SE26", "SE27",\r
1208                                 "SE28", "SE29", "??", "??", "??", "??", "??", "??", \r
1209                                 "SE30", "SE31", "SE32", "??", "??", "??", "??", "??", \r
1210                                 "??", "??", "??", "??", "??", "??", "??", "??", \r
1211                                 "ベースOPEN", "ベース - - B", "ベース - G -", "ベース - G B", "ベース R - -", "ベース R - B", "ベース R G -", "ベース R G B",\r
1212                                 "ベースWailing", "??", "??", "??", "??", "??", "??", "ベースWailing音切替",\r
1213                                 "??", "HHClose(空うち)", "Snare(空うち)", "Kick(空うち)", "HiTom(空うち)", "LowTom(空うち)", "Cymbal(空うち)", "FloorTom(空うち)",\r
1214                                 "HHOpen(空うち)", "RideCymbal(空うち)", "ギター(空打ち)", "ベース(空打ち)", "LeftCymbal(空うち)", "LeftPedal(空打ち)", "LeftBassDrum(空打ち)", "??", \r
1215                                 "??", "??", "??", "??", "BGAスコープ画像切替1", "??", "??", "BGAスコープ画像切替2",\r
1216                                 "??", "??", "??", "??", "??", "??", "??", "??", \r
1217                                 "??", "??", "??", "??", "??", "BGAスコープ画像切替3", "BGAスコープ画像切替4", "BGAスコープ画像切替5",\r
1218                                 "BGAスコープ画像切替6", "BGAスコープ画像切替7", "ミキサー登録", "ミキサー削除", "??", "??", "??", "??", \r
1219                                 "BGAスコープ画像切替8"\r
1220                         };\r
1221                         */\r
1222                         return string.Format("CChip: 位置:{0:D4}.{1:D3}, 時刻{2:D6}, Ch:{3:X2}({4}), Pn:{5}({11})(内部{6}), Pd:{7}, Sz:{8}, UseWav:{9}",\r
1223                                 this.n発声位置 / 384,\r
1224                                 this.n発声位置 % 384,\r
1225                                 this.n発声時刻ms,\r
1226                                 this.eチャンネル番号,\r
1227                                 this.eチャンネル番号,\r
1228                                 this.n整数値, this.n整数値_内部番号,\r
1229                                 this.db実数値,\r
1230                                 this.dbチップサイズ倍率,\r
1231                                 this.bWAVを使うチャンネルである,\r
1232                                 // this.b自動再生音チャンネルである,\r
1233                                 CDTX.tZZ(this.n整数値));\r
1234                 }\r
1235                 /// <summary>\r
1236                 /// チップの再生長を取得する。現状、WAVチップとBGAチップでのみ使用可能。\r
1237                 /// </summary>\r
1238                 /// <returns>再生長(ms)</returns>\r
1239                 public int GetDuration()\r
1240                 {\r
1241                         int nDuration = 0;\r
1242 \r
1243                         if (this.bWAVを使うチャンネルである)   // WAV\r
1244                         {\r
1245                                 CDTX.CWAV wc;\r
1246                                 CDTXMania.Instance.DTX.listWAV.TryGetValue(this.n整数値_内部番号, out wc);\r
1247                                 if (wc == null)\r
1248                                 {\r
1249                                         nDuration = 0;\r
1250                                 }\r
1251                                 else\r
1252                                 {\r
1253                                         nDuration = (wc.rSound[0] == null) ? 0 : wc.rSound[0].n総演奏時間ms;\r
1254                                 }\r
1255                         }\r
1256                         else if (this.eチャンネル番号 == EChannel.Movie || this.eチャンネル番号 == EChannel.MovieFull)  // AVI\r
1257                         {\r
1258                                 if (this.rAVI != null && this.rAVI.avi != null)\r
1259                                 {\r
1260                                         nDuration = this.rAVI.avi.GetDuration();\r
1261                                 }\r
1262                         }\r
1263 \r
1264                         double _db再生速度 = (CDTXMania.Instance.DTXVmode.Enabled) ? CDTXMania.Instance.DTX.dbDTXVPlaySpeed : CDTXMania.Instance.DTX.db再生速度;\r
1265                         return (int)(nDuration / _db再生速度);\r
1266                 }\r
1267 \r
1268                 #region [ IComparable 実装 ]\r
1269                 //-----------------\r
1270                 public int CompareTo(CChip other)\r
1271                 {\r
1272                         byte[] n優先度 = new byte[] {\r
1273                                         5, 5, 3, 3, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5,\r
1274                                         5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5,\r
1275                                         7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5,\r
1276                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1277                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1278                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1279                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1280                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1281                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1282                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1283                                         7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5,\r
1284                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1285                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1286                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1287                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1288                                         5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r
1289                                 };\r
1290 \r
1291 \r
1292                         // まずは位置で比較。\r
1293 \r
1294                         if (this.n発声位置 < other.n発声位置)\r
1295                                 return -1;\r
1296 \r
1297                         if (this.n発声位置 > other.n発声位置)\r
1298                                 return 1;\r
1299 \r
1300 \r
1301                         // 位置が同じなら優先度で比較。\r
1302                         int thisIndex = (int)eチャンネル番号;\r
1303                         int tIndex = (int)other.eチャンネル番号;\r
1304 \r
1305                         if (n優先度[thisIndex] < n優先度[tIndex])\r
1306                                 return -1;\r
1307 \r
1308                         if (n優先度[thisIndex] > n優先度[tIndex])\r
1309                                 return 1;\r
1310 \r
1311 \r
1312                         // 位置も優先度も同じなら同じと返す。\r
1313 \r
1314                         return 0;\r
1315                 }\r
1316                 //-----------------\r
1317                 #endregion\r
1318 \r
1319 \r
1320 \r
1321                 public bool bAssignAutoPlayState()\r
1322                 {\r
1323                         bool ret = false;\r
1324                         bool bGtBsR = bGuitarBass_R;\r
1325                         bool bGtBsG = bGuitarBass_G;\r
1326                         bool bGtBsB = bGuitarBass_B;\r
1327                         bool bGtBsW = bGuitarBass_Wailing;\r
1328                         bool bGtBsO = bGuitarBass_Open;\r
1329                         if (bDrums可視チップ)\r
1330                         {\r
1331                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay[EnumConverter.PadFromChannel(eチャンネル番号)])\r
1332                                 {\r
1333                                         ret = true;\r
1334                                 }\r
1335                         }\r
1336                         else if (bGuitar可視チップ)\r
1337                         {\r
1338                                 //Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );\r
1339                                 //Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);\r
1340                                 ret = true;\r
1341                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.GtPick] == false) ret = false;\r
1342                                 else\r
1343                                 {\r
1344                                         if (bGtBsR == true && CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.GtR] == false) ret = false;\r
1345                                         else if (bGtBsG == true && CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.GtG] == false) ret = false;\r
1346                                         else if (bGtBsB == true && CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.GtB] == false) ret = false;\r
1347                                         else if (bGtBsW == true && CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.GtWail] == false) ret = false;\r
1348                                         else if (bGtBsO == true &&\r
1349                                                 (CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.GtR] == false ||\r
1350                                                 CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.GtG] == false ||\r
1351                                                 CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.GtB] == false))\r
1352                                                 ret = false;\r
1353                                 }\r
1354                                 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );\r
1355                         }\r
1356                         else if (bBass可視チップ)\r
1357                         {\r
1358                                 ret = true;\r
1359                                 if (CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.BsPick] == false) ret = false;\r
1360                                 else\r
1361                                 {\r
1362                                         if (bGtBsR == true && CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.BsR] == false) ret = false;\r
1363                                         else if (bGtBsG == true && CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.BsG] == false) ret = false;\r
1364                                         else if (bGtBsB == true && CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.BsB] == false) ret = false;\r
1365                                         else if (bGtBsW == true && CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.BsWail] == false) ret = false;\r
1366                                         else if (bGtBsO == true &&\r
1367                                                 (CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.BsR] == false ||\r
1368                                                 CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.BsG] == false ||\r
1369                                                 CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.BsB] == false))\r
1370                                                 ret = false;\r
1371                                 }\r
1372                         }\r
1373                         this.bIsAutoPlayed = ret;\r
1374                         return ret;\r
1375                 }\r
1376 \r
1377 \r
1378                 /// <summary>\r
1379                 /// shallow copyです。\r
1380                 /// </summary>\r
1381                 /// <returns></returns>\r
1382                 public object Clone()\r
1383                 {\r
1384                         return MemberwiseClone();\r
1385                 }\r
1386 \r
1387                 internal void ConvertSE25_26_27ToCY_RCY_LCY()\r
1388                 {\r
1389                         if ((EChannel.SE25 <= eチャンネル番号) && (eチャンネル番号 <= EChannel.SE27))\r
1390                         {\r
1391                                 EChannel[] ch = { EChannel.Cymbal, EChannel.RideCymbal, EChannel.LeftCymbal };\r
1392                                 eチャンネル番号 = ch[eチャンネル番号 - EChannel.SE25];\r
1393                         }\r
1394                 }\r
1395 \r
1396                 internal void SetNoChipGuitarToOpen()\r
1397                 {\r
1398                         eチャンネル番号 = EChannel.Guitar_Open;\r
1399                 }\r
1400 \r
1401                 internal void SetNoChipBassToOpen()\r
1402                 {\r
1403                         eチャンネル番号 = EChannel.Bass_Open;\r
1404                 }\r
1405         }\r
1406 \r
1407 }\r