Compare commits

..

25 Commits

Author SHA1 Message Date
fa518379d1 Remove paragraph after orchestra
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 3m39s
2026-01-22 11:04:48 +10:30
d0cf6187c0 Remove top margin
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 3m13s
2026-01-22 10:49:33 +10:30
6132ebae45 Add sheet music page, some slight changes
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 20m17s
2026-01-22 10:36:19 +10:30
9335d19031 Make background colour consistent when page doesn't fully cover screen 2026-01-22 10:31:52 +10:30
ca6f0de553 Remove recognition page, adjust section on index
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 3m2s
2025-12-17 09:17:36 +10:30
b8b4ddd059 Animate player image
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 2m33s
2025-12-11 15:24:55 +10:30
4acbf3ef8a Add hover zoom to images in projects/MDX
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 2m45s
2025-12-11 11:11:38 +10:30
5a83282da4 Add blurred artwork to player if available
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 2m49s
2025-12-11 09:29:11 +10:30
7e887f8bb1 Update README.md to include note about CI/CD
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 12m12s
2025-12-10 09:05:33 +10:30
2666a680ab Wind orchestra, not just orchestra, is clearer
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 4m7s
2025-11-27 09:50:54 +10:30
16d14adb32 and
Some checks failed
Build and Deploy to Web Server / deploy (push) Has been cancelled
2025-11-27 09:49:01 +10:30
d714ed3e3b Minor fixes to about page
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 4m31s
2025-11-27 09:42:22 +10:30
4caf5665be A tag on new line caused additional space
Some checks failed
Build and Deploy to Web Server / deploy (push) Has been cancelled
2025-11-27 09:39:48 +10:30
4fe49e3bea Clarify some of MWM:DU and add links
Some checks failed
Build and Deploy to Web Server / deploy (push) Has been cancelled
2025-11-27 09:37:24 +10:30
06cb8f28db Inline not inline block for links 2025-11-27 09:36:37 +10:30
27c2342bf4 Credit Tommy Woods Photography
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 4m28s
2025-11-26 18:18:49 +10:30
978ff3e0c6 Specify width for IMG component as equal to page project page width
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 4m29s
2025-11-26 18:04:31 +10:30
3f2e1fa340 Post about MWM:DU, LI component
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 5m1s
2025-11-26 17:48:11 +10:30
01153e087a Don't round corners of player on small screens 2025-11-26 17:17:06 +10:30
f0b80c6e0d Add photos for MWM:DU, add some recent concerts
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 18m50s
2025-11-26 08:26:56 +10:30
07fcb0ff75 Reduce top margin on player text
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 9m0s
2025-09-28 14:13:31 +09:30
d2b668ba12 Inset player on large screens 2025-09-28 14:11:22 +09:30
01a39c10cb Astro is wrong, should have public
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 8m31s
2025-09-22 11:26:57 +09:30
c577838aaf Add theme colour, Inter font import fix
Some checks failed
Build and Deploy to Web Server / deploy (push) Failing after 2m48s
2025-09-22 11:22:51 +09:30
5312e8648b Change player seek bar to pointer on hover
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 4m23s
2025-09-11 16:54:44 +09:30
81 changed files with 598 additions and 83 deletions

View File

@@ -42,14 +42,14 @@ This website was built primarily with the following technologies:
1. Install prerequisites (Node.js) 1. Install prerequisites (Node.js)
2. Run `npm install` 2. Run `npm install`
3. From the root of the project directory, run `npm run dev` to start the development server which automatically refreshes on content changes 3. From the root of the project directory, run `npm run dev` to start the development server which automatically refreshes on content changes. Visual Studio Code will automatically deploy the development server when it opens.
## Building and Deploying ## Building and Deploying
To build, as with most Astro projects, simply run `npm run build`, which currently outputs the built website to the `dist` folder. To build, as with most Astro projects, simply run `npm run build`, which currently outputs the built website to the `dist` folder.
Eventually, this website will automatically deploy via my custom-built deployment system and self-hosted server environment (todo!). Changes made to this repository are automatically deployed via my custom-built CI/CD and self-hosted server environment.
## Show your support ## Show your support
You sharing my website is all the support I need. You sharing my website is all the support I need.
However, if you'd like to support me in any other way, please feel free to get in touch! However, if you'd like to support me in any other way or would like to work with me on a project, please feel free to get in touch!

View File

@@ -8,14 +8,14 @@ keyFigure:
- title: Performed by - title: Performed by
name: Woodville Concert Band name: Woodville Concert Band
href: https://www.woodvillecb.com.au/2025/music-with-motion-down-under/ href: https://www.woodvillecb.com.au/2025/music-with-motion-down-under/
description: "Music With Motion: Down Under is a dynamic celebration of Australia's video game soundtracksperformed live by a full wind orchestra and synchronised in real time with stunning visuals on the big screen. Premiering all-new orchestrations created especially for this event by award-winning Artistic Director Dr Nathan Cummins, the performance showcases music from games developed across the country, including several from right here in South Australia. Many of these games have never had their music performed live, and you'll be among the very first to hear it." description: "Music With Motion: Down Under is the largest ever celebration of Australia's video game soundtracks, performed live by a full wind orchestra and synchronised in real time with stunning visuals on the big screen. Premiering all-new orchestrations created especially for this event by award-winning Artistic Director Dr Nathan Cummins, the performance showcases music from games developed across the country, including several from right here in South Australia. Many of these games have never had their music performed live, and you'll be among the very first to hear it."
frontPage: { "order": 3 } frontPage: { "order": 3 }
images: images:
{ {
"hero": "hero":
{ {
"src": "nathan-cummins-music-with-motion-down-under-1.png", "src": "nathan-cummins-music-with-motion-down-under-1.jpg",
"alt": "The key poster and artwork for the concert Music With Motion: Down Under." "alt": "Nathan on the conductor's podium acknowledging a guest soloist with applause."
}, },
"other": "music-with-motion-down-under" "other": "music-with-motion-down-under"
} }
@@ -28,3 +28,124 @@ externalLinks:
} }
] ]
--- ---
_Music With Motion_ and the [Woodville Concert Band](https://www.woodvillecb.com.au) have been part of my life for so long now that trying to sum up what the eighth iteration of the concert meant to me feels almost impossible.
Each year the concert grows and changes, but at its core it still has the same mission: to celebrate video games and their music, and to bring both art forms to audiences who might not yet realise how imaginative, bold, and moving they can be.
With _Music With Motion: Down Under_, that mission felt especially personal.
This year I wanted to shine a light on the remarkable talent in Australia's development community, particularly here in South Australia.
Our local scene is full of people and studios creating fun and ambitious projects, often with tiny teams but always with limitless creativity.
My hope was that this concert would help give these composers and these studios the attention they deserve.
Inevitably because of this vision, this year's concert again grew in scale and ambition, becoming the largest _Music With Motion_ event yet.
It was, to my knowledge, the largest live video game music concert ever held in Australia that focused exclusively on Australian games.
The concert showcased a talented ensemble that grew to 54 musicians and also featured live choir and guest soloists, all with real-time audio-visual synchronisation created just for this event (special thanks to Daytime Devs for the opening sequence!).
![Some of the Woodville Concert Band and Woodville High School Senior Choir on stage](/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-down-under-4.jpg)
Across 12 projects from 11 studios, we presented 19 pieces, 17 of them world premieres.
All projects featured were developed right here in Australia, with 8 of them being from South Australia.
With the exception of _Goldstained_ by Tommy Raets, who arranged his own work, I worked closely with the composers and developers to ensure that my orchestrations translated their visions truthfully to wind orchestra.
Many of these composers had never heard their work performed by a large ensemble before, which made the process even more meaningful.
The programme included:
- _**Main Title / Haunting Horrors**_ from _Super BAWK BAWK Chicken_ by Daytime Devs - [Chris Norton](https://www.therealchrisnorton.com/) (SA)
- _**The Sacred Acorn**_ from _The Sacred Acorn_ by A Few Dragons - William D H Parry (SA)
- _**Main Theme**_ from _Demonlore_ by Barrel Smash Studios - [Hew Wagner](https://www.hewwagner.com/) (VIC)
- _**Seeds of the Future**_ from _Project Regolith_ by Regolith Interactive - [Simon Stemberger](https://www.stembergercompositions.com/) (VIC)
- _**White Palace**_ from _Hollow Knight_ by Team Cherry - [Christopher Larkin](https://composerlarkin.com/) (SA)
- _**Hydra**_ from _Roc's Odyssey_ by Sunshine Festival Studios - my own score (SA)
- _**Main Theme**_ from _TOYA_ by The RnD Department - [Chris Norton](https://www.therealchrisnorton.com/) (SA)
- _**Threads of a Dream**_ demonstrating FMOD by Firelight Technologies - [Aaron C. Edwards](https://aaroncedwards.audio/) (VIC)
- _**Alluvion**_ from _Submerged: Hidden Depths_ by Uppercut Games - [Jeff van Dyck](https://jeffvandyck.com/) (QLD)
- _**Goldstained**_ from _Goldstained_ by Lantern Jump - Tommy Raets (SA)
- _**Enter Pharloom / Trobbio Medley**_ from _Hollow Knight: Silksong_ by Team Cherry - [Christopher Larkin](https://composerlarkin.com/) (SA)
- _**Dungeons and Dining Tables Medley**_ from _Dungeons and Dining Tables_ by Catalyst Games - my own score (SA)
The night also featured brilliant guest performers.
Joshua Julian and Maverick Pov of [Akira Slide](https://linktr.ee/akiraslide) joined us on electric guitar for my piece _Hydra_ from _Roc's Odyssey_.
Ed Kriek graciously agreed to perform _Trobbio_ from _Hollow Knight: Silksong_.
Their musicianship elevated the night in ways I'm incredibly grateful for.
It was also a pleasure to collaborate with the Woodville High School Senior Choir, who joined us for a few pieces and added a depth to the sound world of the night that we'd never had before.
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
<div>
![Guest electric guitarist Joshua Julian performing "Hydra" from "Roc's
Odyssey"](/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-down-under-10.jpg)
</div>
<div>
![Guest electric guitarist Maverick Pov performing "Hydra" from "Roc's
Odyssey"](/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-down-under-8.jpg)
</div>
</div>
Beyond the music on stage, it was important to me that the wider community was part of the celebration and that other local developers, not just those featured in the concert, had a chance to showcase their work.
During the hour before the concert and throughout the interval, we ran a small convention-style showcase featuring:
- Catalyst Games
- South Australian Games Association (SAGA)
- Paper Cactus Games
- Royal Reign Studios
- The RnD Department
- StarSword Games
- Wayward Skies Studio
- Bad Plan Studios
- Academy of Interactive Entertainment (AIE)
- Avery Andruwskiewicz (artist)
Most of these teams are up-and-coming developers, many of them young, and it was wonderful seeing audiences play their games, chat with them, and discover what's happening right here in Adelaide.
<div class="grid grid-cols-1 gap-4 md:grid-cols-3">
<div>
![Attendees playing games at the showcase prior to the
concert](/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-down-under-13.jpg)
</div>
<div>
![A child playing "End of Ember" by Bad Plan
Studios](/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-down-under-12.jpg)
</div>
<div>
![Haydn Richards-Pudney managing our merch
stand](/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-down-under-14.jpg)
</div>
</div>
The concert sold out.
Over 600 people filled the Woodville Town Hall.
Seeing that many people choose to spend their evening celebrating local games and music was incredibly heartwarming.
More than the numbers, it felt like a community gathering to support the creators behind these works as well and the vision that the Woodville Concert Band and I have been developing for so long.
I'm enormously proud of the Woodville Concert Band.
Performing a full programme of premieres—much of it intricate and stylistically diverse—was a monumental task that took many months of intense preparation and rehearsal.
It has been incredible to observe their growth over the year and the community that has been fostered there.
Their committee and volunteers worked tirelessly behind the scenes to ensure everything ran smoothly, from managing the doors, to managing publicity, the transportation of equipment, the setup and control of the audiovisual equipment, and keeping me sane, fed, and watered on the day.
![Me applauding special guest pianist Ed Kriek, who premiered "Trobbio" from "Hollow Knight: Silksong" composed by Christopher Larkin](/src/assets/img/project-heros/nathan-cummins-music-with-motion-down-under-1.jpg)
There is a long list of people I want to thank, too many to list here, from our own volunteers, those close to us, and our supporters and sponsors.
My gratitude to both Chris Norton and Christopher Larkin, who both individually stepped in to provide invaluable support via other preparations such as the inclusion of additional sounds, instruments, and last minute audio recording, is immeasurable.
Thank you to [Tommy Woods Photography](https://www.tommywoodsphotography.com/) for the fantastic photos from the night, some of which you can see here.
A special thank you goes to Catalyst Games for sponsoring the event via the creation and printing of Hannah Ewart's brilliantly hand-drawn key art, featured prominently in the poster and other marketing materials, and her design of the stunning event programme.
[Gelista Gelati](https://www.gelista.com.au/) generously donated free ice-cream for the entire audience and helped make the evening feel truly festive.
It was also a pleasure to work with and have the support of the [South Australian Games Association (SAGA)](https://sagames.org/) as well as our other sponsors.
While not a sponsor, the West Torrens Library Service also deserves special mention for their support in promoting the event, helping connect us with the local community, and for their work supporting the local industry.
Most importantly I'd like to thank my partner Camille, whose unwavering support and patience kept me going through the long months of preparation, and whose contributions to the event logistics were invaluable.
<div class="m-auto max-w-xl">
![The poster by Hannah Ewart featuring characters from various South
Australian video games including "Hollow Knight", "Hollow Knight: Silksong",
"Dungeons and Dining Tables", and "Super BAWK BAWK
Chicken"](/src/assets/img/other/nathan-cummins-music-with-motion-down-under-poster-1.png)
</div>
On a personal note, it took hundreds of hours to bring _Music With Motion: Down Under_ to life.
This concert was my way of supporting, uplifting, and giving back to the community that has shaped so much of my own creative path.
Seeing these works come alive with wind orchestra, and seeing the pride and joy on the faces of the composers, developers, the performers, and even the audience, made every moment worth it.
Thank you to everyone who attended, performed, collaborated, showcased, or was otherwise involved in some way.
I'm deeply grateful.
![Most of the full ensemble including special guests accepting the final applause](/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-down-under-23.jpg)
![A view from behind the stage of the full venue](/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-down-under-17.jpg)
![An audience member dressed as Hornet from "Hollow Knight: Silksong"](/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-down-under-19.jpg)

View File

@@ -0,0 +1,29 @@
---
title: "Music With Motion: Level Up"
role: Conductor / Artistic Director
type: Concert
date: 2023-06-02
slug: music-with-motion-level-up
keyFigure:
- title: Performed by
name: Woodville Concert Band
href: https://www.woodvillecb.com.au/2023/music-with-motion-level-up/
description: "Experience a brand new Music With Motion, featuring all new original arrangements and all new visuals from your favourite video games like youve never seen before! Level Up takes video game music to a whole other level! It's bigger, it's better, and it's for one night only! You won't hear this anywhere else, so you do not want to miss this."
images:
{
"hero":
{
"src": "nathan-cummins-music-with-motion-level-up-1.jpg",
"alt": 'Nathan standing on the conductor''s podium with the words "Level Up" on the screen behind him.'
},
"other": "music-with-motion-level-up"
}
externalLinks:
[
{
"name": "Website",
"href": "https://www.woodvillecb.com.au/2023/music-with-motion-level-up/",
"icon": "mdi:web"
}
]
---

View File

@@ -0,0 +1,29 @@
---
title: "Music With Motion: Next Gen"
role: Conductor / Artistic Director
type: Concert
date: 2024-05-03
slug: music-with-motion-next-gen
keyFigure:
- title: Performed by
name: Woodville Concert Band
href: https://www.woodvillecb.com.au/2024/music-with-motion-next-gen/
description: "Featuring new original arrangements, plus returning fan favourites, Next Gen is the newest evolution for the 40+ members of the Woodville Concert Band. It's bigger, it's better, and it's for one night only!"
images:
{
"hero":
{
"src": "nathan-cummins-music-with-motion-next-gen-1.jpg",
"alt": 'Nathan standing in front of the Woodville Concert Band, who are all standing for applause. The words "Music With Motion: Next Gen" are displayed on the screen behind them.'
},
"other": "music-with-motion-next-gen"
}
externalLinks:
[
{
"name": "Website",
"href": "https://www.woodvillecb.com.au/2024/music-with-motion-next-gen/",
"icon": "mdi:web"
}
]
---

View File

@@ -16,6 +16,7 @@ images:
{ {
"src": "nathan-cummins-pixelated-symphonies-1.jpg", "src": "nathan-cummins-pixelated-symphonies-1.jpg",
"alt": "The key artwork for the concert Pixelated Symphonies." "alt": "The key artwork for the concert Pixelated Symphonies."
} },
"other": "pixelated-symphonies"
} }
--- ---

View File

@@ -0,0 +1,29 @@
---
title: "Water Stories"
role: Conductor / Artistic Director
type: Concert
date: 2025-05-16
slug: wcb-water-stories
keyFigure:
- title: Performed by
name: Woodville Concert Band
href: https://www.woodvillecb.com.au/2025/water-stories/
description: "Immerse yourself in an evening of flowing melodies and shimmering reflections with the Woodville Concert Band on Friday 16 May, as they present Water Stories. This captivating wind orchestra concert journeys through the deep connection between water, nature, and society, featuring an eclectic blend of classical, contemporary, and traditional pieces that celebrate water's power and beauty."
images:
{
"hero":
{
"src": "nathan-cummins-wcb-water-stories-1.png",
"alt": "Nathan asking the combined ensemble of Woodville Concert Band and Woodville High School Wind Ensemble to stand for applause."
},
"other": "wcb-water-stories"
}
externalLinks:
[
{
"name": "Website",
"href": "https://www.woodvillecb.com.au/2025/water-stories/",
"icon": "mdi:web"
}
]
---

View File

@@ -7,7 +7,7 @@ const links: Link[] = [
{ href: "/", label: "Home" }, { href: "/", label: "Home" },
{ href: "/about/", label: "About" }, { href: "/about/", label: "About" },
{ href: "/projects/", label: "Projects" }, { href: "/projects/", label: "Projects" },
{ href: "/recognition/", label: "Recognition" }, { href: "/sheet-music/", label: "Sheet Music" },
{ href: "/contact/", label: "Contact" } { href: "/contact/", label: "Contact" }
]; ];

View File

@@ -13,7 +13,6 @@ const { award } = Astro.props as Props;
const { Content } = await render(award); const { Content } = await render(award);
--- ---
<div class="col-span-1">
<div class="bg-primary rounded text-white shadow"> <div class="bg-primary rounded text-white shadow">
<div class="p-2"> <div class="p-2">
<div class="text-l font-bold">{award.data.title}</div> <div class="text-l font-bold">{award.data.title}</div>
@@ -27,4 +26,3 @@ const { Content } = await render(award);
</div> </div>
</div> </div>
</div> </div>
</div>

View File

@@ -1 +1,5 @@
<h1 class="font-header text-3xl"><slot /></h1> ---
const { class: className, ...attrs } = Astro.props;
---
<h1 class:list={["font-header text-3xl", className]} {...attrs}><slot /></h1>

View File

@@ -1 +1,5 @@
<h2 class="font-header text-2xl"><slot /></h2> ---
const { class: className, ...attrs } = Astro.props;
---
<h2 class:list={["font-header text-2xl", className]} {...attrs}><slot /></h2>

View File

@@ -5,12 +5,19 @@ const { src, alt } = Astro.props;
import { getImageByPath } from "@lib/utils"; import { getImageByPath } from "@lib/utils";
const image = getImageByPath(src); const image = getImageByPath(src);
// width of container is 896, width of image is set to 1344 to allow for hover zoom
--- ---
{ {
image && ( image && (
<div class="my-8"> <div class="my-8">
<Image src={image} alt={alt} /> <Image
src={image}
alt={alt}
width={1344}
class="transition ease-in-out lg:hover:scale-150"
/>
<div class="mt-2 block w-full text-center text-sm italic">{alt}</div> <div class="mt-2 block w-full text-center text-sm italic">{alt}</div>
</div> </div>
) )

View File

@@ -0,0 +1,5 @@
<li>
<span class="block p-0.5"
><span class="text-primary pr-2">•</span><slot /></span
>
</li>

View File

@@ -34,34 +34,49 @@ const initialQueue = await Promise.all(
}; };
}) })
); );
const playerArtworkBlur = "10px";
const playerArtworkOpacity = 0.4;
--- ---
<div <div
id="player" id="player"
class:list={[ class:list={[
"fixed right-0 bottom-0 left-0 z-100 bg-black shadow-lg", "fixed right-0 bottom-0 left-0 z-100 overflow-hidden bg-black shadow-lg/75 md:right-3 md:bottom-3 md:left-3 md:rounded",
height height
]} ]}
transition:persist="" transition:persist=""
transition:name="player" transition:name="player"
transition:animate="none" transition:animate="none"
> >
<div class="absolute inset-0 -z-90 overflow-hidden">
<div
id="player:artwork:background"
class="animate-bg-perlin absolute top-0 right-0 bottom-0 left-0 -z-90"
>
</div>
</div>
<div <div
id="player:time:progress" id="player:time:progress"
class="relative top-0 right-0 left-0 m-0 h-2 w-full bg-gray-900 p-0" class="relative top-0 right-0 left-0 m-0 h-2 w-full rounded-t p-0 hover:cursor-pointer"
> >
<div
id="player:time:progress:background"
class="absolute top-0 left-0 m-0 h-full w-full bg-gray-900 p-0 opacity-50"
>
</div>
<div <div
id="player:time:progress:buffered" id="player:time:progress:buffered"
class="absolute top-0 left-0 m-0 h-full bg-gray-700 p-0" class="absolute top-0 left-0 m-0 h-full bg-gray-700 p-0 opacity-50"
> >
</div> </div>
<div <div
id="player:time:progress:played" id="player:time:progress:played"
class="from-primary to-primary-50 absolute top-0 left-0 m-0 h-full bg-gradient-to-r p-0" class="from-primary to-primary-50 absolute top-0 left-0 m-0 h-full bg-gradient-to-r p-0 opacity-100"
> >
</div> </div>
</div> </div>
<div class="p-2 text-white"> <div class="px-2 pt-2 pb-2 text-white md:px-3 md:pb-3">
<div class="grid grid-cols-2 text-xs"> <div class="grid grid-cols-2 text-xs">
<span id="player:times:current" class="col-span-1 text-left">0:00</span> <span id="player:times:current" class="col-span-1 text-left">0:00</span>
<span id="player:times:duration" class="col-span-1 text-right">0:00</span> <span id="player:times:duration" class="col-span-1 text-right">0:00</span>
@@ -92,10 +107,13 @@ const initialQueue = await Promise.all(
</div> </div>
</div> </div>
</div> </div>
<div class:list={[height]}></div> <div class:list={[height, "bg-gray-900"]}></div>
<script is:inline src="/js/howler.min.js"></script> <script is:inline src="/js/howler.min.js"></script>
<script is:inline define:vars={{ initialQueue }}> <script
is:inline
define:vars={{ initialQueue, playerArtworkBlur, playerArtworkOpacity }}
>
/** /**
* Player class containing the state of our playlist and where we are in it. * Player class containing the state of our playlist and where we are in it.
* Includes all methods for playing, skipping, updating the display, etc. * Includes all methods for playing, skipping, updating the display, etc.
@@ -126,6 +144,9 @@ const initialQueue = await Promise.all(
bar: document.getElementById("player:time:progress"), bar: document.getElementById("player:time:progress"),
buffered: document.getElementById("player:time:progress:buffered"), buffered: document.getElementById("player:time:progress:buffered"),
played: document.getElementById("player:time:progress:played") played: document.getElementById("player:time:progress:played")
},
artwork: {
background: document.getElementById("player:artwork:background")
} }
}; };
@@ -137,6 +158,18 @@ const initialQueue = await Promise.all(
Math.round(playlist[this.index].duration) Math.round(playlist[this.index].duration)
); );
if (playlist[this.index].metadata.artwork) {
this.UI.artwork.background.style.backgroundImage = `url('${playlist[this.index].metadata.artwork.src}')`;
this.UI.artwork.background.style.backgroundSize = "cover";
this.UI.artwork.background.style.backgroundPosition = "center";
this.UI.artwork.background.style.filter = `blur(${playerArtworkBlur})`;
this.UI.artwork.background.style.opacity = playerArtworkOpacity;
} else {
this.UI.artwork.background.style.backgroundImage = "";
this.UI.artwork.background.style.filter = "";
this.UI.artwork.background.style.opacity = "0";
}
this.UI.controls.play.addEventListener("click", function () { this.UI.controls.play.addEventListener("click", function () {
window.player.play(); window.player.play();
}); });
@@ -218,6 +251,18 @@ const initialQueue = await Promise.all(
); );
this.UI.progress.buffered.style.width = "0%"; this.UI.progress.buffered.style.width = "0%";
if (data.metadata.artwork) {
this.UI.artwork.background.style.backgroundImage = `url('${data.metadata.artwork.src}')`;
this.UI.artwork.background.style.backgroundSize = "cover";
this.UI.artwork.background.style.backgroundPosition = "center";
this.UI.artwork.background.style.filter = `blur(${playerArtworkBlur})`;
this.UI.artwork.background.style.opacity = playerArtworkOpacity;
} else {
this.UI.artwork.background.style.backgroundImage = "";
this.UI.artwork.background.style.filter = "";
this.UI.artwork.background.style.opacity = "0";
}
// Keep track of the index we are currently playing. // Keep track of the index we are currently playing.
this.index = index; this.index = index;
} }

View File

@@ -22,20 +22,20 @@ const linkIsExternal: boolean =
<a <a
href={href} href={href}
class:list={["group text-primary inline-block transition", className]} class:list={["group text-primary inline transition", className]}
target={href?.toString().startsWith("http") ? "_blank" : undefined} target={href?.toString().startsWith("http") ? "_blank" : undefined}
rel={linkIsExternal ? "noopener noreferrer" : undefined} rel={linkIsExternal ? "noopener noreferrer" : undefined}
{...attrs} {...attrs}
><span class="group-hover:text-gray-300"><slot /></span>{ ><span class="group-hover:text-primary-100"><slot /></span>{
includeExternalLinkIcon && linkIsExternal && ( includeExternalLinkIcon && linkIsExternal && (
<sup class="ml-0.5 inline-block"> <sup class="ml-0.5 inline-block">
<Icon <Icon
name="mdi:external-link" name="mdi:external-link"
class:list={[ class:list={[
"text-primary m-0 inline-block group-hover:text-gray-300" "text-primary group-hover:text-primary-100 m-0 inline-block"
]} ]}
/> />
</sup> </sup>
) )
} }</a
</a> >

View File

@@ -38,6 +38,8 @@ const headDescription: string = description || site.description;
<ThemeManager defaultTheme="auto" /> <ThemeManager defaultTheme="auto" />
<meta name="theme-color" content="#ff2d00" />
<Analytics /> <Analytics />
<ClientRouter /> <ClientRouter />

View File

@@ -28,7 +28,7 @@ import MainHead from "@layouts/MainHead.astro";
<MainHead {title} {subtitle} {description} {image} /> <MainHead {title} {subtitle} {description} {image} />
<body class="flex min-h-svh flex-col"> <body class="flex min-h-svh flex-col">
<Navbar {navbarDisplay} /> <Navbar {navbarDisplay} />
<main class="grow"> <main class="grow bg-white dark:bg-gray-950">
<slot /> <slot />
</main> </main>
<Footer /> <Footer />

View File

@@ -3,6 +3,7 @@ import aboutImage from "@assets/img/about.jpg";
import conductingImage from "@assets/img/about/nathan-cummins-composer-orchestrator-conductor-conducting-1.jpg"; import conductingImage from "@assets/img/about/nathan-cummins-composer-orchestrator-conductor-conducting-1.jpg";
import generalImage from "@assets/img/about/nathan-cummins-composer-orchestrator-conductor-general-1.png"; import generalImage from "@assets/img/about/nathan-cummins-composer-orchestrator-conductor-general-1.png";
import H2 from "@components/MDX/H2.astro"; import H2 from "@components/MDX/H2.astro";
import LI from "@components/MDX/LI.astro";
import Paragraph from "@components/Paragraph.astro"; import Paragraph from "@components/Paragraph.astro";
import SectionTitle from "@components/SectionTitle.astro"; import SectionTitle from "@components/SectionTitle.astro";
import TextLink from "@components/TextLink.astro"; import TextLink from "@components/TextLink.astro";
@@ -64,8 +65,8 @@ import { Image } from "astro:assets";
video games is recognised for its distinctive voice and adaptability.</Paragraph video games is recognised for its distinctive voice and adaptability.</Paragraph
> >
<Paragraph>Recent projects include:</Paragraph> <Paragraph>Recent projects include:</Paragraph>
<ul class="list-disc pl-4"> <ul>
<li> <LI>
<span class="font-bold" <span class="font-bold"
><TextLink ><TextLink
href="/projects/video-game/dungeons-and-dining-tables/" href="/projects/video-game/dungeons-and-dining-tables/"
@@ -73,16 +74,16 @@ import { Image } from "astro:assets";
Dungeons and Dining Tables</TextLink Dungeons and Dining Tables</TextLink
>:</span >:</span
> a cosy, highly orchestral score full of warmth and colour. > a cosy, highly orchestral score full of warmth and colour.
</li> </LI>
<li> <LI>
<span class="font-bold">Roc's Odyssey:</span> an edgy, symphonic metal <span class="font-bold">Roc's Odyssey:</span> an edgy, symphonic metal
soundtrack blending excitement with orchestral grandeur. soundtrack blending excitement with orchestral grandeur.
</li> </LI>
<li> <LI>
<span class="font-bold">The Lion and the Mouse:</span> a narrative work <span class="font-bold">The Lion and the Mouse:</span> a narrative work
for orchestra (or wind orchestra) that aims to teach children about music for orchestra (or wind orchestra) that aims to teach children about music
and the instruments of the orchestra. and the instruments of the orchestra.
</li> </LI>
</ul> </ul>
<Paragraph <Paragraph
>Nathan thrives on tailoring music to story and gameplay, crafting >Nathan thrives on tailoring music to story and gameplay, crafting
@@ -108,19 +109,19 @@ import { Image } from "astro:assets";
players can deliver their best performance.</Paragraph players can deliver their best performance.</Paragraph
> >
<Paragraph>Recent projects include:</Paragraph> <Paragraph>Recent projects include:</Paragraph>
<ul class="list-disc pl-4"> <ul>
<li> <LI>
<span class="font-bold">Hollow Knight: Silksong:</span> orchestration <span class="font-bold">Hollow Knight: Silksong:</span> orchestration
and typesetting for the score composed by <TextLink and typesetting for the score composed by <TextLink
href="https://composerlarkin.com/">Christopher Larkin</TextLink href="https://composerlarkin.com/">Christopher Larkin</TextLink
>. >.
</li> </LI>
<li> <LI>
<span class="font-bold">Submerged: Hidden Depths:</span> typesetting <span class="font-bold">Submerged: Hidden Depths:</span> typesetting
for the recording score composed by <TextLink for the recording score composed by <TextLink
href="https://jeffvandyck.com/">Jeff van Dyck</TextLink href="https://jeffvandyck.com/">Jeff van Dyck</TextLink
>. >.
</li> </LI>
</ul> </ul>
</div> </div>
</section> </section>
@@ -130,7 +131,7 @@ import { Image } from "astro:assets";
<Paragraph <Paragraph
>Nathan is a versatile conductor with specialisations in concert >Nathan is a versatile conductor with specialisations in concert
performance, video game music, and studio recording. He is one of performance, video game music, and studio recording. He is one of
Australias leading directors of concerts featuring video game music, Australia's leading directors of concerts featuring video game music,
and is equally at home on the podium of a symphonic performance or in and is equally at home on the podium of a symphonic performance or in
the precision-driven environment of a recording session.</Paragraph the precision-driven environment of a recording session.</Paragraph
> >
@@ -158,14 +159,14 @@ import { Image } from "astro:assets";
>Nathan is also the Artistic Director of the <TextLink >Nathan is also the Artistic Director of the <TextLink
href="https://www.woodvillecb.com.au/" href="https://www.woodvillecb.com.au/"
>Woodville Concert Band</TextLink >Woodville Concert Band</TextLink
>, an active, diverse, and inclusive community ensemble of around 45 >, an active, diverse, and inclusive community ensemble of around 50
members. Under his direction, the band has become a cultural hub, members. Under his direction, the band has become a cultural hub,
reflecting the motto “music played for the community, by the reflecting the motto “music played for the community, by the
community.” Through performances that engage 8,0009,000 community community”. Through performances that engage 8,000-9,000 community
members annually, the ensemble promotes music education, fosters members annually, the ensemble promotes music education, fosters
inclusivity, and provides a distinctive cultural offering that inclusivity, and provides a distinctive cultural offering that
supports local industries and artists. Nathans leadership has been supports local industries and artists. Nathan's leadership has been
instrumental in shaping the bands vision of accessibility, culture, instrumental in shaping the band's vision of accessibility, culture,
and community over profit, while still maintaining high artistic and community over profit, while still maintaining high artistic
standards.</Paragraph standards.</Paragraph
> >

View File

@@ -174,26 +174,12 @@ const tracks = (
<section id="recognition" class="bg-white dark:bg-gray-950"> <section id="recognition" class="bg-white dark:bg-gray-950">
<div class="mx-auto max-w-4xl px-8 py-16 text-center"> <div class="mx-auto max-w-4xl px-8 py-16 text-center">
<SectionTitle>Recognition</SectionTitle> <SectionTitle>Recognition</SectionTitle>
<div class="grid grid-cols-1 md:grid-cols-2">
<div
class="col-span-1 flex h-48 w-full flex-col items-center justify-center"
>
<Paragraph <Paragraph
>I am very grateful to have been recognised and awarded for my >I am very grateful to have been recognised and awarded for my work.</Paragraph
work.</Paragraph
> >
<a <div class="md-8 h-48 overflow-hidden scroll-smooth p-0">
href="/recognition/"
class="bg-primary text-md font-header hover:text-primary repeat hover:ring-primary mx-auto inline-block rounded px-6 py-3 font-light text-white uppercase drop-shadow-lg/75 transition hover:bg-white hover:ring-2"
>
Click here for more information
</a>
</div>
<div <div
class="md-8 col-span-1 h-48 overflow-hidden scroll-smooth p-0 md:mt-0" class="animate-scrolling-awards m-0 mx-auto flex max-w-md flex-col space-y-8 p-0"
>
<div
class="animate-scrolling-awards m-0 mx-auto flex max-w-3xs flex-col space-y-8 p-0"
> >
{ {
awardsDoubled.map((award) => { awardsDoubled.map((award) => {
@@ -203,7 +189,6 @@ const tracks = (
</div> </div>
</div> </div>
</div> </div>
</div>
</section> </section>
<section id="fillerUntilServicesIsComplete" class="text-white"> <section id="fillerUntilServicesIsComplete" class="text-white">
<div class="flex h-96 w-full items-center justify-center"> <div class="flex h-96 w-full items-center justify-center">

View File

@@ -52,6 +52,7 @@ import H4 from "@components/MDX/H4.astro";
import H5 from "@components/MDX/H5.astro"; import H5 from "@components/MDX/H5.astro";
import H6 from "@components/MDX/H6.astro"; import H6 from "@components/MDX/H6.astro";
import IMG from "@components/MDX/IMG.astro"; import IMG from "@components/MDX/IMG.astro";
import LI from "@components/MDX/LI.astro";
import P from "@components/MDX/P.astro"; import P from "@components/MDX/P.astro";
--- ---
@@ -144,7 +145,8 @@ import P from "@components/MDX/P.astro";
h6: H6, h6: H6,
blockquote: Blockquote, blockquote: Blockquote,
pre: CodeSnippet, pre: CodeSnippet,
img: IMG img: IMG,
li: LI
}} }}
/> />
</div> </div>

View File

@@ -0,0 +1,80 @@
---
import H2 from "@components/MDX/H2.astro";
import LI from "@components/MDX/LI.astro";
import Paragraph from "@components/Paragraph.astro";
import SectionTitle from "@components/SectionTitle.astro";
import TextLink from "@components/TextLink.astro";
import MainLayout from "@layouts/MainLayout.astro";
---
<MainLayout title="Sheet Music">
<div class="w-full bg-white py-16 dark:bg-gray-950">
<section id="intro">
<div class="mx-auto max-w-4xl px-8 text-left">
<SectionTitle class="pb-8">Sheet Music</SectionTitle>
<Paragraph
>Sheet music for many of my pieces and orchestrations is available for
purchase or rent. If you are interested in sheet music for performance
or study, for the moment the simplest method to obtain it is to <TextLink
href="/contact/">contact me</TextLink
>.</Paragraph
>
<Paragraph
>This page mostly contains scores that I am often asked about or that
are from projects that I am involved with as composer. Some other
scores (such as the <TextLink
href="https://jeffvandyck.bandcamp.com/album/submerged-hidden-depths-original-soundtrack"
>recording score for <i>Submerged: Hidden Depths</i></TextLink
>
composed by <TextLink href="https://jeffvandyck.com/"
>Jeff van Dyck</TextLink
>, which I engraved) may be available through different means. If you
are looking for a piece that is not listed here, please feel free to <TextLink
href="/contact/">contact me</TextLink
>, it may still be available.</Paragraph
>
</div>
</section>
<section id="available">
<div class="mx-auto max-w-4xl px-8 text-left">
<H2 class="mb-4">Orchestra</H2>
<ul>
<LI>
<b>The Lion and the Mouse</b>
<ul class="ml-4">
<LI>2222, 4331, timp, harp, narrator, perc (x3), strings</LI>
</ul>
</LI>
<LI>
<b>Lampshade Grove (from Dungeons and Dining Tables)</b>
<ul class="ml-4">
<LI>2222, 4331, timp, harp, celeste (optional), perc, strings</LI>
<LI>2222, 4210, timp, percussion (x1), strings</LI>
</ul>
</LI>
</ul>
<H2 class="my-4">Wind Orchestra / Concert Band</H2>
<ul>
<LI>The Lion and the Mouse</LI>
<LI>Lampshade Grove (from Dungeons and Dining Tables)</LI>
<LI>The Couch Troll (from Dungeons and Dining Tables)</LI>
<LI>Kindlerest (from Dungeons and Dining Tables)</LI>
<LI>Gameplay Trailer (from Dungeons and Dining Tables)</LI>
<LI>Centenary Fanfare</LI>
<LI>Roc's Odyssey (from Roc's Odyssey)</LI>
<LI>Vulkan (from Roc's Odyssey)</LI>
<LI>Hydra (from Roc's Odyssey)</LI>
</ul>
<H2 class="my-4">String Quartet</H2>
<ul>
<LI>String Quartet No. 1</LI>
<LI>Aragornaise</LI>
</ul>
<H2 class="my-4">Choir</H2>
<ul>
<LI>Odi et Amo (SSAATTBB)</LI>
</ul>
</div>
</section>
</div>
</MainLayout>

View File

@@ -74,6 +74,26 @@
transform: translateY(1%); transform: translateY(1%);
} }
} }
--animate-bg-perlin: bg-perlin 60s linear infinite;
@keyframes bg-perlin {
0% {
transform: translateX(0%) scale(1);
}
25% {
transform: translateX(2%) scale(1.25);
}
50% {
transform: translateX(-2%) scale(1.02);
}
75% {
transform: translateX(1%) scale(1.18);
}
100% {
transform: translateX(0%) scale(1);
}
}
} }
@layer base { @layer base {