Skip to content

Commit 5fe32e8

Browse files
authored
Generic Ornamentation Processor (#196)
1 parent 4d3584a commit 5fe32e8

File tree

52 files changed

+1283
-1203
lines changed

Some content is hidden

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

52 files changed

+1283
-1203
lines changed

.editorconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ dotnet_diagnostic.SA1508.severity = none
5252
dotnet_diagnostic.SA1502.severity = none
5353
dotnet_diagnostic.SA1500.severity = none
5454

55+
# MA0051: Method is too long
56+
dotnet_diagnostic.MA0051.severity = none
57+
5558
# require that opening braces be preceded by a space
5659
dotnet_diagnostic.SA1012.severity = none
5760

@@ -64,6 +67,9 @@ dotnet_diagnostic.SA1201.severity = none
6467
# force constructor documentation text
6568
dotnet_diagnostic.SA1642.severity = none
6669

70+
# prevent parameter spanning multiple lines
71+
dotnet_diagnostic.SA1118.severity = none
72+
6773
# force static members to appear before non-static
6874
dotnet_diagnostic.SA1204.severity = none
6975

@@ -88,6 +94,7 @@ dotnet_diagnostic.SA1600.severity = none
8894
indent_style = space
8995
indent_size = 2
9096
tab_size = 2
97+
9198
[*.{cs,vb}]
9299
#### Naming styles ####
93100

src/BaroquenMelody.Library/Extensions/ServiceCollectionExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using BaroquenMelody.Library.Configurations.Services;
33
using BaroquenMelody.Library.Midi;
44
using BaroquenMelody.Library.Midi.Repositories;
5-
using BaroquenMelody.Library.Ornamentation.Engine.Processors;
5+
using BaroquenMelody.Library.Ornamentation.Engine.Processors.Providers;
66
using BaroquenMelody.Library.Ornamentation.Utilities;
77
using Fluxor;
88
using Microsoft.Extensions.DependencyInjection;
@@ -33,5 +33,5 @@ public static IServiceCollection AddBaroquenMelody(this IServiceCollection servi
3333
.AddSingleton<IMidiExampleGenerator, MidiExampleGenerator>()
3434
.AddSingleton<IWeightedRandomBooleanGenerator, WeightedRandomBooleanGenerator>()
3535
.AddSingleton<IMusicalTimeSpanCalculator, MusicalTimeSpanCalculator>()
36-
.AddSingleton<IOrnamentationProcessorFactory, OrnamentationProcessorFactory>();
36+
.AddSingleton<IOrnamentationProcessorConfigurationFactoryProvider, OrnamentationProcessorConfigurationFactoryProvider>();
3737
}

src/BaroquenMelody.Library/Midi/MidiExampleGenerator.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
using BaroquenMelody.Library.Midi.Extensions;
55
using BaroquenMelody.Library.Ornamentation;
66
using BaroquenMelody.Library.Ornamentation.Engine.Processors;
7+
using BaroquenMelody.Library.Ornamentation.Engine.Processors.Providers;
78
using BaroquenMelody.Library.Ornamentation.Enums;
9+
using BaroquenMelody.Library.Ornamentation.Utilities;
810
using Melanchall.DryWetMidi.Common;
911
using Melanchall.DryWetMidi.Composing;
1012
using Melanchall.DryWetMidi.Core;
@@ -14,7 +16,10 @@
1416

1517
namespace BaroquenMelody.Library.Midi;
1618

17-
internal sealed class MidiExampleGenerator(IOrnamentationProcessorFactory ornamentationProcessorFactory) : IMidiExampleGenerator
19+
internal sealed class MidiExampleGenerator(
20+
IMusicalTimeSpanCalculator musicalTimeSpanCalculator,
21+
IOrnamentationProcessorConfigurationFactoryProvider ornamentationProcessorConfigurationFactoryProvider
22+
) : IMidiExampleGenerator
1823
{
1924
private const int DefaultTempo = 120;
2025

@@ -36,14 +41,18 @@ public MidiFile GenerateExampleNoteMidiFile(GeneralMidi2Program midiProgram, Not
3641

3742
public MidiFile GenerateExampleOrnamentationMidiFile(OrnamentationType ornamentationType, CompositionConfiguration compositionConfiguration)
3843
{
39-
var ornamentationProcessor = ornamentationProcessorFactory.Create(ornamentationType, compositionConfiguration, GetInterval(ornamentationType));
44+
var ornamentationConfiguration = compositionConfiguration.AggregateOrnamentationConfiguration.Configurations.First(configuration => configuration.OrnamentationType == ornamentationType);
45+
var ornamentationProcessorConfigurationFactory = ornamentationProcessorConfigurationFactoryProvider.Get(compositionConfiguration);
46+
var processorConfiguration = ornamentationProcessorConfigurationFactory.Create(ornamentationConfiguration).First();
47+
var processor = new OrnamentationProcessor(musicalTimeSpanCalculator, compositionConfiguration, processorConfiguration);
48+
4049
var note = GetNote(ornamentationType, compositionConfiguration);
4150
var beat = new Beat(new BaroquenChord([note]));
4251
var nextNote = GetNextNote(ornamentationType, compositionConfiguration);
4352
var nextBeat = new Beat(new BaroquenChord([nextNote]));
4453
var ornamentationItem = new OrnamentationItem(note.Instrument, [], beat, nextBeat);
4554

46-
ornamentationProcessor.Process(ornamentationItem);
55+
processor.Process(ornamentationItem);
4756

4857
var patternBuilder = new PatternBuilder().ProgramChange(GeneralMidi2Program.AcousticGrandPiano);
4958

@@ -60,13 +69,6 @@ public MidiFile GenerateExampleOrnamentationMidiFile(OrnamentationType ornamenta
6069
return midiFile;
6170
}
6271

63-
private static int GetInterval(OrnamentationType ornamentationType) => ornamentationType switch
64-
{
65-
OrnamentationType.DecorateInterval => -4,
66-
OrnamentationType.Pedal => PedalProcessor.RootPedalInterval,
67-
_ => 0
68-
};
69-
7072
private static BaroquenNote GetNote(OrnamentationType ornamentationType, CompositionConfiguration compositionConfiguration) => ornamentationType switch
7173
{
7274
OrnamentationType.DecorateInterval => new BaroquenNote(Instrument.One, Note.Get(compositionConfiguration.Scale.Supertonic, 4), compositionConfiguration.DefaultNoteTimeSpan),

src/BaroquenMelody.Library/MusicTheory/NoteOnsetCalculator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public BitArray CalculateNoteOnsets(OrnamentationType ornamentationType)
2323
var ornamentationCount = ornamentationType.OrnamentationCount();
2424
var noteOnsetCursor = primaryNoteDuration.DivideBy(_resolution);
2525

26-
for (var ornamentationStep = 1; ornamentationStep <= ornamentationCount; ornamentationStep++)
26+
for (var ornamentationStep = 0; ornamentationStep < ornamentationCount; ornamentationStep++)
2727
{
2828
var ornamentationDuration = musicalTimeSpanCalculator.CalculateOrnamentationTimeSpan(ornamentationType, compositionConfiguration.Meter, ornamentationStep);
2929
var cursorProgressionValue = ornamentationDuration.DivideBy(_resolution);

src/BaroquenMelody.Library/Ornamentation/Cleaning/Engine/Selection/Strategies/CleanTargetOrnamentation.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ internal sealed class CleanTargetOrnamentation : IOrnamentationCleaningSelectorS
1313
/// <param name="note">The primary note to consider for ornamentation cleaning.</param>
1414
/// <param name="otherNote">The secondary note to consider for ornamentation cleaning.</param>
1515
/// <returns>The note to clean, or null if the selector could not determine which note to clean.</returns>
16-
#pragma warning disable MA0051
1716
private static BaroquenNote? SelectInternal(BaroquenNote note, BaroquenNote otherNote) => (note.OrnamentationType, otherNote.OrnamentationType) switch
18-
#pragma warning restore MA0051
1917
{
2018
(OrnamentationType.DecorateInterval, OrnamentationType.DelayedDoublePassingTone) => note,
2119
(OrnamentationType.DecorateInterval, OrnamentationType.DelayedNeighborTone) => otherNote,

0 commit comments

Comments
 (0)