commit
3739ffc084
315 changed files with 66346 additions and 0 deletions
@ -0,0 +1,36 @@
|
||||
# See http://help.github.com/ignore-files/ for more about ignoring files. |
||||
# |
||||
# If you find yourself ignoring temporary files generated by your text editor |
||||
# or operating system, you probably want to add a global ignore instead: |
||||
# git config --global core.excludesfile ~/.gitignore_global |
||||
|
||||
# Ignore OS specific and temporary files. |
||||
.DS_Store |
||||
Thumbs.db |
||||
*.swp |
||||
|
||||
# Ignore user-specific Visual Studio .NET-files |
||||
*.suo |
||||
*.vcxproj.user |
||||
*.csproj.user |
||||
*.sdf |
||||
*.opensdf |
||||
|
||||
# Ignore locally installed NuGet packages. |
||||
.nuget/ |
||||
packages/ |
||||
|
||||
# Ignore compiled and generated code. |
||||
bin/ |
||||
obj/ |
||||
lib/ |
||||
Debug/ |
||||
Release/ |
||||
|
||||
# Misc |
||||
Vsts/build/ |
||||
Tests/PlayerTest/build/ |
||||
build/ |
||||
Vst3.x/* |
||||
Data/data.aps |
||||
Vsts/*/*.def |
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<configuration> |
||||
<startup> |
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/> |
||||
</startup> |
||||
</configuration> |
@ -0,0 +1,65 @@
|
||||
๏ปฟ<?xml version="1.0" encoding="utf-8"?> |
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> |
||||
<PropertyGroup> |
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
||||
<ProjectGuid>{EFA32D77-8698-4A7F-848A-1E0357BAD979}</ProjectGuid> |
||||
<OutputType>Exe</OutputType> |
||||
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||
<RootNamespace>ConvertTheFuck</RootNamespace> |
||||
<AssemblyName>ConvertTheFuck</AssemblyName> |
||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> |
||||
<FileAlignment>512</FileAlignment> |
||||
<TargetFrameworkProfile /> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
||||
<PlatformTarget>AnyCPU</PlatformTarget> |
||||
<DebugSymbols>true</DebugSymbols> |
||||
<DebugType>full</DebugType> |
||||
<Optimize>false</Optimize> |
||||
<OutputPath>bin\Debug\</OutputPath> |
||||
<DefineConstants>DEBUG;TRACE</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> |
||||
<PlatformTarget>AnyCPU</PlatformTarget> |
||||
<DebugType>pdbonly</DebugType> |
||||
<Optimize>true</Optimize> |
||||
<OutputPath>bin\Release\</OutputPath> |
||||
<DefineConstants>TRACE</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
</PropertyGroup> |
||||
<ItemGroup> |
||||
<Reference Include="System" /> |
||||
<Reference Include="System.Core" /> |
||||
<Reference Include="System.Xml.Linq" /> |
||||
<Reference Include="System.Data.DataSetExtensions" /> |
||||
<Reference Include="Microsoft.CSharp" /> |
||||
<Reference Include="System.Data" /> |
||||
<Reference Include="System.Xml" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Compile Include="Program.cs" /> |
||||
<Compile Include="Properties\AssemblyInfo.cs" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<None Include="App.config" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<ProjectReference Include="..\WaveSabreConvert\WaveSabreConvert.csproj"> |
||||
<Project>{f97425c7-8471-47ad-b398-ec5f37e848fc}</Project> |
||||
<Name>WaveSabreConvert</Name> |
||||
</ProjectReference> |
||||
</ItemGroup> |
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
||||
Other similar extension points exist, see Microsoft.Common.targets. |
||||
<Target Name="BeforeBuild"> |
||||
</Target> |
||||
<Target Name="AfterBuild"> |
||||
</Target> |
||||
--> |
||||
</Project> |
@ -0,0 +1,49 @@
|
||||
๏ปฟusing System; |
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
using System.Text; |
||||
using System.Threading.Tasks; |
||||
using System.IO; |
||||
using WaveSabreConvert; |
||||
|
||||
namespace ConvertTheFuck |
||||
{ |
||||
class Program |
||||
{ |
||||
static void Main(string[] args) |
||||
{ |
||||
try |
||||
{ |
||||
if (args.Length != 3) |
||||
{ |
||||
Console.WriteLine( |
||||
"usage: ConvertTheFuck [input file] [option] [output file]\n\toption:\t-h export cpp song header file\n\t\t-b export binary song file\n"); |
||||
} |
||||
else |
||||
{ |
||||
var logger = new ConsoleLogger(); |
||||
var song = new ProjectConverter().Convert(args[0], logger); |
||||
var option = args[1]; |
||||
var outFile = args[2]; |
||||
|
||||
switch (option) |
||||
{ |
||||
case "-h": |
||||
File.WriteAllText(outFile, new Serializer().Serialize(song)); |
||||
break; |
||||
case "-b": |
||||
File.WriteAllBytes(outFile, new Serializer().SerializeBinary(song)); |
||||
break; |
||||
default: |
||||
Console.WriteLine(string.Format("ERROR: unknown option {0}", args[1])); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
catch (Exception e) |
||||
{ |
||||
Console.WriteLine("ERROR: " + e.Message); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,36 @@
|
||||
๏ปฟusing System.Reflection; |
||||
using System.Runtime.CompilerServices; |
||||
using System.Runtime.InteropServices; |
||||
|
||||
// General Information about an assembly is controlled through the following |
||||
// set of attributes. Change these attribute values to modify the information |
||||
// associated with an assembly. |
||||
[assembly: AssemblyTitle("ConvertTheFuck")] |
||||
[assembly: AssemblyDescription("")] |
||||
[assembly: AssemblyConfiguration("")] |
||||
[assembly: AssemblyCompany("Microsoft")] |
||||
[assembly: AssemblyProduct("ConvertTheFuck")] |
||||
[assembly: AssemblyCopyright("Copyright ยฉ Microsoft 2012")] |
||||
[assembly: AssemblyTrademark("")] |
||||
[assembly: AssemblyCulture("")] |
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible |
||||
// to COM components. If you need to access a type in this assembly from |
||||
// COM, set the ComVisible attribute to true on that type. |
||||
[assembly: ComVisible(false)] |
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM |
||||
[assembly: Guid("283112d6-6c60-4f32-a833-b7981c0ec880")] |
||||
|
||||
// Version information for an assembly consists of the following four values: |
||||
// |
||||
// Major Version |
||||
// Minor Version |
||||
// Build Number |
||||
// Revision |
||||
// |
||||
// You can specify all the values or you can default the Build and Revision Numbers |
||||
// by using the '*' as shown below: |
||||
// [assembly: AssemblyVersion("1.0.*")] |
||||
[assembly: AssemblyVersion("1.0.0.0")] |
||||
[assembly: AssemblyFileVersion("1.0.0.0")] |
After Width: | Height: | Size: 582 KiB |
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
After Width: | Height: | Size: 842 B |
@ -0,0 +1,38 @@
|
||||
## Composition - Ableton |
||||
|
||||
Almost everything you do within the DAW is supported apart from the following features. |
||||
|
||||
- Automation of any non-WaveSabre parameters |
||||
- MIDI parts which start at less than 0 position will lose notes (we're working on this) |
||||
- Only linear automation is supported (don't use curves etc.) |
||||
|
||||
The project file is then parsed by the converter to create the music data required for WaveSabre playback. |
||||
|
||||
You can also use any other VST plugin within your project such as analysers and wave displays but anything not recognised as a WaveSabre plugin will be ignored by the converter. |
||||
|
||||
### Track grouping |
||||
|
||||
There are two methods of grouping tracks. You can use Group Tracks to house multiple tracks and place devices to effect the overall output of those tracks. You can also use an Audio Track. Simply add the track and in the IO section set the monitor to be "IN". For each track you want to group together, change the output of that track from Master to your newly created audio track. |
||||
|
||||
## Composition - Renoise |
||||
|
||||
- Each track can only use one instrument |
||||
- Do not use the same instrument on two different tracks |
||||
- Instrument automations must be on the same track as the instrument |
||||
- All send devices need to be at the end of the DSP chain |
||||
- You can have ONE muted send device and it has to be the last send device in DSP chain |
||||
- Group tracks are supported including nesting of group tracks |
||||
- No effects commands can be used, only automations of wavesabre parameters are allowed |
||||
- Global Groove parameters are supported |
||||
|
||||
### Side chaining |
||||
|
||||
Sadly this is not possible in Renoise due to its lack of support for multiple channel plugins. |
||||
|
||||
## Composition - FL Studio |
||||
|
||||
Most of the basic functions are supported in FL Studio. Obviously more DAW specific items, such as LFO automations, layering etc. are not supported |
||||
|
||||
- Play Truncated Notes On or Off is supported |
||||
- Automation and midi clips can have varying start end end points |
||||
- Tension value in automation is NOT supported |
@ -0,0 +1,12 @@
|
||||
Currently supported DAW software |
||||
|
||||
|DAW|Platform|x86|x64| |
||||
|--|--|--|--| |
||||
|Ableton 9|PC|native|support via [jBridge](https://jstuff.wordpress.com/jbridge/)| |
||||
|Ableton 10|PC|untested|untested| |
||||
|Renoise|PC|native|to be tested| |
||||
|FL Studio 12|PC|native|works with internal bridge| |
||||
|FL Studio 20|PC|native|works with internal bridge| |
||||
|Reaper|PC|coming soon|coming soon| |
||||
|Ableton 9|MAC|no|coming soon| |
||||
|Renoise|MAC|no|coming soon| |
@ -0,0 +1,120 @@
|
||||
### Slaughter (synth) |
||||
|
||||
- Polyphonic 3 oscillator subtractive synthesiser |
||||
- ADSR envelope |
||||
- Pitch envelope |
||||
- Filter envelope |
||||
- Noise |
||||
|
||||
Slaughter is a very useful synth but it is also quite a CPU hungry beast. To make sure your instruments don't kill your CPU, take care with your envelope release times, overlapping notes and level of Unison. If any of the three oscillators are set to a level of zero, they are switched off which improves performance. |
||||
|
||||
### Falcon (synth) |
||||
|
||||
- 2 oscillator FM synthesiser |
||||
- 2 Amp ADSRs, one for master and one modulator |
||||
- Feedback and feedforward |
||||
- Pitch ADSR Pitch which can modulate master and / or modulator |
||||
|
||||
The naughty step-child of the generators, Falcon can make some rather nasty noises. As with FM synthesis, one oscillator modifies the other and can fade between sine and the first 3 partials of a squarewave (same as square 1 3 5 from FM8). Generally used for horrifically nasty bass death, but can also be used for nice FM plucks or soft sines. |
||||
|
||||
### Thunder (sampler) |
||||
|
||||
- GSM sample player |
||||
- Imports 44khz 16-bit mono WAV |
||||
- Pitch locked to 44khz for all notes |
||||
- Only supports note on event |
||||
|
||||
_PLEASE NOTE:_ This device is now deprecated and only available for compatibility with old projects. Please use Specimen instead. |
||||
|
||||
### Specimen (sampler) |
||||
|
||||
- GSM sample player |
||||
- Imports 44khz 16-bit mono WAV |
||||
- Playback samples on any note with velocity |
||||
- Looping with straight or ping-pong |
||||
- Sample start position |
||||
- Reverse playback |
||||
- ADSR |
||||
- Filter |
||||
|
||||
Specimen is a sample player. It can import a straight 44khz 16-bit WAV sample and compresses it using GSM. Playback is based on the compressed sample so you know what it will sound like when converted. To import samples at a lower rate, modify the sample using any common editor. The specification of the file still needs to be 44khz 16-bit, so it is advices to use a pitch shift to preserve these attributes rather than actual re-sampling which can change these. |
||||
|
||||
### Adultery (sampler) |
||||
|
||||
- GM.DLS sample player |
||||
- Playback samples on any note with velocity |
||||
- Looping with straight or ping-pong |
||||
- Sample start position |
||||
- Reverse playback |
||||
- ADSR |
||||
- Filter |
||||
|
||||
Adultery uses the same sample engine as Specimen with one small difference. The loop boundary mode will allow to the loop points in the original sample to be used, meaning pitched instruments and looped samples can be played correctly. The additional loop boundary mode sets the entire sample as the loop size. |
||||
|
||||
### Chamber (effect) |
||||
|
||||
- Reverb effect |
||||
- High / low cut for effect |
||||
- Dry / wet mix |
||||
- Pre-Delay |
||||
|
||||
A simple reverb effect, the type is essentially a multiplier for the delay lengths. Also has a Pre-Delay to delay the input source of the reverb. |
||||
|
||||
### Crusher (effect) |
||||
|
||||
- Bit crusher |
||||
- Down sampler |
||||
- Dry / wet mix |
||||
|
||||
A down sampler and bit crusher. Useful for adding a gritty texture to the source signal. |
||||
|
||||
### Echo (effect) |
||||
|
||||
- Stereo delay effect |
||||
- Feedback |
||||
- Low and high cut filters |
||||
- Dry / wet |
||||
|
||||
Stereo delay plugin which operates two delay lines, one for each channel, which can be individually sync'd to a tempo. Includes low and high cut filters to help tone the delay output |
||||
|
||||
### Leveller (effect) |
||||
|
||||
- 3 band EQ |
||||
- High and low cut filters with resonance |
||||
- Master level |
||||
|
||||
The leveller is a useful utility plugin which can be used at any part of the signal chain to modify your sound. The high and low cut filters allow for smooth filter sweeps. The master level allows for volume automation on tracks or just a general adjustment. |
||||
|
||||
### Scissor (effect) |
||||
|
||||
- 3 types of distortion (clipper, sine and parabola) |
||||
|
||||
Scissor is a very nasty distortion unit with three types of mangler. It is also useful as a simple signal boost. |
||||
|
||||
### Smasher (effect) |
||||
|
||||
- Compressor with sidechain |
||||
|
||||
Smasher is an compressor with threshold and ratio but can also act as a side-chain compressor. To use it as a sidechain, first add an instance to the channel you want to effect and switch it to sidechain mode. You can do this on an individual channel or a group (see above). To provide the key a channels output needs to be sent to the destination channel, when you select the channel you will see (Smasher 3/4). If the key needs to be heard, i.e. it is provided by your kick drum, then add a send channel and provide it with the kick signal. On the send channel you route the output to you Smasher 3/4 channel. |
||||
|
||||
### Twister (effect) |
||||
|
||||
- Flange +/- |
||||
- Phaser +/- |
||||
- Feedback |
||||
- Stereo param mode |
||||
- Vibrato modulator |
||||
|
||||
Twister is a fairly straight flanger / phaser plugin. There are 4 modes, Flange +, Flange -, Phase + and Phase -. It's unique feature is it's stereo param spread which makes for some really tasty spacial displacement. |
||||
|
||||
### Cathedral (effect) |
||||
|
||||
- Reverb effect |
||||
- Freeze mode |
||||
- Room size ( with infinity! ) |
||||
- Width ( stereo ) |
||||
- Low and high cut filters |
||||
- Dry / wet mix |
||||
- Pre-Delay |
||||
|
||||
Cathedral is a reverb based on Schroeder/Moorer model. The low and high cut filters allow for tuning the resulting reverb output along with a dry / wet mix. The freeze mode, when switched on, holds the current reverb buffer and prevents any further input. This can be useful for really long tails but also as a form of input gating. Also contains a pre-delay to delay the input source of the reverb. |
@ -0,0 +1,29 @@
|
||||
# WaveSabre Wiki |
||||
|
||||
## Building |
||||
|
||||
- WaveSabre builds have only been tested with Visual Studio 2013 |
||||
- Due to licensing requirements, WaveSabre requires you to download and copy the VST3 SDK into the build yourself. Download, extract, and copy into the *"Vst3.x"* folder. See [this readme](https://github.com/yupferris/WaveSabre/blob/master/Vst3.x/README). |
||||
- WaveSabre uses Premake 5.0 to generate project files. |
||||
- Download a Premake 5.0 binary from here: http://premake.github.io/download.html |
||||
- Unzip, and put premake5.exe in a system folder so that it exists in $PATH |
||||
- run `premake5 $BUILDTARGET --vstdir=$VSTPATH` |
||||
- `$BUILDTARGET` is the build system you want to generate a build for, e.g. *vs2013*. See premake documentation for other options. |
||||
- `$VSTPATH` is the location of your VST plugins, e.g `"C:\Program Files (x86)\Steinberg\VstPlugins"`. WaveSabre will copy DLLs here after successful builds. |
||||
- The VST project files will be generated in a *build* subfolder. Open the solution from the project root, and proceed as normal. |
||||
- Note that most of the C++ projects in the repo only have proper Release configurations, and may fail to build in Debug. This is normal; prefer using Release builds. |
||||
|
||||
## New Device Check List |
||||
|
||||
- Add device to WaveSabreCore/Devices.h |
||||
- Add device to WaveSabreConvert/Song.cs |
||||
- Add device to WaveSabrePlayer/include/SongRenderer.h |
||||
- Add device to WaveSabreStandAlongPlayer/main.cpp |
||||
- Add device to Vsts/premake5.lua |
||||
- Re-run premake to create new Vst project file |
||||
- Add Build dependencies for WaveSabreCore and WaveSabrePlayer to VST Project |
||||
- Profit! |
||||
|
||||
|
||||
## Misc |
||||
- Synth seminar from TG: https://www.youtube.com/watch?v=wLX156OVFTA |
@ -0,0 +1,56 @@
|
||||
``` |
||||
int: tempo |
||||
int: sample rate |
||||
double: song length (seconds) |
||||
int: device count |
||||
list of devices: |
||||
byte: device id |
||||
int: chunk size |
||||
byte[]: chunk data |
||||
int: midi lane count |
||||
list of midi lanes: |
||||
int: event count |
||||
list of events: |
||||
int: samples from last event (or from 0 if first event) |
||||
byte: msb is type (on or off) remaining 7 bits = note |
||||
byte: velocity (only present if type is note on) |
||||
int: track count |
||||
list of tracks (in calculation order): |
||||
float: track volume |
||||
int: receive count (including original children) |
||||
list of receives: |
||||
int: sending track index |
||||
int: receiving channel index |
||||
float: volume |
||||
int: device count |
||||
list of device indexes: |
||||
int: device index |
||||
int: midi lane id |
||||
int: automation count |
||||
list of automations: |
||||
int: device index |
||||
int: param id |
||||
int: point count |
||||
list of points: |
||||
int: samples from last point (or from 0 if first point) |
||||
byte: quantized value (0-255) |
||||
|
||||
effect id's: |
||||
00: Falcon |
||||
01: Slaughter |
||||
02: Thunder |
||||
03: Scissor |
||||
04: Leveller |
||||
05: Crusher |
||||
06: Echo |
||||
07: Smasher |
||||
08: Chamber |
||||
09: Twister |
||||
10: Cathedral |
||||
11: Adultery |
||||
12: Specimen |
||||
|
||||
event types: |
||||
0: Note on |
||||
1: Note off |
||||
``` |
@ -0,0 +1,22 @@
|
||||
Copyright (c) 2012-2019 WaveSabre Team |
||||
All rights reserved. |
||||
|
||||
Redistribution and use in source and binary forms, with or without |
||||
modification, are permitted provided that the following conditions are met: |
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this |
||||
list of conditions and the following disclaimer. |
||||
2. Redistributions in binary form must reproduce the above copyright notice, |
||||
this list of conditions and the following disclaimer in the documentation |
||||
and/or other materials provided with the distribution. |
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR |
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<configuration> |
||||
<startup> |
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/> |
||||
</startup> |
||||
</configuration> |
@ -0,0 +1,22 @@
|
||||
๏ปฟusing System; |
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
using System.Threading.Tasks; |
||||
using System.Windows.Forms; |
||||
|
||||
namespace ProjectManager |
||||
{ |
||||
static class Program |
||||
{ |
||||
/// <summary> |
||||
/// The main entry point for the application. |
||||
/// </summary> |
||||
[STAThread] |
||||
static void Main() |
||||
{ |
||||
Application.EnableVisualStyles(); |
||||
Application.SetCompatibleTextRenderingDefault(false); |
||||
Application.Run(new ProjectManager()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,59 @@
|
||||
๏ปฟnamespace ProjectManager |
||||
{ |
||||
partial class ProjectDetails |
||||
{ |
||||
/// <summary> |
||||
/// Required designer variable. |
||||
/// </summary> |
||||
private System.ComponentModel.IContainer components = null; |
||||
|
||||
/// <summary> |
||||
/// Clean up any resources being used. |
||||
/// </summary> |
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> |
||||
protected override void Dispose(bool disposing) |
||||
{ |
||||
if (disposing && (components != null)) |
||||
{ |
||||
components.Dispose(); |
||||
} |
||||
base.Dispose(disposing); |
||||
} |
||||
|
||||
#region Windows Form Designer generated code |
||||
|
||||
/// <summary> |
||||
/// Required method for Designer support - do not modify |
||||
/// the contents of this method with the code editor. |
||||
/// </summary> |
||||
private void InitializeComponent() |
||||
{ |
||||
this.treeViewDetails = new System.Windows.Forms.TreeView(); |
||||
this.SuspendLayout(); |
||||
// |
||||
// treeViewDetails |
||||
// |
||||
this.treeViewDetails.Dock = System.Windows.Forms.DockStyle.Fill; |
||||
this.treeViewDetails.Location = new System.Drawing.Point(0, 0); |
||||
this.treeViewDetails.Name = "treeViewDetails"; |
||||
this.treeViewDetails.Size = new System.Drawing.Size(447, 413); |
||||
this.treeViewDetails.TabIndex = 0; |
||||
// |
||||
// ProjectDetails |
||||
// |
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); |
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; |
||||
this.ClientSize = new System.Drawing.Size(447, 413); |
||||
this.Controls.Add(this.treeViewDetails); |
||||
this.Name = "ProjectDetails"; |
||||
this.ShowIcon = false; |
||||
this.Text = "Project Details"; |
||||
this.ResumeLayout(false); |
||||
|
||||
} |
||||
|
||||
#endregion |
||||
|
||||
private System.Windows.Forms.TreeView treeViewDetails; |
||||
} |
||||
} |
@ -0,0 +1,77 @@
|
||||
๏ปฟusing System.Collections.Generic; |
||||
using System.Linq; |
||||
using System.Windows.Forms; |
||||
using WaveSabreConvert; |
||||
|
||||
namespace ProjectManager |
||||
{ |
||||
public partial class ProjectDetails : Form |
||||
{ |
||||
public ProjectDetails(Song song) |
||||
{ |
||||
InitializeComponent(); |
||||
var trackNodes = new List<TreeNode>(); |
||||
|
||||
var bin = new Serializer().SerializeBinary(song); |
||||
var deviceCount = 0; |
||||
|
||||
var t = 0; |
||||
foreach (var track in song.Tracks) |
||||
{ |
||||
var trackName = string.Format("{0}: {1} ({2} bytes)", t, track.Name, track.DataSize); |
||||
var trackNode = new TreeNode(trackName); |
||||
var deviceNodes = new List<TreeNode>(); |
||||
|
||||
if (track.Receives.Count > 0) |
||||
{ |
||||
var recNode = new TreeNode(string.Format("Track receives {0}", track.Receives.Count)); |
||||
|
||||
foreach (var rec in track.Receives) |
||||
{ |
||||
var tid = rec.SendingTrackIndex; |
||||
recNode.Nodes.Add(string.Format("{0}: {1} / Channel Index {2}", tid, song.Tracks[tid].Name, rec.ReceivingChannelIndex)); |
||||
} |
||||
|
||||
trackNode.Nodes.Add(recNode); |
||||
} |
||||
|
||||
var d = 0; |
||||
foreach (var device in track.Devices) |
||||
{ |
||||
deviceCount++; |
||||
var autoNodes = new List<TreeNode>(); |
||||
var deviceName = string.Format("{0}: {1} ({2} bytes)", d, device.Id, device.Chunk.Length); |
||||
if (track.Automations.Count > 0) |
||||
{ |
||||
var autos = track.Automations.Where(a => a.DeviceIndex == d).ToList(); |
||||
if (autos.Count > 0) |
||||
{ |
||||
var autoHead = new TreeNode(string.Format("Automation Lanes: {0}", autos.Count)); |
||||
foreach (var auto in autos) |
||||
{ |
||||
autoHead.Nodes.Add(new TreeNode(string.Format("Param Id: {0} / Points {1}", auto.ParamId, auto.DeltaCodedPoints.Count))); |
||||
} |
||||
autoNodes.Add(autoHead); |
||||
} |
||||
} |
||||
var deviceNode = new TreeNode(deviceName, autoNodes.ToArray()); |
||||
deviceNodes.Add(deviceNode); |
||||
d++; |
||||
} |
||||
|
||||
trackNode.Nodes.Add(new TreeNode(string.Format("Midi Events: {0}", track.Events.Count))); |
||||
trackNode.Nodes.Add(new TreeNode("Devices", deviceNodes.ToArray())); |
||||
trackNodes.Add(trackNode); |
||||
t++; |
||||
} |
||||
var tracks = new TreeNode(string.Format("Tracks: {0}", song.Tracks.Count), trackNodes.ToArray()); |
||||
|
||||
treeViewDetails.Nodes.Add(new TreeNode(string.Format("Tempo: {0}", song.Tempo))); |
||||
treeViewDetails.Nodes.Add(new TreeNode(string.Format("Duration: {0} seconds", song.Length))); |
||||
treeViewDetails.Nodes.Add(new TreeNode(string.Format("Total Device Count: {0}", deviceCount))); |
||||
treeViewDetails.Nodes.Add(new TreeNode(string.Format("Total Data Size: {0} bytes", bin.Length))); |
||||
treeViewDetails.Nodes.Add(tracks); |
||||
treeViewDetails.Nodes[4].Expand(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,120 @@
|
||||
๏ปฟ<?xml version="1.0" encoding="utf-8"?> |
||||
<root> |
||||
<!-- |
||||
Microsoft ResX Schema |
||||
|
||||
Version 2.0 |
||||
|
||||
The primary goals of this format is to allow a simple XML format |
||||
that is mostly human readable. The generation and parsing of the |
||||
various data types are done through the TypeConverter classes |
||||
associated with the data types. |
||||
|
||||
Example: |
||||
|
||||
... ado.net/XML headers & schema ... |
||||
<resheader name="resmimetype">text/microsoft-resx</resheader> |
||||
<resheader name="version">2.0</resheader> |
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> |
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> |
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> |
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> |
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> |
||||
<value>[base64 mime encoded serialized .NET Framework object]</value> |
||||
</data> |
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> |
||||
<comment>This is a comment</comment> |
||||
</data> |
||||
|
||||
There are any number of "resheader" rows that contain simple |
||||
name/value pairs. |
||||
|
||||
Each data row contains a name, and value. The row also contains a |
||||
type or mimetype. Type corresponds to a .NET class that support |
||||
text/value conversion through the TypeConverter architecture. |
||||
Classes that don't support this are serialized and stored with the |
||||
mimetype set. |
||||
|
||||
The mimetype is used for serialized objects, and tells the |
||||
ResXResourceReader how to depersist the object. This is currently not |
||||
extensible. For a given mimetype the value must be set accordingly: |
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format |
||||
that the ResXResourceWriter will generate, however the reader can |
||||
read any of the formats listed below. |
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64 |
||||
value : The object must be serialized with |
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter |
||||
: and then encoded with base64 encoding. |
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64 |
||||
value : The object must be serialized with |
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter |
||||
: and then encoded with base64 encoding. |
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64 |
||||
value : The object must be serialized into a byte array |
||||
: using a System.ComponentModel.TypeConverter |
||||
: and then encoded with base64 encoding. |
||||
--> |
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> |
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> |
||||
<xsd:element name="root" msdata:IsDataSet="true"> |
||||
<xsd:complexType> |
||||
<xsd:choice maxOccurs="unbounded"> |
||||
<xsd:element name="metadata"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" use="required" type="xsd:string" /> |
||||
<xsd:attribute name="type" type="xsd:string" /> |
||||
<xsd:attribute name="mimetype" type="xsd:string" /> |
||||
<xsd:attribute ref="xml:space" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="assembly"> |
||||
<xsd:complexType> |
||||
<xsd:attribute name="alias" type="xsd:string" /> |
||||
<xsd:attribute name="name" type="xsd:string" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="data"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> |
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> |
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> |
||||
<xsd:attribute ref="xml:space" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="resheader"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" type="xsd:string" use="required" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
</xsd:choice> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
</xsd:schema> |
||||
<resheader name="resmimetype"> |
||||
<value>text/microsoft-resx</value> |
||||
</resheader> |
||||
<resheader name="version"> |
||||
<value>2.0</value> |
||||
</resheader> |
||||
<resheader name="reader"> |
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
||||
</resheader> |
||||
<resheader name="writer"> |
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
||||
</resheader> |
||||
</root> |
@ -0,0 +1,160 @@
|
||||
๏ปฟnamespace ProjectManager |
||||
{ |
||||
partial class ProjectManager |
||||
{ |
||||
/// <summary> |
||||
/// Required designer variable. |
||||
/// </summary> |
||||
private System.ComponentModel.IContainer components = null; |
||||
|
||||
/// <summary> |
||||
/// Clean up any resources being used. |
||||
/// </summary> |
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> |
||||
protected override void Dispose(bool disposing) |
||||
{ |
||||
if (disposing && (components != null)) |
||||
{ |
||||
components.Dispose(); |
||||
} |
||||
base.Dispose(disposing); |
||||
} |
||||
|
||||
#region Windows Form Designer generated code |
||||
|
||||
/// <summary> |
||||
/// Required method for Designer support - do not modify |
||||
/// the contents of this method with the code editor. |
||||
/// </summary> |
||||
private void InitializeComponent() |
||||
{ |
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProjectManager)); |
||||
this.buttonOpenProject = new System.Windows.Forms.Button(); |
||||
this.buttonSaveHeader = new System.Windows.Forms.Button(); |
||||
this.buttonSaveBinary = new System.Windows.Forms.Button(); |
||||
this.buttonPlaySong = new System.Windows.Forms.Button(); |
||||
this.buttonExportWav = new System.Windows.Forms.Button(); |
||||
this.textBoxOutput = new System.Windows.Forms.TextBox(); |
||||
this.label1 = new System.Windows.Forms.Label(); |
||||
this.buttonProjectDetails = new System.Windows.Forms.Button(); |
||||
this.SuspendLayout(); |
||||
// |
||||
// buttonOpenProject |
||||
// |
||||
this.buttonOpenProject.Location = new System.Drawing.Point(12, 12); |
||||
this.buttonOpenProject.Name = "buttonOpenProject"; |
||||
this.buttonOpenProject.Size = new System.Drawing.Size(104, 23); |
||||
this.buttonOpenProject.TabIndex = 0; |
||||
this.buttonOpenProject.Text = "Open Project"; |
||||
this.buttonOpenProject.UseVisualStyleBackColor = true; |
||||
this.buttonOpenProject.Click += new System.EventHandler(this.buttonOpenProject_Click); |
||||
// |
||||
// buttonSaveHeader |
||||
// |
||||
this.buttonSaveHeader.Enabled = false; |
||||
this.buttonSaveHeader.Location = new System.Drawing.Point(12, 138); |
||||
this.buttonSaveHeader.Name = "buttonSaveHeader"; |
||||
this.buttonSaveHeader.Size = new System.Drawing.Size(104, 23); |
||||
this.buttonSaveHeader.TabIndex = 0; |
||||
this.buttonSaveHeader.Text = "Save C++ Header"; |
||||
this.buttonSaveHeader.UseVisualStyleBackColor = true; |
||||
this.buttonSaveHeader.Click += new System.EventHandler(this.buttonSaveHeader_Click); |
||||
// |
||||
// buttonSaveBinary |
||||
// |
||||
this.buttonSaveBinary.Enabled = false; |
||||
this.buttonSaveBinary.Location = new System.Drawing.Point(12, 167); |
||||
this.buttonSaveBinary.Name = "buttonSaveBinary"; |
||||
this.buttonSaveBinary.Size = new System.Drawing.Size(104, 23); |
||||
this.buttonSaveBinary.TabIndex = 0; |
||||
this.buttonSaveBinary.Text = "Save Binary Song"; |
||||
this.buttonSaveBinary.UseVisualStyleBackColor = true; |
||||
this.buttonSaveBinary.Click += new System.EventHandler(this.buttonSaveBinary_Click); |
||||
// |
||||
// buttonPlaySong |
||||
// |
||||
this.buttonPlaySong.Enabled = false; |
||||
this.buttonPlaySong.Location = new System.Drawing.Point(12, 90); |
||||
this.buttonPlaySong.Name = "buttonPlaySong"; |
||||
this.buttonPlaySong.Size = new System.Drawing.Size(104, 23); |
||||
this.buttonPlaySong.TabIndex = 0; |
||||
this.buttonPlaySong.Text = "Play Song"; |
||||
this.buttonPlaySong.UseVisualStyleBackColor = true; |
||||
this.buttonPlaySong.Click += new System.EventHandler(this.buttonPlaySong_Click); |
||||
// |
||||
// buttonExportWav |
||||
// |
||||
this.buttonExportWav.Enabled = false; |
||||
this.buttonExportWav.Location = new System.Drawing.Point(12, 196); |
||||
this.buttonExportWav.Name = "buttonExportWav"; |
||||
this.buttonExportWav.Size = new System.Drawing.Size(104, 23); |
||||
this.buttonExportWav.TabIndex = 0; |
||||
this.buttonExportWav.Text = "Export Wav"; |
||||
this.buttonExportWav.UseVisualStyleBackColor = true; |
||||
this.buttonExportWav.Click += new System.EventHandler(this.buttonExportWav_Click); |
||||
// |
||||
// textBoxOutput |
||||
// |
||||
this.textBoxOutput.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.textBoxOutput.Location = new System.Drawing.Point(122, 28); |
||||
this.textBoxOutput.Multiline = true; |
||||
this.textBoxOutput.Name = "textBoxOutput"; |
||||
this.textBoxOutput.Size = new System.Drawing.Size(413, 226); |
||||
this.textBoxOutput.TabIndex = 2; |
||||
// |
||||
// label1 |
||||
// |
||||
this.label1.AutoSize = true; |
||||
this.label1.Location = new System.Drawing.Point(122, 12); |
||||
this.label1.Name = "label1"; |
||||
this.label1.Size = new System.Drawing.Size(108, 13); |
||||
this.label1.TabIndex = 3; |
||||
this.label1.Text = "Conversion Warnings"; |
||||
// |
||||
// buttonProjectDetails |
||||
// |
||||
this.buttonProjectDetails.Enabled = false; |
||||
this.buttonProjectDetails.Location = new System.Drawing.Point(11, 41); |
||||
this.buttonProjectDetails.Name = "buttonProjectDetails"; |
||||
this.buttonProjectDetails.Size = new System.Drawing.Size(104, 23); |
||||
this.buttonProjectDetails.TabIndex = 4; |
||||
this.buttonProjectDetails.Text = "Project Details"; |
||||
this.buttonProjectDetails.UseVisualStyleBackColor = true; |
||||
this.buttonProjectDetails.Click += new System.EventHandler(this.buttonProjectDetails_Click); |
||||
// |
||||
// ProjectManager |
||||
// |
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); |
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; |
||||
this.ClientSize = new System.Drawing.Size(547, 266); |
||||
this.Controls.Add(this.buttonProjectDetails); |
||||
this.Controls.Add(this.label1); |
||||
this.Controls.Add(this.textBoxOutput); |
||||
this.Controls.Add(this.buttonExportWav); |
||||
this.Controls.Add(this.buttonPlaySong); |
||||
this.Controls.Add(this.buttonSaveBinary); |
||||
this.Controls.Add(this.buttonSaveHeader); |
||||
this.Controls.Add(this.buttonOpenProject); |
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); |
||||
this.Name = "ProjectManager"; |
||||
this.Text = "Project Manager"; |
||||
this.ResumeLayout(false); |
||||
this.PerformLayout(); |
||||
|
||||
} |
||||
|
||||
#endregion |
||||
|
||||
private System.Windows.Forms.Button buttonOpenProject; |
||||
private System.Windows.Forms.Button buttonSaveHeader; |
||||
private System.Windows.Forms.Button buttonSaveBinary; |
||||
private System.Windows.Forms.Button buttonPlaySong; |
||||
private System.Windows.Forms.Button buttonExportWav; |
||||
private System.Windows.Forms.TextBox textBoxOutput; |
||||
private System.Windows.Forms.Label label1; |
||||
private System.Windows.Forms.Button buttonProjectDetails; |
||||
} |
||||
} |
||||
|
@ -0,0 +1,157 @@
|
||||
๏ปฟusing System; |
||||
using System.Diagnostics; |
||||
using System.IO; |
||||
using System.Windows.Forms; |
||||
using WaveSabreConvert; |
||||
|
||||
namespace ProjectManager |
||||
{ |
||||
public partial class ProjectManager : Form |
||||
{ |
||||
private Song song; |
||||
private string fileName; |
||||
private EventLogger logger; |
||||
|
||||
public ProjectManager() |
||||
{ |
||||
InitializeComponent(); |
||||
} |
||||
|
||||
private void buttonOpenProject_Click(object sender, EventArgs e) |
||||
{ |
||||
var ofd = new OpenFileDialog(); |
||||
ofd.Filter = "Project Files|*.als;*.flp;*.xrns;*.rpp"; |
||||
if (ofd.ShowDialog() == DialogResult.OK) |
||||
{ |
||||
OpenProject(ofd.FileName); |
||||
} |
||||
} |
||||
|
||||
private void OpenProject(string projectFile) |
||||
{ |
||||
try |
||||
{ |
||||
textBoxOutput.Text = ""; |
||||
logger = new EventLogger(); |
||||
logger.OnLog += OnLogEvent; |
||||
song = new ProjectConverter().Convert(projectFile, logger); |
||||
fileName = Path.GetFileNameWithoutExtension(projectFile); |
||||
textBoxOutput.AppendText("Done."); |
||||
Enable(); |
||||
} |
||||
catch (Exception err) |
||||
{ |
||||
MessageBox.Show(err.Message); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void OnLogEvent(object sender, EventArgs e) |
||||
{ |
||||
var data = (LogEvent)e; |
||||
textBoxOutput.AppendText(data.Output); |
||||
} |
||||
|
||||
private void Enable() |
||||
{ |
||||
buttonSaveHeader.Enabled = true; |
||||
buttonSaveBinary.Enabled = true; |
||||
buttonPlaySong.Enabled = true; |
||||
buttonExportWav.Enabled = true; |
||||
buttonProjectDetails.Enabled = true; |
||||
} |
||||
|
||||
private void buttonSaveHeader_Click(object sender, EventArgs e) |
||||
{ |
||||
try |
||||
{ |
||||
var header = new Serializer().Serialize(song); |
||||
var sfd = new SaveFileDialog(); |
||||
sfd.Filter = "C++ Header|*.h"; |
||||
if (sfd.ShowDialog() == DialogResult.OK) |
||||
{ |
||||
File.WriteAllText(sfd.FileName, header); |
||||
} |
||||
} |
||||
catch (Exception err) |
||||
{ |
||||
MessageBox.Show(err.Message); |
||||
} |
||||
} |
||||
|
||||
private void buttonSaveBinary_Click(object sender, EventArgs e) |
||||
{ |
||||
try |
||||
{ |
||||
var bin = new Serializer().SerializeBinary(song); |
||||
var sfd = new SaveFileDialog(); |
||||
sfd.Filter = "Binary Song File|*.bin"; |
||||
sfd.FileName = fileName; |
||||
if (sfd.ShowDialog() == DialogResult.OK) |
||||
{ |
||||
File.WriteAllBytes(sfd.FileName, bin); |
||||
} |
||||
} |
||||
catch (Exception err) |
||||
{ |
||||
MessageBox.Show(err.Message); |
||||
} |
||||
} |
||||
|
||||
private void buttonPlaySong_Click(object sender, EventArgs e) |
||||
{ |
||||
try |
||||
{ |
||||
var bin = new Serializer().SerializeBinary(song); |
||||
var tempFile = Path.GetTempPath() + "WaveSabre.bin"; |
||||
GetRid(tempFile); |
||||
File.WriteAllBytes(tempFile, bin); |
||||
var proc = Process.Start(@"WaveSabreStandAlonePlayer.exe", tempFile); |
||||
proc.WaitForExit(); |
||||
GetRid(tempFile); |
||||
} |
||||
catch (Exception err) |
||||
{ |
||||
MessageBox.Show(err.Message); |
||||
} |
||||
} |
||||
|
||||
private void GetRid(string killFile) |
||||
{ |
||||
if (File.Exists(killFile)) |
||||
{ |
||||
File.Delete(killFile); |
||||
} |
||||
} |
||||
|
||||
private void buttonExportWav_Click(object sender, EventArgs e) |
||||
{ |
||||
try |
||||
{ |
||||
var sfd = new SaveFileDialog(); |
||||
sfd.Filter = "Wav file|*.wav"; |
||||
sfd.FileName = fileName; |
||||
if (sfd.ShowDialog() == DialogResult.OK) |
||||
{ |
||||
var bin = new Serializer().SerializeBinary(song); |
||||
var tempFile = Path.GetTempPath() + "WaveSabre.bin"; |
||||
GetRid(tempFile); |
||||
File.WriteAllBytes(tempFile, bin); |
||||
var proc = Process.Start(@"WaveSabreStandAlonePlayer.exe", string.Format("\"{0}\" -w \"{1}\"", tempFile, sfd.FileName)); |
||||
proc.WaitForExit(); |
||||
GetRid(tempFile); |
||||
} |
||||
} |
||||
catch (Exception err) |
||||
{ |
||||
MessageBox.Show(err.Message); |
||||
} |
||||
} |
||||
|
||||
private void buttonProjectDetails_Click(object sender, EventArgs e) |
||||
{ |
||||
var details = new ProjectDetails(song); |
||||
details.ShowDialog(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,111 @@
|
||||
๏ปฟ<?xml version="1.0" encoding="utf-8"?> |
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> |
||||
<PropertyGroup> |
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
||||
<ProjectGuid>{F73B546B-BC44-47A7-B808-4C8699835CB0}</ProjectGuid> |
||||
<OutputType>WinExe</OutputType> |
||||
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||
<RootNamespace>ProjectManager</RootNamespace> |
||||
<AssemblyName>ProjectManager</AssemblyName> |
||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> |
||||
<FileAlignment>512</FileAlignment> |
||||
<TargetFrameworkProfile /> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
||||
<PlatformTarget>AnyCPU</PlatformTarget> |
||||
<DebugSymbols>true</DebugSymbols> |
||||
<DebugType>full</DebugType> |
||||
<Optimize>false</Optimize> |
||||
<OutputPath>bin\Debug\</OutputPath> |
||||
<DefineConstants>DEBUG;TRACE</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> |
||||
<PlatformTarget>AnyCPU</PlatformTarget> |
||||
<DebugType>pdbonly</DebugType> |
||||
<Optimize>true</Optimize> |
||||
<OutputPath>bin\Release\</OutputPath> |
||||
<DefineConstants>TRACE</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
</PropertyGroup> |
||||
<PropertyGroup> |
||||
<ApplicationIcon>logicoma_basic_CoA_icon.ico</ApplicationIcon> |
||||
</PropertyGroup> |
||||
<ItemGroup> |
||||
<Reference Include="System" /> |
||||
<Reference Include="System.Core" /> |
||||
<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.Windows.Forms" /> |
||||
<Reference Include="System.Xml" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Compile Include="ProjectDetails.cs"> |
||||
<SubType>Form</SubType> |
||||
</Compile> |
||||
<Compile Include="ProjectDetails.Designer.cs"> |
||||
<DependentUpon>ProjectDetails.cs</DependentUpon> |
||||
</Compile> |
||||
<Compile Include="ProjectManager.cs"> |
||||
<SubType>Form</SubType> |
||||
</Compile> |
||||
<Compile Include="ProjectManager.Designer.cs"> |
||||
<DependentUpon>ProjectManager.cs</DependentUpon> |
||||
</Compile> |
||||
<Compile Include="Program.cs" /> |
||||
<Compile Include="Properties\AssemblyInfo.cs" /> |
||||
<EmbeddedResource Include="ProjectDetails.resx"> |
||||
<DependentUpon>ProjectDetails.cs</DependentUpon> |
||||
</EmbeddedResource> |
||||
<EmbeddedResource Include="ProjectManager.resx"> |
||||
<DependentUpon>ProjectManager.cs</DependentUpon> |
||||
</EmbeddedResource> |
||||
<EmbeddedResource Include="Properties\Resources.resx"> |
||||
<Generator>ResXFileCodeGenerator</Generator> |
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput> |
||||
<SubType>Designer</SubType> |
||||
</EmbeddedResource> |
||||
<Compile Include="Properties\Resources.Designer.cs"> |
||||
<AutoGen>True</AutoGen> |
||||
<DependentUpon>Resources.resx</DependentUpon> |
||||
<DesignTime>True</DesignTime> |
||||
</Compile> |
||||
<None Include="Properties\Settings.settings"> |
||||
<Generator>SettingsSingleFileGenerator</Generator> |
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput> |
||||
</None> |
||||
<Compile Include="Properties\Settings.Designer.cs"> |
||||
<AutoGen>True</AutoGen> |
||||
<DependentUpon>Settings.settings</DependentUpon> |
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput> |
||||
</Compile> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<None Include="App.config" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<ProjectReference Include="..\WaveSabreConvert\WaveSabreConvert.csproj"> |
||||
<Project>{f97425c7-8471-47ad-b398-ec5f37e848fc}</Project> |
||||
<Name>WaveSabreConvert</Name> |
||||
</ProjectReference> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Content Include="logicoma_basic_CoA_icon.ico" /> |
||||
</ItemGroup> |
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
||||
Other similar extension points exist, see Microsoft.Common.targets. |
||||
<Target Name="BeforeBuild"> |
||||
</Target> |
||||
<Target Name="AfterBuild"> |
||||
</Target> |
||||
--> |
||||
</Project> |
@ -0,0 +1,812 @@
|
||||
๏ปฟ<?xml version="1.0" encoding="utf-8"?> |
||||
<root> |
||||
<!-- |
||||
Microsoft ResX Schema |
||||
|
||||
Version 2.0 |
||||
|
||||
The primary goals of this format is to allow a simple XML format |
||||
that is mostly human readable. The generation and parsing of the |
||||
various data types are done through the TypeConverter classes |
||||
associated with the data types. |
||||
|
||||
Example: |
||||
|
||||
... ado.net/XML headers & schema ... |
||||
<resheader name="resmimetype">text/microsoft-resx</resheader> |
||||
<resheader name="version">2.0</resheader> |
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> |
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> |
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> |
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> |
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> |
||||
<value>[base64 mime encoded serialized .NET Framework object]</value> |
||||
</data> |
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> |
||||
<comment>This is a comment</comment> |
||||
</data> |
||||
|
||||
There are any number of "resheader" rows that contain simple |
||||
name/value pairs. |
||||
|
||||
Each data row contains a name, and value. The row also contains a |
||||
type or mimetype. Type corresponds to a .NET class that support |
||||
text/value conversion through the TypeConverter architecture. |
||||
Classes that don't support this are serialized and stored with the |
||||
mimetype set. |
||||
|
||||
The mimetype is used for serialized objects, and tells the |
||||
ResXResourceReader how to depersist the object. This is currently not |
||||
extensible. For a given mimetype the value must be set accordingly: |
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format |
||||
that the ResXResourceWriter will generate, however the reader can |
||||
read any of the formats listed below. |
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64 |
||||
value : The object must be serialized with |
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter |
||||
: and then encoded with base64 encoding. |
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64 |
||||
value : The object must be serialized with |
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter |
||||
: and then encoded with base64 encoding. |
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64 |
||||
value : The object must be serialized into a byte array |
||||
: using a System.ComponentModel.TypeConverter |
||||
: and then encoded with base64 encoding. |
||||
--> |
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> |
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> |
||||
<xsd:element name="root" msdata:IsDataSet="true"> |
||||
<xsd:complexType> |
||||
<xsd:choice maxOccurs="unbounded"> |
||||
<xsd:element name="metadata"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" use="required" type="xsd:string" /> |
||||
<xsd:attribute name="type" type="xsd:string" /> |
||||
<xsd:attribute name="mimetype" type="xsd:string" /> |
||||
<xsd:attribute ref="xml:space" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="assembly"> |
||||
<xsd:complexType> |
||||
<xsd:attribute name="alias" type="xsd:string" /> |
||||
<xsd:attribute name="name" type="xsd:string" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="data"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> |
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> |
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> |
||||
<xsd:attribute ref="xml:space" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="resheader"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" type="xsd:string" use="required" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
</xsd:choice> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
</xsd:schema> |
||||
<resheader name="resmimetype"> |
||||
<value>text/microsoft-resx</value> |
||||
</resheader> |
||||
<resheader name="version"> |
||||
<value>2.0</value> |
||||
</resheader> |
||||
<resheader name="reader"> |
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
||||
</resheader> |
||||
<resheader name="writer"> |
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
||||
</resheader> |
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> |
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
||||
<value> |
||||
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA |
||||
IACoJQAA7h4AAIuNAAABAAgASFwAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAATCwAAEwsAAAAA |
||||
AAAAAAAADQ0N/w0NDf8NDQ3/DQ0N/wwMDP8MDAz/Dw8P/xMTE/8UFBT/EBAQ/wwMDP8MDAz/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/wwMDP8VFRX/Kioq/zIyMv8xMTH/MTEx/zIyMv8uLi7/Gxsb/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/wwMDP8iIiL/NTU1/yEhIf8RERH/Dw8P/w8PD/8QEBD/Gxsb/zEx |
||||
Mf8rKyv/Dw8P/w0NDf8NDQ3/DQ0N/wwMDP8iIiL/MjIy/xEREf8MDAz/DAwM/ygoKP82Njb/DAwM/wwM |
||||
DP8NDQ3/KSkp/y4uLv8NDQ3/DQ0N/wwMDP8WFhb/NTU1/xEREf8MDAz/DQ0N/w0NDf8UFBT/GBgY/w0N |
||||
Df8NDQ3/DQ0N/wwMDP8uLi7/ISEh/wwMDP8MDAz/Kysr/yAgIP8MDAz/DQ0N/w0NDf8NDQ3/DQ0N/wwM |
||||
DP8NDQ3/DQ0N/w0NDf8NDQ3/FBQU/zMzM/8PDw//EBAQ/zMzM/8RERH/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/wwMDP8wMDD/GRkZ/xQUFP8xMTH/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8MDAz/KCgo/yIiIv8VFRX/MTEx/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DAwM/ygoKP8iIiL/EBAQ/zMzM/8QEBD/DQ0N/w8P |
||||
D/8ODg7/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8PDw//DQ0N/wwMDP8vLy//Gxsb/wwMDP8tLS3/HR0d/w0N |
||||
Df89PT3/HR0d/wwMDP8NDQ3/DQ0N/w0NDf8QEBD/Pz8//xkZGf8SEhL/NDQ0/xAQEP8MDAz/GBgY/zQ0 |
||||
NP8PDw//Gxsb/xISEv8NDQ3/DQ0N/w0NDf8NDQ3/Dg4O/xwcHP8PDw//Kysr/yQkJP8MDAz/DQ0N/wwM |
||||
DP8mJib/Li4u/w4ODv8MDAz/DQ0N/w0NDf8NDQ3/DQ0N/wwMDP8LCwv/JCQk/zExMf8ODg7/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/ycnJ/8zMzP/HBwc/w8PD/8MDAz/DAwM/w4ODv8XFxf/Li4u/y8vL/8QEBD/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8MDAz/GRkZ/y4uLv8zMzP/Ly8v/y4uLv8yMjL/MTEx/x8fH/8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/wwMDP8MDAz/EhIS/xgYGP8YGBj/FBQU/w0NDf8MDAz/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
||||
AAAAAAAAAAAAAAAAAAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAATCwAAEwsAAAAAAAAAAAAADQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DAwM/wsLC/8LCwv/CwsL/wsLC/8MDAz/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/wwM |
||||
DP8NDQ3/FxcX/yMjI/8qKir/LCws/ycnJ/8cHBz/EBAQ/wsLC/8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8MDAz/Dg4O/yYmJv9BQUH/RERE/zo6Ov8zMzP/MjIy/zc3 |
||||
N/9AQED/RUVF/zQ0NP8VFRX/DAwM/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/wwM |
||||
DP8YGBj/QkJC/z8/P/8eHh7/Dw8P/wsLC/8KCgr/CgoK/wsLC/8NDQ3/FhYW/zExMf9ISEj/KSkp/wwM |
||||
DP8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DAwM/x4eHv9JSUn/JiYm/wwMDP8MDAz/DQ0N/wwM |
||||
DP8ZGRn/IiIi/w0NDf8NDQ3/DQ0N/wsLC/8XFxf/QkJC/zQ0NP8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8MDAz/GRkZ/0pKSv8eHh7/CwsL/w0NDf8NDQ3/DQ0N/wsLC/9AQED/Xl5e/xISEv8NDQ3/DQ0N/w0N |
||||
Df8MDAz/Dw8P/0BAQP8xMTH/DAwM/w0NDf8NDQ3/DQ0N/w0NDf8PDw//Q0ND/yUlJf8LCwv/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8XFxf/Hh4e/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DAwM/xEREf9HR0f/Hx8f/wwM |
||||
DP8NDQ3/DQ0N/wsLC/8oKCj/PT09/wwMDP8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8MDAz/DAwM/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/wwMDP8iIiL/QkJC/w0NDf8NDQ3/DQ0N/w4ODv9DQ0P/HR0d/wwM |
||||
DP8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/Q0ND/x0dHf8MDAz/DAwM/xkZGf9ERET/Dg4O/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8LCwv/Li4u/zMzM/8LCwv/CwsL/yUl |
||||
Jf85OTn/CwsL/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8MDAz/Hh4e/z8/P/8MDAz/CwsL/y0tLf8yMjL/CwsL/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/FxcX/0ND |
||||
Q/8ODg7/CwsL/y4uLv8xMTH/CwsL/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/FhYW/0NDQ/8ODg7/CwsL/ycnJ/83Nzf/CwsL/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8MDAz/HBwc/0BAQP8MDAz/DAwM/xsbG/9CQkL/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8LCwv/Kysr/zY2Nv8LCwv/DQ0N/w8P |
||||
D/9FRUX/GRkZ/wwMDP8MDAz/ODg4/0BAQP8ODg7/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DAwM/x8f |
||||
H/9PT0//GRkZ/wwMDP8MDAz/QEBA/yEhIf8MDAz/DQ0N/wsLC/8uLi7/ODg4/wsLC/8MDAz/Ojo6/0JC |
||||
Qv8ODg7/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DAwM/yAgIP9RUVH/Ghoa/wsLC/8dHR3/RUVF/w8P |
||||
D/8NDQ3/DQ0N/w0NDf8RERH/R0dH/x4eHv8MDAz/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DAwM/w4ODv9DQ0P/JSUl/wwMDP8NDQ3/DQ0N/w0NDf8MDAz/Hx8f/0lJ |
||||
Sf8XFxf/DAwM/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/zg4 |
||||
OP85OTn/DAwM/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DAwM/yYmJv9ISEj/HR0d/wsLC/8MDAz/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/wsLC/8RERH/Ojo6/z09Pf8PDw//DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/wwMDP8gICD/SEhI/zQ0NP8WFhb/DAwM/wsLC/8LCwv/CwsL/wsLC/8LCwv/EBAQ/yYm |
||||
Jv9GRkb/NDQ0/w4ODv8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8MDAz/EhIS/zEx |
||||
Mf9FRUX/Pz8//zExMf8oKCj/Jycn/y0tLf85OTn/RUVF/z09Pf8dHR3/DAwM/w0NDf8NDQ3/DQ0N/w0N |
||||
Df8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/wsLC/8QEBD/Hx8f/y4uLv81NTX/NjY2/zIy |
||||
Mv8lJSX/FRUV/wwMDP8MDAz/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0NDf8NDQ3/DQ0N/w0N |
||||