OSDN Git Service

#36057 BackSleep,SleepPerFrame,PolyphonicSoundsをCONFIGURATIONで設定できるようにした。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / スコア、曲 / CDTXNestedTypes.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 using System.Drawing;\r
7 using System.Diagnostics;\r
8 using FDK;\r
9 using System.IO;\r
10 \r
11 namespace DTXMania\r
12 {\r
13         public partial class CDTX\r
14         {\r
15                 // クラス\r
16 \r
17                 public class CAVI : IDisposable\r
18                 {\r
19                         public CAviDS avi;\r
20                         private bool bDispose済み;\r
21 \r
22                         int n番号;\r
23                         string strコメント文 = "";\r
24                         string strファイル名 = "";\r
25                         double dbPlaySpeed = 1;\r
26 \r
27                         public CAVI(int number, string filename, string comment, double playSpeed)\r
28                         {\r
29                                 n番号 = number;\r
30                                 strファイル名 = filename;\r
31                                 strコメント文 = comment;\r
32                                 dbPlaySpeed = playSpeed;\r
33                         }\r
34 \r
35                         public void OnDeviceCreated()\r
36                         {\r
37                                 #region [ strAVIファイル名の作成。]\r
38                                 //-----------------\r
39                                 string strAVIファイル名;\r
40 \r
41                                 if (CDTXMania.Instance.DTX != null && !Path.IsPathRooted(this.strファイル名))  // CDTX抜きでCAVI単体で使うことを考慮(選曲画面, リザルト画面)\r
42                                 {                                     // 演奏終了直後はCDTXオブジェクトが残っているので、ファイル名がフルパスかどうかでプレビュー判定する\r
43                                         if (!string.IsNullOrEmpty(CDTXMania.Instance.DTX.PATH_WAV))\r
44                                                 strAVIファイル名 = CDTXMania.Instance.DTX.PATH_WAV + this.strファイル名;\r
45                                         else\r
46                                                 strAVIファイル名 = CDTXMania.Instance.DTX.strフォルダ名 + this.strファイル名;\r
47                                 }\r
48                                 else\r
49                                 {\r
50                                         strAVIファイル名 = this.strファイル名;\r
51                                 }\r
52                                 //-----------------\r
53                                 #endregion\r
54 \r
55                                 if (!File.Exists(strAVIファイル名))\r
56                                 {\r
57                                         Trace.TraceWarning("CAVI: ファイルが存在しません。({0})({1})", this.strコメント文, Path.GetFileName(strAVIファイル名));\r
58                                         this.avi = null;\r
59                                         return;\r
60                                 }\r
61 \r
62                                 // AVI の生成。\r
63 \r
64                                 try\r
65                                 {\r
66                                         this.avi = new CAviDS(strAVIファイル名, this.dbPlaySpeed);\r
67                                         Trace.TraceInformation("CAviDS: 動画を生成しました。({0})({1})({2}msec)", this.strコメント文, Path.GetFileName(strAVIファイル名), this.avi.GetDuration());\r
68                                 }\r
69                                 catch (Exception e)\r
70                                 {\r
71                                         Trace.TraceError(e.Message);\r
72                                         Trace.TraceError("CAviDS: 動画の生成に失敗しました。({0})({1})", this.strコメント文, Path.GetFileName(strAVIファイル名));\r
73                                         this.avi = null;\r
74                                 }\r
75                         }\r
76                         public override string ToString()\r
77                         {\r
78                                 return string.Format("CAVI{0}: File:{1}, Comment:{2}", CDTX.tZZ(this.n番号), this.strファイル名, this.strコメント文);\r
79                         }\r
80 \r
81                         #region [ IDisposable 実装 ]\r
82                         //-----------------\r
83                         public void Dispose()\r
84                         {\r
85                                 if (this.bDispose済み)\r
86                                         return;\r
87 \r
88                                 if (this.avi != null)\r
89                                 {\r
90                                         #region [ strAVIファイル名 の作成。なぜDispose時にファイル名の生成をしているのかと思ったら、デバッグログ用でした。 ]\r
91                                         //-----------------\r
92                                         string strAVIファイル名;\r
93                                         if (CDTXMania.Instance.DTX != null && !Path.IsPathRooted(this.strファイル名))  // CDTX抜きでCAVI単体で使うことを考慮(選曲画面, リザルト画面)\r
94                                         {                                     // 演奏終了直後はCDTXオブジェクトが残っているので、ファイル名がフルパスかどうかでプレビュー判定する\r
95                                                 if (!string.IsNullOrEmpty(CDTXMania.Instance.DTX.PATH_WAV))\r
96                                                         strAVIファイル名 = CDTXMania.Instance.DTX.PATH_WAV + this.strファイル名;\r
97                                                 else\r
98                                                         strAVIファイル名 = CDTXMania.Instance.DTX.strフォルダ名 + this.strファイル名;\r
99                                         }\r
100                                         else\r
101                                         {\r
102                                                 strAVIファイル名 = this.strファイル名;\r
103                                         }\r
104                                         //-----------------\r
105                                         #endregion\r
106 \r
107                                         this.avi.Dispose();\r
108                                         this.avi = null;\r
109 \r
110                                         Trace.TraceInformation("動画を解放しました。({0})({1})", this.strコメント文, Path.GetFileName(strAVIファイル名));\r
111                                 }\r
112                                 this.bDispose済み = true;\r
113                         }\r
114                         //-----------------\r
115                         #endregion\r
116                 }\r
117                 public class CAVIPAN\r
118                 {\r
119                         public int nAVI番号;\r
120                         public int n移動時間ct;\r
121                         public int n番号;\r
122                         public Point pt動画側開始位置 = new Point(0, 0);\r
123                         public Point pt動画側終了位置 = new Point(0, 0);\r
124                         public Point pt表示側開始位置 = new Point(0, 0);\r
125                         public Point pt表示側終了位置 = new Point(0, 0);\r
126                         public Size sz開始サイズ = new Size(0, 0);\r
127                         public Size sz終了サイズ = new Size(0, 0);\r
128 \r
129                         public override string ToString()\r
130                         {\r
131                                 return string.Format("CAVIPAN{0}: AVI:{14}, 開始サイズ:{1}x{2}, 終了サイズ:{3}x{4}, 動画側開始位置:{5}x{6}, 動画側終了位置:{7}x{8}, 表示側開始位置:{9}x{10}, 表示側終了位置:{11}x{12}, 移動時間:{13}ct",\r
132                                         CDTX.tZZ(this.n番号),\r
133                                         this.sz開始サイズ.Width, this.sz開始サイズ.Height,\r
134                                         this.sz終了サイズ.Width, this.sz終了サイズ.Height,\r
135                                         this.pt動画側開始位置.X, this.pt動画側開始位置.Y,\r
136                                         this.pt動画側終了位置.X, this.pt動画側終了位置.Y,\r
137                                         this.pt表示側開始位置.X, this.pt表示側開始位置.Y,\r
138                                         this.pt表示側終了位置.X, this.pt表示側終了位置.Y,\r
139                                         this.n移動時間ct,\r
140                                         CDTX.tZZ(this.nAVI番号));\r
141                         }\r
142                 }\r
143                 public class CBGA\r
144                 {\r
145                         public int nBMP番号;\r
146                         public int n番号;\r
147                         public Point pt画像側右下座標 = new Point(0, 0);\r
148                         public Point pt画像側左上座標 = new Point(0, 0);\r
149                         public Point pt表示座標 = new Point(0, 0);\r
150 \r
151                         public override string ToString()\r
152                         {\r
153                                 return string.Format("CBGA{0}, BMP:{1}, 画像側左上座標:{2}x{3}, 画像側右下座標:{4}x{5}, 表示座標:{6}x{7}",\r
154                                         CDTX.tZZ(this.n番号),\r
155                                         CDTX.tZZ(this.nBMP番号),\r
156                                         this.pt画像側左上座標.X, this.pt画像側左上座標.Y,\r
157                                         this.pt画像側右下座標.X, this.pt画像側右下座標.Y,\r
158                                         this.pt表示座標.X, this.pt表示座標.Y);\r
159                         }\r
160                 }\r
161                 public class CBGAPAN\r
162                 {\r
163                         public int nBMP番号;\r
164                         public int n移動時間ct;\r
165                         public int n番号;\r
166                         public Point pt画像側開始位置 = new Point(0, 0);\r
167                         public Point pt画像側終了位置 = new Point(0, 0);\r
168                         public Point pt表示側開始位置 = new Point(0, 0);\r
169                         public Point pt表示側終了位置 = new Point(0, 0);\r
170                         public Size sz開始サイズ = new Size(0, 0);\r
171                         public Size sz終了サイズ = new Size(0, 0);\r
172 \r
173                         public override string ToString()\r
174                         {\r
175                                 return string.Format("CBGAPAN{0}: BMP:{14}, 開始サイズ:{1}x{2}, 終了サイズ:{3}x{4}, 画像側開始位置:{5}x{6}, 画像側終了位置:{7}x{8}, 表示側開始位置:{9}x{10}, 表示側終了位置:{11}x{12}, 移動時間:{13}ct",\r
176                                         CDTX.tZZ(this.nBMP番号),\r
177                                         this.sz開始サイズ.Width, this.sz開始サイズ.Height,\r
178                                         this.sz終了サイズ.Width, this.sz終了サイズ.Height,\r
179                                         this.pt画像側開始位置.X, this.pt画像側開始位置.Y,\r
180                                         this.pt画像側終了位置.X, this.pt画像側終了位置.Y,\r
181                                         this.pt表示側開始位置.X, this.pt表示側開始位置.Y,\r
182                                         this.pt表示側終了位置.X, this.pt表示側終了位置.Y,\r
183                                         this.n移動時間ct,\r
184                                         CDTX.tZZ(this.nBMP番号));\r
185                         }\r
186                 }\r
187                 public class CBMP : CBMPbase, IDisposable\r
188                 {\r
189                         public CBMP()\r
190                         {\r
191                                 b黒を透過する = true; // BMPでは、黒を透過色とする\r
192                         }\r
193                         public override void PutLog(string strテクスチャファイル名)\r
194                         {\r
195                                 Trace.TraceInformation("テクスチャを生成しました。({0})({1})({2}x{3})", this.strコメント文, strテクスチャファイル名, this.n幅, this.n高さ);\r
196                         }\r
197                         public override string ToString()\r
198                         {\r
199                                 return string.Format("CBMP{0}: File:{1}, Comment:{2}", CDTX.tZZ(this.n番号), this.strファイル名, this.strコメント文);\r
200                         }\r
201 \r
202                 }\r
203                 public class CBMPTEX : CBMPbase, IDisposable\r
204                 {\r
205                         public CBMPTEX()\r
206                         {\r
207                                 b黒を透過する = false;  // BMPTEXでは、透過色はαで表現する\r
208                         }\r
209                         public override void PutLog(string strテクスチャファイル名)\r
210                         {\r
211                                 Trace.TraceInformation("テクスチャを生成しました。({0})({1})(Gr:{2}x{3})(Tx:{4}x{5})", this.strコメント文, strテクスチャファイル名, this.tx画像.sz画像サイズ.Width, this.tx画像.sz画像サイズ.Height, this.tx画像.szテクスチャサイズ.Width, this.tx画像.szテクスチャサイズ.Height);\r
212                         }\r
213                         public override string ToString()\r
214                         {\r
215                                 return string.Format("CBMPTEX{0}: File:{1}, Comment:{2}", CDTX.tZZ(this.n番号), this.strファイル名, this.strコメント文);\r
216                         }\r
217                 }\r
218                 public class CBMPbase : IDisposable\r
219                 {\r
220                         public bool bUse;\r
221                         public int n番号;\r
222                         public string strコメント文 = "";\r
223                         public string strファイル名 = "";\r
224                         public CTexture tx画像;\r
225                         public int n高さ\r
226                         {\r
227                                 get\r
228                                 {\r
229                                         return this.tx画像.sz画像サイズ.Height;\r
230                                 }\r
231                         }\r
232                         public int n幅\r
233                         {\r
234                                 get\r
235                                 {\r
236                                         return this.tx画像.sz画像サイズ.Width;\r
237                                 }\r
238                         }\r
239                         public bool b黒を透過する;\r
240                         public Bitmap bitmap;\r
241 \r
242                         public string GetFullPathname\r
243                         {\r
244                                 get\r
245                                 {\r
246                                         if (!string.IsNullOrEmpty(CDTXMania.Instance.DTX.PATH_WAV))\r
247                                                 return CDTXMania.Instance.DTX.PATH_WAV + this.strファイル名;\r
248                                         else\r
249                                                 return CDTXMania.Instance.DTX.strフォルダ名 + this.strファイル名;\r
250                                 }\r
251                         }\r
252 \r
253                         public void OnDeviceCreated()\r
254                         {\r
255                                 #region [ strテクスチャファイル名 を作成。]\r
256                                 string strテクスチャファイル名 = this.GetFullPathname;\r
257                                 #endregion\r
258 \r
259                                 if (!File.Exists(strテクスチャファイル名))\r
260                                 {\r
261                                         Trace.TraceWarning("ファイルが存在しません。({0})({1})", this.strコメント文, strテクスチャファイル名);\r
262                                         this.tx画像 = null;\r
263                                         return;\r
264                                 }\r
265 \r
266                                 // テクスチャを作成。\r
267                                 byte[] txData = File.ReadAllBytes(strテクスチャファイル名);\r
268                                 this.tx画像 = TextureFactory.tテクスチャの生成(txData, b黒を透過する);\r
269 \r
270                                 if (this.tx画像 != null)\r
271                                 {\r
272                                         // 作成成功。\r
273                                         if (CDTXMania.Instance.ConfigIni.bLogCreateRelease)\r
274                                                 PutLog(strテクスチャファイル名);\r
275                                         txData = null;\r
276                                         this.bUse = true;\r
277                                 }\r
278                                 else\r
279                                 {\r
280                                         // 作成失敗。\r
281                                         Trace.TraceError("テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名);\r
282                                         this.tx画像 = null;\r
283                                 }\r
284                         }\r
285                         /// <summary>\r
286                         /// BGA画像のデコードをTexture()に渡す前に行う、OnDeviceCreate()\r
287                         /// </summary>\r
288                         /// <param name="bitmap">テクスチャ画像</param>\r
289                         /// <param name="strテクスチャファイル名">ファイル名</param>\r
290                         public void OnDeviceCreated(Bitmap bitmap, string strテクスチャファイル名)\r
291                         {\r
292                                 if (bitmap != null && b黒を透過する)\r
293                                 {\r
294                                         bitmap.MakeTransparent(Color.Black);    // 黒を透過色にする\r
295                                 }\r
296                                 this.tx画像 = TextureFactory.tテクスチャの生成(bitmap, b黒を透過する);\r
297 \r
298                                 if (this.tx画像 != null)\r
299                                 {\r
300                                         // 作成成功。\r
301                                         if (CDTXMania.Instance.ConfigIni.bLogCreateRelease)\r
302                                                 PutLog(strテクスチャファイル名);\r
303                                         this.bUse = true;\r
304                                 }\r
305                                 else\r
306                                 {\r
307                                         // 作成失敗。\r
308                                         Trace.TraceError("テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名);\r
309                                         this.tx画像 = null;\r
310                                 }\r
311                                 if (bitmap != null)\r
312                                 {\r
313                                         bitmap.Dispose();\r
314                                 }\r
315                         }\r
316 \r
317                         public virtual void PutLog(string strテクスチャファイル名)\r
318                         {\r
319                         }\r
320 \r
321                         #region [ IDisposable 実装 ]\r
322                         //-----------------\r
323                         public void Dispose()\r
324                         {\r
325                                 if (this.bDisposed済み)\r
326                                         return;\r
327 \r
328                                 if (this.tx画像 != null)\r
329                                 {\r
330                                         #region [ strテクスチャファイル名 を作成。]\r
331                                         //-----------------\r
332                                         string strテクスチャファイル名 = this.GetFullPathname;\r
333                                         //if( !string.IsNullOrEmpty( CDTXMania.Instance.DTX.PATH_WAV ) )\r
334                                         //    strテクスチャファイル名 = CDTXMania.Instance.DTX.PATH_WAV + this.strファイル名;\r
335                                         //else\r
336                                         //    strテクスチャファイル名 = CDTXMania.Instance.DTX.strフォルダ名 + this.strファイル名;\r
337                                         //-----------------\r
338                                         #endregion\r
339 \r
340                                         TextureFactory.tテクスチャの解放(ref this.tx画像);\r
341 \r
342                                         if (CDTXMania.Instance.ConfigIni.bLogCreateRelease)\r
343                                                 Trace.TraceInformation("テクスチャを解放しました。({0})({1})", this.strコメント文, strテクスチャファイル名);\r
344                                 }\r
345                                 this.bUse = false;\r
346 \r
347                                 this.bDisposed済み = true;\r
348                         }\r
349                         #endregion\r
350                         #region [ private ]\r
351                         //-----------------\r
352                         private bool bDisposed済み;\r
353                         //-----------------\r
354                         #endregion\r
355                 }\r
356                 public class CBPM\r
357                 {\r
358                         public double dbBPM値;\r
359                         public int n内部番号;\r
360                         public int n表記上の番号;\r
361 \r
362                         public override string ToString()\r
363                         {\r
364                                 StringBuilder builder = new StringBuilder(0x80);\r
365                                 if (this.n内部番号 != this.n表記上の番号)\r
366                                 {\r
367                                         builder.Append(string.Format("CBPM{0}(内部{1})", CDTX.tZZ(this.n表記上の番号), this.n内部番号));\r
368                                 }\r
369                                 else\r
370                                 {\r
371                                         builder.Append(string.Format("CBPM{0}", CDTX.tZZ(this.n表記上の番号)));\r
372                                 }\r
373                                 builder.Append(string.Format(", BPM:{0}", this.dbBPM値));\r
374                                 return builder.ToString();\r
375                         }\r
376                 }\r
377                 public class CWAV : IDisposable\r
378                 {\r
379                         public bool bBGMとして使う;\r
380                         public List<EChannel> listこのWAVを使用するチャンネル番号の集合 = new List<EChannel>(16);\r
381                         public int nチップサイズ = 100;\r
382                         public int n位置;\r
383                         public long[] n一時停止時刻 = new long[CDTXMania.Instance.ConfigIni.nPolyphonicSounds]; // 4\r
384                         public int n音量 = 100;\r
385                         public int n現在再生中のサウンド番号;\r
386                         public long[] n再生開始時刻 = new long[CDTXMania.Instance.ConfigIni.nPolyphonicSounds]; // 4\r
387                         public int n内部番号;\r
388                         public int n表記上の番号;\r
389                         public CSound[] rSound = new CSound[CDTXMania.Instance.ConfigIni.nPolyphonicSounds];    // 4\r
390                         public string strコメント文 = "";\r
391                         public string strファイル名 = "";\r
392                         public bool bBGMとして使わない\r
393                         {\r
394                                 get\r
395                                 {\r
396                                         return !this.bBGMとして使う;\r
397                                 }\r
398                                 set\r
399                                 {\r
400                                         this.bBGMとして使う = !value;\r
401                                 }\r
402                         }\r
403                         public bool bIsBassSound = false;\r
404                         public bool bIsGuitarSound = false;\r
405                         public bool bIsDrumsSound = false;\r
406                         public bool bIsSESound = false;\r
407                         public bool bIsBGMSound = false;\r
408 \r
409                         public override string ToString()\r
410                         {\r
411                                 var sb = new StringBuilder(128);\r
412 \r
413                                 if (this.n表記上の番号 == this.n内部番号)\r
414                                 {\r
415                                         sb.Append(string.Format("CWAV{0}: ", CDTX.tZZ(this.n表記上の番号)));\r
416                                 }\r
417                                 else\r
418                                 {\r
419                                         sb.Append(string.Format("CWAV{0}(内部{1}): ", CDTX.tZZ(this.n表記上の番号), this.n内部番号));\r
420                                 }\r
421                                 sb.Append(string.Format("音量:{0}, 位置:{1}, サイズ:{2}, BGM:{3}, File:{4}, Comment:{5}", this.n音量, this.n位置, this.nチップサイズ, this.bBGMとして使う ? 'Y' : 'N', this.strファイル名, this.strコメント文));\r
422 \r
423                                 return sb.ToString();\r
424                         }\r
425 \r
426                         #region [ Dispose-Finalize パターン実装 ]\r
427                         //-----------------\r
428                         public void Dispose()\r
429                         {\r
430                                 this.Dispose(true);\r
431                                 GC.SuppressFinalize(this);\r
432                         }\r
433                         public void Dispose(bool bManagedリソースの解放も行う)\r
434                         {\r
435                                 if (this.bDisposed済み)\r
436                                         return;\r
437 \r
438                                 if (bManagedリソースの解放も行う)\r
439                                 {\r
440                                         for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++)  // 4\r
441                                         {\r
442                                                 if (this.rSound[i] != null)\r
443                                                         CDTXMania.Instance.Sound管理.tサウンドを破棄する(this.rSound[i]);\r
444                                                 this.rSound[i] = null;\r
445 \r
446                                                 if ((i == 0) && CDTXMania.Instance.ConfigIni.bLogCreateRelease)\r
447                                                         Trace.TraceInformation("サウンドを解放しました。({0})({1})", this.strコメント文, this.strファイル名);\r
448                                         }\r
449                                 }\r
450 \r
451                                 this.bDisposed済み = true;\r
452                         }\r
453                         ~CWAV()\r
454                         {\r
455                                 this.Dispose(false);\r
456                         }\r
457                         //-----------------\r
458                         #endregion\r
459 \r
460                         #region [ private ]\r
461                         //-----------------\r
462                         private bool bDisposed済み;\r
463                         //-----------------\r
464                         #endregion\r
465                 }\r
466 \r
467 \r
468                 // 構造体\r
469                 public struct STRESULT\r
470                 {\r
471                         public string SS;\r
472                         public string S;\r
473                         public string A;\r
474                         public string B;\r
475                         public string C;\r
476                         public string D;\r
477                         public string E;\r
478 \r
479                         public string this[int index]\r
480                         {\r
481                                 get\r
482                                 {\r
483                                         switch (index)\r
484                                         {\r
485                                                 case 0:\r
486                                                         return this.SS;\r
487 \r
488                                                 case 1:\r
489                                                         return this.S;\r
490 \r
491                                                 case 2:\r
492                                                         return this.A;\r
493 \r
494                                                 case 3:\r
495                                                         return this.B;\r
496 \r
497                                                 case 4:\r
498                                                         return this.C;\r
499 \r
500                                                 case 5:\r
501                                                         return this.D;\r
502 \r
503                                                 case 6:\r
504                                                         return this.E;\r
505                                         }\r
506                                         throw new IndexOutOfRangeException();\r
507                                 }\r
508                                 set\r
509                                 {\r
510                                         switch (index)\r
511                                         {\r
512                                                 case 0:\r
513                                                         this.SS = value;\r
514                                                         return;\r
515 \r
516                                                 case 1:\r
517                                                         this.S = value;\r
518                                                         return;\r
519 \r
520                                                 case 2:\r
521                                                         this.A = value;\r
522                                                         return;\r
523 \r
524                                                 case 3:\r
525                                                         this.B = value;\r
526                                                         return;\r
527 \r
528                                                 case 4:\r
529                                                         this.C = value;\r
530                                                         return;\r
531 \r
532                                                 case 5:\r
533                                                         this.D = value;\r
534                                                         return;\r
535 \r
536                                                 case 6:\r
537                                                         this.E = value;\r
538                                                         return;\r
539                                         }\r
540                                         throw new IndexOutOfRangeException();\r
541                                 }\r
542                         }\r
543                 }\r
544                 public struct STチップがある\r
545                 {\r
546                         public bool Drums;\r
547                         public bool Guitar;\r
548                         public bool Bass;\r
549 \r
550                         public bool HHOpen;\r
551                         public bool Ride;\r
552                         public bool LeftCymbal;\r
553                         public bool OpenGuitar;\r
554                         public bool OpenBass;\r
555 \r
556                         public bool BGA;\r
557                         public bool Movie;\r
558 \r
559                         public bool LeftPedal;\r
560                         public bool LeftBassDrum;\r
561 \r
562                         public bool this[EPart inst]\r
563                         {\r
564                                 get\r
565                                 {\r
566                                         bool ret = false;\r
567                                         if (inst == EPart.Drums)\r
568                                         {\r
569                                                 ret = this.Drums;\r
570                                         }\r
571                                         else if (inst == EPart.Guitar)\r
572                                         {\r
573                                                 ret = this.Guitar;\r
574                                         }\r
575                                         else if (inst == EPart.Bass)\r
576                                         {\r
577                                                 ret = this.Bass;\r
578                                         }\r
579                                         return ret;\r
580                                 }\r
581                         }\r
582 \r
583                         public bool this[int index]\r
584                         {\r
585                                 get\r
586                                 {\r
587                                         switch (index)\r
588                                         {\r
589                                                 case 0:\r
590                                                         return this.Drums;\r
591 \r
592                                                 case 1:\r
593                                                         return this.Guitar;\r
594 \r
595                                                 case 2:\r
596                                                         return this.Bass;\r
597 \r
598                                                 case 3:\r
599                                                         return this.HHOpen;\r
600 \r
601                                                 case 4:\r
602                                                         return this.Ride;\r
603 \r
604                                                 case 5:\r
605                                                         return this.LeftCymbal;\r
606 \r
607                                                 case 6:\r
608                                                         return this.OpenGuitar;\r
609 \r
610                                                 case 7:\r
611                                                         return this.OpenBass;\r
612 \r
613                                                 case 8:\r
614                                                         return this.LeftPedal;\r
615 \r
616                                                 case 9:\r
617                                                         return this.LeftBassDrum;\r
618                                         }\r
619                                         throw new IndexOutOfRangeException();\r
620                                 }\r
621                                 set\r
622                                 {\r
623                                         switch (index)\r
624                                         {\r
625                                                 case 0:\r
626                                                         this.Drums = value;\r
627                                                         return;\r
628 \r
629                                                 case 1:\r
630                                                         this.Guitar = value;\r
631                                                         return;\r
632 \r
633                                                 case 2:\r
634                                                         this.Bass = value;\r
635                                                         return;\r
636 \r
637                                                 case 3:\r
638                                                         this.HHOpen = value;\r
639                                                         return;\r
640 \r
641                                                 case 4:\r
642                                                         this.Ride = value;\r
643                                                         return;\r
644 \r
645                                                 case 5:\r
646                                                         this.LeftCymbal = value;\r
647                                                         return;\r
648 \r
649                                                 case 6:\r
650                                                         this.OpenGuitar = value;\r
651                                                         return;\r
652 \r
653                                                 case 7:\r
654                                                         this.OpenBass = value;\r
655                                                         return;\r
656 \r
657                                                 case 8:\r
658                                                         this.LeftPedal = value;\r
659                                                         return;\r
660 \r
661                                                 case 9:\r
662                                                         this.LeftBassDrum = value;\r
663                                                         return;\r
664                                         }\r
665                                         throw new IndexOutOfRangeException();\r
666                                 }\r
667                         }\r
668                 }\r
669 \r
670         }\r
671 }\r