Monkey's Audio

From MultimediaWiki
Jump to navigation Jump to search

Monkey's Audio is a lossless audio coding algorithm.

General Details

Header (all data is little-endian):

 4 bytes - 'MAC '
 2 bytes - version (3920 == version 3.92)
 2 bytes - compression level

Compression levels:

  • 1000 - fast
  • 2000 - normal
  • 3000 - high
  • 4000 - extra high
  • 5000 - insane

The rest of header data depends on file version but all of them contain information about sound parameters (number of channels, sampling rate) and internal structure (number of frames, seek table and even possible WAV header).

Audio data is packed with channel decorrelation, applying 1-3 IIR filters of different order and range coding of residual.

General Decoding Process

 read one frame of data
 unpack array of delta values from it
 if this is stereo signal then unpack the second array of delta values
 for each array
   apply all IIR filters onto values
 if this is stereo then do channel correlation
 output data

Residual Coding

Each value is coded by dividing into some parts (parameter k is calculated based on previous coded values and splitting it into k lower bits and higher bits) and coding each part separately with range coder.

IIR Filtering

This is relatively easy but computational-hungry part

 for each value
   in = delta[0]
   t = 0
   for i=0..order
     t += delta[-order + i] * par[i]
   if in < 0 
     for i=0..order 
       par[i] -= delta[i]
   if in > 0 
     for i=0..order 
       par[i] += delta[i]
   out = in + t
   correct delta[] array - different for many versions

Channel Correlation

In general case restoring of channels L and R from decorrelated values X and Y is done by this formula:

 R = X - Y/2
 L = R + Y