Mostly audio stuff

This commit is contained in:
Dan 2025-12-13 15:17:46 +00:00
parent bdd00ec9e8
commit 2f5f4dbea4
28 changed files with 811 additions and 710 deletions

View file

@ -1,6 +1,6 @@
--- ---
title: "{{ replace .TranslationBaseName "-" " " | title }}" title: "{{ replace .TranslationBaseName "-" " " | title }}"
date: {{ .Date.Format "2006-01-02" }} date: {{ .Date }}
tags: [] tags: []
description: "" description: ""
--- ---

View file

@ -45,17 +45,16 @@ if (window.terminal) {
// PAGE NAVIGATION // PAGE NAVIGATION
window.terminal.registerCommand(
"latest",
"View the latest post, regardles of section",
() => {
let latestPostLink = document.getElementById("latest-post-link");
window.location.href = latestPostLink.textContent;
},
);
// About command // About command
window.terminal.registerCommand("about", "About this site", () => { window.terminal.registerCommand("about", "About this site", () => {
window.location.href = "/about/"; window.location.href = "/about/";
}); });
window.terminal.registerCommand(
"music",
"My music interests and audio gear",
() => {
window.location.href = "/audio/";
},
);
} }

View file

@ -19,3 +19,61 @@ if (document.getElementById("starfield")) {
starfield.appendChild(star); starfield.appendChild(star);
} }
} }
(function () {
const container = document.querySelector(".record-shelf-container");
// Exit if the record shelf doesn't exist on this page
if (!container) {
return;
}
const recordSlots = container.querySelectorAll(".record-slot");
const albumContents = container.querySelectorAll(".album-content");
// Exit if we don't have the necessary elements
if (!recordSlots.length || !albumContents.length) {
return;
}
// Set first album as active by default
const firstSlot = recordSlots[0];
if (firstSlot) {
const firstSleeve = firstSlot.querySelector(".record-sleeve");
if (firstSleeve) {
firstSleeve.classList.add("active");
}
}
recordSlots.forEach((slot) => {
slot.addEventListener("click", function (e) {
e.preventDefault();
const index = this.getAttribute("data-album-index");
// Hide all content
albumContents.forEach((content) => (content.style.display = "none"));
// Show selected content
const selectedContent = container.querySelector(
`[data-content-index="${index}"]`,
);
if (selectedContent) {
selectedContent.style.display = "block";
}
// Remove active class from all sleeves
recordSlots.forEach((s) => {
const sleeve = s.querySelector(".record-sleeve");
if (sleeve) {
sleeve.classList.remove("active");
}
});
// Add active class to clicked sleeve
const clickedSleeve = this.querySelector(".record-sleeve");
if (clickedSleeve) {
clickedSleeve.classList.add("active");
}
});
});
})();

View file

@ -61,9 +61,9 @@ class TerminalShell {
latestPostDate.innerText + latestPostDate.innerText +
")", ")",
); );
this.printHTML( // this.printHTML(
"<span class='info'>&nbsp;- Type \"latest\" to view it.</span>", // "<span class='info'>&nbsp;- Type \"latest\" to view it.</span>",
); // );
this.printHTML("&nbsp;"); this.printHTML("&nbsp;");
this.printHTML( this.printHTML(
@ -71,7 +71,7 @@ class TerminalShell {
); );
this.printHTML( this.printHTML(
'<span class="warning">This site is under construction. There\'s nothing of interest here yet.</span>', '<span class="warning">This site is under construction. There\'s not much of interest here yet.</span>',
); );
this.inputContainer.classList.remove("hidden"); this.inputContainer.classList.remove("hidden");

View file

@ -62,3 +62,34 @@ $breakpoints: (
} }
} }
} }
@mixin scrollbar-custom(
$color: greenyellow,
$width: 8px,
$track-bg: transparent
) {
scrollbar-color: $color $track-bg;
scrollbar-width: thin;
&::-webkit-scrollbar {
width: $width;
}
&::-webkit-scrollbar-track {
background: $track-bg;
}
&::-webkit-scrollbar-thumb {
background-color: $color;
border-radius: calc($width / 2);
}
&::-webkit-scrollbar-thumb:hover {
background-color: darken($color, 10%);
}
}
// Usage
.scrollable-child {
@include scrollbar-custom(greenyellow, 10px);
}

View file

@ -7,249 +7,283 @@
* Use a better box model (opinionated). * Use a better box model (opinionated).
*/ */
html { html {
box-sizing: border-box; box-sizing: border-box;
} }
* { * {
box-sizing: inherit;
&::before,
&::after {
box-sizing: inherit; box-sizing: inherit;
&::before, &::after {
box-sizing: inherit;
}
} }
}
/**
/**
* Use a more readable tab size (opinionated). * Use a more readable tab size (opinionated).
*/ */
:root { :root {
-moz-tab-size: 4; -moz-tab-size: 4;
tab-size: 4; tab-size: 4;
} }
/** /**
* 1. Correct the line height in all browsers. * 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS. * 2. Prevent adjustments of font size after orientation changes in iOS.
*/ */
html { html {
line-height: 1.15; line-height: 1.15;
/* 1 */ /* 1 */
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
/* 2 */ /* 2 */
} }
/* Sections /* Sections
========================================================================== */ ========================================================================== */
/** /**
* Remove the margin in all browsers. * Remove the margin in all browsers.
*/ */
body { body {
margin: 0; margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-family:
} -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial,
sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
/** }
/**
* Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) * Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
*/ */
/* Grouping content /* Grouping content
========================================================================== */ ========================================================================== */
/** /**
* Add the correct height in Firefox. * Add the correct height in Firefox.
*/ */
hr { hr {
height: 0; height: 0;
} }
/* Text-level semantics /* Text-level semantics
========================================================================== */ ========================================================================== */
/** /**
* Add the correct text decoration in Chrome, Edge, and Safari. * Add the correct text decoration in Chrome, Edge, and Safari.
*/ */
abbr[title] { abbr[title] {
text-decoration: underline dotted; text-decoration: underline dotted;
} }
/** /**
* Add the correct font weight in Chrome, Edge, and Safari. * Add the correct font weight in Chrome, Edge, and Safari.
*/ */
b, strong { b,
font-weight: bolder; strong {
} font-weight: bolder;
}
/**
/**
* 1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) * 1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
* 2. Correct the odd `em` font sizing in all browsers. * 2. Correct the odd `em` font sizing in all browsers.
*/ */
code, kbd, samp, pre { code,
font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace; kbd,
/* 1 */ samp,
font-size: 1em; pre {
/* 2 */ font-family:
} SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
/* 1 */
/** font-size: 1em;
/* 2 */
}
/**
* Add the correct font size in all browsers. * Add the correct font size in all browsers.
*/ */
small { small {
font-size: 80%; font-size: 80%;
} }
/** /**
* Prevent `sub` and `sup` elements from affecting the line height in all browsers. * Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/ */
sub, sup { sub,
font-size: 75%; sup {
line-height: 0; font-size: 75%;
position: relative; line-height: 0;
vertical-align: baseline; position: relative;
} vertical-align: baseline;
}
sub {
bottom: -0.25em; sub {
} bottom: -0.25em;
}
sup {
top: -0.5em; sup {
} top: -0.5em;
}
/* Forms
/* Forms
========================================================================== */ ========================================================================== */
/** /**
* 1. Change the font styles in all browsers. * 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari. * 2. Remove the margin in Firefox and Safari.
*/ */
button, input, optgroup, select, textarea { button,
font-family: inherit; input,
/* 1 */ optgroup,
font-size: 100%; select,
/* 1 */ textarea {
line-height: 1.15; font-family: inherit;
/* 1 */ /* 1 */
margin: 0; font-size: 100%;
/* 2 */ /* 1 */
} line-height: 1.15;
/* 1 */
/** margin: 0;
/* 2 */
}
/**
* Remove the inheritance of text transform in Edge and Firefox. * Remove the inheritance of text transform in Edge and Firefox.
* 1. Remove the inheritance of text transform in Firefox. * 1. Remove the inheritance of text transform in Firefox.
*/ */
button, select { button,
/* 1 */ select {
text-transform: none; /* 1 */
} text-transform: none;
}
/**
/**
* Correct the inability to style clickable types in iOS and Safari. * Correct the inability to style clickable types in iOS and Safari.
*/ */
button, [type='button'], [type='reset'], [type='submit'] { button,
-webkit-appearance: button; [type="button"],
} [type="reset"],
[type="submit"] {
/** -webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox. * Remove the inner border and padding in Firefox.
*/ */
button::-moz-focus-inner, [type='button']::-moz-focus-inner, [type='reset']::-moz-focus-inner, [type='submit']::-moz-focus-inner { button::-moz-focus-inner,
border-style: none; [type="button"]::-moz-focus-inner,
padding: 0; [type="reset"]::-moz-focus-inner,
} [type="submit"]::-moz-focus-inner {
border-style: none;
/** padding: 0;
}
/**
* Restore the focus styles unset by the previous rule. * Restore the focus styles unset by the previous rule.
*/ */
button:-moz-focusring, [type='button']:-moz-focusring, [type='reset']:-moz-focusring, [type='submit']:-moz-focusring { button:-moz-focusring,
outline: 1px dotted ButtonText; [type="button"]:-moz-focusring,
} [type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
/** outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox. * Correct the padding in Firefox.
*/ */
fieldset { fieldset {
padding: 0.35em 0.75em 0.625em; padding: 0.35em 0.75em 0.625em;
} }
/** /**
* Remove the padding so developers are not caught out when they zero out `fieldset` elements in all browsers. * Remove the padding so developers are not caught out when they zero out `fieldset` elements in all browsers.
*/ */
legend { legend {
padding: 0; padding: 0;
} }
/** /**
* Add the correct vertical alignment in Chrome and Firefox. * Add the correct vertical alignment in Chrome and Firefox.
*/ */
progress { progress {
vertical-align: baseline; vertical-align: baseline;
} }
/** /**
* Correct the cursor style of increment and decrement buttons in Safari. * Correct the cursor style of increment and decrement buttons in Safari.
*/ */
[type='number'] { [type="number"] {
&::-webkit-inner-spin-button, &::-webkit-outer-spin-button { &::-webkit-inner-spin-button,
height: auto; &::-webkit-outer-spin-button {
} height: auto;
} }
}
/**
/**
* 1. Correct the odd appearance in Chrome and Safari. * 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari. * 2. Correct the outline style in Safari.
*/ */
[type='search'] { [type="search"] {
-webkit-appearance: textfield; -webkit-appearance: textfield;
/* 1 */ /* 1 */
outline-offset: -2px; outline-offset: -2px;
/* 2 */ /* 2 */
&::-webkit-search-decoration { &::-webkit-search-decoration {
-webkit-appearance: none; -webkit-appearance: none;
}
} }
}
/**
/**
* Remove the inner padding in Chrome and Safari on macOS. * Remove the inner padding in Chrome and Safari on macOS.
*/ */
/** /**
* 1. Correct the inability to style clickable types in iOS and Safari. * 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari. * 2. Change font properties to `inherit` in Safari.
*/ */
::-webkit-file-upload-button { ::-webkit-file-upload-button {
-webkit-appearance: button; -webkit-appearance: button;
/* 1 */ /* 1 */
font: inherit; font: inherit;
/* 2 */ /* 2 */
} }
/* Interactive /* Interactive
========================================================================== */ ========================================================================== */
/* /*
* Add the correct display in Chrome and Safari. * Add the correct display in Chrome and Safari.
*/ */
summary { summary {
display: list-item; display: list-item;
} }
p {
line-height: 1.5em;
letter-spacing: 0.01em;
word-spacing: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
}

View file

@ -6,6 +6,10 @@
color: #fff; color: #fff;
text-align: center; text-align: center;
a {
color: #fff;
}
> .page-content { > .page-content {
position: absolute; position: absolute;
left: 50%; left: 50%;
@ -20,7 +24,77 @@
padding-top: 400px; padding-top: 400px;
} }
.neon-sign { .audio-intro {
width: 100%;
margin: auto;
text-align: left;
margin-bottom: 30px;
display: grid;
grid-template-columns: 1fr auto 1fr;
gap: 2rem;
> div > .neon-sign {
position: relative;
top: auto;
left: auto;
right: auto;
bottom: auto;
transform: none;
margin-bottom: 40px;
> .neon-text {
font-size: 3rem;
animation-delay: 2.5s;
line-height: 1rem;
> span {
display: block;
position: absolute;
top: 50px;
left: 50%;
transform: rotate(110deg);
letter-spacing: -20%;
animation-delay: 2.3s;
}
}
}
> *:nth-child(3n + 2) {
align-self: center;
font-size: 3rem;
}
@include media-down(xl) {
width: 100%;
grid-template-columns: 1fr;
> *:nth-child(3n + 2) {
display: none;
}
}
ul {
margin-bottom: 2rem;
li {
margin-left: 2rem;
}
}
.intro-ipod {
float: left;
@include media-down(lg) {
display: none;
}
}
p {
margin-bottom: 1rem;
}
}
> .neon-sign {
position: absolute; position: absolute;
top: 0; top: 0;
left: 50%; left: 50%;
@ -39,11 +113,11 @@
.record-shelf-container { .record-shelf-container {
.shelf { .shelf {
display: flex; display: flex;
gap: 5rem; gap: 5%;
position: relative; position: relative;
overflow: visible; overflow: visible;
padding-left: 2em; padding-left: 5%;
padding-right: 2em; padding-right: 5%;
} }
.shelf::before { .shelf::before {
@ -65,10 +139,9 @@
.record-slot { .record-slot {
position: relative; position: relative;
width: 200px; width: 20%;
min-width: 140px; min-width: 100px;
height: 200px; aspect-ratio: 1/1;
perspective: 1000px;
} }
.record-sleeve { .record-sleeve {
@ -76,11 +149,18 @@
height: 100%; height: 100%;
position: relative; position: relative;
transition: transform 0.3s ease; transition: transform 0.3s ease;
&.active {
.sleeve-front {
border: 3px solid white;
}
}
} }
.sleeve-front { .sleeve-front {
width: 100%; width: 100%;
height: 100%; height: 100%;
aspect-ratio: 1/1;
position: absolute; position: absolute;
border-radius: 2px; border-radius: 2px;
box-shadow: box-shadow:
@ -181,6 +261,134 @@
transform: translateX(-10%); transform: translateX(-10%);
} }
} }
.audio-shelf-text {
width: 60%;
margin: auto;
margin-top: 50px;
margin-bottom: 50px;
text-align: left;
border: 1px solid white;
padding: 30px;
border-radius: 10px;
backdrop-filter: blur(10px);
background-color: rgba(255, 255, 255, 0.1);
@include media-down(lg) {
width: 100%;
padding: 10px;
}
p {
margin-bottom: 1rem;
}
}
.audio-gear {
margin: 2rem 0;
> .neon-sign {
position: relative;
top: auto;
left: auto;
right: auto;
bottom: auto;
transform: none;
margin-bottom: 90px;
> .neon-text {
font-size: 5rem;
animation-delay: 2.5s;
line-height: 1rem;
> span {
display: block;
position: absolute;
top: 50px;
left: 50%;
transform: rotate(80deg);
letter-spacing: -20%;
animation-delay: 2.3s;
}
}
}
.gear-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
margin-top: 1.5rem;
@media (max-width: 768px) {
grid-template-columns: 1fr;
}
.gear-item {
backdrop-filter: blur(10px);
background-color: rgba(255, 255, 255, 0.1);
border: 1px solid white;
border-radius: 4px;
padding: 1.5rem;
transition: all 0.3s ease;
display: flex;
flex-direction: column;
gap: 1rem;
&:hover {
transform: translateY(-2px);
}
.gear-icon {
font-size: 2rem;
text-align: center;
}
.gear-content {
display: flex;
flex-direction: column;
gap: 0.5rem;
flex: 1;
}
}
}
.gear-title {
font-size: 1.2rem;
margin: 0;
color: var(--neon-cyan);
font-family: var(--mono-font, monospace);
}
.gear-category {
font-size: 0.85rem;
color: var(--neon-magenta);
text-transform: uppercase;
letter-spacing: 0.05em;
opacity: 0.8;
}
.gear-summary {
font-size: 0.9rem;
line-height: 1.5;
opacity: 0.85;
margin: 0.5rem 0;
flex: 1;
}
.gear-link {
color: var(--neon-cyan);
text-decoration: none;
font-size: 0.9rem;
margin-top: auto;
transition: color 0.3s ease;
&:hover {
color: var(--neon-magenta);
text-decoration: underline;
}
}
}
} }
.starfield-full { .starfield-full {

View file

@ -1,3 +1,4 @@
@import "normalize";
@import "mixins"; @import "mixins";
@import "partials/global-styles"; @import "partials/global-styles";
@ -17,7 +18,7 @@
@import "pages/about"; @import "pages/about";
@import "pages/audio"; @import "pages/audio";
@import url("https://fonts.googleapis.com/css2?family=Caveat:wght@400;700&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&family=Neonderthaw&display=swap");
@font-face { @font-face {
font-family: "DSEG7-Classic"; font-family: "DSEG7-Classic";
@ -48,7 +49,7 @@
body { body {
width: 100%; width: 100%;
height: 100vh; height: 100vh;
font-family: "Courier New", monospace; font-family: "Lato", sans-serif;
background: #1a1a1a; background: #1a1a1a;
position: relative; position: relative;
} }
@ -291,6 +292,12 @@ body {
background: black; background: black;
color: greenyellow; color: greenyellow;
font-family: monospace; font-family: monospace;
> .scroll {
overflow: scroll;
max-height: 100%;
@include scrollbar-custom(#0f0, 3px);
}
} }
.crt a { .crt a {
@ -1616,9 +1623,6 @@ body {
border-radius: 50%; border-radius: 50%;
} }
/* Import a nice cursive font */
@import url("https://fonts.googleapis.com/css2?family=Neonderthaw&display=swap");
.navigation { .navigation {
position: absolute; position: absolute;
bottom: 10%; bottom: 10%;

View file

@ -0,0 +1,15 @@
---
headless: true
---
**Albums**
- Ninajirachi - I Love My Computer (2025)
- Dire Straits - Brothers In Arms (1985)
- Bespin Moons - A Binding Force (2020)
**Hardware**
- Hiby R4 x EVA
- Fosi Audio GR70 Tube Amp
- CVJ Vivan IEM

View file

@ -1,8 +1,6 @@
--- ---
title: Music & Audio title: Music & Audio
author: Dan author: Dan
date: 2025-12-10 date: 2025-12-13
comments: false comments: false
--- ---
This page is coming soon.

16
content/audio/intro.md Normal file
View file

@ -0,0 +1,16 @@
---
headless: true
---
I love music. I'm working on trying to listen to things a bit more
attentively, so my plan is to write some thoughts about the various
albums I own, be it on cassette, vinyl, CD or digitally.
As I work through my collection they'll appear on the shelf, click on
them to see my thoughts.
Further down you can find a selection of the audio hardware I have,
eventually I want to get around to writing about these too!
If you have anything you think I'd like, or anything you have made -
please email it to me! dan@ritual.sh

View file

@ -0,0 +1,8 @@
---
title: "CVJ Vivian"
date: 2025-12-11
tags: ["audio", "headphones"]
category: ["iem"]
description: ""
icon: 🎧
---

View file

@ -2,6 +2,7 @@
title: "Fiio FT-1" title: "Fiio FT-1"
date: 2025-12-08 date: 2025-12-08
tags: ["audio", "headphones"] tags: ["audio", "headphones"]
category: ["headphones"]
description: "" description: ""
icon: 🎧 icon: 🎧
--- ---

View file

@ -1,7 +1,8 @@
--- ---
title: "Hiby R4 EVA" title: "Hiby R4 x EVA"
date: 2025-12-10 date: 2025-12-10
tags: ["audio", "dap"] tags: ["audio", "dap"]
category: ["dap"]
description: "" description: ""
icon: 🎵 icon: 🎵
--- ---

View file

@ -2,6 +2,7 @@
title: "iPod Video 5th Generation - Upgraded" title: "iPod Video 5th Generation - Upgraded"
date: 2025-12-11 date: 2025-12-11
tags: ["audio", "dap"] tags: ["audio", "dap"]
category: ["dap"]
description: "" description: ""
icon: 🎵 icon: 🎵
--- ---

View file

@ -1,7 +1,17 @@
--- ---
title: "Neon Odin - Allfather" title: "Neon Odin - Allfather"
date: 2025-12-12 date: 2025-01-12
tags: ["album"] tags: ["album"]
description: "" description: ""
cover: "cover.jpg" cover: "cover.jpg"
--- ---
Neon Odin's _Allfather_ feels like mythology filtered through analog circuits and a CRT glow (much like myself). The album merges darksynth with handcrafted Nordic folk instruments - talharpa and nyckelharpa built by the artist himself - creating something that shouldn't work but absolutely does.
Tracks like "Wield The Hammer" and "March Of The Jǫtnar" pulse with vintage synthesizers while maintaining an almost ritualistic weight. There's a devotion here to both the Æsir and 80s electronics, and the combination taps into something primal about storytelling through sound.
This is retrowave that refuses to be purely nostalgic, grounding its neon-soaked atmosphere in actual craftsmanship and ancient narratives that really resonate.
Favourite Track: Wield The Hammer
Rating: 7/10

View file

@ -5,3 +5,15 @@ tags: ["album"]
description: "" description: ""
cover: "cover.jpg" cover: "cover.jpg"
--- ---
Ninajirachi's _I Love My Computer_ captures something truthful about growing up shaped by screens and bandwidth. The album explores that strange intimacy we developed with our machines - the late nights, the secret discoveries, the way technology became less of a tool and more of a companion.
Tracks like "Fuck My Computer" and "iPod Touch" aren't just bangers; they're confessions about a relationship that transcends generations. Whether you learned HTML on Geocities or taught yourself production in GarageBand, there's recognition here.
The production has a restless energy, shifting between euphoric and introspective, mirroring how the internet itself feels—chaotic, isolating, and strangely beautiful all at once. It's a debut album that understands what it meant to have your world widened by a glowing rectangle - and I relate deeply to its content despite being at least one generation older than Ninajirachi.
Not my usual genre of listen, but it has been a regular spin since it came into my world.
Favourite Track: iPod Touch
Rating: 8/10

View file

@ -0,0 +1,8 @@
---
title: "2025 12 08 Homepage"
date: 2025-12-08T14:02:19Z
tags: []
description: ""
---
First version of the homepage created with the interactive terminal.

View file

@ -0,0 +1,8 @@
---
title: "2025 12 09 About"
date: 2025-12-09T14:07:59Z
tags: []
description: ""
---
Added initial version of the about page with some approximation of a manifesto.

View file

@ -0,0 +1,8 @@
---
title: "2025 12 13 Album Reviews"
date: 2025-12-13T15:16:18Z
tags: []
description: ""
---
Added some of my thoughts about Allfather by Neon Odin and I Love My Computer by Ninajirachi

View file

@ -0,0 +1,8 @@
---
title: "2025 12 13 Music"
date: 2025-12-13T14:09:08Z
tags: []
description: ""
---
Created the music and audio gear section!

View file

@ -1,75 +0,0 @@
{{ define "header" }}{{ partial "page-header.html" . }}{{ end }} {{ define
"main" }}
<article class="audio-page">
<div class="starfield-full" id="starfield">
<div class="buildings-bg">
<div class="buildings-far" data-count="40"></div>
<div class="buildings-mid" data-count="40"></div>
<div class="buildings-near" data-count="40"></div>
<div class="ambient-light"></div>
</div>
</div>
<div class="page-content">
<div class="neon-sign">
<div class="neon-text purple">music <span>&</span> audio gear</div>
</div>
<div class="record-shelf-container">
<div class="shelf">
<!-- prettier-ignore -->
{{ $posts := where site.RegularPages "Type" "media" }}
{{ $posts = where $posts "Params.tags" "intersect" (slice "album") }}
{{ range first 5 $posts }}
<a class="record-slot" href="{{ .RelPermalink }}">
<div class="record-sleeve">
<!-- prettier-ignore -->
{{ with .Resources.GetMatch "cover.*" }}
{{ $image := .Resize "500x webp q85" }}
<div
class="sleeve-front"
style="--album-cover: url({{ $image.RelPermalink }})"
>
{{ end }}
<!-- prettier-ignore -->
<div class="album-title">
{{ .Title }}
</div>
</div>
<div class="vinyl-record"></div>
</div>
</a>
{{ end }}
<!-- prettier-ignore -->
{{ if gt (len $posts) 5 }}
<a href="/tags/tutorial/" class="view-all">
View all {{ len $posts }} posts →
</a>
{{ end }}
</div>
</div>
<!-- prettier-ignore -->
{{ partial "elements/ipod.html" . }}
{{ $posts := where site.RegularPages "Type" "gear" }}
{{ $posts = where $posts "Params.tags" "intersect" (slice "audio") }}
{{ range first 5 $posts }}
<h2>{{ .Title }}</h2>
{{ with .Params.icon }}
<p>{{ . }}</p>
{{ end }}
<a href="{{ .RelPermalink }}">Read more</a>
{{ end }}
<!-- prettier-ignore -->
{{ if gt (len $posts) 5 }}
<a href="/tags/tutorial/" class="view-all">
View all {{ len $posts }} posts →
</a>
{{ end }}
</div>
</article>
{{ end }}

View file

@ -1,5 +1,8 @@
{{ define "header" }}{{ partial "page-header.html" . }}{{ end }} {{ define {{ define "header" }}{{ partial "page-header.html" . }}{{ end }} {{ define
"main" }} "main" }} {{ $intro := .Resources.GetMatch "intro.md" }} {{ $intro :=
.Resources.GetMatch "intro.md" }} {{ $currently := .Resources.GetMatch
"currently.md" }}
<article class="audio-page"> <article class="audio-page">
<div class="starfield-full" id="starfield"> <div class="starfield-full" id="starfield">
<div class="buildings-bg"> <div class="buildings-bg">
@ -11,96 +14,101 @@
</div> </div>
<div class="page-content"> <div class="page-content">
<h1>Music &amp; Audio Gear</h1> <div class="neon-sign">
<h1>Music &amp; Audio Gear</h1> <div class="neon-text purple">music <span>&</span> audio gear</div>
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1>
<h1>Music &amp; Audio Gear</h1> <div class="audio-intro">
<h1>Music &amp; Audio Gear</h1> <div>
<h1>Music &amp; Audio Gear</h1> <div class="intro-ipod">{{ partial "elements/ipod.html" . }}</div>
<h1>Music &amp; Audio Gear</h1>
<h1>Music &amp; Audio Gear</h1> {{ with $intro }} {{ .Content }} {{ end }}
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1> <div></div>
<h1>Music &amp; Audio Gear</h1> <div>
<h1>Music &amp; Audio Gear</h1> <div class="neon-sign">
<h1>Music &amp; Audio Gear</h1> <div class="neon-text purple">current rotation <span>-></span></div>
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1> {{ with $currently }} {{ .Content }} {{end}}
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1>
<h1>Music &amp; Audio Gear</h1> <div class="record-shelf-container">
<h1>Music &amp; Audio Gear</h1> <div class="shelf">
<h1>Music &amp; Audio Gear</h1> <!-- prettier-ignore -->
<h1>Music &amp; Audio Gear</h1> {{ $posts := where site.RegularPages "Type" "media" }}
<h1>Music &amp; Audio Gear</h1> {{ $posts = where $posts "Params.tags" "intersect" (slice "album") }}
<h1>Music &amp; Audio Gear</h1> {{ range $index, $post := first 5 $posts }}
<h1>Music &amp; Audio Gear</h1> <a
<h1>Music &amp; Audio Gear</h1> class="record-slot"
<h1>Music &amp; Audio Gear</h1> href="{{ .RelPermalink }}"
<h1>Music &amp; Audio Gear</h1> data-album-index="{{ $index }}"
<h1>Music &amp; Audio Gear</h1> >
<h1>Music &amp; Audio Gear</h1> <div class="record-sleeve">
<h1>Music &amp; Audio Gear</h1> <!-- prettier-ignore -->
<h1>Music &amp; Audio Gear</h1> {{ with .Resources.GetMatch "cover.*" }}
<h1>Music &amp; Audio Gear</h1> {{ $image := .Resize "500x webp q85" }}
<h1>Music &amp; Audio Gear</h1> <div
<h1>Music &amp; Audio Gear</h1> class="sleeve-front"
<h1>Music &amp; Audio Gear</h1> style="--album-cover: url({{ $image.RelPermalink }})"
<h1>Music &amp; Audio Gear</h1> >
<h1>Music &amp; Audio Gear</h1> {{ end }}
<h1>Music &amp; Audio Gear</h1> <!-- prettier-ignore -->
<h1>Music &amp; Audio Gear</h1> <div class="album-title">
<h1>Music &amp; Audio Gear</h1> {{ .Title }}
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1> <div class="vinyl-record"></div>
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1> </a>
<h1>Music &amp; Audio Gear</h1> {{ end }}
<h1>Music &amp; Audio Gear</h1> <!-- prettier-ignore -->
<h1>Music &amp; Audio Gear</h1> {{ if gt (len $posts) 5 }}
<h1>Music &amp; Audio Gear</h1> <a href="/tags/album/" class="view-all">
<h1>Music &amp; Audio Gear</h1> View all {{ len $posts }} posts →
<h1>Music &amp; Audio Gear</h1> </a>
<h1>Music &amp; Audio Gear</h1> {{ end }}
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1>
<h1>Music &amp; Audio Gear</h1> <div class="audio-shelf-text">
<h1>Music &amp; Audio Gear</h1> {{ range $index, $post := first 5 $posts }}
<h1>Music &amp; Audio Gear</h1> <div
<h1>Music &amp; Audio Gear</h1> class="album-content"
<h1>Music &amp; Audio Gear</h1> data-content-index="{{ $index }}"
<h1>Music &amp; Audio Gear</h1> style="{{ if ne $index 0 }}display: none;{{ end }}"
<h1>Music &amp; Audio Gear</h1> >
<h1>Music &amp; Audio Gear</h1> {{ .Content }}
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1> {{ end }}
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1>
<h1>Music &amp; Audio Gear</h1> <div class="audio-gear">
<h1>Music &amp; Audio Gear</h1> <div class="neon-sign">
<h1>Music &amp; Audio Gear</h1> <div class="neon-text purple">gear <span>-></span></div>
<h1>Music &amp; Audio Gear</h1> </div>
<h1>Music &amp; Audio Gear</h1> <div class="gear-grid">
<h1>Music &amp; Audio Gear</h1> {{ $posts := where site.RegularPages "Type" "gear" }} {{ $posts = where
<h1>Music &amp; Audio Gear</h1> $posts "Params.tags" "intersect" (slice "audio") }} {{ range first 5
<h1>Music &amp; Audio Gear</h1> $posts }}
<h1>Music &amp; Audio Gear</h1> <div class="gear-item">
<h1>Music &amp; Audio Gear</h1> {{ with .Params.icon }}
<h1>Music &amp; Audio Gear</h1> <div class="gear-icon">{{ . }}</div>
<h1>Music &amp; Audio Gear</h1> {{ end }}
<h1>Music &amp; Audio Gear</h1> <div class="gear-content">
<h1>Music &amp; Audio Gear</h1> <h3 class="gear-title">{{ .Title }}</h3>
<h1>Music &amp; Audio Gear</h1> {{ with .Params.category }}
<h1>Music &amp; Audio Gear</h1> <span class="gear-category">{{ . }}</span>
<h1>Music &amp; Audio Gear</h1> {{ end }} {{ with .Summary }}
<h1>Music &amp; Audio Gear</h1> <p class="gear-summary">{{ . }}</p>
<h1>Music &amp; Audio Gear</h1> {{ end }} {{/*
<h1>Music &amp; Audio Gear</h1> <a href="{{ .RelPermalink }}" class="gear-link">View details →</a>
<h1>Music &amp; Audio Gear</h1> */}}
</div>
</div>
{{ end }}
</div>
</div>
</div> </div>
</article> </article>
{{ end }} {{ end }}

View file

@ -121,13 +121,18 @@
<!-- Wall-mounted monitors --> <!-- Wall-mounted monitors -->
<div class="secondary-screen wall-monitor-1 hidden-xl-down"> <div class="secondary-screen wall-monitor-1 hidden-xl-down">
<div class="screen-display crt"> <div class="screen-display crt">
> updates -lah<br /> <div class="scroll">
{{ range first 10 (sort .Site.Pages "Lastmod" "desc") }} [<time > updates -lah<br />
>{{ .Lastmod.Format "2006-01-02" }}</time {{ range first 10 (where .Site.RegularPages "Type"
>] - <a href="{{ .Permalink }}">{{ .Title }}</a><br /> "updates").ByLastmod.Reverse }} [<time
{{ end }} >{{ .Lastmod.Format "2006-01-02" }}</time
>]<br />
{{ .Plain }}<br />
---<br />
{{ end }}
<span class="cursor-blink">_</span> <span class="cursor-blink">_</span>
</div>
</div> </div>
</div> </div>
@ -279,12 +284,11 @@
</div> </div>
</div> </div>
{{ $pages := where .Site.RegularPages "Kind" "page" }} {{ range first 1 (sort {{ range first 1 (where .Site.RegularPages "Type" "updates").ByLastmod.Reverse
$pages "Lastmod" "desc") }} }}
<div id="latest-post"> <div id="latest-post">
<div id="latest-post-link">{{ .Permalink }}</div> <div id="latest-post-link">{{ .Permalink }}</div>
<div id="latest-post-title">{{ .Title }}</div> <div id="latest-post-title">{{ .Plain }}</div>
<div id="latest-post-date">{{ .Lastmod.Format "Jan 2, 2006" }}</div> <div id="latest-post-date">{{ .Lastmod.Format "Jan 2, 2006" }}</div>
</div> </div>
{{ end }} {{ end }} {{ end }} {{ end }}

View file

@ -25,308 +25,13 @@
width: 100%; width: 100%;
max-width: 800px; max-width: 800px;
padding: 20px; padding: 20px;
background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%);
box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.8);
position: relative; position: relative;
} color: #fff;
text-align: center;
.window-frame {
position: relative;
width: 100%;
aspect-ratio: 16/9;
background: #3a3a3a;
border: 20px solid #2a2520;
box-shadow:
inset 0 0 20px rgba(0, 0, 0, 0.8),
0 10px 40px rgba(0, 0, 0, 0.9);
overflow: hidden;
}
.window-frame::before {
content: "";
position: absolute;
inset: -20px;
border: 5px solid #1a1510;
pointer-events: none;
z-index: 10;
}
/* Cityscape view */
.cityscape {
width: 100%;
height: 100%;
position: relative;
background: linear-gradient(
180deg,
#1a2332 0%,
#2a3a52 30%,
#4a5a72 60%,
#6a7a92 100%
);
overflow: hidden;
}
/* Sky with slight gradient */
.sky {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 40%;
background: linear-gradient(
180deg,
#0a0f1a 0%,
#1a2a3a 50%,
#2a3a52 100%
);
}
/* Buildings container */
.buildings {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 60%;
display: flex;
align-items: flex-end;
justify-content: space-around;
gap: 20px;
padding: 0 40px;
}
.building {
position: relative;
background: linear-gradient(180deg, #1a1a2e 0%, #0a0a1e 100%);
box-shadow:
inset -2px 0 10px rgba(0, 0, 0, 0.5),
0 0 20px rgba(255, 200, 100, 0.1);
animation: buildingGlow 4s ease-in-out infinite;
}
.building:nth-child(1) {
width: 80px;
height: 280px;
animation-delay: 0s;
}
.building:nth-child(2) {
width: 60px;
height: 200px;
animation-delay: 0.5s;
}
.building:nth-child(3) {
width: 90px;
height: 320px;
animation-delay: 1s;
}
.building:nth-child(4) {
width: 70px;
height: 240px;
animation-delay: 1.5s;
}
.building:nth-child(5) {
width: 85px;
height: 300px;
animation-delay: 2s;
}
/* Building windows */
.building-windows {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 8px;
padding: 15px 10px;
height: 100%;
}
.window-light {
background: #ffd700;
opacity: 0;
box-shadow: 0 0 10px #ffd700;
animation: windowFlicker 3s ease-in-out infinite;
}
.window-light:nth-child(odd) {
animation-delay: 0.5s;
}
.window-light:nth-child(3n) {
animation-delay: 1s;
}
.window-light:nth-child(4n) {
animation-delay: 1.5s;
}
@keyframes windowFlicker {
0%,
100% {
opacity: 0.3;
}
50% {
opacity: 0.9;
}
}
@keyframes buildingGlow {
0%,
100% {
box-shadow:
inset -2px 0 10px rgba(0, 0, 0, 0.5),
0 0 20px rgba(255, 200, 100, 0.1);
}
50% {
box-shadow:
inset -2px 0 10px rgba(0, 0, 0, 0.5),
0 0 30px rgba(255, 200, 100, 0.2);
}
}
/* Dirt and grime on window */
.window-grime {
position: absolute;
inset: 0;
background:
radial-gradient(
circle at 20% 30%,
rgba(50, 40, 30, 0.2) 0%,
transparent 40%
),
radial-gradient(
circle at 80% 60%,
rgba(40, 35, 25, 0.15) 0%,
transparent 50%
),
radial-gradient(
circle at 50% 80%,
rgba(45, 38, 28, 0.18) 0%,
transparent 45%
);
pointer-events: none;
z-index: 6;
}
/* Glass reflection */
.glass-reflection {
position: absolute;
inset: 0;
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.1) 0%,
transparent 30%,
transparent 70%,
rgba(255, 255, 255, 0.05) 100%
);
pointer-events: none;
z-index: 7;
}
/* Ambient light from city */
.ambient-light {
position: absolute;
bottom: -50px;
left: 50%;
transform: translateX(-50%);
width: 200%;
height: 200px;
background: radial-gradient(
ellipse at center,
rgba(255, 200, 100, 0.2) 0%,
transparent 70%
);
filter: blur(40px);
animation: ambientPulse 3s ease-in-out infinite;
}
@keyframes ambientPulse {
0%,
100% {
opacity: 0.5;
}
50% {
opacity: 0.8;
}
} }
</style> </style>
</head> </head>
<body> <body>
<div class="basement-wall"> <div class="basement-wall">Coming soon...</div>
<div class="window-frame">
<!-- Cityscape -->
<div class="cityscape">
<div class="sky"></div>
<div class="buildings">
<div class="building">
<div class="building-windows">
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
</div>
</div>
<div class="building">
<div class="building-windows">
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
</div>
</div>
<div class="building">
<div class="building-windows">
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
</div>
</div>
<div class="building">
<div class="building-windows">
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
</div>
</div>
<div class="building">
<div class="building-windows">
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
<div class="window-light"></div>
</div>
</div>
</div>
<div class="ambient-light"></div>
</div>
<!-- Window effects -->
<div class="window-grime"></div>
<div class="glass-reflection"></div>
</div>
</div>
</body> </body>
</html> </html>

View file

@ -2,7 +2,7 @@
<svg style="position: absolute; width: 0; height: 0"> <svg style="position: absolute; width: 0; height: 0">
<defs> <defs>
<filter id="goo"> <filter id="goo">
<feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur" /> <feGaussianBlur in="SourceGraphic" stdDeviation="7" result="blur" />
<feColorMatrix <feColorMatrix
in="blur" in="blur"
mode="matrix" mode="matrix"

View file

@ -7,10 +7,6 @@
<a href="https://neocities.org/site/ritualsh" target="_blank" <a href="https://neocities.org/site/ritualsh" target="_blank"
>Follow on Neocities</a >Follow on Neocities</a
> >
&nbsp;&bull;&nbsp;
<a href="{{ .Site.BaseURL }}">
&copy; {{ now.Format "2006" }} {{ .Site.Title }}
</a>
<div>{{ partial "social-follow.html" . }}</div> <div>{{ partial "social-follow.html" . }}</div>
</div> </div>
</footer> </footer>

63
new.sh
View file

@ -1,15 +1,40 @@
#!/bin/bash #!/bin/bash
# Script to create new Hugo content w/ filename sanitization # Script to create new Hugo content w/ filename sanitization
# Usage: ./new.sh <type> <title> # Usage: ./new.sh [-d] [-s] <type> <title>
# -d: Add date prefix (YYYY-MM-DD)
# -s: Single page format (.md instead of /)
set -e set -e
# Initialize flags
ADD_DATE=false
SINGLE_PAGE=false
# Parse flags
while getopts "ds" opt; do
case $opt in
d)
ADD_DATE=true
;;
s)
SINGLE_PAGE=true
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
# Shift past the options
shift $((OPTIND-1))
# Check if required arguments are provided # Check if required arguments are provided
if [ $# -lt 2 ]; then if [ $# -lt 2 ]; then
echo "Usage: $0 <type> <title>" echo "Usage: $0 [-d] [-s] <type> <title>"
echo "Example: $0 blog 'My Awesome Post'" echo " -d: Add date prefix (YYYY-MM-DD)"
exit 1 echo " -s: Single page format (.md instead of /)"
echo "Example: $0 -d -s blog 'My Awesome Post'"
exit 1
fi fi
TYPE="$1" TYPE="$1"
@ -17,15 +42,25 @@ shift
TITLE="$*" TITLE="$*"
SAFE_TITLE=$(echo "$TITLE" | \ SAFE_TITLE=$(echo "$TITLE" | \
tr '[:upper:]' '[:lower:]' | \ tr '[:upper:]' '[:lower:]' | \
sed 's/ /-/g' | \ sed 's/ /-/g' | \
sed 's/\//-/g' | \ sed 's/\//-/g' | \
sed 's/[^a-z0-9_-]//g' | \ sed 's/[^a-z0-9_-]//g' | \
sed 's/-\+/-/g' | \ sed 's/-\+/-/g' | \
sed 's/^-//;s/-$//') sed 's/^-//;s/-$//')
# Construct the filename with date # Add date prefix if flag is set
FILENAME="${SAFE_TITLE}/" if [ "$ADD_DATE" = true ]; then
DATE_PREFIX=$(date +%Y-%m-%d)
SAFE_TITLE="${DATE_PREFIX}-${SAFE_TITLE}"
fi
# Construct the filename based on format
if [ "$SINGLE_PAGE" = true ]; then
FILENAME="${SAFE_TITLE}.md"
else
FILENAME="${SAFE_TITLE}/"
fi
# Construct the full path # Construct the full path
CONTENT_PATH="${TYPE}/${FILENAME}" CONTENT_PATH="${TYPE}/${FILENAME}"