2 using System.Collections.Generic;
3 using System.Diagnostics;
8 public class チップ : IComparable
10 public const int 最大音量 = 4;
12 #region " プロパティ(1)(増減したら CopyFrom() を修正のこと)"
14 public チップ種別 チップ種別 { get; set; } = チップ種別.Unknown;
15 public int 小節番号 { get; set; } = -1;
16 public int 小節内位置 { get; set; } = 0;
17 public int 小節解像度 { get; set; } = 1;
20 /// 譜面の先頭(小節番号 -1 の小節の先頭)からの時刻をミリ秒単位で表す。
22 public long 描画時刻ms { get; set; } = FDK.カウンタ.QPCTimer.未使用;
25 /// 譜面の先頭(小節番号 -1 の小節の先頭)からの時刻を秒単位で表す。
27 public double 描画時刻sec => ( this.描画時刻ms / 1000.0 );
30 /// 譜面の先頭(小節番号 -1 の小節の先頭)からの時刻をミリ秒単位で表す。
33 /// サウンドの発声遅延を考慮して、描画時刻よりも遅く設定すること。
35 public long 発声時刻ms { get; set; } = FDK.カウンタ.QPCTimer.未使用;
38 /// 譜面の先頭(小節番号 -1 の小節の先頭)からの時刻を秒単位で表す。
41 /// サウンドの発声遅延を考慮して、描画時刻よりも遅く設定すること。
43 public double 発声時刻sec => ( this.発声時刻ms / 1000.0 );
55 if( ( 1 > value ) || ( チップ.最大音量 < value ) )
56 throw new ArgumentException( $"音量の値域(1~{チップ.最大音量})を超える値 '{value}' が指定されました。" );
62 /// チップが BPM チップである場合は、その BPM 値。それ以外の場合は無効。
64 public double BPM { get; set; } = 120.0;
67 #region " プロパティ(2) 演奏用(増減したら CopyFrom() を修正のこと)"
69 public bool 可視 { get; set; } = true;
72 get { return !this.可視; }
73 set { this.可視 = !value; }
75 public bool ヒット済みである { get; set; } = false;
78 get { return !this.ヒット済みである; }
79 set { this.ヒット済みである = !value; }
81 public bool 発声済みである { get; set; } = false;
84 get { return !this.発声済みである; }
85 set { this.発声済みである = !value; }
89 #region " プロパティ(3) SSTFEditor用(増減したら CopyFrom() を修正のこと)"
91 public int 譜面内絶対位置grid { get; set; } = 0;
92 public bool ドラッグ操作により選択中である { get; set; } = false;
93 public bool 選択が確定している { get; set; } = false;
94 public bool 選択が確定していない
96 get { return !this.選択が確定している; }
97 set { this.選択が確定している = !value; }
99 public bool 移動済みである { get; set; } = true;
102 get { return !this.移動済みである; }
103 set { this.移動済みである = !value; }
105 public string チップ内文字列 { get; set; } = null;
106 public int 枠外レーン数 { get; set; } = 0;
113 public チップ( チップ コピー元チップ )
115 this.CopyFrom( コピー元チップ );
117 public void CopyFrom( チップ srcChip )
120 this.チップ種別 = srcChip.チップ種別;
121 this.小節番号 = srcChip.小節番号;
122 this.小節内位置 = srcChip.小節内位置;
123 this.小節解像度 = srcChip.小節解像度;
124 this.描画時刻ms = srcChip.描画時刻ms;
125 this.発声時刻ms = srcChip.発声時刻ms;
126 this.音量 = srcChip.音量;
127 this.BPM = srcChip.BPM;
130 this.可視 = srcChip.可視;
131 this.ヒット済みである = srcChip.ヒット済みである;
132 this.発声済みである = srcChip.発声済みである;
135 this.譜面内絶対位置grid = srcChip.譜面内絶対位置grid;
136 this.ドラッグ操作により選択中である = srcChip.ドラッグ操作により選択中である;
137 this.選択が確定している = srcChip.選択が確定している;
138 this.移動済みである = srcChip.移動済みである;
139 this.チップ内文字列 = srcChip.チップ内文字列;
140 this.枠外レーン数 = srcChip.枠外レーン数;
143 #region " IComparable 実装 "
146 // 現在のインスタンスを同じ型の別のオブジェクトと比較して、並べ替え順序において、現在のインスタンスの位置が同じ型の別のオブジェクトの前、後ろ、または同じのいずれであるかを示す整数を返します。
150 // このインスタンスと比較するオブジェクト。
153 // 比較対象オブジェクトの相対順序を示す 32 ビット符号付き整数。戻り値の意味は次のとおりです。
156 // --------------------
162 // System.ArgumentException:
163 // obj の型がこのインスタンスの型と異なります。
165 public int CompareTo( object obj )
167 var other = obj as チップ;
169 if( this.小節番号 < other.小節番号 ) { return -1; }
170 if( this.小節番号 > other.小節番号 ) { return +1; }
172 double dbThis = (double) this.小節内位置 / (double) this.小節解像度;
173 double dbOther = (double) other.小節内位置 / (double) other.小節解像度;
175 if( dbThis < dbOther ) { return -1; }
176 if( dbThis > dbOther ) { return +1; }
179 // グリッドが完全に等しいなら、チップの種類ごとに定義された深度で順序を決める。
181 if( チップ.チップの深さ[ this.チップ種別 ] > チップ.チップの深さ[ other.チップ種別 ] ) { return -1; }
182 if( チップ.チップの深さ[ this.チップ種別 ] < チップ.チップの深さ[ other.チップ種別 ] ) { return +1; }
189 protected readonly static Dictionary<チップ種別, int> チップの深さ
192 = new Dictionary<チップ種別, int>() {
193 { チップ種別.Ride_Cup, 50 },
194 { チップ種別.HiHat_Open, 50 },
195 { チップ種別.HiHat_HalfOpen, 50 },
196 { チップ種別.HiHat_Close, 50 },
197 { チップ種別.HiHat_Foot, 50 },
199 { チップ種別.Snare_OpenRim, 50 },
200 { チップ種別.Snare_ClosedRim, 50 },
201 { チップ種別.Snare_Ghost, 50 },
203 { チップ種別.Tom1_Rim, 50 },
206 { チップ種別.Splash, 60 },
208 { チップ種別.Tom2_Rim, 60 },
209 { チップ種別.LeftCrash, 70 },
212 { チップ種別.Tom3_Rim, 70 },
213 { チップ種別.RightCrash, 70 },
215 { チップ種別.LeftCymbal_Mute, 76 },
216 { チップ種別.RightCymbal_Mute, 76 },
221 { チップ種別.Unknown, 99 },
228 private int bs_音量 = チップ.最大音量;