Skip to content

Commit 7c38aab

Browse files
authored
Create Maestro2 Skeleton (#295)
* Remove unused jamboree project * Create skeleton Sequencer backend class * skeleton test * Player Skeleton * Add PlayerType to IPlayer * Create Sanford skeleton * Remove broken lightamp loader code. * Create skeleton Sequencer backend class * skeleton test * Player Skeleton * Add PlayerType to IPlayer * Create Sanford skeleton * Remove broken lightamp loader code. * merge fixes
1 parent 55caf10 commit 7c38aab

File tree

127 files changed

+706
-629
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+706
-629
lines changed

BardMusicPlayer.Maestro.ApiTest/BardMusicPlayer.Maestro.ApiTest.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,8 @@
1818
<Version>2.0.0.0</Version>
1919
</PropertyGroup>
2020

21+
<ItemGroup>
22+
<ProjectReference Include="..\BardMusicPlayer.Maestro\BardMusicPlayer.Maestro.csproj" />
23+
</ItemGroup>
24+
2125
</Project>

BardMusicPlayer.Maestro.ApiTest/Program.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,20 @@
33
* Licensed under the GPL v3 license. See https://github.com/BardMusicPlayer/BardMusicPlayerApi/blob/develop/LICENSE for full license information.
44
*/
55

6-
using System;
6+
using BardMusicPlayer.Maestro.Sequencer;
7+
using System.Threading;
78

89
namespace BardMusicPlayer.Maestro.ApiTest
910
{
1011
internal class Program
1112
{
12-
static void Main(string[] args)
13+
static void Main()
1314
{
14-
Console.WriteLine("Hello, World!");
15+
BmpMaestro.Instance.Start(SequencerType.MogAmp);
16+
17+
Thread.Sleep(5000);
18+
19+
BmpMaestro.Instance.Stop();
1520
}
1621
}
1722
}

BardMusicPlayer.Maestro/BmpMaestro.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright(c) 2023 MoogleTroupe
3+
* Licensed under the GPL v3 license. See https://github.com/BardMusicPlayer/BardMusicPlayer/blob/develop/LICENSE for full license information.
4+
*/
5+
6+
using BardMusicPlayer.Maestro.Sequencer;
7+
using System;
8+
9+
namespace BardMusicPlayer.Maestro
10+
{
11+
public partial class BmpMaestro
12+
{
13+
private static readonly Lazy<BmpMaestro> LazyInstance = new(() => new BmpMaestro());
14+
internal SequencerHandler _sequencerHandler;
15+
16+
/// <summary>
17+
///
18+
/// </summary>
19+
public bool Started { get; private set; }
20+
21+
private BmpMaestro()
22+
{
23+
}
24+
25+
public static BmpMaestro Instance => LazyInstance.Value;
26+
27+
/// <summary>
28+
/// Start Maestro.
29+
/// </summary>
30+
public void Start(SequencerType sequencerType)
31+
{
32+
if (Started) return;
33+
_sequencerHandler = new SequencerHandler(sequencerType);
34+
Started = true;
35+
}
36+
37+
/// <summary>
38+
/// Stop Maestro.
39+
/// </summary>
40+
public void Stop()
41+
{
42+
if (!Started) return;
43+
_sequencerHandler.Dispose();
44+
Started = false;
45+
}
46+
47+
~BmpMaestro() => Dispose();
48+
public void Dispose()
49+
{
50+
Stop();
51+
GC.SuppressFinalize(this);
52+
}
53+
}
54+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* Copyright(c) 2023 MoogleTroupe
3+
* Licensed under the GPL v3 license. See https://github.com/BardMusicPlayer/BardMusicPlayer/blob/develop/LICENSE for full license information.
4+
*/
5+
6+
namespace BardMusicPlayer.Maestro.Events;
7+
8+
public enum EventSource
9+
{
10+
Maestro = 0,
11+
BackEnd = 1
12+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright(c) 2023 MoogleTroupe
3+
* Licensed under the GPL v3 license. See https://github.com/BardMusicPlayer/BardMusicPlayer/blob/develop/LICENSE for full license information.
4+
*/
5+
6+
using System;
7+
8+
namespace BardMusicPlayer.Maestro.Events;
9+
10+
public class MaestroExceptionEvent : MaestroEvent
11+
{
12+
internal MaestroExceptionEvent(Exception exception, EventSource eventSource = EventSource.Maestro) : base(eventSource)
13+
{
14+
EventType = GetType();
15+
Exception = exception;
16+
}
17+
18+
public Exception Exception { get; }
19+
}
20+
21+
public sealed class BackendExceptionEvent : MaestroExceptionEvent
22+
{
23+
internal BackendExceptionEvent(EventSource sequencerBackendType, Exception exception) : base(exception,
24+
sequencerBackendType)
25+
{
26+
EventType = GetType();
27+
}
28+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright(c) 2023 MoogleTroupe
3+
* Licensed under the GPL v3 license. See https://github.com/BardMusicPlayer/BardMusicPlayer/blob/develop/LICENSE for full license information.
4+
*/
5+
6+
using System;
7+
using BardMusicPlayer.Quotidian.UtcMilliTime;
8+
9+
namespace BardMusicPlayer.Maestro.Events;
10+
11+
public abstract class MaestroEvent
12+
{
13+
internal MaestroEvent(EventSource eventSource)
14+
{
15+
EventSource = eventSource;
16+
TimeStamp = Clock.Time.Now;
17+
}
18+
19+
public long TimeStamp { get; }
20+
21+
public EventSource EventSource { get; }
22+
23+
public Type EventType { get; protected set; }
24+
}

BardMusicPlayer.Maestro/Exceptions.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright(c) 2023 MoogleTroupe
3+
* Licensed under the GPL v3 license. See https://github.com/BardMusicPlayer/BardMusicPlayer/blob/develop/LICENSE for full license information.
4+
*/
5+
6+
using BardMusicPlayer.Maestro.Events;
7+
using BardMusicPlayer.Quotidian;
8+
9+
namespace BardMusicPlayer.Maestro;
10+
11+
public class BmpMaestroException : BmpException
12+
{
13+
internal BmpMaestroException() { }
14+
15+
internal BmpMaestroException(string message) : base(message) { }
16+
}
17+
18+
public class BmpMaestroBackendAlreadyRunningException : BmpMaestroException
19+
{
20+
internal BmpMaestroBackendAlreadyRunningException(EventSource sequencerBackendType) : base("Backend " + sequencerBackendType + " already running")
21+
{
22+
}
23+
}

BardMusicPlayer.Maestro/Old/Events/SongLoadedEvent.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ namespace BardMusicPlayer.Maestro.Old.Events;
1212
public sealed class SongLoadedEvent : MaestroEvent
1313
{
1414

15-
internal SongLoadedEvent(int maxtracks, Sequencer sequencer)
15+
internal SongLoadedEvent(int maxtracks, OldSequencer sequencer)
1616
{
1717
EventType = GetType();
1818
MaxTracks = maxtracks;
1919
_sequencer = sequencer;
2020
}
21-
private Sequencer _sequencer;
21+
private OldSequencer _sequencer;
2222
public int MaxTracks { get; }
2323
public int TotalNoteCount => _sequencer.notesPlayedCount.Values.Sum();
2424

BardMusicPlayer.Maestro/Old/Lib/Sanford.Collections/Generic/UndoableList/ICommand.cs

Lines changed: 0 additions & 8 deletions
This file was deleted.

BardMusicPlayer.Maestro/Old/Orchestrator.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public struct TitleParsingHelper
3939
/// </summary>
4040
public class Orchestrator : IDisposable
4141
{
42-
private Sequencer _sequencer { get; set; }
42+
private OldSequencer _sequencer { get; set; }
4343
private CancellationTokenSource _updaterTokenSource;
4444
private bool LocalOrchestraInitialized { get; set; }
4545
private KeyValuePair<TitleParsingHelper, Performer> _song_Title_Parsing_Performer { get; set; }
@@ -59,7 +59,7 @@ public Orchestrator()
5959
{
6060
_performers = new List<KeyValuePair<int, Performer>>();
6161
_foundGames = new Dictionary<Game, bool>();
62-
_sequencer = new Sequencer();
62+
_sequencer = new OldSequencer();
6363
_song_Title_Parsing_Performer = new KeyValuePair<TitleParsingHelper, Performer>(new TitleParsingHelper { channelType = ChatMessageChannelType.None }, null);
6464
BmpSeer.Instance.GameStarted += delegate (GameStarted e) { Instance_OnGameStarted(e.Game); };
6565
BmpSeer.Instance.GameStopped += Instance_OnGameStopped;
@@ -223,7 +223,7 @@ public void SetOctaveshiftOnHost(int octave)
223223
public void Seek(int ticks)
224224
{
225225
foreach (var perf in _performers)
226-
perf.Value.Sequencer.Seek(ticks);
226+
perf.Value.OldSequencer.Seek(ticks);
227227
}
228228

229229
/// <summary>
@@ -233,7 +233,7 @@ public void Seek(int ticks)
233233
public void Seek(double miliseconds)
234234
{
235235
foreach (var perf in _performers)
236-
perf.Value.Sequencer.Seek(miliseconds);
236+
perf.Value.OldSequencer.Seek(miliseconds);
237237
}
238238

239239
/// <summary>
@@ -266,8 +266,8 @@ public void LoadBMPSong(BmpSong song)
266266

267267
foreach (var perf in _performers)
268268
{
269-
perf.Value.Sequencer = _sequencer; //use the sequence from the main sequencer
270-
perf.Value.Sequencer.LoadedBmpSong = song; //set the song
269+
perf.Value.OldSequencer = _sequencer; //use the sequence from the main sequencer
270+
perf.Value.OldSequencer.LoadedBmpSong = song; //set the song
271271
}
272272
InitNewPerformance();
273273
}
@@ -334,8 +334,8 @@ public void OpenInputDevice(int device)
334334
{
335335
foreach (var perf in _performers.Where(perf => perf.Value.HostProcess))
336336
{
337-
perf.Value.Sequencer.CloseInputDevice();
338-
perf.Value.Sequencer.OpenInputDevice(device);
337+
perf.Value.OldSequencer.CloseInputDevice();
338+
perf.Value.OldSequencer.OpenInputDevice(device);
339339
}
340340
}
341341

@@ -346,7 +346,7 @@ public void CloseInputDevice()
346346
{
347347
foreach (var perf in _performers.Where(perf => perf.Value.HostProcess))
348348
{
349-
perf.Value.Sequencer.CloseInputDevice();
349+
perf.Value.OldSequencer.CloseInputDevice();
350350
}
351351
}
352352
#endregion
@@ -501,7 +501,7 @@ private void CheckFoundGames(object sender, ElapsedEventArgs e)
501501
var perf = new Performer(game.Key)
502502
{
503503
HostProcess = game.Value,
504-
Sequencer = _sequencer,
504+
OldSequencer = _sequencer,
505505
TrackNumber = 1
506506
};
507507
lock (_performers)
@@ -604,7 +604,7 @@ private void InitNewPerformance()
604604
{
605605
if (BmpPigeonhole.Instance.AutoEquipBards)
606606
_ = perf.ReplaceInstrument().Result;
607-
perf.Sequencer.PlayEnded += Sequencer_PlayEnded;
607+
perf.OldSequencer.PlayEnded += Sequencer_PlayEnded;
608608
}
609609

610610
_updaterTokenSource = new CancellationTokenSource();
@@ -751,7 +751,7 @@ private async Task Updater(CancellationToken token)
751751
if (perf == null)
752752
perf = _performers.Find(perf => perf.Value.HostProcess).Value;
753753
else
754-
BmpMaestro.Instance.PublishEvent(new CurrentPlayPositionEvent(perf.Sequencer.CurrentTimeAsTimeSpan, perf.Sequencer.CurrentTick));
754+
BmpMaestro.Instance.PublishEvent(new CurrentPlayPositionEvent(perf.OldSequencer.CurrentTimeAsTimeSpan, perf.OldSequencer.CurrentTick));
755755

756756
await Task.Delay(200, token).ContinueWith(tsk => { }, token);
757757
}

BardMusicPlayer.Maestro/Old/Performance/Performer.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,20 @@
99
using System.Threading.Tasks;
1010
using System.Timers;
1111
using BardMusicPlayer.DalamudBridge;
12+
using BardMusicPlayer.Maestro.Old.FFXIV;
13+
using BardMusicPlayer.Maestro.Old.Utils;
1214
using BardMusicPlayer.Maestro.Old.Events;
1315
using BardMusicPlayer.Maestro.Old.FFXIV;
14-
using BardMusicPlayer.Maestro.Old.Lib.Sanford.Multimedia.Midi.Messages;
15-
using BardMusicPlayer.Maestro.Old.Lib.Sanford.Multimedia.Midi.Messages.EventArg;
1616
using BardMusicPlayer.Maestro.Old.Sequencing;
1717
using BardMusicPlayer.Maestro.Old.Utils;
18+
using BardMusicPlayer.Maestro.Sequencer.Backend.Sanford.Multimedia.Midi.Messages;
19+
using BardMusicPlayer.Maestro.Sequencer.Backend.Sanford.Multimedia.Midi.Messages.EventArg;
20+
using BardMusicPlayer.Maestro.Sequencer.Backend.Sanford.Multimedia.Midi.Messages.MessageBuilders;
1821
using BardMusicPlayer.Pigeonhole;
1922
using BardMusicPlayer.Quotidian.Enums;
2023
using BardMusicPlayer.Quotidian.Structs;
2124
using BardMusicPlayer.Seer;
2225
using BardMusicPlayer.Transmogrify.Song.Config;
23-
using Sanford.Multimedia.Midi;
2426
using MessageType = BardMusicPlayer.DalamudBridge.Helper.Dalamud.MessageType;
2527

2628
namespace BardMusicPlayer.Maestro.Old.Performance;
@@ -31,8 +33,8 @@ public class Performer
3133
private Timer _startDelayTimer { get; set; } = new();
3234
private bool _holdNotes { get; set; } = true;
3335
private bool _forcePlayback { get; set; }
34-
private Sequencer _sequencer { get; set; }
35-
private Sequencer mainSequencer { get; set; }
36+
private OldSequencer _sequencer { get; set; }
37+
private OldSequencer mainSequencer { get; set; }
3638
private int _trackNumber { get; set; } = 1;
3739
private long _lastNoteTimestamp;
3840
private bool _livePlayDelay { get; set; }
@@ -111,14 +113,14 @@ public string TrackInstrument
111113
}
112114
}
113115

114-
public Sequencer Sequencer
116+
public OldSequencer OldSequencer
115117
{
116118
get => _sequencer;
117119
set
118120
{
119121
if (value != null)
120122
{
121-
if (value.LoadedFileType == Sequencer.FILETYPES.None && !HostProcess)
123+
if (value.LoadedFileType == OldSequencer.FILETYPES.None && !HostProcess)
122124
return;
123125

124126
//Close the input else it will hang
@@ -127,8 +129,8 @@ public Sequencer Sequencer
127129
_startDelayTimer.Enabled = false;
128130
mainSequencer = value;
129131

130-
_sequencer = new Sequencer();
131-
if (value.LoadedFileType == Sequencer.FILETYPES.BmpSong)
132+
_sequencer = new OldSequencer();
133+
if (value.LoadedFileType == OldSequencer.FILETYPES.BmpSong)
132134
{
133135
_sequencer.Sequence = mainSequencer.Sequence;
134136
OctaveShift = 0;
@@ -314,7 +316,7 @@ public void Stop()
314316
}
315317
}
316318

317-
public void Update(Sequencer bmpSeq)
319+
public void Update(OldSequencer bmpSeq)
318320
{
319321
var tn = _trackNumber;
320322

@@ -328,7 +330,7 @@ public void Update(Sequencer bmpSeq)
328330
{
329331
// OctaveNum now holds the track octave and the selected octave together
330332
Console.WriteLine(@"Track #{0}/{1} setOctave: {2} prefOctave: {3}", tn, bmpSeq.MaxTrack, OctaveShift, bmpSeq.GetTrackPreferredOctaveShift(track));
331-
var notes = (from ev in track.Iterator() where ev.MidiMessage.MessageType == Lib.Sanford.Multimedia.Midi.Messages.MessageType.Channel select ev.MidiMessage as ChannelMessage into msg where msg.Command == ChannelCommand.NoteOn let note = msg.Data1 let vel = msg.Data2 where vel > 0 select NoteHelper.ApplyOctaveShift(note, OctaveShift)).ToList();
333+
var notes = (from ev in track.Iterator() where ev.MidiMessage.MessageType == Sequencer.Backend.Sanford.Multimedia.Midi.Messages.MessageType.Channel select ev.MidiMessage as ChannelMessage into msg where msg.Command == ChannelCommand.NoteOn let note = msg.Data1 let vel = msg.Data2 where vel > 0 select NoteHelper.ApplyOctaveShift(note, OctaveShift)).ToList();
332334
ChosenInstrument = bmpSeq.GetTrackPreferredInstrument(track);
333335
}
334336
}

0 commit comments

Comments
 (0)