💀
This commit is contained in:
parent
955070600f
commit
5306c461c9
4 changed files with 195 additions and 0 deletions
157
util/nbs-file.js
Normal file
157
util/nbs-file.js
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
function parse (buffer) {
|
||||||
|
let i = 0
|
||||||
|
|
||||||
|
let songLength = 0
|
||||||
|
let format = 0
|
||||||
|
let vanillaInstrumentCount = 0
|
||||||
|
songLength = readShort()
|
||||||
|
if (songLength === 0) {
|
||||||
|
format = readByte()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format >= 1) {
|
||||||
|
vanillaInstrumentCount = readByte()
|
||||||
|
}
|
||||||
|
if (format >= 3) {
|
||||||
|
songLength = readShort()
|
||||||
|
}
|
||||||
|
|
||||||
|
const layerCount = readShort()
|
||||||
|
const songName = readString()
|
||||||
|
const songAuthor = readString()
|
||||||
|
const songOriginalAuthor = readString()
|
||||||
|
const songDescription = readString()
|
||||||
|
const tempo = readShort()
|
||||||
|
const autoSaving = readByte()
|
||||||
|
const autoSavingDuration = readByte()
|
||||||
|
const timeSignature = readByte()
|
||||||
|
const minutesSpent = readInt()
|
||||||
|
const leftClicks = readInt()
|
||||||
|
const rightClicks = readInt()
|
||||||
|
const blocksAdded = readInt()
|
||||||
|
const blocksRemoved = readInt()
|
||||||
|
const origFileName = readString()
|
||||||
|
|
||||||
|
let loop = 0
|
||||||
|
let maxLoopCount = 0
|
||||||
|
let loopStartTick = 0
|
||||||
|
if (format >= 4) {
|
||||||
|
loop = readByte()
|
||||||
|
maxLoopCount = readByte()
|
||||||
|
loopStartTick = readShort()
|
||||||
|
}
|
||||||
|
|
||||||
|
const nbsNotes = []
|
||||||
|
let tick = -1
|
||||||
|
while (true) {
|
||||||
|
const tickJumps = readShort()
|
||||||
|
if (tickJumps === 0) break
|
||||||
|
tick += tickJumps
|
||||||
|
|
||||||
|
let layer = -1
|
||||||
|
while (true) {
|
||||||
|
const layerJumps = readShort()
|
||||||
|
if (layerJumps === 0) break
|
||||||
|
layer += layerJumps
|
||||||
|
const note = nbsNote()
|
||||||
|
note.tick = tick
|
||||||
|
note.layer = layer
|
||||||
|
note.instrument = readByte()
|
||||||
|
note.key = readByte()
|
||||||
|
if (format >= 4) {
|
||||||
|
note.velocity = readByte()
|
||||||
|
note.panning = readByte()
|
||||||
|
note.pitch = readShort()
|
||||||
|
}
|
||||||
|
nbsNotes.push(note)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const nbsLayers = []
|
||||||
|
if (i <= buffer.length) {
|
||||||
|
for (let j = 0; j < layerCount; j++) {
|
||||||
|
const layer = nbsLayer()
|
||||||
|
layer.name = readString()
|
||||||
|
if (format >= 4) {
|
||||||
|
layer.lock = readByte()
|
||||||
|
}
|
||||||
|
layer.volume = readByte()
|
||||||
|
if (format >= 2) {
|
||||||
|
layer.stereo = readByte()
|
||||||
|
}
|
||||||
|
nbsLayers.push(layer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
songLength,
|
||||||
|
format,
|
||||||
|
vanillaInstrumentCount,
|
||||||
|
layerCount,
|
||||||
|
songName,
|
||||||
|
songAuthor,
|
||||||
|
songOriginalAuthor,
|
||||||
|
songDescription,
|
||||||
|
tempo,
|
||||||
|
autoSaving,
|
||||||
|
autoSavingDuration,
|
||||||
|
timeSignature,
|
||||||
|
minutesSpent,
|
||||||
|
leftClicks,
|
||||||
|
rightClicks,
|
||||||
|
blocksAdded,
|
||||||
|
blocksRemoved,
|
||||||
|
origFileName,
|
||||||
|
loop,
|
||||||
|
maxLoopCount,
|
||||||
|
loopStartTick,
|
||||||
|
nbsNotes,
|
||||||
|
nbsLayers
|
||||||
|
}
|
||||||
|
|
||||||
|
function readByte () {
|
||||||
|
return buffer.readInt8(i++)
|
||||||
|
}
|
||||||
|
|
||||||
|
function readShort () {
|
||||||
|
const short = buffer.readInt16LE(i)
|
||||||
|
i += 2
|
||||||
|
return short
|
||||||
|
}
|
||||||
|
|
||||||
|
function readInt () {
|
||||||
|
const int = buffer.readInt32LE(i)
|
||||||
|
i += 4
|
||||||
|
return int
|
||||||
|
}
|
||||||
|
|
||||||
|
function readString () {
|
||||||
|
let length = readInt()
|
||||||
|
let string = ''
|
||||||
|
for (; i > 0; i--) string += String.fromCharCode(readByte())
|
||||||
|
return string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function nbsNote () {
|
||||||
|
return {
|
||||||
|
tick: null,
|
||||||
|
layer: null,
|
||||||
|
instrument: null,
|
||||||
|
key: null,
|
||||||
|
velocity: 100,
|
||||||
|
panning: 100,
|
||||||
|
pitch: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function nbsLayer () {
|
||||||
|
return {
|
||||||
|
name: null,
|
||||||
|
lock: 0,
|
||||||
|
volume: null,
|
||||||
|
stereo: 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { parse, nbsNote, nbsLayer }
|
7
util/regexp.js
Normal file
7
util/regexp.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
// Useful RegExp s
|
||||||
|
module.exports = {
|
||||||
|
ESCAPE_SEQUENCE: /\xa7.?/g,
|
||||||
|
VALID_ESCAPE_SEQUENCE: /\xa7[0-9a-fkl-orA-FKL-OR]/g,
|
||||||
|
INVALID_ESCAPE_SEQUENCE: /\xa7[^0-9a-fkl-orA-FKL-OR]/g,
|
||||||
|
UUID: /^[0-9a-fA-F]{8}\b\-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/
|
||||||
|
}
|
23
util/stylize_with_color.js
Normal file
23
util/stylize_with_color.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
const styles = {
|
||||||
|
special: '\xa73',
|
||||||
|
number: '\xa76',
|
||||||
|
bigint: '\xa76',
|
||||||
|
boolean: '\xa76',
|
||||||
|
undefined: '\xa78',
|
||||||
|
null: '\xa7l',
|
||||||
|
string: '\xa72',
|
||||||
|
symbol: '\xa72',
|
||||||
|
date: '\xa75',
|
||||||
|
// "name": intentionally not styling
|
||||||
|
// TODO(BridgeAR): Highlight regular expressions properly.
|
||||||
|
regexp: '\xa74',
|
||||||
|
module: '\xa7n'
|
||||||
|
}
|
||||||
|
|
||||||
|
function stylizeWithColor (str, styleType) {
|
||||||
|
const style = styles[styleType]
|
||||||
|
if (style !== undefined) return `${style}${str}\xa7r`
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { stylizeWithColor, styles }
|
8
util/uuid-to-nbt-uuid.js
Normal file
8
util/uuid-to-nbt-uuid.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
// originally from https://gist.github.com/storycraft/7813dd0186e85daa393e1df9cfa19f2a
|
||||||
|
const nbt = require('prismarine-nbt')
|
||||||
|
|
||||||
|
function toNBTUUID (uuid) {
|
||||||
|
return nbt.intArray(nbt.int(uuid.replace(/-/g, '').match(/.{8}/g).map(str => Number.parseInt(str, 16)).map(num => num & 0x80000000 ? num - 0xffffffff - 1 : num)))
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = toNBTUUID
|
Loading…
Reference in a new issue