Browse Source

Initial commit

master
ferris 4 years ago
commit
3739ffc084
  1. 36
      .gitignore
  2. 6
      ConvertTheFuck/App.config
  3. 65
      ConvertTheFuck/ConvertTheFuck.csproj
  4. 49
      ConvertTheFuck/Program.cs
  5. 36
      ConvertTheFuck/Properties/AssemblyInfo.cs
  6. BIN
      Data/background.png
  7. BIN
      Data/data.rc
  8. BIN
      Data/knob1.png
  9. BIN
      Data/optionmenu-pressed.png
  10. BIN
      Data/optionmenu-unpressed.png
  11. BIN
      Data/resource.h
  12. BIN
      Data/tinybutton.png
  13. 38
      Docs/Composition.md
  14. 12
      Docs/DAW-Support.md
  15. 120
      Docs/Devices.md
  16. 29
      Docs/Home.md
  17. 56
      Docs/Serialized-song-format.md
  18. 22
      LICENSE
  19. 6
      ProjectManager/App.config
  20. 22
      ProjectManager/Program.cs
  21. 59
      ProjectManager/ProjectDetails.Designer.cs
  22. 77
      ProjectManager/ProjectDetails.cs
  23. 120
      ProjectManager/ProjectDetails.resx
  24. 160
      ProjectManager/ProjectManager.Designer.cs
  25. 157
      ProjectManager/ProjectManager.cs
  26. 111
      ProjectManager/ProjectManager.csproj
  27. 812
      ProjectManager/ProjectManager.resx
  28. 36
      ProjectManager/Properties/AssemblyInfo.cs
  29. 63
      ProjectManager/Properties/Resources.Designer.cs
  30. 117
      ProjectManager/Properties/Resources.resx
  31. 26
      ProjectManager/Properties/Settings.Designer.cs
  32. 7
      ProjectManager/Properties/Settings.settings
  33. BIN
      ProjectManager/logicoma_basic_CoA_icon.ico
  34. 111
      Tests/PlayerTest/PlayerTest.vcxproj
  35. 9
      Tests/PlayerTest/PlayerTest.vcxproj.filters
  36. 103
      Tests/PlayerTest/Song.h
  37. 71
      Tests/PlayerTest/main.cpp
  38. BIN
      Tests/PlayerTest/msvcrt_old.lib
  39. 6
      Tests/WaveSabreConvertTests/App.config
  40. 26
      Tests/WaveSabreConvertTests/Program.cs
  41. 36
      Tests/WaveSabreConvertTests/Properties/AssemblyInfo.cs
  42. 1
      Tests/WaveSabreConvertTests/Refs/Arps9.als.ref
  43. 1
      Tests/WaveSabreConvertTests/Refs/Arps9_compoedit.als.ref
  44. 1
      Tests/WaveSabreConvertTests/Refs/Arps9_looppoints.als.ref
  45. 1
      Tests/WaveSabreConvertTests/Refs/Backscatter.als.ref
  46. 1
      Tests/WaveSabreConvertTests/Refs/Bare Faced Cheek.als.ref
  47. 1
      Tests/WaveSabreConvertTests/Refs/Effects Automation Test.xrns.ref
  48. 1
      Tests/WaveSabreConvertTests/Refs/Effects Muted Send Test.xrns.ref
  49. 1
      Tests/WaveSabreConvertTests/Refs/Effects Send Test.xrns.ref
  50. 1
      Tests/WaveSabreConvertTests/Refs/Elysian.als.ref
  51. 1
      Tests/WaveSabreConvertTests/Refs/Engage.als.ref
  52. 1
      Tests/WaveSabreConvertTests/Refs/FLSingle.flp.ref
  53. 1
      Tests/WaveSabreConvertTests/Refs/Global Groove.xrns.ref
  54. 1
      Tests/WaveSabreConvertTests/Refs/Group Test.xrns.ref
  55. 1
      Tests/WaveSabreConvertTests/Refs/GroupTest.als.ref
  56. 1
      Tests/WaveSabreConvertTests/Refs/GroupTest2.als.ref
  57. 1
      Tests/WaveSabreConvertTests/Refs/Instrument Automation Test.xrns.ref
  58. 1
      Tests/WaveSabreConvertTests/Refs/Migraine.als.ref
  59. 1
      Tests/WaveSabreConvertTests/Refs/Nested Group Test.xrns.ref
  60. 1
      Tests/WaveSabreConvertTests/Refs/Punqtured's Tune.xrns.ref
  61. 1
      Tests/WaveSabreConvertTests/Refs/Renoise 2.8 File.xrns.ref
  62. 1
      Tests/WaveSabreConvertTests/Refs/Reverence.als.ref
  63. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 02.als.ref
  64. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 03.als.ref
  65. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 04.als.ref
  66. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 05.als.ref
  67. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 06.als.ref
  68. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 07.als.ref
  69. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 08.als.ref
  70. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 08_cputest.als.ref
  71. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 09.als.ref
  72. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 09_cputest.als.ref
  73. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 09_cputest2.als.ref
  74. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 10.als.ref
  75. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 11.als.ref
  76. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 12.als.ref
  77. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 13.als.ref
  78. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 14.als.ref
  79. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 15.als.ref
  80. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 16.als.ref
  81. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 17.als.ref
  82. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 18.als.ref
  83. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 19.als.ref
  84. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 20.als.ref
  85. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf 21.als.ref
  86. 1
      Tests/WaveSabreConvertTests/Refs/SabreWulf.als.ref
  87. 1
      Tests/WaveSabreConvertTests/Refs/SideChainTest.flp.ref
  88. 1
      Tests/WaveSabreConvertTests/Refs/SomeNotesAndAutoTests.flp.ref
  89. 1
      Tests/WaveSabreConvertTests/Refs/SpecimenTest.xrns.ref
  90. 1
      Tests/WaveSabreConvertTests/Refs/almostblanktest01.als.ref
  91. 1
      Tests/WaveSabreConvertTests/Refs/almostblanktest02.als.ref
  92. 1
      Tests/WaveSabreConvertTests/Refs/nhersierhtest01.als.ref
  93. 86
      Tests/WaveSabreConvertTests/Test.cs
  94. BIN
      Tests/WaveSabreConvertTests/Tests/Arps9.als
  95. BIN
      Tests/WaveSabreConvertTests/Tests/Arps9_compoedit.als
  96. BIN
      Tests/WaveSabreConvertTests/Tests/Arps9_looppoints.als
  97. BIN
      Tests/WaveSabreConvertTests/Tests/Backscatter.als
  98. BIN
      Tests/WaveSabreConvertTests/Tests/Bare Faced Cheek.als
  99. BIN
      Tests/WaveSabreConvertTests/Tests/Effects Automation Test.xrns
  100. BIN
      Tests/WaveSabreConvertTests/Tests/Effects Muted Send Test.xrns
  101. Some files were not shown because too many files have changed in this diff Show More

36
.gitignore vendored

@ -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

6
ConvertTheFuck/App.config

@ -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>

65
ConvertTheFuck/ConvertTheFuck.csproj

@ -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>

49
ConvertTheFuck/Program.cs

@ -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);
}
}
}
}

36
ConvertTheFuck/Properties/AssemblyInfo.cs

@ -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")]

BIN
Data/background.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 KiB

BIN
Data/data.rc

Binary file not shown.

BIN
Data/knob1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
Data/optionmenu-pressed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
Data/optionmenu-unpressed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
Data/resource.h

Binary file not shown.

BIN
Data/tinybutton.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 B

38
Docs/Composition.md

@ -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

12
Docs/DAW-Support.md

@ -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|

120
Docs/Devices.md

@ -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.

29
Docs/Home.md

@ -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

56
Docs/Serialized-song-format.md

@ -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
```

22
LICENSE

@ -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.

6
ProjectManager/App.config

@ -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>

22
ProjectManager/Program.cs

@ -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());
}
}
}

59
ProjectManager/ProjectDetails.Designer.cs generated

@ -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;
}
}

77
ProjectManager/ProjectDetails.cs

@ -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();
}
}
}

120
ProjectManager/ProjectDetails.resx

@ -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>

160
ProjectManager/ProjectManager.Designer.cs generated

@ -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;
}
}

157
ProjectManager/ProjectManager.cs

@ -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();
}
}
}

111
ProjectManager/ProjectManager.csproj

@ -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>

812
ProjectManager/ProjectManager.resx

@ -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