MOTO(9.1) MOTO(9.1)
NAME
moto - create animation scripts
SYNOPSIS
fb/moto [ -fstart end ] [ -sskip ] [ file [ arg ... ] ]
DESCRIPTION
Moto is a command generator tailored for an animator's
needs. Its input is a concise description of the animation
to be produced; its output is a command file suitable for
input to rc or some other command interpreter. Its argu-
ments are an optional file name containing a moto program
(default standard input) and list of numeric parameters that
are made available to the program.
A moto program consists of a list of groups of commands
guarded by a range of frames. Groups may contain parameter
ranges enclosed in brackets []. For each frame, moto checks
each group and processes those whose guards include the cur-
rent frame number:
1,6: clr 128
1,4: clr -w [0,30] [0,30] [100,130] [100,130]
3,6: clr -w [100,70] [100,70] [130,100] [130,100] 255
This generates
clr 128
clr -w 0 0 100 100
clr 128
clr -w 10 10 110 110
clr 128
clr -w 20 20 120 120
clr -w 100 100 130 130 255
clr 128
clr -w 30 30 130 130
clr -w 90 90 120 120 255
clr 128
clr -w 80 80 110 110 255
clr 128
clr -w 70 70 100 100 255
Two special guards, BEGIN and END, specify actions to be
taken before and after processing frames. Moto allows com-
plex computations inside parameter brackets:
1,10: clr [127.5*(1-cos([0,360]))]
This generates
clr 0
clr 29.82933350233
clr 105.35985734747
clr 191.25
clr 247.3108091502
clr 247.3108091502
Page 1 Plan 9 (printed 11/1/25)
MOTO(9.1) MOTO(9.1)
clr 191.25
clr 105.35985734747
clr 29.82933350233
clr 0
Expressions may include constants and variables. All values
are double-precision floating point numbers. The operators
=, /, +, - (both unary and binary), <, >, <=, >=, ==, !=, ?:
and !, all with their meanings as in C, except that all
results are coerced to double. The result of a%b is
a-b*(int)(a/b). The result of a&&b is a?b:a. The result of
a||b is a?a:b. The exponentiation operator is ^, also writ-
ten **. The expression [a,b] varies from a to b, linearly
as the frame number varies between the guards of the group
containing the expression. The expression a[b,c] has the
value a*b+(1-a)*c. Its value varies from b to c as a varies
from 0 to 1. The expression $i has the value of the i'th
parameter following the file name on moto's command line.
The precedence of operators is, from lowest to highest:
=
? :
||
&&
< <= == != > >=
+ -
* / %
[ ]
^ **
- (unary) ! $
Expressions may be parenthesized to alter precedence.
The following math functions are available:
fabs floor ceil sqrt hypot sin cos tan gamma
asin acos atan exp log log10 sinh cosh tanh
All math functions are as described in the C library, except
that angles are measured in degrees rather than radians for
the trig and inverse trig functions. In addition hypot may
have two or three arguments, atan may take two arguments
instead of one, and may also be spelled atan2.
For parameterization, and to allow even more complex compu-
tations, moto has variables, assignment and computation
groups. A computation group causes no output; rather its
body is a group of expressions to be evaluated for their
side effects. It is distinguished from a command group by
having a double colon separating the guard and body:
BEGIN:: n=5
1,n:: x=512*sin([0,90])
1,n: pcp -w 0 0 [x] 488 pic.[1,n] %0
This generates
pcp -w 0 0 0 488 pic.1 %0
Page 2 Plan 9 (printed 11/1/25)
MOTO(9.1) MOTO(9.1)
pcp -w 0 0 195.93391737093 488 pic.2 %0
pcp -w 0 0 362.03867196751 488 pic.3 %0
pcp -w 0 0 473.02632064578 488 pic.4 %0
pcp -w 0 0 512 488 pic.5 %0
Upon occasion it is useful to split moto's output into sev-
eral files, under program control. A group that is sepa-
rated from its guards by an at-sign @ instead of a colon
names a file into which subsequent output is to be written.
For example,
1,5@ file.[1,5]
1,5: This is file.[1,5].
creates 5 files, with names file.1, ..., file.5. Each
file's contents will announce its name.
As is true for all sufficiently large programs, moto has a
shell escape. A group separated from its guards by an
exclamation point ! instead of a colon has its result text
interpreted by a subshell.
Page 3 Plan 9 (printed 11/1/25)