Build 130105
@ -43,4 +43,7 @@ Global
|
|||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
GlobalSection(Performance) = preSolution
|
||||||
|
HasPerformanceSessions = true
|
||||||
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
BIN
DrumKit.suo
Normal file
BIN
DrumKit.v11.suo
@ -64,7 +64,7 @@ namespace DrumKit
|
|||||||
// When the navigation stack isn't restored navigate to the first page,
|
// When the navigation stack isn't restored navigate to the first page,
|
||||||
// configuring the new page by passing required information as a navigation
|
// configuring the new page by passing required information as a navigation
|
||||||
// parameter
|
// parameter
|
||||||
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
|
if (!rootFrame.Navigate(typeof(LoadingPage), args.Arguments))
|
||||||
{
|
{
|
||||||
throw new Exception("Failed to create initial page");
|
throw new Exception("Failed to create initial page");
|
||||||
}
|
}
|
||||||
@ -80,10 +80,22 @@ namespace DrumKit
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sender">The source of the suspend request.</param>
|
/// <param name="sender">The source of the suspend request.</param>
|
||||||
/// <param name="e">Details about the suspend request.</param>
|
/// <param name="e">Details about the suspend request.</param>
|
||||||
private void OnSuspending(object sender, SuspendingEventArgs e)
|
private async void OnSuspending(object sender, SuspendingEventArgs e)
|
||||||
{
|
{
|
||||||
var deferral = e.SuspendingOperation.GetDeferral();
|
var deferral = e.SuspendingOperation.GetDeferral();
|
||||||
//TODO: Save application state and stop any background activity
|
//TODO: Save application state and stop any background activity
|
||||||
|
try {
|
||||||
|
await DataManager.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
catch (Exception ex) {
|
||||||
|
Log.Error("Exception in OnSuspending method!");
|
||||||
|
Log.Except(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.Write("Application suspended.");
|
||||||
|
|
||||||
|
//TODO:::...
|
||||||
deferral.Complete();
|
deferral.Complete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
328
DrumKit/Archiving/TarballReader.cs
Normal file
@ -0,0 +1,328 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.IO;
|
||||||
|
using Windows.Storage;
|
||||||
|
|
||||||
|
namespace DrumKit.Archiving
|
||||||
|
{
|
||||||
|
public class TarballReader
|
||||||
|
{
|
||||||
|
#region Data types etc
|
||||||
|
/// <summary>
|
||||||
|
/// Tarball header structure
|
||||||
|
/// </summary>
|
||||||
|
private struct TarballHeader
|
||||||
|
{
|
||||||
|
public string FileName;
|
||||||
|
public uint FileMode;
|
||||||
|
public uint OwnerId, GroupId;
|
||||||
|
public int Size;
|
||||||
|
public DateTime LastModified;
|
||||||
|
public uint Checksum;
|
||||||
|
public byte LinkIndicator;
|
||||||
|
public string LinkedFile;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Private attributes
|
||||||
|
private Stream stream;
|
||||||
|
private TarballHeader header;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructor
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new instance of a tarball archive reader.
|
||||||
|
/// </summary>
|
||||||
|
public TarballReader()
|
||||||
|
{
|
||||||
|
stream = null;
|
||||||
|
header = new TarballHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Public functions (unpack)
|
||||||
|
/// <summary>
|
||||||
|
/// Unpacks a tarball in a temporary folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="file">An URI to the tarball file.</param>
|
||||||
|
/// <returns>Storage folder pointing to where the files were unpacked.</returns>
|
||||||
|
public async Task<StorageFolder> Unpack (Uri file)
|
||||||
|
{
|
||||||
|
var stfile = await StorageFile.GetFileFromApplicationUriAsync(file);
|
||||||
|
return await this.Unpack(stfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unpacks a tarball in a specified folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="file">An URI to the tarball file.</param>
|
||||||
|
/// <param name="destination">A folder where files will be unpacked.</param>
|
||||||
|
/// <returns>Storage folder pointing to where the files were unpacked.</returns>
|
||||||
|
public async Task<StorageFolder> Unpack(Uri file, StorageFolder destination)
|
||||||
|
{
|
||||||
|
var stfile = await StorageFile.GetFileFromApplicationUriAsync(file);
|
||||||
|
return await this.Unpack(stfile, destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unpacks a tarball in a temporary folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="file">A path to the tarball file.</param>
|
||||||
|
/// <returns>Storage folder pointing to where the files were unpacked.</returns>
|
||||||
|
public async Task<StorageFolder> Unpack(string file)
|
||||||
|
{
|
||||||
|
var stfile = await StorageFile.GetFileFromPathAsync(file);
|
||||||
|
return await this.Unpack(stfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unpacks a tarball in a specified folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="file">A path to the tarball file.</param>
|
||||||
|
/// <param name="destination">A folder where files will be unpacked.</param>
|
||||||
|
/// <returns>Storage folder pointing to where the files were unpacked.</returns>
|
||||||
|
public async Task<StorageFolder> Unpack(string file, StorageFolder destination)
|
||||||
|
{
|
||||||
|
var stfile = await StorageFile.GetFileFromPathAsync(file);
|
||||||
|
return await this.Unpack(stfile, destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unpacks a tarball in a temporary folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="file">The tarball file.</param>
|
||||||
|
/// <returns>Storage folder pointing to where the files were unpacked.</returns>
|
||||||
|
public async Task<StorageFolder> Unpack(StorageFile file)
|
||||||
|
{
|
||||||
|
// Prepare temp folder
|
||||||
|
var dest = await this.CreateTempFolder();
|
||||||
|
|
||||||
|
// Unpack
|
||||||
|
await this.Initialize(file);
|
||||||
|
await this.UnpackFiles(dest);
|
||||||
|
this.Dispose();
|
||||||
|
|
||||||
|
// Results
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unpacks a tarball in a specified folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="file">The tarball file.</param>
|
||||||
|
/// <param name="destination">A folder where files will be unpacked.</param>
|
||||||
|
/// <returns>Storage folder pointing to where the files were unpacked.</returns>
|
||||||
|
public async Task<StorageFolder> Unpack(StorageFile file, StorageFolder destination)
|
||||||
|
{
|
||||||
|
// Unpack
|
||||||
|
await this.Initialize(file);
|
||||||
|
await this.UnpackFiles(destination);
|
||||||
|
this.Dispose();
|
||||||
|
|
||||||
|
// Results
|
||||||
|
return destination;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Initialize, dispose
|
||||||
|
/// <summary>
|
||||||
|
/// Performs initialization actions before unpacking (such as opening the stream).
|
||||||
|
/// </summary>
|
||||||
|
private async Task Initialize(StorageFile file)
|
||||||
|
{
|
||||||
|
var str = await file.OpenReadAsync();
|
||||||
|
this.stream = str.AsStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Performs cleanups after unpacking finished.
|
||||||
|
/// </summary>
|
||||||
|
private void Dispose()
|
||||||
|
{
|
||||||
|
// Clean up
|
||||||
|
this.stream.Dispose();
|
||||||
|
this.stream = null;
|
||||||
|
|
||||||
|
this.header = new TarballHeader();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Headers
|
||||||
|
/// <summary>
|
||||||
|
/// Calculates the checksum from a header.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="buffer">The header bytes</param>
|
||||||
|
private uint CalculateChecksum(byte[] buffer)
|
||||||
|
{
|
||||||
|
uint result = 0;
|
||||||
|
|
||||||
|
// Calculate sum of all bytes, with the exception of bytes 148-155
|
||||||
|
// (checksum field). These are all assumed to be 0x20.
|
||||||
|
for (int i = 0; i < buffer.Length; i++)
|
||||||
|
if (i >= 148 && i < 156)
|
||||||
|
result += 0x20;
|
||||||
|
else result += Convert.ToUInt32(buffer[i]);
|
||||||
|
|
||||||
|
// Done
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts binary data to a TarballHeader.
|
||||||
|
/// </summary>
|
||||||
|
private TarballHeader ParseHeaderFields(byte[] buffer)
|
||||||
|
{
|
||||||
|
TarballHeader header = new TarballHeader();
|
||||||
|
string temp;
|
||||||
|
|
||||||
|
// File name
|
||||||
|
temp = SharpDX.Text.ASCIIEncoding.ASCII.GetString(buffer, 0, 100).Trim('\0', ' ');
|
||||||
|
header.FileName = temp;
|
||||||
|
|
||||||
|
// File mode
|
||||||
|
temp = SharpDX.Text.ASCIIEncoding.ASCII.GetString(buffer, 100, 8).Trim('\0', ' ');
|
||||||
|
header.FileMode = (string.IsNullOrEmpty(temp)) ? 0 : Convert.ToUInt32(temp, 8);
|
||||||
|
|
||||||
|
// Owner id
|
||||||
|
temp = SharpDX.Text.ASCIIEncoding.ASCII.GetString(buffer, 108, 8).Trim('\0', ' ');
|
||||||
|
header.OwnerId = (string.IsNullOrEmpty(temp)) ? 0 : Convert.ToUInt32(temp, 8);
|
||||||
|
|
||||||
|
// Group id
|
||||||
|
temp = SharpDX.Text.ASCIIEncoding.ASCII.GetString(buffer, 116, 8).Trim('\0', ' ');
|
||||||
|
header.GroupId = (string.IsNullOrEmpty(temp)) ? 0 : Convert.ToUInt32(temp, 8);
|
||||||
|
|
||||||
|
// Size
|
||||||
|
temp = SharpDX.Text.ASCIIEncoding.ASCII.GetString(buffer, 124, 12).Trim('\0', ' ');
|
||||||
|
header.Size = (string.IsNullOrEmpty(temp)) ? 0 : Convert.ToInt32(temp, 8);
|
||||||
|
|
||||||
|
// Last modified date
|
||||||
|
temp = SharpDX.Text.ASCIIEncoding.ASCII.GetString(buffer, 136, 12).Trim('\0', ' ');
|
||||||
|
int seconds = (string.IsNullOrEmpty(temp)) ? 0 : Convert.ToInt32(temp, 8);
|
||||||
|
header.LastModified = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(seconds).ToLocalTime();
|
||||||
|
|
||||||
|
// Checksum
|
||||||
|
temp = SharpDX.Text.ASCIIEncoding.ASCII.GetString(buffer, 148, 8).Trim('\0', ' ');
|
||||||
|
header.Checksum = (string.IsNullOrEmpty(temp)) ? 0 : Convert.ToUInt32(temp, 8);
|
||||||
|
|
||||||
|
// Link indicator
|
||||||
|
header.LinkIndicator = buffer[156];
|
||||||
|
|
||||||
|
// Linked file
|
||||||
|
temp = SharpDX.Text.ASCIIEncoding.ASCII.GetString(buffer, 157, 100).Trim('\0', ' ');
|
||||||
|
header.LinkedFile = temp;
|
||||||
|
|
||||||
|
// Done
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads a file header.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if another header was read, false otherwise.</returns>
|
||||||
|
private async Task<bool> ReadNextFileHeader()
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[512];
|
||||||
|
|
||||||
|
// Check current position
|
||||||
|
if (stream.Position >= stream.Length)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Read header
|
||||||
|
await stream.ReadAsync(buffer, 0, 512);
|
||||||
|
|
||||||
|
// Parse header fields
|
||||||
|
this.header = this.ParseHeaderFields(buffer);
|
||||||
|
|
||||||
|
// Verify checksum
|
||||||
|
uint checksum = this.CalculateChecksum(buffer);
|
||||||
|
|
||||||
|
if (checksum == 256) // If 256 (only the checksum bytes different than 0), then
|
||||||
|
return false; // we most likely hit an invalid entry, probably marking the
|
||||||
|
// end of the file
|
||||||
|
if (checksum != header.Checksum)
|
||||||
|
throw new IOException("Invalid checksum!");
|
||||||
|
|
||||||
|
// Done
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region File system helpers
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a temporary folder.
|
||||||
|
/// </summary>
|
||||||
|
private async Task<StorageFolder> CreateTempFolder()
|
||||||
|
{
|
||||||
|
// Generate file name
|
||||||
|
string name = "tar" + DateTime.Now.Ticks.ToString();
|
||||||
|
|
||||||
|
// Create file
|
||||||
|
var temp = ApplicationData.Current.TemporaryFolder;
|
||||||
|
return await temp.CreateFolderAsync(name, CreationCollisionOption.GenerateUniqueName);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Unpack
|
||||||
|
/// <summary>
|
||||||
|
/// Unpacks a file using the information from the header.
|
||||||
|
/// The function assumes the header was previously read.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="destination">The destination file.</param>
|
||||||
|
private async Task UnpackNextFile(StorageFile destination)
|
||||||
|
{
|
||||||
|
// Open destination file
|
||||||
|
var str = await destination.OpenAsync(FileAccessMode.ReadWrite);
|
||||||
|
var iostr = str.AsStream();
|
||||||
|
|
||||||
|
// Write data
|
||||||
|
var buffer = new byte[512];
|
||||||
|
int read = 0, total = 0;
|
||||||
|
|
||||||
|
while (total < this.header.Size)
|
||||||
|
{
|
||||||
|
read = await this.stream.ReadAsync(buffer, 0, 512);
|
||||||
|
await iostr.WriteAsync(buffer, 0, Math.Min(read, this.header.Size - total));
|
||||||
|
total += read;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
await iostr.FlushAsync();
|
||||||
|
iostr.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unpacks the files from the loaded tarball.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="destination">Destination folder.</param>
|
||||||
|
private async Task UnpackFiles(StorageFolder destination)
|
||||||
|
{
|
||||||
|
if (this.stream == null)
|
||||||
|
throw new ArgumentNullException("No file opened!");
|
||||||
|
|
||||||
|
while (await this.ReadNextFileHeader())
|
||||||
|
{
|
||||||
|
// Directory?
|
||||||
|
if (this.header.FileName.EndsWith("/"))
|
||||||
|
await IOHelper.CreateFolderRelativeAsync(destination, this.header.FileName);
|
||||||
|
|
||||||
|
// Create file
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var file = await IOHelper.CreateFileRelativeAsync(destination, this.header.FileName);
|
||||||
|
await this.UnpackNextFile(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
BIN
DrumKit/Assets/ApplicationData.tar
Normal file
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 230 KiB |
Before Width: | Height: | Size: 228 KiB |
Before Width: | Height: | Size: 515 KiB |
Before Width: | Height: | Size: 372 KiB |
BIN
DrumKit/Assets/Logos/BadgeIcon.png
Normal file
After Width: | Height: | Size: 455 B |
Before Width: | Height: | Size: 801 B After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 329 B After Width: | Height: | Size: 524 B |
Before Width: | Height: | Size: 2.1 KiB |
BIN
DrumKit/Assets/Logos/SplashScreen.scale-100.png
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
DrumKit/Assets/Logos/SplashScreen.scale-140.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
DrumKit/Assets/Logos/SplashScreen.scale-180.png
Normal file
After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 429 B After Width: | Height: | Size: 1.3 KiB |
BIN
DrumKit/Assets/Logos/WideLogo.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
@ -1,40 +0,0 @@
|
|||||||
[Kick]
|
|
||||||
position=.41,.2
|
|
||||||
size=.3
|
|
||||||
image=ms-appx:///Assets/Drums/big_drum_of.png
|
|
||||||
sound,0=ms-appx:///Assets/Sounds/Kick07.wav
|
|
||||||
[Snare]
|
|
||||||
position=.16,.34
|
|
||||||
size=.25
|
|
||||||
image=ms-appx:///Assets/Drums/drum_of.png
|
|
||||||
sound,0=ms-appx:///Assets/Sounds/Snare08.wav
|
|
||||||
[High Tom]
|
|
||||||
position=.33,.05
|
|
||||||
size=.22
|
|
||||||
image=ms-appx:///Assets/Drums/drum_of.png
|
|
||||||
sound,0=ms-appx:///Assets/Sounds/TomHigh04.wav
|
|
||||||
[Low Tom]
|
|
||||||
position=.55,.05
|
|
||||||
size=.22
|
|
||||||
image=ms-appx:///Assets/Drums/drum_of.png
|
|
||||||
sound,0=ms-appx:///Assets/Sounds/TomLow04.wav
|
|
||||||
[Floor Tom]
|
|
||||||
position=.66,.44
|
|
||||||
size=.29
|
|
||||||
image=ms-appx:///Assets/Drums/drum_of.png
|
|
||||||
sound,0=ms-appx:///Assets/Sounds/Floor04.wav
|
|
||||||
[HiHat]
|
|
||||||
position=.03,.55
|
|
||||||
size=.21
|
|
||||||
image=ms-appx:///Assets/Drums/plate_off.png
|
|
||||||
sound,0=ms-appx:///Assets/Sounds/HiHatOpen04.wav
|
|
||||||
[Crash]
|
|
||||||
position=.1,.02
|
|
||||||
size=.25
|
|
||||||
image=ms-appx:///Assets/Drums/plate_off.png
|
|
||||||
sound,0=ms-appx:///Assets/Sounds/Crash05.wav
|
|
||||||
[Ride]
|
|
||||||
position=.72,.04
|
|
||||||
size=.25
|
|
||||||
image=ms-appx:///Assets/Drums/plate_off.png
|
|
||||||
sound,0=ms-appx:///Assets/Sounds/Ride04.wav
|
|
BIN
DrumKit/Build/7z.exe
Normal file
BIN
DrumKit/Build/ApplicationData/Drumkits/Default/Images/drum.png
Normal file
After Width: | Height: | Size: 204 KiB |
After Width: | Height: | Size: 200 KiB |
BIN
DrumKit/Build/ApplicationData/Drumkits/Default/Images/kick.png
Normal file
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 32 KiB |
BIN
DrumKit/Build/ApplicationData/Drumkits/Default/Images/pedal.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 3.4 KiB |
BIN
DrumKit/Build/ApplicationData/Drumkits/Default/Images/plate.png
Normal file
After Width: | Height: | Size: 458 KiB |
After Width: | Height: | Size: 282 KiB |
41
DrumKit/Build/ApplicationData/Drumkits/Default/config.xml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<drumkitConfig>
|
||||||
|
<drums>
|
||||||
|
<drumConfig targetId="defaultkick">
|
||||||
|
<volume>1.0</volume>
|
||||||
|
<vkey>A</vkey>
|
||||||
|
</drumConfig>
|
||||||
|
<drumConfig targetId="defaultsnare">
|
||||||
|
<volume>1.0</volume>
|
||||||
|
<vkey>B</vkey>
|
||||||
|
</drumConfig>
|
||||||
|
<drumConfig targetId="defaulthitom">
|
||||||
|
<volume>1.0</volume>
|
||||||
|
<vkey>C</vkey>
|
||||||
|
</drumConfig>
|
||||||
|
<drumConfig targetId="defaultlotom">
|
||||||
|
<volume>1.0</volume>
|
||||||
|
<vkey>D</vkey>
|
||||||
|
</drumConfig>
|
||||||
|
<drumConfig targetId="defaultfltom">
|
||||||
|
<volume>1.0</volume>
|
||||||
|
<vkey>E</vkey>
|
||||||
|
</drumConfig>
|
||||||
|
<drumConfig targetId="defaulthihatcl">
|
||||||
|
<volume>1.0</volume>
|
||||||
|
<vkey>F</vkey>
|
||||||
|
</drumConfig>
|
||||||
|
<drumConfig targetId="defaulthihatop">
|
||||||
|
<volume>1.0</volume>
|
||||||
|
<vkey>G</vkey>
|
||||||
|
</drumConfig>
|
||||||
|
<drumConfig targetId="defaultcrash">
|
||||||
|
<volume>1.0</volume>
|
||||||
|
<vkey>H</vkey>
|
||||||
|
</drumConfig>
|
||||||
|
<drumConfig targetId="defaultride">
|
||||||
|
<volume>1.0</volume>
|
||||||
|
<vkey>I</vkey>
|
||||||
|
</drumConfig>
|
||||||
|
</drums>
|
||||||
|
</drumkitConfig>
|
144
DrumKit/Build/ApplicationData/Drumkits/Default/drumkit.xml
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<drumkit>
|
||||||
|
|
||||||
|
<!-- General info -->
|
||||||
|
<name>Default</name>
|
||||||
|
<description>Default drums</description>
|
||||||
|
|
||||||
|
<!-- Files -->
|
||||||
|
<configfile>config.xml</configfile>
|
||||||
|
<layoutfile>layout.xml</layoutfile>
|
||||||
|
|
||||||
|
<!-- Drums -->
|
||||||
|
<drums>
|
||||||
|
<drum id="defaultkick">
|
||||||
|
<name>Kick</name>
|
||||||
|
<image>Images/kick.png</image>
|
||||||
|
<imagePressed>Images/kickPressed.png</imagePressed>
|
||||||
|
<sounds>
|
||||||
|
<sound intensity="0">Sounds/Kick07.wav</sound>
|
||||||
|
</sounds>
|
||||||
|
</drum>
|
||||||
|
|
||||||
|
<drum id="defaultsnare">
|
||||||
|
<name>Snare</name>
|
||||||
|
<image>Images/drum.png</image>
|
||||||
|
<imagePressed>Images/drumPressed.png</imagePressed>
|
||||||
|
<sounds>
|
||||||
|
<sound intensity="0">Sounds/Snare08.wav</sound>
|
||||||
|
</sounds>
|
||||||
|
</drum>
|
||||||
|
|
||||||
|
<drum id="defaulthitom">
|
||||||
|
<name>High Tom</name>
|
||||||
|
<image>Images/drum.png</image>
|
||||||
|
<imagePressed>Images/drumPressed.png</imagePressed>
|
||||||
|
<sounds>
|
||||||
|
<sound intensity="0">Sounds/TomHigh04.wav</sound>
|
||||||
|
</sounds>
|
||||||
|
</drum>
|
||||||
|
|
||||||
|
<drum id="defaultlotom">
|
||||||
|
<name>Low Tom</name>
|
||||||
|
<image>Images/drum.png</image>
|
||||||
|
<imagePressed>Images/drumPressed.png</imagePressed>
|
||||||
|
<sounds>
|
||||||
|
<sound intensity="0">Sounds/TomLow04.wav</sound>
|
||||||
|
</sounds>
|
||||||
|
</drum>
|
||||||
|
|
||||||
|
<drum id="defaultfltom">
|
||||||
|
<name>Floor Tom</name>
|
||||||
|
<image>Images/drum.png</image>
|
||||||
|
<imagePressed>Images/drumPressed.png</imagePressed>
|
||||||
|
<sounds>
|
||||||
|
<sound intensity="0">Sounds/Floor04.wav</sound>
|
||||||
|
</sounds>
|
||||||
|
</drum>
|
||||||
|
|
||||||
|
<drum id="defaulthihatcl">
|
||||||
|
<name>Hi-Hat Closed (pedal)</name>
|
||||||
|
<image>Images/pedal.png</image>
|
||||||
|
<imagePressed>Images/pedalPressed.png</imagePressed>
|
||||||
|
<sounds>
|
||||||
|
<sound intensity="0">Sounds/HiHatClosed04.wav</sound>
|
||||||
|
</sounds>
|
||||||
|
</drum>
|
||||||
|
|
||||||
|
<drum id="defaulthihatop">
|
||||||
|
<name>Hi-Hat Opened</name>
|
||||||
|
<image>Images/plate.png</image>
|
||||||
|
<imagePressed>Images/platePressed.png</imagePressed>
|
||||||
|
<sounds>
|
||||||
|
<sound intensity="0">Sounds/HiHatOpen04.wav</sound>
|
||||||
|
</sounds>
|
||||||
|
</drum>
|
||||||
|
|
||||||
|
<drum id="defaultcrash">
|
||||||
|
<name>Crash</name>
|
||||||
|
<image>Images/plate.png</image>
|
||||||
|
<imagePressed>Images/platePressed.png</imagePressed>
|
||||||
|
<sounds>
|
||||||
|
<sound intensity="0">Sounds/Crash05.wav</sound>
|
||||||
|
</sounds>
|
||||||
|
</drum>
|
||||||
|
|
||||||
|
<drum id="defaultride">
|
||||||
|
<name>Ride</name>
|
||||||
|
<image>Images/plate.png</image>
|
||||||
|
<imagePressed>Images/platePressed.png</imagePressed>
|
||||||
|
<sounds>
|
||||||
|
<sound intensity="0">Sounds/Ride04.wav</sound>
|
||||||
|
</sounds>
|
||||||
|
</drum>
|
||||||
|
|
||||||
|
</drums>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
[Kick]
|
||||||
|
position=.41,.2
|
||||||
|
size=.3
|
||||||
|
image=ms-appx:///Assets/Drums/big_drum_of.png
|
||||||
|
sound,0=ms-appx:///Assets/Sounds/Kick07.wav
|
||||||
|
[Snare]
|
||||||
|
position=.16,.34
|
||||||
|
size=.25
|
||||||
|
image=ms-appx:///Assets/Drums/drum_of.png
|
||||||
|
sound,0=ms-appx:///Assets/Sounds/Snare08.wav
|
||||||
|
[High Tom]
|
||||||
|
position=.33,.05
|
||||||
|
size=.22
|
||||||
|
image=ms-appx:///Assets/Drums/drum_of.png
|
||||||
|
sound,0=ms-appx:///Assets/Sounds/TomHigh04.wav
|
||||||
|
[Low Tom]
|
||||||
|
position=.55,.05
|
||||||
|
size=.22
|
||||||
|
image=ms-appx:///Assets/Drums/drum_of.png
|
||||||
|
sound,0=ms-appx:///Assets/Sounds/TomLow04.wav
|
||||||
|
[Floor Tom]
|
||||||
|
position=.66,.44
|
||||||
|
size=.29
|
||||||
|
image=ms-appx:///Assets/Drums/drum_of.png
|
||||||
|
sound,0=ms-appx:///Assets/Sounds/Floor04.wav
|
||||||
|
[Hi-Hat Closed]
|
||||||
|
position=.10,.87
|
||||||
|
size=.05
|
||||||
|
image=ms-appx:///Assets/Drums/HiHat_off.png
|
||||||
|
sound,0=ms-appx:///Assets/Sounds/HiHatClosed04.wav
|
||||||
|
[Hi-Hat Opened]
|
||||||
|
position=.03,.55
|
||||||
|
size=.21
|
||||||
|
image=ms-appx:///Assets/Drums/plate_off.png
|
||||||
|
sound,0=ms-appx:///Assets/Sounds/HiHatOpen04.wav
|
||||||
|
[Crash]
|
||||||
|
position=.1,.02
|
||||||
|
size=.25
|
||||||
|
image=ms-appx:///Assets/Drums/plate_off.png
|
||||||
|
sound,0=ms-appx:///Assets/Sounds/Crash05.wav
|
||||||
|
[Ride]
|
||||||
|
position=.72,.04
|
||||||
|
size=.25
|
||||||
|
image=ms-appx:///Assets/Drums/plate_off.png
|
||||||
|
sound,0=ms-appx:///Assets/Sounds/Ride04.wav-->
|
||||||
|
</drumkit>
|
77
DrumKit/Build/ApplicationData/Drumkits/Default/layout.xml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
|
||||||
|
<drumkitLayoutCollection>
|
||||||
|
|
||||||
|
<items>
|
||||||
|
<!-- Standard layout - all views -->
|
||||||
|
<drumkitLayout>
|
||||||
|
<name>Standard layout</name>
|
||||||
|
<targetView>Snapped|Landscape|Filled|Portrait</targetView>
|
||||||
|
<isDefault>true</isDefault>
|
||||||
|
|
||||||
|
<drums>
|
||||||
|
<drumLayout targetId="defaultkick">
|
||||||
|
<size>.3</size>
|
||||||
|
<x>.41</x>
|
||||||
|
<y>.2</y>
|
||||||
|
<zindex>0</zindex>
|
||||||
|
</drumLayout>
|
||||||
|
<drumLayout targetId="defaultsnare">
|
||||||
|
<size>.25</size>
|
||||||
|
<x>.16</x>
|
||||||
|
<y>.34</y>
|
||||||
|
<zindex>2</zindex>
|
||||||
|
<angle>61</angle>
|
||||||
|
</drumLayout>
|
||||||
|
<drumLayout targetId="defaulthitom">
|
||||||
|
<size>.22</size>
|
||||||
|
<x>.33</x>
|
||||||
|
<y>.05</y>
|
||||||
|
<zindex>1</zindex>
|
||||||
|
<angle>150</angle>
|
||||||
|
</drumLayout>
|
||||||
|
<drumLayout targetId="defaultlotom">
|
||||||
|
<size>.22</size>
|
||||||
|
<x>.55</x>
|
||||||
|
<y>.05</y>
|
||||||
|
<zindex>1</zindex>
|
||||||
|
<angle>150</angle>
|
||||||
|
</drumLayout>
|
||||||
|
<drumLayout targetId="defaultfltom">
|
||||||
|
<size>.29</size>
|
||||||
|
<x>.66</x>
|
||||||
|
<y>.44</y>
|
||||||
|
<zindex>1</zindex>
|
||||||
|
<angle>-30</angle>
|
||||||
|
</drumLayout>
|
||||||
|
<drumLayout targetId="defaulthihatcl">
|
||||||
|
<size>.055</size>
|
||||||
|
<x>.11</x>
|
||||||
|
<y>.89</y>
|
||||||
|
<zindex>3</zindex>
|
||||||
|
</drumLayout>
|
||||||
|
<drumLayout targetId="defaulthihatop">
|
||||||
|
<size>.21</size>
|
||||||
|
<x>.03</x>
|
||||||
|
<y>.55</y>
|
||||||
|
<zindex>4</zindex>
|
||||||
|
<angle>80</angle>
|
||||||
|
</drumLayout>
|
||||||
|
<drumLayout targetId="defaultcrash">
|
||||||
|
<size>.26</size>
|
||||||
|
<x>.1</x>
|
||||||
|
<y>.02</y>
|
||||||
|
<zindex>4</zindex>
|
||||||
|
<angle>80</angle>
|
||||||
|
</drumLayout>
|
||||||
|
<drumLayout targetId="defaultride">
|
||||||
|
<size>.25</size>
|
||||||
|
<x>.72</x>
|
||||||
|
<y>.04</y>
|
||||||
|
<zindex>4</zindex>
|
||||||
|
</drumLayout>
|
||||||
|
</drums>
|
||||||
|
</drumkitLayout>
|
||||||
|
</items>
|
||||||
|
|
||||||
|
</drumkitLayoutCollection>
|
@ -424,7 +424,13 @@
|
|||||||
<Setter Property="Content" Value=""/>
|
<Setter Property="Content" Value=""/>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<!--
|
<Style x:Key="VideoAppBarButtonStyle" TargetType="ButtonBase" BasedOn="{StaticResource AppBarButtonStyle}">
|
||||||
|
<Setter Property="AutomationProperties.AutomationId" Value="VideoAppBarButton"/>
|
||||||
|
<Setter Property="AutomationProperties.Name" Value="Video"/>
|
||||||
|
<Setter Property="Content" Value=""/>
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
<Style x:Key="SkipBackAppBarButtonStyle" TargetType="ButtonBase" BasedOn="{StaticResource AppBarButtonStyle}">
|
<Style x:Key="SkipBackAppBarButtonStyle" TargetType="ButtonBase" BasedOn="{StaticResource AppBarButtonStyle}">
|
||||||
<Setter Property="AutomationProperties.AutomationId" Value="SkipBackAppBarButton"/>
|
<Setter Property="AutomationProperties.AutomationId" Value="SkipBackAppBarButton"/>
|
||||||
@ -525,10 +531,7 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
<Style x:Key="VideoAppBarButtonStyle" TargetType="ButtonBase" BasedOn="{StaticResource AppBarButtonStyle}">
|
|
||||||
<Setter Property="AutomationProperties.AutomationId" Value="VideoAppBarButton"/>
|
|
||||||
<Setter Property="AutomationProperties.Name" Value="Video"/>
|
|
||||||
<Setter Property="Content" Value=""/>
|
|
||||||
</Style>
|
</Style>
|
||||||
<Style x:Key="RefreshAppBarButtonStyle" TargetType="ButtonBase" BasedOn="{StaticResource AppBarButtonStyle}">
|
<Style x:Key="RefreshAppBarButtonStyle" TargetType="ButtonBase" BasedOn="{StaticResource AppBarButtonStyle}">
|
||||||
<Setter Property="AutomationProperties.AutomationId" Value="RefreshAppBarButton"/>
|
<Setter Property="AutomationProperties.AutomationId" Value="RefreshAppBarButton"/>
|
||||||
|
29
DrumKit/Domain/AppSettings.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[XmlType("drumkitSettings")]
|
||||||
|
public class AppSettings
|
||||||
|
{
|
||||||
|
[XmlElement("currentKit")]
|
||||||
|
public string CurrentKit { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("showKeys")]
|
||||||
|
public bool ShowKeyBindings { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("animations")]
|
||||||
|
public bool Animations { get; set; }
|
||||||
|
|
||||||
|
public AppSettings()
|
||||||
|
{
|
||||||
|
this.CurrentKit = "Default";
|
||||||
|
this.ShowKeyBindings = false;
|
||||||
|
this.Animations = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
53
DrumKit/Domain/Drum.cs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[XmlType("drum")]
|
||||||
|
public class Drum
|
||||||
|
{
|
||||||
|
#region Public properties
|
||||||
|
[XmlAttribute("id")]
|
||||||
|
public string Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the name of the drum.
|
||||||
|
/// </summary>
|
||||||
|
[XmlElement("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the image uri.
|
||||||
|
/// </summary>
|
||||||
|
[XmlElement("image")]
|
||||||
|
public string ImageSource { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the image uri.
|
||||||
|
/// </summary>
|
||||||
|
[XmlElement("imagePressed")]
|
||||||
|
public string ImagePressedSource { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the list of sound sources.
|
||||||
|
/// </summary>
|
||||||
|
[XmlArray("sounds")]
|
||||||
|
public List<SoundSource> Sounds { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructor
|
||||||
|
public Drum()
|
||||||
|
{
|
||||||
|
this.Name = null;
|
||||||
|
this.ImageSource = null;
|
||||||
|
this.ImagePressedSource = null;
|
||||||
|
this.Sounds = new List<SoundSource>();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
50
DrumKit/Domain/DrumConfig.cs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[XmlType("drumConfig")]
|
||||||
|
public class DrumConfig
|
||||||
|
{
|
||||||
|
[XmlAttribute("targetId")]
|
||||||
|
public string TargetId { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("enabled")]
|
||||||
|
public bool IsEnabled { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("volume")]
|
||||||
|
public double Volume {
|
||||||
|
get {
|
||||||
|
if (this.VolumeL != this.VolumeR)
|
||||||
|
return double.NaN;
|
||||||
|
return this.VolumeL;
|
||||||
|
}
|
||||||
|
|
||||||
|
set {
|
||||||
|
if (!double.IsNaN(value))
|
||||||
|
this.VolumeL = this.VolumeR = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[XmlElement("volumeL")]
|
||||||
|
public double VolumeL { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("volumeR")]
|
||||||
|
public double VolumeR { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("vkey")]
|
||||||
|
public Windows.System.VirtualKey Key { get; set; }
|
||||||
|
|
||||||
|
public DrumConfig()
|
||||||
|
{
|
||||||
|
this.TargetId = null;
|
||||||
|
this.Volume = 1.0;
|
||||||
|
this.IsEnabled = true;
|
||||||
|
this.Key = Windows.System.VirtualKey.None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
41
DrumKit/Domain/DrumLayout.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[XmlType("drumLayout")]
|
||||||
|
public class DrumLayout
|
||||||
|
{
|
||||||
|
[XmlAttribute("targetId")]
|
||||||
|
public string TargetId { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("size")]
|
||||||
|
public double Size { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("x")]
|
||||||
|
public double X { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("y")]
|
||||||
|
public double Y { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("zindex")]
|
||||||
|
public int ZIndex { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("angle")]
|
||||||
|
public double Angle { get; set; }
|
||||||
|
|
||||||
|
public DrumLayout()
|
||||||
|
{
|
||||||
|
this.TargetId = null;
|
||||||
|
this.Size = .1;
|
||||||
|
this.X = 0;
|
||||||
|
this.Y = 0;
|
||||||
|
this.ZIndex = 0;
|
||||||
|
this.Angle = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
DrumKit/Domain/Drumkit.cs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[XmlType("drumkit")]
|
||||||
|
public class Drumkit
|
||||||
|
{
|
||||||
|
[XmlElement("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("description")]
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("configfile")]
|
||||||
|
public string ConfigFilePath { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("layoutfile")]
|
||||||
|
public string LayoutFilePath { get; set; }
|
||||||
|
|
||||||
|
[XmlArray("drums")]
|
||||||
|
public List<Drum> Drums { get; set; }
|
||||||
|
|
||||||
|
public Drumkit()
|
||||||
|
{
|
||||||
|
this.Name = null;
|
||||||
|
this.Description = null;
|
||||||
|
this.ConfigFilePath = null;
|
||||||
|
this.LayoutFilePath = null;
|
||||||
|
this.Drums = new List<Drum>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
DrumKit/Domain/DrumkitConfig.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[XmlType("drumkitConfig")]
|
||||||
|
public class DrumkitConfig
|
||||||
|
{
|
||||||
|
[XmlArray("drums")]
|
||||||
|
public List<DrumConfig> Drums { get; set; }
|
||||||
|
}
|
||||||
|
}
|
80
DrumKit/Domain/DrumkitLayout.cs
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[XmlType("drumkitLayout")]
|
||||||
|
public class DrumkitLayout
|
||||||
|
{
|
||||||
|
[XmlElement("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
[XmlIgnore()]
|
||||||
|
public DrumkitLayoutTargetView TargetView { get; set; }
|
||||||
|
|
||||||
|
[XmlElement("targetView")]
|
||||||
|
private string TargetViewSerialize
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (this.TargetView == DrumkitLayoutTargetView.All)
|
||||||
|
return "All";
|
||||||
|
|
||||||
|
if (this.TargetView == DrumkitLayoutTargetView.None)
|
||||||
|
return "None";
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string str = "";
|
||||||
|
|
||||||
|
if ((this.TargetView & DrumkitLayoutTargetView.Filled) != 0)
|
||||||
|
str += "Filled|";
|
||||||
|
|
||||||
|
if ((this.TargetView & DrumkitLayoutTargetView.Landscape) != 0)
|
||||||
|
str += "Landscape|";
|
||||||
|
|
||||||
|
if ((this.TargetView & DrumkitLayoutTargetView.Portrait) != 0)
|
||||||
|
str += "Portrait|";
|
||||||
|
|
||||||
|
if ((this.TargetView & DrumkitLayoutTargetView.Snapped) != 0)
|
||||||
|
str += "Snapped|";
|
||||||
|
|
||||||
|
return str.TrimEnd('|');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this.TargetView = DrumkitLayoutTargetView.None;
|
||||||
|
foreach (var i in value.Split('|'))
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case "Filled": this.TargetView |= DrumkitLayoutTargetView.Filled; break;
|
||||||
|
case "Landscape": this.TargetView |= DrumkitLayoutTargetView.Landscape; break;
|
||||||
|
case "Portrait": this.TargetView |= DrumkitLayoutTargetView.Portrait; break;
|
||||||
|
case "Snapped": this.TargetView |= DrumkitLayoutTargetView.Snapped; break;
|
||||||
|
case "All": this.TargetView |= DrumkitLayoutTargetView.All; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[XmlElement("isDefault")]
|
||||||
|
public bool IsDefault { get; set; }
|
||||||
|
|
||||||
|
[XmlArray("drums")]
|
||||||
|
public List<DrumLayout> Drums { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public DrumkitLayout()
|
||||||
|
{
|
||||||
|
this.Name = null;
|
||||||
|
this.IsDefault = false;
|
||||||
|
this.Drums = new List<DrumLayout>();
|
||||||
|
this.TargetView = DrumkitLayoutTargetView.All;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
21
DrumKit/Domain/DrumkitLayoutCollection.cs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[XmlType("drumkitLayoutCollection")]
|
||||||
|
public class DrumkitLayoutCollection
|
||||||
|
{
|
||||||
|
[XmlArray("items")]
|
||||||
|
public List<DrumkitLayout> Items { get; set; }
|
||||||
|
|
||||||
|
public DrumkitLayoutCollection()
|
||||||
|
{
|
||||||
|
this.Items = new List<DrumkitLayout>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
19
DrumKit/Domain/DrumkitLayoutTargetView.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
public enum DrumkitLayoutTargetView
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Snapped = 1,
|
||||||
|
Filled = 2,
|
||||||
|
Landscape = 4,
|
||||||
|
Portrait = 8,
|
||||||
|
All = Snapped | Filled | Landscape | Portrait
|
||||||
|
}
|
||||||
|
}
|
19
DrumKit/Domain/SoundSource.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
[XmlType("sound")]
|
||||||
|
public class SoundSource
|
||||||
|
{
|
||||||
|
[XmlAttribute("intensity")]
|
||||||
|
public int Intensity { get; set; }
|
||||||
|
|
||||||
|
[XmlText()]
|
||||||
|
public string Source { get; set; }
|
||||||
|
}
|
||||||
|
}
|
107
DrumKit/Drum.cs
@ -1,107 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Windows.Foundation;
|
|
||||||
using Windows.Foundation.Collections;
|
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
|
||||||
using Windows.UI.Xaml.Controls.Primitives;
|
|
||||||
using Windows.UI.Xaml.Data;
|
|
||||||
using Windows.UI.Xaml.Input;
|
|
||||||
using Windows.UI.Xaml.Media;
|
|
||||||
using Windows.UI.Xaml.Media.Imaging;
|
|
||||||
using Windows.UI.Xaml.Navigation;
|
|
||||||
|
|
||||||
namespace DrumKit
|
|
||||||
{
|
|
||||||
class Drum
|
|
||||||
{
|
|
||||||
#region Attributes
|
|
||||||
private Uri imageSource;
|
|
||||||
private Point position;
|
|
||||||
private double size;
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Public properties
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the name of the drum.
|
|
||||||
/// </summary>
|
|
||||||
public string Name { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the image uri. If enabled, the image is loaded.
|
|
||||||
/// </summary>
|
|
||||||
public Uri ImageSource {
|
|
||||||
get { return this.imageSource; }
|
|
||||||
set { this.SetImageSource(value); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the position of the element on the screen.
|
|
||||||
/// </summary>
|
|
||||||
public Point Position {
|
|
||||||
get { return this.position; }
|
|
||||||
set { this.SetPosition(value); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the size of the image displayed on the screen.
|
|
||||||
/// </summary>
|
|
||||||
public double Size {
|
|
||||||
get { return this.size; }
|
|
||||||
set { this.size = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sound sources
|
|
||||||
/// </summary>
|
|
||||||
public Dictionary<int, Uri> SoundSources
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Constructor
|
|
||||||
public Drum()
|
|
||||||
{
|
|
||||||
// Initialize sources
|
|
||||||
this.SoundSources = new Dictionary<int, Uri>();
|
|
||||||
this.imageSource = null;
|
|
||||||
|
|
||||||
// Set up other vars
|
|
||||||
this.position = new Point(0, 0);
|
|
||||||
this.size = 0;
|
|
||||||
this.Name = "<unnamed>";
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Setters
|
|
||||||
public void SetImageSource(Uri imagesrc)
|
|
||||||
{
|
|
||||||
// Set property
|
|
||||||
this.imageSource = imagesrc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetPosition(Point location)
|
|
||||||
{
|
|
||||||
// Set property
|
|
||||||
this.position = location;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetSoundSource(int intensity, Uri source)
|
|
||||||
{
|
|
||||||
// Set up sound source
|
|
||||||
if (this.SoundSources.ContainsKey(intensity))
|
|
||||||
this.SoundSources[intensity] = source;
|
|
||||||
|
|
||||||
else this.SoundSources.Add(intensity, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -12,7 +12,10 @@
|
|||||||
<DefaultLanguage>en-US</DefaultLanguage>
|
<DefaultLanguage>en-US</DefaultLanguage>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<ProjectTypeGuids>{BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
<ProjectTypeGuids>{BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
<PackageCertificateKeyFile>DrumKit_TemporaryKey.pfx</PackageCertificateKeyFile>
|
<PackageCertificateKeyFile>DrumKit_StoreKey.pfx</PackageCertificateKeyFile>
|
||||||
|
<AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>
|
||||||
|
<PackageCertificateThumbprint>4FCCD6DD6F5D1EEA43AC26BB8D451F1B54209922</PackageCertificateThumbprint>
|
||||||
|
<AppxSymbolPackageEnabled>True</AppxSymbolPackageEnabled>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
@ -103,46 +106,75 @@
|
|||||||
<Compile Include="App.xaml.cs">
|
<Compile Include="App.xaml.cs">
|
||||||
<DependentUpon>App.xaml</DependentUpon>
|
<DependentUpon>App.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Drum.cs" />
|
<Compile Include="Archiving\TarballReader.cs" />
|
||||||
<Compile Include="MainPage.xaml.cs">
|
<Compile Include="Domain\AppSettings.cs" />
|
||||||
|
<Compile Include="IOHelper.cs" />
|
||||||
|
<Compile Include="Log.cs" />
|
||||||
|
<Compile Include="Managers\DataManager.cs" />
|
||||||
|
<Compile Include="Domain\Drum.cs" />
|
||||||
|
<Compile Include="Domain\DrumConfig.cs" />
|
||||||
|
<Compile Include="Domain\Drumkit.cs" />
|
||||||
|
<Compile Include="Domain\DrumkitConfig.cs" />
|
||||||
|
<Compile Include="Domain\DrumkitLayout.cs" />
|
||||||
|
<Compile Include="Domain\DrumkitLayoutCollection.cs" />
|
||||||
|
<Compile Include="Domain\DrumkitLayoutTargetView.cs" />
|
||||||
|
<Compile Include="Domain\DrumLayout.cs" />
|
||||||
|
<Compile Include="Managers\DrumsManager.cs" />
|
||||||
|
<Compile Include="Managers\UIManager.cs" />
|
||||||
|
<Compile Include="UI\DrumUI.cs" />
|
||||||
|
<Compile Include="UI\LoadingPage.xaml.cs">
|
||||||
|
<DependentUpon>LoadingPage.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="UI\MainPage.xaml.cs">
|
||||||
<DependentUpon>MainPage.xaml</DependentUpon>
|
<DependentUpon>MainPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Recorder.cs" />
|
<Compile Include="Recorder.cs" />
|
||||||
<Compile Include="Repository\DrumRepository.cs" />
|
<Compile Include="Managers\SoundManager.cs" />
|
||||||
<Compile Include="SoundPlayer.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="SoundPool.cs" />
|
<Compile Include="SoundPool.cs" />
|
||||||
|
<Compile Include="Domain\SoundSource.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AppxManifest Include="Package.appxmanifest">
|
<AppxManifest Include="Package.appxmanifest">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</AppxManifest>
|
</AppxManifest>
|
||||||
|
<Content Include="Assets\ApplicationData.tar" />
|
||||||
|
<None Include="Build\7z.exe" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\config.xml" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\drumkit.xml" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Images\drum.png" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Images\drumPressed.png" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Images\kick.png" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Images\kickPressed.png" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Images\pedal.png" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Images\pedalPressed.png" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Images\plate.png" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Images\platePressed.png" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\layout.xml" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\Crash05.wav" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\Floor04.wav" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\Hat04.WAV" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\HiHatClosed04.wav" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\HiHatOpen04.wav" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\Kick07.wav" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\Ride04.wav" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\Snare08.wav" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\TomHigh04.wav" />
|
||||||
|
<None Include="Build\ApplicationData\Drumkits\Default\Sounds\TomLow04.wav" />
|
||||||
|
<None Include="DrumKit_StoreKey.pfx" />
|
||||||
<None Include="DrumKit_TemporaryKey.pfx" />
|
<None Include="DrumKit_TemporaryKey.pfx" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="Assets\bg.png" />
|
<Content Include="Assets\bg.png" />
|
||||||
<Content Include="Assets\Drums\big_drum_of.png" />
|
<Content Include="Assets\Logos\BadgeIcon.png" />
|
||||||
<Content Include="Assets\Drums\big_drum_on.png" />
|
<Content Include="Assets\Logos\SplashScreen.scale-140.png" />
|
||||||
<Content Include="Assets\Drums\drum_of.png" />
|
<Content Include="Assets\Logos\SplashScreen.scale-180.png" />
|
||||||
<Content Include="Assets\Drums\drum_on.png" />
|
<Content Include="Assets\Logos\WideLogo.png" />
|
||||||
<Content Include="Assets\Sounds\Crash05.wav" />
|
|
||||||
<Content Include="Assets\Sounds\Hat04.WAV" />
|
|
||||||
<Content Include="Assets\Sounds\HiHatOpen04.wav" />
|
|
||||||
<Content Include="Assets\Sounds\Kick07.wav" />
|
|
||||||
<Content Include="Assets\default">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</Content>
|
|
||||||
<Content Include="Assets\Logos\Logo.png" />
|
<Content Include="Assets\Logos\Logo.png" />
|
||||||
<Content Include="Assets\Logos\SmallLogo.png" />
|
<Content Include="Assets\Logos\SmallLogo.png" />
|
||||||
<Content Include="Assets\Logos\SplashScreen.png" />
|
<Content Include="Assets\Logos\SplashScreen.scale-100.png" />
|
||||||
<Content Include="Assets\Logos\StoreLogo.png" />
|
<Content Include="Assets\Logos\StoreLogo.png" />
|
||||||
<Content Include="Assets\Drums\plate_off.png" />
|
<None Include="Package.StoreAssociation.xml" />
|
||||||
<Content Include="Assets\Drums\plate_on.png" />
|
|
||||||
<Content Include="Assets\Sounds\Ride04.wav" />
|
|
||||||
<Content Include="Assets\Sounds\Snare08.wav" />
|
|
||||||
<Content Include="Assets\Sounds\TomHigh04.wav" />
|
|
||||||
<Content Include="Assets\Sounds\Floor04.wav" />
|
|
||||||
<Content Include="Assets\Sounds\TomLow04.wav" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ApplicationDefinition Include="App.xaml">
|
<ApplicationDefinition Include="App.xaml">
|
||||||
@ -153,17 +185,23 @@
|
|||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Page>
|
||||||
<Page Include="MainPage.xaml">
|
<Page Include="UI\LoadingPage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="UI\MainPage.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Page>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="SharpDX">
|
<Reference Include="SharpDX, Version=2.4.2.0, Culture=neutral, PublicKeyToken=627a3d6d1956f55a, processorArchitecture=MSIL">
|
||||||
<HintPath>C:\Users\Tiberiu\Downloads\SharpDX\Bin\Standard-winrt\SharpDX.dll</HintPath>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\..\..\WebDownloads\SharpDX242\Bin\Signed-winrt\SharpDX.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="SharpDX.XAudio2">
|
<Reference Include="SharpDX.XAudio2, Version=2.4.2.0, Culture=neutral, PublicKeyToken=627a3d6d1956f55a, processorArchitecture=MSIL">
|
||||||
<HintPath>C:\Users\Tiberiu\Downloads\SharpDX\Bin\Standard-winrt\SharpDX.XAudio2.dll</HintPath>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\..\..\WebDownloads\SharpDX242\Bin\Signed-winrt\SharpDX.XAudio2.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
@ -171,6 +209,9 @@
|
|||||||
<VisualStudioVersion>11.0</VisualStudioVersion>
|
<VisualStudioVersion>11.0</VisualStudioVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
|
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<PreBuildEvent>"$(ProjectDir)\Build\7z.exe" a -ttar -y "$(ProjectDir)\Assets\ApplicationData.tar" "$(ProjectDir)\Build\ApplicationData\*"</PreBuildEvent>
|
||||||
|
</PropertyGroup>
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- 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.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
|
@ -3,4 +3,9 @@
|
|||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
||||||
<UseSimulator>False</UseSimulator>
|
<UseSimulator>False</UseSimulator>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<AppxPackageIsForStore>True</AppxPackageIsForStore>
|
||||||
|
<AppxShowAllApps>True</AppxShowAllApps>
|
||||||
|
<AppxBuildConfigurationSelection>neutral</AppxBuildConfigurationSelection>
|
||||||
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
BIN
DrumKit/DrumKit_StoreKey.pfx
Normal file
86
DrumKit/IOHelper.cs
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Windows.Storage;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
static class IOHelper
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a folder using relative path.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<StorageFolder> GetFolderRelativeAsync(StorageFolder root, string path)
|
||||||
|
{
|
||||||
|
// Split the path
|
||||||
|
var splitpath = path.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
var currentdir = root;
|
||||||
|
|
||||||
|
// Browse to the last folder in the path
|
||||||
|
for (int i = 0; i < splitpath.Length; i++)
|
||||||
|
currentdir = await currentdir.GetFolderAsync(splitpath[i]);
|
||||||
|
|
||||||
|
// Return file
|
||||||
|
return currentdir;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a file using relative path
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<StorageFile> GetFileRelativeAsync(StorageFolder root, string path)
|
||||||
|
{
|
||||||
|
// Split the path
|
||||||
|
var dir = await GetFolderRelativeAsync(root, System.IO.Path.GetDirectoryName(path));
|
||||||
|
|
||||||
|
// Return file
|
||||||
|
return await dir.GetFileAsync(System.IO.Path.GetFileName(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a folder using relative path.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<StorageFolder> CreateFolderRelativeAsync(StorageFolder root, string path)
|
||||||
|
{
|
||||||
|
// Split the path
|
||||||
|
var splitpath = path.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
var currentdir = root;
|
||||||
|
|
||||||
|
// Browse to the last folder in the path
|
||||||
|
for (int i = 0; i < splitpath.Length - 1; i++)
|
||||||
|
currentdir = await currentdir.GetFolderAsync(splitpath[i]);
|
||||||
|
|
||||||
|
// Create folder
|
||||||
|
return await currentdir.CreateFolderAsync(splitpath.Last(), CreationCollisionOption.ReplaceExisting);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a file using a relative path.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<StorageFile> CreateFileRelativeAsync(StorageFolder root, string path)
|
||||||
|
{
|
||||||
|
var currentdir = await GetFolderRelativeAsync(root, System.IO.Path.GetDirectoryName(path));
|
||||||
|
|
||||||
|
// Create file
|
||||||
|
return await currentdir.CreateFileAsync(System.IO.Path.GetFileName(path), CreationCollisionOption.ReplaceExisting);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads an image, and returns an ImageSource (using relative path)
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<Windows.UI.Xaml.Media.ImageSource> GetImageAsync(StorageFolder root, string path)
|
||||||
|
{
|
||||||
|
// Open file
|
||||||
|
var file = await GetFileRelativeAsync(root, path);
|
||||||
|
var stream = await file.OpenReadAsync();
|
||||||
|
|
||||||
|
// Get image
|
||||||
|
var image = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
|
||||||
|
await image.SetSourceAsync(stream);
|
||||||
|
|
||||||
|
// Return result
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
63
DrumKit/Log.cs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Windows.Storage;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
static class Log
|
||||||
|
{
|
||||||
|
private static StreamWriter output = null;
|
||||||
|
|
||||||
|
public static async Task Initialize()
|
||||||
|
{
|
||||||
|
// Create "Logs" folder if not created
|
||||||
|
var folder = await ApplicationData.Current.RoamingFolder.CreateFolderAsync("AppLogs", CreationCollisionOption.OpenIfExists);
|
||||||
|
|
||||||
|
// Create a log file
|
||||||
|
var file = await folder.CreateFileAsync(DateTime.Now.Ticks.ToString() + ".csv", CreationCollisionOption.GenerateUniqueName);
|
||||||
|
|
||||||
|
// Open stream
|
||||||
|
var stream = await file.OpenAsync(FileAccessMode.ReadWrite);
|
||||||
|
var iostream = stream.AsStream();
|
||||||
|
output = new StreamWriter(iostream);
|
||||||
|
output.AutoFlush = true;
|
||||||
|
|
||||||
|
// Write an initial message
|
||||||
|
Write("Session started");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Write(string format, params object[] args)
|
||||||
|
{
|
||||||
|
if (output == null) return;
|
||||||
|
string res = string.Format(format, args);
|
||||||
|
|
||||||
|
// Write data
|
||||||
|
output.WriteLine("{0},Information,{1}", DateTime.Now, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Error(string format, params object[] args)
|
||||||
|
{
|
||||||
|
if (output == null) return;
|
||||||
|
string res = string.Format(format, args);
|
||||||
|
|
||||||
|
// Write data
|
||||||
|
output.WriteLine("{0},Error,{1}", DateTime.Now, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Except(Exception ex)
|
||||||
|
{
|
||||||
|
if (output == null) return;
|
||||||
|
|
||||||
|
// Prepare
|
||||||
|
string stack = ex.StackTrace.Replace("\n", ",,,,");
|
||||||
|
|
||||||
|
// Write data
|
||||||
|
output.WriteLine("{0},Exception,{1},{2},{3}", DateTime.Now, ex.Message, ex.Source, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -1,201 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using Windows.Foundation;
|
|
||||||
using Windows.Foundation.Collections;
|
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
|
||||||
using Windows.UI.Xaml.Controls.Primitives;
|
|
||||||
using Windows.UI.Xaml.Data;
|
|
||||||
using Windows.UI.Xaml.Input;
|
|
||||||
using Windows.UI.Xaml.Media;
|
|
||||||
using Windows.UI.Xaml.Navigation;
|
|
||||||
|
|
||||||
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
|
|
||||||
|
|
||||||
namespace DrumKit
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// An empty page that can be used on its own or navigated to within a Frame.
|
|
||||||
/// </summary>
|
|
||||||
public sealed partial class MainPage : Page
|
|
||||||
{
|
|
||||||
DrumRepository drumRepo;
|
|
||||||
SoundPlayer player = new SoundPlayer();
|
|
||||||
List<Image> uiImages;
|
|
||||||
List<Button> uiButtons;
|
|
||||||
List<Thumb> uiThumbs;
|
|
||||||
|
|
||||||
public MainPage()
|
|
||||||
{
|
|
||||||
this.InitializeComponent();
|
|
||||||
|
|
||||||
drumRepo = new DrumRepository();
|
|
||||||
|
|
||||||
uiImages = new List<Image>();
|
|
||||||
uiButtons = new List<Button>();
|
|
||||||
uiThumbs = new List<Thumb>();
|
|
||||||
|
|
||||||
this.InitializeResources();
|
|
||||||
this.KeyDown += MainPage_KeyDown;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainPage_KeyDown(object sender, KeyRoutedEventArgs e)
|
|
||||||
{
|
|
||||||
string key = Enum.GetName(typeof(Windows.System.VirtualKey), e.Key);
|
|
||||||
|
|
||||||
if (key != null && key.Length == 1)
|
|
||||||
{
|
|
||||||
int index = Convert.ToInt32(key.ToLower()[0] - 'a');
|
|
||||||
if (this.uiButtons.Count > index)
|
|
||||||
this.DrumClicked(this.uiButtons[index], new RoutedEventArgs());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Image CreateImage(int index, Drum drum)
|
|
||||||
{
|
|
||||||
var img = new Image();
|
|
||||||
var bitmap = new Windows.UI.Xaml.Media.Imaging.BitmapImage(drum.ImageSource);
|
|
||||||
img.Tag = index.ToString();
|
|
||||||
img.Source = bitmap;
|
|
||||||
img.Width = drum.Size * this.ActualWidth;
|
|
||||||
img.Height = drum.Size * this.ActualWidth;
|
|
||||||
|
|
||||||
return img;
|
|
||||||
}
|
|
||||||
|
|
||||||
Button CreateButton(int index, Drum drum)
|
|
||||||
{
|
|
||||||
var button = new Button();
|
|
||||||
button.Tag = index.ToString();
|
|
||||||
button.Click += DrumClicked;
|
|
||||||
button.Width = drum.Size * this.ActualWidth;
|
|
||||||
button.Height = drum.Size * this.ActualWidth;
|
|
||||||
button.Background = new SolidColorBrush(Windows.UI.Colors.Orange);
|
|
||||||
button.Opacity = 0;
|
|
||||||
|
|
||||||
return button;
|
|
||||||
}
|
|
||||||
|
|
||||||
Thumb CreateThumb(int index, Drum drum)
|
|
||||||
{
|
|
||||||
var thumb = new Thumb();
|
|
||||||
thumb.Tag = index.ToString();
|
|
||||||
thumb.DragDelta += DrumMoved;
|
|
||||||
thumb.Width = drum.Size * this.ActualWidth;
|
|
||||||
thumb.Height = drum.Size * this.ActualWidth;
|
|
||||||
thumb.Opacity = .3;
|
|
||||||
thumb.Background = new SolidColorBrush(Windows.UI.Colors.Green);
|
|
||||||
thumb.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
|
|
||||||
|
|
||||||
return thumb;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async void InitializeResources()
|
|
||||||
{
|
|
||||||
await drumRepo.LoadFile(new Uri("ms-appx:///Assets/default"));
|
|
||||||
|
|
||||||
for (int i = 0; i < drumRepo.Drums.Count; i++)
|
|
||||||
{
|
|
||||||
var drum = drumRepo.Drums[i];
|
|
||||||
|
|
||||||
// Get ui objects
|
|
||||||
var img = CreateImage(i, drum);
|
|
||||||
var button = CreateButton(i, drum);
|
|
||||||
var thumb = CreateThumb(i, drum);
|
|
||||||
|
|
||||||
// Set up layout
|
|
||||||
this.myCanvas.Children.Add(img);
|
|
||||||
this.myCanvas.Children.Add(button);
|
|
||||||
this.myCanvas.Children.Add(thumb);
|
|
||||||
|
|
||||||
Canvas.SetLeft(img, drum.Position.X * this.ActualWidth);
|
|
||||||
Canvas.SetLeft(button, drum.Position.X * this.ActualWidth);
|
|
||||||
Canvas.SetLeft(thumb, drum.Position.X * this.ActualWidth);
|
|
||||||
Canvas.SetTop(img, drum.Position.Y * this.ActualHeight);
|
|
||||||
Canvas.SetTop(button, drum.Position.Y * this.ActualHeight);
|
|
||||||
Canvas.SetTop(thumb, drum.Position.Y * this.ActualHeight);
|
|
||||||
Canvas.SetZIndex(img, 0);
|
|
||||||
Canvas.SetZIndex(button, 1);
|
|
||||||
Canvas.SetZIndex(thumb, 2);
|
|
||||||
|
|
||||||
// Add to our list
|
|
||||||
this.uiImages.Add(img);
|
|
||||||
this.uiButtons.Add(button);
|
|
||||||
this.uiThumbs.Add(thumb);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add drums
|
|
||||||
this.player.AddDrums(this.drumRepo.Drums);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrumClicked(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var button = sender as Button;
|
|
||||||
if (button == null) return;
|
|
||||||
|
|
||||||
var tag = button.Tag as string;
|
|
||||||
if (tag == null) return;
|
|
||||||
|
|
||||||
int index = int.Parse(tag);
|
|
||||||
this.player.Play(this.drumRepo.Drums[index].Name + "0");
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrumMoved(object sender, DragDeltaEventArgs e)
|
|
||||||
{
|
|
||||||
var thumb = sender as Thumb;
|
|
||||||
if (thumb == null) return;
|
|
||||||
|
|
||||||
var tag = thumb.Tag as string;
|
|
||||||
if (tag == null) return;
|
|
||||||
|
|
||||||
int index = int.Parse(tag);
|
|
||||||
Canvas.SetLeft(uiImages[index], Canvas.GetLeft(uiImages[index]) + e.HorizontalChange);
|
|
||||||
Canvas.SetLeft(uiButtons[index], Canvas.GetLeft(uiButtons[index]) + e.HorizontalChange);
|
|
||||||
Canvas.SetLeft(uiThumbs[index], Canvas.GetLeft(uiThumbs[index]) + e.HorizontalChange);
|
|
||||||
Canvas.SetTop(uiImages[index], Canvas.GetTop(uiImages[index]) + e.VerticalChange);
|
|
||||||
Canvas.SetTop(uiButtons[index], Canvas.GetTop(uiButtons[index]) + e.VerticalChange);
|
|
||||||
Canvas.SetTop(uiThumbs[index], Canvas.GetTop(uiThumbs[index]) + e.VerticalChange);
|
|
||||||
drumRepo.Drums[index].Position = new Point(drumRepo.Drums[index].Position.X + e.HorizontalChange, drumRepo.Drums[index].Position.Y + e.VerticalChange);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Invoked when this page is about to be displayed in a Frame.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="e">Event data that describes how this page was reached. The Parameter
|
|
||||||
/// property is typically used to configure the page.</param>
|
|
||||||
protected override void OnNavigatedTo(NavigationEventArgs e)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void mybutton_Click_1(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var picker = new Windows.Storage.Pickers.FileOpenPicker();
|
|
||||||
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;
|
|
||||||
picker.FileTypeFilter.Add("*");
|
|
||||||
var file = await picker.PickSingleFileAsync();
|
|
||||||
|
|
||||||
//blabla.Source = new Uri(file.Path);
|
|
||||||
//blabla.Play();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void buttonEditMode_Click_1(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var button = sender as ToggleButton;
|
|
||||||
if (button == null) return;
|
|
||||||
|
|
||||||
// Fix togglebuton style bug
|
|
||||||
VisualStateManager.GoToState(button, button.IsChecked.Value ? "Checked" : "Unchecked", false);
|
|
||||||
|
|
||||||
// Change visibility of thumbs
|
|
||||||
bool visible = (buttonEditMode.IsChecked.HasValue && buttonEditMode.IsChecked.Value);
|
|
||||||
|
|
||||||
foreach (var i in this.uiThumbs)
|
|
||||||
if (visible) i.Visibility = Windows.UI.Xaml.Visibility.Visible;
|
|
||||||
else i.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
179
DrumKit/Managers/DataManager.cs
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
using System.IO;
|
||||||
|
using Windows.Storage;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
static class DataManager
|
||||||
|
{
|
||||||
|
public static AppSettings Settings { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if this is the first time application was launched.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<bool> IsFirstLaunch()
|
||||||
|
{
|
||||||
|
// See if 'installed.xml' exists
|
||||||
|
var folder = ApplicationData.Current.RoamingFolder;
|
||||||
|
var files = await folder.GetFilesAsync();
|
||||||
|
|
||||||
|
return files.Count(x => x.Name == "installed.xml") == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copies the content of the source folder into the destination folder recursively.
|
||||||
|
/// </summary>
|
||||||
|
//private static async Task CopyFolder(StorageFolder source, StorageFolder dest)
|
||||||
|
//{
|
||||||
|
// // Copy folders recursively
|
||||||
|
// var folders = await source.GetFoldersAsync();
|
||||||
|
|
||||||
|
// foreach (var i in folders)
|
||||||
|
// {
|
||||||
|
// var newfolder = await dest.CreateFolderAsync(i.Name, CreationCollisionOption.OpenIfExists);
|
||||||
|
// await CopyFolder(i, newfolder);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Copy files
|
||||||
|
// var files = await source.GetFilesAsync();
|
||||||
|
|
||||||
|
// foreach (var i in files)
|
||||||
|
// await i.CopyAsync(dest);
|
||||||
|
//}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Installs the assets at first launch.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static async Task InstallAssets()
|
||||||
|
{
|
||||||
|
// Read content of 'ApplicationData'
|
||||||
|
var reader = new DrumKit.Archiving.TarballReader();
|
||||||
|
await reader.Unpack(new Uri("ms-appx:///Assets/ApplicationData.tar"), ApplicationData.Current.RoamingFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the 'installed.xml' file.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static async Task MarkInstalled()
|
||||||
|
{
|
||||||
|
// Open stream
|
||||||
|
StorageFile file = await ApplicationData.Current.RoamingFolder.CreateFileAsync("installed.xml");
|
||||||
|
var stream = await file.OpenAsync(FileAccessMode.ReadWrite);
|
||||||
|
var iostream = stream.AsStream();
|
||||||
|
|
||||||
|
// Generate xml
|
||||||
|
var writer = System.Xml.XmlWriter.Create(iostream, new System.Xml.XmlWriterSettings() { Async = true, CloseOutput = true });
|
||||||
|
|
||||||
|
writer.WriteStartDocument();
|
||||||
|
writer.WriteStartElement("drumkit");
|
||||||
|
writer.WriteString(DateTime.UtcNow.ToString());
|
||||||
|
writer.WriteEndElement();
|
||||||
|
writer.WriteEndDocument();
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
await writer.FlushAsync();
|
||||||
|
writer.Dispose();
|
||||||
|
iostream.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resets everything to factory settings.
|
||||||
|
/// The application must be reinitialized after (or closed).
|
||||||
|
/// </summary>
|
||||||
|
public static async Task FactoryReset()
|
||||||
|
{
|
||||||
|
await ApplicationData.Current.ClearAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads the settings file.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task LoadSettings()
|
||||||
|
{
|
||||||
|
// If all else fails, default settings
|
||||||
|
Settings = new AppSettings();
|
||||||
|
|
||||||
|
// Get settings file
|
||||||
|
var files = await ApplicationData.Current.RoamingFolder.GetFilesAsync();
|
||||||
|
var sf = files.FirstOrDefault(x => x.Name == "settings.xml");
|
||||||
|
|
||||||
|
// File found
|
||||||
|
if (sf != null)
|
||||||
|
{
|
||||||
|
// Open file
|
||||||
|
var fstream = await sf.OpenReadAsync();
|
||||||
|
var fstream_net = fstream.AsStream();
|
||||||
|
|
||||||
|
// Deserialize
|
||||||
|
XmlSerializer s = new XmlSerializer(Settings.GetType());
|
||||||
|
var settings = s.Deserialize(fstream_net) as AppSettings;
|
||||||
|
|
||||||
|
// All good
|
||||||
|
if (settings != null)
|
||||||
|
Settings = settings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads the settings file.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task SaveSettings()
|
||||||
|
{
|
||||||
|
// Get settings file
|
||||||
|
var file = await ApplicationData.Current.RoamingFolder.CreateFileAsync("settings.xml", CreationCollisionOption.ReplaceExisting);
|
||||||
|
|
||||||
|
// Open file
|
||||||
|
var fstream = await file.OpenAsync(FileAccessMode.ReadWrite);
|
||||||
|
var fstream_net = fstream.AsStream();
|
||||||
|
|
||||||
|
// Serialize
|
||||||
|
XmlSerializer s = new XmlSerializer(Settings.GetType());
|
||||||
|
s.Serialize(fstream_net, Settings);
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
await fstream_net.FlushAsync();
|
||||||
|
fstream_net.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the application (prepares the application at first launch, loads settings and drums).
|
||||||
|
/// </summary>
|
||||||
|
public static async Task Initialize()
|
||||||
|
{
|
||||||
|
// Is this the first time the user launches the application?
|
||||||
|
if (await IsFirstLaunch())
|
||||||
|
{
|
||||||
|
// Clean up any junk
|
||||||
|
await FactoryReset();
|
||||||
|
|
||||||
|
// Copy local assets to app data
|
||||||
|
await InstallAssets();
|
||||||
|
|
||||||
|
// Generate 'installed.xml' file
|
||||||
|
await MarkInstalled();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load settings
|
||||||
|
await LoadSettings();
|
||||||
|
|
||||||
|
// Load drum packages
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task Close()
|
||||||
|
{
|
||||||
|
// Save settings
|
||||||
|
await SaveSettings();
|
||||||
|
|
||||||
|
// Save modified layout & stuff
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
120
DrumKit/Managers/DrumsManager.cs
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
using System.IO;
|
||||||
|
using Windows.Storage;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
static class DrumsManager
|
||||||
|
{
|
||||||
|
private static StorageFolder currentDrumkitKey = null;
|
||||||
|
private static int currentDrumkitLayoutIndex = -1;
|
||||||
|
|
||||||
|
public static Dictionary<StorageFolder, Drumkit> AvailableDrumkits { get; private set; }
|
||||||
|
public static DrumkitLayoutCollection CurrentDrumkitLayouts { get; private set; }
|
||||||
|
public static DrumkitConfig CurrentDrumkitConfig { get; private set; }
|
||||||
|
|
||||||
|
public static Drumkit CurrentDrumkit
|
||||||
|
{
|
||||||
|
get {
|
||||||
|
return (currentDrumkitKey == null) ? null : AvailableDrumkits[currentDrumkitKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static StorageFolder CurrentDrumkitLocation
|
||||||
|
{
|
||||||
|
get {
|
||||||
|
return currentDrumkitKey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DrumkitLayout CurrentDrumkitLayout
|
||||||
|
{
|
||||||
|
get {
|
||||||
|
return (currentDrumkitLayoutIndex == -1) ? null : CurrentDrumkitLayouts.Items[currentDrumkitLayoutIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<object> DeserializeFile(StorageFile file, Type type)
|
||||||
|
{
|
||||||
|
// Open manifest file
|
||||||
|
var stream = await file.OpenReadAsync();
|
||||||
|
var iostream = stream.AsStream();
|
||||||
|
|
||||||
|
// Deserialize
|
||||||
|
XmlSerializer serializer = new XmlSerializer(type);
|
||||||
|
return serializer.Deserialize(iostream);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<Drumkit> LoadDrumkit(StorageFolder f)
|
||||||
|
{
|
||||||
|
// Open manifest file
|
||||||
|
var manifest = await f.GetFileAsync("drumkit.xml");
|
||||||
|
object dk = await DeserializeFile(manifest, typeof(Drumkit));
|
||||||
|
return dk as Drumkit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task FindDrumkits()
|
||||||
|
{
|
||||||
|
// Reset list
|
||||||
|
AvailableDrumkits = new Dictionary<StorageFolder, Drumkit>();
|
||||||
|
|
||||||
|
// Get 'drumkits' folder content
|
||||||
|
var folder = await ApplicationData.Current.RoamingFolder.GetFolderAsync("Drumkits");
|
||||||
|
var kits = await folder.GetFoldersAsync();
|
||||||
|
|
||||||
|
// Load each drumkit
|
||||||
|
foreach (var i in kits)
|
||||||
|
{
|
||||||
|
Drumkit kit = await LoadDrumkit(i);
|
||||||
|
if (kit != null)
|
||||||
|
AvailableDrumkits.Add(i, kit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task LoadCurrentDrumkit(string name)
|
||||||
|
{
|
||||||
|
// Get it from the list
|
||||||
|
var current = AvailableDrumkits.FirstOrDefault(x => x.Value.Name == name);
|
||||||
|
|
||||||
|
// Doesn't exist? The default should at least exist.
|
||||||
|
if (current.Equals(default(KeyValuePair<StorageFolder, Drumkit>)))
|
||||||
|
current = AvailableDrumkits.FirstOrDefault(x => x.Value.Name == "Default");
|
||||||
|
|
||||||
|
// Not even default? Get any kit
|
||||||
|
if (current.Equals(default(KeyValuePair<StorageFolder, Drumkit>)))
|
||||||
|
current = AvailableDrumkits.FirstOrDefault();
|
||||||
|
|
||||||
|
// No drumkit? This is a serious problem
|
||||||
|
if (current.Equals(default(KeyValuePair<StorageFolder, Drumkit>)))
|
||||||
|
throw new Exception("No drumkits available.");
|
||||||
|
|
||||||
|
currentDrumkitKey = current.Key;
|
||||||
|
|
||||||
|
// Load layout and configuration
|
||||||
|
StorageFile layout = await current.Key.GetFileAsync(current.Value.LayoutFilePath);
|
||||||
|
CurrentDrumkitLayouts = await DeserializeFile(layout, typeof(DrumkitLayoutCollection)) as DrumkitLayoutCollection;
|
||||||
|
|
||||||
|
StorageFile config = await current.Key.GetFileAsync(current.Value.ConfigFilePath);
|
||||||
|
CurrentDrumkitConfig = await DeserializeFile(config, typeof(DrumkitConfig)) as DrumkitConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task Initialize(AppSettings settings)
|
||||||
|
{
|
||||||
|
// Load drumkits
|
||||||
|
await FindDrumkits();
|
||||||
|
|
||||||
|
// Load current drumkit
|
||||||
|
await LoadCurrentDrumkit(settings.CurrentKit);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetLayout()
|
||||||
|
{
|
||||||
|
currentDrumkitLayoutIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
147
DrumKit/Managers/SoundManager.cs
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using SharpDX;
|
||||||
|
using SharpDX.XAudio2;
|
||||||
|
using SharpDX.Multimedia;
|
||||||
|
using System.IO;
|
||||||
|
using Windows.Storage;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
static class SoundManager
|
||||||
|
{
|
||||||
|
#region Data types
|
||||||
|
private class MyWave
|
||||||
|
{
|
||||||
|
public AudioBuffer Buffer { get; set; }
|
||||||
|
public uint[] DecodedPacketsInfo { get; set; }
|
||||||
|
public WaveFormat WaveFormat { get; set; }
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Private attributes
|
||||||
|
private static XAudio2 xaudio = null;
|
||||||
|
private static MasteringVoice mvoice = null;
|
||||||
|
private static Dictionary<string, MyWave> sounds = null;
|
||||||
|
private static SoundPool soundPool = null;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Initialization
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the sound manager
|
||||||
|
/// </summary>
|
||||||
|
public static void Initialize()
|
||||||
|
{
|
||||||
|
xaudio = new XAudio2();
|
||||||
|
xaudio.StartEngine();
|
||||||
|
|
||||||
|
mvoice = new MasteringVoice(xaudio);
|
||||||
|
sounds = new Dictionary<string, MyWave>();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Unload
|
||||||
|
/// <summary>
|
||||||
|
/// Unloads all the sounds
|
||||||
|
/// </summary>
|
||||||
|
public static void UnloadAll()
|
||||||
|
{
|
||||||
|
if (sounds == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sounds.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unloads the sounds related to a drum.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="drum">The drum which will be unloaded.</param>
|
||||||
|
public static void UnloadDrum(Drum drum)
|
||||||
|
{
|
||||||
|
foreach (var i in drum.Sounds)
|
||||||
|
sounds.Remove(drum.Id + i.Intensity.ToString());
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Load
|
||||||
|
/// <summary>
|
||||||
|
/// Adds a sound to the dictionary
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">A key associated with the sound</param>
|
||||||
|
/// <param name="file">The file which will be loaded</param>
|
||||||
|
private static async Task AddSound(string key, StorageFile file)
|
||||||
|
{
|
||||||
|
MyWave wave = new MyWave();
|
||||||
|
|
||||||
|
// Load file
|
||||||
|
var stream = await file.OpenReadAsync();
|
||||||
|
var iostream = stream.AsStream();
|
||||||
|
var soundStream = new SoundStream(iostream);
|
||||||
|
var buffer = new AudioBuffer() {
|
||||||
|
Stream = soundStream,
|
||||||
|
AudioBytes = (int)soundStream.Length,
|
||||||
|
Flags = BufferFlags.EndOfStream
|
||||||
|
};
|
||||||
|
iostream.Dispose();
|
||||||
|
|
||||||
|
// Set up information
|
||||||
|
wave.Buffer = buffer;
|
||||||
|
wave.DecodedPacketsInfo = soundStream.DecodedPacketsInfo;
|
||||||
|
wave.WaveFormat = soundStream.Format;
|
||||||
|
|
||||||
|
// Now we can initialize the soundpool
|
||||||
|
if (soundPool == null)
|
||||||
|
soundPool = new SoundPool(xaudio, wave.WaveFormat);
|
||||||
|
|
||||||
|
// Add to sound list
|
||||||
|
sounds.Add(key, wave);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads the sounds associated with a drum
|
||||||
|
/// </summary>
|
||||||
|
public static async Task LoadDrum(Drum drum, StorageFolder root)
|
||||||
|
{
|
||||||
|
// Load each sound
|
||||||
|
foreach (var i in drum.Sounds)
|
||||||
|
{
|
||||||
|
var file = await IOHelper.GetFileRelativeAsync(root, i.Source);
|
||||||
|
await AddSound(drum.Id + i.Intensity.ToString(), file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads every drum in a drumkit.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task LoadDrumkit(Drumkit kit, StorageFolder root)
|
||||||
|
{
|
||||||
|
// Load each sound
|
||||||
|
foreach (var i in kit.Drums)
|
||||||
|
await LoadDrum(i, root);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Play
|
||||||
|
/// <summary>
|
||||||
|
/// Plays a sound
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="drum_id">The id of the drum</param>
|
||||||
|
/// <param name="intensity">The intensity</param>
|
||||||
|
public static void Play(string drum_id, int intensity)
|
||||||
|
{
|
||||||
|
// Get wave info
|
||||||
|
MyWave info = null;
|
||||||
|
|
||||||
|
if (!sounds.TryGetValue(drum_id + intensity.ToString(), out info))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Play
|
||||||
|
soundPool.PlayBuffer(info.Buffer, info.DecodedPacketsInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
183
DrumKit/Managers/UIManager.cs
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Windows.System;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using Windows.UI.Xaml.Controls.Primitives;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
static class UIManager
|
||||||
|
{
|
||||||
|
private static Dictionary<string, DrumUI> drums;
|
||||||
|
private static Dictionary<VirtualKey, string> keymap;
|
||||||
|
|
||||||
|
public static Canvas TheCanvas { get; private set; }
|
||||||
|
|
||||||
|
#region Initialization
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes the ui manager
|
||||||
|
/// </summary>
|
||||||
|
public static void Initialize()
|
||||||
|
{
|
||||||
|
drums = new Dictionary<string, DrumUI>();
|
||||||
|
keymap = new Dictionary<VirtualKey, string>();
|
||||||
|
|
||||||
|
TheCanvas = new Canvas();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads the ui stuff for drumkit
|
||||||
|
/// </summary>
|
||||||
|
public static async Task ReloadDrumkit()
|
||||||
|
{
|
||||||
|
// Delete previous
|
||||||
|
drums.Clear();
|
||||||
|
keymap.Clear();
|
||||||
|
|
||||||
|
// Load drums
|
||||||
|
foreach (var i in DrumsManager.CurrentDrumkit.Drums)
|
||||||
|
{
|
||||||
|
DrumUI drumui = new DrumUI();
|
||||||
|
await drumui.InitializeDrum(i, DrumsManager.CurrentDrumkitLocation);
|
||||||
|
drumui.PointerPressed += HandlerDrumPointerPressed;
|
||||||
|
drumui.DragDelta += HandlerDrumMoved;
|
||||||
|
|
||||||
|
TheCanvas.Children.Add(drumui.Element);
|
||||||
|
drums.Add(i.Id, drumui);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the layout.
|
||||||
|
/// </summary>
|
||||||
|
public static void ReloadLayout()
|
||||||
|
{
|
||||||
|
DrumUI drum;
|
||||||
|
|
||||||
|
foreach (var i in DrumsManager.CurrentDrumkitLayout.Drums)
|
||||||
|
if (drums.TryGetValue(i.TargetId, out drum))
|
||||||
|
drum.UpdateLayout(i, TheCanvas.ActualWidth, TheCanvas.ActualHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the configuration.
|
||||||
|
/// </summary>
|
||||||
|
public static async Task ReloadConfig()
|
||||||
|
{
|
||||||
|
foreach (var i in DrumsManager.CurrentDrumkitConfig.Drums)
|
||||||
|
{
|
||||||
|
// Enabled and not loaded
|
||||||
|
if (i.IsEnabled && !drums.ContainsKey(i.TargetId))
|
||||||
|
{
|
||||||
|
Drum drum = DrumsManager.CurrentDrumkit.Drums.FirstOrDefault(x => x.Id == i.TargetId);
|
||||||
|
if (drum != null)
|
||||||
|
{
|
||||||
|
DrumUI drumui = new DrumUI();
|
||||||
|
await drumui.InitializeDrum(drum, DrumsManager.CurrentDrumkitLocation);
|
||||||
|
drumui.PointerPressed += HandlerDrumPointerPressed;
|
||||||
|
drumui.DragDelta += HandlerDrumMoved;
|
||||||
|
|
||||||
|
drums.Add(i.TargetId, drumui);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disabled and loaded
|
||||||
|
else if (!i.IsEnabled && drums.ContainsKey(i.TargetId))
|
||||||
|
{
|
||||||
|
TheCanvas.Children.Remove(drums[i.TargetId].Element);
|
||||||
|
drums.Remove(i.TargetId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keyboard mapping
|
||||||
|
if (!keymap.ContainsKey(i.Key))
|
||||||
|
keymap.Add(i.Key, i.TargetId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Event handlers
|
||||||
|
/// <summary>
|
||||||
|
/// Handles drum hit using mouse/touchpad
|
||||||
|
/// </summary>
|
||||||
|
private static void HandlerDrumPointerPressed(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var button = sender as FrameworkElement;
|
||||||
|
var tag = button.Tag as string;
|
||||||
|
|
||||||
|
if (tag != null)
|
||||||
|
HandlerDrumClickedCommon(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles drum hit using keyboard
|
||||||
|
/// </summary>
|
||||||
|
public static void HandlerKeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
|
||||||
|
{
|
||||||
|
string drum;
|
||||||
|
|
||||||
|
// Key repeat or something
|
||||||
|
if (args.KeyStatus.WasKeyDown)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If key in key map, perform "click"
|
||||||
|
if (keymap.TryGetValue(args.VirtualKey, out drum))
|
||||||
|
HandlerDrumClickedCommon(drum);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles drum hit.
|
||||||
|
/// </summary>
|
||||||
|
private static void HandlerDrumClickedCommon(string drum_id)
|
||||||
|
{
|
||||||
|
SoundManager.Play(drum_id, 0);
|
||||||
|
|
||||||
|
if (DataManager.Settings.Animations)
|
||||||
|
drums[drum_id].Hit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles drum movement.
|
||||||
|
/// </summary>
|
||||||
|
private static void HandlerDrumMoved(object sender, Windows.UI.Xaml.Controls.Primitives.DragDeltaEventArgs e)
|
||||||
|
{
|
||||||
|
var thumb = sender as Thumb;
|
||||||
|
var tag = thumb.Tag as string;
|
||||||
|
int drum_index = -1;
|
||||||
|
|
||||||
|
if (tag != null)
|
||||||
|
drum_index = DrumsManager.CurrentDrumkitLayout.Drums.FindIndex(x => x.TargetId == tag);
|
||||||
|
|
||||||
|
if (drum_index >= 0)
|
||||||
|
{
|
||||||
|
double delta_x = e.HorizontalChange / TheCanvas.ActualWidth;
|
||||||
|
double delta_y = e.VerticalChange / TheCanvas.ActualHeight;
|
||||||
|
|
||||||
|
if (double.IsInfinity(delta_x) || double.IsInfinity(delta_y) || double.IsNaN(delta_x) || double.IsNaN(delta_y))
|
||||||
|
return;
|
||||||
|
|
||||||
|
DrumsManager.CurrentDrumkitLayout.Drums[drum_index].X += delta_x;
|
||||||
|
DrumsManager.CurrentDrumkitLayout.Drums[drum_index].Y += delta_y;
|
||||||
|
|
||||||
|
drums[tag].UpdateLayout(DrumsManager.CurrentDrumkitLayout.Drums[drum_index], TheCanvas.ActualWidth, TheCanvas.ActualHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public static void EnterEdit()
|
||||||
|
{
|
||||||
|
foreach (var i in drums)
|
||||||
|
i.Value.EnableEdit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ExitEdit()
|
||||||
|
{
|
||||||
|
foreach (var i in drums)
|
||||||
|
i.Value.DisableEdit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
352
DrumKit/Package.StoreAssociation.xml
Normal file
@ -0,0 +1,352 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<StoreAssociation xmlns="http://schemas.microsoft.com/appx/2010/storeassociation">
|
||||||
|
<Publisher>CN=B6F45FE5-D749-4D29-874C-8323B266F3C8</Publisher>
|
||||||
|
<NamespacePrefix>35555TiberiuChibici</NamespacePrefix>
|
||||||
|
<PublisherDisplayName>Tiberiu Chibici</PublisherDisplayName>
|
||||||
|
<GeneratePackageHash>http://www.w3.org/2001/04/xmlenc#sha256</GeneratePackageHash>
|
||||||
|
<SupportedLocales>
|
||||||
|
<Language Code="af" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="af-za" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="am" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="am-et" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ar" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-ae" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-bh" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-dz" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-eg" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-iq" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-jo" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-kw" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-lb" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-ly" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-ma" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-om" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-qa" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-sa" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-sy" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-tn" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ar-ye" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="as" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="as-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="az-arab" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="az-arab-az" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="az-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="az-cyrl-az" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="az-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="az-latn-az" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="be" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="be-by" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="bg" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="bg-bg" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="bn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="bn-bd" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="bn-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="bs" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="bs-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="bs-cyrl-ba" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="bs-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="bs-latn-ba" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ca" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ca-es" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ca-es-valencia" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="chr-cher" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="chr-cher-us" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="chr-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="cs" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="cs-cz" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="cy" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="cy-gb" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="da" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="da-dk" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="de" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="de-at" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="de-ch" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="de-de" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="de-li" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="de-lu" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="el" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="el-gr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-au" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-bz" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-ca" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-gb" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-hk" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-id" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-ie" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-in" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-jm" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-kz" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-mt" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-my" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-nz" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-ph" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-pk" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-sg" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-tt" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-us" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-vn" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="en-za" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-ar" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-bo" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-cl" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-co" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-cr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-do" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-ec" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-es" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-gt" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-hn" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-mx" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-ni" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-pa" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-pe" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-pr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-py" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-sv" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-us" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-uy" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="es-ve" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="et" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="et-ee" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="eu" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="eu-es" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="fa" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="fa-ir" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="fi" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fi-fi" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fil" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="fil-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="fil-ph" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="fr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-015" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-be" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-ca" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-cd" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-ch" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-ci" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-cm" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-fr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-ht" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-lu" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-ma" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-mc" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-ml" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="fr-re" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="frc-latn" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="frp-latn" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ga" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ga-ie" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="gd-gb" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="gd-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="gl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="gl-es" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="gu" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="gu-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ha-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ha-latn-ng" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="he" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="he-il" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="hi" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="hi-in" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="hr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="hr-ba" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="hr-hr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="hu" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="hu-hu" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="hy" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="hy-am" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="id" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="id-id" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ig-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ig-ng" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="is" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="is-is" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="it" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="it-ch" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="it-it" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="iu-cans" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="iu-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="iu-latn-ca" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ja" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ja-jp" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ka" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ka-ge" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="kk" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="kk-kz" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="km" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="km-kh" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="kn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="kn-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ko" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ko-kr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="kok" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="kok-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ku-arab" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ku-arab-iq" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ky-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ky-kg" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="lb" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="lb-lu" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="lt" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="lt-lt" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="lv" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="lv-lv" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="mi" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mi-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mi-nz" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mk" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mk-mk" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ml" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ml-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mn-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mn-mn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mn-mong" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mn-phag" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mr" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mr-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ms" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ms-bn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ms-my" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mt" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="mt-mt" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="nb" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="nb-no" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ne" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ne-np" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="nl" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="nl-be" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="nl-nl" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="nn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="nn-no" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="no" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="no-no" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="nso" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="nso-za" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="or" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="or-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="pa" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="pa-arab" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="pa-arab-pk" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="pa-deva" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="pa-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="pl" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="pl-pl" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="prs" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="prs-af" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="prs-arab" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="pt" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="pt-br" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="pt-pt" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="quc-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="qut" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="qut-gt" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="qut-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="quz" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="quz-bo" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="quz-ec" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="quz-pe" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ro" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ro-ro" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ru" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ru-ru" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="rw" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="rw-rw" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sd-arab" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sd-arab-pk" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sd-deva" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="si" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="si-lk" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sk" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sk-sk" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sl" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sl-si" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sq" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sq-al" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sr-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sr-cyrl-ba" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sr-cyrl-cs" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sr-cyrl-me" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sr-cyrl-rs" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sr-latn" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sr-latn-ba" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sr-latn-cs" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sr-latn-me" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sr-latn-rs" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sv" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sv-fi" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sv-se" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="sw" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="sw-ke" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ta" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ta-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="te" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="te-in" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tg-arab" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tg-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tg-cyrl-tj" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tg-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="th" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="th-th" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ti" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ti-et" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tk-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tk-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tk-tm" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tk-tr" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tn-bw" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tn-za" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="tr-tr" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="tt-arab" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tt-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tt-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="tt-ru" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ug-arab" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ug-cn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ug-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ug-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="uk" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="uk-ua" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="ur" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="ur-pk" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="uz-cyrl" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="uz-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="uz-latn-uz" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="vi" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="vi-vn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="wo" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="wo-sn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="xh" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="xh-za" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="yo-latn" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="yo-ng" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="zh-cn" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zh-hans" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zh-hans-cn" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zh-hans-sg" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zh-hant" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zh-hant-hk" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zh-hant-mo" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zh-hant-tw" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zh-hk" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zh-tw" InMinimumRequirementSet="true" />
|
||||||
|
<Language Code="zu" InMinimumRequirementSet="false" />
|
||||||
|
<Language Code="zu-za" InMinimumRequirementSet="false" />
|
||||||
|
</SupportedLocales>
|
||||||
|
<ProductReservedInfo>
|
||||||
|
<MainPackageIdentityName>35555TiberiuChibici.DrumKit</MainPackageIdentityName>
|
||||||
|
<ReservedNames>
|
||||||
|
<ReservedName>DrumKit</ReservedName>
|
||||||
|
</ReservedNames>
|
||||||
|
</ProductReservedInfo>
|
||||||
|
<AccountPackageIdentityNames />
|
||||||
|
<PackageInfoList LandingUrl="https://appdev.microsoft.com:443/StorePortals/Developer/Catalog/ReleaseAnchor/a07735fd-3955-4470-aa48-5356c8ae5c91">
|
||||||
|
<PackageInfo>
|
||||||
|
<PackageArchitecture>neutral</PackageArchitecture>
|
||||||
|
<PackageMaxArchitectureVersion>1.0.0.6</PackageMaxArchitectureVersion>
|
||||||
|
</PackageInfo>
|
||||||
|
</PackageInfoList>
|
||||||
|
</StoreAssociation>
|
@ -1,10 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
|
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
|
||||||
<Identity Name="9e797bd6-ff19-4416-8ec8-f371d6d86244" Publisher="CN=Tiberiu" Version="1.0.0.0" />
|
<Identity Name="35555TiberiuChibici.DrumKit" Publisher="CN=B6F45FE5-D749-4D29-874C-8323B266F3C8" Version="1.1.0.14" />
|
||||||
<Properties>
|
<Properties>
|
||||||
<DisplayName>DrumKit</DisplayName>
|
<DisplayName>DrumKit</DisplayName>
|
||||||
<PublisherDisplayName>Tiberiu</PublisherDisplayName>
|
<PublisherDisplayName>Tiberiu Chibici</PublisherDisplayName>
|
||||||
<Logo>Assets\StoreLogo.png</Logo>
|
<Logo>Assets\Logos\StoreLogo.png</Logo>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Prerequisites>
|
<Prerequisites>
|
||||||
<OSMinVersion>6.2.1</OSMinVersion>
|
<OSMinVersion>6.2.1</OSMinVersion>
|
||||||
@ -15,21 +15,14 @@
|
|||||||
</Resources>
|
</Resources>
|
||||||
<Applications>
|
<Applications>
|
||||||
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="DrumKit.App">
|
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="DrumKit.App">
|
||||||
<VisualElements DisplayName="DrumKit" Logo="Assets\Logos\Logo.png" SmallLogo="Assets\Logos\SmallLogo.png" Description="DrumKit" ForegroundText="light" BackgroundColor="#464646">
|
<VisualElements DisplayName="DrumKit" Logo="Assets\Logos\Logo.png" SmallLogo="Assets\Logos\SmallLogo.png" Description="DrumKit" ForegroundText="light" BackgroundColor="#164646" ToastCapable="false">
|
||||||
<DefaultTile ShowName="allLogos" />
|
<DefaultTile ShowName="allLogos" WideLogo="Assets\Logos\WideLogo.png" />
|
||||||
<SplashScreen Image="Assets\Logos\SplashScreen.png" />
|
<SplashScreen Image="Assets\Logos\SplashScreen.png" />
|
||||||
<InitialRotationPreference>
|
<InitialRotationPreference>
|
||||||
<Rotation Preference="landscape" />
|
<Rotation Preference="landscape" />
|
||||||
<Rotation Preference="landscapeFlipped" />
|
<Rotation Preference="landscapeFlipped" />
|
||||||
</InitialRotationPreference>
|
</InitialRotationPreference>
|
||||||
</VisualElements>
|
</VisualElements>
|
||||||
<Extensions>
|
|
||||||
<Extension Category="windows.backgroundTasks" EntryPoint="DrumKit">
|
|
||||||
<BackgroundTasks>
|
|
||||||
<Task Type="audio" />
|
|
||||||
</BackgroundTasks>
|
|
||||||
</Extension>
|
|
||||||
</Extensions>
|
|
||||||
</Application>
|
</Application>
|
||||||
</Applications>
|
</Applications>
|
||||||
</Package>
|
</Package>
|
@ -6,50 +6,50 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace DrumKit
|
namespace DrumKit
|
||||||
{
|
{
|
||||||
class Recorder
|
//class Recorder
|
||||||
{
|
//{
|
||||||
private SortedDictionary<double, Uri> hits;
|
// private SortedDictionary<double, Uri> hits;
|
||||||
private DateTime begin;
|
// private DateTime begin;
|
||||||
|
|
||||||
public bool IsRecording { get; private set; }
|
// public bool IsRecording { get; private set; }
|
||||||
|
|
||||||
public Recorder()
|
// public Recorder()
|
||||||
{
|
// {
|
||||||
this.IsRecording = false;
|
// this.IsRecording = false;
|
||||||
this.begin = new DateTime();
|
// this.begin = new DateTime();
|
||||||
this.hits = new SortedDictionary<double, Uri>();
|
// this.hits = new SortedDictionary<double, Uri>();
|
||||||
}
|
// }
|
||||||
|
|
||||||
public void Start()
|
// public void Start()
|
||||||
{
|
// {
|
||||||
this.IsRecording = true;
|
// this.IsRecording = true;
|
||||||
begin = DateTime.Now;
|
// begin = DateTime.Now;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public void Add(Uri uri)
|
// public void Add(Uri uri)
|
||||||
{
|
// {
|
||||||
if (!IsRecording)
|
// if (!IsRecording)
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
var time = DateTime.Now - this.begin;
|
// var time = DateTime.Now - this.begin;
|
||||||
this.hits.Add(time.TotalMilliseconds, uri);
|
// this.hits.Add(time.TotalMilliseconds, uri);
|
||||||
}
|
// }
|
||||||
|
|
||||||
public void Stop()
|
// public void Stop()
|
||||||
{
|
// {
|
||||||
this.IsRecording = false;
|
// this.IsRecording = false;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public void Play()
|
// public void Play()
|
||||||
{
|
// {
|
||||||
SoundPlayer player = new SoundPlayer();
|
// SoundPlayer player = new SoundPlayer();
|
||||||
|
|
||||||
var sounduris = this.hits.Values.Distinct();
|
// var sounduris = this.hits.Values.Distinct();
|
||||||
foreach (var i in sounduris)
|
// foreach (var i in sounduris)
|
||||||
player.AddWave(i.AbsolutePath, i.AbsolutePath);
|
// player.AddWave(i.AbsolutePath, i.AbsolutePath);
|
||||||
|
|
||||||
|
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Windows.Storage;
|
|
||||||
|
|
||||||
namespace DrumKit
|
|
||||||
{
|
|
||||||
class DrumRepository
|
|
||||||
{
|
|
||||||
public List<Drum> Drums { get; private set; }
|
|
||||||
|
|
||||||
public DrumRepository()
|
|
||||||
{
|
|
||||||
this.Drums = new List<Drum>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task LoadFile(Uri path)
|
|
||||||
{
|
|
||||||
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(path);
|
|
||||||
IList<string> lines = await FileIO.ReadLinesAsync(file);
|
|
||||||
|
|
||||||
Drum drum = null;
|
|
||||||
double x, y;
|
|
||||||
|
|
||||||
foreach (var i in lines)
|
|
||||||
{
|
|
||||||
var clean = i.Trim(' ', '\t', '\r', '\n');
|
|
||||||
|
|
||||||
// New drum
|
|
||||||
if (clean[0] == '[')
|
|
||||||
{
|
|
||||||
if (drum != null)
|
|
||||||
this.Drums.Add(drum);
|
|
||||||
|
|
||||||
drum = new Drum();
|
|
||||||
drum.Name = clean.Substring(1, clean.Length - 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attribute
|
|
||||||
else if (drum != null)
|
|
||||||
{
|
|
||||||
var split = clean.Split(new char[] { '=', ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
|
|
||||||
|
|
||||||
switch (split[0])
|
|
||||||
{
|
|
||||||
case "position":
|
|
||||||
x = double.Parse(split[1]);
|
|
||||||
y = double.Parse(split[2]);
|
|
||||||
drum.Position = new Windows.Foundation.Point(x, y);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "size":
|
|
||||||
x = double.Parse(split[1]);
|
|
||||||
drum.Size = x;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "image":
|
|
||||||
drum.ImageSource = new Uri(split[1]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "sound":
|
|
||||||
if (split.Length == 2)
|
|
||||||
drum.SetSoundSource(0, new Uri(split[1]));
|
|
||||||
else drum.SetSoundSource(int.Parse(split[1]), new Uri(split[2]));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (drum != null)
|
|
||||||
this.Drums.Add(drum);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using SharpDX;
|
|
||||||
using SharpDX.XAudio2;
|
|
||||||
using SharpDX.IO;
|
|
||||||
using SharpDX.Multimedia;
|
|
||||||
|
|
||||||
namespace DrumKit
|
|
||||||
{
|
|
||||||
class SoundPlayer
|
|
||||||
{
|
|
||||||
private XAudio2 xaudio;
|
|
||||||
private MasteringVoice mvoice;
|
|
||||||
Dictionary<string, MyWave> sounds;
|
|
||||||
SoundPool pool;
|
|
||||||
|
|
||||||
public SoundPlayer()
|
|
||||||
{
|
|
||||||
xaudio = new XAudio2();
|
|
||||||
xaudio.StartEngine();
|
|
||||||
mvoice = new MasteringVoice(xaudio);
|
|
||||||
sounds = new Dictionary<string, MyWave>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddWave(string key, string filepath)
|
|
||||||
{
|
|
||||||
MyWave wave = new MyWave();
|
|
||||||
|
|
||||||
var nativeFileStream = new NativeFileStream(filepath, NativeFileMode.Open, NativeFileAccess.Read, NativeFileShare.Read);
|
|
||||||
var soundStream = new SoundStream(nativeFileStream);
|
|
||||||
var buffer = new AudioBuffer() { Stream = soundStream, AudioBytes = (int)soundStream.Length, Flags = BufferFlags.EndOfStream };
|
|
||||||
|
|
||||||
wave.Buffer = buffer;
|
|
||||||
wave.DecodedPacketsInfo = soundStream.DecodedPacketsInfo;
|
|
||||||
wave.WaveFormat = soundStream.Format;
|
|
||||||
|
|
||||||
this.sounds.Add(key, wave);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddDrums(IEnumerable<Drum> drums)
|
|
||||||
{
|
|
||||||
foreach (var d in drums)
|
|
||||||
foreach (var s in d.SoundSources)
|
|
||||||
{
|
|
||||||
string key = d.Name + s.Key.ToString();
|
|
||||||
string path = s.Value.AbsolutePath.TrimStart('\\', '/');
|
|
||||||
this.AddWave(key, path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Play(string key)
|
|
||||||
{
|
|
||||||
if (!this.sounds.ContainsKey(key)) return;
|
|
||||||
MyWave w = this.sounds[key];
|
|
||||||
|
|
||||||
if (pool == null)
|
|
||||||
pool = new SoundPool(xaudio, w.WaveFormat);
|
|
||||||
|
|
||||||
pool.PlayBuffer(w.Buffer, w.DecodedPacketsInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyWave
|
|
||||||
{
|
|
||||||
public AudioBuffer Buffer { get; set; }
|
|
||||||
public uint[] DecodedPacketsInfo { get; set; }
|
|
||||||
public WaveFormat WaveFormat { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
178
DrumKit/UI/DrumUI.cs
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Windows.Storage;
|
||||||
|
using Windows.UI;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using Windows.UI.Xaml.Controls.Primitives;
|
||||||
|
using Windows.UI.Xaml.Media;
|
||||||
|
using Windows.UI.Xaml.Media.Animation;
|
||||||
|
using Windows.UI.Xaml.Media.Imaging;
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
class DrumUI
|
||||||
|
{
|
||||||
|
#region Private attributes
|
||||||
|
private Thumb thumb;
|
||||||
|
private Image image, imagePressed;
|
||||||
|
private Grid grid;
|
||||||
|
private Storyboard hitAnimation;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Public properties
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the ui element which will be put in a canvas.
|
||||||
|
/// </summary>
|
||||||
|
public FrameworkElement Element { get { return grid; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the drum id.
|
||||||
|
/// </summary>
|
||||||
|
public string DrumID { get; private set; }
|
||||||
|
|
||||||
|
public event Windows.UI.Xaml.Input.PointerEventHandler PointerPressed
|
||||||
|
{
|
||||||
|
add {
|
||||||
|
grid.PointerPressed += value;
|
||||||
|
}
|
||||||
|
|
||||||
|
remove {
|
||||||
|
grid.PointerPressed -= value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public event DragDeltaEventHandler DragDelta
|
||||||
|
{
|
||||||
|
add {
|
||||||
|
thumb.DragDelta += value;
|
||||||
|
}
|
||||||
|
|
||||||
|
remove {
|
||||||
|
thumb.DragDelta -= value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Initialization
|
||||||
|
private void GridAddChild(FrameworkElement element)
|
||||||
|
{
|
||||||
|
grid.Children.Add(element);
|
||||||
|
element.HorizontalAlignment = HorizontalAlignment.Stretch;
|
||||||
|
element.VerticalAlignment = VerticalAlignment.Stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeCreateObjects()
|
||||||
|
{
|
||||||
|
// Create thumb
|
||||||
|
this.thumb = new Thumb()
|
||||||
|
{
|
||||||
|
Background = new SolidColorBrush(Colors.Green),
|
||||||
|
Opacity = .3,
|
||||||
|
Visibility = Visibility.Collapsed
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create image
|
||||||
|
this.image = new Image();
|
||||||
|
|
||||||
|
// Create pressed image
|
||||||
|
this.imagePressed = new Image()
|
||||||
|
{
|
||||||
|
Opacity = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create grid
|
||||||
|
this.grid = new Grid();
|
||||||
|
|
||||||
|
// Create animation
|
||||||
|
DoubleAnimation fade = new DoubleAnimation();
|
||||||
|
fade.Duration = TimeSpan.FromSeconds(.6);
|
||||||
|
fade.From = 1;
|
||||||
|
fade.To = 0;
|
||||||
|
|
||||||
|
Storyboard.SetTarget(fade, this.imagePressed);
|
||||||
|
Storyboard.SetTargetProperty(fade, "Opacity");
|
||||||
|
|
||||||
|
this.hitAnimation = new Storyboard();
|
||||||
|
this.hitAnimation.Children.Add(fade);
|
||||||
|
|
||||||
|
// grid.Resources.Add("hitanimation", this.hitAnimation);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeParenting()
|
||||||
|
{
|
||||||
|
this.GridAddChild(this.image);
|
||||||
|
this.GridAddChild(this.imagePressed);
|
||||||
|
this.GridAddChild(this.thumb);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task InitializeDrum(Drum drum, StorageFolder root)
|
||||||
|
{
|
||||||
|
// Set path
|
||||||
|
Uri rootpath = new Uri(root.Path);
|
||||||
|
|
||||||
|
// Set drum id
|
||||||
|
this.DrumID = drum.Id;
|
||||||
|
|
||||||
|
// Set images
|
||||||
|
this.image.Source = await IOHelper.GetImageAsync(root, drum.ImageSource);
|
||||||
|
this.imagePressed.Source = await IOHelper.GetImageAsync(root, drum.ImagePressedSource);
|
||||||
|
|
||||||
|
// Set tags
|
||||||
|
this.thumb.Tag = drum.Id;
|
||||||
|
this.grid.Tag = drum.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public DrumUI()
|
||||||
|
{
|
||||||
|
// Create objects
|
||||||
|
this.InitializeCreateObjects();
|
||||||
|
this.InitializeParenting();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateLayout(DrumLayout layout, double canvasWidth, double canvasHeight)
|
||||||
|
{
|
||||||
|
// Set up size
|
||||||
|
this.grid.Width = layout.Size * canvasWidth;
|
||||||
|
this.grid.Height = layout.Size * canvasWidth;
|
||||||
|
|
||||||
|
// Set up position
|
||||||
|
Canvas.SetLeft(this.grid, layout.X * canvasWidth);
|
||||||
|
Canvas.SetTop(this.grid, layout.Y * canvasHeight);
|
||||||
|
Canvas.SetZIndex(this.grid, layout.ZIndex);
|
||||||
|
|
||||||
|
// Rotation
|
||||||
|
RotateTransform transform = new RotateTransform();
|
||||||
|
transform.Angle = layout.Angle;
|
||||||
|
transform.CenterX = this.grid.Width / 2;
|
||||||
|
transform.CenterY = this.grid.Height / 2;
|
||||||
|
this.image.RenderTransform = transform;
|
||||||
|
this.imagePressed.RenderTransform = transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Hit()
|
||||||
|
{
|
||||||
|
// Perform a drum hit
|
||||||
|
this.hitAnimation.Begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void EnableEdit()
|
||||||
|
{
|
||||||
|
// Thumb becomes visible
|
||||||
|
this.thumb.Visibility = Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisableEdit()
|
||||||
|
{
|
||||||
|
// Thumb becomes invisible
|
||||||
|
this.thumb.Visibility = Visibility.Collapsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
30
DrumKit/UI/LoadingPage.xaml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<Page
|
||||||
|
x:Class="DrumKit.LoadingPage"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:local="using:DrumKit"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
|
||||||
|
<Grid Background="#164646">
|
||||||
|
<Grid HorizontalAlignment="Center"
|
||||||
|
VerticalAlignment="Center">
|
||||||
|
<Image Source="ms-appx:///Assets/Logos/SplashScreen.png"
|
||||||
|
Stretch="None"/>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<StackPanel
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
VerticalAlignment="Bottom"
|
||||||
|
Orientation="Horizontal"
|
||||||
|
Margin="20">
|
||||||
|
<ProgressRing Width="40" Height="40" IsActive="True" Foreground="White" />
|
||||||
|
<TextBlock
|
||||||
|
Name="TextLoading"
|
||||||
|
Style="{StaticResource SubheaderTextStyle}" Margin="10,0,0,0">
|
||||||
|
Loading resources...</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</Page>
|
72
DrumKit/UI/LoadingPage.xaml.cs
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using Windows.Foundation;
|
||||||
|
using Windows.Foundation.Collections;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using Windows.UI.Xaml.Controls.Primitives;
|
||||||
|
using Windows.UI.Xaml.Data;
|
||||||
|
using Windows.UI.Xaml.Input;
|
||||||
|
using Windows.UI.Xaml.Media;
|
||||||
|
using Windows.UI.Xaml.Navigation;
|
||||||
|
|
||||||
|
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// An empty page that can be used on its own or navigated to within a Frame.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class LoadingPage : Page
|
||||||
|
{
|
||||||
|
public LoadingPage()
|
||||||
|
{
|
||||||
|
this.InitializeComponent();
|
||||||
|
this.Loaded += LoadingPage_Loaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invoked when this page is about to be displayed in a Frame.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="e">Event data that describes how this page was reached. The Parameter
|
||||||
|
/// property is typically used to configure the page.</param>
|
||||||
|
protected override void OnNavigatedTo(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private async void LoadingPage_Loaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
// Perform initializations
|
||||||
|
try
|
||||||
|
{
|
||||||
|
TextLoading.Text = "Loading data...";
|
||||||
|
await DataManager.Initialize();
|
||||||
|
await Log.Initialize();
|
||||||
|
await DrumsManager.Initialize(DataManager.Settings);
|
||||||
|
|
||||||
|
TextLoading.Text = "Loading sounds...";
|
||||||
|
SoundManager.Initialize();
|
||||||
|
await SoundManager.LoadDrumkit(DrumsManager.CurrentDrumkit, DrumsManager.CurrentDrumkitLocation);
|
||||||
|
|
||||||
|
TextLoading.Text = "Loading interface...";
|
||||||
|
UIManager.Initialize();
|
||||||
|
await UIManager.ReloadDrumkit();
|
||||||
|
await UIManager.ReloadConfig();
|
||||||
|
|
||||||
|
Frame.Navigate(typeof(MainPage));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error handling
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
TextLoading.Text = "Failure: " + ex.Message;
|
||||||
|
Log.Error("Failure during loading!");
|
||||||
|
Log.Except(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -6,19 +6,21 @@
|
|||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
|
<Page.Transitions>
|
||||||
|
<TransitionCollection>
|
||||||
|
<EntranceThemeTransition />
|
||||||
|
</TransitionCollection>
|
||||||
|
</Page.Transitions>
|
||||||
|
|
||||||
<Grid
|
<Grid
|
||||||
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
|
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
|
||||||
|
|
||||||
<Image Source="ms-appx:///Assets/bg.png"
|
<Image Source="ms-appx:///Assets/bg.png"
|
||||||
Stretch="UniformToFill"/>
|
Stretch="UniformToFill"/>
|
||||||
|
|
||||||
<Canvas
|
<Grid Name="canvasContainer" />
|
||||||
Name="myCanvas" >
|
|
||||||
|
|
||||||
</Canvas>
|
<Grid Visibility="Collapsed">
|
||||||
|
|
||||||
<Grid>
|
|
||||||
<Border Margin="7"
|
<Border Margin="7"
|
||||||
CornerRadius="10"
|
CornerRadius="10"
|
||||||
BorderBrush="Red"
|
BorderBrush="Red"
|
||||||
@ -63,10 +65,19 @@
|
|||||||
<Page.BottomAppBar>
|
<Page.BottomAppBar>
|
||||||
<AppBar>
|
<AppBar>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
|
|
||||||
|
<ToggleButton
|
||||||
|
Name="buttonAnimations"
|
||||||
|
Click="buttonAnimations_Click"
|
||||||
|
AutomationProperties.Name="Animations"
|
||||||
|
IsChecked="True"
|
||||||
|
Style="{StaticResource VideoAppBarButtonStyle}" />
|
||||||
|
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
Name="buttonEditMode"
|
Name="buttonEditMode"
|
||||||
Click="buttonEditMode_Click_1"
|
Click="buttonEditMode_Click"
|
||||||
Style="{StaticResource EditAppBarButtonStyle}" />
|
Style="{StaticResource EditAppBarButtonStyle}" />
|
||||||
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</AppBar>
|
</AppBar>
|
||||||
</Page.BottomAppBar>
|
</Page.BottomAppBar>
|
97
DrumKit/UI/MainPage.xaml.cs
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using Windows.Foundation;
|
||||||
|
using Windows.Foundation.Collections;
|
||||||
|
using Windows.UI.ApplicationSettings;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using Windows.UI.Xaml.Controls.Primitives;
|
||||||
|
using Windows.UI.Xaml.Data;
|
||||||
|
using Windows.UI.Xaml.Input;
|
||||||
|
using Windows.UI.Xaml.Media;
|
||||||
|
using Windows.UI.Xaml.Navigation;
|
||||||
|
|
||||||
|
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
|
||||||
|
|
||||||
|
namespace DrumKit
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// An empty page that can be used on its own or navigated to within a Frame.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class MainPage : Page
|
||||||
|
{
|
||||||
|
|
||||||
|
public MainPage()
|
||||||
|
{
|
||||||
|
this.InitializeComponent();
|
||||||
|
this.SizeChanged += MainPage_SizeChanged;
|
||||||
|
this.Loaded += MainPage_Loaded;
|
||||||
|
|
||||||
|
this.canvasContainer.Children.Add(UIManager.TheCanvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainPage_SizeChanged(object sender, SizeChangedEventArgs e)
|
||||||
|
{
|
||||||
|
// TODO: Find best layout, and change it
|
||||||
|
DrumsManager.SetLayout();
|
||||||
|
UIManager.ReloadLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainPage_Loaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
// Set layout
|
||||||
|
DrumsManager.SetLayout();
|
||||||
|
UIManager.ReloadLayout();
|
||||||
|
|
||||||
|
// Set toggles
|
||||||
|
buttonAnimations.IsChecked = DataManager.Settings.Animations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invoked when this page is about to be displayed in a Frame.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="e">Event data that describes how this page was reached. The Parameter
|
||||||
|
/// property is typically used to configure the page.</param>
|
||||||
|
protected override void OnNavigatedTo(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
Window.Current.CoreWindow.KeyDown += UIManager.HandlerKeyDown;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnNavigatedFrom(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
Window.Current.CoreWindow.KeyDown -= UIManager.HandlerKeyDown;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buttonEditMode_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var button = sender as ToggleButton;
|
||||||
|
if (button == null) return;
|
||||||
|
|
||||||
|
bool isChecked = (button.IsChecked.HasValue && button.IsChecked.Value);
|
||||||
|
|
||||||
|
// Fix togglebuton style bug
|
||||||
|
VisualStateManager.GoToState(button, isChecked ? "Checked" : "Unchecked", false);
|
||||||
|
|
||||||
|
// Change visibility of thumbs
|
||||||
|
if (isChecked) UIManager.EnterEdit();
|
||||||
|
else UIManager.ExitEdit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buttonAnimations_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
var button = sender as ToggleButton;
|
||||||
|
if (button == null) return;
|
||||||
|
|
||||||
|
bool isChecked = (button.IsChecked.HasValue && button.IsChecked.Value);
|
||||||
|
|
||||||
|
// Fix togglebuton style bug
|
||||||
|
VisualStateManager.GoToState(button, isChecked ? "Checked" : "Unchecked", false);
|
||||||
|
|
||||||
|
// Change animation setting
|
||||||
|
DataManager.Settings.Animations = isChecked;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
BIN
DrumKit130103.vspx
Normal file
BIN
DrumKitApplication.suo
Normal file
BIN
promo-414x180.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
promo-414x468.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
promo-558x756.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
promo-846x468.png
Normal file
After Width: | Height: | Size: 26 KiB |