static void Main(string[] vsqxFiles) { string[] baseName = { }; string saveFileName = ""; const int VS_TRACK_MAX = 16; List <TrackData> trackArray = new List <TrackData>(); List <NoteData>[] noteArray = new List <NoteData> [VS_TRACK_MAX]; List <BpmData> bpmArray = new List <BpmData>(); List <BeatData> beatArray = new List <BeatData>(); BaseTick deff = new BaseTick(); ArrayList lyricArray = new ArrayList(); ArrayList posTickArray = new ArrayList(); ArrayList durationArray = new ArrayList(); string vsqxXsd = @"C:\Program Files (x86)\VOCALOID3\vsq3.xsd"; string ust2ccs = System.IO.Directory.GetCurrentDirectory() + @"\ust2ccs.exe"; if (System.Environment.Is64BitOperatingSystem) { vsqxXsd = @"C:\Program Files (x86)\VOCALOID3\vsq3.xsd"; Console.WriteLine("OS : 64bit"); // フォルダ (ディレクトリ) が存在しているかどうか確認する if (System.IO.File.Exists(vsqxXsd)) { Console.WriteLine("VOCALOID3"); } else { vsqxXsd = @"C:\Program Files (x86)\VOCALOID3TINY\vsq3.xsd"; Console.WriteLine("VOCALOID3 TINY"); } } else { vsqxXsd = @"C:\Program Files\VOCALOID3\vsq3.xsd"; Console.WriteLine("OS : 32bit"); // フォルダ (ディレクトリ) が存在しているかどうか確認する if (System.IO.File.Exists(vsqxXsd)) { Console.WriteLine("VOCALOID3"); } else { vsqxXsd = @"C:\Program Files\VOCALOID3TINY\vsq3.xsd"; Console.WriteLine("VOCALOID3 TINY"); } } // vsqxのスキーマファイルの確認 string[] xsdBasename = vsqxXsd.Split('\\'); Console.Write("Check vsqx xsd file -> "); if (!System.IO.File.Exists(vsqxXsd)) { Console.WriteLine("NO FILES"); Console.WriteLine(xsdBasename[xsdBasename.Length - 1] + " Not Found."); Console.WriteLine("Push Enter key."); Console.ReadLine(); /* * // とりあえず今はなしでもOK * return; */ } Console.WriteLine("OK"); Console.Write("Check ust2ccs -> "); if (System.IO.File.Exists(ust2ccs)) { Console.WriteLine("OK\n"); } else { Console.WriteLine("Not Found.\n"); } /* * if (vsqxFiles.Length <= 0) * { * OpenFileDialog openVsqxFileDialog = new OpenFileDialog(); * // ダイアログのタイトルを設定する * openVsqxFileDialog.Title = "ファイルを開く"; * // 初期表示するディレクトリを設定する * openVsqxFileDialog.InitialDirectory = @"C:\"; * // 初期表示するファイル名を設定する * openVsqxFileDialog.FileName = ""; * // ファイルのフィルタを設定する * openVsqxFileDialog.Filter = "VOCALOID3 Sequence|*.vsqx|すべてのファイル|*.*"; * // ファイルの種類 の初期設定を 2 番目に設定する (初期値 1) * openVsqxFileDialog.FilterIndex = 1; * // ダイアログボックスを閉じる前に現在のディレクトリを復元する (初期値 false) * // openVsqxFileDialog.RestoreDirectory = true; * // 複数のファイルを選択可能にする (初期値 false) * openVsqxFileDialog.Multiselect = true; * // [ヘルプ] ボタンを表示する (初期値 false) * openVsqxFileDialog.ShowHelp = false; * // [読み取り専用] チェックボックスを表示する (初期値 false) * // openVsqxFileDialog.ShowReadOnly = true; * // [読み取り専用] チェックボックスをオンにする (初期値 false) * // openVsqxFileDialog.ReadOnlyChecked = true; * // 存在しないファイルを指定した場合は警告を表示する (初期値 true) * //openVsqxFileDialog.CheckFileExists = true; * // 存在しないパスを指定した場合は警告を表示する (初期値 true) * //openVsqxFileDialog.CheckPathExists = true; * // 拡張子を指定しない場合は自動的に拡張子を付加する (初期値 true) * openVsqxFileDialog.AddExtension = true; * // 有効な Win32 ファイル名だけを受け入れるようにする (初期値 true) * //openVsqxFileDialog.ValidateNames = true; * // ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する * * if (openVsqxFileDialog.ShowDialog() == DialogResult.OK) * { * Console.WriteLine(openVsqxFileDialog.FileName); * vsqxFiles = openVsqxFileDialog.FileNames; * } * * // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) * openVsqxFileDialog.Dispose(); * } */ foreach (String currentFileName in vsqxFiles) { baseName = currentFileName.Split('.'); if (baseName[baseName.Length - 1] != "vsqx") { Console.WriteLine(currentFileName + "\nNot vsqx.\nSkip\n"); continue; } /* * // vsqxのみ処理 * if (baseName[baseName.Length - 1] == "ust" && System.IO.File.Exists(ust2ccs)) * { * Console.Write(currentFileName + "\nSend to ust2ccs."); * // TODO:センド処理 * System.Diagnostics.Process pro = new System.Diagnostics.Process(); * * pro.StartInfo.FileName = "cmd.exe"; // コマンド名 * pro.StartInfo.Arguments = "/c " + ust2ccs + currentFileName; // 引数 * pro.StartInfo.CreateNoWindow = true; // DOSプロンプトの黒い画面を非表示 * pro.StartInfo.UseShellExecute = false; // プロセスを新しいウィンドウで起動するか否か * pro.StartInfo.RedirectStandardOutput = true; // 標準出力をリダイレクトして取得したい * * pro.Start(); * * //プロセス終了まで待機する * //WaitForExitはReadToEndの後である必要がある * //(親プロセス、子プロセスでブロック防止のため) * pro.WaitForExit(); * pro.Close(); * * Console.WriteLine("\n->\n" + baseName[0] + ".ccs\n"); * continue; * } * else if (baseName[baseName.Length - 1] != "vsqx") * { * Console.WriteLine(currentFileName + "\nNot vsqx.\nSkip\n"); * continue; * } * * // TODO: vsqx判定処理 * if (baseName[baseName.Length - 1] != "vsqx") * { * //XMLSchemaCheck(vsqxXsd, currentFileName); * Console.WriteLine(currentFileName + "\nBroken vsqx.\nSkip\n"); * continue; * } */ // すでにファイルがある場合の処理 /* * int i = 0; * while (!System.IO.File.Exists(baseName[0] + ".ccs")) * { * baseName[0] = baseName[0] + " (" + i + ")"; * i++; * } */ saveFileName = baseName[0] + ".ccs"; XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; // インデントあり settings.Encoding = Encoding.UTF8; XmlWriter writer = null; XmlReader reader = null; NoteData note = new NoteData(); try { reader = XmlReader.Create(new StreamReader(currentFileName)); while (reader.Read()) // ノードを一つずつ読む { if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "vsUnit") { while (reader.Read())//vsUnit { if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "vsTrackNo") { // トラック作成 trackArray.Add(new TrackData()); trackArray[trackArray.Count - 1].SetTrackNum(reader.ReadElementString()); } if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "mute") { trackArray[trackArray.Count - 1].SetMute(int.Parse(reader.ReadElementString())); } if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "solo") { trackArray[trackArray.Count - 1].SetSolo(int.Parse(reader.ReadElementString())); break; } } }// トラック if end // 拍子取得 if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.LocalName == "timeSig") { while (reader.Read())//tempo { if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "posMes") { beatArray.Add(new BeatData()); beatArray[beatArray.Count - 1].SetPosMes(int.Parse(reader.ReadElementString())); } if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "nume") { beatArray[beatArray.Count - 1].SetNume(reader.ReadElementString()); } if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "denomi") { beatArray[beatArray.Count - 1].SetDenomi(reader.ReadElementString()); break; } } //while timeSig end } //if timeSig end // テンポ取得 if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.LocalName == "tempo") { while (reader.Read())//tempo { if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.LocalName == "posTick") { bpmArray.Add(new BpmData()); bpmArray[bpmArray.Count - 1].SetClock(reader.ReadElementString()); } if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.LocalName == "bpm") { bpmArray[bpmArray.Count - 1].SetTempo(reader.ReadElementString()); // テンポが8000/12000といった風に長さが違う場合の処理,V3上でのテンポは20~300なのでxsd判定すればOK if (bpmArray[bpmArray.Count - 1].GetTempo().Length > 4) { bpmArray[bpmArray.Count - 1].SetIntegerPoint(bpmArray[bpmArray.Count - 1].GetTempo().Substring(0, 3)); bpmArray[bpmArray.Count - 1].SetDecimalPoint(bpmArray[bpmArray.Count - 1].GetTempo().Substring(3)); } else { bpmArray[bpmArray.Count - 1].SetIntegerPoint(bpmArray[bpmArray.Count - 1].GetTempo().Substring(0, 2)); bpmArray[bpmArray.Count - 1].SetDecimalPoint(bpmArray[bpmArray.Count - 1].GetTempo().Substring(2)); } break; } } //while temp end } //if temp end // トラックに含まれるノート作成 if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.LocalName == "vsTrack") { int TrackNo = 0; while (reader.Read())//vsTrack { if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "vsTrackNo") { noteArray[TrackNo] = new List <NoteData>(); trackArray[TrackNo].SetTrackNum(reader.ReadElementString()); } if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "trackName") { trackArray[TrackNo].SetTrackName(reader.ReadElementString()); } if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "musicalPart") { while (reader.Read()) { if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "note") { while (reader.Read()) { // 開始地点 if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "posTick") { // ノートごとのクラスの作成 noteArray[TrackNo].Add(new NoteData()); noteArray[TrackNo][noteArray[TrackNo].Count - 1].SetBeginTick(reader.ReadElementString()); } // 開始地点 if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "playTime") { // ノートごとのクラスの作成 noteArray[TrackNo][noteArray[TrackNo].Count - 1].SetPlayTime(reader.ReadElementString()); } // デュレーション if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "durTick") { noteArray[TrackNo][noteArray[TrackNo].Count - 1].SetDuration(reader.ReadElementString()); } // ノートナンバー if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "noteNum") { noteArray[TrackNo][noteArray[TrackNo].Count - 1].SetNoteNum(int.Parse(reader.ReadElementString())); } // 歌詞 if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "lyric") { noteArray[TrackNo][noteArray[TrackNo].Count - 1].SetNoteLyric(reader.ReadElementString()); break; } } }//if note end if (reader.NodeType == System.Xml.XmlNodeType.EndElement && reader.Name == "musicalPart") { trackArray[TrackNo].SetNote(noteArray[TrackNo]); TrackNo++; break; } } //while musicalPart end } //if musicalPart end } //if vsTrackNo end } // ノートif end } // 一番上のwhile end } finally { // XMLリーダーを終了 if (reader != null) { reader.Close(); } } try { writer = XmlWriter.Create(saveFileName, settings); writer.WriteStartDocument(); // XMLドキュメント開始 writer.WriteStartElement("Scenario"); // Scenario要素開始 writer.WriteAttributeString("Code", deff.GetCode()); // 属性 writer.WriteStartElement("Sequence"); // Sequence要素開始 writer.WriteAttributeString("Id", ""); // Id属性 writer.WriteStartElement("Scene"); // Sequence要素開始 writer.WriteAttributeString("Id", ""); // Id属性 writer.WriteStartElement("Units"); // Units要素開始 // ノート書き込み foreach (TrackData currentTrack in trackArray) { writer.WriteStartElement("Unit"); // Unit要素開始 writer.WriteAttributeString("Version", "1.0"); // Version属性 writer.WriteAttributeString("Id", ""); // Id属性 writer.WriteAttributeString("Category", "SingerSong"); // Category属性 writer.WriteAttributeString("Group", currentTrack.GetTrackGuid()); // Group属性 writer.WriteAttributeString("StartTime", "00:00:00"); // StartTime属性 writer.WriteAttributeString("Duration", "10:00:00"); // Duration属性 writer.WriteStartElement("Song"); // Song要素開始 writer.WriteAttributeString("Version", "1.02"); // Version属性 if (bpmArray != null) { writer.WriteStartElement("Tempo"); // Tempo要素開始 foreach (BpmData currentBpm in bpmArray) { writer.WriteStartElement("Sound"); // Sound要素開始 writer.WriteAttributeString("Clock", currentBpm.GetClock()); // Clock属性 writer.WriteAttributeString("Tempo", currentBpm.GetIntegerPoint()); // Tempo属性 writer.WriteEndElement(); // Sound終了 } writer.WriteEndElement(); // Tempo終了 } if (beatArray != null) { writer.WriteStartElement("Beat"); // Beat要素開始 foreach (BeatData currentBeat in beatArray) { writer.WriteStartElement("Time"); // Time要素開始 writer.WriteAttributeString("Clock", currentBeat.GetPosMes().ToString()); // Clock属性 writer.WriteAttributeString("Beats", currentBeat.GetNume()); // Beats属性 writer.WriteAttributeString("BeatType", currentBeat.GetDenomi()); // BeatType属性 writer.WriteEndElement(); // Time終了 } writer.WriteEndElement(); // Beat終了 } writer.WriteStartElement("Score"); // Score要素開始 writer.WriteStartElement("Key"); // Key要素開始 writer.WriteAttributeString("Clock", "0"); // Clock属性 writer.WriteAttributeString("Fifths", "0"); // Fifths属性 writer.WriteAttributeString("Mode", "0"); // Mode属性 writer.WriteEndElement(); // Key終了 if (currentTrack.GetNote() != null) { foreach (NoteData currentNote in currentTrack.GetNote()) { writer.WriteStartElement("Note"); // Note要素開始 writer.WriteAttributeString("Clock", currentNote.GetClock()); // Clock属性 writer.WriteAttributeString("PitchStep", currentNote.GetPitchStep()); // PitchStep属性 writer.WriteAttributeString("PitchOctave", currentNote.GetPitchOctave()); // PitchOctave属性 writer.WriteAttributeString("Duration", currentNote.GetDuration()); // Duration属性 writer.WriteAttributeString("Lyric", currentNote.GetLyric()); // Lyric属性 writer.WriteEndElement(); // Note要素終了 } } writer.WriteEndElement(); // Score終了 writer.WriteEndElement(); // Song終了 writer.WriteEndElement(); // Unit終了 } writer.WriteEndElement(); // Units終了 writer.WriteStartElement("Groups"); // Groups要素開始 /* * writer.WriteStartElement("Group"); // Group要素開始 * writer.WriteAttributeString("Version", "1.0"); // Version属性 * writer.WriteAttributeString("Id", "2da68d23-4a9a-4f57-9e32-c0190f2d80ee"); // Tempo属性 * writer.WriteAttributeString("Category", "TextVocal"); // Category属性 * writer.WriteAttributeString("Name", "トーク 1"); // Name属性 * writer.WriteAttributeString("Color", "#FF1E90FF"); // Color属性 * writer.WriteAttributeString("Volume", "0"); // Volume属性 * writer.WriteAttributeString("Pan", "0"); // Pan属性 * writer.WriteAttributeString("IsSolo", "false"); // IsSolo属性 * writer.WriteAttributeString("IsMuted", "false"); // IsMuted属性 * writer.WriteEndElement(); // Group終了 */ // ノート書き込み if (trackArray != null) { foreach (TrackData currentTrack in trackArray) { writer.WriteStartElement("Group"); // Group要素開始 writer.WriteAttributeString("Version", "1.0"); // Version属性 writer.WriteAttributeString("Id", currentTrack.GetTrackGuid()); // Tempo属性 writer.WriteAttributeString("Category", "SingerSong"); // Category属性 writer.WriteAttributeString("Name", currentTrack.GetTrackName()); // Name属性 writer.WriteAttributeString("Color", "#FFFF0000"); // Color属性 writer.WriteAttributeString("Volume", "0"); // Volume属性 writer.WriteAttributeString("Pan", "0"); // Pan属性 writer.WriteAttributeString("IsSolo", currentTrack.GetSolo().ToString()); // IsSolo属性 writer.WriteAttributeString("IsMuted", currentTrack.GetMute().ToString()); // IsMuted属性 writer.WriteEndElement(); // Group終了 } } writer.WriteEndElement(); // Groups終了 writer.WriteStartElement("SoundSetting"); // SoundSetting要素開始 writer.WriteAttributeString("Rhythm", "4/4"); // Rhythm属性 writer.WriteAttributeString("Tempo", "78"); // Tempo属性 writer.WriteEndElement(); // SoundSetting終了 writer.WriteEndElement(); // Scene終了 writer.WriteEndElement(); // Sequence終了 writer.WriteEndElement(); // Scenario終了 writer.WriteEndDocument(); // XMLドキュメント終了 } catch (Exception e) { Console.WriteLine(e.ToString()); } finally { Console.WriteLine("" + currentFileName + "\n->\n" + saveFileName + "\n"); // ファイルを閉じる if (writer != null) { writer.Close(); } } } Console.WriteLine("Press the enter key."); Console.ReadLine(); }
// インスタンス作成時にトラックとミキサーの識別用GUIDを作成する public TrackData() { NoteData note = new NoteData(); guidValue = Guid.NewGuid(); }