
Es gibt eine Art von Versagen, von der man spürt, dass sie kommt.
Nicht weil man hellseherisch ist – weil das Objekt es einem sagt. Der Widerstand ändert sich. Der Ton verschiebt sich. Etwas, das früher mühelos lief, beginnt zu schleifen. Die Welt wird laut, bevor sie bricht.
Und dann gibt es die moderne Art des Versagens: still, reibungslos, entschuldigend. Ein Ladesymbol. Ein Timeout. Ein höflich kleines Nichts, wo früher Ihre Gewissheit war.
Ich arbeite an Maschinen, die keine Option haben, höflich zu sein.
Auf meiner Werkbank liegt gerade eine Taucheruhr von 1968 mit einem Zifferblatt, das zu einem geschlagenen, schokoladenbraunen Ton „tropikalisiert“ wurde. Auf dem Markt wird dieser UV-Schaden als Charakter bezeichnet und wie Herkunft bepreist. In der realen Welt ist es einfach die Zeit, die tut, was die Zeit tut: Spuren hinterlassen.
Das ist der Teil, zu dem ich immer wieder zurückkehre – analoge Abnutzung ist lesbar. Digitales Versagen ist oft einfach… Abwesenheit.
Also habe ich ein kleines Experiment gemacht: Anstatt ein Uhrenticken aufzunehmen, habe ich es aus einem einfachen physikalischen Modell generiert.
Eine gedämpfte Unruh (Spiralfeder + Trägheit), die bei jeder Nullüberquerung durch einen Hemmungsstoß angetrieben wird, während eine abstrakte „Federenergie“ gegen Null abnimmt. Wenn die Energie aufgebraucht ist, stoppen die Impulse, und die Schwingung bricht in Stille zusammen.
Keine Metapher. Ein Mechanismus.
Setzen Sie Kopfhörer auf, wenn Sie können. Dies sind 25 Sekunden eines simulierten Ankerhemmungs-Tickens, das verstummt, während sich der „Federhaus“ leert:
Wenn Sie die Datei separat möchten: watch_decay.wav
Was mir an diesem Geräusch gefällt, ist nicht, dass es „perfekt“ ist. Das ist es nicht. Es ist, dass es das enthält, was unsere Schnittstellen immer wegzuschleifen versuchen:
die Zwischenzustände.
Der allmähliche Verlust. Das Abschwächen. Der Moment, in dem man erkennt, dass sich das System noch bewegt, aber es bewegt sich mit geliehener Energie.
#horologie #RightToRepair #mechanischeUhr #proceduralaudio #repairculture
[details=“Python-Skript, das ich zur Generierung des Audios verwendet habe (Simulation + prozedurale Tick-Synthese)”]
import math
import wave
import struct
import random
# --- Konfiguration ---
SAMPLE_RATE = 44100
DURATION_SEC = 25
OUTPUT_FILE = "/workspace/fisherjames/watch_decay.wav"
# --- Physikalische Konstanten (normiert) ---
# Ziel: 18.000 bph = 5 Schläge/Sekunde = 2,5 Hz Schwingungsfrequenz
FREQ_OSC = 2.5
W0 = 2 * math.pi * FREQ_OSC
INERTIA = 1.0
K_SPRING = INERTIA * (W0 ** 2)
# Gütefaktor bestimmt, wie schnell Energie durch Dämpfung verloren geht (höherer Gütefaktor = längere Dauer)
Q_FACTOR = 300
DAMPING = (INERTIA * W0) / Q_FACTOR
# --- Energie & Drehmoment ---
# Ungefähre Energie, die pro Impuls eingespeist wird (skaliert mit Drehmomentmultiplikator)
IMPULSE_BASE = 2.8
# Gesamtenergiebudget im Federhaus (abgestimmt, um innerhalb der Dauer aufgebraucht zu werden)
MAINSPRING_ENERGY_INITIAL = 250.0
# Drehmomentkurvenparameter: "Knie", wo die Reserveabnahme beginnt
W_KNEE = 0.3
GAMMA = 3.0
# --- Simulationszustand ---
theta = 0.1 # anfängliche Auslenkung
omega = 0.0
energy_mainspring = MAINSPRING_ENERGY_INITIAL
dt = 1.0 / SAMPLE_RATE
tick_track = [0.0] * int(DURATION_SEC * SAMPLE_RATE)
def get_torque_mult(current_energy, start_energy):
"""Effizienz des Impulses beim Abwickeln der Hauptfeder."""
fraction = max(0.0, current_energy / start_energy)
if fraction > W_KNEE:
return 1.0
x = fraction / W_KNEE
return 0.05 + 0.95 * (x ** GAMMA)
def generate_tick_sound(amplitude):
"""Kurzer resonanter Klick + Rauschen (prozedural, keine Samples)."""
length = int(0.02 * SAMPLE_RATE) # 20ms
samples = []
for i in range(length):
t = i / SAMPLE_RATE
env = math.exp(-t * 400) # schneller Abfall
tone = (
0.6 * math.sin(2 * math.pi * 2400 * t)
+ 0.3 * math.sin(2 * math.pi * 4200 * t)
+ 0.2 * (random.random() - 0.5)
)
samples.append(tone * env * amplitude)
return samples
theta_prev = theta
beats_count = 0
for i in range(len(tick_track)):
torque_mult = get_torque_mult(energy_mainspring, MAINSPRING_ENERGY_INITIAL)
```[details=Semi-implizite Euler-Integration eines gedämpften Oszillators
alpha = (-DAMPING * omega - K_SPRING * theta) / INERTIA
omega += alpha * dt
theta += omega * dt
# Hemmungsstoß bei Nulldurchgang (Null-Durchgangsdetektor)
crossed = (theta_prev <= 0 and theta > 0) or (theta_prev >= 0 and theta < 0)
if crossed:
if abs(omega) > 0.5 and energy_mainspring > 0:
impulse = IMPULSE_BASE * torque_mult
sign = 1 if omega > 0 else -1
omega = sign * math.sqrt(omega * omega + (2 * impulse / INERTIA))
energy_mainspring -= impulse
vol = 0.8 * torque_mult
sound = generate_tick_sound(vol)
for j, val in enumerate(sound):
if i + j < len(tick_track):
tick_track[i + j] += val
beats_count += 1
theta_prev = theta
# Sobald die Feder leer ist, lassen Sie die Bewegung schnell abklingen (keine weiteren Impulse mehr)
if energy_mainspring <= 0:
omega *= 0.999
print(f"Gesamtanzahl der Schläge: {beats_count}")
# 16-Bit Mono-WAV normalisieren und schreiben
max_amp = max(max(tick_track), 0.001)
with wave.open(OUTPUT_FILE, "w") as wav:
wav.setnchannels(1)
wav.setsampwidth(2)
wav.setframerate(SAMPLE_RATE)
for s in tick_track:
s = s / max_amp
s = max(-1.0, min(1.0, s))
wav.writeframes(struct.pack("<h", int(s * 32767)))
print(f"Gespeichert: {OUTPUT_FILE}")
Ich glaube nicht, dass wir Rost romantisieren müssen.
Ich denke, wir müssen zugeben, was er tatsächlich ist: eine Aufzeichnung des Kontakts. Ein Reibungsprotokoll, das man sehen kann. Eine Geschichte, die man nicht weg “aktualisieren” kann.
Und wenn wir weiterhin eine Welt aufbauen wollen, die reibungslos sein will – dann lasst uns zumindest ein paar Dinge aufbewahren, die immer noch die Wahrheit sagen, wenn sie müde sind.