Build 121209
46
DrumKit.sln
Normal file
@ -0,0 +1,46 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2012
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DrumKit", "DrumKit\DrumKit.csproj", "{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|ARM = Debug|ARM
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|ARM = Release|ARM
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|ARM.ActiveCfg = Debug|ARM
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|ARM.Build.0 = Debug|ARM
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|ARM.Deploy.0 = Debug|ARM
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|x64.Build.0 = Debug|x64
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|x64.Deploy.0 = Debug|x64
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|x86.Build.0 = Debug|x86
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Debug|x86.Deploy.0 = Debug|x86
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|ARM.ActiveCfg = Release|ARM
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|ARM.Build.0 = Release|ARM
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|ARM.Deploy.0 = Release|ARM
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|x64.ActiveCfg = Release|x64
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|x64.Build.0 = Release|x64
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|x64.Deploy.0 = Release|x64
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|x86.ActiveCfg = Release|x86
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|x86.Build.0 = Release|x86
|
||||
{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}.Release|x86.Deploy.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
BIN
DrumKit.v11.suo
Normal file
20
DrumKit/App.xaml
Normal file
@ -0,0 +1,20 @@
|
||||
<Application
|
||||
x:Class="DrumKit.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="using:DrumKit">
|
||||
|
||||
<Application.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
|
||||
<!--
|
||||
Styles that define common aspects of the platform look and feel
|
||||
Required by Visual Studio project and item templates
|
||||
-->
|
||||
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
</Application>
|
90
DrumKit/App.xaml.cs
Normal file
@ -0,0 +1,90 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Windows.ApplicationModel;
|
||||
using Windows.ApplicationModel.Activation;
|
||||
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 Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227
|
||||
|
||||
namespace DrumKit
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides application-specific behavior to supplement the default Application class.
|
||||
/// </summary>
|
||||
sealed partial class App : Application
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes the singleton application object. This is the first line of authored code
|
||||
/// executed, and as such is the logical equivalent of main() or WinMain().
|
||||
/// </summary>
|
||||
public App()
|
||||
{
|
||||
this.InitializeComponent();
|
||||
this.Suspending += OnSuspending;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Invoked when the application is launched normally by the end user. Other entry points
|
||||
/// will be used when the application is launched to open a specific file, to display
|
||||
/// search results, and so forth.
|
||||
/// </summary>
|
||||
/// <param name="args">Details about the launch request and process.</param>
|
||||
protected override void OnLaunched(LaunchActivatedEventArgs args)
|
||||
{
|
||||
Frame rootFrame = Window.Current.Content as Frame;
|
||||
|
||||
// Do not repeat app initialization when the Window already has content,
|
||||
// just ensure that the window is active
|
||||
if (rootFrame == null)
|
||||
{
|
||||
// Create a Frame to act as the navigation context and navigate to the first page
|
||||
rootFrame = new Frame();
|
||||
|
||||
if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
|
||||
{
|
||||
//TODO: Load state from previously suspended application
|
||||
}
|
||||
|
||||
// Place the frame in the current Window
|
||||
Window.Current.Content = rootFrame;
|
||||
}
|
||||
|
||||
if (rootFrame.Content == null)
|
||||
{
|
||||
// When the navigation stack isn't restored navigate to the first page,
|
||||
// configuring the new page by passing required information as a navigation
|
||||
// parameter
|
||||
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
|
||||
{
|
||||
throw new Exception("Failed to create initial page");
|
||||
}
|
||||
}
|
||||
// Ensure the current window is active
|
||||
Window.Current.Activate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Invoked when application execution is being suspended. Application state is saved
|
||||
/// without knowing whether the application will be terminated or resumed with the contents
|
||||
/// of memory still intact.
|
||||
/// </summary>
|
||||
/// <param name="sender">The source of the suspend request.</param>
|
||||
/// <param name="e">Details about the suspend request.</param>
|
||||
private void OnSuspending(object sender, SuspendingEventArgs e)
|
||||
{
|
||||
var deferral = e.SuspendingOperation.GetDeferral();
|
||||
//TODO: Save application state and stop any background activity
|
||||
deferral.Complete();
|
||||
}
|
||||
}
|
||||
}
|
BIN
DrumKit/Assets/Drums/big_drum_of.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
DrumKit/Assets/Drums/big_drum_on.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
DrumKit/Assets/Drums/drum_of.png
Normal file
After Width: | Height: | Size: 230 KiB |
BIN
DrumKit/Assets/Drums/drum_on.png
Normal file
After Width: | Height: | Size: 228 KiB |
BIN
DrumKit/Assets/Drums/plate_off.png
Normal file
After Width: | Height: | Size: 515 KiB |
BIN
DrumKit/Assets/Drums/plate_on.png
Normal file
After Width: | Height: | Size: 372 KiB |
BIN
DrumKit/Assets/Logos/Logo.png
Normal file
After Width: | Height: | Size: 801 B |
BIN
DrumKit/Assets/Logos/SmallLogo.png
Normal file
After Width: | Height: | Size: 329 B |
BIN
DrumKit/Assets/Logos/SplashScreen.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
DrumKit/Assets/Logos/StoreLogo.png
Normal file
After Width: | Height: | Size: 429 B |
BIN
DrumKit/Assets/Sounds/Crash05.wav
Normal file
BIN
DrumKit/Assets/Sounds/Floor04.wav
Normal file
BIN
DrumKit/Assets/Sounds/Hat04.WAV
Normal file
BIN
DrumKit/Assets/Sounds/HiHatOpen04.wav
Normal file
BIN
DrumKit/Assets/Sounds/Kick07.wav
Normal file
BIN
DrumKit/Assets/Sounds/Ride04.wav
Normal file
BIN
DrumKit/Assets/Sounds/Snare08.wav
Normal file
BIN
DrumKit/Assets/Sounds/TomHigh04.wav
Normal file
BIN
DrumKit/Assets/Sounds/TomLow04.wav
Normal file
BIN
DrumKit/Assets/bg.png
Normal file
After Width: | Height: | Size: 838 KiB |
40
DrumKit/Assets/default
Normal file
@ -0,0 +1,40 @@
|
||||
[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
|
1833
DrumKit/Common/StandardStyles.xaml
Normal file
107
DrumKit/Drum.cs
Normal file
@ -0,0 +1,107 @@
|
||||
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
|
||||
|
||||
}
|
||||
}
|
181
DrumKit/DrumKit.csproj
Normal file
@ -0,0 +1,181 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{9A5D3F55-DFD5-45DB-99FF-C82EFCC3294D}</ProjectGuid>
|
||||
<OutputType>AppContainerExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>DrumKit</RootNamespace>
|
||||
<AssemblyName>DrumKit</AssemblyName>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<PackageCertificateKeyFile>DrumKit_TemporaryKey.pfx</PackageCertificateKeyFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE;NETFX_CORE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE;NETFX_CORE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\ARM\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE;NETFX_CORE</DefineConstants>
|
||||
<NoWarn>;2008</NoWarn>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>ARM</PlatformTarget>
|
||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
|
||||
<OutputPath>bin\ARM\Release\</OutputPath>
|
||||
<DefineConstants>TRACE;NETFX_CORE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<NoWarn>;2008</NoWarn>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>ARM</PlatformTarget>
|
||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE;NETFX_CORE</DefineConstants>
|
||||
<NoWarn>;2008</NoWarn>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE;NETFX_CORE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<NoWarn>;2008</NoWarn>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE;NETFX_CORE</DefineConstants>
|
||||
<NoWarn>;2008</NoWarn>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
<DefineConstants>TRACE;NETFX_CORE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<NoWarn>;2008</NoWarn>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="App.xaml.cs">
|
||||
<DependentUpon>App.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Drum.cs" />
|
||||
<Compile Include="MainPage.xaml.cs">
|
||||
<DependentUpon>MainPage.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Recorder.cs" />
|
||||
<Compile Include="Repository\DrumRepository.cs" />
|
||||
<Compile Include="SoundPlayer.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="SoundPool.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AppxManifest Include="Package.appxmanifest">
|
||||
<SubType>Designer</SubType>
|
||||
</AppxManifest>
|
||||
<None Include="DrumKit_TemporaryKey.pfx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Assets\bg.png" />
|
||||
<Content Include="Assets\Drums\big_drum_of.png" />
|
||||
<Content Include="Assets\Drums\big_drum_on.png" />
|
||||
<Content Include="Assets\Drums\drum_of.png" />
|
||||
<Content Include="Assets\Drums\drum_on.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\SmallLogo.png" />
|
||||
<Content Include="Assets\Logos\SplashScreen.png" />
|
||||
<Content Include="Assets\Logos\StoreLogo.png" />
|
||||
<Content Include="Assets\Drums\plate_off.png" />
|
||||
<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>
|
||||
<ApplicationDefinition Include="App.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Page Include="Common\StandardStyles.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="MainPage.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="SharpDX">
|
||||
<HintPath>C:\Users\Tiberiu\Downloads\SharpDX\Bin\Standard-winrt\SharpDX.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SharpDX.XAudio2">
|
||||
<HintPath>C:\Users\Tiberiu\Downloads\SharpDX\Bin\Standard-winrt\SharpDX.XAudio2.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '11.0' ">
|
||||
<VisualStudioVersion>11.0</VisualStudioVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
6
DrumKit/DrumKit.csproj.user
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
||||
<UseSimulator>False</UseSimulator>
|
||||
</PropertyGroup>
|
||||
</Project>
|
73
DrumKit/MainPage.xaml
Normal file
@ -0,0 +1,73 @@
|
||||
<Page
|
||||
x:Class="DrumKit.MainPage"
|
||||
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="{StaticResource ApplicationPageBackgroundThemeBrush}">
|
||||
|
||||
<Image Source="ms-appx:///Assets/bg.png"
|
||||
Stretch="UniformToFill"/>
|
||||
|
||||
<Canvas
|
||||
Name="myCanvas" >
|
||||
|
||||
</Canvas>
|
||||
|
||||
<Grid>
|
||||
<Border Margin="7"
|
||||
CornerRadius="10"
|
||||
BorderBrush="Red"
|
||||
BorderThickness="5" />
|
||||
|
||||
<Canvas Name="recCanvas">
|
||||
<Ellipse Width="18" Height="18" Fill="Red"
|
||||
Canvas.Left="20"
|
||||
Canvas.Top="20"/>
|
||||
<TextBlock
|
||||
FontFamily="Consolas"
|
||||
FontSize="16"
|
||||
Foreground="Red"
|
||||
Canvas.Left="42"
|
||||
Canvas.Top="19">REC
|
||||
</TextBlock>
|
||||
|
||||
<Canvas.Triggers>
|
||||
<EventTrigger RoutedEvent="Canvas.Loaded">
|
||||
<BeginStoryboard>
|
||||
<Storyboard RepeatBehavior="Forever" >
|
||||
<DoubleAnimation
|
||||
Storyboard.TargetName="recCanvas"
|
||||
Storyboard.TargetProperty="Opacity"
|
||||
Duration="0:0:1" BeginTime="0:0:1" From="1" To="0.1" />
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</EventTrigger>
|
||||
</Canvas.Triggers>
|
||||
</Canvas>
|
||||
<!--<StackPanel Orientation="Horizontal"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Top">
|
||||
<Button>Record</Button>
|
||||
<Button>Stop</Button>
|
||||
</StackPanel>-->
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
|
||||
<Page.BottomAppBar>
|
||||
<AppBar>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<ToggleButton
|
||||
Name="buttonEditMode"
|
||||
Click="buttonEditMode_Click_1"
|
||||
Style="{StaticResource EditAppBarButtonStyle}" />
|
||||
</StackPanel>
|
||||
</AppBar>
|
||||
</Page.BottomAppBar>
|
||||
</Page>
|
201
DrumKit/MainPage.xaml.cs
Normal file
@ -0,0 +1,201 @@
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
35
DrumKit/Package.appxmanifest
Normal file
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
|
||||
<Identity Name="9e797bd6-ff19-4416-8ec8-f371d6d86244" Publisher="CN=Tiberiu" Version="1.0.0.0" />
|
||||
<Properties>
|
||||
<DisplayName>DrumKit</DisplayName>
|
||||
<PublisherDisplayName>Tiberiu</PublisherDisplayName>
|
||||
<Logo>Assets\StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
<Prerequisites>
|
||||
<OSMinVersion>6.2.1</OSMinVersion>
|
||||
<OSMaxVersionTested>6.2.1</OSMaxVersionTested>
|
||||
</Prerequisites>
|
||||
<Resources>
|
||||
<Resource Language="x-generate" />
|
||||
</Resources>
|
||||
<Applications>
|
||||
<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">
|
||||
<DefaultTile ShowName="allLogos" />
|
||||
<SplashScreen Image="Assets\Logos\SplashScreen.png" />
|
||||
<InitialRotationPreference>
|
||||
<Rotation Preference="landscape" />
|
||||
<Rotation Preference="landscapeFlipped" />
|
||||
</InitialRotationPreference>
|
||||
</VisualElements>
|
||||
<Extensions>
|
||||
<Extension Category="windows.backgroundTasks" EntryPoint="DrumKit">
|
||||
<BackgroundTasks>
|
||||
<Task Type="audio" />
|
||||
</BackgroundTasks>
|
||||
</Extension>
|
||||
</Extensions>
|
||||
</Application>
|
||||
</Applications>
|
||||
</Package>
|
29
DrumKit/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,29 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("DrumKit")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("DrumKit")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2012")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
[assembly: ComVisible(false)]
|
55
DrumKit/Recorder.cs
Normal file
@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace DrumKit
|
||||
{
|
||||
class Recorder
|
||||
{
|
||||
private SortedDictionary<double, Uri> hits;
|
||||
private DateTime begin;
|
||||
|
||||
public bool IsRecording { get; private set; }
|
||||
|
||||
public Recorder()
|
||||
{
|
||||
this.IsRecording = false;
|
||||
this.begin = new DateTime();
|
||||
this.hits = new SortedDictionary<double, Uri>();
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
this.IsRecording = true;
|
||||
begin = DateTime.Now;
|
||||
}
|
||||
|
||||
public void Add(Uri uri)
|
||||
{
|
||||
if (!IsRecording)
|
||||
return;
|
||||
|
||||
var time = DateTime.Now - this.begin;
|
||||
this.hits.Add(time.TotalMilliseconds, uri);
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
this.IsRecording = false;
|
||||
}
|
||||
|
||||
public void Play()
|
||||
{
|
||||
SoundPlayer player = new SoundPlayer();
|
||||
|
||||
var sounduris = this.hits.Values.Distinct();
|
||||
foreach (var i in sounduris)
|
||||
player.AddWave(i.AbsolutePath, i.AbsolutePath);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
76
DrumKit/Repository/DrumRepository.cs
Normal file
@ -0,0 +1,76 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
72
DrumKit/SoundPlayer.cs
Normal file
@ -0,0 +1,72 @@
|
||||
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; }
|
||||
}
|
||||
}
|
41
DrumKit/SoundPool.cs
Normal file
@ -0,0 +1,41 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using SharpDX;
|
||||
using SharpDX.XAudio2;
|
||||
using SharpDX.Multimedia;
|
||||
|
||||
namespace DrumKit
|
||||
{
|
||||
class SoundPool
|
||||
{
|
||||
List<SourceVoice> voices;
|
||||
|
||||
public SoundPool(XAudio2 device, WaveFormat format)
|
||||
{
|
||||
voices = new List<SourceVoice>();
|
||||
|
||||
for (int i = 0; i < 64; i++)
|
||||
voices.Add(new SourceVoice(device, format, true));
|
||||
}
|
||||
|
||||
|
||||
public void PlayBuffer(AudioBuffer buffer, uint[] packetinfo)
|
||||
{
|
||||
int preferred = -1;
|
||||
|
||||
for (int i = 0; i < voices.Count; i++)
|
||||
if (voices[i].State.BuffersQueued == 0)
|
||||
preferred = i;
|
||||
|
||||
if (preferred != -1)
|
||||
{
|
||||
// voices[preferred].FlushSourceBuffers();
|
||||
voices[preferred].SubmitSourceBuffer(buffer, packetinfo);
|
||||
voices[preferred].Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|