ref: 281c596acf4eebc74340596481e5d1e8f84f18f1
parent: 223b8bb0d4216aff2e8824e019c33cfdd4f78511
author: qwx <[email protected]>
date: Mon Aug 19 05:44:07 EDT 2024
rewrite manpage for clarity
--- a/pplay.man
+++ b/pplay.man
@@ -1,6 +1,6 @@
.TH PPLAY 1
.SH NAME
-pplay \- visual PCM audio player and editor
+pplay \- PCM audio player and editor
.SH SYNOPSIS
.B audio/pplay
[
@@ -10,22 +10,16 @@
]
.SH DESCRIPTION
.I Pplay
-is a PCM audio player displaying a time-domain graphical plot of the data
-and allowing for some simple editing operations
-or piping to/from external programs.
-It operates on raw PCM audio, the same format used by the audio device (see
-.IR audio (3)).
+is an interactive audio player and editor for PCM files
+(16-bit stereo audio at 44.1 kHz sampling rate, see
+.IR audio (3)),
+displaying each channel's waveform and the current playback position.
.PP
-All input is fully loaded into memory,
-either from one or more input files
-.BR pcmfiles ,
-or from standard in if run without arguments.
-It loops through the entire buffer or a selected portion forever,
-writing samples to
-.B /dev/audio
-unless
-.B -c
-is specified.
+Playback loops forever between two positional markers,
+initially the beginning and end of the data
+(see section
+.I Loop points and selection
+below).
.SS "Command line parameters"
.TF "-b"
.TP
@@ -36,6 +30,52 @@
Write audio to standard out instead of
.B /dev/audio
.PD
+.SS "Graphical interface"
+.I Pplay
+visualizes a window of data by splitting it in chunks of samples
+by pixel column on the x axis and extracting the minimal and maximal values.
+The y axis is the entire range of values from -32768 to 32767, bottom to top.
+If stereo display is enabled, the view is split in two, with the right channel on the bottom.
+Otherwise only the left channel is shown.
+.PP
+Time information is displayed on the bottom left,
+with
+.I T
+the sample period (stereo samples per pixel),
+.I @
+the current playback position,
+.I ↺
+the starting loop point,
+.I -
+the ending loop point, and
+.I ‡
+the cursor (last left click).
+The last 4 timestamps are displayed in
+[hh:mm:ss.tt] format (see
+.IR tmdate (2))
+and the stereo sample's number.
+.PP
+When the selected range is the entire data and only the
+.I @
+timestamp is displayed.
+The
+.I ‡
+timestamp is displayed if a cursor has been set
+see section "Loop points and selection" below).
+.SS "Loop points and selection"
+Playback is constrained to a range defined by two positional markers,
+the start and end loop points, initially the entire data.
+This range also acts as a selection for editing operations.
+No selection can be made outside of this range.
+.PP
+Middle-clicking either left or right of the current playback position cursor
+sets respectively the start or end loop point.
+Left-clicking within the range sets the current playback position.
+The last left click is stored as another positional marker ("cursor")
+for some commands.
+Reseting the loop points selects the entire data again and removes the cursor.
+Loop points may also be set to a specific sample number or timestamp
+via commands (see below).
.SS "Keyboard and mouse commands"
Key commands:
.TF "Esc"
@@ -44,10 +84,10 @@
Quit
.TP
.B D
-Toggle drawing cut/insert positions in the buffer
+Toggle cut markers
.TP
.B S
-Toggle stereo display (default left channel only)
+Toggle stereo channel display (default: left only)
.TP
.B ␣
Toggle play/pause
@@ -83,198 +123,116 @@
Pan right by screenful
.PD
.PP
+Any other key opens up a command prompt (see Commands section below).
+.PP
Mouse buttons:
.TF "1 "
.TP
.B 1
-Set cursor
+Set current playback position
.TP
.B 2
-Set left or right dot bound
+Set start or end loop point
.TP
.B 3
-Pan view horizontally
+Hold to pan view horizontally
.PD
-.SS "Dot and cursor position"
-.I Pplay
-loops indefinitely an interval referred to as the
-.IR dot .
-The dot is simply the start (left) and end (right) loop points,
-by default the data's beginning and end.
-The current playback position within it is refered to as the
-.IR cursor .
-The dot is set using the middle mouse button and with respect to the cursor:
-if clicking to its left, the left loop point is set,
-if to the right, the right loop point is set.
-The cursor is set with the left mouse button
-and may never escape the dot.
-The last left mouse click is referred to as the
-.I anchor
-point.
-Dot, cursor and anchor are indicated
-by distinctly colored vertical lines.
-.SS "Display"
-The graphical plot displays on the y axis
-the maximal and minimal signed value
-among all samples packed in each pixel column
-for one audio channel.
+.SS "Editing commands"
+Typing any key that isn't a shortcut opens a command prompt.
+Commands are single characters followed by optional arguments.
.PP
-The x axis is time in number of samples,
-and is described in a text bar
-on the bottom left (mono)
-or in the middle (stereo) of the graphical view.
-The first value is the
-.IR period ,
-or number of samples per vertical pixel column.
-The next fields are offsets from the beginning of the data
-given in the form
-.IR [hh:mm:ss.tt]\ (samples) ,
-where the first part is in time format (see
-.IR tmdate (2),
-and the second in number of samples.
-The first field is for the current position.
-If set, either the dot or only the anchor follow it.
-.SS "Editing"
-Commands:
.TF "L sample"
.TP
+.B c
+Copy selection (sets hold buffer)
+.TP
+.B d
+Cut selection (sets hold buffer)
+.TP
+.B x
+Crop to selection (exclusive cut; does not set hold buffer)
+.TP
+.B p
+Replace selection or insert at cursor from hold buffer
+.TP
.BI <\ cmd
-Pipe output of a shell command into dot
+Replace selection with output of shell command
.TP
.BI ^\ cmd
-Pipe dot to a shell command and read back its output into dot
+Pipe selection to shell command and replace with its output
.TP
.BI |\ cmd
-Pipe dot to a shell command
+Pipe selection to a shell command
.TP
-.BI L\ sample
-Set left bound/loop point to
-.I sample
+.BI r\ file
+Replace selection or insert at cursor with the contents of
+.I file
.TP
-.BI R\ sample
-Set right bound/loop point to
-.I sample
+.BI w\ file
+Write selection to
+.I file
.TP
+.B u
+Undo edit
+.TP
.B U
-Redo an edit and restore dot
+Redo edit
.TP
-.B c
-Set snarf buffer to the contents of the dot
-.TP
-.B d
-Cut dot, replacing snarf buffer
-.TP
.BI j\ sample
Jump and set current position to
.I sample
.TP
-.B p
-Paste snarf buffer into dot or insert at the cursor
+.BI L\ sample
+Set start loop point to
+.I sample
.TP
-.BI r\ file
-Read
-.I file
-into dot or at the cursor
+.BI R\ sample
+Set end loop point to
+.I sample
.TP
.B s
-Replicate dot by piping it to a new
-.IR pplay (1)
-instance
-.TP
-.B u
-Undo an edit and dot change
-.TP
-.BI w\ file
-Write dot to
-.I file
-.TP
-.B x
-Crop to dot (exclusive cut); does
-.B not
-touch the snarf buffer
+Open selection in a new instance of
+.IR pplay (1).
.PD
.PP
-Upon typing a key not part of the set of keyboard shortcuts,
-a text entry appears to enter commands in.
-Commands are single character codes,
-and all following text is used as an arguments list.
+Some of the cut/copy commands set the contents of a "hold" buffer
+which may be later inserted or pasted over the current selection
+any number of times.
.PP
-Editing is performed upon a range or at a position:
-the dot's range if the left or right bound is set, else at the anchor if it exists, else on the entire data.
+Note that if a cursor (last left click) has been set,
+some commands will use its position alone instead of the entire range.
+Setting a cursor thus allows one to insert data at a position rather than
+paste over an entire range.
.PP
-Behavior depends on the dot.
-If a left or right bound is set,
-inserts replace the range and deletions delete it.
-Otherwise, if an anchor point exists,
-insertion inserts a buffer at its position
-while deletion is disallowed.
-If nothing is set,
-insertion replaces the entire buffer,
-and deletion is also disallowed.
+Shell commands are passed verbatim to
+.IR rc (1)
+and may be any valid expression including function definitions.
+Each of them runs concurrently in the background
+and updates the then selected range once done.
+Upon exit,
+.I pplay
+will wait for subcommands to end and exit first.
.PP
-.BR < ,
-.BR r\ (read),
-and
-.BR p\ (paste)
-insert data from an external command or the copy buffer,
-following the rules above.
-.PP
-The
-.BR u\ (undo)
-command reverts a single indel and restores the dot as it were before,
-and
-.BR U\ (redo)
-similarly replays the last action that was undone.
Undo is infinite.
+.SH EXAMPLES
+Use
+.IR play (1)
+to decode any known audio format and pass it on standard in:
+.IP
+.EX
+; play -o /fd/1 files.. | audio/pplay
+.EE
.PP
-Commands
-.BR < ,\ ^\ and\ |
-require a valid
-.IR rc (1)
-expression, passed uninterpreted (quoting is unnecessary).
-In other words, expressions such as:
+Timestretch selection, normalize volume and save as a WAV file:
.IP
.EX
-| stretch -r1.2 | norm -f 2 | audio/wavenc > seymourbutz.wav
+|stretch -r1.2 | norm -f 2 | audio/wavenc > seymourbutz.wav
.EE
.PP
-are passed as a single string and then evaluated in a subshell,
-with the dot written to its standard in.
-.I Pplay
-does not handle any subprocess' abnormal exits in any way.
-.PP
-File i/o commands
-.BR r\ and\ w
-prompt for a pathname which is also uninterpreted.
-Consequently, commands and i/o may fail once actually executed;
-in case
-.I pplay
-was reading from a file or pipe,
-the partial content already loaded will not be discarded.
-External commands launched from within
-.I pplay
-.B are not
-interrupted on exit,
-causing it to appear stuck.
-Multiple commands may run concurrently.
-.SS Memory management
-No data loaded into memory is ever freed unless it can be
-guaranteed to never be used again.
-While refcounting is already being done,
-currently no attempt to keep guarantees is made
-and nothing is ever freed.
-However, memory is never duplicated.
-Therefore, it is dangerous to load large amounts of data,
-but once loaded, memory usage will not grow much.
-The maximum size of a single buffer is bound by the limits of
-.IR malloc (2).
-.SH EXAMPLES
-Use
-.IR play (1)
-to decode any known audio format:
+Apply fadeout to selection:
.IP
.EX
-; play -o /fd/1 file | audio/pplay
+^pcmenv 1 0 1.1
.EE
.SH "SEE ALSO"
.IR audio (1),
@@ -285,18 +243,16 @@
.I Pplay
first spawned on 9front (October, 2017), beyond the environment.
.SH BUGS
-Undo may irreversibly duplicate buffer contents,
-and there are still some issues with what is used as a dot
-when replacing content.
-Trust, but save often.
-.PP
An external command that never exits will freeze
.I pplay
forever on exit due to the reliance on
.BR thread (2).
+Subprocess abnormal exits are completely unhandled.
+Edits in a range while a shell command affecting it is running,
+or the case of multiple shell commands on intersecting ranges,
+are not serialized or protected in any way.
.PP
-Any unintended interruption in playback due to scheduling,
-or slower than instaneous redraws, are considered bugs,
-and drawing ones are still there -- crawling, slithering,
-glistening in the dark, poisoning my dreams and turning
-them into nightmares.
+The front may fall off if attempting to load data
+which cannot entirely fit in available memory.
+The maximum size of a single buffer is bound by the limits of
+.IR malloc (2).