OpenDMD

Psi error codes#

On this page

Every error the compiler gives has a code, for tools and links (each entry's address is this page with # and the code, as #E203). The editor shows the sentence with its code, linked to its entry here. The common errors have a word on why they happen and a before and after; the codes marked internal are never a formula's fault. What each name does is in the Psi language reference.

Characters and numbers (E0xx)#

E001 · a character Psi does not know

I don't understand …

Psi has numbers, names, a few operators and brackets; anything else, such as ^, $ or a double quote outside a declaration or print(…), is not part of it.

Take the character out. Text in quotes only goes on name, about and control lines and in print(…); for a character's code write it in single quotes, 'A'.

Before:

gray(x ^ 2)

After:

gray(x * x)

E002 · a bad number

… is not a number

Write the number with digits and at most one point, as 12 or 0.5.

E003 · a bad colour

a colour is # and 3 or 6 hex digits (0-9, a-f), as #f80 or #ff8800

Write # and then 3 or 6 hex digits.

E004 · a number out of range

numbers must be between -32768 and 32767

Use a smaller number, or scale it down with a multiply.

E005 · a number run into a name

… is not a number or a name (to multiply, write … * …)

Psi never multiplies by putting things side by side, as maths on paper does.

Put a * between the number and the name.

Before:

gray(2x)

After:

gray(2 * x)

E006 · a bad character

a character goes in quotes, one at a time: 'A', '7' or ':' (there are no strings)

Write one character between single quotes, as 'A'.

Syntax (E1xx)#

E101 · something else was expected

expected … here, found …

Two values side by side with nothing between them: usually an operator or a comma is missing.

Write what the message says is expected at that place.

Before:

v = x y
gray(v)

After:

v = x * y
gray(v)

E102 · a ( never closed

this ( is never closed — add )

Every ( needs its ): the message points at the one left open.

Add the ) that closes it.

Before:

v = (x + 1
gray(v / 2)

After:

v = (x + 1)
gray(v / 2)

E103 · a block never closed

this layer { is never closed — add }

A block (layer, draw, fn, for, if, sprite) runs to its }; the formula ended first.

Add the } that closes the block.

Before:

layer {
  gray(x)

After:

layer {
  gray(x)
}

E104 · the colour is not last

the colour has to be the last line (move this to the end)

The last line is the colour, and only the last: lines after it would never be used.

Move the colour line to the end of the formula (or the layer or function).

Before:

gray(x)
v = 1

After:

v = 1
gray(x * v)

E105 · loop inside a layer

loop is the whole formula's: put it on a line of its own, outside the layers

Move the loop line out of the layer.

E106 · a value is missing

a value is missing here

An operator, a = or a , with nothing after it.

Write the value that goes there.

Before:

v =
gray(v)

After:

v = x
gray(v)

E107 · a [ never closed

this [ is never closed — add ]

Add the ] that closes it.

E108 · a bare value that is not the colour

only the last line can be a bare value (the colour) — did you mean name = …?

A line that is only a value, not the last line: it would be worked out and thrown away, so it is most likely a name left out.

Give the value a name with name = …, or make it the last line.

Before:

x + 1
gray(x)

After:

v = x + 1
gray(v / 2)

E109 · loop set twice

loop is already set

Keep one loop line.

E110 · loop without a time

loop takes a number of seconds, e.g. loop 8, or forever for one that goes on without repeating

Write loop and a number of seconds, or loop forever.

E111 · use left in a formula

use puts a formula in by its name, as a function fn p(x, y) { … }, when you leave the line

Finish the line (the editor puts the formula in), or write the function out.

E112 · an empty formula

empty: write a colour, e.g. hsv(x + t/4, 1, 1)

Write a colour as the last line.

E113 · no colour at the end

the last line should be the colour, e.g. rgb(r, g, b), hsv(h, s, v) or pal(fire, k)

End the formula with a colour line.

E114 · the wrong number of values

… takes … values, but got …

Each function takes a fixed number of values (the reference's tables say how many); colours may take one more, how much of the pixel they cover.

Give the function the number of values it takes.

Before:

gray(x, 2, 3)

After:

gray(x, 0.5)

E115 · the wrong values for a character

… takes 3 values (…, a column and a row; and a font, normal, small or bold, if you like), but got …

Give it the value, a column and a row, and a font if you like.

E116 · the wrong values for pick

pick takes a number, then the values to pick from: pick(k, a, b, …)

Write pick(k, a, b, …): a number, then the values.

E117 · the bold font has digits only

the bold font has digits only: use digit(n, x, y, bold)

Use digit(…) for the bold font.

E118 · not a font

the last value of … is a font: normal (the default), small or bold, found …

Write normal, small or bold, or leave the font out.

E119 · the wrong values for rgb of a colour

rgb of a colour takes the colour and, if you like, how much of the pixel it covers (0 to 1)

Write rgb(colour) or rgb(colour, cover).

E120 · coverage on an inner colour

how much a colour covers goes on the whole line: rgb(mix(…), k), not on an rgb(…) inside it

Move the coverage to the outer rgb(…).

Names (E2xx)#

E201 · an unknown name

unknown name … (did you mean …?)

A name is used before it is set, or is spelled differently where it is set.

Set the name on an earlier line, or fix the spelling.

Before:

gray(level)

After:

level = x
gray(level)

E202 · an unknown function

unknown function … (did you mean …?)

Only the built-in functions can be called; the message suggests the nearest one.

Fix the spelling, or use a function from the cheat sheet.

Before:

gray(sine(x))

After:

gray(sin(x))

E203 · a name that is already a function, table, sprite, palette or control

… is already the name of a … (line …) — pick another name

A value may be set again (v = v * 2 reads the v before it), but functions, tables, sprites, palettes and controls keep their names: neither a value nor another of them can take one. Give it a name of its own.

Give it a name of its own. (A value may be set again, v = v*2, and a layer or function may set a name from outside: only functions, tables, sprites, palettes and controls keep theirs, and none of them takes a value's name.)

Before:

table T = 0.5, 1
T = 2
gray(T[0])

After:

table T = 0.5, 1
k = 2
gray(T[0] * k)

E204 · a word of the language as a name

… is a word of the language; pick another name

The language's own words (loop, layer, part, use, draw, for, table, fn) can't be names; any built-in value or function's name can (it is then yours).

Pick another name: loop, layer, part, use, draw, for, table and fn are the language's own words (any built-in value's name may be yours, and a built-in function's as a value; not a palette's or sun, moon or replay).

Before:

layer = 1
gray(x * layer)

After:

level = 1
gray(x * level)

E205 · a function used as a value

… is a function: write …(…)

A function's name alone is not a value: it needs its brackets and values.

Call it with brackets: name(…).

Before:

gray(sin)

After:

gray(sin(x))

E206 · a palette used as a value

… is a palette: use it as pal(…, k) on the last line

Use it as pal(name, k) on the last line.

E207 · a font used as a value

… is a font: use it as digit(n, x, y, …)

Use it as the font of digit(…).

E208 · a name that is a palette's

… is a palette's name; pick another name

Pick another name.

E209 · a value called like a function

… is a value, not a function

Leave the brackets off.

E210 · a keyword inside a line

… can only start a line

Move it to the start of a line.

E211 · an unknown palette

unknown palette … (there are fire, ocean, ice, chrono, amber, rainbow and gray…)

The palettes are fire, ice, ocean, chrono, amber, rainbow and gray, and the ones the formula makes with palette.

Use one of the listed palettes, or write your own with palette name = #…, #….

Before:

pal(lava, x)

After:

pal(fire, x)

E212 · a palette expected

the first value of … is a palette: fire, ocean, ice, chrono, amber, rainbow or gray

Start with a palette name.

E213 · an unknown blend

unknown blend … (a layer goes over, add, multiply, screen, max or min)

Use one of the listed blends.

E214 · ink(n) without a whole number

ink(n) takes a whole number from 1 to 255: ink(16) is the canvas in 16 levels

Write the number of levels, as ink(16), and draw with inks k/16.

E215 · a function named as a built-in one

…(…) is a built-in function: a fn takes a name of its own

Name the function something else, as fn wave(a) = …. (A value may take a built-in function's name: sin = 0.5, and sin(…) is still the function.)

E216 · a name that is the dotted inputs' group

… is the built-in inputs' name (…); pick another name

Pick another name: sun, moon and replay are the start of the built-in inputs sun.alt, moon.phase, replay.game and the rest.

E217 · since(…) or was(…) of the formula's own value

… is this formula's own value here: …(…) reads a built-in input, so give yours another name

Rename your value (light = …): the formula's own names win everywhere, so since(daylight) would otherwise mean two things on one line.

E218 · a chained comparison

comparisons don't chain: write … and … (… would compare …, 1 or 0, with …)

Join two comparisons with and: 0 < x and x < 0.5 (a comparison gives 1 or 0, so 0 < x < 0.5 would compare that with 0.5).

Placement and levels (E3xx)#

E301 · a frame { } block

there are no frame { } blocks: a value is worked out once a frame by itself when it reads only the time, the clock and the controls; write its lines without the block

There are no frame { } blocks: a value that reads only the time, the clock and the controls is worked out once a frame by itself.

Take the lines out of the block, as they are.

Before:

frame {
  k = t / 8
}
gray(x * k)

After:

k = t / 8
gray(x * k)

E302 · a colour used as a value

#… is a colour, not a number: use it on the last line, as #f80 * k or mix(#000, #f80, k)

A colour such as #f80 is not a number: it goes in the colour line, where it can be dimmed or mixed.

Use the colour in the colour line, not in a number's place.

Before:

v = #f80
gray(v)

After:

v = x
#f80 * v

E303 · a colour outside a layer

with layers, every colour goes inside one: put this line in layer { … }

Once a formula has a layer, each colour belongs to one: a colour line outside them would have nothing to go on.

Put the colour line inside a layer.

Before:

layer { gray(x) }
gray(y)

After:

layer { gray(x) }
layer add { gray(y) }

E304 · a colour function in a sum of colours

…(…) is a whole colour: it can't be combined with others by +, *, ? : or a function (only #… and rgb(r, g, b) can, as c ? #f80 : #000)

Use #… or rgb(…) in the sum, or give the function its own line.

E305 · a colour that can't be summed

…(…) is a whole colour: it can't go into a sum, only be scaled, … * k (#… and rgb(r, g, b) colours can: #fff * k, mix(#000, #f80, k))

Scale it on its own line, or use #… or rgb(…) colours in the sum.

E306 · a colour function that is not the whole line

…(…) is a whole colour: it can only be the last line (of the formula or a layer)

Make it the whole last line.

E307 · a colour inside rgb(r, g, b)

rgb(r, g, b) takes three numbers, not colours: write a colour alone, as #f80 * k

Give rgb(r, g, b) three numbers, or write the colour on its own.

Limits (E4xx)#

E401 · a formula that is too long to read

too long: a formula can be … bytes at most

Shorten the formula.

E402 · too many steps

this formula is too long for the panel: … steps (per frame …, draw …, per row …, per pixel …), the limit is … (or: … — simplify it)

The panel works a formula out for 4,096 pixels at every frame, so the steps a formula takes are limited. Values that change less often (once a row, once a frame) cost much less: move what you can out of the pixel.

Simplify the formula: fewer or simpler steps.

E403 · too many live values

this formula holds more than … values at once (the panel's registers): use each sooner

Set fewer names, or use each value sooner.

E404 · too many numbers

this formula needs … numbers and once-a-frame values, more than the … it can hold (steps: per frame …, draw …, per row …, per pixel …): use fewer

Use fewer different numbers and steps: the section with the most steps is the place to look.

E405 · nested too deeply

this is nested too deeply — split it into named steps

Split it into named steps, name = ….

E406 · a loop time out of range

the loop must be between 0.1 and 3600 seconds

Use a loop between 0.1 and 3600 seconds.

E407 · a layout fault internal

this formula could not be laid out (a bug in Psi) — please report it

Internal: a bug in Psi: please report it, with the formula. It is never the formula's fault.

Report it with the formula.

E408 · not enough memory

not enough memory for this Formula right now

The panel didn't have the memory to compile this Formula just then (a GIF, a look or a transition was holding it): not the formula's fault. It plays when it is next due; a shorter formula needs less.

Try again, or make the Formula smaller.

Layers (E5xx)#

E509 · a layer inside a layer

a layer can't go inside another — close this one with } first

Close the first layer before starting another.

E510 · a layer without a colour

this layer ends without a colour: its last line is rgb(…), hsv(…), pal(…) or gray(…)

End the layer with a colour.

Version (E6xx)#

E601 · a newer Psi

this formula needs a newer OpenDMD: it is written for Psi …, this one has Psi …

Update OpenDMD, or write the formula for an older Psi.

E603 · a bad psi version

psi takes the language's version, a whole number: psi 1

Write psi 1.

E604 · psi not on the first line

psi 1 goes on the formula's first line

Move psi 1 to the first line.

The draw stage, paint and functions (E7xx)#

E701 · draw { } or a table inside a layer

draw { } goes at the top of the formula, not inside a layer

Move it out of the layer, to the top of the formula.

E702 · a second draw { } block

there can be one draw { } block (functions that draw are called inside it)

Merge the draw { } blocks into one.

E703 · a bad for line

for takes a name and a count, e.g. for k < 12 { … } (a whole number from 1 to 1024)

Write for k < 12 { … } with a whole count from 1 to 1024.

E704 · too many loop turns

this formula draws too much a frame (… loop turns in all; the limit is …) — fewer or shorter loops

Use fewer or shorter loops.

E705 · for nested too deep

for loops go two deep at most

Use at most two for loops, one inside the other.

E706 · drawing outside draw { }

…(…) draws: it goes on a line of its own inside draw { }

line and dot draw into the frame's ink once a frame, so they live in draw { }; the pixels read what they drew as ink.

Put the line inside draw { }.

Before:

line(0, 0, 127, 31)
gray(1)

After:

draw {
  line(0, 0, 127, 31)
}
gray(ink)

E707 · a table that is not numbers

a table holds numbers only, as in table T = 1, -2, 0.5

Write only numbers in the table.

E708 · a per-pixel value in draw { }

draw { } runs once a frame, before any pixel, but … (line …) is per pixel: it reads … (or: but this uses … (…))

draw { } runs once a frame, before the pixels: there is no pixel position there. Work in pixels, with numbers and the time.

Use only values that are the same everywhere inside draw { }.

Before:

draw { dot(x, 1) }
gray(ink)

After:

draw { dot(t * 16, 1) }
gray(ink)

E709 · a loop counter set twice

… is a loop counter: it can't be set (or: … is already a loop counter here)

Use another name.

E710 · a table read wrongly

…[…] reads a table, and … is not one

Read a table with NAME[k].

E711 · a table without a name

a table needs a name, as in table T = 1, 2, 3

Name the table.

E712 · the wrong values for line or dot

line takes x0, y0, x1, y1 (pixels from the top left) and, if you like, the ink at each end (0 to 1): … given (dot: x, y and, if you like, its ink)

Give line four values and dot two.

E713 · a line that does not belong in draw { }

inside draw { } go name = value, for k < N { … }, if c { … } and drawing: line, dot, pset, rect, rectfill, circ, circfill, trifill, cls, spr, print

Use only those lines inside draw { }; the colour line goes after it.

E714 · ink without draw { }

ink needs a draw { } block to read from

Write a draw { } block that draws what ink reads.

E715 · for outside draw { }

for goes inside draw { }: draw { for k < 12 { … } }

Put the loop inside draw { }.

E716 · a table without [k]

… is a table: read one of its numbers, …[k] (k from 0)

Read a number of the table with NAME[k].

E720 · too many colours to paint with

a formula paints with … colours at most (each of a palette's 32 counts)

Paint with fewer colours: a palette used in pal(P, v) takes 32 of the 127.

E721 · not a colour to paint with

a colour to paint with is #… (as #f80), pal(palette, v) or gray(v)

End the call with a colour: #f80, pal(fire, v) or gray(v) (for brightness into ink, line and dot take a number).

E722 · spr of something that is not a sprite

spr draws a sprite: spr(name, x, y), its name a sprite name { … }'s

Name a sprite block, as spr(ship, x, y).

E723 · spr without its place

… takes a sprite and its place

Give the sprite's place: spr(ship, x, y), and maybe a flip (1 across, 2 down, 3 both).

E724 · a text too long to print

print writes 32 characters at most

Split the text into two prints.

E725 · no room for a text

this text doesn't fit: tables, sprites and texts hold 1024 numbers in all

Use shorter texts, or fewer tables and sprites.

E726 · a font print doesn't have

print's font is normal, small or (for a value) bold

Write normal, small or, for a number, bold.

E727 · something after a paint call's values

…: expected ) here

Close the call after its colour (and, for print, its font and digits).

E740 · a function written wrongly

a function is fn name(a, b) = value, or fn name(a, b) { … } for lines that draw

Write fn name(a, b) = value, or fn name(a, b) { … } around lines that draw.

E742 · a function's value that is not a name

a function's values are names: fn name(a, b) = …

Name each value the function takes: fn ring(cx, r) = ….

E743 · a function with no body

after a function's values: = value, or { … } for lines that draw

Put = value after the brackets, or { … } around lines that draw.

E744 · an empty function

function … has nothing in it

Write what the function works out, or the lines it draws.

E745 · a function calling itself

… calls itself: a function can't (there are no loops of calls)

Use a for loop in draw, or write the steps out.

E746 · a drawing function used as a value

… draws: call it on a line of its own inside draw { }

Call it on its own line in draw { }: palm(30, 31, 1).

E747 · more than one value on a function's last line

function …'s last line is one value: fn …(…) = value

Write one value after =, or use { … } for lines that draw.

E748 · a value function called as lines

… is a value, not lines that draw: use it in one, v = …(…)

Use it in a value, v = name(…), or in a call's values.

E749 · too many calls

this formula calls its functions too many times over — simplify it

Call a function fewer times, or set its value once as a name and use the name.

E750 · a part

there are no parts: write a function, fn p(x, y) { … }, and call it, p(x*2, y)

Write fn p(x, y) { … } with the part's lines; draw it with p(x, y) as the last line.

E751 · a value before a function's last line

only a function's last line is its value: set a name here (v = …), or move it last

Set a name on each line but the last: v = ….

E752 · a whole-colour function inside a value

…(…) is a whole colour: use it alone on the colour line (only #… and rgb(r, g, b) go into sums)

Use it alone as the last line, or make its last line #… or rgb(…) so it can be mixed.

Frame rate (E8xx)#

E801 · a bad fps

fps is 25, 50 or 100 (every refresh is 100: or write smooth)

The panel draws a Formula every refresh of its scan (smooth, or fps 100), every 2nd (the default, fps 50) or every 4th (fps 25); nothing in between.

Write smooth for every refresh, or fps 100, fps 50 or fps 25.

Before:

fps 60
gray(x)

After:

smooth
gray(x)

E802 · smooth or fps inside a layer

the rate (smooth or fps) is the whole formula's: put it on a line of its own, outside the layers

Move the smooth or fps line out of the layer.

E803 · the rate set twice

the rate is already set: keep one smooth or fps line

Keep one smooth or fps line.

Growing values, sprites, palettes, slow layers and declarations (E9xx)#

E901 · a value that grows without end

t grows without end in loop forever, and this can't take it: use frac(t*k), t % n, sin(t*k), noise(t*k, y, z), a comparison, min, max or smoothstep

In a loop forever formula t grows without end, and most arithmetic on it would lose its precision or overflow. Wrap it first: frac, %, sin and noise keep it in range.

Use frac(t*k), t % n, sin(t*k) or similar in its place.

Before:

loop forever
gray(t*x)

After:

loop forever
gray(frac(t/4 + x))

E902 · too many noises of growing values

noise of values that grow without end: four different ones at most — share one, as noise(u + k, …)

Share one noise between the places that need it.

E903 · seed outside loop forever

seed is for formulas that go on without repeating (loop forever): a new one each time it plays

Add loop forever, or leave seed out.

E904 · too many growing values

this formula has too many values that grow without end (more than …): share one, as frac(u*k) of one u

Use fewer values that grow without end.

E905 · a colour fed a growing value

a colour can't take a value that grows without end and changes across the panel (t in a loop forever formula): use frac(…) of it, or min(t/k, 1) (or: …, as v (line …) does: use frac(v) or min(v/k, 1))

A colour has to be worked out from values that stay in range; t in a loop forever formula does not.

Wrap it in frac(…), or limit it with min(t/k, 1).

Before:

loop forever
v = t + x
gray(v)

After:

loop forever
v = frac(t/8 + x)
gray(v)

E906 · drawing at a growing value

a value that grows without end can't be drawn at: use frac(t*k)*128, t % n or min(t, k)

Use frac(t*k)*128, t % n or min(t, k) as the place.

E907 · a growing value with a per-pixel part

a value that grows without end plus a part per pixel or row only goes into frac, sin, cos, tri, saw, sqr, noise, % or a multiply: add the pixel's part there, as frac(t*k) + x or sin(t*k + x)

Add the pixel's part inside frac, a wave or noise: frac(t*k) + x, sin(t*k + x).

E908 · phase in loop forever

phase is the position in the loop, and loop forever has none: use frac(t/k), a place that comes round every k seconds

phase is t divided by the loop's length, and a loop forever formula has no length to divide by.

Give the formula a loop N line, or write frac(t/k) with a period k of your own.

Before:

loop forever
gray(frac(x + phase))

After:

loop forever
gray(frac(x + t/8))

E910 · a sprite's key too long

a sprite's key has 16 characters at most

Use at most 16 characters in the key.

E911 · a sprite inside a layer

a sprite goes at the top of the formula, not inside a layer

Move the sprite out of the layer.

E912 · a sprite without its key

a sprite starts with its key: key . 0, R 1, D 2 (each character, then the number it reads as)

Start the sprite with a key line.

E913 · a bad key entry

a key entry is a character (not ; { } , - / or a space) and its number, as R 1 or . -0.5, separated by commas

Write each entry as a character, a space and its number, with commas between.

E914 · a character not in the key

… is not in the sprite's key

Add the character to the key, or change the row.

E915 · sprite rows of different widths

a sprite's rows are as wide as its first (… characters), at most 64

Make every row as wide as the first, at most 64.

E916 · a sprite with no rows or too many

a sprite has 1 to 32 rows of characters, after its key

Use 1 to 32 rows.

E917 · a sprite without [u, v]

… is a sprite: read its pixels, …[u, v] (column, row from its top left)

Read the sprite at a column and a row, NAME[u, v].

E918 · a sprite read wrongly

a sprite is read at a column and a row: …[u, v]

Read a sprite with NAME[u, v].

E919 · a sprite never closed

this sprite { is never closed — add } on a line of its own

Add a } on a line of its own.

E920 · a character twice in the key

… is in the key twice

Keep one entry for each character.

E921 · a palette inside a layer

a palette goes at the top of the formula, not inside a layer

Move the palette out of the layer.

E922 · a palette of the wrong size

a palette is 1 to 32 colours: palette sea = #003, #06c, #fff (pal(sea, 0) is the first, pal(sea, 1) the last)

Write 1 to 32 colours, each as #f80.

E923 · too many palettes

a formula can have … palettes of its own at most

Use fewer palettes (a palette in a tween's half takes half of one).

E924 · too many numbers in tables and sprites

tables and sprites hold 1024 numbers in all — this would make …

Make the tables and sprites smaller.

E925 · a palette's colour named twice

… already names a colour of …: give this one another name

Give each named colour of a palette its own name.

E926 · a palette's colour named n or step

n and step are every palette's own (….n, ….step): name this colour another way

Pick another name for the colour: P.n is the palette's count and P.step the step between colours.

E927 · an unknown colour of a palette

palette … has no colour named …: name it in its line, as … #f80

Name the colour on the palette's line (palette road = black #000, kerb #806), or use another of its names.

E931 · cycle turned by a value that changes along a row

cycle turns a whole row at once (by t, a frame value or py), but … (line …) is per pixel: it reads …

cycle turns a whole row's palette at once, so how far it turns can change with the time or the row, not along the row.

Turn it by t, a value of t, or py.

Before:

cycle(fire, x, x)

After:

loop 4
cycle(fire, x, t/4 + y)

E932 · cycle or tween of gray

cycle turns a palette of colours, and gray is not one: write your own, palette g = #000, #fff

Write your own palette.

E933 · too many palettes with cycle

a formula has room for … palettes that pal and cycle read: its own (… here) and each palette cycle turns by another value (… here)

Read fewer palettes with pal and cycle (tweens may read more), or turn fewer by different values.

E934 · cycle without its turn

expected , and the turn (as in cycle(fire, v, t/4)) here, found …

Write the turn after the picture: cycle(palette, v, turn).

E935 · the wrong values for pal or cycle

… takes a palette (and how much of the pixel it covers, 0 to 1, if you like); found …

Give it a palette and a value (cycle also takes the picture and the turn).

E936 · a tween mixed by a value that changes across the panel

tween mixes a palette once a frame (by t or a frame value), but … (line …) is per pixel: it reads …

Mix it by t, a value of t, a slider or another once-a-frame value.

E937 · a palette's half of the wrong palettes

a palette's half is a tween of palettes of your own with 16 colours at most: … is not one

In a half, tween palettes of your own of 16 colours or fewer (tweens of them inside are fine).

E938 · a tween painted with

… is a tween, worked out every frame: paint takes a palette of colours (palette p = #000, #fff)

Paint with a palette of colours, or with pal(P, v) of one of the tween's palettes.

E939 · tweens nested too deeply

the tweens need more than … palettes worked out at once: nest them less deeply, or tween fewer palettes that only tweens read

Nest tweens less deeply (a tween as the first palette costs nothing), or read the palettes they make with pal.

E941 · rate above the bottom

rate goes on the bottom layers only: the first layer, or the first few one after another

Put rate on the bottom layers only.

E942 · a bad rate

rate takes a whole number of frames, 2 to …: layer rate 4 { … } is redrawn every 4th frame

Write a whole number from 2 to the limit.

E943 · different rates

the slow layers share one rate: give each the same number

Give the slow layers the same rate.

E944 · a rate layer reading the picture

a rate layer is drawn on its own: it can't read ink, ur, ug, ub or ul

Do not read ink, ur, ug, ub or ul in a rate formula.

E946 · rate before the blend

write the blend first: layer add rate 4 { … }

Write the blend, then rate.

E947 · only rate layers

a rate layer is the slow one under a layer that moves: add a layer above it, or leave rate out

Add a layer above, or leave rate out.

E948 · a bottom rate layer that does not cover

the bottom rate layer draws the whole panel: make it cover everything (layer rate N { … } with no blend and no coverage)

Leave the blend and the coverage off the bottom rate layer.

E951 · a declaration below other lines

… goes in the formula's header, at its top among the name, about, control, look, loop and smooth lines, before its other lines

The header (name, about, control, look, loop, smooth, in any order) says what the formula is, so it comes first, before anything it works out.

Move it up into the header, the lines at the top (any order there).

Before:

loop 4
v = x
name "Late"
gray(v)

After:

loop 4
name "Late"
v = x
gray(v)

E952 · a declaration twice

… is already set on line …

Keep one line.

E953 · text in quotes not closed

text in quotes ends with " on the same line

Close the quotes on the same line.

E954 · a character that can't be in quotes

text in quotes can't have <, >, \ or a control character (a tab too) in it

Take it out.

E955 · text too long

too long: this text can be … characters at most

Shorten the text.

E956 · text missing

this takes its text in quotes, e.g. name "Sunrise"

Write the text in quotes.

E957 · a bad control line

a control is control NAME lo..hi = default "Label" or control NAME = word, word, …

A control is a slider (control NAME lo..hi = default "Label") or a row of buttons (control NAME = word, word).

Write it as shown.

Before:

control k 1 = 2
gray(k)

After:

control k 0..2 = 1 "Level"
gray(k / 2)

E958 · too many controls

a formula has three controls at most (a, b and c)

Keep three controls at most.

E959 · a range that does not go up

a range goes from the lower number to the higher, e.g. 0..1

Write the lower number first.

E960 · a default outside the range

the default is outside the control's range

Choose a default inside the range.

E961 · a choice of the wrong size

a choice has 2 to 6 words

Give 2 to 6 words.

E962 · a word twice in a choice

… is a choice already

Use each word once.

E963 · a control out of its slot

… is the … control's letter: give this one another name (controls take a, b, c in order)

Name it something else, or put it in its slot.

E964 · a bad look line

look takes a blend (over, screen, add, multiply, max or min) and an amount from 0 to 100

Write look, a blend and an amount from 0 to 100.

E965 · a blend on a formula with layers

a formula with layers goes over the GIF as a look: write look or look over N

Write look or look over N.

E966 · a choice word that is not a name

a choice is words (names) between commas: control NAME = word, word, …

Write names between commas.

E967 · more than a declaration takes

expected the end of the … line, found … (one declaration a line)

Put one declaration on a line.

E968 · an unknown blend in a look

a look's blend is one of over, screen, add, multiply, max, min

Use one of the listed blends.

E969 · text that hides or reorders

text in quotes can't have characters that hide or reorder text (zero-width, direction marks, line separators)

Take them out.

E970 · a scene's when that changes along a row

a scene's when is worked out once a frame or once a row (by t, a frame value or py), but … (line …) is per pixel: it reads …

Make when a value of t, the clock, the sliders or the row (py, y); choose per pixel inside the scene instead.

E971 · something other than values in a scene

a scene holds values: name = … lines (its colours, drawing and palettes go outside it)

Keep name = … lines in the scene; put colours, draw, layer, palette and another scene outside it.

E972 · too many scenes

a formula can have … scenes at most

Join scenes that share a condition, or pick inside one.

E973 · a rate layer reading a scene

a rate layer can't read a scene's per-pixel values: work them out outside the scene, or leave rate out

Work the value out outside the scene, or leave rate out.

E974 · a table too long

a table holds 256 numbers at most — this one has …: split it in two

Split the table in two and read the second half from the other.

E975 · a built-in input that doesn't exist

….… is not a built-in input: … has …

Use one of the names listed, as sun.alt or replay.game.

E976 · since or was of something that isn't a built-in input

…(…) takes a built-in input's name, as in …(replay.game): …

Give it one of the built-in inputs listed (since and was follow the panel's own values, not the formula's).

E977 · too many built-in inputs

a formula can read … built-in inputs at most (each since and was one more) — this one reads …

Read fewer built-in inputs, or fewer since and was of them.