MyGo 云音乐
用 Go 与 MyGo 写成的第三方网易云音乐桌面客户端。原生界面,没有 WebView;边下边播,无损与 Hi-Res,逐字歌词与「律动」,刘海播放器。
Translation pending
Your music moves behind you. Your game audio stays exactly as it is. Free and open source.
MediaRust · ShellGitHub @pixityyOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Music behind you, a podcast on your left, Discord on your right. Your game audio stays exactly as it is.
Sidestage takes the sound of the apps you pick (your music player, a podcast or video, voice chat) and plays each one in 3D at its own spot around your head: behind you, beside you, over your shoulder, in the next room or far away. Your game's audio is never captured or processed, so footsteps and gunshots keep their exact position and timing. Your sources can turn down while the game is loud or while your friends talk, and voice chat is never turned down for the game.
Headphones required. The effect is binaural and does not work on speakers.
| System | Status |
|---|---|
| Windows 11 | Tested on real hardware. Several sources at once: tested live with test tones (capture, hiding, adding and removing sources while others play, crash recovery, ducking). One source (version 0.1): Spotify spatialized while playing Valorant, with the original hidden and the game untouched. Several real apps at once have not been tried yet. |
| Windows 10, version 2004 or newer | May work, untested. Sidestage warns that capturing one app is not officially supported before build 20348. |
| macOS 14.2 or newer | Builds and passes its tests in CI on macOS. Not yet tried with real audio on a Mac. |
| Linux with PipeWire or PulseAudio | Builds and passes its tests in CI on Linux. Not yet tried with real audio on a Linux desktop. |
The screenshots use the app's demo mode (sidestage --demo), which shows simulated apps.
Sidestage remembers your sources and starts whenever one of their apps plays; the others join as soon as they play. Each source has an on/off switch (off: that app plays normally and keeps its settings) and a × that removes it, with Undo. The power switch at the top turns Sidestage off, and every app plays normally again.
Music presets:
| Preset | run name | Sounds like |
|---|---|---|
| Behind you (default) | behind | Close behind your head, in a small room |
| Next room | next-room | Muffled, like a party through the wall |
| Far away | far | Distant and airy, barely there |
| Above | above | Overhead and slightly behind |
| Desk speaker | desk | A little speaker on your desk, front-right |
| Lounge | lounge | Wide and relaxed behind you, for casual games (no ducking for the game) |
Voice presets are close, clear and levelled, in a little room so voices sound outside your head:
| Preset | run name | Sounds like |
|---|---|---|
| Voice chat left | voice-left | Your squad close on your left |
| Voice chat right | voice-right | Your squad close on your right |
| Over your shoulder | shoulder | A teammate leaning in behind your right shoulder |
| Radio comms | radio | Tight walkie-talkie comms, front-left |
| Podcast left | podcast-left | A podcast or video playing on your left, in the room |
The first four mark the source as voice chat. Podcast left is spoken word, not voice chat: it ducks gently, like music.
Sidestage captures only the apps you added, hides their normal output so you don't hear them twice, renders each one at its own position and plays the mix to your headphones. A final limiter on the mix keeps several loud sources from clipping.
| Capture | Hiding the originals | If Sidestage is killed | |
|---|---|---|---|
| Windows | WASAPI process loopback, one capture per source | Turns each source's app down to -120 dB and boosts the captured copy back up by the same amount. The Volume mixer shows every source's app at 0 while Sidestage runs. That is expected. | A helper process puts every app's volume back right away. |
| macOS | Core Audio process taps, one per source | macOS mutes each app while Sidestage taps it. The first start asks for audio-capture permission. | macOS un-mutes the apps by itself. No helper is needed. |
| Linux | A private, silent output per source with a random name (PulseAudio null sink) | The app's streams are moved onto its output. | A watchdog process moves the apps back and removes the outputs. |
Every start also checks for anything an earlier run left behind and puts it back.
sidestage restore does the same from the command line.
sidestage open the window
sidestage --demo open the window with simulated apps (captures and plays nothing)
sidestage list list apps that have audio right now, with their keys
sidestage outputs list output devices and their IDs
sidestage presets list the presets and their command-line names
sidestage run <app>[=<preset>] [<app>[=<preset>] ...] [--preset <name>] [--seconds <n>]
spatialize up to 8 apps without the window, until Ctrl+C
sidestage restore undo audio changes left behind by a killed Sidestage
sidestage --help | --version
For example, music behind you, a podcast on your left and Discord on your right:
sidestage run spotify "pocket casts=podcast-left" discord
<app> is any part of an app's name or key from sidestage list, for example spotify. Quote
names with spaces. An exact name wins over a prefix or a part of the name. If several apps match
equally well and exactly one of them is playing, that one is used; otherwise run asks you to be
more specific. Each app can only be given once.=<preset> picks that app's preset (the run names in the tables above), and --preset picks
one for the apps without their own. Otherwise an app uses the sound settings the window saved
for it, or the preset the window would give it (Discord gets Voice chat right). run always
uses the window's saved output device, hiding method, ducking measurement and "Never duck"
list.run starts as soon as one of the apps has audio and adds the others when they start playing.
It stops on Ctrl+C or when --seconds runs out.run or
restore says so and leaves your audio alone.RUST_LOG=debug for detailed
logs, or SIDESTAGE_DEMO=1 to try the commands with simulated apps.run appears below it.sidestage restore. In the window, Diagnostics > Stop and restore original audio does the
same. On Windows, an app that is closed gets its volume back the next time it plays while
Sidestage or its helper is running.run refuses an app that is given twice. Two copies of the same program
count as one app, and only one of them is captured.| Settings | Logs, instance lock and crash journals | |
|---|---|---|
| Windows | %APPDATA%\Sidestage\config\config.json | %LOCALAPPDATA%\Sidestage\data\ |
| macOS | ~/Library/Application Support/Sidestage/config.json | ~/Library/Application Support/Sidestage/ |
| Linux | ~/.config/sidestage/config.json | ~/.local/state/sidestage/ |
On Linux, $XDG_CONFIG_HOME and $XDG_STATE_HOME are used when they are set. A version 0.1
settings file is upgraded on the first start: its app becomes your first source, and the original
is kept as config.json.v1. A settings file Sidestage cannot fully read is kept as
config.json.broken, and one from a newer Sidestage as config.json.newer. The window writes
sidestage.log and keeps the previous run's log as sidestage.prev.log. Command-line commands log
to the terminal only. On Windows, the crash helper writes windows-guardian.log in the same folder.
The Diagnostics window shows the settings and log paths. SIDESTAGE_CONFIG_DIR and
SIDESTAGE_STATE_DIR move the settings folder and the state folder, for example for a test run
beside your own Sidestage.
You need Rust 1.95 or newer.
cargo run --release # build and start the app
cargo test --workspace # run the tests
Windows: the default MSVC toolchain needs the Visual Studio C++ build tools. This is what CI
builds; .cargo/config.toml links the C runtime statically, so the exe runs without the Visual
C++ Redistributable. For the GNU route, use the x86_64-pc-windows-gnullvm toolchain with
llvm-mingw as the linker, for example in
~/.cargo/config.toml:
[target.x86_64-pc-windows-gnullvm]
linker = "C:/path/to/llvm-mingw/bin/x86_64-w64-mingw32-clang.exe"
# Optional: link the C runtime statically so the exe needs no llvm-mingw DLLs.
rustflags = ["-C", "target-feature=+crt-static"]
Then run rustup toolchain install stable-x86_64-pc-windows-gnullvm and, in the checkout,
rustup override set stable-x86_64-pc-windows-gnullvm. The plain x86_64-pc-windows-gnu
toolchain cannot link the current windows crates without a working GNU dlltool.
macOS: install the Xcode command line tools. cargo run works directly: the build script
embeds the Info.plist (macOS only asks for capture permission when it is there) and sets the
binary's deployment target to 14.2. Export MACOSX_DEPLOYMENT_TARGET=14.2 to apply that floor to
every crate, as CI and the bundle script do. packaging/macos/make-app.sh (or
make-app.sh --universal) builds target/macos-app/Sidestage.app and a zip. See
packaging/macos/README.md for signing and permissions.
Linux: you need Rust and a C toolchain for linking. No PulseAudio or PipeWire development
packages are needed: Sidestage speaks the PulseAudio protocol itself, which PipeWire also provides
through pipewire-pulse. The window's system libraries (Wayland or X11, xkbcommon, OpenGL) are
loaded at run time, so CI builds without installing any -dev packages. If your build complains
anyway, install libxkbcommon-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libgl1-mesa-dev. To run it you need PulseAudio, or PipeWire with pipewire-pulse.
docs/DESIGN.md has the full list and how each OS backend works.
| Path | What |
|---|---|
crates/sidestage | The egui app and the command line |
crates/sidestage-dsp | Binaural renderer: spherical-head model, room, voice leveller, ducking, limiter, and the master bus for the mix. Pure Rust. |
crates/sidestage-platform | Per-OS capture, hiding and output for several apps behind one trait, plus the Windows live-test tools in examples/ |
packaging/macos | Info.plist, entitlements and the Sidestage.app bundle script |
docs/DESIGN.md | Architecture, the reasoning behind each OS strategy, and testing |
The head model follows C. P. Brown and R. O. Duda, "A structural model for binaural sound synthesis", IEEE Trans. Speech and Audio Processing 6(5), 1998. The rear and elevation cues use Blauert's directional bands.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Sidestage by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Release binaries also contain third-party Rust crates under their own permissive licenses (MIT, Apache-2.0, BSD, Zlib, ISC, BSL-1.0, MPL-2.0 and similar) and egui's built-in fonts, which are under the SIL Open Font License 1.1 and the Ubuntu Font Licence 1.0.