Skip to content

Commit

Permalink
Added support for VRWDW midi audio.
Browse files Browse the repository at this point in the history
  • Loading branch information
MeltyPlayer committed Jan 26, 2025
1 parent 19ee0f4 commit 5439bc0
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 15 deletions.
2 changes: 2 additions & 0 deletions FinModelUtility/Fin/Fin/Fin.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Compile Remove="src\audio\io\importers\midi\MidiAudioImporter.cs" />
<Compile Remove="src\model\io\exporters\assimp\AssimpConverter.cs" />
<Compile Remove="src\model\io\exporters\assimp\AssimpDirectExporter.cs" />
<Compile Remove="src\model\io\exporters\assimp\AssimpMeshBuilder.cs" />
Expand All @@ -18,6 +19,7 @@
<PackageReference Include="CommunityToolkit.HighPerformance" Version="8.4.0" />
<PackageReference Include="Crayon" Version="2.0.69" />
<PackageReference Include="FastBitmapLib" Version="2.1.0" />
<PackageReference Include="MeltySynth" Version="2.4.1" />
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="9.0.0" />
<PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="4.12.0">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using fin.io;

namespace fin.audio.io.importers.midi;

public class MidiAudioFileBundle(
IReadOnlyTreeFile midiFile,
IReadOnlyTreeFile soundFontFile) : IAudioFileBundle {
public string? GameName { get; init; }
public IReadOnlyTreeFile MainFile => this.MidiFile;

public IReadOnlyTreeFile MidiFile { get; } = midiFile;
public IReadOnlyTreeFile SoundFontFile { get; } = soundFontFile;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
using System;

using fin.util.sets;

using SimpleSynth.Parameters;
using SimpleSynth.Parsing;
using SimpleSynth.Providers;
using SimpleSynth.Synths;

namespace fin.audio.io.importers.midi;

public class MidiAudioImporter : IAudioImporter<MidiAudioFileBundle> {
public ILoadedAudioBuffer<short>[] ImportAudio(
IAudioManager<short> audioManager,
MidiAudioFileBundle audioFileBundle) {
var midiFile = audioFileBundle.MidiFile;
using var ms = midiFile.OpenRead();
var midi = new MidiInterpretation(ms, new DefaultNoteSegmentProvider());

// Create a new synthesizer with default providers.
var synth = new BasicSynth(midi, new DefaultAdsrEnvelopeProvider(AdsrParameters.Short), new DefaultBalanceProvider());
var signal = synth.GetSignal();

var mutableBuffer = audioManager.CreateLoadedAudioBuffer(
audioFileBundle,
midiFile.AsFileSet());

mutableBuffer.Frequency = signal.SamplingRate;

{
var samples = signal.Samples;
var sampleCount = samples.Length;

var channelCount = 1;
var floatCount = channelCount * sampleCount;
var floatPcm = new float[floatCount];

var channels = new short[channelCount][];
for (var c = 0; c < channelCount; ++c) {
channels[c] = new short[sampleCount];
}

for (var i = 0; i < sampleCount; ++i) {
for (var c = 0; c < channelCount; ++c) {
var floatSample = floatPcm[channelCount * i + c];

var floatMin = -1f;
var floatMax = 1f;

var normalizedFloatSample =
(MathF.Max(floatMin, Math.Min(floatSample, floatMax)) -
floatMin) / (floatMax - floatMin);

float shortMin = short.MinValue;
float shortMax = short.MaxValue;

var shortSample = (short) (shortMin +
normalizedFloatSample *
(shortMax - shortMin));

channels[c][i] = shortSample;
}
}

mutableBuffer.SetPcm(channels);
}

return [mutableBuffer];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public ILoadedAudioBuffer<short>[] ImportAudio(

for (var i = 0; i < sampleCount; ++i) {
for (var c = 0; c < channelCount; ++c) {
var floatSample = floatPcm[2 * i + c];
var floatSample = floatPcm[channelCount * i + c];

var floatMin = -1f;
var floatMax = 1f;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using fin.audio;
using fin.audio.io;
using fin.audio.io.importers;
using fin.audio.io.importers.midi;
using fin.audio.io.importers.ogg;

using ssm.api;
Expand All @@ -18,6 +19,10 @@ AstAudioFileBundle astAudioFileBundle
=> new AstAudioReader().ImportAudio(
audioManager,
astAudioFileBundle),
MidiAudioFileBundle midiAudioFileBundle
=> new MidiAudioImporter().ImportAudio(

Check failure on line 23 in FinModelUtility/UniversalAssetTool/UniversalAssetTool/src/api/GlobalAudioLoader.cs

View workflow job for this annotation

GitHub Actions / build

The type or namespace name 'MidiAudioImporter' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 23 in FinModelUtility/UniversalAssetTool/UniversalAssetTool/src/api/GlobalAudioLoader.cs

View workflow job for this annotation

GitHub Actions / build

The type or namespace name 'MidiAudioImporter' could not be found (are you missing a using directive or an assembly reference?)
audioManager,
midiAudioFileBundle),
OggAudioFileBundle oggAudioFileBundle
=> new OggAudioImporter().ImportAudio(
audioManager,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using fin.io.bundles;
using fin.audio.io.importers.midi;
using fin.io.bundles;
using fin.util.progress;

using uni.platforms;
Expand All @@ -14,18 +15,24 @@ public class VrwdwFileBundleGatherer : IAnnotatedFileBundleGatherer {
public void GatherFileBundles(
IFileBundleOrganizer organizer,
IMutablePercentageProgress mutablePercentageProgress) {
if (!DirectoryConstants.ROMS_DIRECTORY.TryToGetExistingSubdir(
Path.Join("vrwdw", ExtractorUtil.PREREQS),
out var vrwdwDir)) {
return;
}

var fileHierarchy = ExtractorUtil.GetFileHierarchy("vrwdw", vrwdwDir);

foreach (var wrlFile in fileHierarchy.Root.GetFilesWithFileType(".wrl")) {
organizer.Add(new VrmlModelFileBundle {
WrlFile = wrlFile,
}.Annotate(wrlFile));
}
if (!DirectoryConstants.ROMS_DIRECTORY.TryToGetExistingSubdir(
Path.Join("vrwdw", ExtractorUtil.PREREQS),
out var vrwdwDir)) {
return;
}

var fileHierarchy = ExtractorUtil.GetFileHierarchy("vrwdw", vrwdwDir);

foreach (var wrlFile in fileHierarchy.Root.GetFilesWithFileType(".wrl")) {
organizer.Add(new VrmlModelFileBundle {
WrlFile = wrlFile,
}.Annotate(wrlFile));
}

var soundFontFile = fileHierarchy.Root.AssertGetExistingFile("windows.sf2");
foreach (var midFile in fileHierarchy.Root.GetFilesWithFileType(".mid")) {
organizer.Add(
new MidiAudioFileBundle(midFile, soundFontFile).Annotate(midFile));
}
}
}
Binary file added cli/roms/vrwdw/prereqs/windows.sf2
Binary file not shown.

0 comments on commit 5439bc0

Please sign in to comment.