Files
Matteo Benedetto e17dba5857 docs: aggiungi avatar del tema e referenzialo nel README
- preview/avatar.png: emblema 512x512 nello stile del tema (immagine
  generata con IA, non coperta dalle licenze di audio e codice)
- README: mostra l'avatar in testa e chiarisce la licenza dell'immagine
- dist/: tarball aggiornato
2026-09-20 16:28:08 +02:00

242 lines
9.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Voyager — sound theme for KDE Plasma
<img src="preview/avatar.png" alt="Voyager" width="120" align="right">
*A signal that has been travelling for a very long time*
A complete, [freedesktop Sound Theme
specification](https://specifications.freedesktop.org/sound-theme-spec/latest/)
compliant sound theme for **KDE Plasma 6** (and any other desktop that honours
the spec). 61 cues, all of them synthesised from scratch — no sample
library, no third-party audio, no attribution burden. The whole theme is
reproducible from the script in `tools/`.
```
kde-sound-theme-voyager/
├── Voyager/
│ ├── index.theme # [Sound Theme] + [stereo] OutputProfile
│ └── stereo/ # 61 × Ogg Vorbis 48 kHz stereo
├── tools/
│ ├── gen_sounds.py # the synthesis engine (reproducible)
│ ├── verify_theme.py # spec + audio + KDE coverage checks
│ ├── make_preview.py # rebuilds preview/index.html
│ └── preview_template.html
├── preview/
│ ├── index.html # player nel browser per ogni cue
│ └── avatar.png # icona del tema (512×512)
├── LICENSES/
├── Makefile
└── install.sh
```
## Character
Voyager is a probe on the edge of the heliosphere. Voices are pushed through narrowband bandpass filtering, amplitude-modulated by a square tremolo at 9 Hz and quantised to 7 bits with sample-and-hold, so every cue carries the artefacts of a link that is barely holding. Telemetry beep patterns carry the state information; there is a noise floor underneath almost everything.
| Motif | Used for |
|---|---|
| Narrowband AM radio burst | message, calling, attention |
| Telemetry beep pattern | state, busy, authentication |
| Square-tremolo degradation | every transmission artefact |
| Low telemetry root, spare bass | probe-console character |
| Sonar sweep with noise floor | scan, probe return |
## Requirements
* KDE Plasma 6, or any desktop implementing the freedesktop sound theme spec
* nothing at runtime — the cues are plain Ogg Vorbis files
* `ffmpeg` (libvorbis), `python3`, `numpy`, `scipy` **only** if you want to
regenerate the audio
## Install
User-local (recommended, no root needed):
```sh
git clone https://git.enne2.net/enne2/kde-sound-theme-voyager.git
cd kde-sound-theme-voyager
./install.sh # copies Voyager/ into ~/.local/share/sounds/
```
System-wide:
```sh
sudo make install-system # copies Voyager/ into /usr/share/sounds/
```
## Select the theme
**System Settings → Colors & Themes → System Sounds → Voyager**
Or from the command line:
```sh
kwriteconfig6 --file kdeglobals --group Sounds --key Theme Voyager
```
To go back to the Plasma default:
```sh
kwriteconfig6 --file kdeglobals --group Sounds --key Theme ocean
```
The theme declares `Inherits=freedesktop`, so any event it does not provide
(e.g. multi-channel test signals) falls back to the stock desktop theme instead
of going silent.
## What is inside
`Voyager/index.theme` declares the theme, `Directories=stereo`,
`OutputProfile=stereo` and `Example=theme-demo`. The `Example` key is what the
Plasma *System Sounds* KCM uses for its preview button, so `theme-demo.oga` is a
montage of the theme's signatures rather than an arbitrary cue.
`Name[it]` and `Comment[it]` are also provided, so Plasma in an Italian locale
lists the theme as **Voyager**. That is a display name only: the theme id — the
folder name in `~/.local/share/sounds/` and the value written to
`kdeglobals` — is always `Voyager`, exactly like KDE's own Ocean theme shows up
as *Oceano* in Italian.
| sound name | duration | size |
|---|---:|---:|
| `alarm-clock-elapsed` | 2.66 s | 43.6 KiB |
| `audio-test-signal` | 1.10 s | 21.1 KiB |
| `audio-volume-change` | 0.13 s | 6.7 KiB |
| `battery-caution` | 1.18 s | 22.2 KiB |
| `battery-full` | 1.05 s | 20.4 KiB |
| `battery-low` | 1.18 s | 21.0 KiB |
| `bell-terminal` | 0.15 s | 7.1 KiB |
| `bell-window-system-attention` | 0.94 s | 18.0 KiB |
| `bell-window-system` | 0.88 s | 17.1 KiB |
| `bell` | 1.26 s | 21.3 KiB |
| `button-pressed-modifier` | 0.12 s | 7.1 KiB |
| `button-pressed` | 0.11 s | 6.9 KiB |
| `camera-shutter` | 0.26 s | 9.7 KiB |
| `complete-media-burn` | 2.26 s | 40.0 KiB |
| `complete-media-error` | 1.72 s | 35.1 KiB |
| `complete` | 0.83 s | 16.9 KiB |
| `completion-fail` | 1.38 s | 23.0 KiB |
| `completion-partial` | 1.12 s | 20.2 KiB |
| `completion-rotation` | 1.68 s | 28.2 KiB |
| `completion-success` | 2.14 s | 38.2 KiB |
| `desktop-login` | 2.90 s | 45.4 KiB |
| `desktop-logout` | 2.20 s | 32.7 KiB |
| `device-added` | 0.64 s | 15.5 KiB |
| `device-removed` | 0.64 s | 15.2 KiB |
| `dialog-error-critical` | 2.32 s | 44.2 KiB |
| `dialog-error-serious` | 1.80 s | 36.2 KiB |
| `dialog-error-veryserious` | 2.70 s | 40.2 KiB |
| `dialog-error` | 1.48 s | 32.1 KiB |
| `dialog-information` | 1.13 s | 20.6 KiB |
| `dialog-question` | 1.14 s | 21.9 KiB |
| `dialog-special` | 1.86 s | 35.9 KiB |
| `dialog-warning-auth` | 1.00 s | 19.5 KiB |
| `dialog-warning` | 1.27 s | 22.2 KiB |
| `game-over-loser` | 2.60 s | 47.9 KiB |
| `game-over-winner` | 3.02 s | 54.3 KiB |
| `media-insert-request` | 0.87 s | 17.7 KiB |
| `message-attention` | 1.16 s | 23.7 KiB |
| `message-contact-in` | 1.05 s | 19.4 KiB |
| `message-contact-out` | 1.05 s | 19.3 KiB |
| `message-highlight` | 0.86 s | 18.3 KiB |
| `message-new-email` | 1.48 s | 26.8 KiB |
| `message-new-instant` | 0.92 s | 17.3 KiB |
| `message-sent-instant` | 0.45 s | 10.6 KiB |
| `message` | 0.80 s | 16.6 KiB |
| `network-connectivity-established` | 1.66 s | 30.7 KiB |
| `network-connectivity-lost` | 1.26 s | 22.4 KiB |
| `outcome-failure` | 1.32 s | 29.1 KiB |
| `outcome-success` | 1.62 s | 30.3 KiB |
| `phone-incoming-call` | 2.44 s | 44.3 KiB |
| `phone-outgoing-busy` | 1.30 s | 24.2 KiB |
| `phone-outgoing-calling` | 1.16 s | 23.7 KiB |
| `power-plug` | 0.78 s | 16.0 KiB |
| `power-unplug` | 0.88 s | 18.6 KiB |
| `screen-capture` | 0.30 s | 10.2 KiB |
| `service-login` | 1.34 s | 23.5 KiB |
| `service-logout` | 1.24 s | 22.2 KiB |
| `suspend-error` | 1.92 s | 38.0 KiB |
| `theme-demo` | 11.39 s | 185.1 KiB |
| `trash-empty` | 0.95 s | 19.8 KiB |
| `window-attention` | 1.43 s | 24.4 KiB |
| `window-question` | 1.04 s | 20.6 KiB |
## Rebuilding from source
The audio is generated, not sampled, so it is fully reproducible:
```sh
make generate # rewrites Voyager/stereo/*.oga from tools/gen_sounds.py
make verify # spec + audio + KDE coverage checks
make preview # rebuild preview/index.html
make dist # build dist/kde-sound-theme-voyager-1.0.0.tar.gz
```
`make verify` fails loudly on a clipped sample, a DC offset, a click at a file
edge, a wrong sample rate or channel count, a missing `stereo` directory in
`Directories=`, a broken `Example`/`Inherits` reference, and it reports how many
of the sound names actually requested by the installed KDE `*.notifyrc` files
the theme resolves.
## Design notes
### One instrument set, not sixty unrelated beeps
Every cue is assembled from the same small library of motifs — FM bells, sub
impacts, band-limited noise sweeps, additive pads, plucked strings, telemetry
blips — so the theme reads as a single instrument rather than a folder of
noises. The palette below is what turns that library into *this* theme:
| Parameter | Voyager |
|---|---|
| Root | E3 — 164.81 Hz |
| Scale | pentatonic (0 2 5 7 9) |
| FM voice | ratio 3.5, index 3.0, index decay 90 ms |
| Detune | ±4 cents, degraded by 7-bit quantisation |
| Space | 1.7 s sparse, grainy hall at low density (a room made mostly of vacuum) |
### A differentiated reverb bus
A single reverb setting is wrong for a desktop theme: frequent cues (chat,
volume, button clicks) would smear into each other during a burst, while rare
dramatic cues would sound dry and small. Cues here are assigned one of five
reverb classes — from near-dry clicks through a small room up to a vast hall
with an extra half-second of tail — by motif, with per-sound overrides. The
result is that a chat notification stays crisp and a login blooms.
### Loudness-aware normalisation
Peak-normalising every file is not enough: a sparse bell and a dense error
cluster end up at wildly different perceived levels. After peak normalisation
each cue gets a bounded gain (±6 dB) that pulls the RMS of its *active* portion
towards 16 dBFS, with the peak ceiling always winning. That keeps the theme
consistent without introducing clipping.
### No clicks
Every cue is high-passed (30130 Hz depending on the class), given a 1.5 ms
raised-cosine fade in and a 35 ms fade out before the reverb is applied, so the
convolution never sees a discontinuity. `make verify` enforces this: it rejects
any file whose first samples are not at zero.
## Licence
* **Audio** (`Voyager/stereo/*.oga`, `Voyager/index.theme`) —
[CC BY-SA 4.0](LICENSES/CC-BY-SA-4.0.txt), the same licence the KDE sound
themes use.
* **Code and documentation** (`tools/`, `Makefile`, `install.sh`, `preview/`,
`README.md`) — [BSD-2-Clause](LICENSES/BSD-2-Clause.txt).
The sounds are original synthesis; nothing is derived from the KDE Ocean sound
theme or any other recording. You may therefore use this theme commercially and
adapt it freely, subject to CC BY-SA 4.0's attribution and share-alike terms.
## Credits
Created by **enne2** (2026). Designed for Plasma 6.3 on Debian 13.
The avatar illustration in `preview/avatar.png` is an AI-generated image (Google
Gemini via Antigravity). It is included only to identify the theme, and is **not**
covered by either grant below: neither the CC BY-SA 4.0 that applies to the audio
nor the BSD-2-Clause that applies to the code.