@@ -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 | |||
} | |||
} |