ableton-parser
Version:
A NodeJs based Ableton parser to parse ableton-live files(*als)
141 lines (140 loc) • 5.53 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var path_1 = __importDefault(require("path"));
var utils_1 = require("./utils");
var FilerefData = /** @class */ (function () {
function FilerefData(systemName, location, format) {
this.systemName = systemName;
this.location = location;
this.format = format;
}
FilerefData.prototype.getFileName = function () {
return path_1.default.parse(this.location).base;
};
FilerefData.prototype.getDir = function () {
return path_1.default.basename(path_1.default.dirname(this.location));
};
FilerefData.prototype.getLocation = function (delminator) {
return this.location.split(path_1.default.sep).join(delminator);
};
FilerefData.prototype.getSystemName = function () {
return this.systemName;
};
FilerefData.prototype.getFormat = function () {
return this.format;
};
FilerefData.prototype.setLocation = function (location) {
this.location = location;
};
return FilerefData;
}());
exports.FilerefData = FilerefData;
function unmarshall(stream) {
// Leave the first 8 as padding
var cntr = 8;
// 8 to 12 as the total length, 2 padding
var totalLength = utils_1.hex2dec(stream.substr(cntr, 4));
cntr += 6;
// 14 to 20 Unknown
cntr += 6;
// 20 to 22 length of System Name
var systemNameLength = utils_1.hex2dec(stream.substr(cntr, 2));
cntr += 2;
// Next 62 as System Name
var systemName = utils_1.hex2ascii(stream.substr(cntr, systemNameLength * 2));
cntr += 62;
// Next 8 unknown
cntr += 8;
// Next 16 padding with FFFFFFFF
cntr += 8;
// 20 to 22 length of File Name
var fileNameLength = utils_1.hex2dec(stream.substr(cntr, 2));
cntr += 2;
// Next 126 as System Name
var fileName = utils_1.hex2ascii(stream.substr(cntr, fileNameLength * 2));
cntr += 126;
// Next 16 as padding FFFFFFFF00000000
cntr += 16;
// Next 8 file format
var format = utils_1.hex2ascii(stream.substr(cntr, 8));
cntr += 8;
// Next 16 as padding FFFFFFFF00000000
cntr += 16;
// Next 38 unknown
cntr += 38;
// Next 2 dir name length
var dirNameLength = utils_1.hex2dec(stream.substr(cntr, 2));
cntr += 2;
// Next dirNameLength as Directory Name
var dirName = utils_1.hex2ascii(stream.substr(cntr, dirNameLength * 2));
cntr += dirNameLength * 2;
// Weird padding based on odd or even
cntr += dirNameLength % 2 == 0 ? 2 : 4;
// Next 4 unknown
cntr += 4;
// Next 2 location length
var locationLength = utils_1.hex2dec(stream.substr(cntr, 2));
cntr += 2;
// Next locationLength as Location
var locationRaw = utils_1.hex2ascii(stream.substr(cntr, locationLength * 2));
cntr += locationLength * 2;
var location = locationRaw.substr(2).split(':').join('/');
return new FilerefData(systemName, location, format);
}
exports.unmarshall = unmarshall;
function marshall(data) {
// Starting 8 Padding, 4 total length, 6 unknown
var stream = '00000000000000020000';
// 1 size, 63 system name
stream += utils_1.dec2hex(data.getSystemName().length);
stream += utils_1.ascii2hex(data.getSystemName()).padEnd(62, '0');
// Unknown 8, buffer 8
stream += '42440001FFFFFFFF';
// 1 size, 126 file name
stream += utils_1.dec2hex(data.getFileName().length);
stream += utils_1.ascii2hex(data.getFileName()).padEnd(126, '0');
// 16 padding
stream += 'FFFFFFFF00000000';
// 8 fileformat
stream += utils_1.ascii2hex(data.getFormat());
// 16 padding
stream += '00000000FFFFFFFF';
// 38 Unknown
stream += '00000A20637500000000000000000000000000';
// 1 size, 63 dir name, weird padding based on length
stream += utils_1.dec2hex(data.getDir().length);
stream += utils_1.ascii2hex(data.getDir());
stream += utils_1.lenPad(data.getDir().length);
// Unknown 4
stream += '0200';
// length + 2, location with delminator :
stream += utils_1.dec2hex(data.getLocation(':').length + 2);
stream += utils_1.ascii2hex('/:' + data.getLocation(':'));
stream += utils_1.lenPad(data.getLocation(':').length);
// Unknown 4
stream += '0E00';
// length of the file name with padding and length header (12*2 + 2 = 26), 2 padding
stream += utils_1.dec2hex((data.getFileName().length * 2) + 2) + '00';
stream += utils_1.dec2hex(data.getFileName().length) + '00';
stream += utils_1.ascii2hex(data.getFileName().split('').join('\0')) + '00';
// Unknown 4
stream += '0F00';
// length of the system name with padding and length header (12*2 + 2 = 26), 2 padding
stream += utils_1.dec2hex((data.getSystemName().length * 2) + 2) + '00';
stream += utils_1.dec2hex(data.getSystemName().length) + '00';
stream += utils_1.ascii2hex(data.getSystemName().split('').join('\0')) + '00';
// Unknown 4
stream += '1200';
stream += utils_1.dec2hex(data.getLocation('/').length);
stream += utils_1.ascii2hex(data.getLocation('/'));
stream += utils_1.lenPad(data.getLocation('/').length);
// Unknwon end
stream += '1300012F00001500020015FFFF0000';
var lenStr = utils_1.dec2hex(stream.length / 2);
stream = utils_1.replaceAt(stream, lenStr, 8);
return stream;
}
exports.marshall = marshall;