1using System.Reflection;
4using Microsoft.Extensions.Logging;
23public static class MidiFileReader
25 private static readonly Lazy<SoundFont> _soundFont =
new(() =>
27 var assembly = Assembly.GetExecutingAssembly();
28 using var stream = assembly.GetManifestResourceStream(
"Gondwana.Audio.Midi.TimGM6mb.sf2")
29 ??
throw new InvalidOperationException(
"Embedded SoundFont 'TimGM6mb.sf2' not found.");
31 return new SoundFont(stream);
47 public static SoundFont SoundFont => _soundFont.Value;
65 internal static void RegisterDefaultReaders()
67 NAudioReaderRegistry.Register(
".mid", CreateReader);
68 NAudioReaderRegistry.Register(
".midi", CreateReader);
69 Engine.Logger.LogInformation(
"Registered Gondwana.Audio.Midi readers with the NAudio backend.");
107 public static WaveStream CreateReader(Stream stream)
109 using var buffer =
new MemoryStream();
110 stream.CopyTo(buffer);
113 var synth =
new Synthesizer(SoundFont, 44100);
114 var midi =
new MidiFile(buffer);
115 var sequencer =
new MidiFileSequencer(synth);
116 sequencer.Play(midi, loop:
false);
118 var provider =
new SynthesizerSampleProvider(sequencer, synth, midi, loop:
false);
119 return new WaveProviderToWaveStream(provider.ToWaveProvider(), midi.Length.TotalSeconds, provider.Seek);