OSDN Git Service

01da1df3eeb2893117dd998944d9fe363464a099
[dtxmania/dtxmania.git] / DTXMania / コード / ステージ / 04.コンフィグ / CConfigXml.cs
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Runtime.Serialization;
4 using System.Diagnostics;
5 using System;
6 using FDK;
7
8 using SlimDXKey = SlimDX.DirectInput.Key;
9
10 namespace DTXMania
11 {
12         /// <summary>
13         /// DataContract はフィールドまたはプロパティを XML にシリアライズできます。
14         /// DataMember が付いているメンバだけがシリアライズされます。シリアライズ可能な型については MSDN を参照してください。
15         /// DataMember が付いていないメンバはデシリアライズ時に別途指定される既定値になります。
16         /// これらは OnDeserialized 属性がついたメソッドで処理します。
17         /// 
18         /// ---- 重要 ----
19         /// ・新しいバージョンで EnumMember, DataMember の 変数名を変更しないでください。
20         ///   変更しても以前の値を保持したい場合は Name プロパティ (EnumMember の場合 Value プロパティ) に前の名前を入力してください。
21         ///   (例 : [DataMember(Name="old_hoge")]。
22         /// ・DataMember の 型を変更しないでください。
23         /// ・使用しなくなった DataMember を削除しないでください。
24         /// ・デシリアライズで例外が起きた場合 Config.xml はリセットされます。
25         ///  
26         /// ---- 新しくオプションを追加する場合 ----
27         /// ・変数名は原則英語としてください。
28         /// ・DTXMania の新しいバージョンで DataMember を追加する場合 Order 属性値を設定してください。
29         ///  値は他の DataMember の Order 値の中でもっとも大きい値 +1 (無い場合 1 あるいは DTXMania のバージョン) としてください。
30         ///  (例: [DataMember(Order=1 / Order=105 etc.. )]public OptionInteger new_hoge;
31         ///  異なる DataMember が同じ Order 値を持っていても構いません。
32         /// ・DataMember に関連する型には原則 DataContract が必要です (enum など)。
33         ///  これがないと正しくシリアライズ / デシリアライズできません。
34         /// ・メンバは Deserializing メソッドでインスタンスを生成してください。
35         /// ・DefaultDeserializer で説明文や制約を設定 (Initialize メソッド) してください。
36         ///  ラベルや説明文は xml には書き出されませんので、デシリアライズ後にこの処理が必要です。
37         ///  このとき Initialize しようとしている値が null でないかチェックして、
38         ///  null であれば必ず Deserializing メソッド内と同様にインスタンスを生成してください。
39         /// ・CActConfigList で新しく追加した項目を list に追加してください。
40         /// </summary>
41         [DataContract]
42         public class CConfigXml : IExtensibleDataObject, ICloneable
43         {
44                 public static readonly int AssignableCodes = 16;
45
46                 /// <summary>
47                 /// ExtensibleDataObject はラウンドトリップを有効にします。
48                 /// 前のバージョンの DTXMania で新しい Config.xml を読み込んだ時でも
49                 /// デシリアライズされなかったメンバの情報は失われません。
50                 /// </summary>
51                 private ExtensionDataObject extobj;
52                 public ExtensionDataObject ExtensionData
53                 {
54                         get
55                         {
56                                 return extobj;
57                         }
58                         set
59                         {
60                                 extobj = value;
61                         }
62                 }
63
64                 /// <summary>
65                 /// とりあえずshallow copyによるClone()。
66                 /// </summary>
67                 /// <returns>自身を複製したCConfigXmlクラス。</returns>
68                 public object Clone()
69                 {
70                         return (CConfigXml) MemberwiseClone();
71                 }
72
73                 /// <summary>
74                 /// 従来のAVIを拡大表示するかどうか
75                 /// </summary>
76                 [DataMember]
77                 public COptionBool bForceScalingAVI;
78
79                 [DataMember]
80                 public COptionBool bAVI;
81                 [DataMember]
82                 public COptionBool bBGA;
83                 [DataMember]
84                 public COptionBool bBGMPlay;
85                 [DataMember]
86                 public COptionBool bLog;
87                 [DataMember]
88                 public COptionBool bLogDTX;
89                 [DataMember]
90                 public COptionBool bLogEnumerateSongs;
91                 [DataMember]
92                 public COptionBool bLogCreateRelease;
93                 [DataMember]
94                 public COptionEnum<EJudgeDisplayPriority> eJudgePriority;
95                 [DataMember]
96                 public COptionBool bScoreIni;
97                 [DataMember]
98                 public COptionBool bStageFailed;
99                 [DataMember]
100                 // #29500 2012.9.11 kairera0467 TIGHTモード
101                 public COptionBool bTight;
102                 [DataMember]
103                 public COptionBool bWaveAdjust;
104                 [DataMember]
105                 public COptionBool bCymbalFree;
106                 [DataMember]
107                 public COptionBool bStoicMode;
108                 [DataMember]
109                 public COptionBool bDrumsHitSound;
110                 [DataMember]
111                 public COptionBool bFillin;
112                 [DataMember]
113                 public COptionBool bRandSubBox;
114                 [DataMember]
115                 public COptionBool bDebugInfo;
116                 [DataMember]
117                 public COptionBool bAudience;
118                 [DataMember]
119                 public COptionBool bVSyncWait;
120                 [DataMember]
121                 public COptionBool bItalicFontSongSelect;
122                 [DataMember]
123                 public COptionBool bBoldFontSongSelect;
124                 [DataMember]
125                 public COptionBool bFullScreen;
126                 [DataMember]
127                 public COptionBool bViewerVSyncWait;
128                 [DataMember]
129                 public COptionBool bViewerShowDebugStatus;
130                 [DataMember]
131                 public COptionBool bViewerTimeStretch;
132                 [DataMember]
133                 public COptionBool bViewerDrumsActive;
134                 [DataMember]
135                 public COptionBool bViewerGuitarActive;
136                 [DataMember]
137                 public COptionBool bBufferedInput;
138                 [DataMember]
139                 // #25399 2011.6.9 yyagi リザルト画像自動保存機能ON/OFF
140                 public COptionBool bIsAutoResultCapture;
141                 [DataMember]
142                 // #28200 2012.5.1 yyagi System Menuの利用可否切替(使用可)
143                 public COptionBool bIsEnabledSystemMenu;
144                 [DataMember]
145                 // #28195 2012.5.6 yyagi box.defによるスキン切替機能を使用するか否か
146                 public COptionBool bUseBoxDefSkin;
147                 public bool bConfigIniが存在している;
148                 [DataMember]
149                 public COptionBool bLoadSoundSpeed;
150                 [DataMember]
151                 // #26752 2011.11.26 ダブルクリックでのフルスクリーンモード移行を許可
152                 public COptionBool bIsAllowedDoubleClickFullscreen;
153                 [DataMember]
154                 // #33689 2014.6.6 yyagi 演奏タイマーの種類,初期値はfalse (FDKのタイマー。FROM氏考案の独自タイマー)
155                 public COptionBool bUseOSTimer;
156                 [DataMember]
157                 // #24820
158                 public COptionBool bDynamicBassMixerManagement;
159                 [DataMember]
160                 // #23664 2013.2.24 yyagi ピッチ変更無しで再生速度を変更するかどうか,初期値はfalse (再生速度変更を、ピッチ変更にて行う)
161                 public COptionBool bTimeStretch;
162                 [DataMember( Order = 105 )]
163                 // #34825 2016.4.27 yyagi DTXMania動作中のみ、電源プランをHighpowerに変更するかどうか
164                 public COptionBool bForceHighPowerPlan;
165                 [DataMember( Order = 105 )]
166                 // #36261 2016.4.27 yyagi WASAPI動作をevent drivenにするかどうか
167                 public COptionBool bEventDrivenWASAPI;
168                 [DataMember( Order = 105 )]
169                 // 言語設定
170                 public COptionString strLanguage;
171         //      public COptionStringList strLanguageList;
172                 
173                 // #36177 2016.7.30 ikanick
174                 [DataMember( Order = 105 )]
175                 public COptionBool bLoadDTXDetail;
176
177                 [DataMember(Order = 113)]
178                 public COptionBool bShowSongPath;   // #38404 2018.7.30 add yyagi
179
180
181                 [DataMember]
182                 public COptionInteger nBGAlpha;
183                 [DataMember]
184                 public Coordinates.CRect rcWindow;
185
186                 public Coordinates.CRect rcWindow_backup;                       // Viewerとしての使用時は、Playerとして使用する際のウインドウ情報をバックアップしておき、終了時に復元する
187                                                                                                                         // 内部保持するだけの情報であるため、Config.xmlに保存する必要はなく、[DataMember]は不要
188
189                 [DataMember]
190                 public Coordinates.CRect rcViewerWindow;
191                 
192                 [DataMember]
193                 public COptionInteger nMasterVolume;
194                 [DataMember]
195                 public COptionInteger nSleepUnfocusMs;
196                 [DataMember]
197                 public COptionInteger nSleepPerFrameMs;
198                 [DataMember]
199                 public COptionInteger nPlaySpeed;
200                 [DataMember]
201                 public COptionInteger nPreSoundWeightMs;
202                 [DataMember]
203                 public COptionInteger nPreImageWeightMs;
204                 [DataMember]
205                 public COptionInteger nAutoVolume;
206                 [DataMember]
207                 public COptionInteger nChipVolume;
208                 [DataMember]
209                 public COptionInteger nFontSizeDotSongSelect;
210                 [DataMember]
211                 // #23559 2011.6.20 yyagi Riskyでの残ミス数。0で閉店
212                 public COptionInteger nRisky;
213                 [DataMember]
214                 // #32072 2013.10.24 yyagi Semi-Invisibleでの、チップ再表示期間
215                 public COptionInteger nChipDisplayTimeMs;
216                 [DataMember]
217                 // #32072 2013.10.24 yyagi Semi-Invisibleでの、チップフェードアウト時間
218                 public COptionInteger nChipFadeoutTimeMs;
219                 [DataMember]
220                 // #28228 2012.5.1 yyagi レーン毎の最大同時発音数 
221                 // #24820 2013.1.15 yyagi 初期値を4から2に変更。BASS.net使用時の負荷軽減のため。
222                 // #24820 2013.1.17 yyagi 初期値を4に戻した。動的なミキサー制御がうまく動作しているため。
223                 public COptionInteger nPolyphonicSounds;
224                 [DataMember]
225                 // #24820 2013.1.15 yyagi WASAPIのバッファサイズ(WASAPI排他時)または更新間隔(WASAPI共有時)。初期値は更新間隔=2。(0で自動設定)
226                 public COptionInteger nWASAPIBufferSizeMs;
227
228
229                 [DataMember]
230                 public COptionEnum<ECYGroup> eCYGroup;
231                 [DataMember]
232                 public COptionEnum<EDark> eDark;
233                 [DataMember]
234                 public COptionEnum<EFTGroup> eFTGroup;
235                 [DataMember]
236                 public COptionEnum<EHHGroup> eHHGroup;
237                 [DataMember]
238                 // #27029 2012.1.4 from HHPedalとBassPedalのグルーピング
239                 public COptionEnum<EBDGroup> eBDGroup;
240                 [DataMember]
241                 public COptionEnum<EHitSoundPriority> eHitSoundPriorityCY;
242                 [DataMember]
243                 public COptionEnum<EHitSoundPriority> eHitSoundPriorityFT;
244                 [DataMember]
245                 public COptionEnum<EHitSoundPriority> eHitSoundPriorityHH;
246                 [DataMember]
247                 public COptionEnum<EActiveInstrument> eActiveInst;
248                 [DataMember]
249                 // #25370 2011.6.3 yyagi ズレ時間表示
250                 public COptionEnum<EShowLagType> nShowLagType;
251                 [DataMember]
252                 // #24820 2012.12.23 yyagi 初期値はACM | #31927 2013.8.25 yyagi OSにより初期値変更
253                 // 出力サウンドデバイス(0=ACM(にしたいが設計がきつそうならDirectShow), 1=ASIO, 2=WASAPI)
254                 public COptionEnum<ESoundDeviceTypeForConfig> nSoundDeviceType;
255                 [DataMember]
256                 // #27029 2012.1.5 from:
257                 // BDGroup が FP|BD→FP&BD に変化した際に自動変化するパラメータの値のバックアップ。FP&BD→FP|BD の時に元に戻す。
258                 // これらのバックアップ値は、BDGroup が FP&BD 状態の時にのみ Config.ini に出力され、BDGroup が FP|BD に戻ったら Config.ini から消える。
259                 public COptionEnum<EHHGroup> Backup1BDHHGroup;
260                 [DataMember]
261                 public COptionEnum<EHitSoundPriority> Backup1BDPriotiry;
262                 [DataMember]
263                 public COptionEnum<EDamage> eDamageLevel;
264
265                 [DataMember]
266                 public COptionString strDTXManiaVersion;
267                 [DataMember]
268                 public COptionString strSongDataPath;
269                 [DataMember]
270                 public COptionString strFontSongSelect;
271                 [DataMember]
272                 // #28195 2012.5.2 yyagi 使用中のSkinサブフォルダ名
273                 public COptionString strSystemSkinSubfolderPath;
274
275                 [DataMember]
276                 // #24820 2013.1.17 yyagi ASIOデバイス
277                 public COptionStringList strASIODevice;
278
279                 [DataMember( Order = 106 )]
280                 public COptionEnum<EClickType> eClickType;
281                 [DataMember( Order = 106 )]
282                 public COptionInteger nClickHighVolume;
283                 [DataMember( Order = 106 )]
284                 public COptionInteger nClickLowVolume;
285
286
287                 [DataMember]
288                 public STDGBSValue<COptionBool> bLight;
289                 [DataMember]
290                 public STDGBSValue<COptionBool> bReverse;
291                 [DataMember]
292                 public STDGBSValue<COptionBool> bGraph;
293                 [DataMember]
294                 public STDGBSValue<COptionBool> bEmphasizePlaySound;
295                 [DataMember]
296                 public STDGBSValue<COptionEnum<EAutoGhostData>> eAutoGhost;
297                 [DataMember]
298                 public STDGBSValue<COptionEnum<ETargetGhostData>> eTargetGhost;
299                 [DataMember]
300                 public STDGBSValue<COptionEnum<ERandom>> eRandom;
301                 [DataMember]
302                 public STDGBSValue<COptionEnum<ESudHidInv>> eSudHidInv;
303                 [DataMember]
304                 public STDGBSValue<COptionInteger> nMinComboDisp;
305                 [DataMember]
306                 public STDGBSValue<COptionInteger> nScrollSpeed;
307                 [DataMember]
308                 // #23580
309                 public STDGBSValue<COptionInteger> nInputAdjustTimeMs;
310                 [DataMember]
311                 // #31602
312                 public STDGBSValue<COptionInteger> nJudgeLinePosOffset;
313                 [DataMember]
314                 public STDGBSValue<COptionInteger> nViewerScrollSpeed;
315                 [DataMember]
316                 // #31602
317                 public STDGBSValue<COptionFloat> fJudgeLinePosOffsetBase;
318
319                 [DataMember]
320                 public COptionPadBool bAutoPlay;
321
322                 [DataMember]
323                 // #23857 2011.1.31 yyagi VelocityMin
324                 public STPadValue<COptionInteger> nVelocityMin;
325                 [DataMember]
326                 public STPadValue<COptionKeyAssign[]> KeyAssign;
327                 [DataMember]
328                 public STJudgeValue<COptionInteger> nHitRange;
329                 [DataMember]
330                 public COptionDictionary<int, string> dicJoystick;
331
332                 [DataMember]
333                 public STDGBSValue<COptionBool> bDisplayCombo;
334                 [DataMember]
335                 public STDGBSValue<COptionBool> bDisplayJudge;
336
337
338         
339                 /// <summary>
340                 /// 楽器左端座標。ここを基準に各パーツを配置する。
341                 /// </summary>
342                 [DataMember]
343                 public STDGBSValue<STInstValue<COptionInteger>> cdInstX;
344                 [DataMember]
345                 public STInstValue<COptionInteger> cdDebugX;
346                 [DataMember]
347                 public STInstValue<COptionInteger> cdDebugY;
348                 [DataMember]
349                 public STInstValue<COptionInteger> cdLegacyAVIX;
350                 [DataMember]
351                 public STInstValue<COptionInteger> cdLegacyAVIY;
352                 [DataMember]
353                 public STDGBSValue<STInstValue<COptionInteger>> cdComboX;
354                 [DataMember]
355                 public STDGBSValue<STInstValue<COptionInteger>> cdComboY;
356                 [DataMember]
357                 public STDGBSValue<COptionInteger> cdJudgeLineY;
358                 [DataMember]
359                 public STDGBSValue<COptionInteger> cdJudgeY;
360                 [DataMember]
361                 public STLaneValue<COptionInteger> cdLaneOrder;
362                 [DataMember]
363                 public STDGBSValue<COptionInteger> nSuddenFrom;
364                 [DataMember]
365                 public STDGBSValue<COptionInteger> nHiddenFrom;
366                 /// <summary>
367                 /// 旧AVIを強制的にウインドウ全体に表示するときの、X座標
368                 /// (114で...FullMovieXから...ScalewdMovieXに改名)
369                 /// </summary>
370                 [DataMember(Order = 114)]
371                 public STInstValue<COptionInteger> cdForceScaledMovieX;   // #38362 2018.7.19 add yyagi
372                 /// <summary>
373                 /// 旧AVIを強制的にウインドウ全体に表示するときの、Y座標
374                 /// (114で...FullMovieYから...ScalewdMovieYに改名)
375                 /// </summary>
376                 [DataMember(Order = 114)]
377                 public STInstValue<COptionInteger> cdForceScaledMovieY;   // #38362 2018.7.19 add yyagi
378                 /// <summary>
379                 /// 旧AVIを強制的にウインドウ全体に表示するときに、センタリング表示するかどうか
380                 /// (Rel114で廃止)
381                 /// </summary>
382                 //[DataMember(Order = 113)]
383                 //public STInstValue<COptionBool> bForceFullMovieCentering;   // #38362 2018.7.19 add yyagi
384
385                 /// <summary>
386                 /// 旧AVIを強制的にウインドウ全体に表示するときの、width
387                 /// </summary>
388                 [DataMember(Order = 114)]
389                 public STInstValue<COptionInteger> cdForceScaledMovieW;   // #38362 2019.1.8 add yyagi
390                 /// <summary>
391                 /// 旧AVIを強制的にウインドウ全体に表示するときの、height
392                 /// </summary>
393                 [DataMember(Order = 114)]
394                 public STInstValue<COptionInteger> cdForceScaledMovieH;   // #38362 2018.1.8 add yyagi
395
396
397                 public int GetLaneX(ELane e)
398                 {
399                         EPart p = EPart.Drums;
400                         ELane start = ELane.DrumsLaneMin;
401                         ELane end = ELane.DrumsLaneMax;
402                         if (e >= ELane.GuitarLaneMin && e < ELane.GuitarLaneMax)
403                         {
404                                 p = EPart.Guitar;
405                                 start = ELane.GuitarLaneMin;
406                                 end = ELane.GuitarLaneMax;
407                         }
408                         if (e >= ELane.BassLaneMin && e < ELane.BassLaneMax)
409                         {
410                                 p = EPart.Bass;
411                                 start = ELane.BassLaneMin;
412                                 end = ELane.BassLaneMax;
413                         }
414                         int ret = cdInstX[p][eActiveInst];
415                         int order = cdLaneOrder[e];
416                         for (ELane t = start; t < end; ++t)
417                         {
418                                 if (cdLaneOrder[t] < order)
419                                 {
420                                         ret += GetLaneW(t);
421                                 }
422                         }
423                         return ret;
424                 }
425
426                 public int GetLaneW(ELane e)
427                 {
428                         switch (e)
429                         {
430                                 case ELane.LC:
431                                 case ELane.CY:
432                                         return 85;
433                                 case ELane.BD:
434                                         return 99;
435                         }
436                         return 72;
437                 }
438
439                 public void AdjustLaneOrders(EPart p)
440                 {
441                         ELane min = ELane.DrumsLaneMin;
442                         ELane max = ELane.DrumsLaneMax;
443                         if (p == EPart.Guitar)
444                         {
445                                 min = ELane.GuitarLaneMin;
446                                 max = ELane.GuitarLaneMax;
447                         }
448                         else if (p == EPart.Bass)
449                         {
450                                 min = ELane.BassLaneMin;
451                                 max = ELane.BassLaneMax;
452                         }
453
454                         bool[] used = new bool[max - min];
455                         for (ELane t = min; t < max; ++t)
456                         {
457                                 used[cdLaneOrder[t]] = true;
458                         }
459                         for (int i = 0; i < used.Length; ++i)
460                         {
461                                 if (!used[i])
462                                 {
463                                         for (ELane t = min; t < max; ++t)
464                                         {
465                                                 for (ELane t2 = t + 1; t2 < max; ++t2)
466                                                 {
467                                                         if (cdLaneOrder[t].Value == cdLaneOrder[t2].Value)
468                                                         {
469                                                                 cdLaneOrder[t].Value = (int)(min + i);
470                                                                 used[i] = true;
471                                                                 break;
472                                                         }
473                                                 }
474                                                 if (used[i])
475                                                 {
476                                                         break;
477                                                 }
478                                         }
479                                 }
480                         }
481                 }
482
483                 [OnDeserializing]
484                 public void Deserializing(StreamingContext sc)
485                 {
486                         // #xxxxx 2011.11.27 yyagi add
487                         // #23568 2010.11.04 ikanick add
488                         // #34069 2014.7.23 yyagi 初回起動時のwindow sizeは、CDTXMania側で設定する(-> 1280x720にする)
489                         // #30675 2013.02.04 ikanick add
490                         // #23580 2011.1.3 yyagi
491                         // #31602 2013.6.23 yyagi
492                         //this.strDTXManiaのバージョン = "Unknown";
493
494                         // bool
495                         bFullScreen = new COptionBool(false);
496                         bVSyncWait = new COptionBool(true);
497                         bStageFailed = new COptionBool(true);
498                         bForceScalingAVI = new COptionBool(false);
499                         bAVI = new COptionBool(true);
500                         bBGA = new COptionBool(true);
501                         bFillin = new COptionBool(true);
502                         bLogDTX = new COptionBool(false);
503                         bLogEnumerateSongs = new COptionBool(false);
504                         bLogCreateRelease = new COptionBool(false);
505                         bCymbalFree = new COptionBool(false);
506                         bStoicMode = new COptionBool(false);
507                         bItalicFontSongSelect = new COptionBool(false);
508                         bWaveAdjust = new COptionBool(true);
509                         bBGMPlay = new COptionBool(true);
510                         bDrumsHitSound = new COptionBool(true);
511                         bAudience = new COptionBool(true);
512                         bScoreIni = new COptionBool(true);
513                         bRandSubBox = new COptionBool(true);
514                         bBoldFontSongSelect = new COptionBool(true);
515                         bDebugInfo = new COptionBool(false);
516                         bLog = new COptionBool(true);
517                         bAutoPlay = new COptionPadBool();
518                         for ( EPad pad = EPad.DrumsPadMin; pad < EPad.DrumsPadMax; ++pad )
519                         {
520                                 bAutoPlay[ pad ] = new COptionBool( false );
521                         }
522                         for ( EPad pad = EPad.GuitarPadMin; pad < EPad.BassPadMax; ++pad )
523                         {
524                                 bAutoPlay[ pad ] = new COptionBool( true );
525                         }
526                         bAutoPlay[ EPad.Capture ] = new COptionBool( true );
527                         bViewerVSyncWait = new COptionBool( true );
528                         bViewerShowDebugStatus = new COptionBool(true);
529                         bViewerTimeStretch = new COptionBool(false);
530                         bViewerDrumsActive = new COptionBool(true);
531                         bViewerGuitarActive = new COptionBool(true);
532                         bLoadSoundSpeed = new COptionBool(true);
533                         bIsAutoResultCapture = new COptionBool(false);
534                         bBufferedInput = new COptionBool(true);
535                         bIsAllowedDoubleClickFullscreen = new COptionBool(true);
536                         bIsEnabledSystemMenu = new COptionBool(true);
537                         bUseBoxDefSkin = new COptionBool(true);
538                         bTight = new COptionBool(false);
539                         bUseOSTimer = new COptionBool(false);
540                         bDynamicBassMixerManagement = new COptionBool(true);
541                         bTimeStretch = new COptionBool(false);
542                         nSoundDeviceType = new COptionEnum<ESoundDeviceTypeForConfig>(
543                                 FDK.COS.bIsVistaOrLater() ? 
544                                         (FDK.COS.bIsWin10OrLater()? ESoundDeviceTypeForConfig.WASAPI_Shared : ESoundDeviceTypeForConfig.WASAPI_Exclusive) 
545                                         : ESoundDeviceTypeForConfig.DSound
546                         );
547                         bForceHighPowerPlan = new COptionBool( false );
548                         bEventDrivenWASAPI = new COptionBool( false );
549                         bLoadDTXDetail = new COptionBool( false );
550                         bShowSongPath = new COptionBool( false );
551
552                         // string
553                         strSongDataPath = new COptionString(@".\");
554                         strFontSongSelect = new COptionString("MS PGothic");
555                         strDTXManiaVersion = new COptionString(CDTXMania.VERSION);
556                         strSystemSkinSubfolderPath = new COptionString(@".\Default\");
557
558                         // enum
559                         eDamageLevel = new COptionEnum<EDamage>(EDamage.Normal);
560                         eJudgePriority = new COptionEnum<EJudgeDisplayPriority>(EJudgeDisplayPriority.Under);
561                         eCYGroup = new COptionEnum<ECYGroup>(ECYGroup.Off);
562                         eDark = new COptionEnum<EDark>(EDark.Off);
563                         eFTGroup = new COptionEnum<EFTGroup>(EFTGroup.Off);
564                         eHHGroup = new COptionEnum<EHHGroup>(EHHGroup.Off);
565                         eBDGroup = new COptionEnum<EBDGroup>(EBDGroup.Off);
566                         Backup1BDHHGroup = new COptionEnum<EHHGroup>(EHHGroup.Off);
567                         Backup1BDPriotiry = new COptionEnum<EHitSoundPriority>(EHitSoundPriority.Chip);
568                         eHitSoundPriorityCY = new COptionEnum<EHitSoundPriority>(EHitSoundPriority.Chip);
569                         eHitSoundPriorityFT = new COptionEnum<EHitSoundPriority>(EHitSoundPriority.Chip);
570                         eHitSoundPriorityHH = new COptionEnum<EHitSoundPriority>(EHitSoundPriority.Chip);
571                         eJudgePriority = new COptionEnum<EJudgeDisplayPriority>(EJudgeDisplayPriority.Under);
572                         eActiveInst = new COptionEnum<EActiveInstrument>(EActiveInstrument.Both);
573                         nShowLagType = new COptionEnum<EShowLagType>(EShowLagType.Off);
574
575                         // integer
576                         rcWindow = new Coordinates.CRect(100, 100, 1280, 720);
577                         rcWindow_backup = new Coordinates.CRect( 100, 100, 1280, 720 );
578                         nSleepPerFrameMs = new COptionInteger( -1 );
579                         nSleepUnfocusMs = new COptionInteger(1);
580                         nBGAlpha = new COptionInteger(100);
581                         nPreSoundWeightMs = new COptionInteger(1000);
582                         nPreImageWeightMs = new COptionInteger(100);
583                         nFontSizeDotSongSelect = new COptionInteger(20);
584                         nAutoVolume = new COptionInteger(80);
585                         nChipVolume = new COptionInteger(100);
586                         nPlaySpeed = new COptionInteger(20);
587
588                         nHitRange = new STJudgeValue<COptionInteger>();
589                         nHitRange.Perfect = new COptionInteger(34);
590                         nHitRange.Great = new COptionInteger(67);
591                         nHitRange.Good = new COptionInteger(84);
592                         nHitRange.Poor = new COptionInteger(117);
593
594                         nVelocityMin = new STPadValue<COptionInteger>();
595                         for (EPad pad = EPad.Min; pad < EPad.Max; ++pad)
596                         {
597                                 nVelocityMin[pad] = new COptionInteger(0);
598                         }
599                         nVelocityMin.HH.Value = 20;
600
601                         nRisky = new COptionInteger(0);
602                         nWASAPIBufferSizeMs = new COptionInteger(2);
603                         nChipDisplayTimeMs = new COptionInteger(3000);
604                         nChipFadeoutTimeMs = new COptionInteger(2000);
605                         rcViewerWindow = new Coordinates.CRect(100, 100, 640, 360);
606                         nMasterVolume = new COptionInteger(100);
607                         nPolyphonicSounds = new COptionInteger(2);                                      // #38474 2018.8.3 yyagi 4 -> 2, to reduce sound mixing load 
608
609                         eClickType = new COptionEnum<EClickType>(EClickType.Off);
610                         nClickHighVolume = new COptionInteger(100);
611                         nClickLowVolume = new COptionInteger(100);
612
613                         // dgb
614                         bEmphasizePlaySound = new STDGBSValue<COptionBool>();
615                         bReverse = new STDGBSValue<COptionBool>();
616                         bLight = new STDGBSValue<COptionBool>();
617                         bGraph = new STDGBSValue<COptionBool>();
618                         bDisplayCombo = new STDGBSValue<COptionBool>();
619                         bDisplayJudge = new STDGBSValue<COptionBool>();
620
621                         nScrollSpeed = new STDGBSValue<COptionInteger>();
622                         nMinComboDisp = new STDGBSValue<COptionInteger>();
623                         nInputAdjustTimeMs = new STDGBSValue<COptionInteger>();
624                         nJudgeLinePosOffset = new STDGBSValue<COptionInteger>();
625                         nSuddenFrom = new STDGBSValue<COptionInteger>();
626                         nHiddenFrom = new STDGBSValue<COptionInteger>();
627
628                         eRandom = new STDGBSValue<COptionEnum<ERandom>>();
629                         eAutoGhost = new STDGBSValue<COptionEnum<EAutoGhostData>>();
630                         eTargetGhost = new STDGBSValue<COptionEnum<ETargetGhostData>>();
631                         eSudHidInv = new STDGBSValue<COptionEnum<ESudHidInv>>();
632
633
634                         for (EPart i = EPart.Drums; i <= EPart.Unknown; i++)
635                         {
636                                 bEmphasizePlaySound[i] = new COptionBool(true);
637                                 bReverse[i] = new COptionBool(false);
638                                 eRandom[i] = new COptionEnum<ERandom>(ERandom.Off);
639                                 bLight[i] = new COptionBool(false);
640                                 bGraph[i] = new COptionBool(false);
641                                 bDisplayJudge[i] = new COptionBool(true);
642                                 bDisplayCombo[i] = new COptionBool(true);
643
644                                 nScrollSpeed[i] = new COptionInteger(1);
645                                 nInputAdjustTimeMs[i] = new COptionInteger(0);
646                                 nJudgeLinePosOffset[i] = new COptionInteger(0);
647                                 nViewerScrollSpeed[i] = new COptionInteger(1);
648                                 nMinComboDisp[i] = new COptionInteger(2);
649                                 nSuddenFrom[i] = new COptionInteger(450); // +100 FI
650                                 nHiddenFrom[i] = new COptionInteger(225); // +100 FO
651
652                                 eAutoGhost[i] = new COptionEnum<EAutoGhostData>(EAutoGhostData.Perfect);
653                                 eTargetGhost[i] = new COptionEnum<ETargetGhostData>(ETargetGhostData.None);
654                                 eSudHidInv[i] = new COptionEnum<ESudHidInv>(ESudHidInv.Off);
655
656                                 fJudgeLinePosOffsetBase[i] = new COptionFloat(0f);
657                         }
658
659                         dicJoystick = new COptionDictionary<int, string>();
660                         dicJoystick.Value = new Dictionary<int, string>(10);
661
662                         string[] asiodevs = CEnumerateAllAsioDevices.GetAllASIODevices();
663                         strASIODevice = new COptionStringList(asiodevs.Length > 0 ? asiodevs[0] : null);
664
665                         strLanguage = new COptionString( "" );          // "default"でなく"" にすること。そうすることで、Locale情報を使った初期化がなされる。
666                 //      strLanguageList = new COptionStringList("");
667
668
669                         cdInstX = new STDGBSValue<STInstValue<COptionInteger>>();
670                         cdInstX.Drums = new STInstValue<COptionInteger>();
671                         cdInstX.Drums.DrOnly = new COptionInteger(SampleFramework.GameWindowSize.Width / 2 - 314);
672                         cdInstX.Guitar = new STInstValue<COptionInteger>();
673                         cdInstX.Guitar.GBOnly = new COptionInteger(480 - 72 * 4);
674                         cdInstX.Bass = new STInstValue<COptionInteger>();
675                         cdInstX.Bass.GBOnly = new COptionInteger(SampleFramework.GameWindowSize.Width - 480);
676                         cdInstX.Drums.Both = new COptionInteger(cdInstX.Drums.DrOnly);
677                         cdInstX.Guitar.Both = new COptionInteger(cdInstX.Guitar.GBOnly);
678                         cdInstX.Bass.Both = new COptionInteger(cdInstX.Bass.GBOnly);
679
680                         cdDebugX = new STInstValue<COptionInteger>();
681                         cdDebugX.DrOnly = new COptionInteger(450 * 3);
682                         cdDebugX.Both = new COptionInteger(450 * 3);
683                         cdDebugX.GBOnly = new COptionInteger(cdInstX.Drums.DrOnly);
684
685                         cdDebugY = new STInstValue<COptionInteger>();
686                         cdDebugY.Both = new COptionInteger(200);
687                         cdDebugY.DrOnly = new COptionInteger(200);
688                         cdDebugY.GBOnly = new COptionInteger(200);
689
690                         cdLegacyAVIX = new STInstValue<COptionInteger>();
691                         cdLegacyAVIX.Both = new COptionInteger(619 + 682);
692                         cdLegacyAVIX.DrOnly = new COptionInteger(619 + 682);
693                         cdLegacyAVIX.GBOnly = new COptionInteger(682);
694
695                         cdLegacyAVIY = new STInstValue<COptionInteger>();
696                         cdLegacyAVIY.Both = new COptionInteger(128);
697                         cdLegacyAVIY.DrOnly = new COptionInteger(128);
698                         cdLegacyAVIY.GBOnly = new COptionInteger(128);
699
700                         #region [ #38362 ForcedFullScreen X, Y, W, H ] 
701                         cdForceScaledMovieX = new STInstValue<COptionInteger>();
702                         cdForceScaledMovieX.Both = new COptionInteger(0);
703                         cdForceScaledMovieX.DrOnly = new COptionInteger(0);
704                         cdForceScaledMovieX.GBOnly = new COptionInteger(0);
705
706                         cdForceScaledMovieY = new STInstValue<COptionInteger>();
707                         cdForceScaledMovieY.Both = new COptionInteger(0);
708                         cdForceScaledMovieY.DrOnly = new COptionInteger(0);
709                         cdForceScaledMovieY.GBOnly = new COptionInteger(0);
710
711                         cdForceScaledMovieW = new STInstValue<COptionInteger>();
712                         cdForceScaledMovieW.Both = new COptionInteger(1920);
713                         cdForceScaledMovieW.DrOnly = new COptionInteger(1920);
714                         cdForceScaledMovieW.GBOnly = new COptionInteger(1920);
715
716                         cdForceScaledMovieH = new STInstValue<COptionInteger>();
717                         cdForceScaledMovieH.Both = new COptionInteger(1080);
718                         cdForceScaledMovieH.DrOnly = new COptionInteger(1080);
719                         cdForceScaledMovieH.GBOnly = new COptionInteger(1080);
720
721                         //bForceFullMovieCentering = new STInstValue<COptionBool>();
722                         //bForceFullMovieCentering.Both = new COptionBool(true);
723                         //bForceFullMovieCentering.DrOnly = new COptionBool(true);
724                         //bForceFullMovieCentering.GBOnly = new COptionBool(true);
725                         #endregion
726
727                         cdComboX = new STDGBSValue<STInstValue<COptionInteger>>();
728                         cdComboX.Drums = new STInstValue<COptionInteger>();
729                         cdComboX.Drums.Both = new COptionInteger(cdInstX.Drums.Both + (72 * 5 + 85 * 2 + 99) / 2);
730                         cdComboX.Drums.DrOnly = new COptionInteger(cdInstX.Drums.DrOnly + (72 * 5 + 85 * 2 + 99) / 2);
731                         cdComboX.Guitar = new STInstValue<COptionInteger>();
732                         cdComboX.Guitar.Both = new COptionInteger(cdInstX.Guitar.Both + 72 * 2);
733                         cdComboX.Guitar.GBOnly = new COptionInteger(cdInstX.Guitar.GBOnly + 72 * 2);
734                         cdComboX.Bass = new STInstValue<COptionInteger>();
735                         cdComboX.Bass.Both = new COptionInteger(cdInstX.Bass.Both + 72 * 2);
736                         cdComboX.Bass.GBOnly = new COptionInteger(cdInstX.Bass.GBOnly + 72 * 2);
737
738                         cdComboY = new STDGBSValue<STInstValue<COptionInteger>>();
739                         cdComboY.Drums = new STInstValue<COptionInteger>();
740                         cdComboY.Drums.Both = new COptionInteger(100);
741                         cdComboY.Drums.DrOnly = new COptionInteger(100);
742                         cdComboY.Guitar = new STInstValue<COptionInteger>();
743                         cdComboY.Guitar.Both = new COptionInteger(700);
744                         cdComboY.Guitar.GBOnly = new COptionInteger(700);
745                         cdComboY.Bass = new STInstValue<COptionInteger>();
746                         cdComboY.Bass.Both = new COptionInteger(700);
747                         cdComboY.Bass.GBOnly = new COptionInteger(700);
748
749                         cdJudgeLineY = new STDGBSValue<COptionInteger>();
750                         cdJudgeLineY.Drums = new COptionInteger(942);
751                         cdJudgeLineY.Guitar = new COptionInteger(138);
752                         cdJudgeLineY.Bass = new COptionInteger(138);
753
754                         cdJudgeY = new STDGBSValue<COptionInteger>();
755                         cdJudgeY.Drums = new COptionInteger(350);
756                         cdJudgeY.Guitar = new COptionInteger(600);
757                         cdJudgeY.Bass = new COptionInteger(600);
758
759                         cdLaneOrder = new STLaneValue<COptionInteger>();
760                         for (ELane lane = ELane.DrumsLaneMin; lane < ELane.BassLaneMax; ++lane)
761                         {
762                                 cdLaneOrder[lane] = new COptionInteger(0);
763                         }
764
765                         cdLaneOrder.HH.Value = 1;
766                         cdLaneOrder.SD.Value = 2;
767                         cdLaneOrder.BD.Value = 3;
768                         cdLaneOrder.HT.Value = 4;
769                         cdLaneOrder.LT.Value = 5;
770                         cdLaneOrder.FT.Value = 6;
771                         cdLaneOrder.CY.Value = 7;
772
773                         cdLaneOrder.GtR.Value = 0;
774                         cdLaneOrder.GtG.Value = 1;
775                         cdLaneOrder.GtB.Value = 2;
776                         cdLaneOrder.GtW.Value = 3;
777
778                         cdLaneOrder.BsR.Value = 0;
779                         cdLaneOrder.BsG.Value = 1;
780                         cdLaneOrder.GtB.Value = 2;
781                         cdLaneOrder.BsW.Value = 3;
782
783                         bConfigIniが存在している = System.IO.File.Exists(CDTXMania.Instance.strEXEのあるフォルダ + "Config.xml");
784                         SetDefaultKeyAssign();
785                 }
786
787                 /// <summary>
788                 /// 保存する必要がない値はここで設定してください。
789                 /// 設定しない場合 DataMember 以外のメンバはすべてその型の規定値になります。
790                 /// </summary>
791                 /// <param name="sc">ストリーミングコンテキスト。使用しません。</param>
792                 [OnDeserialized]
793                 public void DefaultDeserializer(StreamingContext sc)
794                 {
795                         // ラベル・説明文・上下限値
796                         CResources cr = CDTXMania.Instance.Resources;
797                         bFullScreen.Initialize( "strCfgSysFullScreen" );
798                         bVSyncWait.Initialize( "strCfgSysVSync" );
799                         bStageFailed.Initialize( "strCfgSysStageFailed");
800                         bForceScalingAVI.Initialize( "strCfgSysForceScalingAVI" );
801                         bAVI.Initialize( "strCfgSysAVI" );
802                         bBGA.Initialize( "strCfgSysBGA" );
803                         bLog.Initialize( "strCfgSysLog" );
804                         bStoicMode.Initialize( "strCfgSysStoic" );
805                         bWaveAdjust.Initialize( "strCfgSysAdjustWaves" );
806                         bBGMPlay.Initialize( "strCfgSysBGM" );
807                         bAudience.Initialize( "strCfgSysAudience" );
808                         bScoreIni.Initialize( "strCfgSysSaveScoreIni" );
809                         bRandSubBox.Initialize( "strCfgSysRandSubBox" );
810                         bAutoPlay.HH.Initialize( "strCfgDrAutoHHC" );
811                         bAutoPlay.HHO.Initialize( "strCfgDrAutoHHO" );
812                         bAutoPlay.SD.Initialize( "strCfgDrAutoSD" );
813                         bAutoPlay.BD.Initialize( "strCfgDrAutoBD" );
814                         bAutoPlay.HT.Initialize( "strCfgDrAutoHT" );
815                         bAutoPlay.LT.Initialize( "strCfgDrAutoLT" );
816                         bAutoPlay.FT.Initialize( "strCfgDrAutoFT" );
817                         bAutoPlay.CY.Initialize( "strCfgDrAutoCY" );
818                         bAutoPlay.RD.Initialize( "strCfgDrAutoRD" );
819                         bAutoPlay.LC.Initialize( "strCfgDrAutoLCY" );
820                         bAutoPlay.GtR.Initialize( "strCfgGtAutoR" );
821                         bAutoPlay.GtG.Initialize( "strCfgGtAutoG" );
822                         bAutoPlay.GtB.Initialize( "strCfgGtAutoB" );
823                         bAutoPlay.GtPick.Initialize( "strCfgGtAutoPick" );
824                         bAutoPlay.GtWail.Initialize( "strCfgGtAutoWailing" );
825                         bAutoPlay.BsR.Initialize( "strCfgBsAutoR" );
826                         bAutoPlay.BsG.Initialize( "strCfgBsAutoG" );
827                         bAutoPlay.BsB.Initialize( "strCfgBsAutoB" );
828                         bAutoPlay.BsPick.Initialize( "strCfgBsAutoPick" );
829                         bAutoPlay.BsWail.Initialize( "strCfgBsAutoWailing" );
830                         bAutoPlay.Capture.Initialize( "strCfgCapture" );
831
832                         bLoadSoundSpeed.Initialize( "strCfgSysSoundLoadLimiter" );
833                         bIsAutoResultCapture.Initialize( "strCfgSysAutoResultCapture" );
834                         bBufferedInput.Initialize( "strCfgSysBufferingInput" );
835                         bUseBoxDefSkin.Initialize( "strCfgSysUseBoxDefSkin" );
836                         bUseOSTimer.Initialize( "strCfgSysUseOSTimer" );
837                         bTimeStretch.Initialize( "strCfgSysTimeStretch" );
838                         bForceHighPowerPlan.Initialize( "strCfgSysForceHighPowerPlan" );
839                         bEventDrivenWASAPI.Initialize( "strCfgSysWASAPIEventDriven" );
840                         bLoadDTXDetail.Initialize( "strCfgSysLoadDTXDetail" ); // #36177 2016.7.30 ikanick
841
842                         bCymbalFree.Initialize( "strCfgDrCymbalFree" );
843                         bDrumsHitSound.Initialize( "strCfgDrChipSound" );
844                         bFillin.Initialize( "strCfgDrFillin" );
845                         bTight.Initialize( "strCfgDrTight" );
846
847                         bItalicFontSongSelect.Initialize("", "");
848                         bBoldFontSongSelect.Initialize("", "");
849                         bLogDTX.Initialize("", "");
850                         bLogEnumerateSongs.Initialize("", "");
851                         bLogCreateRelease.Initialize("", "");
852                         bViewerVSyncWait.Initialize("", "");
853                         bViewerShowDebugStatus.Initialize("", "");
854                         bViewerTimeStretch.Initialize("", "");
855                         bViewerDrumsActive.Initialize("", "");
856                         bViewerGuitarActive.Initialize("", "");
857                         bIsAllowedDoubleClickFullscreen.Initialize("", "");
858                         bIsEnabledSystemMenu.Initialize("", "");
859                         bDynamicBassMixerManagement.Initialize("", "");
860                         bDebugInfo.Initialize( "strCfgSysDebugInfo" );
861
862                         bShowSongPath.Initialize( "strCfgShowSongPath" );
863
864                         // enum
865                         nSoundDeviceType.Initialize( "strCfgSysSoundDeviceType", typeof(ESoundDeviceTypeForConfig));
866                         eDamageLevel.Initialize( "strCfgSysDamageLevel", typeof(EDamage));
867                         eJudgePriority.Initialize( "strCfgSysJudgePriority", typeof(EJudgeDisplayPriority));
868                         eCYGroup.Initialize( "strCfgDrCYGroup", typeof(ECYGroup));
869                         eDark.Initialize( "strCfgSysDark", typeof(EDark));
870                         eFTGroup.Initialize( "strCfgDrFTGroup", typeof(EFTGroup));
871                         eHHGroup.Initialize( "strCfgDrHHGroup", typeof(EHHGroup));
872                         eBDGroup.Initialize( "strCfgDrBDGroup", typeof(EBDGroup));
873                         Backup1BDHHGroup.Initialize("", "", typeof(EHHGroup));
874                         Backup1BDPriotiry.Initialize("", "", typeof(EHitSoundPriority));
875                         eHitSoundPriorityCY.Initialize( "strCfgDrCYPriority", typeof(EHitSoundPriority));
876                         eHitSoundPriorityFT.Initialize( "strCfgDrFTPriority", typeof(EHitSoundPriority));
877                         eHitSoundPriorityHH.Initialize( "strCfgDrHHPriority", typeof(EHitSoundPriority));
878 //                      eJudgePriority.Initialize("Judge Priority", Properties.Resources.strCfgSysJudgePriority, typeof(EJudgeDisplayPriority));
879                         eActiveInst.Initialize( "strCfgSysPlayMode", typeof(EActiveInstrument));
880                         nShowLagType.Initialize( "strCfgSysShowLagType", typeof(EShowLagType));
881
882                         eClickType.Initialize( "strCfgSysClickType", typeof( EClickType ) );
883                         nClickHighVolume.Initialize( "strCfgSysClickHighVolume", 0, 101 );
884                         nClickLowVolume.Initialize( "strCfgSysClickLowVolume", 0, 101 );
885
886
887                         // integer
888                         nSleepPerFrameMs.Initialize( "strCfgSysSleepPerFrame", -1, 33 );
889                         nSleepUnfocusMs.Initialize( "strCfgSysSleepUnfocus", 0, 33 );
890                         nBGAlpha.Initialize( "strCfgSysBGAAlpha", 0, 256 );
891                         nPreSoundWeightMs.Initialize( "strCfgSysPreSoundWait", 0, 10001);
892                         nPreImageWeightMs.Initialize( "strCfgSysPreImageWait", 0, 10001);
893                         nFontSizeDotSongSelect.Initialize("", "", 5);
894                         nAutoVolume.Initialize( "strCfgSysAutoVolume", 0, 101);
895                         nChipVolume.Initialize( "strCfgSysChipVolume", 0, 101);
896                         nPlaySpeed.Initialize( "strCfgSysPlaySpeed", 5, 41);
897                         nPlaySpeed.ValueFormatter = (x) =>
898                         {
899                                 return "x" + (x / 20f).ToString("0.000");
900                         };
901                         nHitRange.Perfect.Initialize( "strCfgRangePerfect", 0 );
902                         nHitRange.Great.Initialize( "strCfgRangeGreat", 0 );
903                         nHitRange.Good.Initialize( "strCfgRangeGood", 0 );
904                         nHitRange.Poor.Initialize( "strCfgRangePoor", 0 );
905                         nVelocityMin.LC.Initialize( "strCfgDrLCVelocityMin", 0, 128 );
906                         nVelocityMin.HH.Initialize( "strCfgDrHHVelocityMin", 0, 128 );
907                         nVelocityMin.SD.Initialize( "strCfgDrSDVelocityMin", 0, 128 );
908                         nVelocityMin.BD.Initialize( "strCfgDrBDVelocityMin", 0, 128 );
909                         nVelocityMin.HT.Initialize( "strCfgDrHTVelocityMin", 0, 128 );
910                         nVelocityMin.LT.Initialize( "strCfgDrLTVelocityMin", 0, 128 );
911                         nVelocityMin.FT.Initialize( "strCfgDrFTVelocityMin", 0, 128 );
912                         nVelocityMin.CY.Initialize( "strCfgDrCYVelocityMin", 0, 128 );
913                         nVelocityMin.RD.Initialize( "strCfgDrRDVelocityMin", 0, 128 );
914                         nRisky.Initialize( "strCfgSysRisky", 0, 100 );
915                         nWASAPIBufferSizeMs.Initialize( "strCfgSysWASAPIBufSize", 0, 100001);
916                         nChipDisplayTimeMs.Initialize("", "", 0);
917                         nChipFadeoutTimeMs.Initialize("", "", 0);
918
919                         nMasterVolume.Initialize( "strCfgSysMasterVolume", 0, 201);
920                         nPolyphonicSounds.Initialize( "strCfgSysPolyphonicSounds", 1, 11 );
921
922                         // dgb
923                         for (EPart i = EPart.Drums; i <= EPart.Unknown; i++)
924                         {
925                                 bEmphasizePlaySound[i].Initialize( "strCfgDgbChipSoundMonitor" );
926                                 bReverse[i].Initialize( "strCfgDgbReverse" );
927                                 eRandom[i].Initialize( "strCfgDgbRandom", typeof(ERandom) );
928                                 bLight[i].Initialize( "strCfgDgbLight" );
929                                 bDisplayCombo[i].Initialize( "strCfgDgbDisplayCombo" );
930                                 bDisplayJudge[i].Initialize( "strCfgDgbDisplayJudge" );
931                                 bGraph[i].Initialize( "strCfgDgbDisplayGraph" );
932                                 nScrollSpeed[i].Initialize( "strCfgDgbScrollSpeed", 1, 101);
933                                 nScrollSpeed[i].ValueFormatter = (x) =>
934                                         {
935                                                 return "x" + (x * 0.5f).ToString("0.0");
936                                         };
937                                 nInputAdjustTimeMs[i].Initialize( "strCfgDgbInputAdjust", -99, 100);
938                                 nJudgeLinePosOffset[i].Initialize("", "", -SampleFramework.GameWindowSize.Height, SampleFramework.GameWindowSize.Height + 1);
939                                 nViewerScrollSpeed[i].Initialize("", "", 1, 101);
940                                 nMinComboDisp[i].Initialize( "strCfgDgbMinComboDisp", 2, 100001);
941                                 nSuddenFrom[i].Initialize( "strCfgDgbSuddenFrom", 0, SampleFramework.GameWindowSize.Height + 1);
942                                 nHiddenFrom[i].Initialize( "strCfgDgbHiddenFrom", 0, SampleFramework.GameWindowSize.Height + 1);
943                                 eAutoGhost[i].Initialize( "strCfgDgbAutoGhost", typeof(EAutoGhostData));
944                                 eTargetGhost[i].Initialize( "strCfgDgbTargetGhost", typeof(ETargetGhostData));
945                                 eSudHidInv[i].Initialize( "strCfgDgbSudHidInv", typeof(ESudHidInv));
946
947                                 fJudgeLinePosOffsetBase[i].Initialize("", "");
948                         }
949
950                         string[] asiodevs = CEnumerateAllAsioDevices.GetAllASIODevices();
951                         strASIODevice.Initialize( "strCfgSysASIODevice", asiodevs);
952
953                         int crdStep = 10;
954                         cdInstX.Drums.Both.Initialize("strCfgDispDrumsXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
955                         cdInstX.Drums.DrOnly.Initialize("strCfgDispDrumsXDr", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
956                         cdInstX.Guitar.Both.Initialize("strCfgDispGuitarXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
957                         cdInstX.Guitar.GBOnly.Initialize("strCfgDispGuitarXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
958                         cdInstX.Bass.Both.Initialize("strCfgDispBassXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
959                         cdInstX.Bass.GBOnly.Initialize("strCfgDispBassXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
960
961                         cdDebugX.DrOnly.Initialize("strCfgDispDebugXDr", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
962                         cdDebugX.Both.Initialize("strCfgDispDebugXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
963                         cdDebugX.GBOnly.Initialize("strCfgDispDebugXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
964                         cdDebugY.DrOnly.Initialize("strCfgDispDebugYDr", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
965                         cdDebugY.Both.Initialize("strCfgDispDebugYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
966                         cdDebugY.GBOnly.Initialize("strCfgDispDebugYGB", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
967
968                         cdLegacyAVIX.DrOnly.Initialize("strCfgDispAVIXDr", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
969                         cdLegacyAVIX.Both.Initialize("strCfgDispAVIXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
970                         cdLegacyAVIX.GBOnly.Initialize("strCfgDispAVIXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
971                         cdLegacyAVIY.DrOnly.Initialize("strCfgDispAVIYDr", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
972                         cdLegacyAVIY.Both.Initialize("strCfgDispAVIYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
973                         cdLegacyAVIY.GBOnly.Initialize("strCfgDispAVIYGB", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
974
975                         cdForceScaledMovieX.DrOnly.Initialize("strCfgForceScaledAVIXDr", -SampleFramework.GameWindowSize.Width, 1 + SampleFramework.GameWindowSize.Width, crdStep);
976                         cdForceScaledMovieX.Both.Initialize("strCfgForceScaledAVIXBoth", -SampleFramework.GameWindowSize.Width, 1 + SampleFramework.GameWindowSize.Width, crdStep);
977                         cdForceScaledMovieX.GBOnly.Initialize("strCfgForceScaledAVIXGB", -SampleFramework.GameWindowSize.Width, 1 + SampleFramework.GameWindowSize.Width, crdStep);
978
979                         cdForceScaledMovieY.DrOnly.Initialize("strCfgForceScaledAVIYDr", -SampleFramework.GameWindowSize.Height, 1 + SampleFramework.GameWindowSize.Height, crdStep);
980                         cdForceScaledMovieY.Both.Initialize("strCfgForceScaledAVIYBoth", -SampleFramework.GameWindowSize.Height, 1 + SampleFramework.GameWindowSize.Height, crdStep);
981                         cdForceScaledMovieY.GBOnly.Initialize("strCfgForceScaledAVIYGB", -SampleFramework.GameWindowSize.Height, 1 + SampleFramework.GameWindowSize.Height, crdStep);
982
983                         cdForceScaledMovieW.DrOnly.Initialize("strCfgForceScaledAVIWDr", 1, 1 + SampleFramework.GameWindowSize.Width, crdStep);
984                         cdForceScaledMovieW.Both.Initialize("strCfgForceScaledAVIWBoth", 1, 1 + SampleFramework.GameWindowSize.Width, crdStep);
985                         cdForceScaledMovieW.GBOnly.Initialize("strCfgForceScaledAVIWGB", 1, 1 + SampleFramework.GameWindowSize.Width, crdStep);
986
987                         cdForceScaledMovieH.DrOnly.Initialize("strCfgForceScaledAVIHDr", 1, 1 + SampleFramework.GameWindowSize.Height, crdStep);
988                         cdForceScaledMovieH.Both.Initialize("strCfgForceScaledAVIHBoth", 1, 1 + SampleFramework.GameWindowSize.Height, crdStep);
989                         cdForceScaledMovieH.GBOnly.Initialize("strCfgForceScaledAVIHGB", 1, 1 + SampleFramework.GameWindowSize.Height, crdStep);
990
991                         //bForceFullMovieCentering.DrOnly.Initialize("strCfgForceFullMovieCenteringDr");
992                         //bForceFullMovieCentering.Both.Initialize("strCfgForceFullMovieCenteringBoth");
993                         //bForceFullMovieCentering.GBOnly.Initialize("strCfgForceFullMovieCenteringGB");
994
995                         cdComboX.Drums.Both.Initialize("strCfgDispDrComboXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
996                         cdComboX.Drums.DrOnly.Initialize("strCfgDispDrComboXDr", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
997                         cdComboX.Guitar.Both.Initialize("strCfgDispGtComboXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
998                         cdComboX.Guitar.GBOnly.Initialize("strCfgDispGtComboXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
999                         cdComboX.Bass.Both.Initialize("strCfgDispBsComboXBoth", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
1000                         cdComboX.Bass.GBOnly.Initialize("strCfgDispBsComboXGB", 0, 1 + SampleFramework.GameWindowSize.Width, crdStep);
1001
1002                         cdComboY.Drums.Both.Initialize("strCfgDispDrComboYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1003                         cdComboY.Drums.DrOnly.Initialize("strCfgDispDrComboYDr", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1004                         cdComboY.Guitar.Both.Initialize("strCfgDispGtComboYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1005                         cdComboY.Guitar.GBOnly.Initialize("strCfgDispGtComboYGB", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1006                         cdComboY.Bass.Both.Initialize("strCfgDispBsComboYBoth", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1007                         cdComboY.Bass.GBOnly.Initialize("strCfgDispBsComboYGB", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1008
1009                         cdJudgeLineY.Drums.Initialize("strCfgDispDrJudgeLine", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1010                         cdJudgeLineY.Guitar.Initialize("strCfgDispGtJudgeLine", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1011                         cdJudgeLineY.Bass.Initialize("strCfgDispBsJudgeLine", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1012
1013                         cdJudgeY.Drums.Initialize("strCfgDispDrJudge", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1014                         cdJudgeY.Guitar.Initialize("strCfgDispGtJudge", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1015                         cdJudgeY.Bass.Initialize("strCfgDispBsJudge", 0, 1 + SampleFramework.GameWindowSize.Height, crdStep);
1016
1017                         cdLaneOrder.LC.Initialize("strCfgDispLaneOrderLC", 0, 8);
1018                         cdLaneOrder.HH.Initialize("strCfgDispLaneOrderHH", 0, 8);
1019                         cdLaneOrder.SD.Initialize("strCfgDispLaneOrderSD", 0, 8);
1020                         cdLaneOrder.BD.Initialize("strCfgDispLaneOrderBD", 0, 8);
1021                         cdLaneOrder.HT.Initialize("strCfgDispLaneOrderHT", 0, 8);
1022                         cdLaneOrder.LT.Initialize("strCfgDispLaneOrderLT", 0, 8);
1023                         cdLaneOrder.FT.Initialize("strCfgDispLaneOrderFT", 0, 8);
1024                         cdLaneOrder.CY.Initialize("strCfgDispLaneOrderCY", 0, 8);
1025
1026                         cdLaneOrder.GtR.Initialize("strCfgDispLaneOrderGtR", 0, 4);
1027                         cdLaneOrder.GtG.Initialize("strCfgDispLaneOrderGtG", 0, 4);
1028                         cdLaneOrder.GtB.Initialize("strCfgDispLaneOrderGtB", 0, 4);
1029                         cdLaneOrder.GtW.Initialize("strCfgDispLaneOrderGtW", 0, 4);
1030
1031                         cdLaneOrder.BsR.Initialize("strCfgDispLaneOrderBsR", 0, 4);
1032                         cdLaneOrder.BsG.Initialize("strCfgDispLaneOrderBsG", 0, 4);
1033                         cdLaneOrder.BsB.Initialize("strCfgDispLaneOrderBsB", 0, 4);
1034                         cdLaneOrder.BsW.Initialize("strCfgDispLaneOrderBsW", 0, 4);
1035
1036                         SetEnterDelegates();
1037                 }
1038
1039                 public CConfigXml()
1040                 {
1041                         Deserializing(new StreamingContext());
1042                         DefaultDeserializer(new StreamingContext());
1043                 }
1044
1045                 public void SetEnterDelegates()
1046                 {
1047                         bFullScreen.OnEnterDelegate = () =>
1048                         {
1049                                 CDTXMania.Instance.b次のタイミングで全画面_ウィンドウ切り替えを行う = true;
1050                         };
1051
1052                         // Vsync
1053                         bVSyncWait.OnEnterDelegate = () =>
1054                         {
1055                                 CDTXMania.Instance.b次のタイミングで垂直帰線同期切り替えを行う = true;
1056                         };
1057
1058                         eBDGroup.OnEnterDelegate = () =>
1059                         {
1060                                 //BD group
1061                                 if (eBDGroup == EBDGroup.Group)
1062                                 {
1063                                         // #27029 2012.1.5 from: 変更前の状態をバックアップする。
1064                                         Backup1BDHHGroup.Value = eHHGroup;
1065                                         Backup1BDPriotiry.Value = eHitSoundPriorityHH;
1066
1067                                         // HH Group ... HH-0 → HH-2 / HH-1 → HH-3 / HH-2 → 変更なし / HH-3 → 変更なし
1068                                         if (eHHGroup == EHHGroup.Off)
1069                                         {
1070                                                 eHHGroup.Value = EHHGroup.LC_HH;
1071                                         }
1072                                         if (eHHGroup == EHHGroup.HO_HC)
1073                                         {
1074                                                 eHHGroup.Value = EHHGroup.Group;
1075                                         }
1076
1077                                         // HH Priority ... C>P → 変更なし / P>C → C>P
1078                                         if (eHitSoundPriorityHH == EHitSoundPriority.Pad)
1079                                         {
1080                                                 eHitSoundPriorityHH.Value = EHitSoundPriority.Chip;
1081                                         }
1082                                 }
1083                                 else
1084                                 {
1085                                         eHHGroup = Backup1BDHHGroup;
1086                                         eHitSoundPriorityHH = Backup1BDPriotiry;
1087                                 }
1088                         };
1089
1090                         bUseBoxDefSkin.OnEnterDelegate = () =>
1091                         {
1092                                 CSkin.bUseBoxDefSkin = bUseBoxDefSkin;
1093                         };
1094
1095                         bBufferedInput.OnEnterDelegate = () =>
1096                         {
1097                                 // #36433 2016.7.18 yyagi
1098                                 // BufferedInputのON/OFFを切り替えると、OFFからONへの切り替えの際に、Enterが再入されてしまい
1099                                 // OFFに戻ってしまう(つまり切り替えができない)問題への対策。
1100                                 // BufferedInputの切り替え時に、入力バッファをクリアする処理を追加する。
1101                                 while ( 
1102                                                 ( CDTXMania.Instance.Pad.bDecidePadIsPressedDGB() ||
1103                                                         ( CDTXMania.Instance.ConfigIni.bEnterがキー割り当てのどこにも使用されていない &&
1104                                                           CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.Return )
1105                                                         )
1106                                                 )
1107                                           )
1108                                 {
1109                                         Thread.Sleep( 50 );
1110                                         CDTXMania.Instance.Input管理.tポーリング(
1111                                                 CDTXMania.Instance.bApplicationActive, CDTXMania.Instance.ConfigIni.bBufferedInput );
1112                                 }
1113                         };
1114
1115                 }
1116
1117
1118                 public bool bConfigIniがないかDTXManiaのバージョンが異なる
1119                 {
1120                         get
1121                         {
1122                                 return (!bConfigIniが存在している || !CDTXMania.VERSION.Equals(strDTXManiaVersion));
1123                         }
1124                 }
1125
1126                 public bool bEnterがキー割り当てのどこにも使用されていない
1127                 {
1128                         get
1129                         {
1130                                 for (EPad j = EPad.Min; j < EPad.Max; j++)
1131                                 {
1132                                         for (int k = 0; k < AssignableCodes; k++)
1133                                         {
1134                                                 if ((KeyAssign[j][k].入力デバイス == EInputDevice.Keyboard) &&
1135                                                                 (KeyAssign[j][k].コード == (int)SlimDXKey.Return))
1136                                                 {
1137                                                         return false;
1138                                                 }
1139                                         }
1140                                 }
1141                                 return true;
1142                         }
1143                 }
1144
1145                 public bool bウィンドウモード
1146                 {
1147                         get
1148                         {
1149                                 return !this.bFullScreen;
1150                         }
1151                         set
1152                         {
1153                                 this.bFullScreen.Value = !value;
1154                         }
1155                 }
1156
1157                 public bool bGuitar有効
1158                 {
1159                         get
1160                         {
1161                                 return eActiveInst == EActiveInstrument.GBOnly || eActiveInst == EActiveInstrument.Both;
1162                         }
1163                 }
1164
1165                 public bool bDrums有効
1166                 {
1167                         get
1168                         {
1169                                 return eActiveInst == EActiveInstrument.DrOnly || eActiveInst == EActiveInstrument.Both;
1170                         }
1171                 }
1172
1173                 public bool b楽器有効(EPart inst)
1174                 {
1175                         if (inst == EPart.Drums)
1176                         {
1177                                 return bDrums有効;
1178                         }
1179                         else if (inst == EPart.Guitar || inst == EPart.Bass)
1180                         {
1181                                 return bGuitar有効;
1182                         }
1183                         return false;
1184                 }
1185
1186                 public bool bIsAutoPlay(EPart inst)
1187                 {
1188                         bool ret = false;
1189                         if (inst == EPart.Drums)
1190                         {
1191                                 ret = bAutoPlay.IsAllTrue(EPart.Drums);
1192                         }
1193                         else if (inst == EPart.Guitar)
1194                         {
1195                                 ret = bAutoPlay.IsAllTrue(EPart.Guitar);
1196                         }
1197                         else if (inst == EPart.Bass)
1198                         {
1199                                 ret = bAutoPlay.IsAllTrue(EPart.Bass);
1200                         }
1201                         return ret;
1202                 }
1203
1204                 public bool b演奏情報を表示する
1205                 {
1206                         get
1207                         {
1208                                 return this.bDebugInfo;
1209                         }
1210                         set
1211                         {
1212                                 this.bDebugInfo.Value = value;
1213                         }
1214                 }
1215
1216                 // #24063 2011.1.16 yyagi ギターとベースの切り替え
1217                 public bool bIsSwappedGuitarBass
1218                 {
1219                         get;
1220                         set;
1221                 }
1222
1223                 // #24415 2011.2.21 yyagi FLIP中にalt-f4終了で、AUTOフラグがswapした状態でconfig.iniが出力されてしまうことを避けるためのフラグ
1224                 public bool bIsSwappedGuitarBass_AutoFlagsAreSwapped
1225                 {
1226                         get;
1227                         set;
1228                 }
1229
1230                 // #35417 2015.8.18 yyagi FLIP中にalt-f4終了で、演奏設定がswapした状態でconfig.iniが出力されてしまうことを避けるためのフラグ
1231                 public bool bIsSwappedGuitarBass_PlaySettingsAreSwapped
1232                 {
1233                         get;
1234                         set;
1235                 }
1236
1237                 public void SwapGuitarBassInfos_AutoFlags()
1238                 {
1239                         Func<EPad, EPad, bool> AutoSwapper = (x, y) =>
1240                         {
1241                                 bool t = bAutoPlay[y];
1242                                 bAutoPlay[y].Value = bAutoPlay[x];
1243                                 bAutoPlay[x].Value = t;
1244                                 return true;
1245                         };
1246
1247                         AutoSwapper(EPad.GtR, EPad.BsR);
1248                         AutoSwapper(EPad.GtG, EPad.BsG);
1249                         AutoSwapper(EPad.GtB, EPad.BsB);
1250                         AutoSwapper(EPad.GtWail, EPad.BsWail);
1251                         AutoSwapper(EPad.GtPick, EPad.BsPick);
1252
1253                         bIsSwappedGuitarBass_AutoFlagsAreSwapped = !bIsSwappedGuitarBass_AutoFlagsAreSwapped;
1254                 }
1255
1256                 public void t指定した入力が既にアサイン済みである場合はそれを全削除する(EInputDevice DeviceType, int nID, int nCode)
1257                 {
1258                         for (EPad j = EPad.Min; j < EPad.Max; j++)
1259                         {
1260                                 for (int k = 0; k < AssignableCodes; k++)
1261                                 {
1262                                         if (((KeyAssign[j][k].入力デバイス == DeviceType) &&
1263                                                         (KeyAssign[j][k].ID == nID)) &&
1264                                                         (KeyAssign[j][k].コード == nCode))
1265                                         {
1266                                                 for (int m = k; m < AssignableCodes - 1; m++)
1267                                                 {
1268                                                         KeyAssign[j][m].CopyFrom(KeyAssign[j][m + 1].Value);
1269                                                 }
1270                                                 KeyAssign[j][AssignableCodes - 1].Reset();
1271                                                 k--;
1272                                         }
1273                                 }
1274                         }
1275                 }
1276
1277                 private void ClearKeyAssign()
1278                 {
1279                         KeyAssign = new STPadValue<COptionKeyAssign[]>();
1280                         for (EPad j = EPad.Min; j < EPad.Max; ++j)
1281                         {
1282                                 KeyAssign[j] = new COptionKeyAssign[AssignableCodes];
1283                                 for (int k = 0; k < AssignableCodes; ++k)
1284                                 {
1285                                         KeyAssign[j][k] = new COptionKeyAssign();
1286                                 }
1287                         }
1288                 }
1289                 private void SetDefaultKeyAssign()
1290                 {
1291                         if (KeyAssign == null)
1292                         {
1293                                 ClearKeyAssign();
1294                         }
1295
1296                         SetKeyAssignFromString( strDefaultKeyAssign );
1297                 }
1298                 private void SetKeyAssignFromString( string strParam )
1299                 {
1300                         if (strParam == null)
1301                         {
1302                                 return;
1303                         }
1304                         string[] paramLines = strParam.Split( new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries );
1305                         if (paramLines.Length <= 1)
1306                         {
1307                                 Debug.WriteLine( "デフォルトのキーアサインを設定できませんでした1: " + strParam );
1308                                 return;
1309                         }
1310
1311                         Dictionary<string, EPad> dicStrEPad = new Dictionary<string, EPad>()
1312                         {
1313                                 { "HH", EPad.HH },
1314                                 { "SD", EPad.SD },
1315                                 { "BD", EPad.BD },
1316                                 { "HT", EPad.HT },
1317                                 { "LT", EPad.LT },
1318                                 { "FT", EPad.FT },
1319                                 { "CY", EPad.CY },
1320                                 { "HHO", EPad.HHO },
1321                                 { "RD", EPad.RD },
1322                                 { "LC", EPad.LC },
1323                                 { "HP", EPad.HP },
1324                                 { "GtR", EPad.GtR },
1325                                 { "GtG", EPad.GtG },
1326                                 { "GtB", EPad.GtB },
1327                                 { "GtPick", EPad.GtPick },
1328                                 { "GtWail", EPad.GtWail },
1329                                 { "GtDecide", EPad.GtDecide },
1330                                 { "GtCancel", EPad.GtCancel },
1331                                 { "BsR", EPad.BsR },
1332                                 { "BsG", EPad.BsG },
1333                                 { "BsB", EPad.BsB },
1334                                 { "BsPick", EPad.BsPick },
1335                                 { "BsWail", EPad.BsWail },
1336                                 { "BsDecide", EPad.BsDecide },
1337                                 { "BsCancel", EPad.BsCancel },
1338                                 { "Capture", EPad.Capture}
1339                         };
1340
1341                         foreach ( string param in paramLines )
1342                         {
1343                                 string[] tmp = param.Split( '=' );
1344                                 if ( tmp.Length != 2 )
1345                                 {
1346                                         Debug.WriteLine( "デフォルトのキーアサインを設定できませんでした2: " + param );
1347                                         return;
1348                                 }
1349
1350                                 string strPad = tmp[ 0 ];
1351                                 string[] keys = tmp[ 1 ].Split( ',' );
1352                                 if ( keys.Length <= 0 )
1353                                 {
1354                                         Debug.WriteLine( "デフォルトのキーアサインを設定できませんでした3: " + tmp[ 1 ] );
1355                                         return;
1356                                 }
1357                                 EPad e;
1358                                 bool b = dicStrEPad.TryGetValue( strPad, out e );
1359                                 if ( b == false )
1360                                 {
1361                                         Debug.WriteLine( "デフォルトキーアサインの文字列に誤りがあります1: " + strPad );
1362                                 }
1363                                 int count = 0;
1364                                 foreach ( string key in keys )
1365                                 {
1366                                         char cInputDevice = key[ 0 ];
1367                                         EInputDevice eid;
1368                                         switch (cInputDevice)
1369                                         {
1370                                                 case 'K': eid = EInputDevice.Keyboard; break;
1371                                                 case 'M': eid = EInputDevice.MIDIIn; break;
1372                                                 case 'J': eid = EInputDevice.JoyPad; break;
1373                                                 case 'N': eid = EInputDevice.Mouse; break;
1374                                                 default: eid = EInputDevice.Unknown; break;
1375                                         }
1376                                         int nID = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf( key[ 1 ] );   // #24166 2011.1.15 yyagi: to support ID > 10, change 2nd character from Decimal to 36-numeral system. (e.g. J1023 -> JA23)
1377                                         int nCode = Convert.ToInt32( key.Substring( 2 ) );
1378
1379                                         KeyAssign[ e ][ count ].Value.InputDevice = eid;
1380                                         KeyAssign[ e ][ count ].Value.ID = nID;
1381                                         KeyAssign[ e ][ count ].Value.Code = nCode;
1382                                         count++;
1383
1384                                         // Debug.WriteLine( eid.ToString() + nID.ToString() + nCode.ToString() );
1385                                 }
1386                         }
1387                 }
1388
1389                 const string strDefaultKeyAssign = @"
1390 HH=K035,M042,M093
1391 SD=K033,M025,M026,M027,M028,M029,M031,M032,M034,M037,M038,M040,M0113
1392 BD=K012,K0126,M033,M035,M036,M0112
1393 HT=K031,M048,M050
1394 LT=K011,M047
1395 FT=K023,M041,M043,M045
1396 CY=K022,M049,M052,M055,M057,M091
1397 HHO=K010,M046,M092
1398 RD=K020,M051,M053,M059,M089
1399 LC=K026
1400 HP=M044
1401
1402 GtR=K055
1403 GtG=K056,J012
1404 GtB=K057
1405 GtPick=K0115,K046
1406 GtWail=K0116
1407 GtDecide=K060
1408 GtCancel=K061
1409
1410 BsR=K090
1411 BsG=K091
1412 BsB=K092
1413 BsPick=K0103,K0100
1414 BsWail=K089
1415 BsDecide=K096
1416 BsCancel=K097
1417
1418 Capture=K065
1419 ";
1420                 private string GetRelativePath( string strBasePath, string strTargetPath )
1421                 {
1422                         string strRelativePath = strTargetPath;
1423                         try
1424                         {
1425                                 Uri uri = new Uri( strBasePath );
1426                                 strRelativePath = Uri.UnescapeDataString( uri.MakeRelativeUri( new Uri( strTargetPath ) ).ToString() ).Replace( '/', '\\' );
1427                         }
1428                         catch ( UriFormatException )
1429                         {
1430                         }
1431
1432                         return strRelativePath;
1433                 }
1434         }
1435 }