Skip to content

Palinopsia v1.2.9 : clean sound, sharp projector

Choose a tag to compare

@github-actions github-actions released this 15 Oct 17:08
· 172 commits to master since this release

Palinopsia v1.2.9 : clean sound, sharp projector.

A release for long installations. Sonify no longer clicks : not the Chord, not the
Collage's films starting, stopping and changing, not a change made to the room while
it plays. The projector can enlarge a picture rendered below its size through a
sharper filter, so a lighter render scale keeps its edges and grain crisp on the wall,
and an empty layer no longer costs anything.

Highlights

  • Sharp enlargement (Output → Render scale) : below render scale 1 the projector
    shows the picture enlarged, and the plain enlargement softened every edge and grain
    speck. Turned on, the projector window enlarges it through a sharper filter : edges,
    grain and dust stay crisp, without halos at hard edges. Only the projector's
    enlargement changes, never the picture itself or a recording, and it costs next to
    nothing. Off by default.
  • A ¾ render scale preset.
  • Empty layers cost nothing : a layer with no source and no effect no longer draws
    anything, and the picture stays the same to the last bit. An installation with two
    empty layers runs about 4 % faster at render scale ¾.

Fixed

  • Sonify no longer clicks. The Chord's notes now move smoothly when its picture
    changes, when its number of voices changes or is modulated, and when it is switched
    on and off. The Collage voice's films fade in and out whenever they start, stop,
    change film, are hidden or come back, and no longer click under a busy, churning wall.
    A voice whose mixer filter is engaged no longer clicks when it is switched off.
  • Nothing clicks when you change the room either. Moving, switching or bypassing an
    output EQ band, turning Space or the headphones preview on and off, changing the
    output device and switching Sonify off all fade cleanly. Voices moving on a speaker
    dome glide from speaker to speaker instead of buzzing.
  • The Collage voice is smoother and lighter : a modulated film speed, pieces that
    appear or disappear and films that switch no longer click, and silent films no longer
    cost a decoder.
  • The Collage voice no longer stumbles : v1.2.8 could refuse a film's fade a few
    times an hour (a "setTargetAtTime overlaps setValueCurveAtTime" error in the log),
    which skipped that moment's update of the voice.
  • A recalled scene keeps your output EQ and glue, like a preset does.
  • Tempo sync is lighter, and turning it off brings back the rate you had set.
  • The Collage voice glides with the key sequencer even when the scale changes size.
  • The key sequencer's Picture mode no longer narrows onto a picture nobody is
    looking at.
  • An imported speaker setup with a wide gap no longer silences a voice that falls in it.
  • The output EQ editor is light and steady : it no longer slows the picture while
    open, a click on a point no longer nudges it, the wheel changes Q only over a point,
    the app's one-key shortcuts wait while it is open, and it is no longer see-through
    while the sound is off.
  • Sonify's sliders : a Shift-drag no longer undoes what the key sequencer, a Meta
    knob or MIDI changed meanwhile, and arrow keys move every slider.
  • Space : clicking a voice on the room map no longer moves it, the number boxes
    behave under Shift, and a mistyped renderer address keeps the one before and tells you.
  • The Collage wall : pieces added all at once show a film right away instead of
    black while their own films load.
  • The warp feather only softens the projector's edges when the warp is on.
  • Performance has a Frame capture row (recording, NDI, Spout, the projector).
  • Everything measured at a steady 60 fps with a full Collage wall, every Sonify voice
    and Space on a dome.

Opening an older session

Everything opens as before. Sharp enlargement starts off, and a session with empty
layers draws the same picture to the last bit.

Install

Platform File
Windows Palinopsia-1.2.9-win-x64.exe (installer) or Palinopsia-1.2.9-portable.exe
macOS (Apple Silicon) Palinopsia-1.2.9-mac-arm64.dmg
Linux Palinopsia-1.2.9-linux-x86_64.AppImage or Palinopsia-1.2.9-linux-amd64.deb

Builds are unsigned :

  • Windows : SmartScreen may warn, click More info → Run anyway.
  • macOS (Apple Silicon) : not notarized. Drag Palinopsia into Applications first
    (run from the disk image or Downloads, macOS runs a hidden temporary copy), then run
    xattr -cr /Applications/Palinopsia.app once in Terminal, or open it and click Open
    Anyway
    in System Settings → Privacy & Security. The first launch asks for the local
    network, and for the camera and the microphone when you use them : accept, or OSC, NDI
    and light output stay silent. Screen capture is the one permission macOS never prompts
    for : switch Palinopsia on under Privacy & Security → Screen & System Audio Recording,
    then start it again.
  • Linux : chmod +x the AppImage, then run it.

Intel Macs (x64) : this release ships Apple Silicon only. On an Intel Mac, build from
source (npm install, then npm run build:mac).

For developers

  • Frame-pacing measurements : OPSIA_UNTHROTTLED=1 bash tools/test-build.sh builds
    a test copy Chromium never slows down when its window is covered (otherwise a covered
    window draws one frame a second and every measurement is meaningless).

  • A Sonify drawing loop checks sonifyCovered() (sonifyUi.tsx) and rests while
    another page covers the page; theme colors for a canvas come from themeVar(), read
    once per theme.

  • Fading an AudioParam : schedule it a little ahead and use setTargetAtTime.
    param.value read on the main thread lags the audio thread (a curve started from it
    jumps), and a linearRampToValueAtTime on a param with no automation event yet ramps
    from time 0 (an instant jump). collageVoice.ts fade() does it right.

  • A media element's "ready" is not "sounding" : its sound reaches the graph tens of
    milliseconds after play(); CollageVoice.sounding() waits until its position has
    moved on.

  • Never nudge playbackRate for sync : every change restarts the element's
    pitch-keeping time-stretch, a click; re-sync with a crossfaded splice instead.