mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-11 05:31:51 +09:00
doc: more details in mp2 coding
This commit is contained in:
@@ -46,6 +46,7 @@ function prepare(fullPath) {
|
|||||||
|
|
||||||
function readBytes(length, ptrToDecode) {
|
function readBytes(length, ptrToDecode) {
|
||||||
if (length <= 0) return
|
if (length <= 0) return
|
||||||
|
// serial.println(`readBytes(${length}); readCount = ${readCount}`)
|
||||||
let ptr = (ptrToDecode === undefined) ? sys.malloc(length) : ptrToDecode
|
let ptr = (ptrToDecode === undefined) ? sys.malloc(length) : ptrToDecode
|
||||||
let requiredBlocks = Math.floor((readCount + length) / 4096) - Math.floor(readCount / 4096)
|
let requiredBlocks = Math.floor((readCount + length) / 4096) - Math.floor(readCount / 4096)
|
||||||
|
|
||||||
@@ -53,7 +54,6 @@ function readBytes(length, ptrToDecode) {
|
|||||||
|
|
||||||
let completedReads = 0
|
let completedReads = 0
|
||||||
|
|
||||||
// serial.println(`readBytes(${length}); readCount = ${readCount}`)
|
|
||||||
|
|
||||||
for (let bc = 0; bc < requiredBlocks + 1; bc++) {
|
for (let bc = 0; bc < requiredBlocks + 1; bc++) {
|
||||||
if (completedReads >= length) break
|
if (completedReads >= length) break
|
||||||
@@ -119,10 +119,20 @@ function readShort() {
|
|||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function readOneByte() {
|
||||||
|
let b = readBytes(1)
|
||||||
|
let i = sys.peek(b)
|
||||||
|
sys.free(b)
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
|
||||||
function readFourCC() {
|
function readFourCC() {
|
||||||
let b = readBytes(4)
|
let b = readBytes(4)
|
||||||
let s = String.fromCharCode(sys.peek(b), sys.peek(b+1), sys.peek(b+2), sys.peek(b+3))
|
let a = [sys.peek(b), sys.peek(b+1), sys.peek(b+2), sys.peek(b+3)]
|
||||||
sys.free(b)
|
sys.free(b)
|
||||||
|
let s = String.fromCharCode.apply(null, a)
|
||||||
|
// serial.println(`readFourCC: ${s}; ${a.map(it=>"0x"+it.toString(16).padStart(2,'0')).join()}`)
|
||||||
|
if (s.length != 4) throw Error(`FourCC is not 4 characters long (${s}; ${a.map(it=>"0x"+it.toString(16).padStart(2,'0')).join()})`)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,4 +155,4 @@ function getReadCount() {
|
|||||||
return readCount
|
return readCount
|
||||||
}
|
}
|
||||||
|
|
||||||
exports = {fileHeader, prepare, readBytes, readInt, readShort, readFourCC, readString, skip, getReadCount}
|
exports = {fileHeader, prepare, readBytes, readInt, readShort, readFourCC, readOneByte, readString, skip, getReadCount}
|
||||||
@@ -415,7 +415,7 @@ Packet Types -
|
|||||||
32 | 0 | 1
|
32 | 0 | 1
|
||||||
48 | 2 | 3
|
48 | 2 | 3
|
||||||
56 | 4 | 5
|
56 | 4 | 5
|
||||||
64 | 6 | 7 (libtwolame does not allow bitrate lower than this on 32 kHz)
|
64 | 6 | 7 (libtwolame does not allow bitrate lower than this on 32 kHz stereo)
|
||||||
80 | 8 | 9
|
80 | 8 | 9
|
||||||
96 | 10 | 11
|
96 | 10 | 11
|
||||||
112 | 12 | 13
|
112 | 12 | 13
|
||||||
@@ -429,7 +429,12 @@ Packet Types -
|
|||||||
Add 128 to the resulting number if the frame has a padding bit (should not happen on 32kHz sampling rate)
|
Add 128 to the resulting number if the frame has a padding bit (should not happen on 32kHz sampling rate)
|
||||||
Special value of 255 may indicate some errors
|
Special value of 255 may indicate some errors
|
||||||
|
|
||||||
To encode an audio to compliant format, use ffmpeg: ffmpeg -i <your_music> -acodec libtwolame -b:a <rate>k -ar 32000 <output.mp2>
|
To encode an audio to compliant format, use ffmpeg: ffmpeg -i <your_music> -acodec libtwolame -psymodel 4 -b:a <rate>k -ar 32000 <output.mp2>
|
||||||
|
Rationale:
|
||||||
|
-acodec libtwolame : ffmpeg has two mp2 encoders, and libtwolame produces vastly higher quality audio
|
||||||
|
-psymodel 4 : use alternative psychoacoustic model -- the default model (3) tends to insert "clunk" sounds throughout the audio
|
||||||
|
-b:a : 256k is recommended for high quality audio (trust me, you don't need 384k)
|
||||||
|
-ar 32000 : resample the audio to 32kHz, the sampling rate of the TSVM soundcard
|
||||||
|
|
||||||
GLOBAL TYPE 0 Packet -
|
GLOBAL TYPE 0 Packet -
|
||||||
uint32 SIZE OF FRAMEDATA
|
uint32 SIZE OF FRAMEDATA
|
||||||
|
|||||||
Reference in New Issue
Block a user