Site 1.1.0: beat jump in the builder, version and changelog, key colours

- Beat jump (experimental) on the mods page, in the docs and in the builder
  (needs hot cue keys; dependencies are ticked and unticked as a chain).
- Key notation 1.2.0: keys in their Camelot wheel colour, also in BROWSE.
- Version badge at the top with a changelog; every mod's version on its
  card and in the builder. make_builder_data.py writes assets/versions.js
  from tools/changelog.json and the mods' versions and stamps the pages'
  CSS and script links with ?v=<site version>.
- The generator keeps a changed copy of the UTILITY table as the user's
  own table plus our bytes (beat jump renames an item).
- Upcoming: quick search, USB auto load and phase meter reverse (in testing).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Thiemo TizianiandClaude Opus 5.5 committed 2026-10-20 02:00:48 +02:00
1 parent e4728b16ea
commit d2d1518fba
16 files changed
+440 -72

No files matched your search

+5 -5
View File
@@ -14,7 +14,7 @@
var ADDRESS_BYTES = { 0: 2, 1: 2, 2: 3, 3: 4, 5: 2, 6: 3, 7: 4, 8: 3, 9: 2 };
var LABEL = '1.32';
var UPSTREAM = ['extended_bpm', 'phasemeter', 'rgb_waveform'];
var OURS = ['cuecolours', 'hotcuekeys', 'ledsaver', 'credit'];
var OURS = ['beatjump', 'cuecolours', 'hotcuekeys', 'ledsaver', 'keynotation', 'credit'];
function fail(msg) { throw new Error(msg); }
@@ -415,13 +415,13 @@
}
// ---------- the mods' bytes (builder/data.js) ----------
function boxPixels(stock, res, bg, ink) {
function boxPixels(stock, res, bg, ink, text) {
var B = D.box, rec = B.resTable + res * 44, w = u16(stock, rec + 4), h = u16(stock, rec + 6);
var off = B.resTable + u32(stock, rec + 0x20), px = new Uint16Array(w * h);
for (var i = 0; i < w * h; i++) px[i] = u16(stock, off + i * 2);
for (var y = 3; y < 13; y++) for (var x = 3; x < w - 3; x++) px[y * w + x] = bg;
// as box_pixels: width = sum(space for ' ', else glyph width + gap) - gap
var text = B.text, width = -B.gap, c;
var width = -B.gap, c;
for (c = 0; c < text.length; c++) width += text[c] === ' ' ? B.space : B.glyphs[text[c]][0].length + B.gap;
var x0 = Math.floor((w - width) / 2), y0 = 4;
for (c = 0; c < text.length; c++) {
@@ -436,14 +436,14 @@
}
// One variant of data.js: the application grown to its size, then its
// operations: our bytes, a copy from the user's own application, the HOT
// KEYS box or arnoldasr's asset blob, both made from the user's application.
// KEYS / LOADING boxes or arnoldasr's asset blob, both made from the user's application.
function applyVariant(app, stock, v) {
var out = grow(app.slice(), v.size), blob = null;
v.ops.forEach(function (o) {
var off = o[1] - BASE;
if (o[0] === 'data') out.set(fromB64(D.chunks[o[2]]), off);
else if (o[0] === 'copy') out.set(stock.subarray(o[2] - BASE, o[2] - BASE + o[3]), off);
else if (o[0] === 'box') out.set(boxPixels(stock, o[2], o[3], o[4]), off);
else if (o[0] === 'box') out.set(boxPixels(stock, o[2], o[3], o[4], o[5]), off);
else if (o[0] === 'assets') { blob = blob || assets(stock).blob; out.set(blob.subarray(0, o[2]), off); }
else fail('unknown operation ' + o[0]);
});