RE-MOCT v1.0.0-rc1-win

Release candidate available. A prebuilt Windows x64 binary is published as v1.0.0-RC1 on the GitHub Releases page — download the zip, extract it, and run remoct.exe. All required DLLs are bundled; no separate MSYS2 install is needed to run it. Requires Windows 10 or later (x64). Building from source is still fully supported — see Build.
C++20
ncurses
miniaudio
TagLib
Windows / MSYS2
CD Track 02 [F:] [REPEAT ALL] [SHUFFLE] [CD] [New Miserable Experience (1992)] [EQ] RE-MOCT v1.0.0-rc1-win
Playlist [12]  46m 8s
Gin Blossoms – Hey Jealousy 3:56
Gin Blossoms – Mrs. Rita 4:25
Gin Blossoms – Until I Fall Away 3:52
[#############################---------]  0:28 / 3:56  1411 kbps  44.1 kHz  stereo  CD  vol:15
SPC:pause  n/p:next/prev  [/]:seek  -/+:vol  Tab:focus  Enter:play  ?:help  ^Q:quit

Introduction

RE-MOCT (Music On Console Terminal) is a keyboard-driven terminal music player for Windows, inspired by MOC. It runs in a standard console window with a two-pane layout — file browser on the left, playlist on the right — and is designed for continuous, uninterrupted playback with minimal resource overhead.

Key design goals: zero UI stutter (all heavy I/O off the main thread), no silent data races (every shared state is explicitly protected), and no volatile CD or hardware paths leaking into persistent config.

Supported Formats

.mp3 .flac .ogg .opus .wav .aiff .aif .m4a .wma .mp4

Playlist files: .m3u .m3u8 .pls .xspf

Interface Layout

┌─ RE-MOCT ─────────────────────────────────────────────────────────────────┐
│  ► Artist - Title        [REPEAT ALL] [SHUFFLE] [CD] Album (Year)  v1.0  │
├─ File Browser ───────────────────┬─ Playlist ─────────────────────────────┤
│  [Drives]                        │  Playlist [14]  39m 40s                │
│  [Recent]                        │  ► Green Day - Burnout           2:08  │
│  [FAVs]                          │    Green Day - Having a Blast    2:44  │
│  [Bookmarks]                     │    Green Day - Chump             3:59  │
│  C:\                             │    ...                                 │
│  D:\                             │                                        │
│  ▶ G:\  (CD)                     │  Right pane cycles between:            │
│    CD Track 01                   │  Playlist · EQ · Visualizer            │
│    CD Track 02                   │  Track Info · Lyrics · Queue           │
│    CD Track 03                   │  Help · About · Bookmarks              │
├─ Progress ───────────────────────┴────────────────────────────────────────┤
│  ──────────────────────────────────────────  0:00 / 0:00  1411 kbps  CD  │
├─ Commands ────────────────────────────────────────────────────────────────┤
│  SPC:pause  n/p:next/prev  [/]:seek  -/+:vol  Tab:focus  Enter:play      │
└───────────────────────────────────────────────────────────────────────────┘

Tab switches keyboard focus between the file browser and playlist. The active pane is highlighted. The right pane content changes based on context — press e for EQ, v for visualizer, i for track info, L for lyrics, Q for queue, ? for help, A for about.

Playback

Gapless Playback

Next track is pre-decoded into a second buffer while the current track is still playing. Transition is seamless with no gap between tracks.

Crossfade

Configurable crossfade duration. End of current track fades out while next track fades in simultaneously. Queue overrides crossfade correctly.

ReplayGain

Reads ReplayGain tags from files and applies volume normalization. Toggle with f. Not available during CD playback.

Speed Control

Playback speed adjustable from 50% to 200% in 2% steps via { / }. Pitch-corrected.

Balance

Left/right stereo balance via < / >. Reset to centre with `.

BPM Detection

Automatic BPM analysis runs in a background thread on track load. Displayed in track info pane once complete.

Sleep Timer

Cycle through 15 / 30 / 45 / 60 / 90 minute auto-stop timers with Z. Timer shown in title bar.

Repeat & Shuffle

Repeat cycles: off → one → all via r. Shuffle randomises playback order via z. Both persist across sessions.

Playlist

The playlist is the right-hand pane in focus. Tracks are deduped on add. The playlist is restored on next launch (CD tracks are excluded — they are volatile).

a
Add highlighted file or directory (recursive) to playlist
d
Delete selected track from playlist
u / D
Move selected track up / down
c
Clear entire playlist
S
Save playlist (M3U / M3U8 / PLS / XSPF)
l
Load / append playlist file — autoplays if stopped
o
Cycle sort: none / title / artist / duration / filename
Loading a playlist via l or the goto bar appends to any existing tracks and jumps the cursor to the first newly added entry. If nothing is playing, it autoplays immediately.

File Browser

The left pane. Navigate with arrow keys or j/k. The browser always shows three virtual entries at the top:

[Drives]
Lists all mounted drives including optical drives
[Recent]
Up to 50 recently played tracks, most recent first
[FAVs]
Curated favourites list — see Favourites section

Navigation

g
Goto bar — type a path with Tab autocomplete. Accepts directories and playlist files.
Tab
Autocomplete in goto bar — cycles through matches
H
Toggle hidden files
O
Cycle browser sort: name / date modified / size
b
Bookmark current directory
B
Show bookmarks popup (Enter to jump, x to delete)
The goto bar accepts drive roots (G:\), directories, and playlist files (.m3u, .pls, etc.). Pressing Enter on a playlist file in the goto bar loads and autoplays it.

Play Queue

The queue overrides normal playlist order. Queue entries play before the next playlist track, in FIFO order. When the queue empties, playback returns to the playlist from where it left off.

q
Add highlighted track (from playlist or browser) to play queue
Q
Show / hide queue pane
Adding a track to the queue immediately clears any preloaded next-track decoder so the crossfade correctly targets the queue entry rather than the next playlist track. CD tracks can be queued. On disc eject, any queued CD tracks for that drive are automatically purged.

Favourites (FAVs)

A curated list of up to 50 starred audio files. Stored in config as fav= entries. FIFO overflow: adding a 51st entry drops the oldest. CD tracks and directories are never stored.

*
Toggle favourite on highlighted track (playlist or browser). Toast confirms.
Enter
Inside [FAVs]: add file to playlist, play it, navigate browser to its directory
Del
Inside [FAVs]: remove entry from favourites list
Dead path filtering: when displaying the FAVs list, RE-MOCT checks fs::exists() for each entry. Files on unplugged USB drives or deleted paths are shown in a dim/greyed colour and silently skipped on Enter — no crash, no error dialog.

CD Audio (CDDA)

RE-MOCT supports Red Book CD audio via Win32 IOCTL on Windows. Inserting a CD and selecting its drive from [Drives] loads the track list directly into the playlist.

Hardware reading

Raw sector reads via IOCTL_CDROM_READ_RAW. Audio decoded in a dedicated reader thread into a lock-free ring buffer. Audio callback consumes from ring — no mutex in realtime path.

Eject detection

Non-blocking media check polls every ~2 seconds. On eject, all CD entries are removed from playlist and queue, MusicBrainz state is cleared, and playback stops cleanly.

MusicBrainz lookup

Ctrl+R fetches metadata via DiscID (SHA-1 + custom Base64 from TOC). Ctrl+F opens a manual search modal — enter artist and album, get a ranked results list from MusicBrainz, with Discogs as a fallback when MusicBrainz has no match (Discogs results are marked [D]). Both sources load full track titles. Rate-limited to 1 req/sec.

Volatile isolation

CD paths (G:CD Track 01) never enter recent tracks, play stats, config playlists, or bookmarks. All state is purged on eject or application exit.

Note: CD tracks cannot be tag-edited (the e tag editor silently ignores them). The info pane omits "Times Played" for CD tracks. Crossfade and EQ both work in CD mode.
Enhanced CD / CD Extra: discs that carry a data session after the audio tracks are detected automatically. The data session is never listed as a bogus audio track, and when ripping, the final audio track's true end is found so the data portion is not read into the output.

MusicBrainz (Ctrl+R)

When a disc is loaded, Ctrl+R computes the MusicBrainz DiscID from the TOC and queries the database. On success, track titles and artist update in the playlist immediately and the title bar shows album name and year. If the disc is not found, an error message appears in the command bar for ~5 seconds.

Manual Search (Ctrl+F)

Ctrl+F opens a search modal at any time — no disc required. Type an artist and album name, press Enter or Tab to search. RE-MOCT queries MusicBrainz first; if no results are found it falls back to Discogs automatically. Navigate results with Up/Down, press Enter to load metadata. Press Escape to close without changes.

Discogs results are marked [D] in the list. Selecting one fetches that release's full detail from Discogs, so track titles load directly — the same as a MusicBrainz pick. Non-standard track positions (e.g. A1, 1-2) are renumbered to line up with the disc, and section/heading rows that carry no audio are skipped.

CD Ripping

Press Ctrl+Y in CD mode to open the rip dialog. RE-MOCT rips to FLAC level 5 and MP3 V0 VBR simultaneously. Output goes to %USERPROFILE%\Music\re-moct\Artist - Album (Year)\. Multi-disc releases nest each disc in its own Disc N subfolder under the album folder; single-disc albums write straight into the album folder.

AccurateRip mode

Verifies each track against the AccurateRip database using CRCv2. Applies drive read offset correction and auto-detects disc pressing offset via frame-450 CRC scan. On mismatch, a second pass is triggered after a cache-flush seek.

CUETools mode

Computes a disc-wide CRC32 (CTDB) that is offset-immune — no drive offset table required. Falls back gracefully when AccurateRip has no entry for the disc.

Local mode

Best-effort offline rip with no network verification. Useful for obscure pressings not in any database. ReplayGain and cover art still applied.

Output & tagging

FLAC and MP3 files are tagged with artist, album, title, year, track number, ReplayGain (track + album), AccurateRip result, and embedded cover art. Art comes from the Cover Art Archive first; if that has nothing, RE-MOCT falls back to iTunes, then Deezer, matched by artist and album. No API keys are required.

AccurateRip technical detail: CRCs are computed disc-absolutely — mul_by=1 starts at the 150-sector lead-in before each track's nominal LBA. The 150-sector preamble is physically read from disc because it contains real data (not silence) that affects the checksum. Drive offset is applied as a combined sample shift split into whole-sector LBA advance plus sub-sector skip.
Rip mode selection (after Ctrl+Y)
A
AccurateRip — network CRC verify + drive offset correction
C
CUETools — disc-wide CRC32, offset-immune, no network required
Y
Local — best-effort rip, no verification
N / Esc
Cancel — return to CD mode without ripping

Equalizer

10-band parametric EQ using peaking biquad filters. Works for both file playback and CD audio. Press e to open the EQ pane.

← / →
Select band
↑ / ↓
Adjust gain (±1 dB)
1 – 5
Load preset: Flat / Bass Boost / Vocal / Treble / V-Shape
0
Reset all bands to flat
e
Close EQ pane

Bands: 60 Hz · 170 Hz · 310 Hz · 600 Hz · 1 kHz · 3 kHz · 6 kHz · 12 kHz · 14 kHz · 16 kHz

Visualizer

Press v to open the visualizer in the right pane. Renders a frequency spectrum using block characters. Updates in real time from the audio callback output.

Lyrics

Press L to toggle the lyrics pane. RE-MOCT looks for a .lrc file with the same base name as the playing track (e.g. track.mp3track.lrc). LRC files with timestamps scroll automatically as the track plays.

Tag Editor

Press i to open the track info pane, then e to enter edit mode. Five fields are editable: Title, Artist, Album, Genre, and Year. Works for MP3, FLAC, and all TagLib-supported formats.

↑ / ↓ or j / k
Move between fields
Type
Append characters to field
Backspace
Delete last character
Enter
Save tags and exit edit mode
Esc
Cancel — discard all changes
Tag editing is blocked while a track is playing — stop playback first with s. CD tracks cannot be edited. Files with no existing tags show empty editable fields.

Key Bindings

Playback
Space
Pause / Resume
s
Stop
n / p
Next / Previous track
[ / ]
Seek −5 / +5 seconds
- / +
Volume down / up (5% steps)
m
Mute / unmute
< / >
Balance left / right
`
Reset balance to centre
{ / }
Speed down / up (2% steps, 50–200%)
f
Toggle ReplayGain normalization
*
Star / unstar highlighted track (toggle favourite)
Modes
r
Cycle repeat: off / one / all
z
Toggle shuffle
Z
Sleep timer: cycle 15 / 30 / 45 / 60 / 90 min / off
t
Toggle elapsed / remaining time display
w
Toggle clock in title bar
!
Toggle Windows toast notifications
Navigation
Tab
Switch focus: file browser ↔ playlist
j / k or ↑↓
Move cursor up / down
Enter
Play selected / enter directory
← (Left arrow)
Go to parent directory
g
Goto directory or playlist file (Tab to autocomplete)
Playlist
a
Add selection to playlist (recursive for directories)
d
Delete selected track
u / D
Move track up / down
c
Clear entire playlist
S
Save playlist as M3U / M3U8 / PLS / XSPF
l
Load / append playlist file
o
Cycle sort: none / title / artist / duration / filename
q
Add to play queue
Q
Show / hide queue pane
Browser
O
Cycle browser sort: name / modified / size
H
Toggle hidden files
b
Bookmark current directory
B
Show bookmarks (Enter: jump, x: delete)
Del
Remove entry (in FAVs pane)
Views
e
10-band EQ pane (or tag edit when in track info)
v
Visualizer
L
Lyrics pane (requires .lrc file)
i
Track info pane
A
About screen
X
Audio output device picker
?
Help screen (j/k to scroll)
CD Audio
Ctrl+R
Fetch CD metadata from MusicBrainz via DiscID (CD mode only)
Ctrl+F
Manual MusicBrainz / Discogs search (artist + album text search)
Ctrl+Y
Open rip dialog (A=AccurateRip C=CUETools Y=Local N=cancel)
Global
Ctrl+L
Force redraw / fix layout after resize
Ctrl+Q
Quit RE-MOCT

Configuration

Config is saved automatically on exit to %APPDATA%\remoct\remoct.conf (or the current directory fallback). It is a plain text key=value file.

vol=15
repeat=all
shuffle=0
crossfade=3.0
eq_enabled=1
eq_gains=0,2,1,0,0,-1,0,1,0,0
last_dir=C:\Users\Music
track=C:\Music\Albums\Foo Fighters\track01.flac
track=C:\Music\Albums\Foo Fighters\track02.flac
recent=C:\Music\track.mp3
fav=C:\Music\favourites\song.flac
bookmark=C:\Music\Albums
stat=C:\Music\track.mp3|7|1718123456

Notable entries

track=
Playlist entry (CD tracks never saved)
recent=
Recent track path (max 50, CD paths excluded)
fav=
Favourite track path (max 50, FIFO, CD paths excluded)
stat=
Play count and last-played timestamp per file
bookmark=
Bookmarked directory paths (no CD drive roots)

Build

Most users can skip this section and grab the prebuilt v1.0.0-RC1 zip from the Releases page. To build from source, you need MSYS2 with the UCRT64 toolchain. Dependencies installed via pacman:

pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-cmake
pacman -S mingw-w64-ucrt-x86_64-ninja
pacman -S mingw-w64-ucrt-x86_64-ncurses
pacman -S mingw-w64-ucrt-x86_64-taglib
pacman -S mingw-w64-ucrt-x86_64-flac
pacman -S mingw-w64-ucrt-x86_64-lame
pacman -S mingw-w64-ucrt-x86_64-libebur128

Place json.hpp (nlohmann/json v3.11.3) in lib/. Then:

cd /e/code/digi
rm -rf build && mkdir build && cd build
cmake .. -G Ninja
ninja

Binary output: build/bin/remoct.exe. For distribution, place its runtime DLLs from C:\msys64\ucrt64\bin\ alongside the executable: libgcc_s_seh-1, libstdc++-6, libwinpthread-1, libFLAC, libogg-0, libmp3lame-0, libebur128, libncursesw6, libtag-2, and zlib1. (Running ntldd -R build/bin/remoct.exe in the UCRT64 shell lists exactly what the binary links.)


RE-MOCT v1.0.0-rc1-win  ·  C++20  ·  Built with ncurses, miniaudio, TagLib  ·  github.com/RadMageIRL/re-moct