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
15 changes: 13 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-111997.svg)](#build--distribution)
[![Electron](https://img.shields.io/badge/Electron-43-47848F.svg)](https://www.electronjs.org/)
[![Downloads](https://img.shields.io/github/downloads/CaYatur/SoundVisualizer/total?label=downloads)](https://github.com/CaYatur/SoundVisualizer/releases)
[![Tests](https://img.shields.io/badge/tests-2003%20passing-2ea043.svg)](#tests)
[![Tests](https://img.shields.io/badge/tests-2032%20passing-2ea043.svg)](#tests)
[![cayadev.com](https://img.shields.io/badge/cayadev.com-e11d2a.svg)](https://cayadev.com)

</div>
Expand Down Expand Up @@ -328,6 +328,17 @@ that asserts the bar profile has no step in it.
with the timer off, the lock stops it too, and only the leading screen picks, so every screen
changes together. The track already playing when the app opens does not count, nor does the gap
between two tracks.
- **Favourites, tags and search by author.** Star presets in the MilkDrop panel's list, or the one
on screen with *Favourite* (also from a MIDI or OSC mapping), and give them tags of your own.
Search matches the name, the author and the tags. MilkDrop names are mostly "Author - Title", so
`author:geiss` (or `yazar:`) finds Geiss's presets but not a title that mentions him, and `#calm`
finds a tag. *Show* narrows the list to favourites or one tag, *Author* to one author. *Pool*
limits auto advance — the timer, hard cuts and track changes — to favourites or one tag, while ◀,
▶, Random and the list still reach every preset. Favourites and tags live in the settings next to
your ratings, not in the preset files, and a pack carries all three: *Pack What Is Shown* writes
the presets in view with them, and importing the pack attaches them to the new copies. Checked in
an isolated copy: with the pool set to three favourites, the visualizer window went round those
three and nothing else.
- **Sprites from `milk_img.ini`.** MilkDrop 2 draws images of your own over the picture during a
show: each one is defined in `milk_img.ini` with an image, code that runs once and code that
runs every frame, and launched by number. Choose the file in the MilkDrop panel and launch from
Expand Down Expand Up @@ -1227,7 +1238,7 @@ npm test
npm start -- --smoke
```

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

- **Formulas** are checked against values derived by hand from their definitions — Viviani's curve
staying on its sphere, the torus tube radius, Chladni's m↔n antisymmetry, every attractor
Expand Down
15 changes: 13 additions & 2 deletions README.tr.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-111997.svg)](#paketleme--dağıtım)
[![Electron](https://img.shields.io/badge/Electron-43-47848F.svg)](https://www.electronjs.org/)
[![İndirme](https://img.shields.io/github/downloads/CaYatur/SoundVisualizer/total?label=indirme)](https://github.com/CaYatur/SoundVisualizer/releases)
[![Test](https://img.shields.io/badge/test-2003%20geçiyor-2ea043.svg)](#testler)
[![Test](https://img.shields.io/badge/test-2032%20geçiyor-2ea043.svg)](#testler)
[![cayadev.com](https://img.shields.io/badge/cayadev.com-e11d2a.svg)](https://cayadev.com)

</div>
Expand Down Expand Up @@ -321,6 +321,17 @@ profilinde basamak olmadığını doğruluyor.
dahil. Zamanlayıcı kapalıyken de çalışıyor, kilit bunu da durduruyor ve seçimi yalnız lider ekran
yapıyor, yani bütün ekranlar birlikte değişiyor. Uygulama açılırken zaten çalan parça sayılmıyor,
iki parça arasındaki boşluk da.
- **Favoriler, etiketler ve yazara göre arama.** MilkDrop panelinin listesinde presetleri yıldızla
işaretleyin, ekrandakini *Favori* ile (bir MIDI ya da OSC eşlemesinden de) ve onlara kendi
etiketlerinizi verin. Arama adda, yazarda ve etiketlerde. MilkDrop adları çoğunlukla "Yazar -
Başlık"; `yazar:geiss` (ya da `author:`) Geiss'in presetlerini buluyor, adını anan bir başlığı
değil, `#sakin` bir etiketi buluyor. *Süz* listeyi favorilere ya da bir etikete, *Yazar* bir
yazara daraltıyor. *Havuz* otomatik geçişi — zamanlayıcı, sert geçiş ve parça değişimi —
favorilerle ya da bir etiketle sınırlıyor; ◀, ▶, Rastgele ve liste yine bütün presetlere gidiyor.
Favori ve etiketler puanlarınızın yanında, ayarlarda duruyor, preset dosyalarında değil; paket
üçünü de taşıyor: *Görünenleri Paketle* listede görünen presetleri onlarla birlikte yazıyor, paketi
içe aktarmak onları yeni kopyalara bağlıyor. Yalıtılmış bir kopyada denetlendi: havuz üç favoriye
ayarlıyken görselleştirici penceresi o üçünde döndü, başka hiçbir presete geçmedi.
- **`milk_img.ini`'den sprite'lar.** MilkDrop 2 gösteri sırasında kendi resimlerinizi görüntünün
üstüne çiziyor: her biri `milk_img.ini`de bir resim, bir kez çalışan ve her kare çalışan koduyla
tanımlı ve numarasıyla başlatılıyor. Dosyayı MilkDrop panelinde seçin; panelin listesinden, bir
Expand Down Expand Up @@ -1224,7 +1235,7 @@ npm test
npm start -- --smoke
```

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

- **Formüller**, tanımlarından elle türetilmiş değerlerle sınanıyor — Viviani eğrisinin küre
üzerinde kalması, simidin boru yarıçapı, Chladni'nin m↔n antisimetrisi, her çekicinin sınırlı
Expand Down
54 changes: 52 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,9 @@ npm test
npm start -- --smoke
```

- **2003 unit tests, all passing** on `main`. 703 of those shipped in v3.1.0;
- **2032 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, and 406
that tag — 469 more with v3.1.4, most of them from the MilkDrop work, and 435
on `main` since.
Formulas are checked against values derived
by hand from their definitions — Viviani's curve staying on its sphere, the
Expand Down Expand Up @@ -1565,6 +1565,56 @@ rest after. No version number yet.
and `_ensurePreset` in a fake window with a fake `matchMedia`, draw the
panel with a fake DOM, and follow *Always* from the export job to the
layer the engine draws. 29 of 29 mutations are caught.
- **Favourites, tags and search by author (#576)** · done. Search matched
the name only.
- **Where they live.** Favourites and free-form tags are the user's, not
the preset's: in the settings next to the ratings (#569), keyed by
preset id (`milkdropLibrary.favorites`, `milkdropLibrary.tags`), outside
every scene. The preset files are untouched.
- **In a pack.** Ids differ on the other side — an import gives every
preset a new one — so a pack carries each preset's own `library` record
(favourite, tags, rating), and the import folds it onto the new id. The
record never reaches the preset file, and only presets that were really
saved get one. Both the MilkDrop panel (*Pack What Is Shown*, *Import
Pack*) and the Studio's pack export do this. Built-in presets stay out of
packs: every install has them.
- **Author.** MilkDrop files have no author field; names are mostly
"Author - Title" ("Flexi, martin + geiss - …"). The author comes from
the name at search time, so nothing on disk needs migrating. `+`, `&`
and commas separate authors; the first " - " ends them; a part without a
letter is no author.
- **Search.** Words match the name (also the translated name of a
built-in), the authors and the tags, and all must match. `#tag` or
`tag:`/`etiket:` search tags only, `author:`/`yazar:` authors only.
Comparison ignores case and the Turkish I/ı, İ/i difference. *Show*
narrows to favourites or one tag, *Author* to one author; these are
view settings and send no config.
- **Pool.** Auto advance — the timer, hard cuts, track changes and the
look-ahead compile (#573) — can pick from favourites or one tag only
(`milkdrop.autoFrom`/`autoTag`, saved with the scene). The filter sits
where the cycle's list is built; an empty or one-preset pool says so
through the cycle's own reasons (EMPTY, ALONE) and in the panel. A
follower does not filter: the leader's pick already came from the pool.
◀, ▶, Random and the list reach every preset.
- **Also:** *Favourite* for the preset on screen, as a button and a MIDI/
OSC action; deleting a preset clears its rating, favourite and tags; a
search or filter hidden because six or fewer presets remain no longer
keeps narrowing the list.
- **Measured** in an isolated copy with eight presets of our own. Stars in
the list and the on-screen *Favourite* wrote the settings;
`author:martin` found the three Martin presets and not a title naming
him; with the pool on three favourites the visualizer window went round
those three for nine seconds and nothing else. A pack of the eight
carried two records; imported through the real save path, the favourites
and tags landed on the new ids and in `settings.json`, and no preset
file held a `library` field. The file dialog itself was not driven: the
bridge object cannot be stubbed from the page.
- **Tests.** 29 tests cover authors, folding, tags, search, the pool, the
pack round trip, the engine's own `_autoCycle` with a pool (timer, hard
cut, track change, follower), a pick made in advance that the pool no
longer holds, and the panel drawn with a fake DOM — its own pack buttons
included, with only the file dialogs stubbed, and ◀/▶/🎲 still reaching
presets outside the pool. 49 of 49 mutations are caught.

## v3.1.6 — Comprehensive video export

Expand Down
2 changes: 2 additions & 0 deletions src/admin/control.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@
{ action: 'mdLock', label: '🔒 MilkDrop · Kilit (aç/kapa)' },
{ action: 'mdRateUp', label: '⭐ MilkDrop · Puanı Artır' },
{ action: 'mdRateDown', label: '⭐ MilkDrop · Puanı Azalt' },
// Ekrandaki preset favorilere girer ya da çıkar (#576)
{ action: 'mdFavorite', label: '★ MilkDrop · Favori (aç/kapa)' },
/* Sprite'lar (#577): başlatma hedefleri ini'deki her sprite için canlı
ekleniyor (milkdrop-panel.js `spriteTargets`); silme üçü sabit. */
{ action: 'mdSpriteNewest', label: '🖼 MilkDrop · Sprite: En Yeniyi Sil' },
Expand Down
1 change: 1 addition & 0 deletions src/admin/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ <h2 id="settingsTitle">Ayarlar</h2>
<script src="../shared/milkdrop-hlsl.js"></script>
<script src="../shared/milkdrop-shader.js"></script>
<script src="../shared/milkdrop-cycle.js"></script>
<script src="../shared/milkdrop-library.js"></script>
<script src="../shared/demo-audio.js"></script>
<script src="../shared/recorder.js"></script>
<script src="../shared/templates.js"></script>
Expand Down
Loading
Loading