This is a PJB100 manager mode written in elisp. This package makes
the PJB (possibly) the first MP3 player which can be totally managed
through emacs. It supports adding multiple tracks in one upload,
renaming and reordering tracks, disc and sets and removing tracks.
Emacs PJB manager is based on modified SDK command line utilities.
Original, unmodified SDK is available from
This package is also only tested with regular GNU Emacs (version 20.3.1).
Note that to use this, you naturally need USB driver for the PJB
(located in the package) and kernel with USB support
(I am using 2.2.18).
Current CVS snapshot and new releases of this package are also available
OpenPJB SourceForge project.
And if you don't know what PJB is,
read this and
order one today. ;)
Short installation instructions
package which contains current version of my modified SDK.
The package contains a README
with more detailed information about the command line utility and a
Specially the added features in command line utility
are documented in the README.
Inside the package is pjbsdk directory which contains fairly standard
configure system. Compile it with
If there are problems send me email and I'll try to help.
Also check the INSTALL file in the package.
After compilation the main utility is in
This is a command line utility which can be used to view the contents
of your PJB, add and remove tracks, discs and sets and sort sets
and discs. Readme file in the package explains these features in
depth (or at least tries to...).
needs to have the
pjb binary located somewhere
in your path. Either install it by copying it to
(or somewhere) or add it's current location to your path.
After that you can load it with '
load' command within Emacs
or by some other means such as adding line
(load-file "~/.elisp/pjb-manager.el") to your .emacs file
M-x eval-buffer command while viewing the file.
Using the Emacs PJB-manager mode
Actual pjb-manager mode is started with command
At that point the window is split (or should be) into two buffers.
Upper one contains usually the table of contents file for the PJB which
can be modified. All commands are also given to this buffer.
Lower buffer shows output of various operations.
Help on key bindings (show on startup too) can be seen with
C-c h command (note: this means 'press 'ctrl-c' and the 'h').
Complete command listing is:
Read TOC from PJB. This discards the currently
loaded (and possibly modified) TOC.
Write TOC to PJB. This commits all ordering and
naming changes, removes deleted tracks and
automatically uploads newly added files. If commit is
already in progress, it will be aborted instead.
This command asks confirmation before proceeding.
Note that new tracks are first uploaded and TOC is written afterwards.
This means that tracks deleted but not committed are still marked as used
so if your PJB is almost full you must first delete unwanted tracks, commit
and then add new files.
Verify edited TOC but don't commit it.
Basically the same as above but does not write any thing. Can be used
to see if there is any problems with files to be added. Also calculates
total size for added tracks.
Add new track to current cursor position.
Tries to read mp3 tags (if not disabled
C-c C-t command). If directory is given, a new disc
is created for all files inside it and if it contains further
subdirectories, a new set is made which will then contain all a new
disc per each subdirectory.
Variable 'pjb-artist-in-discname' can be used to control the disc name
format. By default (if the varible is set to 't') the disc name is formed
as 'ARTIST / ALBUM'. If 'pjb-artist-in-discname' is nil the disc name is
just plain album name.
This also does some minor modifications to names, mainly
converts underscores to spaces.
Add cue file as a new disc.
Cue file has to have filename defined which will point to the
mp3 file. Disc is created with the album name got from the cue file
and each track in the cue file is converted to a track on pjb.
Disc, track and file names can be edited before commiting the TOC.
Note that the offset on the first track is ignored (first track begins
always at offset 0:00:00) and the last track ends at the end of the file.
Count the total size of all added (but uncommited) tracks.
Depending on cursor position, will either sort discs in a set (if
cursor is on set line) or tracks within the disc (if cursor is somewhere
inside that track definition). Can sort contents alphabetically in either
normal or reverse order. Can also 'sort' into random order.
Operation is made within emacs so all changes
can be reviewed before commiting.
Play selected track by downloading it to external process. Stop the
playing by pressing 'C-c p' in non-track context.
Currently the only supported external player is mpg123.
Prettify track names inside a region.
Currently just replaces '_' with ' '.
Actually this is deprecated command as current version does this
Retrieve information from PJB. Shows remaining free space, number of
sets, discs and tracks, etc.
Get statistics on current (based on cursor position) disc or set.
Toggle id3tag reading on and off.
C-c C-c C-b
Make a backup from whole PJB contents. This command first asks for backup
directory into which all sets, discs and tracks are then downloaded.
Variable 'pjb-backup-options' can be set to modify this command.
It's value must be a list of strings, each defining one command line
By default 'pjb-backup-options' is set to
"-skip" "-ws2us" "-filter=?!*"\/"
which will skip existing files, replace whitespace with underscore in
directory and track names and filter all '?', '!', '*', '"', '\' and '/'
Make backup from selected subtree of PJB's contents. Set, disc or
even single track can be selected by positioning cursor on that line.
As above, this command first asks for backup
directory but in case of track command, a new file can also be specified.
In that case the track name in toc is ignored and track is written directly
to the given file.
Variable 'pjb-backup-options' is also used by this command.
Show help text.
Navigation and display management
Cursor keys can be used to navigate the listing. Up and down arrows
are used to jump tracks with alt key, discs with control and sets with
Shift and right/left can be used to 'hide' parts of the listing.
Pressing shift and left arrow will first hide all other track information
track name. Second button press will hide all track information and finally
the third press hides disc names and leaves only sets visible.
Process can be reversed using shift and left.
Hiding is implemented through 'selective display' feature in emacs.
Some care should be taken as the hidden text isn't actually removed and can
be accessed through cursor movements, matched in searches etc. So for example
to copy whole disc while tracks are hidden, just pressing the C-k once on
discs line isn't enough and will only copy that line. Correct sequence is
to first set mark on beginning of that line, move to the start of next line
and press C-w to cut whole region.
If you have any comments on this, please send me email to
Screenshot showing pjb-manager uploading some discs.