Godstrument/workers/world_clock.py
monsterrobotparty 8deb65b4fe Godstrument: a multi-modal sensor-fusion instrument
Everything — your hand, the room, a satellite, the markets, the sky — becomes an
OSC control signal fused through a modulation matrix. Includes:
- hub + normalize (One-Euro) + matrix (curves/gates/quantize) + transform (tweaks/groups)
- 20+ workers: sim sensors, 8 keyless world feeds, ephemeris/almanac/clock (computed),
  time-warp replay (quakes/weather/db), and the dealgod market warehouse feed
- planetary orbital LFOs, SQLite recorder, city targeting
- live browser console: mute, group macros, drag-to-patch, inspector, Web MIDI

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 02:13:05 +10:00

67 lines
2.3 KiB
Python

"""
world_clock.py — the human tide. Births, deaths, and the raw velocity of us.
There is no live feed of every birth and death on Earth, so — like a world
population clock — this MODELS them from published global vital rates and lets
them breathe with a gentle diurnal swell. It is honest about being a model, not
a measurement. Musically it's a steady, slow-moving velocity: perfect for note
density, drone weight, or the brightness/darkness of a track.
Emits:
/gs/clock/births births per second (~4.3, breathing)
/gs/clock/deaths deaths per second (~2.0, breathing)
/gs/clock/popvel net population growth per second (births - deaths)
/gs/clock/pop running world population estimate
"""
from __future__ import annotations
import argparse
import datetime
import math
import time
from pythonosc.udp_client import SimpleUDPClient
# published global approximations (mid-2020s)
BIRTHS_PER_SEC = 4.3
DEATHS_PER_SEC = 2.0
POP_BASE = 8_200_000_000 # ~mid-2026
POP_BASE_EPOCH = 1_751_328_000 # 2025-07-01 UTC, seconds
def diurnal(t_utc: float, amp: float) -> float:
"""A slow ±amp sway over 24h so the numbers feel alive, not flat."""
frac = (t_utc % 86400) / 86400.0
return 1.0 + amp * math.sin(2 * math.pi * frac)
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--host", default="127.0.0.1")
ap.add_argument("--port", type=int, default=9000)
ap.add_argument("--interval", type=float, default=1.0)
args = ap.parse_args()
client = SimpleUDPClient(args.host, args.port)
print("[clock] emitting /gs/clock/births|deaths|popvel|pop every "
f"{args.interval:g}s (modelled)")
while True:
try:
t = time.time()
births = BIRTHS_PER_SEC * diurnal(t, 0.06)
deaths = DEATHS_PER_SEC * diurnal(t + 21600, 0.05) # offset phase
popvel = births - deaths
pop = POP_BASE + (t - POP_BASE_EPOCH) * (BIRTHS_PER_SEC - DEATHS_PER_SEC)
client.send_message("/gs/clock/births", float(births))
client.send_message("/gs/clock/deaths", float(deaths))
client.send_message("/gs/clock/popvel", float(popvel))
client.send_message("/gs/clock/pop", float(pop))
except Exception as e: # noqa
print(f"[clock] warn: {e}")
time.sleep(args.interval)
if __name__ == "__main__":
main()