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) + + + + + + + + + + + + + + + + + + +
+ Blipwren Music by CyberMax + Get all 72 tracks · $8 +
+ +
+
+

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.

+ +
+ +
+
+
+
+ +
Tap a loop to play it
+
Then drop a stinger on top: it's in the same key.
+
+ +
+ Stinger over the music: + + + +
+
+
+

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.

+
+ Download the free loops + stingers (.zip) + WAV + OGG, same licence as the pack: free for commercial games. +
+
+ +
+
+
+

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).
+
Blipwren Complete: $11 instead of $14. This pack plus Blipwren SFX Vol. 1 (120 retro sound effects in the same style): menus, coins, jumps, hits and music in one go. + Get Blipwren Complete · $11
+
+
+
+ +
+

Music that follows your game, in a few lines

+
+ + + +
+
# 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
+ + +

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.html2026-09-26weekly + 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} +}