private void Open_File_B_Click(object sender, System.Windows.RoutedEventArgs e) { if (IsClosing) { return; } OpenFileDialog ofd = new OpenFileDialog() { Title = "サウンドファイルを選択してください。", Filter = "サウンドファイル(*.bnk;*.pck)|*.bnk;*.pck", Multiselect = false }; if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { try { string Ex = Path.GetExtension(ofd.FileName); Sound_List.Items.Clear(); Change_List.Items.Clear(); Change_Sound_Full_Name.Clear(); if (Wwise_Bnk != null) { Wwise_Bnk.Bank_Clear(); } if (Wwise_Pck != null) { Wwise_Pck.Pck_Clear(); } if (Ex == ".bnk") { Wwise_Bnk = new Wwise_File_Extract_V2(ofd.FileName); foreach (string Name_ID in Wwise_Bnk.Wwise_Get_Names()) { Sound_List.Items.Add((Sound_List.Items.Count + 1) + ":" + Name_ID); } IsPCKFile = false; } else if (Ex == ".pck") { Wwise_Pck = new Wwise_File_Extract_V1(ofd.FileName); foreach (string Name_ID in Wwise_Pck.Wwise_Get_Banks_ID()) { Sound_List.Items.Add((Sound_List.Items.Count + 1) + ":" + Name_ID); } IsPCKFile = true; } } catch (Exception e1) { Sub_Code.Error_Log_Write(e1.Message); Message_Feed_Out("エラー:ファイルを読み取れませんでした。"); } } }
private void Content_Load_B_Click(object sender, RoutedEventArgs e) { if (IsClosing) { return; } OpenFileDialog ofd = new OpenFileDialog() { Title = ".wbeファイルを選択してください。", Filter = ".wbeファイル(*.wbe)|*.wbe" }; if (ofd.ShowDialog() == DialogResult.OK) { try { StreamReader str = Sub_Code.File_Decrypt_To_Stream(ofd.FileName, "Bank_Editor_Change_Sound_Save"); string Open_File = str.ReadLine(); if (Path.GetExtension(Open_File) == ".bnk") { Sound_List.Items.Clear(); Wwise_Bnk = new Wwise_File_Extract_V2(Open_File); foreach (string Name_ID in Wwise_Bnk.Wwise_Get_Names()) { Sound_List.Items.Add((Sound_List.Items.Count + 1) + ":" + Name_ID); } IsPCKFile = false; } else if (Path.GetExtension(Open_File) == ".pck") { Sound_List.Items.Clear(); Wwise_Pck = new Wwise_File_Extract_V1(Open_File); foreach (string Name_ID in Wwise_Pck.Wwise_Get_Banks_ID()) { Sound_List.Items.Add((Sound_List.Items.Count + 1) + ":" + Name_ID); } IsPCKFile = true; } else { throw new Exception("ファイル形式が違います。対応しているファイル形式は.bnk、または.pckのみです。"); } Change_List.Items.Clear(); Change_Sound_Full_Name.Clear(); string line; while ((line = str.ReadLine()) != null) { int Index = int.Parse(line.Substring(0, line.IndexOf(':'))); string File_Name = line.Substring(line.IndexOf(':') + 1); Change_List.Items.Add(Sound_List.Items[Index]); Change_Sound_Full_Name.Add(File_Name); } str.Close(); } catch (Exception e1) { Sub_Code.Error_Log_Write(e1.Message); Message_Feed_Out("正常に読み込めませんでした。"); } } }
//音声ファイルの言語を変更 //例:/Data/WwiseSound/ja/voiceover_crew.bnk -> /Data/WwiseSound/en/voiceover_crew.bnk //bnk内のIDが異なるためそのままコピーすることはできません。 public static void Voice_Change_Language(string From_BNK_File, string To_BNK_File, string Set_Language) { if (!File.Exists(Voice_Set.Special_Path + "/Wwise/SoundbanksInfo.json") || !File.Exists(From_BNK_File)) { return; } try { Wwise_Class.Wwise_File_Extract_V2 Wwise_Bnk = new Wwise_Class.Wwise_File_Extract_V2(From_BNK_File); if (Directory.Exists(Voice_Set.Special_Path + "/Voice_Temp")) { Directory.Delete(Voice_Set.Special_Path + "/Voice_Temp", true); } Wwise_Bnk.Wwise_Extract_To_WEM_Directory(Voice_Set.Special_Path + "/Voice_Temp", 1); string Get_Language_ID = Wwise_Bnk.Wwise_Get_Name(0); Wwise_Bnk.Bank_Clear(); StreamReader str = new StreamReader(Voice_Set.Special_Path + "/Wwise/SoundbanksInfo.json"); string Read_Line = ""; int Number = 0; string Get_Language_Now = ""; while ((Read_Line = str.ReadLine()) != null) { if (Read_Line == " \"Id\": \"" + Get_Language_ID + "\"") { Get_Language_Now = File.ReadLines(Voice_Set.Special_Path + "/Wwise/SoundbanksInfo.json").Skip(Number + 1).First().Replace(" \"Language\": \"", "").Replace("\"", ""); } Number++; } str.Close(); if (Get_Language_Now != "") { List <string> Replace_Name_Voice = Get_Voices_ID(Get_Language_Now); foreach (string Replace_Name_Now in Replace_Name_Voice) { string Name_Only = Replace_Name_Now.Substring(0, Replace_Name_Now.IndexOf(':')); string ID_Only = Replace_Name_Now.Substring(Replace_Name_Now.IndexOf(':') + 1); File_Move(Voice_Set.Special_Path + "/Voice_Temp/" + ID_Only + ".wem", Voice_Set.Special_Path + "/Voice_Temp/" + Name_Only.Replace(".wav", ".wem"), true); } List <string> Get_Set_Language_ID = Get_Voices_ID(Set_Language); Wwise_Class.Wwise_File_Extract_V2 Wwise_Bnk_02 = new Wwise_Class.Wwise_File_Extract_V2(Voice_Set.Special_Path + "/Voice_Temp/voiceover_crew.bnk"); List <string> New_ID = Wwise_Bnk_02.Wwise_Get_Names(); for (int Number_01 = 0; Number_01 < New_ID.Count; Number_01++) { foreach (string ID in Get_Set_Language_ID) { string Name_Only = ID.Substring(0, ID.IndexOf(':')).Replace(".wav", ".wem"); string ID_Only = ID.Substring(ID.IndexOf(':') + 1); if (ID_Only == New_ID[Number_01]) { Wwise_Bnk_02.Bank_Edit_Sound(Number_01, Voice_Set.Special_Path + "/Voice_Temp/" + Name_Only, false); } } } Wwise_Bnk_02.Bank_Save(To_BNK_File); Wwise_Bnk_02.Bank_Clear(); } else { Error_Log_Write("指定された.bnkファイルは音声ファイルでない可能性があります。"); } } catch (Exception e) { Error_Log_Write(e.Message); } }
private async void Open_File_B_Click(object sender, RoutedEventArgs e) { if (IsClosing || IsBusy) { return; } OpenFileDialog ofd = new OpenFileDialog() { Title = "WoTBの音声Modを選択してください。", Multiselect = false, Filter = "WoTB音声(*.fsb;*.bnk)|*.fsb;*.bnk" }; if (ofd.ShowDialog() == DialogResult.OK) { IsBusy = true; try { string To_Dir = Voice_Set.Special_Path + "/Wwise/BNK_WAV_WoT"; try { if (Directory.Exists(To_Dir)) { Directory.Delete(To_Dir, true); } } catch (Exception e1) { Sub_Code.Error_Log_Write(e1.Message); } for (int Number = 0; Number < 34; Number++) { BNK_FSB_Enable.Add(new List <bool>()); } if (Path.GetExtension(ofd.FileName) == ".bnk") { Message_T.Text = ".bnkファイルを解析しています..."; await Task.Delay(50); Wwise_Class.BNK_Parse p = new Wwise_Class.BNK_Parse(ofd.FileName); if (!p.IsVoiceFile(true)) { Message_Feed_Out("選択されたbnkファイルは音声データではありません。"); IsBusy = false; return; } BNK_FSB_Voices = p.Get_Voices(true); List <string> Need_Files = new List <string>(); foreach (List <string> Types in BNK_FSB_Voices) { foreach (string File_Now in Types) { Need_Files.Add(File_Now); } } if (Need_Files.Count == 0) { Message_T.Text = "移植できるファイルが見つからなかったため、特殊な方法で解析しています..."; await Task.Delay(50); p.SpecialBNKFileMode = 1; BNK_FSB_Voices = p.Get_Voices(true); foreach (List <string> Types in BNK_FSB_Voices) { foreach (string File_Now in Types) { Need_Files.Add(File_Now); } } if (Need_Files.Count == 0) { p.Clear(); BNK_FSB_Voices.Clear(); Message_Feed_Out("移植できる音声が見つかりませんでした。"); IsBusy = false; return; } } p.Clear(); Voices_L.Items.Clear(); Content_L.Items.Clear(); Now_Stream_Count = 0; Message_T.Text = ".wavまたは.oggに変換しています..."; await Task.Delay(50); Wwise_File_Extract_V2 Wwise_BNK = new Wwise_File_Extract_V2(ofd.FileName); Max_Stream_Count = Wwise_BNK.Wwise_Get_Numbers(); Wwise_BNK.Wwise_Extract_To_WEM_Directory_V2(To_Dir); Wwise_BNK.Bank_Clear(); Message_T.Text = "不要な音声ファイルを削除しています..."; await Task.Delay(50); string[] All_Files = Directory.GetFiles(To_Dir, "*", SearchOption.TopDirectoryOnly); foreach (string File_Now in All_Files) { if (!Need_Files.Contains(Path.GetFileNameWithoutExtension(File_Now))) { Sub_Code.File_Delete_V2(File_Now); } } //効果音を削除(これ以外は取り除けない) string[] Files = Directory.GetFiles(To_Dir, "*.wem", SearchOption.TopDirectoryOnly); foreach (string File_Now in Files) { Sub_Code.File_Delete_V2(File_Now); } Message_T.Text = ".oggファイルを.wavファイルに変換しています..."; await Task.Delay(50); await Multithread.Convert_To_Wav(Directory.GetFiles(To_Dir, "*.ogg", SearchOption.TopDirectoryOnly), To_Dir, true, true); File_Name_T.Text = Path.GetFileName(ofd.FileName); Message_Feed_Out(".bnkファイルをロードしました。SEが含まれている場合は無効化してください。"); } else { Message_T.Text = ".fsbファイルを解析しています..."; await Task.Delay(50); bool IsVoiceExist = false; List <string> Voices = Fmod_Class.FSB_GetNames(ofd.FileName); foreach (string File_Now in Voices) { string File_Now_01 = File_Now.Replace(" ", ""); if (File_Now_01.Contains("battle_01") || File_Now_01.Contains("battle_02") || File_Now_01.Contains("battle_03") || File_Now_01.Contains("start_battle_01")) { IsVoiceExist = true; break; } } if (!IsVoiceExist) { Message_Feed_Out("指定したFSBファイルは対応していません。"); IsBusy = false; return; } Voices.Clear(); Message_T.Text = "FSBファイルからファイルを抽出しています..."; await Task.Delay(50); Max_Stream_Count = Fmod_Class.FSB_GetLength(ofd.FileName); Fmod_File_Extract_V2.FSB_Extract_To_Directory(ofd.FileName, To_Dir + "_TMP"); Message_T.Text = ".wavファイルを修正しています..."; await Task.Delay(50); await Multithread.Convert_To_Wav(To_Dir + "_TMP", To_Dir, true, true, false, false); Directory.Delete(To_Dir + "_TMP", true); Message_T.Text = "ファイル名からリストに配置しています..."; await Task.Delay(50); BNK_FSB_Voices = Voice_Set.Voice_BGM_Name_Change_From_FSB_To_Index(To_Dir); Voices_L.Items.Clear(); Content_L.Items.Clear(); Now_Stream_Count = 0; Message_T.Text = "不要なファイルを削除しています..."; await Task.Delay(50); foreach (string File_Name in Directory.GetFiles(To_Dir, "*", SearchOption.TopDirectoryOnly)) { string Name_Only = Path.GetFileNameWithoutExtension(File_Name); bool IsExsist = false; for (int Number = 0; Number < BNK_FSB_Voices.Count; Number++) { foreach (string Name_Now in BNK_FSB_Voices[Number]) { if (Name_Only == Name_Now) { IsExsist = true; break; } } if (IsExsist) { break; } } if (!IsExsist) { Sub_Code.File_Delete_V2(File_Name); } } File_Name_T.Text = Path.GetFileName(ofd.FileName); Message_Feed_Out(".fsbファイルをロードしました。"); } if (BNK_FSB_Voices[5].Count == 0 && BNK_FSB_Voices[2].Count > 0) { BNK_FSB_Voices[5] = new List <string>(BNK_FSB_Voices[2]); } if (BNK_FSB_Voices[4].Count == 0 && BNK_FSB_Voices[3].Count > 0) { BNK_FSB_Voices[4] = new List <string>(BNK_FSB_Voices[3]); } for (int Number = 0; Number < 34; Number++) { Now_Stream_Count += BNK_FSB_Voices[Number].Count; Voices_L.Items.Add(Voice_Set.Get_Voice_Type_Japanese_Name_V2(Number) + " : " + BNK_FSB_Voices[Number].Count + "個"); } for (int Number_01 = 0; Number_01 < BNK_FSB_Voices.Count; Number_01++) { for (int Number_02 = 0; Number_02 < BNK_FSB_Voices[Number_01].Count; Number_02++) { BNK_FSB_Enable[Number_01].Add(true); } } } catch (Exception e1) { IsBusy = false; Sub_Code.Error_Log_Write(e1.Message); BNK_FSB_Clear(false); Message_Feed_Out("エラーが発生しました。Error_Log.txtを参照してください。"); } } IsBusy = false; }
private async void Open_BNK_B_Click(object sender, RoutedEventArgs e) { if (IsClosing || IsBusy) { return; } System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog() { Title = ".bnkファイルを選択してください。", Multiselect = false, Filter = ".bnkファイル(*.bnk)|*.bnk" }; if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { try { IsBusy = true; string PCK_File_Path = Path.GetDirectoryName(ofd.FileName) + "/" + Path.GetFileNameWithoutExtension(ofd.FileName) + ".pck"; if (PCK_Mode_C.IsChecked.Value && !File.Exists(PCK_File_Path)) { Message_Feed_Out(Path.GetFileNameWithoutExtension(ofd.FileName) + ".pckが見つかりませんでした。"); IsBusy = false; return; } Bass.BASS_ChannelStop(Stream); Bass.BASS_StreamFree(Stream); if (Directory.Exists(Voice_Set.Special_Path + "/Wwise/BNK_WAV_Special")) { Sub_Code.Directory_Delete(Voice_Set.Special_Path + "/Wwise/BNK_WAV_Special"); } Message_T.Text = ".bnkファイルを解析しています..."; await Task.Delay(50); p = new Wwise_Class.BNK_Parse(ofd.FileName); List <uint> Event_List = p.Get_BNK_Event_ID(); Event_Type_L.Items.Clear(); Sound_L.Items.Clear(); foreach (uint ID in Event_List) { Event_Type_L.Items.Add((Event_Type_L.Items.Count + 1) + ":" + ID); } Event_List.Clear(); if (PCK_Mode_C.IsChecked.Value) { Wwise_PCK = new Wwise_File_Extract_V1(PCK_File_Path); IsPCKMode = true; } else { Wwise_BNK = new Wwise_File_Extract_V2(ofd.FileName); IsPCKMode = false; } if (!Directory.Exists(Voice_Set.Special_Path + "/Wwise/BNK_WAV_Special")) { Directory.CreateDirectory(Voice_Set.Special_Path + "/Wwise/BNK_WAV_Special"); } File_Name_T.Text = Path.GetFileName(ofd.FileName); Message_Feed_Out(".bnkファイルをロードしました。"); } catch (Exception e1) { Sub_Code.Error_Log_Write(e1.Message); if (Wwise_PCK != null) { Wwise_PCK.Pck_Clear(); } if (Wwise_BNK != null) { Wwise_BNK.Bank_Clear(); } if (p != null) { p.Clear(); } Wwise_PCK = null; Wwise_BNK = null; p = null; IsPCKMode = false; File_Name_T.Text = ""; Event_Type_L.Items.Clear(); Sound_L.Items.Clear(); Message_Feed_Out("エラーが発生しました。詳しくはError_Log.txtを参照してください。"); } } IsBusy = false; }