Frames and playback

Frame navigation, compressed rows, timing and the displayed image.

A Flipnote is a sequence of frames. The PPM frame-offset table points to encoded frame data; an encoded frame can refer to the previous image, so decoding a random frame may require previous state. The image is 256 × 192 with two layer planes and per-frame paper and ink colours. Line encoding and frame translation reduce the stored size. [1][2]

Navigation versus presentation

Studio handles frame navigation, row decoding and on-screen composition in separate routines. The guide follows each one, including the difference between the editor's working buffer and the final displayed image. Playback also tracks time and triggers sound effects as frames advance. [1]

Speed and sound

The format records frame speed and the speed used when background music was recorded. If playback speed changes later, the background music rate needs corresponding adjustment; sound effects are treated separately. This is a common source of pitch errors in third-party players and encoders. [2]

Frame index, decoded image and clock

The animation's last-frame index is stored separately from the compressed frame bytes. A player must read the frame-offset table, decode rows and advance according to the recorded playback speed. A frame selected in the editor is not necessarily the frame scheduled by the playback clock. [1][2]

Incremental decoding

PPM frames can depend on earlier content and can use per-layer shifts. A decoder should respect the frame header and offset bounds rather than treating each frame as a stand-alone raw bitmap. Hidden layer bits affect presentation; they do not mean the layer bytes can be discarded. [1][2]

Sound effects are frame events

The per-frame sound-effect flags sit after the encoded frame payload. Playback evaluates them as the playhead crosses frames, while the three sound tracks are stored later in the audio region. Looping must restart timing and event scheduling together or sounds will drift past the visual loop. [1][2]

Document navigation functions

OperationJP V1JP V2US V2EU V2
Previous0200E380020123D00201237C020123F8
Next0200E2A0020122F00201229C02012318
Delta replay0200F04C0201309C02013048020130C4
Absolute decode0200F1F402013244020131F00201326C

At position zero, Previous returns without copying or drawing. Otherwise it may apply an ordinary delta, or reconstruct an earlier absolute image and replay intervening differences. Next copies its prior working image first; an absent next-frame entry clears the destination only when a retain-if-missing input is zero. Header bit 0x40 introduces signed translation bytes for difference reconstruction. The original navigation routine calls the output getter twice around rendering, so collapsing those reads into one can change behaviour if another call mutates state. [1]

Encoding a frame and choosing its type

The V2 format-4 encoder has 596-byte ARM bodies at JP 02012BE4, US 02012B90 and EU 02012C0C. It writes a frame header, optional signed translation, a 96-byte row-kind table and selected row payloads. The checked maximum output size is 12,387 bytes. The tested cases matched both the output bytes and rejection when output space was insufficient. The code that chooses between absolute, delta and translated frames has not been completely recovered. Matching the encoder's output does not establish how Studio makes that choice. [1]

FrameEditor is a distinct scene

V2 FrameEditor mode 11 uses a 144-byte scene object, five retained thumbnails and an animated sixth, with its own scroll, insert/delete and clipboard state. US constructor is 0203E0C8, update 0203EC58, draw 0203F210 and delete 0203FC34. Its clipboard is a packed 0x3000-byte image, not just a list of frame indexes; full paste and merge paste are different paths. When restoring working pixels, the scene's renderer requests full replacement rather than the normal editor's lower-bit preservation. [1]

Presentation frame is not a Flipnote frame

The application's Begin and End routines maintain display-record queues on each screen refresh. They can finalise bucket and matrix records without selecting a new PPM frame. Conversely, document Previous/Next can decode image data before a later display upload. Name these two clocks explicitly when debugging dropped visuals or delayed sound. [1]

Sources

  1. [1] Flipnote Decompilation Project — Frames, navigation and playback
  2. [2] Flipnote Studio Docs — PPM format

← All documentation