- Rabbit Sync Settings shows the sidebar's folder tree. A folder has its own tristate checkbox; a fully ticked folder is stored as device_sync.folder_ids and follows the folder, so playlists added to it later sync too. - The album-art pass compares covers against the sizes the planner's device scan already read (plan.art_sizes) instead of an MTP stat per album, caches "no art" as a .none marker, and only unlinks covers that are really there. The summary reports covers actually updated rather than every cover. - A quiet tink when a Rabbit sync, export or URL import finishes, with an on/off switch (sound_effects, on by default). - Preferences is now General / Appearance / Integrations, a list on the left and the page on the right, opened big enough for the tallest page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
"""Render lintunes/sounds/tink.wav — the quiet "done" chime.
|
|
|
|
A bell-ish 1.6 kHz partial with a softer inharmonic overtone, a 3 ms attack
|
|
(no click) and a fast exponential decay. Run once; the WAV is committed.
|
|
|
|
python3 scripts/make_tink.py
|
|
"""
|
|
import wave
|
|
from pathlib import Path
|
|
|
|
import numpy as np
|
|
|
|
RATE = 44100
|
|
LENGTH = 0.35 # seconds; the decay is inaudible well before this
|
|
PEAK_DBFS = -18.0
|
|
|
|
|
|
def render() -> np.ndarray:
|
|
t = np.arange(int(RATE * LENGTH)) / RATE
|
|
tone = (np.sin(2 * np.pi * 1600 * t)
|
|
+ 0.35 * np.sin(2 * np.pi * 1600 * 2.76 * t) * np.exp(-t * 40))
|
|
envelope = np.exp(-t * 18) * np.minimum(t / 0.003, 1.0)
|
|
signal = tone * envelope
|
|
signal /= np.abs(signal).max()
|
|
return signal * 10 ** (PEAK_DBFS / 20)
|
|
|
|
|
|
def main():
|
|
out = Path(__file__).resolve().parent.parent / "lintunes" / "sounds" / "tink.wav"
|
|
out.parent.mkdir(parents=True, exist_ok=True)
|
|
pcm = (render() * 32767).astype("<i2")
|
|
with wave.open(str(out), "wb") as f:
|
|
f.setnchannels(1)
|
|
f.setsampwidth(2)
|
|
f.setframerate(RATE)
|
|
f.writeframes(pcm.tobytes())
|
|
print(out)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|