Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# CaYaDev presetleri (#825): .milk dosyaları CRLF olarak birebir saklanır;
# gömülü kopya ve sürüm zip'i her işletim sisteminde aynı baytları taşısın.
presets/cayadev/*.milk -text
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ GitHub. The full reasoning and the measurements behind each change are in [ROADM

Changes on `main` after 3.1.6-beta, not in any build yet.

### CaYaDev MilkDrop Presets [825]

- **Our own shader presets, built in.** The first five of a planned 50+: *Neon Monsoon* (liquid), *Event Horizon* (tunnel), *Prism Lattice* (geometric), *Northern Veil* (ambient scene) and *Twelve Moons* (MilkDrop 3). They sit next to the five original built-ins in the preset list and auto advance, with English names and author "CaYaDev".
- **Free to use elsewhere under CC BY 4.0.** The `.milk` files are in [`presets/cayadev`](presets/cayadev) with a license and a README, and `node scripts/preset-pack.js --zip` builds the release zip (`CaYaDev-MilkDrop-Presets-<version>.zip`, now in the release asset list). The app embeds them from that folder; a test fails if the embedded copy drifts from the files.
- **Checked before they were added.** Each preset has warp and comp shaders. Each was run for 90 s on looped music (no fade to black, white-out or freeze), measured at 1080p (12–13.5 ms per frame on a Radeon 610M iGPU, 5.5–7 ms on an RTX 5070 Laptop), and compared at 60 and 144 Hz (same average brightness). The MilkDrop 2 presets were also rendered in MilkDrop 2 itself (BeatDrop): same picture. The MilkDrop 3 preset was checked only in our engine.
- **Two MilkDrop 2 rules the comparison caught, now enforced by tests.** MilkDrop 2 does not pass `aspectx`/`aspecty` to custom wave and shape code, so the presets carry them in q31/q32. Prefixed noise samplers such as `sampler_pw_noise_lq` must be declared in the shader; otherwise MilkDrop drops the comp shader while our engine runs it anyway.

### Audio bridge: its own window for everything, mode switch with restart, clock fix [822]

- **The bridge window is the bridge's whole UI.** Three tabs, Status, Sources and Settings, under a header that stays on top. Settings has the bridge name, the pairing secret (show, copy, New Secret with a warning that receivers drop), the port, this computer's addresses with the port and a copy button (for a receiver that has to type the address), the firewall rule, "Start the Bridge at Sign-in" (installed and portable builds; Windows startup list, Linux autostart), "Don't Open the Status Window at Start", and the way out of bridge mode. The panel is still there as "Advanced Settings (Panel)" but is no longer needed. Fields are saved when you leave them, and the window no longer redraws under a field while you type.
Expand Down
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ layers and **40 GPU effects**, an **OBS overlay**, **Spout / Syphon**, **project
[![Downloads](https://img.shields.io/github/downloads/CaYatur/SoundVisualizer/total?label=downloads)](https://github.com/CaYatur/SoundVisualizer/releases)
[![License: MIT](https://img.shields.io/badge/License-MIT-e11d2a.svg)](LICENSE)
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-111997.svg)](#download)
[![Tests](https://img.shields.io/badge/tests-3498%20passing-2ea043.svg)](#tests)
[![Tests](https://img.shields.io/badge/tests-3508%20passing-2ea043.svg)](#tests)
[![Electron](https://img.shields.io/badge/Electron-43-47848F.svg)](https://www.electronjs.org/)

<a href="https://github.com/CaYatur/SoundVisualizer/releases/latest"><img src="https://img.shields.io/badge/Download-Windows-0a84ff?style=for-the-badge" alt="Download for Windows" /></a>
Expand Down Expand Up @@ -378,6 +378,10 @@ shaders are translated to GLSL and run on the GPU.
- **Five presets of our own ship with the app** — *Aurora*, *Molten Gold*, *Still Rings*, *Endless
Tunnel* and *Pulse Weave* — so the engine shows what it does before you import anything. No
third-party preset pack is bundled.
- **CaYaDev MilkDrop Presets: 5 shader presets of our own, built in.** Each one has warp and comp shaders, and
each was checked against MilkDrop 2 itself, for 90 s of stability, at 60 and 144 Hz, and for 60 fps at 1080p on
an entry-level integrated GPU. They are also free to use in any MilkDrop player under CC BY 4.0: get them from
[`presets/cayadev`](presets/cayadev) or as the zip on each release.
- **Import a whole library** — from a ZIP pack, a folder, or by searching this
computer (Winamp, foobar2000 and projectM folders, Downloads, Desktop, Music, Documents). You see
what will be added before anything is copied; duplicates are skipped; textures come along; folder
Expand Down Expand Up @@ -1329,6 +1333,9 @@ it off restores the engine's earlier look.
classic tunnel) and *Nabız Örgüsü* (squares on the beat over a motion-vector weave) — written
here, so the engine shows what it does before you import a pack of your own. They join auto
advance like any other preset. The two pictures on this page are rendered from them.
- **The CaYaDev MilkDrop Presets** ([`presets/cayadev`](presets/cayadev), CC BY 4.0) are built in next to
them: shader presets written from scratch, MilkDrop 2 and MilkDrop 3. The folder README lists the checks each
one passed; the zip on each release holds the same files.
- **No preset text is copied into generated code.** There is no `eval` and no generated source:
each node becomes a closure, identifiers become pool indices, and function names are resolved
against a fixed table at compile time.
Expand Down Expand Up @@ -1781,7 +1788,7 @@ npm test
npm start -- --smoke
```

**3498 unit tests, all passing.** They are written to check answers, not to exercise lines:
**3508 unit tests, all passing.** They are written to check answers, not to exercise lines:

_The count is the runner's total (`# tests`). A few tests depend on the environment (a git checkout, Node 22's built-in WebSocket, the electron-builder schema); where that is missing they are reported as skipped, not passed, so `pass + skipped` always equals this number and the skipped count may be 0 on one machine and 1–4 on another._

Expand Down Expand Up @@ -1849,6 +1856,7 @@ src/
transitions, warp, MilkDrop, templates, lyrics, timeline, clip deck
web/ OBS overlay and the phone remote
native/ Audio helpers (per-application capture, Dynamic Lighting identity)
presets/ CaYaDev MilkDrop Presets (.milk, CC BY 4.0), embedded by scripts/preset-pack.js
scripts/ Build, release, benchmark, MilkDrop corpus and render harnesses
tests/ Unit tests, run by `npm test`
docs/ Screenshots and benchmark results
Expand Down
13 changes: 11 additions & 2 deletions README.tr.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ destesi**, ve **MCP üzerinden yapay zekâ kontrolü**.
[![İndirme](https://img.shields.io/github/downloads/CaYatur/SoundVisualizer/total?label=indirme)](https://github.com/CaYatur/SoundVisualizer/releases)
[![Lisans: MIT](https://img.shields.io/badge/Lisans-MIT-e11d2a.svg)](LICENSE)
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-111997.svg)](#hızlı-başlangıç)
[![Test](https://img.shields.io/badge/test-3498%20geçiyor-2ea043.svg)](#testler)
[![Test](https://img.shields.io/badge/test-3508%20geçiyor-2ea043.svg)](#testler)
[![Electron](https://img.shields.io/badge/Electron-43-47848F.svg)](https://www.electronjs.org/)

<a href="https://github.com/CaYatur/SoundVisualizer/releases/latest"><img src="https://img.shields.io/badge/%C4%B0ndir-Windows-0a84ff?style=for-the-badge" alt="Windows için indir" /></a>
Expand Down Expand Up @@ -379,6 +379,11 @@ composite shader'ları GLSL'e çevrilip GPU'da çalışıyor.
- **Uygulama kendi beş presetiyle geliyor** — *Kutup Işığı*, *Erimiş Altın*, *Dingin Halkalar*,
*Sonsuz Tünel* ve *Nabız Örgüsü* — böylece motor, siz hiçbir şey içe aktarmadan ne yaptığını
gösteriyor. Üçüncü taraf preset paketi gelmiyor.
- **CaYaDev MilkDrop Presetleri: 5 shader presetimiz uygulamaya gömülü.** Her birinde warp ve comp shader'ı var.
Her biri MilkDrop 2'nin kendisiyle karşılaştırıldı, 90 sn kararlılık testinden geçti, 60 ve 144 Hz'te denendi
ve giriş seviyesi bir tümleşik GPU'da 1080p'de 60 fps'ye ölçüldü. CC BY 4.0 ile her MilkDrop oynatıcısında
ücretsiz kullanılabilirler: [`presets/cayadev`](presets/cayadev) klasöründen ya da her sürümdeki zip'ten
indirebilirsiniz.
- **Bütün bir kütüphaneyi içe aktarın** — bir ZIP paketinden, bir klasörden ya da bu
bilgisayarı arayarak (Winamp, foobar2000 ve projectM klasörleri, İndirilenler, Masaüstü, Müzik,
Belgeler). Bir şey kopyalanmadan önce ne ekleneceğini görüyorsunuz; aynıları atlanıyor; dokular da
Expand Down Expand Up @@ -1335,6 +1340,9 @@ kapatmak motorun önceki görünümünü geri getiriyor.
*Nabız Örgüsü* (hareket vektörlerinin dokuduğu örgünün üstünde vuruşla zıplayan kareler) — hepsi
burada yazıldı, yani kendi paketinizi eklemeden de motorun ne yaptığı görünüyor. Otomatik geçişe
de öteki presetler gibi giriyorlar. Bu sayfadaki iki görsel onlardan alındı.
- **CaYaDev MilkDrop Presetleri** ([`presets/cayadev`](presets/cayadev), CC BY 4.0) onların yanında gömülü
geliyor: sıfırdan yazılmış, MilkDrop 2 ve MilkDrop 3 shader presetleri. Her birinin geçtiği denetimler
klasörün README'sinde; her sürümdeki zip aynı dosyaları taşıyor.
- **Preset metninden üretilen koda hiçbir şey kopyalanmıyor.** Tanımlayıcılar havuz indekslerine
dönüşüyor, yani bir preset JavaScript kaçıramaz. Bir enjeksiyon testi bunu doğruluyor.
- **HLSL warp ve composite shader'ları GLSL'e çevrilip GPU'da koşuyor.** Gerçek bir WebGL2
Expand Down Expand Up @@ -1785,7 +1793,7 @@ npm test
npm start -- --smoke
```

**3498 birim testi, hepsi geçiyor.** Satır çalıştırmak için değil, cevap denetlemek için yazıldılar:
**3508 birim testi, hepsi geçiyor.** Satır çalıştırmak için değil, cevap denetlemek için yazıldılar:

_Sayı koşunun toplamıdır (`# tests`). Birkaç test ortama bağlı (git çalışma kopyası, Node 22'nin yerleşik WebSocket'i, electron-builder şeması); bunlar eksikse geçti değil atlandı sayılır. Yani `geçen + atlanan` hep bu sayıya eşittir; atlanan sayısı bir makinede 0, başka birinde 1–4 olabilir._

Expand Down Expand Up @@ -1854,6 +1862,7 @@ src/
geçişler, bükme, MilkDrop, şablonlar, şarkı sözü, zaman çizelgesi, klip destesi
web/ OBS katmanı ve telefon kumandası
native/ Ses yardımcıları (uygulama başına yakalama, Dynamic Lighting kimliği)
presets/ CaYaDev MilkDrop Presetleri (.milk, CC BY 4.0); scripts/preset-pack.js gömüyor
scripts/ Derleme, sürüm, performans ölçümü, MilkDrop derlemi ve çizim ölçüm araçları
tests/ `npm test` ile çalışan birim testleri
docs/ Ekran görüntüleri ve ölçüm sonuçları
Expand Down
2 changes: 1 addition & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ npm test
npm start -- --smoke
```

- **3498 unit tests, all passing** on `main`. 703 of those shipped in v3.1.0;
- **3508 unit tests, all passing** on `main`. 703 of those shipped in v3.1.0;
105 came with v3.1.1; 163 came with v3.1.2; 157 came with v3.1.3 — 1128 at
that tag — 469 more with v3.1.4, most of them from the MilkDrop work — 1597 at
that tag — 1402 more with v3.1.5 — 2999 at that tag — and 27
Expand Down
181 changes: 181 additions & 0 deletions presets/cayadev/CaYaDev - Event Horizon.milk
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
MILKDROP_PRESET_VERSION=201
PSVERSION=3
PSVERSION_WARP=3
PSVERSION_COMP=3
[preset00]
fRating=5
fGammaAdj=1
fDecay=1
fVideoEchoZoom=1
fVideoEchoAlpha=0
nVideoEchoOrientation=0
nWaveMode=0
bAdditiveWaves=0
bWaveDots=0
bWaveThick=0
bModWaveAlphaByVolume=0
bMaximizeWaveColor=0
bTexWrap=1
bDarkenCenter=0
bRedBlueStereo=0
bBrighten=0
bDarken=0
bSolarize=0
bInvert=0
fWaveAlpha=0
fWaveScale=1
fWaveSmoothing=0.75
fWaveParam=0
fModWaveAlphaStart=0.75
fModWaveAlphaEnd=0.95
fWarpAnimSpeed=1
fWarpScale=1
fZoomExponent=1
fShader=0
zoom=1
rot=0
cx=0.5
cy=0.5
dx=0
dy=0
warp=0
sx=1
sy=1
wave_r=1
wave_g=1
wave_b=1
wave_x=0.5
wave_y=0.5
ob_size=0
ob_r=0
ob_g=0
ob_b=0
ob_a=0
ib_size=0
ib_r=0
ib_g=0
ib_b=0
ib_a=0
nMotionVectorsX=12
nMotionVectorsY=9
mv_dx=0
mv_dy=0
mv_l=0.9
mv_r=1
mv_g=1
mv_b=1
mv_a=0
b1n=0
b2n=0
b3n=0
b1x=1
b2x=1
b3x=1
b1ed=0
wavecode_0_enabled=1
wavecode_0_samples=400
wavecode_0_sep=0
wavecode_0_bSpectrum=0
wavecode_0_bUseDots=0
wavecode_0_bDrawThick=0
wavecode_0_bAdditive=1
wavecode_0_scaling=1
wavecode_0_smoothing=0.5
wavecode_0_r=1
wavecode_0_g=1
wavecode_0_b=1
wavecode_0_a=0
wave_0_per_frame1=a = q8*0.9;
wave_0_per_point1=x = sample;
wave_0_per_point2=y = 0.92 + value1*0.12*sin(sample*3.14159);
wave_0_per_point3=r = 0;
wave_0_per_point4=g = 1;
wave_0_per_point5=b = 0;
shapecode_0_enabled=1
shapecode_0_sides=4
shapecode_0_additive=1
shapecode_0_thickOutline=0
shapecode_0_textured=0
shapecode_0_num_inst=6
shapecode_0_x=0.5
shapecode_0_y=0.5
shapecode_0_rad=0.003
shapecode_0_ang=0
shapecode_0_tex_ang=0
shapecode_0_tex_zoom=1
shapecode_0_r=1
shapecode_0_g=0
shapecode_0_b=0
shapecode_0_a=1
shapecode_0_r2=1
shapecode_0_g2=0
shapecode_0_b2=0
shapecode_0_a2=0
shapecode_0_border_r=1
shapecode_0_border_g=1
shapecode_0_border_b=1
shapecode_0_border_a=0
shape_0_per_frame1=x = rand(1000)*0.001;
shape_0_per_frame2=y = 0.9;
shape_0_per_frame3=rad = 0.002 + 0.003*treb_att;
shape_0_per_frame4=a = 0.4 + 0.6*min(1, mid_att);
per_frame_init_1=beat = 0;
per_frame_init_2=last = 0;
per_frame_init_3=glow = 0;
per_frame_init_4=travel = 0;
per_frame_1=q30 = 60/max(fps, 15);
per_frame_2=q31 = aspectx;
per_frame_3=q32 = aspecty;
per_frame_4=travel = travel + (0.35 + 0.55*bass_att)/fps;
per_frame_5=dy = -(0.18 + 0.30*bass_att)/fps;
per_frame_6=beat = (bass > 1.22)*((time - last) > 0.22);
per_frame_7=last = if(beat, time, last);
per_frame_8=glow = max(glow*0.9, beat);
per_frame_9=q1 = sin(time*0.23);
per_frame_10=q2 = cos(time*0.19)*0.6;
per_frame_11=q3 = time*0.02 + 0.06*sin(time*0.11);
per_frame_12=q4 = travel;
per_frame_13=q5 = 0.045 + 0.008*bass_att;
per_frame_14=q6 = glow;
per_frame_15=q7 = time*0.012 + 0.1*sin(time*0.05);
per_frame_16=q8 = beat;
warp_1=`shader_body
warp_2=`{
warp_3=` ret = tex2D(sampler_main, uv).xyz;
warp_4=` ret.x *= pow(0.986, q30);
warp_5=` ret.y *= pow(0.993, q30);
warp_6=` ret -= 0.001 * q30;
warp_7=`}
comp_1=`shader_body
comp_2=`{
comp_3=` float2 p = (uv - 0.5) * aspect.xy - float2(q1, q2) * 0.04;
comp_4=` float r = length(p);
comp_5=` float a = atan2(p.y, p.x);
comp_6=` float depth = 0.12 / (r + 0.01);
comp_7=` float2 tuv = float2(a * 0.159155 + q3, depth);
comp_8=` float2 puv = float2(tuv.x * 3.0, depth * 0.35 - q4);
comp_9=` float n1 = tex2D(sampler_noise_hq, puv).x;
comp_10=` float n2 = tex2D(sampler_noise_hq, puv * float2(2.0, 2.3) + float2(0.37, n1 * 0.4)).x;
comp_11=` float plasma = pow(saturate(1.0 - abs(n2 * 2.0 - 1.0)), 6.0) * 0.9 + n1 * 0.12;
comp_12=` float3 w = tex2D(sampler_fw_main, tuv).xyz;
comp_13=` float3 wb = GetBlur1(frac(tuv));
comp_14=` float streak = w.x * 1.6 + wb.x * 0.8;
comp_15=` float ring = w.y * 1.2 + wb.y * 0.9;
comp_16=` float fog = saturate((r - 0.035) * 2.6);
comp_17=` fog = fog * fog;
comp_18=` float shade = 0.7 + 0.3 * sin(a + 1.5708 + q1 * 0.3);
comp_19=` float3 near = 0.5 + 0.5 * cos(6.28318 * (q7 + float3(0.0, 0.33, 0.67)));
comp_20=` float3 far = 0.5 + 0.5 * cos(6.28318 * (q7 + 0.38 + float3(0.0, 0.33, 0.67)));
comp_21=` near = lerp(near, float3(1.0, 0.6, 0.25), 0.35);
comp_22=` float3 col = lerp(far, near, saturate(r * 2.0));
comp_23=` float3 pcol = lerp(col, near, plasma);
comp_24=` ret = plasma * pcol * 1.4 * (0.75 + 0.5 * bass_att) * fog * shade;
comp_25=` ret += (streak * lerp(col, float3(1, 1, 1), 0.4) + ring * col * 1.4 * (0.6 + 0.6 * q6)) * fog;
comp_26=` float wob = (tex2D(sampler_noise_lq, float2(a * 0.159155 * 4.0, time * 0.1)).x - 0.5) * 0.012;
comp_27=` float acc = exp(-pow((r - q5 - wob) * 160.0, 2.0));
comp_28=` float halo = exp(-pow((r - q5 - wob) * 35.0, 2.0));
comp_29=` ret += acc * float3(1.0, 0.97, 0.92) * (0.5 + 1.0 * q6);
comp_30=` ret += halo * near * (0.35 + 0.9 * q6);
comp_31=` ret *= saturate((r - q5 * 0.85) * 60.0) * 0.85 + 0.15 * saturate(r * 30.0);
comp_32=` ret = 1.0 - exp(-ret * 1.5);
comp_33=`}
Loading
Loading