ACIDCAT . FILE FORMAT REFERENCE

NCW Anatomy

NI Compressed Wave.ncw . Kontakt libraries
rev 2026.07
magic 01 A8 9E D6
endian little
codec lossless blocks
sample 2ch 24-bit 48k

NCW is the sample format inside Kontakt instruments: PCM audio, losslessly compressed. The file is a fixed little-endian header, a block table, and a run of delta/bit-packed audio blocks that reconstruct the original samples exactly. No ASCII magic here; the file opens with the 4-byte sentinel 01 A8 9E D6 (a newer 01 A8 9E D7 writer variant also exists). No official spec; the layout below is field-verified against real Kontakt library content. Hover any field to light its exact bytes and read the decode; click a field with a + to open its table. Color marks kind (see the key).

file regions

Top to bottom, what a reader walks. The audio parameters a producer wants sit in the first 32 bytes; duration follows from them without touching the compressed body.

fixed header0x00 . 120 bytes . drawn below

All integers little-endian. The first 32 bytes carry the magic, the audio parameters, and three offsets that lay out the rest of the file; the remainder of the 120-byte header is zero in all known files. The worked example is 2 channels, 24-bit, 48000 Hz, 439295 samples.

magic01 A8 9E D6 at offset 0, the classic sentinel; 01 A8 9E D7 is a newer-writer variant
audio paramschannels u16 @ 0x08 . bits u16 @ 0x0A . sample_rate u32 @ 0x0C . num_samples u32 @ 0x10
layout offsetsblock table @ the u32 at 0x14, audio data @ the u32 at 0x18, body size in the u32 at 0x1C
cross-checkdata_offset + data_size = file size; 3556 + 1909184 = 1912740 in the worked example
block table0x78 . u32 offsets

Between the header and the audio sits an index: one u32 offset per compressed block, relative to the start of the audio body, plus a final entry marking its end. Random access falls out for free; a player seeks the table, not the stream.

entryu32 little-endian, offset from data_offset
example859 entries at 0x78: 858 blocks plus the end sentinel, ascending from 0 to 1909184
block spaneach block covers 512 sample frames; 858 x 512 = 439296, one frame past num_samples, so the last block runs short
sizingentry deltas give each block's compressed byte size; they vary block to block with the material
compressed audio bodydata_offset . compressed blocks

The samples themselves, packed block by block. Each block is delta/bit-packed: store the differences between neighbouring samples, then keep only as many bits per delta as the block actually needs. Quiet or smooth material packs tight; noise barely shrinks. Decoding reconstructs the original PCM exactly; this is lossless, not perceptual.

unitfixed blocks of 512 samples, each independently decodable via the table
block headereach block opens with 16 bytes: magic 0x3E9A0C16, a base sample, a bit width, a flags word
bit widthsigned: >0 delta-code from the base, <0 store truncated values (no delta), 0 raw uncompressed PCM
stereoflag 0x01 = mid/side; L = mid+side, R = mid-side, decorrelated the way FLAC does it
floatflag 0x02 = the samples are 32-bit IEEE float, not integers (WAV fmt tag 3 on the way out)
guaranteebit-exact PCM out; the WAV that went in comes back whole
readingthe header decodes without touching the body; full PCM requires running the block decoder
reading the header

The header is enough. Four fields in, one division out, and out-of-range values are the tell for a corrupt file.

header decode + validationfirst 32 bytes
readchannels, bit depth, sample rate, sample count from the fixed header
deriveduration = num_samples / sample_rate; 439295 / 48000 = 9.152 s
validatechannels 1-32 . bits in {8, 16, 24, 32} . sample_rate 8000-384000 . num_samples 1 to 2e9
on failurethe file is rejected as corrupt rather than shown with an absurd duration