diff --git a/ShawzinBot/ActionManager.cs b/ShawzinBot/ActionManager.cs
index 7411cae..c6fda9e 100644
--- a/ShawzinBot/ActionManager.cs
+++ b/ShawzinBot/ActionManager.cs
@@ -6,7 +6,9 @@
using System.Windows;
using System.Windows.Forms;
using System.Windows.Shapes;
-using Melanchall.DryWetMidi.Smf;
+using Melanchall.DryWetMidi;
+using Melanchall.DryWetMidi.Core;
+using ShawzinBot.ViewModels;
using Keyboard = InputManager.Keyboard;
using Timer = System.Threading.Timer;
diff --git a/ShawzinBot/Libraries/InputManager.dll b/ShawzinBot/Libraries/InputManager.dll
deleted file mode 100644
index 0a14718..0000000
Binary files a/ShawzinBot/Libraries/InputManager.dll and /dev/null differ
diff --git a/ShawzinBot/Libraries/Melanchall.DryWetMidi.dll b/ShawzinBot/Libraries/Melanchall.DryWetMidi.dll
deleted file mode 100644
index 7ee5697..0000000
Binary files a/ShawzinBot/Libraries/Melanchall.DryWetMidi.dll and /dev/null differ
diff --git a/ShawzinBot/Models/MidiSpeedModel.cs b/ShawzinBot/Models/MidiSpeedModel.cs
new file mode 100644
index 0000000..5a90232
--- /dev/null
+++ b/ShawzinBot/Models/MidiSpeedModel.cs
@@ -0,0 +1,14 @@
+namespace ShawzinBot.Models
+{
+ public class MidiSpeedModel
+ {
+ public string SpeedName { get; private set; }
+ public double Speed { get; private set; }
+
+ public MidiSpeedModel(string speedName, double speed)
+ {
+ SpeedName = speedName;
+ Speed = speed;
+ }
+ }
+}
diff --git a/ShawzinBot/Models/MidiTrackModel.cs b/ShawzinBot/Models/MidiTrackModel.cs
index 6f75ed6..8ed32a7 100644
--- a/ShawzinBot/Models/MidiTrackModel.cs
+++ b/ShawzinBot/Models/MidiTrackModel.cs
@@ -1,4 +1,4 @@
-using Melanchall.DryWetMidi.Smf;
+using Melanchall.DryWetMidi.Core;
using System.Linq;
namespace ShawzinBot.Models
diff --git a/ShawzinBot/ShawzinBot.csproj b/ShawzinBot/ShawzinBot.csproj
index 10cdd6a..491c6b6 100644
--- a/ShawzinBot/ShawzinBot.csproj
+++ b/ShawzinBot/ShawzinBot.csproj
@@ -81,9 +81,8 @@
..\packages\MaterialDesignThemes.3.2.0\lib\net45\MaterialDesignThemes.Wpf.dll
-
- False
- Libraries\Melanchall.DryWetMidi.dll
+
+ ..\packages\Melanchall.DryWetMidi.5.1.1\lib\net45\Melanchall.DryWetMidi.dll
@@ -118,6 +117,7 @@
App.xaml
Code
+
@@ -177,10 +177,6 @@
false
-
-
-
-
diff --git a/ShawzinBot/ViewModels/MainViewModel.cs b/ShawzinBot/ViewModels/MainViewModel.cs
index 2038e15..4366cbc 100644
--- a/ShawzinBot/ViewModels/MainViewModel.cs
+++ b/ShawzinBot/ViewModels/MainViewModel.cs
@@ -3,9 +3,9 @@
using System.Linq;
using System.Timers;
using Caliburn.Micro;
+using Melanchall.DryWetMidi.Core;
using Melanchall.DryWetMidi.Devices;
-using Melanchall.DryWetMidi.Smf;
-using Melanchall.DryWetMidi.Smf.Interaction;
+using Melanchall.DryWetMidi.Interaction;
using Microsoft.Win32;
using ShawzinBot.Models;
using InputDevice = Melanchall.DryWetMidi.Devices.InputDevice;
@@ -26,7 +26,9 @@ public class MainViewModel : Screen
private BindableCollection _midiInputs = new BindableCollection();
private BindableCollection _midiTracks = new BindableCollection();
+ private BindableCollection _midiSpeeds = new BindableCollection();
private MidiInputModel _selectedMidiInput;
+ private MidiSpeedModel _selectedMidiSpeed;
private bool _enableVibrato = true;
private bool _transposeNotes = true;
@@ -49,6 +51,8 @@ public class MainViewModel : Screen
private TrackChunk firstTrack;
private Timer playTimer;
+ private OutputDevice device;
+ private ITimeSpan playTime = new MidiTimeSpan();
#endregion
@@ -76,6 +80,17 @@ public MainViewModel()
SelectedMidiInput = MidiInputs[0];
+ MidiSpeeds.Add(new MidiSpeedModel("0.25", 0.25));
+ MidiSpeeds.Add(new MidiSpeedModel("0.5", 0.5));
+ MidiSpeeds.Add(new MidiSpeedModel("0.75", 0.75));
+ MidiSpeeds.Add(new MidiSpeedModel("Normal", 1));
+ MidiSpeeds.Add(new MidiSpeedModel("1.25", 1.25));
+ MidiSpeeds.Add(new MidiSpeedModel("1.5", 1.5));
+ MidiSpeeds.Add(new MidiSpeedModel("1.75", 1.75));
+ MidiSpeeds.Add(new MidiSpeedModel("2", 2));
+
+ SelectedMidiSpeed = MidiSpeeds[3];
+
EnableVibrato = Properties.Settings.Default.EnableVibrato;
TransposeNotes = Properties.Settings.Default.TransposeNotes;
PlayThroughSpeakers = Properties.Settings.Default.PlayThroughSpeakers;
@@ -169,16 +184,6 @@ public BindableCollection MidiInputs
}
}
- public BindableCollection MidiTracks
- {
- get => _midiTracks;
- set
- {
- _midiTracks = value;
- NotifyOfPropertyChange(() => MidiTracks);
- }
- }
-
public MidiInputModel SelectedMidiInput
{
get => _selectedMidiInput;
@@ -199,6 +204,41 @@ public MidiInputModel SelectedMidiInput
}
}
+ public BindableCollection MidiSpeeds
+ {
+ get => _midiSpeeds;
+ set
+ {
+ _midiSpeeds = value;
+ NotifyOfPropertyChange(() => MidiSpeeds);
+ }
+ }
+
+ public MidiSpeedModel SelectedMidiSpeed
+ {
+ get => _selectedMidiSpeed;
+ set
+ {
+ _selectedMidiSpeed = value;
+ NotifyOfPropertyChange(() => SelectedMidiSpeed);
+
+ if (value?.Speed != null && playback != null)
+ {
+ playback.Speed = value.Speed;
+ }
+ }
+ }
+
+ public BindableCollection MidiTracks
+ {
+ get => _midiTracks;
+ set
+ {
+ _midiTracks = value;
+ NotifyOfPropertyChange(() => MidiTracks);
+ }
+ }
+
public bool EnableVibrato
{
get => _enableVibrato;
@@ -228,27 +268,24 @@ public bool PlayThroughSpeakers
get => _playThroughSpeakers;
set
{
- _playThroughSpeakers = value;
+ //_playThroughSpeakers = value;
+ _playThroughSpeakers = false;
Properties.Settings.Default.PlayThroughSpeakers = value;
Properties.Settings.Default.Save();
NotifyOfPropertyChange(() => PlayThroughSpeakers);
- if (playback != null)
+ /*if (playback != null)
{
- if (!_playThroughSpeakers && playback.OutputDevice != null)
+ if (!_playThroughSpeakers && device != null)
{
- playback.OutputDevice.Dispose();
- playback.OutputDevice = null;
+ device.Dispose();
}
- else if (_playThroughSpeakers && (playback.OutputDevice == null))
+ else if (_playThroughSpeakers && (device == null))
{
- var list = OutputDevice.GetAll();
- if (list.Count() >= 1)
- {
- playback.OutputDevice = list.FirstOrDefault();
- }
+ device = OutputDevice.GetByName("Microsoft GS Wavetable Synth");
+ playback.OutputDevice = device;
}
- }
+ }*/
}
}
@@ -302,15 +339,13 @@ public void CloseFile()
if (playback != null)
{
playback.Stop();
- playback.OutputDevice?.Dispose();
-
PlaybackCurrentTimeWatcher.Instance.RemovePlayback(playback);
-
- playback?.Dispose();
+ playback.Dispose();
+ playback = null;
}
- playback = null;
midiFile = null;
+ MidiTracks.Clear();
PlayPauseIcon = "Play";
SongName = "";
@@ -323,13 +358,12 @@ public void PlayPause()
{
if (midiFile == null || MaximumTime == 0d) return;
if (playback == null || reloadPlayback)
- {
- ITimeSpan playTime = new MidiTimeSpan();
+ {
if (playback != null)
{
playback.Stop();
playTime = playback.GetCurrentTime(TimeSpanType.Midi);
- playback.OutputDevice?.Dispose();
+ playback.Dispose();
playback = null;
PlayPauseIcon = "Play";
}
@@ -346,6 +380,12 @@ public void PlayPause()
}
playback = midiFile.GetPlayback();
+ playback.Speed = SelectedMidiSpeed.Speed;
+ if (PlayThroughSpeakers)
+ {
+ device = OutputDevice.GetByName("Microsoft GS Wavetable Synth");
+ playback.OutputDevice = device;
+ }
playback.MoveToTime(playTime);
playback.Finished += (s, e) =>
{
@@ -365,6 +405,10 @@ public void PlayPause()
PlayPauseIcon = "Play";
playback.Stop();
}
+ else if (PlayPauseIcon == "Pause") {
+ PlayPauseIcon = "Play";
+ playTimer.Dispose();
+ }
else
{
PlayPauseIcon = "Pause";
@@ -373,10 +417,8 @@ public void PlayPause()
playTimer = new Timer();
playTimer.Interval = 100;
playTimer.Elapsed += new ElapsedEventHandler(PlayTimerElapsed);
- playTimer.AutoReset = false;
playTimer.Start();
}
- UpdateScale(ActionManager.activeScale);
}
private void PlayTimerElapsed(object sender, ElapsedEventArgs e)
@@ -384,12 +426,7 @@ private void PlayTimerElapsed(object sender, ElapsedEventArgs e)
if (ActionManager.IsWindowFocused("Warframe") || PlayThroughSpeakers)
{
playback.Start();
- playTimer.Stop();
- }
- else
- {
- playTimer.Stop();
- playTimer.Start();
+ playTimer.Dispose();
}
}
@@ -447,7 +484,7 @@ public void OnNoteEvent(object sender, MidiEventPlayedEventArgs e)
{
case MidiEventType.SetTempo:
var tempo = e.Event as SetTempoEvent;
- playback.Speed = tempo.MicrosecondsPerQuarterNote;
+ //playback.Speed = tempo.MicrosecondsPerQuarterNote;
return;
case MidiEventType.NoteOn:
var note = e.Event as NoteOnEvent;
@@ -455,6 +492,7 @@ public void OnNoteEvent(object sender, MidiEventPlayedEventArgs e)
//Check if the user has tabbed out of warframe, and stop playback to avoid Scale issues
if (!(ActionManager.PlayNote(note, EnableVibrato, TransposeNotes) || PlayThroughSpeakers)) PlayPause();
+ UpdateScale(ActionManager.activeScale);
return;
default:
return;
diff --git a/ShawzinBot/Views/MainView.xaml b/ShawzinBot/Views/MainView.xaml
index 677a4df..ce56d6a 100644
--- a/ShawzinBot/Views/MainView.xaml
+++ b/ShawzinBot/Views/MainView.xaml
@@ -3,6 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:local="clr-namespace:ShawzinBot.Views"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:cal="http://www.caliburnproject.org"
@@ -15,7 +16,7 @@
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
WindowStyle="None"
- Title="MainView" Height="500" Width="300">
+ Title="MainView" Height="510" Width="300">
@@ -78,7 +79,7 @@
-
+
@@ -191,12 +192,16 @@
-
+
-
+
+
+
diff --git a/ShawzinBot/packages.config b/ShawzinBot/packages.config
index 9c18967..6d0ff14 100644
--- a/ShawzinBot/packages.config
+++ b/ShawzinBot/packages.config
@@ -7,5 +7,6 @@
+
\ No newline at end of file