Skip to content

Add LE1 ISACT bank authoring workflow - #476

Open
AudemusN7 wants to merge 3 commits into
ME3Tweaks:Betafrom
AudemusN7:codex/isact-mainline
Open

Add LE1 ISACT bank authoring workflow#476
AudemusN7 wants to merge 3 commits into
ME3Tweaks:Betafrom
AudemusN7:codex/isact-mainline

Conversation

@AudemusN7

Copy link
Copy Markdown
Contributor

Add LE1 ISACT bank authoring and replacement tools to Soundplorer.

Features

  • Build new ICB/ISB banks from WAV files.
  • Rebuild existing banks by appending audio without recompressing existing audio.
  • Support BioConversation, Codex, Soundset, and Music streaming workflow.
  • Will automatically fix WAV files to signed 16-bit PCM if needed.
  • Apply LE1 audio localisation suffixes.
  • Create/update BioSoundNodeWaveStreamingData exports automatically.
  • Optionally copy the completed ISB into a DLC mod Content folder.
  • Replace individual audio files in an ISB and optionally refresh the matching package metadata.

Currently limitations are:

  • BankBuilder.exe is still required as an external tool as it performs final compression
  • Appending content to an existing looping music Sound Queue isn't currently supported.

Documentation is linked in the new windows, will be working on writing it while this PR is reviewed.

@Mgamerz Mgamerz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is clearly vibe coded.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file doesn't have any comments indicating what it does.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as other files - no comments. Makes files extremely difficult to maintain when there is no context to why anything was implemented the way it was

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No comments on new code are present

localizationSuffix ??= "";
if (localizationSuffix.Length > 0 && !localizationSuffix.StartsWith('_'))
localizationSuffix = $"_{localizationSuffix}";
if (localizationSuffix is not ("" or "_DE" or "_FR" or "_IT" or "_PLPC" or "_RA"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should use the MELocalization system and its support for looking up language suffixes rather than hardcoding values

if (package.FindExport($"{pcPackage.InstancedFullPath}.{localizedBankName}") is not null)
throw new InvalidOperationException(
$"A streaming-data export named '{localizedBankName}' already exists. Select it for updating instead.");
ExportEntry streamingData = package.CreateExport(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably need to check flags match bioware's such as localized as audio will likely have something like it.

ushort BlockAlign,
byte[] PCMData);

private static readonly IReadOnlyDictionary<string, string> SoundsetEventNames =

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be documented what this is and where it is derived from.

if (wavPaths.Count == 0)
throw new InvalidDataException($"No WAV files were found in: {wavFolderPath}");
if (wavPaths.Count > ushort.MaxValue)
throw new InvalidDataException("An ISACT sample bank cannot contain more than 65,535 addressable samples.");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The final bank size also cannot be more than 2GiB. The game does not use 64bit pointers when reading file data offsets.

AuthoringMode authoringMode = AuthoringMode.Conversation,
bool createLoopingMusicQueue = false)
{
if (!OperatingSystem.IsWindows())

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is pointless, we aren't ever going to support this on other platforms - LEC is designed only for running on Windows, and this check would still return Windows on WINE.

authoringMode).ConfigureAwait(false);

ISACTBankPair existing;
using (var icbStream = File.OpenRead(existingIcbPath))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could use some comments as this is method does a lot of stuff

}

// Compiles and replaces one ISB sample.
public static async Task<SampleReplacementResult> ReplaceFinalBankSampleFromWave(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs inline comments

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No comments at all for hundreds of lines

@AudemusN7
AudemusN7 requested a review from Mgamerz August 11, 2026 18:48
@AudemusN7

Copy link
Copy Markdown
Contributor Author

Bullied the unpaid intern some more to address the issues. Let me know if the comments are sufficient. Also addressed the MELocalization (including excluding ES/JA), the 2 GiB limit, OS check and the export flags.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants