Gondwana Game Engine Development (master) - 2.6.1
Gondwana is a cross-platform 2.5D game and rendering engine written in C#/.NET 8. It provides fine-grained control over rendering, timing, and scene composition, with built-in support for parallax, z-ordering, pixel overhang, collision detection, and particle effects. Gondwana targets desktop and web platforms using SkiaSharp for graphics and pluggable audio backends for desktop and browser targets.
Loading...
Searching...
No Matches
MidiFileReader.cs
1using System.Reflection;
3using MeltySynth;
4using Microsoft.Extensions.Logging;
5using NAudio.Wave;
6
7namespace Gondwana.Audio.Midi;
8
23public static class MidiFileReader
24{
25 private static readonly Lazy<SoundFont> _soundFont = new(() =>
26 {
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.");
30
31 return new SoundFont(stream);
32 });
33
47 public static SoundFont SoundFont => _soundFont.Value;
48
65 internal static void RegisterDefaultReaders()
66 {
67 NAudioReaderRegistry.Register(".mid", CreateReader);
68 NAudioReaderRegistry.Register(".midi", CreateReader);
69 Engine.Logger.LogInformation("Registered Gondwana.Audio.Midi readers with the NAudio backend.");
70 }
71
107 public static WaveStream CreateReader(Stream stream)
108 {
109 using var buffer = new MemoryStream();
110 stream.CopyTo(buffer);
111 buffer.Position = 0;
112
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);
117
118 var provider = new SynthesizerSampleProvider(sequencer, synth, midi, loop: false);
119 return new WaveProviderToWaveStream(provider.ToWaveProvider(), midi.Length.TotalSeconds, provider.Seek);
120 }
121}