2 using System.Collections.Generic;
\r
5 using System.Threading.Tasks;
\r
9 public class CChip : IComparable<CChip>, ICloneable
\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
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
28 /// バーからの距離(スクロールスピードを反映したチップの発声時刻)
\r
29 /// プロパティに対してインデクサsetできないためまずフィールドとして持ち、プロパティでアクセスできるようにします。
\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
46 public STDGBSValue<int> nバーからの距離dot
\r
50 return nバーからの距離dotInternal;
\r
55 /// このチップがベースBPM、拡張BPM指示チップであることを示す。
\r
57 public bool bBPMチップである
\r
62 this.eチャンネル番号 == EChannel.BPM ||
\r
63 this.eチャンネル番号 == EChannel.BPMEx
\r
71 public bool bDrums可視チップ
\r
75 return EChannel.HiHatClose <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftBassDrum;
\r
83 public bool bDrums可視チップ_LP_LBD含まない
\r
87 return EChannel.HiHatClose <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftCymbal;
\r
94 public bool bDrums不可視チップ
\r
98 return EChannel.HiHatClose_Hidden <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftBassDrum_Hidden;
\r
105 public bool bDrums不可視チップ_LP_LBD含まない
\r
109 return EChannel.HiHatClose_Hidden <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftCymbal_Hidden;
\r
116 public bool bDrums空打ちチップ
\r
121 (EChannel.HiHatClose_NoChip <= eチャンネル番号 && eチャンネル番号 <= EChannel.RideCymbal_NoChip) ||
\r
122 (EChannel.LeftCymbal_NoChip <= eチャンネル番号 && eチャンネル番号 <= EChannel.LeftBassDrum_NoChip);
\r
127 /// このチップがギター/バスチップであることが前提で、
\r
130 public Eレーンビットパターン eRGBビットパターン
\r
134 return (Eレーンビットパターン)((int)eチャンネル番号 & 7);
\r
139 /// Bass 可視チップであり、上位ビットのみ受け取る。
\r
140 /// Bass 可視チップ判定に使用してはならない。
\r
142 public int nGuitarBassUpper4Bit
\r
146 return (int)eチャンネル番号 & 0xF0;
\r
151 /// Gutiar Open ~ Guitar RGB
\r
153 public bool bGuitar可視チップ
\r
157 return EChannel.Guitar_Open <= eチャンネル番号 && eチャンネル番号 <= EChannel.Guitar_RGB;
\r
161 public bool bGuitar可視チップ_Wailing含む
\r
165 return EChannel.Guitar_Open <= eチャンネル番号 && eチャンネル番号 <= EChannel.Guitar_Wailing;
\r
170 /// Bass Open ~ Bass RGB
\r
172 public bool bBass可視チップ
\r
176 return EChannel.Bass_Open <= eチャンネル番号 && eチャンネル番号 <= EChannel.Bass_RGB;
\r
180 public bool bBass可視チップ_Wailing含む
\r
184 return EChannel.Bass_Open <= eチャンネル番号 && eチャンネル番号 <= EChannel.Bass_Wailing;
\r
188 public static bool bBass可視チップ_Wailing含む_st(EChannel e)
\r
190 return EChannel.Bass_Open <= e && e <= EChannel.Bass_Wailing;
\r
194 /// Guitar or Bass Open ~ RGB
\r
196 public bool bGuitarBass可視チップ
\r
200 return bGuitar可視チップ || bBass可視チップ;
\r
204 public bool bGuitarBass可視チップ_Wailing含む
\r
208 return bGuitar可視チップ_Wailing含む || bBass可視チップ_Wailing含む;
\r
213 /// Guitar or Bass has R pattern
\r
215 public bool bGuitarBass_R
\r
219 return bGuitarBass可視チップ && (((int)eチャンネル番号 & 4) > 0);
\r
223 public bool bGuitarBass_G
\r
227 return bGuitarBass可視チップ && (((int)eチャンネル番号 & 2) > 0);
\r
231 public bool bGuitarBass_B
\r
235 return bGuitarBass可視チップ && (((int)eチャンネル番号 & 1) > 0);
\r
239 public bool bGuitarBass_Wailing
\r
243 return bGuitarBass可視チップ_Wailing含む && (((int)eチャンネル番号 & 0x0F) == 0x08);
\r
247 public bool bGuitarBass_Open
\r
251 return bGuitarBass可視チップ && (((int)eチャンネル番号 & 0x0F) == 0x00);
\r
255 public bool this[EChannel x]
\r
259 return eチャンネル番号 == x;
\r
263 public bool bBGALayer
\r
268 ((eチャンネル番号 == EChannel.BGALayer1) ||
\r
269 (eチャンネル番号 == EChannel.BGALayer2) ||
\r
270 ((EChannel.BGALayer3 <= eチャンネル番号) && (eチャンネル番号 <= EChannel.BGALayer7)) ||
\r
271 (eチャンネル番号 == EChannel.BGALayer8));
\r
275 public bool bBGALayerSwap
\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
287 public void DecideInstrumentPart()
\r
291 e楽器パート = EPart.Drums;
\r
293 else if (bGuitar可視チップ)
\r
295 e楽器パート = EPart.Guitar;
\r
297 else if (bBass可視チップ)
\r
299 e楽器パート = EPart.Bass;
\r
303 e楽器パート = EPart.Unknown;
\r
308 /// #34029 2014.7.15 yyagi
\r
309 /// ドラムの空打ち音だったら、フラグを立てたうえで、通常チップのチャンネル番号に変更。ギターベースの空打ち音はとりあえずフラグを立てるだけ。
\r
311 public void ConvertNoChip()
\r
313 if (EChannel.HiHatClose_NoChip <= eチャンネル番号 && eチャンネル番号 <= EChannel.RideCymbal_NoChip)
\r
316 eチャンネル番号 = eチャンネル番号 - 0xB0 + 0x10;
\r
318 else if (this[EChannel.Guitar_NoChip] || this[EChannel.Bass_NoChip])
\r
322 else if (this[EChannel.LeftCymbal_NoChip])
\r
325 eチャンネル番号 = EChannel.LeftCymbal;
\r
327 else if (this[EChannel.LeftPedal_NoChip])
\r
330 eチャンネル番号 = EChannel.LeftPedal;
\r
332 else if (this[EChannel.LeftBassDrum_NoChip])
\r
335 eチャンネル番号 = EChannel.LeftBassDrum;
\r
339 public void ConvertGBNoChip()
\r
341 if (this[EChannel.Guitar_NoChip] || this[EChannel.Bass_NoChip])
\r
343 eチャンネル番号 = this[EChannel.Guitar_NoChip] ? EChannel.Guitar_Open : EChannel.Bass_Open;
\r
349 /// このチップが音声と関連付けられたチップであることを示す。
\r
351 public bool bWAVを使うチャンネルである
\r
356 EChannel x = eチャンネル番号;
\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
381 return eチャンネル番号 == EChannel.MovieFull || eチャンネル番号 == EChannel.Movie;
\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
403 public bool bOverrideSE
\r
407 return EChannel.SE24 <= eチャンネル番号 && eチャンネル番号 <= EChannel.SE29;
\r
411 public int nBGALayerIndex
\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
431 public int nBGALayerSwapIndex
\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
451 public int nDrumsIndex
\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
475 public int nDrumsIndexHidden
\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
500 /// このチップが持つチャンネルの ESoundChipType を返す。
\r
501 /// チャンネル番号→Chipの種類、の変換。今後の拡張を容易にするために追加
\r
503 public ESoundChipType ESoundChipTypeを得る
\r
507 switch (this.eチャンネル番号)
\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
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
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
549 return ESoundChipType.Drums;
\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
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
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
620 return ESoundChipType.BGM;
\r
625 return ESoundChipType.Unknown;
\r
630 public bool bIsVisibleChip
\r
634 switch (this.eチャンネル番号)
\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
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
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
676 /// これが本当に一意なWAV番号となる。(無限定義の場合、chip.n整数値 は一意である保証がない。)
\r
678 /// <param name="index"></param>
\r
679 public void AssignInfiniteManageWAV(int index)
\r
681 if (bWAVを使うチャンネルである)
\r
683 n整数値_内部番号 = index;//
\r
688 /// // これが本当に一意なBPM番号となる。(無限WAVも参照)
\r
690 /// <param name="index"></param>
\r
691 public void AssignInfiniteManageBPM(int index)
\r
699 public void AdjustPlayPositionForFillin(int index)
\r
701 if (this[EChannel.FillIn])
\r
703 // ずらすのは、フィルインONチップと同じ位置にいるチップでも確実にフィルインが発動し、
\r
704 // 同様に、フィルインOFFチップと同じ位置にいるチップでも確実にフィルインが終了するようにするため。
\r
706 if ((index > 0) && (index != 2))
\r
708 n発声位置 -= 32; // 384÷32=12 ということで、フィルインONチップは12分音符ほど前へ移動。
\r
710 else if (index == 2)
\r
712 n発声位置 += 32; // 同じく、フィルインOFFチップは12分音符ほど後ろへ移動。
\r
718 /// #BPMzz 行より前の行に出現した #BPMzz では、整数値・内部番号は -zz に初期化されている。
\r
720 /// <param name="zz"></param>
\r
721 /// <param name="newIndex"></param>
\r
722 public void AdjustInfiniteManageIntInternalIndex(bool chipCond, int zz, int newIndex)
\r
724 if (chipCond && n整数値_内部番号 == -zz)
\r
726 n整数値_内部番号 = newIndex;
\r
730 public void AddPlayPositionMsForSE(int increment)
\r
732 if (this[EChannel.BGM] || bSE)
\r
734 n発声時刻ms += increment;
\r
738 public void ApplyAVI(
\r
739 Dictionary<int, CDTX.CAVI> listAVI,
\r
740 Dictionary<int, CDTX.CAVIPAN> listAVIPAN
\r
745 eAVI種別 = EAVIType.Unknown;
\r
748 if (listAVIPAN.ContainsKey(n整数値))
\r
750 CDTX.CAVIPAN cavipan = listAVIPAN[n整数値];
\r
751 if (listAVI.ContainsKey(cavipan.nAVI番号) && (listAVI[cavipan.nAVI番号].avi != null))
\r
753 eAVI種別 = EAVIType.AVIPAN;
\r
754 rAVI = listAVI[cavipan.nAVI番号];
\r
759 if (listAVI.ContainsKey(n整数値) && (listAVI[n整数値].avi != null))
\r
761 eAVI種別 = EAVIType.AVI;
\r
762 rAVI = listAVI[n整数値];
\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
776 eBGA種別 = EBGAType.Unknown;
\r
783 if (listBGAPAN.ContainsKey(n整数値))
\r
785 CDTX.CBGAPAN cbgapan = listBGAPAN[n整数値];
\r
786 if (listBMPTEX.ContainsKey(cbgapan.nBMP番号) && listBMPTEX[cbgapan.nBMP番号].bUse)
\r
788 eBGA種別 = EBGAType.BGAPAN;
\r
789 rBMPTEX = listBMPTEX[cbgapan.nBMP番号];
\r
793 if (listBMP.ContainsKey(cbgapan.nBMP番号) && listBMP[cbgapan.nBMP番号].bUse)
\r
795 eBGA種別 = EBGAType.BGAPAN;
\r
796 rBMP = listBMP[cbgapan.nBMP番号];
\r
804 if (listBGA.ContainsKey(n整数値))
\r
806 CDTX.CBGA cbga = listBGA[n整数値];
\r
807 if (listBMPTEX.ContainsKey(cbga.nBMP番号) && listBMPTEX[cbga.nBMP番号].bUse)
\r
809 eBGA種別 = EBGAType.BGA;
\r
810 rBMPTEX = listBMPTEX[cbga.nBMP番号];
\r
814 if (listBMP.ContainsKey(cbga.nBMP番号) && listBMP[cbga.nBMP番号].bUse)
\r
816 eBGA種別 = EBGAType.BGA;
\r
817 rBMP = listBMP[cbga.nBMP番号];
\r
825 if (listBMPTEX.ContainsKey(n整数値) && listBMPTEX[n整数値].bUse)
\r
827 eBGA種別 = EBGAType.BMPTEX;
\r
828 rBMPTEX = listBMPTEX[n整数値];
\r
834 if (listBMP.ContainsKey(n整数値) && listBMP[n整数値].bUse)
\r
836 eBGA種別 = EBGAType.BMP;
\r
837 rBMP = listBMP[n整数値];
\r
842 #region [ BGA入れ替え ]
\r
845 eBGA種別 = EBGAType.Unknown;
\r
850 if (listBMPTEX.ContainsKey(n整数値) && listBMPTEX[n整数値].bUse)
\r
852 eBGA種別 = EBGAType.BMPTEX;
\r
853 rBMPTEX = listBMPTEX[n整数値];
\r
855 else if (listBMP.ContainsKey(n整数値) && listBMP[n整数値].bUse)
\r
857 eBGA種別 = EBGAType.BMP;
\r
858 rBMP = listBMP[n整数値];
\r
864 public void SetDBChipSizeFactor(double newFactor)
\r
866 dbチップサイズ倍率 = newFactor;
\r
870 public void SetSoundAfterPlayEnd(bool newBSound)
\r
872 b演奏終了後も再生が続くチップである = newBSound;
\r
875 public void CalculatePlayPositionMs(
\r
878 Dictionary<int, CDTX.CBPM> listBPM,
\r
879 Dictionary<int, CDTX.CAVIPAN> listAVIPAN,
\r
880 Dictionary<int, CDTX.CBGAPAN> listBGAPAN,
\r
882 ref double dbBarLength,
\r
883 ref int basePlayPosition,
\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
891 basePlayPosition = n発声位置;
\r
895 nBar = n発声位置 / 384;
\r
897 if (this[EChannel.BarLength])
\r
899 basePlayPosition = n発声位置;
\r
901 dbBarLength = db実数値;
\r
903 else if (this[EChannel.BPM])
\r
905 basePlayPosition = n発声位置;
\r
907 bpm = basebpm + n整数値;
\r
909 else if (this[EChannel.BPMEx])
\r
911 basePlayPosition = n発声位置;
\r
913 if (listBPM.ContainsKey(n整数値_内部番号))
\r
915 bpm = ((listBPM[n整数値_内部番号].n表記上の番号 == 0) ? 0.0 : basebpm) + listBPM[n整数値_内部番号].dbBPM値;
\r
920 if (listAVIPAN.ContainsKey(n整数値))
\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
927 else if (bBGALayer)
\r
929 if (listBGAPAN.ContainsKey(n整数値))
\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
938 public void ConvertSE25_26_27toCY_RCY_LCY()
\r
940 EChannel to = eチャンネル番号;
\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
951 /// 演奏速度を適用。2回以上呼ぶとさらに短くなる。
\r
953 /// <param name="factor"></param>
\r
954 public void ApplyPlaySpeed(double factor)
\r
958 n発声時刻ms = (int)((double)n発声時刻ms / factor);
\r
962 public void CalcDistanceFromBar(long currentTime, STDGBSValue<double> ScrollSpeedInSetting)
\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
969 //STDGBVALUE<int> newDot = new STDGBVALUE<int>();
\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
975 //nバーからの距離dot = newDot;
\r
978 public void RandomizeRGB(ERandom eRandom, int seed, bool existOpen)
\r
980 int[,] nランダムレーン候補 = new int[,]
\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
989 Eレーンビットパターン nRGBレーンビットパターン;
\r
990 Eレーンビットパターン n新RGBレーンビットパターン = Eレーンビットパターン.OPEN;// 「未割り当てのローカル変数」ビルドエラー回避のために0を初期値に設定
\r
991 int nランダム化前BassFlag = nGuitarBassUpper4Bit;
\r
992 bool bAdjustRandomLane = true;
\r
994 if (bGuitarBass可視チップ)
\r
998 case ERandom.Random: // 1小節単位でレーンのR/G/Bがランダムに入れ替わる
\r
999 eチャンネル番号 = (EChannel)((nGuitarBassUpper4Bit) | nランダムレーン候補[seed, (int)eRGBビットパターン]);
\r
1002 case ERandom.Super: // チップごとにR/G/Bがランダムで入れ替わる(レーンの本数までは変わらない)。
\r
1003 eチャンネル番号 = (EChannel)((nGuitarBassUpper4Bit) | nランダムレーン候補[CDTXMania.Instance.Random.Next(6), (int)eRGBビットパターン]);
\r
1006 case ERandom.Hyper: // レーンの本数も変わる
\r
1007 nRGBレーンビットパターン = eRGBビットパターン;
\r
1008 // n新RGBレーンビットパターン = (int)Eレーンビットパターン.OPEN; // この値は結局未使用なので削除
\r
1010 (nRGBレーンビットパターン != Eレーンビットパターン.xxB) &&
\r
1011 (nRGBレーンビットパターン != Eレーンビットパターン.xGx) &&
\r
1012 (nRGBレーンビットパターン != Eレーンビットパターン.Rxx)) // xxB, xGx, Rxx レーン1本相当
\r
1017 n新RGBレーンビットパターン = (Eレーンビットパターン)CDTXMania.Instance.Random.Next(6) + 1; // レーン1本相当なら、レーン1本か2本(1~6)に変化して終了
\r
1018 bAdjustRandomLane = false;
\r
1025 if (bAdjustRandomLane)
\r
1027 switch (nRGBレーンビットパターン)
\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
1036 if (nRGBレーンビットパターン == Eレーンビットパターン.RGB) // RGB レーン3本相当
\r
1038 if (existOpen) // OPENあり譜面の場合
\r
1040 int n乱数パーセント = CDTXMania.Instance.Random.Next(100);
\r
1041 if (n乱数パーセント < 30)
\r
1043 n新RGBレーンビットパターン = Eレーンビットパターン.OPEN;
\r
1045 else if (n乱数パーセント < 60)
\r
1047 n新RGBレーンビットパターン = Eレーンビットパターン.RGB;
\r
1049 else if (n乱数パーセント < 85)
\r
1051 switch (CDTXMania.Instance.Random.Next(3))
\r
1054 n新RGBレーンビットパターン = Eレーンビットパターン.xGB;
\r
1058 n新RGBレーンビットパターン = Eレーンビットパターン.RxB;
\r
1061 n新RGBレーンビットパターン = Eレーンビットパターン.RGx;
\r
1065 switch (CDTXMania.Instance.Random.Next(3))
\r
1068 n新RGBレーンビットパターン = Eレーンビットパターン.xxB;
\r
1072 n新RGBレーンビットパターン = Eレーンビットパターン.xGx;
\r
1075 n新RGBレーンビットパターン = Eレーンビットパターン.Rxx;
\r
1078 else // OPENなし譜面の場合
\r
1080 int n乱数パーセント = CDTXMania.Instance.Random.Next(100);
\r
1081 if (n乱数パーセント < 60)
\r
1083 n新RGBレーンビットパターン = Eレーンビットパターン.RGB;
\r
1085 else if (n乱数パーセント < 85)
\r
1087 switch (CDTXMania.Instance.Random.Next(3))
\r
1090 n新RGBレーンビットパターン = Eレーンビットパターン.xGB;
\r
1094 n新RGBレーンビットパターン = Eレーンビットパターン.RxB;
\r
1097 n新RGBレーンビットパターン = Eレーンビットパターン.RGx;
\r
1101 switch (CDTXMania.Instance.Random.Next(3))
\r
1104 n新RGBレーンビットパターン = Eレーンビットパターン.xxB;
\r
1108 n新RGBレーンビットパターン = Eレーンビットパターン.xGx;
\r
1111 n新RGBレーンビットパターン = Eレーンビットパターン.Rxx;
\r
1118 eチャンネル番号 = (EChannel)((nランダム化前BassFlag) | (int)n新RGBレーンビットパターン);
\r
1122 public void SwapGB()
\r
1124 int offset = 0xA0 - 0x20;
\r
1127 eチャンネル番号 -= offset;
\r
1129 else if (bGuitar可視チップ)
\r
1131 eチャンネル番号 += offset;
\r
1133 DecideInstrumentPart();
\r
1138 this.nバーからの距離dotInternal = new STDGBSValue<int>()
\r
1146 e楽器パート = EPart.Unknown;
\r
1150 public CChip(int playPosition, int intData, int intDataInternalIndex, EChannel channel)
\r
1151 : this(playPosition, intData, channel)
\r
1153 n整数値_内部番号 = intDataInternalIndex;
\r
1156 public CChip(int playPosition, int intData, EChannel channel)
\r
1159 n発声位置 = playPosition;
\r
1161 eチャンネル番号 = channel;
\r
1164 public CChip(int playPosition, double phraseLengthFactor, EChannel channel)
\r
1167 n発声位置 = playPosition;
\r
1168 db実数値 = phraseLengthFactor;
\r
1169 eチャンネル番号 = channel;
\r
1172 public CChip(EChannel channel)
\r
1175 eチャンネル番号 = channel;
\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
1182 n発声時刻ms = playPositionMs;
\r
1183 b演奏終了後も再生が続くチップである = bSoundAfterPlayEnd;
\r
1186 public override string ToString()
\r
1189 string[] chToStr =
\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
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
1228 this.n整数値, this.n整数値_内部番号,
\r
1231 this.bWAVを使うチャンネルである,
\r
1232 // this.b自動再生音チャンネルである,
\r
1233 CDTX.tZZ(this.n整数値));
\r
1236 /// チップの再生長を取得する。現状、WAVチップとBGAチップでのみ使用可能。
\r
1238 /// <returns>再生長(ms)</returns>
\r
1239 public int GetDuration()
\r
1241 int nDuration = 0;
\r
1243 if (this.bWAVを使うチャンネルである) // WAV
\r
1246 CDTXMania.Instance.DTX.listWAV.TryGetValue(this.n整数値_内部番号, out wc);
\r
1253 nDuration = (wc.rSound[0] == null) ? 0 : wc.rSound[0].n総演奏時間ms;
\r
1256 else if (this.eチャンネル番号 == EChannel.Movie || this.eチャンネル番号 == EChannel.MovieFull) // AVI
\r
1258 if (this.rAVI != null && this.rAVI.avi != null)
\r
1260 nDuration = this.rAVI.avi.GetDuration();
\r
1264 double _db再生速度 = (CDTXMania.Instance.DTXVmode.Enabled) ? CDTXMania.Instance.DTX.dbDTXVPlaySpeed : CDTXMania.Instance.DTX.db再生速度;
\r
1265 return (int)(nDuration / _db再生速度);
\r
1268 #region [ IComparable 実装 ]
\r
1269 //-----------------
\r
1270 public int CompareTo(CChip other)
\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
1294 if (this.n発声位置 < other.n発声位置)
\r
1297 if (this.n発声位置 > other.n発声位置)
\r
1302 int thisIndex = (int)eチャンネル番号;
\r
1303 int tIndex = (int)other.eチャンネル番号;
\r
1305 if (n優先度[thisIndex] < n優先度[tIndex])
\r
1308 if (n優先度[thisIndex] > n優先度[tIndex])
\r
1312 // 位置も優先度も同じなら同じと返す。
\r
1316 //-----------------
\r
1321 public bool bAssignAutoPlayState()
\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
1331 if (CDTXMania.Instance.ConfigIni.bAutoPlay[EnumConverter.PadFromChannel(eチャンネル番号)])
\r
1336 else if (bGuitar可視チップ)
\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
1341 if (CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.GtPick] == false) ret = false;
\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
1354 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );
\r
1356 else if (bBass可視チップ)
\r
1359 if (CDTXMania.Instance.ConfigIni.bAutoPlay[EPad.BsPick] == false) ret = false;
\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
1373 this.bIsAutoPlayed = ret;
\r
1379 /// shallow copyです。
\r
1381 /// <returns></returns>
\r
1382 public object Clone()
\r
1384 return MemberwiseClone();
\r
1387 internal void ConvertSE25_26_27ToCY_RCY_LCY()
\r
1389 if ((EChannel.SE25 <= eチャンネル番号) && (eチャンネル番号 <= EChannel.SE27))
\r
1391 EChannel[] ch = { EChannel.Cymbal, EChannel.RideCymbal, EChannel.LeftCymbal };
\r
1392 eチャンネル番号 = ch[eチャンネル番号 - EChannel.SE25];
\r
1396 internal void SetNoChipGuitarToOpen()
\r
1398 eチャンネル番号 = EChannel.Guitar_Open;
\r
1401 internal void SetNoChipBassToOpen()
\r
1403 eチャンネル番号 = EChannel.Bass_Open;
\r