Пример #1
0
        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)))));
            }
        }
Пример #2
0
        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)))));
            }
        }