Skip to content

Commit c5eecfb

Browse files
authored
Merge pull request #5 from brylie/blog-improvements
Update blog post metadata and restore navigation links
2 parents 4142fff + 1ccfc12 commit c5eecfb

File tree

8 files changed

+230
-41
lines changed

8 files changed

+230
-41
lines changed

src/components/BaseHead.astro

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ interface Props {
1515
canonicalURL?: string; // Custom canonical URL
1616
robots?: string; // Custom robots directive
1717
author?: string; // Article author
18-
pubDate?: Date; // Publication date for articles
19-
updatedDate?: Date; // Last updated date for articles
18+
datePublished?: Date; // Publication date for articles (schema.org)
19+
dateModified?: Date; // Last updated date for articles (schema.org)
2020
}
2121
2222
const canonicalURL = new URL(Astro.url.pathname, Astro.site);
@@ -32,8 +32,8 @@ const {
3232
keywords,
3333
robots,
3434
author,
35-
pubDate,
36-
updatedDate,
35+
datePublished,
36+
dateModified,
3737
} = Astro.props;
3838
3939
// Use ogImage if provided, otherwise fall back to image
@@ -67,33 +67,33 @@ const socialImage = ogImage || image;
6767
{robots && <meta name="robots" content={robots} />}
6868
{author && <meta name="author" content={author} />}
6969
{
70-
pubDate && (
71-
<meta name="article:published_time" content={pubDate.toISOString()} />
70+
datePublished && (
71+
<meta name="article:published_time" content={datePublished.toISOString()} />
7272
)
7373
}
7474
{
75-
updatedDate && (
76-
<meta name="article:modified_time" content={updatedDate.toISOString()} />
75+
dateModified && (
76+
<meta name="article:modified_time" content={dateModified.toISOString()} />
7777
)
7878
}
7979

8080
<!-- Open Graph / Facebook -->
81-
<meta property="og:type" content={pubDate ? "article" : "website"} />
81+
<meta property="og:type" content={datePublished ? "article" : "website"} />
8282
<meta property="og:url" content={Astro.url} />
8383
<meta property="og:title" content={title} />
8484
<meta property="og:description" content={description} />
8585
{socialImage && <meta property="og:image" content={new URL(socialImage.src, Astro.url)} />}
8686
{author && <meta property="article:author" content={author} />}
8787
{
88-
pubDate && (
89-
<meta property="article:published_time" content={pubDate.toISOString()} />
88+
datePublished && (
89+
<meta property="article:published_time" content={datePublished.toISOString()} />
9090
)
9191
}
9292
{
93-
updatedDate && (
93+
dateModified && (
9494
<meta
9595
property="article:modified_time"
96-
content={updatedDate.toISOString()}
96+
content={dateModified.toISOString()}
9797
/>
9898
)
9999
}

src/components/NavigationMenu.astro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { Icon } from "astro-icon/components";
1818
<div class="hidden md:flex items-center space-x-6">
1919
<HeaderLink href="/">Home</HeaderLink>
2020
<HeaderLink href="/releases">Releases</HeaderLink>
21-
<!-- <HeaderLink href="/blog">Blog</HeaderLink> -->
21+
<HeaderLink href="/blog">Blog</HeaderLink>
2222
<HeaderLink href="/about">About</HeaderLink>
2323
<HeaderLink href="/performances">Performances</HeaderLink>
2424
<HeaderLink href="/licensing">Licensing</HeaderLink>
@@ -117,7 +117,7 @@ import { Icon } from "astro-icon/components";
117117
<div class="px-4 py-3 space-y-3">
118118
<HeaderLink href="/" class="block w-full">Home</HeaderLink>
119119
<HeaderLink href="/releases" class="block w-full">Releases</HeaderLink>
120-
<!-- <HeaderLink href="/blog" class="block w-full">Blog</HeaderLink> -->
120+
<HeaderLink href="/blog" class="block w-full">Blog</HeaderLink>
121121
<HeaderLink href="/about" class="block w-full">About</HeaderLink>
122122
<HeaderLink href="/performances" class="block w-full"
123123
>Performances</HeaderLink

src/content.config.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,24 @@ import { rssSchema } from '@astrojs/rss';
55
const blog = defineCollection({
66
// Load Markdown and MDX files in the `src/content/blog/` directory.
77
loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
8-
// Type-check frontmatter using RSS schema with additional fields
8+
// Type-check frontmatter using schema.org BlogPosting field names
99
schema: ({ image }) =>
10-
rssSchema.extend({
11-
// Add custom fields beyond the RSS schema
12-
updatedDate: z.coerce.date().optional(),
10+
z.object({
11+
// Core BlogPosting fields (schema.org names)
12+
title: z.string(),
13+
description: z.string(),
14+
datePublished: z.coerce.date(),
15+
dateModified: z.coerce.date().optional(),
16+
author: z.string().optional(),
17+
18+
// Visual assets
1319
heroImage: image().optional(),
14-
// SEO-specific fields
1520
ogImage: image().optional(), // Custom Open Graph image
21+
22+
// SEO-specific fields
1623
keywords: z.array(z.string()).optional(), // SEO keywords
1724
canonicalURL: z.string().url().optional(), // Custom canonical URL
1825
robots: z.string().optional(), // Custom robots meta tag value
19-
author: z.string().optional(), // Article author
2026
}),
2127
});
2228

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
---
2+
title: "Parallel Major Chords: A powerful technique for composing rich, emotional music"
3+
description: "Explore how parallel majors can add emotional depth to your music."
4+
datePublished: 2025-03-04
5+
dateModified: 2026-01-21
6+
author: "Brylie Christopher Oxley"
7+
keywords: ["music theory", "chords", "composition", "harmony", "parallel majors", "modal interchange"]
8+
---
9+
10+
Have you ever wondered how some of your favorite songs create such emotionally rich and unexpected chord progressions? Many composers and songwriters use a powerful technique that involves borrowing chords from different scales or modes. Today, we'll explore a specific approach called "parallel majors" that can immediately add new colors to your compositions.
11+
12+
## What Are Parallel Majors?
13+
14+
Before diving into parallel majors, let's establish some foundational concepts.
15+
16+
### Understanding Modes
17+
18+
A mode is essentially a scale that starts on a different note of a parent major scale. For example, if we take the C major scale (C, D, E, F, G, A, B) but start on D instead, we get D Dorian mode (D, E, F, G, A, B, C).
19+
20+
The seven modes of the major scale are:
21+
22+
1. Ionian (major)
23+
2. Dorian
24+
3. Phrygian
25+
4. Lydian
26+
5. Mixolydian
27+
6. Aeolian (natural minor)
28+
7. Locrian
29+
30+
When all these modes share the same starting note or tonic (like C Ionian, C Dorian, C Phrygian, etc.), we call them "parallel modes."
31+
32+
### The Concept of Parallel Majors
33+
34+
The "parallel majors" concept takes each of these modes and identifies its parent major scale. For example:
35+
36+
- C Ionian is simply the C major scale
37+
- C Dorian contains the same notes as B♭ major, but starting on C
38+
- C Aeolian (C minor) contains the same notes as E♭ major, but starting on C
39+
40+
This gives us access to a whole new palette of chords to work with in our compositions, while still maintaining C as our tonal center.
41+
42+
## The Parallel Majors Chart
43+
44+
Here's a chart showing each C mode, its parallel major scale, and the chords that appear in those parallel major keys:
45+
46+
| C Mode | Parallel Major | I | II | III | IV | V | VI | VII |
47+
| ---------------- | -------------- | --- | --- | --- | --- | --- | --- | ----- |
48+
| **C Ionian** | C Major | C | Dm | Em | F | G | Am | Bdim |
49+
| **C Dorian** | B♭ Major | B♭ | Cm | Dm | E♭ | F | Gm | Adim |
50+
| **C Phrygian** | A♭ Major | A♭ | B♭m | Cm | D♭ | E♭ | Fm | Gdim |
51+
| **C Lydian** | G Major | G | Am | Bm | C | D | Em | F♯dim |
52+
| **C Mixolydian** | F Major | F | Gm | Am | B♭ | C | Dm | Edim |
53+
| **C Aeolian** | E♭ Major | E♭ | Fm | Gm | A♭ | B♭ | Cm | Ddim |
54+
| **C Locrian** | D♭ Major | D♭ | E♭m | Fm | G♭ | A♭ | B♭m | Cdim |
55+
56+
## How to Use Parallel Majors in Your Compositions
57+
58+
Now for the fun part—putting this knowledge to practical use! Here's a step-by-step approach:
59+
60+
### 1. Start with a Simple Progression in a Major Key
61+
62+
Let's begin with a common chord progression in C major:
63+
64+
```text
65+
C - Am - F - G
66+
```
67+
68+
This is a I - vi - IV - V progression, one of the most used progressions in pop music.
69+
70+
### 2. Identify Opportunities for Chord Borrowing
71+
72+
Each chord in your progression is a potential candidate for "borrowing" from a parallel major. Look for places where an emotional shift would enhance your music.
73+
74+
### 3. Select Alternative Chords from Parallel Majors
75+
76+
Let's try replacing some chords in our progression by borrowing from parallel majors:
77+
78+
**Example 1:** Replace the vi chord (Am) with the parallel major version from C Aeolian
79+
80+
- Original: C - Am - F - G
81+
- Parallel major of C Aeolian is E♭ major
82+
- The vi chord in E♭ major is Cm
83+
- New progression: C - Cm - F - G
84+
85+
This small change adds a beautiful, melancholic twist to an otherwise standard progression.
86+
87+
**Example 2:** Replace the IV chord (F) with the parallel major version from C Phrygian
88+
89+
- Original: C - Am - F - G
90+
- Parallel major of C Phrygian is A♭ major
91+
- The IV chord in A♭ major is D♭
92+
- New progression: C - Am - D♭ - G
93+
94+
This creates a more dramatic, unexpected shift that can work wonderfully for song bridges or pre-choruses.
95+
96+
### 4. Experiment with Different Combinations
97+
98+
Don't stop at just one borrowed chord! Try various combinations:
99+
100+
**Example 3:** Borrow multiple chords
101+
102+
- Original: C - Am - F - G
103+
- Replace Am with Cm (from C Aeolian's parallel major)
104+
- Replace G with C (from C Mixolydian's parallel major)
105+
- New progression: C - Cm - F - C
106+
107+
## Practical Applications
108+
109+
### In Popular Music
110+
111+
This technique of borrowing from parallel majors (often called "modal interchange" or "modal mixture") is used extensively in popular music:
112+
113+
- The Beatles used this technique in songs like "Penny Lane" and "In My Life"
114+
- Radiohead's complex harmonies often involve modal interchange
115+
- Jazz standards frequently borrow chords from parallel modes
116+
117+
### Tips for Songwriters
118+
119+
1. **Start simple:** Begin by borrowing just one chord in your progression
120+
2. **Trust your ears:** If it sounds good, it is good
121+
3. **Create contrast:** Borrowed chords work best when they create emotional contrast with surrounding chords
122+
4. **Consider melody:** Make sure your melody notes work with your borrowed chords
123+
5. **Think functionally:** Borrowed chords can serve similar harmonic functions to the chords they replace
124+
125+
## Common Borrowed Chord Combinations
126+
127+
Some borrowed chord combinations work particularly well:
128+
129+
- **The Minor IV:** Borrowing the iv chord from the parallel minor (using Fm in a C major progression)
130+
- **The Flat VII:** Using the ♭VII chord from Mixolydian (B♭ in the key of C)
131+
- **The Flat VI:** Using the ♭VI chord from Aeolian (A♭ in the key of C)
132+
133+
## Conclusion
134+
135+
Understanding and using parallel majors doesn't require advanced music theory knowledge—just a willingness to experiment. By borrowing chords from these parallel major scales, you can add emotional depth and harmonic interest to even the simplest progressions.
136+
137+
Next time you're writing a song and feel like a chord progression needs something special, try borrowing a chord from one of these parallel major scales. Your ears (and your listeners) will thank you!
138+
139+
## Practice Exercise
140+
141+
Take a simple chord progression in a key you're comfortable with and try replacing one chord with a borrowed chord from a parallel major. Notice how it changes the emotional quality of your progression. There's no wrong answer here—if it sounds good to you, you're doing it right!
142+
143+
---
144+
145+
_Want to learn more about music theory concepts that can enhance your compositions? Check out our other articles on [brylie.music](https://brylie.music)._

src/layouts/BlogPost.astro

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,28 @@ import type { CollectionEntry } from "astro:content";
44
import Layout from "./Layout.astro";
55
import FormattedDate from "../components/FormattedDate.astro";
66
7-
type Props = CollectionEntry<"blog">["data"];
7+
type Props = CollectionEntry<"blog">["data"] & {
8+
structuredData?: object;
9+
};
810
911
const {
1012
title,
1113
description,
12-
pubDate,
13-
updatedDate,
14+
datePublished,
15+
dateModified,
1416
heroImage,
1517
ogImage,
1618
keywords,
1719
canonicalURL,
1820
robots,
1921
author,
22+
structuredData,
2023
} = Astro.props;
2124
22-
// Ensure required fields have values (they should based on the RSS schema)
23-
if (!title || !description || !pubDate) {
25+
// Ensure required fields have values (they should based on the schema)
26+
if (!title || !description || !datePublished) {
2427
throw new Error(
25-
`BlogPost is missing required fields: title=${title}, description=${description}, pubDate=${pubDate}`
28+
`BlogPost is missing required fields: title=${title}, description=${description}, datePublished=${datePublished}`
2629
);
2730
}
2831
---
@@ -36,8 +39,9 @@ if (!title || !description || !pubDate) {
3639
canonicalURL={canonicalURL}
3740
robots={robots}
3841
author={author}
39-
pubDate={pubDate}
40-
updatedDate={updatedDate}
42+
datePublished={datePublished}
43+
dateModified={dateModified}
44+
structuredData={structuredData}
4145
>
4246
<div class="max-w-4xl mx-auto px-4 py-8">
4347
<article class="bg-gray-900 rounded-lg shadow-xl overflow-hidden">
@@ -56,10 +60,10 @@ if (!title || !description || !pubDate) {
5660
<div class="p-6 sm:p-8 lg:p-12">
5761
<header class="text-center mb-8 pb-6 border-b border-gray-700">
5862
<div class="mb-4 text-sm text-gray-400">
59-
<FormattedDate date={pubDate} />
60-
{updatedDate && (
63+
<FormattedDate date={datePublished} />
64+
{dateModified && (
6165
<div class="mt-1 italic text-gray-500">
62-
Last updated on <FormattedDate date={updatedDate} />
66+
Last updated on <FormattedDate date={dateModified} />
6367
</div>
6468
)}
6569
</div>

src/layouts/Layout.astro

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ export interface Props {
1313
canonicalURL?: string;
1414
robots?: string;
1515
author?: string;
16-
pubDate?: Date;
17-
updatedDate?: Date;
16+
datePublished?: Date;
17+
dateModified?: Date;
18+
structuredData?: object;
1819
}
1920
2021
const {
@@ -26,8 +27,9 @@ const {
2627
canonicalURL,
2728
robots,
2829
author,
29-
pubDate,
30-
updatedDate,
30+
datePublished,
31+
dateModified,
32+
structuredData,
3133
} = Astro.props;
3234
---
3335

@@ -43,9 +45,12 @@ const {
4345
canonicalURL={canonicalURL}
4446
robots={robots}
4547
author={author}
46-
pubDate={pubDate}
47-
updatedDate={updatedDate}
48+
datePublished={datePublished}
49+
dateModified={dateModified}
4850
/>
51+
{structuredData && (
52+
<script type="application/ld+json" set:html={JSON.stringify(structuredData)} />
53+
)}
4954
</head>
5055
<body class="bg-gray-950 text-gray-100 min-h-screen flex flex-col">
5156
<header class="bg-gray-900 border-b border-gray-800 shadow-lg">

0 commit comments

Comments
 (0)