Featureful ncurses based MPD client inspired by ncmpc with integration for Beets, spectrum visualization,Bandcamp/Soundcloud, asciimatics, cantata, and more
MusicPlayerPlus includes customized configuration for the Music Player Daemon
(MPD), the MPD client mpcplus
, a spectrum visualizer mppcava
, the tmux
terminal multiplexer, and the tmuxp
tmux session manager.
The installed MusicPlayer MPD configuration files are located in
~/.config/mpd/
.
The default ~/.config/mpd/mpd.conf
indludes the following:
music_directory "~/Music"
playlist_directory "~/Music/Playlists"
db_file "~/.config/mpd/tag_cache"
log_file "~/.config/mpd/log"
pid_file "~/.config/mpd/pid"
state_file "~/.config/mpd/state"
sticker_file "~/.config/mpd/sticker.sql"
bind_to_address "localhost"
input {
plugin "curl"
}
input {
enabled "no"
plugin "qobuz"
}
input {
enabled "no"
plugin "tidal"
}
decoder {
plugin "hybrid_dsd"
enabled "no"
}
decoder {
plugin "wildmidi"
enabled "no"
config_file "/etc/timidity/timidity.cfg"
}
audio_output {
type "alsa"
name "My ALSA Device"
buffer_time "50000" # (50ms); default is 500000 microseconds (0.5s)
}
audio_output {
type "fifo"
name "Visualizer feed"
path "~/.config/mpd/mpd.fifo"
format "44100:16:2"
}
filesystem_charset "UTF-8"
See the MPD README.
MPD client mpcplus
default configuration is located in
~/.config/mpcplus/config
and includes the following:
mpd_music_dir = ~/.config/mpd/music
visualizer_data_source = ~/.config/mpd/mpd.fifo
visualizer_output_name = Visualizer feed
visualizer_in_stereo = yes
visualizer_type = spectrum
visualizer_look = "+|"
visualizer_color = 47, 83, 119, 155, 191, 227, 221, 215, 209, 203, 197, 161
visualizer_spectrum_smooth_look = no
playlist_shorten_total_times = yes
playlist_display_mode = columns
browser_display_mode = columns
search_engine_display_mode = columns
playlist_editor_display_mode = columns
autocenter_mode = yes
centered_cursor = yes
progressbar_look = ▃_▃
user_interface = alternative
screen_switcher_mode = media_library, playlist, browser
startup_screen = media_library
locked_screen_width_part = 60
display_bitrate = yes
external_editor = vim
use_console_editor = yes
header_window_color = cyan
volume_color = red
state_line_color = yellow
state_flags_color = red:b
progressbar_color = cyan
progressbar_elapsed_color = cyan:b
statusbar_color = cyan
MPD client mpcplus
default key bindings are located in
~/.config/mpcplus/bindings
and includes the following:
def_key "alt-1"
run_external_command "/usr/bin/set_term_trans 0.1"
def_key "alt-2"
run_external_command "/usr/bin/set_term_trans 0.2"
def_key "alt-3"
run_external_command "/usr/bin/set_term_trans 0.3"
def_key "alt-4"
run_external_command "/usr/bin/set_term_trans 0.4"
def_key "alt-5"
run_external_command "/usr/bin/set_term_trans 0.5"
def_key "alt-6"
run_external_command "/usr/bin/set_term_trans 0.6"
def_key "alt-7"
run_external_command "/usr/bin/set_term_trans 0.7"
def_key "alt-8"
run_external_command "/usr/bin/set_term_trans 0.8"
def_key "alt-9"
run_external_command "/usr/bin/set_term_trans 0.9"
def_key "alt-0"
run_external_command "/usr/bin/set_term_trans 1.0"
def_key "alt-f"
run_external_command "/usr/bin/mppfzmp"
def_key "alt-r"
run_external_command "/usr/bin/raise_cava"
The default mppcava
spectrum visualizer configuration file is located at
~/.config/mppcava/config
. MusicPlayerPlus mppcava
configuration includes:
[general]
bar_width = 1
higher_cutoff_freq = 20000
[input]
method = fifo
source = ~/.config/mpd/mpd.fifo
sample_rate = 44100
sample_bits = 16
[color]
gradient = 1
gradient_count = 8
gradient_color_1 = '#59cc33'
gradient_color_2 = '#80cc33'
gradient_color_3 = '#a6cc33'
gradient_color_4 = '#cccc33'
gradient_color_5 = '#cca633'
gradient_color_6 = '#cc8033'
gradient_color_7 = '#cc5933'
gradient_color_8 = '#cc3333'
[smoothing]
gravity = 77
MusicPlayerPlus mppcava
is a customized fork of the Cava spectrum visualizer.
See the Cava README for more info on Cava.
The tmux
terminal multiplexer is a powerful and complex system.
It allows multiple terminal sessions to be accessed simultaneiously
in a single window. It is useful for running more than one command-line
program at the same time. It can also be used to detach processes from
their controlling terminals, allowing remote sessions to remain active
without being visible.
Although powerful and extremely useful, tmux
is not frequently employed
by most users due to its complexity. There is a steep learning curve.
MusicPlayerPlus attempts to surmount that hurdle by providing a sophisticated
tmux
configuration out of the box. The mppinit
utility, executed after
installing MusicPlayerPlus, installs a tmux
configuration file located at
~/.tmux.config
which automatically sets up tmux key bindings and settings
making it easy to incorporate tmux into a user’s routine.
The default ~/.tmux.conf
that MusicPlayerPlus installs includes:
bind-key -n M-PgDn next-window
bind-key -n M-PgUp previous-window
bind-key -n M-Left select-pane -L
bind-key -n M-Right select-pane -R
bind-key -n M-Up select-pane -U
bind-key -n M-Down select-pane -D
bind-key -n M-x confirm-before -p "kill-session #S? (y/n)" kill-session
bind-key -n M-X kill-session
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix
bind-key r source-file ~/.tmux.conf\; display ' Reloaded tmux config.'
bind-key | split-window -h -c '#{pane_current_path}'
bind-key - split-window -v -c '#{pane_current_path}'
unbind '"'
unbind %
bind-key -n S-Left previous-window
bind-key -n S-Right next-window
bind-key s set-window-option synchronize-panes
set-window-option -g pane-base-index 1
set-window-option -g history-limit 1000000
set-window-option -g window-status-style fg=colour244,bg=default #base0 and default
set-window-option -g window-status-current-style fg=colour166,bg=default #orange and default
set-window-option -g window-status-bell-style fg=colour235,bg=colour160 #base02, red
set-option -g base-index 1
set-option -g mouse on
set-option -g status-position bottom
set-option -g status-justify left
set-option -g status-left-length 50
set-option -g status-left '#{?client_prefix,#[bg=colour10 fg=colour0] Ctrl #[default] ,}'
set-option -g status-right-length 100
set-option -g status-right "#[fg=cyan]%A, %d %b %Y %I:%M %p"
set-option -g status-style fg=colour136,bg=default
set-option -g message-style fg=colour166,bg=colour235 #orange and base02
set-option -g display-time 1000
set-option -g repeat-time 1000
set-option -g default-terminal "xterm-256color"
set-option -ga terminal-overrides ',*-256color*:Tc'
set-option -g pane-border-style fg=colour235 #base02
set-option -g pane-active-border-style fg=colour240 #base01
set-option -g display-panes-active-colour colour33 #blue
set-option -g display-panes-colour colour166 #orange
set-option -g visual-activity off
set-option -g visual-bell off
set-option -g visual-silence off
set-option -g bell-action none
set-window-option -g monitor-activity off
MusicPlayerPlus tmuxp
configuration files are YAML format
files used to manage tmux
sessions with tmuxp. MusicPlayerPlus
provides tmuxp configuration files for fzmp
, mpcplus
, and
mppsplash
tmux sessions.
See the TMUXP README.
MusicPlayerPlus includes the really nice character based mpd client mpcplus. It has all the functionality one would need, but sadly it has no built-in way of showing album art for the current playing song as rendering images via a terminal emulator is pretty tricky.
MusicPlayerPlus includes commands and tmux
integration to enable the
display of album cover art in a tmux pane alongside mpcplus
and mppcava
.
What follows is a technical deepdive into how this was accomplished.
Here you will learn how to include album art in your mpcplus client and
include the mppcava spectrum visualizer while browsing songs. Luckily, you
will not have to copy and paste these files and setup the system yourself.
The MusicPlayerPlus package contains all the configuration, scripts, dependencies,
and a convenience startup command. To run mpcplus
with spectrum visualization
and album art all you need to do is execute the mpcplus-tmux
command.
If your music library contains album art in the album folders then it will
be displayed alongside the visualizer and MPD client.
The final result would be something like this:
To start off, a few dependencies need to be installed:
Tmux should already be installed either as a base package for your
Linux distribution or as a MusicPlayerPlus dependency. If it is not
installed (try type -p tmux
) then install
tmux with:
sudo apt install tmux
Install inotify-tools with:
sudo apt install inotify-tools
Install Ueberzug with:
python -m pip install ueberzug
Install ffmpeg with:
sudo apt install ffmpeg
Mpc should already be installed as a MusicPlayerPlus dependency.
If it is not installed (try type -p mpc
) then install
mpc with:
sudo apt install mpc
The basic idea is that each time the song changes it triggers a script
that searches for an album cover and copies it in /tmp
as
album_cover.png
. Another script listens for changes on that file and
renders the new image in the terminal.
Start by creating a script named album_cover.sh
in ~/.config/mpcplus/
:
source "`ueberzug library`"
function add_cover {
ImageLayer::add [identifier]="img" [x]="1" [y]="2" [path]="${COVER}"
}
if [ -f ${HOME}/.config/mpcplus/config ]
then
MPCDIR=".config/mpcplus"
else
if [ -f ${HOME}/.mpcplus/config ]
then
MPCDIR=".mpcplus"
else
mppinit
MPCDIR=".config/mpcplus"
fi
fi
COVER=${HOME}/${MPCDIR}/album_cover.png
ImageLayer 0< <(
if [ ! -f "${COVER}" ]; then
cp ${HOME}/${MPCDIR}/default_cover.png ${COVER}
fi
while inotifywait -q -q -e close_write "${COVER}"; do
add_cover
done
)
This is going to listen for album cover changes and render them.
If no album cover for the current song is found, a default image will be
selected. Be sure to add one named default_cover.png
in ~/.config/mpcplus/
.
Now create cover_obs.sh
in the same directory:
if [ -f ${HOME}/.config/mpcplus/config ]
then
MPCDIR=".config/mpcplus"
else
if [ -f ${HOME}/.mpcplus/config ]
then
MPCDIR=".mpcplus"
else
mppinit
MPCDIR=".config/mpcplus"
fi
fi
COVER="${HOME}/${MPCDIR}/album_cover.png"
COVER_SIZE="400"
mpd_music=`grep ^music_directory /etc/mpd.conf`
if [ "${mpd_music}" ]
then
MUSIC_DIR=`echo ${mpd_music} | awk ' { print $2 } ' | sed -e "s/\"//g"`
else
mpd_music=`grep ^mpd_music_dir ${HOME}/${MPCDIR}/config`
if [ "${mpd_music}" ]
then
MUSIC_DIR=`echo ${mpd_music} | awk ' { print $3 } '`
else
MUSIC_DIR=${HOME}/Music
fi
fi
file="${MUSIC_DIR}/$(mpc --format %file% current)"
album="${file%/*}"
art=$(find "${album}" -maxdepth 1 | grep -m 1 ".*\.\(jpg\|png\|gif\|bmp\)")
if [ "${art}" = "" ]; then
art="${HOME}/${MPCDIR}/default_cover.png"
fi
ffmpeg -loglevel 0 -y -i "${art}" -vf "scale=${COVER_SIZE}:-1" "${COVER}"
This is the script executed when switching songs. It searches for images in the directory of the current song.
Here I chose a render size of 400 x 400, but it can be anything.
Tell mpcplus to execute it every time the song changes by adding this to
~/.config/mpcplus/config-art.conf
execute_on_song_change = "~/.config/mpcplus/cover_obs.sh"
And don’t forget to make them executable
chmod +x album_cover.sh
chmod +x cover_obs.sh
As mentioned above, we use tmux to run multiple terminal based programs in a
single window so that everything fits nicely (i.e. an instance of mpcplus
,
an instance of mppcava
, and one terminal running our image rendering script).
MusicPlayerPlus includes commands that start a tmux session and configures
the tmux panes. Start a tmux session displaying mpcplus
, the mppcava
spectrum
visualizer, and album art in separate tmux panes by executing the command:
mpcplus-tmux
You can take a look at the complete config files.