1
0
mirror of https://github.com/SirusDoma/VoxCharger.git synced 2024-11-23 22:51:01 +01:00

Update 0.9.12c

- Fix naming and other code style issues
- Fix `float` and `double` parsing issue when current System Culture comma separator is not `.` - This fixes issue when parsing BPM and other floating numbers.
- Fix song selection when the program doesn't support the latest datecode in the future - It will disable Game Version and Infinite Version selection.
- Replaced ancient `FolderBrowserDialog` with `CommonFileDialog`
- Update default GameVersion and BackgroundId to latest version
- Implement Radar information in `LevelEditorForm`
- Implement built-in 2DX Encoder
- Start Offset / TimeStamp and Fader effect for audio preview is now supported
- Audio preview files is no longer divided into multiple files by default when audio files are unique. It still possible to specify unique preview via `LevelEditorForm`
- Implement advanced configuration when importing .ksh chart
- Add draft codes for Effect Mapping configurations and S3V support
- Other Bugfixes and QoL improvements
This commit is contained in:
CXO2 2023-01-06 20:58:29 +07:00
parent 7fed5d6283
commit b8f49e3e2d
59 changed files with 8886 additions and 7332 deletions

10
App.config Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?><configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NAudio.Core" publicKeyToken="e279aa5131008a41" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

4
FodyWeavers.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<Costura />
</Weavers>

141
FodyWeavers.xsd Normal file
View File

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="Costura" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:all>
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeRuntimeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="IncludeRuntimeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
<xs:annotation>
<xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:all>
<xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean">
<xs:annotation>
<xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeDebugSymbols" type="xs:boolean">
<xs:annotation>
<xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeRuntimeReferences" type="xs:boolean">
<xs:annotation>
<xs:documentation>Controls if runtime assemblies are also embedded.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="UseRuntimeReferencePaths" type="xs:boolean">
<xs:annotation>
<xs:documentation>Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="DisableCompression" type="xs:boolean">
<xs:annotation>
<xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="DisableCleanup" type="xs:boolean">
<xs:annotation>
<xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="LoadAtModuleInit" type="xs:boolean">
<xs:annotation>
<xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean">
<xs:annotation>
<xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="ExcludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="ExcludeRuntimeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeRuntimeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Unmanaged64Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="PreloadOrder" type="xs:string">
<xs:annotation>
<xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
@ -14,6 +15,9 @@ namespace VoxCharger
[STAThread]
static void Main()
{
// Fix numeric float / double / decimal separator from comma to dots for certain System Locales.
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());

View File

@ -1,23 +1,35 @@
# VoxCharger #
- **Author**: CXO2
- **Email**: com@cxo2.me
- **Version**: 0.9.8b
Recharge your KFC Chicken sauce ([Download](https://github.com/SirusDoma/VoxCharger/releases))
Written under C# language, this program allow you to manage music asset files of your KFC installation.
Additionally, it include built-in converter to import ksh into vox that can be consumed by KFC.
Additionally, it include built-in converter and encoder to import ksh and it's audio files into vox and 2dx files that can be consumed by KFC.
If you're not familiar with these file formats, then this sauce is not for you.
## Features ##
- Create, manage and delete (omni)mix's in your KFC installation
- Import .vox or .ksh into your KFC with ease
- Automatically convert imported audio files (e.g mp3, ogg, flac, etc) to .2dx file
- Deferred asset modifications to keep your Music DB and asset files stay in sync until you save it
- Music DB metadata editor
- Standalone .ksh / .2dx file converter
## Prerequisite ##
### .NET Framework 4.7
This program require .NET Framework 4.7 in order to run properly.
### .NET Framework 4.7.2
This program require .NET Framework 4.7.2 in order to run properly.
### Latest datecodes or newer only
Latest omnimix structures is slightly changed compared to previous datecodes, it won't load anything that doesn't match with `2020011500` structure.
### Media Pack / Desktop Experience
This program now has its integrated Wav and 2DX Encoder and downloading [mon's 2dx tools](https://github.com/mon/2dxTools) is no **longer required**.
However, the audio decoder depends on Media Foundation API under the hood, which is only available in Windows 7 and newer.
Furthermore, you might need to install the following dependencies:
- [Media Feature Pack](https://support.microsoft.com/en-us/topic/media-feature-pack-list-for-windows-n-editions-c1c6fffa-d052-8338-7a79-a4bb980a700a) - Install this if you're running on Windows N or KN version (Common Windows distribution in Korea region)
- [Desktop Experience](https://learn.microsoft.com/en-us/windows-server/get-started/install-options-server-core-desktop-experience) - Install this if you're running on Windows Server
### Latest datecodes only
This program won't load anything that doesn't match with `2020011500` or newer structure.
### Backup
Backup your data before using this program, it able to modify and delete your music assets.
@ -27,13 +39,9 @@ Keep in mind that the program won't allow you to make any changes against origin
Use [IFS LayeredFS](https://github.com/mon/ifs_layeredfs) in your KFC installation. This program will not pack your assets into IFS, nor attempt to process existing ones.
When mix with ifs files is selected, the program won't be able load music assets properly.
If you need to pack your music assets into ifs, use another tool that process ifs file (for an instance: [mon ifs tools](https://github.com/mon/ifstools)).
If you need to pack your music assets into ifs, use another tool that process ifs file (for an instance: [mon's ifs tools](https://github.com/mon/ifstools)).
### 2DX Tools
Make sure that mon `2dxwavconvert.exe` and `2dxbuild.exe` are placed in the same directory along with the program.
Can't find it? you can grab the tools [here](https://github.com/mon/2dxTools/releases).
## Remarks ##
## Remarks, Restrictions and Limitations ##
### Mix Lock
Original mix is locked to prevent you (yes, you) to break your KFC installation.
@ -45,19 +53,13 @@ Vox have some sense in it's file format than ksh file, as the result, not all at
Remember, stupid input get stupid output. But if you believe it's a bug, feel free to open issue or PR.
### Network Scores
Make sure you are using under Offline environment and **NOT** connected to any KFC network server while using the output files of this tool. It could break network score table and you may get banned from the network for doing so.
Make sure you are running the game under offline environment and **NOT** connected to any KFC network server while using the output files of this tool. It could break network score table and you may get banned from the network for doing so.
### Music DB
The program also prevent you to modify Music ID and some attributes are kept hidden from editor, For existing songs, some of their attributes might untouched throughout save iteration, but the rest of hidden attributes might be replaced with dummy / stub data.
The program also prevent you to modify Music ID and some attributes are kept hidden from editor, For existing songs, the program will try to preserve all attributes throughout save iteration.
However, attributes that not recognized by the program might be lost.
If this really concern you, make sure to backup your `music_db.xml` / `music_db.merged.xml`.
### Music Preview
Imported music preview from normal audio files may broken or not trimmed properly in the output file. Preview offset in ksh is also ignored, you need dedicated preview file with proper fade in and out.
Keep in mind that `2dxwavconvert.exe` will not do this for you, it only trim your audio into 10 second for preview purpose. Until program supports built in encoder, you have to provide 2dx preview manually for proper preview file.
If you can't live without it, consider making PR to this feature.
Make sure to backup your `music_db.xml` / `music_db.merged.xml` if you have non-standard attributes in your music db or attributes that newly introduced after `2022` latest datecode (Note: `radar` is supported!).
### Asset File Modification
Replacing asset files such as vox, 2dx and graphic files are happen immediately after changes are confirmed. In other hand, metadata need to be saved manually by clicking `File -> Save` or `CTRL+S`.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -1,62 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;
namespace VoxCharger
{
public static class DxTool
{
private const string ConverterFileName = "2dxwavconvert.exe";
private const string BuilderFileName = "2dxbuild.exe";
public static string ConvertToWave(string inputFileName, bool preview = false)
{
string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
Directory.CreateDirectory(tempDir);
string output = Path.Combine(tempDir, $"{Directory.GetFiles(tempDir).Length}.wav");
Execute(
ConverterFileName,
$"\"{inputFileName}\" \"{output}\"" + (preview ? " preview" : string.Empty)
);
return tempDir;
}
public static void Build(string inputDir, string outputFileName)
{
Execute(
BuilderFileName,
$"\"{outputFileName}\"",
inputDir
);
}
private static void Execute(string fileName, string args, string workingDir = null)
{
if (!File.Exists(fileName))
throw new FileNotFoundException($"{fileName} not found", fileName);
workingDir = workingDir ?? Environment.CurrentDirectory;
var info = new ProcessStartInfo()
{
FileName = fileName,
Arguments = args,
WorkingDirectory = workingDir,
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true
};
using (var process = Process.Start(info))
{
process.WaitForExit();
if (process.ExitCode != 0)
throw new ApplicationException($"{fileName} execution failed:\n{process.StandardOutput.ReadToEnd()}");
}
}
}
}

View File

@ -8,12 +8,47 @@ using System.Text;
namespace VoxCharger
{
public enum AudioFormat
{
Iidx,
S3V
}
public class AudioImportOptions
{
public static readonly AudioImportOptions Default = new AudioImportOptions();
public AudioFormat Format { get; set; } = AudioFormat.Iidx;
public bool IsPreview { get; set; } = false;
public int PreviewOffset { get; set; } = 0;
public static AudioImportOptions WithFormat(AudioFormat format)
{
return new AudioImportOptions
{
Format = format,
IsPreview = false,
PreviewOffset = 0
};
}
public AudioImportOptions AsPreview()
{
return new AudioImportOptions
{
Format = Format,
IsPreview = true,
PreviewOffset = PreviewOffset
};
}
}
public static class AssetManager
{
#region --- Properties ---
private static List<string> MixList = new List<string>();
private static MusicDb InternalHeaders = null;
private static int LastOriginalID = 0;
private static List<string> _mixList = new List<string>();
private static MusicDb _internalHeaders = null;
private static int _lastOriginalId = 0;
public static string MixName { get; private set; }
@ -35,7 +70,7 @@ namespace VoxCharger
throw new FormatException("Invalid Game Directory");
// Look for other mixes
MixList.Clear();
_mixList.Clear();
string modsPath = Path.Combine(gamePath, @"data_mods\");
foreach (var modDir in Directory.GetDirectories(modsPath))
{
@ -54,10 +89,10 @@ namespace VoxCharger
continue;
// Confirmed mod path, append into music db, ignore cache to avoid uncached mix being excluded
MixList.Add(modName);
_mixList.Add(modName);
}
LastOriginalID = 0;
_lastOriginalId = 0;
GamePath = gamePath;
}
@ -93,8 +128,8 @@ namespace VoxCharger
// Load Existing song DB to avoid duplicate id
LoadInternalDb(mixName);
if (!string.IsNullOrEmpty(mixName) && !MixList.Contains(mixName))
MixList.Add(mixName);
if (!string.IsNullOrEmpty(mixName) && !_mixList.Contains(mixName))
_mixList.Add(mixName);
// Locate the music db, if unavailable, create it
MdbFilename = Path.Combine(mixPath, @"others\", string.IsNullOrEmpty(mixName) ? "music_db.xml" : "music_db.merged.xml");
@ -106,7 +141,7 @@ namespace VoxCharger
public static string[] GetMixes()
{
return MixList.ToArray();
return _mixList.ToArray();
}
private static void LoadInternalDb(string mixName)
@ -119,9 +154,9 @@ namespace VoxCharger
string modsPath = Path.Combine(GamePath, @"data_mods\");
// Load original headers data
InternalHeaders = new MusicDb();
InternalHeaders.Load(dbFilename);
LastOriginalID = InternalHeaders.LastID;
_internalHeaders = new MusicDb();
_internalHeaders.Load(dbFilename);
_lastOriginalId = _internalHeaders.LastId;
// Load other music db
foreach (var modDir in Directory.GetDirectories(modsPath))
@ -138,40 +173,53 @@ namespace VoxCharger
continue;
// Confirmed mod path, append into music db
InternalHeaders.Load(dbFilename, true);
_internalHeaders.Load(dbFilename, true);
}
}
#endregion
#region --- Asset Management ---
public static void Import2DX(string source, VoxHeader header, bool preview = false)
public static void ImportAudio(string source, VoxHeader header, AudioImportOptions opt = null)
{
opt = opt ?? AudioImportOptions.Default;
if (!File.Exists(source))
throw new FileNotFoundException($"{source} not found", source);
Import2DX(source, Get2DXPath(header, preview), preview);
ImportAudio(source, GetAudioPath(header, opt.Format, opt.IsPreview), opt);
}
public static void Import2DX(string source, VoxHeader header, Difficulty difficulty, bool preview = false)
public static void ImportAudio(string source, VoxHeader header, Difficulty difficulty, AudioImportOptions opt = null)
{
opt = opt ?? AudioImportOptions.Default;
if (!File.Exists(source))
throw new FileNotFoundException($"{source} not found", source);
Import2DX(source, Get2DXPath(header, difficulty, preview), preview);
ImportAudio(source, GetAudioPath(header, difficulty, opt.Format, opt.IsPreview), opt);
}
private static void Import2DX(string source, string output, bool preview = false)
private static void ImportAudio(string source, string output, AudioImportOptions opt = null)
{
if (!source.EndsWith(".2dx") && !source.EndsWith(".s3v"))
opt = opt ?? AudioImportOptions.Default;
source = source.ToLower(); // Just in case something wrong with extension casing
if (!source.ToLower().EndsWith(".2dx") && !source.EndsWith(".s3v") && !source.EndsWith(".asf"))
{
string tmp = DxTool.ConvertToWave(source, preview);
DxTool.Build(tmp, output);
if (output.EndsWith(".s3v"))
throw new NotSupportedException("S3V Encoder is not supported (yet).");
Directory.Delete(tmp, true);
// Encode 2dx file
DxEncoder.Encode(new[] { source }, output, opt);
// Remove conflicting file, in case s3v file is exists before hand
string s3VFile = Path.ChangeExtension(output, ".s3v");
if (File.Exists(s3VFile))
File.Delete(s3VFile);
}
else
{
if (source.EndsWith(".asf"))
output = $"{output.Substring(0, output.Length - 4)}.s3v";
File.Copy(source, output);
}
}
@ -238,7 +286,7 @@ namespace VoxCharger
$"graphics\\s_jacket00_ifs\\"
);
string pattern = $"jk_{header.ID:D4}*";
string pattern = $"jk_{header.Id:D4}*";
foreach (string jacket in Directory.GetFiles(jacketPath, pattern))
{
if (File.Exists(jacket))
@ -248,22 +296,22 @@ namespace VoxCharger
#endregion
#region --- Asset Identifier ---
public static int GetNextMusicID()
public static int GetNextMusicId()
{
// TODO: This probably inefficient in scenario where one or more mix has gap between each ids
// This could be waste to those gaps, and eat up our precious limited id
// However, these gaps may indicate deleted song, which should be taken by omnimix
int id = InternalHeaders.LastID + 1;
while (InternalHeaders.Contains(id) || Headers.Contains(id)) // Contains is O(1) so its should be fine
int id = _internalHeaders.LastId + 1;
while (_internalHeaders.Contains(id) || Headers.Contains(id)) // Contains is O(1) so its should be fine
id++;
return id;
}
public static bool ValidateMusicID(int id)
public static bool ValidateMusicId(int id)
{
return !InternalHeaders.Contains(id);
return !_internalHeaders.Contains(id);
}
public static string GetDifficultyCodes(VoxHeader header, Difficulty difficulty)
@ -274,7 +322,7 @@ namespace VoxCharger
case Difficulty.Advanced: return "2a";
case Difficulty.Exhaust: return "3e";
default:
if (header.InfVersion == InfiniteVersion.MXM)
if (header.InfVersion == InfiniteVersion.Mxm)
return "5m";
return "4i";
@ -297,18 +345,20 @@ namespace VoxCharger
);
}
public static string Get2DXPath(VoxHeader header, bool preview = false)
public static string GetAudioPath(VoxHeader header, AudioFormat format = AudioFormat.S3V, bool preview = false)
{
string ext = preview ? "_pre.2dx" : ".2dx";
string prefix = preview ? "_pre" : string.Empty;
string ext = $"{prefix}" + (format == AudioFormat.S3V ? ".s3v" : ".2dx");
return Path.Combine(
GetMusicPath(header),
$"{header.CodeName}{ext}"
);
}
public static string Get2DXPath(VoxHeader header, Difficulty difficulty, bool preview = false)
public static string GetAudioPath(VoxHeader header, Difficulty difficulty, AudioFormat format = AudioFormat.S3V, bool preview = false)
{
string ext = preview ? "_pre.2dx" : ".2dx";
string prefix = preview ? "_pre" : string.Empty;
string ext = $"{prefix}" + (format == AudioFormat.S3V ? ".s3v" : ".2dx");
return Path.Combine(
GetMusicPath(header),
$"{header.CodeName}_{GetDifficultyCodes(header, difficulty)}{ext}"
@ -318,10 +368,10 @@ namespace VoxCharger
public static string GetJacketPath(VoxHeader header, Difficulty difficulty)
{
int index = (int)difficulty;
if (difficulty == Difficulty.Infinite && header.InfVersion == InfiniteVersion.MXM)
if (difficulty == Difficulty.Infinite && header.InfVersion == InfiniteVersion.Mxm)
index = 5;
return Path.Combine(GetMusicPath(header), $"jk_{header.ID:D4}_{index}");
return Path.Combine(GetMusicPath(header), $"jk_{header.Id:D4}_{index}");
}
public static string GetDefaultJacketPath(VoxHeader header)
@ -332,7 +382,7 @@ namespace VoxCharger
public static string GetThumbnailJacketPath(VoxHeader header, Difficulty difficulty)
{
int index = (int)difficulty;
if (difficulty == Difficulty.Infinite && header.InfVersion == InfiniteVersion.MXM)
if (difficulty == Difficulty.Infinite && header.InfVersion == InfiniteVersion.Mxm)
index = 5;
string thumbnailDir = "s_jacket00_ifs";
@ -354,7 +404,7 @@ namespace VoxCharger
return Path.Combine(
graphicsDir,
$"{thumbnailDir}\\",
$"jk_{header.ID:D4}_{index}_t"
$"jk_{header.Id:D4}_{index}_t"
);
}

View File

@ -23,7 +23,7 @@ namespace VoxCharger
{
}
public static new BitCrusher FromVox(string data)
public new static BitCrusher FromVox(string data)
{
var bitCrusher = new BitCrusher();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -47,7 +47,7 @@ namespace VoxCharger
return bitCrusher;
}
public static new BitCrusher FromKsh(KshDefinition definition)
public new static BitCrusher FromKsh(KshDefinition definition)
{
var bitCrusher = new BitCrusher();

View File

@ -64,7 +64,7 @@ namespace VoxCharger
if (!Enum.TryParse(prop[0].Replace("Echo", "Retrigger"), out FxType type))
return null;
switch(type)
switch(type)
{
case FxType.Retrigger:
case FxType.RetriggerEx: return Retrigger.FromKsh(data);

View File

@ -26,7 +26,7 @@ namespace VoxCharger
{
}
public static new Flanger FromVox(string data)
public new static Flanger FromVox(string data)
{
var highPass = new Flanger();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -52,7 +52,7 @@ namespace VoxCharger
return highPass;
}
public static new Phaser FromKsh(string data)
public new static Phaser FromKsh(string data)
{
var prop = data.Trim().Split(';').Select(p => p.Trim()).ToArray();
if (!Enum.TryParse(prop[0], out FxType type) || type != FxType.Flanger)
@ -61,7 +61,7 @@ namespace VoxCharger
return new Phaser(80.00f, 2.00f, 0.50f, 90, 2.00f);
}
public static new Flanger FromKsh(KshDefinition definition)
public new static Flanger FromKsh(KshDefinition definition)
{
var flanger = new Flanger();

View File

@ -25,7 +25,7 @@ namespace VoxCharger
}
public static new Gate FromVox(string data)
public new static Gate FromVox(string data)
{
var gate = new Gate();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -50,7 +50,7 @@ namespace VoxCharger
return gate;
}
public static new Gate FromKsh(string data)
public new static Gate FromKsh(string data)
{
var gate = new Gate();
var prop = data.Trim().Split(';').Select(p => p.Trim()).ToArray();
@ -69,7 +69,7 @@ namespace VoxCharger
return gate;
}
public static new Gate FromKsh(KshDefinition definition)
public new static Gate FromKsh(KshDefinition definition)
{
var gate = new Gate();

View File

@ -22,7 +22,7 @@ namespace VoxCharger
{
}
public static new LowPass FromVox(string data)
public new static LowPass FromVox(string data)
{
var lowPass = new LowPass();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -47,7 +47,7 @@ namespace VoxCharger
}
public static new LowPass FromKsh(KshDefinition definition)
public new static LowPass FromKsh(KshDefinition definition)
{
var lowPass = new LowPass();

View File

@ -28,7 +28,7 @@ namespace VoxCharger
{
}
public static new Phaser FromVox(string data)
public new static Phaser FromVox(string data)
{
var flanger = new Phaser();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -55,7 +55,7 @@ namespace VoxCharger
return flanger;
}
public static new Wobble FromKsh(string data)
public new static Wobble FromKsh(string data)
{
var prop = data.Trim().Split(';').Select(p => p.Trim()).ToArray();
if (!Enum.TryParse(prop[0], out FxType type) || type != FxType.Phaser)
@ -67,7 +67,7 @@ namespace VoxCharger
return wobble;
}
public static new Phaser FromKsh(KshDefinition definition)
public new static Phaser FromKsh(KshDefinition definition)
{
var phaser = new Phaser();

View File

@ -23,7 +23,7 @@ namespace VoxCharger
{
}
public static new PitchShift FromVox(string data)
public new static PitchShift FromVox(string data)
{
var pitchShift = new PitchShift();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -47,7 +47,7 @@ namespace VoxCharger
return pitchShift;
}
public static new PitchShift FromKsh(string data)
public new static PitchShift FromKsh(string data)
{
var pitchShift = new PitchShift();
var prop = data.Trim().Split(';').Select(p => p.Trim()).ToArray();
@ -65,7 +65,7 @@ namespace VoxCharger
return pitchShift;
}
public static new PitchShift FromKsh(KshDefinition definition)
public new static PitchShift FromKsh(KshDefinition definition)
{
var pitchShift = new PitchShift();

View File

@ -34,7 +34,7 @@ namespace VoxCharger
{
}
public static new Retrigger FromVox(string data)
public new static Retrigger FromVox(string data)
{
var retrigger = new Retrigger();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -64,7 +64,7 @@ namespace VoxCharger
return retrigger;
}
public static new Retrigger FromKsh(string data)
public new static Retrigger FromKsh(string data)
{
var retrigger = new Retrigger();
var prop = data.Trim().Split(';').Select(p => p.Trim()).ToArray();
@ -93,7 +93,7 @@ namespace VoxCharger
return retrigger;
}
public static new Retrigger FromKsh(KshDefinition definition)
public new static Retrigger FromKsh(KshDefinition definition)
{
var retrigger = new Retrigger();

View File

@ -28,7 +28,7 @@ namespace VoxCharger
{
}
public static new SideChain FromVox(string data)
public new static SideChain FromVox(string data)
{
var sideChain = new SideChain();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -55,7 +55,7 @@ namespace VoxCharger
return sideChain;
}
public static new SideChain FromKsh(string data)
public new static SideChain FromKsh(string data)
{
var sideChain = new SideChain();
var prop = data.Trim().Split(';').Select(p => p.Trim()).ToArray();
@ -72,7 +72,7 @@ namespace VoxCharger
return sideChain;
}
public static new SideChain FromKsh(KshDefinition definition)
public new static SideChain FromKsh(KshDefinition definition)
{
var sideChain = new SideChain();

View File

@ -24,7 +24,7 @@ namespace VoxCharger
{
}
public static new TapeStop FromVox(string data)
public new static TapeStop FromVox(string data)
{
var tapeStop = new TapeStop();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -49,7 +49,7 @@ namespace VoxCharger
return tapeStop;
}
public static new TapeStop FromKsh(string data)
public new static TapeStop FromKsh(string data)
{
var tapeStop = new TapeStop();
var prop = data.Trim().Split(';').Select(p => p.Trim()).ToArray();
@ -75,7 +75,7 @@ namespace VoxCharger
return tapeStop;
}
public static new TapeStop FromKsh(KshDefinition definition)
public new static TapeStop FromKsh(KshDefinition definition)
{
var tapeStop = new TapeStop();

View File

@ -29,7 +29,7 @@ namespace VoxCharger
{
}
public static new Wobble FromVox(string data)
public new static Wobble FromVox(string data)
{
var wobble = new Wobble();
var prop = data.Trim().Split(',').Select(p => p.Trim()).ToArray();
@ -56,7 +56,7 @@ namespace VoxCharger
return wobble;
}
public static new Wobble FromKsh(string data)
public new static Wobble FromKsh(string data)
{
var wobble = new Wobble();
var prop = data.Trim().Split(';').Select(p => p.Trim()).ToArray();
@ -73,7 +73,7 @@ namespace VoxCharger
return wobble;
}
public static new Wobble FromKsh(KshDefinition definition)
public new static Wobble FromKsh(KshDefinition definition)
{
var wobble = new Wobble();
@ -107,7 +107,7 @@ namespace VoxCharger
return base.ToString();
return $"{(int)Type}," +
$"\t,0,\t{Flag}," + // Unknown params
$"\t0,\t{Flag}," + // Unknown params
$"\t{Mix:0.00}," +
$"\t{LowFrequency:0.00}," +
$"\t{HiFrequency:0.00}," +

View File

@ -0,0 +1,174 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using NAudio.Vorbis;
using NAudio.Wave;
using NAudio.Wave.SampleProviders;
using NAudio.Utils;
namespace VoxCharger
{
public static class DxEncoder
{
// We need a custom MS-ADPCM format to encode the wav to .2dx file later
[StructLayout(LayoutKind.Sequential, Pack = 2)]
private class DxAdpcmWaveFormat : AdpcmWaveFormat
{
public DxAdpcmWaveFormat(int sampleRate, int channels)
: base(sampleRate, channels)
{
// The parameters must be:
// blockAlign = 256
// samplePerBlock = 244
// averageBytesPerSecond = (blockAlign * sampleRate / samplesPerBlock + 0.5)
blockAlign = 256;
// We could define the wave format from the scratch so we can assign custom samplesPerBlock
// But Im too lazy for that, so I had to resort reflection to get this done
var samplesPerBlockProp = typeof(AdpcmWaveFormat).GetField("samplesPerBlock", BindingFlags.NonPublic | BindingFlags.Instance);
samplesPerBlockProp?.SetValue(this, (short)244);
averageBytesPerSecond = (int)(blockAlign * sampleRate / (double)SamplesPerBlock + 0.5D);
}
}
public static void Encode(string[] sources, string output, AudioImportOptions opt = null)
{
opt ??= AudioImportOptions.Default;
var samples = sources.Select(source => ConvertWav(source, opt)).ToList();
using var stream = File.Create(output);
using var writer = new BinaryWriter(stream);
string name = Path.GetFileName(output);
name = name.Substring(0, Math.Min(name.Length, 16)).PadRight(16, '\0');
int headerSize = 72 + sources.Length * sizeof(int);
writer.Write(Encoding.UTF8.GetBytes(name));
writer.Write(headerSize);
writer.Write(sources.Length);
writer.Write(new byte[48]);
int offset = headerSize;
for (int i = 0; i < sources.Length; i++)
{
writer.Write(offset);
offset += (int)(samples[i].Length + 24);
}
for (int i = 0; i < sources.Length; i++)
{
using var sample = samples[i];
writer.Write(Encoding.UTF8.GetBytes("2DX9"));
writer.Write(24);
writer.Write((int)sample.Length);
writer.Write((short)12849);
writer.Write((short)-1);
writer.Write((short)64);
writer.Write((short)0);
writer.Write(0);
writer.Write(sample.ToArray());
}
}
private static MemoryStream ConvertWav(string fileName, AudioImportOptions opt)
{
// The conversion happen in 3 steps:
// 1. Convert our source into a temporary PCM WAV, here I use 44.1khz 16bit @ 2 channels
// 2. If the file is preview file, apply preview effects (trim and fading) to our temporary PCM, otherwise skip this step
// 3. Convert our temporary PCM to MS-ADPCM (44.1khz 4bit @ 2channels)
//
// The `WaveFormatConversionStream` will likely to fail if we convert our source straight to MS-ADPCM
// Also, NAudio doesn't support writing samples smaller than 16bit (our MS-ADPCM use 4 bit), so we had to put our preview effects while in 16bit format
// Zero, define our target format and preview flag
var format = new DxAdpcmWaveFormat(44100, 2); // it's 4 bits per sample
bool preview = opt.IsPreview;
int previewStart = opt.PreviewOffset; // in seconds format
// First, convert OGG to PCM WAV 44.1k 16bit @ 2 channels
// Note that, MediaFoundationReader is not supported in WinXP and subject to NAudio limitation, refer to their doc for more info
WaveStream source;
if (Path.GetExtension(fileName) == ".ogg")
source = new VorbisWaveReader(fileName);
else
source = new MediaFoundationReader(fileName);
// Initializes memory stream to store our temporary PCM 16bit
// Use IgnoreDisposeStream, otherwise our memory stream will be disposed when disposing wav writer
using var ms = new MemoryStream();
var tmp = new IgnoreDisposeStream(ms); // No need `using`, disposing this thing won't dispose our MemoryStream
// Initialize our PCM 44.1khz 16bit @ 2 channels
using (var wav = new WaveFileWriter(tmp, new WaveFormat(44100, 16, 2)))
{
// We can use either IWaveProvider or ISampleProvider here doesn't matter
// Just be aware the values you feed during the conversion (Read() use byte[] buffer vs float[] samples)
IWaveProvider provider = source;
if (preview)
{
// Trim audio for preview purpose
provider = new OffsetSampleProvider(provider.ToSampleProvider())
{
SkipOver = TimeSpan.FromSeconds(previewStart),
Take = TimeSpan.FromSeconds(10)
}.ToWaveProvider();
// Add fade in effect in the beginning of audio for preview purpose
var fader = new FadeInOutSampleProvider(provider.ToSampleProvider());
fader.BeginFadeIn(1000);
provider = fader.ToWaveProvider();
}
// Convert our Source to 16bit Wave
provider = new SampleToWaveProvider16(provider.ToSampleProvider());
// You could probably use AverageBytesPerSecond * 2 here to store the whole second for 2 channels samples
// Just don't set it too much, otherwise our fade-out checking won't hit
byte[] buffer = new byte[provider.WaveFormat.AverageBytesPerSecond];
bool fadeOut = false;
for (int read; (read = provider.Read(buffer, 0, buffer.Length)) > 0;)
{
// Check whether it's preview or not, and if it is, we want to add fade out effect for the last second
if (preview && !fadeOut && wav.TotalTime.TotalMilliseconds >= 8000)
{
// Add fade out effect at the end of audio for preview purpose
var fader = new FadeInOutSampleProvider(provider.ToSampleProvider());
fader.BeginFadeOut(1000);
fadeOut = true;
// Sample it to 16 bit again to avoid distortion after adding fade out effect
provider = new SampleToWaveProvider16(fader);
}
// Write converted 16bit sample to the temporary memory stream
wav.Write(buffer, 0, read);
}
} // Ensure writer disposed so the data is completely flushed to our memory stream
// Finally, convert PCM Wav to ADPCM Wav
tmp.Seek(0, SeekOrigin.Begin); // reset offset so our WaveFileReader read our header correctly
var output = new IgnoreDisposeStream(new MemoryStream());
using (var pcm = new WaveFileReader(tmp.SourceStream))
using (var adpcm = new WaveFormatConversionStream(format, pcm))
using (var writer = new WaveFileWriter(output, format))
{
byte[] buffer = new byte[adpcm.Length];
int read = adpcm.Read(buffer, 0, buffer.Length);
writer.Write(buffer, 0, read);
}
return output.SourceStream as MemoryStream;
}
}
}

View File

@ -0,0 +1,54 @@
using System;
using System.Diagnostics;
using System.IO;
namespace VoxCharger
{
public static class S3VTool
{
public static string ConverterFileName { get; set; } = "ffmpeg.exe";
public static void Convert(string inputFileName, string outputFileName, AudioImportOptions opt = null)
{
opt = opt ?? AudioImportOptions.Default;
if (!File.Exists(ConverterFileName))
throw new FileNotFoundException($"{ConverterFileName} not found", ConverterFileName);
/*
* TODO: DO NOT USE! Original .s3v (.asf) file seems encoded by Windows Media Audio Pro 10 encoder with close to Lossless quality.
* FFMPEG doesn't support this, and thus, this will generate non-working audio file for the game
*
* Format: 256000 Bit Rate with 44100 Sample Rate 24 Bit depth @ 2 Channels
*/
string previewArgs = "";
if (opt.IsPreview)
previewArgs = $"-ss {opt.PreviewOffset / 60:00}:{opt.PreviewOffset % 60:00} -t 10 -af afade=t=in:st={opt.PreviewOffset}:d=1,afade=t=out:st={opt.PreviewOffset + 9}:d=1";
string args = $"-y -i \"{inputFileName}\" {previewArgs} -maxrate 297k -minrate 297k -bufsize 297 -vb 280k -ab 380k -ac 2 -ar 44100 -f asf \"{outputFileName}\"";
var info = new ProcessStartInfo()
{
FileName = ConverterFileName,
Arguments = args,
WorkingDirectory = Environment.CurrentDirectory,
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
using (var process = Process.Start(info))
{
process.WaitForExit();
if (process.ExitCode != 0)
{
int exitCode = process.ExitCode;
string stdout = (process.StandardOutput.ReadToEnd() + ' ' + process.StandardError.ReadToEnd().Trim()).Trim();
if (string.IsNullOrEmpty(stdout))
stdout = "Unknown error.";
throw new ApplicationException($"{Path.GetFileName(ConverterFileName)} execution failed.\n({exitCode}): {stdout}");
}
}
}
}
}

View File

@ -4,13 +4,13 @@ namespace VoxCharger
{
public abstract partial class Event
{
public class BPM : Event
public class Bpm : Event
{
public float Value { get; set; }
public bool IsStop { get; set; }
public BPM(Time time, float value)
public Bpm(Time time, float value)
: base(time)
{
Value = value;
@ -18,7 +18,7 @@ namespace VoxCharger
public override string ToString()
{
return $"{base.ToString()}\t{Value:0.00}\t{4}" + (IsStop ? "-" : string.Empty);
return $"{base.ToString()}\t{Value:0.0000}\t{4}" + (IsStop ? "-" : string.Empty);
}
}
}

View File

@ -7,7 +7,7 @@ namespace VoxCharger
public class Tilt : Camera
{
public Tilt(Time time, int duration, float start, float end)
: base(time, WorkType.Rotation)
: base(time, WorkType.Tilt)
{
Duration = duration;
Start = start;

View File

@ -11,7 +11,9 @@ namespace VoxCharger
Radian,
Realize,
AirLeftScaleX,
AirRightScaleX,
AirLeftScaleY,
AirRightScaleY,
Tilt,
LaneClear
}

View File

@ -8,9 +8,9 @@ namespace VoxCharger
{
public class EventCollection : ICollection<Event>
{
private List<Event> Events = new List<Event>();
private List<Event> _events = new List<Event>();
public int Count => Events.Count;
public int Count => _events.Count;
public bool IsReadOnly => false;
@ -20,13 +20,13 @@ namespace VoxCharger
public Event[] this[int measure]
{
get => Events.FindAll((ev) => ev.Time.Measure == measure).ToArray();
get => _events.FindAll((ev) => ev.Time.Measure == measure).ToArray();
}
public Event[] this[Time time]
{
get => Events.FindAll((ev) => ev.Time == time).ToArray();
set => Events.AddRange(value.Where(ev => ev != null).Select(ev => { ev.Time = time; return ev; }));
get => _events.FindAll((ev) => ev.Time == time).ToArray();
set => _events.AddRange(value.Where(ev => ev != null).Select(ev => { ev.Time = time; return ev; }));
}
public Event.TimeSignature GetTimeSignature(int measure)
@ -36,64 +36,64 @@ namespace VoxCharger
public Event.TimeSignature GetTimeSignature(Time time)
{
var timeSig = Events.LastOrDefault(ev =>
var timeSig = _events.LastOrDefault(ev =>
ev is Event.TimeSignature && (ev.Time == time || ev.Time.Measure < time.Measure)
) as Event.TimeSignature;
return timeSig != null ? timeSig : new Event.TimeSignature(time, 4, 4);
}
public Event.BPM GetBPM(int measure)
public Event.Bpm GetBpm(int measure)
{
return GetBPM(new Time(measure, 1, 0));
return GetBpm(new Time(measure, 1, 0));
}
public Event.BPM GetBPM(Time time)
public Event.Bpm GetBpm(Time time)
{
return Events.LastOrDefault(ev =>
ev is Event.BPM && (ev.Time == time || ev.Time.Measure < time.Measure)
) as Event.BPM;
return _events.LastOrDefault(ev =>
ev is Event.Bpm && (ev.Time == time || ev.Time.Measure < time.Measure)
) as Event.Bpm;
}
public void Add(Event ev)
{
if (ev != null)
Events.Add(ev);
_events.Add(ev);
}
public void Add(params Event[] ev)
{
Events.AddRange(new List<Event>(ev).FindAll(e => e != null));
_events.AddRange(new List<Event>(ev).FindAll(e => e != null));
}
public bool Remove(Event ev)
{
return Events.Remove(ev);
return _events.Remove(ev);
}
public bool Contains(Event ev)
{
return Events.Contains(ev);
return _events.Contains(ev);
}
public void CopyTo(Event[] events, int index)
{
Events.CopyTo(events, index);
_events.CopyTo(events, index);
}
public void Clear()
{
Events.Clear();
_events.Clear();
}
public IEnumerator<Event> GetEnumerator()
{
return Events.GetEnumerator();
return _events.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return Events.GetEnumerator();
return _events.GetEnumerator();
}
}
}

View File

@ -19,16 +19,17 @@ namespace VoxCharger
public enum SlamImpact
{
None = 0,
Measure = 1,
HalfMeasure = 2,
ThreeBeat = 3,
TripleMeasure = 4,
Swing = 5
None = 0,
Measure = 1,
HalfMeasure = 2,
ThreeBeat = 3,
TripleMeasure = 4,
Swing = 5
}
public enum LaserFilter
{
None = -1,
Peak = 0,
LowPass = 1,
HighPass = 3,
@ -49,7 +50,7 @@ namespace VoxCharger
public SlamImpact Impact { get; set; }
public int Range { get; set; }
public LaserFilter Filter { get; set; }
public bool Slam { get; set; }
public bool IsLaserSlam { get; set; }
public Laser(Time time, LaserTrack track, int offset, LaserFlag flag, SlamImpact impact)
: base (time)

View File

@ -4,6 +4,8 @@ namespace VoxCharger
{
public class Time
{
public static readonly Time Initial = new Time(1, 1, 0);
public int Measure { get; set; }
public int Beat { get; set; }
public int Offset { get; set; }

View File

@ -15,6 +15,11 @@ namespace VoxCharger
System.Diagnostics.Process.Start("mailto://o2jam@cxo2.me");
}
private void OnGithubLinkLabelLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(((LinkLabel)sender).Text);
}
private void OnCloseButtonClick(object sender, EventArgs e)
{
Close();

View File

@ -36,6 +36,7 @@
this.EmailLinkLabel = new System.Windows.Forms.LinkLabel();
this.label4 = new System.Windows.Forms.Label();
this.CloseButton = new System.Windows.Forms.Button();
this.GithubLinkLabel = new System.Windows.Forms.LinkLabel();
((System.ComponentModel.ISupportInitialize)(this.ProfilePictureBox)).BeginInit();
this.SuspendLayout();
//
@ -65,9 +66,9 @@
this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label2.Location = new System.Drawing.Point(107, 36);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(77, 13);
this.label2.Size = new System.Drawing.Size(82, 13);
this.label2.TabIndex = 2;
this.label2.Text = "Version 0.9.7b";
this.label2.Text = "Version 0.9.12c";
//
// label3
//
@ -77,7 +78,7 @@
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(131, 13);
this.label3.TabIndex = 3;
this.label3.Text = "Copyright © 2020 - CXO2";
this.label3.Text = "Copyright © 2022 - CXO2";
//
// EmailLinkLabel
//
@ -104,8 +105,7 @@
//
// CloseButton
//
this.CloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.CloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.CloseButton.Location = new System.Drawing.Point(21, 151);
this.CloseButton.Name = "CloseButton";
this.CloseButton.Size = new System.Drawing.Size(292, 26);
@ -114,11 +114,25 @@
this.CloseButton.UseVisualStyleBackColor = true;
this.CloseButton.Click += new System.EventHandler(this.OnCloseButtonClick);
//
// GithubLinkLabel
//
this.GithubLinkLabel.AutoSize = true;
this.GithubLinkLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.GithubLinkLabel.Location = new System.Drawing.Point(107, 83);
this.GithubLinkLabel.Name = "GithubLinkLabel";
this.GithubLinkLabel.Size = new System.Drawing.Size(212, 13);
this.GithubLinkLabel.TabIndex = 7;
this.GithubLinkLabel.TabStop = true;
this.GithubLinkLabel.Text = "https://github.com/SirusDoma/VoxCharger";
this.GithubLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnGithubLinkLabelLinkClicked);
//
// AboutForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Control;
this.ClientSize = new System.Drawing.Size(334, 189);
this.Controls.Add(this.GithubLinkLabel);
this.Controls.Add(this.CloseButton);
this.Controls.Add(this.label4);
this.Controls.Add(this.EmailLinkLabel);
@ -128,17 +142,18 @@
this.Controls.Add(this.ProfilePictureBox);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Location = new System.Drawing.Point(15, 15);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AboutForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "About VoxCharger";
((System.ComponentModel.ISupportInitialize)(this.ProfilePictureBox)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.LinkLabel GithubLinkLabel;
#endregion
private System.Windows.Forms.PictureBox ProfilePictureBox;

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,6 @@
namespace VoxCharger
using System.Windows.Forms;
namespace VoxCharger
{
partial class ConverterForm
{
@ -39,7 +41,23 @@
this.JacketNovPictureBox = new System.Windows.Forms.PictureBox();
this.PathTextBox = new System.Windows.Forms.TextBox();
this.OptionsGroupBox = new System.Windows.Forms.GroupBox();
this.SlamImpactCheckBox = new System.Windows.Forms.CheckBox();
this.SoundEffectsCheckBox = new System.Windows.Forms.CheckBox();
this.CameraEffectsCheckBox = new System.Windows.Forms.CheckBox();
this.CameraEffectsGroupBox = new System.Windows.Forms.GroupBox();
this.CameraMappingButton = new System.Windows.Forms.Button();
this.CameraEffectsCheckedListBox = new System.Windows.Forms.CheckedListBox();
this.TracksGroupBox = new System.Windows.Forms.GroupBox();
this.TrackFXRCheckBox = new System.Windows.Forms.CheckBox();
this.TrackFXLCheckBox = new System.Windows.Forms.CheckBox();
this.TrackVolRCheckBox = new System.Windows.Forms.CheckBox();
this.TrackButtonDCheckBox = new System.Windows.Forms.CheckBox();
this.TrackButtonCCheckBox = new System.Windows.Forms.CheckBox();
this.TrackButtonBCheckBox = new System.Windows.Forms.CheckBox();
this.TrackButtonACheckBox = new System.Windows.Forms.CheckBox();
this.TrackVolLCheckBox = new System.Windows.Forms.CheckBox();
this.SoundEffectGroupBox = new System.Windows.Forms.GroupBox();
this.SoundMappingButton = new System.Windows.Forms.Button();
this.SoundEffectsCheckedListBox = new System.Windows.Forms.CheckedListBox();
this.VersionDropDown = new System.Windows.Forms.ComboBox();
this.InfVerDropDown = new System.Windows.Forms.ComboBox();
this.BackgroundDropDown = new System.Windows.Forms.ComboBox();
@ -47,25 +65,27 @@
this.RealignOffsetCheckBox = new System.Windows.Forms.CheckBox();
this.AsciiAutoCheckBox = new System.Windows.Forms.CheckBox();
this.InfVerLabel = new System.Windows.Forms.Label();
this.CameraCheckBox = new System.Windows.Forms.CheckBox();
this.TrackButtonCheckBox = new System.Windows.Forms.CheckBox();
this.TrackLaserCheckBox = new System.Windows.Forms.CheckBox();
this.TrackLabel = new System.Windows.Forms.Label();
this.EffectsLabel = new System.Windows.Forms.Label();
this.MeasureLabel = new System.Windows.Forms.Label();
this.AsciiTextBox = new System.Windows.Forms.TextBox();
this.LongFxCheckBox = new System.Windows.Forms.CheckBox();
this.ChipFxCheckBox = new System.Windows.Forms.CheckBox();
this.MusicCodeLabel = new System.Windows.Forms.Label();
this.CancelConvertButton = new System.Windows.Forms.Button();
this.ProcessConvertButton = new System.Windows.Forms.Button();
this.TargetLabel = new System.Windows.Forms.Label();
this.MusicGroupBox = new System.Windows.Forms.GroupBox();
this.FormatLabel = new System.Windows.Forms.Label();
this.PreviewTimePicker = new System.Windows.Forms.DateTimePicker();
this.MusicFormatDropDown = new System.Windows.Forms.ComboBox();
this.PreviewOffsetLabel = new System.Windows.Forms.Label();
this.LevelGroupBox.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.JacketInfPictureBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.JacketExhPictureBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.JacketAdvPictureBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.JacketNovPictureBox)).BeginInit();
this.OptionsGroupBox.SuspendLayout();
this.CameraEffectsGroupBox.SuspendLayout();
this.TracksGroupBox.SuspendLayout();
this.SoundEffectGroupBox.SuspendLayout();
this.MusicGroupBox.SuspendLayout();
this.SuspendLayout();
//
// LevelGroupBox
@ -81,7 +101,7 @@
this.LevelGroupBox.Location = new System.Drawing.Point(12, 44);
this.LevelGroupBox.Name = "LevelGroupBox";
this.LevelGroupBox.Size = new System.Drawing.Size(447, 165);
this.LevelGroupBox.TabIndex = 15;
this.LevelGroupBox.TabIndex = 1;
this.LevelGroupBox.TabStop = false;
this.LevelGroupBox.Text = "Levels";
//
@ -90,7 +110,7 @@
this.InfEditButton.Location = new System.Drawing.Point(331, 133);
this.InfEditButton.Name = "InfEditButton";
this.InfEditButton.Size = new System.Drawing.Size(108, 26);
this.InfEditButton.TabIndex = 18;
this.InfEditButton.TabIndex = 3;
this.InfEditButton.Tag = "4";
this.InfEditButton.Text = "--";
this.InfEditButton.UseVisualStyleBackColor = true;
@ -101,7 +121,7 @@
this.ExhEditButton.Location = new System.Drawing.Point(223, 133);
this.ExhEditButton.Name = "ExhEditButton";
this.ExhEditButton.Size = new System.Drawing.Size(108, 26);
this.ExhEditButton.TabIndex = 17;
this.ExhEditButton.TabIndex = 2;
this.ExhEditButton.Tag = "3";
this.ExhEditButton.Text = "EXH";
this.ExhEditButton.UseVisualStyleBackColor = true;
@ -112,7 +132,7 @@
this.AdvEditButton.Location = new System.Drawing.Point(115, 133);
this.AdvEditButton.Name = "AdvEditButton";
this.AdvEditButton.Size = new System.Drawing.Size(108, 26);
this.AdvEditButton.TabIndex = 16;
this.AdvEditButton.TabIndex = 1;
this.AdvEditButton.Tag = "2";
this.AdvEditButton.Text = "ADV";
this.AdvEditButton.UseVisualStyleBackColor = true;
@ -123,7 +143,7 @@
this.NovEditButton.Location = new System.Drawing.Point(7, 133);
this.NovEditButton.Name = "NovEditButton";
this.NovEditButton.Size = new System.Drawing.Size(108, 26);
this.NovEditButton.TabIndex = 15;
this.NovEditButton.TabIndex = 0;
this.NovEditButton.Tag = "1";
this.NovEditButton.Text = "NOV";
this.NovEditButton.UseVisualStyleBackColor = true;
@ -179,11 +199,15 @@
this.PathTextBox.Name = "PathTextBox";
this.PathTextBox.ReadOnly = true;
this.PathTextBox.Size = new System.Drawing.Size(409, 20);
this.PathTextBox.TabIndex = 16;
this.PathTextBox.TabIndex = 0;
//
// OptionsGroupBox
//
this.OptionsGroupBox.Controls.Add(this.SlamImpactCheckBox);
this.OptionsGroupBox.Controls.Add(this.SoundEffectsCheckBox);
this.OptionsGroupBox.Controls.Add(this.CameraEffectsCheckBox);
this.OptionsGroupBox.Controls.Add(this.CameraEffectsGroupBox);
this.OptionsGroupBox.Controls.Add(this.TracksGroupBox);
this.OptionsGroupBox.Controls.Add(this.SoundEffectGroupBox);
this.OptionsGroupBox.Controls.Add(this.VersionDropDown);
this.OptionsGroupBox.Controls.Add(this.InfVerDropDown);
this.OptionsGroupBox.Controls.Add(this.BackgroundDropDown);
@ -191,148 +215,260 @@
this.OptionsGroupBox.Controls.Add(this.RealignOffsetCheckBox);
this.OptionsGroupBox.Controls.Add(this.AsciiAutoCheckBox);
this.OptionsGroupBox.Controls.Add(this.InfVerLabel);
this.OptionsGroupBox.Controls.Add(this.CameraCheckBox);
this.OptionsGroupBox.Controls.Add(this.TrackButtonCheckBox);
this.OptionsGroupBox.Controls.Add(this.TrackLaserCheckBox);
this.OptionsGroupBox.Controls.Add(this.TrackLabel);
this.OptionsGroupBox.Controls.Add(this.EffectsLabel);
this.OptionsGroupBox.Controls.Add(this.MeasureLabel);
this.OptionsGroupBox.Controls.Add(this.AsciiTextBox);
this.OptionsGroupBox.Controls.Add(this.LongFxCheckBox);
this.OptionsGroupBox.Controls.Add(this.ChipFxCheckBox);
this.OptionsGroupBox.Controls.Add(this.MusicCodeLabel);
this.OptionsGroupBox.Location = new System.Drawing.Point(12, 215);
this.OptionsGroupBox.Name = "OptionsGroupBox";
this.OptionsGroupBox.Size = new System.Drawing.Size(447, 170);
this.OptionsGroupBox.TabIndex = 1;
this.OptionsGroupBox.Size = new System.Drawing.Size(447, 372);
this.OptionsGroupBox.TabIndex = 2;
this.OptionsGroupBox.TabStop = false;
this.OptionsGroupBox.Text = "Options";
this.OptionsGroupBox.Text = "Metadata && Charts";
//
// SlamImpactCheckBox
// SoundEffectsCheckBox
//
this.SlamImpactCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.SlamImpactCheckBox.AutoSize = true;
this.SlamImpactCheckBox.Checked = true;
this.SlamImpactCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.SlamImpactCheckBox.Location = new System.Drawing.Point(293, 114);
this.SlamImpactCheckBox.Name = "SlamImpactCheckBox";
this.SlamImpactCheckBox.Size = new System.Drawing.Size(84, 17);
this.SlamImpactCheckBox.TabIndex = 20;
this.SlamImpactCheckBox.Text = "Slam Impact";
this.SlamImpactCheckBox.UseVisualStyleBackColor = true;
this.SoundEffectsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.SoundEffectsCheckBox.AutoSize = true;
this.SoundEffectsCheckBox.Checked = true;
this.SoundEffectsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.SoundEffectsCheckBox.Location = new System.Drawing.Point(17, 119);
this.SoundEffectsCheckBox.Name = "SoundEffectsCheckBox";
this.SoundEffectsCheckBox.Size = new System.Drawing.Size(93, 17);
this.SoundEffectsCheckBox.TabIndex = 6;
this.SoundEffectsCheckBox.Text = "Sound Effects";
this.SoundEffectsCheckBox.UseVisualStyleBackColor = true;
this.SoundEffectsCheckBox.CheckedChanged += new System.EventHandler(this.OnSoundEffectsCheckBoxCheckedChanged);
//
// CameraEffectsCheckBox
//
this.CameraEffectsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.CameraEffectsCheckBox.AutoSize = true;
this.CameraEffectsCheckBox.Checked = true;
this.CameraEffectsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.CameraEffectsCheckBox.Location = new System.Drawing.Point(235, 119);
this.CameraEffectsCheckBox.Name = "CameraEffectsCheckBox";
this.CameraEffectsCheckBox.Size = new System.Drawing.Size(98, 17);
this.CameraEffectsCheckBox.TabIndex = 7;
this.CameraEffectsCheckBox.Text = "Camera Effects";
this.CameraEffectsCheckBox.UseVisualStyleBackColor = true;
this.CameraEffectsCheckBox.CheckedChanged += new System.EventHandler(this.OnCameraEffectsCheckBoxCheckedChanged);
//
// CameraEffectsGroupBox
//
this.CameraEffectsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.CameraEffectsGroupBox.Controls.Add(this.CameraMappingButton);
this.CameraEffectsGroupBox.Controls.Add(this.CameraEffectsCheckedListBox);
this.CameraEffectsGroupBox.Location = new System.Drawing.Point(228, 121);
this.CameraEffectsGroupBox.Name = "CameraEffectsGroupBox";
this.CameraEffectsGroupBox.Size = new System.Drawing.Size(211, 168);
this.CameraEffectsGroupBox.TabIndex = 9;
this.CameraEffectsGroupBox.TabStop = false;
//
// CameraMappingButton
//
this.CameraMappingButton.Location = new System.Drawing.Point(6, 134);
this.CameraMappingButton.Name = "CameraMappingButton";
this.CameraMappingButton.Size = new System.Drawing.Size(199, 28);
this.CameraMappingButton.TabIndex = 1;
this.CameraMappingButton.Text = "Configure Mappings..";
this.CameraMappingButton.UseVisualStyleBackColor = true;
this.CameraMappingButton.Click += new System.EventHandler(this.OnMappingButtonClick);
//
// CameraEffectsCheckedListBox
//
this.CameraEffectsCheckedListBox.BackColor = System.Drawing.SystemColors.Control;
this.CameraEffectsCheckedListBox.CheckOnClick = true;
this.CameraEffectsCheckedListBox.FormattingEnabled = true;
this.CameraEffectsCheckedListBox.Location = new System.Drawing.Point(6, 19);
this.CameraEffectsCheckedListBox.Name = "CameraEffectsCheckedListBox";
this.CameraEffectsCheckedListBox.ScrollAlwaysVisible = true;
this.CameraEffectsCheckedListBox.Size = new System.Drawing.Size(199, 109);
this.CameraEffectsCheckedListBox.TabIndex = 0;
this.CameraEffectsCheckedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.OnCameraEffectsCheckedListBoxItemCheck);
//
// TracksGroupBox
//
this.TracksGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.TracksGroupBox.Controls.Add(this.TrackFXRCheckBox);
this.TracksGroupBox.Controls.Add(this.TrackFXLCheckBox);
this.TracksGroupBox.Controls.Add(this.TrackVolRCheckBox);
this.TracksGroupBox.Controls.Add(this.TrackButtonDCheckBox);
this.TracksGroupBox.Controls.Add(this.TrackButtonCCheckBox);
this.TracksGroupBox.Controls.Add(this.TrackButtonBCheckBox);
this.TracksGroupBox.Controls.Add(this.TrackButtonACheckBox);
this.TracksGroupBox.Controls.Add(this.TrackVolLCheckBox);
this.TracksGroupBox.Location = new System.Drawing.Point(10, 295);
this.TracksGroupBox.Name = "TracksGroupBox";
this.TracksGroupBox.Size = new System.Drawing.Size(429, 68);
this.TracksGroupBox.TabIndex = 10;
this.TracksGroupBox.TabStop = false;
this.TracksGroupBox.Text = "Tracks";
//
// TrackFXRCheckBox
//
this.TrackFXRCheckBox.AutoSize = true;
this.TrackFXRCheckBox.Checked = true;
this.TrackFXRCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackFXRCheckBox.Location = new System.Drawing.Point(236, 42);
this.TrackFXRCheckBox.Name = "TrackFXRCheckBox";
this.TrackFXRCheckBox.Size = new System.Drawing.Size(50, 17);
this.TrackFXRCheckBox.TabIndex = 7;
this.TrackFXRCheckBox.Text = "FX-R";
this.TrackFXRCheckBox.UseVisualStyleBackColor = true;
//
// TrackFXLCheckBox
//
this.TrackFXLCheckBox.AutoSize = true;
this.TrackFXLCheckBox.Checked = true;
this.TrackFXLCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackFXLCheckBox.Location = new System.Drawing.Point(124, 42);
this.TrackFXLCheckBox.Name = "TrackFXLCheckBox";
this.TrackFXLCheckBox.Size = new System.Drawing.Size(48, 17);
this.TrackFXLCheckBox.TabIndex = 6;
this.TrackFXLCheckBox.Text = "FX-L";
this.TrackFXLCheckBox.UseVisualStyleBackColor = true;
//
// TrackVolRCheckBox
//
this.TrackVolRCheckBox.AutoSize = true;
this.TrackVolRCheckBox.Checked = true;
this.TrackVolRCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackVolRCheckBox.Location = new System.Drawing.Point(331, 19);
this.TrackVolRCheckBox.Name = "TrackVolRCheckBox";
this.TrackVolRCheckBox.Size = new System.Drawing.Size(52, 17);
this.TrackVolRCheckBox.TabIndex = 5;
this.TrackVolRCheckBox.Text = "Vol-R";
this.TrackVolRCheckBox.UseVisualStyleBackColor = true;
//
// TrackButtonDCheckBox
//
this.TrackButtonDCheckBox.AutoSize = true;
this.TrackButtonDCheckBox.Checked = true;
this.TrackButtonDCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackButtonDCheckBox.Location = new System.Drawing.Point(274, 19);
this.TrackButtonDCheckBox.Name = "TrackButtonDCheckBox";
this.TrackButtonDCheckBox.Size = new System.Drawing.Size(51, 17);
this.TrackButtonDCheckBox.TabIndex = 4;
this.TrackButtonDCheckBox.Text = "BT-D";
this.TrackButtonDCheckBox.UseVisualStyleBackColor = true;
//
// TrackButtonCCheckBox
//
this.TrackButtonCCheckBox.AutoSize = true;
this.TrackButtonCCheckBox.Checked = true;
this.TrackButtonCCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackButtonCCheckBox.Location = new System.Drawing.Point(218, 19);
this.TrackButtonCCheckBox.Name = "TrackButtonCCheckBox";
this.TrackButtonCCheckBox.Size = new System.Drawing.Size(50, 17);
this.TrackButtonCCheckBox.TabIndex = 3;
this.TrackButtonCCheckBox.Text = "BT-C";
this.TrackButtonCCheckBox.UseVisualStyleBackColor = true;
//
// TrackButtonBCheckBox
//
this.TrackButtonBCheckBox.AutoSize = true;
this.TrackButtonBCheckBox.Checked = true;
this.TrackButtonBCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackButtonBCheckBox.Location = new System.Drawing.Point(162, 19);
this.TrackButtonBCheckBox.Name = "TrackButtonBCheckBox";
this.TrackButtonBCheckBox.Size = new System.Drawing.Size(50, 17);
this.TrackButtonBCheckBox.TabIndex = 2;
this.TrackButtonBCheckBox.Text = "BT-B";
this.TrackButtonBCheckBox.UseVisualStyleBackColor = true;
//
// TrackButtonACheckBox
//
this.TrackButtonACheckBox.AutoSize = true;
this.TrackButtonACheckBox.Checked = true;
this.TrackButtonACheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackButtonACheckBox.Location = new System.Drawing.Point(106, 19);
this.TrackButtonACheckBox.Name = "TrackButtonACheckBox";
this.TrackButtonACheckBox.Size = new System.Drawing.Size(50, 17);
this.TrackButtonACheckBox.TabIndex = 1;
this.TrackButtonACheckBox.Text = "BT-A";
this.TrackButtonACheckBox.UseVisualStyleBackColor = true;
//
// TrackVolLCheckBox
//
this.TrackVolLCheckBox.AutoSize = true;
this.TrackVolLCheckBox.Checked = true;
this.TrackVolLCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackVolLCheckBox.Location = new System.Drawing.Point(50, 19);
this.TrackVolLCheckBox.Name = "TrackVolLCheckBox";
this.TrackVolLCheckBox.Size = new System.Drawing.Size(50, 17);
this.TrackVolLCheckBox.TabIndex = 0;
this.TrackVolLCheckBox.Text = "Vol-L";
this.TrackVolLCheckBox.UseVisualStyleBackColor = true;
//
// SoundEffectGroupBox
//
this.SoundEffectGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.SoundEffectGroupBox.Controls.Add(this.SoundMappingButton);
this.SoundEffectGroupBox.Controls.Add(this.SoundEffectsCheckedListBox);
this.SoundEffectGroupBox.Location = new System.Drawing.Point(10, 121);
this.SoundEffectGroupBox.Name = "SoundEffectGroupBox";
this.SoundEffectGroupBox.Size = new System.Drawing.Size(212, 168);
this.SoundEffectGroupBox.TabIndex = 8;
this.SoundEffectGroupBox.TabStop = false;
//
// SoundMappingButton
//
this.SoundMappingButton.Location = new System.Drawing.Point(6, 134);
this.SoundMappingButton.Name = "SoundMappingButton";
this.SoundMappingButton.Size = new System.Drawing.Size(200, 28);
this.SoundMappingButton.TabIndex = 1;
this.SoundMappingButton.Text = "Configure Mappings..";
this.SoundMappingButton.UseVisualStyleBackColor = true;
this.SoundMappingButton.Click += new System.EventHandler(this.OnMappingButtonClick);
//
// SoundEffectsCheckedListBox
//
this.SoundEffectsCheckedListBox.BackColor = System.Drawing.SystemColors.Control;
this.SoundEffectsCheckedListBox.CheckOnClick = true;
this.SoundEffectsCheckedListBox.FormattingEnabled = true;
this.SoundEffectsCheckedListBox.Location = new System.Drawing.Point(6, 19);
this.SoundEffectsCheckedListBox.Name = "SoundEffectsCheckedListBox";
this.SoundEffectsCheckedListBox.ScrollAlwaysVisible = true;
this.SoundEffectsCheckedListBox.Size = new System.Drawing.Size(200, 109);
this.SoundEffectsCheckedListBox.TabIndex = 0;
this.SoundEffectsCheckedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.OnSoundEffectsCheckedListBoxItemCheck);
//
// VersionDropDown
//
this.VersionDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.VersionDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.VersionDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.VersionDropDown.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.VersionDropDown.FormattingEnabled = true;
this.VersionDropDown.Items.AddRange(new object[] {
"Sound Voltex: Booth",
"Sound Voltex II: Infinite Infection",
"Sound Voltex III: Gravity Wars",
"Sound Voltex IV: Heavenly Haven",
"Sound Voltex V: VividWave"});
this.VersionDropDown.Items.AddRange(new object[] { "Sound Voltex: Booth", "Sound Voltex II: Infinite Infection", "Sound Voltex III: Gravity Wars", "Sound Voltex IV: Heavenly Haven", "Sound Voltex V: Vivid Wave", "Sound Voltex VI: Exceed Gear" });
this.VersionDropDown.Location = new System.Drawing.Point(90, 42);
this.VersionDropDown.Name = "VersionDropDown";
this.VersionDropDown.Size = new System.Drawing.Size(247, 21);
this.VersionDropDown.TabIndex = 19;
this.VersionDropDown.TabIndex = 2;
//
// InfVerDropDown
//
this.InfVerDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.InfVerDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.InfVerDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.InfVerDropDown.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.InfVerDropDown.FormattingEnabled = true;
this.InfVerDropDown.Items.AddRange(new object[] {
"MXM",
"INF",
"GRV",
"HVN",
"VVD"});
this.InfVerDropDown.Items.AddRange(new object[] { "MXM", "INF", "GRV", "HVN", "VVD", "XCD" });
this.InfVerDropDown.Location = new System.Drawing.Point(343, 42);
this.InfVerDropDown.Name = "InfVerDropDown";
this.InfVerDropDown.Size = new System.Drawing.Size(96, 21);
this.InfVerDropDown.TabIndex = 18;
this.InfVerDropDown.TabIndex = 3;
this.InfVerDropDown.SelectedIndexChanged += new System.EventHandler(this.OnInfVerDropDownSelectedIndexChanged);
//
// BackgroundDropDown
//
this.BackgroundDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.BackgroundDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.BackgroundDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.BackgroundDropDown.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.BackgroundDropDown.FormattingEnabled = true;
this.BackgroundDropDown.Items.AddRange(new object[] {
"00",
"01",
"02",
"03",
"04",
"05",
"06",
"07",
"08",
"09",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"18",
"19",
"27",
"29",
"30",
"31",
"34",
"36",
"38",
"39",
"40",
"41",
"42",
"43",
"44",
"45",
"46",
"47",
"48",
"49",
"50",
"51",
"53",
"54",
"57",
"58",
"59",
"60",
"61",
"63",
"65",
"66",
"67",
"68",
"69",
"70",
"71",
"72",
"73",
"74",
"75",
"76",
"77",
"78",
"79",
"80",
"81"});
this.BackgroundDropDown.Items.AddRange(new object[] { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "18", "19", "27", "29", "30", "31", "34", "36", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "53", "54", "57", "58", "59", "60", "61", "63", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "86", "87", "88", "89", "90", "91", "92", "93", "92", "95", "96", "97", "98" });
this.BackgroundDropDown.Location = new System.Drawing.Point(90, 65);
this.BackgroundDropDown.Name = "BackgroundDropDown";
this.BackgroundDropDown.Size = new System.Drawing.Size(349, 21);
this.BackgroundDropDown.TabIndex = 17;
this.BackgroundDropDown.TabIndex = 4;
this.BackgroundDropDown.SelectedIndexChanged += new System.EventHandler(this.OnBackgroundDropDownSelectedIndexChanged);
//
// BackgroundLabel
@ -341,7 +477,7 @@
this.BackgroundLabel.Location = new System.Drawing.Point(10, 65);
this.BackgroundLabel.Name = "BackgroundLabel";
this.BackgroundLabel.Size = new System.Drawing.Size(74, 20);
this.BackgroundLabel.TabIndex = 16;
this.BackgroundLabel.TabIndex = 0;
this.BackgroundLabel.Text = "Background";
this.BackgroundLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
@ -351,9 +487,9 @@
this.RealignOffsetCheckBox.AutoSize = true;
this.RealignOffsetCheckBox.Location = new System.Drawing.Point(90, 91);
this.RealignOffsetCheckBox.Name = "RealignOffsetCheckBox";
this.RealignOffsetCheckBox.Size = new System.Drawing.Size(141, 17);
this.RealignOffsetCheckBox.TabIndex = 15;
this.RealignOffsetCheckBox.Text = "Adapt Start Music Offset";
this.RealignOffsetCheckBox.Size = new System.Drawing.Size(195, 17);
this.RealignOffsetCheckBox.TabIndex = 5;
this.RealignOffsetCheckBox.Text = "Adapt Start Music Offset (Unstable!)";
this.RealignOffsetCheckBox.UseVisualStyleBackColor = true;
//
// AsciiAutoCheckBox
@ -361,10 +497,10 @@
this.AsciiAutoCheckBox.AutoSize = true;
this.AsciiAutoCheckBox.Checked = true;
this.AsciiAutoCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.AsciiAutoCheckBox.Location = new System.Drawing.Point(391, 23);
this.AsciiAutoCheckBox.Location = new System.Drawing.Point(391, 21);
this.AsciiAutoCheckBox.Name = "AsciiAutoCheckBox";
this.AsciiAutoCheckBox.Size = new System.Drawing.Size(48, 17);
this.AsciiAutoCheckBox.TabIndex = 14;
this.AsciiAutoCheckBox.TabIndex = 1;
this.AsciiAutoCheckBox.Text = "Auto";
this.AsciiAutoCheckBox.UseVisualStyleBackColor = true;
this.AsciiAutoCheckBox.CheckedChanged += new System.EventHandler(this.OnAsciiAutoCheckBoxCheckedChanged);
@ -375,76 +511,17 @@
this.InfVerLabel.Location = new System.Drawing.Point(10, 42);
this.InfVerLabel.Name = "InfVerLabel";
this.InfVerLabel.Size = new System.Drawing.Size(74, 20);
this.InfVerLabel.TabIndex = 12;
this.InfVerLabel.TabIndex = 0;
this.InfVerLabel.Text = "Version";
this.InfVerLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// CameraCheckBox
//
this.CameraCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.CameraCheckBox.AutoSize = true;
this.CameraCheckBox.Checked = true;
this.CameraCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.CameraCheckBox.Location = new System.Drawing.Point(225, 114);
this.CameraCheckBox.Name = "CameraCheckBox";
this.CameraCheckBox.Size = new System.Drawing.Size(62, 17);
this.CameraCheckBox.TabIndex = 5;
this.CameraCheckBox.Text = "Camera";
this.CameraCheckBox.UseVisualStyleBackColor = true;
//
// TrackButtonCheckBox
//
this.TrackButtonCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.TrackButtonCheckBox.AutoSize = true;
this.TrackButtonCheckBox.Checked = true;
this.TrackButtonCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackButtonCheckBox.Location = new System.Drawing.Point(157, 137);
this.TrackButtonCheckBox.Name = "TrackButtonCheckBox";
this.TrackButtonCheckBox.Size = new System.Drawing.Size(62, 17);
this.TrackButtonCheckBox.TabIndex = 7;
this.TrackButtonCheckBox.Text = "Buttons";
this.TrackButtonCheckBox.UseVisualStyleBackColor = true;
//
// TrackLaserCheckBox
//
this.TrackLaserCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.TrackLaserCheckBox.AutoSize = true;
this.TrackLaserCheckBox.Checked = true;
this.TrackLaserCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.TrackLaserCheckBox.Location = new System.Drawing.Point(90, 137);
this.TrackLaserCheckBox.Name = "TrackLaserCheckBox";
this.TrackLaserCheckBox.Size = new System.Drawing.Size(57, 17);
this.TrackLaserCheckBox.TabIndex = 6;
this.TrackLaserCheckBox.Text = "Lasers";
this.TrackLaserCheckBox.UseVisualStyleBackColor = true;
//
// TrackLabel
//
this.TrackLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.TrackLabel.Location = new System.Drawing.Point(10, 134);
this.TrackLabel.Name = "TrackLabel";
this.TrackLabel.Size = new System.Drawing.Size(74, 20);
this.TrackLabel.TabIndex = 11;
this.TrackLabel.Text = "Tracks";
this.TrackLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// EffectsLabel
//
this.EffectsLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.EffectsLabel.Location = new System.Drawing.Point(10, 111);
this.EffectsLabel.Name = "EffectsLabel";
this.EffectsLabel.Size = new System.Drawing.Size(74, 20);
this.EffectsLabel.TabIndex = 10;
this.EffectsLabel.Text = "Effects";
this.EffectsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// MeasureLabel
//
this.MeasureLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.MeasureLabel.Location = new System.Drawing.Point(10, 88);
this.MeasureLabel.Name = "MeasureLabel";
this.MeasureLabel.Size = new System.Drawing.Size(74, 20);
this.MeasureLabel.TabIndex = 6;
this.MeasureLabel.TabIndex = 0;
this.MeasureLabel.Text = "Offset";
this.MeasureLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
@ -456,32 +533,6 @@
this.AsciiTextBox.Size = new System.Drawing.Size(295, 20);
this.AsciiTextBox.TabIndex = 0;
//
// LongFxCheckBox
//
this.LongFxCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.LongFxCheckBox.AutoSize = true;
this.LongFxCheckBox.Checked = true;
this.LongFxCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.LongFxCheckBox.Location = new System.Drawing.Point(157, 114);
this.LongFxCheckBox.Name = "LongFxCheckBox";
this.LongFxCheckBox.Size = new System.Drawing.Size(64, 17);
this.LongFxCheckBox.TabIndex = 4;
this.LongFxCheckBox.Text = "Long Fx";
this.LongFxCheckBox.UseVisualStyleBackColor = true;
//
// ChipFxCheckBox
//
this.ChipFxCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.ChipFxCheckBox.AutoSize = true;
this.ChipFxCheckBox.Checked = true;
this.ChipFxCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.ChipFxCheckBox.Location = new System.Drawing.Point(90, 114);
this.ChipFxCheckBox.Name = "ChipFxCheckBox";
this.ChipFxCheckBox.Size = new System.Drawing.Size(61, 17);
this.ChipFxCheckBox.TabIndex = 3;
this.ChipFxCheckBox.Text = "Chip Fx";
this.ChipFxCheckBox.UseVisualStyleBackColor = true;
//
// MusicCodeLabel
//
this.MusicCodeLabel.Location = new System.Drawing.Point(10, 19);
@ -495,10 +546,10 @@
//
this.CancelConvertButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.CancelConvertButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.CancelConvertButton.Location = new System.Drawing.Point(343, 401);
this.CancelConvertButton.Location = new System.Drawing.Point(343, 687);
this.CancelConvertButton.Name = "CancelConvertButton";
this.CancelConvertButton.Size = new System.Drawing.Size(116, 28);
this.CancelConvertButton.TabIndex = 20;
this.CancelConvertButton.TabIndex = 4;
this.CancelConvertButton.Text = "Cancel";
this.CancelConvertButton.UseVisualStyleBackColor = true;
this.CancelConvertButton.Click += new System.EventHandler(this.OnCancelConvertButtonClick);
@ -506,10 +557,10 @@
// ProcessConvertButton
//
this.ProcessConvertButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.ProcessConvertButton.Location = new System.Drawing.Point(221, 401);
this.ProcessConvertButton.Location = new System.Drawing.Point(221, 687);
this.ProcessConvertButton.Name = "ProcessConvertButton";
this.ProcessConvertButton.Size = new System.Drawing.Size(116, 28);
this.ProcessConvertButton.TabIndex = 19;
this.ProcessConvertButton.TabIndex = 3;
this.ProcessConvertButton.Text = "Continue";
this.ProcessConvertButton.UseVisualStyleBackColor = true;
this.ProcessConvertButton.Click += new System.EventHandler(this.OnProcessConvertButtonClick);
@ -524,13 +575,68 @@
this.TargetLabel.Text = "Target";
this.TargetLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// MusicGroupBox
//
this.MusicGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.MusicGroupBox.Controls.Add(this.FormatLabel);
this.MusicGroupBox.Controls.Add(this.PreviewTimePicker);
this.MusicGroupBox.Controls.Add(this.MusicFormatDropDown);
this.MusicGroupBox.Controls.Add(this.PreviewOffsetLabel);
this.MusicGroupBox.Location = new System.Drawing.Point(12, 593);
this.MusicGroupBox.Name = "MusicGroupBox";
this.MusicGroupBox.Size = new System.Drawing.Size(447, 76);
this.MusicGroupBox.TabIndex = 22;
this.MusicGroupBox.TabStop = false;
this.MusicGroupBox.Text = "Music Format && Converter";
//
// FormatLabel
//
this.FormatLabel.Location = new System.Drawing.Point(7, 20);
this.FormatLabel.Name = "FormatLabel";
this.FormatLabel.Size = new System.Drawing.Size(110, 20);
this.FormatLabel.TabIndex = 23;
this.FormatLabel.Text = "Format";
this.FormatLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// PreviewTimePicker
//
this.PreviewTimePicker.CustomFormat = "mm:ss";
this.PreviewTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.PreviewTimePicker.Location = new System.Drawing.Point(122, 45);
this.PreviewTimePicker.Name = "PreviewTimePicker";
this.PreviewTimePicker.ShowUpDown = true;
this.PreviewTimePicker.Size = new System.Drawing.Size(315, 20);
this.PreviewTimePicker.TabIndex = 23;
this.PreviewTimePicker.ValueChanged += new System.EventHandler(this.OnPreviewTimePickerValueChanged);
//
// MusicFormatDropDown
//
this.MusicFormatDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.MusicFormatDropDown.FormattingEnabled = true;
this.MusicFormatDropDown.Items.AddRange(new object[] { "Legacy Format (.2dx)" });
this.MusicFormatDropDown.Location = new System.Drawing.Point(122, 19);
this.MusicFormatDropDown.Name = "MusicFormatDropDown";
this.MusicFormatDropDown.Size = new System.Drawing.Size(316, 21);
this.MusicFormatDropDown.TabIndex = 0;
this.MusicFormatDropDown.SelectedIndexChanged += new System.EventHandler(this.OnMusicFormatDropDownSelectedIndexChanged);
//
// PreviewOffsetLabel
//
this.PreviewOffsetLabel.Location = new System.Drawing.Point(7, 45);
this.PreviewOffsetLabel.Name = "PreviewOffsetLabel";
this.PreviewOffsetLabel.Size = new System.Drawing.Size(110, 20);
this.PreviewOffsetLabel.TabIndex = 8;
this.PreviewOffsetLabel.Text = "Preview TimeStamp";
this.PreviewOffsetLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// ConverterForm
//
this.AcceptButton = this.ProcessConvertButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.CancelConvertButton;
this.ClientSize = new System.Drawing.Size(471, 441);
this.ClientSize = new System.Drawing.Size(471, 724);
this.Controls.Add(this.MusicGroupBox);
this.Controls.Add(this.TargetLabel);
this.Controls.Add(this.CancelConvertButton);
this.Controls.Add(this.ProcessConvertButton);
@ -553,11 +659,46 @@
((System.ComponentModel.ISupportInitialize)(this.JacketNovPictureBox)).EndInit();
this.OptionsGroupBox.ResumeLayout(false);
this.OptionsGroupBox.PerformLayout();
this.CameraEffectsGroupBox.ResumeLayout(false);
this.TracksGroupBox.ResumeLayout(false);
this.TracksGroupBox.PerformLayout();
this.SoundEffectGroupBox.ResumeLayout(false);
this.MusicGroupBox.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.Label FormatLabel;
private System.Windows.Forms.CheckBox TrackFXLCheckBox;
private System.Windows.Forms.CheckBox TrackFXRCheckBox;
private System.Windows.Forms.DateTimePicker PreviewTimePicker;
private System.Windows.Forms.Label PreviewOffsetLabel;
private System.Windows.Forms.CheckBox SoundEffectsCheckBox;
private System.Windows.Forms.CheckedListBox SoundEffectsCheckedListBox;
private System.Windows.Forms.Button SoundMappingButton;
private System.Windows.Forms.GroupBox MusicGroupBox;
private System.Windows.Forms.ComboBox MusicFormatDropDown;
private System.Windows.Forms.CheckBox CameraEffectsCheckBox;
private System.Windows.Forms.Button CameraMappingButton;
private System.Windows.Forms.CheckedListBox CameraEffectsCheckedListBox;
private System.Windows.Forms.CheckBox TrackButtonBCheckBox;
private System.Windows.Forms.CheckBox TrackButtonCCheckBox;
private System.Windows.Forms.CheckBox TrackButtonDCheckBox;
private System.Windows.Forms.CheckBox TrackVolRCheckBox;
private System.Windows.Forms.GroupBox CameraEffectsGroupBox;
private System.Windows.Forms.GroupBox SoundEffectGroupBox;
private System.Windows.Forms.GroupBox TracksGroupBox;
#endregion
private System.Windows.Forms.GroupBox LevelGroupBox;
@ -571,16 +712,11 @@
private System.Windows.Forms.PictureBox JacketNovPictureBox;
private System.Windows.Forms.TextBox PathTextBox;
private System.Windows.Forms.GroupBox OptionsGroupBox;
private System.Windows.Forms.CheckBox LongFxCheckBox;
private System.Windows.Forms.CheckBox ChipFxCheckBox;
private System.Windows.Forms.Label MusicCodeLabel;
private System.Windows.Forms.Label MeasureLabel;
private System.Windows.Forms.TextBox AsciiTextBox;
private System.Windows.Forms.CheckBox CameraCheckBox;
private System.Windows.Forms.CheckBox TrackButtonCheckBox;
private System.Windows.Forms.CheckBox TrackLaserCheckBox;
private System.Windows.Forms.Label TrackLabel;
private System.Windows.Forms.Label EffectsLabel;
private System.Windows.Forms.CheckBox TrackButtonACheckBox;
private System.Windows.Forms.CheckBox TrackVolLCheckBox;
private System.Windows.Forms.Label InfVerLabel;
private System.Windows.Forms.CheckBox AsciiAutoCheckBox;
private System.Windows.Forms.Button CancelConvertButton;
@ -591,6 +727,5 @@
private System.Windows.Forms.ComboBox InfVerDropDown;
private System.Windows.Forms.ComboBox VersionDropDown;
private System.Windows.Forms.Label TargetLabel;
private System.Windows.Forms.CheckBox SlamImpactCheckBox;
}
}

View File

@ -1,13 +1,12 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.WindowsAPICodePack.Dialogs;
namespace VoxCharger
{
@ -21,14 +20,98 @@ namespace VoxCharger
public partial class ConverterForm : Form
{
private readonly Image DummyJacket = VoxCharger.Properties.Resources.jk_dummy_s;
public static string LastBackground { get; private set; } = "63";
private enum SoundFxType
{
Chip,
Long,
Laser
}
private string target;
private string defaultAscii;
private ConvertMode mode;
private Dictionary<Difficulty, ChartInfo> charts = new Dictionary<Difficulty, ChartInfo>();
private Ksh.Exporter exporter;
private class CameraEffectOption
{
public Camera.WorkType Work { get; set; }
public bool SlamImpact { get; set; } = false;
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
private class SoundFxOption
{
public SoundFxType Type { get; set; }
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
private static readonly Image DummyJacket = VoxCharger.Properties.Resources.jk_dummy_s;
public static string LastBackground { get; private set; } = "88";
private readonly CameraEffectOption[] _cameraOptions =
{
new CameraEffectOption
{
Work = Camera.WorkType.Realize,
Name = "Realize"
},
new CameraEffectOption
{
Work = Camera.WorkType.Rotation,
Name = "CAM_RotX"
},
new CameraEffectOption
{
Work = Camera.WorkType.Radian,
Name = "CAM_Radian"
},
new CameraEffectOption
{
Work = Camera.WorkType.Tilt,
Name = "Tilt / Tilt Mode"
},
new CameraEffectOption
{
Work = Camera.WorkType.LaneClear,
Name = "LaneY"
},
new CameraEffectOption
{
SlamImpact = true,
Name = "Slam Impact"
},
};
private readonly SoundFxOption[] _sfxOptions =
{
new SoundFxOption
{
Type = SoundFxType.Chip,
Name = "Chip"
},
new SoundFxOption
{
Type = SoundFxType.Long,
Name = "Long"
},
new SoundFxOption
{
Type = SoundFxType.Laser,
Name = "Laser"
}
};
private string _target;
private string _defaultAscii;
private ConvertMode _mode;
private Dictionary<Difficulty, ChartInfo> _charts = new Dictionary<Difficulty, ChartInfo>();
private Ksh.Exporter _exporter;
private bool _updatingAllEffects = false;
public VoxHeader Result { get; private set; } = null;
public VoxHeader[] ResultSet { get; private set; } = new VoxHeader[0];
@ -40,89 +123,102 @@ namespace VoxCharger
{
InitializeComponent();
target = path;
mode = convert;
_target = path;
_mode = convert;
foreach (var camOpt in _cameraOptions)
CameraEffectsCheckedListBox.Items.Add(camOpt, camOpt.Work == Camera.WorkType.Realize ? CheckState.Indeterminate : CheckState.Checked);
foreach (var sfxOpt in _sfxOptions)
SoundEffectsCheckedListBox.Items.Add(sfxOpt, true);
// Cancerous code to adjust layout depending what this form going to be
if (mode == ConvertMode.Converter)
if (_mode == ConvertMode.Converter)
{
MusicCodeLabel.Visible = false;
InfVerLabel.Visible = false;
BackgroundLabel.Visible = false;
BackgroundDropDown.Enabled = BackgroundDropDown.Visible = false;
MusicGroupBox.Enabled = MusicGroupBox.Visible = false;
LevelGroupBox.Enabled = LevelGroupBox.Visible = false;
AsciiTextBox.Enabled = AsciiTextBox.Visible = false;
AsciiAutoCheckBox.Enabled = AsciiAutoCheckBox.Visible = false;
VersionDropDown.Enabled = VersionDropDown.Visible = false;
InfVerDropDown.Enabled = InfVerDropDown.Visible = false;
BackgroundDropDown.Enabled = BackgroundDropDown.Visible = false;
int componentHeight = AsciiTextBox.Height + VersionDropDown.Height + BackgroundDropDown.Height;
OptionsGroupBox.Location = LevelGroupBox.Location;
OptionsGroupBox.Height -= componentHeight;
Height -= LevelGroupBox.Height + componentHeight;
Height -= LevelGroupBox.Height + componentHeight + MusicGroupBox.Height;
Text = "Convert Music";
ProcessConvertButton.Text = "Convert";
PathTextBox.Text = target;
PathTextBox.Text = _target;
return;
}
else if (mode == ConvertMode.BulkImporter)
else if (_mode == ConvertMode.BulkImporter)
{
MusicCodeLabel.Visible = false;
LevelGroupBox.Enabled = LevelGroupBox.Visible = false;
AsciiTextBox.Enabled = AsciiTextBox.Visible = false;
AsciiAutoCheckBox.Enabled = AsciiAutoCheckBox.Visible = false;
MusicGroupBox.Enabled = MusicGroupBox.Visible = false;
int componentHeight = AsciiTextBox.Height;
OptionsGroupBox.Location = LevelGroupBox.Location;
OptionsGroupBox.Height -= componentHeight;
Height -= LevelGroupBox.Height + componentHeight;
Height -= LevelGroupBox.Height + MusicGroupBox.Height + componentHeight;
}
PathTextBox.Text = target;
MusicGroupBox.Anchor = AnchorStyles.Top | AnchorStyles.Left;
PreviewTimePicker.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0);
MusicFormatDropDown.SelectedIndex = 0;
MusicFormatDropDown.Enabled = false;
PathTextBox.Text = _target;
BackgroundDropDown.SelectedItem = LastBackground;
VersionDropDown.SelectedIndex = 4;
VersionDropDown.SelectedIndex = 5;
InfVerDropDown.SelectedIndex = 0;
ProcessConvertButton.Text = "Add";
}
private void OnConverterFormLoad(object sender, EventArgs e)
{
if (mode != ConvertMode.Importer)
if (_mode != ConvertMode.Importer)
return;
try
{
var main = new Ksh();
main.Parse(target);
main.Parse(_target);
Result = main.ToHeader();
Result.ID = AssetManager.GetNextMusicID();
Result.Ascii = defaultAscii = AsciiTextBox.Text = Path.GetFileName(Path.GetDirectoryName(target));
exporter = new Ksh.Exporter(main);
Result.Id = AssetManager.GetNextMusicId();
Result.Ascii = _defaultAscii = AsciiTextBox.Text = Path.GetFileName(Path.GetDirectoryName(_target));
_exporter = new Ksh.Exporter(main);
for (int i = 1; Directory.Exists(AssetManager.GetMusicPath(Result)); i++)
{
if (i >= 100)
break; // seriously? stupid input get stupid output
Result.Ascii = $"{defaultAscii}{i:D2}";
Result.Ascii = $"{_defaultAscii}{i:D2}";
}
defaultAscii = AsciiTextBox.Text = Result.Ascii;
charts[main.Difficulty] = new ChartInfo(main, main.ToLevelHeader(), target);
LoadJacket(charts[main.Difficulty]);
_defaultAscii = AsciiTextBox.Text = Result.Ascii;
_charts[main.Difficulty] = new ChartInfo(main, main.ToLevelHeader(), _target);
LoadJacket(_charts[main.Difficulty]);
// Try to locate another difficulty
foreach (var lv in Ksh.Exporter.GetCharts(Path.GetDirectoryName(target), main.Title))
foreach (var lv in Ksh.Exporter.GetCharts(Path.GetDirectoryName(_target), main.Title))
{
// Don't replace main file, there might 2 files with similar meta or another stupid cases
if (lv.Key != main.Difficulty)
charts[lv.Key] = lv.Value;
_charts[lv.Key] = lv.Value;
}
UpdateUI();
UpdateLevels();
}
catch (Exception ex)
{
@ -142,7 +238,7 @@ namespace VoxCharger
{
AsciiTextBox.ReadOnly = AsciiAutoCheckBox.Checked;
if (AsciiTextBox.ReadOnly)
AsciiTextBox.Text = defaultAscii;
AsciiTextBox.Text = _defaultAscii;
}
private void OnBackgroundDropDownSelectedIndexChanged(object sender, EventArgs e)
@ -152,7 +248,7 @@ namespace VoxCharger
private void OnInfVerDropDownSelectedIndexChanged(object sender, EventArgs e)
{
if (!charts.ContainsKey(Difficulty.Infinite))
if (!_charts.ContainsKey(Difficulty.Infinite))
InfEditButton.Text = "--";
else
InfEditButton.Text = InfVerDropDown.SelectedItem.ToString();
@ -178,8 +274,8 @@ namespace VoxCharger
chart.Parse(browser.FileName);
chart.Difficulty = diff; // make sure to replace diff
charts[diff] = new ChartInfo(chart, chart.ToLevelHeader(), browser.FileName);
UpdateUI();
_charts[diff] = new ChartInfo(chart, chart.ToLevelHeader(), browser.FileName);
UpdateLevels();
}
catch (Exception ex)
{
@ -193,6 +289,108 @@ namespace VoxCharger
}
}
private void OnSoundEffectsCheckBoxCheckedChanged(object sender, EventArgs e)
{
if (SoundEffectsCheckBox.CheckState == CheckState.Indeterminate)
return;
_updatingAllEffects = true;
for (int i = 0; i < SoundEffectsCheckedListBox.Items.Count; i++)
{
if (SoundEffectsCheckedListBox.GetItemCheckState(i) == CheckState.Indeterminate)
continue;
SoundEffectsCheckedListBox.SetItemChecked(i, SoundEffectsCheckBox.Checked);
}
_updatingAllEffects = false;
}
private void OnCameraEffectsCheckBoxCheckedChanged(object sender, EventArgs e)
{
if (CameraEffectsCheckBox.CheckState == CheckState.Indeterminate)
return;
_updatingAllEffects = true;
for (int i = 0; i < CameraEffectsCheckedListBox.Items.Count; i++)
{
if (CameraEffectsCheckedListBox.GetItemCheckState(i) == CheckState.Indeterminate)
continue;
CameraEffectsCheckedListBox.SetItemChecked(i, CameraEffectsCheckBox.Checked);
}
_updatingAllEffects = false;
}
private void OnSoundEffectsCheckedListBoxItemCheck(object sender, ItemCheckEventArgs e)
{
if (_updatingAllEffects || e.CurrentValue == CheckState.Indeterminate)
return;
bool value = e.NewValue == CheckState.Checked || e.NewValue == CheckState.Indeterminate;
for (int i = 0; i < SoundEffectsCheckedListBox.Items.Count; i++)
{
if (i != e.Index && SoundEffectsCheckedListBox.GetItemChecked(i) != value)
{
SoundEffectsCheckBox.CheckState = CheckState.Indeterminate;
return;
}
}
SoundEffectsCheckBox.CheckState = value ? CheckState.Checked : CheckState.Unchecked;
}
private void OnCameraEffectsCheckedListBoxItemCheck(object sender, ItemCheckEventArgs e)
{
if (_updatingAllEffects || e.CurrentValue == CheckState.Indeterminate)
{
if (e.CurrentValue == CheckState.Indeterminate)
e.NewValue = CheckState.Indeterminate;
return;
}
bool value = e.NewValue == CheckState.Checked || e.NewValue == CheckState.Indeterminate;
for (int i = 0; i < CameraEffectsCheckedListBox.Items.Count; i++)
{
if (i != e.Index && CameraEffectsCheckedListBox.GetItemChecked(i) != value)
{
CameraEffectsCheckBox.CheckState = CheckState.Indeterminate;
return;
}
}
CameraEffectsCheckBox.CheckState = value ? CheckState.Checked : CheckState.Unchecked;
}
private void OnMappingButtonClick(object sender, EventArgs e)
{
MessageBox.Show("Custom mapping for Sound & Camera Effects is not supported (yet).",
"Coming Soon™", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void OnMusicFormatDropDownSelectedIndexChanged(object sender, EventArgs e)
{
// Not Implemented
}
private void OnBrowseMainToolButtonClick(object sender, EventArgs e)
{
}
private void OnBrowseSecondaryToolButtonClick(object sender, EventArgs e)
{
using (var browser = new OpenFileDialog())
{
browser.Filter = $"{PreviewOffsetLabel.Text.Replace(".exe", string.Empty)} | {PreviewOffsetLabel.Text}";
browser.CheckFileExists = true;
browser.Title = "Browse Converter";
}
}
private void OnHelpButtonClicked(object sender, CancelEventArgs e)
{
e.Cancel = true;
@ -208,19 +406,54 @@ namespace VoxCharger
private void OnProcessConvertButtonClick(object sender, EventArgs e)
{
Options = new Ksh.ParseOption()
bool slamImpact = true;
var cameraOpts = new Dictionary<Camera.WorkType, bool>();
for (int i = 0; i < CameraEffectsCheckedListBox.Items.Count; i++)
{
if (!(CameraEffectsCheckedListBox.Items[i] is CameraEffectOption opt))
continue;
if (opt.SlamImpact)
slamImpact = CameraEffectsCheckedListBox.GetItemChecked(i);
else
cameraOpts[opt.Work] = CameraEffectsCheckedListBox.GetItemChecked(i);
}
Options = new Ksh.ParseOption
{
RealignOffset = RealignOffsetCheckBox.Checked,
EnableChipFx = ChipFxCheckBox.Checked,
EnableLongFx = LongFxCheckBox.Checked,
EnableCamera = CameraCheckBox.Checked,
EnableSlamImpact = SlamImpactCheckBox.Checked,
EnableLaserTrack = TrackLaserCheckBox.Checked,
EnableButtonTrack = TrackButtonCheckBox.Checked
Camera = new Ksh.ParseOption.CameraOptions
{
SlamImpact = slamImpact,
EnabledWorks = cameraOpts
},
SoundFx = new Ksh.ParseOption.SoundFxOptions
{
Chip = SoundEffectsCheckedListBox.GetItemChecked(0),
Long = SoundEffectsCheckedListBox.GetItemChecked(1),
Laser = SoundEffectsCheckedListBox.GetItemChecked(2),
},
Track = new Ksh.ParseOption.TrackOptions
{
EnabledLaserTracks = new Dictionary<Event.LaserTrack, bool>
{
{ Event.LaserTrack.Left, TrackVolLCheckBox.Checked },
{ Event.LaserTrack.Right, TrackVolRCheckBox.Checked }
},
EnabledButtonTracks = new Dictionary<Event.ButtonTrack, bool>
{
{ Event.ButtonTrack.A, TrackButtonACheckBox.Checked },
{ Event.ButtonTrack.B, TrackButtonBCheckBox.Checked },
{ Event.ButtonTrack.C, TrackButtonCCheckBox.Checked },
{ Event.ButtonTrack.D, TrackButtonDCheckBox.Checked },
{ Event.ButtonTrack.FxL, TrackFXLCheckBox.Checked },
{ Event.ButtonTrack.FxR, TrackFXRCheckBox.Checked }
}
}
};
// Act as converter
switch (mode)
switch (_mode)
{
case ConvertMode.Converter: SingleConvert(); break;
case ConvertMode.BulkConverter: BulkConvert(); break;
@ -231,17 +464,18 @@ namespace VoxCharger
private void SingleImport()
{
try
{
// Assign metadata
Result.Ascii = AsciiTextBox.Text;
Result.BackgroundId = short.Parse((BackgroundDropDown.SelectedItem ?? "0").ToString().Split(' ')[0]);
Result.Version = (GameVersion)(VersionDropDown.SelectedIndex + 1);
Result.InfVersion = InfVerDropDown.SelectedIndex == 0 ? InfiniteVersion.MXM : (InfiniteVersion)(InfVerDropDown.SelectedIndex + 1);
Result.InfVersion = InfVerDropDown.SelectedIndex == 0 ? InfiniteVersion.Mxm : (InfiniteVersion)(InfVerDropDown.SelectedIndex + 1);
Result.GenreId = 16;
Result.Levels = new Dictionary<Difficulty, VoxLevelHeader>();
if (Result.BpmMin != Result.BpmMax && exporter.Source.MusicOffset % 48 != 0 && Options.RealignOffset)
if (Result.BpmMin != Result.BpmMax && _exporter.Source.MusicOffset % 48 != 0 && Options.RealignOffset)
{
// You've been warned!
var prompt = MessageBox.Show(
@ -259,7 +493,7 @@ namespace VoxCharger
if (Directory.Exists(AssetManager.GetMusicPath(Result)) || AssetManager.Headers.Any(h => h.Ascii == Result.Ascii))
{
MessageBox.Show(
$"Music Code {Result.CodeName} is already taken.",
$"Music Code {Result.CodeName} is already taken.\nTry configure \"Music Code\" manually.",
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
@ -268,8 +502,14 @@ namespace VoxCharger
return;
}
exporter.Export(Result, charts, Options);
Action = exporter.Action;
var importOptions = new AudioImportOptions
{
Format = AudioFormat.Iidx,
PreviewOffset = PreviewTimePicker.Value.Minute * 60 + PreviewTimePicker.Value.Second
};
_exporter.Export(Result, _charts, Options, importOptions);
Action = _exporter.Action;
DialogResult = DialogResult.OK;
Close();
@ -284,14 +524,14 @@ namespace VoxCharger
);
// Eliminate non-existent files
foreach (var chart in charts.Values.ToArray())
foreach (var chart in _charts.Values.ToArray())
{
if (!File.Exists(chart.FileName))
charts.Remove(chart.Header.Difficulty);
_charts.Remove(chart.Header.Difficulty);
}
// Reload jacket
UpdateUI();
UpdateLevels();
}
}
@ -302,14 +542,14 @@ namespace VoxCharger
var errors = new List<string>();
using (var loader = new LoadingForm())
{
var action = new Action(() =>
loader.SetAction(dialog =>
{
var directories = Directory.GetDirectories(target);
var directories = Directory.GetDirectories(_target);
int current = 0;
foreach (string dir in directories)
{
loader.SetStatus($"Processing {Path.GetFileName(dir)}..");
loader.SetProgress((current + 1 / (float)directories.Length) * 100f);
dialog.SetStatus($"Processing {Path.GetFileName(dir)}..");
dialog.SetProgress((current + 1 / (float)directories.Length) * 100f);
var files = Directory.GetFiles(dir, "*.ksh");
if (files.Length == 0)
@ -323,10 +563,10 @@ namespace VoxCharger
ksh.Parse(fn, Options);
var header = ksh.ToHeader();
header.ID = AssetManager.GetNextMusicID() + current++;
header.Id = AssetManager.GetNextMusicId() + current++;
header.BackgroundId = short.Parse((BackgroundDropDown.SelectedItem ?? "0").ToString().Split(' ')[0]);
header.Version = (GameVersion)(VersionDropDown.SelectedIndex + 1);
header.InfVersion = InfVerDropDown.SelectedIndex == 0 ? InfiniteVersion.MXM : (InfiniteVersion)(InfVerDropDown.SelectedIndex + 1);
header.InfVersion = InfVerDropDown.SelectedIndex == 0 ? InfiniteVersion.Mxm : (InfiniteVersion)(InfVerDropDown.SelectedIndex + 1);
header.GenreId = 16;
header.Levels = new Dictionary<Difficulty, VoxLevelHeader>();
@ -352,15 +592,12 @@ namespace VoxCharger
string err = $"Failed attempt to convert ksh file: {Path.GetFileName(fn)} ({ex.Message})";
errors.Add(err);
Debug.WriteLine(err);
continue;
}
}
loader.Complete();
dialog.Complete();
});
loader.SetAction(action);
loader.ShowDialog();
}
@ -397,7 +634,7 @@ namespace VoxCharger
return;
var ksh = new Ksh();
ksh.Parse(target, Options);
ksh.Parse(_target, Options);
var vox = new VoxChart();
vox.Import(ksh);
@ -428,29 +665,32 @@ namespace VoxCharger
private void BulkConvert()
{
var errors = new List<string>();
using (var browser = new FolderBrowserDialog())
using (var browser = new CommonOpenFileDialog())
{
browser.Description = "Select output directory";
if (browser.ShowDialog() != DialogResult.OK)
browser.IsFolderPicker = true;
browser.Multiselect = false;
if (browser.ShowDialog() != CommonFileDialogResult.Ok)
return;
string outputDir = browser.FileName;
using (var loader = new LoadingForm())
{
var action = new Action(() =>
loader.SetAction(dialog =>
{
var directories = Directory.GetDirectories(target);
var directories = Directory.GetDirectories(_target);
int progress = 0;
foreach (string dir in directories)
{
loader.SetStatus($"Processing {Path.GetFileName(dir)}..");
loader.SetProgress((progress++ / (float)directories.Length) * 100f);
dialog.SetStatus($"Processing {Path.GetFileName(dir)}..");
dialog.SetProgress((progress++ / (float)directories.Length) * 100f);
foreach (var fn in Directory.GetFiles(dir, "*.ksh"))
{
try
{
// Determine output path
string path = Path.Combine(
$"{browser.SelectedPath}",
$"{outputDir}",
$"{Path.GetFileName(dir)}\\"
);
@ -471,16 +711,13 @@ namespace VoxCharger
string err = $"Failed attempt to convert ksh file: {Path.GetFileName(fn)} ({ex.Message})";
errors.Add(err);
Debug.WriteLine(err);
continue;
}
}
}
loader.Complete();
dialog.Complete();
});
loader.SetAction(action);
loader.ShowDialog();
}
}
@ -532,7 +769,7 @@ namespace VoxCharger
if (pictureBox == null)
return;
string filename = Path.Combine(Path.GetDirectoryName(info.FileName), chart.JacketFileName);
string filename = Path.Combine(Path.GetDirectoryName(info.FileName) ?? "", chart.JacketFileName);
if (!File.Exists(filename))
{
pictureBox.Image = DummyJacket;
@ -551,7 +788,7 @@ namespace VoxCharger
}
}
private void UpdateUI()
private void UpdateLevels()
{
var buttons = new List<Button>();
foreach (var control in LevelGroupBox.Controls)
@ -573,9 +810,9 @@ namespace VoxCharger
}
}
if (!charts.ContainsKey(diff) || charts[diff] == null)
if (!_charts.ContainsKey(diff) || _charts[diff] == null)
{
charts.Remove(diff); // should be UpdateUiButAlterMapCharts, ya whatever
_charts.Remove(diff);
if (button != null)
button.Text = "--";
@ -603,9 +840,20 @@ namespace VoxCharger
}
}
LoadJacket(charts[diff]);
LoadJacket(_charts[diff]);
}
}
}
private void OnPreviewTimePickerValueChanged(object sender, EventArgs e)
{
if (PreviewTimePicker.Value.Minute == 59)
PreviewTimePicker.Value = PreviewTimePicker.Value.AddMinutes(1);
else if (PreviewTimePicker.Value.Minute >= 11)
PreviewTimePicker.Value = PreviewTimePicker.Value.AddMinutes(-1);
if (PreviewTimePicker.Value.Minute == 10)
PreviewTimePicker.Value = PreviewTimePicker.Value.AddSeconds(-PreviewTimePicker.Value.Second);
}
}
}

View File

@ -28,9 +28,12 @@
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HelpForm));
this.panel1 = new System.Windows.Forms.Panel();
this.OkButton = new System.Windows.Forms.Button();
this.panel2 = new System.Windows.Forms.Panel();
this.label13 = new System.Windows.Forms.Label();
this.label14 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.label12 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
@ -49,28 +52,30 @@
//
// panel1
//
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel1.Controls.Add(this.OkButton);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 322);
this.panel1.Location = new System.Drawing.Point(0, 424);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(603, 40);
this.panel1.Size = new System.Drawing.Size(631, 40);
this.panel1.TabIndex = 0;
//
// OkButton
//
this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Right)));
this.OkButton.Location = new System.Drawing.Point(516, 8);
this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Right)));
this.OkButton.Location = new System.Drawing.Point(515, 8);
this.OkButton.Name = "OkButton";
this.OkButton.Size = new System.Drawing.Size(75, 22);
this.OkButton.Size = new System.Drawing.Size(102, 20);
this.OkButton.TabIndex = 0;
this.OkButton.Text = "OK";
this.OkButton.Text = "Got it!";
this.OkButton.UseVisualStyleBackColor = true;
this.OkButton.Click += new System.EventHandler(this.OnOkButtonClick);
//
// panel2
//
this.panel2.BackColor = System.Drawing.Color.White;
this.panel2.BackColor = System.Drawing.SystemColors.Control;
this.panel2.Controls.Add(this.label13);
this.panel2.Controls.Add(this.label14);
this.panel2.Controls.Add(this.label11);
this.panel2.Controls.Add(this.label12);
this.panel2.Controls.Add(this.label9);
@ -86,18 +91,38 @@
this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel2.Location = new System.Drawing.Point(0, 0);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(603, 322);
this.panel2.Size = new System.Drawing.Size(631, 424);
this.panel2.TabIndex = 1;
//
// label13
//
this.label13.AutoSize = true;
this.label13.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label13.Location = new System.Drawing.Point(15, 340);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(487, 65);
this.label13.TabIndex = 13;
this.label13.Text = resources.GetString("label13.Text");
//
// label14
//
this.label14.AutoSize = true;
this.label14.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
this.label14.Location = new System.Drawing.Point(10, 323);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(146, 15);
this.label14.TabIndex = 12;
this.label14.Text = "Music Format && Converter";
//
// label11
//
this.label11.AutoSize = true;
this.label11.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label11.Location = new System.Drawing.Point(15, 109);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(185, 13);
this.label11.Size = new System.Drawing.Size(188, 13);
this.label11.TabIndex = 11;
this.label11.Text = "ID of gameplay background theme";
this.label11.Text = "ID of gameplay background theme.\r\n";
//
// label12
//
@ -113,18 +138,17 @@
//
this.label9.AutoSize = true;
this.label9.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label9.Location = new System.Drawing.Point(15, 253);
this.label9.Location = new System.Drawing.Point(15, 266);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(302, 52);
this.label9.Size = new System.Drawing.Size(353, 52);
this.label9.TabIndex = 9;
this.label9.Text = "Only include selected tracks to the output\r\nFor example, laser can be disabled by" +
" deselect \"Laser\" box\r\n\r\nUseful for experimental or debugging purpose.";
this.label9.Text = "Only include selected tracks to the output\r\nFor example, laser can be disabled by" + " deselect \"Vol-L\" or \"Vol-R\" box\r\n\r\nUseful for experimental or debugging purpose" + ".";
//
// label10
//
this.label10.AutoSize = true;
this.label10.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
this.label10.Location = new System.Drawing.Point(10, 236);
this.label10.Location = new System.Drawing.Point(10, 249);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(40, 15);
this.label10.TabIndex = 8;
@ -136,11 +160,9 @@
this.label7.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label7.Location = new System.Drawing.Point(15, 192);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(531, 39);
this.label7.Size = new System.Drawing.Size(594, 52);
this.label7.TabIndex = 7;
this.label7.Text = "Attempt to convert selected events into Vox format.\r\nAll of these effects are map" +
"ped, there\'s chance some effects to misaligned and even cease to function.\r\nNote" +
" that user defined Fx\'s are excluded";
this.label7.Text = resources.GetString("label7.Text");
//
// label8
//
@ -148,9 +170,9 @@
this.label8.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
this.label8.Location = new System.Drawing.Point(10, 175);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(42, 15);
this.label8.Size = new System.Drawing.Size(135, 15);
this.label8.TabIndex = 6;
this.label8.Text = "Effects";
this.label8.Text = "Camera && Sound Effects";
//
// label5
//
@ -160,9 +182,7 @@
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(530, 26);
this.label5.TabIndex = 5;
this.label5.Text = "Trim or add additional measures to the beginning of chart. Useful when Ksh rely o" +
"n start music offset.\r\nHowever, chart can be broken when signature / bpm change " +
"occurs";
this.label5.Text = "Trim or add additional measures to the beginning of chart. Useful when Ksh rely o" + "n start music offset.\r\nHowever, chart can be broken when signature / bpm change " + "occurs.\r\n";
//
// label6
//
@ -180,9 +200,9 @@
this.label3.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label3.Location = new System.Drawing.Point(15, 74);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(365, 13);
this.label3.Size = new System.Drawing.Size(368, 13);
this.label3.TabIndex = 3;
this.label3.Text = "Assigned game version and 4th Difficulty that will appear in the game";
this.label3.Text = "Assigned game version and 4th Difficulty that will appear in the game.\r\n";
//
// label4
//
@ -200,10 +220,9 @@
this.label2.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label2.Location = new System.Drawing.Point(17, 26);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(488, 26);
this.label2.Size = new System.Drawing.Size(491, 26);
this.label2.TabIndex = 1;
this.label2.Text = "Music identifier that contains only valid ascii.\r\nThis will determine asset file " +
"location (data_mods\\\\<mix>\\\\music\\\\<music_id>_<music_code>)";
this.label2.Text = "Music identifier that contains only valid ascii (the field also known as \"ascii\")" + ".\r\nThis will determine asset file location (data_mods\\\\<mix>\\\\music\\\\<music_id>_" + "<music_code>).";
//
// label1
//
@ -219,7 +238,7 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(603, 362);
this.ClientSize = new System.Drawing.Size(631, 464);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
@ -227,14 +246,16 @@
this.MinimizeBox = false;
this.Name = "HelpForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Converter";
this.Text = "Help";
this.panel1.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
this.ResumeLayout(false);
}
private System.Windows.Forms.Label label13;
private System.Windows.Forms.Label label14;
#endregion
private System.Windows.Forms.Panel panel1;

View File

@ -1,11 +1,4 @@
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;
namespace VoxCharger

View File

@ -117,4 +117,19 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label13.Text" xml:space="preserve">
<value>Select which music file format to use.
- Sound Voltex (.s3v): Support "Preview Timestamp" with reliable encoder (Recommended)
- Beatmania IIDX (.2dx): Legacy music format (Compatibility for Vivid Wave and older versions)
You can select the path of the converter programs by clicking "..." button.
</value>
</data>
<data name="label7.Text" xml:space="preserve">
<value>Attempt to convert selected Sound Fx's and Camera movements into Vox format.
All of these effects are mapped, there's chance that the produced effects are misaligned or even cease to function.
Note that user defined and advanced Fx's are excluded.
</value>
</data>
</root>

View File

@ -1,11 +1,5 @@
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;
namespace VoxCharger

View File

@ -37,14 +37,35 @@
this.CancelEditButton = new System.Windows.Forms.Button();
this.JacketButton = new System.Windows.Forms.Button();
this.SaveEditButton = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.MetadataGroupBox = new System.Windows.Forms.GroupBox();
this.Preview2DX = new System.Windows.Forms.Button();
this.MainDxButton = new System.Windows.Forms.Button();
this.VoxButton = new System.Windows.Forms.Button();
this.JacketPictureBox = new System.Windows.Forms.PictureBox();
this.RadarGroupBox = new System.Windows.Forms.GroupBox();
this.RadarHandTripLabel = new System.Windows.Forms.Label();
this.HandTripNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.RadarTsumamiLabel = new System.Windows.Forms.Label();
this.TsumamiNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.RadarTrickyLabel = new System.Windows.Forms.Label();
this.TrickyNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.RadarOneHandLabel = new System.Windows.Forms.Label();
this.OneHandNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.RadarPeakLabel = new System.Windows.Forms.Label();
this.PeakNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.RadarNotesLabel = new System.Windows.Forms.Label();
this.NotesNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.AddRadarDataButton = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.LevelNumericBox)).BeginInit();
this.groupBox1.SuspendLayout();
this.MetadataGroupBox.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.JacketPictureBox)).BeginInit();
this.RadarGroupBox.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.HandTripNumericUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.TsumamiNumericUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.TrickyNumericUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.OneHandNumericUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PeakNumericUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NotesNumericUpDown)).BeginInit();
this.SuspendLayout();
//
// LevelLabel
@ -60,32 +81,22 @@
//
// LevelNumericBox
//
this.LevelNumericBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.LevelNumericBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.LevelNumericBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.LevelNumericBox.Location = new System.Drawing.Point(72, 24);
this.LevelNumericBox.Maximum = new decimal(new int[] {
20,
0,
0,
0});
this.LevelNumericBox.Maximum = new decimal(new int[] { 20, 0, 0, 0 });
this.LevelNumericBox.Name = "LevelNumericBox";
this.LevelNumericBox.Size = new System.Drawing.Size(214, 21);
this.LevelNumericBox.TabIndex = 14;
this.LevelNumericBox.Value = new decimal(new int[] {
1,
0,
0,
0});
this.LevelNumericBox.TabIndex = 0;
this.LevelNumericBox.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// EffectorTextBox
//
this.EffectorTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.EffectorTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.EffectorTextBox.Location = new System.Drawing.Point(72, 51);
this.EffectorTextBox.Name = "EffectorTextBox";
this.EffectorTextBox.Size = new System.Drawing.Size(214, 20);
this.EffectorTextBox.TabIndex = 15;
this.EffectorTextBox.TabIndex = 1;
//
// EffectorLabel
//
@ -111,20 +122,20 @@
//
// IllustratorTextBox
//
this.IllustratorTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.IllustratorTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.IllustratorTextBox.Location = new System.Drawing.Point(72, 77);
this.IllustratorTextBox.Name = "IllustratorTextBox";
this.IllustratorTextBox.Size = new System.Drawing.Size(214, 20);
this.IllustratorTextBox.TabIndex = 17;
this.IllustratorTextBox.TabIndex = 2;
//
// CancelEditButton
//
this.CancelEditButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.CancelEditButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.CancelEditButton.Location = new System.Drawing.Point(343, 180);
this.CancelEditButton.Location = new System.Drawing.Point(343, 411);
this.CancelEditButton.Name = "CancelEditButton";
this.CancelEditButton.Size = new System.Drawing.Size(80, 28);
this.CancelEditButton.TabIndex = 19;
this.CancelEditButton.TabIndex = 4;
this.CancelEditButton.Text = "Cancel";
this.CancelEditButton.UseVisualStyleBackColor = true;
this.CancelEditButton.Click += new System.EventHandler(this.OnCancelEditButtonClick);
@ -135,71 +146,69 @@
this.JacketButton.Name = "JacketButton";
this.JacketButton.Size = new System.Drawing.Size(108, 22);
this.JacketButton.TabIndex = 3;
this.JacketButton.Text = "Jacket File";
this.JacketButton.Text = "Import Jacket";
this.JacketButton.UseVisualStyleBackColor = true;
this.JacketButton.Click += new System.EventHandler(this.OnJacketButtonClick);
//
// SaveEditButton
//
this.SaveEditButton.Location = new System.Drawing.Point(257, 180);
this.SaveEditButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.SaveEditButton.Location = new System.Drawing.Point(257, 411);
this.SaveEditButton.Name = "SaveEditButton";
this.SaveEditButton.Size = new System.Drawing.Size(80, 28);
this.SaveEditButton.TabIndex = 23;
this.SaveEditButton.TabIndex = 3;
this.SaveEditButton.Text = "Save";
this.SaveEditButton.UseVisualStyleBackColor = true;
this.SaveEditButton.Click += new System.EventHandler(this.OnSaveEditButtonClick);
//
// groupBox1
// MetadataGroupBox
//
this.groupBox1.Controls.Add(this.Preview2DX);
this.groupBox1.Controls.Add(this.MainDxButton);
this.groupBox1.Controls.Add(this.VoxButton);
this.groupBox1.Controls.Add(this.IllustratorTextBox);
this.groupBox1.Controls.Add(this.LevelNumericBox);
this.groupBox1.Controls.Add(this.LevelLabel);
this.groupBox1.Controls.Add(this.IllustratorLabel);
this.groupBox1.Controls.Add(this.EffectorTextBox);
this.groupBox1.Controls.Add(this.EffectorLabel);
this.groupBox1.Location = new System.Drawing.Point(126, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(297, 162);
this.groupBox1.TabIndex = 21;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Level Data";
this.MetadataGroupBox.Controls.Add(this.Preview2DX);
this.MetadataGroupBox.Controls.Add(this.MainDxButton);
this.MetadataGroupBox.Controls.Add(this.VoxButton);
this.MetadataGroupBox.Controls.Add(this.IllustratorTextBox);
this.MetadataGroupBox.Controls.Add(this.LevelNumericBox);
this.MetadataGroupBox.Controls.Add(this.LevelLabel);
this.MetadataGroupBox.Controls.Add(this.IllustratorLabel);
this.MetadataGroupBox.Controls.Add(this.EffectorTextBox);
this.MetadataGroupBox.Controls.Add(this.EffectorLabel);
this.MetadataGroupBox.Location = new System.Drawing.Point(126, 12);
this.MetadataGroupBox.Name = "MetadataGroupBox";
this.MetadataGroupBox.Size = new System.Drawing.Size(297, 162);
this.MetadataGroupBox.TabIndex = 0;
this.MetadataGroupBox.TabStop = false;
this.MetadataGroupBox.Text = "Level Data";
//
// Preview2DX
//
this.Preview2DX.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.Preview2DX.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.Preview2DX.Location = new System.Drawing.Point(181, 129);
this.Preview2DX.Name = "Preview2DX";
this.Preview2DX.Size = new System.Drawing.Size(105, 22);
this.Preview2DX.TabIndex = 23;
this.Preview2DX.Text = "2DX Preview";
this.Preview2DX.TabIndex = 5;
this.Preview2DX.Text = "Import Preview";
this.Preview2DX.UseVisualStyleBackColor = true;
this.Preview2DX.Click += new System.EventHandler(this.OnPreview2DXClick);
//
// MainDxButton
//
this.MainDxButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.MainDxButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.MainDxButton.Location = new System.Drawing.Point(72, 129);
this.MainDxButton.Name = "MainDxButton";
this.MainDxButton.Size = new System.Drawing.Size(105, 22);
this.MainDxButton.TabIndex = 22;
this.MainDxButton.Text = "2DX Music";
this.MainDxButton.TabIndex = 4;
this.MainDxButton.Text = "Import Music";
this.MainDxButton.UseVisualStyleBackColor = true;
this.MainDxButton.Click += new System.EventHandler(this.OnMainDxButtonClick);
//
// VoxButton
//
this.VoxButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.VoxButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.VoxButton.Location = new System.Drawing.Point(72, 101);
this.VoxButton.Name = "VoxButton";
this.VoxButton.Size = new System.Drawing.Size(214, 22);
this.VoxButton.TabIndex = 21;
this.VoxButton.Text = "Vox / Ksh File";
this.VoxButton.TabIndex = 3;
this.VoxButton.Text = "Import Chart Data";
this.VoxButton.UseVisualStyleBackColor = true;
this.VoxButton.Click += new System.EventHandler(this.OnVoxButtonClick);
//
@ -214,33 +223,199 @@
this.JacketPictureBox.TabStop = false;
this.JacketPictureBox.Click += new System.EventHandler(this.OnJacketPictureBoxClick);
//
// RadarGroupBox
//
this.RadarGroupBox.Controls.Add(this.RadarHandTripLabel);
this.RadarGroupBox.Controls.Add(this.HandTripNumericUpDown);
this.RadarGroupBox.Controls.Add(this.RadarTsumamiLabel);
this.RadarGroupBox.Controls.Add(this.TsumamiNumericUpDown);
this.RadarGroupBox.Controls.Add(this.RadarTrickyLabel);
this.RadarGroupBox.Controls.Add(this.TrickyNumericUpDown);
this.RadarGroupBox.Controls.Add(this.RadarOneHandLabel);
this.RadarGroupBox.Controls.Add(this.OneHandNumericUpDown);
this.RadarGroupBox.Controls.Add(this.RadarPeakLabel);
this.RadarGroupBox.Controls.Add(this.PeakNumericUpDown);
this.RadarGroupBox.Controls.Add(this.RadarNotesLabel);
this.RadarGroupBox.Controls.Add(this.NotesNumericUpDown);
this.RadarGroupBox.Location = new System.Drawing.Point(12, 180);
this.RadarGroupBox.Name = "RadarGroupBox";
this.RadarGroupBox.Size = new System.Drawing.Size(411, 225);
this.RadarGroupBox.TabIndex = 2;
this.RadarGroupBox.TabStop = false;
this.RadarGroupBox.Text = "Radar";
//
// RadarHandTripLabel
//
this.RadarHandTripLabel.AutoSize = true;
this.RadarHandTripLabel.Location = new System.Drawing.Point(101, 111);
this.RadarHandTripLabel.Name = "RadarHandTripLabel";
this.RadarHandTripLabel.Size = new System.Drawing.Size(33, 26);
this.RadarHandTripLabel.TabIndex = 35;
this.RadarHandTripLabel.Text = "Hand\r\nTrip";
this.RadarHandTripLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// HandTripNumericUpDown
//
this.HandTripNumericUpDown.Location = new System.Drawing.Point(85, 141);
this.HandTripNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 });
this.HandTripNumericUpDown.Name = "HandTripNumericUpDown";
this.HandTripNumericUpDown.Size = new System.Drawing.Size(70, 20);
this.HandTripNumericUpDown.TabIndex = 29;
//
// RadarTsumamiLabel
//
this.RadarTsumamiLabel.AutoSize = true;
this.RadarTsumamiLabel.Location = new System.Drawing.Point(264, 111);
this.RadarTsumamiLabel.Name = "RadarTsumamiLabel";
this.RadarTsumamiLabel.Size = new System.Drawing.Size(49, 26);
this.RadarTsumamiLabel.TabIndex = 34;
this.RadarTsumamiLabel.Text = "Tsumami\r\n(Laser)";
this.RadarTsumamiLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// TsumamiNumericUpDown
//
this.TsumamiNumericUpDown.Location = new System.Drawing.Point(256, 141);
this.TsumamiNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 });
this.TsumamiNumericUpDown.Name = "TsumamiNumericUpDown";
this.TsumamiNumericUpDown.Size = new System.Drawing.Size(70, 20);
this.TsumamiNumericUpDown.TabIndex = 30;
//
// RadarTrickyLabel
//
this.RadarTrickyLabel.AutoSize = true;
this.RadarTrickyLabel.Location = new System.Drawing.Point(185, 171);
this.RadarTrickyLabel.Name = "RadarTrickyLabel";
this.RadarTrickyLabel.Size = new System.Drawing.Size(36, 13);
this.RadarTrickyLabel.TabIndex = 33;
this.RadarTrickyLabel.Text = "Tricky";
this.RadarTrickyLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// TrickyNumericUpDown
//
this.TrickyNumericUpDown.Location = new System.Drawing.Point(170, 187);
this.TrickyNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 });
this.TrickyNumericUpDown.Name = "TrickyNumericUpDown";
this.TrickyNumericUpDown.Size = new System.Drawing.Size(70, 20);
this.TrickyNumericUpDown.TabIndex = 31;
//
// RadarOneHandLabel
//
this.RadarOneHandLabel.AutoSize = true;
this.RadarOneHandLabel.Location = new System.Drawing.Point(101, 43);
this.RadarOneHandLabel.Name = "RadarOneHandLabel";
this.RadarOneHandLabel.Size = new System.Drawing.Size(33, 26);
this.RadarOneHandLabel.TabIndex = 32;
this.RadarOneHandLabel.Text = "One\r\nHand";
this.RadarOneHandLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// OneHandNumericUpDown
//
this.OneHandNumericUpDown.Location = new System.Drawing.Point(85, 73);
this.OneHandNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 });
this.OneHandNumericUpDown.Name = "OneHandNumericUpDown";
this.OneHandNumericUpDown.Size = new System.Drawing.Size(70, 20);
this.OneHandNumericUpDown.TabIndex = 25;
//
// RadarPeakLabel
//
this.RadarPeakLabel.AutoSize = true;
this.RadarPeakLabel.Location = new System.Drawing.Point(272, 57);
this.RadarPeakLabel.Name = "RadarPeakLabel";
this.RadarPeakLabel.Size = new System.Drawing.Size(32, 13);
this.RadarPeakLabel.TabIndex = 28;
this.RadarPeakLabel.Text = "Peak";
this.RadarPeakLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// PeakNumericUpDown
//
this.PeakNumericUpDown.Location = new System.Drawing.Point(256, 73);
this.PeakNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 });
this.PeakNumericUpDown.Name = "PeakNumericUpDown";
this.PeakNumericUpDown.Size = new System.Drawing.Size(70, 20);
this.PeakNumericUpDown.TabIndex = 27;
//
// RadarNotesLabel
//
this.RadarNotesLabel.AutoSize = true;
this.RadarNotesLabel.Location = new System.Drawing.Point(185, 14);
this.RadarNotesLabel.Name = "RadarNotesLabel";
this.RadarNotesLabel.Size = new System.Drawing.Size(35, 13);
this.RadarNotesLabel.TabIndex = 26;
this.RadarNotesLabel.Text = "Notes";
this.RadarNotesLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// NotesNumericUpDown
//
this.NotesNumericUpDown.Location = new System.Drawing.Point(170, 30);
this.NotesNumericUpDown.Maximum = new decimal(new int[] { 255, 0, 0, 0 });
this.NotesNumericUpDown.Name = "NotesNumericUpDown";
this.NotesNumericUpDown.Size = new System.Drawing.Size(70, 20);
this.NotesNumericUpDown.TabIndex = 24;
//
// AddRadarDataButton
//
this.AddRadarDataButton.Location = new System.Drawing.Point(12, 180);
this.AddRadarDataButton.Name = "AddRadarDataButton";
this.AddRadarDataButton.Size = new System.Drawing.Size(411, 25);
this.AddRadarDataButton.TabIndex = 1;
this.AddRadarDataButton.Text = "Add Radar Data";
this.AddRadarDataButton.UseVisualStyleBackColor = true;
this.AddRadarDataButton.Click += new System.EventHandler(this.OnAddRadarDataButtonClick);
//
// LevelEditorForm
//
this.AcceptButton = this.SaveEditButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.CancelEditButton;
this.ClientSize = new System.Drawing.Size(435, 220);
this.ClientSize = new System.Drawing.Size(435, 451);
this.Controls.Add(this.SaveEditButton);
this.Controls.Add(this.CancelEditButton);
this.Controls.Add(this.RadarGroupBox);
this.Controls.Add(this.AddRadarDataButton);
this.Controls.Add(this.JacketPictureBox);
this.Controls.Add(this.JacketButton);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.CancelEditButton);
this.Controls.Add(this.MetadataGroupBox);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "LevelEditorForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Level Editor - MXM";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnLevelEditorFormFormClosing);
this.Load += new System.EventHandler(this.OnLevelEditorFormLoad);
((System.ComponentModel.ISupportInitialize)(this.LevelNumericBox)).EndInit();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.MetadataGroupBox.ResumeLayout(false);
this.MetadataGroupBox.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.JacketPictureBox)).EndInit();
this.RadarGroupBox.ResumeLayout(false);
this.RadarGroupBox.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.HandTripNumericUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.TsumamiNumericUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.TrickyNumericUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.OneHandNumericUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.PeakNumericUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.NotesNumericUpDown)).EndInit();
this.ResumeLayout(false);
}
private System.Windows.Forms.Button AddRadarDataButton;
private System.Windows.Forms.Label RadarHandTripLabel;
private System.Windows.Forms.NumericUpDown HandTripNumericUpDown;
private System.Windows.Forms.Label RadarTsumamiLabel;
private System.Windows.Forms.NumericUpDown TsumamiNumericUpDown;
private System.Windows.Forms.Label RadarTrickyLabel;
private System.Windows.Forms.NumericUpDown TrickyNumericUpDown;
private System.Windows.Forms.Label RadarOneHandLabel;
private System.Windows.Forms.NumericUpDown OneHandNumericUpDown;
private System.Windows.Forms.Label RadarPeakLabel;
private System.Windows.Forms.NumericUpDown PeakNumericUpDown;
private System.Windows.Forms.Label RadarNotesLabel;
private System.Windows.Forms.NumericUpDown NotesNumericUpDown;
private System.Windows.Forms.GroupBox RadarGroupBox;
#endregion
private System.Windows.Forms.PictureBox JacketPictureBox;
@ -253,7 +428,7 @@
private System.Windows.Forms.Button CancelEditButton;
private System.Windows.Forms.Button JacketButton;
private System.Windows.Forms.Button SaveEditButton;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox MetadataGroupBox;
private System.Windows.Forms.Button VoxButton;
private System.Windows.Forms.Button MainDxButton;
private System.Windows.Forms.Button Preview2DX;

View File

@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;
@ -10,13 +8,13 @@ namespace VoxCharger
{
public partial class LevelEditorForm : Form
{
private readonly Image DummyJacket = VoxCharger.Properties.Resources.jk_dummy_s;
private static readonly Image DummyJacket = VoxCharger.Properties.Resources.jk_dummy_s;
private VoxHeader header;
private Ksh kshUpdate = null;
private string voxUpdatePath = string.Empty;
private string dxMainUpdatePath = string.Empty;
private string dxPreviewUpdatePath = string.Empty;
private VoxHeader _header;
private Ksh _kshUpdate = null;
private string _voxUpdatePath = string.Empty;
private string _audioMainUpdatePath = string.Empty;
private string _audioPreviewUpdatePath = string.Empty;
public VoxLevelHeader Result { get; private set; }
@ -24,7 +22,7 @@ namespace VoxCharger
public LevelEditorForm(VoxHeader header, Difficulty difficulty)
{
this.header = header;
this._header = header;
VoxLevelHeader level;
if (!header.Levels.TryGetValue(difficulty, out level))
Result = new VoxLevelHeader();
@ -42,12 +40,13 @@ namespace VoxCharger
case Difficulty.Advanced: Text = "Level Editor - ADV"; break;
case Difficulty.Exhaust: Text = "Level Editor - EXH"; break;
default:
switch (header.InfVersion)
switch (_header.InfVersion)
{
case InfiniteVersion.INF: Text = "Level Editor - INF"; break;
case InfiniteVersion.GRV: Text = "Level Editor - GRV"; break;
case InfiniteVersion.HVN: Text = "Level Editor - HVN"; break;
case InfiniteVersion.VVD: Text = "Level Editor - VVD"; break;
case InfiniteVersion.Inf: Text = "Level Editor - INF"; break;
case InfiniteVersion.Grv: Text = "Level Editor - GRV"; break;
case InfiniteVersion.Hvn: Text = "Level Editor - HVN"; break;
case InfiniteVersion.Vvd: Text = "Level Editor - VVD"; break;
case InfiniteVersion.Xcd: Text = "Level Editor - XCD"; break;
default: Text = "Level Editor - MXM"; break;
}
break;
@ -57,6 +56,21 @@ namespace VoxCharger
EffectorTextBox.Text = Result.Effector;
IllustratorTextBox.Text = Result.Illustrator;
AddRadarDataButton.Visible = Result.Radar == null;
RadarGroupBox.Visible = Result.Radar != null;
if (Result.Radar != null)
{
NotesNumericUpDown.Value = Result.Radar.Notes;
PeakNumericUpDown.Value = Result.Radar.Peak;
TsumamiNumericUpDown.Value = Result.Radar.Lasers;
TrickyNumericUpDown.Value = Result.Radar.Tricky;
HandTripNumericUpDown.Value = Result.Radar.HandTrip;
OneHandNumericUpDown.Value = Result.Radar.OneHand;
}
else
Height -= (RadarGroupBox.Height - AddRadarDataButton.Height);
LoadJacket();
}
@ -100,16 +114,16 @@ namespace VoxCharger
var vox = new VoxChart();
vox.Parse(filename);
voxUpdatePath = filename;
kshUpdate = null;
_voxUpdatePath = filename;
_kshUpdate = null;
}
else if (filename.EndsWith(".ksh"))
{
var ksh = new Ksh();
ksh.Parse(filename);
kshUpdate = ksh;
voxUpdatePath = string.Empty;
_kshUpdate = ksh;
_voxUpdatePath = string.Empty;
}
else
MessageBox.Show("Warning! Stupid input, get stupid output :)", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
@ -117,7 +131,7 @@ namespace VoxCharger
}
catch (Exception ex)
{
voxUpdatePath = null;
_voxUpdatePath = null;
MessageBox.Show(
$"Failed to load chart.\n{ex.Message}",
"Error",
@ -132,36 +146,25 @@ namespace VoxCharger
private void OnMainDxButtonClick(object sender, EventArgs e)
{
Load2DX();
LoadAudio();
}
private void OnPreview2DXClick(object sender, EventArgs e)
{
Load2DX(true);
LoadAudio(true);
}
private void Load2DX(bool preview = false)
private void OnAddRadarDataButtonClick(object sender, EventArgs e)
{
using (var browser = new OpenFileDialog())
{
browser.Filter = "All supported formats|*.2dx;*.s3v;*.wav;*.ogg;*.mp3;*.flac|2DX Music File|*.2dx;*.s3v|Music Files|*.wav;*.ogg;*.mp3;*.flac"; ;
browser.CheckFileExists = true;
if (browser.ShowDialog() == DialogResult.OK)
{
if (!preview)
dxMainUpdatePath = browser.FileName;
else
dxPreviewUpdatePath = browser.FileName;
}
}
RadarGroupBox.Visible = true;
Height += RadarGroupBox.Height - AddRadarDataButton.Height;
}
private void OnJacketPictureBoxClick(object sender, EventArgs e)
{
if (Result.Jacket == null)
{
string jacket = $"{AssetManager.GetJacketPath(header, Result.Difficulty)}_b.png";
string jacket = $"{AssetManager.GetJacketPath(_header, Result.Difficulty)}_b.png";
if (!File.Exists(jacket))
return;
@ -182,83 +185,106 @@ namespace VoxCharger
Close();
}
private void OnLevelEditorFormFormClosing(object sender, FormClosingEventArgs e)
{
}
private void OnSaveEditButtonClick(object sender, EventArgs e)
{
try
{
string voxData = string.Empty;
if (!string.IsNullOrEmpty(voxUpdatePath))
if (!string.IsNullOrEmpty(_voxUpdatePath))
{
if (File.Exists(voxUpdatePath))
voxData = File.ReadAllText(voxUpdatePath, Encoding.GetEncoding("Shift_JIS"));
if (File.Exists(_voxUpdatePath))
voxData = File.ReadAllText(_voxUpdatePath, Encoding.GetEncoding("Shift_JIS"));
else
throw new FileNotFoundException("Vox file not found", voxUpdatePath);
throw new FileNotFoundException("Vox file not found", _voxUpdatePath);
}
VoxChart voxChart = null;
if (kshUpdate != null)
if (_kshUpdate != null)
{
voxChart = new VoxChart();
voxChart.Import(kshUpdate);
voxChart.Import(_kshUpdate);
}
if (!string.IsNullOrEmpty(dxMainUpdatePath))
if (!string.IsNullOrEmpty(_audioMainUpdatePath))
{
if (File.Exists(dxMainUpdatePath))
if (File.Exists(_audioMainUpdatePath))
{
string tmp = Path.Combine(
Path.GetTempPath(),
$"{Path.GetRandomFileName()}{new FileInfo(dxMainUpdatePath).Extension}"
$"{Path.GetRandomFileName()}{new FileInfo(_audioMainUpdatePath).Extension}"
);
File.Copy(dxMainUpdatePath, tmp);
dxMainUpdatePath = tmp;
File.Copy(_audioMainUpdatePath, tmp);
_audioMainUpdatePath = tmp;
}
else
throw new FileNotFoundException("Music file not found", dxMainUpdatePath);
throw new FileNotFoundException("Music file not found", _audioMainUpdatePath);
}
if (!string.IsNullOrEmpty(dxPreviewUpdatePath))
if (!string.IsNullOrEmpty(_audioPreviewUpdatePath))
{
if (File.Exists(dxPreviewUpdatePath))
if (File.Exists(_audioPreviewUpdatePath))
{
string tmp = Path.Combine(
Path.GetTempPath(),
$"{Path.GetRandomFileName()}{new FileInfo(dxPreviewUpdatePath).Extension}"
$"{Path.GetRandomFileName()}{new FileInfo(_audioPreviewUpdatePath).Extension}"
);
File.Copy(dxPreviewUpdatePath, tmp);
dxPreviewUpdatePath = tmp;
File.Copy(_audioPreviewUpdatePath, tmp);
_audioPreviewUpdatePath = tmp;
}
else
throw new FileNotFoundException("Preview file not found", dxPreviewUpdatePath);
throw new FileNotFoundException("Preview file not found", _audioPreviewUpdatePath);
}
if (Result.Jacket != null || voxChart != null || !string.IsNullOrEmpty(voxData) || !string.IsNullOrEmpty(dxMainUpdatePath) || !string.IsNullOrEmpty(dxPreviewUpdatePath))
if (Result.Jacket != null || voxChart != null || !string.IsNullOrEmpty(voxData) || !string.IsNullOrEmpty(_audioMainUpdatePath) || !string.IsNullOrEmpty(_audioPreviewUpdatePath))
{
Action = new Action(() =>
Action = () =>
{
if (Result.Jacket != null)
AssetManager.ImportJacket(header, Result.Difficulty, Result.Jacket);
AssetManager.ImportJacket(_header, Result.Difficulty, Result.Jacket);
if (!string.IsNullOrEmpty(voxData))
AssetManager.ImportVox(header, Result.Difficulty, voxUpdatePath);
AssetManager.ImportVox(_header, Result.Difficulty, _voxUpdatePath);
else if (voxChart != null)
AssetManager.ImportVox(header, Result.Difficulty, voxChart);
AssetManager.ImportVox(_header, Result.Difficulty, voxChart);
if (File.Exists(dxMainUpdatePath))
AssetManager.Import2DX(dxMainUpdatePath, header, Result.Difficulty);
if (File.Exists(_audioMainUpdatePath))
{
var audioFormat = _audioMainUpdatePath.ToLower().EndsWith(".s3v") ? AudioFormat.S3V : AudioFormat.Iidx;
AssetManager.ImportAudio(_audioMainUpdatePath, _header, Result.Difficulty, AudioImportOptions.WithFormat(audioFormat));
}
if (File.Exists(dxPreviewUpdatePath))
AssetManager.Import2DX(dxPreviewUpdatePath, header, Result.Difficulty, true);
});
if (File.Exists(_audioPreviewUpdatePath))
{
var audioFormat = _audioPreviewUpdatePath.ToLower().EndsWith(".s3v") ? AudioFormat.S3V : AudioFormat.Iidx;
AssetManager.ImportAudio(_audioPreviewUpdatePath, _header, Result.Difficulty, AudioImportOptions.WithFormat(audioFormat).AsPreview());
}
};
}
Result.Level = (int)LevelNumericBox.Value;
Result.Effector = EffectorTextBox.Text;
Result.Illustrator = IllustratorTextBox.Text;
if (RadarGroupBox.Visible)
{
Result.Radar = new VoxLevelRadar
{
Notes = (byte)NotesNumericUpDown.Value,
Peak = (byte)PeakNumericUpDown.Value,
Lasers = (byte)TsumamiNumericUpDown.Value,
Tricky = (byte)TrickyNumericUpDown.Value,
HandTrip = (byte)HandTripNumericUpDown.Value,
OneHand = (byte)OneHandNumericUpDown.Value,
};
}
DialogResult = DialogResult.OK;
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
@ -267,6 +293,23 @@ namespace VoxCharger
}
}
private void LoadAudio(bool preview = false)
{
using (var browser = new OpenFileDialog())
{
browser.Filter = "All supported formats|*.2dx;*.s3v;*.asf;*.wav;*.ogg;*.mp3;*.flac|BEMANI Music Files|*.2dx;*.s3v|Music Files|*.wav;*.ogg;*.mp3;*.flac;*.asf";
browser.CheckFileExists = true;
if (browser.ShowDialog() == DialogResult.OK)
{
if (!preview)
_audioMainUpdatePath = browser.FileName;
else
_audioPreviewUpdatePath = browser.FileName;
}
}
}
private void LoadJacket()
{
if (Result.Jacket != null)
@ -277,8 +320,8 @@ namespace VoxCharger
try
{
string currentJacket = $"{AssetManager.GetJacketPath(header, Result.Difficulty)}_s.png";
string defaultJacket = $"{AssetManager.GetDefaultJacketPath(header)}_s.png";
string currentJacket = $"{AssetManager.GetJacketPath(_header, Result.Difficulty)}_s.png";
string defaultJacket = $"{AssetManager.GetDefaultJacketPath(_header)}_s.png";
if (File.Exists(currentJacket))
{
using (var image = Image.FromFile(currentJacket))

View File

@ -1,19 +1,12 @@
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;
namespace VoxCharger
{
public partial class LoadingForm : Form
{
private Action action;
private bool completed = false;
private Action<LoadingForm> _action;
private bool _completed = false;
public LoadingForm()
{
@ -26,12 +19,12 @@ namespace VoxCharger
private void OnLoadingFormShown(object sender, EventArgs e)
{
this.action();
this._action(this);
}
public void SetAction(Action action)
public void SetAction(Action<LoadingForm> action)
{
this.action = action;
this._action = action;
}
public void SetStatus(string text)
@ -61,7 +54,7 @@ namespace VoxCharger
public void Complete()
{
completed = true;
_completed = true;
if (InvokeRequired)
Invoke(new Action(Close));
else
@ -70,7 +63,7 @@ namespace VoxCharger
private void OnLoadingFormFormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = !completed;
e.Cancel = !_completed;
}
}
}

View File

@ -50,8 +50,8 @@
this.BulkImportKshEditMenu = new System.Windows.Forms.MenuItem();
this.RemoveEditMenu = new System.Windows.Forms.MenuItem();
this.MenuSeparator4 = new System.Windows.Forms.MenuItem();
this.Import2DXEditMenu = new System.Windows.Forms.MenuItem();
this.Import2DXPreviewEditMenu = new System.Windows.Forms.MenuItem();
this.ImportAudioEditMenu = new System.Windows.Forms.MenuItem();
this.ImportAudioPreviewEditMenu = new System.Windows.Forms.MenuItem();
this.MenuSeparator5 = new System.Windows.Forms.MenuItem();
this.ExplorerEditMenu = new System.Windows.Forms.MenuItem();
this.MenuSeparator6 = new System.Windows.Forms.MenuItem();
@ -61,6 +61,7 @@
this.SingleConvertToolsMenu = new System.Windows.Forms.MenuItem();
this.BulkConvertToolsMenu = new System.Windows.Forms.MenuItem();
this.MusicFileBuilder = new System.Windows.Forms.MenuItem();
this.S3VFileBuilder = new System.Windows.Forms.MenuItem();
this.HelpMenu = new System.Windows.Forms.MenuItem();
this.AboutHelpMenu = new System.Windows.Forms.MenuItem();
this.FileLabel = new System.Windows.Forms.Label();
@ -76,10 +77,12 @@
this.RemoveButton = new System.Windows.Forms.Button();
this.MusicListBox = new System.Windows.Forms.ListBox();
this.MetadataGroupBox = new System.Windows.Forms.GroupBox();
this.ArtistYomiganaTextBox = new System.Windows.Forms.TextBox();
this.TitleYomiganaTextBox = new System.Windows.Forms.TextBox();
this.SoundGroupBox = new System.Windows.Forms.GroupBox();
this.VolumeIndicatorLabel = new System.Windows.Forms.Label();
this.Import2DXPreviewFileButton = new System.Windows.Forms.Button();
this.Import2DXMusicFileButton = new System.Windows.Forms.Button();
this.ImportPreviewFileButton = new System.Windows.Forms.Button();
this.ImportMusicFileButton = new System.Windows.Forms.Button();
this.VolumeLabel = new System.Windows.Forms.Label();
this.VolumeTrackBar = new System.Windows.Forms.TrackBar();
this.DistributionPicker = new System.Windows.Forms.DateTimePicker();
@ -123,26 +126,12 @@
//
// MainMenu
//
this.MainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.FileMenu,
this.EditMenu,
this.ToolsMenu,
this.HelpMenu});
this.MainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.FileMenu, this.EditMenu, this.ToolsMenu, this.HelpMenu });
//
// FileMenu
//
this.FileMenu.Index = 0;
this.FileMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.NewFileMenu,
this.OpenFileMenu,
this.MenuSeparator1,
this.SaveFileMenu,
this.SaveAsFileMenu,
this.MenuSeparator2,
this.ChangeMixFileMenu,
this.DeleteMixFileMenu,
this.MenuSeparator3,
this.ExitFileMenu});
this.FileMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.NewFileMenu, this.OpenFileMenu, this.MenuSeparator1, this.SaveFileMenu, this.SaveAsFileMenu, this.MenuSeparator2, this.ChangeMixFileMenu, this.DeleteMixFileMenu, this.MenuSeparator3, this.ExitFileMenu });
this.FileMenu.Text = "File";
//
// NewFileMenu
@ -215,26 +204,13 @@
//
this.EditMenu.Enabled = false;
this.EditMenu.Index = 1;
this.EditMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.AddEditMenu,
this.RemoveEditMenu,
this.MenuSeparator4,
this.Import2DXEditMenu,
this.Import2DXPreviewEditMenu,
this.MenuSeparator5,
this.ExplorerEditMenu,
this.MenuSeparator6,
this.AutosaveEditMenu});
this.EditMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.AddEditMenu, this.RemoveEditMenu, this.MenuSeparator4, this.ImportAudioEditMenu, this.ImportAudioPreviewEditMenu, this.MenuSeparator5, this.ExplorerEditMenu, this.MenuSeparator6, this.AutosaveEditMenu });
this.EditMenu.Text = "Edit";
//
// AddEditMenu
//
this.AddEditMenu.Index = 0;
this.AddEditMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.AddNewEditMenu,
this.ImportKshEditMenu,
this.MenuSeparator7,
this.BulkImportKshEditMenu});
this.AddEditMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.AddNewEditMenu, this.ImportKshEditMenu, this.MenuSeparator7, this.BulkImportKshEditMenu });
this.AddEditMenu.Shortcut = System.Windows.Forms.Shortcut.Ins;
this.AddEditMenu.Text = "Add";
//
@ -273,19 +249,19 @@
this.MenuSeparator4.Index = 2;
this.MenuSeparator4.Text = "-";
//
// Import2DXEditMenu
// ImportAudioEditMenu
//
this.Import2DXEditMenu.Enabled = false;
this.Import2DXEditMenu.Index = 3;
this.Import2DXEditMenu.Text = "Import 2DX Music..";
this.Import2DXEditMenu.Click += new System.EventHandler(this.OnImport2DXMusicFileButtonClick);
this.ImportAudioEditMenu.Enabled = false;
this.ImportAudioEditMenu.Index = 3;
this.ImportAudioEditMenu.Text = "Import Music..";
this.ImportAudioEditMenu.Click += new System.EventHandler(this.OnImportMusicFileButtonClick);
//
// Import2DXPreviewEditMenu
// ImportAudioPreviewEditMenu
//
this.Import2DXPreviewEditMenu.Enabled = false;
this.Import2DXPreviewEditMenu.Index = 4;
this.Import2DXPreviewEditMenu.Text = "Import 2DX Preview..";
this.Import2DXPreviewEditMenu.Click += new System.EventHandler(this.OnImport2DXPreviewFileButtonClick);
this.ImportAudioPreviewEditMenu.Enabled = false;
this.ImportAudioPreviewEditMenu.Index = 4;
this.ImportAudioPreviewEditMenu.Text = "Import Preview..";
this.ImportAudioPreviewEditMenu.Click += new System.EventHandler(this.OnImportPreviewFileButtonClick);
//
// MenuSeparator5
//
@ -315,17 +291,13 @@
// ToolsMenu
//
this.ToolsMenu.Index = 2;
this.ToolsMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.ConvertToolsMenu,
this.MusicFileBuilder});
this.ToolsMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.ConvertToolsMenu, this.MusicFileBuilder, this.S3VFileBuilder });
this.ToolsMenu.Text = "Tools";
//
// ConvertToolsMenu
//
this.ConvertToolsMenu.Index = 0;
this.ConvertToolsMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.SingleConvertToolsMenu,
this.BulkConvertToolsMenu});
this.ConvertToolsMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.SingleConvertToolsMenu, this.BulkConvertToolsMenu });
this.ConvertToolsMenu.Text = "KSH Converter";
//
// SingleConvertToolsMenu
@ -346,11 +318,17 @@
this.MusicFileBuilder.Text = "2DX Builder";
this.MusicFileBuilder.Click += new System.EventHandler(this.OnMusicFileBuilderClick);
//
// S3VFileBuilder
//
this.S3VFileBuilder.Enabled = false;
this.S3VFileBuilder.Index = 2;
this.S3VFileBuilder.Text = "S3V Builder";
this.S3VFileBuilder.Click += new System.EventHandler(this.OnS3VFileBuilderClick);
//
// HelpMenu
//
this.HelpMenu.Index = 3;
this.HelpMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.AboutHelpMenu});
this.HelpMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.AboutHelpMenu });
this.HelpMenu.Text = "Help";
//
// AboutHelpMenu
@ -371,8 +349,7 @@
//
// PathTextBox
//
this.PathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.PathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.PathTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.PathTextBox.Location = new System.Drawing.Point(66, 12);
this.PathTextBox.Name = "PathTextBox";
@ -395,9 +372,7 @@
//
// MusicGroupBox
//
this.MusicGroupBox.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.MusicGroupBox.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.MusicGroupBox.Controls.Add(this.AddButton);
this.MusicGroupBox.Controls.Add(this.RemoveButton);
this.MusicGroupBox.Controls.Add(this.MusicListBox);
@ -405,16 +380,15 @@
this.MusicGroupBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.MusicGroupBox.Location = new System.Drawing.Point(15, 40);
this.MusicGroupBox.Name = "MusicGroupBox";
this.MusicGroupBox.Size = new System.Drawing.Size(258, 478);
this.MusicGroupBox.Size = new System.Drawing.Size(258, 498);
this.MusicGroupBox.TabIndex = 3;
this.MusicGroupBox.TabStop = false;
this.MusicGroupBox.Text = "Music";
//
// AddButton
//
this.AddButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.AddButton.Location = new System.Drawing.Point(6, 447);
this.AddButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.AddButton.Location = new System.Drawing.Point(6, 467);
this.AddButton.Menu = this.ImportContextMenu;
this.AddButton.Name = "AddButton";
this.AddButton.Size = new System.Drawing.Size(120, 25);
@ -425,11 +399,7 @@
//
// ImportContextMenu
//
this.ImportContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.ImportVoxMenu,
this.ImportKshMenu,
this.MenuSeparator8,
this.BulkImportKshMenu});
this.ImportContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.ImportVoxMenu, this.ImportKshMenu, this.MenuSeparator8, this.BulkImportKshMenu });
//
// ImportVoxMenu
//
@ -458,7 +428,7 @@
//
this.RemoveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.RemoveButton.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.RemoveButton.Location = new System.Drawing.Point(132, 447);
this.RemoveButton.Location = new System.Drawing.Point(132, 467);
this.RemoveButton.Name = "RemoveButton";
this.RemoveButton.Size = new System.Drawing.Size(120, 25);
this.RemoveButton.TabIndex = 4;
@ -468,22 +438,21 @@
//
// MusicListBox
//
this.MusicListBox.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.MusicListBox.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.MusicListBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.MusicListBox.FormattingEnabled = true;
this.MusicListBox.Location = new System.Drawing.Point(6, 19);
this.MusicListBox.Name = "MusicListBox";
this.MusicListBox.Size = new System.Drawing.Size(246, 420);
this.MusicListBox.Size = new System.Drawing.Size(246, 433);
this.MusicListBox.Sorted = true;
this.MusicListBox.TabIndex = 2;
this.MusicListBox.SelectedIndexChanged += new System.EventHandler(this.OnMusicListBoxSelectedIndexChanged);
//
// MetadataGroupBox
//
this.MetadataGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Right)));
this.MetadataGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Right)));
this.MetadataGroupBox.Controls.Add(this.ArtistYomiganaTextBox);
this.MetadataGroupBox.Controls.Add(this.TitleYomiganaTextBox);
this.MetadataGroupBox.Controls.Add(this.SoundGroupBox);
this.MetadataGroupBox.Controls.Add(this.DistributionPicker);
this.MetadataGroupBox.Controls.Add(this.ReleaseLabel);
@ -506,21 +475,38 @@
this.MetadataGroupBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.MetadataGroupBox.Location = new System.Drawing.Point(279, 40);
this.MetadataGroupBox.Name = "MetadataGroupBox";
this.MetadataGroupBox.Size = new System.Drawing.Size(473, 478);
this.MetadataGroupBox.Size = new System.Drawing.Size(473, 498);
this.MetadataGroupBox.TabIndex = 4;
this.MetadataGroupBox.TabStop = false;
this.MetadataGroupBox.Text = "Metadata";
//
// ArtistYomiganaTextBox
//
this.ArtistYomiganaTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.ArtistYomiganaTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ArtistYomiganaTextBox.Location = new System.Drawing.Point(314, 76);
this.ArtistYomiganaTextBox.Name = "ArtistYomiganaTextBox";
this.ArtistYomiganaTextBox.Size = new System.Drawing.Size(152, 21);
this.ArtistYomiganaTextBox.TabIndex = 31;
//
// TitleYomiganaTextBox
//
this.TitleYomiganaTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.TitleYomiganaTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TitleYomiganaTextBox.Location = new System.Drawing.Point(314, 49);
this.TitleYomiganaTextBox.Name = "TitleYomiganaTextBox";
this.TitleYomiganaTextBox.Size = new System.Drawing.Size(151, 21);
this.TitleYomiganaTextBox.TabIndex = 30;
//
// SoundGroupBox
//
this.SoundGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.SoundGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.SoundGroupBox.Controls.Add(this.VolumeIndicatorLabel);
this.SoundGroupBox.Controls.Add(this.Import2DXPreviewFileButton);
this.SoundGroupBox.Controls.Add(this.Import2DXMusicFileButton);
this.SoundGroupBox.Controls.Add(this.ImportPreviewFileButton);
this.SoundGroupBox.Controls.Add(this.ImportMusicFileButton);
this.SoundGroupBox.Controls.Add(this.VolumeLabel);
this.SoundGroupBox.Controls.Add(this.VolumeTrackBar);
this.SoundGroupBox.Location = new System.Drawing.Point(19, 217);
this.SoundGroupBox.Location = new System.Drawing.Point(19, 237);
this.SoundGroupBox.Name = "SoundGroupBox";
this.SoundGroupBox.Size = new System.Drawing.Size(447, 80);
this.SoundGroupBox.TabIndex = 10;
@ -536,25 +522,25 @@
this.VolumeIndicatorLabel.Text = "91%";
this.VolumeIndicatorLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// Import2DXPreviewFileButton
// ImportPreviewFileButton
//
this.Import2DXPreviewFileButton.Location = new System.Drawing.Point(227, 20);
this.Import2DXPreviewFileButton.Name = "Import2DXPreviewFileButton";
this.Import2DXPreviewFileButton.Size = new System.Drawing.Size(207, 23);
this.Import2DXPreviewFileButton.TabIndex = 12;
this.Import2DXPreviewFileButton.Text = "Import 2DX Preview";
this.Import2DXPreviewFileButton.UseVisualStyleBackColor = true;
this.Import2DXPreviewFileButton.Click += new System.EventHandler(this.OnImport2DXPreviewFileButtonClick);
this.ImportPreviewFileButton.Location = new System.Drawing.Point(227, 20);
this.ImportPreviewFileButton.Name = "ImportPreviewFileButton";
this.ImportPreviewFileButton.Size = new System.Drawing.Size(207, 23);
this.ImportPreviewFileButton.TabIndex = 12;
this.ImportPreviewFileButton.Text = "Import Preview";
this.ImportPreviewFileButton.UseVisualStyleBackColor = true;
this.ImportPreviewFileButton.Click += new System.EventHandler(this.OnImportPreviewFileButtonClick);
//
// Import2DXMusicFileButton
// ImportMusicFileButton
//
this.Import2DXMusicFileButton.Location = new System.Drawing.Point(14, 20);
this.Import2DXMusicFileButton.Name = "Import2DXMusicFileButton";
this.Import2DXMusicFileButton.Size = new System.Drawing.Size(207, 23);
this.Import2DXMusicFileButton.TabIndex = 11;
this.Import2DXMusicFileButton.Text = "Import 2DX Music";
this.Import2DXMusicFileButton.UseVisualStyleBackColor = true;
this.Import2DXMusicFileButton.Click += new System.EventHandler(this.OnImport2DXMusicFileButtonClick);
this.ImportMusicFileButton.Location = new System.Drawing.Point(14, 20);
this.ImportMusicFileButton.Name = "ImportMusicFileButton";
this.ImportMusicFileButton.Size = new System.Drawing.Size(207, 23);
this.ImportMusicFileButton.TabIndex = 11;
this.ImportMusicFileButton.Text = "Import Music";
this.ImportMusicFileButton.UseVisualStyleBackColor = true;
this.ImportMusicFileButton.Click += new System.EventHandler(this.OnImportMusicFileButtonClick);
//
// VolumeLabel
//
@ -569,8 +555,7 @@
//
// VolumeTrackBar
//
this.VolumeTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.VolumeTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.VolumeTrackBar.AutoSize = false;
this.VolumeTrackBar.Location = new System.Drawing.Point(54, 49);
this.VolumeTrackBar.Maximum = 120;
@ -583,8 +568,7 @@
//
// DistributionPicker
//
this.DistributionPicker.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.DistributionPicker.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.DistributionPicker.CustomFormat = "yyyy-MM-dd";
this.DistributionPicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.DistributionPicker.Location = new System.Drawing.Point(83, 157);
@ -606,8 +590,7 @@
//
// LevelGroupBox
//
this.LevelGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.LevelGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.LevelGroupBox.Controls.Add(this.InfEditButton);
this.LevelGroupBox.Controls.Add(this.ExhEditButton);
this.LevelGroupBox.Controls.Add(this.AdvEditButton);
@ -616,7 +599,7 @@
this.LevelGroupBox.Controls.Add(this.JacketExhPictureBox);
this.LevelGroupBox.Controls.Add(this.JacketAdvPictureBox);
this.LevelGroupBox.Controls.Add(this.JacketNovPictureBox);
this.LevelGroupBox.Location = new System.Drawing.Point(19, 307);
this.LevelGroupBox.Location = new System.Drawing.Point(19, 327);
this.LevelGroupBox.Name = "LevelGroupBox";
this.LevelGroupBox.Size = new System.Drawing.Size(447, 165);
this.LevelGroupBox.TabIndex = 14;
@ -728,76 +711,11 @@
//
// BackgroundDropDown
//
this.BackgroundDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.BackgroundDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.BackgroundDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.BackgroundDropDown.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.BackgroundDropDown.FormattingEnabled = true;
this.BackgroundDropDown.Items.AddRange(new object[] {
"00",
"01",
"02",
"03",
"04",
"05",
"06",
"07",
"08",
"09",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"18",
"19",
"27",
"29",
"30",
"31",
"34",
"36",
"38",
"39",
"40",
"41",
"42",
"43",
"44",
"45",
"46",
"47",
"48",
"49",
"50",
"51",
"53",
"54",
"57",
"58",
"59",
"60",
"61",
"63",
"65",
"66",
"67",
"68",
"69",
"70",
"71",
"72",
"73",
"74",
"75",
"76",
"77",
"78",
"79",
"80",
"81"});
this.BackgroundDropDown.Items.AddRange(new object[] { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "18", "19", "27", "29", "30", "31", "34", "36", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "53", "54", "57", "58", "59", "60", "61", "63", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "86", "87", "88", "89", "90", "91", "92", "93", "92", "95", "96", "97", "98" });
this.BackgroundDropDown.Location = new System.Drawing.Point(83, 184);
this.BackgroundDropDown.Name = "BackgroundDropDown";
this.BackgroundDropDown.Size = new System.Drawing.Size(383, 21);
@ -806,17 +724,11 @@
//
// InfVerDropDown
//
this.InfVerDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.InfVerDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.InfVerDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.InfVerDropDown.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.InfVerDropDown.FormattingEnabled = true;
this.InfVerDropDown.Items.AddRange(new object[] {
"MXM",
"INF",
"GRV",
"HVN",
"VVD"});
this.InfVerDropDown.Items.AddRange(new object[] { "MXM", "INF", "GRV", "HVN", "VVD", "XCD" });
this.InfVerDropDown.Location = new System.Drawing.Point(370, 130);
this.InfVerDropDown.Name = "InfVerDropDown";
this.InfVerDropDown.Size = new System.Drawing.Size(96, 21);
@ -826,29 +738,16 @@
//
// BpmMaxNumericBox
//
this.BpmMaxNumericBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.BpmMaxNumericBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.BpmMaxNumericBox.DecimalPlaces = 2;
this.BpmMaxNumericBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.BpmMaxNumericBox.Location = new System.Drawing.Point(277, 103);
this.BpmMaxNumericBox.Maximum = new decimal(new int[] {
10000,
0,
0,
0});
this.BpmMaxNumericBox.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.BpmMaxNumericBox.Maximum = new decimal(new int[] { 10000, 0, 0, 0 });
this.BpmMaxNumericBox.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
this.BpmMaxNumericBox.Name = "BpmMaxNumericBox";
this.BpmMaxNumericBox.Size = new System.Drawing.Size(189, 21);
this.BpmMaxNumericBox.TabIndex = 5;
this.BpmMaxNumericBox.Value = new decimal(new int[] {
1,
0,
0,
0});
this.BpmMaxNumericBox.Value = new decimal(new int[] { 1, 0, 0, 0 });
this.BpmMaxNumericBox.ValueChanged += new System.EventHandler(this.OnMetadataChanged);
//
// VersionlLabel
@ -864,17 +763,11 @@
//
// VersionDropDown
//
this.VersionDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.VersionDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.VersionDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.VersionDropDown.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.VersionDropDown.FormattingEnabled = true;
this.VersionDropDown.Items.AddRange(new object[] {
"Sound Voltex: Booth",
"Sound Voltex II: Infinite Infection",
"Sound Voltex III: Gravity Wars",
"Sound Voltex IV: Heavenly Haven",
"Sound Voltex V: VividWave"});
this.VersionDropDown.Items.AddRange(new object[] { "Sound Voltex: Booth", "Sound Voltex II: Infinite Infection", "Sound Voltex III: Gravity Wars", "Sound Voltex IV: Heavenly Haven", "Sound Voltex V: Vivid Wave", "Sound Voltex VI: Exceed Gear" });
this.VersionDropDown.Location = new System.Drawing.Point(83, 130);
this.VersionDropDown.Name = "VersionDropDown";
this.VersionDropDown.Size = new System.Drawing.Size(282, 21);
@ -883,8 +776,7 @@
//
// IdTextBox
//
this.IdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.IdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.IdTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.IdTextBox.Location = new System.Drawing.Point(83, 23);
this.IdTextBox.Name = "IdTextBox";
@ -916,39 +808,25 @@
//
// BpmMinNumericBox
//
this.BpmMinNumericBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.BpmMinNumericBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.BpmMinNumericBox.DecimalPlaces = 2;
this.BpmMinNumericBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.BpmMinNumericBox.Location = new System.Drawing.Point(83, 103);
this.BpmMinNumericBox.Maximum = new decimal(new int[] {
10000,
0,
0,
0});
this.BpmMinNumericBox.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.BpmMinNumericBox.Maximum = new decimal(new int[] { 10000, 0, 0, 0 });
this.BpmMinNumericBox.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
this.BpmMinNumericBox.Name = "BpmMinNumericBox";
this.BpmMinNumericBox.Size = new System.Drawing.Size(188, 21);
this.BpmMinNumericBox.TabIndex = 4;
this.BpmMinNumericBox.Value = new decimal(new int[] {
1,
0,
0,
0});
this.BpmMinNumericBox.Value = new decimal(new int[] { 1, 0, 0, 0 });
this.BpmMinNumericBox.ValueChanged += new System.EventHandler(this.OnMetadataChanged);
//
// ArtistTextBox
//
this.ArtistTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ArtistTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.ArtistTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ArtistTextBox.Location = new System.Drawing.Point(83, 76);
this.ArtistTextBox.Name = "ArtistTextBox";
this.ArtistTextBox.Size = new System.Drawing.Size(383, 21);
this.ArtistTextBox.Size = new System.Drawing.Size(225, 21);
this.ArtistTextBox.TabIndex = 3;
this.ArtistTextBox.TextChanged += new System.EventHandler(this.OnMetadataChanged);
//
@ -965,12 +843,11 @@
//
// TitleTextBox
//
this.TitleTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.TitleTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
this.TitleTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.TitleTextBox.Location = new System.Drawing.Point(83, 49);
this.TitleTextBox.Name = "TitleTextBox";
this.TitleTextBox.Size = new System.Drawing.Size(383, 21);
this.TitleTextBox.Size = new System.Drawing.Size(225, 21);
this.TitleTextBox.TabIndex = 2;
this.TitleTextBox.TextChanged += new System.EventHandler(this.OnMetadataChanged);
//
@ -988,9 +865,9 @@
// MainStatusBar
//
this.MainStatusBar.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.MainStatusBar.Location = new System.Drawing.Point(0, 529);
this.MainStatusBar.Location = new System.Drawing.Point(0, 559);
this.MainStatusBar.Name = "MainStatusBar";
this.MainStatusBar.Size = new System.Drawing.Size(764, 22);
this.MainStatusBar.Size = new System.Drawing.Size(774, 22);
this.MainStatusBar.TabIndex = 5;
this.MainStatusBar.Text = "Ready";
//
@ -998,7 +875,7 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(764, 551);
this.ClientSize = new System.Drawing.Size(774, 581);
this.Controls.Add(this.MainStatusBar);
this.Controls.Add(this.MetadataGroupBox);
this.Controls.Add(this.MusicGroupBox);
@ -1030,9 +907,11 @@
((System.ComponentModel.ISupportInitialize)(this.BpmMinNumericBox)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.TextBox TitleYomiganaTextBox;
private System.Windows.Forms.TextBox ArtistYomiganaTextBox;
#endregion
private System.Windows.Forms.MainMenu MainMenu;
@ -1090,15 +969,16 @@
private System.Windows.Forms.MenuItem SaveAsFileMenu;
private System.Windows.Forms.StatusBar MainStatusBar;
private System.Windows.Forms.GroupBox SoundGroupBox;
private System.Windows.Forms.Button Import2DXPreviewFileButton;
private System.Windows.Forms.Button Import2DXMusicFileButton;
private System.Windows.Forms.Button ImportPreviewFileButton;
private System.Windows.Forms.Button ImportMusicFileButton;
private System.Windows.Forms.Label VolumeIndicatorLabel;
private System.Windows.Forms.MenuItem MenuSeparator4;
private System.Windows.Forms.MenuItem Import2DXEditMenu;
private System.Windows.Forms.MenuItem Import2DXPreviewEditMenu;
private System.Windows.Forms.MenuItem ImportAudioEditMenu;
private System.Windows.Forms.MenuItem ImportAudioPreviewEditMenu;
private System.Windows.Forms.MenuItem MenuSeparator5;
private System.Windows.Forms.MenuItem ExplorerEditMenu;
private System.Windows.Forms.MenuItem MusicFileBuilder;
private System.Windows.Forms.MenuItem S3VFileBuilder;
private MenuButton AddButton;
private System.Windows.Forms.ContextMenu ImportContextMenu;
private System.Windows.Forms.MenuItem ImportKshMenu;

View File

@ -1,16 +1,11 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.WindowsAPICodePack.Dialogs;
namespace VoxCharger
{
@ -18,11 +13,11 @@ namespace VoxCharger
{
#region -- Variables --
private const int DefaultVolume = 91;
private readonly Image DummyJacket = VoxCharger.Properties.Resources.jk_dummy_s;
private readonly Dictionary<string, Queue<Action>> actions = new Dictionary<string, Queue<Action>>();
private readonly Image _dummyJacket = VoxCharger.Properties.Resources.jk_dummy_s;
private readonly Dictionary<string, Queue<Action>> _actions = new Dictionary<string, Queue<Action>>();
private bool Pristine = true;
private bool Autosave = true;
private bool _pristine = true;
private bool _autosave = true;
#endregion
#region --- Form ---
@ -37,7 +32,7 @@ namespace VoxCharger
private void OnMainFormFormClosing(object sender, FormClosingEventArgs e)
{
if (!Pristine && SaveFileMenu.Enabled)
if (!_pristine && SaveFileMenu.Enabled)
{
var response = MessageBox.Show(
"Save file before exit the program?",
@ -57,7 +52,7 @@ namespace VoxCharger
#region --- Menu ---
private void OnNewFileMenuClick(object sender, EventArgs e)
{
if (!Pristine && SaveFileMenu.Enabled)
if (!_pristine && SaveFileMenu.Enabled)
{
var response = MessageBox.Show(
"Save file before open another mix?",
@ -71,27 +66,26 @@ namespace VoxCharger
else if (response == DialogResult.Cancel)
return;
Pristine = true;
actions.Clear();
_pristine = true;
_actions.Clear();
}
string gamePath = AssetManager.GamePath;
if (string.IsNullOrEmpty(AssetManager.MixPath) || !Directory.Exists(AssetManager.MixPath))
{
using (var browser = new FolderBrowserDialog())
using (var browser = new CommonOpenFileDialog())
{
browser.ShowNewFolderButton = true;
browser.Description = "Select KFC Content Root";
browser.IsFolderPicker = true;
browser.Multiselect = false;
if (browser.ShowDialog() == DialogResult.OK)
{
gamePath = browser.SelectedPath;
if (browser.ShowDialog() != CommonFileDialogResult.Ok)
return;
PathTextBox.Text = string.Empty;
MusicListBox.Items.Clear();
gamePath = browser.FileName;
PathTextBox.Text = string.Empty;
MusicListBox.Items.Clear();
ResetEditor();
}
ResetEditor();
}
}
@ -165,10 +159,10 @@ namespace VoxCharger
private void OnChangeMixFileMenuClick(object sender, EventArgs e)
{
if (!Pristine && SaveFileMenu.Enabled)
if (!_pristine && SaveFileMenu.Enabled)
{
var response = MessageBox.Show(
"Save file before open another mix?",
"Save file before Open another mix?",
"Change Mix",
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question
@ -179,8 +173,8 @@ namespace VoxCharger
else if (response == DialogResult.Cancel)
return;
Pristine = true;
actions.Clear();
_pristine = true;
_actions.Clear();
}
using (var mixSelector = new MixSelectorForm())
@ -211,7 +205,7 @@ namespace VoxCharger
MetadataGroupBox.Enabled = false;
MusicListBox.Items.Clear();
DisableUI();
DisableUi();
ResetEditor();
AssetManager.Initialize(AssetManager.GamePath);
@ -235,8 +229,8 @@ namespace VoxCharger
private void OnAutosaveEditMenuClick(object sender, EventArgs e)
{
Autosave = !Autosave;
AutosaveEditMenu.Checked = Autosave;
_autosave = !_autosave;
AutosaveEditMenu.Checked = _autosave;
}
private void OnExplorerEditMenuClick(object sender, EventArgs e)
@ -266,13 +260,15 @@ namespace VoxCharger
private void OnBulkConvertToolsMenuClick(object sender, EventArgs e)
{
using (var browser = new FolderBrowserDialog())
using (var browser = new CommonOpenFileDialog())
{
browser.Description = "Select Kshoot chart repository";
if (browser.ShowDialog() != DialogResult.OK)
browser.IsFolderPicker = true;
browser.Multiselect = false;
if (browser.ShowDialog() != CommonFileDialogResult.Ok)
return;
using (var converter = new ConverterForm(browser.SelectedPath, ConvertMode.Converter))
using (var converter = new ConverterForm(browser.FileName, ConvertMode.Converter))
converter.ShowDialog();
}
}
@ -282,7 +278,7 @@ namespace VoxCharger
using (var browser = new OpenFileDialog())
using (var exporter = new SaveFileDialog())
{
browser.Filter = "Audio Files|*.wav;*.ogg;*.mp3;*.flac|2DX Music File|*.2dx;*.s3v|Music Files|*.wav;*.ogg;*.mp3;*.flac";
browser.Filter = "Audio Files|*.wav;*.ogg;*.mp3;*.flac";
browser.CheckFileExists = true;
if (browser.ShowDialog() != DialogResult.OK)
@ -292,31 +288,29 @@ namespace VoxCharger
if (exporter.ShowDialog() != DialogResult.OK)
return;
string source = browser.FileName;
string output = exporter.FileName;
string error = string.Empty;
using (var loader = new LoadingForm())
{
loader.SetAction(() =>
loader.SetAction(dialog =>
{
try
{
loader.SetStatus("Processing assets..");
dialog.SetStatus("Processing assets..");
DxEncoder.Encode(new[] { source }, output);
string source = browser.FileName;
string tmp = DxTool.ConvertToWave(source, false);
DxTool.Build(tmp, exporter.FileName);
Directory.Delete(tmp, true);
loader.SetProgress(100);
loader.DialogResult = DialogResult.OK;
loader.Complete();
dialog.SetProgress(100);
dialog.DialogResult = DialogResult.OK;
dialog.Complete();
}
catch (Exception ex)
{
error = ex.Message;
loader.DialogResult = DialogResult.Abort;
loader.Complete();
dialog.DialogResult = DialogResult.Abort;
dialog.Complete();
}
});
@ -342,6 +336,84 @@ namespace VoxCharger
}
}
private void OnS3VFileBuilderClick(object sender, EventArgs e)
{
using (var browser = new OpenFileDialog())
using (var exporter = new SaveFileDialog())
{
browser.Filter = "Audio Files|*.wav;*.ogg;*.mp3;*.flac";
browser.CheckFileExists = true;
if (browser.ShowDialog() != DialogResult.OK)
return;
exporter.Filter = "S3V File|*.s3v";
if (exporter.ShowDialog() != DialogResult.OK)
return;
string source = browser.FileName;
string output = exporter.FileName;
string error = string.Empty;
using (var loader = new LoadingForm())
{
loader.SetAction(dialog =>
{
try
{
dialog.SetStatus("Processing assets..");
S3VTool.Convert(source, output, AudioImportOptions.Default);
dialog.SetProgress(100);
dialog.DialogResult = DialogResult.OK;
dialog.Complete();
}
catch (Exception ex)
{
error = ex.Message;
dialog.DialogResult = DialogResult.Abort;
dialog.Complete();
}
});
if (!File.Exists(S3VTool.ConverterFileName))
S3VTool.ConverterFileName = "ffmpeg.exe";
if (!File.Exists(S3VTool.ConverterFileName))
{
using (var ofd = new OpenFileDialog())
{
ofd.Filter = "ffmpeg.exe | ffmpeg.exe";
ofd.CheckFileExists = true;
if (ofd.ShowDialog() == DialogResult.OK)
S3VTool.ConverterFileName = ofd.FileName;
}
}
if (loader.ShowDialog() == DialogResult.OK)
{
MessageBox.Show(
"Audio file has been converted successfully",
"S3V Builder",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
}
else
{
MessageBox.Show(
$"Failed to convert audio file.\n{error}",
"S3V Builder",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}
}
}
}
private void OnAboutHelpMenuClick(object sender, EventArgs e)
{
using (var about = new AboutForm())
@ -359,7 +431,7 @@ namespace VoxCharger
{
try
{
if (!Pristine && SaveFileMenu.Enabled)
if (!_pristine && SaveFileMenu.Enabled)
{
var response = MessageBox.Show(
"Save file before open another mix?",
@ -373,19 +445,17 @@ namespace VoxCharger
else if (response == DialogResult.Cancel)
return;
Pristine = true;
actions.Clear();
_pristine = true;
_actions.Clear();
}
using (var browser = new FolderBrowserDialog())
using (var browser = new CommonOpenFileDialog())
using (var mixSelector = new MixSelectorForm())
{
browser.ShowNewFolderButton = true;
browser.Description = "Select KFC Content Root";
if (browser.ShowDialog() == DialogResult.OK)
browser.IsFolderPicker = true;
if (browser.ShowDialog() == CommonFileDialogResult.Ok)
{
AssetManager.Initialize(browser.SelectedPath);
AssetManager.Initialize(browser.FileName);
PathTextBox.Text = string.Empty;
MusicListBox.Items.Clear();
@ -432,10 +502,12 @@ namespace VoxCharger
var header = new VoxHeader()
{
Title = "Untitled",
TitleYomigana = "ダミー", // dummy
Ascii = defaultAscii,
Artist = "Unknown",
Version = GameVersion.VividWave,
InfVersion = InfiniteVersion.MXM,
ArtistYomigana = "ダミー", // dummy
Version = GameVersion.ExceedGear,
InfVersion = InfiniteVersion.Mxm,
BackgroundId = short.Parse(ConverterForm.LastBackground),
GenreId = 16,
BpmMin = 1,
@ -448,7 +520,7 @@ namespace VoxCharger
}
};
Pristine = false;
_pristine = false;
AssetManager.Headers.Add(header);
MusicListBox.Items.Add(header);
}
@ -469,15 +541,15 @@ namespace VoxCharger
return;
var header = converter.Result;
if (!actions.ContainsKey(header.Ascii))
actions[header.Ascii] = new Queue<Action>();
if (!_actions.ContainsKey(header.Ascii))
_actions[header.Ascii] = new Queue<Action>();
Pristine = false;
_pristine = false;
AssetManager.Headers.Add(header);
MusicListBox.Items.Add(header);
actions[header.Ascii].Enqueue(converter.Action);
if (Autosave)
_actions[header.Ascii].Enqueue(converter.Action);
if (_autosave)
Save(AssetManager.MdbFilename);
}
}
@ -485,30 +557,32 @@ namespace VoxCharger
private void OnBulkImportKshMenuClick(object sender, EventArgs e)
{
using (var browser = new FolderBrowserDialog())
using (var browser = new CommonOpenFileDialog())
{
browser.Description = "Select Kshoot chart repository";
if (browser.ShowDialog() != DialogResult.OK)
browser.IsFolderPicker = true;
browser.Multiselect = false;
if (browser.ShowDialog() != CommonFileDialogResult.Ok)
return;
using (var converter = new ConverterForm(browser.SelectedPath, ConvertMode.BulkImporter))
using (var converter = new ConverterForm(browser.FileName, ConvertMode.BulkImporter))
{
if (converter.ShowDialog() != DialogResult.OK)
return;
foreach (var header in converter.ResultSet)
{
if (!actions.ContainsKey(header.Ascii))
actions[header.Ascii] = new Queue<Action>();
if (!_actions.ContainsKey(header.Ascii))
_actions[header.Ascii] = new Queue<Action>();
AssetManager.Headers.Add(header);
MusicListBox.Items.Add(header);
actions[header.Ascii].Enqueue(converter.ActionSet[header.Ascii]);
_actions[header.Ascii].Enqueue(converter.ActionSet[header.Ascii]);
}
Pristine = false;
if (Autosave)
_pristine = false;
if (_autosave)
Save(AssetManager.MdbFilename);
}
}
@ -528,16 +602,16 @@ namespace VoxCharger
if (int.TryParse(IdTextBox.Text, out int id))
{
// Validate ID
if (!AssetManager.ValidateMusicID(id))
if (!AssetManager.ValidateMusicId(id))
{
IdTextBox.Text = header.ID.ToString();
IdTextBox.Text = header.Id.ToString();
MessageBox.Show("Music ID is already taken", "Duplicate", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
header.ID = id;
header.Id = id;
}
else
IdTextBox.Text = header.ID.ToString();
IdTextBox.Text = header.Id.ToString();
double min = (double)Math.Min(BpmMinNumericBox.Value, BpmMaxNumericBox.Value);
double max = (double)Math.Max(BpmMinNumericBox.Value, BpmMaxNumericBox.Value);
@ -545,17 +619,19 @@ namespace VoxCharger
BpmMaxNumericBox.Value = (decimal)max;
header.Title = TitleTextBox.Text;
header.TitleYomigana = TitleYomiganaTextBox.Text;
header.Artist = ArtistTextBox.Text;
header.ArtistYomigana = ArtistYomiganaTextBox.Text;
header.BpmMin = min;
header.BpmMax = max;
header.Version = (GameVersion)(VersionDropDown.SelectedIndex + 1);
header.InfVersion = InfVerDropDown.SelectedIndex == 0 ? InfiniteVersion.MXM : (InfiniteVersion)(InfVerDropDown.SelectedIndex + 1);
header.InfVersion = InfVerDropDown.SelectedIndex == 0 ? InfiniteVersion.Mxm : (InfiniteVersion)(InfVerDropDown.SelectedIndex + 1);
header.DistributionDate = DistributionPicker.Value;
header.BackgroundId = short.Parse((BackgroundDropDown.SelectedItem ?? "0").ToString().Split(' ')[0]);
header.Volume = (short)VolumeTrackBar.Value;
VolumeIndicatorLabel.Text = $"{VolumeTrackBar.Value:#00}%";
Pristine = false;
_pristine = false;
}
private void OnLevelEditButtonClick(object sender, EventArgs e)
@ -575,10 +651,10 @@ namespace VoxCharger
header.Levels[difficulty] = editor.Result;
if (editor.Action != null)
{
if (!actions.ContainsKey(header.Ascii))
actions[header.Ascii] = new Queue<Action>();
if (!_actions.ContainsKey(header.Ascii))
_actions[header.Ascii] = new Queue<Action>();
actions[header.Ascii].Enqueue(editor.Action);
_actions[header.Ascii].Enqueue(editor.Action);
}
if (header.Levels.ContainsKey(Difficulty.Infinite))
@ -588,10 +664,10 @@ namespace VoxCharger
OnInfVerDropDownSelectedIndexChanged(sender, e);
Pristine = false;
_pristine = false;
LoadJacket(header);
if (Autosave)
if (_autosave)
Save(AssetManager.MdbFilename);
}
}
@ -606,18 +682,14 @@ namespace VoxCharger
InfEditButton.Text = InfVerDropDown.SelectedItem.ToString();
}
private void OnImport2DXMusicFileButtonClick(object sender, EventArgs e)
private void OnImportMusicFileButtonClick(object sender, EventArgs e)
{
Import2DX();
if (Autosave)
Save(AssetManager.MdbFilename);
ImportAudioFile();
}
private void OnImport2DXPreviewFileButtonClick(object sender, EventArgs e)
private void OnImportPreviewFileButtonClick(object sender, EventArgs e)
{
Import2DX(true);
if (Autosave)
Save(AssetManager.MdbFilename);
ImportAudioFile(true);
}
private void OnJacketPictureBoxClick(object sender, EventArgs e)
@ -648,8 +720,7 @@ namespace VoxCharger
#region --- Mix List Management ---
private void OnMusicListBoxSelectedIndexChanged(object sender, EventArgs e)
{
var header = MusicListBox.SelectedItem as VoxHeader;
if (header == null)
if (!(MusicListBox.SelectedItem is VoxHeader header))
{
MetadataGroupBox.Enabled = false;
ResetEditor();
@ -657,34 +728,78 @@ namespace VoxCharger
return;
}
IdTextBox.Text = header.ID.ToString();
TitleTextBox.Text = VoxHeader.FixMappedChars(header.Title);
ArtistTextBox.Text = VoxHeader.FixMappedChars(header.Artist);
BpmMinNumericBox.Value = (decimal)header.BpmMin;
BpmMaxNumericBox.Value = (decimal)header.BpmMax;
VersionDropDown.SelectedIndex = (int)(header.Version) - 1;
InfVerDropDown.SelectedIndex = header.InfVersion == InfiniteVersion.MXM ? 0 : (int)(header.InfVersion) - 1;
IdTextBox.Text = header.Id.ToString();
TitleTextBox.Text = VoxHeader.WithDecodedSymbols(header.Title);
TitleYomiganaTextBox.Text = VoxHeader.WithDecodedSymbols(header.TitleYomigana);
ArtistTextBox.Text = VoxHeader.WithDecodedSymbols(header.Artist);
ArtistYomiganaTextBox.Text = VoxHeader.WithDecodedSymbols(header.ArtistYomigana);
try
{
BpmMinNumericBox.Minimum = 1;
BpmMaxNumericBox.Minimum = 1;
BpmMinNumericBox.Value = (decimal)header.BpmMin;
BpmMaxNumericBox.Value = (decimal)header.BpmMax;
BpmMinNumericBox.Enabled = true;
BpmMaxNumericBox.Enabled = true;
}
catch (Exception)
{
BpmMinNumericBox.Minimum = 0;
BpmMaxNumericBox.Minimum = 0;
BpmMinNumericBox.Value = 0;
BpmMaxNumericBox.Value = 0;
BpmMinNumericBox.Enabled = false;
BpmMaxNumericBox.Enabled = false;
}
try
{
VersionDropDown.DropDownStyle = ComboBoxStyle.DropDownList;
InfVerDropDown.DropDownStyle = ComboBoxStyle.DropDownList;
VersionDropDown.SelectedIndex = (int)(header.Version) - 1;
InfVerDropDown.SelectedIndex = header.InfVersion == InfiniteVersion.Mxm ? 0 : (int)(header.InfVersion) - 1;
if (header.Levels.ContainsKey(Difficulty.Infinite))
InfVerDropDown.Items[0] = "MXM";
else
InfVerDropDown.Items[0] = "--";
VersionDropDown.Enabled = true;
InfVerDropDown.Enabled = true;
}
catch (Exception)
{
VersionDropDown.DropDownStyle = ComboBoxStyle.DropDown;
InfVerDropDown.DropDownStyle = ComboBoxStyle.DropDown;
VersionDropDown.Text = "--";
VersionDropDown.Enabled = false;
InfVerDropDown.Text = "--";
InfVerDropDown.Enabled = false;
}
DistributionPicker.Value = header.DistributionDate;
VolumeTrackBar.Value = header.Volume;
BackgroundDropDown.SelectedItem = $"{header.BackgroundId:D2}";
VolumeIndicatorLabel.Text = $"{VolumeTrackBar.Value:#00}%";
VolumeIndicatorLabel.Text = $"{VolumeTrackBar.Value:#00}%";
if (header.Levels.ContainsKey(Difficulty.Infinite))
InfVerDropDown.Items[0] = "MXM";
else
InfVerDropDown.Items[0] = "--";
bool safe = !string.IsNullOrEmpty(AssetManager.MixName);
AddButton.Enabled = safe;
AddEditMenu.Enabled = safe;
RemoveButton.Enabled = safe;
RemoveEditMenu.Enabled = safe;
Import2DXEditMenu.Enabled = safe;
Import2DXPreviewEditMenu.Enabled = safe;
ExplorerEditMenu.Enabled = true;
EditMenu.Enabled = true;
MetadataGroupBox.Enabled = true;
InfEditButton.Text = InfVerDropDown.SelectedItem.ToString();
bool safe = !string.IsNullOrEmpty(AssetManager.MixName);
AddButton.Enabled = safe;
AddEditMenu.Enabled = safe;
RemoveButton.Enabled = safe;
RemoveEditMenu.Enabled = safe;
ImportAudioEditMenu.Enabled = safe;
ImportAudioPreviewEditMenu.Enabled = safe;
ExplorerEditMenu.Enabled = true;
EditMenu.Enabled = true;
MetadataGroupBox.Enabled = true;
InfEditButton.Text = InfVerDropDown.SelectedItem.ToString();
LoadJacket(header);
}
@ -709,10 +824,10 @@ namespace VoxCharger
MusicListBox.Items.Remove(header);
// Clear pending modification, since this asset will be deleted anyway
actions[header.Ascii] = new Queue<Action>();
actions[header.Ascii].Enqueue(() => AssetManager.DeleteAssets(header));
_actions[header.Ascii] = new Queue<Action>();
_actions[header.Ascii].Enqueue(() => AssetManager.DeleteAssets(header));
if (Autosave)
if (_autosave)
Save(AssetManager.MdbFilename);
}
@ -728,18 +843,18 @@ namespace VoxCharger
{
using (var loader = new LoadingForm())
{
loader.SetAction(() =>
loader.SetAction(dialog =>
{
MusicListBox.Items.Clear();
foreach (var header in AssetManager.Headers)
{
MusicListBox.Items.Add(header);
loader.SetStatus(header.Title);
loader.SetProgress(((float)MusicListBox.Items.Count / AssetManager.Headers.Count) * 100f);
dialog.SetStatus(header.Title);
dialog.SetProgress(((float)MusicListBox.Items.Count / AssetManager.Headers.Count) * 100f);
}
loader.Complete();
dialog.Complete();
});
@ -752,14 +867,14 @@ namespace VoxCharger
var errors = new List<string>();
using (var loader = new LoadingForm())
{
var proc = new Action(() =>
var proc = new Action<LoadingForm>(dialog =>
{
float it = 1f;
foreach (var action in actions)
foreach (var action in _actions)
{
float progress = (it++ / actions.Count) * 100f;
loader.SetStatus($"[{progress:00}%] - Processing {action.Key} assets..");
loader.SetProgress(progress);
float progress = (it++ / _actions.Count) * 100f;
dialog.SetStatus($"[{progress:00}%] - Processing {action.Key} assets..");
dialog.SetProgress(progress);
var queue = action.Value;
while (queue.Count > 0)
@ -776,14 +891,14 @@ namespace VoxCharger
}
}
loader.SetStatus("[100%] - Processing Music DB..");
loader.SetProgress(100f);
dialog.SetStatus("[100%] - Processing Music DB..");
dialog.SetProgress(100f);
AssetManager.Headers.Save(dbFilename);
loader.Complete();
dialog.Complete();
});
loader.SetAction(() => new Thread(() => proc()).Start());
loader.SetAction(dialog => new Thread(() => proc(dialog)).Start());
loader.ShowDialog();
}
@ -796,13 +911,13 @@ namespace VoxCharger
MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
actions.Clear();
Pristine = true;
_actions.Clear();
_pristine = true;
return errors.Count == 0;
}
private void Import2DX(bool preview = false)
private void ImportAudioFile(bool preview = false)
{
var header = MusicListBox.SelectedItem as VoxHeader;
if (header == null)
@ -810,7 +925,7 @@ namespace VoxCharger
using (var browser = new OpenFileDialog())
{
browser.Filter = "All supported format|*.2dx;*.s3v;*.wav;*.ogg;*.mp3;*.flac|2DX Music File|*.2dx;*.s3v|Music Files|*.wav;*.ogg;*.mp3;*.flac";
browser.Filter = "All supported formats|*.2dx;*.s3v;*.asf;*.wav;*.ogg;*.mp3;*.flac|BEMANI Music Files|*.2dx;*.s3v|Music Files|*.wav;*.ogg;*.mp3;*.flac;*.asf";
browser.CheckFileExists = true;
if (browser.ShowDialog() != DialogResult.OK)
@ -823,10 +938,18 @@ namespace VoxCharger
);
File.Copy(source, tmp);
if (!actions.ContainsKey(header.Ascii))
actions[header.Ascii] = new Queue<Action>();
if (!_actions.ContainsKey(header.Ascii))
_actions[header.Ascii] = new Queue<Action>();
actions[header.Ascii].Enqueue(() => AssetManager.Import2DX(tmp, header, preview));
var importOptions = new AudioImportOptions
{
Format = browser.FileName.ToLower().EndsWith(".s3v") ? AudioFormat.S3V : AudioFormat.Iidx,
IsPreview = preview,
};
_actions[header.Ascii].Enqueue(() => AssetManager.ImportAudio(tmp, header, importOptions));
if (_autosave)
Save(AssetManager.MdbFilename);
}
}
@ -846,14 +969,14 @@ namespace VoxCharger
if (!header.Levels.ContainsKey(diff))
{
picture.Image = DummyJacket;
picture.Image = _dummyJacket;
continue;
}
try
{
string filename = $"{AssetManager.GetJacketPath(header, diff)}_s.png";
if (File.Exists(filename) && (Pristine || header.Levels[diff].Jacket == null))
if (File.Exists(filename) && (_pristine || header.Levels[diff].Jacket == null))
{
using (var image = Image.FromFile(filename))
picture.Image = new Bitmap(image);
@ -875,11 +998,11 @@ namespace VoxCharger
picture.Image = new Bitmap(image);
}
else
picture.Image = DummyJacket;
picture.Image = _dummyJacket;
}
catch (Exception)
{
picture.Image = DummyJacket;
picture.Image = _dummyJacket;
}
}
}
@ -890,24 +1013,24 @@ namespace VoxCharger
MetadataGroupBox.Enabled = false;
ResetEditor();
DisableUI();
DisableUi();
LoadMusicDb();
EnableUI();
EnableUi();
}
private void EnableUI()
private void EnableUi()
{
UpdateUI(true);
UpdateUi(true);
}
private void DisableUI()
private void DisableUi()
{
UpdateUI(false);
UpdateUi(false);
ResetEditor();
}
private void UpdateUI(bool state)
private void UpdateUi(bool state)
{
// Dont break your goddamn kfc
bool safe = !string.IsNullOrEmpty(AssetManager.MixName);
@ -925,8 +1048,8 @@ namespace VoxCharger
RemoveButton.Enabled = state && safe;
RemoveEditMenu.Enabled = state && safe;
EditMenu.Enabled = state && safe;
Import2DXEditMenu.Enabled = state && safe;
Import2DXPreviewEditMenu.Enabled = state && safe;
ImportAudioEditMenu.Enabled = state && safe;
ImportAudioPreviewEditMenu.Enabled = state && safe;
foreach (Control control in MetadataGroupBox.Controls)
{
@ -967,7 +1090,7 @@ namespace VoxCharger
if (control is PictureBox)
{
var pictureBox = control as PictureBox;
pictureBox.Image = DummyJacket;
pictureBox.Image = _dummyJacket;
}
else if (control is Button && control.Tag.ToString() == "4")
{
@ -979,8 +1102,8 @@ namespace VoxCharger
VolumeTrackBar.Value = DefaultVolume;
EditMenu.Enabled = false;
Import2DXEditMenu.Enabled = false;
Import2DXPreviewEditMenu.Enabled = false;
ImportAudioEditMenu.Enabled = false;
ImportAudioPreviewEditMenu.Enabled = false;
ExplorerEditMenu.Enabled = false;
}
#endregion

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,4 @@
using System;
using System.ComponentModel;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

View File

@ -1,19 +1,14 @@
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;
namespace VoxCharger
{
public partial class MixSelectorForm : Form
{
public int EXPANDED_HEIGHT = 165;
public int COLLAPSED_HEIGHT = 140;
public int ExpandedHeight = 165;
public int CollapsedHeight = 140;
public MixSelectorForm(bool createMode = false)
{
@ -27,7 +22,7 @@ namespace VoxCharger
MixSelectorDropDown.Visible = MixSelectorDropDown.Enabled = false;
ModSelectorLabel.Text = "Enter mix name:";
Size = new Size(Size.Width, COLLAPSED_HEIGHT);
Size = new Size(Size.Width, CollapsedHeight);
}
}
@ -40,9 +35,9 @@ namespace VoxCharger
private void OnModSelectorDropDownSelectedIndexChanged(object sender, EventArgs e)
{
if (MixSelectorDropDown.SelectedIndex == 0)
Size = new Size(Size.Width, EXPANDED_HEIGHT);
Size = new Size(Size.Width, ExpandedHeight);
else
Size = new Size(Size.Width, COLLAPSED_HEIGHT);
Size = new Size(Size.Width, CollapsedHeight);
NameTextBox.Visible = MixSelectorDropDown.SelectedIndex == 0;
ContinueButton.Enabled = true;

View File

@ -43,7 +43,7 @@ namespace VoxCharger
Export(header, null, options);
}
public void Export(VoxHeader header, Dictionary<Difficulty, ChartInfo> charts, ParseOption options = null)
public void Export(VoxHeader header, Dictionary<Difficulty, ChartInfo> charts, ParseOption options = null, AudioImportOptions importOptions = null)
{
// Assign level info and charts
foreach (var chart in charts)
@ -74,10 +74,10 @@ namespace VoxCharger
{
var info = chart.Value;
// Make sure to reuse 2dx file for music that share same file
// Make sure to reuse 2dx / s3v file for music that share same file
if (string.IsNullOrEmpty(musicFile) || chart.Value.MusicFileName != musicFile)
{
string music = Path.Combine(Path.GetDirectoryName(info.FileName), info.Source.MusicFileName);
string music = Path.Combine(Path.GetDirectoryName(info.FileName) ?? "", info.Source.MusicFileName);
if (File.Exists(music))
{
string tmp = Path.Combine(
@ -111,7 +111,7 @@ namespace VoxCharger
}
}
Action = new Action(() =>
Action = () =>
{
bool unique = false;
musicFile = charts.Values.First().MusicFileName;
@ -130,22 +130,27 @@ namespace VoxCharger
// Make sure to use single asset for music for shared music file
if (!unique)
{
AssetManager.Import2DX(musicFile, header);
AssetManager.Import2DX(musicFile, header, true);
AssetManager.ImportAudio(musicFile, header, importOptions);
AssetManager.ImportAudio(musicFile, header, (importOptions ?? AudioImportOptions.Default).AsPreview());
}
foreach (var chart in charts.Values)
var highest = charts.Max(e => e.Key);
foreach (var entry in charts)
{
var chart = entry.Value;
if (unique && File.Exists(chart.MusicFileName))
{
AssetManager.Import2DX(chart.MusicFileName, header, chart.Header.Difficulty);
AssetManager.Import2DX(chart.MusicFileName, header, chart.Header.Difficulty, true);
AssetManager.ImportAudio(chart.MusicFileName, header, chart.Header.Difficulty, importOptions);
// Use shared preview using highest level music file
if (entry.Key == highest)
AssetManager.ImportAudio(chart.MusicFileName, header, (importOptions ?? AudioImportOptions.Default).AsPreview());
}
if (chart.Header.Jacket != null)
AssetManager.ImportJacket(header, chart.Header.Difficulty, chart.Header.Jacket);
}
});
};
}
public static Dictionary<Difficulty, ChartInfo> GetCharts(string dir, string title)

View File

@ -12,6 +12,9 @@ namespace VoxCharger
private static readonly Encoding DefaultEncoding = Encoding.GetEncoding("Shift_JIS");
private const string VolPositions = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmno";
private const int DefaultBackgroundId = 88;
private const int DefaultGenre = 16;
public string Title { get; set; }
public string Artist { get; set; }
public string Effector { get; set; }
@ -31,13 +34,45 @@ namespace VoxCharger
public class ParseOption
{
public class SoundFxOptions
{
public bool Chip { get; set; } = true;
public bool Long { get; set; } = true;
public bool Laser { get; set; } = true;
}
public class CameraOptions
{
public bool SlamImpact { get; set; } = true;
public Dictionary<Camera.WorkType, bool> EnabledWorks { get; set; } = new Dictionary<Camera.WorkType, bool>();
public bool IsEnabled(Camera.WorkType work)
{
// Non-configured work should be enabled by default
return !EnabledWorks.ContainsKey(work) || EnabledWorks[work];
}
}
public class TrackOptions
{
public Dictionary<Event.ButtonTrack, bool> EnabledButtonTracks { get; set; } = new Dictionary<Event.ButtonTrack, bool>();
public Dictionary<Event.LaserTrack, bool> EnabledLaserTracks { get; set; } = new Dictionary<Event.LaserTrack, bool>();
public bool IsButtonTrackEnabled(Event.ButtonTrack track)
{
return !EnabledButtonTracks.ContainsKey(track) || EnabledButtonTracks[track];
}
public bool IsLaserTrackEnabled(Event.LaserTrack track)
{
return !EnabledLaserTracks.ContainsKey(track) || EnabledLaserTracks[track];
}
}
public bool RealignOffset { get; set; } = false;
public bool EnableChipFx { get; set; } = true;
public bool EnableLongFx { get; set; } = true;
public bool EnableCamera { get; set; } = true;
public bool EnableSlamImpact { get; set; } = true;
public bool EnableLaserTrack { get; set; } = true;
public bool EnableButtonTrack { get; set; } = true;
public SoundFxOptions SoundFx { get; set; } = new SoundFxOptions();
public CameraOptions Camera { get; set; } = new CameraOptions();
public TrackOptions Track { get; set; } = new TrackOptions();
}
public Ksh()
@ -49,13 +84,15 @@ namespace VoxCharger
return new VoxHeader()
{
Title = Title,
TitleYomigana = "ダミー",
Artist = Artist,
ArtistYomigana = "ダミー",
BpmMin = BpmMin,
BpmMax = BpmMax,
Volume = Volume > 0 ? (short)Volume : (short)91,
DistributionDate = DateTime.Now,
BackgroundId = 63,
GenreId = 16,
BackgroundId = DefaultBackgroundId,
GenreId = DefaultGenre,
};
}
@ -73,19 +110,18 @@ namespace VoxCharger
public void Parse(string fileName, ParseOption opt = null)
{
// I pulled all nighters for few days, all for this piece of trash codes :)
// Reminder: there's lot of "offset" that can be ambigous between many contexts everywhere
// Reminder: there's lot of "offset" that can be ambiguous between many contexts everywhere
var lines = File.ReadAllLines(fileName, DefaultEncoding);
if (opt == null)
opt = new ParseOption();
Time time = new Time(1, 1, 0);
var time = Time.Initial;
var signature = new Event.TimeSignature(time, 4, 4);
var filter = Event.LaserFilter.Peak;
int rangeLeft = 0;
int rangeRight = 0;
var cameras = new Dictionary<Camera.WorkType, Camera>();
var lastCamera = new Dictionary<Camera.WorkType, Camera>();
var hitFx = new Dictionary<Event.ButtonTrack, KshSoundEffect>();
var holdFx = new Dictionary<Event.ButtonTrack, Effect>();
var longNotes = new Dictionary<Event.ButtonTrack, Event.Button>();
@ -147,7 +183,7 @@ namespace VoxCharger
{
// Might just pull it to first bar
if (time.Measure == 0)
time = new Time(1, 1, 0);
time = Time.Initial;
var data = line.Split('=');
if (data.Length < 2)
@ -209,9 +245,9 @@ namespace VoxCharger
if (BpmMax == 0f || t > BpmMax)
BpmMax = t;
if (!value.Contains("-"))
if (!value.Contains("-") && Events.GetBpm(new Time(time.Measure, time.Beat, 0))?.Value != t)
{
var bpm = new Event.BPM(new Time(time.Measure, time.Beat, 0), t); // beat still acceptable
var bpm = new Event.Bpm(new Time(time.Measure, time.Beat, 0), t); // beat still acceptable
Events.Add(bpm);
}
}
@ -222,11 +258,11 @@ namespace VoxCharger
break;
case "stop" when float.TryParse(value, out float duration):
Event.BPM start = null;
Event.Bpm start = null;
time = new Time(time.Measure, time.Beat, 0);
foreach (var ev in Events[time])
{
if (ev is Event.BPM x)
if (ev is Event.Bpm x)
{
start = x;
start.IsStop = true;
@ -236,20 +272,20 @@ namespace VoxCharger
if (start == null)
{
var last = Events.GetBPM(time);
var last = Events.GetBpm(time);
if (last == null)
break;
start = new Event.BPM(time, last.Value);
start = new Event.Bpm(time, last.Value);
start.IsStop = true;
Events.Add(start);
}
Event.BPM end = null;
Event.Bpm end = null;
var target = Time.FromOffset((int)duration, signature);
foreach (var ev in Events[target])
{
if (ev is Event.BPM x)
if (ev is Event.Bpm x)
{
end = x;
end.IsStop = false;
@ -259,11 +295,11 @@ namespace VoxCharger
if (end == null)
{
var last = Events.GetBPM(target);
var last = Events.GetBpm(target);
if (last == null)
break;
end = new Event.BPM(target, last.Value);
end = new Event.Bpm(target, last.Value);
end.IsStop = false;
Events.Add(end);
}
@ -284,7 +320,7 @@ namespace VoxCharger
break;
case "fx-l":
case "fx-r":
if (!opt.EnableLongFx)
if (!opt.SoundFx.Long)
break;
var htrack = prop == "fx-l" ? Event.ButtonTrack.FxL : Event.ButtonTrack.FxR;
@ -300,7 +336,7 @@ namespace VoxCharger
break;
case "fx-l_se":
case "fx-r_se":
if (!opt.EnableChipFx)
if (!opt.SoundFx.Chip)
break;
var fxTrack = prop == "fx-l_se" ? Event.ButtonTrack.FxL : Event.ButtonTrack.FxR;
@ -316,6 +352,12 @@ namespace VoxCharger
break;
case "filtertype":
if (!opt.SoundFx.Laser)
{
filter = Event.LaserFilter.None;
break;
}
switch (value.Trim())
{
case "peak": filter = Event.LaserFilter.Peak; break;
@ -335,13 +377,29 @@ namespace VoxCharger
#endregion
#region --- Camera ---
case "tilt" when !float.TryParse(value.Trim(), out float _):
if (!opt.EnableCamera)
if (!opt.Camera.IsEnabled(Camera.WorkType.Tilt))
break;
switch (value.Trim()) // everything untested
// We need manually correct the tilt because TiltMode in-game is not reliable
cameras.TryGetValue(Camera.WorkType.Tilt, out var lastTilt);
// Clear the camera cache, leave the previous tilt duration to 0
cameras[Camera.WorkType.Tilt] = null;
switch (value.Trim()) // tested with limited scenario
{
case "zero":
case "normal":
// Tilt mode normal seems ignored by the game
Events.Add(new Event.TiltMode(time, Event.TiltType.Normal));
// Instead, we reset the previously applied tilt manually
Events.Add(new Camera.Tilt(time, 0, lastTilt?.End ?? 0.00f, 0.00f));
// Add padding to our reset tilt camera
var tiltPadding = new Camera.Tilt(time, 48, 0.00f, 0.00f);
Events.Add(tiltPadding);
break;
case "bigger":
Events.Add(new Event.TiltMode(time, Event.TiltType.Large));
@ -356,139 +414,72 @@ namespace VoxCharger
case "zoom_top": // CAM_RotX
case "zoom_bottom": // CAM_Radi
case "lane_toggle": // LaneY
if (!opt.EnableCamera)
if (!float.TryParse(value, out float cameraVal))
break;
if (!float.TryParse(value, out float cameraOffset))
break;
Camera.WorkType work = Camera.WorkType.None;
var work = Camera.WorkType.None;
switch (prop)
{
case "zoom_top":
work = Camera.WorkType.Rotation;
cameraOffset /= 150.0f;
cameraVal /= 100.0f;
break;
case "zoom_bottom":
work = Camera.WorkType.Radian;
cameraOffset /= -150.0f;
cameraVal /= -100.0f;
break;
case "tilt":
work = Camera.WorkType.Tilt;
cameraOffset /= 1.0f; // untested
cameraVal /= -1.0f; // untested
break;
case "lane_toggle":
work = Camera.WorkType.LaneClear; // untested too
break;
}
if (!opt.Camera.IsEnabled(work))
break;
Camera camera = null;
cameras.TryGetValue(work, out var lastCamera);
switch (work)
{
case Camera.WorkType.Rotation:
case Camera.WorkType.Radian:
case Camera.WorkType.Tilt:
camera = Camera.Create(work, time, maxDuration, cameraOffset, cameraOffset);
camera = Camera.Create(work, time, 0, cameraVal, cameraVal);
break;
case Camera.WorkType.LaneClear:
camera = new Camera.LaneClear(time, (int)cameraOffset, 0.00f, 1024.00f);
camera = new Camera.LaneClear(time, (int)cameraVal, 0.00f, 1024.00f);
break;
}
if (!cameras.ContainsKey(work))
if (camera == null)
break;
int currentOffset = time.GetAbsoluteOffset(Events.GetTimeSignature(time));
if (lastCamera != null)
{
cameras[work] = null;
lastCamera[work] = camera;
Events.Add(camera);
int lastOffset = lastCamera.Time.GetAbsoluteOffset(Events.GetTimeSignature(lastCamera.Time));
int diff = Math.Abs(currentOffset - lastOffset);
continue;
}
var pairCamera = cameras[work];
if (pairCamera == null)
{
switch (work)
{
case Camera.WorkType.Rotation:
case Camera.WorkType.Radian:
case Camera.WorkType.Tilt:
cameras[work] = Camera.Create(work, time, -1, cameraOffset, cameraOffset);
break;
case Camera.WorkType.LaneClear:
var ev = new Camera.LaneClear(time, (int)cameraOffset, 1024.00f, 0.00f);
cameras[work] = ev;
Events.Add(ev);
break;
}
lastCamera.End = cameraVal;
lastCamera.Duration = diff;
}
else
{
// Can't really use Time.Difference since time signature can be different across different measures
float curOffset = time.GetAbsoluteOffset(signature);
float pairOffset = pairCamera.Time.GetAbsoluteOffset(Events.GetTimeSignature(pairCamera.Time));
// Tilt might be reset via TiltMode event
var timePair = work != Camera.WorkType.Tilt ? Time.Initial : time;
int offsetPair = work != Camera.WorkType.Tilt ? currentOffset : Math.Abs(currentOffset - timePair.GetAbsoluteOffset(Events.GetTimeSignature(timePair)));
if (work == Camera.WorkType.LaneClear)
{
camera.Start = pairCamera.End;
camera.End = pairCamera.Start;
var init = Camera.Create(work, timePair, 0, 0.00f, cameraVal);
var pair = Camera.Create(work, timePair, offsetPair, cameraVal, cameraVal);
if ((int)Math.Abs(curOffset - pairOffset) != pairCamera.Duration)
{
var fill = new Camera.LaneClear(null, 0, pairCamera.End, camera.Start);
var fillOffset = pairOffset + pairCamera.Duration;
var timeSig = Events.GetTimeSignature((int)(fillOffset / 192f));
fill.Time = Time.FromOffset(fillOffset, timeSig);
fill.Duration = (int)Math.Abs(curOffset - fill.Time.GetAbsoluteOffset(timeSig));
Events.Add(fill);
}
cameras[work] = camera;
Events.Add(camera);
break;
}
// Assign camera properties
camera.Time = pairCamera.Time;
camera.Duration = (int)Math.Abs(curOffset - pairOffset);
camera.Start = pairCamera.Start;
// Find gap between last camera event
var prevCamera = lastCamera[work];
float lastOffset = prevCamera.Time.GetAbsoluteOffset(Events.GetTimeSignature(prevCamera.Time));
int diff = (int)Math.Abs(pairOffset - lastOffset);
// There's seems to be gap
if (prevCamera != null && prevCamera.Duration != diff)
{
// Check gap, is indeed something that we can fill
if (prevCamera.Duration < diff)
{
// Adjust time and duration to fill the gap, make sure to use correct time signature!
var fill = Camera.Create(work, time, 0, prevCamera.End, pairCamera.Start);
var fillOffset = lastOffset + prevCamera.Duration;
var timeSig = Events.GetTimeSignature((int)(fillOffset / 192f));
fill.Time = Time.FromOffset(fillOffset, timeSig);
fill.Duration = (int)Math.Abs(pairOffset - fill.Time.GetAbsoluteOffset(timeSig));
Events.Add(fill);
}
// The previous duration is overlap with current time, readjust previous event duration
else
{
prevCamera.Duration = diff;
prevCamera.End = camera.Start;
}
}
cameras[work] = null;
lastCamera[work] = camera;
Events.Add(camera);
Events.Add(init, pair);
}
cameras[work] = camera;
Events.Add(camera);
break;
#endregion
}
@ -532,9 +523,6 @@ namespace VoxCharger
#region --- BT & FX ---
for (int channel = 0; channel < 7; channel++)
{
if (!opt.EnableButtonTrack)
break;
Event.ButtonTrack track;
switch(channel)
{
@ -547,6 +535,9 @@ namespace VoxCharger
default: continue;
}
if (!opt.Track.IsButtonTrackEnabled(track))
continue;
// FxL and FxR accept any char for long note
if (!int.TryParse(line[channel].ToString(), out int flag) && (track != Event.ButtonTrack.FxL && track != Event.ButtonTrack.FxR))
continue;
@ -625,8 +616,8 @@ namespace VoxCharger
#region --- Laser ---
foreach (var track in new[] { Event.LaserTrack.Left, Event.LaserTrack.Right })
{
if (!opt.EnableLaserTrack)
break;
if (!opt.Track.IsLaserTrackEnabled(track))
continue;
int channel = track == Event.LaserTrack.Left ? 8 : 9;
int range = track == Event.LaserTrack.Left ? rangeLeft : rangeRight;
@ -637,7 +628,7 @@ namespace VoxCharger
if (flag == ':')
continue;
if (line.Length >= 13 && opt.EnableSlamImpact)
if (line.Length >= 13 && opt.Camera.SlamImpact)
{
// Ignore direction, use slam offset instead
char f = line[10];
@ -674,7 +665,7 @@ namespace VoxCharger
range
);
laser.Slam = noteCount >= 32;
laser.IsLaserSlam = noteCount >= 32;
if (flag != '-')
{
// Determine laser offset
@ -757,7 +748,7 @@ namespace VoxCharger
// Due to terrible ksh format for slam that appear in 1/32 or shorter
// the output of conversion may have 6 cells gap apart each other
// TODO: Use offset instead of Time.Difference, cuz it might start and finish in different measure
if (start.Slam && end.Slam && end.Time.Difference(start.Time, timeSig) <= 6)
if (start.IsLaserSlam && end.IsLaserSlam && end.Time.Difference(start.Time, timeSig) <= 6)
{
// Pull one of the offset
// In some rare cases, not pulling the offset will ended up normal laser instead of slam, especially in slow bpm

View File

@ -8,13 +8,13 @@ namespace VoxCharger
{
public class KshDefinition
{
private Dictionary<string, string> definitions;
private Dictionary<string, string> _definitions;
public bool IsNormalized { get; set; } = true;
public string Value { get; private set; }
public KshDefinition(string data)
{
definitions = new Dictionary<string, string>();
_definitions = new Dictionary<string, string>();
foreach (string p in data.Split(';'))
{
var prop = p.Split('=');
@ -26,7 +26,7 @@ namespace VoxCharger
continue;
}
definitions.Add(
_definitions.Add(
prop[0].Trim(),
prop[1].Trim()
);
@ -36,9 +36,9 @@ namespace VoxCharger
public bool GetString(string pname, out string result)
{
result = string.Empty;
if (definitions.ContainsKey(pname))
if (_definitions.ContainsKey(pname))
{
result = definitions[pname];
result = _definitions[pname];
return true;
}
@ -48,9 +48,9 @@ namespace VoxCharger
public bool GetValue(string pname, out int result)
{
result = 0;
if (definitions.ContainsKey(pname))
if (_definitions.ContainsKey(pname))
{
string str = GetDominantValue(definitions[pname]);
string str = GetDominantValue(_definitions[pname]);
if (str.Contains('/'))
return GetFraction(pname, out result);
else if (str.Contains('%'))
@ -67,9 +67,9 @@ namespace VoxCharger
public bool GetValue(string pname, out float result)
{
result = 0;
if (definitions.ContainsKey(pname))
if (_definitions.ContainsKey(pname))
{
string str = GetDominantValue(definitions[pname]);
string str = GetDominantValue(_definitions[pname]);
if (str.Contains('/'))
return GetFraction(pname, out result);
else if (str.Contains('%'))
@ -110,9 +110,9 @@ namespace VoxCharger
public bool GetFraction(string pname, out int numerator, out int denominator)
{
denominator = numerator = 0;
if (definitions.ContainsKey(pname))
if (_definitions.ContainsKey(pname))
{
var data = definitions[pname].Split('/');
var data = _definitions[pname].Split('/');
return data.Length == 2 && int.TryParse(data[0], out numerator) && int.TryParse(data[1], out denominator);
}
@ -122,9 +122,9 @@ namespace VoxCharger
public bool GetFraction(string pname, out float numerator, out float denominator)
{
denominator = numerator = 0f;
if (definitions.ContainsKey(pname))
if (_definitions.ContainsKey(pname))
{
var data = definitions[pname].Split('/');
var data = _definitions[pname].Split('/');
return data.Length == 2 && float.TryParse(data[0], out numerator) && float.TryParse(data[1], out denominator);
}
@ -134,9 +134,9 @@ namespace VoxCharger
public bool GetPercentage(string pname, out int result)
{
result = 0;
if (definitions.ContainsKey(pname))
if (_definitions.ContainsKey(pname))
{
string str = definitions[pname];
string str = _definitions[pname];
if (float.TryParse(str.Replace("%", string.Empty), out float percentage))
{
result = IsNormalized ? (int)(percentage / 100f) : (int)percentage;
@ -150,9 +150,9 @@ namespace VoxCharger
public bool GetPercentage(string pname, out float result)
{
result = 0f;
if (definitions.ContainsKey(pname))
if (_definitions.ContainsKey(pname))
{
string str = definitions[pname];
string str = _definitions[pname];
if (float.TryParse(str.Replace("%", string.Empty), out result))
{
result = IsNormalized ? result / 100f : result;

View File

@ -8,6 +8,7 @@ namespace VoxCharger
InfiniteInfection = 2,
GravityWars = 3,
HeavenlyHaven = 4,
VividWave = 5
VividWave = 5,
ExceedGear = 6
}
}

View File

@ -8,10 +8,11 @@ namespace VoxCharger
{
public enum InfiniteVersion
{
MXM = 0,
INF = 2,
GRV = 3,
HVN = 4,
VVD = 5
Mxm = 0,
Inf = 2,
Grv = 3,
Hvn = 4,
Vvd = 5,
Xcd = 6,
}
}

View File

@ -14,21 +14,21 @@ namespace VoxCharger
private const string DummyYomigana = "ダミー";
private static readonly Encoding DefaultEncoding = Encoding.GetEncoding("Shift_JIS");
private Dictionary<int, VoxHeader> headers;
private int max = 0;
private Dictionary<int, VoxHeader> _headers;
private int _max = 0;
public int Count => headers.Count;
public int Count => _headers.Count;
public int LastID => headers.Values.Max(h => h.ID);
public int LastId => _headers.Values.Max(h => h.Id);
public MusicDb()
{
headers = new Dictionary<int, VoxHeader>();
_headers = new Dictionary<int, VoxHeader>();
}
public void Load(string path, bool append = false)
{
headers = append ? headers : new Dictionary<int, VoxHeader>();
_headers = append ? _headers : new Dictionary<int, VoxHeader>();
var doc = new XmlDocument();
using (var reader = new StreamReader(path, DefaultEncoding))
{
@ -39,15 +39,17 @@ namespace VoxCharger
foreach (XmlNode music in doc.SelectSingleNode("mdb"))
{
int id = int.Parse(music.Attributes["id"].Value);
if (append && headers.ContainsKey(id))
if (append && _headers.ContainsKey(id))
continue;
var info = music.SelectSingleNode("info");
var header = new VoxHeader
{
ID = id,
Id = id,
Title = info.SelectSingleNode("title_name").InnerText,
TitleYomigana = info.SelectSingleNode("title_yomigana").InnerText,
Artist = info.SelectSingleNode("artist_name").InnerText,
ArtistYomigana = info.SelectSingleNode("artist_yomigana").InnerText,
Ascii = info.SelectSingleNode("ascii").InnerText,
DistributionDate = DateTime.ParseExact(info.SelectSingleNode("distribution_date").InnerText, "yyyyMMdd", CultureInfo.InvariantCulture),
Volume = short.Parse(info.SelectSingleNode("volume").InnerText),
@ -57,11 +59,15 @@ namespace VoxCharger
InfVersion = (InfiniteVersion)int.Parse(info.SelectSingleNode("inf_ver").InnerText),
};
// For some reason, konmai decide to use int32 with thousands value for the BPM, e.g 18000 to represent 180.00 BPM
// Why? I don't know, probably the usual fuckery
string bpmMax = info.SelectSingleNode("bpm_max").InnerText;
header.BpmMax = double.Parse($"{bpmMax.Substring(0, bpmMax.Length - 2)}.{bpmMax.Substring(bpmMax.Length - 2)}");
header.BpmMax = header.BpmMax >= 1000 ? header.BpmMax / 100D : header.BpmMax;
string bpmMin = info.SelectSingleNode("bpm_min").InnerText;
header.BpmMin = double.Parse($"{bpmMin.Substring(0, bpmMin.Length - 2)}.{bpmMin.Substring(bpmMin.Length - 2)}");
header.BpmMin = header.BpmMin >= 1000 ? header.BpmMin / 100D : header.BpmMin;
header.Levels = new Dictionary<Difficulty, VoxLevelHeader>();
foreach (XmlNode diffInfo in music.SelectSingleNode("difficulty"))
@ -84,10 +90,28 @@ namespace VoxCharger
Level = int.Parse(diffInfo.SelectSingleNode("difnum").InnerText),
Effector = diffInfo.SelectSingleNode("effected_by").InnerText,
Illustrator = diffInfo.SelectSingleNode("illustrator").InnerText,
Limited = int.Parse(diffInfo.SelectSingleNode("limited").InnerText),
Price = int.Parse(diffInfo.SelectSingleNode("price").InnerText),
Limited = int.Parse(diffInfo.SelectSingleNode("limited").InnerText),
JacketPrint = int.Parse(diffInfo.SelectSingleNode("jacket_print").InnerText),
JacketMask = int.Parse(diffInfo.SelectSingleNode("jacket_mask").InnerText),
};
if (diffInfo.SelectSingleNode("radar") != null)
{
var radar = diffInfo.SelectSingleNode("radar");
lvHeader.Radar = new VoxLevelRadar()
{
Notes = byte.Parse(radar.SelectSingleNode("notes").InnerText),
Peak = byte.Parse(radar.SelectSingleNode("peak").InnerText),
Lasers = byte.Parse(radar.SelectSingleNode("tsumami").InnerText),
Tricky = byte.Parse(radar.SelectSingleNode("tricky").InnerText),
HandTrip = byte.Parse(radar.SelectSingleNode("hand-trip").InnerText),
OneHand = byte.Parse(radar.SelectSingleNode("one-hand").InnerText),
};
}
if (lvHeader.Level <= 0)
continue; // Invalid level?
@ -103,49 +127,49 @@ namespace VoxCharger
var doc = new XmlDocument();
var master = doc.CreateElement("mdb");
var CreateMetaElement = new Func<XmlDocument, string, string, string, XmlElement>((d, n, v, t) =>
var createMetaElement = new Func<XmlDocument, string, string, string, XmlElement>((d, n, v, t) =>
{
var prop = doc.CreateElement(n);
var value = doc.CreateTextNode(v);
if (v != null)
prop.AppendChild(doc.CreateTextNode(v));
prop.AppendChild(value);
if (!string.IsNullOrEmpty(t))
prop.SetAttribute("__type", t);
return prop;
});
foreach (var header in headers.Values)
foreach (var header in _headers.Values)
{
if (header == null)
continue;
var music = doc.CreateElement("music");
music.SetAttribute("id", header.ID.ToString());
music.SetAttribute("id", header.Id.ToString());
var info = doc.CreateElement("info");
info.AppendChild(CreateMetaElement(doc, "label", header.ID.ToString(), string.Empty));
info.AppendChild(CreateMetaElement(doc, "title_name", header.Title, string.Empty));
info.AppendChild(CreateMetaElement(doc, "title_yomigana", DummyYomigana, string.Empty));
info.AppendChild(CreateMetaElement(doc, "artist_name", header.Artist, string.Empty));
info.AppendChild(CreateMetaElement(doc, "artist_yomigana", DummyYomigana, string.Empty));
info.AppendChild(CreateMetaElement(doc, "ascii", header.Ascii, string.Empty));
info.AppendChild(CreateMetaElement(doc, "bpm_max", header.BpmMax.ToString("000.00").Replace(".", string.Empty), "u32"));
info.AppendChild(CreateMetaElement(doc, "bpm_min", header.BpmMin.ToString("000.00").Replace(".", string.Empty), "u32"));
info.AppendChild(CreateMetaElement(doc, "distribution_date", header.DistributionDate.ToString("yyyyMMdd"), "u32"));
info.AppendChild(CreateMetaElement(doc, "volume", header.Volume.ToString(), "u16"));
info.AppendChild(CreateMetaElement(doc, "bg_no", header.BackgroundId.ToString(), "u16"));
info.AppendChild(CreateMetaElement(doc, "genre", header.GenreId.ToString(), "u8"));
info.AppendChild(CreateMetaElement(doc, "is_fixed", "1", "u8"));
info.AppendChild(CreateMetaElement(doc, "version", ((int)header.Version).ToString(), "u8"));
info.AppendChild(CreateMetaElement(doc, "demo_pri", "0", "s8"));
info.AppendChild(CreateMetaElement(doc, "inf_ver", ((int)header.InfVersion).ToString(), "u8"));
info.AppendChild(createMetaElement(doc, "label", header.Id.ToString(), string.Empty));
info.AppendChild(createMetaElement(doc, "title_name", header.Title, string.Empty));
info.AppendChild(createMetaElement(doc, "title_yomigana", header.TitleYomigana, string.Empty));
info.AppendChild(createMetaElement(doc, "artist_name", header.Artist, string.Empty));
info.AppendChild(createMetaElement(doc, "artist_yomigana", header.ArtistYomigana, string.Empty));
info.AppendChild(createMetaElement(doc, "ascii", header.Ascii, string.Empty));
info.AppendChild(createMetaElement(doc, "bpm_max", header.BpmMax.ToString("000.00").Replace(".", string.Empty).Replace(",", string.Empty), "u32"));
info.AppendChild(createMetaElement(doc, "bpm_min", header.BpmMin.ToString("000.00").Replace(".", string.Empty).Replace(",", string.Empty), "u32"));
info.AppendChild(createMetaElement(doc, "distribution_date", header.DistributionDate.ToString("yyyyMMdd"), "u32"));
info.AppendChild(createMetaElement(doc, "volume", header.Volume.ToString(), "u16"));
info.AppendChild(createMetaElement(doc, "bg_no", header.BackgroundId.ToString(), "u16"));
info.AppendChild(createMetaElement(doc, "genre", header.GenreId.ToString(), "u8"));
info.AppendChild(createMetaElement(doc, "is_fixed", "1", "u8"));
info.AppendChild(createMetaElement(doc, "version", ((int)header.Version).ToString(), "u8"));
info.AppendChild(createMetaElement(doc, "demo_pri", "0", "s8"));
info.AppendChild(createMetaElement(doc, "inf_ver", ((int)header.InfVersion).ToString(), "u8"));
var diffInfo = doc.CreateElement("difficulty");
foreach (Difficulty difficulty in Enum.GetValues(typeof(Difficulty)))
{
string diffName = Enum.GetName(typeof(Difficulty), difficulty).ToLower();
if (difficulty == Difficulty.Infinite && header.InfVersion == InfiniteVersion.MXM)
if (difficulty == Difficulty.Infinite && header.InfVersion == InfiniteVersion.Mxm)
diffName = "maximum";
var detail = doc.CreateElement(diffName);
@ -153,11 +177,24 @@ namespace VoxCharger
if (header.Levels.ContainsKey(difficulty))
lvHeader = header.Levels[difficulty];
detail.AppendChild(CreateMetaElement(doc, "difnum", lvHeader.Level.ToString(), "u8"));
detail.AppendChild(CreateMetaElement(doc, "illustrator", lvHeader.Illustrator, string.Empty));
detail.AppendChild(CreateMetaElement(doc, "effected_by", lvHeader.Effector, string.Empty));
detail.AppendChild(CreateMetaElement(doc, "price", lvHeader.Price.ToString(), "s32"));
detail.AppendChild(CreateMetaElement(doc, "limited", lvHeader.Limited.ToString(), "u8"));
detail.AppendChild(createMetaElement(doc, "difnum", lvHeader.Level.ToString(), "u8"));
detail.AppendChild(createMetaElement(doc, "illustrator", lvHeader.Illustrator, string.Empty));
detail.AppendChild(createMetaElement(doc, "effected_by", lvHeader.Effector, string.Empty));
detail.AppendChild(createMetaElement(doc, "price", lvHeader.Price.ToString(), "s32"));
detail.AppendChild(createMetaElement(doc, "limited", lvHeader.Limited.ToString(), "u8"));
detail.AppendChild(createMetaElement(doc, "jacket_print", lvHeader.JacketPrint.ToString(), "s32"));
detail.AppendChild(createMetaElement(doc, "jacket_mask", lvHeader.JacketMask.ToString(), "s32"));
if (lvHeader.Radar != null)
{
var radar = detail.AppendChild(createMetaElement(doc, "radar", null, null));
radar.AppendChild(createMetaElement(doc, "notes", lvHeader.Radar.Notes.ToString(), "u8"));
radar.AppendChild(createMetaElement(doc, "peak", lvHeader.Radar.Peak.ToString(), "u8"));
radar.AppendChild(createMetaElement(doc, "tsumami", lvHeader.Radar.Lasers.ToString(), "u8"));
radar.AppendChild(createMetaElement(doc, "tricky", lvHeader.Radar.Tricky.ToString(), "u8"));
radar.AppendChild(createMetaElement(doc, "hand-trip", lvHeader.Radar.HandTrip.ToString(), "u8"));
radar.AppendChild(createMetaElement(doc, "one-hand", lvHeader.Radar.OneHand.ToString(), "u8"));
}
diffInfo.AppendChild(detail);
}
@ -168,7 +205,7 @@ namespace VoxCharger
master.AppendChild(music);
}
var settings = new XmlWriterSettings { Indent = true };
var settings = new XmlWriterSettings { Indent = true, Encoding = DefaultEncoding };
using (var output = new StreamWriter(filename, false, DefaultEncoding))
using (var writer = XmlWriter.Create(output, settings))
{
@ -179,54 +216,54 @@ namespace VoxCharger
public void Add(VoxHeader header)
{
if (max < header.ID)
max = header.ID;
if (_max < header.Id)
_max = header.Id;
headers[header.ID] = header;
_headers[header.Id] = header;
}
public void Remove(int id)
{
if (max == id)
max = 0;
if (_max == id)
_max = 0;
headers.Remove(id);
_headers.Remove(id);
}
public void Remove(VoxHeader header)
{
Remove(header.ID);
Remove(header.Id);
}
public bool Contains(int id)
{
return headers.ContainsKey(id);
return _headers.ContainsKey(id);
}
public bool Contains(VoxHeader header)
{
return Contains(header.ID);
return Contains(header.Id);
}
public VoxHeader GetHeader(int id)
{
return headers[id];
return _headers[id];
}
public void Clear()
{
// Clear the list but not the last id
headers.Clear();
_headers.Clear();
}
public IEnumerator<VoxHeader> GetEnumerator()
{
return headers.Values.GetEnumerator();
return _headers.Values.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
IEnumerator IEnumerable.GetEnumerator()
{
return headers.Values.GetEnumerator();
return _headers.Values.GetEnumerator();
}
}
}

View File

@ -6,40 +6,40 @@ namespace VoxCharger
{
public enum Section
{
NO_STATE = -1,
FORMAT_VERSION = 0,
BEAT_INFO = 1,
BPM_INFO = 2,
TILT = 3,
LYRIC = 4,
END_POSITION = 5,
TAB_EFFECT = 6,
FXBUTTON_EFFECT = 7,
TAB_PARAM = 8,
REVERB = 9,
TRACK1 = 10,
TRACK2 = 11,
TRACK3 = 12,
TRACK4 = 13,
TRACK5 = 14,
TRACK6 = 15,
TRACK7 = 16,
TRACK8 = 17,
TRACK_AUTO = 18,
SPCONTROLER = 19,
SOUND_ID = 20,
BPM = 21
NoState = -1,
FormatVersion = 0,
BeatInfo = 1,
BpmInfo = 2,
Tilt = 3,
Lyric = 4,
EndPosition = 5,
TabEffect = 6,
FxbuttonEffect = 7,
TabParam = 8,
Reverb = 9,
Track1 = 10,
Track2 = 11,
Track3 = 12,
Track4 = 13,
Track5 = 14,
Track6 = 15,
Track7 = 16,
Track8 = 17,
TrackAuto = 18,
Spcontroler = 19,
SoundId = 20,
Bpm = 21
}
public static bool IsTrackSection(Section section)
{
int value = (int)section;
return value >= (int)Section.TRACK1 && value <= (int)Section.TRACK_AUTO;
return value >= (int)Section.Track1 && value <= (int)Section.TrackAuto;
}
public static int GetTrackNumber(Section section)
{
return IsTrackSection(section) ? ((int)section + 1) - (int)Section.TRACK1 : -1;
return IsTrackSection(section) ? ((int)section + 1) - (int)Section.Track1 : -1;
}
}
}

View File

@ -12,7 +12,7 @@ namespace VoxCharger
private static readonly Encoding DefaultEncoding = Encoding.GetEncoding("shift_jis");
private const string VolCodes = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmno";
private readonly string[] Filters = new string[] { "peak", "lpf1", "lpf1", "hpf1", "hpf1", "lbic", "nof" };
private readonly string[] _filters = new string[] { "peak", "lpf1", "lpf1", "hpf1", "hpf1", "lbic", "nof" };
public int Version { get; private set; } = 10;
@ -36,7 +36,7 @@ namespace VoxCharger
public void Parse(string fileName)
{
var current = Section.NO_STATE;
var current = Section.NoState;
var lines = File.ReadAllLines(fileName, DefaultEncoding);
Event.Stop stop = null;
@ -49,9 +49,9 @@ namespace VoxCharger
// Identify current section
if (line.StartsWith("#"))
{
if (current == Section.NO_STATE)
if (current == Section.NoState)
{
var candidate = Section.NO_STATE;
var candidate = Section.NoState;
string header = line.Substring(1).Trim().Replace(' ', '_');
foreach (Section section in Enum.GetValues(typeof(Section)))
{
@ -66,13 +66,13 @@ namespace VoxCharger
candidate = section;
}
if (current == Section.NO_STATE)
if (current == Section.NoState)
current = candidate;
}
else
{
if (line == "#END")
current = Section.NO_STATE;
current = Section.NoState;
}
continue;
@ -90,7 +90,7 @@ namespace VoxCharger
#endregion
#region --- FORMAT VERSION ---
if (current == Section.FORMAT_VERSION)
if (current == Section.FormatVersion)
{
/*
* Format Version
@ -104,7 +104,7 @@ namespace VoxCharger
}
#endregion
#region --- BEAT INFO ---
else if (current == Section.BEAT_INFO)
else if (current == Section.BeatInfo)
{
/*
* Beat Info (a.k.a Signature)
@ -144,7 +144,7 @@ namespace VoxCharger
}
#endregion
#region --- BPM (Simple) ---
else if (current == Section.BPM)
else if (current == Section.Bpm)
{
/*
* BPM (Simple)
@ -171,11 +171,11 @@ namespace VoxCharger
if (!float.TryParse(line, out float value))
Debug.WriteLine($"[BPM] {i:D4}: Invalid BPM value");
else
Events.Add(new Event.BPM(new Time(1, 1, 0), value));
Events.Add(new Event.Bpm(new Time(1, 1, 0), value));
}
#endregion
#region --- BPM (Extended) ---
else if (current == Section.BPM_INFO)
else if (current == Section.BpmInfo)
{
/*
* BPM (Extended)
@ -249,11 +249,11 @@ namespace VoxCharger
}
}
Events.Add(new Event.BPM(time, value));
Events.Add(new Event.Bpm(time, value));
}
#endregion
#region --- TILT MODE INFO ---
else if (current == Section.TILT)
else if (current == Section.Tilt)
{
/*
* Tilt Mode
@ -291,7 +291,7 @@ namespace VoxCharger
}
#endregion
#region --- LYRIC INFO ---
else if (current == Section.LYRIC)
else if (current == Section.Lyric)
{
/*
* Lyric Info
@ -308,7 +308,7 @@ namespace VoxCharger
}
#endregion
#region --- END POSITION ---
else if (current == Section.END_POSITION)
else if (current == Section.EndPosition)
{
/*
* End Position
@ -325,7 +325,7 @@ namespace VoxCharger
}
#endregion
#region --- TAB EFFECT INFO ---
else if (current == Section.TAB_EFFECT)
else if (current == Section.TabEffect)
{
/*
* Tab Effect Info
@ -339,7 +339,7 @@ namespace VoxCharger
}
#endregion
#region --- FXBUTTON EFFECT INFO ---
else if (current == Section.FXBUTTON_EFFECT)
else if (current == Section.FxbuttonEffect)
{
/*
* FxButton Effect Info
@ -363,7 +363,7 @@ namespace VoxCharger
}
#endregion
#region --- TAB PARAM ASSIGN INFO ---
else if (current == Section.TAB_PARAM)
else if (current == Section.TabParam)
{
/*
* Tab Param Info
@ -377,7 +377,7 @@ namespace VoxCharger
}
#endregion
#region --- REVERB EFFECT PARAM ---
else if (current == Section.REVERB)
else if (current == Section.Reverb)
{
/*
* Reverb Effect
@ -388,7 +388,7 @@ namespace VoxCharger
}
#endregion
#region --- SPCONTROLLER INFO ---
else if (current == Section.SPCONTROLER)
else if (current == Section.Spcontroler)
{
/*
* SP Controller Info
@ -568,10 +568,10 @@ namespace VoxCharger
result += "#END\n\n";
result += "#BPM INFO\n";
Event.BPM lastBpm = null;
Event.Bpm lastBpm = null;
foreach (var ev in Events)
{
if (ev is Event.BPM bpm)
if (ev is Event.Bpm bpm)
{
lastBpm = bpm;
result += bpm.ToString() + "\n";
@ -679,7 +679,7 @@ namespace VoxCharger
foreach (var ev in Events)
{
if (ev is Camera camera && camera.Work == work)
result += camera.ToString() + "\n";
result += $"{camera}\n";
}
}

View File

@ -5,21 +5,23 @@ namespace VoxCharger
{
public class VoxHeader
{
public int ID { get; set; }
public string Title { get; set; }
public string Artist { get; set; }
public string Ascii { get; set; }
public double BpmMin { get; set; }
public double BpmMax { get; set; }
public DateTime DistributionDate { get; set; }
public short Volume { get; set; }
public short BackgroundId { get; set; }
public int GenreId { get; set; }
public GameVersion Version { get; set; } = GameVersion.VividWave;
public InfiniteVersion InfVersion { get; set; } = InfiniteVersion.MXM;
public int Id { get; set; }
public string Title { get; set; }
public string TitleYomigana { get; set; }
public string Artist { get; set; }
public string ArtistYomigana { get; set; }
public string Ascii { get; set; }
public double BpmMin { get; set; }
public double BpmMax { get; set; }
public DateTime DistributionDate { get; set; }
public short Volume { get; set; }
public short BackgroundId { get; set; }
public int GenreId { get; set; }
public GameVersion Version { get; set; } = GameVersion.ExceedGear;
public InfiniteVersion InfVersion { get; set; } = InfiniteVersion.Mxm;
public Dictionary<Difficulty, VoxLevelHeader> Levels { get; set; }
public string CodeName => $"{ID:D4}_{Ascii}";
public string CodeName => $"{Id:D4}_{Ascii}";
public VoxHeader()
{
@ -27,10 +29,10 @@ namespace VoxCharger
public override string ToString()
{
return FixMappedChars(Title);
return WithDecodedSymbols(Title);
}
public static string FixMappedChars(string input)
public static string WithDecodedSymbols(string input)
{
if (string.IsNullOrEmpty(input))
return input;
@ -69,5 +71,45 @@ namespace VoxCharger
return result;
}
public static string WithEncodedSymbols(string input)
{
if (string.IsNullOrEmpty(input))
return input;
var map = new Dictionary<string, string>
{
{"~", "\u203E"},
{"", "\u301C"},
{"ê", "\u49FA"},
{"ū", "\u5F5C"},
{"à", "\u66E6"},
{"è", "\u66E9"},
{"ê", "\u7F47"},
{"🐾", "\u8E94"},
{"á", "\u9A2B"},
{"Ø", "\u9A69"},
{"ā", "\u9A6B"},
{"ō", "\u9A6A"},
{"ü", "\u9AAD"},
{"ī", "\u9B2F"},
{"ē", "\u9EF7"},
{"Ú", "\u9F63"},
{"Ä", "\u9F67"},
{"♠", "\u973B"},
{"♣", "\u9F6A"},
{"♦", "\u9448"},
{"♥", "\u9F72"},
{"♡", "\u9F76"},
{"é", "\u9F77"},
{"êp", "?壬"}
};
string result = input;
foreach (var c in map)
result = result.Replace(c.Key, c.Value);
return result;
}
}
}

View File

@ -6,12 +6,27 @@ namespace VoxCharger
public class VoxLevelHeader
{
public Difficulty Difficulty { get; set; }
public int Level { get; set; } = 1;
public string Illustrator { get; set; } = "dummy";
public string Effector { get; set; } = "dummy";
public int Price { get; set; } = -1;
public int Limited { get; set; } = 3;
public VoxChart Chart { get; set; }
public Image Jacket { get; set; }
public int Level { get; set; } = 1;
public string Illustrator { get; set; } = "dummy";
public string Effector { get; set; } = "dummy";
public int Price { get; set; } = -1;
public int Limited { get; set; } = 3;
public int JacketPrint { get; set; } = -2;
public int JacketMask { get; set; } = 0;
public VoxLevelRadar Radar { get; set; }
public VoxChart Chart { get; set; }
public Image Jacket { get; set; }
}
public class VoxLevelRadar
{
public byte Notes { get; set; }
public byte Peak { get; set; }
public byte Lasers { get; set; }
public byte Tricky { get; set; }
public byte HandTrip { get; set; }
public byte OneHand { get; set; }
}
}

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<IntermediateOutputPath>.\Temp</IntermediateOutputPath>
@ -9,12 +10,13 @@
<OutputType>WinExe</OutputType>
<RootNamespace>VoxCharger</RootNamespace>
<AssemblyName>VoxCharger</AssemblyName>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<LangVersion>8</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<IntermediateOutputPath>.\Temp</IntermediateOutputPath>
@ -43,19 +45,167 @@
<PropertyGroup />
<PropertyGroup />
<ItemGroup>
<Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
</Reference>
<Reference Include="CustomMarshalers" />
<Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Win32.Registry, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Win32.Registry.4.7.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack, Version=1.1.4.0, Culture=neutral, PublicKeyToken=8985beaab7ea3f04, processorArchitecture=MSIL">
<HintPath>packages\Microsoft-WindowsAPICodePack-Core.1.1.4\lib\net462\Microsoft.WindowsAPICodePack.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=1.1.4.0, Culture=neutral, PublicKeyToken=8985beaab7ea3f04, processorArchitecture=MSIL">
<HintPath>packages\Microsoft-WindowsAPICodePack-Shell.1.1.4\lib\net462\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>
</Reference>
<Reference Include="mscorlib" />
<Reference Include="NAudio, Version=2.1.0.0, Culture=neutral, PublicKeyToken=e279aa5131008a41, processorArchitecture=MSIL">
<HintPath>packages\NAudio.2.1.0\lib\net472\NAudio.dll</HintPath>
</Reference>
<Reference Include="NAudio.Asio, Version=2.1.0.0, Culture=neutral, PublicKeyToken=e279aa5131008a41, processorArchitecture=MSIL">
<HintPath>packages\NAudio.Asio.2.1.0\lib\netstandard2.0\NAudio.Asio.dll</HintPath>
</Reference>
<Reference Include="NAudio.Core, Version=2.1.0.0, Culture=neutral, PublicKeyToken=e279aa5131008a41, processorArchitecture=MSIL">
<HintPath>packages\NAudio.Core.2.1.0\lib\netstandard2.0\NAudio.Core.dll</HintPath>
</Reference>
<Reference Include="NAudio.Midi, Version=2.1.0.0, Culture=neutral, PublicKeyToken=e279aa5131008a41, processorArchitecture=MSIL">
<HintPath>packages\NAudio.Midi.2.1.0\lib\netstandard2.0\NAudio.Midi.dll</HintPath>
</Reference>
<Reference Include="NAudio.Vorbis, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\NAudio.Vorbis.1.5.0\lib\netstandard2.0\NAudio.Vorbis.dll</HintPath>
</Reference>
<Reference Include="NAudio.Wasapi, Version=2.1.0.0, Culture=neutral, PublicKeyToken=e279aa5131008a41, processorArchitecture=MSIL">
<HintPath>packages\NAudio.Wasapi.2.1.0\lib\netstandard2.0\NAudio.Wasapi.dll</HintPath>
</Reference>
<Reference Include="NAudio.WinForms, Version=2.1.0.0, Culture=neutral, PublicKeyToken=e279aa5131008a41, processorArchitecture=MSIL">
<HintPath>packages\NAudio.WinForms.2.1.0\lib\net472\NAudio.WinForms.dll</HintPath>
</Reference>
<Reference Include="NAudio.WinMM, Version=2.1.0.0, Culture=neutral, PublicKeyToken=e279aa5131008a41, processorArchitecture=MSIL">
<HintPath>packages\NAudio.WinMM.2.1.0\lib\netstandard2.0\NAudio.WinMM.dll</HintPath>
</Reference>
<Reference Include="NVorbis, Version=0.10.4.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\NVorbis.0.10.4\lib\net45\NVorbis.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
</Reference>
<Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
</Reference>
<Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
</Reference>
<Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
</Reference>
<Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
</Reference>
<Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
</Reference>
<Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
</Reference>
<Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
</Reference>
<Reference Include="System.Security.AccessControl, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.AccessControl.4.7.0\lib\net461\System.Security.AccessControl.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
</Reference>
<Reference Include="System.Security.Principal.Windows, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Principal.Windows.4.7.0\lib\net461\System.Security.Principal.Windows.dll</HintPath>
</Reference>
<Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Xaml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="WindowsFormsIntegration" />
</ItemGroup>
<ItemGroup>
<Compile Include="Sources\AssetManager.cs" />
<Compile Include="Sources\Forms\MenuButton.cs">
<SubType>Component</SubType>
</Compile>
@ -71,8 +221,7 @@
<Compile Include="Sources\Forms\HelpForm.Designer.cs">
<DependentUpon>HelpForm.cs</DependentUpon>
</Compile>
<Compile Include="Sources\2dx\DxTool.cs" />
<Compile Include="Sources\AssetManager.cs" />
<Compile Include="Sources\Encoders\DxEncoder.cs" />
<Compile Include="Sources\Events\Controller\Camera.cs" />
<Compile Include="Sources\Events\Controller\Radian.cs" />
<Compile Include="Sources\Events\Controller\LaneClear.cs" />
@ -97,6 +246,7 @@
<Compile Include="Sources\Events\Signature.cs" />
<Compile Include="Sources\Events\Stop.cs" />
<Compile Include="Sources\Events\TiltMode.cs" />
<Compile Include="Sources\Encoders\S3VTool.cs" />
<Compile Include="Sources\Ksh\Exporter.cs" />
<Compile Include="Sources\Ksh\Ksh.cs" />
<Compile Include="Sources\Events\EventCollection.cs" />
@ -184,6 +334,8 @@
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="App.config" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
@ -195,12 +347,8 @@
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="2dxbuild.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="2dxwavconvert.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<Content Include="FodyWeavers.xml" />
<Content Include="README.md" />
<Content Include="Resources\icon.ico" />
<None Include="Resources\jk_dummy_s.png" />
<None Include="Resources\jk_dummy_b.png" />
@ -208,4 +356,14 @@
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="packages\Fody.6.5.5\build\Fody.targets" Condition="Exists('packages\Fody.6.5.5\build\Fody.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('packages\Fody.6.5.5\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.5.5\build\Fody.targets'))" />
<Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
<Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
</Target>
<Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
</Project>

70
packages.config Normal file
View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Costura.Fody" version="5.7.0" targetFramework="net472" developmentDependency="true" />
<package id="Fody" version="6.5.5" targetFramework="net472" developmentDependency="true" />
<package id="Microsoft-WindowsAPICodePack-Core" version="1.1.4" targetFramework="net47" />
<package id="Microsoft-WindowsAPICodePack-Shell" version="1.1.4" targetFramework="net47" />
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net472" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net472" />
<package id="Microsoft.Win32.Registry" version="4.7.0" targetFramework="net472" />
<package id="NAudio" version="2.1.0" targetFramework="net472" />
<package id="NAudio.Asio" version="2.1.0" targetFramework="net472" />
<package id="NAudio.Core" version="2.1.0" targetFramework="net472" />
<package id="NAudio.Midi" version="2.1.0" targetFramework="net472" />
<package id="NAudio.Vorbis" version="1.5.0" targetFramework="net472" />
<package id="NAudio.Wasapi" version="2.1.0" targetFramework="net472" />
<package id="NAudio.WinForms" version="2.1.0" targetFramework="net472" />
<package id="NAudio.WinMM" version="2.1.0" targetFramework="net472" />
<package id="NETStandard.Library" version="1.6.1" targetFramework="net472" />
<package id="NVorbis" version="0.10.4" targetFramework="net472" />
<package id="System.AppContext" version="4.3.0" targetFramework="net472" />
<package id="System.Buffers" version="4.4.0" targetFramework="net472" />
<package id="System.Collections" version="4.3.0" targetFramework="net472" />
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net472" />
<package id="System.Console" version="4.3.0" targetFramework="net472" />
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net472" />
<package id="System.Diagnostics.DiagnosticSource" version="4.3.0" targetFramework="net472" />
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net472" />
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net472" />
<package id="System.Globalization" version="4.3.0" targetFramework="net472" />
<package id="System.Globalization.Calendars" version="4.3.0" targetFramework="net472" />
<package id="System.IO" version="4.3.0" targetFramework="net472" />
<package id="System.IO.Compression" version="4.3.0" targetFramework="net472" />
<package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="net472" />
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="net472" />
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net472" />
<package id="System.Linq" version="4.3.0" targetFramework="net472" />
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="net472" />
<package id="System.Memory" version="4.5.3" targetFramework="net472" />
<package id="System.Net.Http" version="4.3.0" targetFramework="net472" />
<package id="System.Net.Primitives" version="4.3.0" targetFramework="net472" />
<package id="System.Net.Sockets" version="4.3.0" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net472" />
<package id="System.ObjectModel" version="4.3.0" targetFramework="net472" />
<package id="System.Reflection" version="4.3.0" targetFramework="net472" />
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net472" />
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net472" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net472" />
<package id="System.Runtime" version="4.3.0" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" />
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net472" />
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="net472" />
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net472" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net472" />
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net472" />
<package id="System.Security.AccessControl" version="4.7.0" targetFramework="net472" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net472" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net472" />
<package id="System.Security.Principal.Windows" version="4.7.0" targetFramework="net472" />
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net472" />
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net472" />
<package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="net472" />
<package id="System.Threading" version="4.3.0" targetFramework="net472" />
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="net472" />
<package id="System.Threading.Timer" version="4.3.0" targetFramework="net472" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
<package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="net472" />
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net472" />
</packages>