diff --git a/.gitattributes b/.gitattributes
index 2f490e9c87d5927311c36eeb3e9b31f4247bf61d..b69c6dfd12f742e28b5124347bd923b3a1ff45fb 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -399,3 +399,28 @@ brand/recall-brief/cover.png filter=lfs diff=lfs merge=lfs -text
brand/recall-brief/image-1-output.png filter=lfs diff=lfs merge=lfs -text
brand/recall-brief/image-2-shot.png filter=lfs diff=lfs merge=lfs -text
brand/recall-brief/image-3-inside.png filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/free/boss_lose.wav filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/free/dungeon_deep_cave.wav filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/free/overworld_meadow_run.wav filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/free/overworld_win.wav filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/dungeon_crypt_steps.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/dungeon_deep_cave.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/dungeon_ruin_echoes.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/night_firefly_path.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/night_lofi_pixels.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/night_moonlit_lake.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/overworld_meadow_run.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/overworld_open_road.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/puzzle_bubble_pop.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/puzzle_clockwork.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/puzzle_tile_logic.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/space_orbit_drift.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/space_signal_lost.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/space_star_patrol.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/title_main_menu.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/title_options_screen.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/title_press_start.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/town_inn_fireside.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/town_item_shop.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/audio/preview/town_market_square.mp3 filter=lfs diff=lfs merge=lfs -text
+blipwren-music/og.png filter=lfs diff=lfs merge=lfs -text
diff --git a/blipwren-music/app.js b/blipwren-music/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..b1cb953ae040fac0ada8157adebb2443bbd66f90
--- /dev/null
+++ b/blipwren-music/app.js
@@ -0,0 +1,196 @@
+/* Blipwren Music player: Web Audio, no libraries. © 2026 CyberMax */
+(function () {
+ "use strict";
+ var $ = function (s) { return document.querySelector(s); };
+ var ctx = null, master = null, music = null, meta = null, mood = "all";
+ var buffers = {}; // id -> AudioBuffer or Promise
+ var tiles = {}; // id -> {el, item}
+ var cur = null; // {item, src, t0, dur, loop}
+ var DUCK = 0.35;
+
+ function audio() {
+ if (!ctx) {
+ var AC = window.AudioContext || window.webkitAudioContext;
+ ctx = new AC();
+ master = ctx.createGain(); master.gain.value = 0.8; master.connect(ctx.destination);
+ music = ctx.createGain(); music.gain.value = 1; music.connect(master);
+ }
+ if (ctx.state === "suspended") ctx.resume();
+ return ctx;
+ }
+
+ function toast(msg) {
+ var t = $("#toast"); t.textContent = msg; t.classList.add("on");
+ clearTimeout(toast._t); toast._t = setTimeout(function () { t.classList.remove("on"); }, 3200);
+ }
+
+ function url(item) { return item.free ? "audio/free/" + item.id + ".wav" : "audio/preview/" + item.id + ".mp3"; }
+
+ function load(item) {
+ if (buffers[item.id]) return Promise.resolve(buffers[item.id]);
+ buffers[item.id] = fetch(url(item)).then(function (r) {
+ if (!r.ok) throw new Error(r.status);
+ return r.arrayBuffer();
+ }).then(function (ab) {
+ return new Promise(function (res, rej) { audio().decodeAudioData(ab, res, rej); });
+ }).then(function (b) { buffers[item.id] = b; return b; }, function (e) { delete buffers[item.id]; throw e; });
+ return buffers[item.id];
+ }
+
+ function moodOf(id) { return meta.moods.filter(function (m) { return m.id === id; })[0]; }
+
+ function stopLoop() {
+ if (!cur) return;
+ try { cur.src.stop(); } catch (e) {}
+ tiles[cur.item.id].el.classList.remove("playing");
+ cur = null;
+ $("#stop").disabled = true;
+ $("#bar").style.width = "0";
+ $("#now-title").textContent = "Tap a loop to play it";
+ $("#now-sub").textContent = "Then drop a stinger on top: it's in the same key.";
+ setStingers(null);
+ }
+
+ function setStingers(m) {
+ Array.prototype.forEach.call(document.querySelectorAll("#stingers .chip"), function (b) {
+ b.disabled = !m;
+ b.dataset.id = m ? m + "_" + b.dataset.kind : "";
+ });
+ }
+
+ function playLoop(item) {
+ audio();
+ return load(item).then(function (buf) {
+ stopLoop();
+ var src = ctx.createBufferSource();
+ src.buffer = buf;
+ src.loop = !!item.free; // full-quality free loops repeat forever; previews fade out
+ src.connect(music);
+ src.start(0);
+ var me = cur = { item: item, src: src, t0: ctx.currentTime, dur: buf.duration, loop: src.loop };
+ src.onended = function () { if (cur === me) stopLoop(); };
+ tiles[item.id].el.classList.add("playing");
+ $("#stop").disabled = false;
+ $("#now-title").textContent = item.title + (item.free ? " (free, looping)" : " (preview)");
+ $("#now-sub").textContent = moodOf(item.mood).label + " · " + item.bpm + " BPM · " + item.key +
+ (item.free ? " · full quality, listen for the seam" : " · first 8 of 16 bars");
+ setStingers(item.mood);
+ window.__blipwrenPlaying = item.id;
+ }).catch(function () { toast("Couldn't play that loop. Please try again."); });
+ }
+
+ function playStinger(item) {
+ audio();
+ return load(item).then(function (buf) {
+ var src = ctx.createBufferSource();
+ src.buffer = buf;
+ src.connect(master);
+ var now = ctx.currentTime;
+ if (cur) { // duck the loop under the stinger, like the engine helpers do
+ music.gain.cancelScheduledValues(now);
+ music.gain.setValueAtTime(music.gain.value, now);
+ music.gain.linearRampToValueAtTime(DUCK, now + 0.12);
+ music.gain.setValueAtTime(DUCK, now + Math.max(buf.duration - 0.3, 0.1));
+ music.gain.linearRampToValueAtTime(1, now + buf.duration + 0.4);
+ }
+ src.start(now);
+ var t = tiles[item.id];
+ if (t) { t.el.classList.add("playing"); setTimeout(function () { t.el.classList.remove("playing"); }, buf.duration * 1000); }
+ window.__blipwrenStinger = item.id;
+ }).catch(function () { toast("Couldn't play that stinger. Please try again."); });
+ }
+
+ function tick() {
+ if (cur && ctx) {
+ var p = ((ctx.currentTime - cur.t0) % cur.dur) / cur.dur;
+ $("#bar").style.width = (p * 100).toFixed(1) + "%";
+ }
+ requestAnimationFrame(tick);
+ }
+
+ function chips() {
+ var box = $("#moods"), list = [{ id: "all", label: "All" }].concat(meta.moods).concat([{ id: "stingers", label: "Stingers" }]);
+ list.forEach(function (m) {
+ var b = document.createElement("button");
+ b.type = "button";
+ b.className = "chip" + (m.id === mood ? " on" : "");
+ b.dataset.mood = m.id;
+ b.textContent = m.label;
+ b.addEventListener("click", function () {
+ mood = m.id;
+ Array.prototype.forEach.call(box.children, function (x) { x.classList.toggle("on", x.dataset.mood === mood); });
+ filter();
+ });
+ box.appendChild(b);
+ });
+ }
+
+ function tile(item) {
+ var el = document.createElement("button");
+ el.type = "button";
+ el.className = "loop" + (item.type === "stinger" ? " st" : "");
+ el.setAttribute("aria-label", "Play " + item.title + (item.type === "stinger" ? " stinger, " + moodOf(item.mood).label : "") + (item.free ? " (free)" : ""));
+ el.innerHTML = ' ';
+ el.querySelector(".nm").textContent = item.type === "stinger" ? item.title + " · " + moodOf(item.mood).label.split(" &")[0] : item.title;
+ el.querySelector(".ds").textContent = item.desc;
+ el.querySelector(".mt").textContent = item.bpm + " BPM · " + item.key + (item.bars ? " · " + item.bars + " bars" : "");
+ el.querySelector(".dur").textContent = item.dur.toFixed(1) + "s";
+ if (item.free) {
+ var foot = document.createElement("span"); foot.className = "foot";
+ var badge = document.createElement("span"); badge.className = "free-badge"; badge.textContent = "FREE";
+ var dl = document.createElement("a"); dl.className = "dl"; dl.href = url(item);
+ dl.download = "blipwren_" + item.id + ".wav"; dl.textContent = "WAV ↓";
+ dl.addEventListener("click", function (e) { e.stopPropagation(); });
+ foot.appendChild(badge); foot.appendChild(dl); el.appendChild(foot);
+ }
+ el.addEventListener("click", function () { if (item.type === "stinger") playStinger(item); else playLoop(item); });
+ tiles[item.id] = { el: el, item: item };
+ return el;
+ }
+
+ function build() {
+ var list = $("#list");
+ meta.moods.forEach(function (m) {
+ var h = document.createElement("h3"); h.className = "mood-h"; h.dataset.mood = m.id; h.textContent = m.label;
+ list.appendChild(h);
+ meta.items.filter(function (i) { return i.mood === m.id; }).forEach(function (i) { list.appendChild(tile(i)); });
+ });
+ }
+
+ function filter() {
+ var n = 0;
+ Array.prototype.forEach.call($("#list").children, function (el) {
+ if (el.classList.contains("mood-h")) { el.hidden = !(mood === "all" || mood === "stingers" || mood === el.dataset.mood); return; }
+ var id = Object.keys(tiles).filter(function (k) { return tiles[k].el === el; })[0], it = tiles[id].item;
+ var show = mood === "all" ? it.type === "loop" : mood === "stingers" ? it.type === "stinger" : it.mood === mood;
+ el.hidden = !show;
+ if (show) n++;
+ });
+ $("#status").textContent = n + (mood === "stingers" ? " stingers" : mood === "all" ? " loops" : " tracks") +
+ " · tap to play" + (mood === "all" ? " · pick a mood to see its stingers" : "");
+ }
+
+ function tabs() {
+ Array.prototype.forEach.call(document.querySelectorAll("#tabs .chip"), function (b) {
+ b.addEventListener("click", function () {
+ Array.prototype.forEach.call(document.querySelectorAll("#tabs .chip"), function (x) {
+ x.classList.toggle("on", x === b); x.setAttribute("aria-selected", x === b ? "true" : "false");
+ });
+ Array.prototype.forEach.call(document.querySelectorAll("pre[data-pane]"), function (p) { p.hidden = p.dataset.pane !== b.dataset.tab; });
+ });
+ });
+ }
+
+ $("#stop").addEventListener("click", stopLoop);
+ Array.prototype.forEach.call(document.querySelectorAll("#stingers .chip"), function (b) {
+ b.addEventListener("click", function () { var t = tiles[b.dataset.id]; if (t) playStinger(t.item); });
+ });
+ document.addEventListener("keydown", function (e) { if (e.key === "Escape") stopLoop(); });
+ tabs();
+ if (/[?&]thanks=1/.test(location.search)) setTimeout(function () { toast("Thanks for your order! Your download links are in the Polar receipt email."); }, 800);
+
+ fetch("music.json").then(function (r) { return r.json(); }).then(function (m) {
+ meta = m; chips(); build(); filter(); requestAnimationFrame(tick);
+ window.__blipwrenReady = true;
+ }).catch(function () { $("#status").textContent = "Couldn't load the music list. Please reload the page."; });
+})();
diff --git a/blipwren-music/audio/free/boss_lose.wav b/blipwren-music/audio/free/boss_lose.wav
new file mode 100644
index 0000000000000000000000000000000000000000..35bb655d275758fae263928cf55b3368c9c39ea6
--- /dev/null
+++ b/blipwren-music/audio/free/boss_lose.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:25cc61feb064e9410944f91b16513174b896fd8c5d057c0ec2d7a72c9781a507
+size 195110
diff --git a/blipwren-music/audio/free/dungeon_deep_cave.wav b/blipwren-music/audio/free/dungeon_deep_cave.wav
new file mode 100644
index 0000000000000000000000000000000000000000..57bbb6424147c17998f5d2a9981e87cf85aa3a77
--- /dev/null
+++ b/blipwren-music/audio/free/dungeon_deep_cave.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a09060cb131818178de03b61c733efaf4f290236adfe804b72736f7ebf561806
+size 3528044
diff --git a/blipwren-music/audio/free/overworld_meadow_run.wav b/blipwren-music/audio/free/overworld_meadow_run.wav
new file mode 100644
index 0000000000000000000000000000000000000000..baf2bde38b255b969a0251bd4ba17cf2306258cc
--- /dev/null
+++ b/blipwren-music/audio/free/overworld_meadow_run.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a107a1e2ea368610d92710eee5205da1ea2d94a2cb35ed2c910ebda5fe43232d
+size 2352044
diff --git a/blipwren-music/audio/free/overworld_win.wav b/blipwren-music/audio/free/overworld_win.wav
new file mode 100644
index 0000000000000000000000000000000000000000..af1b75159d4f18342b0fa17cf98197cdde4297ca
--- /dev/null
+++ b/blipwren-music/audio/free/overworld_win.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d963e275c3e2e591a9acba17974cae0c23d12138e161db5baeb482e97965d7e4
+size 162478
diff --git a/blipwren-music/audio/preview/boss_arena_clash.mp3 b/blipwren-music/audio/preview/boss_arena_clash.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..5cc3f29749e51ad874ab000617a34747df3033d4
Binary files /dev/null and b/blipwren-music/audio/preview/boss_arena_clash.mp3 differ
diff --git a/blipwren-music/audio/preview/boss_chase_sequence.mp3 b/blipwren-music/audio/preview/boss_chase_sequence.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..1c3757357638ac613fd5898444c22aa00a5653ac
Binary files /dev/null and b/blipwren-music/audio/preview/boss_chase_sequence.mp3 differ
diff --git a/blipwren-music/audio/preview/boss_final_guardian.mp3 b/blipwren-music/audio/preview/boss_final_guardian.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..aa088b991601d634a9344ff9643c61cd0b53ea3d
Binary files /dev/null and b/blipwren-music/audio/preview/boss_final_guardian.mp3 differ
diff --git a/blipwren-music/audio/preview/boss_lose.mp3 b/blipwren-music/audio/preview/boss_lose.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..6e87631ad68a5920a86ecba4a47d36537717feda
Binary files /dev/null and b/blipwren-music/audio/preview/boss_lose.mp3 differ
diff --git a/blipwren-music/audio/preview/boss_start.mp3 b/blipwren-music/audio/preview/boss_start.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..90751e5554d63dd17941fad06e393bbbd66735f0
Binary files /dev/null and b/blipwren-music/audio/preview/boss_start.mp3 differ
diff --git a/blipwren-music/audio/preview/boss_win.mp3 b/blipwren-music/audio/preview/boss_win.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..81a0928f73df4e9a1590a6df16e4ba08e707fce6
Binary files /dev/null and b/blipwren-music/audio/preview/boss_win.mp3 differ
diff --git a/blipwren-music/audio/preview/dungeon_crypt_steps.mp3 b/blipwren-music/audio/preview/dungeon_crypt_steps.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..859368916a4c2e4e98e3a2f38250c18b8774d771
--- /dev/null
+++ b/blipwren-music/audio/preview/dungeon_crypt_steps.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a76135d29f357e58d5c2f8e8db885ed266df558a30a260aaecfea18a4e7258af
+size 152379
diff --git a/blipwren-music/audio/preview/dungeon_deep_cave.mp3 b/blipwren-music/audio/preview/dungeon_deep_cave.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..562af0e2e3a8f8e3225c6f2f53f676cd274a459d
--- /dev/null
+++ b/blipwren-music/audio/preview/dungeon_deep_cave.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:acaaa6077f15d2de00fd70aa2c847ee37fba6d5dadb37c2afc71a6e3d4fd87a1
+size 138758
diff --git a/blipwren-music/audio/preview/dungeon_lose.mp3 b/blipwren-music/audio/preview/dungeon_lose.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..c93fa6c67d16e10b3a21b721f157a0b5c6ff54e3
Binary files /dev/null and b/blipwren-music/audio/preview/dungeon_lose.mp3 differ
diff --git a/blipwren-music/audio/preview/dungeon_ruin_echoes.mp3 b/blipwren-music/audio/preview/dungeon_ruin_echoes.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..12cc7d0727306f0018106bdff02be13701feceb2
--- /dev/null
+++ b/blipwren-music/audio/preview/dungeon_ruin_echoes.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1370f30f0228cb7d5fc95f3d7faf9ff26304ee2dea5b65cea42ed480843412e3
+size 148734
diff --git a/blipwren-music/audio/preview/dungeon_start.mp3 b/blipwren-music/audio/preview/dungeon_start.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..2f81ca7eb910c332c407fa02c0f479f8c16edae7
Binary files /dev/null and b/blipwren-music/audio/preview/dungeon_start.mp3 differ
diff --git a/blipwren-music/audio/preview/dungeon_win.mp3 b/blipwren-music/audio/preview/dungeon_win.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..c32ca0e66f81cacc20bb99a98eb2877742e31cb4
Binary files /dev/null and b/blipwren-music/audio/preview/dungeon_win.mp3 differ
diff --git a/blipwren-music/audio/preview/night_firefly_path.mp3 b/blipwren-music/audio/preview/night_firefly_path.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..66364ccd08aac29891c89672c275c5bdd3698d22
--- /dev/null
+++ b/blipwren-music/audio/preview/night_firefly_path.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:509d062324ef11bf096d5c15f0b220af0280c389f4b5c80fe1da45340b49a124
+size 140243
diff --git a/blipwren-music/audio/preview/night_lofi_pixels.mp3 b/blipwren-music/audio/preview/night_lofi_pixels.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..e45af611272287ecd20800482dfd3d97ed302533
--- /dev/null
+++ b/blipwren-music/audio/preview/night_lofi_pixels.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cf7a4dbe2d6ffeb5e0b9cbe0f02645a207475d57dda5bc723e9650ad9224c0e3
+size 152716
diff --git a/blipwren-music/audio/preview/night_lose.mp3 b/blipwren-music/audio/preview/night_lose.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..acf8f2f4efb6c4e66ab7ec59b80687f784a6a883
Binary files /dev/null and b/blipwren-music/audio/preview/night_lose.mp3 differ
diff --git a/blipwren-music/audio/preview/night_moonlit_lake.mp3 b/blipwren-music/audio/preview/night_moonlit_lake.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..b3a3e742ecf7f126d885322c0f5b0d24cae4fc26
--- /dev/null
+++ b/blipwren-music/audio/preview/night_moonlit_lake.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d7b5d1c193cdaa53736f7d0df229aa936a73a2e7935675122bc2a7eff56683de
+size 151424
diff --git a/blipwren-music/audio/preview/night_start.mp3 b/blipwren-music/audio/preview/night_start.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..94ecdc0cabbe475fa7a938e3fb57bcfbbe5b09ff
Binary files /dev/null and b/blipwren-music/audio/preview/night_start.mp3 differ
diff --git a/blipwren-music/audio/preview/night_win.mp3 b/blipwren-music/audio/preview/night_win.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..f3a9f28e8edb1fbc2a809899524e6c141a77fd3c
Binary files /dev/null and b/blipwren-music/audio/preview/night_win.mp3 differ
diff --git a/blipwren-music/audio/preview/overworld_lose.mp3 b/blipwren-music/audio/preview/overworld_lose.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..43011240b5636f3772bebb87b2bea99e18a17953
Binary files /dev/null and b/blipwren-music/audio/preview/overworld_lose.mp3 differ
diff --git a/blipwren-music/audio/preview/overworld_meadow_run.mp3 b/blipwren-music/audio/preview/overworld_meadow_run.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..fb67214432361b3720d374adb48f57b784a81a04
--- /dev/null
+++ b/blipwren-music/audio/preview/overworld_meadow_run.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a22910fb5040723ce186741431261e6df73f6972bbb3785973d946d69981e973
+size 100156
diff --git a/blipwren-music/audio/preview/overworld_open_road.mp3 b/blipwren-music/audio/preview/overworld_open_road.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..d208843d25146102dfda840ba1b68abef25e7761
--- /dev/null
+++ b/blipwren-music/audio/preview/overworld_open_road.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f369425980da45934be1038d31cdc5c8b0dd3c6ff1f9f03582d595aa3748a20f
+size 103835
diff --git a/blipwren-music/audio/preview/overworld_sky_hopper.mp3 b/blipwren-music/audio/preview/overworld_sky_hopper.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..d4755adb5310851a8019f78f28f28d7f903656e5
Binary files /dev/null and b/blipwren-music/audio/preview/overworld_sky_hopper.mp3 differ
diff --git a/blipwren-music/audio/preview/overworld_start.mp3 b/blipwren-music/audio/preview/overworld_start.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..d4bcfcc3eaa36aa9df041a153b5fc4f97900315c
Binary files /dev/null and b/blipwren-music/audio/preview/overworld_start.mp3 differ
diff --git a/blipwren-music/audio/preview/overworld_win.mp3 b/blipwren-music/audio/preview/overworld_win.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..90f84731ef1d124cd942bf84066d3676b5dabd57
Binary files /dev/null and b/blipwren-music/audio/preview/overworld_win.mp3 differ
diff --git a/blipwren-music/audio/preview/puzzle_bubble_pop.mp3 b/blipwren-music/audio/preview/puzzle_bubble_pop.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..889f7df22b78aa2c20d92d0e52fb3fa62fe24299
--- /dev/null
+++ b/blipwren-music/audio/preview/puzzle_bubble_pop.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:39eb8ac84b817761ea98a361197a41bed40e89c0f9e15b5008ed079677606e91
+size 111530
diff --git a/blipwren-music/audio/preview/puzzle_clockwork.mp3 b/blipwren-music/audio/preview/puzzle_clockwork.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..76df1e37d923df03d9b2bd84c240447bde8ec64e
--- /dev/null
+++ b/blipwren-music/audio/preview/puzzle_clockwork.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2079fd83acb59a751a7a6dc74cd4c517a9bc5a8d52e78eb4da9de9b3decfabe
+size 141024
diff --git a/blipwren-music/audio/preview/puzzle_lose.mp3 b/blipwren-music/audio/preview/puzzle_lose.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..7b70571b2a424409aa2730b1f895e73ae5bfe7d2
Binary files /dev/null and b/blipwren-music/audio/preview/puzzle_lose.mp3 differ
diff --git a/blipwren-music/audio/preview/puzzle_start.mp3 b/blipwren-music/audio/preview/puzzle_start.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..b1fb091f309300fdd4f64d9f1d4c896cf994497a
Binary files /dev/null and b/blipwren-music/audio/preview/puzzle_start.mp3 differ
diff --git a/blipwren-music/audio/preview/puzzle_tile_logic.mp3 b/blipwren-music/audio/preview/puzzle_tile_logic.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..2b953de259e1ee7a8e75698088deb7b3ac445f00
--- /dev/null
+++ b/blipwren-music/audio/preview/puzzle_tile_logic.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:709fda342044d0aeca05fb2a7d0151e6157a1c5add9ee327dae3d27fafce3b4d
+size 118107
diff --git a/blipwren-music/audio/preview/puzzle_win.mp3 b/blipwren-music/audio/preview/puzzle_win.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..fb2f1280aa9781569d0ac875b105cf7817340c8e
Binary files /dev/null and b/blipwren-music/audio/preview/puzzle_win.mp3 differ
diff --git a/blipwren-music/audio/preview/space_lose.mp3 b/blipwren-music/audio/preview/space_lose.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..f5ce64d381828f0ce017463869fb1d6b39e6f7a0
Binary files /dev/null and b/blipwren-music/audio/preview/space_lose.mp3 differ
diff --git a/blipwren-music/audio/preview/space_orbit_drift.mp3 b/blipwren-music/audio/preview/space_orbit_drift.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..ed064f270bca43187555882a653315d0c464aa6c
--- /dev/null
+++ b/blipwren-music/audio/preview/space_orbit_drift.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4d6989dc933e24bbaf18ceeef465c29654b42da974f3e6ed686da11323edef7
+size 118056
diff --git a/blipwren-music/audio/preview/space_signal_lost.mp3 b/blipwren-music/audio/preview/space_signal_lost.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..acae190e09dda35f10d558c45c0a45f2bd494684
--- /dev/null
+++ b/blipwren-music/audio/preview/space_signal_lost.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:504f2c68f67eaadf4efca9913a8ce492a9ca416c2b5f01d2b5281edc2484fe95
+size 125656
diff --git a/blipwren-music/audio/preview/space_star_patrol.mp3 b/blipwren-music/audio/preview/space_star_patrol.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..e24faa9325d47d28935a639b40adb2855b547835
--- /dev/null
+++ b/blipwren-music/audio/preview/space_star_patrol.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1c1aabc3c743fd3ecd30092e3dcba3fbcc9126237d80a764436b00ca06406052
+size 111756
diff --git a/blipwren-music/audio/preview/space_start.mp3 b/blipwren-music/audio/preview/space_start.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..2b14dfc71621c1fb114c33082c0ae22c4acff724
Binary files /dev/null and b/blipwren-music/audio/preview/space_start.mp3 differ
diff --git a/blipwren-music/audio/preview/space_win.mp3 b/blipwren-music/audio/preview/space_win.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..e568d0c7cdc34d753ee43b11cf166f2af3cd36e5
Binary files /dev/null and b/blipwren-music/audio/preview/space_win.mp3 differ
diff --git a/blipwren-music/audio/preview/title_lose.mp3 b/blipwren-music/audio/preview/title_lose.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..bf7847e95ace7661858439284006aeaa34c29682
Binary files /dev/null and b/blipwren-music/audio/preview/title_lose.mp3 differ
diff --git a/blipwren-music/audio/preview/title_main_menu.mp3 b/blipwren-music/audio/preview/title_main_menu.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..f9d88bb2580842c5d9b15cf41ebd6055b7341b7c
--- /dev/null
+++ b/blipwren-music/audio/preview/title_main_menu.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:77262fa454a07015d042c9cd948ef2efc41f32b9cbc8645a86d1438167a548ab
+size 128792
diff --git a/blipwren-music/audio/preview/title_options_screen.mp3 b/blipwren-music/audio/preview/title_options_screen.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..4bd141c7db4d79ab4a2b993b6e508f30262203a9
--- /dev/null
+++ b/blipwren-music/audio/preview/title_options_screen.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2559a0bac6ba4e7baf44aa83ce81c66a894f9d159cb1c747efde7d03f91fb19f
+size 117920
diff --git a/blipwren-music/audio/preview/title_press_start.mp3 b/blipwren-music/audio/preview/title_press_start.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..36711ef30d60ceebf0f81a5dda96cf964f0b2c22
--- /dev/null
+++ b/blipwren-music/audio/preview/title_press_start.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:44b5d5258952ad8c628fa8bcf67374d7c7856905ec7feb8fad4cd3dca08f3c5c
+size 109451
diff --git a/blipwren-music/audio/preview/title_start.mp3 b/blipwren-music/audio/preview/title_start.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..71cd190a0f390d9ecb1efa9e1c0a39cc405aa450
Binary files /dev/null and b/blipwren-music/audio/preview/title_start.mp3 differ
diff --git a/blipwren-music/audio/preview/title_win.mp3 b/blipwren-music/audio/preview/title_win.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..b76961f23fdaf88b5ca4e82f519e60732083446a
Binary files /dev/null and b/blipwren-music/audio/preview/title_win.mp3 differ
diff --git a/blipwren-music/audio/preview/town_inn_fireside.mp3 b/blipwren-music/audio/preview/town_inn_fireside.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..93b2ef7c5949dfe435907bfef15e05d4088c6468
--- /dev/null
+++ b/blipwren-music/audio/preview/town_inn_fireside.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:83fe1840b7f5bcb35805c7b2ab98abcc1086c5e28288afa2a3dc3dee913e8932
+size 144730
diff --git a/blipwren-music/audio/preview/town_item_shop.mp3 b/blipwren-music/audio/preview/town_item_shop.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..f6c2b5908e5237f319380a1d2a9487006b27ac9d
--- /dev/null
+++ b/blipwren-music/audio/preview/town_item_shop.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c6ba05b107b1683522cc9f70535c6b51447eb8510b48bcbfd2a46abf73bd58a5
+size 127811
diff --git a/blipwren-music/audio/preview/town_lose.mp3 b/blipwren-music/audio/preview/town_lose.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..2a5b33ad2570dbb07b3c86057f413949f8d51f4a
Binary files /dev/null and b/blipwren-music/audio/preview/town_lose.mp3 differ
diff --git a/blipwren-music/audio/preview/town_market_square.mp3 b/blipwren-music/audio/preview/town_market_square.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..d2713ab14bd744fdbb7cdfad93f9fc505df10ffa
--- /dev/null
+++ b/blipwren-music/audio/preview/town_market_square.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4a5ac1f7eb403166294b0e9d63df364a712fc4ed37f73e6d71742f9705e5000
+size 125112
diff --git a/blipwren-music/audio/preview/town_start.mp3 b/blipwren-music/audio/preview/town_start.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..2e5f396a5f682a3187397876eceb5a3cc76cd93b
Binary files /dev/null and b/blipwren-music/audio/preview/town_start.mp3 differ
diff --git a/blipwren-music/audio/preview/town_win.mp3 b/blipwren-music/audio/preview/town_win.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..9d21a76e7621088a6ac1022f05c4fea9cfa560ab
Binary files /dev/null and b/blipwren-music/audio/preview/town_win.mp3 differ
diff --git a/blipwren-music/blipwren-music-sampler-1.0.0.zip b/blipwren-music/blipwren-music-sampler-1.0.0.zip
new file mode 100644
index 0000000000000000000000000000000000000000..d5421cdda4239f98385e0681fd55d880ee637176
--- /dev/null
+++ b/blipwren-music/blipwren-music-sampler-1.0.0.zip
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f5ecd86160cc2c1f4cb3fab8e59e9e09f16ae8d57020be885b58fcd23c4f8d3c
+size 4299714
diff --git a/blipwren-music/icon-192.png b/blipwren-music/icon-192.png
new file mode 100644
index 0000000000000000000000000000000000000000..951a7feb5e4b4562225bee57f400d1f496920dea
Binary files /dev/null and b/blipwren-music/icon-192.png differ
diff --git a/blipwren-music/icon-512.png b/blipwren-music/icon-512.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7584025f7675d593dfdb0de6dfd81b7e5c762e2
Binary files /dev/null and b/blipwren-music/icon-512.png differ
diff --git a/blipwren-music/icon.svg b/blipwren-music/icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..610a0481bd7988eb59e7ad12af8496ddbd73c1a7
--- /dev/null
+++ b/blipwren-music/icon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/blipwren-music/index.html b/blipwren-music/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..76fb58a3ef1b6396a7f967eba3226a3af05c9004
--- /dev/null
+++ b/blipwren-music/index.html
@@ -0,0 +1,167 @@
+
+
+
+
+
+Blipwren Music: 24 Seamless Chiptune Loops + Stingers for Games (WAV, OGG, Godot, Unity)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Seamless chiptune loops for your whole game. Hear every one first.
+ 24 loops in 8 moods, from the title screen to the final boss, each with a calm layer and matching win, lose and get-ready stingers . WAV + OGG , Godot and Unity helpers , royalty-free and never Content ID'd. 2 loops and 2 stingers are free.
+
+ 24 loops · 13.8 minutes
+ 24 calm layers (no drums)
+ 24 matching stingers
+ 33¢ a loop ($8 one-time)
+
+
+
+
+
+
+
+
■ Stop
+
Tap a loop to play it
+
Then drop a stinger on top: it's in the same key.
+
+
+
+ Stinger over the music:
+ Victory
+ Defeat
+ Get ready
+
+
+
+ Loading the music…
+ Pack-only loops preview as their first 8 bars (22 kHz MP3, fading out). FREE loops play at full quality and loop forever , so you can listen for the seam: there isn't one.
+
+
+
+
+
+
+
Blipwren Music Vol. 2: the full pack
+
72 tracks : 24 loops, a calm layer for each, and 24 stingers, as 44.1 kHz 16-bit WAV and OGG . Every loop is exactly 16 bars, so it repeats with no gap. Folders ready for Godot 4 (Autoload: crossfade, calm layer, stingers with ducking) and Unity (C# helper, layers started sample-locked), a music.csv with tempo, key and exact loop length for every file, and a plain-English licence.
+
+ Title & Menus : Press Start, Main Menu, Options Screen
+ Overworld & Adventure : Meadow Run, Open Road, Sky Hopper
+ Towns & Shops : Market Square, Item Shop, Fireside Inn
+ Puzzle & Casual : Tile Logic, Bubble Pop, Clockwork
+ Dungeons & Caves : Deep Cave, Crypt Steps, Ruin Echoes
+ Boss & Action : Final Guardian, Chase Sequence, Arena Clash
+ Space & Sci-Fi : Orbit Drift, Star Patrol, Signal Lost
+ Night & Chill : Moonlit Lake, Lo-fi Pixels, Firefly Path
+ Plus Victory, Defeat and Get Ready stingers for all 8 moods
+
+
+
$8
one-time · instant download · OGG + engines zip (61 MB) and WAV zip (71 MB)
+
Buy on Polar
+
Secure checkout by Polar (cards, Apple Pay, Google Pay).
+
+
+
+
+
+
+ Music that follows your game, in a few lines
+
+ Godot 4
+ Unity
+ Web (JS)
+
+ # 1. copy blipwren_music/ into res://
+# 2. Project Settings → Globals → Autoload: res://blipwren_music/blipwren_music.gd as "Music"
+func _on_level_started() -> void:
+ Music.play("overworld_meadow_run") # crossfades from the current loop
+func _on_shop_opened() -> void:
+ Music.set_calm(true) # same loop, no drums
+func _on_boss_defeated() -> void:
+ Music.stinger("boss_win") # the loop ducks under the stinger
+ // copy Assets/BlipwrenMusic into your project's Assets folder
+void OnLevelStarted() => BlipwrenMusic.Play("overworld_meadow_run");
+void OnShopOpened() => BlipwrenMusic.SetCalm(true);
+void OnBossDefeated() => BlipwrenMusic.Stinger("boss_win");
+ // Web Audio: seamless because the OGG/WAV loop is an exact bar count
+const buf = await ctx.decodeAudioData(await (await fetch("overworld_meadow_run.ogg")).arrayBuffer());
+const src = ctx.createBufferSource(); src.buffer = buf; src.loop = true;
+src.connect(ctx.destination); src.start();
+// Howler / Phaser: loop: true
+ The Godot helper is tested headless in Godot 4.5.1: all 72 tracks found and loaded, the 48 loops flagged as looping, crossfade, calm layer, stinger and stop all run.
+
+
+
+ FAQ
+ Can I use the music in a commercial game or a monetised video?
+ Yes. Unlimited personal and commercial games, apps, videos and streams, for yourself or clients, with no attribution needed. We never register the music with Content ID, so your videos won't be claimed. You can't resell or share the files themselves as a music pack, or release them as your own songs.
+ Do the loops really loop without a gap?
+ Yes. Each loop is exactly 16 bars at its tempo, to the sample (music.csv lists the sample count), and notes that ring past the end are folded back onto the start, so the loop point is inaudible. Our build checks every loop's end-to-start join. Keep the WAV or OGG in your game: converting to MP3 adds a short gap.
+ Who composed the music?
+ Our own rule-based composition code: chord progressions, melodies with call-and-answer phrases, bass lines and drum patterns are generated by music-theory rules and rendered by our own 4-channel chip synth (two pulse channels, a stepped triangle bass and noise drums, like the classic consoles). No samples, no third-party melodies and no AI model trained on anyone's music, so there's no hidden licence chain.
+ What are the calm layers for?
+ Each loop has a calm version with no drums and a softer lead, the same length and sample-aligned with the full mix. Crossfade to it when a dialogue box opens, in shops, on pause screens or when danger is over, then back again, without the music restarting.
+ How do the stingers fit?
+ Every mood has Victory, Defeat and Get Ready stingers written on the same key centre as that mood's loops, so they sit on top of the music instead of clashing. Try it in the player above: play a loop, then press a stinger.
+ Why not a free music pack?
+ There are good free packs, and the free Blipwren loops are yours too. The full pack is for when you want a whole soundtrack in one consistent style that's ready for a game: tested loop points, calm layers, matching stingers, engine helpers and a licence with no credit line or Content ID claims.
+ How does it compare with other chiptune packs?
+ On itch.io's chiptune top sellers (26 Sep 2026), paid packs run from $3.34 for 7 loopable tracks and $5 for 10 tracks (credit required) to $9.99 for a 35-track Game Boy collection and $34 for a large jukebox. Their tracks are longer, human-composed pieces. Blipwren's are 23–46 second loops, and what you get for $8 is coverage (8 moods), calm layers, 24 stingers and engine helpers.
+ What formats, and which engines?
+ WAV (44.1 kHz, 16-bit, mono) and Ogg Vorbis. Godot 4 and Unity get ready folders and helper scripts; the files also work in Unreal, GameMaker, Defold, Construct, Phaser, Love2D, Bevy, MonoGame, RPG Maker (OGG) and any video editor.
+ How do I get the files after buying?
+ Polar emails a receipt with the download links straight away, and the two zips (OGG + engines, and WAV) are also in your Polar customer portal. It's a one-time purchase with no subscription.
+ Get all 72 tracks · $8
+
+
+
+
+
+
+
+
+
+
diff --git a/blipwren-music/manifest.webmanifest b/blipwren-music/manifest.webmanifest
new file mode 100644
index 0000000000000000000000000000000000000000..9cddfadeb9d33e1d6441f0308aaeecaadc18b085
--- /dev/null
+++ b/blipwren-music/manifest.webmanifest
@@ -0,0 +1,15 @@
+{
+ "name": "Blipwren Music Player by CyberMax",
+ "short_name": "Blipwren Music",
+ "description": "Hear 24 seamless chiptune loops and 24 stingers in your browser; 4 tracks are free.",
+ "start_url": "index.html",
+ "scope": "./",
+ "display": "standalone",
+ "background_color": "#F6F3EC",
+ "theme_color": "#11141B",
+ "icons": [
+ {"src": "icon-192.png", "sizes": "192x192", "type": "image/png"},
+ {"src": "icon-512.png", "sizes": "512x512", "type": "image/png"},
+ {"src": "icon.svg", "sizes": "any", "type": "image/svg+xml"}
+ ]
+}
diff --git a/blipwren-music/music.css b/blipwren-music/music.css
new file mode 100644
index 0000000000000000000000000000000000000000..10038301dc5746f273d11a4ede2f45428d84bb35
--- /dev/null
+++ b/blipwren-music/music.css
@@ -0,0 +1,33 @@
+:root{--acc:#8B7BFF;--acc2:#6C4DF6;--amber:#FFB020}
+.top .btn{background:var(--amber)}
+.btn.buy{background:var(--acc2)}
+.chip.on,.player .chip.on{background:var(--acc);border-color:var(--acc);color:var(--ink)}
+.now{background:#1a1e2b;border:1px solid #2c3246;border-radius:12px;padding:12px;margin:12px 0}
+.now-main{display:flex;align-items:center;gap:12px}
+.now-txt{min-width:0}
+.now-title{font-weight:800;font-size:17px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
+.now-sub{font-size:13px;color:#aeb3c2}
+.player .btn.small{background:var(--amber);color:var(--ink)}
+.player .btn[disabled]{opacity:.45;cursor:default}
+.bar{height:6px;background:#2c3246;border-radius:4px;margin:10px 0;overflow:hidden}
+.bar i{display:block;height:100%;width:0;background:var(--acc)}
+.stingers{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
+.stingers .lbl{font-size:13px;color:#aeb3c2}
+.player .stingers .chip[disabled]{opacity:.45;cursor:default}
+.list{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:10px}
+.mood-h{grid-column:1/-1;margin:10px 0 0;font-size:14px;letter-spacing:.06em;text-transform:uppercase;color:#aeb3c2}
+.loop{position:relative;display:flex;flex-direction:column;text-align:left;background:#1a1e2b;color:#fff;border:1px solid #2c3246;border-radius:12px;padding:10px 12px;font:inherit;cursor:pointer;min-height:84px}
+.loop:hover{border-color:var(--acc)}
+.loop.playing{border-color:var(--acc);box-shadow:0 0 0 2px var(--acc) inset}
+.loop .nm{font-weight:700;font-size:15.5px;padding-right:56px}
+.loop .ds{font-size:13px;color:#aeb3c2;margin-top:2px}
+.loop .mt{font:12px/1.4 ui-monospace,Menlo,Consolas,monospace;color:#c9c2ff;margin-top:6px}
+.loop .dur{position:absolute;top:10px;right:12px;font:12px/1 ui-monospace,Menlo,Consolas,monospace;color:#aeb3c2}
+.loop .foot{display:flex;gap:8px;align-items:center;margin-top:6px}
+.loop .dl{font-size:12px;color:#fff;background:#2c3246;border-radius:6px;padding:3px 7px;text-decoration:none}
+.loop.st{min-height:64px;border-style:dashed}
+.btn.complete{margin-top:8px;width:100%;background:var(--amber);color:var(--ink)}
+@media (max-width:760px){
+ .list{grid-template-columns:1fr}
+ .now-title{font-size:15.5px}
+}
diff --git a/blipwren-music/music.json b/blipwren-music/music.json
new file mode 100644
index 0000000000000000000000000000000000000000..7d3fca54cda88eedcf4af893b443ab2f434184d3
--- /dev/null
+++ b/blipwren-music/music.json
@@ -0,0 +1 @@
+{"version":"1.0.0","loops":24,"stingers":24,"minutes":13.8,"moods":[{"id":"title","label":"Title & Menus","bpm":128,"key":"C major"},{"id":"overworld","label":"Overworld & Adventure","bpm":144,"key":"D major"},{"id":"town","label":"Towns & Shops","bpm":108,"key":"F Mixolydian"},{"id":"puzzle","label":"Puzzle & Casual","bpm":112,"key":"E Dorian"},{"id":"dungeon","label":"Dungeons & Caves","bpm":96,"key":"A Phrygian"},{"id":"boss","label":"Boss & Action","bpm":160,"key":"A harmonic minor"},{"id":"space","label":"Space & Sci-Fi","bpm":118,"key":"B minor"},{"id":"night","label":"Night & Chill","bpm":84,"key":"Eb Lydian"}],"items":[{"id":"title_press_start","type":"loop","mood":"title","title":"Press Start","desc":"Bright heroic title theme","bpm":128,"key":"C major","bars":16,"dur":30.0,"free":false},{"id":"title_main_menu","type":"loop","mood":"title","title":"Main Menu","desc":"Calm, looping menu music","bpm":100,"key":"C major","bars":16,"dur":38.4,"free":false},{"id":"title_options_screen","type":"loop","mood":"title","title":"Options Screen","desc":"Light, unobtrusive settings loop","bpm":116,"key":"C major","bars":16,"dur":33.1,"free":false},{"id":"overworld_meadow_run","type":"loop","mood":"overworld","title":"Meadow Run","desc":"Upbeat platformer level","bpm":144,"key":"D major","bars":16,"dur":26.67,"free":true},{"id":"overworld_open_road","type":"loop","mood":"overworld","title":"Open Road","desc":"Journey theme for a world map","bpm":132,"key":"D major","bars":16,"dur":29.09,"free":false},{"id":"overworld_sky_hopper","type":"loop","mood":"overworld","title":"Sky Hopper","desc":"Fast, cheerful jump-and-run","bpm":156,"key":"D major","bars":16,"dur":24.62,"free":false},{"id":"town_market_square","type":"loop","mood":"town","title":"Market Square","desc":"Friendly town, a little swing","bpm":108,"key":"F Mixolydian","bars":16,"dur":35.56,"free":false},{"id":"town_item_shop","type":"loop","mood":"town","title":"Item Shop","desc":"Cosy shop and inventory loop","bpm":108,"key":"F Mixolydian","bars":16,"dur":35.56,"free":false},{"id":"town_inn_fireside","type":"loop","mood":"town","title":"Fireside Inn","desc":"Warm, slow rest-stop theme","bpm":88,"key":"F Mixolydian","bars":16,"dur":43.64,"free":false},{"id":"puzzle_tile_logic","type":"loop","mood":"puzzle","title":"Tile Logic","desc":"Thinking music for match or grid puzzles","bpm":112,"key":"E Dorian","bars":16,"dur":34.29,"free":false},{"id":"puzzle_bubble_pop","type":"loop","mood":"puzzle","title":"Bubble Pop","desc":"Bouncy casual-game loop","bpm":124,"key":"E Dorian","bars":16,"dur":30.97,"free":false},{"id":"puzzle_clockwork","type":"loop","mood":"puzzle","title":"Clockwork","desc":"Ticking focus loop for timers and levels","bpm":104,"key":"E Dorian","bars":16,"dur":36.92,"free":false},{"id":"dungeon_deep_cave","type":"loop","mood":"dungeon","title":"Deep Cave","desc":"Tense, sparse cave crawl","bpm":96,"key":"A Phrygian","bars":16,"dur":40.0,"free":true},{"id":"dungeon_crypt_steps","type":"loop","mood":"dungeon","title":"Crypt Steps","desc":"Creeping dungeon march","bpm":96,"key":"A minor","bars":16,"dur":40.0,"free":false},{"id":"dungeon_ruin_echoes","type":"loop","mood":"dungeon","title":"Ruin Echoes","desc":"Mysterious temple ruins","bpm":90,"key":"A Phrygian","bars":16,"dur":42.67,"free":false},{"id":"boss_final_guardian","type":"loop","mood":"boss","title":"Final Guardian","desc":"Driving boss fight","bpm":160,"key":"A harmonic minor","bars":16,"dur":24.0,"free":false},{"id":"boss_chase_sequence","type":"loop","mood":"boss","title":"Chase Sequence","desc":"Frantic chase or timer run","bpm":168,"key":"A harmonic minor","bars":16,"dur":22.86,"free":false},{"id":"boss_arena_clash","type":"loop","mood":"boss","title":"Arena Clash","desc":"Battle loop for waves and arenas","bpm":150,"key":"A harmonic minor","bars":16,"dur":25.6,"free":false},{"id":"space_orbit_drift","type":"loop","mood":"space","title":"Orbit Drift","desc":"Floating space exploration","bpm":108,"key":"B minor","bars":16,"dur":35.56,"free":false},{"id":"space_star_patrol","type":"loop","mood":"space","title":"Star Patrol","desc":"Shoot-'em-up patrol theme","bpm":138,"key":"B minor","bars":16,"dur":27.83,"free":false},{"id":"space_signal_lost","type":"loop","mood":"space","title":"Signal Lost","desc":"Lonely derelict-station loop","bpm":96,"key":"B Dorian","bars":16,"dur":40.0,"free":false},{"id":"night_moonlit_lake","type":"loop","mood":"night","title":"Moonlit Lake","desc":"Soft night loop","bpm":84,"key":"Eb Lydian","bars":16,"dur":45.71,"free":false},{"id":"night_lofi_pixels","type":"loop","mood":"night","title":"Lo-fi Pixels","desc":"Laid-back chill beat","bpm":84,"key":"Eb major","bars":16,"dur":45.71,"free":false},{"id":"night_firefly_path","type":"loop","mood":"night","title":"Firefly Path","desc":"Gentle, sparkly evening walk","bpm":92,"key":"Eb Lydian","bars":16,"dur":41.74,"free":false},{"id":"title_win","type":"stinger","mood":"title","title":"Victory","desc":"Win / level clear stinger","bpm":128,"key":"C major","dur":2.07,"free":false},{"id":"title_lose","type":"stinger","mood":"title","title":"Defeat","desc":"Lose / game over stinger","bpm":128,"key":"C major","dur":2.76,"free":false},{"id":"title_start","type":"stinger","mood":"title","title":"Get Ready","desc":"Level start stinger","bpm":128,"key":"C major","dur":1.84,"free":false},{"id":"overworld_win","type":"stinger","mood":"overworld","title":"Victory","desc":"Win / level clear stinger","bpm":144,"key":"D major","dur":1.84,"free":true},{"id":"overworld_lose","type":"stinger","mood":"overworld","title":"Defeat","desc":"Lose / game over stinger","bpm":144,"key":"D major","dur":2.46,"free":false},{"id":"overworld_start","type":"stinger","mood":"overworld","title":"Get Ready","desc":"Level start stinger","bpm":144,"key":"D major","dur":1.63,"free":false},{"id":"town_win","type":"stinger","mood":"town","title":"Victory","desc":"Win / level clear stinger","bpm":108,"key":"F Mixolydian","dur":2.45,"free":false},{"id":"town_lose","type":"stinger","mood":"town","title":"Defeat","desc":"Lose / game over stinger","bpm":108,"key":"F Mixolydian","dur":3.27,"free":false},{"id":"town_start","type":"stinger","mood":"town","title":"Get Ready","desc":"Level start stinger","bpm":108,"key":"F Mixolydian","dur":2.17,"free":false},{"id":"puzzle_win","type":"stinger","mood":"puzzle","title":"Victory","desc":"Win / level clear stinger","bpm":112,"key":"E Dorian","dur":2.36,"free":false},{"id":"puzzle_lose","type":"stinger","mood":"puzzle","title":"Defeat","desc":"Lose / game over stinger","bpm":112,"key":"E Dorian","dur":3.15,"free":false},{"id":"puzzle_start","type":"stinger","mood":"puzzle","title":"Get Ready","desc":"Level start stinger","bpm":112,"key":"E Dorian","dur":2.09,"free":false},{"id":"dungeon_win","type":"stinger","mood":"dungeon","title":"Victory","desc":"Win / level clear stinger","bpm":96,"key":"A Phrygian","dur":2.75,"free":false},{"id":"dungeon_lose","type":"stinger","mood":"dungeon","title":"Defeat","desc":"Lose / game over stinger","bpm":96,"key":"A Phrygian","dur":3.68,"free":false},{"id":"dungeon_start","type":"stinger","mood":"dungeon","title":"Get Ready","desc":"Level start stinger","bpm":96,"key":"A Phrygian","dur":2.44,"free":false},{"id":"boss_win","type":"stinger","mood":"boss","title":"Victory","desc":"Win / level clear stinger","bpm":160,"key":"A harmonic minor","dur":1.67,"free":false},{"id":"boss_lose","type":"stinger","mood":"boss","title":"Defeat","desc":"Lose / game over stinger","bpm":160,"key":"A harmonic minor","dur":2.21,"free":true},{"id":"boss_start","type":"stinger","mood":"boss","title":"Get Ready","desc":"Level start stinger","bpm":160,"key":"A harmonic minor","dur":1.48,"free":false},{"id":"space_win","type":"stinger","mood":"space","title":"Victory","desc":"Win / level clear stinger","bpm":118,"key":"B minor","dur":2.24,"free":false},{"id":"space_lose","type":"stinger","mood":"space","title":"Defeat","desc":"Lose / game over stinger","bpm":118,"key":"B minor","dur":2.99,"free":false},{"id":"space_start","type":"stinger","mood":"space","title":"Get Ready","desc":"Level start stinger","bpm":118,"key":"B minor","dur":1.99,"free":false},{"id":"night_win","type":"stinger","mood":"night","title":"Victory","desc":"Win / level clear stinger","bpm":84,"key":"Eb Lydian","dur":3.14,"free":false},{"id":"night_lose","type":"stinger","mood":"night","title":"Defeat","desc":"Lose / game over stinger","bpm":84,"key":"Eb Lydian","dur":4.2,"free":false},{"id":"night_start","type":"stinger","mood":"night","title":"Get Ready","desc":"Level start stinger","bpm":84,"key":"Eb Lydian","dur":2.79,"free":false}]}
\ No newline at end of file
diff --git a/blipwren-music/og.png b/blipwren-music/og.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a4f86ab1da49cd684a1048c3389416b175892e8
--- /dev/null
+++ b/blipwren-music/og.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ec7dcabba1ef06a3960782b8b0638ee833bfcf0cfdbceb2ba70d68c84ee54c5c
+size 325155
diff --git a/blipwren-music/robots.txt b/blipwren-music/robots.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f453604cf444bc9b82542020572653dea6ca5b64
--- /dev/null
+++ b/blipwren-music/robots.txt
@@ -0,0 +1,3 @@
+User-agent: *
+Allow: /
+Sitemap: https://cybermax-tools-cybermax.static.hf.space/blipwren-music/sitemap.xml
diff --git a/blipwren-music/sitemap.xml b/blipwren-music/sitemap.xml
new file mode 100644
index 0000000000000000000000000000000000000000..687f7cc12de87b6e06799a2aa2d96ad6f835cadd
--- /dev/null
+++ b/blipwren-music/sitemap.xml
@@ -0,0 +1,4 @@
+
+
+https://cybermax-tools-cybermax.static.hf.space/blipwren-music/index.html 2026-09-26 weekly
+
diff --git a/blipwren-music/style.css b/blipwren-music/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..490f38871774df5c8c124094f23559f27ff5ef5c
--- /dev/null
+++ b/blipwren-music/style.css
@@ -0,0 +1,76 @@
+:root{--ink:#11141B;--paper:#F6F3EC;--card:#fff;--line:#e3ded2;--muted:#5b6070;--acc:#FFB020;--acc2:#6C4DF6;--acc2d:#5639d9;--ok:#0f8a5f}
+*{box-sizing:border-box}
+html{-webkit-text-size-adjust:100%}
+body{margin:0;background:var(--paper);color:var(--ink);font:16px/1.55 system-ui,-apple-system,"Segoe UI",Roboto,Inter,sans-serif}
+.wrap{max-width:1120px;margin:0 auto;padding:0 16px}
+a{color:var(--acc2d)}
+h1{font-size:clamp(28px,4.4vw,44px);line-height:1.12;margin:28px 0 10px;letter-spacing:-.02em}
+h2{font-size:22px;margin:0 0 10px}
+h3{font-size:17px;margin:18px 0 4px}
+.top{background:var(--ink);color:#fff;position:sticky;top:0;z-index:5}
+.top .btn{white-space:nowrap}
+.top .wrap{display:flex;align-items:center;justify-content:space-between;height:56px;gap:12px}
+.brand{display:flex;align-items:center;gap:8px;color:#fff;text-decoration:none;font-weight:800;font-size:19px}
+.brand small{font-weight:500;opacity:.7;font-size:13px}
+.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:var(--acc);color:var(--ink);border:0;border-radius:10px;padding:10px 16px;font:inherit;font-weight:700;text-decoration:none;cursor:pointer;min-height:44px}
+.btn:hover{filter:brightness(1.05)}
+.btn.ghost{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 2px var(--ink)}
+.btn.small{padding:6px 12px;min-height:38px;font-size:14px}
+.btn.buy{background:var(--acc2);color:#fff;width:100%;font-size:18px;margin:10px 0 6px}
+.lede{font-size:18px;max-width:820px;color:#2a2f3a}
+.facts{display:flex;flex-wrap:wrap;gap:10px;list-style:none;padding:0;margin:14px 0 18px}
+.facts li{background:#fff;border:1px solid var(--line);border-radius:999px;padding:6px 14px;font-size:14px}
+.card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:18px;margin:18px 0}
+.player{background:var(--ink);color:#fff;border-color:var(--ink)}
+.player .hint{color:#aeb3c2}
+.toolbar{display:flex;flex-direction:column;gap:12px;margin-bottom:14px}
+.tools{display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center}
+.tools input[type=search]{flex:1 1 240px;min-width:0;background:#1d2130;color:#fff;border:1px solid #333a4f;border-radius:10px;padding:10px 12px;font:inherit;min-height:44px}
+.toggle,.vol{display:flex;align-items:center;gap:8px;font-size:14px;color:#dfe2ea}
+.vol input{width:110px}
+.player .btn.ghost{color:#fff;box-shadow:inset 0 0 0 2px #fff}
+.chips{display:flex;flex-wrap:wrap;gap:8px}
+.chip{background:#fff;color:var(--ink);border:1px solid var(--line);border-radius:999px;padding:6px 12px;font:inherit;font-size:14px;cursor:pointer;min-height:36px}
+.player .chip{background:#1d2130;color:#dfe2ea;border-color:#333a4f}
+.chip.on,.player .chip.on{background:var(--acc);color:var(--ink);border-color:var(--acc);font-weight:700}
+.chip .n{opacity:.65;font-weight:500;margin-left:4px}
+.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px}
+.snd{position:relative;display:flex;flex-direction:column;align-items:stretch;text-align:left;background:#1a1e2b;color:#fff;border:1px solid #2c3246;border-radius:12px;padding:10px 10px 8px;font:inherit;cursor:pointer;min-height:92px;transition:border-color .12s,transform .08s}
+.snd:hover{border-color:var(--acc)}
+.snd:active{transform:scale(.98)}
+.snd.playing{border-color:var(--acc);box-shadow:0 0 0 2px var(--acc) inset}
+.snd .nm{font-weight:700;font-size:15px;padding-right:44px;text-transform:capitalize}
+.snd .ds{font-size:12.5px;color:#aeb3c2;line-height:1.3;margin-top:2px}
+.snd canvas{width:100%;height:28px;margin-top:6px;display:block}
+.snd .dur{position:absolute;top:10px;right:10px;font:12px/1 ui-monospace,Menlo,Consolas,monospace;color:#aeb3c2}
+.free-badge{display:inline-block;background:var(--ok);color:#fff;font-size:11px;font-weight:800;letter-spacing:.04em;border-radius:6px;padding:2px 6px;vertical-align:middle}
+.snd .foot{display:flex;justify-content:space-between;align-items:center;margin-top:6px;gap:8px}
+.snd .dl{font-size:12px;color:#fff;background:#2c3246;border-radius:6px;padding:3px 7px;text-decoration:none}
+.free-row{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;margin-top:12px}
+.pack-head{display:grid;grid-template-columns:1fr 280px;gap:24px}
+.inside{padding-left:18px;margin:10px 0 0}
+.inside li{margin:4px 0}
+.price{background:var(--paper);border-radius:14px;padding:16px;text-align:center;align-self:start}
+.price .big{font-size:46px;font-weight:900;line-height:1}
+.bundle{margin-top:10px;font-size:14px;text-align:left;border-top:1px solid var(--line);padding-top:10px}
+.hint{font-size:13.5px;color:var(--muted)}
+.code pre{background:var(--ink);color:#e9ecf3;border-radius:12px;padding:14px;overflow:auto;font:13.5px/1.5 ui-monospace,Menlo,Consolas,monospace;margin:12px 0 6px}
+.seo{max-width:860px}
+.related{margin:26px 0}
+.more{background:var(--ink);color:#cfd3dd;margin-top:30px;padding:22px 0}
+.more a{color:#fff;margin-right:16px}
+.more-title{font-weight:800;color:#fff;margin-bottom:6px}
+.more-links{display:flex;flex-wrap:wrap;gap:6px 0}
+.copy{font-size:12.5px;margin-top:10px;opacity:.75}
+.toast{position:fixed;left:50%;bottom:20px;transform:translateX(-50%);background:var(--ink);color:#fff;padding:10px 16px;border-radius:10px;opacity:0;pointer-events:none;transition:opacity .2s;max-width:90vw}
+.toast.on{opacity:1}
+@media (max-width:760px){
+ .pack-head{grid-template-columns:1fr}
+ .grid{grid-template-columns:repeat(2,minmax(0,1fr))}
+ .snd .ds{display:none}
+ .snd{min-height:78px}
+ .vol input{width:90px}
+ h1{margin-top:20px}
+ .brand small{display:none}
+ .top .btn{padding:8px 12px;min-height:40px;font-size:15px}
+}