OSDN Git Service

チップ クラスをリファクタリング。
[strokestylet/CsWin10Desktop3.git] / SSTFormat / チップ.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using FDK.カウンタ;
6
7 namespace SSTFormat
8 {
9         public class チップ : IComparable
10         {
11                 public const int 最大音量 = 4;
12
13                 #region " プロパティ(1)(増減したら CopyFrom() を修正のこと)"
14                 //----------------
15                 public チップ種別 チップ種別 { get; set; } = チップ種別.Unknown;
16                 public int 小節番号 { get; set; } = -1;
17                 public int 小節内位置 { get; set; } = 0;
18                 public int 小節解像度 { get; set; } = 1;
19                 /// <summary>
20                 /// チップの描画時刻[ms]。
21                 /// 譜面の先頭(小節番号 -1 の小節の先頭)からの時刻をミリ秒単位で表す。
22                 /// </summary>
23                 public long 描画時刻ms { get; set; } = FDK.カウンタ.QPCTimer.未使用;
24                 /// <summary>
25                 /// チップの描画時刻[sec]。
26                 /// 譜面の先頭(小節番号 -1 の小節の先頭)からの時刻を秒単位で表す。
27                 /// </summary>
28                 public double 描画時刻sec => this.描画時刻ms / 1000.0;
29                 /// <summary>
30                 /// チップの発声時刻[ms]。
31                 /// 譜面の先頭(小節番号 -1 の小節の先頭)からの時刻をミリ秒単位で表す。
32                 /// </summary>
33                 /// <remarks>
34                 /// サウンドの発声遅延を考慮して、描画時刻よりも遅く設定すること。
35                 /// </remarks>
36                 public long 発声時刻ms { get; set; } = FDK.カウンタ.QPCTimer.未使用;
37                 /// <summary>
38                 /// チップの発声時刻[sec]。
39                 /// 譜面の先頭(小節番号 -1 の小節の先頭)からの時刻を秒単位で表す。
40                 /// </summary>
41                 /// <remarks>
42                 /// サウンドの発声遅延を考慮して、描画時刻よりも遅く設定すること。
43                 /// </remarks>
44                 public double 発声時刻sec => this.発声時刻ms / 1000.0;
45                 /// <summary>
46                 /// チップの音量(小:1~4:大)。
47                 /// </summary>
48                 public int 音量
49                 {
50                         get
51                         {
52                                 return this.bs_音量;
53                         }
54                         set
55                         {
56                                 if( value < 1 || value > チップ.最大音量 )
57                                         throw new ArgumentException( $"音量の値域(1~{チップ.最大音量})を超える値 '{value}' が指定されました。" );
58
59                                 this.bs_音量 = value;
60                         }
61                 }
62                 /// <summary>
63                 /// チップが BPM チップである場合は、その BPM 値。それ以外の場合は無効。
64                 /// </summary>
65                 public double BPM { get; set; } = 120.0;
66                 //----------------
67                 #endregion
68                 #region " プロパティ(2) 演奏用(増減したら CopyFrom() を修正のこと)"
69                 //----------------
70                 public bool 可視 { get; set; } = true;
71                 public bool 不可視
72                 {
73                         get { return !this.可視; }
74                         set { this.可視 = !value; }
75                 }
76                 public bool ヒット済みである { get; set; } = false;
77                 public bool ヒットされていない
78                 {
79                         get { return !this.ヒット済みである; }
80                         set { this.ヒット済みである = !value; }
81                 }
82                 public bool 発声済みである { get; set; } = false;
83                 public bool 発声されていない
84                 {
85                         get { return !this.発声済みである; }
86                         set { this.発声済みである = !value; }
87                 }
88                 //----------------
89                 #endregion
90                 #region " プロパティ(3) SSTFEditor用(増減したら CopyFrom() を修正のこと)"
91                 //----------------
92                 public int 譜面内絶対位置grid { get; set; } = 0;
93                 public bool ドラッグ操作により選択中である { get; set; } = false;
94                 public bool 選択が確定している { get; set; } = false;
95                 public bool 選択が確定していない
96                 {
97                         get { return !this.選択が確定している; }
98                         set { this.選択が確定している = !value; }
99                 }
100                 public bool 移動済みである { get; set; } = true;
101                 public bool 移動されていない
102                 {
103                         get { return !this.移動済みである; }
104                         set { this.移動済みである = !value; }
105                 }
106                 public string チップ内文字列 { get; set; } = null;
107                 public int 枠外レーン数 { get; set; } = 0;
108                 //----------------
109                 #endregion
110
111                 public チップ()
112                 {
113                 }
114                 public チップ( チップ コピー元チップ )
115                 {
116                         this.CopyFrom( コピー元チップ );
117                 }
118                 public void CopyFrom( チップ srcChip )
119                 {
120                         // プロパティ(1)
121                         this.チップ種別 = srcChip.チップ種別;
122                         this.小節番号 = srcChip.小節番号;
123                         this.小節内位置 = srcChip.小節内位置;
124                         this.小節解像度 = srcChip.小節解像度;
125                         this.描画時刻ms = srcChip.描画時刻ms;
126                         this.発声時刻ms = srcChip.発声時刻ms;
127                         this.音量 = srcChip.音量;
128                         this.BPM = srcChip.BPM;
129
130                         // プロパティ(2)
131                         this.可視 = srcChip.可視;
132                         this.ヒット済みである = srcChip.ヒット済みである;
133                         this.発声済みである = srcChip.発声済みである;
134
135                         // プロパティ(3)
136                         this.譜面内絶対位置grid = srcChip.譜面内絶対位置grid;
137                         this.ドラッグ操作により選択中である = srcChip.ドラッグ操作により選択中である;
138                         this.選択が確定している = srcChip.選択が確定している;
139                         this.移動済みである = srcChip.移動済みである;
140                         this.チップ内文字列 = srcChip.チップ内文字列;
141                         this.枠外レーン数 = srcChip.枠外レーン数;
142                 }
143
144                 #region " IComparable 実装 "
145                 //-----------------
146                 // 概要:
147                 //     現在のインスタンスを同じ型の別のオブジェクトと比較して、並べ替え順序において、現在のインスタンスの位置が同じ型の別のオブジェクトの前、後ろ、または同じのいずれであるかを示す整数を返します。
148                 //
149                 // パラメータ:
150                 //   obj:
151                 //     このインスタンスと比較するオブジェクト。
152                 //
153                 // 戻り値:
154                 //     比較対象オブジェクトの相対順序を示す 32 ビット符号付き整数。戻り値の意味は次のとおりです。 
155                 //
156                 //     値              説明
157                 //     --------------------
158                 //     負数           this < obj
159                 //     0                this = obj
160                 //     正数           this > obj
161                 //
162                 // 例外:
163                 //   System.ArgumentException:
164                 //     obj の型がこのインスタンスの型と異なります。
165                 //
166                 public int CompareTo( object obj )
167                 {
168                         var other = obj as チップ;
169
170                         if( this.小節番号 < other.小節番号 ) { return -1; }
171                         if( this.小節番号 > other.小節番号 ) { return +1; }
172
173                         double dbThis = (double) this.小節内位置 / (double) this.小節解像度;
174                         double dbOther = (double) other.小節内位置 / (double) other.小節解像度;
175
176                         if( dbThis < dbOther ) { return -1; }
177                         if( dbThis > dbOther ) { return +1; }
178
179
180                         // グリッドが完全に等しいなら、チップの種類ごとに定義された深度で順序を決める。
181
182                         if( チップ.チップの深さ[ this.チップ種別 ] > チップ.チップの深さ[ other.チップ種別 ] ) { return -1; }
183                         if( チップ.チップの深さ[ this.チップ種別 ] < チップ.チップの深さ[ other.チップ種別 ] ) { return +1; }
184
185                         return 0;
186                 }
187                 //-----------------
188                 #endregion
189
190                 protected readonly static Dictionary<チップ種別, int> チップの深さ
191                         #region " *** "
192                         //-----------------
193                         = new Dictionary<チップ種別, int>() {
194                                 { チップ種別.Ride_Cup, 50 },
195                                 { チップ種別.HiHat_Open, 50 },
196                                 { チップ種別.HiHat_HalfOpen, 50 },
197                                 { チップ種別.HiHat_Close, 50 },
198                                 { チップ種別.HiHat_Foot, 50 },
199                                 { チップ種別.Snare, 50 },
200                                 { チップ種別.Snare_OpenRim, 50 },
201                                 { チップ種別.Snare_ClosedRim, 50 },
202                                 { チップ種別.Snare_Ghost, 50 },
203                                 { チップ種別.Tom1, 50 },
204                                 { チップ種別.Tom1_Rim, 50 },
205                                 { チップ種別.BPM, 50 },
206                                 { チップ種別.Ride, 60 },
207                                 { チップ種別.Splash, 60 },
208                                 { チップ種別.Tom2, 60 },
209                                 { チップ種別.Tom2_Rim, 60 },
210                                 { チップ種別.LeftCrash, 70 },
211                                 { チップ種別.China, 70 },
212                                 { チップ種別.Tom3, 70 },
213                                 { チップ種別.Tom3_Rim, 70 },
214                                 { チップ種別.RightCrash, 70 },
215                                 { チップ種別.Bass, 75 },
216                                 { チップ種別.LeftCymbal_Mute, 76 },
217                                 { チップ種別.RightCymbal_Mute, 76 },
218                                 { チップ種別.小節線, 80 },
219                                 { チップ種別.拍線, 85 },
220                                 { チップ種別.背景動画, 90 },
221                                 { チップ種別.小節メモ, 99 },
222                                 { チップ種別.Unknown, 99 },
223                         };
224                         //-----------------
225                         #endregion
226
227                 #region " バックストア "
228                 //-----------------
229                 private int bs_音量 = チップ.最大音量;
230                 //-----------------
231                 #endregion
232         }
233 }