qplay — convert QBASIC play strings to PCM
qplay [
-i part] [
-q part] [
-r
rate] [
file...]
| aplay -f dat -c 1
qplay will convert QBASIC-style strings for its "PLAY" command to
linear 16-bit raw PCM. Normally, you will be wanting to pipe it into a raw PCM
player like
aplay(1) to actually output it to a sound device. Be sure
to lower the volume beforehand to avoid nasty surprises that come with square
waves. By default, bsvplay will mix 1:1 square:sine waves to give a medium
tone hardness.
-
-q part
- Part to mix square waves in (default: 1.0)
-
-i part
- Part to mix sine waves in (default: 1.0). If -q2 -i1
is specified for example, the final PCM output will consist of
2/3*squarepcm + 1/3*sinpcm.
-
-r rate
- PCM sample rate (default: 48000 Hz)
The file format qplay expects is of course not BASIC, but raw PLAY command
strings. Lines that start with a leading hash mark ('
#') are ignored.
Commands are case insensitive and whitespace is mostly ignored. The original
QBasic manpage is slightly incorrect; below is what qplay supports.
-
on
- Sets the current octave. There are seven octaves, n
= 0-6.
- >
- Increases octave by 1. The upper octave limit in QBasic was
6; qplay has a limit of 9.
- <
- Decreases octave by 1. Octave cannot drop below 0.
-
A - G
- Plays a note in the range A-G. The number sign (#)
or the plus sign ( +) after a note specifies sharp; a minus sign
(-) specifies flat. N n Plays note n. The
range for n is 0-84 (in the seven possible octaves, there are 84
notes); n = 0 means a rest.
-
# or +
- Follows a specified note and turns it into a sharp.
- -
- Follows a specified note and turns it into a flat.
-
L n
- Sets the length of each note. L4 is a quarter note, L1 is a
whole note, etc. The range for n is 1-64. The length may also
follow the note when a change of length only is desired for a particualr
note. For example, A16 can be equivalent to L16A.
- MN
- Sets "music normal" so that each note will play
7/8 of the time determined by the length (L).
- ML
- Sets "music legato" so that each note will play
the full period set by lengt (L).
- MS
- Sets "music staccato" so that each note will play
3/4 of the time determined by the length (L).
-
P n
- Specifies a pause, ranging from 1-64. This option
corresponds to the length of each note, set with L n. T n
Sets the "tempo", or the number of L4 quarter notes in one
minute. The range for n is 32-255. The default for n is 120.
- .
- A period after a note causes the note to play 3/2 times the
length determined by L (length) times T (tempo). The period has the same
meaning as in a musical score. Multiple periods can appear after a note.
Each period adds a length equal to one-half the length of the previous
period. For example, the command A. plays 1 + 1/2, or 3/2 times the
length, and A.. plays 1 + 1/2 + 1/4, or 7/4 times the length.
Periods can appear after a pause (P). In this case, the pause length is
scaled in the same way notes are scaled.
-
X(var)
- Play the string in the variable var.
Variable definitions in qplay syntax are for example:
$var = "CDEF";
and they must stand on a single line.
echo "L16O2CDEFGAB>CDEFGAB>L4C" | qplay - | aplay -fdat -c1
will play a tone ladder.
aplay(1),
bsvplay(1),
hxtools(7)