gulp-maschine-id3
Version:
Gulp plugin for adding maschine-aware metadata chunk to WAVE file.
109 lines (98 loc) • 3.49 kB
JavaScript
(function() {
var NISOUND, NKS, UNKNOWN0, UNKNOWN1, UNKNOWN2, UNKNOWN3, msgpack, offset;
msgpack = require('msgpack-lite');
NKS = 'com.native-instruments.nks.soundinfo\u0000';
NISOUND = 'com.native-instruments.nisound.soundinfo\u0000';
UNKNOWN0 = '020000000100000000000000';
UNKNOWN1 = '00000000ffffffffffffffff00000000000000000000000000000000';
UNKNOWN2 = '01000000';
UNKNOWN3 = '00000000';
offset = 0;
module.exports = {
/*
is ID3v2 frame nks.soundinfo
*/
isFrameNKS: function(frame) {
return frame && (frame.id = 'GEOB' && frame.size > NKS.length + 3 && (frame.content.slice(3, 3 + NKS.length)).toString() === NKS);
},
/*
is ID3v2 frame nisound.soundinfo
*/
isFrameNISound: function(frame) {
return frame && (frame.id = 'GEOB' && frame.size > NISOUND.length + 3 && (frame.content.slice(3, 3 + NISOUND.length)).toString() === NISOUND);
},
decodeNKS: function(frame) {
return msgpack.decode(frame.content.slice(3 + NKS.length));
},
decodeNI: function(frame) {
offset = 3 + NISOUND.length;
return {
// unknown0 '020000000100000000000000'
unknown0: this.readUnknwon(frame.content, 'unknown0', UNKNOWN0),
name: this.readUcs2String(frame.content),
author: this.readUcs2String(frame.content),
vendor: this.readUcs2String(frame.content),
comment: this.readUcs2String(frame.content),
unknown1: this.readUnknwon(frame.content, 'unknown1', UNKNOWN1),
flag: this.readUInt32(frame.content),
unknown2: this.readUnknwon(frame.content, 'unknown2', UNKNOWN2),
bankchain: this.readUcs2StringArray(frame.content),
types: this.readUcs2StringArray(frame.content),
unknown3: this.readUnknwon(frame.content, 'unknown3', UNKNOWN3),
props: this.readKeyValuePairs(frame.content),
remain: frame.content.slice(offset)
};
},
readUnknwon: function(content, name, expect) {
var l, v;
l = expect.length >> 1;
v = content.toString('hex', offset, offset + l);
offset += l;
if (v !== expect) {
console.warn(`unmatch ${name} [${expect}]'. occurs:${v}'`);
}
return v;
},
readUcs2String: function(content) {
var length, s;
length = (content.readUInt32LE(offset)) << 1;
offset += 4;
if (length) {
s = content.toString('ucs2', offset, offset + length);
offset += length;
return s;
} else {
return '';
}
},
readUcs2StringArray: function(content) {
var i, j, ref, results, size;
size = content.readUInt32LE(offset);
offset += 4;
results = [];
for (i = j = 0, ref = size; (0 <= ref ? j < ref : j > ref); i = 0 <= ref ? ++j : --j) {
results.push(this.readUcs2String(content));
}
return results;
},
readKeyValuePairs: function(content) {
var i, j, key, pairs, ref, results, size, value;
pairs = [];
size = content.readUInt32LE(offset);
offset += 4;
results = [];
for (i = j = 0, ref = size; (0 <= ref ? j < ref : j > ref); i = 0 <= ref ? ++j : --j) {
key = this.readUcs2String(content);
value = this.readUcs2String(content);
results.push([key, value]);
}
return results;
},
readUInt32: function(content) {
var v;
v = content.readUInt32LE(offset);
offset += 4;
return v;
}
};
}).call(this);