VideoHelp Forum




+ Reply to Thread
Results 1 to 12 of 12
  1. SurroundUpmix - Free Stereo to 5.1 / 7.1 Surround Upmixer (PowerShell)

    Windows 10/11 | Free & offline | No cloud

    Latest version: v3.1 - the scripts are attached to this post, so this is always the current download. The changelogs for each release are further down the thread.

    I tried to create a surround upmix workflow that actually makes sense - one that uses AI stem separation to produce a proper surround mix rather than just spreading the stereo image wider.

    Most upmix tools work by duplicating or phase-shifting the stereo signal. The result sounds okay on paper, but all the instruments end up bleeding into every speaker. This approach is different. It uses Demucs - a free AI tool - to split the audio into its individual components first (bass, drums, vocals, instruments), and then places each one where it belongs in the surround field.

    The result is a genuine multichannel mix where vocals sit in the centre channel, bass and drums fill the front, and ambient and harmonic content spreads to the rear and sides. The subwoofer channel is derived from the real low-frequency content of the full mix.

    The whole thing runs locally on your machine with free tools and produces a 24-bit FLAC file in either 5.1 or 7.1 that you can mux into an MKV or use directly in any media player that supports multichannel audio.

    What it does
    1. Demucs separates your stereo audio into stems: bass, drums, vocals, other (and guitar and piano with the six-stem model)
    2. You point SurroundUpmix at the stems folder
    3. The script processes the stems through a 3-stage phase analysis (using CenterCutCL) to identify centre vs. side content in each stem
    4. Each stem gets placed into the correct speakers based on what it contains
    5. A subwoofer (LFE) channel is built from the low frequencies of the full mix
    6. Everything is combined and saved as a 24-bit FLAC

    Processing a 46-minute episode takes around 10-15 minutes on a modern machine, not counting the separation itself. No cloud, no subscription, no re-encoding of video.

    Two scripts

    SurroundUpmix.ps1 is the main one. You separate the audio yourself, then point it at the stems folder.

    SurroundUpmix-AllInOne.ps1 is optional and does the whole chain on its own: it takes a video file or a whole folder of episodes and handles the audio extraction, the separation, the upmix, the loudness match and the remux, one episode after the other. It needs the Demucs command-line tool on top of the normal requirements.

    What You Need (all free)

    1. Demucs - separates your audio into stems using AI

    Either the GUI version, which is the easier start:
    https://github.com/CarlGao4/Demucs-Gui/releases
    • cuda_mkl version - for NVIDIA GPU (GTX 700 series or newer) or Intel Arc / Intel Xe GPU - much faster
    • cpu version - works on any machine, slower

    In Demucs-GUI: add your file, select model htdemucs_ft, click Start. Output will be a folder with bass.flac, drums.flac, vocals.flac, other.flac.

    Or the command line version, which is what the all-in-one script drives: install Python 3, then pip install demucs.

    2. SoX - Sound eXchange - audio channel processing
    https://sourceforge.net/projects/sox/files/sox/14.4.2/

    Download sox-14.4.2-win32.zip. Take the zip, not the setup exe - nothing needs installing.

    Unzip it, rename the folder it creates to SoX, and put that folder into SurroundUpmix\bin\ so you end up with SurroundUpmix\bin\SoX\sox.exe.

    Copy the whole folder, not just sox.exe. SoX needs the 14 .dll files that sit next to it. On its own it cannot start at all, and Windows gives no useful message when that happens, so it looks like the script is broken when it is only missing those files.

    3. CenterCutCL - phase-based center/side separation (core of the upmix)
    http://www.moitah.net/download/latest/Center_Cut_GUI.zip
    Extract and place CenterCutCL.exe in: SurroundUpmix\bin\CenterCutCL.exe
    (Last updated 2010 but works perfectly on modern Windows. This one really is a single file.)

    4. ffmpeg - needed for loudness matching, muxing and the lossy audio copies
    https://www.gyan.dev/ffmpeg/builds/
    Download ffmpeg-release-full.7z, extract ffmpeg.exe and place in: SurroundUpmix\bin\ffmpeg\ffmpeg.exe

    Folder Structure

    Code:
    SurroundUpmix\
    |
    |-- SurroundUpmix.ps1            <- the main script
    |-- SurroundUpmix-AllInOne.ps1   <- optional, does the whole chain
    |
    +-- bin\
        |-- CenterCutCL.exe          <- a single file
        |-- SoX\                     <- the WHOLE unzipped folder
        |   |-- sox.exe
        |   +-- (14 .dll files - leave them where they are)
        +-- ffmpeg\
            +-- ffmpeg.exe
    The script always looks for its tools in the bin folder next to itself.

    How to Run

    Open PowerShell by right-clicking inside the SurroundUpmix folder and selecting "Open in Terminal".

    Interactive mode - dialogues ask everything, nothing to type:
    Code:
    .\SurroundUpmix.ps1
    Single track:
    Code:
    .\SurroundUpmix.ps1 "D:\Audio\Stems\MySong"
    7.1 output:
    Code:
    .\SurroundUpmix.ps1 "D:\Audio\Stems\MySong" -OutputFormat 7.1
    With a preset and loudness matching (recommended):
    Code:
    .\SurroundUpmix.ps1 "D:\Audio\Stems\MySong" -Preset Anime -LoudnessMatch
    Match loudness to the original file and remux into a copy of it:
    Code:
    .\SurroundUpmix.ps1 "D:\Audio\Stems\MySong" -LoudnessMatch -SourceFile "D:\Audio\MySong.mkv" -Mux
    Batch - process an entire folder of tracks:
    Code:
    .\SurroundUpmix.ps1 "D:\Audio\Stems" -Batch
    The all-in-one, on a whole season:
    Code:
    .\SurroundUpmix-AllInOne.ps1 "D:\Series\Season1" -Preset Anime -AudioCodec aac
    Presets

    A preset sets the crossover frequency, the decorrelation delays and the centre boost together, so you do not have to tune them one by one.
    • Music - crossover at 4000 Hz (air and cymbals to the surrounds), 15/17 ms decorrelation, wide field
    • Movie - crossover at 2500 Hz (effects and ambience to the surrounds), 10/12 ms, +1 dB centre for dialogue clarity, tighter surround image
    • Anime - crossover at 3000 Hz, 12/14 ms, +2 dB centre. Japanese dialogue mixing is very dry and forward, and the music benefits from wider surrounds than Movie
    • PLIIx - an approximation of Dolby Pro Logic IIx Music mode: very wide diffuse surrounds from long decorrelation delays (20/23 ms), 3.5 kHz crossover. Pairs well with 7.1, where the side speakers get the widest content

    Leave the preset off for basic mode. The presets are what turn the frequency split on, so -SurroundBlend only has an effect when one is active.

    Options - main script

    Code:
    -OutputFormat 7.1         Output layout: 5.1 or 7.1 (default 5.1)
    -Preset Anime             Music / Movie / Anime / PLIIx (default: none)
    -SurroundBlend full       Surround level in the frequency-split blend:
                              classic (default) or full - see the note below
    -LoudnessMatch            Match output loudness to the source via EBU R128
    -SourceFile "file.mkv"    Original file used as the loudness reference
    -AudioTrack 1             Which audio track of that file (0 = first)
    -Mux                      Remux the result into a copy of the source MKV
    -MuxOrder original-first  Keep the original audio as the first/default track
    -AudioCodec aac           Also write a lossy copy: flac / aac / ac3 / eac3
                              The FLAC master is always written and kept
    -AudioBitrate 448k        Bitrate for that lossy copy (empty = codec default)
    -OutputRate 48000         Resample the finished file (0 = keep the stems' rate)
    -Batch                    Process every stem subfolder inside the given folder
    -OutputPath "D:\Out"      Where the finished file goes
    -TrackLabel "Name"        Override the output name
    -NormLevel -0.1           Peak normalisation level in dBFS
    -Decorrelate              Legacy: decorrelation with Music-mode values, no preset
    -CleanTemp                Delete any existing temp folder before starting
    -KeepTemp                 Keep the temp files afterwards
    -DebugMode                Print every command the script runs
    
    -UpmixBass 4.0            How to place each stem:
    -UpmixDrums 4.0             4.0 / 5.0 / mono / front / rear
    -UpmixVocals 5.0
    -UpmixOther 5.0
    -UpmixGuitar 4.0          (six-stem model only)
    -UpmixPiano 4.0           (six-stem model only)
    Routing values explained:
    • 4.0 - front left/right + surround left/right, no discrete center
    • 5.0 - same as 4.0 plus a dedicated centre channel (best for vocals)
    • mono - everything in center only
    • front - everything in front left/right only
    • rear - everything in rear/surround only

    About -SurroundBlend: when a preset blends the high band into the surrounds, the surround channel has always been halved in the process, which puts it about 6 dB down. classic keeps that behaviour and is the default, because every preset was voiced against it. full leaves the surround at its own level. It moves the centre-to-surround balance by about 6 dB either way and leaves the front balance alone. Output in full mode gets a _full suffix so you can encode a track both ways and compare.

    Options - all-in-one script

    Code:
    -Model htdemucs_ft        Separation model:
                                htdemucs_ft  best quality, four models in one,
                                             about 4x slower. For anything you keep
                                htdemucs     same network in one pass, ~4x faster,
                                             very close. Good for trying presets
                                htdemucs_6s  six stems, adds guitar and piano.
                                             Experimental, the piano stem bleeds
    -ModelPath "D:\models"    Where the model files are kept
    -Device xpu               cpu / cuda / xpu (Intel Arc); empty = Demucs default
    -Jobs 2                   Parallel separation jobs
    -DemucsExe "..."          Path to demucs if it is not on PATH
    -SeparatedPath "..."      Where the stems are kept
    -NoLoudnessMatch          Loudness matching is ON by default here
    -NoMux                    Muxing is ON by default here
    -MatchSourceRate          Put the output back to the source file's sample rate
    -Redo                     Redo episodes whose output already exists
    -Reseparate               Throw the existing stems away and separate again
    -DeleteStems              Delete the stems after each episode
    It also takes -OutputFormat, -Preset, -SurroundBlend, -AudioCodec, -AudioBitrate, -MuxOrder, -AudioTrack, -OutputPath, -CleanTemp, -KeepTemp and -DebugMode, same as the main script.

    Episodes whose final file already exists are skipped, so a season run can be stopped and continued later.

    Output location

    Code:
    D:\Audio\Stems\MySong\           <- your stems are here
    D:\Audio\Stems\Final_5.1\        <- output goes here automatically
        MySong_5.1.flac
    For 7.1 the folder is called Final_7.1. You can override with -OutputPath.

    A 24-bit FLAC is not small: roughly 650 MB for a 24-minute episode in 5.1, 900 MB in 7.1. That is what -AudioCodec is for. The FLAC master is always written and kept, and the lossy file is an extra encoded from it, so it carries the same loudness correction.

    Troubleshooting

    "Error formatting a string: Index (zero based) must be greater than or equal to zero..."
    This means SoX could not start, almost always because only sox.exe was copied
    into bin\SoX\ without the .dll files that belong with it. Copy the whole
    unzipped folder. Newer versions of the script say this outright instead of
    showing the formatting error.

    "Required binary not found"
    A tool is missing from the bin folder. Check the folder structure shown above.

    "No stems found"
    The folder does not contain bass.flac, drums.flac etc. Make sure the separation finished and you are pointing at the correct subfolder.

    "execution of scripts is disabled"
    Open PowerShell as Administrator and run:
    Code:
    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    The script will not start, or complains about the file being from another computer
    Windows blocks files downloaded from the internet. Right-click the .ps1,
    choose Properties, tick Unblock at the bottom of the General tab, then Apply.

    Output too quiet or too loud
    Use -LoudnessMatch, ideally with -SourceFile pointing at the original.

    Something sounds off
    Run with -DebugMode and post the console output. It prints every command as it runs, plus the [ADAPTIVE] line and the stem energy and surround gain values, which is usually enough to see what happened.

    System Requirements
    • Windows 10 or Windows 11
    • PowerShell 5.1 or newer (already included in Windows 10/11)
    • For GPU acceleration: NVIDIA GTX 700 series or newer, or Intel Arc / Intel Xe

    Quick Start Checklist
    • Download and install Demucs-GUI
    • Run it on your audio file using the htdemucs_ft model
    • Download the SoX zip and put the whole unzipped folder in bin\ as bin\SoX\
    • Download CenterCutCL and place CenterCutCL.exe in bin\
    • Download ffmpeg and place ffmpeg.exe in bin\ffmpeg\
    • Download the two .txt attachments from this post and rename them to .ps1
    • Right-click each .ps1, Properties, tick Unblock, Apply
    • Open PowerShell in that folder and run .\SurroundUpmix.ps1

    Getting the Scripts

    Both scripts are attached to this post and are always the current versions.
    1. Download SurroundUpmix.txt and, if you want it, SurroundUpmix-AllInOne.txt
    2. Rename them to SurroundUpmix.ps1 and SurroundUpmix-AllInOne.ps1
    3. Put them in your SurroundUpmix folder, next to the bin subfolder

    Windows may hide file extensions. If you cannot see the .txt part of the filename:
    1. Open any Explorer window
    2. Click View at the top
    3. Tick File name extensions
    4. Now you can rename the file correctly

    Unblock the files (one time, per downloaded file):

    Windows marks anything downloaded from the internet, and PowerShell refuses to run it.
    1. Right-click the .ps1
    2. Choose Properties
    3. At the bottom of the General tab, tick Unblock
    4. Click Apply, then OK

    If you skip this you get a security warning instead of the script running.

    Before running - allow PowerShell scripts (one time only):
    1. Press the Windows key, type PowerShell
    2. Right-click it and choose Run as Administrator
    3. Run this command:

    Code:
    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    Type Y and press Enter. You only need to do this once on your machine.

    Then to run it:
    1. Open the SurroundUpmix folder in Explorer
    2. Hold Shift and right-click an empty spot in the folder
    3. Choose Open PowerShell window here (or "Open in Terminal")
    4. Type and press Enter:

    Code:
    .\SurroundUpmix.ps1
    A dialogue will open and guide you from there.
    Image Attached Files
    Last edited by dietboby; 3rd Aug 2026 at 19:59. Reason: updated
    Quote Quote  
  2. ===== UPDATE - SurroundUpmix v2.9.8 =====

    This post held the v2.9.8 changelog. I overwrote it by accident while fixing the setup instructions in the first post, and I don't have the original text any more. Sorry about that.

    The v2.9.8 script is still attached below if anyone needs it, but there is no reason to use it: v3.0.0 further down the thread replaces it and fixes a loudness bug that affected every earlier version, including this one.

    Go to the v3.0.0 post for the current release and its changelog.
    Last edited by dietboby; 3rd Aug 2026 at 19:59.
    Quote Quote  
  3. Hey! That's a really interesting project you've got - it worked surprisingly well in my first test (german anime dub)!
    Have you perhaps continued working on this since April and have an improved version that you haven't shared here yet?

    Huge respect from me and thanks a lot for sharing!
    Quote Quote  
  4. ===== UPDATE - SurroundUpmix v3.0.0 =====

    Thanks, and good to hear it worked well on your dub!

    To answer your question: yes, I have kept working on it since the April update -- it just never turned into a post. There was no feedback on the thread after that release, so I had no particular reason to package anything up, and the changes stayed on my own machine while other projects took the time. Your message today was a good reason to finally tidy it all up properly, so thank you for that.

    Since I was going through everything anyway, I set up a proper test rig this time, one that measures the output instead of me just listening to it. That turned up a number of things that needed fixing -- including one genuinely embarrassing one -- so this ended up a much bigger release than I had planned.

    Tested end to end on a real anime episode excerpt (Demucs stems, stereo TV source): 5.1 and 7.1, all presets, batch mode, and the loudness path verified with an independent EBU R128 measurement afterwards.


    --- THE BIG ONE: LOUDNESS MATCHING NEVER ACTUALLY WORKED ---

    -LoudnessMatch measured everything correctly, printed a sensible gain value... and then erased it. The gain was applied and immediately followed by SoX's "gain -n" peak normalisation, which rescales the audio to a fixed peak level REGARDLESS of what came before. So the output loudness was always just "whatever peak normalisation gives you", and the printed correction was cosmetic.

    Measured on a real 4-minute test clip: source -24.2 LUFS, v2.9.8 output -17.4 LUFS. That is 6.8 dB louder than the level it claimed to match.

    v3.0.0 applies a single gain instead, clamped to the true remaining peak headroom so the output still cannot clip. Same clip now: source -24.2 LUFS, output -24.2 LUFS. The console shows the value that is actually applied:

    Code:
    Source : -24.2 LUFS
    Upmix  : -31.7 LUFS
    Gain   : +7.5 dB  (loudness match)
    If the match ever has to be limited by peak headroom you get a clear yellow note telling you by how much.

    The stem-sum reference path (when you do not pass -SourceFile) was re-checked the same way and lands within 0.2 dB of the original file's loudness.


    --- MORE BUG FIXES ---

    - "None" preset (and -Decorrelate without a preset) silently lost the centre channel compensation. A variable was read before it was initialised, PowerShell drops empty arguments to external programs, and SoX treats a bare "gain" as "do nothing" -- three silent failures in a row, so there was no error, the centre was just 2 dB too quiet. The initialisation order is fixed and the centre gain is now always set explicitly.

    - The interactive preset dialog and the command line applied DIFFERENT preset values. The two code paths had drifted apart: the dialog still gave Movie +2 dB and Anime +3 dB centre boost while the command line gave +1/+2 (the +3 was exactly the value that caused clipping and was supposedly removed in 2.9.8). There is now a single preset table used by both paths, so this cannot happen again. Anime is +2 dB everywhere, Movie +1 dB, and the help text finally agrees with the code.

    - Batch mode could put the output folder in the wrong place. With a flat layout (track folders directly inside the folder you select) the output anchor walked one level too far up -- in the worst case all the way to the drive root, because the safety check compared "D:\" against "D:" and never triggered. The output folder is now always inside the folder you selected.

    - Non-English Windows: on systems that use a decimal comma (German, French and so on) the decorrelation delay was written as "0,015" instead of "0.015". SoX does not accept that at all -- it answers with "FAIL delay: usage: {position}" -- so on those machines every preset run broke at the decorrelation step and then threw follow-up errors because the expected file was never written. The peak normalisation level had the same problem. All numbers handed to the external tools now use a dot regardless of the Windows language. So if your Windows is set to German, that one was for you.

    - If a SoX call failed mid-pipeline, the script printed the error and kept going with half-written files, which produced a cascade of confusing follow-up errors. Tool failures now stop the run immediately at the step that actually broke.


    --- PROCESSING QUALITY ---

    - Internal headroom staging. I owe you a correction here: the old "temp file clips are normal and handled by normalisation" message was wrong. Clipped samples are permanent distortion -- normalising afterwards changes the level, not the waveform. Stems are now summed at reduced gain and the whole chain runs 6 dB below source level, so intermediate files simply cannot clip any more (my test runs are completely clip-free now, where 2.9.8 regularly reported temp clips). If you ever see a clip warning in v3.0.0 it is a real problem and worth reporting.

    - Intermediate files now use SoX's native format instead of WAV. Two reasons: WAV dies at 4 GB, which a 24-bit 7.1 intermediate reaches at roughly the one hour mark -- movie-length content silently broke. And the native format stores 32-bit samples, so the intermediate precision went up, not down. (The files CenterCutCL reads stay normal WAV; those are stereo and only hit 4 GB past the 4 hour mark.)

    - The adaptive analysis now measures the reconstructed full mix instead of the vocals stem. Vocals are inherently narrow and dark, so using them to judge the width and brightness of the whole mix biased the numbers toward "boost the centre". The [ADAPTIVE] console line now describes the actual mix, e.g. from my anime test clip:

    Code:
    [ADAPTIVE] Width=0.761 (raw=0.579) | Bright=0.344 | Centre=4.0 dB (0.0) | Surround=-0.6 dB | Decorr=14/16 ms
    - Loudness of the multichannel result is now measured natively (ffmpeg's ebur128 handles 5.1/7.1 with the proper BS.1770 channel weighting). The old detour through a hand-rolled stereo downmix was unnecessary and slightly off.

    - The LFE lowpass is now 24 dB/oct instead of 12, matching the slope of the surround crossover. Less midbass leaking into the sub.

    - In 7.1 mode the side pair (SL/SR) now gets its own decorrelation delays and allpass frequencies. Previously it shared the exact delay signature of the back pair, which partially re-invited the correlation the decorrelation exists to prevent.

    - The stereo width measurement could clip its own probe file on wide, loud material and report inflated width values. Fixed with proper gain staging in the probe.


    --- NEW FEATURES ---

    - Six-stem support. If you separate with htdemucs_6s in Demucs-GUI, the guitar.flac and piano.flac stems are picked up automatically and routed like the others - nothing to configure, they simply show up in the stems list at startup when the files are there. They also count toward the vocal/accompaniment balance analysis.

    - -Mux. After encoding it remuxes the surround track into a copy of your MKV: video, subtitles, chapters and the original audio are stream-copied, nothing is re-encoded. You choose which audio ends up as the first (default) track - the new surround, or the original with the upmix as second track (-MuxOrder original-first). And you usually do not even have to point it at the file: Demucs names the stems folder after the source file, so when that file sits near the stems the script finds it by itself. In the dialog flow the remux and track order questions appear once a source file is in play (answer Yes to loudness matching and take the auto-detected file, or browse for one); on the command line use -Mux, plus -SourceFile if the auto-detection has nothing to find.

    - Optional lossy copy. The 24-bit FLAC is not small - a 24 minute episode is roughly 650 MB in 5.1 and 900 MB in 7.1. So there is now -AudioCodec aac / ac3 / eac3. The FLAC master is ALWAYS written and kept; the lossy version is an extra file encoded from it, so it carries the same loudness correction. With -Mux the small file is what goes into the MKV. Measured on my test clip: 103-110 MB FLAC (depending on settings) vs 15 MB AAC 512k vs 19 MB AC-3 640k. In the menu flow a codec dialog appears right after the 5.1/7.1 question, and it only lets you pick codecs that can really carry the chosen channel count: in 7.1 mode AC-3 and E-AC-3 are greyed out (with a note saying why), because they top out at 5.1 - I checked, and ffmpeg would silently fold the side channels down instead of erroring, which is exactly the kind of surprise nobody wants. The command line falls back to AAC with a warning for the same reason.

    New options:

    Code:
    -UpmixGuitar 4.0    How to place the guitar stem (htdemucs_6s model)
    -UpmixPiano 4.0     How to place the piano stem (htdemucs_6s model)
    -Mux                Remux the finished surround track into a copy of the source
    -MuxOrder original-first   Keep the original audio as the first/default MKV track
    -AudioCodec aac     Write a lossy copy next to the FLAC (aac / ac3 / eac3)
    -AudioBitrate 448k  Bitrate for the lossy copy (defaults: aac 512k, or 768k in 7.1; ac3 640k; eac3 768k)
    - CenterCut stages 2 and 3 each process two independent files, and those two now run in parallel. CC is the slowest part of the chain, so its wall time drops from 5 sequential passes to effectively 3.


    --- NEW: ALL-IN-ONE COMPANION SCRIPT ---

    Demucs also has a command line version, and that makes the whole workflow scriptable. So there is now a second, optional script in the package: SurroundUpmix-AllInOne.ps1. Point it at one video file or at a whole folder of episodes and it does the entire chain on its own, one episode after the other: extract the audio track -> Demucs separation -> upmix -> loudness match against the actual source file -> remux into an MKV copy. No clicking between episodes.

    Code:
    .\SurroundUpmix-AllInOne.ps1 "D:\Series\Season1" -Preset Anime -AudioCodec aac
    - Needs the Demucs CLI on top of the normal tools: install Python 3, then "pip install demucs". Demucs-GUI users lose nothing - the main script is unchanged and this companion is optional.

    - One thing that will look alarming the first time and is not: when a model is used for the first time, Demucs downloads it (about 320 MB for htdemucs_ft, which is four models) and the downloader prints a wall of text -- a note about "unauthenticated requests to the HF Hub", something about symlinks and Developer Mode, and four progress bars. That is just the model files being fetched from the Demucs author's model page. "Unauthenticated" only means the download is anonymous, which is exactly what you want -- no account, no token, nothing of yours is uploaded, and it is mentioned solely because anonymous downloads get a lower rate limit at busy times. Demucs-GUI fetches the very same files, it just hides the console while doing it. You normally only see the messages when a model really has to be fetched; once it is on disk the separation runs from there and they stop. The script prints a short explanation before it happens and switches the symlink warning off.

    - Where the model files go is your choice. On a machine that has none yet the script asks first, instead of quietly pulling a few hundred megabytes: a dialog says what has to be downloaded and how big it is, and offers three places. Next to the script keeps everything in one folder like bin -- easy to find and delete, and you can copy the whole folder to another PC without downloading again. The Windows user folder is shared with Demucs-GUI, so the models are only downloaded once for everything, but they sit on the system drive in a hidden .cache folder. Or pick any folder yourself, for instance on a big data drive. Cancel stops without downloading anything.
    You can change it later as well: the model dialog shows the folder currently in use and has a "Change folder" button beside the model buttons, so it is easy to move things to a different drive afterwards. The folder does not have to exist, it gets created for you, and -ModelPath does the same from the command line. Models already cached from Demucs-GUI or an earlier run are used as they are, so nothing is downloaded twice, and the folder in use is always printed before the separation starts. One honest warning: changing the folder does not move files that are already downloaded -- copy them across yourself, otherwise the next run fetches what it needs again.

    - Run it without parameters and dialogs ask everything: single file or whole folder, which separation model and where its files are kept, 5.1/7.1, audio format, preset.

    - Loudness matching and muxing are ON by default here (that is the point of an all-in-one); disable with -NoLoudnessMatch / -NoMux.

    - Stems are kept in a "separated" folder next to the videos, so re-running with a different preset skips the slow separation. Episodes whose final file already exists are skipped entirely - you can stop a series run overnight and continue later. -Redo forces a redo, -DeleteStems cleans up after each episode.

    - -Model picks the separation model, and the dialog spells out what each one is actually good for:
    htdemucs_ft (default) - the best quality and the one for a version you keep. It is four models in one, so it takes about four times as long, and that cleaner vocal stem is exactly what puts dialogue properly into the centre speaker. This is the one for films, series and dubs.
    htdemucs - the same network in a single pass, roughly four times faster and very close in quality. What I use for trying presets out on a clip, and for long overnight batches.
    htdemucs_6s - six stems, adding guitar and piano on their own. Worth a try on concerts and music-heavy material, though the Demucs authors themselves note the piano stem still bleeds and has artefacts, so treat it as the experimental one.

    - -AudioTrack picks which audio track of the video gets separated and measured, same numbering as the main script.

    - Intel Arc / Xe users: the plain Demucs CLI can use your GPU as well, no Demucs-GUI needed. Install the XPU build of PyTorch first, then pass -Device xpu:

    Code:
    pip install torch torchaudio --index-url https://download.pytorch.org/whl/xpu
    pip install demucs
    .\SurroundUpmix-AllInOne.ps1 "D:\Series\Season1" -Preset Anime -Device xpu
    Measured on an Intel Arc card here: a touch over twice as fast as CPU separation, with identical stems. NVIDIA users just use -Device cuda (or leave it empty, Demucs picks CUDA by itself when available).

    --- WHAT HASN'T CHANGED ---

    The core pipeline is the same: Demucs stems -> CenterCutCL phase cascade -> SoX channel assembly -> ffmpeg loudness measurement -> FLAC output. All command line parameters are backward compatible. Output is still 24-bit FLAC, same file names, same folder logic (except batch mode now anchoring correctly). Temp files have new extensions (.sox), so if you keep temp folders around from old runs, -CleanTemp once is a good idea. Tool requirements are unchanged: same SoX, same CenterCutCL, ffmpeg still optional (needed for -LoudnessMatch, -Mux and the -AudioCodec lossy copies).

    The tuning feedback request from the last update still stands -- if something sounds off, post the three [ADAPTIVE] / stem energy / surround gain lines from the console plus the preset you used, and note that the width/brightness numbers mean something slightly different now that they describe the full mix.


    --- DOWNLOAD ---

    Two attachments below. Rename SurroundUpmix.txt to SurroundUpmix.ps1 and replace your old copy, nothing else changes. The optional SurroundUpmix-AllInOne.txt becomes SurroundUpmix-AllInOne.ps1 and goes into the same folder, next to the main script.

    As always, if you run into anything, enable debug mode (-DebugMode on the command line, or answer Yes to the debug dialogue in the menu) and paste the console output. It prints every SoX, CenterCutCL and ffmpeg command as it runs, so it is usually easy to see where it went wrong.
    Last edited by dietboby; 3rd Aug 2026 at 20:00.
    Quote Quote  
  5. Hey! Thanks a lot for v3.0.0 - I finally got around to running it properly on
    a german anime BD dub and it works really nicely. The loudness fix especially:
    I checked it afterwards with an independent ffmpeg ebur128 measurement and it
    really does match now.

    While testing I ended up going through the script a bit deeper than planned
    and noted down everything that caught my eye - a few things that look like
    bugs, some performance ideas, a couple of DSP questions and two questions
    about the tool choices. I put it all in the attached text file rather than
    flooding the thread with it, with line numbers and measurements so it is easy
    to check.

    Would make me really happy if you take a look at it and tell me what you
    think - no idea whether you agree with all of it.

    Huge respect from me and thanks a lot for sharing!

    SurroundUpmix_v3.0.0_findings_and_questions.txt
    Quote Quote  
  6. Thanks, that's a lot more than I expected anyone to do with it.

    I've read through it once but not properly yet. I don't want to answer from memory, and your setup is different from mine in a few ways, so I'd like to run a few of these here myself first and see what I get. Some of it is also more "why did you do it that way" than anything else, and that deserves a proper answer too.

    It'll take me a bit, though. I've got a couple of other things on at the moment. I'll work through it and come back to you.

    Good to hear it held up on the dub.
    Quote Quote  
  7. I'm on windows 10 22H2 and I had trouble getting this to work and kept getting the following error:

    " X Failed: 1 - Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.."

    The error went away when I copied all the files from the Sox install folder to the directory SurroundUpmix/bin/SoX folder. (Apparently just copying the exe as outlined above wouldn't work because sox.exe needs all those .dll files etc to run.)

    Also, before running the powershell script in powershell, make sure that you right click the file, open its properties, unblock it and then click apply.
    Then run the following command in powershell:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

    And then finally run the powershell script using the following command:

    .\SurroundUpmix.ps1

    Leaving this comment here so anyone who runs into the same problem knows what the issue is and can get it to run properly.
    Happy upmixing everyone!
    Quote Quote  
  8. Originally Posted by Cemzix View Post
    I'm on windows 10 22H2 and I had trouble getting this to work and kept getting the following error:

    " X Failed: 1 - Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.."

    The error went away when I copied all the files from the Sox install folder to the directory SurroundUpmix/bin/SoX folder. (Apparently just copying the exe as outlined above wouldn't work because sox.exe needs all those .dll files etc to run.)

    Also, before running the powershell script in powershell, make sure that you right click the file, open its properties, unblock it and then click apply.
    Then run the following command in powershell:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

    And then finally run the powershell script using the following command:

    .\SurroundUpmix.ps1

    Leaving this comment here so anyone who runs into the same problem knows what the issue is and can get it to run properly.
    Happy upmixing everyone!


    Thanks for this, good info. Sorry you had to dig it out yourself.

    You're right on both. The first post says to put sox.exe into bin\SoX and that's just wrong of me. SoX needs the dll files that sit next to it, so the whole folder has to go in there. I'll fix the post.

    The error is my fault too. The script asks SoX for its version when it starts, and if SoX can't run it prints nothing at all, so the error message itself fell over and you got that formatting mess instead of "SoX won't start". Can reproduce it here now. Next version will just say the tool couldn't start and that a dll is probably missing.

    The unblock tip is worth adding as well, nothing about that in my instructions either.

    Got a few other things in progress so this'll go out with those. Thanks again for writing it up.
    Quote Quote  
  9. Originally Posted by dietboby View Post
    Originally Posted by Cemzix View Post
    I'm on windows 10 22H2 and I had trouble getting this to work and kept getting the following error:

    " X Failed: 1 - Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.."

    The error went away when I copied all the files from the Sox install folder to the directory SurroundUpmix/bin/SoX folder. (Apparently just copying the exe as outlined above wouldn't work because sox.exe needs all those .dll files etc to run.)

    Also, before running the powershell script in powershell, make sure that you right click the file, open its properties, unblock it and then click apply.
    Then run the following command in powershell:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

    And then finally run the powershell script using the following command:

    .\SurroundUpmix.ps1

    Leaving this comment here so anyone who runs into the same problem knows what the issue is and can get it to run properly.
    Happy upmixing everyone!


    Thanks for this, good info. Sorry you had to dig it out yourself.

    You're right on both. The first post says to put sox.exe into bin\SoX and that's just wrong of me. SoX needs the dll files that sit next to it, so the whole folder has to go in there. I'll fix the post.

    The error is my fault too. The script asks SoX for its version when it starts, and if SoX can't run it prints nothing at all, so the error message itself fell over and you got that formatting mess instead of "SoX won't start". Can reproduce it here now. Next version will just say the tool couldn't start and that a dll is probably missing.

    The unblock tip is worth adding as well, nothing about that in my instructions either.

    Got a few other things in progress so this'll go out with those. Thanks again for writing it up.
    No problem at all!
    Happy to help.

    And thank you so much for this amazing tool, I've been looking into methods on how to create 5.1 tracks from stereo and came across a couple of old posts on doom9 using adobe audition, audacity, avisynth etc but they were all out of date and then I finally came across this one which turned out to be the easiest one!

    Cheers!
    Last edited by Cemzix; 2nd Aug 2026 at 07:31.
    Quote Quote  
  10. One more thing.. instead of having to install sox and then copying all the files to the SoX folder.. an easier method would be to just download sox and extract the sox setup exe using 7zip and then just rename the extracted folder to SoX and place it in the SurroundUpmix/bin folder.

    That's easier than the other way.

    Also, a question, will mono to surround support ever exist or be supported? or will this solely stay stereo to surround?
    Last edited by Cemzix; 2nd Aug 2026 at 06:55. Reason: Added a question
    Quote Quote  
  11. Good tip, and you can skip a step further. There's a plain zip on the same
    download page as the installer, sox-14.4.2-win32.zip, so there's no need to
    install anything or unpack the setup with 7zip either. Unzip it, rename the
    folder to SoX, drop it in bin. That's the version I've put in the first post.

    On Mono: I went and tested it rather than guess, and the answer is no, not
    with the way this works now.

    The whole chain runs off the difference between the left and right channels.
    That difference is what says which sounds are in the middle and which are out
    at the sides. A mono file has no difference at all, so there's nothing to go
    on. I fed it a mono file and every bit of the sound went to the centre speaker
    with both surrounds silent.

    Demucs itself is fine with mono; that part surprised me. It splits by
    instrument rather than by channel, so it happily takes a mono file and hands
    back four stems, and they even come out as two-channel files that aren't quite
    identical left to right. But that little bit of difference is the model being
    imperfect, not real width. I took a track, made a mono copy, and separated
    both. On the real stereo one, the off-centre content sits about 8 dB below the
    middle, which is plenty to work with. On the mono copy it's 45 to 58 dB below,
    which is nothing. Building surrounds out of that would just be amplifying the
    separator's own noise.

    It won't crash, at least. The script notices a mono stem and makes a stereo
    copy so everything keeps running. You'd just get your mono in the centre and
    near enough silence everywhere else.

    None of that makes mono to surround impossible; it just needs a different
    approach. Since the stems themselves are fine, you'd place each one where you
    want it and create the width with delays and phase shifts, instead of trying
    to work out where things already are. That's a separate chain rather than a
    switch on this one, so I'm not promising anything, but it's worth a look at
    some point.
    Quote Quote  
  12. Right, I've been through the whole list. Thanks again for it. Most of it was
    correct, and a few of them I'd never have found on my own setup, because I'm
    testing on 44.1 kHz material with an English Windows and the stock SoX.

    v3.1 is attached in post #1. Below is what I did with each point, including
    two where I think your fix doesn't quite work, and the ones I'm deliberately
    leaving alone.

    --- FIXED, and thanks, these were real ---

    A1 Batch counting a failed track as a success. Confirmed exactly as you
    described. It now checks the exit code and that the expected output file
    is actually there before counting it.

    A2 CenterCutCL without -o. Worse than it looks, actually. I reproduced it and
    it doesn't hang; it dies:
    at System.Console.ReadKey(Boolean intercept)
    at JDP.Program.PromptOverwrite(String path)
    -o goes in on both call paths now.

    A3 The timing regex on comma locales. Fixed on both call paths, ([\d.,]+)
    plus a comma-to-dot swap. Same class as the outgoing numbers in v3, like
    you said.

    A4 The clip counter. Mine was worse than your example, because the progress
    line read Clip:3.37M and the old regex reported "3". See below; I didn't
    do it quite the way you suggested.

    A5 Case-sensitive path compare. Resolved paths, OrdinalIgnoreCase.

    A6 The argument string in the pair runner. Fixed, but not the way you
    proposed, see below.

    A7 Stale stems. This is the one that annoyed me most, because it's silent and
    it cost you a run. The stems block now prints the file it actually picked:
    bass -> 4.0 [bass.flac]
    and if both a .flac and a .wav are sitting there it says so outright.

    A8 SoX_ng. Looks for sox.exe, then sox_ng.exe, then whatever is on PATH.

    F1 No preset dialogue in interactive batch mode. Added, asked once, applies
    to the whole run. You're right that batch is where it matters most.

    B1 Multichannel sources. It checks the track before extracting now and warns:
    WARNING: audio track 0 is not stereo:
    Stream #0:1: Audio: aac (LC), 48000 Hz, 5.1, fltp
    Tested on a real 5.1 episode here.

    B2 16-bit extraction. It's 24 now. You were right that it stood out.

    B4 -Redo not re-separating. There's a -Reseparate switch that throws the
    stems away too, and the help says what -Redo does and doesn't do.

    C1 The analysis probes. Good catch; they're single pass now, nothing written
    to disk. I checked the numbers match: 0.158114 either way.

    C2 Measure-PeakDb. Reads "Pk lev dB" from stats now. Same value, -10.00 both
    ways on my test file.

    C5 The temp name ordering. Sorted in both places.

    D5 The 44.1 kHz output. This is the one I'm most glad you found, because it's
    completely silent and I'd never have noticed, since my own material is
    44.1 to start with, so it never came up. There's an -OutputRate now, and
    the all-in-one has -MatchSourceRate which reads the rate off the source
    and puts it back. If you pass a -SourceFile whose rate differs it tells
    you, even if you don't ask for the resample.

    --- TWO I DID DIFFERENTLY ---

    A4, the clip line. You suggested parsing
    sox WARN sox: `out.wav' output clipped 209300 samples
    because it has the exact count and the filename. Trouble is that line doesn't
    always turn up. When I forced clipping with a big gain, I got:
    WARN gain: gain clipped 1800000 samples
    WARN dither: dither clipped 1574739 samples
    and no output-clipped line at all, because the clipping happened in the effects
    and not in the writer. So it collects every WARN clip line, reports the largest
    count, and takes the filename from whichever line actually names one, only
    falling back to the argument list if none of them does. It names the stage too,
    which turned out more useful than I expected:
    *** CLIP WARNING: 1800000 samples clipped (gain, dither) writing out.wav ***

    A6, the argument list. ProcessStartInfo.ArgumentList would be the clean fix, but
    it doesn't exist in .NET Framework, so it isn't there in Windows PowerShell 5.1,
    which is the minimum the script targets. Checked on 5.1:
    ProcessStartInfo.ArgumentList available: False
    So it builds the string properly instead. A backslash runs before the closing
    quote gets doubled; embedded quotes get escaped. Ugly, but it's what there is.

    --- D1, THE FREQUENCY SPLIT ---

    This is the interesting one, and I want to be straight about it.

    Your arithmetic is right. Measured here on my own stems, the surround channel
    comes out 6.25 dB below what it was before the blend, which lines up with the
    6.6 dB you got.

    To answer the question: inherited, not intended. I went and checked what the old
    code actually did, because I wanted to know whether I'd broken it in v3 when I
    made the coefficients explicit. I hadn't:

    remix 1,2 -> RMS 0.177617
    remix 1v0.5,2v0.5 -> RMS 0.177617
    remix 1v1,2v1 -> RMS 0.355234
    the single file -> RMS 0.177617

    So an unlabelled remix spec really does average; every released version has
    done it, and writing the coefficients out in v3 changed nothing. It goes back
    to when I first added the frequency split, and I never noticed because I tuned
    the presets by ear with the halving already in place.

    Which is why I haven't simply flipped it. All four presets were voiced against
    that balance, so your patch doesn't only correct an error; it changes how
    every preset sounds, with more surround and less centre-lock. That might well
    be better, and your "more centre-locked and duller" does match what I hear
    once I go looking for it. But it's a change of character rather than a bug
    fix, and it isn't really mine alone to make on everyone's behalf.

    So it's a switch in v3.1: -SurroundBlend classic|full

    classic is the default and is exactly what you already have. full is your
    version. The surround stays at its own level, and the high band goes on top at
    the level it had before, so only the surrounds move. Measured here on
    synthetic stems, it comes out +5.0 dB on the surround pair, with the front
    balance untouched: FL and FC both shift by the same 1.0 dB, which is only the
    normalisation reacting to louder surrounds.

    In full mode the output gets a _full suffix, so you can encode a track both
    ways and have the two sitting in the same folder to switch between. That was
    the whole point of making it a switch instead of a decision.

    One thing worth knowing if you do compare: I had to put the blend into the
    temp signature. The intermediates differ between the two modes, so a -KeepTemp
    re-run would otherwise have reused the first set and handed you two identical
    files, which would have been an excellent way to conclude that the switch does
    nothing.

    I did put music through it before writing this, because I had assumed the
    halving would matter least there. It turns out that is wrong, and in an
    interesting way.

    Five tracks, Music preset, only the blend differing, measuring the gap between
    the centre and the surround pair:

    your anime dub (your numbers) +16.5 dB centre over surrounds
    five music tracks (average) -2.1 dB - the surrounds are already louder

    The switch moves that gap by 6.0 dB on every single track, dead consistent,
    and never touches the front-to-centre balance. But the starting points are
    opposite. On dialogue, the surrounds sit far below the centre and classic
    pushes them further down, which is exactly the centre-locked and duller thing
    you described. On music, the surrounds are already on top, and full takes them
    to about 8 dB above the centre, which on a couple of the wider tracks was more
    than I wanted.

    So it does not matter less on music; it matters the other way round. My guess
    now is that full is the better setting for dialogue-led material and classic
    may well be right for music, which is a better argument for a switch than the
    one I started with. That is a guess from two data sets though, so I would
    rather hear what other people get than declare it.

    --- THE QUESTIONS ---

    D3, the LFE. Deliberate, but not as considered as you're giving me credit for.
    The mains are full range because the script can't know what your speakers are
    set to. High-passing them would mean making a bass management decision on
    behalf of your AVR, and for anyone running large fronts that just takes bass
    away. So the doubling is real, and I'll own it: with speakers set to small,
    the AVR sends the mains' bass to the sub as well, and it lands on top of the
    LFE. 90 Hz was picked to sit under the usual 80 Hz crossover without climbing
    into the 120 Hz LFE limit, so it's a compromise rather than a standard. An
    optional high-pass is fair; I just don't want it as the default.

    D4, the 7.1 pairs. You're right, and it's a real limitation. Both pairs come
    off the stage-1 sides, so 7.1 divides the surround content instead of adding
    to it, which is what your measurement shows. Feeding the back pair from the
    stage-2 sides is a good idea, and I want to try it, but it changes the 7.1
    sound completely, so it goes in the same bucket as D1: try it, listen, then
    decide.

    E1, why CenterCutCL and not ffmpeg. Honest answer: the three-stage cascade is
    doing something the single filter doesn't, and I built the cascade around CC
    before I knew ffmpeg had a surround filter at all. I haven't done a proper
    comparison, so I can't claim CC sounds better on any evidence I'd defend. It's
    on the list, and losing a dependency would be nice.

    Two corrections to the premise though, because I went and looked. CC is a .NET
    assembly with its names intact, so it takes about a minute to see what is in
    there, and it is not single-threaded. It has a task scheduler that reads
    Environment.ProcessorCount and starts background threads. It is also not the
    slowest part of the chain. In my own console output, the three CC stages on a
    four-minute clip come in at 0.24, 0.53 and 0.67 seconds, while every SoX pass
    walks the whole file. The bottleneck here is file I/O, not CC. I paired stages
    2 and 3 in v3 on the same assumption you made, and the honest answer is that
    it bought less than I thought.

    For anyone who wants to look: 8192 sample window, 4x overlap, raised cosine on
    input and output, output window squared, Ooura's FFT. That also explains the
    minimum length I ran into above, since it needs enough samples to fill its
    buffers.

    Thanks for the pointer to -b and -a; I didn't know about either. -a could fold
    the front compensation into the CC call and save a SoX pass per channel, and
    -b is the more interesting one because it bears straight on the LFE question
    in D3.

    E2, SoX_ng. Didn't know the fork existed. Thanks for testing the feature list
    properly; that saved me a job. v3.1 finds sox_ng.exe, and since your seven
    runs came out clean, I'm happy to call it supported. I'm leaving stock SoX as
    the documented default for now, only because that's what people already have.

    --- G1, THE TEST RIG ---

    You were right about this one, and it turned into the most useful part of the
    release. It builds its own stems with sox synth, runs the chain, and checks
    the result: channel counts, that mono/front/rear routing lands where it
    should, that the LFE really is low-passed, sample rates in and out, awkward
    paths, the parameter validation, the temp reuse rules. 55 checks, a couple of
    minutes, no real audio needed.

    It found two things immediately that neither of us had hit, both hard crashes:

    - Mono stems. Four mono stems merge to four channels, but the recon step asks
    for channels 5 to 8, so SoX exits 2. Any non-stereo stem gets normalised to
    stereo first now.

    - Very short input. CenterCutCL throws a null reference below roughly 65536
    samples. I binary searched it: 65535 works, 60000 fails, same boundary at
    48 kHz, so it's a sample count and not a duration. Short material gets
    padded for the analysis and trimmed back afterwards.

    G2, the adaptive constants table. Agreed, but not in this one. If I do it, I'd
    rather do it properly, with the values readable from a file so tuning feedback
    can come back as a config block, and that's a bit more than a rename.

    --- ONE I SKIPPED ---

    C3, running the two stem groups in parallel. Clearly right, I just didn't want
    to untangle the shared state in the group loop in the same release as
    everything else.

    --- I, THE DEMUCS RESIDUAL ---

    This was new to me, and it's the tip I got the most out of. Measured on my own
    material: the four stems sum to within 0.14 dB of the original with the
    residual 27.0 dB down, so the same effect as your 22.8 dB on different
    material.

    I haven't built anything around it yet, since it's a Demucs-GUI setting rather
    than something the script controls, but it does change how I think about Step
    0. If the reconstruction can be made exact, then the stem sum really is the
    source, and the loudness reference and the LFE both stop being approximations.
    Worth a mention in the first post at least. Thanks for working it out.

    --- THE CRASH CEMZIX REPORTED ---

    Separate from your list, and thanks to Cemzix for writing it up properly
    rather than giving up on it, this turned up while I was working through your
    findings:

    X Failed: 1 - Error formatting a string: Index (zero based) must be greater
    than or equal to zero and less than the size of the argument list.

    That message is nonsense, and it's my fault twice over. The script asks SoX
    for its version at startup. If SoX can't start, it prints nothing at all, and
    the line that formats that nothing into a tidy "SoX: version" fell over
    instead. So the one thing anyone needed to know, that the tool never ran at
    all, was the one thing it could not say.

    The reason it couldn't start is worse. The first post says to put sox.exe into
    bin\SoX. That's wrong and always has been. SoX needs the DLL files that ship
    beside it, and without them Windows kills the process before a single byte of
    output appears. Anyone following the instructions exactly would hit this,
    which is what happened.

    Both are fixed in v3.1. Failing to start is now caught for all three tools and
    says so plainly, and if Windows gives the missing-library code it says that
    too. The first post is being corrected: take the whole folder, not the exe. In
    fact there's a plain zip on the download page, so the installer isn't needed
    at all.

    Worth saying because it's a general lesson: every other check in there reports
    the real problem, and this one only broke because the failure happened in the
    code that reports failures. I've added a test that copies the exe somewhere
    without its libraries and asserts the output names the cause and doesn't
    mention formatting.

    --- ONE MORE THING ---

    The interrupted-run case came up while I was in there, and the all-in-one had
    a nasty version of it: kill a run during the encode and the half-written file
    got accepted as finished on the next one. A truncated FLAC still reports a
    plausible length, so checking the file itself doesn't help. There's a small
    run log next to the output now, and an episode only counts as done if it's
    listed there with the same settings and the size still matches. Handy as a
    record of what each file was made with, too.

    Attachments in Post #1:
    SurroundUpmix.txt (v3.1) and SurroundUpmix-AllInOne.txt.
    Same rename to .ps1 as before.

    If you hit anything else, you know where to find me.
    Last edited by dietboby; 3rd Aug 2026 at 20:55.
    Quote Quote  



Similar Threads

Visit our sponsor! Try DVDFab and backup Blu-rays!