cam(...) — the camera, as a picture and as signals
cam() shows the camera on the stage and measures its picture: how much of
it moves, how bright it is, where the movement is, and each burst of
movement, for follow() and trig: as a sound's signals are.
cam() the camera, the whole view, mirrored (as a selfie view)
cam(uid:eye, at:[0.75, 0.3], size:0.3) in a corner: at: 0..1 of the view, size: a share of it
cam(eye, cell:5) in a cell of the grid (grid(3, 2) first)
cam(flip:0) not mirrored
cam(fit:contain) the whole picture in its frame, bars round it (cover by default: filled, cropped)
cam(opacity:0.4) faint; opacity:follow(bass.level, 0.2, 1)
cam(show:0) not drawn: its signals only
cam(uid:eye, off:1) that one gone
cam(off) every camera gone, and the camera let go
The name (uid:, or the first word: cam(eye, ...)) is cam when none is
given. Every cam() shows the same camera; the browser asks for it once.
Signals
Published under its name, about 30 times a second:
| signal | |
|---|---|
cam.motion |
the share of the picture that moved since the last frame, 0..1 -- up at once, down over about half a second |
cam.level |
the same against its own most lately, 0..1, as a sound's level: follow(cam.level, lo, hi) reaches hi in any room |
cam.bright |
how bright the picture is, on average, 0..1 |
cam.x, cam.y |
where the movement is: 0..1 across (as shown: mirrored unless flip:0) and down; kept where they were while nothing moves |
cam.hit |
a burst of movement: motion rising well above what it has been lately -- trig:cam.hit, every(4, cam.hit) |
cam.n |
the bursts counted |
The picture is measured on a 32 x 24 copy of each frame. A spot counts as moving when its brightness changes by more than about a twelfth: a camera's own flicker is not movement, so a still room reads 0.
synth(uid:air, wave:pink, filter:{type:bp, freq:follow(cam.y, 3000, 150), q:8}, amp:follow(cam.level, 0, 0.12))
synth(uid:pad, wave:saw, freq:110, pan:follow(cam.x, -1, 1), amp:0.03)
stars > rotate(rand(0, 360), dur:0.3, trig:cam.hit)
grid(shuffle, trig:every(4, cam.hit))
screen(kaleido:6, turn:follow(cam.x, 0, 360))
screen(hue:follow(cam.bright, 0, 360))
On the stage
gui() gives the picture a box's effects, as it does a picture of
image():
gui(eye, hue:120, blur:4, pixel:8, warp:20)
gui(cam, invert:follow(cam.hit, 0, 1))
screen()'s effects take it with the rest of the stage. For
screen(kaleido:N) on a wide screen, give the camera a frame bigger than the
screen -- cam(size:2.4): the fold takes its wedge from the top of the stage,
which ends short of the corners, and the part of the picture past the edge
fills them.
A grid's shuffle and turn move a camera in a cell as they move the rest.
In a score
The cue's element is the frame, as for image(): draw a
rect in Inkscape where the camera should be, give it the id cam() (or
cam(uid:eye, fit:contain)), and the picture fills it when the cue fires;
the rect is hidden under it. cam(off) (on another element, or a button)
takes it away and gives the rect back. A cam(show:0) anywhere in the score
measures the camera without drawing it.
Asking for the camera
The browser asks the performer for the camera the first time, and only after
something they did -- a click, a key, a line run from the console. A cam()
the playhead fires as the page loads may be refused; start it from a
button() or the console. What went wrong is said in
plain words (in the console's output in Oscilla Live): no camera, the camera
refused (allow it at the left of the address bar), the camera held by another
program, or a page that is not secure (http on another machine: open it over
https, or on localhost).
The camera's own sound is not used: for sound in, see adc().
Tip: use ← → or ↑ ↓ to navigate the docs