From 2688e7e7dcc048445f6309e3c0d09f3870be6dd5 Mon Sep 17 00:00:00 2001 From: Skyth <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Thu, 26 Jan 2017 23:40:46 +0300 Subject: [PATCH] Add CSB Builder --- Release/AcbEditor.exe | Bin 12800 -> 13312 bytes Release/CsbBuilder.exe | Bin 0 -> 153088 bytes Release/CsbEditor.exe | Bin 12800 -> 13312 bytes Release/NAudio.dll | Bin 0 -> 475136 bytes Release/SonicAudioLib.dll | Bin 59392 -> 60416 bytes SonicAudioTools.sln | 9 +- Source/AcbEditor/Properties/AssemblyInfo.cs | 5 +- Source/CsbBuilder/App.config | 2 +- Source/CsbBuilder/Audio/AdxConverter.cs | 238 ++ Source/CsbBuilder/Builder/CsbBuilder.cs | 323 +++ .../BuilderNode/BuilderAisacGraphNode.cs | 41 + .../BuilderNode/BuilderAisacNode.cs | 32 + .../BuilderNode/BuilderAisacPointNode.cs | 20 + .../CsbBuilder/BuilderNode/BuilderBaseNode.cs | 22 + .../CsbBuilder/BuilderNode/BuilderCueNode.cs | 29 + .../BuilderNode/BuilderSoundElementNode.cs | 41 + .../BuilderNode/BuilderSynthNode.cs | 436 ++++ .../BuilderNode/BuilderVoiceLimitGroupNode.cs | 15 + .../CreateNewProjectForm.Designer.cs | 171 ++ Source/CsbBuilder/CreateNewProjectForm.cs | 77 + Source/CsbBuilder/CreateNewProjectForm.resx | 120 + Source/CsbBuilder/CriTableAax.cs | 48 - Source/CsbBuilder/CriTableAisacGraph.cs | 104 - Source/CsbBuilder/CriTableCueSheet.cs | 134 - Source/CsbBuilder/CriTableSoundElement.cs | 127 - Source/CsbBuilder/CsbBuilder.csproj | 180 +- Source/CsbBuilder/ExceptionForm.Designer.cs | 124 + Source/CsbBuilder/ExceptionForm.cs | 42 + Source/CsbBuilder/ExceptionForm.resx | 120 + Source/CsbBuilder/Extensions.cs | 86 + Source/CsbBuilder/Importer/CsbImporter.cs | 305 +++ Source/CsbBuilder/MainForm.Designer.cs | 1799 +++++++++++++ Source/CsbBuilder/MainForm.cs | 2253 +++++++++++++++++ Source/CsbBuilder/MainForm.resx | 177 ++ Source/CsbBuilder/Program.cs | 93 +- Source/CsbBuilder/Project/CsbProject.cs | 261 ++ Source/CsbBuilder/Properties/AssemblyInfo.cs | 9 +- .../Properties/Resources.Designer.cs | 217 +- Source/CsbBuilder/Properties/Resources.resx | 68 +- .../Properties/Settings.Designer.cs | 30 + .../CsbBuilder/Properties/Settings.settings | 7 + .../Resources/AudioPlayback_16x.png | Bin 0 -> 252 bytes .../Resources/BuildDefinition_16x.png | Bin 0 -> 409 bytes Source/CsbBuilder/Resources/Copy_16x.png | Bin 0 -> 200 bytes .../Resources/CreateListItem_16x.png | Bin 0 -> 263 bytes Source/CsbBuilder/Resources/Exit_16x.png | Bin 0 -> 390 bytes .../FolderBrowserDialogControl_grey_16x.png | Bin 0 -> 222 bytes .../Resources/FolderOpen_exp_16x.png | Bin 0 -> 307 bytes .../CsbBuilder/Resources/Folder_grey_16x.png | Bin 0 -> 195 bytes .../CsbBuilder/Resources/Import_grey_16x.png | Bin 0 -> 422 bytes .../CsbBuilder/Resources/MergeModule_16x.png | Bin 0 -> 297 bytes Source/CsbBuilder/Resources/Merge_16x.png | Bin 0 -> 381 bytes Source/CsbBuilder/Resources/None_16x.png | Bin 0 -> 429 bytes Source/CsbBuilder/Resources/Paste_16x.png | Bin 0 -> 278 bytes .../Resources/ProjectFolderOpen_exp_16x.png | Bin 0 -> 344 bytes Source/CsbBuilder/Resources/Reference_16x.png | Bin 0 -> 179 bytes Source/CsbBuilder/Resources/Remove_16x.png | Bin 0 -> 126 bytes .../Resources/Remove_thin_10x_16x.png | Bin 0 -> 138 bytes Source/CsbBuilder/Resources/SaveAs_16x.png | Bin 0 -> 304 bytes Source/CsbBuilder/Resources/Save_16x.png | Bin 0 -> 222 bytes Source/CsbBuilder/Resources/Select_16x.png | Bin 0 -> 469 bytes Source/CsbBuilder/Resources/SoundFile_16x.png | Bin 0 -> 360 bytes Source/CsbBuilder/Resources/Stop_grey_16x.png | Bin 0 -> 142 bytes Source/CsbBuilder/Resources/Template_16x.png | Bin 0 -> 235 bytes .../SerializationAisacGraphTable.cs | 94 + .../SerializationAisacPointTable.cs} | 20 +- .../SerializationAisacTable.cs} | 44 +- .../SerializationCueSheetTable.cs | 52 + .../SerializationCueTable.cs} | 40 +- .../SerializationSoundElementTable.cs | 108 + .../SerializationSynthTable.cs} | 650 +++-- .../SerializationVersionInfoTable.cs} | 20 +- .../SerializationVoiceLimitGroupTable.cs} | 20 +- Source/CsbBuilder/SetAudioForm.Designer.cs | 193 ++ Source/CsbBuilder/SetAudioForm.cs | 99 + Source/CsbBuilder/SetAudioForm.resx | 120 + .../CsbBuilder/SetReferenceForm.Designer.cs | 115 + Source/CsbBuilder/SetReferenceForm.cs | 96 + Source/CsbBuilder/SetReferenceForm.resx | 120 + Source/CsbBuilder/packages.config | 4 + Source/CsbEditor/Properties/AssemblyInfo.cs | 5 +- Source/SonicAudioCmd/Program.cs | 42 +- .../SonicAudioCmd/Properties/AssemblyInfo.cs | 1 - Source/SonicAudioCmd/cpk_packer.txt | 72 + Source/SonicAudioLib/Archive/CriCpkArchive.cs | 90 +- Source/SonicAudioLib/CriMw/CriTableReader.cs | 5 + .../CriMw/Serialization/CriTableSerializer.cs | 88 +- .../SonicAudioLib/Properties/AssemblyInfo.cs | 5 +- 88 files changed, 8788 insertions(+), 1080 deletions(-) create mode 100644 Release/CsbBuilder.exe create mode 100644 Release/NAudio.dll create mode 100644 Source/CsbBuilder/Audio/AdxConverter.cs create mode 100644 Source/CsbBuilder/Builder/CsbBuilder.cs create mode 100644 Source/CsbBuilder/BuilderNode/BuilderAisacGraphNode.cs create mode 100644 Source/CsbBuilder/BuilderNode/BuilderAisacNode.cs create mode 100644 Source/CsbBuilder/BuilderNode/BuilderAisacPointNode.cs create mode 100644 Source/CsbBuilder/BuilderNode/BuilderBaseNode.cs create mode 100644 Source/CsbBuilder/BuilderNode/BuilderCueNode.cs create mode 100644 Source/CsbBuilder/BuilderNode/BuilderSoundElementNode.cs create mode 100644 Source/CsbBuilder/BuilderNode/BuilderSynthNode.cs create mode 100644 Source/CsbBuilder/BuilderNode/BuilderVoiceLimitGroupNode.cs create mode 100644 Source/CsbBuilder/CreateNewProjectForm.Designer.cs create mode 100644 Source/CsbBuilder/CreateNewProjectForm.cs create mode 100644 Source/CsbBuilder/CreateNewProjectForm.resx delete mode 100644 Source/CsbBuilder/CriTableAax.cs delete mode 100644 Source/CsbBuilder/CriTableAisacGraph.cs delete mode 100644 Source/CsbBuilder/CriTableCueSheet.cs delete mode 100644 Source/CsbBuilder/CriTableSoundElement.cs create mode 100644 Source/CsbBuilder/ExceptionForm.Designer.cs create mode 100644 Source/CsbBuilder/ExceptionForm.cs create mode 100644 Source/CsbBuilder/ExceptionForm.resx create mode 100644 Source/CsbBuilder/Extensions.cs create mode 100644 Source/CsbBuilder/Importer/CsbImporter.cs create mode 100644 Source/CsbBuilder/MainForm.Designer.cs create mode 100644 Source/CsbBuilder/MainForm.cs create mode 100644 Source/CsbBuilder/MainForm.resx create mode 100644 Source/CsbBuilder/Project/CsbProject.cs create mode 100644 Source/CsbBuilder/Properties/Settings.Designer.cs create mode 100644 Source/CsbBuilder/Properties/Settings.settings create mode 100644 Source/CsbBuilder/Resources/AudioPlayback_16x.png create mode 100644 Source/CsbBuilder/Resources/BuildDefinition_16x.png create mode 100644 Source/CsbBuilder/Resources/Copy_16x.png create mode 100644 Source/CsbBuilder/Resources/CreateListItem_16x.png create mode 100644 Source/CsbBuilder/Resources/Exit_16x.png create mode 100644 Source/CsbBuilder/Resources/FolderBrowserDialogControl_grey_16x.png create mode 100644 Source/CsbBuilder/Resources/FolderOpen_exp_16x.png create mode 100644 Source/CsbBuilder/Resources/Folder_grey_16x.png create mode 100644 Source/CsbBuilder/Resources/Import_grey_16x.png create mode 100644 Source/CsbBuilder/Resources/MergeModule_16x.png create mode 100644 Source/CsbBuilder/Resources/Merge_16x.png create mode 100644 Source/CsbBuilder/Resources/None_16x.png create mode 100644 Source/CsbBuilder/Resources/Paste_16x.png create mode 100644 Source/CsbBuilder/Resources/ProjectFolderOpen_exp_16x.png create mode 100644 Source/CsbBuilder/Resources/Reference_16x.png create mode 100644 Source/CsbBuilder/Resources/Remove_16x.png create mode 100644 Source/CsbBuilder/Resources/Remove_thin_10x_16x.png create mode 100644 Source/CsbBuilder/Resources/SaveAs_16x.png create mode 100644 Source/CsbBuilder/Resources/Save_16x.png create mode 100644 Source/CsbBuilder/Resources/Select_16x.png create mode 100644 Source/CsbBuilder/Resources/SoundFile_16x.png create mode 100644 Source/CsbBuilder/Resources/Stop_grey_16x.png create mode 100644 Source/CsbBuilder/Resources/Template_16x.png create mode 100644 Source/CsbBuilder/Serialization/SerializationAisacGraphTable.cs rename Source/CsbBuilder/{CriTableAisacPoint.cs => Serialization/SerializationAisacPointTable.cs} (58%) rename Source/CsbBuilder/{CriTableAisac.cs => Serialization/SerializationAisacTable.cs} (51%) create mode 100644 Source/CsbBuilder/Serialization/SerializationCueSheetTable.cs rename Source/CsbBuilder/{CriTableCue.cs => Serialization/SerializationCueTable.cs} (57%) create mode 100644 Source/CsbBuilder/Serialization/SerializationSoundElementTable.cs rename Source/CsbBuilder/{CriTableSynth.cs => Serialization/SerializationSynthTable.cs} (56%) rename Source/CsbBuilder/{CriTableVersionInfo.cs => Serialization/SerializationVersionInfoTable.cs} (57%) rename Source/CsbBuilder/{CriTableVoiceLimitGroup.cs => Serialization/SerializationVoiceLimitGroupTable.cs} (57%) create mode 100644 Source/CsbBuilder/SetAudioForm.Designer.cs create mode 100644 Source/CsbBuilder/SetAudioForm.cs create mode 100644 Source/CsbBuilder/SetAudioForm.resx create mode 100644 Source/CsbBuilder/SetReferenceForm.Designer.cs create mode 100644 Source/CsbBuilder/SetReferenceForm.cs create mode 100644 Source/CsbBuilder/SetReferenceForm.resx create mode 100644 Source/CsbBuilder/packages.config create mode 100644 Source/SonicAudioCmd/cpk_packer.txt diff --git a/Release/AcbEditor.exe b/Release/AcbEditor.exe index 221849360201ba7a55386992fd194273b6705b0b..62806852a160fc70986238fdfa05e9fc5de4e6af 100644 GIT binary patch delta 4437 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 delta 4692 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 XYG_w{7pDIS^xo7_-uN*aY1ID*E-^gW diff --git a/Release/NAudio.dll b/Release/NAudio.dll new file mode 100644 index 0000000000000000000000000000000000000000..553425e165af458000904352e45b34f35e5f3747 GIT binary patch literal 475136 zcmce<3t(JTwKslp&dfRUNYYG_&P>uaGkqi+W+rKy&=Ojp;aT34cOH}$3P{t^17`|i zrzaFte6>Ik6%hduP*DLN*Xsinz4%5&5JiMo@o{~B>h*dRC49f%+UJ}(NlNwa_y4{? z&t7}&z1LoQ?X~w_`#GnM-mDp#rp55@<(D<>lW_SrB;Nynb|JXA@abmlI>{A9x^ z-&}b1Wt*$TD_rMQ?uC~ZH(j`Go3p)m(IrLqs%^#1+lt4Yepc~v=i*EHnwnBeeA4TV z)3j3>46XZui-v>T_GycX>4s&RHfU*@sjv^61h@!zBV0{u5m;Az6G8sv?{0(x&p$&O zdOf4^|GMjYiNfD7=$=jhbU#T!%>3JBX^p@YPqei8Gs6z#FKSvM5}ttngowXy`z69S6^beIn!c>y?CVR8e{64hoym zOV8?dFAzxm8I}68bmHFU=`_c@&(Yoa2)_tES9 zJ0h|I8A;zsUoF$9#d1>(CDdO`yWZCa6=w7r*>Xe9V-%H%USpcwLi!YvJ{2GD2Wf=Y zLsZlnv03{xM9^!(wXlf_A@3W>nd!a?La>v<49g&CY&70f$t-o+N3kfPSC<8RiRu~I z{)Az-A+$g3z6~U*>yTuJz7t&?V`7_D&CKM4@r7I5l_;

DJig# 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≪qH8K-a4W3c+5w*v0(X(=J@V>aNZgzT<3%H);Q(T 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�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 literal 59392 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%0DG<$F z7B%uE@)i0osSk}9XeuyaC(R7V%Rp$1x>G?FL2*3;N32pa;P<{BFAwJ<_e8Orhbw)w ztGj`*YaSUlq-^pbf(e7E-Vh7UWpqs#C#`-rr8{&Kj;V)M8a)T}l!}o{ZUq#b*f8EO zKAtAuMEUWIb)~z$n^;!omH39Og}#gkhHD$$k~9`Y9t}{I%rRPGA`M<--y1q=%3OZo zs4Nd>7O0}YGJ#NmE`gc?N%5$)GPyR%BnZr>fJ;iuhL4!pk!ngQXF@VYTmhLe1xlzF z3H9DlaE0-N#sa<}ut^REQ5*lzx;>#6`QoC+9mBMRM`Tz1pZFCXjpG=4e(GlRHrtFH zk959G_mpSG>=OWqec&nKiKljh%|9NkHg)?%Xu@MlLM6Ah+sSK<_U3lClQi^nlrU_# zcWjI+WcPM6S!}LvG;eQjBpV!Q?yzE8)M#n=xb*10XASu9FkjcqkNzfq_f~R~ldYXQ z4|Z?2Ht%p8xwYM0?<6N?j?W&$dCu_0F*Etx$>S%VKYjY-vE#R9Pam5-J-c@77f#Ne zI(Gb2^X7BMpFi1LTO;L&XM*E=n43StL*b@2eWAXZAF`fG&y4;OAMZXjeF8~Uj^vT) zV4%o`-|7EvY+0$cBZr0y3^RYwy?d%)0kVkoogI> zXR|iBvTIuvQJ=cTAsTzQ<6587RZdrSfb~So02+MrS!jClmFbgZJX`-%xOP-eeEVV2;_taD$-t+ObFe=jZ#VG=Bfy<**oe#*?!1Fa<;`F`(!TmEoTGG5tGXvl5ZILC$3Yjf(Rr9i8$ z+E{g~r`o#H>b%zW-5P3_)mgz=n!A=-#btT4BELnNHE?dxI6>xGpWndM!tw?&8|2fj zONWJF!+V9)W{$=kVz!_n-wq>Qze~KK$jc?TVDqk7>U0{TFR#J+&p>xZ?=ornJW4;p zf$|RQG*I7xWoz0oCcRottNCqw?U3}T?AP0`)zvu-4K4n7zYcGp;O!>l7ym8G@eaI7 z#v90Hmo$>Xeq3VSLSi~oq8;rH>(>vgWYucg+vy - + \ No newline at end of file diff --git a/Source/CsbBuilder/Audio/AdxConverter.cs b/Source/CsbBuilder/Audio/AdxConverter.cs new file mode 100644 index 0000000..c31654c --- /dev/null +++ b/Source/CsbBuilder/Audio/AdxConverter.cs @@ -0,0 +1,238 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +using SonicAudioLib.IO; +using NAudio.Wave; + +namespace CsbBuilder.Audio +{ + public struct AdxHeader + { + public ushort Identifier; + public ushort DataPosition; + public byte EncodeType; + public byte BlockLength; + public byte SampleBitdepth; + public byte ChannelCount; + public uint SampleRate; + public uint SampleCount; + public ushort CutoffFrequency; + public byte Version; + public byte Flags; + public bool LoopEnabled; + public uint LoopBeginSampleIndex; + public uint LoopBeginByteIndex; + public uint LoopEndSampleIndex; + public uint LoopEndByteIndex; + } + + public static class AdxConverter + { + public static void ConvertToWav(string sourceFileName) + { + ConvertToWav(sourceFileName, Path.ChangeExtension(sourceFileName, "wav")); + } + + public static void ConvertToWav(string sourceFileName, string destinationFileName) + { + BufferedWaveProvider provider = Decode(sourceFileName, 1.0, 0.0); + + using (WaveFileWriter writer = new WaveFileWriter(destinationFileName, provider.WaveFormat)) + { + int num; + + byte[] buffer = new byte[32767]; + while ((num = provider.Read(buffer, 0, buffer.Length)) != 0) + { + writer.Write(buffer, 0, num); + } + } + + provider.ClearBuffer(); + } + + public static AdxHeader LoadHeader(string sourceFileName) + { + using (Stream source = File.OpenRead(sourceFileName)) + { + return ReadHeader(source); + } + } + + public static AdxHeader ReadHeader(Stream source) + { + AdxHeader header = new AdxHeader(); + header.Identifier = EndianStream.ReadUInt16BE(source); + header.DataPosition = EndianStream.ReadUInt16BE(source); + header.EncodeType = EndianStream.ReadByte(source); + header.BlockLength = EndianStream.ReadByte(source); + header.SampleBitdepth = EndianStream.ReadByte(source); + header.ChannelCount = EndianStream.ReadByte(source); + header.SampleRate = EndianStream.ReadUInt32BE(source); + header.SampleCount = EndianStream.ReadUInt32BE(source); + header.CutoffFrequency = EndianStream.ReadUInt16BE(source); + header.Version = EndianStream.ReadByte(source); + header.Flags = EndianStream.ReadByte(source); + source.Seek(4, SeekOrigin.Current); + header.LoopEnabled = EndianStream.ReadUInt32BE(source) > 0; + header.LoopBeginSampleIndex = EndianStream.ReadUInt32BE(source); + header.LoopBeginByteIndex = EndianStream.ReadUInt32BE(source); + header.LoopEndSampleIndex = EndianStream.ReadUInt32BE(source); + header.LoopEndByteIndex = EndianStream.ReadUInt32BE(source); + return header; + } + + public static BufferedWaveProvider Decode(string sourceFileName, double volume, double pitch) + { + using (Stream source = File.OpenRead(sourceFileName)) + { + return Decode(source, volume, pitch); + } + } + + private static void CalculateCoefficients(double cutoffFrequency, double sampleRate, out short coef1, out short coef2) + { + double a = Math.Sqrt(2.0); + double b = a - Math.Cos(cutoffFrequency * 6.2831855 / sampleRate); + double c = (b - Math.Sqrt((b - (a - 1.0)) * (a - 1.0 + b))) / (a - 1.0); + + coef1 = (short)(8192.0 * c); + coef2 = (short)(c * c * -4096.0); + } + + // https://wiki.multimedia.cx/index.php/CRI_ADX_ADPCM + public static BufferedWaveProvider Decode(Stream source, double volume, double pitch) + { + AdxHeader header = ReadHeader(source); + + WaveFormat waveFormat = new WaveFormat((int)header.SampleRate, 16, header.ChannelCount); + BufferedWaveProvider provider = new BufferedWaveProvider(waveFormat); + provider.BufferLength = (int)(header.SampleCount * header.ChannelCount * 2); + + provider.ReadFully = false; + provider.DiscardOnBufferOverflow = true; + + short firstHistory1 = 0; + short firstHistory2 = 0; + short secondHistory1 = 0; + short secondHistory2 = 0; + + short coef1 = 0; + short coef2 = 0; + + CalculateCoefficients(header.CutoffFrequency, header.SampleRate, out coef1, out coef2); + + source.Seek(header.DataPosition + 4, SeekOrigin.Begin); + + if (header.ChannelCount == 1) + { + for (int i = 0; i < header.SampleCount / 32; i++) + { + byte[] block = EndianStream.ReadBytes(source, header.BlockLength); + foreach (short sampleShort in DecodeBlock(block, ref firstHistory1, ref firstHistory2, coef1, coef2)) + { + double sample = (double)sampleShort * volume; + + if (sample > short.MaxValue) + { + sample = short.MaxValue; + } + + if (sample < short.MinValue) + { + sample = short.MinValue; + } + + provider.AddSamples(BitConverter.GetBytes((short)sample), 0, 2); + } + } + } + + else if (header.ChannelCount == 2) + { + for (int i = 0; i < header.SampleCount / 32; i++) + { + byte[] blockLeft = EndianStream.ReadBytes(source, header.BlockLength); + byte[] blockRight = EndianStream.ReadBytes(source, header.BlockLength); + + short[] samplesLeft = DecodeBlock(blockLeft, ref firstHistory1, ref firstHistory2, coef1, coef2); + short[] samplesRight = DecodeBlock(blockRight, ref secondHistory1, ref secondHistory2, coef1, coef2); + + for (int j = 0; j < 32; j++) + { + double newSampleLeft = samplesLeft[j] * volume; + double newSampleRight = samplesRight[j] * volume; + + if (newSampleLeft > short.MaxValue) + { + newSampleLeft = short.MaxValue; + } + + if (newSampleLeft < short.MinValue) + { + newSampleLeft = short.MinValue; + } + + if (newSampleRight > short.MaxValue) + { + newSampleRight = short.MaxValue; + } + + if (newSampleRight < short.MinValue) + { + newSampleRight = short.MinValue; + } + + samplesLeft[j] = (short)newSampleLeft; + samplesRight[j] = (short)newSampleRight; + + byte[] sampleLeft = BitConverter.GetBytes(samplesLeft[j]); + byte[] sampleRight = BitConverter.GetBytes(samplesRight[j]); + + provider.AddSamples(new byte[] { sampleLeft[0], sampleLeft[1], sampleRight[0], sampleRight[1] }, 0, 4); + } + } + } + + return provider; + } + + public static short[] DecodeBlock(byte[] block, ref short history1, ref short history2, short coef1, short coef2) + { + int scale = (block[0] << 8 | block[1]) + 1; + + short[] samples = new short[32]; + + for (int i = 0; i < 32; i++) + { + int sampleByte = block[2 + i / 2]; + int sampleNibble = ((i & 1) != 0 ? (sampleByte & 7) - (sampleByte & 8) : ((sampleByte & 0x70) - (sampleByte & 0x80)) >> 4); + int sampleDelta = sampleNibble * scale; + int predictedSample12 = coef1 * history1 + coef2 * history2; + int predictedSample = predictedSample12 >> 12; + + int sampleRaw = predictedSample + sampleDelta; + + if (sampleRaw > short.MaxValue) + { + sampleRaw = short.MaxValue; + } + + else if (sampleRaw < short.MinValue) + { + sampleRaw = short.MinValue; + } + + samples[i] = (short)sampleRaw; + + history2 = history1; + history1 = (short)sampleRaw; + } + + return samples; + } + } +} diff --git a/Source/CsbBuilder/Builder/CsbBuilder.cs b/Source/CsbBuilder/Builder/CsbBuilder.cs new file mode 100644 index 0000000..4e5e2f0 --- /dev/null +++ b/Source/CsbBuilder/Builder/CsbBuilder.cs @@ -0,0 +1,323 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +using CsbBuilder.Project; +using CsbBuilder.BuilderNode; +using CsbBuilder.Serialization; + +using SonicAudioLib.CriMw; +using SonicAudioLib.CriMw.Serialization; +using SonicAudioLib.Archive; + +namespace CsbBuilder.Builder +{ + public static class CsbBuilder + { + public static void Build(CsbProject project, string outputFileName) + { + CriCpkArchive cpkArchive = new CriCpkArchive(); + + DirectoryInfo outputDirectory = new DirectoryInfo(Path.GetDirectoryName(outputFileName)); + + List cueSheetTables = new List(); + + SerializationVersionInfoTable versionInfoTable = new SerializationVersionInfoTable(); + cueSheetTables.Add(new SerializationCueSheetTable + { + TableData = CriTableSerializer.Serialize(new List() { versionInfoTable }, CriTableWriterSettings.AdxSettings), + Name = "INFO", + TableType = 7, + }); + + // Serialize cues. + List cueTables = new List(); + foreach (BuilderCueNode cueNode in project.CueNodes) + { + cueTables.Add(new SerializationCueTable + { + Name = cueNode.Name, + Id = cueNode.Identifier, + UserData = cueNode.UserComment, + Flags = cueNode.Flags, + SynthPath = cueNode.SynthReference, + }); + } + + cueSheetTables.Add(new SerializationCueSheetTable + { + TableData = CriTableSerializer.Serialize(cueTables, CriTableWriterSettings.AdxSettings), + Name = "CUE", + TableType = 1, + }); + + // Serialize synth tables. + List synthTables = new List(); + foreach (BuilderSynthNode synthNode in project.SynthNodes) + { + SerializationSynthTable synthTable = new SerializationSynthTable + { + SynthName = synthNode.Name, + SynthType = (byte)synthNode.Type, + ComplexType = (byte)synthNode.PlaybackType, + Volume = synthNode.Volume, + Pitch = synthNode.Pitch, + DelayTime = synthNode.DelayTime, + SControl = synthNode.SControl, + EgDelay = synthNode.EgDelay, + EgAttack = synthNode.EgAttack, + EgHold = synthNode.EgHold, + EgDecay = synthNode.EgDecay, + EgRelease = synthNode.EgRelease, + EgSustain = synthNode.EgSustain, + FType = synthNode.FilterType, + FCof1 = synthNode.FilterCutoff1, + FCof2 = synthNode.FilterCutoff2, + FReso = synthNode.FilterReso, + FReleaseOffset = synthNode.FilterReleaseOffset, + DryOName = synthNode.DryOName, + Mtxrtr = synthNode.Mtxrtr, + Dry0 = synthNode.Dry0, + Dry1 = synthNode.Dry1, + Dry2 = synthNode.Dry2, + Dry3 = synthNode.Dry3, + Dry4 = synthNode.Dry4, + Dry5 = synthNode.Dry5, + Dry6 = synthNode.Dry6, + Dry7 = synthNode.Dry7, + WetOName = synthNode.WetOName, + Wet0 = synthNode.Wet0, + Wet1 = synthNode.Wet1, + Wet2 = synthNode.Wet2, + Wet3 = synthNode.Wet3, + Wet4 = synthNode.Wet4, + Wet5 = synthNode.Wet5, + Wet6 = synthNode.Wet6, + Wet7 = synthNode.Wet7, + Wcnct0 = synthNode.Wcnct0, + Wcnct1 = synthNode.Wcnct1, + Wcnct2 = synthNode.Wcnct2, + Wcnct3 = synthNode.Wcnct3, + Wcnct4 = synthNode.Wcnct4, + Wcnct5 = synthNode.Wcnct5, + Wcnct6 = synthNode.Wcnct6, + Wcnct7 = synthNode.Wcnct7, + VoiceLimitGroupName = synthNode.VoiceLimitGroupReference, + VoiceLimitType = synthNode.VoiceLimitType, + VoiceLimitPriority = synthNode.VoiceLimitPriority, + VoiceLimitPhTime = synthNode.VoiceLimitProhibitionTime, + VoiceLimitPcdlt = synthNode.VoiceLimitPcdlt, + Pan3dVolumeOffset = synthNode.Pan3dVolumeOffset, + Pan3dVolumeGain = synthNode.Pan3dVolumeGain, + Pan3dAngleOffset = synthNode.Pan3dAngleOffset, + Pan3dAngleGain = synthNode.Pan3dAngleGain, + Pan3dDistanceOffset = synthNode.Pan3dDistanceOffset, + Pan3dDistanceGain = synthNode.Pan3dDistanceGain, + Dry0g = synthNode.Dry0g, + Dry1g = synthNode.Dry1g, + Dry2g = synthNode.Dry2g, + Dry3g = synthNode.Dry3g, + Dry4g = synthNode.Dry4g, + Dry5g = synthNode.Dry5g, + Dry6g = synthNode.Dry6g, + Dry7g = synthNode.Dry7g, + Wet0g = synthNode.Wet0g, + Wet1g = synthNode.Wet1g, + Wet2g = synthNode.Wet2g, + Wet3g = synthNode.Wet3g, + Wet4g = synthNode.Wet4g, + Wet5g = synthNode.Wet5g, + Wet6g = synthNode.Wet6g, + Wet7g = synthNode.Wet7g, + F1Type = synthNode.Filter1Type, + F1CofOffset = synthNode.Filter1CutoffOffset, + F1CofGain = synthNode.Filter1CutoffGain, + F1ResoOffset = synthNode.Filter1ResoOffset, + F1ResoGain = synthNode.Filter1ResoGain, + F2Type = synthNode.Filter2Type, + F2CofLowOffset = synthNode.Filter2CutoffLowerOffset, + F2CofLowGain = synthNode.Filter2CutoffLowerGain, + F2CofHighOffset = synthNode.Filter2CutoffHigherOffset, + F2CofHighGain = synthNode.Filter2CutoffHigherGain, + Probability = synthNode.PlaybackProbability, + NumberLmtChildren = synthNode.NLmtChildren, + Repeat = synthNode.Repeat, + ComboTime = synthNode.ComboTime, + ComboLoopBack = synthNode.ComboLoopBack, + }; + + if (synthNode.Type == BuilderSynthType.Single) + { + synthTable.LinkName = synthNode.SoundElementReference; + } + + else if (synthNode.Type == BuilderSynthType.WithChildren) + { + foreach (string trackReference in synthNode.Children) + { + synthTable.LinkName += trackReference + (char)0x0A; + } + } + + if (!string.IsNullOrEmpty(synthNode.AisacReference)) + { + BuilderAisacNode aisacNode = project.AisacNodes.First(aisac => aisac.Name == synthNode.AisacReference); + synthTable.AisacSetName = aisacNode.AisacName + "::" + aisacNode.Name + (char)0x0A; + } + + synthTables.Add(synthTable); + } + + cueSheetTables.Add(new SerializationCueSheetTable + { + TableData = CriTableSerializer.Serialize(synthTables, CriTableWriterSettings.AdxSettings), + Name = "SYNTH", + TableType = 2, + }); + + List junks = new List(); + + // Serialize the sound elements. + List soundElementTables = new List(); + foreach (BuilderSoundElementNode soundElementNode in project.SoundElementNodes) + { + CriAaxArchive aaxArchive = new CriAaxArchive(); + + if (!string.IsNullOrEmpty(soundElementNode.Intro)) + { + aaxArchive.Add(new CriAaxEntry + { + Flag = CriAaxEntryFlag.Intro, + FilePath = new FileInfo(Path.Combine(project.AudioDirectory.FullName, soundElementNode.Intro)), + }); + } + + if (!string.IsNullOrEmpty(soundElementNode.Loop)) + { + aaxArchive.Add(new CriAaxEntry + { + Flag = CriAaxEntryFlag.Loop, + FilePath = new FileInfo(Path.Combine(project.AudioDirectory.FullName, soundElementNode.Loop)), + }); + } + + byte[] data = new byte[0]; + + if (soundElementNode.Streaming) + { + CriCpkEntry entry = new CriCpkEntry(); + entry.Name = Path.GetFileName(soundElementNode.Name); + entry.DirectoryName = Path.GetDirectoryName(soundElementNode.Name); + entry.Id = (uint)cpkArchive.Count; + entry.UpdateDateTime = DateTime.Now; + entry.FilePath = new FileInfo(Path.GetTempFileName()); + cpkArchive.Add(entry); + + aaxArchive.Save(entry.FilePath.FullName); + junks.Add(entry.FilePath); + } + + else + { + data = aaxArchive.Save(); + } + + soundElementTables.Add(new SerializationSoundElementTable + { + Name = soundElementNode.Name, + Data = data, + FormatType = 0, + SoundFrequency = soundElementNode.SampleRate, + NumberChannels = soundElementNode.ChannelCount, + Streaming = soundElementNode.Streaming, + NumberSamples = soundElementNode.SampleCount, + }); + } + + cueSheetTables.Add(new SerializationCueSheetTable + { + TableData = CriTableSerializer.Serialize(soundElementTables, CriTableWriterSettings.AdxSettings), + Name = "SOUND_ELEMENT", + TableType = 4, + }); + + // Serialize the aisacs. + List aisacTables = new List(); + foreach (BuilderAisacNode aisacNode in project.AisacNodes) + { + List graphTables = new List(); + foreach (BuilderAisacGraphNode graphNode in aisacNode.Graphs) + { + List pointTables = new List(); + foreach (BuilderAisacPointNode pointNode in graphNode.Points) + { + pointTables.Add(new SerializationAisacPointTable + { + In = pointNode.X, + Out = pointNode.Y, + }); + } + + graphTables.Add(new SerializationAisacGraphTable + { + Points = CriTableSerializer.Serialize(pointTables, CriTableWriterSettings.AdxSettings), + Type = graphNode.Type, + InMax = graphNode.MaximumX, + InMin = graphNode.MinimumX, + OutMax = graphNode.MaximumY, + OutMin = graphNode.MinimumY, + }); + } + + aisacTables.Add(new SerializationAisacTable + { + Graph = CriTableSerializer.Serialize(graphTables, CriTableWriterSettings.AdxSettings), + Name = aisacNode.AisacName, + PathName = aisacNode.Name, + Type = aisacNode.Type, + RandomRange = aisacNode.RandomRange, + }); + } + + cueSheetTables.Add(new SerializationCueSheetTable + { + TableData = CriTableSerializer.Serialize(aisacTables, CriTableWriterSettings.AdxSettings), + Name = "ISAAC", + TableType = 5, + }); + + // Serialize the voice limit groups. + List voiceLimitGroupTables = new List(); + foreach (BuilderVoiceLimitGroupNode voiceLimitGroupNode in project.VoiceLimitGroupNodes) + { + voiceLimitGroupTables.Add(new SerializationVoiceLimitGroupTable + { + VoiceLimitGroupName = voiceLimitGroupNode.Name, + VoiceLimitGroupNum = voiceLimitGroupNode.MaxAmountOfInstances, + }); + } + + cueSheetTables.Add(new SerializationCueSheetTable + { + TableData = CriTableSerializer.Serialize(voiceLimitGroupTables, CriTableWriterSettings.AdxSettings), + Name = "VOICE_LIMIT_GROUP", + TableType = 6, + }); + + // Finally, serialize the CSB file. + CriTableSerializer.Serialize(outputFileName, cueSheetTables, CriTableWriterSettings.AdxSettings); + + if (cpkArchive.Count > 0) + { + cpkArchive.Save(Path.ChangeExtension(outputFileName, "cpk")); + } + + foreach (FileInfo junk in junks) + { + junk.Delete(); + } + } + } +} diff --git a/Source/CsbBuilder/BuilderNode/BuilderAisacGraphNode.cs b/Source/CsbBuilder/BuilderNode/BuilderAisacGraphNode.cs new file mode 100644 index 0000000..f39a9cd --- /dev/null +++ b/Source/CsbBuilder/BuilderNode/BuilderAisacGraphNode.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.ComponentModel; + +namespace CsbBuilder.BuilderNode +{ + public class BuilderAisacGraphNode : BuilderBaseNode + { + [Category("General")] + [Description("The type of this Graph. Currently, none of the types are known.")] + public byte Type { get; set; } + + [Category("Vector"), DisplayName("Maximum X")] + [Description("The maximum range that the X values in this Graph can reach.")] + public float MaximumX { get; set; } + + [Category("Vector"), DisplayName("Minimum X")] + [Description("The minimum range that the X values in this Graph can reach.")] + public float MinimumX { get; set; } + + [Category("Vector"), DisplayName("Maximum Y")] + [Description("The maximum range that the Y values in this Graph can reach.")] + public float MaximumY { get; set; } + + [Category("Vector"), DisplayName("Minimum Y")] + [Description("The minimum range that the Y values in this Graph can reach.")] + public float MinimumY { get; set; } + + [Category("Vector"), DisplayName("Points")] + [Description("The points of this Graph.")] + public List Points { get; set; } + + public BuilderAisacGraphNode() + { + Points = new List(); + } + } +} diff --git a/Source/CsbBuilder/BuilderNode/BuilderAisacNode.cs b/Source/CsbBuilder/BuilderNode/BuilderAisacNode.cs new file mode 100644 index 0000000..86cf513 --- /dev/null +++ b/Source/CsbBuilder/BuilderNode/BuilderAisacNode.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.ComponentModel; + +namespace CsbBuilder.BuilderNode +{ + public class BuilderAisacNode : BuilderBaseNode + { + [Category("General"), DisplayName("Aisac Name")] + [Description("The name of this Aisac. (Shouldn't be seen as the node name.)")] + public string AisacName { get; set; } + + [Category("General")] + [Description("The type of this Aisac. Currently, none of the types are known.")] + public byte Type { get; set; } + + [Category("Graph")] + [Description("The Graph's of this Aisac.")] + public List Graphs { get; set; } + + [Category("Graph"), DisplayName("Random Range (Unknown)")] + public byte RandomRange { get; set; } + + public BuilderAisacNode() + { + Graphs = new List(); + } + } +} diff --git a/Source/CsbBuilder/BuilderNode/BuilderAisacPointNode.cs b/Source/CsbBuilder/BuilderNode/BuilderAisacPointNode.cs new file mode 100644 index 0000000..e7c6a78 --- /dev/null +++ b/Source/CsbBuilder/BuilderNode/BuilderAisacPointNode.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.ComponentModel; + +namespace CsbBuilder.BuilderNode +{ + public class BuilderAisacPointNode : BuilderBaseNode + { + [Category("Vector"), DisplayName("X")] + [Description("The X dimension of this Point, relative to the Graph it's in.")] + public ushort X { get; set; } + + [Category("Vector"), DisplayName("Y")] + [Description("The Y dimension of this Point, relative to the Graph it's in.")] + public ushort Y { get; set; } + } +} diff --git a/Source/CsbBuilder/BuilderNode/BuilderBaseNode.cs b/Source/CsbBuilder/BuilderNode/BuilderBaseNode.cs new file mode 100644 index 0000000..10ec999 --- /dev/null +++ b/Source/CsbBuilder/BuilderNode/BuilderBaseNode.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.ComponentModel; +using System.Globalization; + +namespace CsbBuilder.BuilderNode +{ + public abstract class BuilderBaseNode : ICloneable + { + [Category("General"), ReadOnly(true)] + [Description("The name of this node. Shift JIS encoding is used for this in the Cue Sheet Binary, so try to avoid using special characters that this codec does not support.")] + public string Name { get; set; } + + public object Clone() + { + return MemberwiseClone(); + } + } +} diff --git a/Source/CsbBuilder/BuilderNode/BuilderCueNode.cs b/Source/CsbBuilder/BuilderNode/BuilderCueNode.cs new file mode 100644 index 0000000..1ca49f6 --- /dev/null +++ b/Source/CsbBuilder/BuilderNode/BuilderCueNode.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.ComponentModel; + +namespace CsbBuilder.BuilderNode +{ + public class BuilderCueNode : BuilderBaseNode + { + [Category("General"), DisplayName("Identifier")] + [Description("The identifier of this Cue. Must be unique for this Cue Sheet.")] + public uint Identifier { get; set; } + + [ReadOnly(true)] + [Category("General"), DisplayName("Synth Reference Path")] + [Description("The full path of the Synth (can be Track or Sound) that this Cue is referenced to. When this Cue is called to play in game, the referenced Synth will be played.")] + public string SynthReference { get; set; } + + [Category("General"), DisplayName("User Comment")] + [Description("User comment of this Cue. Shift JIS encoding is used for this in the Cue Sheet Binary, so try to avoid using special characters that this codec does not support.")] + public string UserComment { get; set; } + + [Category("General")] + [Description("Currently, none of the flags are known. However, value '1' seems to mute the Cue in-game.")] + public byte Flags { get; set; } + } +} diff --git a/Source/CsbBuilder/BuilderNode/BuilderSoundElementNode.cs b/Source/CsbBuilder/BuilderNode/BuilderSoundElementNode.cs new file mode 100644 index 0000000..418f8f5 --- /dev/null +++ b/Source/CsbBuilder/BuilderNode/BuilderSoundElementNode.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.ComponentModel; + +namespace CsbBuilder.BuilderNode +{ + public class BuilderSoundElementNode : BuilderBaseNode + { + [ReadOnly(true)] + [Category("General")] + [Description("The name of the audio in Project/Audio directory, which is going to play before the loop audio starts to play. Can be left empty, so that there will be no audio to play.")] + public string Intro { get; set; } + + [ReadOnly(true)] + [Category("General")] + [Description("The name of the audio in Project/Audio directory, which is going to be looped. Can be left empty, so that there will be no audio to loop in-game.")] + public string Loop { get; set; } + + [ReadOnly(true)] + [Category("General"), DisplayName("Channel Count")] + [Description("The channel count of BOTH Intro and Loop audio files. If they do not match, this will most likely result issues in-game, because the game ignores the channel count information in the audio file itself, but uses this info.")] + public byte ChannelCount { get; set; } + + [Category("General"), DisplayName("Streamed")] + [Description("Determines whether the audio files specified here are going to be streamed from a .CPK file, which is outside the .CSB file. Otherwise, it will be played from the memory. That's the best to be 'true', if the specified audio files are large.")] + public bool Streaming { get; set; } + + [ReadOnly(true)] + [Category("General"), DisplayName("Sample Rate")] + [Description("The sample rate of BOTH Intro and Loop audio files. If they do not match, this will most likely result issues in-game, because the game ignores the sample rate information in the audio file itself, but uses this info.")] + public uint SampleRate { get; set; } + + [ReadOnly(true)] + [Category("General"), DisplayName("Sample Count")] + [Description("The sample count of Intro and Loop files, added together.")] + public uint SampleCount { get; set; } + } +} diff --git a/Source/CsbBuilder/BuilderNode/BuilderSynthNode.cs b/Source/CsbBuilder/BuilderNode/BuilderSynthNode.cs new file mode 100644 index 0000000..c2f9035 --- /dev/null +++ b/Source/CsbBuilder/BuilderNode/BuilderSynthNode.cs @@ -0,0 +1,436 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.ComponentModel; +using System.Reflection; + +namespace CsbBuilder.BuilderNode +{ + public enum BuilderSynthType + { + Single, + WithChildren, + } + + public enum BuilderSynthPlaybackType + { + [Browsable(false)] + Normal = -1, + Polyphonic = 0, + RandomNoRepeat = 1, + Sequential = 2, + Random = 3, + } + + public class BuilderSynthNode : BuilderBaseNode + { + private BuilderSynthPlaybackType playbackType = BuilderSynthPlaybackType.Polyphonic; + private Random random = new Random(); + private List indices = new List(); + private int nextChild = -1; + private byte playbackProbability = 100; + + [Browsable(false)] + public BuilderSynthType Type { get; set; } + + [Category("General"), DisplayName("Playback Type")] + [Description("The playback type of this Synth.")] + public BuilderSynthPlaybackType PlaybackType + { + get + { + if (Type == BuilderSynthType.Single) + { + return BuilderSynthPlaybackType.Normal; + } + + return playbackType; + } + + set + { + if (Type == BuilderSynthType.Single || value == BuilderSynthPlaybackType.Normal) + { + return; + } + + playbackType = value; + } + } + + [ReadOnly(true)] + [Category("General"), DisplayName("Sound Element Reference Path")] + [Description("The Sound that this Synth is referenced to. This will be empty if this Synth represents a Track.")] + public string SoundElementReference { get; set; } + + [Browsable(false)] + public List Children { get; set; } + + [ReadOnly(true)] + [Category("General"), DisplayName("Aisac Reference Path")] + [Description("The Aisac that this Synth is referenced to.")] + public string AisacReference { get; set; } + + [Category("General")] + [Description("The volume of this Synth.")] + public short Volume { get; set; } + + [Category("General")] + [Description("The pitch of this Synth.")] + public short Pitch { get; set; } + + [Category("General"), DisplayName("Delay Time")] + [Description("The delay of this Synth. The time is in miliseconds.")] + public uint DelayTime { get; set; } + + [Category("Unknown"), DisplayName("S Control")] + public byte SControl { get; set; } + + [Category("EG"), DisplayName("EG Delay")] + public ushort EgDelay { get; set; } + + [Category("EG"), DisplayName("EG Attack")] + public ushort EgAttack { get; set; } + + [Category("EG"), DisplayName("EG Hold")] + public ushort EgHold { get; set; } + + [Category("EG"), DisplayName("EG Decay")] + public ushort EgDecay { get; set; } + + [Category("EG"), DisplayName("EG Release")] + public ushort EgRelease { get; set; } + + [Category("EG"), DisplayName("EG Sustain")] + public ushort EgSustain { get; set; } + + [Category("Filter (Unknown)"), DisplayName("Filter Type")] + public byte FilterType { get; set; } + + [Category("Filter (Unknown)"), DisplayName("Filter Cutoff 1")] + public ushort FilterCutoff1 { get; set; } + + [Category("Filter (Unknown)"), DisplayName("Filter Cutoff 2")] + public ushort FilterCutoff2 { get; set; } + + [Category("Filter (Unknown)"), DisplayName("Filter RESO (Unknown)")] + public ushort FilterReso { get; set; } + + [Category("Filter (Unknown)"), DisplayName("Filter Release Offset")] + public byte FilterReleaseOffset { get; set; } + + [Category("Dryness"), DisplayName("Dry O Name (Unknown)")] + public string DryOName { get; set; } + + [Category("Unknown")] + public string Mtxrtr { get; set; } + + [Category("Dryness"), DisplayName("Dry 0")] + public ushort Dry0 { get; set; } + + [Category("Dryness"), DisplayName("Dry 1")] + public ushort Dry1 { get; set; } + + [Category("Dryness"), DisplayName("Dry 2")] + public ushort Dry2 { get; set; } + + [Category("Dryness"), DisplayName("Dry 3")] + public ushort Dry3 { get; set; } + + [Category("Dryness"), DisplayName("Dry 4")] + public ushort Dry4 { get; set; } + + [Category("Dryness"), DisplayName("Dry 5")] + public ushort Dry5 { get; set; } + + [Category("Dryness"), DisplayName("Dry 6")] + public ushort Dry6 { get; set; } + + [Category("Dryness"), DisplayName("Dry 7")] + public ushort Dry7 { get; set; } + + [Category("Wetness"), DisplayName("Wet O Name (Unknown)")] + public string WetOName { get; set; } + + [Category("Wetness"), DisplayName("Wet 0")] + public ushort Wet0 { get; set; } + + [Category("Wetness"), DisplayName("Wet 1")] + public ushort Wet1 { get; set; } + + [Category("Wetness"), DisplayName("Wet 2")] + public ushort Wet2 { get; set; } + + [Category("Wetness"), DisplayName("Wet 3")] + public ushort Wet3 { get; set; } + + [Category("Wetness"), DisplayName("Wet 4")] + public ushort Wet4 { get; set; } + + [Category("Wetness"), DisplayName("Wet 5")] + public ushort Wet5 { get; set; } + + [Category("Wetness"), DisplayName("Wet 6")] + public ushort Wet6 { get; set; } + + [Category("Wetness"), DisplayName("Wet 7")] + public ushort Wet7 { get; set; } + + [Category("Wcnct (Unknown)"), DisplayName("Wcnct 0")] + public string Wcnct0 { get; set; } + + [Category("Wcnct (Unknown)"), DisplayName("Wcnct 1")] + public string Wcnct1 { get; set; } + + [Category("Wcnct (Unknown)"), DisplayName("Wcnct 2")] + public string Wcnct2 { get; set; } + + [Category("Wcnct (Unknown)"), DisplayName("Wcnct 3")] + public string Wcnct3 { get; set; } + + [Category("Wcnct (Unknown)"), DisplayName("Wcnct 4")] + public string Wcnct4 { get; set; } + + [Category("Wcnct (Unknown)"), DisplayName("Wcnct 5")] + public string Wcnct5 { get; set; } + + [Category("Wcnct (Unknown)"), DisplayName("Wcnct 6")] + public string Wcnct6 { get; set; } + + [Category("Wcnct (Unknown)"), DisplayName("Wcnct 7")] + public string Wcnct7 { get; set; } + + [ReadOnly(true)] + [Category("Voice Limit"), DisplayName("Voice Limit Group Reference")] + public string VoiceLimitGroupReference { get; set; } + + [Category("Voice Limit"), DisplayName("Voice Limit Type")] + public byte VoiceLimitType { get; set; } + + [Category("Voice Limit"), DisplayName("Voice Limit Priority")] + public byte VoiceLimitPriority { get; set; } + + [Category("Voice Limit"), DisplayName("Voice Limit Prohibition Time")] + public ushort VoiceLimitProhibitionTime { get; set; } + + [Category("Voice Limit"), DisplayName("Voice Limit Pcdlt (Unknown)")] + public sbyte VoiceLimitPcdlt { get; set; } + + [Category("Pan 3D"), DisplayName("Pan 3D Volume Offset")] + public short Pan3dVolumeOffset { get; set; } + + [Category("Pan 3D"), DisplayName("Pan 3D Volume Gain")] + public short Pan3dVolumeGain { get; set; } + + [Category("Pan 3D"), DisplayName("Pan 3D Angle Offset")] + public short Pan3dAngleOffset { get; set; } + + [Category("Pan 3D"), DisplayName("Pan 3D Angle Gain")] + public short Pan3dAngleGain { get; set; } + + [Category("Pan 3D"), DisplayName("Pan 3D Distance Offset")] + public short Pan3dDistanceOffset { get; set; } + + [Category("Pan 3D"), DisplayName("Pan 3D Distance Gain")] + public short Pan3dDistanceGain { get; set; } + + [Category("Dryness"), DisplayName("Dry 0 Gain")] + public byte Dry0g { get; set; } + + [Category("Dryness"), DisplayName("Dry 1 Gain")] + public byte Dry1g { get; set; } + + [Category("Dryness"), DisplayName("Dry 2 Gain")] + public byte Dry2g { get; set; } + + [Category("Dryness"), DisplayName("Dry 3 Gain")] + public byte Dry3g { get; set; } + + [Category("Dryness"), DisplayName("Dry 4 Gain")] + public byte Dry4g { get; set; } + + [Category("Dryness"), DisplayName("Dry 5 Gain")] + public byte Dry5g { get; set; } + + [Category("Dryness"), DisplayName("Dry 6 Gain")] + public byte Dry6g { get; set; } + + [Category("Dryness"), DisplayName("Dry 7 Gain")] + public byte Dry7g { get; set; } + + [Category("Wetness"), DisplayName("Wet 0 Gain")] + public byte Wet0g { get; set; } + + [Category("Wetness"), DisplayName("Wet 1 Gain")] + public byte Wet1g { get; set; } + + [Category("Wetness"), DisplayName("Wet 2 Gain")] + public byte Wet2g { get; set; } + + [Category("Wetness"), DisplayName("Wet 3 Gain")] + public byte Wet3g { get; set; } + + [Category("Wetness"), DisplayName("Wet 4 Gain")] + public byte Wet4g { get; set; } + + [Category("Wetness"), DisplayName("Wet 5 Gain")] + public byte Wet5g { get; set; } + + [Category("Wetness"), DisplayName("Wet 6 Gain")] + public byte Wet6g { get; set; } + + [Category("Wetness"), DisplayName("Wet 7 Gain")] + public byte Wet7g { get; set; } + + [Category("Filter 1 (Unknown)"), DisplayName("Filter 1 Type")] + public byte Filter1Type { get; set; } + + [Category("Filter 1 (Unknown)"), DisplayName("Filter 1 Cutoff Offset")] + public ushort Filter1CutoffOffset { get; set; } + + [Category("Filter 1 (Unknown)"), DisplayName("Filter 1 Cutoff Gain")] + public ushort Filter1CutoffGain { get; set; } + + [Category("Filter 1 (Unknown)"), DisplayName("Filter 1 RESO (Unknown) Offset")] + public ushort Filter1ResoOffset { get; set; } + + [Category("Filter 1 (Unknown)"), DisplayName("Filter 1 RESO (Unknown) Gain")] + public ushort Filter1ResoGain { get; set; } + + [Category("Filter 2 (Unknown)"), DisplayName("Filter 2 Type")] + public byte Filter2Type { get; set; } + + [Category("Filter 2 (Unknown)"), DisplayName("Filter 2 Cutoff Lower Offset")] + public ushort Filter2CutoffLowerOffset { get; set; } + + [Category("Filter 2 (Unknown)"), DisplayName("Filter 2 Cutoff Lower Gain")] + public ushort Filter2CutoffLowerGain { get; set; } + + [Category("Filter 2 (Unknown)"), DisplayName("Filter 2 Cutoff Higher Offset")] + public ushort Filter2CutoffHigherOffset { get; set; } + + [Category("Filter 2 (Unknown)"), DisplayName("Filter 2 Cutoff Higher Gain")] + public ushort Filter2CutoffHigherGain { get; set; } + + [Category("General"), DisplayName("Playback Probability")] + [Description("The probability of this Synth being played. A random number (max 100) will be chosen and if this number is lower than this parameter (or equals), it will be played. This does not do anything if this Synth represents a Track.")] + public byte PlaybackProbability + { + get + { + if (Type == BuilderSynthType.WithChildren) + { + return 0; + } + + return playbackProbability; + } + + set + { + playbackProbability = value > 100 ? (byte)100 : value; + } + } + + [Category("Unknown"), DisplayName("N LMT Children")] + public byte NLmtChildren { get; set; } + + [Category("General"), DisplayName("Repeat")] + public byte Repeat { get; set; } + + [Category("General"), DisplayName("Combo Time")] + public uint ComboTime { get; set; } + + [Category("General"), DisplayName("Combo Loop Back")] + public byte ComboLoopBack { get; set; } + + [Browsable(false)] + public bool PlayThisTurn + { + get + { + return random.Next(100) <= PlaybackProbability; + } + } + + [Browsable(false)] + public int RandomChildNode + { + get + { + if (playbackType == BuilderSynthPlaybackType.RandomNoRepeat) + { + if (indices.Count == Children.Count) + { + indices.Clear(); + } + + int nextChild = random.Next(Children.Count); + + while (indices.Contains(nextChild)) + { + nextChild = random.Next(Children.Count); + } + + indices.Add(nextChild); + return nextChild; + } + + return random.Next(Children.Count); + } + } + + [Browsable(false)] + public int NextChildNode + { + get + { + if (nextChild + 1 == Children.Count) + { + nextChild = -1; + } + + return ++nextChild; + } + } + + public BuilderSynthNode() + { + Children = new List(); + + Volume = 1000; + + EgSustain = 1000; + + Dry0g = 255; + Dry1g = 255; + Dry2g = 255; + Dry3g = 255; + Dry4g = 255; + Dry5g = 255; + Dry6g = 255; + Dry7g = 255; + + Wet0g = 255; + Wet1g = 255; + Wet2g = 255; + Wet3g = 255; + Wet4g = 255; + Wet5g = 255; + Wet6g = 255; + Wet7g = 255; + + Pan3dAngleGain = 1000; + Pan3dDistanceGain = 1000; + Pan3dDistanceOffset = 1000; + Pan3dVolumeGain = 1000; + Pan3dVolumeOffset = 1000; + + Filter2CutoffHigherGain = 1000; + Filter2CutoffHigherOffset = 1000; + Filter2CutoffLowerGain = 1000; + } + } +} diff --git a/Source/CsbBuilder/BuilderNode/BuilderVoiceLimitGroupNode.cs b/Source/CsbBuilder/BuilderNode/BuilderVoiceLimitGroupNode.cs new file mode 100644 index 0000000..ba32ff9 --- /dev/null +++ b/Source/CsbBuilder/BuilderNode/BuilderVoiceLimitGroupNode.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.ComponentModel; + +namespace CsbBuilder.BuilderNode +{ + public class BuilderVoiceLimitGroupNode : BuilderBaseNode + { + [Category("General"), DisplayName("Max Amount of Instances")] + public uint MaxAmountOfInstances { get; set; } + } +} diff --git a/Source/CsbBuilder/CreateNewProjectForm.Designer.cs b/Source/CsbBuilder/CreateNewProjectForm.Designer.cs new file mode 100644 index 0000000..e640133 --- /dev/null +++ b/Source/CsbBuilder/CreateNewProjectForm.Designer.cs @@ -0,0 +1,171 @@ +namespace CsbBuilder +{ + partial class CreateNewProjectForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.button1 = new System.Windows.Forms.Button(); + this.maskedTextBox2 = new System.Windows.Forms.MaskedTextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.maskedTextBox1 = new System.Windows.Forms.MaskedTextBox(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.button1); + this.groupBox1.Controls.Add(this.maskedTextBox2); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.maskedTextBox1); + this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox1.Location = new System.Drawing.Point(12, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(529, 102); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Project"; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button1.Location = new System.Drawing.Point(448, 68); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 4; + this.button1.Text = "Browse"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // maskedTextBox2 + // + this.maskedTextBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.maskedTextBox2.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.maskedTextBox2.Location = new System.Drawing.Point(6, 70); + this.maskedTextBox2.Name = "maskedTextBox2"; + this.maskedTextBox2.Size = new System.Drawing.Size(436, 20); + this.maskedTextBox2.TabIndex = 3; + this.maskedTextBox2.TextChanged += new System.EventHandler(this.maskedTextBox2_TextChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(3, 55); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(32, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Path:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(3, 16); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(38, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Name:"; + // + // maskedTextBox1 + // + this.maskedTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.maskedTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.maskedTextBox1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.maskedTextBox1.Location = new System.Drawing.Point(6, 32); + this.maskedTextBox1.Name = "maskedTextBox1"; + this.maskedTextBox1.Size = new System.Drawing.Size(517, 20); + this.maskedTextBox1.TabIndex = 0; + this.maskedTextBox1.TextChanged += new System.EventHandler(this.maskedTextBox1_TextChanged); + // + // button3 + // + this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button3.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.button3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button3.Location = new System.Drawing.Point(466, 120); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 6; + this.button3.Text = "Cancel"; + this.button3.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.DialogResult = System.Windows.Forms.DialogResult.OK; + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button2.Location = new System.Drawing.Point(385, 120); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 5; + this.button2.Text = "OK"; + this.button2.UseVisualStyleBackColor = true; + // + // CreateNewProjectForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(553, 148); + this.Controls.Add(this.button2); + this.Controls.Add(this.button3); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MaximumSize = new System.Drawing.Size(928, 187); + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(464, 187); + this.Name = "CreateNewProjectForm"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Create New Project"; + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.MaskedTextBox maskedTextBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.MaskedTextBox maskedTextBox1; + } +} \ No newline at end of file diff --git a/Source/CsbBuilder/CreateNewProjectForm.cs b/Source/CsbBuilder/CreateNewProjectForm.cs new file mode 100644 index 0000000..6006d22 --- /dev/null +++ b/Source/CsbBuilder/CreateNewProjectForm.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.IO; + +using CsbBuilder.Project; + +namespace CsbBuilder +{ + public partial class CreateNewProjectForm : Form + { + private CsbProject project = new CsbProject(); + + public CsbProject Project + { + get + { + return project; + } + } + + public CreateNewProjectForm(string name) : this() + { + maskedTextBox1.Text = Path.GetFileNameWithoutExtension(name); + + string directoryName = Path.GetDirectoryName(name); + maskedTextBox2.Text = !string.IsNullOrEmpty(directoryName) ? Path.ChangeExtension(name, null) : Path.Combine(Program.ProjectsPath, name); + } + + public CreateNewProjectForm() + { + InitializeComponent(); + + maskedTextBox1.Text = project.Name; + maskedTextBox2.Text = project.Directory.FullName; + } + + private void maskedTextBox1_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBox1.Text)) + { + MessageBox.Show("Name cannot be empty.", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + project.Name = maskedTextBox1.Text; + } + + private void button1_Click(object sender, EventArgs e) + { + using (FolderBrowserDialog selectFolder = new FolderBrowserDialog()) + { + if (selectFolder.ShowDialog() == DialogResult.OK) + { + maskedTextBox2.Text = selectFolder.SelectedPath; + } + } + } + + private void maskedTextBox2_TextChanged(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBox2.Text)) + { + MessageBox.Show("Path cannot be empty.", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + project.Directory = new DirectoryInfo(maskedTextBox2.Text); + } + } +} diff --git a/Source/CsbBuilder/CreateNewProjectForm.resx b/Source/CsbBuilder/CreateNewProjectForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Source/CsbBuilder/CreateNewProjectForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Source/CsbBuilder/CriTableAax.cs b/Source/CsbBuilder/CriTableAax.cs deleted file mode 100644 index eecf69e..0000000 --- a/Source/CsbBuilder/CriTableAax.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.IO; -using SonicAudioLib.CriMw.Serialization; - -using System; -using System.Xml.Serialization; - -namespace CsbBuilder -{ - [CriSerializable("AAX")] - [Serializable] - public class CriTableAax - { - public enum EnumLoopFlag : byte - { - Intro = 0, - Loop = 1, - }; - - private byte[] _data = new byte[0]; - private EnumLoopFlag _lpflg = EnumLoopFlag.Intro; - - [CriField("data", 0)] - public byte[] Data - { - get - { - return _data; - } - set - { - _data = value; - } - } - - [CriField("lpflg", 1)] - public EnumLoopFlag LoopFlag - { - get - { - return _lpflg; - } - set - { - _lpflg = value; - } - } - } -} diff --git a/Source/CsbBuilder/CriTableAisacGraph.cs b/Source/CsbBuilder/CriTableAisacGraph.cs deleted file mode 100644 index f69cca0..0000000 --- a/Source/CsbBuilder/CriTableAisacGraph.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using SonicAudioLib.CriMw; -using SonicAudioLib.CriMw.Serialization; - -using System; -using System.Xml.Serialization; - -namespace CsbBuilder -{ - [Serializable] - [CriSerializable("TBLIGR")] - public class CriTableAisacGraph - { - private byte _type = 0; - private float _imax = 0; - private float _imin = 0; - private float _omax = 0; - private float _omin = 0; - - [CriField("type", 0)] - public byte Type - { - get - { - return _type; - } - set - { - _type = value; - } - } - - [CriField("imax", 1)] - public float InMaximum - { - get - { - return _imax; - } - set - { - _imax = value; - } - } - - [CriField("imin", 2)] - public float InMinimum - { - get - { - return _imin; - } - set - { - _imin = value; - } - } - - [CriField("omax", 3)] - public float OutMaximum - { - get - { - return _omax; - } - set - { - _omax = value; - } - } - - [CriField("omin", 4)] - public float OutMinimum - { - get - { - return _omin; - } - set - { - _omin = value; - } - } - - [CriIgnore] - public List PointsList { get; set; } - - [XmlIgnore] - [CriField("points", 5)] - public byte[] Points - { - get - { - return CriTableSerializer.Serialize(PointsList, CriTableWriterSettings.AdxSettings); - } - - set - { - PointsList = CriTableSerializer.Deserialize(value); - } - } - } -} diff --git a/Source/CsbBuilder/CriTableCueSheet.cs b/Source/CsbBuilder/CriTableCueSheet.cs deleted file mode 100644 index daf5920..0000000 --- a/Source/CsbBuilder/CriTableCueSheet.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using SonicAudioLib.CriMw; -using SonicAudioLib.CriMw.Serialization; -using System.Linq; - -using System.Xml.Serialization; - -namespace CsbBuilder -{ - [Serializable] - [CriSerializable("TBLCSB")] - public class CriTableCueSheet - { - public enum EnumTableType : byte - { - None = 0, - Cue = 1, - Synth = 2, - SoundElement = 4, - Aisac = 5, - VoiceLimitGroup = 6, - VersionInfo = 7, - }; - - private string _name = string.Empty; - private EnumTableType _ttype = EnumTableType.None; - - [CriField("name", 0)] - public string Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - - [CriField("ttype", 1)] - public EnumTableType TableType - { - get - { - return _ttype; - } - set - { - _ttype = value; - } - } - - [CriIgnore] - [XmlArray] - [XmlArrayItem(typeof(CriTableCue))] - [XmlArrayItem(typeof(CriTableSynth))] - [XmlArrayItem(typeof(CriTableSoundElement))] - [XmlArrayItem(typeof(CriTableAisac))] - [XmlArrayItem(typeof(CriTableVoiceLimitGroup))] - [XmlArrayItem(typeof(CriTableVersionInfo))] - public ArrayList DataList { get; set; } - - [XmlIgnore] - [CriField("utf", 2)] - public byte[] Data - { - get - { - switch (_ttype) - { - case EnumTableType.None: - return new byte[0]; - - case EnumTableType.Cue: - return CriTableSerializer.Serialize(DataList.OfType().ToList(), CriTableWriterSettings.AdxSettings); - - case EnumTableType.Synth: - return CriTableSerializer.Serialize(DataList.OfType().ToList(), CriTableWriterSettings.AdxSettings); - - case EnumTableType.SoundElement: - return CriTableSerializer.Serialize(DataList.OfType().ToList(), CriTableWriterSettings.AdxSettings); - - case EnumTableType.Aisac: - return CriTableSerializer.Serialize(DataList.OfType().ToList(), CriTableWriterSettings.AdxSettings); - - case EnumTableType.VoiceLimitGroup: - return CriTableSerializer.Serialize(DataList.OfType().ToList(), CriTableWriterSettings.AdxSettings); - - case EnumTableType.VersionInfo: - return CriTableSerializer.Serialize(DataList.OfType().ToList(), CriTableWriterSettings.AdxSettings); - } - - throw new ArgumentException($"Unknown table type {_ttype}, please report the error with the file.", "_ttype"); - } - - set - { - switch (_ttype) - { - case EnumTableType.Cue: - DataList = CriTableSerializer.Deserialize(value, typeof(CriTableCue)); - break; - - case EnumTableType.Synth: - DataList = CriTableSerializer.Deserialize(value, typeof(CriTableSynth)); - break; - - case EnumTableType.SoundElement: - DataList = CriTableSerializer.Deserialize(value, typeof(CriTableSoundElement)); - break; - - case EnumTableType.Aisac: - DataList = CriTableSerializer.Deserialize(value, typeof(CriTableAisac)); - break; - - case EnumTableType.VoiceLimitGroup: - DataList = CriTableSerializer.Deserialize(value, typeof(CriTableVoiceLimitGroup)); - break; - - case EnumTableType.VersionInfo: - DataList = CriTableSerializer.Deserialize(value, typeof(CriTableVersionInfo)); - break; - - default: - throw new ArgumentException($"Unknown table type {_ttype}, please report the error with the file.", "_ttype"); - } - } - } - } -} diff --git a/Source/CsbBuilder/CriTableSoundElement.cs b/Source/CsbBuilder/CriTableSoundElement.cs deleted file mode 100644 index b60e24e..0000000 --- a/Source/CsbBuilder/CriTableSoundElement.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using SonicAudioLib.CriMw; -using SonicAudioLib.CriMw.Serialization; - -using System; -using System.Xml.Serialization; - -namespace CsbBuilder -{ - [Serializable] - [CriSerializable("TBLSDL")] - public class CriTableSoundElement - { - public enum EnumFormat : byte - { - Adx = 0, - Dsp = 4, - }; - - private string _name = string.Empty; - private EnumFormat _fmt = EnumFormat.Adx; - private byte _nch = 0; - private bool _stmflg = false; - private uint _sfreq = 0; - private uint _nsmpl = 0; - - [CriField("name", 0)] - public string Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - - [CriIgnore] - public List DataList { get; set; } - - [XmlIgnore] - [CriField("data", 1)] - public byte[] Data - { - get - { - return CriTableSerializer.Serialize(DataList, CriTableWriterSettings.AdxSettings); - } - - set - { - if (value.Length > 0) - { - DataList = CriTableSerializer.Deserialize(value); - } - } - } - - [CriField("fmt", 2)] - public EnumFormat Format - { - get - { - return _fmt; - } - set - { - _fmt = value; - } - } - - [CriField("nch", 3)] - public byte NumberChannels - { - get - { - return _nch; - } - set - { - _nch = value; - } - } - - [CriField("stmflg", 4)] - public bool Streaming - { - get - { - return _stmflg; - } - set - { - _stmflg = value; - } - } - - [CriField("sfreq", 5)] - public uint SoundFrequence - { - get - { - return _sfreq; - } - set - { - _sfreq = value; - } - } - - [CriField("nsmpl", 6)] - public uint NumberSamples - { - get - { - return _nsmpl; - } - set - { - _nsmpl = value; - } - } - } -} diff --git a/Source/CsbBuilder/CsbBuilder.csproj b/Source/CsbBuilder/CsbBuilder.csproj index 50fcbb5..5239c59 100644 --- a/Source/CsbBuilder/CsbBuilder.csproj +++ b/Source/CsbBuilder/CsbBuilder.csproj @@ -4,8 +4,8 @@ Debug AnyCPU - {4CF49665-3DFD-4A5C-B231-B97842F091B9} - Exe + {70A6A571-23EC-4B2C-A579-1E6812DDC34E} + WinExe Properties CsbBuilder CsbBuilder @@ -32,39 +32,123 @@ prompt 4 + + + + + ..\..\packages\NAudio.1.8.0\lib\net35\NAudio.dll + True + - + + + - - - - - - - - - - + + + + + + + + + + + Form + + + ExceptionForm.cs + + + Form + + + CreateNewProjectForm.cs + + + + + + Form + + + SetAudioForm.cs + + + Form + + + MainForm.cs + + + + + + + + + + + + + Form + + + SetReferenceForm.cs + + + ExceptionForm.cs + + + CreateNewProjectForm.cs + + + SetAudioForm.cs + + + MainForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + True - True Resources.resx + True + + + SetReferenceForm.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + {63138773-1f47-474c-9345-15eb6183ecc6} @@ -72,10 +156,70 @@ - - ResXFileCodeGenerator - Resources.Designer.cs - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Source/CsbBuilder/Extensions.cs b/Source/CsbBuilder/Extensions.cs new file mode 100644 index 0000000..e1e703f --- /dev/null +++ b/Source/CsbBuilder/Extensions.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CsbBuilder +{ + public static class Extensions + { + public static TreeNode CreateNodesByFullPath(this TreeView treeView, string path) + { + string fullPath = string.Empty; + TreeNode currentNode = null; + + foreach (string node in path.Split('/')) + { + fullPath += node; + + TreeNode treeNode = treeView.FindNodeByFullPath(fullPath); + bool notFound = treeNode == null; + + if (notFound) + { + treeNode = new TreeNode(node); + treeNode.Name = treeNode.Text; + } + + if (currentNode != null && notFound) + { + currentNode.Nodes.Add(treeNode); + } + + else if (currentNode == null && notFound) + { + treeView.Nodes.Add(treeNode); + } + + currentNode = treeNode; + fullPath += '/'; + } + + return currentNode; + } + + + public static TreeNode FindNodeByFullPath(this TreeNode treeNode, string path) + { + foreach (TreeNode node in treeNode.Nodes) + { + if (node.FullPath == path) + { + return node; + } + + TreeNode childNode = node.FindNodeByFullPath(path); + if (childNode != null) + { + return childNode; + } + } + + return null; + } + + public static TreeNode FindNodeByFullPath(this TreeView treeView, string path) + { + foreach (TreeNode node in treeView.Nodes) + { + if (node.FullPath == path) + { + return node; + } + + TreeNode childNode = node.FindNodeByFullPath(path); + if (childNode != null) + { + return childNode; + } + } + + return null; + } + } +} diff --git a/Source/CsbBuilder/Importer/CsbImporter.cs b/Source/CsbBuilder/Importer/CsbImporter.cs new file mode 100644 index 0000000..a44ee0a --- /dev/null +++ b/Source/CsbBuilder/Importer/CsbImporter.cs @@ -0,0 +1,305 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.ComponentModel; + +using CsbBuilder.Audio; +using CsbBuilder.Project; +using CsbBuilder.BuilderNode; +using CsbBuilder.Serialization; + +using SonicAudioLib.IO; +using SonicAudioLib.CriMw.Serialization; +using SonicAudioLib.Archive; + +using System.Windows.Forms; + +namespace CsbBuilder.Importer +{ + public static class CsbImporter + { + public static void Import(string path, CsbProject project) + { + // Find the CPK first + string cpkPath = Path.ChangeExtension(path, "cpk"); + bool exists = File.Exists(cpkPath); + + CriCpkArchive cpkArchive = new CriCpkArchive(); + + // First, deserialize the main tables + List cueSheets = CriTableSerializer.Deserialize(path); + + /* Deserialize all the tables we need to import. + * None = 0, + * Cue = 1, + * Synth = 2, + * SoundElement = 4, + * Aisac = 5, + * VoiceLimitGroup = 6, + * VersionInfo = 7, + */ + + List cueTables = CriTableSerializer.Deserialize(cueSheets.FirstOrDefault(table => table.TableType == 1).TableData); + List synthTables = CriTableSerializer.Deserialize(cueSheets.FirstOrDefault(table => table.TableType == 2).TableData); + List soundElementTables = CriTableSerializer.Deserialize(cueSheets.FirstOrDefault(table => table.TableType == 4).TableData); + List aisacTables = CriTableSerializer.Deserialize(cueSheets.FirstOrDefault(table => table.TableType == 5).TableData); + + // voice limit groups appeared in the later versions, so check if it exists. + List voiceLimitGroupTables = new List(); + + if (cueSheets.Exists(table => table.TableType == 6)) + { + voiceLimitGroupTables = CriTableSerializer.Deserialize(cueSheets.FirstOrDefault(table => table.TableType == 6).TableData); + } + + // Deserialize Sound Element tables + + // BUT BEFORE THAT, see if there's any sound element with Streamed on + if (soundElementTables.Exists(soundElementTable => soundElementTable.Streaming)) + { + if (!exists) + { + throw new Exception("Cannot find CPK file for this CSB file. Please ensure that the CPK file is in the directory where the CSB file is, and has the same name as the CSB file, but with .CPK extension."); + } + + cpkArchive.Load(cpkPath); + } + + foreach (SerializationSoundElementTable soundElementTable in soundElementTables) + { + BuilderSoundElementNode soundElementNode = new BuilderSoundElementNode(); + soundElementNode.Name = soundElementTable.Name; + soundElementNode.ChannelCount = soundElementTable.NumberChannels; + soundElementNode.SampleRate = soundElementTable.SoundFrequency; + soundElementNode.Streaming = soundElementTable.Streaming; + + CriAaxArchive aaxArchive = new CriAaxArchive(); + + byte[] aaxData = soundElementTable.Data; + + if (exists && soundElementNode.Streaming) + { + using (Stream source = File.OpenRead(cpkPath)) + using (Stream entrySource = cpkArchive.GetByPath(soundElementTable.Name).Open(source)) + { + aaxData = ((Substream)entrySource).ToArray(); + } + } + + aaxArchive.Load(aaxData); + + foreach (CriAaxEntry entry in aaxArchive) + { + byte[] data = new byte[entry.Length]; + Array.Copy(aaxData, entry.Position, data, 0, data.Length); + + string outputFileName = Path.Combine(project.AudioDirectory.FullName, soundElementTable.Name.Replace('/', '_')); + if (entry.Flag == CriAaxEntryFlag.Intro) + { + outputFileName += "_Intro.adx"; + soundElementNode.Intro = Path.GetFileName(outputFileName); + } + + else if (entry.Flag == CriAaxEntryFlag.Loop) + { + outputFileName += "_Loop.adx"; + soundElementNode.Loop = Path.GetFileName(outputFileName); + } + + File.WriteAllBytes(outputFileName, data); + + // Read the samples just in case + soundElementNode.SampleCount += AdxConverter.LoadHeader(outputFileName).SampleCount; + } + + project.SoundElementNodes.Add(soundElementNode); + } + + // Deserialize Voice Limit Group tables + foreach (SerializationVoiceLimitGroupTable voiceLimitGroupTable in voiceLimitGroupTables) + { + project.VoiceLimitGroupNodes.Add(new BuilderVoiceLimitGroupNode + { + Name = voiceLimitGroupTable.VoiceLimitGroupName, + MaxAmountOfInstances = voiceLimitGroupTable.VoiceLimitGroupNum, + }); + } + + // Deserialize Aisac tables + foreach (SerializationAisacTable aisacTable in aisacTables) + { + BuilderAisacNode aisacNode = new BuilderAisacNode(); + aisacNode.Name = aisacTable.PathName; + aisacNode.AisacName = aisacTable.Name; + aisacNode.Type = aisacTable.Type; + aisacNode.RandomRange = aisacTable.RandomRange; + + // Deserialize the graphs + List graphTables = CriTableSerializer.Deserialize(aisacTable.Graph); + foreach (SerializationAisacGraphTable graphTable in graphTables) + { + BuilderAisacGraphNode graphNode = new BuilderAisacGraphNode(); + graphNode.Name = $"Graph{aisacNode.Graphs.Count}"; + graphNode.Type = graphTable.Type; + graphNode.MaximumX = graphTable.InMax; + graphNode.MinimumX = graphTable.InMin; + graphNode.MaximumY = graphTable.OutMax; + graphNode.MinimumY = graphTable.OutMin; + + // Deserialize the points + List pointTables = CriTableSerializer.Deserialize(graphTable.Points); + foreach (SerializationAisacPointTable pointTable in pointTables) + { + BuilderAisacPointNode pointNode = new BuilderAisacPointNode(); + pointNode.Name = $"Point{graphNode.Points.Count}"; + pointNode.X = pointTable.In; + pointNode.Y = pointTable.Out; + graphNode.Points.Add(pointNode); + } + + aisacNode.Graphs.Add(graphNode); + } + + project.AisacNodes.Add(aisacNode); + } + + // Deserialize Synth tables + foreach (SerializationSynthTable synthTable in synthTables) + { + BuilderSynthNode synthNode = new BuilderSynthNode(); + synthNode.Name = synthTable.SynthName; + synthNode.Type = (BuilderSynthType)synthTable.SynthType; + synthNode.PlaybackType = (BuilderSynthPlaybackType)synthTable.ComplexType; + synthNode.Volume = synthTable.Volume; + synthNode.Pitch = synthTable.Pitch; + synthNode.DelayTime = synthTable.DelayTime; + synthNode.SControl = synthTable.SControl; + synthNode.EgDelay = synthTable.EgDelay; + synthNode.EgAttack = synthTable.EgAttack; + synthNode.EgHold = synthTable.EgHold; + synthNode.EgDecay = synthTable.EgDecay; + synthNode.EgRelease = synthTable.EgRelease; + synthNode.EgSustain = synthTable.EgSustain; + synthNode.FilterType = synthTable.FType; + synthNode.FilterCutoff1 = synthTable.FCof1; + synthNode.FilterCutoff2 = synthTable.FCof2; + synthNode.FilterReso = synthTable.FReso; + synthNode.FilterReleaseOffset = synthTable.FReleaseOffset; + synthNode.DryOName = synthTable.DryOName; + synthNode.Mtxrtr = synthTable.Mtxrtr; + synthNode.Dry0 = synthTable.Dry0; + synthNode.Dry1 = synthTable.Dry1; + synthNode.Dry2 = synthTable.Dry2; + synthNode.Dry3 = synthTable.Dry3; + synthNode.Dry4 = synthTable.Dry4; + synthNode.Dry5 = synthTable.Dry5; + synthNode.Dry6 = synthTable.Dry6; + synthNode.Dry7 = synthTable.Dry7; + synthNode.WetOName = synthTable.WetOName; + synthNode.Wet0 = synthTable.Wet0; + synthNode.Wet1 = synthTable.Wet1; + synthNode.Wet2 = synthTable.Wet2; + synthNode.Wet3 = synthTable.Wet3; + synthNode.Wet4 = synthTable.Wet4; + synthNode.Wet5 = synthTable.Wet5; + synthNode.Wet6 = synthTable.Wet6; + synthNode.Wet7 = synthTable.Wet7; + synthNode.Wcnct0 = synthTable.Wcnct0; + synthNode.Wcnct1 = synthTable.Wcnct1; + synthNode.Wcnct2 = synthTable.Wcnct2; + synthNode.Wcnct3 = synthTable.Wcnct3; + synthNode.Wcnct4 = synthTable.Wcnct4; + synthNode.Wcnct5 = synthTable.Wcnct5; + synthNode.Wcnct6 = synthTable.Wcnct6; + synthNode.Wcnct7 = synthTable.Wcnct7; + synthNode.VoiceLimitType = synthTable.VoiceLimitType; + synthNode.VoiceLimitPriority = synthTable.VoiceLimitPriority; + synthNode.VoiceLimitProhibitionTime = synthTable.VoiceLimitPhTime; + synthNode.VoiceLimitPcdlt = synthTable.VoiceLimitPcdlt; + synthNode.Pan3dVolumeOffset = synthTable.Pan3dVolumeOffset; + synthNode.Pan3dVolumeGain = synthTable.Pan3dVolumeGain; + synthNode.Pan3dAngleOffset = synthTable.Pan3dAngleOffset; + synthNode.Pan3dAngleGain = synthTable.Pan3dAngleGain; + synthNode.Pan3dDistanceOffset = synthTable.Pan3dDistanceOffset; + synthNode.Pan3dDistanceGain = synthTable.Pan3dDistanceGain; + synthNode.Dry0g = synthTable.Dry0g; + synthNode.Dry1g = synthTable.Dry1g; + synthNode.Dry2g = synthTable.Dry2g; + synthNode.Dry3g = synthTable.Dry3g; + synthNode.Dry4g = synthTable.Dry4g; + synthNode.Dry5g = synthTable.Dry5g; + synthNode.Dry6g = synthTable.Dry6g; + synthNode.Dry7g = synthTable.Dry7g; + synthNode.Wet0g = synthTable.Wet0g; + synthNode.Wet1g = synthTable.Wet1g; + synthNode.Wet2g = synthTable.Wet2g; + synthNode.Wet3g = synthTable.Wet3g; + synthNode.Wet4g = synthTable.Wet4g; + synthNode.Wet5g = synthTable.Wet5g; + synthNode.Wet6g = synthTable.Wet6g; + synthNode.Wet7g = synthTable.Wet7g; + synthNode.Filter1Type = synthTable.F1Type; + synthNode.Filter1CutoffOffset = synthTable.F1CofOffset; + synthNode.Filter1CutoffGain = synthTable.F1CofGain; + synthNode.Filter1ResoOffset = synthTable.F1ResoOffset; + synthNode.Filter1ResoGain = synthTable.F1ResoGain; + synthNode.Filter2Type = synthTable.F2Type; + synthNode.Filter2CutoffLowerOffset = synthTable.F2CofLowOffset; + synthNode.Filter2CutoffLowerGain = synthTable.F2CofLowGain; + synthNode.Filter2CutoffHigherOffset = synthTable.F2CofHighOffset; + synthNode.Filter2CutoffHigherGain = synthTable.F2CofHighGain; + synthNode.PlaybackProbability = synthTable.Probability; + synthNode.NLmtChildren = synthTable.NumberLmtChildren; + synthNode.Repeat = synthTable.Repeat; + synthNode.ComboTime = synthTable.ComboTime; + synthNode.ComboLoopBack = synthTable.ComboLoopBack; + + project.SynthNodes.Add(synthNode); + } + + // Convert the cue tables + foreach (SerializationCueTable cueTable in cueTables) + { + BuilderCueNode cueNode = new BuilderCueNode(); + cueNode.Name = cueTable.Name; + cueNode.Identifier = cueTable.Id; + cueNode.UserComment = cueTable.UserData; + cueNode.Flags = cueTable.Flags; + cueNode.SynthReference = cueTable.SynthPath; + project.CueNodes.Add(cueNode); + } + + // Fix links + for (int i = 0; i < synthTables.Count; i++) + { + SerializationSynthTable synthTable = synthTables[i]; + BuilderSynthNode synthNode = project.SynthNodes[i]; + + if (synthNode.Type == BuilderSynthType.Single) + { + synthNode.SoundElementReference = synthTable.LinkName; + } + + // Polyphonic + else if (synthNode.Type == BuilderSynthType.WithChildren) + { + synthNode.Children = synthTable.LinkName.Split(new char[] { (char)0x0A }, StringSplitOptions.RemoveEmptyEntries).ToList(); + } + + if (!string.IsNullOrEmpty(synthTable.AisacSetName)) + { + string[] aisacs = synthTable.AisacSetName.Split(new char[] { (char)0x0A }, StringSplitOptions.RemoveEmptyEntries); + string[] name = aisacs[0].Split(new string[] { "::" }, StringSplitOptions.None); + synthNode.AisacReference = name[1]; // will add support for multiple aisacs (I'm actually not even sure if csbs support multiple aisacs...) + } + + if (!string.IsNullOrEmpty(synthTable.VoiceLimitGroupName)) + { + synthNode.VoiceLimitGroupReference = synthTable.VoiceLimitGroupName; + } + } + } + } +} diff --git a/Source/CsbBuilder/MainForm.Designer.cs b/Source/CsbBuilder/MainForm.Designer.cs new file mode 100644 index 0000000..59b216a --- /dev/null +++ b/Source/CsbBuilder/MainForm.Designer.cs @@ -0,0 +1,1799 @@ +namespace CsbBuilder +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.mainMenu = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.loadProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveProjectAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mergeProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.ımportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ımportAndMergeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buildToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buildCurrentProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buildCurrentProjectAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.propertyGrid = new System.Windows.Forms.PropertyGrid(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tabControl2 = new System.Windows.Forms.TabControl(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.cueTree = new System.Windows.Forms.TreeView(); + this.nodeTreeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); + this.imageList = new System.Windows.Forms.ImageList(this.components); + this.tabControl3 = new System.Windows.Forms.TabControl(); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.synthTree = new System.Windows.Forms.TreeView(); + this.synthFolderTreeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem27 = new System.Windows.Forms.ToolStripMenuItem(); + this.folderTreeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.createToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.createFolderToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.tabControl4 = new System.Windows.Forms.TabControl(); + this.tabPage5 = new System.Windows.Forms.TabPage(); + this.soundElementTree = new System.Windows.Forms.TreeView(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.aisacTree = new System.Windows.Forms.TreeView(); + this.aisacTreeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem45 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem46 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator24 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem48 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator25 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem47 = new System.Windows.Forms.ToolStripMenuItem(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.voiceLimitGroupTree = new System.Windows.Forms.TreeView(); + this.nodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.createToolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem28 = new System.Windows.Forms.ToolStripMenuItem(); + this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.folderMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.createToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.createFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem18 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem19 = new System.Windows.Forms.ToolStripMenuItem(); + this.removeToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.trackMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem16 = new System.Windows.Forms.ToolStripMenuItem(); + this.createToolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem20 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem21 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.selectAisacReferenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.selectVoiceLimitGroupReferenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.setAisacReferenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.setVoiceLimitGroupReferenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cueReferenceMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem32 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem22 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem29 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.selectReferenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.setReferenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.trackItemMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem33 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem23 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem30 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.selectSoundElementReferenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.setSoundElementReferenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); + this.soundElementMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem34 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem24 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem31 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.setAudioToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.synthFolderMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem25 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem26 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem(); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.playButton = new System.Windows.Forms.ToolStripSplitButton(); + this.stopButton = new System.Windows.Forms.ToolStripSplitButton(); + this.statusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.aisacNodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem35 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator20 = new System.Windows.Forms.ToolStripSeparator(); + this.loadTemplateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveTemplateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator21 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem36 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem37 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem38 = new System.Windows.Forms.ToolStripMenuItem(); + this.aisacFolderMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem39 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem40 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator22 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem44 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator23 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem41 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem42 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem43 = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mainMenu.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.tabControl2.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.nodeTreeMenu.SuspendLayout(); + this.tabControl3.SuspendLayout(); + this.tabPage4.SuspendLayout(); + this.synthFolderTreeMenu.SuspendLayout(); + this.folderTreeMenu.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + this.tabControl4.SuspendLayout(); + this.tabPage5.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.aisacTreeMenu.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.nodeMenu.SuspendLayout(); + this.folderMenu.SuspendLayout(); + this.trackMenu.SuspendLayout(); + this.cueReferenceMenu.SuspendLayout(); + this.trackItemMenu.SuspendLayout(); + this.soundElementMenu.SuspendLayout(); + this.synthFolderMenu.SuspendLayout(); + this.statusStrip.SuspendLayout(); + this.aisacNodeMenu.SuspendLayout(); + this.aisacFolderMenu.SuspendLayout(); + this.SuspendLayout(); + // + // mainMenu + // + this.mainMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.buildToolStripMenuItem, + this.aboutToolStripMenuItem}); + this.mainMenu.Location = new System.Drawing.Point(0, 0); + this.mainMenu.Name = "mainMenu"; + this.mainMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.mainMenu.Size = new System.Drawing.Size(878, 24); + this.mainMenu.TabIndex = 0; + this.mainMenu.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newProjectToolStripMenuItem, + this.loadProjectToolStripMenuItem, + this.saveProjectToolStripMenuItem, + this.saveProjectAsToolStripMenuItem, + this.mergeProjectToolStripMenuItem, + this.toolStripSeparator1, + this.ımportToolStripMenuItem, + this.ımportAndMergeToolStripMenuItem, + this.toolStripSeparator2, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // newProjectToolStripMenuItem + // + this.newProjectToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.NewProject; + this.newProjectToolStripMenuItem.Name = "newProjectToolStripMenuItem"; + this.newProjectToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.newProjectToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.newProjectToolStripMenuItem.Text = "New Project"; + this.newProjectToolStripMenuItem.ToolTipText = "Create a new project and close the current one if opened."; + this.newProjectToolStripMenuItem.Click += new System.EventHandler(this.CreateNewProject); + // + // loadProjectToolStripMenuItem + // + this.loadProjectToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.LoadProject; + this.loadProjectToolStripMenuItem.Name = "loadProjectToolStripMenuItem"; + this.loadProjectToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.loadProjectToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.loadProjectToolStripMenuItem.Text = "Load Project"; + this.loadProjectToolStripMenuItem.ToolTipText = "Load a project and close the current one if opened.\r\n"; + this.loadProjectToolStripMenuItem.Click += new System.EventHandler(this.LoadProject); + // + // saveProjectToolStripMenuItem + // + this.saveProjectToolStripMenuItem.Enabled = false; + this.saveProjectToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Save; + this.saveProjectToolStripMenuItem.Name = "saveProjectToolStripMenuItem"; + this.saveProjectToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveProjectToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.saveProjectToolStripMenuItem.Text = "Save Project"; + this.saveProjectToolStripMenuItem.ToolTipText = "Save the current project."; + this.saveProjectToolStripMenuItem.Click += new System.EventHandler(this.SaveProject); + // + // saveProjectAsToolStripMenuItem + // + this.saveProjectAsToolStripMenuItem.Enabled = false; + this.saveProjectAsToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.SaveAs; + this.saveProjectAsToolStripMenuItem.Name = "saveProjectAsToolStripMenuItem"; + this.saveProjectAsToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.saveProjectAsToolStripMenuItem.Text = "Save Project As"; + this.saveProjectAsToolStripMenuItem.ToolTipText = "Save the current project to a different directory."; + this.saveProjectAsToolStripMenuItem.Click += new System.EventHandler(this.SaveProjectAs); + // + // mergeProjectToolStripMenuItem + // + this.mergeProjectToolStripMenuItem.Enabled = false; + this.mergeProjectToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Merge; + this.mergeProjectToolStripMenuItem.Name = "mergeProjectToolStripMenuItem"; + this.mergeProjectToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.mergeProjectToolStripMenuItem.Text = "Merge Project"; + this.mergeProjectToolStripMenuItem.ToolTipText = "Load and merge a project with the current project."; + this.mergeProjectToolStripMenuItem.Click += new System.EventHandler(this.MergeProject); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(180, 6); + // + // ımportToolStripMenuItem + // + this.ımportToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Import; + this.ımportToolStripMenuItem.Name = "ımportToolStripMenuItem"; + this.ımportToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); + this.ımportToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.ımportToolStripMenuItem.Text = "Import"; + this.ımportToolStripMenuItem.ToolTipText = "Import a Cue Sheet Binary as a project and close the current project if opened."; + this.ımportToolStripMenuItem.Click += new System.EventHandler(this.ImportCsbFile); + // + // ımportAndMergeToolStripMenuItem + // + this.ımportAndMergeToolStripMenuItem.Enabled = false; + this.ımportAndMergeToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.ImportAndMerge; + this.ımportAndMergeToolStripMenuItem.Name = "ımportAndMergeToolStripMenuItem"; + this.ımportAndMergeToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.ımportAndMergeToolStripMenuItem.Text = "Import And Merge"; + this.ımportAndMergeToolStripMenuItem.ToolTipText = "Import and merge a Cue Sheet Binary with the current project."; + this.ımportAndMergeToolStripMenuItem.Click += new System.EventHandler(this.ImportAndMergeProject); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(180, 6); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Exit; + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); + this.exitToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.exitToolStripMenuItem.Text = "Exit"; + this.exitToolStripMenuItem.ToolTipText = "Exit the application."; + this.exitToolStripMenuItem.Click += new System.EventHandler(this.Exit); + // + // buildToolStripMenuItem + // + this.buildToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.buildCurrentProjectToolStripMenuItem, + this.buildCurrentProjectAsToolStripMenuItem}); + this.buildToolStripMenuItem.Name = "buildToolStripMenuItem"; + this.buildToolStripMenuItem.Size = new System.Drawing.Size(46, 20); + this.buildToolStripMenuItem.Text = "Build"; + // + // buildCurrentProjectToolStripMenuItem + // + this.buildCurrentProjectToolStripMenuItem.Enabled = false; + this.buildCurrentProjectToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Build; + this.buildCurrentProjectToolStripMenuItem.Name = "buildCurrentProjectToolStripMenuItem"; + this.buildCurrentProjectToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.B))); + this.buildCurrentProjectToolStripMenuItem.Size = new System.Drawing.Size(225, 22); + this.buildCurrentProjectToolStripMenuItem.Text = "Build Current Project"; + this.buildCurrentProjectToolStripMenuItem.ToolTipText = "Build the current project as Cue Sheet Binary."; + this.buildCurrentProjectToolStripMenuItem.Click += new System.EventHandler(this.BuildProject); + // + // buildCurrentProjectAsToolStripMenuItem + // + this.buildCurrentProjectAsToolStripMenuItem.Enabled = false; + this.buildCurrentProjectAsToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Build; + this.buildCurrentProjectAsToolStripMenuItem.Name = "buildCurrentProjectAsToolStripMenuItem"; + this.buildCurrentProjectAsToolStripMenuItem.Size = new System.Drawing.Size(225, 22); + this.buildCurrentProjectAsToolStripMenuItem.Text = "Build Current Project As"; + this.buildCurrentProjectAsToolStripMenuItem.ToolTipText = "Build the current project as Cue Sheet Binary in a different path."; + this.buildCurrentProjectAsToolStripMenuItem.Click += new System.EventHandler(this.BuildProjectAs); + // + // propertyGrid + // + this.propertyGrid.AllowDrop = true; + this.propertyGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.propertyGrid.Enabled = false; + this.propertyGrid.Location = new System.Drawing.Point(252, 24); + this.propertyGrid.Name = "propertyGrid"; + this.propertyGrid.Size = new System.Drawing.Size(374, 556); + this.propertyGrid.TabIndex = 1; + this.propertyGrid.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.OnPropertyChange); + // + // splitContainer1 + // + this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.splitContainer1.Enabled = false; + this.splitContainer1.Location = new System.Drawing.Point(0, 24); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tabControl2); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.tabControl3); + this.splitContainer1.Size = new System.Drawing.Size(250, 556); + this.splitContainer1.SplitterDistance = 247; + this.splitContainer1.TabIndex = 2; + // + // tabControl2 + // + this.tabControl2.Controls.Add(this.tabPage3); + this.tabControl2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl2.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.tabControl2.Location = new System.Drawing.Point(0, 0); + this.tabControl2.Name = "tabControl2"; + this.tabControl2.SelectedIndex = 0; + this.tabControl2.Size = new System.Drawing.Size(250, 247); + this.tabControl2.TabIndex = 0; + // + // tabPage3 + // + this.tabPage3.Controls.Add(this.cueTree); + this.tabPage3.Location = new System.Drawing.Point(4, 22); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Padding = new System.Windows.Forms.Padding(3); + this.tabPage3.Size = new System.Drawing.Size(242, 221); + this.tabPage3.TabIndex = 0; + this.tabPage3.Text = "Cue"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // cueTree + // + this.cueTree.AllowDrop = true; + this.cueTree.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.cueTree.ContextMenuStrip = this.nodeTreeMenu; + this.cueTree.Dock = System.Windows.Forms.DockStyle.Fill; + this.cueTree.HideSelection = false; + this.cueTree.ImageIndex = 0; + this.cueTree.ImageList = this.imageList; + this.cueTree.LabelEdit = true; + this.cueTree.Location = new System.Drawing.Point(3, 3); + this.cueTree.Name = "cueTree"; + this.cueTree.PathSeparator = "/"; + this.cueTree.SelectedImageIndex = 0; + this.cueTree.Size = new System.Drawing.Size(236, 215); + this.cueTree.TabIndex = 0; + this.cueTree.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.OnRenameEnd); + this.cueTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.AfterNodeSelect); + this.cueTree.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.OnNodeClick); + this.cueTree.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.RenameNode); + this.cueTree.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnKeyDown); + // + // nodeTreeMenu + // + this.nodeTreeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.createToolStripMenuItem, + this.toolStripSeparator14, + this.toolStripMenuItem17}); + this.nodeTreeMenu.Name = "cueAndVoiceLimitGroupTreeMenu"; + this.nodeTreeMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.nodeTreeMenu.Size = new System.Drawing.Size(109, 54); + // + // createToolStripMenuItem + // + this.createToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Create; + this.createToolStripMenuItem.Name = "createToolStripMenuItem"; + this.createToolStripMenuItem.Size = new System.Drawing.Size(108, 22); + this.createToolStripMenuItem.Text = "Create"; + this.createToolStripMenuItem.ToolTipText = "Create a new node."; + this.createToolStripMenuItem.Click += new System.EventHandler(this.CreateNode); + // + // toolStripSeparator14 + // + this.toolStripSeparator14.Name = "toolStripSeparator14"; + this.toolStripSeparator14.Size = new System.Drawing.Size(105, 6); + // + // toolStripMenuItem17 + // + this.toolStripMenuItem17.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem17.Name = "toolStripMenuItem17"; + this.toolStripMenuItem17.Size = new System.Drawing.Size(108, 22); + this.toolStripMenuItem17.Text = "Paste"; + this.toolStripMenuItem17.ToolTipText = "Paste the copied node."; + this.toolStripMenuItem17.Click += new System.EventHandler(this.PasteNodeOnTree); + // + // imageList + // + this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; + this.imageList.ImageSize = new System.Drawing.Size(16, 16); + this.imageList.TransparentColor = System.Drawing.Color.Transparent; + // + // tabControl3 + // + this.tabControl3.Controls.Add(this.tabPage4); + this.tabControl3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl3.Location = new System.Drawing.Point(0, 0); + this.tabControl3.Name = "tabControl3"; + this.tabControl3.SelectedIndex = 0; + this.tabControl3.Size = new System.Drawing.Size(250, 305); + this.tabControl3.TabIndex = 0; + // + // tabPage4 + // + this.tabPage4.Controls.Add(this.synthTree); + this.tabPage4.Location = new System.Drawing.Point(4, 22); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.Padding = new System.Windows.Forms.Padding(3); + this.tabPage4.Size = new System.Drawing.Size(242, 279); + this.tabPage4.TabIndex = 0; + this.tabPage4.Text = "Synth"; + this.tabPage4.UseVisualStyleBackColor = true; + // + // synthTree + // + this.synthTree.AllowDrop = true; + this.synthTree.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.synthTree.ContextMenuStrip = this.synthFolderTreeMenu; + this.synthTree.Dock = System.Windows.Forms.DockStyle.Fill; + this.synthTree.HideSelection = false; + this.synthTree.ImageIndex = 0; + this.synthTree.ImageList = this.imageList; + this.synthTree.LabelEdit = true; + this.synthTree.Location = new System.Drawing.Point(3, 3); + this.synthTree.Name = "synthTree"; + this.synthTree.PathSeparator = "/"; + this.synthTree.SelectedImageIndex = 0; + this.synthTree.Size = new System.Drawing.Size(236, 273); + this.synthTree.TabIndex = 0; + this.synthTree.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.OnRenameEnd); + this.synthTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.AfterNodeSelect); + this.synthTree.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.OnNodeClick); + this.synthTree.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.RenameNode); + this.synthTree.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnKeyDown); + // + // synthFolderTreeMenu + // + this.synthFolderTreeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem13, + this.toolStripMenuItem15, + this.toolStripMenuItem14, + this.toolStripSeparator15, + this.toolStripMenuItem27}); + this.synthFolderTreeMenu.Name = "contextMenuStrip1"; + this.synthFolderTreeMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.synthFolderTreeMenu.Size = new System.Drawing.Size(146, 98); + // + // toolStripMenuItem13 + // + this.toolStripMenuItem13.Image = global::CsbBuilder.Properties.Resources.Create; + this.toolStripMenuItem13.Name = "toolStripMenuItem13"; + this.toolStripMenuItem13.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem13.Text = "Create Track"; + this.toolStripMenuItem13.ToolTipText = "Create a new track (or block) node."; + this.toolStripMenuItem13.Click += new System.EventHandler(this.CreateNode); + // + // toolStripMenuItem15 + // + this.toolStripMenuItem15.Image = global::CsbBuilder.Properties.Resources.Sound; + this.toolStripMenuItem15.Name = "toolStripMenuItem15"; + this.toolStripMenuItem15.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem15.Text = "Create Sound"; + this.toolStripMenuItem15.ToolTipText = "Create a new sound node."; + this.toolStripMenuItem15.Click += new System.EventHandler(this.CreateSound); + // + // toolStripMenuItem14 + // + this.toolStripMenuItem14.Image = global::CsbBuilder.Properties.Resources.Folder; + this.toolStripMenuItem14.Name = "toolStripMenuItem14"; + this.toolStripMenuItem14.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem14.Text = "Create Folder"; + this.toolStripMenuItem14.ToolTipText = "Create a new folder."; + this.toolStripMenuItem14.Click += new System.EventHandler(this.CreateFolder); + // + // toolStripSeparator15 + // + this.toolStripSeparator15.Name = "toolStripSeparator15"; + this.toolStripSeparator15.Size = new System.Drawing.Size(142, 6); + // + // toolStripMenuItem27 + // + this.toolStripMenuItem27.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem27.Name = "toolStripMenuItem27"; + this.toolStripMenuItem27.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem27.Text = "Paste"; + this.toolStripMenuItem27.ToolTipText = "Paste the copied node."; + this.toolStripMenuItem27.Click += new System.EventHandler(this.PasteNodeOnTree); + // + // folderTreeMenu + // + this.folderTreeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.createToolStripMenuItem2, + this.createFolderToolStripMenuItem1, + this.toolStripSeparator12, + this.pasteToolStripMenuItem}); + this.folderTreeMenu.Name = "contextMenuStrip1"; + this.folderTreeMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.folderTreeMenu.Size = new System.Drawing.Size(145, 76); + // + // createToolStripMenuItem2 + // + this.createToolStripMenuItem2.Image = global::CsbBuilder.Properties.Resources.Create; + this.createToolStripMenuItem2.Name = "createToolStripMenuItem2"; + this.createToolStripMenuItem2.Size = new System.Drawing.Size(144, 22); + this.createToolStripMenuItem2.Text = "Create"; + this.createToolStripMenuItem2.ToolTipText = "Create a new node."; + this.createToolStripMenuItem2.Click += new System.EventHandler(this.CreateNode); + // + // createFolderToolStripMenuItem1 + // + this.createFolderToolStripMenuItem1.Image = global::CsbBuilder.Properties.Resources.Folder; + this.createFolderToolStripMenuItem1.Name = "createFolderToolStripMenuItem1"; + this.createFolderToolStripMenuItem1.Size = new System.Drawing.Size(144, 22); + this.createFolderToolStripMenuItem1.Text = "Create Folder"; + this.createFolderToolStripMenuItem1.ToolTipText = "Create a new folder."; + this.createFolderToolStripMenuItem1.Click += new System.EventHandler(this.CreateFolder); + // + // toolStripSeparator12 + // + this.toolStripSeparator12.Name = "toolStripSeparator12"; + this.toolStripSeparator12.Size = new System.Drawing.Size(141, 6); + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Paste; + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(144, 22); + this.pasteToolStripMenuItem.Text = "Paste"; + this.pasteToolStripMenuItem.ToolTipText = "Paste the copied node."; + this.pasteToolStripMenuItem.Click += new System.EventHandler(this.PasteNodeOnTree); + // + // splitContainer2 + // + this.splitContainer2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitContainer2.Enabled = false; + this.splitContainer2.Location = new System.Drawing.Point(628, 24); + this.splitContainer2.Name = "splitContainer2"; + this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.tabControl4); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.tabControl1); + this.splitContainer2.Size = new System.Drawing.Size(250, 556); + this.splitContainer2.SplitterDistance = 247; + this.splitContainer2.TabIndex = 3; + // + // tabControl4 + // + this.tabControl4.Controls.Add(this.tabPage5); + this.tabControl4.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl4.Location = new System.Drawing.Point(0, 0); + this.tabControl4.Name = "tabControl4"; + this.tabControl4.SelectedIndex = 0; + this.tabControl4.Size = new System.Drawing.Size(250, 247); + this.tabControl4.TabIndex = 0; + // + // tabPage5 + // + this.tabPage5.Controls.Add(this.soundElementTree); + this.tabPage5.Location = new System.Drawing.Point(4, 22); + this.tabPage5.Name = "tabPage5"; + this.tabPage5.Padding = new System.Windows.Forms.Padding(3); + this.tabPage5.Size = new System.Drawing.Size(242, 221); + this.tabPage5.TabIndex = 0; + this.tabPage5.Text = "Sound Element"; + this.tabPage5.UseVisualStyleBackColor = true; + // + // soundElementTree + // + this.soundElementTree.AllowDrop = true; + this.soundElementTree.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.soundElementTree.ContextMenuStrip = this.folderTreeMenu; + this.soundElementTree.Dock = System.Windows.Forms.DockStyle.Fill; + this.soundElementTree.HideSelection = false; + this.soundElementTree.ImageIndex = 0; + this.soundElementTree.ImageList = this.imageList; + this.soundElementTree.LabelEdit = true; + this.soundElementTree.Location = new System.Drawing.Point(3, 3); + this.soundElementTree.Name = "soundElementTree"; + this.soundElementTree.PathSeparator = "/"; + this.soundElementTree.SelectedImageIndex = 0; + this.soundElementTree.Size = new System.Drawing.Size(236, 215); + this.soundElementTree.TabIndex = 0; + this.soundElementTree.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.OnRenameEnd); + this.soundElementTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.AfterNodeSelect); + this.soundElementTree.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.OnNodeClick); + this.soundElementTree.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.RenameNode); + this.soundElementTree.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnKeyDown); + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl1.Location = new System.Drawing.Point(0, 0); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(250, 305); + this.tabControl1.TabIndex = 0; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.aisacTree); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(242, 279); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "AISAC"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // aisacTree + // + this.aisacTree.AllowDrop = true; + this.aisacTree.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.aisacTree.ContextMenuStrip = this.aisacTreeMenu; + this.aisacTree.Dock = System.Windows.Forms.DockStyle.Fill; + this.aisacTree.HideSelection = false; + this.aisacTree.ImageIndex = 0; + this.aisacTree.ImageList = this.imageList; + this.aisacTree.LabelEdit = true; + this.aisacTree.Location = new System.Drawing.Point(3, 3); + this.aisacTree.Name = "aisacTree"; + this.aisacTree.PathSeparator = "/"; + this.aisacTree.SelectedImageIndex = 0; + this.aisacTree.Size = new System.Drawing.Size(236, 273); + this.aisacTree.TabIndex = 0; + this.aisacTree.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.OnRenameEnd); + this.aisacTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.AfterNodeSelect); + this.aisacTree.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.OnNodeClick); + this.aisacTree.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.RenameNode); + this.aisacTree.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnKeyDown); + // + // aisacTreeMenu + // + this.aisacTreeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem45, + this.toolStripMenuItem46, + this.toolStripSeparator24, + this.toolStripMenuItem48, + this.toolStripSeparator25, + this.toolStripMenuItem47}); + this.aisacTreeMenu.Name = "contextMenuStrip1"; + this.aisacTreeMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.aisacTreeMenu.Size = new System.Drawing.Size(189, 104); + // + // toolStripMenuItem45 + // + this.toolStripMenuItem45.Image = global::CsbBuilder.Properties.Resources.Create; + this.toolStripMenuItem45.Name = "toolStripMenuItem45"; + this.toolStripMenuItem45.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem45.Text = "Create"; + this.toolStripMenuItem45.ToolTipText = "Create a new node."; + this.toolStripMenuItem45.Click += new System.EventHandler(this.CreateNode); + // + // toolStripMenuItem46 + // + this.toolStripMenuItem46.Image = global::CsbBuilder.Properties.Resources.Folder; + this.toolStripMenuItem46.Name = "toolStripMenuItem46"; + this.toolStripMenuItem46.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem46.Text = "Create Folder"; + this.toolStripMenuItem46.ToolTipText = "Create a new folder."; + this.toolStripMenuItem46.Click += new System.EventHandler(this.CreateFolder); + // + // toolStripSeparator24 + // + this.toolStripSeparator24.Name = "toolStripSeparator24"; + this.toolStripSeparator24.Size = new System.Drawing.Size(185, 6); + // + // toolStripMenuItem48 + // + this.toolStripMenuItem48.Image = global::CsbBuilder.Properties.Resources.Template; + this.toolStripMenuItem48.Name = "toolStripMenuItem48"; + this.toolStripMenuItem48.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem48.Text = "Load AISAC Template"; + this.toolStripMenuItem48.Click += new System.EventHandler(this.LoadTemplate); + // + // toolStripSeparator25 + // + this.toolStripSeparator25.Name = "toolStripSeparator25"; + this.toolStripSeparator25.Size = new System.Drawing.Size(185, 6); + // + // toolStripMenuItem47 + // + this.toolStripMenuItem47.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem47.Name = "toolStripMenuItem47"; + this.toolStripMenuItem47.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem47.Text = "Paste"; + this.toolStripMenuItem47.ToolTipText = "Paste the copied node."; + this.toolStripMenuItem47.Click += new System.EventHandler(this.PasteNodeOnTree); + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.voiceLimitGroupTree); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(242, 279); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "Voice Limit Group"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // voiceLimitGroupTree + // + this.voiceLimitGroupTree.AllowDrop = true; + this.voiceLimitGroupTree.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.voiceLimitGroupTree.ContextMenuStrip = this.nodeTreeMenu; + this.voiceLimitGroupTree.Dock = System.Windows.Forms.DockStyle.Fill; + this.voiceLimitGroupTree.HideSelection = false; + this.voiceLimitGroupTree.ImageIndex = 0; + this.voiceLimitGroupTree.ImageList = this.imageList; + this.voiceLimitGroupTree.LabelEdit = true; + this.voiceLimitGroupTree.Location = new System.Drawing.Point(3, 3); + this.voiceLimitGroupTree.Name = "voiceLimitGroupTree"; + this.voiceLimitGroupTree.PathSeparator = "/"; + this.voiceLimitGroupTree.SelectedImageIndex = 0; + this.voiceLimitGroupTree.Size = new System.Drawing.Size(236, 273); + this.voiceLimitGroupTree.TabIndex = 0; + this.voiceLimitGroupTree.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.OnRenameEnd); + this.voiceLimitGroupTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.AfterNodeSelect); + this.voiceLimitGroupTree.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.OnNodeClick); + this.voiceLimitGroupTree.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.RenameNode); + this.voiceLimitGroupTree.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnKeyDown); + // + // nodeMenu + // + this.nodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.createToolStripMenuItem4, + this.toolStripSeparator16, + this.copyToolStripMenuItem, + this.toolStripMenuItem28, + this.removeToolStripMenuItem}); + this.nodeMenu.Name = "cueAndVoiceLimitGroupMenu"; + this.nodeMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.nodeMenu.Size = new System.Drawing.Size(118, 98); + // + // createToolStripMenuItem4 + // + this.createToolStripMenuItem4.Image = global::CsbBuilder.Properties.Resources.Create; + this.createToolStripMenuItem4.Name = "createToolStripMenuItem4"; + this.createToolStripMenuItem4.Size = new System.Drawing.Size(117, 22); + this.createToolStripMenuItem4.Text = "Create"; + this.createToolStripMenuItem4.ToolTipText = "Create a new node after the selected node."; + this.createToolStripMenuItem4.Click += new System.EventHandler(this.CreateAndInsertNode); + // + // toolStripSeparator16 + // + this.toolStripSeparator16.Name = "toolStripSeparator16"; + this.toolStripSeparator16.Size = new System.Drawing.Size(114, 6); + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Copy; + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.copyToolStripMenuItem.Text = "Copy"; + this.copyToolStripMenuItem.ToolTipText = "Copy the selected node."; + this.copyToolStripMenuItem.Click += new System.EventHandler(this.CopyNode); + // + // toolStripMenuItem28 + // + this.toolStripMenuItem28.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem28.Name = "toolStripMenuItem28"; + this.toolStripMenuItem28.Size = new System.Drawing.Size(117, 22); + this.toolStripMenuItem28.Text = "Paste"; + this.toolStripMenuItem28.ToolTipText = "Paste the copied node after the selected node."; + this.toolStripMenuItem28.Click += new System.EventHandler(this.PasteAndInsertNode); + // + // removeToolStripMenuItem + // + this.removeToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Remove; + this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; + this.removeToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.removeToolStripMenuItem.Text = "Remove"; + this.removeToolStripMenuItem.ToolTipText = "Remove the selected node."; + this.removeToolStripMenuItem.Click += new System.EventHandler(this.RemoveNode); + // + // folderMenu + // + this.folderMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.createToolStripMenuItem1, + this.createFolderToolStripMenuItem, + this.toolStripSeparator11, + this.toolStripMenuItem18, + this.toolStripMenuItem19, + this.removeToolStripMenuItem1}); + this.folderMenu.Name = "synthSoundElementAndAisacMenu"; + this.folderMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.folderMenu.Size = new System.Drawing.Size(145, 120); + // + // createToolStripMenuItem1 + // + this.createToolStripMenuItem1.Image = global::CsbBuilder.Properties.Resources.Create; + this.createToolStripMenuItem1.Name = "createToolStripMenuItem1"; + this.createToolStripMenuItem1.Size = new System.Drawing.Size(144, 22); + this.createToolStripMenuItem1.Text = "Create"; + this.createToolStripMenuItem1.ToolTipText = "Create a new child node."; + this.createToolStripMenuItem1.Click += new System.EventHandler(this.CreateChildNode); + // + // createFolderToolStripMenuItem + // + this.createFolderToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Folder; + this.createFolderToolStripMenuItem.Name = "createFolderToolStripMenuItem"; + this.createFolderToolStripMenuItem.Size = new System.Drawing.Size(144, 22); + this.createFolderToolStripMenuItem.Text = "Create Folder"; + this.createFolderToolStripMenuItem.ToolTipText = "Create a new child folder."; + this.createFolderToolStripMenuItem.Click += new System.EventHandler(this.CreateChildFolder); + // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + this.toolStripSeparator11.Size = new System.Drawing.Size(141, 6); + // + // toolStripMenuItem18 + // + this.toolStripMenuItem18.Image = global::CsbBuilder.Properties.Resources.Copy; + this.toolStripMenuItem18.Name = "toolStripMenuItem18"; + this.toolStripMenuItem18.Size = new System.Drawing.Size(144, 22); + this.toolStripMenuItem18.Text = "Copy"; + this.toolStripMenuItem18.ToolTipText = "Copy the selected node."; + this.toolStripMenuItem18.Click += new System.EventHandler(this.CopyNode); + // + // toolStripMenuItem19 + // + this.toolStripMenuItem19.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem19.Name = "toolStripMenuItem19"; + this.toolStripMenuItem19.Size = new System.Drawing.Size(144, 22); + this.toolStripMenuItem19.Text = "Paste"; + this.toolStripMenuItem19.ToolTipText = "Paste the copied node as child."; + this.toolStripMenuItem19.Click += new System.EventHandler(this.PasteNode); + // + // removeToolStripMenuItem1 + // + this.removeToolStripMenuItem1.Image = global::CsbBuilder.Properties.Resources.Remove; + this.removeToolStripMenuItem1.Name = "removeToolStripMenuItem1"; + this.removeToolStripMenuItem1.Size = new System.Drawing.Size(144, 22); + this.removeToolStripMenuItem1.Text = "Remove"; + this.removeToolStripMenuItem1.ToolTipText = "Remove the selected node."; + this.removeToolStripMenuItem1.Click += new System.EventHandler(this.RemoveNode); + // + // trackMenu + // + this.trackMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem16, + this.createToolStripMenuItem3, + this.toolStripSeparator10, + this.toolStripMenuItem20, + this.toolStripMenuItem21, + this.toolStripMenuItem1, + this.toolStripSeparator3, + this.selectAisacReferenceToolStripMenuItem, + this.selectVoiceLimitGroupReferenceToolStripMenuItem, + this.toolStripSeparator4, + this.setAisacReferenceToolStripMenuItem, + this.setVoiceLimitGroupReferenceToolStripMenuItem}); + this.trackMenu.Name = "cueAndVoiceLimitGroupMenu"; + this.trackMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.trackMenu.Size = new System.Drawing.Size(258, 220); + // + // toolStripMenuItem16 + // + this.toolStripMenuItem16.Image = global::CsbBuilder.Properties.Resources.Create; + this.toolStripMenuItem16.Name = "toolStripMenuItem16"; + this.toolStripMenuItem16.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem16.Text = "Create Block"; + this.toolStripMenuItem16.ToolTipText = "Create a new child block node."; + this.toolStripMenuItem16.Click += new System.EventHandler(this.CreateChildTrackNode); + // + // createToolStripMenuItem3 + // + this.createToolStripMenuItem3.Image = global::CsbBuilder.Properties.Resources.Sound; + this.createToolStripMenuItem3.Name = "createToolStripMenuItem3"; + this.createToolStripMenuItem3.Size = new System.Drawing.Size(257, 22); + this.createToolStripMenuItem3.Text = "Create Sound"; + this.createToolStripMenuItem3.ToolTipText = "Create a new child sound node."; + this.createToolStripMenuItem3.Click += new System.EventHandler(this.CreateChildNode); + // + // toolStripSeparator10 + // + this.toolStripSeparator10.Name = "toolStripSeparator10"; + this.toolStripSeparator10.Size = new System.Drawing.Size(254, 6); + // + // toolStripMenuItem20 + // + this.toolStripMenuItem20.Image = global::CsbBuilder.Properties.Resources.Copy; + this.toolStripMenuItem20.Name = "toolStripMenuItem20"; + this.toolStripMenuItem20.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem20.Text = "Copy"; + this.toolStripMenuItem20.ToolTipText = "Copy the selected node."; + this.toolStripMenuItem20.Click += new System.EventHandler(this.CopyNode); + // + // toolStripMenuItem21 + // + this.toolStripMenuItem21.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem21.Name = "toolStripMenuItem21"; + this.toolStripMenuItem21.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem21.Text = "Paste"; + this.toolStripMenuItem21.ToolTipText = "Paste the copied node as child."; + this.toolStripMenuItem21.Click += new System.EventHandler(this.PasteNode); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Image = global::CsbBuilder.Properties.Resources.Remove; + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem1.Text = "Remove"; + this.toolStripMenuItem1.ToolTipText = "Remove the selected node."; + this.toolStripMenuItem1.Click += new System.EventHandler(this.RemoveNode); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(254, 6); + // + // selectAisacReferenceToolStripMenuItem + // + this.selectAisacReferenceToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Select; + this.selectAisacReferenceToolStripMenuItem.Name = "selectAisacReferenceToolStripMenuItem"; + this.selectAisacReferenceToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.selectAisacReferenceToolStripMenuItem.Text = "Select AISAC Reference"; + this.selectAisacReferenceToolStripMenuItem.ToolTipText = "Select the referenced AISAC node from the AISAC tree."; + this.selectAisacReferenceToolStripMenuItem.Click += new System.EventHandler(this.SelectAisacReference); + // + // selectVoiceLimitGroupReferenceToolStripMenuItem + // + this.selectVoiceLimitGroupReferenceToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Select; + this.selectVoiceLimitGroupReferenceToolStripMenuItem.Name = "selectVoiceLimitGroupReferenceToolStripMenuItem"; + this.selectVoiceLimitGroupReferenceToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.selectVoiceLimitGroupReferenceToolStripMenuItem.Text = "Select Voice Limit Group Reference"; + this.selectVoiceLimitGroupReferenceToolStripMenuItem.ToolTipText = "Select the referenced Voice Limit Group node from the Voice Limit Group tree."; + this.selectVoiceLimitGroupReferenceToolStripMenuItem.Click += new System.EventHandler(this.SelectVoiceLimitGroupReference); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(254, 6); + // + // setAisacReferenceToolStripMenuItem + // + this.setAisacReferenceToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.SetReference; + this.setAisacReferenceToolStripMenuItem.Name = "setAisacReferenceToolStripMenuItem"; + this.setAisacReferenceToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.setAisacReferenceToolStripMenuItem.Text = "Set AISAC Reference"; + this.setAisacReferenceToolStripMenuItem.ToolTipText = "Set the AISAC reference from the AISAC tree."; + this.setAisacReferenceToolStripMenuItem.Click += new System.EventHandler(this.SetAisacReference); + // + // setVoiceLimitGroupReferenceToolStripMenuItem + // + this.setVoiceLimitGroupReferenceToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.SetReference; + this.setVoiceLimitGroupReferenceToolStripMenuItem.Name = "setVoiceLimitGroupReferenceToolStripMenuItem"; + this.setVoiceLimitGroupReferenceToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.setVoiceLimitGroupReferenceToolStripMenuItem.Text = "Set Voice Limit Group Reference"; + this.setVoiceLimitGroupReferenceToolStripMenuItem.ToolTipText = "Set the Voice Limit Group reference from the Voice Limit Group tree."; + this.setVoiceLimitGroupReferenceToolStripMenuItem.Click += new System.EventHandler(this.SetVoiceLimitGroupReference); + // + // cueReferenceMenu + // + this.cueReferenceMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem32, + this.toolStripSeparator17, + this.toolStripMenuItem22, + this.toolStripMenuItem29, + this.toolStripMenuItem2, + this.toolStripSeparator5, + this.selectReferenceToolStripMenuItem, + this.toolStripSeparator8, + this.setReferenceToolStripMenuItem}); + this.cueReferenceMenu.Name = "cueAndVoiceLimitGroupMenu"; + this.cueReferenceMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.cueReferenceMenu.Size = new System.Drawing.Size(161, 154); + // + // toolStripMenuItem32 + // + this.toolStripMenuItem32.Image = global::CsbBuilder.Properties.Resources.Create; + this.toolStripMenuItem32.Name = "toolStripMenuItem32"; + this.toolStripMenuItem32.Size = new System.Drawing.Size(160, 22); + this.toolStripMenuItem32.Text = "Create"; + this.toolStripMenuItem32.ToolTipText = "Create a new node."; + this.toolStripMenuItem32.Click += new System.EventHandler(this.CreateAndInsertNode); + // + // toolStripSeparator17 + // + this.toolStripSeparator17.Name = "toolStripSeparator17"; + this.toolStripSeparator17.Size = new System.Drawing.Size(157, 6); + // + // toolStripMenuItem22 + // + this.toolStripMenuItem22.Image = global::CsbBuilder.Properties.Resources.Copy; + this.toolStripMenuItem22.Name = "toolStripMenuItem22"; + this.toolStripMenuItem22.Size = new System.Drawing.Size(160, 22); + this.toolStripMenuItem22.Text = "Copy"; + this.toolStripMenuItem22.ToolTipText = "Copy the selected node."; + this.toolStripMenuItem22.Click += new System.EventHandler(this.CopyNode); + // + // toolStripMenuItem29 + // + this.toolStripMenuItem29.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem29.Name = "toolStripMenuItem29"; + this.toolStripMenuItem29.Size = new System.Drawing.Size(160, 22); + this.toolStripMenuItem29.Text = "Paste"; + this.toolStripMenuItem29.ToolTipText = "Paste the copied node after the selected node."; + this.toolStripMenuItem29.Click += new System.EventHandler(this.PasteAndInsertNode); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Image = global::CsbBuilder.Properties.Resources.Remove; + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(160, 22); + this.toolStripMenuItem2.Text = "Remove"; + this.toolStripMenuItem2.ToolTipText = "Remove the selected node."; + this.toolStripMenuItem2.Click += new System.EventHandler(this.RemoveNode); + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(157, 6); + // + // selectReferenceToolStripMenuItem + // + this.selectReferenceToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Select; + this.selectReferenceToolStripMenuItem.Name = "selectReferenceToolStripMenuItem"; + this.selectReferenceToolStripMenuItem.Size = new System.Drawing.Size(160, 22); + this.selectReferenceToolStripMenuItem.Text = "Select Reference"; + this.selectReferenceToolStripMenuItem.ToolTipText = "Select the Synth reference from the Synth tree."; + this.selectReferenceToolStripMenuItem.Click += new System.EventHandler(this.SelectSynthReference); + // + // toolStripSeparator8 + // + this.toolStripSeparator8.Name = "toolStripSeparator8"; + this.toolStripSeparator8.Size = new System.Drawing.Size(157, 6); + // + // setReferenceToolStripMenuItem + // + this.setReferenceToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.SetReference; + this.setReferenceToolStripMenuItem.Name = "setReferenceToolStripMenuItem"; + this.setReferenceToolStripMenuItem.Size = new System.Drawing.Size(160, 22); + this.setReferenceToolStripMenuItem.Text = "Set Reference"; + this.setReferenceToolStripMenuItem.ToolTipText = "Set the Synth reference from the Synth tree."; + this.setReferenceToolStripMenuItem.Click += new System.EventHandler(this.SetSynthReference); + // + // trackItemMenu + // + this.trackItemMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem33, + this.toolStripSeparator18, + this.toolStripMenuItem23, + this.toolStripMenuItem30, + this.toolStripMenuItem4, + this.toolStripSeparator6, + this.selectSoundElementReferenceToolStripMenuItem, + this.toolStripMenuItem5, + this.toolStripMenuItem6, + this.toolStripSeparator7, + this.setSoundElementReferenceToolStripMenuItem, + this.toolStripMenuItem7, + this.toolStripMenuItem8}); + this.trackItemMenu.Name = "cueAndVoiceLimitGroupMenu"; + this.trackItemMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.trackItemMenu.Size = new System.Drawing.Size(258, 242); + // + // toolStripMenuItem33 + // + this.toolStripMenuItem33.Image = global::CsbBuilder.Properties.Resources.Create; + this.toolStripMenuItem33.Name = "toolStripMenuItem33"; + this.toolStripMenuItem33.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem33.Text = "Create"; + this.toolStripMenuItem33.ToolTipText = "Create a new node."; + this.toolStripMenuItem33.Click += new System.EventHandler(this.CreateAndInsertSoundNode); + // + // toolStripSeparator18 + // + this.toolStripSeparator18.Name = "toolStripSeparator18"; + this.toolStripSeparator18.Size = new System.Drawing.Size(254, 6); + // + // toolStripMenuItem23 + // + this.toolStripMenuItem23.Image = global::CsbBuilder.Properties.Resources.Copy; + this.toolStripMenuItem23.Name = "toolStripMenuItem23"; + this.toolStripMenuItem23.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem23.Text = "Copy"; + this.toolStripMenuItem23.ToolTipText = "Copy the selected node."; + this.toolStripMenuItem23.Click += new System.EventHandler(this.CopyNode); + // + // toolStripMenuItem30 + // + this.toolStripMenuItem30.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem30.Name = "toolStripMenuItem30"; + this.toolStripMenuItem30.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem30.Text = "Paste"; + this.toolStripMenuItem30.ToolTipText = "Paste the copied node after the selected node."; + this.toolStripMenuItem30.Click += new System.EventHandler(this.PasteAndInsertNode); + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.Image = global::CsbBuilder.Properties.Resources.Remove; + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem4.Text = "Remove"; + this.toolStripMenuItem4.ToolTipText = "Remove the selected node."; + this.toolStripMenuItem4.Click += new System.EventHandler(this.RemoveNode); + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(254, 6); + // + // selectSoundElementReferenceToolStripMenuItem + // + this.selectSoundElementReferenceToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Select; + this.selectSoundElementReferenceToolStripMenuItem.Name = "selectSoundElementReferenceToolStripMenuItem"; + this.selectSoundElementReferenceToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.selectSoundElementReferenceToolStripMenuItem.Text = "Select Sound Element Reference"; + this.selectSoundElementReferenceToolStripMenuItem.ToolTipText = "Select the referenced Sound Element node from the Sound Element tree."; + this.selectSoundElementReferenceToolStripMenuItem.Click += new System.EventHandler(this.SelectSoundElementReference); + // + // toolStripMenuItem5 + // + this.toolStripMenuItem5.Image = global::CsbBuilder.Properties.Resources.Select; + this.toolStripMenuItem5.Name = "toolStripMenuItem5"; + this.toolStripMenuItem5.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem5.Text = "Select AISAC Reference"; + this.toolStripMenuItem5.ToolTipText = "Select the referenced AISAC node from the AISAC tree."; + this.toolStripMenuItem5.Click += new System.EventHandler(this.SelectAisacReference); + // + // toolStripMenuItem6 + // + this.toolStripMenuItem6.Image = global::CsbBuilder.Properties.Resources.Select; + this.toolStripMenuItem6.Name = "toolStripMenuItem6"; + this.toolStripMenuItem6.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem6.Text = "Select Voice Limit Group Reference"; + this.toolStripMenuItem6.ToolTipText = "Select the referenced Voice Limit Group node from the Voice Limit Group tree."; + this.toolStripMenuItem6.Click += new System.EventHandler(this.SelectVoiceLimitGroupReference); + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(254, 6); + // + // setSoundElementReferenceToolStripMenuItem + // + this.setSoundElementReferenceToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.SetReference; + this.setSoundElementReferenceToolStripMenuItem.Name = "setSoundElementReferenceToolStripMenuItem"; + this.setSoundElementReferenceToolStripMenuItem.Size = new System.Drawing.Size(257, 22); + this.setSoundElementReferenceToolStripMenuItem.Text = "Set Sound Element Reference"; + this.setSoundElementReferenceToolStripMenuItem.ToolTipText = "Set the Sound Element reference from the Sound Element tree."; + this.setSoundElementReferenceToolStripMenuItem.Click += new System.EventHandler(this.SetSoundElementReference); + // + // toolStripMenuItem7 + // + this.toolStripMenuItem7.Image = global::CsbBuilder.Properties.Resources.SetReference; + this.toolStripMenuItem7.Name = "toolStripMenuItem7"; + this.toolStripMenuItem7.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem7.Text = "Set AISAC Reference"; + this.toolStripMenuItem7.ToolTipText = "Set the AISAC reference from the AISAC tree."; + this.toolStripMenuItem7.Click += new System.EventHandler(this.SetAisacReference); + // + // toolStripMenuItem8 + // + this.toolStripMenuItem8.Image = global::CsbBuilder.Properties.Resources.SetReference; + this.toolStripMenuItem8.Name = "toolStripMenuItem8"; + this.toolStripMenuItem8.Size = new System.Drawing.Size(257, 22); + this.toolStripMenuItem8.Text = "Set Voice Limit Group Reference"; + this.toolStripMenuItem8.ToolTipText = "Set the Voice Limit Group reference from the Voice Limit Group tree."; + this.toolStripMenuItem8.Click += new System.EventHandler(this.SetVoiceLimitGroupReference); + // + // soundElementMenu + // + this.soundElementMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem34, + this.toolStripSeparator19, + this.toolStripMenuItem24, + this.toolStripMenuItem31, + this.toolStripMenuItem3, + this.toolStripSeparator9, + this.setAudioToolStripMenuItem}); + this.soundElementMenu.Name = "cueAndVoiceLimitGroupMenu"; + this.soundElementMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.soundElementMenu.Size = new System.Drawing.Size(126, 126); + // + // toolStripMenuItem34 + // + this.toolStripMenuItem34.Image = global::CsbBuilder.Properties.Resources.Create; + this.toolStripMenuItem34.Name = "toolStripMenuItem34"; + this.toolStripMenuItem34.Size = new System.Drawing.Size(125, 22); + this.toolStripMenuItem34.Text = "Create"; + this.toolStripMenuItem34.ToolTipText = "Create a new node."; + this.toolStripMenuItem34.Click += new System.EventHandler(this.CreateAndInsertNode); + // + // toolStripSeparator19 + // + this.toolStripSeparator19.Name = "toolStripSeparator19"; + this.toolStripSeparator19.Size = new System.Drawing.Size(122, 6); + // + // toolStripMenuItem24 + // + this.toolStripMenuItem24.Image = global::CsbBuilder.Properties.Resources.Copy; + this.toolStripMenuItem24.Name = "toolStripMenuItem24"; + this.toolStripMenuItem24.Size = new System.Drawing.Size(125, 22); + this.toolStripMenuItem24.Text = "Copy"; + this.toolStripMenuItem24.ToolTipText = "Copy the selected node."; + this.toolStripMenuItem24.Click += new System.EventHandler(this.CopyNode); + // + // toolStripMenuItem31 + // + this.toolStripMenuItem31.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem31.Name = "toolStripMenuItem31"; + this.toolStripMenuItem31.Size = new System.Drawing.Size(125, 22); + this.toolStripMenuItem31.Text = "Paste"; + this.toolStripMenuItem31.ToolTipText = "Paste the copied node after the selected node."; + this.toolStripMenuItem31.Click += new System.EventHandler(this.PasteAndInsertNode); + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Image = global::CsbBuilder.Properties.Resources.Remove; + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(125, 22); + this.toolStripMenuItem3.Text = "Remove"; + this.toolStripMenuItem3.ToolTipText = "Remove the selected node."; + this.toolStripMenuItem3.Click += new System.EventHandler(this.RemoveNode); + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + this.toolStripSeparator9.Size = new System.Drawing.Size(122, 6); + // + // setAudioToolStripMenuItem + // + this.setAudioToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Sound; + this.setAudioToolStripMenuItem.Name = "setAudioToolStripMenuItem"; + this.setAudioToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.setAudioToolStripMenuItem.Text = "Set Audio"; + this.setAudioToolStripMenuItem.ToolTipText = "Set the audio files of this Sound Element node."; + this.setAudioToolStripMenuItem.Click += new System.EventHandler(this.SetAudio); + // + // synthFolderMenu + // + this.synthFolderMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem12, + this.toolStripMenuItem9, + this.toolStripMenuItem10, + this.toolStripSeparator13, + this.toolStripMenuItem25, + this.toolStripMenuItem26, + this.toolStripMenuItem11}); + this.synthFolderMenu.Name = "synthSoundElementAndAisacMenu"; + this.synthFolderMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.synthFolderMenu.Size = new System.Drawing.Size(146, 142); + // + // toolStripMenuItem12 + // + this.toolStripMenuItem12.Image = global::CsbBuilder.Properties.Resources.Create; + this.toolStripMenuItem12.Name = "toolStripMenuItem12"; + this.toolStripMenuItem12.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem12.Text = "Create Track"; + this.toolStripMenuItem12.ToolTipText = "Create a new track (or block) node."; + this.toolStripMenuItem12.Click += new System.EventHandler(this.CreateChildNode); + // + // toolStripMenuItem9 + // + this.toolStripMenuItem9.Image = global::CsbBuilder.Properties.Resources.Sound; + this.toolStripMenuItem9.Name = "toolStripMenuItem9"; + this.toolStripMenuItem9.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem9.Text = "Create Sound"; + this.toolStripMenuItem9.ToolTipText = "Create a new sound node."; + this.toolStripMenuItem9.Click += new System.EventHandler(this.CreateChildSoundNode); + // + // toolStripMenuItem10 + // + this.toolStripMenuItem10.Image = global::CsbBuilder.Properties.Resources.Folder; + this.toolStripMenuItem10.Name = "toolStripMenuItem10"; + this.toolStripMenuItem10.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem10.Text = "Create Folder"; + this.toolStripMenuItem10.ToolTipText = "Create a new folder."; + this.toolStripMenuItem10.Click += new System.EventHandler(this.CreateChildFolder); + // + // toolStripSeparator13 + // + this.toolStripSeparator13.Name = "toolStripSeparator13"; + this.toolStripSeparator13.Size = new System.Drawing.Size(142, 6); + // + // toolStripMenuItem25 + // + this.toolStripMenuItem25.Image = global::CsbBuilder.Properties.Resources.Copy; + this.toolStripMenuItem25.Name = "toolStripMenuItem25"; + this.toolStripMenuItem25.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem25.Text = "Copy"; + this.toolStripMenuItem25.ToolTipText = "Copy the selected node."; + this.toolStripMenuItem25.Click += new System.EventHandler(this.CopyNode); + // + // toolStripMenuItem26 + // + this.toolStripMenuItem26.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem26.Name = "toolStripMenuItem26"; + this.toolStripMenuItem26.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem26.Text = "Paste"; + this.toolStripMenuItem26.ToolTipText = "Paste the copied node as child."; + this.toolStripMenuItem26.Click += new System.EventHandler(this.PasteNode); + // + // toolStripMenuItem11 + // + this.toolStripMenuItem11.Image = global::CsbBuilder.Properties.Resources.Remove; + this.toolStripMenuItem11.Name = "toolStripMenuItem11"; + this.toolStripMenuItem11.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem11.Text = "Remove"; + this.toolStripMenuItem11.ToolTipText = "Remove the selected node."; + this.toolStripMenuItem11.Click += new System.EventHandler(this.RemoveNode); + // + // statusStrip + // + this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.playButton, + this.stopButton, + this.statusLabel}); + this.statusStrip.Location = new System.Drawing.Point(0, 580); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Size = new System.Drawing.Size(878, 22); + this.statusStrip.TabIndex = 10; + this.statusStrip.Text = "statusStrip1"; + // + // playButton + // + this.playButton.DropDownButtonWidth = 0; + this.playButton.Image = global::CsbBuilder.Properties.Resources.Play; + this.playButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.playButton.Name = "playButton"; + this.playButton.Size = new System.Drawing.Size(50, 20); + this.playButton.Text = "Play"; + this.playButton.ButtonClick += new System.EventHandler(this.PlaySound); + // + // stopButton + // + this.stopButton.DropDownButtonWidth = 0; + this.stopButton.Image = global::CsbBuilder.Properties.Resources.Stop; + this.stopButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.stopButton.Name = "stopButton"; + this.stopButton.Size = new System.Drawing.Size(52, 20); + this.stopButton.Text = "Stop"; + this.stopButton.ToolTipText = "Stop"; + this.stopButton.ButtonClick += new System.EventHandler(this.StopSound); + // + // statusLabel + // + this.statusLabel.Name = "statusLabel"; + this.statusLabel.Size = new System.Drawing.Size(0, 17); + // + // aisacNodeMenu + // + this.aisacNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem35, + this.toolStripSeparator20, + this.loadTemplateToolStripMenuItem, + this.saveTemplateToolStripMenuItem, + this.toolStripSeparator21, + this.toolStripMenuItem36, + this.toolStripMenuItem37, + this.toolStripMenuItem38}); + this.aisacNodeMenu.Name = "cueAndVoiceLimitGroupMenu"; + this.aisacNodeMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.aisacNodeMenu.Size = new System.Drawing.Size(153, 148); + // + // toolStripMenuItem35 + // + this.toolStripMenuItem35.Image = global::CsbBuilder.Properties.Resources.Create; + this.toolStripMenuItem35.Name = "toolStripMenuItem35"; + this.toolStripMenuItem35.Size = new System.Drawing.Size(152, 22); + this.toolStripMenuItem35.Text = "Create"; + this.toolStripMenuItem35.ToolTipText = "Create a new node after the selected node."; + this.toolStripMenuItem35.Click += new System.EventHandler(this.CreateAndInsertNode); + // + // toolStripSeparator20 + // + this.toolStripSeparator20.Name = "toolStripSeparator20"; + this.toolStripSeparator20.Size = new System.Drawing.Size(149, 6); + // + // loadTemplateToolStripMenuItem + // + this.loadTemplateToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Template; + this.loadTemplateToolStripMenuItem.Name = "loadTemplateToolStripMenuItem"; + this.loadTemplateToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.loadTemplateToolStripMenuItem.Text = "Load Template"; + this.loadTemplateToolStripMenuItem.Click += new System.EventHandler(this.LoadTemplate); + // + // saveTemplateToolStripMenuItem + // + this.saveTemplateToolStripMenuItem.Image = global::CsbBuilder.Properties.Resources.Template; + this.saveTemplateToolStripMenuItem.Name = "saveTemplateToolStripMenuItem"; + this.saveTemplateToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.saveTemplateToolStripMenuItem.Text = "Save Template"; + this.saveTemplateToolStripMenuItem.Click += new System.EventHandler(this.SaveTemplate); + // + // toolStripSeparator21 + // + this.toolStripSeparator21.Name = "toolStripSeparator21"; + this.toolStripSeparator21.Size = new System.Drawing.Size(149, 6); + // + // toolStripMenuItem36 + // + this.toolStripMenuItem36.Image = global::CsbBuilder.Properties.Resources.Copy; + this.toolStripMenuItem36.Name = "toolStripMenuItem36"; + this.toolStripMenuItem36.Size = new System.Drawing.Size(152, 22); + this.toolStripMenuItem36.Text = "Copy"; + this.toolStripMenuItem36.ToolTipText = "Copy the selected node."; + this.toolStripMenuItem36.Click += new System.EventHandler(this.CopyNode); + // + // toolStripMenuItem37 + // + this.toolStripMenuItem37.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem37.Name = "toolStripMenuItem37"; + this.toolStripMenuItem37.Size = new System.Drawing.Size(152, 22); + this.toolStripMenuItem37.Text = "Paste"; + this.toolStripMenuItem37.ToolTipText = "Paste the copied node after the selected node."; + this.toolStripMenuItem37.Click += new System.EventHandler(this.PasteAndInsertNode); + // + // toolStripMenuItem38 + // + this.toolStripMenuItem38.Image = global::CsbBuilder.Properties.Resources.Remove; + this.toolStripMenuItem38.Name = "toolStripMenuItem38"; + this.toolStripMenuItem38.Size = new System.Drawing.Size(152, 22); + this.toolStripMenuItem38.Text = "Remove"; + this.toolStripMenuItem38.ToolTipText = "Remove the selected node."; + this.toolStripMenuItem38.Click += new System.EventHandler(this.RemoveNode); + // + // aisacFolderMenu + // + this.aisacFolderMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem39, + this.toolStripMenuItem40, + this.toolStripSeparator22, + this.toolStripMenuItem44, + this.toolStripSeparator23, + this.toolStripMenuItem41, + this.toolStripMenuItem42, + this.toolStripMenuItem43}); + this.aisacFolderMenu.Name = "synthSoundElementAndAisacMenu"; + this.aisacFolderMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.aisacFolderMenu.Size = new System.Drawing.Size(189, 148); + // + // toolStripMenuItem39 + // + this.toolStripMenuItem39.Image = global::CsbBuilder.Properties.Resources.Create; + this.toolStripMenuItem39.Name = "toolStripMenuItem39"; + this.toolStripMenuItem39.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem39.Text = "Create"; + this.toolStripMenuItem39.ToolTipText = "Create a new child node."; + this.toolStripMenuItem39.Click += new System.EventHandler(this.CreateChildNode); + // + // toolStripMenuItem40 + // + this.toolStripMenuItem40.Image = global::CsbBuilder.Properties.Resources.Folder; + this.toolStripMenuItem40.Name = "toolStripMenuItem40"; + this.toolStripMenuItem40.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem40.Text = "Create Folder"; + this.toolStripMenuItem40.ToolTipText = "Create a new child folder."; + this.toolStripMenuItem40.Click += new System.EventHandler(this.CreateChildFolder); + // + // toolStripSeparator22 + // + this.toolStripSeparator22.Name = "toolStripSeparator22"; + this.toolStripSeparator22.Size = new System.Drawing.Size(185, 6); + // + // toolStripMenuItem44 + // + this.toolStripMenuItem44.Image = global::CsbBuilder.Properties.Resources.Template; + this.toolStripMenuItem44.Name = "toolStripMenuItem44"; + this.toolStripMenuItem44.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem44.Text = "Load AISAC Template"; + this.toolStripMenuItem44.Click += new System.EventHandler(this.LoadTemplate); + // + // toolStripSeparator23 + // + this.toolStripSeparator23.Name = "toolStripSeparator23"; + this.toolStripSeparator23.Size = new System.Drawing.Size(185, 6); + // + // toolStripMenuItem41 + // + this.toolStripMenuItem41.Image = global::CsbBuilder.Properties.Resources.Copy; + this.toolStripMenuItem41.Name = "toolStripMenuItem41"; + this.toolStripMenuItem41.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem41.Text = "Copy"; + this.toolStripMenuItem41.ToolTipText = "Copy the selected node."; + this.toolStripMenuItem41.Click += new System.EventHandler(this.CopyNode); + // + // toolStripMenuItem42 + // + this.toolStripMenuItem42.Image = global::CsbBuilder.Properties.Resources.Paste; + this.toolStripMenuItem42.Name = "toolStripMenuItem42"; + this.toolStripMenuItem42.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem42.Text = "Paste"; + this.toolStripMenuItem42.ToolTipText = "Paste the copied node as child."; + this.toolStripMenuItem42.Click += new System.EventHandler(this.PasteNode); + // + // toolStripMenuItem43 + // + this.toolStripMenuItem43.Image = global::CsbBuilder.Properties.Resources.Remove; + this.toolStripMenuItem43.Name = "toolStripMenuItem43"; + this.toolStripMenuItem43.Size = new System.Drawing.Size(188, 22); + this.toolStripMenuItem43.Text = "Remove"; + this.toolStripMenuItem43.ToolTipText = "Remove the selected node."; + this.toolStripMenuItem43.Click += new System.EventHandler(this.RemoveNode); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(52, 20); + this.aboutToolStripMenuItem.Text = "About"; + this.aboutToolStripMenuItem.Click += new System.EventHandler(this.ShowAbout); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(878, 602); + this.Controls.Add(this.statusStrip); + this.Controls.Add(this.splitContainer2); + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.propertyGrid); + this.Controls.Add(this.mainMenu); + this.MainMenuStrip = this.mainMenu; + this.Name = "MainForm"; + this.ShowIcon = false; + this.Text = "CSB Builder"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnClose); + this.mainMenu.ResumeLayout(false); + this.mainMenu.PerformLayout(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.tabControl2.ResumeLayout(false); + this.tabPage3.ResumeLayout(false); + this.nodeTreeMenu.ResumeLayout(false); + this.tabControl3.ResumeLayout(false); + this.tabPage4.ResumeLayout(false); + this.synthFolderTreeMenu.ResumeLayout(false); + this.folderTreeMenu.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); + this.splitContainer2.ResumeLayout(false); + this.tabControl4.ResumeLayout(false); + this.tabPage5.ResumeLayout(false); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.aisacTreeMenu.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.nodeMenu.ResumeLayout(false); + this.folderMenu.ResumeLayout(false); + this.trackMenu.ResumeLayout(false); + this.cueReferenceMenu.ResumeLayout(false); + this.trackItemMenu.ResumeLayout(false); + this.soundElementMenu.ResumeLayout(false); + this.synthFolderMenu.ResumeLayout(false); + this.statusStrip.ResumeLayout(false); + this.statusStrip.PerformLayout(); + this.aisacNodeMenu.ResumeLayout(false); + this.aisacFolderMenu.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip mainMenu; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newProjectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem loadProjectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveProjectToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem ımportToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem buildToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem buildCurrentProjectToolStripMenuItem; + private System.Windows.Forms.PropertyGrid propertyGrid; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.TabControl tabControl2; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TreeView cueTree; + private System.Windows.Forms.TabControl tabControl3; + private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.TreeView synthTree; + private System.Windows.Forms.TabControl tabControl4; + private System.Windows.Forms.TabPage tabPage5; + private System.Windows.Forms.TreeView soundElementTree; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.TreeView aisacTree; + private System.Windows.Forms.TreeView voiceLimitGroupTree; + private System.Windows.Forms.ContextMenuStrip nodeMenu; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip folderMenu; + private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem createFolderToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem1; + private System.Windows.Forms.ContextMenuStrip nodeTreeMenu; + private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip folderTreeMenu; + private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem createFolderToolStripMenuItem1; + private System.Windows.Forms.ImageList imageList; + private System.Windows.Forms.ToolStripMenuItem saveProjectAsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem buildCurrentProjectAsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mergeProjectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ımportAndMergeToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip trackMenu; + private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem3; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ContextMenuStrip cueReferenceMenu; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem setReferenceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem setAisacReferenceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem setVoiceLimitGroupReferenceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem selectReferenceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem selectAisacReferenceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem selectVoiceLimitGroupReferenceToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip trackItemMenu; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; + private System.Windows.Forms.ToolStripMenuItem selectSoundElementReferenceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem6; + private System.Windows.Forms.ToolStripMenuItem setSoundElementReferenceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem8; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; + private System.Windows.Forms.ContextMenuStrip soundElementMenu; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; + private System.Windows.Forms.ToolStripMenuItem setAudioToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip synthFolderMenu; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem12; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem9; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem10; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem11; + private System.Windows.Forms.ContextMenuStrip synthFolderTreeMenu; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem13; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem14; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem15; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.ToolStripSplitButton playButton; + private System.Windows.Forms.ToolStripSplitButton stopButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; + private System.Windows.Forms.ToolStripStatusLabel statusLabel; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem16; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem17; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem18; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem19; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem20; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem21; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem22; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem23; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem24; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem25; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem26; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem27; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem28; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem29; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem30; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem31; + private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem32; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator17; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem33; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator18; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem34; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator19; + private System.Windows.Forms.ContextMenuStrip aisacNodeMenu; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem35; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator20; + private System.Windows.Forms.ToolStripMenuItem loadTemplateToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveTemplateToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator21; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem36; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem37; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem38; + private System.Windows.Forms.ContextMenuStrip aisacFolderMenu; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem39; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem40; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator22; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem41; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem42; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem43; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem44; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator23; + private System.Windows.Forms.ContextMenuStrip aisacTreeMenu; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem45; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem46; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator24; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem47; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem48; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator25; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + } +} + diff --git a/Source/CsbBuilder/MainForm.cs b/Source/CsbBuilder/MainForm.cs new file mode 100644 index 0000000..7fefd0d --- /dev/null +++ b/Source/CsbBuilder/MainForm.cs @@ -0,0 +1,2253 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.Serialization; + +using CsbBuilder.Builder; +using CsbBuilder.BuilderNode; +using CsbBuilder.Audio; +using CsbBuilder.Importer; +using CsbBuilder.Project; +using CsbBuilder.Serialization; +using CsbBuilder.Properties; + +using SonicAudioLib.IO; + +using NAudio.Wave; + +namespace CsbBuilder +{ + public partial class MainForm : Form + { + private bool enabled = false; + private bool saved = true; + private CsbProject project = null; + + private TreeNode copiedNode = null; + private TreeView treeViewOfCopiedNode = null; + + private List sounds = new List(); + + public MainForm() + { + InitializeComponent(); + + imageList.Images.Add("Node", Resources.Node); + imageList.Images.Add("Folder", Resources.Folder); + imageList.Images.Add("FolderOpen", Resources.FolderOpen); + imageList.Images.Add("Sound", Resources.Sound); + } + + public void ClearTreeViews() + { + cueTree.Nodes.Clear(); + synthTree.Nodes.Clear(); + soundElementTree.Nodes.Clear(); + aisacTree.Nodes.Clear(); + voiceLimitGroupTree.Nodes.Clear(); + } + + public void ExpandAllTreeViews() + { + cueTree.ExpandAll(); + if (cueTree.Nodes.Count > 0) + { + cueTree.Nodes[0].EnsureVisible(); + } + + synthTree.ExpandAll(); + if (synthTree.Nodes.Count > 0) + { + synthTree.Nodes[0].EnsureVisible(); + } + + soundElementTree.ExpandAll(); + if (soundElementTree.Nodes.Count > 0) + { + soundElementTree.Nodes[0].EnsureVisible(); + } + + aisacTree.ExpandAll(); + if (aisacTree.Nodes.Count > 0) + { + aisacTree.Nodes[0].EnsureVisible(); + } + + voiceLimitGroupTree.ExpandAll(); + if (voiceLimitGroupTree.Nodes.Count > 0) + { + voiceLimitGroupTree.Nodes[0].EnsureVisible(); + } + } + + public void ClearProject() + { + project = null; + ClearTreeViews(); + Text = "CSB Builder"; + saved = true; + } + + public void DisplayOnTreeView() + { + foreach (BuilderCueNode cueNode in project.CueNodes) + { + TreeNode treeNode = new TreeNode(); + treeNode.ContextMenuStrip = cueReferenceMenu; + treeNode.Name = cueNode.Name; + treeNode.Text = treeNode.Name; + treeNode.Tag = cueNode; + cueTree.Nodes.Add(treeNode); + } + + foreach (BuilderSynthNode synthNode in project.SynthNodes) + { + TreeNode treeNode = synthTree.CreateNodesByFullPath(synthNode.Name); + treeNode.ContextMenuStrip = trackMenu; + treeNode.Tag = synthNode; + + if (synthNode.Type == BuilderSynthType.Single) + { + treeNode.ContextMenuStrip = trackItemMenu; + treeNode.ImageIndex = 3; + treeNode.SelectedImageIndex = 3; + } + + while ((treeNode = treeNode.Parent) != null) + { + if (treeNode.Tag == null) + { + treeNode.ContextMenuStrip = synthFolderMenu; + } + } + } + + foreach (BuilderSoundElementNode soundElementNode in project.SoundElementNodes) + { + TreeNode treeNode = soundElementTree.CreateNodesByFullPath(soundElementNode.Name); + treeNode.ContextMenuStrip = soundElementMenu; + treeNode.Tag = soundElementNode; + treeNode.ImageIndex = 3; + treeNode.SelectedImageIndex = 3; + + while ((treeNode = treeNode.Parent) != null) + { + if (treeNode.Tag == null) + { + treeNode.ContextMenuStrip = folderMenu; + } + } + } + + foreach (BuilderAisacNode aisacNode in project.AisacNodes) + { + TreeNode treeNode = aisacTree.CreateNodesByFullPath(aisacNode.Name); + treeNode.ContextMenuStrip = aisacNodeMenu; + treeNode.Tag = aisacNode; + + while ((treeNode = treeNode.Parent) != null) + { + if (treeNode.Tag == null) + { + treeNode.ContextMenuStrip = aisacFolderMenu; + } + } + } + + foreach (BuilderVoiceLimitGroupNode voiceLimitGroupNode in project.VoiceLimitGroupNodes) + { + TreeNode treeNode = new TreeNode(); + treeNode.ContextMenuStrip = nodeMenu; + treeNode.Name = voiceLimitGroupNode.Name; + treeNode.Text = treeNode.Name; + treeNode.Tag = voiceLimitGroupNode; + voiceLimitGroupTree.Nodes.Add(treeNode); + } + } + + public void SetProject(CsbProject project) + { + StopSound(null, null); + + if (!enabled) + { + splitContainer1.Enabled = true; + splitContainer2.Enabled = true; + propertyGrid.Enabled = true; + saveProjectAsToolStripMenuItem.Enabled = true; + saveProjectToolStripMenuItem.Enabled = true; + buildCurrentProjectAsToolStripMenuItem.Enabled = true; + buildCurrentProjectToolStripMenuItem.Enabled = true; + mergeProjectToolStripMenuItem.Enabled = true; + ımportAndMergeToolStripMenuItem.Enabled = true; + enabled = true; + } + + ClearProject(); + this.project = project; + project.Create(); + + DisplayOnTreeView(); + UpdateAllNodes(); + ExpandAllTreeViews(); + + Text += $" - {project.Name}"; + } + + private void CreateNewProject(object sender, EventArgs e) + { + if (AskForSave() == DialogResult.Cancel) + { + return; + } + + using (CreateNewProjectForm newProject = new CreateNewProjectForm()) + { + if (newProject.ShowDialog(this) == DialogResult.OK) + { + SetProject(newProject.Project); + project.Save(); + } + } + } + + private void ImportCsbFile(object sender, EventArgs e) + { + if (AskForSave() == DialogResult.Cancel) + { + return; + } + + using (OpenFileDialog openCsbFile = new OpenFileDialog + { + Title = "Import CSB File", + DefaultExt = "csb", + Filter = "CSB Files|*.csb", + }) + { + if (openCsbFile.ShowDialog() == DialogResult.OK) + { + using (CreateNewProjectForm createProject = new CreateNewProjectForm(openCsbFile.FileName)) + { + if (createProject.ShowDialog(this) == DialogResult.OK) + { + createProject.Project.Create(); + CsbImporter.Import(openCsbFile.FileName, createProject.Project); + SetProject(createProject.Project); + project.Save(); + } + } + } + } + } + + private void OnNodeClick(object sender, TreeNodeMouseClickEventArgs e) + { + e.Node.TreeView.SelectedNode = e.Node; + } + + private TreeNode CreateCueNode(TreeNodeCollection collection, TreeNode parent, int nodeIndex = -1) + { + saved = false; + + int index = 0; + + while (collection.ContainsKey($"Cue_{index}")) + { + index++; + } + + TreeNode treeNode = nodeIndex == -1 ? collection.Add($"Cue_{index}") : collection.Insert(nodeIndex, $"Cue_{index}"); + treeNode.Name = treeNode.Text; + treeNode.ContextMenuStrip = cueReferenceMenu; + BuilderCueNode cueNode = new BuilderCueNode(); + cueNode.Name = treeNode.FullPath; + + if (project.CueNodes.Count > 0) + { + cueNode.Identifier = project.CueNodes.Max(cue => cue.Identifier) + 1; + } + + treeNode.Tag = cueNode; + + project.CueNodes.Add(cueNode); + + treeNode.TreeView.SelectedNode = treeNode; + treeNode.EnsureVisible(); + return treeNode; + } + + private void RemoveNode(BuilderBaseNode node) + { + if (node is BuilderCueNode) + { + project.CueNodes.Remove((BuilderCueNode)node); + } + + else if (node is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)node; + project.SynthNodes.Remove(synthNode); + + project.CueNodes.Where(cue => cue.SynthReference == synthNode.Name).ToList().ForEach(cue => cue.SynthReference = string.Empty); + project.SynthNodes.Where(synth => synth.Children.Contains(synthNode.Name)).ToList().ForEach(synth => synth.Children.Remove(synthNode.Name)); + } + + else if (node is BuilderSoundElementNode) + { + BuilderSoundElementNode soundElementNode = (BuilderSoundElementNode)node; + project.SoundElementNodes.Remove(soundElementNode); + + project.SynthNodes.Where(soundElement => soundElement.SoundElementReference == soundElementNode.Name).ToList().ForEach(synth => synth.SoundElementReference = string.Empty); + } + + else if (node is BuilderAisacNode) + { + BuilderAisacNode aisacNode = (BuilderAisacNode)node; + project.AisacNodes.Remove(aisacNode); + + project.SynthNodes.Where(synth => synth.AisacReference == aisacNode.Name).ToList().ForEach(synth => synth.AisacReference = string.Empty); + } + + else if (node is BuilderVoiceLimitGroupNode) + { + BuilderVoiceLimitGroupNode voiceLimitGroupNode = (BuilderVoiceLimitGroupNode)node; + project.VoiceLimitGroupNodes.Remove(voiceLimitGroupNode); + + project.SynthNodes.Where(synth => synth.VoiceLimitGroupReference == voiceLimitGroupNode.Name).ToList().ForEach(voiceLimitGroup => voiceLimitGroup.VoiceLimitGroupReference = string.Empty); + } + } + + private TreeNode CreateSynthNode(TreeNodeCollection collection, TreeNode parent, int nodeIndex = -1) + { + saved = false; + + int index = 0; + + while (collection.ContainsKey($"Synth_{index}")) + { + index++; + } + + TreeNode treeNode = nodeIndex == -1 ? collection.Add($"Synth_{index}") : collection.Insert(nodeIndex, $"Synth_{index}"); + treeNode.Name = treeNode.Text; + treeNode.ContextMenuStrip = trackMenu; + BuilderSynthNode synthNode = new BuilderSynthNode(); + synthNode.Type = BuilderSynthType.WithChildren; + synthNode.Name = treeNode.FullPath; + treeNode.Tag = synthNode; + project.SynthNodes.Add(synthNode); + + if (parent != null && parent.Tag is BuilderSynthNode) + { + BuilderSynthNode parentSynthNode = (BuilderSynthNode)parent.Tag; + + if (parentSynthNode.Type == BuilderSynthType.WithChildren) + { + parentSynthNode.Children.Add(synthNode.Name); + } + } + + treeNode.TreeView.SelectedNode = treeNode; + treeNode.EnsureVisible(); + return treeNode; + } + + private TreeNode CreateSoundNode(TreeNodeCollection collection, TreeNode parent, int nodeIndex = -1) + { + saved = false; + + int index = 0; + + while (collection.ContainsKey($"Sound_{index}")) + { + index++; + } + + TreeNode treeNode = nodeIndex == -1 ? collection.Add($"Sound_{index}") : collection.Insert(nodeIndex, $"Sound_{index}"); + treeNode.Name = treeNode.Text; + treeNode.ContextMenuStrip = trackItemMenu; + treeNode.ImageIndex = 3; + treeNode.SelectedImageIndex = 3; + BuilderSynthNode synthNode = new BuilderSynthNode(); + synthNode.Name = treeNode.FullPath; + treeNode.Tag = synthNode; + project.SynthNodes.Add(synthNode); + + if (parent != null && parent.Tag is BuilderSynthNode) + { + BuilderSynthNode parentSynthNode = (BuilderSynthNode)parent.Tag; + + if (parentSynthNode.Type == BuilderSynthType.WithChildren) + { + parentSynthNode.Children.Add(synthNode.Name); + } + } + + treeNode.TreeView.SelectedNode = treeNode; + treeNode.EnsureVisible(); + return treeNode; + } + + private TreeNode CreateSoundElementNode(TreeNodeCollection collection, TreeNode parent, int nodeIndex = -1) + { + saved = false; + + int index = 0; + + while (collection.ContainsKey($"SoundElement_{index}")) + { + index++; + } + + TreeNode treeNode = nodeIndex == -1 ? collection.Add($"SoundElement_{index}") : collection.Insert(nodeIndex, $"SoundElement_{index}"); + treeNode.Name = treeNode.Text; + treeNode.ContextMenuStrip = soundElementMenu; + BuilderSoundElementNode soundElementNode = new BuilderSoundElementNode(); + soundElementNode.Name = treeNode.FullPath; + treeNode.Tag = soundElementNode; + treeNode.ImageIndex = 3; + treeNode.SelectedImageIndex = 3; + project.SoundElementNodes.Add(soundElementNode); + + treeNode.TreeView.SelectedNode = treeNode; + treeNode.EnsureVisible(); + return treeNode; + } + + private TreeNode CreateAisacNode(TreeNodeCollection collection, TreeNode parent, int nodeIndex = -1, BuilderAisacNode aisacNodeToImport = null) + { + saved = false; + + int index = 0; + + while (collection.ContainsKey($"AISAC_{index}")) + { + index++; + } + + TreeNode treeNode = nodeIndex == -1 ? collection.Add($"AISAC_{index}") : collection.Insert(nodeIndex, $"AISAC_{index}"); + treeNode.Name = treeNode.Text; + treeNode.ContextMenuStrip = aisacNodeMenu; + BuilderAisacNode aisacNode = aisacNodeToImport != null ? aisacNodeToImport : new BuilderAisacNode(); + aisacNode.Name = treeNode.FullPath; + treeNode.Tag = aisacNode; + project.AisacNodes.Add(aisacNode); + + treeNode.TreeView.SelectedNode = treeNode; + treeNode.EnsureVisible(); + return treeNode; + } + + private TreeNode CreateVoiceLimitGroupNode(TreeNodeCollection collection, TreeNode parent, int nodeIndex = -1) + { + saved = false; + + int index = 0; + + while (collection.ContainsKey($"VoiceLimitGroup_{index}")) + { + index++; + } + + TreeNode treeNode = nodeIndex == -1 ? collection.Add($"VoiceLimitGroup_{index}") : collection.Insert(nodeIndex, $"VoiceLimitGroup_{index}"); + treeNode.Name = treeNode.Text; + treeNode.ContextMenuStrip = nodeMenu; + BuilderVoiceLimitGroupNode voiceLimitGroup = new BuilderVoiceLimitGroupNode(); + voiceLimitGroup.Name = treeNode.FullPath; + treeNode.Tag = voiceLimitGroup; + project.VoiceLimitGroupNodes.Add(voiceLimitGroup); + + treeNode.TreeView.SelectedNode = treeNode; + treeNode.EnsureVisible(); + return treeNode; + } + + private TreeNode CreateFolder(TreeNodeCollection collection, TreeNode parent) + { + saved = false; + + int index = 0; + + while (collection.ContainsKey($"Folder_{index}")) + { + index++; + } + + TreeNode treeNode = collection.Add($"Folder_{index}"); + treeNode.Name = treeNode.Text; + treeNode.ContextMenuStrip = folderMenu; + treeNode.ImageIndex = 1; + treeNode.SelectedImageIndex = 2; + + treeNode.TreeView.SelectedNode = treeNode; + treeNode.EnsureVisible(); + return treeNode; + } + + private TreeNode CreateSynthFolder(TreeNodeCollection collection) + { + saved = false; + + int index = 0; + + while (collection.ContainsKey($"Folder_{index}")) + { + index++; + } + + TreeNode treeNode = collection.Add($"Folder_{index}"); + treeNode.Name = treeNode.Text; + treeNode.ContextMenuStrip = synthFolderMenu; + treeNode.ImageIndex = 1; + treeNode.SelectedImageIndex = 2; + + treeNode.TreeView.SelectedNode = treeNode; + treeNode.EnsureVisible(); + return treeNode; + } + + private void CreateChildNode(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedTree == cueTree) + { + CreateCueNode(selectedTree.Nodes, null); + } + + else if (selectedTree == synthTree) + { + if (selectedNode.Tag is BuilderSynthNode && ((BuilderSynthNode)selectedNode.Tag).Type == BuilderSynthType.WithChildren) + { + CreateSoundNode(selectedNode.Nodes, selectedNode); + } + + else + { + CreateSynthNode(selectedNode.Nodes, selectedNode); + } + } + + else if (selectedTree == soundElementTree) + { + CreateSoundElementNode(selectedNode.Nodes, selectedNode); + } + + else if (selectedTree == aisacTree) + { + CreateAisacNode(selectedNode.Nodes, selectedNode); + } + + else if (selectedTree == voiceLimitGroupTree) + { + CreateVoiceLimitGroupNode(selectedTree.Nodes, null); + } + } + } + + private void CreateNode(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + + if (selectedTree == cueTree) + { + CreateCueNode(selectedTree.Nodes, null); + } + + else if (selectedTree == synthTree) + { + CreateSynthNode(selectedTree.Nodes, null); + } + + else if (selectedTree == soundElementTree) + { + CreateSoundElementNode(selectedTree.Nodes, null); + } + + else if (selectedTree == aisacTree) + { + CreateAisacNode(selectedTree.Nodes, null); + } + + else if (selectedTree == voiceLimitGroupTree) + { + CreateVoiceLimitGroupNode(selectedTree.Nodes, null); + } + } + } + + private void CreateFolder(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + + if (selectedTree == synthTree) + { + CreateSynthFolder(selectedTree.Nodes); + } + + else + { + CreateFolder(selectedTree.Nodes, null); + } + } + } + + private void RemoveNodes(TreeNodeCollection collection) + { + foreach (TreeNode node in collection) + { + if (node.Tag is BuilderBaseNode) + { + RemoveNode((BuilderBaseNode)node.Tag); + } + + RemoveNodes(node.Nodes); + } + } + + private void RemoveNode(TreeNode treeNode) + { + saved = false; + + if (treeNode.Tag is BuilderBaseNode) + { + RemoveNode((BuilderBaseNode)treeNode.Tag); + } + + RemoveNodes(treeNode.Nodes); + treeNode.Remove(); + } + + private void RemoveNode(object sender, EventArgs e) + { + saved = false; + + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + RemoveNode(selectedNode); + } + } + + private void BuildProject(object sender, EventArgs e) + { + project.BinaryDirectory.Create(); + project.Order(cueTree, synthTree, soundElementTree, aisacTree, voiceLimitGroupTree); + Builder.CsbBuilder.Build(project, Path.Combine(project.BinaryDirectory.FullName, project.Name + ".csb")); + + Process.Start(project.BinaryDirectory.FullName); + } + + private void CopyFullPath(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + Clipboard.SetText(selectedNode.FullPath); + } + } + + private void CreateChildFolder(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedTree == synthTree) + { + CreateSynthFolder(selectedNode.Nodes); + } + + else + { + CreateFolder(selectedNode.Nodes, selectedNode); + } + } + } + + private void RenameNode(object sender, TreeNodeMouseClickEventArgs e) + { + e.Node.BeginEdit(); + } + + private void UpdateNodeNoRename(TreeNode treeNode) + { + if (treeNode.Tag is BuilderBaseNode) + { + BuilderBaseNode baseNode = (BuilderBaseNode)treeNode.Tag; + baseNode.Name = treeNode.FullPath; + } + + foreach (TreeNode childNode in treeNode.Nodes) + { + UpdateNodeNoRename(childNode); + } + } + + private void UpdateNodes(TreeNodeCollection collection) + { + foreach (TreeNode treeNode in collection) + { + if (treeNode.Tag is BuilderBaseNode) + { + BuilderBaseNode baseNode = (BuilderBaseNode)treeNode.Tag; + + string previousName = baseNode.Name; + baseNode.Name = treeNode.FullPath; + + // Do it only if it's different, don't waste time + if (previousName != baseNode.Name) + { + string fullPath = baseNode.Name; + if (baseNode is BuilderSynthNode) + { + project.CueNodes.Where(cue => cue.SynthReference == previousName).ToList().ForEach(cue => cue.SynthReference = fullPath); + project.SynthNodes.Where(synth => synth.Children.Contains(previousName)).ToList().ForEach(synth => synth.Children[synth.Children.IndexOf(previousName)] = fullPath); + } + + else if (baseNode is BuilderSoundElementNode) + { + project.SynthNodes.Where(synth => synth.SoundElementReference == previousName).ToList().ForEach(synth => synth.SoundElementReference = fullPath); + } + + else if (baseNode is BuilderAisacNode) + { + project.SynthNodes.Where(synth => synth.AisacReference == previousName).ToList().ForEach(synth => synth.AisacReference = fullPath); + } + + else if (baseNode is BuilderVoiceLimitGroupNode) + { + project.SynthNodes.Where(synth => synth.VoiceLimitGroupReference == previousName).ToList().ForEach(synth => synth.VoiceLimitGroupReference = fullPath); + } + } + } + + else + { + treeNode.ImageIndex = 1; + treeNode.SelectedImageIndex = 2; + } + + UpdateNodes(treeNode.Nodes); + } + } + + private void UpdateAllNodes() + { + UpdateNodes(cueTree.Nodes); + UpdateNodes(synthTree.Nodes); + UpdateNodes(soundElementTree.Nodes); + UpdateNodes(aisacTree.Nodes); + UpdateNodes(voiceLimitGroupTree.Nodes); + } + + private void OnRenameEnd(object sender, NodeLabelEditEventArgs e) + { + if (string.IsNullOrEmpty(e.Label)) + { + e.CancelEdit = true; + return; + } + + saved = false; + string previousName = e.Node.FullPath; + + e.Node.Name = e.Label; + e.Node.Text = e.Label; + + string fullPath = e.Node.FullPath; + + UpdateAllNodes(); + + if (e.Node.Tag is BuilderSynthNode) + { + project.CueNodes.Where(cue => cue.SynthReference == previousName).ToList().ForEach(cue => cue.SynthReference = fullPath); + project.SynthNodes.Where(synth => synth.Children.Contains(previousName)).ToList().ForEach(synth => synth.Children[synth.Children.IndexOf(previousName)] = fullPath); + } + + else if (e.Node.Tag is BuilderSoundElementNode) + { + project.SynthNodes.Where(synth => synth.SoundElementReference == previousName).ToList().ForEach(synth => synth.SoundElementReference = fullPath); + } + + else if (e.Node.Tag is BuilderAisacNode) + { + project.SynthNodes.Where(synth => synth.AisacReference == previousName).ToList().ForEach(synth => synth.AisacReference = fullPath); + } + + else if (e.Node.Tag is BuilderVoiceLimitGroupNode) + { + project.SynthNodes.Where(synth => synth.VoiceLimitGroupReference == previousName).ToList().ForEach(synth => synth.VoiceLimitGroupReference = fullPath); + } + + propertyGrid.Refresh(); + } + + private void OnPropertyChange(object s, PropertyValueChangedEventArgs e) + { + saved = false; + propertyGrid.Refresh(); + } + + private DialogResult AskForSave() + { + DialogResult dialogResult = DialogResult.No; + + if (!saved) + { + dialogResult = MessageBox.Show("Do you want to save your changes?", "CSB Builder", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); + + if (dialogResult == DialogResult.Yes) + { + SaveProject(null, null); + } + } + + return dialogResult; + } + + private void LoadProject(object sender, EventArgs e) + { + if (AskForSave() == DialogResult.Cancel) + { + return; + } + + using (OpenFileDialog openProject = new OpenFileDialog + { + Title = "Open CSB Project File", + Filter = "CSB Project files|*.csbproject", + DefaultExt = "csbproject", + }) + { + if (openProject.ShowDialog() == DialogResult.OK) + { + CsbProject csbProject = CsbProject.Load(openProject.FileName); + + if (!csbProject.AudioDirectory.Exists) + { + MessageBox.Show("Audio directory does not seem to be present for this project. All the audio references will be removed."); + csbProject.SoundElementNodes.ForEach(soundElementNode => soundElementNode.Intro = string.Empty); + csbProject.SoundElementNodes.ForEach(soundElementNode => soundElementNode.Loop = string.Empty); + } + + SetProject(csbProject); + } + } + } + + private void SaveProject(object sender, EventArgs e) + { + project.Order(cueTree, synthTree, soundElementTree, aisacTree, voiceLimitGroupTree); + project.Save(); + saved = true; + } + + private void SaveProjectAs(object sender, EventArgs e) + { + using (SaveFileDialog saveProject = new SaveFileDialog + { + Title = "Save CSB Project File As", + Filter = "CSB Project files|*.csbproject", + DefaultExt = "csbproject", + }) + { + if (saveProject.ShowDialog() == DialogResult.OK) + { + project.Order(cueTree, synthTree, soundElementTree, aisacTree, voiceLimitGroupTree); + project.SaveAs(saveProject.FileName); + saved = true; + + // Reload the project + SetProject(project); + } + } + } + + private void OnClose(object sender, FormClosingEventArgs e) + { + if (AskForSave() == DialogResult.Cancel) + { + e.Cancel = true; + } + } + + private void Exit(object sender, EventArgs e) + { + Close(); + } + + private void BuildProjectAs(object sender, EventArgs e) + { + using (SaveFileDialog buildCsb = new SaveFileDialog() + { + Title = "Build Current Project As", + DefaultExt = "csb", + Filter = "CSB Files|*.csb", + FileName = project.Name, + }) + { + if (buildCsb.ShowDialog() == DialogResult.OK) + { + project.Order(cueTree, synthTree, soundElementTree, aisacTree, voiceLimitGroupTree); + Builder.CsbBuilder.Build(project, buildCsb.FileName); + } + } + } + + private void AfterNodeSelect(object sender, TreeViewEventArgs e) + { + propertyGrid.SelectedObject = e.Node.Tag; + } + + private void MergeProject(object sender, EventArgs e) + { + using (OpenFileDialog openProject = new OpenFileDialog + { + Title = "Merge Project With", + Filter = "CSB Project files|*.csbproject", + DefaultExt = "csbproject", + }) + { + if (openProject.ShowDialog() == DialogResult.OK) + { + CsbProject csbProject = CsbProject.Load(openProject.FileName); + + if (!csbProject.AudioDirectory.Exists) + { + MessageBox.Show("Audio directory does not seem to be present for this project. All the audio references will be removed."); + csbProject.SoundElementNodes.ForEach(soundElementNode => soundElementNode.Intro = string.Empty); + csbProject.SoundElementNodes.ForEach(soundElementNode => soundElementNode.Loop = string.Empty); + } + + else + { + // Copy all to this project's audio folder + foreach (FileInfo audioFile in csbProject.AudioDirectory.EnumerateFiles()) + { + audioFile.CopyTo(Path.Combine(project.AudioDirectory.FullName, audioFile.Name), true); + } + } + + project.CueNodes.AddRange(csbProject.CueNodes); + project.SynthNodes.AddRange(csbProject.SynthNodes); + project.SoundElementNodes.AddRange(csbProject.SoundElementNodes); + project.AisacNodes.AddRange(csbProject.AisacNodes); + project.VoiceLimitGroupNodes.AddRange(csbProject.VoiceLimitGroupNodes); + + // Reload + SetProject(project); + } + } + } + + private void ImportAndMergeProject(object sender, EventArgs e) + { + using (OpenFileDialog openCsbFile = new OpenFileDialog + { + Title = "Import And Merge CSB File With", + DefaultExt = "csb", + Filter = "CSB Files|*.csb", + }) + { + if (openCsbFile.ShowDialog() == DialogResult.OK) + { + CsbProject csbProject = new CsbProject(); + csbProject.Directory = project.Directory; + CsbImporter.Import(openCsbFile.FileName, csbProject); + + project.CueNodes.AddRange(csbProject.CueNodes); + project.SynthNodes.AddRange(csbProject.SynthNodes); + project.SoundElementNodes.AddRange(csbProject.SoundElementNodes); + project.AisacNodes.AddRange(csbProject.AisacNodes); + project.VoiceLimitGroupNodes.AddRange(csbProject.VoiceLimitGroupNodes); + + // Reload + SetProject(project); + } + } + } + + private void OnKeyDown(object sender, KeyEventArgs e) + { + TreeView treeView = (TreeView)sender; + + if (e.KeyCode == Keys.Delete && treeView.SelectedNode != null) + { + RemoveNode(treeView.SelectedNode); + } + + else if (e.Control && e.KeyCode == Keys.C && treeView.SelectedNode != null) + { + CopyNode(treeView.SelectedNode); + } + + else if (e.Control && e.KeyCode == Keys.V && treeView == treeViewOfCopiedNode) + { + if (treeView.SelectedNode == null) + { + PasteNode(); + } + + else if (treeView.SelectedNode != null && (treeView.SelectedNode.Tag == null || (treeView.SelectedNode.Tag is BuilderSynthNode && ((BuilderSynthNode)treeView.SelectedNode.Tag).Type == BuilderSynthType.WithChildren))) + { + PasteAsChildNode(treeView.SelectedNode); + } + + else if (treeView.SelectedNode != null && treeView.SelectedNode.Tag != null) + { + PasteNode(treeView.SelectedNode.Index + 1); + } + } + + else if (e.KeyCode == Keys.Enter && treeView.SelectedNode != null) + { + treeView.SelectedNode.BeginEdit(); + } + } + + private bool CheckIfAny(TreeView treeView) + { + foreach (TreeNode treeNode in treeView.Nodes) + { + if (CheckIfAny(treeNode)) + { + return true; + } + } + + return false; + } + + private bool CheckIfAny(TreeNode treeNode) + { + if (treeNode.Tag != null) + { + return true; + } + + foreach (TreeNode childNode in treeNode.Nodes) + { + if (CheckIfAny(childNode)) + { + return true; + } + } + + return false; + } + + private void SetAisacReference(object sender, EventArgs e) + { + if (!CheckIfAny(aisacTree)) + { + MessageBox.Show("This project does not contain any Aisac nodes.", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + using (SetReferenceForm setReferenceForm = new SetReferenceForm(aisacTree)) + { + if (setReferenceForm.ShowDialog(this) == DialogResult.OK) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)selectedNode.Tag; + + if (setReferenceForm.SelectedNode == null) + { + synthNode.AisacReference = string.Empty; + } + + else + { + synthNode.AisacReference = setReferenceForm.SelectedNode.FullPath; + } + } + + saved = false; + propertyGrid.Refresh(); + } + } + } + } + + private void SetVoiceLimitGroupReference(object sender, EventArgs e) + { + if (voiceLimitGroupTree.Nodes.Count == 0) + { + MessageBox.Show("This project does not contain any Voice Limit Group nodes.", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + using (SetReferenceForm setReferenceForm = new SetReferenceForm(voiceLimitGroupTree)) + { + if (setReferenceForm.ShowDialog(this) == DialogResult.OK) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)selectedNode.Tag; + + if (setReferenceForm.SelectedNode == null) + { + synthNode.VoiceLimitGroupReference = string.Empty; + } + + else + { + synthNode.VoiceLimitGroupReference = setReferenceForm.SelectedNode.FullPath; + } + } + + saved = false; + propertyGrid.Refresh(); + } + } + } + } + + private void SetSynthReference(object sender, EventArgs e) + { + if (!CheckIfAny(synthTree)) + { + MessageBox.Show("This project does not contain any Synth nodes.", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + using (SetReferenceForm setReferenceForm = new SetReferenceForm(synthTree)) + { + if (setReferenceForm.ShowDialog(this) == DialogResult.OK) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag is BuilderCueNode) + { + BuilderCueNode cueNode = (BuilderCueNode)selectedNode.Tag; + + if (setReferenceForm.SelectedNode == null) + { + cueNode.SynthReference = string.Empty; + } + + else + { + cueNode.SynthReference = setReferenceForm.SelectedNode.FullPath; + } + } + + saved = false; + propertyGrid.Refresh(); + } + } + } + } + + private void SelectSynthReference(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag is BuilderCueNode) + { + BuilderCueNode cueNode = (BuilderCueNode)selectedNode.Tag; + if (!string.IsNullOrEmpty(cueNode.SynthReference)) + { + TreeNode treeNode = synthTree.FindNodeByFullPath(cueNode.SynthReference); + + synthTree.SelectedNode = treeNode; + treeNode.EnsureVisible(); + synthTree.Focus(); + } + } + } + } + + private void SelectAisacReference(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)selectedNode.Tag; + if (!string.IsNullOrEmpty(synthNode.AisacReference)) + { + TreeNode treeNode = aisacTree.FindNodeByFullPath(synthNode.AisacReference); + + tabControl1.SelectTab(tabPage1); + aisacTree.SelectedNode = treeNode; + treeNode.EnsureVisible(); + aisacTree.Focus(); + } + } + } + } + + private void SelectVoiceLimitGroupReference(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)selectedNode.Tag; + if (!string.IsNullOrEmpty(synthNode.VoiceLimitGroupReference)) + { + TreeNode treeNode = voiceLimitGroupTree.FindNodeByFullPath(synthNode.VoiceLimitGroupReference); + + tabControl1.SelectTab(tabPage2); + voiceLimitGroupTree.SelectedNode = treeNode; + treeNode.EnsureVisible(); + voiceLimitGroupTree.Focus(); + } + } + } + } + + private void SelectSoundElementReference(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)selectedNode.Tag; + if (!string.IsNullOrEmpty(synthNode.SoundElementReference)) + { + TreeNode treeNode = soundElementTree.FindNodeByFullPath(synthNode.SoundElementReference); + + soundElementTree.SelectedNode = treeNode; + treeNode.EnsureVisible(); + soundElementTree.Focus(); + } + } + } + } + + private void SetSoundElementReference(object sender, EventArgs e) + { + if (!CheckIfAny(soundElementTree)) + { + MessageBox.Show("This project does not contain any Sound nodes.", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + using (SetReferenceForm setReferenceForm = new SetReferenceForm(soundElementTree)) + { + if (setReferenceForm.ShowDialog(this) == DialogResult.OK) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)selectedNode.Tag; + + if (setReferenceForm.SelectedNode == null) + { + synthNode.SoundElementReference = string.Empty; + } + + else + { + synthNode.SoundElementReference = setReferenceForm.SelectedNode.FullPath; + } + } + + saved = false; + propertyGrid.Refresh(); + } + } + } + } + + private void SetAudio(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + BuilderSoundElementNode soundElementNode = (BuilderSoundElementNode)selectedNode.Tag; + + if (selectedNode.Tag is BuilderSoundElementNode) + { + string intro = soundElementNode.Intro; + if (!string.IsNullOrEmpty(intro)) + { + intro = Path.Combine(project.AudioDirectory.FullName, intro); + } + + string loop = soundElementNode.Loop; + if (!string.IsNullOrEmpty(loop)) + { + loop = Path.Combine(project.AudioDirectory.FullName, loop); + } + + using (SetAudioForm setAudioForm = new SetAudioForm(intro, loop)) + { + if (setAudioForm.ShowDialog(this) == DialogResult.OK) + { + uint sampleRate = soundElementNode.SampleRate; + byte channelCount = soundElementNode.ChannelCount; + + uint introSampleCount = 0; + soundElementNode.Intro = project.AddAudio(setAudioForm.Intro); + if (!string.IsNullOrEmpty(setAudioForm.Intro)) + { + ReadAdx(setAudioForm.Intro, out sampleRate, out channelCount, out introSampleCount); + } + + uint loopSampleCount = 0; + soundElementNode.Loop = project.AddAudio(setAudioForm.Loop); + if (!string.IsNullOrEmpty(setAudioForm.Loop)) + { + ReadAdx(setAudioForm.Loop, out sampleRate, out channelCount, out loopSampleCount); + } + + soundElementNode.SampleRate = sampleRate; + soundElementNode.ChannelCount = channelCount; + soundElementNode.SampleCount = introSampleCount + loopSampleCount; + propertyGrid.Refresh(); + } + } + } + } + } + + public void ReadAdx(string path, out uint sampleRate, out byte channelCount, out uint sampleCount) + { + AdxHeader header = AdxConverter.LoadHeader(path); + sampleRate = header.SampleRate; + channelCount = header.ChannelCount; + sampleCount = header.SampleCount; + } + + private void CreateChildSoundNode(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag == null) + { + CreateSoundNode(selectedNode.Nodes, selectedNode); + } + } + } + + private void CreateSound(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + + CreateSoundNode(selectedTree.Nodes, null); + } + } + + private int GetByteCountFromMiliseconds(int miliseconds, int sampleRate, int channelCount, int bitsPerSample) + { + return (int)(miliseconds * sampleRate / 1000.0) * channelCount * bitsPerSample / 8; + } + + private void AddSoundElementSound(BuilderSoundElementNode soundElementNode, double volume, double pitch, int sampleCount, int delayTime) + { + BufferedWaveProvider provider = null; + int delayInBytes = 0; + + if (!string.IsNullOrEmpty(soundElementNode.Intro)) + { + provider = AdxConverter.Decode(project.GetFullAudioPath(soundElementNode.Intro), volume, pitch); + + if (delayTime != 0) + { + delayInBytes = GetByteCountFromMiliseconds(delayTime, provider.WaveFormat.SampleRate, provider.WaveFormat.Channels, provider.WaveFormat.BitsPerSample); + + byte[] buffer = new byte[provider.BufferLength]; + provider.Read(buffer, 0, buffer.Length); + + provider = new BufferedWaveProvider(provider.WaveFormat); + provider.BufferLength = delayInBytes + buffer.Length; + provider.ReadFully = false; + + provider.AddSamples(new byte[delayInBytes], 0, delayInBytes); + provider.AddSamples(buffer, 0, buffer.Length); + } + } + + // If there's ANYTHING that can loop audio files in NAudio... please, tell me! + if (!string.IsNullOrEmpty(soundElementNode.Loop)) + { + BufferedWaveProvider loopProvider = AdxConverter.Decode(project.GetFullAudioPath(soundElementNode.Loop), volume, pitch); + + if (provider == null && delayTime != 0) + { + delayInBytes = GetByteCountFromMiliseconds(delayTime, loopProvider.WaveFormat.SampleRate, loopProvider.WaveFormat.Channels, loopProvider.WaveFormat.BitsPerSample); + } + + int writtenByteCount = 0; + + byte[] intro = null; + + byte[] loop = new byte[loopProvider.BufferLength]; + loopProvider.Read(loop, 0, loop.Length); + + if (provider != null) + { + intro = new byte[provider.BufferLength]; + provider.Read(intro, 0, intro.Length); + } + + provider = new BufferedWaveProvider(loopProvider.WaveFormat); + provider.BufferLength = 0; + + if (sampleCount != -1) + { + provider.BufferLength = delayInBytes + (sampleCount * provider.WaveFormat.Channels * provider.WaveFormat.BitsPerSample / 8); + } + + else + { + if (intro != null) + { + provider.BufferLength += intro.Length; + } + + provider.BufferLength += loop.Length; + } + + provider.ReadFully = false; + + if (intro != null) + { + provider.AddSamples(intro, 0, intro.Length); + writtenByteCount += intro.Length; + } + + else if (intro == null && delayTime != 0) + { + provider.BufferLength += delayInBytes; + provider.AddSamples(new byte[delayInBytes], 0, delayInBytes); + writtenByteCount += delayInBytes; + } + + if (sampleCount != -1) + { + while (writtenByteCount < provider.BufferLength) + { + if ((writtenByteCount + loop.Length) > provider.BufferLength) + { + provider.AddSamples(loop, 0, provider.BufferLength - writtenByteCount); + break; + } + + writtenByteCount += loop.Length; + provider.AddSamples(loop, 0, loop.Length); + } + } + + else + { + provider.AddSamples(loop, 0, loop.Length); + } + } + + if (provider != null) + { + WaveOut sound = new WaveOut(); + sound.Init(provider); + sounds.Add(sound); + } + } + + private void AddSoundElementSound(TreeNode soundElementTreeNode, double volume, double pitch, int sampleCount, int delayTime) + { + BuilderSoundElementNode soundElementNode = (BuilderSoundElementNode)soundElementTreeNode.Tag; + AddSoundElementSound(soundElementNode, volume, pitch, sampleCount, delayTime); + } + + private double GetSecondsFromSampleCount(int sampleCount, int sampleRate) + { + return sampleCount / (double)sampleRate; + } + + private void GetTheBiggestSampleCount(TreeNode synthTreeNode, ref int sampleCount) + { + if (synthTreeNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)synthTreeNode.Tag; + + if (synthNode.Type == BuilderSynthType.Single && !string.IsNullOrEmpty(synthNode.SoundElementReference)) + { + BuilderSoundElementNode soundElementNode = (BuilderSoundElementNode)soundElementTree.FindNodeByFullPath(synthNode.SoundElementReference).Tag; + + // We want the loop to be at least 10 seconds + int soundElementSampleCount = (int)soundElementNode.SampleCount; + + while (GetSecondsFromSampleCount(soundElementSampleCount, (int)soundElementNode.SampleRate) < 10.0) + { + soundElementSampleCount *= 2; + } + + if (soundElementSampleCount > sampleCount) + { + sampleCount = soundElementSampleCount; + } + } + } + + foreach (TreeNode childNode in synthTreeNode.Nodes) + { + GetTheBiggestSampleCount(childNode, ref sampleCount); + } + } + + private double GetAbsolutePitch(TreeNode synthTreeNode) + { + double pitch = 0; + + while (synthTreeNode != null) + { + if (synthTreeNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)synthTreeNode.Tag; + pitch += synthNode.Pitch; + } + + synthTreeNode = synthTreeNode.Parent; + } + + return pitch / 1000.0; + } + + private double GetAbsoluteVolume(TreeNode synthTreeNode) + { + double volume = 1000; + + while (synthTreeNode != null) + { + if (synthTreeNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)synthTreeNode.Tag; + volume = (volume * synthNode.Volume) / 1000; + } + + synthTreeNode = synthTreeNode.Parent; + } + + return volume / 1000.0; + } + + private int GetAbsoluteDelayTime(TreeNode synthTreeNode) + { + int delayTime = 0; + + while (synthTreeNode != null) + { + if (synthTreeNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)synthTreeNode.Tag; + delayTime += (int)synthNode.DelayTime; + } + + synthTreeNode = synthTreeNode.Parent; + } + + return delayTime; + } + + private void AddSynthSound(TreeNode synthTreeNode, int sampleCount) + { + BuilderSynthNode synthNode = (BuilderSynthNode)synthTreeNode.Tag; + + if (synthNode.Type == BuilderSynthType.WithChildren) + { + if (synthNode.PlaybackType == BuilderSynthPlaybackType.RandomNoRepeat || synthNode.PlaybackType == BuilderSynthPlaybackType.Random) + { + TreeNode childNode = synthTreeNode.Nodes[synthNode.RandomChildNode]; + BuilderSynthNode childSynthNode = (BuilderSynthNode)childNode.Tag; + + if (childSynthNode.Type == BuilderSynthType.Single && !string.IsNullOrEmpty(childSynthNode.SoundElementReference) && childSynthNode.PlayThisTurn) + { + AddSoundElementSound(soundElementTree.FindNodeByFullPath(childSynthNode.SoundElementReference), GetAbsoluteVolume(childNode), GetAbsolutePitch(childNode), sampleCount, GetAbsoluteDelayTime(childNode)); + } + + else if (childSynthNode.Type == BuilderSynthType.WithChildren) + { + AddSynthSound(childNode, sampleCount); + } + } + + else if (synthNode.PlaybackType == BuilderSynthPlaybackType.Sequential) + { + TreeNode childNode = synthTreeNode.Nodes[synthNode.NextChildNode]; + BuilderSynthNode childSynthNode = (BuilderSynthNode)childNode.Tag; + + if (childSynthNode.Type == BuilderSynthType.Single && !string.IsNullOrEmpty(childSynthNode.SoundElementReference) && childSynthNode.PlayThisTurn) + { + AddSoundElementSound(soundElementTree.FindNodeByFullPath(childSynthNode.SoundElementReference), GetAbsoluteVolume(childNode), GetAbsolutePitch(childNode), sampleCount, GetAbsoluteDelayTime(childNode)); + } + + else if (childSynthNode.Type == BuilderSynthType.WithChildren) + { + AddSynthSound(childNode, sampleCount); + } + } + + else + { + foreach (TreeNode childNode in synthTreeNode.Nodes) + { + BuilderSynthNode childSynthNode = (BuilderSynthNode)childNode.Tag; + + if (childSynthNode.Type == BuilderSynthType.Single && !string.IsNullOrEmpty(childSynthNode.SoundElementReference) && childSynthNode.PlayThisTurn) + { + AddSoundElementSound(soundElementTree.FindNodeByFullPath(childSynthNode.SoundElementReference), GetAbsoluteVolume(childNode), GetAbsolutePitch(childNode), sampleCount, GetAbsoluteDelayTime(childNode)); + } + + else if (childSynthNode.Type == BuilderSynthType.WithChildren) + { + AddSynthSound(childNode, sampleCount); + } + } + } + } + + else if (synthNode.Type == BuilderSynthType.Single) + { + if (!string.IsNullOrEmpty(synthNode.SoundElementReference) && synthNode.PlayThisTurn) + { + AddSoundElementSound(soundElementTree.FindNodeByFullPath(synthNode.SoundElementReference), synthNode.Volume / 1000.0, synthNode.Pitch / 1000.0, GetTheBiggestSampleCount(synthTreeNode), (int)synthNode.DelayTime); + } + } + } + + private int GetTheBiggestSampleCount(TreeNode synthNode) + { + int sampleCount = -1; + GetTheBiggestSampleCount(synthNode, ref sampleCount); + + return sampleCount; + } + + private void PlaySound(object sender, EventArgs e) + { + StopSound(sender, e); + + if (cueTree.Focused && cueTree.SelectedNode != null && cueTree.SelectedNode.Tag is BuilderCueNode) + { + BuilderCueNode cueNode = (BuilderCueNode)cueTree.SelectedNode.Tag; + + if (!string.IsNullOrEmpty(cueNode.SynthReference)) + { + TreeNode synthNode = synthTree.FindNodeByFullPath(cueNode.SynthReference); + AddSynthSound(synthNode, GetTheBiggestSampleCount(synthNode)); + } + } + + else if (soundElementTree.Focused && soundElementTree.SelectedNode != null && soundElementTree.SelectedNode.Tag is BuilderSoundElementNode) + { + AddSoundElementSound(soundElementTree.SelectedNode, 1, 0, -1, 0); + } + + else if (synthTree.Focused && synthTree.SelectedNode != null && synthTree.SelectedNode.Tag is BuilderSynthNode) + { + AddSynthSound(synthTree.SelectedNode, GetTheBiggestSampleCount(synthTree.SelectedNode)); + } + + sounds.ForEach(sound => sound.Play()); + } + + private void StopSound(object sender, EventArgs e) + { + sounds.ForEach(sound => + { + sound.Stop(); + sound.Dispose(); + }); + + sounds.Clear(); + } + + private TreeNode CloneNode(TreeNode treeNode) + { + TreeNode clonedNode = (TreeNode)treeNode.Clone(); + CloneTag(clonedNode); + + return clonedNode; + } + + private void CloneTag(TreeNode treeNode) + { + if (treeNode.Tag != null && treeNode.Tag is ICloneable) + { + treeNode.Tag = ((ICloneable)treeNode.Tag).Clone(); + } + + foreach (TreeNode childNode in treeNode.Nodes) + { + CloneTag(childNode); + } + } + + private void CopyNode(TreeNode treeNode) + { + treeViewOfCopiedNode = treeNode.TreeView; + copiedNode = CloneNode(treeNode); + } + + private void CopyNode(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + CopyNode(selectedNode); + } + } + + private void AddToProject(TreeNode treeNode) + { + if (treeNode.Tag is BuilderCueNode) + { + BuilderCueNode cueNode = (BuilderCueNode)treeNode.Tag; + + // Do checks + if (!string.IsNullOrEmpty(cueNode.SynthReference) && synthTree.FindNodeByFullPath(cueNode.SynthReference) == null) + { + cueNode.SynthReference = string.Empty; + } + + project.CueNodes.Add(cueNode); + } + + else if (treeNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)treeNode.Tag; + + if (!string.IsNullOrEmpty(synthNode.SoundElementReference) && soundElementTree.FindNodeByFullPath(synthNode.SoundElementReference) == null) + { + synthNode.SoundElementReference = string.Empty; + } + + if (!string.IsNullOrEmpty(synthNode.AisacReference) && aisacTree.FindNodeByFullPath(synthNode.AisacReference) == null) + { + synthNode.AisacReference = string.Empty; + } + + if (!string.IsNullOrEmpty(synthNode.VoiceLimitGroupReference) && !voiceLimitGroupTree.Nodes.ContainsKey(synthNode.VoiceLimitGroupReference)) + { + synthNode.VoiceLimitGroupReference = string.Empty; + } + + project.SynthNodes.Add(synthNode); + } + + if (treeNode.Tag is BuilderSoundElementNode) + { + BuilderSoundElementNode soundElementNode = (BuilderSoundElementNode)treeNode.Tag; + + if (!string.IsNullOrEmpty(soundElementNode.Intro) && !File.Exists(project.GetFullAudioPath(soundElementNode.Intro))) + { + soundElementNode.Intro = string.Empty; + } + + if (!string.IsNullOrEmpty(soundElementNode.Loop) && !File.Exists(project.GetFullAudioPath(soundElementNode.Loop))) + { + soundElementNode.Loop = string.Empty; + } + + project.SoundElementNodes.Add(soundElementNode); + } + + if (treeNode.Tag is BuilderAisacNode) + { + project.AisacNodes.Add((BuilderAisacNode)treeNode.Tag); + } + + if (treeNode.Tag is BuilderVoiceLimitGroupNode) + { + project.VoiceLimitGroupNodes.Add((BuilderVoiceLimitGroupNode)treeNode.Tag); + } + } + + private void PasteAsChildNode(TreeNode parent, int nodeIndex = -1) + { + saved = false; + + TreeNode nodeToPaste = CloneNode(copiedNode); + + // Look for any duplicates + int index = -1; + string name = nodeToPaste.Name; + + while (parent.Nodes.ContainsKey(nodeToPaste.Name)) + { + nodeToPaste.Name = $"{name}_Copy{++index}"; + } + + nodeToPaste.Text = nodeToPaste.Name; + + // paste it now + if (nodeIndex == -1) + { + parent.Nodes.Add(nodeToPaste); + } + + else + { + parent.Nodes.Insert(nodeIndex, nodeToPaste); + } + + // Update the CSB node and its children (will prevent some issues) + UpdateNodeNoRename(nodeToPaste); + + // fix node if the tree is synthTree, and the nodes are synth nodes + if (parent.TreeView == synthTree && parent.Tag is BuilderSynthNode && nodeToPaste.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)parent.Tag; + BuilderSynthNode copiedSynthNode = (BuilderSynthNode)nodeToPaste.Tag; + + if (synthNode.Type == BuilderSynthType.WithChildren) + { + // add the new node to track's children + synthNode.Children.Add(copiedSynthNode.Name); + } + } + + AddToProject(nodeToPaste); + + nodeToPaste.TreeView.SelectedNode = nodeToPaste; + nodeToPaste.EnsureVisible(); + } + + private void PasteNode(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedTree == treeViewOfCopiedNode) + { + // Parent is a CSB node but the copied object is a folder? abort. + if (selectedNode.Tag != null && copiedNode.Tag == null) + { + return; + } + + PasteAsChildNode(selectedNode); + } + } + } + + private void PasteNode(int nodeIndex = -1) + { + saved = false; + + TreeNode nodeToPaste = CloneNode(copiedNode); + + // check if it's cue and fix duplicate identifier if needed + if (nodeToPaste.Tag is BuilderCueNode) + { + BuilderCueNode cueNode = (BuilderCueNode)nodeToPaste.Tag; + + while (project.CueNodes.Exists(cue => cue.Identifier == cueNode.Identifier)) + { + cueNode.Identifier++; + } + } + + // paste + if (treeViewOfCopiedNode.SelectedNode != null && treeViewOfCopiedNode.SelectedNode.Parent != null) + { + // Look for any duplicates + int index = -1; + string name = nodeToPaste.Name; + + while (treeViewOfCopiedNode.SelectedNode.Parent.Nodes.ContainsKey(nodeToPaste.Name)) + { + nodeToPaste.Name = $"{name}_Copy{++index}"; + } + + nodeToPaste.Text = nodeToPaste.Name; + + if (nodeIndex == -1) + { + treeViewOfCopiedNode.SelectedNode.Parent.Nodes.Add(nodeToPaste); + } + + else + { + treeViewOfCopiedNode.SelectedNode.Parent.Nodes.Insert(nodeIndex, nodeToPaste); + } + } + + else + { + // Look for any duplicates + int index = -1; + string name = nodeToPaste.Name; + + while (treeViewOfCopiedNode.Nodes.ContainsKey(nodeToPaste.Name)) + { + nodeToPaste.Name = $"{name}_Copy{++index}"; + } + + nodeToPaste.Text = nodeToPaste.Name; + + if (nodeIndex == -1) + { + treeViewOfCopiedNode.Nodes.Add(nodeToPaste); + } + + else + { + treeViewOfCopiedNode.Nodes.Insert(nodeIndex, nodeToPaste); + } + } + + // update the CSB node and its children + UpdateNodeNoRename(nodeToPaste); + AddToProject(nodeToPaste); + + nodeToPaste.TreeView.SelectedNode = nodeToPaste; + nodeToPaste.EnsureVisible(); + } + + private void PasteNodeOnTree(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + + if (selectedTree == treeViewOfCopiedNode) + { + PasteNode(); + } + } + } + + private void PasteAndInsertNode(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedTree == treeViewOfCopiedNode) + { + PasteNode(selectedNode.Index + 1); + } + } + } + + private void ShowAbout(object sender, EventArgs e) + { + MessageBox.Show($"{Program.ApplicationVersion} by Skyth (blueskythlikesclouds)", "CSB Builder"); + } + + private void CreateChildTrackNode(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedTree == synthTree) + { + CreateSynthNode(selectedNode.Nodes, selectedNode); + } + } + } + + private void CreateAndInsertNode(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedTree == cueTree) + { + CreateCueNode(selectedTree.Nodes, null, selectedNode.Index + 1); + } + + else if (selectedTree == synthTree) + { + if (selectedNode.Tag is BuilderSynthNode && ((BuilderSynthNode)selectedNode.Tag).Type == BuilderSynthType.WithChildren) + { + CreateSoundNode(selectedNode.Nodes, selectedNode, selectedNode.Index + 1); + } + + else + { + CreateSynthNode(selectedNode.Nodes, selectedNode, selectedNode.Index + 1); + } + } + + else if (selectedTree == soundElementTree) + { + CreateSoundElementNode(selectedNode.Parent != null ? selectedNode.Parent.Nodes : selectedTree.Nodes, selectedNode, selectedNode.Index + 1); + } + + else if (selectedTree == aisacTree) + { + CreateAisacNode(selectedNode.Nodes, selectedNode, selectedNode.Index + 1); + } + + else if (selectedTree == voiceLimitGroupTree) + { + CreateVoiceLimitGroupNode(selectedTree.Nodes, null, selectedNode.Index + 1); + } + } + } + + private void CreateAndInsertSoundNode(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedNode.Tag is BuilderSynthNode) + { + if (selectedNode.Parent == null) + { + CreateSoundNode(synthTree.Nodes, null, selectedNode.Index + 1); + } + + else + { + CreateSoundNode(selectedNode.Parent.Nodes, selectedNode.Parent, selectedNode.Index + 1); + } + } + } + } + + private void LoadTemplate(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedTree == aisacTree) + { + using (OpenFileDialog openAisacTemplate = new OpenFileDialog() + { + Title = "Load AISAC Template", + Filter = "XML Files|*.xml", + DefaultExt = "xml", + FileName = selectedNode != null ? selectedNode.Name : string.Empty, + }) + { + if (openAisacTemplate.ShowDialog() == DialogResult.OK) + { + XmlSerializer aisacSerializer = new XmlSerializer(typeof(BuilderAisacNode)); + + try + { + using (Stream source = File.OpenRead(openAisacTemplate.FileName)) + { + BuilderAisacNode aisacNode = (BuilderAisacNode)aisacSerializer.Deserialize(source); + TreeNode aisacTreeNode = null; + + // folder + if (selectedNode != null && selectedNode.Tag == null) + { + aisacTreeNode = CreateAisacNode(selectedNode.Nodes, selectedNode, -1, aisacNode); + } + + // aisac + else if (selectedNode != null && selectedNode.Tag is BuilderAisacNode) + { + project.AisacNodes[project.AisacNodes.IndexOf((BuilderAisacNode)selectedNode.Tag)] = aisacNode; + + aisacNode.Name = selectedNode.FullPath; + selectedNode.Tag = aisacNode; + selectedTree.SelectedNode = selectedNode; + } + + // nothing, create a new aisac + else if (selectedNode == null) + { + aisacTreeNode = CreateAisacNode(aisacTree.Nodes, null, -1, aisacNode); + } + + // fix the current aisac if it was imported + if (aisacTreeNode != null) + { + if (!string.IsNullOrEmpty(aisacNode.Name)) + { + // duplicate? fix it really quick + string name = Path.GetFileName(aisacNode.Name); + string uniqueName = name; + + TreeNodeCollection collection = aisacTreeNode.Parent != null ? aisacTreeNode.Parent.Nodes : aisacTree.Nodes; + + int index = -1; + while (collection.ContainsKey(uniqueName)) + { + uniqueName = $"{name}_{++index}"; + } + + aisacTreeNode.Name = uniqueName; + aisacTreeNode.Text = aisacTreeNode.Name; + } + + aisacNode.Name = aisacTreeNode.FullPath; + aisacTreeNode.Tag = aisacNode; + + selectedTree.SelectedNode = aisacTreeNode; + aisacTreeNode.EnsureVisible(); + } + } + } + + catch + { + MessageBox.Show("The template file is invalid.", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + } + } + + private void SaveTemplate(object sender, EventArgs e) + { + ContextMenuStrip menuStrip = (ContextMenuStrip)((ToolStripItem)sender).Owner; + + if (menuStrip.SourceControl is TreeView) + { + TreeView selectedTree = (TreeView)menuStrip.SourceControl; + TreeNode selectedNode = selectedTree.SelectedNode; + + if (selectedTree == aisacTree) + { + using (SaveFileDialog saveAisacTemplate = new SaveFileDialog() + { + Title = "Save AISAC Template", + Filter = "XML Files|*.xml", + DefaultExt = "xml", + FileName = selectedNode.Name, + }) + { + if (saveAisacTemplate.ShowDialog() == DialogResult.OK) + { + if (selectedNode.Tag is BuilderAisacNode) + { + XmlSerializer aisacSerializer = new XmlSerializer(typeof(BuilderAisacNode)); + + using (Stream destination = File.Create(saveAisacTemplate.FileName)) + { + aisacSerializer.Serialize(destination, selectedNode.Tag); + } + } + } + } + } + } + } + } +} diff --git a/Source/CsbBuilder/MainForm.resx b/Source/CsbBuilder/MainForm.resx new file mode 100644 index 0000000..3d93939 --- /dev/null +++ b/Source/CsbBuilder/MainForm.resx @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 394, 17 + + + True + + + 259, 17 + + + 17, 17 + + + 459, 56 + + + 120, 17 + + + True + + + 161, 95 + + + 504, 17 + + + 615, 17 + + + 730, 17 + + + 840, 17 + + + 17, 56 + + + 151, 56 + + + 312, 56 + + + 629, 56 + + + 745, 56 + + + 17, 95 + + + 172 + + \ No newline at end of file diff --git a/Source/CsbBuilder/Program.cs b/Source/CsbBuilder/Program.cs index 49e7d33..d1277cf 100644 --- a/Source/CsbBuilder/Program.cs +++ b/Source/CsbBuilder/Program.cs @@ -1,77 +1,58 @@ using System; using System.Collections.Generic; using System.Linq; -using System.IO; +using System.Threading; +using System.Threading.Tasks; using System.Windows.Forms; - -using SonicAudioLib.CriMw; -using SonicAudioLib.CriMw.Serialization; -using SonicAudioLib.IO; -using SonicAudioLib.Archive; - +using System.IO; +using System.Reflection; using System.Globalization; -using System.Xml.Serialization; -using System.Runtime.Serialization.Formatters.Binary; -using System.Runtime.Serialization; + namespace CsbBuilder { - class Program + static class Program { + public static string ProjectsPath + { + get + { + return Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "Projects"); + } + } + + public static string ApplicationVersion + { + get + { + AssemblyName assemblyName = Assembly.GetEntryAssembly().GetName(); + return $"{assemblyName.Name} (Version {assemblyName.Version.ToString()})"; + } + } + + /// + /// The main entry point for the application. + /// + [STAThread] static void Main(string[] args) { - if (args.Length < 1) + if (args.Length > 0) { - Console.WriteLine(Properties.Resources.Description); - Console.ReadLine(); + Audio.AdxConverter.ConvertToWav(args[0]); return; } - if (args[0].EndsWith(".csb")) - { - List tables = CriTableSerializer.Deserialize(args[0]); - Serialize(args[0] + ".xml", tables); - - foreach (CriTableCueSheet table in tables) - { - DirectoryInfo baseDirectory = new DirectoryInfo( - Path.Combine( - Path.GetDirectoryName(args[0]), - Path.GetFileNameWithoutExtension(args[0]), - Enum.GetName(typeof(CriTableCueSheet.EnumTableType), table.TableType))); - - baseDirectory.Create(); - - foreach (CriTableCue cue in table.DataList.OfType()) - { - Serialize(Path.Combine(baseDirectory.FullName, cue.Name + ".xml"), cue); - } - - foreach (CriTableSynth synth in table.DataList.OfType()) - { - Directory.CreateDirectory(Path.Combine(baseDirectory.FullName, Path.GetDirectoryName(synth.SynthName))); - Serialize(Path.Combine(baseDirectory.FullName, synth.SynthName + ".xml"), synth); - } - - foreach (CriTableSoundElement soundElement in table.DataList.OfType()) - { - Directory.CreateDirectory(Path.Combine(baseDirectory.FullName, Path.GetDirectoryName(soundElement.Name))); - } - } - } - - else if (File.GetAttributes(args[0]).HasFlag(FileAttributes.Directory)) - { - } + Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); + Application.ThreadException += OnException; + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); } - static void Serialize(string path, object obj) + private static void OnException(object sender, ThreadExceptionEventArgs e) { - XmlSerializer serializer = new XmlSerializer(obj.GetType()); - using (Stream destination = File.Create(path)) - { - serializer.Serialize(destination, obj); - } + new ExceptionForm(e.Exception).ShowDialog(); + Application.Exit(); } } } diff --git a/Source/CsbBuilder/Project/CsbProject.cs b/Source/CsbBuilder/Project/CsbProject.cs new file mode 100644 index 0000000..54ae4b1 --- /dev/null +++ b/Source/CsbBuilder/Project/CsbProject.cs @@ -0,0 +1,261 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +using CsbBuilder.BuilderNode; + +using System.Xml.Serialization; +using System.Windows.Forms; + +using CsbBuilder; + +namespace CsbBuilder.Project +{ + public class CsbProject + { + private string name = "New CSB Project"; + private DirectoryInfo directory = new DirectoryInfo(Path.Combine(Program.ProjectsPath, "New CSB Project")); + + private List cueNodes = new List(); + private List synthNodes = new List(); + private List soundElementNodes = new List(); + private List aisacNodes = new List(); + private List voiceLimitGroupNodes = new List(); + + public string Name + { + get + { + return name; + } + + set + { + name = value; + } + } + + [XmlIgnore] + public DirectoryInfo Directory + { + get + { + return directory; + } + + set + { + directory = value; + } + } + + [XmlIgnore] + public DirectoryInfo AudioDirectory + { + get + { + return new DirectoryInfo(Path.Combine(directory.FullName, "Audio")); + } + } + + [XmlIgnore] + public DirectoryInfo BinaryDirectory + { + get + { + return new DirectoryInfo(Path.Combine(directory.FullName, "Binary")); + } + } + + [XmlIgnore] + public FileInfo ProjectFile + { + get + { + return new FileInfo(Path.Combine(directory.FullName, $"{name}.csbproject")); + } + } + + [XmlArray("CueNodes"), XmlArrayItem(typeof(BuilderCueNode))] + public List CueNodes + { + get + { + return cueNodes; + } + } + + [XmlArray("SynthNodes"), XmlArrayItem(typeof(BuilderSynthNode))] + public List SynthNodes + { + get + { + return synthNodes; + } + } + + [XmlArray("SoundElementNodes"), XmlArrayItem(typeof(BuilderSoundElementNode))] + public List SoundElementNodes + { + get + { + return soundElementNodes; + } + } + + [XmlArray("AisacNodes"), XmlArrayItem(typeof(BuilderAisacNode))] + public List AisacNodes + { + get + { + return aisacNodes; + } + } + + [XmlArray("VoiceLimitGroupNodes"), XmlArrayItem(typeof(BuilderVoiceLimitGroupNode))] + public List VoiceLimitGroupNodes + { + get + { + return voiceLimitGroupNodes; + } + } + + private void GetAbsoluteIndex(string path, TreeNode treeNode, ref int index, ref bool stop) + { + if (!stop) + { + index++; + + if (treeNode.FullPath == path) + { + stop = true; + } + + else + { + foreach (TreeNode childNode in treeNode.Nodes) + { + GetAbsoluteIndex(path, childNode, ref index, ref stop); + } + } + } + } + + private int GetAbsoluteIndex(string path, TreeView treeView) + { + bool stop = false; + int index = -1; + + foreach (TreeNode treeNode in treeView.Nodes) + { + GetAbsoluteIndex(path, treeNode, ref index, ref stop); + } + + return index; + } + + public void Order(TreeView cueTree, TreeView synthTree, TreeView soundElementTree, TreeView aisacTree, TreeView voiceLimitGroupTree) + { + cueNodes = cueNodes.OrderBy(cue => cueTree.Nodes.IndexOfKey(cue.Name)).ToList(); + synthNodes = synthNodes.OrderBy(synth => GetAbsoluteIndex(synth.Name, synthTree)).ToList(); + soundElementNodes = soundElementNodes.OrderBy(soundElement => soundElementTree.FindNodeByFullPath(soundElement.Name).Index).ToList(); + aisacNodes = aisacNodes.OrderBy(aisac => aisacTree.FindNodeByFullPath(aisac.Name).Index).ToList(); + voiceLimitGroupNodes = voiceLimitGroupNodes.OrderBy(voiceLimitGroup => voiceLimitGroupTree.Nodes.IndexOfKey(voiceLimitGroup.Name)).ToList(); + + synthNodes.ForEach(synth => + { + if (synth.Children.Count > 0) + { + synth.Children = synth.Children.OrderBy(child => synthTree.FindNodeByFullPath(child).Index).ToList(); + } + }); + } + + public static CsbProject Load(string projectFile) + { + XmlSerializer serializer = new XmlSerializer(typeof(CsbProject)); + + CsbProject csbProject = null; + using (Stream source = File.OpenRead(projectFile)) + { + csbProject = (CsbProject)serializer.Deserialize(source); + } + + csbProject.Directory = new DirectoryInfo(Path.GetDirectoryName(projectFile)); + return csbProject; + } + + public string AddAudio(string path) + { + if (string.IsNullOrEmpty(path)) + { + return string.Empty; + } + + string name = Path.GetFileName(path); + string nameNoExtension = Path.GetFileNameWithoutExtension(name); + string outputPath = Path.Combine(AudioDirectory.FullName, name); + + if (path != outputPath) + { + string uniqueName = nameNoExtension; + + int index = -1; + while (File.Exists(Path.Combine(AudioDirectory.FullName, $"{uniqueName}.adx"))) + { + uniqueName = $"{nameNoExtension}_{++index}"; + } + + outputPath = Path.Combine(AudioDirectory.FullName, $"{uniqueName}.adx"); + File.Copy(path, outputPath, true); + + name = $"{uniqueName}.adx"; + } + + return name; + } + + public string GetFullAudioPath(string name) + { + return Path.Combine(AudioDirectory.FullName, name); + } + + public void Save() + { + XmlSerializer serializer = new XmlSerializer(typeof(CsbProject)); + + using (Stream destination = ProjectFile.Create()) + { + serializer.Serialize(destination, this); + } + } + + public void SaveAs(string outputDirectory) + { + DirectoryInfo oldAudioDirectory = AudioDirectory; + + name = Path.GetFileNameWithoutExtension(outputDirectory); + directory = new DirectoryInfo(Path.GetDirectoryName(outputDirectory)); + + Create(); + Save(); + + if (oldAudioDirectory.Exists) + { + foreach (FileInfo audioFile in oldAudioDirectory.EnumerateFiles()) + { + audioFile.CopyTo(Path.Combine(AudioDirectory.FullName, audioFile.Name), true); + } + } + } + + public void Create() + { + directory.Create(); + AudioDirectory.Create(); + } + } +} diff --git a/Source/CsbBuilder/Properties/AssemblyInfo.cs b/Source/CsbBuilder/Properties/AssemblyInfo.cs index 17a78b0..5db7c97 100644 --- a/Source/CsbBuilder/Properties/AssemblyInfo.cs +++ b/Source/CsbBuilder/Properties/AssemblyInfo.cs @@ -5,12 +5,12 @@ using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("CsbBuilder")] +[assembly: AssemblyTitle("CSB Builder")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("CsbBuilder")] -[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyCopyright("Copyright © blueskythlikesclouds 2014-2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -20,7 +20,7 @@ using System.Runtime.InteropServices; [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("91f6b6a6-5d95-4c7a-b22e-a35bd32db67a")] +[assembly: Guid("70a6a571-23ec-4b2c-a579-1e6812ddc34e")] // Version information for an assembly consists of the following four values: // @@ -32,5 +32,4 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("0.1.*")] diff --git a/Source/CsbBuilder/Properties/Resources.Designer.cs b/Source/CsbBuilder/Properties/Resources.Designer.cs index 41de69e..2a0e611 100644 --- a/Source/CsbBuilder/Properties/Resources.Designer.cs +++ b/Source/CsbBuilder/Properties/Resources.Designer.cs @@ -61,11 +61,222 @@ namespace CsbBuilder.Properties { } /// - /// Looks up a localized string similar to placeholder. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string Description { + internal static System.Drawing.Bitmap Build { get { - return ResourceManager.GetString("Description", resourceCulture); + object obj = ResourceManager.GetObject("Build", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Copy { + get { + object obj = ResourceManager.GetObject("Copy", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Create { + get { + object obj = ResourceManager.GetObject("Create", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Exit { + get { + object obj = ResourceManager.GetObject("Exit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Folder { + get { + object obj = ResourceManager.GetObject("Folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap FolderOpen { + get { + object obj = ResourceManager.GetObject("FolderOpen", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Import { + get { + object obj = ResourceManager.GetObject("Import", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ImportAndMerge { + get { + object obj = ResourceManager.GetObject("ImportAndMerge", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap LoadProject { + get { + object obj = ResourceManager.GetObject("LoadProject", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Merge { + get { + object obj = ResourceManager.GetObject("Merge", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap NewProject { + get { + object obj = ResourceManager.GetObject("NewProject", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Node { + get { + object obj = ResourceManager.GetObject("Node", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Paste { + get { + object obj = ResourceManager.GetObject("Paste", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Play { + get { + object obj = ResourceManager.GetObject("Play", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Remove { + get { + object obj = ResourceManager.GetObject("Remove", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Save { + get { + object obj = ResourceManager.GetObject("Save", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SaveAs { + get { + object obj = ResourceManager.GetObject("SaveAs", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Select { + get { + object obj = ResourceManager.GetObject("Select", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SetReference { + get { + object obj = ResourceManager.GetObject("SetReference", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Sound { + get { + object obj = ResourceManager.GetObject("Sound", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Stop { + get { + object obj = ResourceManager.GetObject("Stop", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Template { + get { + object obj = ResourceManager.GetObject("Template", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } } diff --git a/Source/CsbBuilder/Properties/Resources.resx b/Source/CsbBuilder/Properties/Resources.resx index 8c89008..d18f0f6 100644 --- a/Source/CsbBuilder/Properties/Resources.resx +++ b/Source/CsbBuilder/Properties/Resources.resx @@ -117,7 +117,71 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - placeholder + + + ..\Resources\CreateListItem_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Stop_grey_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\MergeModule_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Remove_thin_10x_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Paste_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Save_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ProjectFolderOpen_exp_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\BuildDefinition_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Exit_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Import_grey_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Reference_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\FolderBrowserDialogControl_grey_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\SoundFile_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AudioPlayback_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\SaveAs_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Merge_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Select_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Copy_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Folder_grey_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\FolderOpen_exp_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\None_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Template_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/Source/CsbBuilder/Properties/Settings.Designer.cs b/Source/CsbBuilder/Properties/Settings.Designer.cs new file mode 100644 index 0000000..032ae36 --- /dev/null +++ b/Source/CsbBuilder/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CsbBuilder.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Source/CsbBuilder/Properties/Settings.settings b/Source/CsbBuilder/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Source/CsbBuilder/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Source/CsbBuilder/Resources/AudioPlayback_16x.png b/Source/CsbBuilder/Resources/AudioPlayback_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3b711e566dda1fa124dc40aad52ede59048958 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf0S9=EsYoGxNjd%zdhTitnALGuRlbrx33 ygn$B;I}-a@vvbWj?wj)MObGapz3JbOp}vhus8l*#;@eOVHK7m;o!XGl zQj(DH4hV?_1q$wI$Hv{Tc$YZI-W7o&yG39cZ zMx#L-$2jK_O)_jtKxMgH^7`_Y30z%Y0?_OA02mI3nKiM@E8IpmX(7O9G@{$>GM~@A z-7|uHuD`sV%$lb`X`g|l^xW?~r+aVrUky@wxPSB}`DXV59AXdzf%nt>n*l(f@E4;5 z#9(5`562F_bVZ8$C{*900000NkvXXu0mjf Dy^ge( literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/Copy_16x.png b/Source/CsbBuilder/Resources/Copy_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..6b42cf41ab21fb589393d1ef8b17d2bdf166fe5f GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfsB6CU>E}hyw%Oi` z9}2y?=q*|C^o*p0#E0tkkGHqy|DTv^ymHUshI8r}3})%GL+&Y_^z+ioO9n*H% zncqHsJh-y*^fcWSdJQ|7ZhnimuTQ=zBO-HRL+WWU51k)BejE@zWb*&lPwC}pDF>R) zD7rDnF(>#PX1}&Jw*Nju32O_3aH6V-8N)kPr@G^;2A3FDGB7y0rf+7tliULI34^Dr KpUXO@geCwI-)a2- literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/Exit_16x.png b/Source/CsbBuilder/Resources/Exit_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..75998f19316a9da0a02442e3739a4ca9927dbcec GIT binary patch literal 390 zcmV;10eSw3P)~kxsgkX7+Ao_kjO|h{VjiV`kS`I}wTdG~RVXL~mtT zF0(Ad;cx&E0RTp$5hjxf7K;Ua%H@=T?YCQ4A09-Zpx`WeQKH)AE)<@_s#Y kYpqp7N4bStKGWU!0$mhhQj`z(vH$=807*qoM6N<$f{D7OCjbBd literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/FolderBrowserDialogControl_grey_16x.png b/Source/CsbBuilder/Resources/FolderBrowserDialogControl_grey_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..fd27d0f11bedc83d2b941ea4c265925e7c68908e GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfO8UA^tjoEVXFU SFD3&W$l&Sf=d#Wzp$Py+?N2fQ literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/FolderOpen_exp_16x.png b/Source/CsbBuilder/Resources/FolderOpen_exp_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba2020bdec3ca148346592643a6214b49241356 GIT binary patch literal 307 zcmV-30nGl1P)7xV6oo${retBtT=^|BhB-555PbuY(l+p+?eVJY) z0GNbfXap#Vg6-?}R0{y5RHrPqf literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/Import_grey_16x.png b/Source/CsbBuilder/Resources/Import_grey_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..f05dbcb5dc99a86453f7b31d1f35b869cdd66ee8 GIT binary patch literal 422 zcmV;X0a^ZuP)$svGyZmYeD2dw$Awx+A3(b zu&td}Sj+u^TO_f|TyraX?uje+Adn&R-emGJz(2vN!S#B5^WM)HVZ{&Wz52X}( zy)00000NkvXXu0mjf+gW`( literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/Merge_16x.png b/Source/CsbBuilder/Resources/Merge_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..49bb53e47cbf041a33233f877590c89f7f7e89d4 GIT binary patch literal 381 zcmV-@0fPRCP)@3KUyWFFrw%M6!gnK7ASwuM350eG|dC2j^H(nNH--|uT8GMCu4t$sWn zTOzs#HDW!Hn5PaEWRaH<*t(8(c0NqoAB{2XLMS;HWKN(|Nt@Y?Zv1zeA&VIi) zG3OkI!vUOggkgx)YQ_F#V52NcV=!Ce5>BTRIOmJGr=Q729LLyfHs7A-y-#z_5$yQ4 b*ktvG500000NkvXXu0mjffWx3L literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/None_16x.png b/Source/CsbBuilder/Resources/None_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..ab120e465767156066e8901dd7ea045127335f2b GIT binary patch literal 429 zcmV;e0aE^nP)d295Jf-P5o&UTy#S5fMy9&lfJkGhixI=eh|gfvZjw@N z0-hl0OscVAUm!)2HrZmxPP5I%P_hfJf_=br|38qx4DgAR(v*nqV~pG%BDzm0O+V*F zulS9b?+%BlM;D8MwVp&03t%$ z1~lsiMNwcrpT7wqe!NQ%W8Btt&9kc+KR>x1`N0^2whe;?Z5v>W0W&{HDdnxT7R|aD^a>(Evu<=Uxm+WZK%UCOTypVz6;+Mkhch7fS zpMCYT?UxUBZYJjzZ{5am{dDdw3SSw>kn9#%=o) z^%A$9=V{Qr%$n8ep4oKP?f`glU3c)e*I>Zo%$el1{@LSSStYHE9|K)qE#j%@eY_`X)y*lF=iE8Zu5)U`wOysmO3sD* zUon2zOgDNPPm_Vf4~G;P-&0eh85p>4 WaXo%p;}Z@vfWgz%&t;ucLK6T_1t_`z literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/Remove_thin_10x_16x.png b/Source/CsbBuilder/Resources/Remove_thin_10x_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..1b683182dfcc6b8f9f0fbacbc461adeedc3a9378 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfVmw7V*%@cVV@g0x({jy7lVy%66GQIp@ZIs=@yKljZgT@aQe5 zcGE7JRs#R*0yIVZt@my2_lSTh-<%oE59FJ3a0C(Xd|Xe+(uCuB5-w2HGE0;4yUwjTl^Alqpv*k4joP2p}8fXYQ>`m3VOC}-OE4l_?`S=IfbQFX<6YHUq#OT z_x~RnPtsV(#G&{k%J1CHuuCco1?}EdwKC-|W6G0vt=>KHZ`s)k`BLv~9d@7Ut=V_) zWxKQk^90?FNgiJx%73ssC(|vo$7r^K-aF|o;XkbQ0ur9yr&t=cUYl{r%AT=owRTbR T2T5n30~tJB{an^LB{Ts5#$;4- literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/Select_16x.png b/Source/CsbBuilder/Resources/Select_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..16cd6326a46179d5a0823544c122499812881f41 GIT binary patch literal 469 zcmV;`0V@89P)E?q5PegXSPn=&#L~gQb`xk)6xpaJ1?LjDQb0iz-1~wQ zgv`Ubi2RP@7yz(duR%n=zEp8I9DdZXwYJO5wl>qhkM(fj`uFe#VZRrOrccI100000 LNkvXXu0mjfimcXL literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/SoundFile_16x.png b/Source/CsbBuilder/Resources/SoundFile_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..ce3c8f9a0374ecd0d5a6c8938172c9aedd471851 GIT binary patch literal 360 zcmV-u0hj)XP)Q}zzdUK1(Y&YkW_ExM)OEcUkxE2VM6|1~mwY%JG)a zzAB31j!;$AikY_$1;&u0C^{Nr-p}XrGXU5&qll=r_G^d?VC}t!s=hMwb_M|6`<{vX zAc~@jnUQ4~hzJ16%jNQEL`263000qzncy? literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Resources/Stop_grey_16x.png b/Source/CsbBuilder/Resources/Stop_grey_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2b150a01546cb7aa2c8f476f0981018dbe9e78 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VflRcAoM~H+tKFnanMpx|6j z7srr_xU-WCxsE7^xY*9#yJ79!dpZ0MHQ&7bF0g1?o2J@}mX0@Of_9A`o~`_!J#TB) z+S=vQn6lrlddIqS3O}o+YD2Kbu?nsOafdhzJAxRyWsHJvSYF@z{m#RsP1kNo#~UR0 za~@uCaSc=6vOSH00UQgT&)I(~AXi3W!wH4o|2em??|EOw?`B-jmpuEJ)}7KRRW-E^ h%HJ{tCUyuL* literal 0 HcmV?d00001 diff --git a/Source/CsbBuilder/Serialization/SerializationAisacGraphTable.cs b/Source/CsbBuilder/Serialization/SerializationAisacGraphTable.cs new file mode 100644 index 0000000..852594a --- /dev/null +++ b/Source/CsbBuilder/Serialization/SerializationAisacGraphTable.cs @@ -0,0 +1,94 @@ +using System.IO; +using SonicAudioLib.CriMw.Serialization; + +namespace CsbBuilder.Serialization +{ + [CriSerializable("TBLIGR")] + public class SerializationAisacGraphTable + { + private byte typeField = 0; + private float imaxField = 0; + private float iminField = 0; + private float omaxField = 0; + private float ominField = 0; + private byte[] pointsField = null; + + [CriField("type", 0)] + public byte Type + { + get + { + return typeField; + } + set + { + typeField = value; + } + } + + [CriField("imax", 1)] + public float InMax + { + get + { + return imaxField; + } + set + { + imaxField = value; + } + } + + [CriField("imin", 2)] + public float InMin + { + get + { + return iminField; + } + set + { + iminField = value; + } + } + + [CriField("omax", 3)] + public float OutMax + { + get + { + return omaxField; + } + set + { + omaxField = value; + } + } + + [CriField("omin", 4)] + public float OutMin + { + get + { + return ominField; + } + set + { + ominField = value; + } + } + + [CriField("points", 5)] + public byte[] Points + { + get + { + return pointsField; + } + set + { + pointsField = value; + } + } + } +} diff --git a/Source/CsbBuilder/CriTableAisacPoint.cs b/Source/CsbBuilder/Serialization/SerializationAisacPointTable.cs similarity index 58% rename from Source/CsbBuilder/CriTableAisacPoint.cs rename to Source/CsbBuilder/Serialization/SerializationAisacPointTable.cs index a63f7db..af00809 100644 --- a/Source/CsbBuilder/CriTableAisacPoint.cs +++ b/Source/CsbBuilder/Serialization/SerializationAisacPointTable.cs @@ -1,28 +1,24 @@ using System.IO; using SonicAudioLib.CriMw.Serialization; -using System; -using System.Xml.Serialization; - -namespace CsbBuilder +namespace CsbBuilder.Serialization { - [Serializable] [CriSerializable("TBLIPT")] - public class CriTableAisacPoint + public class SerializationAisacPointTable { - private ushort _in = 0; - private ushort _out = 0; + private ushort inField = 0; + private ushort outField = 0; [CriField("in", 0)] public ushort In { get { - return _in; + return inField; } set { - _in = value; + inField = value; } } @@ -31,11 +27,11 @@ namespace CsbBuilder { get { - return _out; + return outField; } set { - _out = value; + outField = value; } } } diff --git a/Source/CsbBuilder/CriTableAisac.cs b/Source/CsbBuilder/Serialization/SerializationAisacTable.cs similarity index 51% rename from Source/CsbBuilder/CriTableAisac.cs rename to Source/CsbBuilder/Serialization/SerializationAisacTable.cs index f2785ad..8129730 100644 --- a/Source/CsbBuilder/CriTableAisac.cs +++ b/Source/CsbBuilder/Serialization/SerializationAisacTable.cs @@ -1,32 +1,27 @@ -using System.Collections.Generic; using System.IO; -using SonicAudioLib.CriMw; using SonicAudioLib.CriMw.Serialization; -using System; -using System.Xml.Serialization; - -namespace CsbBuilder +namespace CsbBuilder.Serialization { - [Serializable] [CriSerializable("TBLISC")] - public class CriTableAisac + public class SerializationAisacTable { - private string _name = string.Empty; - private string _ptname = string.Empty; - private byte _type = 0; - private byte _rndrng = 0; + private string nameField = string.Empty; + private string ptnameField = string.Empty; + private byte typeField = 0; + private byte[] grphField = null; + private byte rndrngField = 0; [CriField("name", 0)] public string Name { get { - return _name; + return nameField; } set { - _name = value; + nameField = value; } } @@ -35,11 +30,11 @@ namespace CsbBuilder { get { - return _ptname; + return ptnameField; } set { - _ptname = value; + ptnameField = value; } } @@ -48,29 +43,24 @@ namespace CsbBuilder { get { - return _type; + return typeField; } set { - _type = value; + typeField = value; } } - [CriIgnore] - public List GraphList { get; set; } - - [XmlIgnore] [CriField("grph", 3)] public byte[] Graph { get { - return CriTableSerializer.Serialize(GraphList, CriTableWriterSettings.AdxSettings); + return grphField; } - set { - GraphList = CriTableSerializer.Deserialize(value); + grphField = value; } } @@ -79,11 +69,11 @@ namespace CsbBuilder { get { - return _rndrng; + return rndrngField; } set { - _rndrng = value; + rndrngField = value; } } } diff --git a/Source/CsbBuilder/Serialization/SerializationCueSheetTable.cs b/Source/CsbBuilder/Serialization/SerializationCueSheetTable.cs new file mode 100644 index 0000000..0d43119 --- /dev/null +++ b/Source/CsbBuilder/Serialization/SerializationCueSheetTable.cs @@ -0,0 +1,52 @@ +using System.IO; +using SonicAudioLib.CriMw.Serialization; + +namespace CsbBuilder.Serialization +{ + [CriSerializable("TBLCSB")] + public class SerializationCueSheetTable + { + private string nameField = string.Empty; + private byte ttypeField = 0; + private byte[] utfField = null; + + [CriField("name", 0)] + public string Name + { + get + { + return nameField; + } + set + { + nameField = value; + } + } + + [CriField("ttype", 1)] + public byte TableType + { + get + { + return ttypeField; + } + set + { + ttypeField = value; + } + } + + [CriField("utf", 2)] + public byte[] TableData + { + get + { + return utfField; + } + set + { + utfField = value; + } + } + } +} diff --git a/Source/CsbBuilder/CriTableCue.cs b/Source/CsbBuilder/Serialization/SerializationCueTable.cs similarity index 57% rename from Source/CsbBuilder/CriTableCue.cs rename to Source/CsbBuilder/Serialization/SerializationCueTable.cs index c2b0f01..3cb3b59 100644 --- a/Source/CsbBuilder/CriTableCue.cs +++ b/Source/CsbBuilder/Serialization/SerializationCueTable.cs @@ -1,31 +1,27 @@ using System.IO; using SonicAudioLib.CriMw.Serialization; -using System; -using System.Xml.Serialization; - -namespace CsbBuilder +namespace CsbBuilder.Serialization { - [Serializable] [CriSerializable("TBLCUE")] - public class CriTableCue + public class SerializationCueTable { - private string _name = string.Empty; - private uint _id = 0; - private string _synth = string.Empty; - private string _udata = string.Empty; - private byte _flags = 0; + private string nameField = string.Empty; + private uint idField = 0; + private string synthField = string.Empty; + private string udataField = string.Empty; + private byte flagsField = 0; [CriField("name", 0)] public string Name { get { - return _name; + return nameField; } set { - _name = value; + nameField = value; } } @@ -34,24 +30,24 @@ namespace CsbBuilder { get { - return _id; + return idField; } set { - _id = value; + idField = value; } } [CriField("synth", 2)] - public string Synth + public string SynthPath { get { - return _synth; + return synthField; } set { - _synth = value; + synthField = value; } } @@ -60,11 +56,11 @@ namespace CsbBuilder { get { - return _udata; + return udataField; } set { - _udata = value; + udataField = value; } } @@ -73,11 +69,11 @@ namespace CsbBuilder { get { - return _flags; + return flagsField; } set { - _flags = value; + flagsField = value; } } } diff --git a/Source/CsbBuilder/Serialization/SerializationSoundElementTable.cs b/Source/CsbBuilder/Serialization/SerializationSoundElementTable.cs new file mode 100644 index 0000000..5c05fbe --- /dev/null +++ b/Source/CsbBuilder/Serialization/SerializationSoundElementTable.cs @@ -0,0 +1,108 @@ +using System.IO; +using SonicAudioLib.CriMw.Serialization; + +namespace CsbBuilder.Serialization +{ + [CriSerializable("TBLSDL")] + public class SerializationSoundElementTable + { + private string nameField = string.Empty; + private byte[] dataField = null; + private byte fmtField = 0; + private byte nchField = 0; + private bool stmflgField = false; + private uint sfreqField = 0; + private uint nsmplField = 0; + + [CriField("name", 0)] + public string Name + { + get + { + return nameField; + } + set + { + nameField = value; + } + } + + [CriField("data", 1)] + public byte[] Data + { + get + { + return dataField; + } + set + { + dataField = value; + } + } + + [CriField("fmt", 2)] + public byte FormatType + { + get + { + return fmtField; + } + set + { + fmtField = value; + } + } + + [CriField("nch", 3)] + public byte NumberChannels + { + get + { + return nchField; + } + set + { + nchField = value; + } + } + + [CriField("stmflg", 4)] + public bool Streaming + { + get + { + return stmflgField; + } + set + { + stmflgField = value; + } + } + + [CriField("sfreq", 5)] + public uint SoundFrequency + { + get + { + return sfreqField; + } + set + { + sfreqField = value; + } + } + + [CriField("nsmpl", 6)] + public uint NumberSamples + { + get + { + return nsmplField; + } + set + { + nsmplField = value; + } + } + } +} diff --git a/Source/CsbBuilder/CriTableSynth.cs b/Source/CsbBuilder/Serialization/SerializationSynthTable.cs similarity index 56% rename from Source/CsbBuilder/CriTableSynth.cs rename to Source/CsbBuilder/Serialization/SerializationSynthTable.cs index b2f4718..ee6c98c 100644 --- a/Source/CsbBuilder/CriTableSynth.cs +++ b/Source/CsbBuilder/Serialization/SerializationSynthTable.cs @@ -1,222 +1,150 @@ -using System.Collections.Generic; using System.IO; using SonicAudioLib.CriMw.Serialization; -using System; -using System.Linq; -using System.Xml.Serialization; - -namespace CsbBuilder +namespace CsbBuilder.Serialization { - [Serializable] [CriSerializable("TBLSYN")] - public class CriTableSynth + public class SerializationSynthTable { - public enum EnumSynthType : byte - { - Waveform = 0, - Polyphonic = 1, - Random = 3, - }; - - private string _synname = string.Empty; - private EnumSynthType _syntype = EnumSynthType.Waveform; - private EnumSynthType _cmplxtype = EnumSynthType.Waveform; - private string _lnkname = string.Empty; - private string _issetname = string.Empty; - private short _volume = 1000; - private short _pitch = 0; - private uint _dlytim = 0; - private byte _s_cntrl = 0; - private ushort _eg_dly = 0; - private ushort _eg_atk = 0; - private ushort _eg_hld = 0; - private ushort _eg_dcy = 0; - private ushort _eg_rel = 0; - private ushort _eg_sus = 1000; - private byte _f_type = 0; - private ushort _f_cof1 = 0; - private ushort _f_cof2 = 0; - private ushort _f_reso = 0; - private byte _f_roff = 0; - private string _dryoname = string.Empty; - private string _mtxrtr = string.Empty; - private ushort _dry0 = 0; - private ushort _dry1 = 0; - private ushort _dry2 = 0; - private ushort _dry3 = 0; - private ushort _dry4 = 0; - private ushort _dry5 = 0; - private ushort _dry6 = 0; - private ushort _dry7 = 0; - private string _wetoname = string.Empty; - private ushort _wet0 = 0; - private ushort _wet1 = 0; - private ushort _wet2 = 0; - private ushort _wet3 = 0; - private ushort _wet4 = 0; - private ushort _wet5 = 0; - private ushort _wet6 = 0; - private ushort _wet7 = 0; - private string _wcnct0 = string.Empty; - private string _wcnct1 = string.Empty; - private string _wcnct2 = string.Empty; - private string _wcnct3 = string.Empty; - private string _wcnct4 = string.Empty; - private string _wcnct5 = string.Empty; - private string _wcnct6 = string.Empty; - private string _wcnct7 = string.Empty; - private string _vl_gname = string.Empty; - private byte _vl_type = 0; - private byte _vl_prio = 0; - private ushort _vl_phtime = 0; - private sbyte _vl_pcdlt = 0; - private short _p3d_vo = 0; - private short _p3d_vg = 1000; - private short _p3d_ao = 0; - private short _p3d_ag = 1000; - private short _p3d_ido = 0; - private short _p3d_idg = 1000; - private byte _dry0g = 255; - private byte _dry1g = 255; - private byte _dry2g = 255; - private byte _dry3g = 255; - private byte _dry4g = 255; - private byte _dry5g = 255; - private byte _dry6g = 255; - private byte _dry7g = 255; - private byte _wet0g = 255; - private byte _wet1g = 255; - private byte _wet2g = 255; - private byte _wet3g = 255; - private byte _wet4g = 255; - private byte _wet5g = 255; - private byte _wet6g = 255; - private byte _wet7g = 255; - private byte _f1_type = 0; - private ushort _f1_cofo = 0; - private ushort _f1_cofg = 0; - private ushort _f1_resoo = 0; - private ushort _f1_resog = 0; - private byte _f2_type = 0; - private ushort _f2_coflo = 0; - private ushort _f2_coflg = 1000; - private ushort _f2_cofho = 0; - private ushort _f2_cofhg = 1000; - private byte _probability = 100; - private byte _n_lmt_children = 0; - private byte _repeat = 0; - private uint _combo_time = 0; - private byte _combo_loop_back = 0; + private string synnameField = string.Empty; + private byte syntypeField = 0; + private byte cmplxtypeField = 0; + private string lnknameField = string.Empty; + private string issetnameField = string.Empty; + private short volumeField = 1000; + private short pitchField = 0; + private uint dlytimField = 0; + private byte s_cntrlField = 0; + private ushort eg_dlyField = 0; + private ushort eg_atkField = 0; + private ushort eg_hldField = 0; + private ushort eg_dcyField = 0; + private ushort eg_relField = 0; + private ushort eg_susField = 1000; + private byte f_typeField = 0; + private ushort f_cof1Field = 0; + private ushort f_cof2Field = 0; + private ushort f_resoField = 0; + private byte f_roffField = 0; + private string dryonameField = string.Empty; + private string mtxrtrField = string.Empty; + private ushort dry0Field = 0; + private ushort dry1Field = 0; + private ushort dry2Field = 0; + private ushort dry3Field = 0; + private ushort dry4Field = 0; + private ushort dry5Field = 0; + private ushort dry6Field = 0; + private ushort dry7Field = 0; + private string wetonameField = string.Empty; + private ushort wet0Field = 0; + private ushort wet1Field = 0; + private ushort wet2Field = 0; + private ushort wet3Field = 0; + private ushort wet4Field = 0; + private ushort wet5Field = 0; + private ushort wet6Field = 0; + private ushort wet7Field = 0; + private string wcnct0Field = string.Empty; + private string wcnct1Field = string.Empty; + private string wcnct2Field = string.Empty; + private string wcnct3Field = string.Empty; + private string wcnct4Field = string.Empty; + private string wcnct5Field = string.Empty; + private string wcnct6Field = string.Empty; + private string wcnct7Field = string.Empty; + private string vl_gnameField = string.Empty; + private byte vl_typeField = 0; + private byte vl_prioField = 0; + private ushort vl_phtimeField = 0; + private sbyte vl_pcdltField = 0; + private short p3d_voField = 0; + private short p3d_vgField = 1000; + private short p3d_aoField = 0; + private short p3d_agField = 1000; + private short p3d_idoField = 0; + private short p3d_idgField = 1000; + private byte dry0gField = 255; + private byte dry1gField = 255; + private byte dry2gField = 255; + private byte dry3gField = 255; + private byte dry4gField = 255; + private byte dry5gField = 255; + private byte dry6gField = 255; + private byte dry7gField = 255; + private byte wet0gField = 255; + private byte wet1gField = 255; + private byte wet2gField = 255; + private byte wet3gField = 255; + private byte wet4gField = 255; + private byte wet5gField = 255; + private byte wet6gField = 255; + private byte wet7gField = 255; + private byte f1_typeField = 0; + private ushort f1_cofoField = 0; + private ushort f1_cofgField = 0; + private ushort f1_resooField = 0; + private ushort f1_resogField = 0; + private byte f2_typeField = 0; + private ushort f2_cofloField = 0; + private ushort f2_coflgField = 1000; + private ushort f2_cofhoField = 0; + private ushort f2_cofhgField = 1000; + private byte probabilityField = 100; + private byte n_lmt_childrenField = 0; + private byte repeatField = 0; + private uint combo_timeField = 0; + private byte combo_loop_backField = 0; [CriField("synname", 0)] public string SynthName { get { - return _synname; + return synnameField; } set { - _synname = value; + synnameField = value; } } [CriField("syntype", 1)] - public EnumSynthType SynthType + public byte SynthType { get { - return _syntype; + return syntypeField; } set { - _syntype = value; + syntypeField = value; } } [CriField("cmplxtype", 2)] - public EnumSynthType ComplexType + public byte ComplexType { get { - return _cmplxtype; + return cmplxtypeField; } set { - _cmplxtype = value; + cmplxtypeField = value; } } - [CriIgnore] - public List LinkNameList { get; set; } - - [CriIgnore] - public List AisacSetNameList { get; set; } - - [XmlIgnore] [CriField("lnkname", 3)] public string LinkName { get { - if (_syntype == EnumSynthType.Waveform && LinkNameList.Count > 0) - { - return LinkNameList[0]; - } - - string result = string.Empty; - foreach (string linkName in LinkNameList) - { - result += linkName + (char)0x0A; - } - - return result; - } - - set - { - if (!string.IsNullOrEmpty(value)) - { - LinkNameList = value.Split(new char[] { (char)0x0A }, StringSplitOptions.RemoveEmptyEntries).ToList(); - } - } - } - - [XmlIgnore] - [CriField("issetname", 4)] - public string AisacSetName - { - get - { - string result = string.Empty; - foreach (string aisacSetName in AisacSetNameList) - { - result += aisacSetName + (char)0x0A; - } - - return result; - } - - set - { - if (!string.IsNullOrEmpty(value)) - { - AisacSetNameList = value.Split(new char[] { (char)0x0A }, StringSplitOptions.RemoveEmptyEntries).ToList(); - } - } - } - - /*[CriField("lnkname", 3)] - public string LinkName - { - get - { - return _lnkname; + return lnknameField; } set { - _lnkname = value; + lnknameField = value; } } @@ -225,24 +153,24 @@ namespace CsbBuilder { get { - return _issetname; + return issetnameField; } set { - _issetname = value; + issetnameField = value; } - }*/ + } [CriField("volume", 5)] public short Volume { get { - return _volume; + return volumeField; } set { - _volume = value; + volumeField = value; } } @@ -251,11 +179,11 @@ namespace CsbBuilder { get { - return _pitch; + return pitchField; } set { - _pitch = value; + pitchField = value; } } @@ -264,24 +192,24 @@ namespace CsbBuilder { get { - return _dlytim; + return dlytimField; } set { - _dlytim = value; + dlytimField = value; } } [CriField("s_cntrl", 8)] - public byte SoundControl + public byte SControl { get { - return _s_cntrl; + return s_cntrlField; } set { - _s_cntrl = value; + s_cntrlField = value; } } @@ -290,11 +218,11 @@ namespace CsbBuilder { get { - return _eg_dly; + return eg_dlyField; } set { - _eg_dly = value; + eg_dlyField = value; } } @@ -303,11 +231,11 @@ namespace CsbBuilder { get { - return _eg_atk; + return eg_atkField; } set { - _eg_atk = value; + eg_atkField = value; } } @@ -316,11 +244,11 @@ namespace CsbBuilder { get { - return _eg_hld; + return eg_hldField; } set { - _eg_hld = value; + eg_hldField = value; } } @@ -329,11 +257,11 @@ namespace CsbBuilder { get { - return _eg_dcy; + return eg_dcyField; } set { - _eg_dcy = value; + eg_dcyField = value; } } @@ -342,11 +270,11 @@ namespace CsbBuilder { get { - return _eg_rel; + return eg_relField; } set { - _eg_rel = value; + eg_relField = value; } } @@ -355,11 +283,11 @@ namespace CsbBuilder { get { - return _eg_sus; + return eg_susField; } set { - _eg_sus = value; + eg_susField = value; } } @@ -368,11 +296,11 @@ namespace CsbBuilder { get { - return _f_type; + return f_typeField; } set { - _f_type = value; + f_typeField = value; } } @@ -381,11 +309,11 @@ namespace CsbBuilder { get { - return _f_cof1; + return f_cof1Field; } set { - _f_cof1 = value; + f_cof1Field = value; } } @@ -394,11 +322,11 @@ namespace CsbBuilder { get { - return _f_cof2; + return f_cof2Field; } set { - _f_cof2 = value; + f_cof2Field = value; } } @@ -407,11 +335,11 @@ namespace CsbBuilder { get { - return _f_reso; + return f_resoField; } set { - _f_reso = value; + f_resoField = value; } } @@ -420,11 +348,11 @@ namespace CsbBuilder { get { - return _f_roff; + return f_roffField; } set { - _f_roff = value; + f_roffField = value; } } @@ -433,11 +361,11 @@ namespace CsbBuilder { get { - return _dryoname; + return dryonameField; } set { - _dryoname = value; + dryonameField = value; } } @@ -446,11 +374,11 @@ namespace CsbBuilder { get { - return _mtxrtr; + return mtxrtrField; } set { - _mtxrtr = value; + mtxrtrField = value; } } @@ -459,11 +387,11 @@ namespace CsbBuilder { get { - return _dry0; + return dry0Field; } set { - _dry0 = value; + dry0Field = value; } } @@ -472,11 +400,11 @@ namespace CsbBuilder { get { - return _dry1; + return dry1Field; } set { - _dry1 = value; + dry1Field = value; } } @@ -485,11 +413,11 @@ namespace CsbBuilder { get { - return _dry2; + return dry2Field; } set { - _dry2 = value; + dry2Field = value; } } @@ -498,11 +426,11 @@ namespace CsbBuilder { get { - return _dry3; + return dry3Field; } set { - _dry3 = value; + dry3Field = value; } } @@ -511,11 +439,11 @@ namespace CsbBuilder { get { - return _dry4; + return dry4Field; } set { - _dry4 = value; + dry4Field = value; } } @@ -524,11 +452,11 @@ namespace CsbBuilder { get { - return _dry5; + return dry5Field; } set { - _dry5 = value; + dry5Field = value; } } @@ -537,11 +465,11 @@ namespace CsbBuilder { get { - return _dry6; + return dry6Field; } set { - _dry6 = value; + dry6Field = value; } } @@ -550,11 +478,11 @@ namespace CsbBuilder { get { - return _dry7; + return dry7Field; } set { - _dry7 = value; + dry7Field = value; } } @@ -563,11 +491,11 @@ namespace CsbBuilder { get { - return _wetoname; + return wetonameField; } set { - _wetoname = value; + wetonameField = value; } } @@ -576,11 +504,11 @@ namespace CsbBuilder { get { - return _wet0; + return wet0Field; } set { - _wet0 = value; + wet0Field = value; } } @@ -589,11 +517,11 @@ namespace CsbBuilder { get { - return _wet1; + return wet1Field; } set { - _wet1 = value; + wet1Field = value; } } @@ -602,11 +530,11 @@ namespace CsbBuilder { get { - return _wet2; + return wet2Field; } set { - _wet2 = value; + wet2Field = value; } } @@ -615,11 +543,11 @@ namespace CsbBuilder { get { - return _wet3; + return wet3Field; } set { - _wet3 = value; + wet3Field = value; } } @@ -628,11 +556,11 @@ namespace CsbBuilder { get { - return _wet4; + return wet4Field; } set { - _wet4 = value; + wet4Field = value; } } @@ -641,11 +569,11 @@ namespace CsbBuilder { get { - return _wet5; + return wet5Field; } set { - _wet5 = value; + wet5Field = value; } } @@ -654,11 +582,11 @@ namespace CsbBuilder { get { - return _wet6; + return wet6Field; } set { - _wet6 = value; + wet6Field = value; } } @@ -667,11 +595,11 @@ namespace CsbBuilder { get { - return _wet7; + return wet7Field; } set { - _wet7 = value; + wet7Field = value; } } @@ -680,11 +608,11 @@ namespace CsbBuilder { get { - return _wcnct0; + return wcnct0Field; } set { - _wcnct0 = value; + wcnct0Field = value; } } @@ -693,11 +621,11 @@ namespace CsbBuilder { get { - return _wcnct1; + return wcnct1Field; } set { - _wcnct1 = value; + wcnct1Field = value; } } @@ -706,11 +634,11 @@ namespace CsbBuilder { get { - return _wcnct2; + return wcnct2Field; } set { - _wcnct2 = value; + wcnct2Field = value; } } @@ -719,11 +647,11 @@ namespace CsbBuilder { get { - return _wcnct3; + return wcnct3Field; } set { - _wcnct3 = value; + wcnct3Field = value; } } @@ -732,11 +660,11 @@ namespace CsbBuilder { get { - return _wcnct4; + return wcnct4Field; } set { - _wcnct4 = value; + wcnct4Field = value; } } @@ -745,11 +673,11 @@ namespace CsbBuilder { get { - return _wcnct5; + return wcnct5Field; } set { - _wcnct5 = value; + wcnct5Field = value; } } @@ -758,11 +686,11 @@ namespace CsbBuilder { get { - return _wcnct6; + return wcnct6Field; } set { - _wcnct6 = value; + wcnct6Field = value; } } @@ -771,11 +699,11 @@ namespace CsbBuilder { get { - return _wcnct7; + return wcnct7Field; } set { - _wcnct7 = value; + wcnct7Field = value; } } @@ -784,11 +712,11 @@ namespace CsbBuilder { get { - return _vl_gname; + return vl_gnameField; } set { - _vl_gname = value; + vl_gnameField = value; } } @@ -797,11 +725,11 @@ namespace CsbBuilder { get { - return _vl_type; + return vl_typeField; } set { - _vl_type = value; + vl_typeField = value; } } @@ -810,11 +738,11 @@ namespace CsbBuilder { get { - return _vl_prio; + return vl_prioField; } set { - _vl_prio = value; + vl_prioField = value; } } @@ -823,11 +751,11 @@ namespace CsbBuilder { get { - return _vl_phtime; + return vl_phtimeField; } set { - _vl_phtime = value; + vl_phtimeField = value; } } @@ -836,11 +764,11 @@ namespace CsbBuilder { get { - return _vl_pcdlt; + return vl_pcdltField; } set { - _vl_pcdlt = value; + vl_pcdltField = value; } } @@ -849,11 +777,11 @@ namespace CsbBuilder { get { - return _p3d_vo; + return p3d_voField; } set { - _p3d_vo = value; + p3d_voField = value; } } @@ -862,11 +790,11 @@ namespace CsbBuilder { get { - return _p3d_vg; + return p3d_vgField; } set { - _p3d_vg = value; + p3d_vgField = value; } } @@ -875,11 +803,11 @@ namespace CsbBuilder { get { - return _p3d_ao; + return p3d_aoField; } set { - _p3d_ao = value; + p3d_aoField = value; } } @@ -888,11 +816,11 @@ namespace CsbBuilder { get { - return _p3d_ag; + return p3d_agField; } set { - _p3d_ag = value; + p3d_agField = value; } } @@ -901,11 +829,11 @@ namespace CsbBuilder { get { - return _p3d_ido; + return p3d_idoField; } set { - _p3d_ido = value; + p3d_idoField = value; } } @@ -914,219 +842,219 @@ namespace CsbBuilder { get { - return _p3d_idg; + return p3d_idgField; } set { - _p3d_idg = value; + p3d_idgField = value; } } [CriField("dry0g", 58)] - public byte Dry0Gain + public byte Dry0g { get { - return _dry0g; + return dry0gField; } set { - _dry0g = value; + dry0gField = value; } } [CriField("dry1g", 59)] - public byte Dry1Gain + public byte Dry1g { get { - return _dry1g; + return dry1gField; } set { - _dry1g = value; + dry1gField = value; } } [CriField("dry2g", 60)] - public byte Dry2Gain + public byte Dry2g { get { - return _dry2g; + return dry2gField; } set { - _dry2g = value; + dry2gField = value; } } [CriField("dry3g", 61)] - public byte Dry3Gain + public byte Dry3g { get { - return _dry3g; + return dry3gField; } set { - _dry3g = value; + dry3gField = value; } } [CriField("dry4g", 62)] - public byte Dry4Gain + public byte Dry4g { get { - return _dry4g; + return dry4gField; } set { - _dry4g = value; + dry4gField = value; } } [CriField("dry5g", 63)] - public byte Dry5Gain + public byte Dry5g { get { - return _dry5g; + return dry5gField; } set { - _dry5g = value; + dry5gField = value; } } [CriField("dry6g", 64)] - public byte Dry6Gain + public byte Dry6g { get { - return _dry6g; + return dry6gField; } set { - _dry6g = value; + dry6gField = value; } } [CriField("dry7g", 65)] - public byte Dry7Gain + public byte Dry7g { get { - return _dry7g; + return dry7gField; } set { - _dry7g = value; + dry7gField = value; } } [CriField("wet0g", 66)] - public byte Wet0Gain + public byte Wet0g { get { - return _wet0g; + return wet0gField; } set { - _wet0g = value; + wet0gField = value; } } [CriField("wet1g", 67)] - public byte Wet1Gain + public byte Wet1g { get { - return _wet1g; + return wet1gField; } set { - _wet1g = value; + wet1gField = value; } } [CriField("wet2g", 68)] - public byte Wet2Gain + public byte Wet2g { get { - return _wet2g; + return wet2gField; } set { - _wet2g = value; + wet2gField = value; } } [CriField("wet3g", 69)] - public byte Wet3Gain + public byte Wet3g { get { - return _wet3g; + return wet3gField; } set { - _wet3g = value; + wet3gField = value; } } [CriField("wet4g", 70)] - public byte Wet4Gain + public byte Wet4g { get { - return _wet4g; + return wet4gField; } set { - _wet4g = value; + wet4gField = value; } } [CriField("wet5g", 71)] - public byte Wet5Gain + public byte Wet5g { get { - return _wet5g; + return wet5gField; } set { - _wet5g = value; + wet5gField = value; } } [CriField("wet6g", 72)] - public byte Wet6Gain + public byte Wet6g { get { - return _wet6g; + return wet6gField; } set { - _wet6g = value; + wet6gField = value; } } [CriField("wet7g", 73)] - public byte Wet7Gain + public byte Wet7g { get { - return _wet7g; + return wet7gField; } set { - _wet7g = value; + wet7gField = value; } } @@ -1135,11 +1063,11 @@ namespace CsbBuilder { get { - return _f1_type; + return f1_typeField; } set { - _f1_type = value; + f1_typeField = value; } } @@ -1148,11 +1076,11 @@ namespace CsbBuilder { get { - return _f1_cofo; + return f1_cofoField; } set { - _f1_cofo = value; + f1_cofoField = value; } } @@ -1161,11 +1089,11 @@ namespace CsbBuilder { get { - return _f1_cofg; + return f1_cofgField; } set { - _f1_cofg = value; + f1_cofgField = value; } } @@ -1174,11 +1102,11 @@ namespace CsbBuilder { get { - return _f1_resoo; + return f1_resooField; } set { - _f1_resoo = value; + f1_resooField = value; } } @@ -1187,11 +1115,11 @@ namespace CsbBuilder { get { - return _f1_resog; + return f1_resogField; } set { - _f1_resog = value; + f1_resogField = value; } } @@ -1200,11 +1128,11 @@ namespace CsbBuilder { get { - return _f2_type; + return f2_typeField; } set { - _f2_type = value; + f2_typeField = value; } } @@ -1213,11 +1141,11 @@ namespace CsbBuilder { get { - return _f2_coflo; + return f2_cofloField; } set { - _f2_coflo = value; + f2_cofloField = value; } } @@ -1226,11 +1154,11 @@ namespace CsbBuilder { get { - return _f2_coflg; + return f2_coflgField; } set { - _f2_coflg = value; + f2_coflgField = value; } } @@ -1239,11 +1167,11 @@ namespace CsbBuilder { get { - return _f2_cofho; + return f2_cofhoField; } set { - _f2_cofho = value; + f2_cofhoField = value; } } @@ -1252,11 +1180,11 @@ namespace CsbBuilder { get { - return _f2_cofhg; + return f2_cofhgField; } set { - _f2_cofhg = value; + f2_cofhgField = value; } } @@ -1265,11 +1193,11 @@ namespace CsbBuilder { get { - return _probability; + return probabilityField; } set { - _probability = value; + probabilityField = value; } } @@ -1278,11 +1206,11 @@ namespace CsbBuilder { get { - return _n_lmt_children; + return n_lmt_childrenField; } set { - _n_lmt_children = value; + n_lmt_childrenField = value; } } @@ -1291,11 +1219,11 @@ namespace CsbBuilder { get { - return _repeat; + return repeatField; } set { - _repeat = value; + repeatField = value; } } @@ -1304,11 +1232,11 @@ namespace CsbBuilder { get { - return _combo_time; + return combo_timeField; } set { - _combo_time = value; + combo_timeField = value; } } @@ -1317,11 +1245,11 @@ namespace CsbBuilder { get { - return _combo_loop_back; + return combo_loop_backField; } set { - _combo_loop_back = value; + combo_loop_backField = value; } } } diff --git a/Source/CsbBuilder/CriTableVersionInfo.cs b/Source/CsbBuilder/Serialization/SerializationVersionInfoTable.cs similarity index 57% rename from Source/CsbBuilder/CriTableVersionInfo.cs rename to Source/CsbBuilder/Serialization/SerializationVersionInfoTable.cs index c4ce6e9..11ef395 100644 --- a/Source/CsbBuilder/CriTableVersionInfo.cs +++ b/Source/CsbBuilder/Serialization/SerializationVersionInfoTable.cs @@ -1,28 +1,24 @@ using System.IO; using SonicAudioLib.CriMw.Serialization; -using System; -using System.Xml.Serialization; - -namespace CsbBuilder +namespace CsbBuilder.Serialization { - [Serializable] [CriSerializable("TBL_INFO")] - public class CriTableVersionInfo + public class SerializationVersionInfoTable { - private uint _DataFmtVer = 0x940000; - private uint _ExtSize = 0; + private uint DataFmtVerField = 0x940000; + private uint ExtSizeField = 0; [CriField("DataFmtVer", 0)] public uint DataFormatVersion { get { - return _DataFmtVer; + return DataFmtVerField; } set { - _DataFmtVer = value; + DataFmtVerField = value; } } @@ -31,11 +27,11 @@ namespace CsbBuilder { get { - return _ExtSize; + return ExtSizeField; } set { - _ExtSize = value; + ExtSizeField = value; } } } diff --git a/Source/CsbBuilder/CriTableVoiceLimitGroup.cs b/Source/CsbBuilder/Serialization/SerializationVoiceLimitGroupTable.cs similarity index 57% rename from Source/CsbBuilder/CriTableVoiceLimitGroup.cs rename to Source/CsbBuilder/Serialization/SerializationVoiceLimitGroupTable.cs index f15a400..e23e4b1 100644 --- a/Source/CsbBuilder/CriTableVoiceLimitGroup.cs +++ b/Source/CsbBuilder/Serialization/SerializationVoiceLimitGroupTable.cs @@ -1,28 +1,24 @@ using System.IO; using SonicAudioLib.CriMw.Serialization; -using System; -using System.Xml.Serialization; - -namespace CsbBuilder +namespace CsbBuilder.Serialization { - [Serializable] [CriSerializable("TBLVLG")] - public class CriTableVoiceLimitGroup + public class SerializationVoiceLimitGroupTable { - private string _vlgname = string.Empty; - private uint _vlgnvoice = 0; + private string vlgnameField = string.Empty; + private uint vlgnvoiceField = 0; [CriField("vlgname", 0)] public string VoiceLimitGroupName { get { - return _vlgname; + return vlgnameField; } set { - _vlgname = value; + vlgnameField = value; } } @@ -31,11 +27,11 @@ namespace CsbBuilder { get { - return _vlgnvoice; + return vlgnvoiceField; } set { - _vlgnvoice = value; + vlgnvoiceField = value; } } } diff --git a/Source/CsbBuilder/SetAudioForm.Designer.cs b/Source/CsbBuilder/SetAudioForm.Designer.cs new file mode 100644 index 0000000..5ef0298 --- /dev/null +++ b/Source/CsbBuilder/SetAudioForm.Designer.cs @@ -0,0 +1,193 @@ +namespace CsbBuilder +{ + partial class SetAudioForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.swapButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.introBrowseButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.loopBrowseButton = new System.Windows.Forms.Button(); + this.loopTextBox = new System.Windows.Forms.MaskedTextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.introTextBox = new System.Windows.Forms.MaskedTextBox(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.swapButton); + this.groupBox1.Controls.Add(this.okButton); + this.groupBox1.Controls.Add(this.introBrowseButton); + this.groupBox1.Controls.Add(this.cancelButton); + this.groupBox1.Controls.Add(this.loopBrowseButton); + this.groupBox1.Controls.Add(this.loopTextBox); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.introTextBox); + this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox1.Location = new System.Drawing.Point(12, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(529, 102); + this.groupBox1.TabIndex = 7; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Audio"; + // + // swapButton + // + this.swapButton.Anchor = System.Windows.Forms.AnchorStyles.None; + this.swapButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162))); + this.swapButton.Location = new System.Drawing.Point(499, 17); + this.swapButton.Name = "swapButton"; + this.swapButton.Size = new System.Drawing.Size(24, 50); + this.swapButton.TabIndex = 6; + this.swapButton.Text = "↕"; + this.swapButton.UseVisualStyleBackColor = true; + this.swapButton.Click += new System.EventHandler(this.Swap); + // + // okButton + // + this.okButton.Anchor = System.Windows.Forms.AnchorStyles.None; + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.okButton.Location = new System.Drawing.Point(367, 73); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 8; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + // + // introBrowseButton + // + this.introBrowseButton.Anchor = System.Windows.Forms.AnchorStyles.None; + this.introBrowseButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.introBrowseButton.Location = new System.Drawing.Point(418, 17); + this.introBrowseButton.Name = "introBrowseButton"; + this.introBrowseButton.Size = new System.Drawing.Size(75, 23); + this.introBrowseButton.TabIndex = 5; + this.introBrowseButton.Text = "Browse"; + this.introBrowseButton.UseVisualStyleBackColor = true; + this.introBrowseButton.Click += new System.EventHandler(this.BrowseIntro); + // + // cancelButton + // + this.cancelButton.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cancelButton.Location = new System.Drawing.Point(448, 73); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 9; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // loopBrowseButton + // + this.loopBrowseButton.Anchor = System.Windows.Forms.AnchorStyles.None; + this.loopBrowseButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.loopBrowseButton.Location = new System.Drawing.Point(418, 44); + this.loopBrowseButton.Name = "loopBrowseButton"; + this.loopBrowseButton.Size = new System.Drawing.Size(75, 23); + this.loopBrowseButton.TabIndex = 4; + this.loopBrowseButton.Text = "Browse"; + this.loopBrowseButton.UseVisualStyleBackColor = true; + this.loopBrowseButton.Click += new System.EventHandler(this.BrowseLoop); + // + // loopTextBox + // + this.loopTextBox.Anchor = System.Windows.Forms.AnchorStyles.None; + this.loopTextBox.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.loopTextBox.Location = new System.Drawing.Point(43, 45); + this.loopTextBox.Name = "loopTextBox"; + this.loopTextBox.Size = new System.Drawing.Size(369, 20); + this.loopTextBox.TabIndex = 3; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(6, 48); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(34, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Loop:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(9, 21); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(31, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Intro:"; + // + // introTextBox + // + this.introTextBox.Anchor = System.Windows.Forms.AnchorStyles.None; + this.introTextBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.introTextBox.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.introTextBox.Location = new System.Drawing.Point(43, 19); + this.introTextBox.Name = "introTextBox"; + this.introTextBox.Size = new System.Drawing.Size(369, 20); + this.introTextBox.TabIndex = 0; + // + // SetAudioForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(554, 124); + this.Controls.Add(this.groupBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SetAudioForm"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Load Audio"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnClose); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button loopBrowseButton; + private System.Windows.Forms.MaskedTextBox loopTextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.MaskedTextBox introTextBox; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button swapButton; + private System.Windows.Forms.Button introBrowseButton; + } +} \ No newline at end of file diff --git a/Source/CsbBuilder/SetAudioForm.cs b/Source/CsbBuilder/SetAudioForm.cs new file mode 100644 index 0000000..06f4d66 --- /dev/null +++ b/Source/CsbBuilder/SetAudioForm.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.IO; + +namespace CsbBuilder +{ + public partial class SetAudioForm : Form + { + public SetAudioForm(string intro, string loop) + { + InitializeComponent(); + + introTextBox.Text = intro; + loopTextBox.Text = loop; + } + + public string Intro + { + get + { + return introTextBox.Text; + } + } + + public string Loop + { + get + { + return loopTextBox.Text; + } + } + + private void Swap(object sender, EventArgs e) + { + string intro = introTextBox.Text; + string loop = loopTextBox.Text; + + introTextBox.Text = loop; + loopTextBox.Text = intro; + } + + private void BrowseIntro(object sender, EventArgs e) + { + using (OpenFileDialog openAdx = new OpenFileDialog + { + Title = "Please select your ADX file.", + Filter = "ADX Files|*.adx", + DefaultExt = "adx", + }) + { + if (openAdx.ShowDialog() == DialogResult.OK) + { + introTextBox.Text = openAdx.FileName; + } + } + } + + private void BrowseLoop(object sender, EventArgs e) + { + using (OpenFileDialog openAdx = new OpenFileDialog + { + Title = "Please select your ADX file.", + Filter = "ADX Files|*.adx", + DefaultExt = "adx", + }) + { + if (openAdx.ShowDialog() == DialogResult.OK) + { + loopTextBox.Text = openAdx.FileName; + } + } + } + + private void OnClose(object sender, FormClosingEventArgs e) + { + if (DialogResult == DialogResult.OK) + { + if ((!string.IsNullOrEmpty(Intro) && !File.Exists(Intro)) || (!string.IsNullOrEmpty(Loop) && !File.Exists(Loop))) + { + MessageBox.Show("File(s) not found.", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Error); + e.Cancel = true; + } + + if ((!string.IsNullOrEmpty(Intro) && !Intro.EndsWith(".adx")) || (!string.IsNullOrEmpty(Loop) && !Loop.EndsWith(".adx"))) + { + MessageBox.Show("Please use an .ADX file.", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Warning); + e.Cancel = true; + } + } + } + } +} diff --git a/Source/CsbBuilder/SetAudioForm.resx b/Source/CsbBuilder/SetAudioForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Source/CsbBuilder/SetAudioForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Source/CsbBuilder/SetReferenceForm.Designer.cs b/Source/CsbBuilder/SetReferenceForm.Designer.cs new file mode 100644 index 0000000..12b63be --- /dev/null +++ b/Source/CsbBuilder/SetReferenceForm.Designer.cs @@ -0,0 +1,115 @@ +namespace CsbBuilder +{ + partial class SetReferenceForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.nodeTree = new System.Windows.Forms.TreeView(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cancelButton.Location = new System.Drawing.Point(389, 391); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 8; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.okButton.Location = new System.Drawing.Point(308, 391); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 7; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.AutoSize = true; + this.groupBox1.Controls.Add(this.nodeTree); + this.groupBox1.Location = new System.Drawing.Point(12, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(452, 373); + this.groupBox1.TabIndex = 9; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Node Tree"; + // + // nodeTree + // + this.nodeTree.Dock = System.Windows.Forms.DockStyle.Fill; + this.nodeTree.HideSelection = false; + this.nodeTree.Location = new System.Drawing.Point(3, 16); + this.nodeTree.Name = "nodeTree"; + this.nodeTree.PathSeparator = "/"; + this.nodeTree.Size = new System.Drawing.Size(446, 354); + this.nodeTree.TabIndex = 0; + this.nodeTree.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.nodeTree_NodeMouseDoubleClick); + // + // SetReferenceForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(476, 426); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SetReferenceForm"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Please select the node you want to set as reference."; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SetReferenceForm_FormClosing); + this.groupBox1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TreeView nodeTree; + } +} \ No newline at end of file diff --git a/Source/CsbBuilder/SetReferenceForm.cs b/Source/CsbBuilder/SetReferenceForm.cs new file mode 100644 index 0000000..4834e16 --- /dev/null +++ b/Source/CsbBuilder/SetReferenceForm.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +using CsbBuilder.BuilderNode; + +namespace CsbBuilder +{ + public partial class SetReferenceForm : Form + { + public TreeNode SelectedNode + { + get + { + return nodeTree.SelectedNode; + } + } + + public SetReferenceForm(TreeView treeView) + { + InitializeComponent(); + + nodeTree.ImageList = treeView.ImageList; + + foreach (TreeNode treeNode in treeView.Nodes) + { + AddNode(treeNode, null); + } + + nodeTree.ExpandAll(); + } + + private void AddNode(TreeNode treeNode, TreeNode parentNode) + { + bool cancel = false; + + if (treeNode.Tag is BuilderSynthNode) + { + BuilderSynthNode synthNode = (BuilderSynthNode)treeNode.Tag; + if (treeNode.Parent != null && treeNode.Parent.Tag != null && synthNode.Type == 0) + { + cancel = true; + } + } + + TreeNode newNode = null; + if (!cancel) + { + newNode = new TreeNode(); + newNode.Name = treeNode.Name; + newNode.Text = treeNode.Text; + newNode.ImageIndex = treeNode.ImageIndex; + newNode.SelectedImageIndex = treeNode.SelectedImageIndex; + + if (parentNode != null) + { + parentNode.Nodes.Add(newNode); + } + + else + { + nodeTree.Nodes.Add(newNode); + } + } + + foreach (TreeNode childNode in treeNode.Nodes) + { + AddNode(childNode, newNode); + } + } + + private void SetReferenceForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (DialogResult == DialogResult.OK) + { + if (SelectedNode != null && SelectedNode.ImageIndex == 3) + { + MessageBox.Show("You can't set a folder as a reference!", "CSB Builder", MessageBoxButtons.OK, MessageBoxIcon.Error); + e.Cancel = true; + } + } + } + + private void nodeTree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) + { + Close(); + DialogResult = DialogResult.OK; + } + } +} diff --git a/Source/CsbBuilder/SetReferenceForm.resx b/Source/CsbBuilder/SetReferenceForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Source/CsbBuilder/SetReferenceForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Source/CsbBuilder/packages.config b/Source/CsbBuilder/packages.config new file mode 100644 index 0000000..14d3468 --- /dev/null +++ b/Source/CsbBuilder/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Source/CsbEditor/Properties/AssemblyInfo.cs b/Source/CsbEditor/Properties/AssemblyInfo.cs index ba36765..bda939e 100644 --- a/Source/CsbEditor/Properties/AssemblyInfo.cs +++ b/Source/CsbEditor/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("CsbEditor")] -[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyCopyright("Copyright © blueskythlikesclouds 2014-2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,4 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("0.2.*")] diff --git a/Source/SonicAudioCmd/Program.cs b/Source/SonicAudioCmd/Program.cs index d9c2750..3fb46c1 100644 --- a/Source/SonicAudioCmd/Program.cs +++ b/Source/SonicAudioCmd/Program.cs @@ -20,47 +20,7 @@ namespace SonicAudioCmd { static void Main(string[] args) { - if (args[0].EndsWith(".cpk")) - { - CriCpkArchive archive = new CriCpkArchive(); - archive.Load(args[0]); - //archive.Print(); - - foreach (CriCpkEntry entry in archive) - { - using (Stream source = File.OpenRead(args[0]), substream = entry.Open(source)) - { - FileInfo fileInfo = new FileInfo(Path.Combine(Path.GetFileNameWithoutExtension(args[0]), entry.DirectoryName != null ? entry.DirectoryName : "", entry.Name != null ? entry.Name : entry.Id.ToString() + ".bin")); - fileInfo.Directory.Create(); - using (Stream destination = fileInfo.Create()) - { - substream.CopyTo(destination); - } - fileInfo.LastWriteTime = entry.UpdateDateTime; - } - } - } - - else - { - CriCpkArchive archive = new CriCpkArchive(); - archive.Align = 16; - archive.Mode = CriCpkMode.Id; - - uint id = 0; - foreach (string file in Directory.GetFiles(args[0], "*", SearchOption.AllDirectories)) - { - CriCpkEntry entry = new CriCpkEntry(); - entry.Id = id; - entry.Name = Path.GetFileName(file); - entry.DirectoryName = Path.GetDirectoryName(file.Replace(args[0] + "\\", "")); - entry.FilePath = new FileInfo(file); - archive.Add(entry); - id++; - } - - archive.Save(args[0] + ".cpk"); - } + // What are you looking at? There's nothing here. Go away. } } } diff --git a/Source/SonicAudioCmd/Properties/AssemblyInfo.cs b/Source/SonicAudioCmd/Properties/AssemblyInfo.cs index a8563c3..7078b76 100644 --- a/Source/SonicAudioCmd/Properties/AssemblyInfo.cs +++ b/Source/SonicAudioCmd/Properties/AssemblyInfo.cs @@ -33,4 +33,3 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Source/SonicAudioCmd/cpk_packer.txt b/Source/SonicAudioCmd/cpk_packer.txt new file mode 100644 index 0000000..440f728 --- /dev/null +++ b/Source/SonicAudioCmd/cpk_packer.txt @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.IO.Compression; +using System.ComponentModel; +using System.Collections; +using System.Threading; + +using SonicAudioLib; +using SonicAudioLib.Archive; +using SonicAudioLib.IO; +using SonicAudioLib.CriMw; + +using System.Xml; + +namespace SonicAudioCmd +{ + class Program + { + static void Main(string[] args) + { + if (args[0].EndsWith(".cpk")) + { + CriCpkArchive archive = new CriCpkArchive(); + archive.Load(args[0]); + //archive.Print(); + + foreach (CriCpkEntry entry in archive) + { + new Thread(new ThreadStart(delegate + { + using (Stream source = File.OpenRead(args[0]), substream = entry.Open(source)) + { + Console.WriteLine("Extracting {0}{1}", entry.DirectoryName, entry.Name); + + FileInfo fileInfo = new FileInfo(Path.Combine(Path.GetFileNameWithoutExtension(args[0]), entry.DirectoryName != null ? entry.DirectoryName : "", entry.Name != null ? entry.Name : entry.Id.ToString() + ".bin")); + fileInfo.Directory.Create(); + using (Stream destination = fileInfo.Create()) + { + substream.CopyTo(destination); + } + fileInfo.LastWriteTime = entry.UpdateDateTime; + } + })).Start(); + } + } + + else + { + CriCpkArchive archive = new CriCpkArchive(); + archive.Align = 16; + archive.Mode = CriCpkMode.Id; + + uint id = 0; + foreach (string file in Directory.GetFiles(args[0], "*", SearchOption.AllDirectories)) + { + CriCpkEntry entry = new CriCpkEntry(); + entry.Id = id; + entry.Name = Path.GetFileName(file); + entry.DirectoryName = Path.GetDirectoryName(file.Replace(args[0] + "\\", "")); + entry.FilePath = new FileInfo(file); + archive.Add(entry); + id++; + } + + archive.Save(args[0] + ".cpk"); + } + } + } +} diff --git a/Source/SonicAudioLib/Archive/CriCpkArchive.cs b/Source/SonicAudioLib/Archive/CriCpkArchive.cs index 7fe6c90..098ad14 100644 --- a/Source/SonicAudioLib/Archive/CriCpkArchive.cs +++ b/Source/SonicAudioLib/Archive/CriCpkArchive.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using System.Reflection; using SonicAudioLib.IO; using SonicAudioLib.CriMw; @@ -63,9 +64,9 @@ namespace SonicAudioLib.Archive set { - if (value <= 0) + if (align != 1) { - value = 1; + new NotImplementedException("Currently, alignment handling in .CPK files is broken. Always use 1."); } align = value; @@ -93,12 +94,15 @@ namespace SonicAudioLib.Archive { reader.Read(); -#if DEBUG - for (int i = 0; i < reader.NumberOfFields; i++) + // The older CPK versions don't have the CpkMode field, and the other stuff. I will add + // support for the older versions when someone reports it. I need file examples. + ushort version = reader.GetUInt16("Version"); + ushort revision = reader.GetUInt16("Revision"); + + if (version != 7 && revision != 2) { - Console.WriteLine("{0} ({1}): {2}", reader.GetFieldName(i), reader.GetFieldFlag(i), reader.GetValue(i)); + throw new Exception($"This CPK file version ({version}.{revision}) isn't supported yet! Please report the error with the file if you want support for this CPK version."); } -#endif mode = (CriCpkMode)reader.GetUInt32("CpkMode"); @@ -129,11 +133,7 @@ namespace SonicAudioLib.Archive entry.Position = (long)tocReader.GetUInt64("FileOffset"); entry.Id = tocReader.GetUInt32("ID"); entry.Comment = tocReader.GetString("UserString"); - - if (entry.Length != tocReader.GetUInt32("ExtractSize")) - { - entry.IsCompressed = true; - } + entry.IsCompressed = entry.Length != tocReader.GetUInt32("ExtractSize"); if (contentPosition < tocPosition) { @@ -181,11 +181,7 @@ namespace SonicAudioLib.Archive CriCpkEntry entry = new CriCpkEntry(); entry.Id = dataReader.GetUInt16("ID"); entry.Length = dataReader.GetUInt16("FileSize"); - - if (entry.Length != dataReader.GetUInt16("ExtractSize")) - { - entry.IsCompressed = true; - } + entry.IsCompressed = entry.Length != dataReader.GetUInt16("ExtractSize"); entries.Add(entry); } @@ -201,11 +197,7 @@ namespace SonicAudioLib.Archive CriCpkEntry entry = new CriCpkEntry(); entry.Id = dataReader.GetUInt16("ID"); entry.Length = dataReader.GetUInt32("FileSize"); - - if (entry.Length != dataReader.GetUInt32("ExtractSize")) - { - entry.IsCompressed = true; - } + entry.IsCompressed = entry.Length != dataReader.GetUInt32("ExtractSize"); entries.Add(entry); } @@ -325,6 +317,8 @@ namespace SonicAudioLib.Archive tocMemoryStream = new MemoryStream(); etocMemoryStream = new MemoryStream(); + var orderedEntries = entries.OrderBy(entry => entry.Name).ToList(); + using (CriCpkSection tocSection = new CriCpkSection(tocMemoryStream, "TOC ")) using (CriCpkSection etocSection = new CriCpkSection(etocMemoryStream, "ETOC")) { @@ -343,20 +337,20 @@ namespace SonicAudioLib.Archive etocSection.Writer.WriteField("UpdateDateTime", typeof(ulong)); etocSection.Writer.WriteField("LocalDir", typeof(string)); - foreach (CriCpkEntry entry in entries) + foreach (CriCpkEntry entry in orderedEntries) { - tocSection.Writer.WriteRow(true, - (entry.DirectoryName).Replace('\\', '/'), - entry.Name, - (uint)entry.Length, - (uint)entry.Length, - (ulong)(vldPool.Length - 2048), - entry.Id, + tocSection.Writer.WriteRow(true, + (entry.DirectoryName).Replace('\\', '/'), + entry.Name, + (uint)entry.Length, + (uint)entry.Length, + (ulong)(vldPool.Length - 2048), + entry.Id, entry.Comment); - etocSection.Writer.WriteRow(true, - CpkDateTimeFromDateTime(entry.UpdateDateTime), - entry.DirectoryName); + etocSection.Writer.WriteRow(true, + CpkDateTimeFromDateTime(entry.UpdateDateTime), + entry.FilePath.DirectoryName.Replace('\\', '/')); vldPool.Put(entry.FilePath); } @@ -376,11 +370,11 @@ namespace SonicAudioLib.Archive itocSection.Writer.WriteField("ID", typeof(int)); itocSection.Writer.WriteField("TocIndex", typeof(int)); - foreach (CriCpkEntry entry in entries) + foreach (CriCpkEntry entry in orderedEntries) { - itocSection.Writer.WriteRow(true, - (int)entry.Id, - entries.IndexOf(entry)); + itocSection.Writer.WriteRow(true, + (int)entry.Id, + orderedEntries.IndexOf(entry)); } itocSection.Writer.WriteEndTable(); @@ -417,9 +411,9 @@ namespace SonicAudioLib.Archive foreach (CriCpkEntry entry in filesL) { - dataWriter.WriteRow(true, - (ushort)entry.Id, - (ushort)entry.Length, + dataWriter.WriteRow(true, + (ushort)entry.Id, + (ushort)entry.Length, (ushort)entry.Length); } @@ -439,9 +433,9 @@ namespace SonicAudioLib.Archive foreach (CriCpkEntry entry in filesH) { - dataWriter.WriteRow(true, - (ushort)entry.Id, - (uint)entry.Length, + dataWriter.WriteRow(true, + (ushort)entry.Id, + (uint)entry.Length, (uint)entry.Length); } @@ -508,7 +502,7 @@ namespace SonicAudioLib.Archive cpkSection.Writer.WriteValue("Sorted", (ushort)1); cpkSection.Writer.WriteValue("CpkMode", (uint)mode); - cpkSection.Writer.WriteValue("Tvers", "SONICAUDIOLIB, DLL1.0.0.0"); + cpkSection.Writer.WriteValue("Tvers", GetToolVersion()); cpkSection.Writer.WriteValue("Comment", Comment); cpkSection.Writer.WriteValue("FileSize", (ulong)vldPool.Length); @@ -557,10 +551,16 @@ namespace SonicAudioLib.Archive private ulong CpkDateTimeFromDateTime(DateTime dateTime) { - return ((((ulong)dateTime.Year * 0x100 + (uint)dateTime.Month) * 0x100 + (uint)dateTime.Day) * 0x100000000) + + return ((((ulong)dateTime.Year * 0x100 + (uint)dateTime.Month) * 0x100 + (uint)dateTime.Day) * 0x100000000) + ((((ulong)dateTime.Hour * 0x100 + (uint)dateTime.Minute) * 0x100 + (uint)dateTime.Second) * 0x100); } + private string GetToolVersion() + { + AssemblyName assemblyName = Assembly.GetEntryAssembly().GetName(); + return $"{assemblyName.Name}, {assemblyName.Version.ToString()}"; + } + private class CriCpkSection : IDisposable { private Stream destination; @@ -622,4 +622,4 @@ namespace SonicAudioLib.Archive } } } -} +} \ No newline at end of file diff --git a/Source/SonicAudioLib/CriMw/CriTableReader.cs b/Source/SonicAudioLib/CriMw/CriTableReader.cs index 0c95a5c..c869834 100644 --- a/Source/SonicAudioLib/CriMw/CriTableReader.cs +++ b/Source/SonicAudioLib/CriMw/CriTableReader.cs @@ -195,6 +195,11 @@ namespace SonicAudioLib.CriMw { return fields.FindIndex(field => field.Name == fieldName); } + + public bool ContainsField(string fieldName) + { + return fields.Exists(field => field.Name == fieldName); + } private void GoToValue(int fieldIndex) { diff --git a/Source/SonicAudioLib/CriMw/Serialization/CriTableSerializer.cs b/Source/SonicAudioLib/CriMw/Serialization/CriTableSerializer.cs index 63c5365..1ba93ed 100644 --- a/Source/SonicAudioLib/CriMw/Serialization/CriTableSerializer.cs +++ b/Source/SonicAudioLib/CriMw/Serialization/CriTableSerializer.cs @@ -163,7 +163,7 @@ namespace SonicAudioLib.CriMw.Serialization if (defaultValue is bool) { - defaultValue = (bool)defaultValue == true ? 1 : 0; + defaultValue = ((bool)defaultValue == true) ? (byte)1 : (byte)0; } else if (defaultValue is Enum) @@ -199,7 +199,7 @@ namespace SonicAudioLib.CriMw.Serialization if (value is bool) { - value = (bool)value == true ? 1 : 0; + value = ((bool)value == true) ? (byte)1 : (byte)0; } else if (value is Enum) @@ -236,6 +236,11 @@ namespace SonicAudioLib.CriMw.Serialization public static ArrayList Deserialize(byte[] sourceByteArray, Type type) { + if (sourceByteArray == null || sourceByteArray.Length == 0) + { + return new ArrayList(); + } + using (MemoryStream source = new MemoryStream(sourceByteArray)) { return Deserialize(source, type); @@ -244,6 +249,11 @@ namespace SonicAudioLib.CriMw.Serialization public static ArrayList Deserialize(string sourceFileName, Type type) { + if (!File.Exists(sourceFileName)) + { + return new ArrayList(); + } + using (Stream source = File.OpenRead(sourceFileName)) { return Deserialize(source, type); @@ -256,49 +266,55 @@ namespace SonicAudioLib.CriMw.Serialization using (CriTableReader tableReader = CriTableReader.Create(source, true)) { - PropertyInfo[] propertyInfos = type.GetProperties(); + IEnumerable propertyInfos = type.GetProperties().Where(property => + { + if (property.GetCustomAttribute() == null) + { + string fieldName = property.Name; + + if (property.GetCustomAttribute() != null) + { + fieldName = property.GetCustomAttribute().FieldName; + } + + return tableReader.ContainsField(fieldName); + } + + return false; + }); while (tableReader.Read()) { object obj = Activator.CreateInstance(type); - for (int i = 0; i < tableReader.NumberOfFields; i++) + // I hope this is faster than the old method lol + foreach (PropertyInfo propertyInfo in propertyInfos) { - string fieldName = tableReader.GetFieldName(i); + string fieldName = propertyInfo.Name; - foreach (PropertyInfo propertyInfo in propertyInfos) + if (propertyInfo.GetCustomAttribute() != null) { - string fieldNameMatch = propertyInfo.Name; - - CriFieldAttribute fieldAttribute = propertyInfo.GetCustomAttribute(); - - if (fieldAttribute != null && !string.IsNullOrEmpty(fieldAttribute.FieldName)) - { - fieldNameMatch = fieldAttribute.FieldName; - } - - if (fieldName == fieldNameMatch) - { - object value = tableReader.GetValue(i); - if (propertyInfo.PropertyType == typeof(byte[]) && value is Substream) - { - value = ((Substream)value).ToArray(); - } - - if (propertyInfo.PropertyType == typeof(bool)) - { - value = (byte)value != 0; - } - - else if (propertyInfo.PropertyType.IsEnum) - { - value = Enum.ToObject(propertyInfo.PropertyType, value); - } - - propertyInfo.SetValue(obj, value); - break; - } + fieldName = propertyInfo.GetCustomAttribute().FieldName; } + + object value = tableReader.GetValue(fieldName); + + if (value is Substream) + { + value = ((Substream)value).ToArray(); + } + + else if (value is byte && propertyInfo.PropertyType == typeof(bool)) + { + value = (byte)value == 1; + } + + else if (propertyInfo.PropertyType.IsEnum) + { + value = Convert.ChangeType(value, Enum.GetUnderlyingType(propertyInfo.PropertyType)); + } + + propertyInfo.SetValue(obj, value); } arrayList.Add(obj); diff --git a/Source/SonicAudioLib/Properties/AssemblyInfo.cs b/Source/SonicAudioLib/Properties/AssemblyInfo.cs index efb864a..9588bfa 100644 --- a/Source/SonicAudioLib/Properties/AssemblyInfo.cs +++ b/Source/SonicAudioLib/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("SonicAudioLib")] -[assembly: AssemblyCopyright("Copyright © blueskythlikesclouds 2014-2016")] +[assembly: AssemblyCopyright("Copyright © blueskythlikesclouds 2014-2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,4 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("0.1.*")]