# Voyager — sound theme for KDE Plasma Voyager *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 (30–130 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.