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
| Operation | JP V1 | JP V2 | US V2 | EU V2 |
|---|---|---|---|---|
| Previous | 0200E380 | 020123D0 | 0201237C | 020123F8 |
| Next | 0200E2A0 | 020122F0 | 0201229C | 02012318 |
| Delta replay | 0200F04C | 0201309C | 02013048 | 020130C4 |
| Absolute decode | 0200F1F4 | 02013244 | 020131F0 | 0201326C |
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]
