viz: synastry, the Elder Futhark, and the Wheel of the Year
- synastry: bind any saved chart to the active one (⚭ in the stars panel). The inter-aspect web between two charts becomes sound: syn.harmony/tension/ hits as the bond's standing levels, syn.web ringing live when transits strike either person's end of any bond-aspect, syn.moon as the bond's daily weather. Partner chart drawn as a silver inner ring on the zodiac wheel, the bond's chords strung between the two charts. Routed per skin: the heart, Buddhic at-one-ment, Netzach, Venus's gate, Vanaheim, Qalb, Libra, ehwaz. Rising sign confirmed working (cancer rising for the Paris test). - the runes (futhark): all 24 Elder Futhark runes in the Kylver-stone row, ringed as a rune-band — glyph codepoints and meanings agent-verified against rune-poem scholarship. Routing keeps attested senses: wealth's strife at fehu, the word at ansuz, the giant's blow at thurisaz (quakes), need's narrow band at nauthiz (verifier correction: debt-as-need there, not othala), fate's lot-cup at perthro (natal), the raised warding hands at algiz, the bond at ehwaz (horse & rider). Poetic licences commented. - wheel of the year (celtic): the eight festivals at their true solar longitudes (quarters + cross-quarters at 15 deg fixed signs — the astronomical reckoning, verified), the live sun walking the rim showing where the year stands. Modern-synthesis provenance honestly noted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
b1edc37da1
commit
24d4a00435
235
viz/index.html
235
viz/index.html
@ -537,7 +537,7 @@
|
||||
|
||||
<p><b>💰 Your holdings — live now.</b> Right-click the sky → <b>💰 your holdings</b>. Declare what you hold — coins, and metals through their tokens (<kbd>PAXG</kbd> is an ounce of gold) — and <i>how much of each</i>, and the amounts become <b>weights</b>: a bigger bag sings louder, each holding's influence auto-scaled by its share of the total. Prices poll straight from the public market to <i>your browser</i> — the server never learns your bag, and the ledger lives only on your machine. Each holding becomes <kbd>me.btc</kbd>, <kbd>me.paxg</kbd>…, the whole bag breathes as <kbd>me.portfolio</kbd> (drift) with <kbd>me.portfolio.vel</kbd> as its churn (flux) — and it routes where money lives in every tradition: Hod's quicksilver, the Wardens' wages in the West, the dwarves' gold in Nidavellir, the Metal phase, your hopes and fears in the spread. Stock tickers come later (they need a keyed API); your coins and your gold can sing today. Your finances were already an instrument; we only added the speakers.</p>
|
||||
|
||||
<p><b>✨ Your stars — live now.</b> Right-click the sky → <b>✨ your stars</b>: birth date, time to the ten-minute, the UTC offset where you were born — and the instrument <b>casts your chart in the browser</b>, with a real ephemeris (truncated Meeus for the lights, JPL orbital elements for the planets, precessed to the tropical zodiac; verified against eclipse timings and JPL positions to a fraction of a degree). Computed here, kept here: the server never sees a chart. Then the sky's living conversation with <i>your</i> sky becomes seven sources: <kbd>natal.harmony</kbd> (transiting trines & sextiles to your points — grace), <kbd>natal.tension</kbd> (squares & <b>oppositions</b> — friction), <kbd>natal.hits</kbd> (conjunctions — emphasis), <kbd>natal.moon</kbd> (the fast hand: the Moon crossing your chart, fresh every few hours), <kbd>natal.saturn</kbd> (the slow teacher, a months-long pressure), <kbd>natal.birthday</kbd> (the solar return, swelling as your day approaches) — and the deep one, <kbd>natal.web</kbd>: your chart's own tight aspects form a <b>resonance network</b>, and a transit striking one end of your natal opposition rings the <i>whole figure</i>, exactly as astrology reads it. Your natal planets also appear as <b>gold ghosts under the godtime dial</b>, so you can watch Saturn creep toward your natal Sun for weeks before you hear it arrive. Transit orbs are kept tight (aspects peak sharply at exactness, as transit practice demands) so these sources spike and breathe rather than drone. Load anyone's chart — yours, a lover's, a friend's; the instrument plays relationships too. Give it your <b>birthplace</b> (lat/lon) and the chart gains its <b>angles</b>: the ascendant and midheaven, computed from the sidereal time of your birth (the formula is verified against the sunrise itself — the Sun stands on the ascendant as it rises). Your <b>rising sign</b> is announced when the chart is cast, transits striking the angles become <kbd>natal.angles</kbd> (hard contacts to the ASC and MC — among the heaviest events in transit work), and the <b>wheel skin</b> draws your <b>whole-sign houses</b>, the oldest house system there is, with the ASC and MC marked in gold. One honest caveat from the mathematics: the angles move a degree every four minutes, so they are only as true as your birth time.</p>
|
||||
<p><b>✨ Your stars — live now.</b> Right-click the sky → <b>✨ your stars</b>: birth date, time to the ten-minute, the UTC offset where you were born — and the instrument <b>casts your chart in the browser</b>, with a real ephemeris (truncated Meeus for the lights, JPL orbital elements for the planets, precessed to the tropical zodiac; verified against eclipse timings and JPL positions to a fraction of a degree). Computed here, kept here: the server never sees a chart. Then the sky's living conversation with <i>your</i> sky becomes seven sources: <kbd>natal.harmony</kbd> (transiting trines & sextiles to your points — grace), <kbd>natal.tension</kbd> (squares & <b>oppositions</b> — friction), <kbd>natal.hits</kbd> (conjunctions — emphasis), <kbd>natal.moon</kbd> (the fast hand: the Moon crossing your chart, fresh every few hours), <kbd>natal.saturn</kbd> (the slow teacher, a months-long pressure), <kbd>natal.birthday</kbd> (the solar return, swelling as your day approaches) — and the deep one, <kbd>natal.web</kbd>: your chart's own tight aspects form a <b>resonance network</b>, and a transit striking one end of your natal opposition rings the <i>whole figure</i>, exactly as astrology reads it. Your natal planets also appear as <b>gold ghosts under the godtime dial</b>, so you can watch Saturn creep toward your natal Sun for weeks before you hear it arrive. Transit orbs are kept tight (aspects peak sharply at exactness, as transit practice demands) so these sources spike and breathe rather than drone. Load anyone's chart — yours, a lover's, a friend's; the instrument plays relationships too. Give it your <b>birthplace</b> (lat/lon) and the chart gains its <b>angles</b>: the ascendant and midheaven, computed from the sidereal time of your birth (the formula is verified against the sunrise itself — the Sun stands on the ascendant as it rises). Your <b>rising sign</b> is announced when the chart is cast, transits striking the angles become <kbd>natal.angles</kbd> (hard contacts to the ASC and MC — among the heaviest events in transit work), and the <b>wheel skin</b> draws your <b>whole-sign houses</b>, the oldest house system there is, with the ASC and MC marked in gold. One honest caveat from the mathematics: the angles move a degree every four minutes, so they are only as true as your birth time. And then, <b>synastry</b>: save two charts and press <b>⚭</b> on the second — the instrument computes every aspect <i>between</i> the two charts (the inter-aspect web) and the relationship itself becomes sound: <kbd>syn.harmony</kbd> and <kbd>syn.tension</kbd> as the bond's standing grace and friction, <kbd>syn.hits</kbd> its meetings, <kbd>syn.web</kbd> ringing live whenever the moving sky strikes either person's end of any bond-aspect, and <kbd>syn.moon</kbd> — the bond's daily weather, freshened every few hours by the Moon. On the zodiac wheel the second chart appears as a <b>silver ring inside the gold one</b>, the bond's own chords strung between the two charts. Your oppositions to another person's planets, audible.</p>
|
||||
|
||||
<p class="foot">One Source, many Spirits, one Matter — and the Source was never only "out there." The instrument's ambition is simple: <b>everything that varies can sing</b>, and the first citizen of that everything is you.</p>
|
||||
|
||||
@ -831,7 +831,7 @@
|
||||
<li><b>Right-click anything — the everything menu.</b> Every node carries its full settings under the right button: mute, <b>solo</b>, a <b>level</b> fader (0–2×), a <b>trim</b> offset, every cable it carries with its amount slider and an unpatch ×, and a nested <i>patch to →</i> list for laying new cables without dragging. Right-click the empty sky for the view menu. And the modifiers, for the fast hands: <b>click</b> mutes · <b>⇧-click</b> opens the node's tab · <b>⇧-drag</b> rides the level up and down · <b>⌥-click</b> solos a source · <b>⌘-click</b> multi-selects for grouping · <b>⌘⇧-click</b> resets a node to neutral. People play differently; the instrument shouldn't care which hand you reach with.</li>
|
||||
<li><b>Click a wheel — go inside it (mind mode).</b> In chakra view, click any chakra's core and the camera steps <i>into</i> the wheel: its mandala of petals turns around your whole field of view, and that chakra's feeds circle <i>you</i> — drag to look around the full 360°. A <b>vector console appears under your hands</b>: 12 keys of that wheel's own scale (C minor pentatonic at the root, rising key by key to B hirajoshi at the crown), played by clicking, by the <kbd>Q</kbd>–<kbd>]</kbd> row, or by any connected <b>MIDI keyboard</b> — every note runs through the world's own reverb and grit, so you are jamming <i>inside</i> the instrument, in that chakra's mode, while the planet plays around you. <kbd>↑</kbd> <kbd>↓</kbd> travel the spine wheel to wheel; <kbd>esc</kbd> steps back out. And for powerful machines, right-click the sky and set graphics to <b>ultra ✦</b>: every orbiting feed grows a glowing comet trail, and the orbits breathe so the trails weave slow spirals.</li>
|
||||
<li><b>Skins — the same spine, another cosmology.</b> Right-click the sky and cycle <b>skin</b>. Beyond the seven <i>chakras</i> there is <b>the planes</b>: the Seven Planes & forty-nine sub-planes of the Cosmic Physical Plane from the Alice Bailey / D.K. teachings — <b>I Divine</b> (white light) down through <b>Monadic</b> (violet), <b>Atmic</b>, <b>Buddhic</b>, <b>Mental</b> (where the egoic lotus sits), <b>Astral</b>, to <b>VII Physical</b> (red). The spine becomes the 49-sub-plane spectrum ladder; the side-brackets mark the <b>Monad</b>, the <b>Spiritual Triad</b> and the <b>Personality</b>; and every feed climbs to the plane that matches its rarefaction — the sun's own wind at the Divine, orbits and the sky's geometry at the Monadic, the great cyclic wheels at the Atmic, omen and aspect at the Buddhic, abstract thought and money-as-idea at the Mental, desire and fire and felt sensation at the Astral, and the dense body of the world — weather, quakes, the mortal rates, your own hands — at the Physical. Go inside any plane (mind mode) and its keys play a scale pitched to its altitude: airy whole-tone up at the Divine, grounded minor-pentatonic down at the Physical.</li>
|
||||
<li><b>One Source, many Spirits, one Matter.</b> That is the whole architecture: the <b>Source</b> is the world's data, the same for everyone; the <b>Spirit</b> is the skin — the belief system through which you read it; the <b>Matter</b> is the sound. Choose your spirit, and the same planet plays through it. The shelf so far, each rendered from its own published lore, literally and without frills: the <b>Tree of Life</b> (Hermetic Qabalah, Golden Dawn attributions — ten sephirot on three pillars, all twenty-two canonical paths, Mercury's data at Hod, the Moon's at Yesod, the body of the world at Malkut); <b>the Lodge</b> (from published Masonic sources only — Worshipful Master in the East, Wardens West and South, the North dark, Boaz and Jachin at the porch where <i>your own hands</i> stand as the candidate, the Blazing Star, the Volume of the Sacred Law as humanity's open book, and music given to the South, for Beauty holds the arts); the <b>Hermetic ladder</b> of the seven planetary gates, lead to silver; <b>Yggdrasil</b> and its nine worlds, the dwarves keeping the markets in Nidavellir; the Sufi <b>lata'if</b>, where the wind data literally breathes at Ruh, spirit-as-breath; and the <b>Wu Xing</b>, five phases in their generating ring and controlling star, the metal birds of the air routed to Metal; and <b>the Spread</b> — the Celtic Cross of the tarot (Waite's published layout), dealt live and never finished: the heavens in <i>what crowns you</i>, the deep debts and quake-roots in <i>what is beneath you</i>, the retrogrades in <i>what is behind you</i>, births and seasons in <i>what is before you</i>, money and fire in <i>your hopes and fears</i> — and <b>your own hands in the Querent's place</b>, because you are the one asking. Right-click the sky → <b>skin</b> to turn the wheel of traditions. Each map stands as its true figure — the Tree as a tree, the Lodge as a lodge — and every station opens into mind mode with its own scale under your hands. Newest on the shelf: <b>the wheel</b> — the astrologer's own view, twelve signs in a circle with 0° Aries at the ascendant's place, every feed routed to its sign by traditional rulership (wildfires to Aries, your holdings to Taurus, the word to Gemini, the far-travelling planes to Sagittarius…), the <b>live planets riding the rim</b>, your natal chart on the inner ring, and the aspects drawn as <b>chords across the circle</b> — red the squares and oppositions, green the trines and sextiles, gold the conjunctions, dashed where the living sky strikes your natal points. And everywhere else, those same aspects now draw as faint <b>cables between the planets' own spheres</b> in any skin — the sky's geometry made visible in whatever cosmology you're standing in. And every Spirit now speaks <b>its own tongue</b>: the sephirot in Hebrew (כתר, חכמה, בינה…), the chakras in Devanagari (सहस्रार, अनाहत…), the lata'if in Arabic (قلب, روح, سر…), the nine worlds in Old Norse (ásgarðr, miðgarðr, helheimr…), the planetary gates in their glyphs (☽ ☿ ♀ ☉ ♂ ♃ ♄), the five phases in their characters (木 火 土 金 水). The lore, in the letters it was written in.</li>
|
||||
<li><b>One Source, many Spirits, one Matter.</b> That is the whole architecture: the <b>Source</b> is the world's data, the same for everyone; the <b>Spirit</b> is the skin — the belief system through which you read it; the <b>Matter</b> is the sound. Choose your spirit, and the same planet plays through it. The shelf so far, each rendered from its own published lore, literally and without frills: the <b>Tree of Life</b> (Hermetic Qabalah, Golden Dawn attributions — ten sephirot on three pillars, all twenty-two canonical paths, Mercury's data at Hod, the Moon's at Yesod, the body of the world at Malkut); <b>the Lodge</b> (from published Masonic sources only — Worshipful Master in the East, Wardens West and South, the North dark, Boaz and Jachin at the porch where <i>your own hands</i> stand as the candidate, the Blazing Star, the Volume of the Sacred Law as humanity's open book, and music given to the South, for Beauty holds the arts); the <b>Hermetic ladder</b> of the seven planetary gates, lead to silver; <b>Yggdrasil</b> and its nine worlds, the dwarves keeping the markets in Nidavellir; the Sufi <b>lata'if</b>, where the wind data literally breathes at Ruh, spirit-as-breath; and the <b>Wu Xing</b>, five phases in their generating ring and controlling star, the metal birds of the air routed to Metal; and <b>the Spread</b> — the Celtic Cross of the tarot (Waite's published layout), dealt live and never finished: the heavens in <i>what crowns you</i>, the deep debts and quake-roots in <i>what is beneath you</i>, the retrogrades in <i>what is behind you</i>, births and seasons in <i>what is before you</i>, money and fire in <i>your hopes and fears</i> — and <b>your own hands in the Querent's place</b>, because you are the one asking. Right-click the sky → <b>skin</b> to turn the wheel of traditions. Each map stands as its true figure — the Tree as a tree, the Lodge as a lodge — and every station opens into mind mode with its own scale under your hands. Newest on the shelf: <b>the wheel</b> — the astrologer's own view, twelve signs in a circle with 0° Aries at the ascendant's place, every feed routed to its sign by traditional rulership (wildfires to Aries, your holdings to Taurus, the word to Gemini, the far-travelling planes to Sagittarius…), the <b>live planets riding the rim</b>, your natal chart on the inner ring, and the aspects drawn as <b>chords across the circle</b> — red the squares and oppositions, green the trines and sextiles, gold the conjunctions, dashed where the living sky strikes your natal points. And everywhere else, those same aspects now draw as faint <b>cables between the planets' own spheres</b> in any skin — the sky's geometry made visible in whatever cosmology you're standing in. And every Spirit now speaks <b>its own tongue</b>: the sephirot in Hebrew (כתר, חכמה, בינה…), the chakras in Devanagari (सहस्रार, अनाहत…), the lata'if in Arabic (قلب, روح, سر…), the nine worlds in Old Norse (ásgarðr, miðgarðr, helheimr…), the planetary gates in their glyphs (☽ ☿ ♀ ☉ ♂ ♃ ♄), the five phases in their characters (木 火 土 金 水). The lore, in the letters it was written in. Two more Spirits joined the shelf: <b>the runes</b> — the Elder Futhark, all twenty-four in the Kylver-stone row, ringed as a rune-band, every feed seated by its rune-poem meaning (wealth's strife at ᚠ fehu, Odin's word at ᚨ ansuz, the giant's blow at ᚦ thurisaz for the quakes, need's narrow band at ᚾ nauthiz for hunger and want, the lot-cup ᛈ perthro holding your natal fate, and <b>your raised hands at ᛉ algiz, the warding rune that is itself a figure with arms lifted</b>); and the <b>Wheel of the Year</b> — the eight Celtic festivals at their true solar longitudes (the astronomical reckoning: quarters at the equinoxes and solstices, cross-quarters at fifteen degrees of the fixed signs), deaths and the deep things at Samhain where the veil thins, births at Imbolc, the fires and the dance and the bond at Beltane, the great fair of commerce and chatter at Lughnasadh — <b>with the live sun walking the rim, showing exactly where the year stands today</b>. Honesty note kept from the scholarship: the unified eightfold wheel is a modern synthesis of the attested Irish fire festivals and older solstice customs — true lore, honestly labeled.</li>
|
||||
<li><b>The groove grids — sequence the voices.</b> Open any voice's tab (shift-click it) and there's a <b>16-step grid on the godtime clock</b>. The note voices (<i>lead, bass</i>) get a <b>mini piano roll</b> — eight rows of minor pentatonic, click to place a note, click again to clear — and while your groove is on, <i>your melody replaces the data's</i>: bitcoin lets go of the lead and you take it. Every other voice gets an <b>808-style gate row</b> that rhythmically chops the world's signal — the reverb, the grit, the percussion breathing in your pattern while the planet still decides how hard. Grooves ride the godtime tempo (lock the dial, or let your heart drive it), and they <b>save with your patch</b>. And the <b>sources</b> get the grid too, with a different power: <b>sample & hold</b> — while a source's groove is on, the world's number is only <i>sampled</i> on your lit steps and held between them, so a smooth drifting feed becomes stepped, rhythmic, quantized in time. Bitcoin arpeggiating in your pattern. The wind as a sequence. If an out port is chosen in ⚙, godtime also sends <b>MIDI clock</b> (24 ppqn), so a DAW can slave its tempo to the planet — or to your pulse.</li></ul>
|
||||
|
||||
<div class="hr"></div>
|
||||
@ -990,7 +990,7 @@
|
||||
if (["weather","air","quake","seismic","tide","temp"].includes(p)) return "planet";
|
||||
if (["sun","iss","planes","plane","sky","aurora","moon","space","natal"].includes(p)) return "sky";
|
||||
if (["crypto","market","stock","btc","eth","fx","me"].includes(p)) return "markets";
|
||||
if (["wiki","net","news","social","edit"].includes(p)) return "human";
|
||||
if (["wiki","net","news","social","edit","syn"].includes(p)) return "human";
|
||||
return "other";
|
||||
}
|
||||
|
||||
@ -2039,6 +2039,7 @@
|
||||
const p = k.split(".")[0];
|
||||
if (p === "body") return "heart"; // your pulse at anahata
|
||||
if (p === "natal") return "eye"; // your own sky, seen
|
||||
if (p === "syn") return "heart"; // the bond lives at the heart
|
||||
// crown — cosmos & consciousness: the actual machinery of the sky
|
||||
if (p === "iss" || p === "space" || /_lon|mercury|venus|jupiter|saturn/.test(k)) return "crown";
|
||||
if (p === "sun" && !/elev/.test(k)) return "crown"; // solar wind
|
||||
@ -2108,7 +2109,7 @@
|
||||
/^astro\.(saturn|mars|jupiter|venus|mercury)$/.test(k)) return "monadic";
|
||||
if (k === "astro.moon" || /zodiac|season/.test(k) || // III · the great cyclic wheels
|
||||
k === "almanac.dec" || k === "almanac.element") return "atmic";
|
||||
if (p === "natal") return "buddhic"; // your chart: pure omen
|
||||
if (p === "natal" || p === "syn") return "buddhic"; // omen; and the plane of at-one-ment
|
||||
if (p === "astro" || /aspect|harmon|tension|retro|fertil|aurora/.test(k)) return "buddhic"; // IV · omen & aspect
|
||||
if (["wiki","net","news","social","edit","econ","debt"].includes(p) || // V · abstract thought & money-as-idea
|
||||
/inflation/.test(k) || k === "market.turnover" || k === "crypto.price") return "mental";
|
||||
@ -2152,6 +2153,7 @@
|
||||
const k = (key || "").toLowerCase(), p = k.split(".")[0];
|
||||
if (p === "body") return "tiferet"; // the heart at the Tree's solar centre
|
||||
if (p === "natal") return "tiferet"; // your own sky at the centre of the self
|
||||
if (p === "syn") return "netzach"; // Venus holds the bond
|
||||
if (k === "sun.speed") return "keter"; // the first swirlings
|
||||
if (/sun_lon|zodiac/.test(k) || p === "iss" || k === "clock.births" || k === "clock.popvel") return "chokmah";
|
||||
if (k === "astro.saturn" || p === "debt" || /inflation/.test(k)) return "binah"; // Saturn: time, weight, form
|
||||
@ -2190,6 +2192,7 @@
|
||||
function lodgeOf(key) {
|
||||
const k = (key || "").toLowerCase(), p = k.split(".")[0];
|
||||
if (p === "natal") return "east"; // the heavens, read for you
|
||||
if (p === "syn") return "pavement"; // two squares, one floor
|
||||
if (p === "body") return "altar"; // your living heart, laid at the centre
|
||||
if (p === "hand" || p === "tof" || p === "touch") // the candidate at the porch
|
||||
return /\.x$|open/.test(k) ? "boaz" : "jachin";
|
||||
@ -2224,6 +2227,7 @@
|
||||
const k = (key || "").toLowerCase(), p = k.split(".")[0];
|
||||
if (p === "body") return "sun"; // the heart at Sol's gate
|
||||
if (p === "natal") return "sun"; // your chart at the heart gate
|
||||
if (p === "syn") return "venus"; // the copper gate holds two
|
||||
if (k === "astro.saturn" || p === "debt" || /inflation|poverty|hunger|zodiac/.test(k)) return "saturn";
|
||||
if (/lifeexp|fertile|harmony|births|popvel/.test(k)) return "jupiter";
|
||||
if (k === "astro.mars" || p === "fire" || /tension|quake\.event|deaths/.test(k)) return "mars";
|
||||
@ -2256,6 +2260,7 @@
|
||||
function nineOf(key) {
|
||||
const k = (key || "").toLowerCase(), p = k.split(".")[0];
|
||||
if (p === "natal") return "asgard";
|
||||
if (p === "syn") return "vanaheim"; // Freyja's house
|
||||
if (p === "sun" || p === "sky" || p === "iss" || p === "astro" || /zodiac/.test(k)) return "asgard";
|
||||
if (/fertile|season|births|almanac/.test(k)) return "vanaheim";
|
||||
if (/ambient|light\.|harmony/.test(k)) return "alfheim";
|
||||
@ -2285,7 +2290,7 @@
|
||||
};
|
||||
function lataifOf(key) {
|
||||
const k = (key || "").toLowerCase(), p = k.split(".")[0];
|
||||
if (p === "body") return "qalb"; // Qalb IS the heart
|
||||
if (p === "body" || p === "syn") return "qalb"; // Qalb IS the heart — and holds two
|
||||
if (p === "natal") return "sirr"; // the secret — your hidden sky
|
||||
if (k === "sun.speed") return "akhfa"; // the most rarefied
|
||||
if (p === "astro" || /zodiac|almanac/.test(k)) return "khafi"; // the hidden influences
|
||||
@ -2315,7 +2320,7 @@
|
||||
function wuxingOf(key) {
|
||||
const k = (key || "").toLowerCase(), p = k.split(".")[0];
|
||||
if (p === "body") return "fire"; // the heart is the fire-organ (TCM)
|
||||
if (p === "natal") return "water"; // fate flows in the deep
|
||||
if (p === "natal" || p === "syn") return "water"; // fate and bond flow in the deep
|
||||
if (/births|popvel|season|fertile|lifeexp|wind|harmony|almanac\.element/.test(k)) return "wood";
|
||||
if (p === "fire" || /temp|mars|tension|ambient|light\.|sky\./.test(k) || k === "sun.speed") return "fire";
|
||||
if (/saturn|quake|hunger|poverty|pressure|debt\.total/.test(k)) return "earth";
|
||||
@ -2352,6 +2357,7 @@
|
||||
const k = (key || "").toLowerCase(), p = k.split(".")[0];
|
||||
if (p === "hand" || p === "tof" || p === "touch" || p === "body") return "querent"; // you are the one asking
|
||||
if (p === "natal") return "crown"; // your stars, above you
|
||||
if (p === "syn") return "house"; // the other, around you
|
||||
if (/retro/.test(k) || k === "clock.deaths") return "behind"; // what recedes, what looks backward
|
||||
if (/^sky\.|sun\.|_lon|zodiac/.test(k) || p === "iss") return "crown"; // what is above you
|
||||
if (/quake\.depth|debt\.total|saturn|poverty/.test(k)) return "foundation"; // the deep structure beneath
|
||||
@ -2400,7 +2406,7 @@
|
||||
if (p === "weather" || k === "almanac.dec") return "cancer"; // the home sky
|
||||
if (p === "sun" || /^sky\.|light|ambient/.test(k)) return "leo"; // the light itself
|
||||
if (/aqi|pm25|lifeexp/.test(k)) return "virgo"; // health
|
||||
if (/harmony|season/.test(k)) return "libra"; // balance, equinox
|
||||
if (p === "syn" || /harmony|season/.test(k)) return "libra"; // partnership; balance, equinox
|
||||
if (/deaths|debt|tension/.test(k)) return "scorpio"; // the deep and the owed
|
||||
if (p === "planes" || p === "iss" || /inflation/.test(k)) return "sagittarius"; // far travel; Jupiterian expansion
|
||||
if (/quake|hunger|poverty/.test(k)) return "capricorn"; // Saturn: structure, mountains, want
|
||||
@ -2476,6 +2482,24 @@
|
||||
ctx.strokeStyle = KINDCOL[h.kind] + (0.15 + h.s * 0.6).toFixed(3) + ")";
|
||||
ctx.lineWidth = 0.8 + h.s * 2.2; ctx.stroke();
|
||||
}
|
||||
// synastry — the partner's chart on a third ring, silver, with the bond's
|
||||
// own chords strung between the two charts
|
||||
if (natalActive && synPartner) {
|
||||
const NG2 = { sun: "☉", moon: "☽", mercury: "☿", venus: "♀", mars: "♂", jupiter: "♃", saturn: "♄" };
|
||||
for (const iw of interWeb) {
|
||||
const q1 = lonXY(natalActive.pos[iw.a], R * 0.55), q2 = lonXY(synPartner.pos[iw.b], R * 0.34);
|
||||
ctx.beginPath(); ctx.moveTo(q1[0], q1[1]); ctx.lineTo(q2[0], q2[1]);
|
||||
ctx.strokeStyle = KINDCOL[iw.kind] + (0.10 + iw.w * 0.4).toFixed(3) + ")";
|
||||
ctx.lineWidth = 0.7 + iw.w * 1.5; ctx.stroke();
|
||||
}
|
||||
for (const p2 in NG2) {
|
||||
const gp3 = lonXY(synPartner.pos[p2], R * 0.34);
|
||||
ctx.fillStyle = "rgba(170,200,235,0.55)";
|
||||
ctx.font = "10px 'Helvetica Neue', Arial, sans-serif";
|
||||
ctx.fillText(NG2[p2], gp3[0], gp3[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// the natal chart on the inner ring + transit chords striking it
|
||||
if (natalActive) {
|
||||
const NG = { sun: "☉", moon: "☽", mercury: "☿", venus: "♀", mars: "♂", jupiter: "♃", saturn: "♄" };
|
||||
@ -2509,6 +2533,133 @@
|
||||
ctx.restore();
|
||||
}
|
||||
|
||||
// THE ELDER FUTHARK — the 24 runes in the Kylver-stone row, three ættir of
|
||||
// eight, ringed like a rune-band. Every glyph codepoint and meaning verified
|
||||
// against the rune-poem scholarship; the routing keeps each rune's attested
|
||||
// core sense (poetic licences marked).
|
||||
const FUTHARK = [
|
||||
{ key: "fehu", label: "ᚠ fehu · wealth", petals: 2, col: [255, 200, 90] },
|
||||
{ key: "uruz", label: "ᚢ uruz · the aurochs", petals: 2, col: [150, 110, 80] },
|
||||
{ key: "thurisaz", label: "ᚦ thurisaz · the giant",petals: 3, col: [180, 70, 60] },
|
||||
{ key: "ansuz", label: "ᚨ ansuz · the word", petals: 4, col: [130, 160, 255] },
|
||||
{ key: "raidho", label: "ᚱ raidho · the ride", petals: 5, col: [200, 170, 120] },
|
||||
{ key: "kenaz", label: "ᚲ kenaz · the torch", petals: 6, col: [255, 130, 50] },
|
||||
{ key: "gebo", label: "ᚷ gebo · the gift", petals: 2, col: [220, 180, 240] },
|
||||
{ key: "wunjo", label: "ᚹ wunjo · joy", petals: 8, col: [255, 230, 140] },
|
||||
{ key: "hagalaz", label: "ᚺ hagalaz · hail", petals: 6, col: [170, 200, 230] },
|
||||
{ key: "nauthiz", label: "ᚾ nauthiz · need", petals: 2, col: [140, 100, 90] },
|
||||
{ key: "isa", label: "ᛁ isa · ice", petals: 1, col: [210, 235, 250] },
|
||||
{ key: "jera", label: "ᛃ jera · the year", petals: 4, col: [200, 190, 90] },
|
||||
{ key: "eihwaz", label: "ᛇ eihwaz · the yew", petals: 3, col: [100, 90, 110] },
|
||||
{ key: "perthro", label: "ᛈ perthro · the lot-cup", petals: 5, col: [170, 120, 220] },
|
||||
{ key: "algiz", label: "ᛉ algiz · the warding", petals: 3, col: [160, 230, 180] },
|
||||
{ key: "sowilo", label: "ᛊ sowilo · the sun", petals: 8, col: [255, 215, 70] },
|
||||
{ key: "tiwaz", label: "ᛏ tiwaz · justice", petals: 1, col: [220, 80, 70] },
|
||||
{ key: "berkano", label: "ᛒ berkano · the birch", petals: 2, col: [190, 240, 190] },
|
||||
{ key: "ehwaz", label: "ᛖ ehwaz · the horse", petals: 2, col: [200, 180, 150] },
|
||||
{ key: "mannaz", label: "ᛗ mannaz · humanity", petals: 4, col: [230, 150, 200] },
|
||||
{ key: "laguz", label: "ᛚ laguz · water", petals: 3, col: [110, 160, 230] },
|
||||
{ key: "ingwaz", label: "ᛜ ingwaz · the seed", petals: 4, col: [150, 210, 120] },
|
||||
{ key: "dagaz", label: "ᛞ dagaz · day", petals: 2, col: [250, 245, 200] },
|
||||
{ key: "othala", label: "ᛟ othala · inheritance",petals: 4, col: [180, 140, 100] },
|
||||
];
|
||||
FUTHARK.forEach((r2, i) => { // the rune-band: a ring, clockwise from the top
|
||||
const a2 = (90 - i * 15) * Math.PI / 180;
|
||||
r2.pos = [0.5 + 0.47 * Math.cos(a2), 0.5 - 0.47 * Math.sin(a2)];
|
||||
});
|
||||
const FUTHARK_SCALES = {};
|
||||
FUTHARK.forEach((r2, i) => { // each ætt its own mood, the row rising
|
||||
FUTHARK_SCALES[r2.key] = { root: 44 + i, scale: ["pentatonic", "minor", "dorian"][Math.floor(i / 8)] };
|
||||
});
|
||||
function futharkOf(key) {
|
||||
const k = (key || "").toLowerCase(), p = k.split(".")[0];
|
||||
if (p === "me" || k === "crypto.price" || /inflation/.test(k)) return "fehu"; // "wealth is strife among kinsmen"
|
||||
if (p === "body" || k === "quake.depth") return "uruz"; // primal strength
|
||||
if (k === "quake.event") return "thurisaz"; // the giant's blow
|
||||
if (p === "wiki") return "ansuz"; // Odin's word
|
||||
if (p === "planes" || p === "iss") return "raidho"; // the ride
|
||||
if (p === "fire" || k === "weather.temp") return "kenaz"; // the torch
|
||||
if (/market\./.test(k)) return "gebo"; // exchange is the gift
|
||||
if (k === "astro.harmony") return "wunjo";
|
||||
if (/pressure|tension|wind/.test(k)) return "hagalaz"; // the hail-storm sky
|
||||
if (/hunger|poverty|debt\.vel/.test(k)) return "nauthiz"; // need, the narrow band
|
||||
if (/retro/.test(k)) return "isa"; // the sky standing still (licence)
|
||||
if (/season|zodiac/.test(k)) return "jera"; // the year-wheel
|
||||
if (k === "clock.deaths" || k === "astro.saturn") return "eihwaz"; // the yew endures
|
||||
if (p === "natal" || k === "crypto.vel") return "perthro"; // the lot-cup: fate & dice
|
||||
if (["hand", "tof", "touch"].includes(p)) return "algiz"; // ᛉ — the raised, warding hand
|
||||
if (p === "sun" || /^sky\.elev/.test(k)) return "sowilo";
|
||||
if (k === "astro.mars") return "tiwaz"; // ordered war, Tyr = Mars
|
||||
if (k === "clock.births" || k === "almanac.fertile") return "berkano"; // the birch births
|
||||
if (p === "syn") return "ehwaz"; // horse & rider: the trusted bond
|
||||
if (p === "audio" || k === "clock.popvel") return "mannaz";
|
||||
if (/astro\.moon|almanac\.dec/.test(k)) return "laguz"; // the tide-water
|
||||
if (p === "almanac") return "ingwaz"; // the seed held
|
||||
if (/^sky\.day|light|ambient/.test(k)) return "dagaz"; // day breaks
|
||||
if (k === "debt.total" || k === "world.lifeexp") return "othala"; // what is handed down (licence: the debt)
|
||||
return "mannaz";
|
||||
}
|
||||
|
||||
// THE WHEEL OF THE YEAR — the eight festivals at their true solar longitudes
|
||||
// (quarters at 0/90/180/270, cross-quarters at 15° of the fixed signs — the
|
||||
// astronomical reckoning). An honest modern synthesis of the attested Irish
|
||||
// fire festivals and the solstice customs; the sun's live position shows
|
||||
// where the year stands.
|
||||
const WHEELYEAR = [
|
||||
{ key: "ostara", label: "ostara · equinox · balance", lon: 0, petals: 4, col: [170, 230, 160] },
|
||||
{ key: "beltane", label: "beltane · the fires · union", lon: 45, petals: 8, col: [255, 90, 60] },
|
||||
{ key: "litha", label: "litha · midsummer · the peak", lon: 90, petals: 8, col: [255, 215, 80] },
|
||||
{ key: "lughnasadh", label: "lughnasadh · first fruits · the fair", lon: 135, petals: 6, col: [215, 150, 60] },
|
||||
{ key: "mabon", label: "mabon · the reckoning", lon: 180, petals: 4, col: [185, 95, 55] },
|
||||
{ key: "samhain", label: "samhain · the veil thins", lon: 225, petals: 3, col: [235, 115, 45] },
|
||||
{ key: "yule", label: "yule · the light returns", lon: 270, petals: 6, col: [240, 232, 205] },
|
||||
{ key: "imbolc", label: "imbolc · first stirrings", lon: 315, petals: 3, col: [235, 240, 248] },
|
||||
];
|
||||
WHEELYEAR.forEach((f2) => { // same convention as the zodiac wheel: 0° left, CCW
|
||||
const a2 = (180 + f2.lon) * Math.PI / 180;
|
||||
f2.pos = [0.5 + 0.45 * Math.cos(a2), 0.5 - 0.45 * Math.sin(a2)];
|
||||
});
|
||||
const WHEELYEAR_SCALES = { // the light half bright, the dark half deep
|
||||
ostara: { root: 53, scale: "major" }, beltane: { root: 55, scale: "mixolydian" },
|
||||
litha: { root: 60, scale: "lydian" }, lughnasadh: { root: 57, scale: "mixolydian" },
|
||||
mabon: { root: 48, scale: "dorian" }, samhain: { root: 43, scale: "phrygian" },
|
||||
yule: { root: 45, scale: "minor" }, imbolc: { root: 50, scale: "dorian" },
|
||||
};
|
||||
function wheelyearOf(key) {
|
||||
const k = (key || "").toLowerCase(), p = k.split(".")[0];
|
||||
if (/deaths|quake|debt|poverty/.test(k) || p === "astro") return "samhain"; // the ancestors, the deep, the seer's night
|
||||
if (/light|ambient/.test(k)) return "yule"; // the returning light
|
||||
if (/births|fertile/.test(k) || p === "natal") return "imbolc"; // first stirrings; your birth
|
||||
if (p === "weather" || /season|harmony/.test(k)) return "ostara"; // the turning, the balance
|
||||
if (p === "fire" || ["hand", "tof", "touch", "body", "syn"].includes(p)) return "beltane"; // the fires, the dance, the union
|
||||
if (p === "sun" || /^sky\./.test(k)) return "litha"; // the sun at its height
|
||||
if (["wiki", "audio", "market", "me", "crypto", "planes", "iss"].includes(p)) return "lughnasadh"; // the great fair
|
||||
return "mabon"; // the reckoning of the year
|
||||
}
|
||||
function drawYearOverlay(t, g) { // the sun walking the year, live
|
||||
const sunN = sources.get("astro.sun_lon");
|
||||
const d3 = new Date();
|
||||
const lon = sunN && typeof sunN.raw === "number" ? ((sunN.raw % 360) + 360) % 360
|
||||
: sunLon(jCent(julianDay(d3.getUTCFullYear(), d3.getUTCMonth() + 1, d3.getUTCDate(), d3.getUTCHours())));
|
||||
const box = mapBox(g);
|
||||
const cx = (box.x0 + box.x1) / 2, cy = (box.y0 + box.y1) / 2;
|
||||
const R = Math.min(box.x1 - box.x0, box.y1 - box.y0) * 0.5 - 4;
|
||||
const a2 = (180 + lon) * Math.PI / 180;
|
||||
const sx2 = cx + R * Math.cos(a2), sy2 = cy - R * Math.sin(a2);
|
||||
ctx.save();
|
||||
ctx.strokeStyle = "rgba(200,212,240,0.18)"; ctx.lineWidth = 1;
|
||||
ctx.beginPath(); ctx.arc(cx, cy, R, 0, Math.PI * 2); ctx.stroke();
|
||||
drawHalo(sx2, sy2, 26, [255, 214, 110], 0.7);
|
||||
ctx.fillStyle = "rgba(255,225,150,0.95)";
|
||||
ctx.font = "13px 'Helvetica Neue', Arial, sans-serif";
|
||||
ctx.textAlign = "center"; ctx.textBaseline = "middle";
|
||||
ctx.fillText("☉", sx2, sy2);
|
||||
ctx.font = "500 9px 'Helvetica Neue', Arial, sans-serif";
|
||||
ctx.fillStyle = "rgba(255,225,150,0.7)";
|
||||
ctx.fillText("the year stands here", sx2, sy2 + 16);
|
||||
ctx.restore();
|
||||
}
|
||||
|
||||
const SKINS = {
|
||||
chakra: {
|
||||
key: "chakra", label: "chakra", word: "chakra",
|
||||
@ -2553,6 +2704,15 @@
|
||||
stations: SIGNS, stationOf: zodiacOf, scaleOf: (k) => SIGN_SCALES[k],
|
||||
overlay: drawWheelOverlay, dynamicStations: rezodiac,
|
||||
},
|
||||
futhark: {
|
||||
key: "futhark", label: "the runes (futhark)", word: "rune", layout: "map",
|
||||
stations: FUTHARK, stationOf: futharkOf, scaleOf: (k) => FUTHARK_SCALES[k],
|
||||
},
|
||||
wheelyear: {
|
||||
key: "wheelyear", label: "wheel of the year (celtic)", word: "festival", layout: "map",
|
||||
stations: WHEELYEAR, stationOf: wheelyearOf, scaleOf: (k) => WHEELYEAR_SCALES[k],
|
||||
overlay: drawYearOverlay,
|
||||
},
|
||||
};
|
||||
for (const s in SKINS) {
|
||||
const byKey = {};
|
||||
@ -4097,6 +4257,51 @@
|
||||
}
|
||||
setNatalSource("natal.angles", who + " · the angles struck", ang);
|
||||
}
|
||||
// synastry — the relationship rings when the living sky strikes either end
|
||||
// of any chart-to-chart aspect
|
||||
if (synPartner) {
|
||||
const hitOnB = {};
|
||||
for (const tp of PLANET7) for (const np of PLANET7) {
|
||||
const h = aspectHit(Tr[tp], synPartner.pos[np], tp === "sun" || tp === "moon" || np === "sun" || np === "moon");
|
||||
if (h) hitOnB[np] = Math.max(hitOnB[np] || 0, h.s);
|
||||
}
|
||||
let synWebS = 0, synMoonS = 0;
|
||||
for (const iw of interWeb) {
|
||||
synWebS += iw.w * ((hitOn[iw.a] || 0) + (hitOnB[iw.b] || 0));
|
||||
const hma = aspectHit(Tr.moon, natalActive.pos[iw.a], true);
|
||||
const hmb = aspectHit(Tr.moon, synPartner.pos[iw.b], true);
|
||||
synMoonS = Math.max(synMoonS, iw.w * Math.max(hma ? hma.s : 0, hmb ? hmb.s : 0));
|
||||
}
|
||||
const pair = who + " & " + synPartner.name;
|
||||
setNatalSource("syn.web", pair + " · the bond ringing", synWebS / 1.5);
|
||||
setNatalSource("syn.moon", pair + " · the bond's daily weather", synMoonS);
|
||||
}
|
||||
}
|
||||
|
||||
// ---- synastry: two charts, one figure ------------------------------------
|
||||
let synPartner = null; // {name, pos}
|
||||
let interWeb = []; // [{a: yours, b: theirs, kind, w}]
|
||||
function syncSynastry() {
|
||||
synPartner = null; interWeb = [];
|
||||
if (!natalActive || charts.synWith == null || charts.synWith === charts.active) return;
|
||||
const pc = charts.list[charts.synWith];
|
||||
if (!pc) { charts.synWith = null; return; }
|
||||
const pn = computeNatal(pc);
|
||||
synPartner = { name: pc.name || "them", pos: pn.pos };
|
||||
let harmony = 0, tension = 0, conj = 0;
|
||||
for (const a of PLANET7) for (const b of PLANET7) {
|
||||
const h = aspectHit(natalActive.pos[a], synPartner.pos[b],
|
||||
a === "sun" || a === "moon" || b === "sun" || b === "moon");
|
||||
if (!h || h.s < 0.1) continue;
|
||||
interWeb.push({ a, b, kind: h.kind, w: h.s });
|
||||
if (h.kind === "soft") harmony += h.s; else if (h.kind === "hard") tension += h.s; else conj += h.s;
|
||||
}
|
||||
const pair = (natalActive.name) + " & " + synPartner.name;
|
||||
setNatalSource("syn.harmony", pair + " · standing grace", harmony / 3);
|
||||
setNatalSource("syn.tension", pair + " · standing friction", tension / 3);
|
||||
setNatalSource("syn.hits", pair + " · meetings", conj / 2);
|
||||
eventTicker.unshift({ text: "⚭ " + pair + " · " + interWeb.length + " aspects between them", tAdded: now(), src: "sys" });
|
||||
natalTick();
|
||||
}
|
||||
function activateChart(i) {
|
||||
charts.active = i;
|
||||
@ -4108,6 +4313,7 @@
|
||||
natalTick();
|
||||
const rising = n.asc != null ? " · " + SIGNS[Math.floor(n.asc / 30)].key + " rising" : "";
|
||||
eventTicker.unshift({ text: "✨ " + natalActive.name + "'s sky is in the choir · " + n.web.length + " natal aspects in the web" + rising, tAdded: now(), src: "sys" });
|
||||
syncSynastry();
|
||||
}
|
||||
setInterval(natalTick, 60000); // the moon moves ~0.5°/hour — a minute is plenty
|
||||
if (charts.list.length) setTimeout(() => activateChart(charts.active), 1500);
|
||||
@ -4136,12 +4342,25 @@
|
||||
const rm = document.createElement("span"); rm.className = "x"; rm.textContent = "×";
|
||||
rm.onclick = () => {
|
||||
charts.list.splice(i, 1);
|
||||
charts.synWith = null; synPartner = null; interWeb = [];
|
||||
if (charts.active >= charts.list.length) charts.active = 0;
|
||||
if (!charts.list.length) natalActive = null;
|
||||
try { localStorage.setItem("gs_charts", JSON.stringify(charts)); } catch (e) {}
|
||||
openNatal();
|
||||
};
|
||||
row.appendChild(btn); row.appendChild(rm);
|
||||
row.appendChild(btn);
|
||||
if (i !== charts.active) { // ⚭ — bind this chart to the active one
|
||||
const syb = document.createElement("button"); syb.className = "midibtn";
|
||||
syb.textContent = charts.synWith === i ? "⚭ bound" : "⚭";
|
||||
syb.title = "synastry — this chart against the active one";
|
||||
syb.onclick = () => {
|
||||
charts.synWith = charts.synWith === i ? null : i;
|
||||
try { localStorage.setItem("gs_charts", JSON.stringify(charts)); } catch (e) {}
|
||||
syncSynastry(); openNatal();
|
||||
};
|
||||
row.appendChild(syb);
|
||||
}
|
||||
row.appendChild(rm);
|
||||
natalEl.appendChild(row);
|
||||
}
|
||||
// new chart form
|
||||
|
||||
Loading…
Reference in New Issue
Block a user