public static bool TryCreate(int part, string name, string type, string value, out Handle handle) { HandleType handleType; int data1; float data2; handle = null; if (!Enum.TryParse(name, true, out handleType)) { return(false); } data1 = (string.IsNullOrWhiteSpace(type)) ? 0 : HandleCreator.ParseOperators(handleType, type); if (string.IsNullOrWhiteSpace(value)) { data2 = 0.0f; } else if (!float.TryParse(value, out data2)) { return(false); } handle = new Handle(part, handleType, data1, data2); return(true); }
private static IEnumerable <DrumPreset> DrumLoad(XDocument document) { var preset = document.Elements("ux").Select(e => e.Elements("preset")).Select(e => e.Elements("drum")).FirstOrDefault(); if (preset == null) { throw new ArgumentNullException("preset"); } var notes = preset.Elements("note"); foreach (var note in notes) { var number = note.GetAttribute(PresetReader.xnumber); var note_number = note.GetAttribute(PresetReader.xnote); int num = 0, note_num = 0; if (!int.TryParse(number, out num)) { throw new InvalidDataException("数値を読み取れません。"); } if (!int.TryParse(note_number, out note_num)) { throw new InvalidDataException("ノート値を読み取れません。"); } yield return(new DrumPreset(num, note_num, note.Elements() .Where(h => h.Name.LocalName.ToLower() != "final") .Select(h => HandleCreator.Create(h.Name.LocalName.ToLower(), h.GetAttribute(PresetReader.xtype), h.GetAttribute(PresetReader.xvalue))))); } }
private static int ParseOperators(HandleType type, string operators) { int result = 0; int tmp; foreach (var op in operators.Split(',')) { result |= (int.TryParse(op, out tmp)) ? tmp : HandleCreator.ParseOperator(type, op); } return(result); }
private static IEnumerable <ProgramPreset> Load(XDocument document) { var preset = document.Elements("ux").Select(e => e.Elements("preset")).FirstOrDefault(); if (preset == null) { throw new InvalidDataException("XML を読み取れません。プリセットタグが見つかりません。"); } var programs = preset.Elements("program"); foreach (var program in programs) { var number = program.GetAttribute(PresetReader.xnumber); var str_msb = program.GetAttribute(PresetReader.xmsb); var str_lsb = program.GetAttribute(PresetReader.xlsb); int num = 0, msb = 0, lsb = 0; if (!int.TryParse(number, out num)) { throw new InvalidDataException("認識できないパートナンバーが検出されました。"); } if (!string.IsNullOrWhiteSpace(str_msb) && !int.TryParse(str_msb, out msb)) { throw new InvalidDataException("認識できない MSB 値が検出されました。"); } if (!string.IsNullOrWhiteSpace(str_lsb) && !int.TryParse(str_lsb, out lsb)) { throw new InvalidDataException("認識できない LSB 値が検出されました。"); } if (program.Elements(PresetReader.xfinal).Count() > 1) { throw new InvalidDataException("複数の 'final' のアイテムが検出されました。'final' は最大で 1 つのアイテムのみ許可されます。"); } yield return(new ProgramPreset(num, msb, lsb, program.Elements() .Where(h => h.Name.LocalName.ToLower() != "final") .Select(h => HandleCreator.Create(h.Name.LocalName.ToLower(), h.GetAttribute(PresetReader.xtype), h.GetAttribute(PresetReader.xvalue))), program.Elements(PresetReader.xfinal) .SelectMany(f => f.Elements()) .Select(h => HandleCreator.Create(h.Name.LocalName.ToLower(), h.GetAttribute(PresetReader.xtype), h.GetAttribute(PresetReader.xvalue))))); } }
/// <summary> /// ハンドル名、タイプ、値から新しいハンドルを生成します。 /// </summary> /// <param name="name">ハンドル名。</param> /// <param name="type">タイプ。</param> /// <param name="value">値。</param> /// <returns></returns> public static Handle Create(string name, string type, string value) { HandleType handleType; int data1; float data2; if (!Enum.TryParse(name, true, out handleType)) { throw new ArgumentException("ハンドル名の変換に失敗しました。", "name"); } data1 = (string.IsNullOrWhiteSpace(type)) ? 0 : HandleCreator.ParseOperators(handleType, type); if (string.IsNullOrWhiteSpace(value)) { data2 = 0.0f; } else if (!float.TryParse(value, out data2)) { throw new ArgumentException("データ値の変換に失敗しました。", "value"); } return(new Handle(0, handleType, data1, data2)); }
/// <summary> /// 指定された文字列を解析し、複数のハンドルを出力します。 /// </summary> /// <param name="code">解析される文字列。</param> /// <param name="handles">ハンドルオブジェクトの列挙子。</param> /// <returns>解析に成功した場合は true、失敗した場合は false。</returns> public static bool TryParse(string code, out IEnumerable <Handle> handles) { handles = null; var handle_pool = new List <Handle>(); int part = 0; foreach (var line in code.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)) { var tokens = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); if (tokens.Length < 2 && tokens.Length > 4) { return(false); } if (part == 0 && tokens[0] == ".") { return(false); } else if (tokens[0] != "." && !int.TryParse(tokens[0], out part)) { return(false); } Handle h; switch (tokens.Length) { case 2: if (!HandleCreator.TryCreate(part, tokens[1], "", "", out h)) { return(false); } break; case 3: if (!HandleCreator.TryCreate(part, tokens[1], tokens[2], "", out h)) { return(false); } break; case 4: if (!HandleCreator.TryCreate(part, tokens[1], tokens[2], tokens[3], out h)) { return(false); } break; default: return(false); } handle_pool.Add(h); } handles = handle_pool.ToArray(); return(true); }