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