Monkey's Audio: Difference between revisions
(extension) |
(FFmpeg now supports Monkey's Audio.) |
||
(6 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
* Extensions: ape | * Extensions: ape | ||
* Website: | * Website: http://www.monkeysaudio.com/ | ||
* Theory/Whitepaper: | * Samples: http://samples.mplayerhq.hu/A-codecs/lossless/ (luckynight.ape) | ||
* Theory/Whitepaper: http://www.monkeysaudio.com/theory.html | |||
Monkey's Audio is a lossless audio coding algorithm. | 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 <i>k</i> is calculated based on previous coded values and splitting it into <i>k</i> 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 | |||
[[Category:Container Formats]] | |||
[[Category:Audio Codecs]] | [[Category:Audio Codecs]] | ||
[[Category:Lossless Audio Codecs]] | [[Category:Lossless Audio Codecs]] | ||
Latest revision as of 03:50, 17 September 2007
- Extensions: ape
- Website: http://www.monkeysaudio.com/
- Samples: http://samples.mplayerhq.hu/A-codecs/lossless/ (luckynight.ape)
- Theory/Whitepaper: http://www.monkeysaudio.com/theory.html
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