OSDN Git Service

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