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