/// <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_; }