@@ -0,0 +1,24 @@ | |||||
# build output | |||||
dist/ | |||||
# generated types | |||||
.astro/ | |||||
# dependencies | |||||
node_modules/ | |||||
# logs | |||||
npm-debug.log* | |||||
yarn-debug.log* | |||||
yarn-error.log* | |||||
pnpm-debug.log* | |||||
# environment variables | |||||
.env | |||||
.env.production | |||||
# macOS-specific files | |||||
.DS_Store | |||||
# jetbrains setting folder | |||||
.idea/ |
@@ -0,0 +1,54 @@ | |||||
# Astro Starter Kit: Basics | |||||
```sh | |||||
npm create astro@latest -- --template basics | |||||
``` | |||||
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics) | |||||
[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics) | |||||
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json) | |||||
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun! | |||||
![just-the-basics](https://github.com/withastro/astro/assets/2244813/a0a5533c-a856-4198-8470-2d67b1d7c554) | |||||
## 🚀 Project Structure | |||||
Inside of your Astro project, you'll see the following folders and files: | |||||
```text | |||||
/ | |||||
├── public/ | |||||
│ └── favicon.svg | |||||
├── src/ | |||||
│ ├── components/ | |||||
│ │ └── Card.astro | |||||
│ ├── layouts/ | |||||
│ │ └── Layout.astro | |||||
│ └── pages/ | |||||
│ └── index.astro | |||||
└── package.json | |||||
``` | |||||
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. | |||||
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. | |||||
Any static assets, like images, can be placed in the `public/` directory. | |||||
## 🧞 Commands | |||||
All commands are run from the root of the project, from a terminal: | |||||
| Command | Action | | |||||
| :------------------------ | :----------------------------------------------- | | |||||
| `npm install` | Installs dependencies | | |||||
| `npm run dev` | Starts local dev server at `localhost:4321` | | |||||
| `npm run build` | Build your production site to `./dist/` | | |||||
| `npm run preview` | Preview your build locally, before deploying | | |||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | | |||||
| `npm run astro -- --help` | Get help using the Astro CLI | | |||||
## 👀 Want to learn more? | |||||
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). |
@@ -0,0 +1,10 @@ | |||||
import { defineConfig } from 'astro/config'; | |||||
import react from "@astrojs/react"; | |||||
import tailwind from "@astrojs/tailwind"; | |||||
import mdx from "@astrojs/mdx"; | |||||
// https://astro.build/config | |||||
export default defineConfig({ | |||||
integrations: [react(), tailwind(), mdx()], | |||||
}); |
@@ -0,0 +1,26 @@ | |||||
{ | |||||
"name": "piano-notes-book", | |||||
"type": "module", | |||||
"version": "0.0.1", | |||||
"scripts": { | |||||
"dev": "astro dev", | |||||
"start": "astro dev", | |||||
"build": "astro check && astro build", | |||||
"preview": "astro preview", | |||||
"astro": "astro" | |||||
}, | |||||
"dependencies": { | |||||
"@astrojs/check": "^0.5.10", | |||||
"@astrojs/mdx": "^2.2.4", | |||||
"@astrojs/react": "^3.1.1", | |||||
"@astrojs/tailwind": "^5.1.0", | |||||
"@types/react": "^18.2.74", | |||||
"@types/react-dom": "^18.2.24", | |||||
"astro": "^4.5.16", | |||||
"react": "^18.2.0", | |||||
"react-dom": "^18.2.0", | |||||
"tailwindcss": "^3.4.3", | |||||
"typescript": "^5.4.4", | |||||
"vexflow": "5.0.0-alpha.3" | |||||
} | |||||
} |
@@ -0,0 +1,9 @@ | |||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128"> | |||||
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" /> | |||||
<style> | |||||
path { fill: #000; } | |||||
@media (prefers-color-scheme: dark) { | |||||
path { fill: #FFF; } | |||||
} | |||||
</style> | |||||
</svg> |
@@ -0,0 +1,153 @@ | |||||
import * as React from 'react'; | |||||
import * as Vexflow from 'vexflow'; | |||||
export const Notation = () => { | |||||
const ref = React.useRef<HTMLElementTagNameMap['div']>(null); | |||||
const id = React.useId(); | |||||
React.useEffect(() => { | |||||
const render = (id: string) => { | |||||
const el = window.document.getElementById(id); | |||||
if (!el) { | |||||
return; | |||||
} | |||||
el.innerHTML = ''; | |||||
const { Factory } = Vexflow; | |||||
const width = el.clientWidth; | |||||
const vf = new Factory({ | |||||
renderer: { elementId: id, width, height: 300 }, | |||||
}); | |||||
vf.getContext().scale(0.75, 0.75); | |||||
const score = vf.EasyScore(); | |||||
let currentX = 20; | |||||
let currentY = 40; | |||||
const getCurrentBar = (width: number) => { | |||||
const system = vf.System({ | |||||
x: currentX, | |||||
y: currentY, | |||||
width, | |||||
}); | |||||
currentX += width; | |||||
return system; | |||||
}; | |||||
let system = getCurrentBar(130); | |||||
system.addStave({ | |||||
voices: [ | |||||
score.voice([ | |||||
...score.notes('D5/8'), | |||||
], { | |||||
time: '1/8', | |||||
}) | |||||
] | |||||
}) | |||||
.addClef('treble') | |||||
.addKeySignature('Gm') | |||||
.addTimeSignature('C') | |||||
.setTempo( | |||||
{ | |||||
name: 'Adagio.' | |||||
}, | |||||
-30 | |||||
); | |||||
system.addStave({ | |||||
voices: [ | |||||
score.voice([ | |||||
...score.notes('D3/8/r', { clef: 'bass' }), | |||||
], { | |||||
time: '1/8', | |||||
}) | |||||
] | |||||
}) | |||||
.addClef('bass') | |||||
.addKeySignature('Gm') | |||||
.addTimeSignature('C'); | |||||
system.addConnector('brace'); | |||||
system.addConnector('singleLeft'); | |||||
system.addConnector('singleRight'); | |||||
system = getCurrentBar(350); | |||||
system | |||||
.addStave({ | |||||
voices: [ | |||||
score.voice( | |||||
[ | |||||
...score.tuplet( | |||||
score.beam( | |||||
score.notes('G5/16, B5, A5, G5, F#5, G5'), | |||||
), | |||||
{ | |||||
ratioed: false, | |||||
notesOccupied: 4, | |||||
} | |||||
), | |||||
...score.tuplet( | |||||
score.beam( | |||||
score.notes('G5/16, F5, G5, D6, F5, G5'), | |||||
), | |||||
{ | |||||
ratioed: false, | |||||
notesOccupied: 4, | |||||
yOffset: Infinity, | |||||
} | |||||
), | |||||
// ...score.beam(score.notes('E5/8, D5')), | |||||
...score.beam(score.notes('E5/8, D5')), | |||||
...score.tuplet( | |||||
score.beam( | |||||
score.notes('D5/16, E5, F5, G5, A5, B5'), | |||||
), | |||||
{ | |||||
ratioed: false, | |||||
notesOccupied: 4, | |||||
yOffset: Infinity, | |||||
} | |||||
), | |||||
] | |||||
), | |||||
] | |||||
}); | |||||
system | |||||
.addStave({ | |||||
voices: [ | |||||
score.voice([ | |||||
...score.beam( | |||||
score.notes('(G3 B3 D4)/8, (G3 B3 D4)', { clef: 'bass' }) | |||||
), | |||||
...score.beam( | |||||
score.notes('(G3 B3 D4)/8, (G3 B3 D4)', { clef: 'bass' }) | |||||
), | |||||
...score.beam( | |||||
score.notes('(G3 C4)/8, (G3 B3)', { clef: 'bass' }) | |||||
), | |||||
...score.beam( | |||||
score.notes('(G3 B3)/8, (G3 B3)', { clef: 'bass' }) | |||||
), | |||||
]), | |||||
] | |||||
}); | |||||
system.addConnector('singleLeft'); | |||||
system.addConnector('singleRight'); | |||||
vf.draw(); | |||||
}; | |||||
render(id); | |||||
}, []); | |||||
return ( | |||||
<div | |||||
ref={ref} | |||||
id={id} | |||||
/> | |||||
); | |||||
}; |
@@ -0,0 +1,2 @@ | |||||
/// <reference path="../.astro/types.d.ts" /> | |||||
/// <reference types="astro/client" /> |
@@ -0,0 +1,27 @@ | |||||
--- | |||||
const { title } = Astro.props.frontmatter || Astro.props; | |||||
--- | |||||
<!doctype html> | |||||
<html lang="en-PH" class="font-body"> | |||||
<head> | |||||
<meta charset="UTF-8" /> | |||||
<meta name="description" content="Astro description" /> | |||||
<meta name="viewport" content="width=device-width" /> | |||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> | |||||
<meta name="generator" content={Astro.generator} /> | |||||
<title>{title}</title> | |||||
<style is:global> | |||||
p { | |||||
@apply my-6; | |||||
@apply indent-6; | |||||
@apply text-justify; | |||||
} | |||||
</style> | |||||
</head> | |||||
<body> | |||||
<div class="px-8 w-full mx-auto max-w-screen-md print:max-w-full print:m-0 my-16"> | |||||
<slot /> | |||||
</div> | |||||
</body> | |||||
</html> |
@@ -0,0 +1,6 @@ | |||||
--- | |||||
title: Introduction | |||||
layout: ../layouts/Layout.astro | |||||
--- | |||||
Detail about me here |
@@ -0,0 +1,18 @@ | |||||
--- | |||||
title: Trills | |||||
layout: ../layouts/Layout.astro | |||||
--- | |||||
import {Notation} from '../components/Notation'; | |||||
I have attended the session where I was supposed to demonstrate the trills I had been working for the past few days. I | |||||
started with the third movement of Haydn Piano Sonata No. 6: | |||||
<Notation client:visible /> | |||||
Sir demonstrated to me where the "Adagio" is meant for, where the pulse is made out of quarter notes. He gestured to me | |||||
the 4/4 time signature and said the grouping is made out of 6 notes "imagine the pulse is made out of sextuplets". | |||||
He said my trills were "ugly", to which I agreed. I was still struggling to make the trills "sound right". He suggested | |||||
I "count" the trills. However, that felt too much for me to handle, so I tried clinging to my sensation. I used my | |||||
(2) to "count", i.e. align my trills to the measure. |
@@ -0,0 +1,8 @@ | |||||
--- | |||||
title: Book Name | |||||
layout: ../layouts/Layout.astro | |||||
--- | |||||
Hello world! | |||||
Book cover here |
@@ -0,0 +1,12 @@ | |||||
/** @type {import('tailwindcss').Config} */ | |||||
export default { | |||||
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], | |||||
theme: { | |||||
fontFamily: { | |||||
body: ['Century', 'serif'], | |||||
}, | |||||
extend: { | |||||
}, | |||||
}, | |||||
plugins: [], | |||||
} |
@@ -0,0 +1,8 @@ | |||||
{ | |||||
"extends": "astro/tsconfigs/strictest", | |||||
"compilerOptions": { | |||||
"jsx": "react-jsx", | |||||
"jsxImportSource": "react", | |||||
"strictNullChecks": true | |||||
} | |||||
} |