public static システム設定 読み込む() { using (Log.Block(FDKUtilities.現在のメソッド名)) { // (1) 読み込み or 新規作成 var config = (システム設定)null; try { var yaml = File.ReadAllText(システム設定ファイルパス.数なしパス); var deserializer = new YamlDotNet.Serialization.Deserializer(); config = deserializer.Deserialize <システム設定>(yaml); switch (config.Version) { case 1: Log.ERROR($"バージョン 2 を新規に作成して保存します。[{システム設定ファイルパス.変数付きパス}]"); config = new システム設定(); config.保存する(); break; case 2: break; // 現行バージョン default: Log.ERROR($"未対応のバージョンです。新規に作成して保存します。[{システム設定ファイルパス.変数付きパス}]"); config = new システム設定(); config.保存する(); break; } } catch (FileNotFoundException) { Log.Info($"ファイルが存在しないため、新規に作成します。[{システム設定ファイルパス.変数付きパス}]"); config = new システム設定(); config.保存する(); } catch { Log.ERROR($"ファイルの内容に誤りがあります。新規に作成して保存します。[{システム設定ファイルパス.変数付きパス}]"); config = new システム設定(); config.保存する(); } // (2) 読み込み後の処理 // パスの指定がなければ、とりあえず exe のあるフォルダを検索対象にする。 if (0 == config.曲検索フォルダ.Count) { config.曲検索フォルダ.Add(@"$(Exe)"); } return(config); } }
// 生成と終了 /// <summary> /// コンストラクタ。 /// </summary> /// <param name="keyboard">キーボードデバイス。キーボードはフォームに依存するため、外部から共有する。</param> /// <param name="最大入力履歴数">1つのシーケンスの最大入力サイズ。</param> public 入力管理(システム設定 systemConfig, キーボードデバイス keyboard, int 最大入力履歴数 = 32) { using (Log.Block(FDKUtilities.現在のメソッド名)) { this._SystemConfig = systemConfig; this.キーボード = keyboard; this.MIDI入力 = new MIDI入力デバイス(); Trace.Assert(0 < 最大入力履歴数); this._最大入力履歴数 = 最大入力履歴数; this.ポーリング結果.Clear(); this._入力履歴 = new List <ドラム入力イベント>(this._最大入力履歴数); // MIDI入力デバイスの可変IDへの対応を行う。 if (0 < this.MIDI入力.DeviceName.Count) { var デバイスリスト = new Dictionary <int, string>(); // <デバイスID, デバイス名> #region " (1) 先に列挙された実際のデバイスに合わせて、デバイスリスト(配列番号がデバイス番号)を作成する。" //---------------- for (int i = 0; i < this.MIDI入力.DeviceName.Count; i++) { デバイスリスト.Add(i, this.MIDI入力.DeviceName[i]); } //---------------- #endregion #region " (2) キーバインディングのデバイスリストとマージして、新しいデバイスリストを作成する。" //---------------- foreach (var kvp in this._SystemConfig.MIDIデバイス番号toデバイス名) { var キーバインディング側のデバイス名 = kvp.Value; if (デバイスリスト.ContainsValue(キーバインディング側のデバイス名)) { // (A) 今回も存在しているデバイスなら、何もしない。 } else { // (B) 今回は存在していないデバイスなら、末尾(=未使用ID)に登録する。 デバイスリスト.Add(デバイスリスト.Count, キーバインディング側のデバイス名); } } //---------------- #endregion #region " (3) キーバインディングのデバイスから新しいデバイスへ、キーのIDを付け直す。" //---------------- var 中間バッファ = new Dictionary <システム設定.IdKey, ドラム入力種別>(); foreach (var kvp in this._SystemConfig.MIDItoドラム) { var キーのデバイスID = kvp.Key.deviceId; // キーバインディングのデバイス番号 から、デバイスリストのデバイス番号 へ付け替える。 if (this._SystemConfig.MIDIデバイス番号toデバイス名.TryGetValue(キーのデバイスID, out string キーのデバイス名)) { キーのデバイスID = デバイスリスト.First((kvp2) => (kvp2.Value == キーのデバイス名)).Key; // マージしたので、必ず存在する。 } 中間バッファ.Add(new システム設定.IdKey(キーのデバイスID, kvp.Key.key), kvp.Value); // デバイスID以外は変更なし。 } this._SystemConfig.MIDItoドラム.Clear(); for (int i = 0; i < 中間バッファ.Count; i++) { var kvp = 中間バッファ.ElementAt(i); this._SystemConfig.MIDItoドラム.Add(new システム設定.IdKey(kvp.Key.deviceId, kvp.Key.key), kvp.Value); } //---------------- #endregion #region " (4) 新しいデバイスリストをキーバインディングに格納して、保存する。" //---------------- this._SystemConfig.MIDIデバイス番号toデバイス名.Clear(); for (int i = 0; i < デバイスリスト.Count; i++) { this._SystemConfig.MIDIデバイス番号toデバイス名.Add(i, デバイスリスト[i]); } this._SystemConfig.保存する(); //---------------- #endregion } else { // 列挙されたMIDI入力デバイスがまったくないなら、キーバインディングは何もいじらない。 } } }