Exemple #1
0
        /// <summary>
        /// vsqxファイルを読み込み,新しいシーケンスオブジェクトを生成する
        /// </summary>
        /// <param name="filePath">ファイルパス</param>
        /// <exception cref="System.Exception">読み込みに失敗した時スローされる</exception>
        /// <returns>生成したシーケンスオブジェクト</returns>
        public static VsqFile readFromVsqx(string filePath)
        {
            if (filePath == null)
            {
                throw new ArgumentNullException("filePath");
            }

            if (false == File.Exists(filePath))
            {
                throw new Exception("file not found");
            }

            var xml = new XmlDocument();

            xml.Load(filePath);

            // 音源テーブルを解釈
            var voiceTable = getVoiceTable(xml);

            // マスタートラックを解釈
            XmlElement masterTrack = xml.DocumentElement["masterTrack"];
            int        preMeasure  = int.Parse(masterTrack["preMeasure"].InnerText);
            VsqFile    result      = new VsqFile("", preMeasure, 4, 4, 500000);

            // テンポ変更を読み取る
            result.TempoTable.Clear();
            foreach (XmlNode node in masterTrack.GetElementsByTagName("tempo"))
            {
                int             posTick    = int.Parse(node["posTick"].InnerText);
                int             bpm        = int.Parse(node["bpm"].InnerText);
                int             tempo      = (int)(6000000000L / bpm);
                TempoTableEntry tempoEntry = new TempoTableEntry(posTick, tempo, 0.0);
                result.TempoTable.Add(tempoEntry);
            }
            result.TempoTable.updateTempoInfo();
            // 拍子変更を読み取る
            result.TimesigTable.Clear();
            foreach (XmlNode node in masterTrack.GetElementsByTagName("timeSig"))
            {
                int posMes      = int.Parse(node["posMes"].InnerText);
                int numerator   = int.Parse(node["nume"].InnerText);
                int denominator = int.Parse(node["denomi"].InnerText);
                TimeSigTableEntry timesigEntry = new TimeSigTableEntry(0, numerator, denominator, posMes);
                result.TimesigTable.Add(timesigEntry);
            }
            result.TimesigTable.updateTimesigInfo();

            // マスター以外のトラックを解釈
            foreach (XmlNode node in xml.DocumentElement.GetElementsByTagName("vsTrack"))
            {
                int      trackIndex = int.Parse(node["vsTrackNo"].InnerText) + 1;
                VsqTrack track      = null;
                if (result.Track.Count <= trackIndex)
                {
                    int amount = trackIndex + 1 - result.Track.Count;
                    for (int i = 0; i < amount; i++)
                    {
                        result.Track.Add(new VsqTrack("", ""));
                    }
                }
                track = result.Track[trackIndex];
                track.setName(node["trackName"].InnerText);

                foreach (XmlNode child in node.ChildNodes)
                {
                    if (child.Name == "musicalPart")
                    {
                        parseMusicalPart(voiceTable, track, child);
                    }
                }
            }

            // MasterMixerをパース
            var mixer      = xml.DocumentElement["mixer"];
            var masterUnit = mixer["masterUnit"];

            result.Mixer.MasterFeder  = int.Parse(masterUnit["vol"].InnerText);
            result.Mixer.MasterMute   = 0;
            result.Mixer.MasterPanpot = 0;

            // SlaveMixerをパース
            result.Mixer.Slave.Clear();
            for (int i = 1; i < result.Track.Count; i++)
            {
                result.Mixer.Slave.Add(null);
            }
            foreach (XmlNode vsUnit in mixer.GetElementsByTagName("vsUnit"))
            {
                int vsTrackNo = int.Parse(vsUnit["vsTrackNo"].InnerText);
                int mute      = int.Parse(vsUnit["mute"].InnerText);
                int solo      = int.Parse(vsUnit["solo"].InnerText);
                int pan       = int.Parse(vsUnit["pan"].InnerText);
                int vol       = int.Parse(vsUnit["vol"].InnerText);
                var slave     = new VsqMixerEntry(vol, pan, mute, solo);
                result.Mixer.Slave[vsTrackNo] = slave;
            }

            return(result);
        }
 public SelectedTimesigEntry(TimeSigTableEntry original_, TimeSigTableEntry editing_)
 {
     original = original_;
     editing  = editing_;
 }