Sunrise start
The experimental clock starts its day at local sunrise. The green marker shows elapsed physical time since sunrise, not ordinary midnight-based civil time.
Civil time compared with a sunrise-locked solar calendar and dynamic astronomical clock.
Calendar effect
Astronomical sonification
Instrument mode: base periods stay stable, while Equation of Time, daylight geometry, lunar phase and a modeled Schumann drift modulate the audible layer. The Schumann resonance profile makes this layer much stronger for testing. The Cosmic field profile adds a filtered brown/pink noise floor, sub-pressure breathing, harmonic bloom, soft reverb, beat-frequency motion and rare low transient pulses, so the sound behaves more like a living electromagnetic ambience. Simulation speed accelerates motion, but it does not directly multiply the core pitches.
This simulator is not driven by random visual guesses. The clock, calendar, solar markers, lunar phase, audio tones, sky dome and harmonic overlays are all generated from explicit constants and formulas. The values below are the backbone used by the running JavaScript model.
NORMAL_SECOND_MS = 1000TARGET_13_MONTH_SECOND_MS = NORMAL_SECOND_MSDAY_SECONDS = 86400MS_PER_DAY = 86400000NORMAL_YEAR_DAYS = 365NEW_YEAR_DAYS = 364 = 13 × 28LUNAR_CYCLE_DAYS = 29.530588KNOWN_NEW_MOON_UTC_MS = 2000-01-06 18:14 UTCThe experimental system keeps the normal physical second. What changes is the interpretation of the day boundary and the year geometry: the day begins at local sunrise, and the solar year is mapped onto 13 equal months of 28 phase-days.
The experimental clock shows elapsed physical time since today’s local sunrise:
solarDisplaySeconds = (currentTimeMs - sunriseMs) / 1000
solarDisplaySeconds = positiveModulo(solarDisplaySeconds, 86400)
Face geometry is fixed to the physical solar-day interpretation:
solarHour = solarDisplaySeconds / 3600
faceAngleDeg = -180 + (solarHour / 24) × 360
handAngleDeg = faceAngleDeg + 90
00:00 = sunrise / left horizon06:00 = upper arc12:00 = right horizon18:00 = lower night sideThe Sun model uses a compact astronomical approximation suitable for visual simulation. It is observer-dependent through latitude and longitude.
declination = 23.44° × sin((2π / 365.2422) × (dayOfYear - 81))
B = (2π / 364) × (dayOfYear - 81)
EoT_minutes = 9.87 × sin(2B) - 7.53 × cos(B) - 1.5 × sin(B)
solarNoonShiftHours = (standardMeridianDeg - longitudeDeg) / 15 - EoT_minutes / 60
solarNoonHour = positiveModulo(12 + solarNoonShiftHours, 24)
Sunrise and sunset come from the solar hour-angle equation. The simulator uses
-0.833° for the apparent sunrise/sunset altitude, including the usual
solar-disc/refraction correction.
cosH = (sin(altitude) - sin(latitude) × sin(declination)) /
(cos(latitude) × cos(declination))
daylightHours = 2 × acos(cosH) × 180/π / 15
sunriseHour = solarNoonHour - daylightHours / 2
sunsetHour = solarNoonHour + daylightHours / 2
Twilight bands are calculated with the same equation using altitude thresholds
-6°, -12° and -18° for civil, nautical and astronomical twilight.
The analemma layer plots Equation of Time horizontally and solar declination vertically. It is a visual trace of why clock noon and apparent solar noon do not stay identical through the year.
x = (EoT_minutes / 16) × 34 × visualBoost
y = -(declinationDeg / 23.44) × 38 × visualBoost
The calendar follows the solar-year phase and then maps that phase into
364 equal positions.
solarYearPhase = (nowMs - yearStartMs) / (nextYearStartMs - yearStartMs)
solarPhaseDay = floor(solarYearPhase × 364)
month = floor(solarPhaseDay / 28) + 1
day = (solarPhaseDay % 28) + 1
This avoids pretending that 13 × 28 is a normal civil year. It is explicitly a phase map of the solar cycle.
Lunar phase is calculated from a known new-moon reference and the mean synodic month length.
daysSinceReference = (currentUtcMs - knownNewMoonUtcMs) / 86400000
lunarDay = positiveModulo(daysSinceReference, 29.530588)
lunarPhase = lunarDay / 29.530588
illumination = 0.5 - 0.5 × cos(2π × lunarPhase)
The lunar distance indicator is intentionally approximate and visual:
anomalisticMonthDays = 27.55455
anomalisticPhase = positiveModulo(daysSinceReference + 4.1, anomalisticMonthDays) / anomalisticMonthDays
distanceKm = 384400 - 21000 × cos(2π × anomalisticPhase)
The audio engine converts very slow astronomical cycles into audible tones by octave transposition. The original periods stay stable; simulation speed changes motion and smoothing, not the core pitch mapping.
Sun period = 365.2422 × 86400 seconds
Moon period = 29.530588 × 86400 seconds
Earth period = 86400 seconds
baseHz = 1 / periodSeconds
while baseHz < 220: baseHz = baseHz × 2
while baseHz > 1600: baseHz = baseHz / 2
SCHUMANN_BASE_HZ = 7.83AUDIO_MIN_HZ = 220AUDIO_MAX_HZ = 1600Detuning and modulation are linked to the same solar/lunar geometry:
eotDetuneCents = clamp(EoT_minutes × 0.9, -18, +18)
seasonalDetuneCents = (daylightHours / 24 - 0.5) × 22
moonDetuneCents = sin(2π × lunarPhase) × 12
earthDetuneCents = sin(2π × earthPhase) × 4
centsToRatio(cents) = 2^(cents / 1200)
The simulator compares frequency ratios against a small harmonic reference set:
1:1 unison6:5 minor third5:4 major third4:3 fourth3:2 fifth13:8 calendar relation7:4 septimal2:1 octaveratio = max(freqA, freqB) / min(freqA, freqB)
centsError = abs(1200 × log2(ratio / targetRatio))
relationScore = max(0, 1 - centsError / 36)
The Schumann layer is modeled, not streamed from live geophysical sensors. Its slow drift follows day/night, solar altitude, seasonal daylight length and EoT.
schumannHz = 7.83
+ sin(2π × earthPhase) × 0.035
+ (altitudeNorm - 0.5) × 0.055
+ (daylightNorm - 0.5) × 0.035
+ clamp(EoT_minutes / 16, -1, 1) × 0.018
The sky is deterministic. It does not use random live feeds, so it stays stable during fast-forward, date jumps and cockpit mode.
seed = 0x5A1A2026
state = (state × 1664525 + 1013904223) >>> 0
random = state / 4294967296
starCount = 420
radius = sqrt(random) × 0.94
angle = random × 2π
x = cos(angle) × radius
y = sin(angle) × radius
The cosmic field profile adds a filtered noise floor, low sub oscillator, stereo drift and rare pulses, all controlled by the live astronomical audio model.
subOscillator = 28 Hz
pulseOscillator = 44 Hz
plasmaBandpassStart = 380 Hz
plasmaGain = 0.02 + harmonyScore × 0.04
plasmaFilterHz = 180 + solarBrightness × 900
breath = 0.5 + 0.5 × sin(performanceTime × 0.00012)
subGain = 0.03 + breath × 0.08 + phaseLockScore × 0.06
subOscHz = 24 + harmonyScore × 10
stereoPan = sin(performanceTime × 0.00005) × 0.75
A transient pulse may occur only when the harmonic score is high:
bucket = floor(Date.now() / 120000)
if bucket changed and harmonyScore > 0.75:
pulseGain ramps 0.0001 → 0.12 → 0.0001
The live statistics are intended as operator checks. The most important one is
simple and auditable: experimental solar time = current time − today’s local sunrise.
Sunrise, solar noon, sunset, twilight, Moon phase, harmonic score and audio
modulation are then derived from the formula set shown above.
This project is not a replacement for civil time standards. It is a scientific simulator for exploring sunrise-locked days, seasonal daylight variation, solar-year phase, Moon rhythm, Equation of Time, harmonic relations and observer-dependent astronomical geometry in one coherent instrument.