RE-MOCTv1.6.2 Features Modes Install Documentation Themes AccurateRIP DB Notes iHeart Field Notes GitHub

RE-MOCT v1.6.2

music on console terminal — player · CD ripper · radio & podcasts

C++20
PDCursesMod / ncursesw
miniaudio
TagLib
Windows + Linux
Plugin ABI
CD Track 02 [F:] [REPEAT ALL] [SHUFFLE] [CD] [New Miserable Experience (1992)] [EQ] RE-MOCT v1.6.2
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

A keyboard-driven terminal music player, CD ripper, internet-radio and podcast client for Windows and Linux, inspired by MOC. Two-pane layout, no mouse, no stutter. All heavy I/O stays off the main thread, every shared state is explicitly protected, and no volatile CD or hardware path ever leaks into persistent config.

Download v1.6.2 Read the docs Source on GitHub

Windows (MSYS2 UCRT64) · Linux (Debian Trixie) · MIT-style build from source

1.6.2 tells you what your soundcard is doing to your music. The rate shown while a track plays has always been the rate of the file, and never said anything about what reached your speakers. If your output runs at a different rate, something converts the audio first — and nothing said so. Now the status line shows 44.1 kHz -> 48. The answer is often not the one you would guess: on the Windows machine this was developed on every output runs at 48 kHz, so every CD rip had been quietly converted for years while a 48 kHz Opus file went through untouched. On the Linux machine the same library gives the opposite answer. It is a fact about your output device, not your collection.

1.6.1 showed names in their own alphabet, and asked which disc you have. Japanese, Chinese, Korean, Greek and Cyrillic used to be replaced with ?, one per character; they now render as written, and accented Latin keeps its accents. A CD that matches several releases, or a set where two discs share a track count, is no longer decided silently — RE-MOCT asks, and says so when it had to guess. The rip screen shows the cover art before it writes anything.

1.6.0 found the song before the first song. Some CDs hide a track in the pregap, ahead of track 1 — audio the drive will read but that no track listing mentions. RE-MOCT now detects it from the table of contents, shows it above track 1, plays it, and rips it as its own file. Ctrl+R names it from MusicBrainz.

If you ripped CDs with RE-MOCT before 1.5.0, those rips are two seconds short and want re-ripping. Reads landed 150 sectors past where each track begins, so every track is missing its opening two seconds and carries the head of the next one on the end. Fixed in 1.5.0; the audio that was never read cannot be recovered from the files, so there is no tool to correct them in place and none is planned.

Two Faces, One Binary

Classic mode is a faithful MOC homage. Ctrl+T is the remix. That toggle is the whole thesis.

Default

Classic mode

Minimal, monochrome, exactly the console player you remember. Toggle to Awesome with Ctrl+T. Nothing moves that doesn't have to.

Ctrl + T

Awesome mode

A comet progress bar, a sub-cell block visualizer, breathing animations, and 18 named truecolor palettes cycled with F7 / F8. The 256-color visuals shine on a Linux terminal.

DOS Chiba Arrakis Mauveine Niflheim Nyarlathotep Zero Cool Tiamat LCARS Mustafar Tux Synergy Tortuga Firelink Tyrian Lothlorien Camelot Matrix

What It Does

See the resampling

Your output device has a rate of its own, and if it differs from the track something converts the audio on the way out. The status line now says so: 44.1 kHz -> 48. Nothing about the sound changed — what changed is that you can see it. It shows whether or not you turn anything on, because it is true either way. A blank means the rates match, not that nothing was touched.

Bit-perfect playback

bit_perfect=1 in remoct.conf, off by default, lossless files only. RE-MOCT takes exclusive control of the output and hands it your samples untouched — and checks rather than assumes. An audio system will grant exclusive access and then convert anyway, so RE-MOCT compares what the device is actually running against what it asked for and hands it back if they differ. = appears only when the output really is untouched.

Choose the cover

The rip screen renders the cover art it is about to use, before anything is written. P opens everything the Cover Art Archive holds for that release — often dozens of images on a box set, including each disc’s own artwork and booklet pages — with a preview beside the list. F5 changes the release without leaving the screen, for when the cover tells you the release itself is wrong.

Streams that say when they die

A stream that lost its connection used to show [BUFFERING] forever, whether it was about to recover or had given up ten minutes earlier. Now one that cannot recover stops and says why. Short drops go the other way: buffered audio plays out while the connection returns, so a brief outage is often inaudible. Recovery no longer replays seconds you already heard, and a recording running when a stream dies is finalized rather than left open.

Every alphabet

水田直志 is 水田直志, not ????. Japanese, Chinese, Korean, Greek and Cyrillic render as written, and accented Latin keeps its accents — Müller, not Muller. Double-width characters get the two columns they need, so rows still line up. The same text goes out to Last.fm and ListenBrainz, and the tag editor no longer flattens it on save.

Which release, and which disc

A CD can match several releases, and a set can have two discs with the same number of tracks. Ctrl+R asks instead of choosing silently, showing what disc number each release would give you before you pick. When two discs of a set tie, it lists the first track of each so you can tell them apart. F5 reopens the list if you change your mind.

It says when it guessed

A disc RE-MOCT could not identify confidently is marked on screen, recorded in the rip log and in disc.json, and is not scrobbled at all. A guess can be shown; it should not become a permanent record. Ripped files now carry a disc number in their tags too, rather than only in the folder name.

Choose the cover

The rip screen renders the cover art it is about to use, so you see it before anything is written. P opens everything the Cover Art Archive holds for that release — often dozens of images on a box set, including each disc’s own artwork and booklet. F5 changes the release without leaving the screen.

Hidden tracks

A disc with audio hidden in the pregap gets a row above track 1 and an +1 HTOA marker in the playlist header — the disc’s own track count stays what the disc says. Enter plays it like any CD track, and it scrobbles and counts as a play. Mark it with u to rip it as its own file; a whole-disc rip never sweeps it up. Ctrl+R reads its title from MusicBrainz, Ctrl+F from Discogs. Detection is from the table of contents, so it is instant on insert with no read required.

Library

A [Library] section listing every artist in your music folder, however the folders are arranged — artists, albums, tracks. The directory browser is unchanged and still where everything starts; this sits beside it for when you know the artist and not the folder. First open reads your tags and shows its progress; after that it opens instantly and only re-reads files that changed. F12 rescans, Esc cancels a scan without touching the index you already had.

Search everything you own

Press | and the list narrows as you type — across every track you have, not the folder in front of you. Matches title, artist, album, album artist, genre and filename, so an untagged rip is still findable by name. Accents work the way you would want: bjork finds BJÖRK, dvorak finds Dvořák.

Rip only what you want

Mark tracks with u and RE-MOCT rips just those; U clears the marks. Mark nothing and ripping behaves exactly as it always has. A partial rip leaves out what cannot honestly be written for part of a disc — no cue sheet, no album volume level — and says which and why in its log.

Genres & play stats

g lists your genres, folding Post Punk and Post-Punk into one row without splitting Hip-Hop into two. % shows most-played with counts, again for everything you have never played, again to go back.

Gapless & crossfade

Next track pre-decodes into a second buffer while the current one plays. Seamless transitions, configurable crossfade, and the queue overrides crossfade correctly.

AccurateRip CD ripping

Rips to any mix of FLAC, MP3, WAV, Opus, WavPack, and M4A from a single verified disc read, with per-track AccurateRip v1/v2 verification, drive offset correction, and a CUETools DB cross-check.

CD drive control

Eject from the keyboard with Shift+E, refresh the drive list for hot-plugged drives with F12, and stop a CD without unloading the disc.

Convert

Press x to convert a file, a folder, a marked set, or a whole playlist (the current pane or the tracks a playlist file references) to FLAC, MP3, WAV, Opus, WavPack, or M4A. Tags and embedded cover art carry over; conversion runs in the background and never overwrites the source.

Stream recording

Record a radio stream with Ctrl+E, cut and tagged per track from the station's own metadata. Record to Opus, MP3, M4A, or Copy mode (the exact broadcast bytes, no re-encode), with ad-aware routing and cover art on each cut.

OS media controls

RE-MOCT appears in the system media surface — SMTC on Windows, MPRIS on Linux — so the media keys, lock screen, and desktop widgets drive playback and show the now-playing card.

Playlist search

Press \ to search a long playlist by artist or title and jump straight to a match, or pick from a list when several match. Same key shifted, | searches your whole collection instead of the list in front of you.

Internet radio

ICY, HLS, and iHeart with live now-playing metadata. Station search via radio-browser.info. Shipped as a loadable plugin.

Podcasts

A [Podcasts] section alongside radio and books. Subscribe by pasting a feed URL or searching the Podcast Index, browse episodes with per-episode state, stream or download for offline, and resume where you left off. Episode chapters — embedded or published by the feed — show with ;.

Equalizer

Multi-band EQ with presets, adjusted live from the right pane. Press e.

Visualizer

Real-FFT spectrum analyzer rendered as sub-cell blocks straight into the terminal grid — accurate across the full range, reflecting each track's actual mastering. Press v.

Lyrics & tags

Synced .lrc lyrics scroll with playback. Built-in tag editor writes through TagLib, and reports honestly when a file can't be written.

Cover art

Embedded art or fetched from Cover Art Archive, iTunes, and Deezer. Rendered in-terminal as truecolor half-blocks.

Scrobbling & Discord

Last.fm and ListenBrainz scrobbling, plus Discord Rich Presence over named-pipe IPC. Sensitive credentials are protected at rest — DPAPI on Windows, machine-keyed obfuscation on Linux.

ReplayGain

Reads ReplayGain tags and normalizes volume. Toggle with f.

Varispeed & balance

Tape-style speed from 50% to 200% — pitch moves with it, the way a turntable does. Stereo balance with < / >.

BPM detection

Background BPM analysis on track load, surfaced in the track info pane.

Sleep timer

15 / 30 / 45 / 60 / 90 minute auto-stop, cycled with Z, shown in the title bar.

Formats

Plays:

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

Rips & converts to:

.flac .mp3 .wav .opus .wv .m4a

Records radio to: .opus .mp3 .m4a copy  ·  Playlists: .m3u .m3u8 .pls .xspf

Rip Verification

Every ripped track is checksummed and matched against the AccurateRip database. The 150-sector preamble is honoured as a fixed physical property of the disc — a constant stripped from every absolute LBA, never normalized relative to the first track — so pressings with non-standard pregaps verify correctly instead of silently missing.

Track  Status        Conf   CRC (v2)
─────  ────────────  ────  ─────────
  01   AccurateRip    200   8b4a1c7e
  02   AccurateRip    200   d3f09a12
  03   AccurateRip    200   6e21bb4f
  ...
 12/12 verified                     
Rips are cross-checked against CUETools DB as a second opinion, and metadata is pulled from MusicBrainz and Discogs.

Plugin Architecture

Every platform-specific capability sits behind a seam with a Windows and a Linux implementation — HTTP, IPC, notifications, CD access, plugin loading. The core is portable; the platform difference is resolved by CMake at build time, never by branching in the code.

The streaming source is a real loadable plugin (remoct_stream.so / remoct_stream.dll) driven through a frozen C ABI, with HTTP injected across a host-services table. A radio fix ships as a rebuilt plugin with no host rebuild. A deterministic test asserts the loaded plugin produces byte-identical audio to the compiled-in reference — so "swap the plugin" never means "hope it still matches."

Get It

Grab a build from GitHub Releases, or build from source. Single-header dependencies (miniaudio, nlohmann/json) and the vendored MD5 are checked in — no separate download step.

git clone https://github.com/RadMageIRL/re-moct
cd re-moct
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
ctest --test-dir build --output-on-failure

Output lands in build/bin/remoct (or remoct.exe), with the streaming plugin beside it in build/bin/plugins/. Full per-platform instructions — including the Debian non-free enablement for FDK-AAC — are in BUILD.md.

First keys to know

Tab
Switch focus between browser and playlist
Space
Pause / resume
j / k
Move the cursor down / up
PgUp / PgDn
Move a page at a time; Home / End jump to top / bottom
J / K
Move the selected track down / up in the playlist
d
Delete the selected playlist entry
\
Search the playlist and jump to a track
|
Search your whole collection, not just the list in front of you
u / U
Mark a track / clear all marks — marked tracks are what a rip or a convert takes
@
Add or remove a library folder (on a folder in the browser)
%
In [Library]: most played, then never played, then back
Shift+F
Toggle a file-type column (FLAC / MP3 / ...) in the playlist
F3
Follow the playing track (cursor tracks playback)
Shift+E
Eject the highlighted CD drive (from [Drives])
F12
Refresh the drive list (pick up hot-plugged drives)
Ctrl+T
Toggle Classic / Awesome mode
F7 / F8
Cycle Awesome-mode theme
?
Full key bindings
Ctrl+Q
Quit

Everything else is in the documentation.