Sound and recording

Background music, three sound effects, ADPCM and recording controls.

The PPM sound section carries one background-music track and three sound-effect tracks. A per-frame flag stream marks which effects play on a given frame. The tracks use ADPCM data; an audio header records lengths and speed values. A parser must respect the declared lengths and the original storage order rather than searching for a waveform marker. [1][2]

The SoundEditor

The original SoundEditor uses a shared sound manager, with separate routines for recording and playback. The research follows its controls, the components that manage audio streams, ADPCM processing and microphone calls. Some timing and service behaviour has only been checked in particular builds or test cases; the relevant findings state those limits. [1]

Playing at a different speed

Background music was recorded against a frame rate. If the animation's current speed differs, playback must account for both rates. Applying the same correction to sound effects would be a different operation. Compare output at several frame speeds when validating a player. [2]

Music and effects use different timing

A PPM can contain one background-music track and three sound-effect tracks. The animation speed and the BGM recording speed are distinct fields in the audio header. Playback that assumes they are always equal can change the pitch or duration of recorded audio. [1][2]

Capture is not file storage

The original sound editor handles microphone input, audio streams, recording controls and the transfer of recorded audio into the document. The audio samples are encoded before serialisation, and track lengths in the PPM header describe the stored bytes. The original V2 serialiser rounds each emitted track length to an even number; Japanese V1 uses the raw length. Padding may expose pre-existing buffer bytes, so a byte comparison must account for the exact original path. [1][2]

Player checklist

Decode the track data, honour the two speed fields, schedule sound-effect triggers from frame flags, and reset both clocks on seek or loop. Test a note with silent BGM but active effects; a note with only BGM; and one with unequal animation and audio speeds. [1][2]

V2 SoundEditor functions

SoundEditor is scene mode 9, factory 8, primary slot 8, with a 104-byte scene object. It has named controls for BGM, SE1, SE2, SE3, MixButton and FrameMix. In US V2, construction is 020546D8, activation 02054954, update 02054A18, input dispatch 02054E8C, preview 0205544C, record 0205558C and save wait 02055638. The large input callback branches on populated versus empty tracks, recording and deletion states, and exit; an event from a button is only the first step. [1]

Shared sound slots

The V2 common manager has eight 20-byte slots. A slot tracks a handle, keepalive, archive ID, sequence ID and fade count. A non-null handle does not by itself prove sound is still audible. Update reduces positive keepalive and stops a slot at zero, or detaches a player that has already completed. One stop operation targets every slot with a given sequence ID, not a single SDK pointer. This separates short UI sounds from the Flipnote's recorded tracks. [1]

Playback control and regional timing

The V2 recording/playback object is 16 bytes and refuses to start playback while recording. A populated BGM track configures ADPCM; even an empty one starts an alarm. US V2's period calculation is at 020263DC, start 02026534, frame-effect trigger 020267A0 and frame clock 02006A60. The framework counter and countdown live at +0x40/+0x1A in JP/US V2, but +0x44/+0x1C in EU V2. The callback increments the counter with unsigned wrap, and frame events are ordered with cursor movement, rendering, effect triggers and loop or end cleanup. [1]

Recording limits that matter to a codec

US V2's mapped codec entries include ADPCM encoder 02005508 and decoder 02005634; the microphone's main and effect starts are 02025D98 and 02025E90. The effect-start routine has three effect indexes and an 8,192-byte capacity. The wave descriptor has a 12-byte header before ADPCM bytes. For odd sample counts, the encoder writes the remaining low nibble but reports a byte count rounded down to complete bytes. Observed sampling evidence includes 8,180 Hz and timer period 4,097. These values were checked in original code. Hardware testing is still needed; one desktop playback cannot confirm the console's timing and output. [1]

The complete JP V1 SoundEditor path, original SDK microphone stop timing, overdub/resampling and actual speaker phase remain outside this verified V2 map. The four stored PPM track slots and speed values are explained separately in PPM sound data. [1][2]

Sources

  1. [1] Flipnote Decompilation Project — SoundEditor, recording and audio clocks
  2. [2] Flipnote Studio Docs — PPM format

← All documentation