├── .gitignore
├── .husky
└── pre-commit
├── .vscode
└── extensions.json
├── README.md
├── babel.config.js
├── biome.json
├── index.html
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
├── algomidi.gif
├── node.png
├── samples
│ └── piano
│ │ ├── A1.mp3
│ │ ├── A1.ogg
│ │ ├── A1.wav
│ │ ├── A2.mp3
│ │ ├── A2.ogg
│ │ ├── A2.wav
│ │ ├── A3.mp3
│ │ ├── A3.ogg
│ │ ├── A3.wav
│ │ ├── A4.mp3
│ │ ├── A4.ogg
│ │ ├── A4.wav
│ │ ├── A5.mp3
│ │ ├── A5.ogg
│ │ ├── A5.wav
│ │ ├── A6.mp3
│ │ ├── A6.ogg
│ │ ├── A6.wav
│ │ ├── A7.mp3
│ │ ├── A7.ogg
│ │ ├── A7.wav
│ │ ├── As1.mp3
│ │ ├── As1.ogg
│ │ ├── As1.wav
│ │ ├── As2.mp3
│ │ ├── As2.ogg
│ │ ├── As2.wav
│ │ ├── As3.mp3
│ │ ├── As3.ogg
│ │ ├── As3.wav
│ │ ├── As4.mp3
│ │ ├── As4.ogg
│ │ ├── As4.wav
│ │ ├── As5.mp3
│ │ ├── As5.ogg
│ │ ├── As5.wav
│ │ ├── As6.mp3
│ │ ├── As6.ogg
│ │ ├── As6.wav
│ │ ├── As7.mp3
│ │ ├── As7.ogg
│ │ ├── As7.wav
│ │ ├── B1.mp3
│ │ ├── B1.ogg
│ │ ├── B1.wav
│ │ ├── B2.mp3
│ │ ├── B2.ogg
│ │ ├── B2.wav
│ │ ├── B3.mp3
│ │ ├── B3.ogg
│ │ ├── B3.wav
│ │ ├── B4.mp3
│ │ ├── B4.ogg
│ │ ├── B4.wav
│ │ ├── B5.mp3
│ │ ├── B5.ogg
│ │ ├── B5.wav
│ │ ├── B6.mp3
│ │ ├── B6.ogg
│ │ ├── B6.wav
│ │ ├── B7.mp3
│ │ ├── B7.ogg
│ │ ├── B7.wav
│ │ ├── C1.mp3
│ │ ├── C1.ogg
│ │ ├── C1.wav
│ │ ├── C2.mp3
│ │ ├── C2.ogg
│ │ ├── C2.wav
│ │ ├── C3.mp3
│ │ ├── C3.ogg
│ │ ├── C3.wav
│ │ ├── C4.mp3
│ │ ├── C4.ogg
│ │ ├── C4.wav
│ │ ├── C5.mp3
│ │ ├── C5.ogg
│ │ ├── C5.wav
│ │ ├── C6.mp3
│ │ ├── C6.ogg
│ │ ├── C6.wav
│ │ ├── C7.mp3
│ │ ├── C7.ogg
│ │ ├── C7.wav
│ │ ├── C8.mp3
│ │ ├── C8.ogg
│ │ ├── C8.wav
│ │ ├── Cs1.mp3
│ │ ├── Cs1.ogg
│ │ ├── Cs1.wav
│ │ ├── Cs2.mp3
│ │ ├── Cs2.ogg
│ │ ├── Cs2.wav
│ │ ├── Cs3.mp3
│ │ ├── Cs3.ogg
│ │ ├── Cs3.wav
│ │ ├── Cs4.mp3
│ │ ├── Cs4.ogg
│ │ ├── Cs4.wav
│ │ ├── Cs5.mp3
│ │ ├── Cs5.ogg
│ │ ├── Cs5.wav
│ │ ├── Cs6.mp3
│ │ ├── Cs6.ogg
│ │ ├── Cs6.wav
│ │ ├── Cs7.mp3
│ │ ├── Cs7.ogg
│ │ ├── Cs7.wav
│ │ ├── D1.mp3
│ │ ├── D1.ogg
│ │ ├── D1.wav
│ │ ├── D2.mp3
│ │ ├── D2.ogg
│ │ ├── D2.wav
│ │ ├── D3.mp3
│ │ ├── D3.ogg
│ │ ├── D3.wav
│ │ ├── D4.mp3
│ │ ├── D4.ogg
│ │ ├── D4.wav
│ │ ├── D5.mp3
│ │ ├── D5.ogg
│ │ ├── D5.wav
│ │ ├── D6.mp3
│ │ ├── D6.ogg
│ │ ├── D6.wav
│ │ ├── D7.mp3
│ │ ├── D7.ogg
│ │ ├── D7.wav
│ │ ├── Ds1.mp3
│ │ ├── Ds1.ogg
│ │ ├── Ds1.wav
│ │ ├── Ds2.mp3
│ │ ├── Ds2.ogg
│ │ ├── Ds2.wav
│ │ ├── Ds3.mp3
│ │ ├── Ds3.ogg
│ │ ├── Ds3.wav
│ │ ├── Ds4.mp3
│ │ ├── Ds4.ogg
│ │ ├── Ds4.wav
│ │ ├── Ds5.mp3
│ │ ├── Ds5.ogg
│ │ ├── Ds5.wav
│ │ ├── Ds6.mp3
│ │ ├── Ds6.ogg
│ │ ├── Ds6.wav
│ │ ├── Ds7.mp3
│ │ ├── Ds7.ogg
│ │ ├── Ds7.wav
│ │ ├── E1.mp3
│ │ ├── E1.ogg
│ │ ├── E1.wav
│ │ ├── E2.mp3
│ │ ├── E2.ogg
│ │ ├── E2.wav
│ │ ├── E3.mp3
│ │ ├── E3.ogg
│ │ ├── E3.wav
│ │ ├── E4.mp3
│ │ ├── E4.ogg
│ │ ├── E4.wav
│ │ ├── E5.mp3
│ │ ├── E5.ogg
│ │ ├── E5.wav
│ │ ├── E6.mp3
│ │ ├── E6.ogg
│ │ ├── E6.wav
│ │ ├── E7.mp3
│ │ ├── E7.ogg
│ │ ├── E7.wav
│ │ ├── F1.mp3
│ │ ├── F1.ogg
│ │ ├── F1.wav
│ │ ├── F2.mp3
│ │ ├── F2.ogg
│ │ ├── F2.wav
│ │ ├── F3.mp3
│ │ ├── F3.ogg
│ │ ├── F3.wav
│ │ ├── F4.mp3
│ │ ├── F4.ogg
│ │ ├── F4.wav
│ │ ├── F5.mp3
│ │ ├── F5.ogg
│ │ ├── F5.wav
│ │ ├── F6.mp3
│ │ ├── F6.ogg
│ │ ├── F6.wav
│ │ ├── F7.mp3
│ │ ├── F7.ogg
│ │ ├── F7.wav
│ │ ├── Fs1.mp3
│ │ ├── Fs1.ogg
│ │ ├── Fs1.wav
│ │ ├── Fs2.mp3
│ │ ├── Fs2.ogg
│ │ ├── Fs2.wav
│ │ ├── Fs3.mp3
│ │ ├── Fs3.ogg
│ │ ├── Fs3.wav
│ │ ├── Fs4.mp3
│ │ ├── Fs4.ogg
│ │ ├── Fs4.wav
│ │ ├── Fs5.mp3
│ │ ├── Fs5.ogg
│ │ ├── Fs5.wav
│ │ ├── Fs6.mp3
│ │ ├── Fs6.ogg
│ │ ├── Fs6.wav
│ │ ├── Fs7.mp3
│ │ ├── Fs7.ogg
│ │ ├── Fs7.wav
│ │ ├── G1.mp3
│ │ ├── G1.ogg
│ │ ├── G1.wav
│ │ ├── G2.mp3
│ │ ├── G2.ogg
│ │ ├── G2.wav
│ │ ├── G3.mp3
│ │ ├── G3.ogg
│ │ ├── G3.wav
│ │ ├── G4.mp3
│ │ ├── G4.ogg
│ │ ├── G4.wav
│ │ ├── G5.mp3
│ │ ├── G5.ogg
│ │ ├── G5.wav
│ │ ├── G6.mp3
│ │ ├── G6.ogg
│ │ ├── G6.wav
│ │ ├── G7.mp3
│ │ ├── G7.ogg
│ │ ├── G7.wav
│ │ ├── Gs1.mp3
│ │ ├── Gs1.ogg
│ │ ├── Gs1.wav
│ │ ├── Gs2.mp3
│ │ ├── Gs2.ogg
│ │ ├── Gs2.wav
│ │ ├── Gs3.mp3
│ │ ├── Gs3.ogg
│ │ ├── Gs3.wav
│ │ ├── Gs4.mp3
│ │ ├── Gs4.ogg
│ │ ├── Gs4.wav
│ │ ├── Gs5.mp3
│ │ ├── Gs5.ogg
│ │ ├── Gs5.wav
│ │ ├── Gs6.mp3
│ │ ├── Gs6.ogg
│ │ ├── Gs6.wav
│ │ ├── Gs7.mp3
│ │ ├── Gs7.ogg
│ │ └── Gs7.wav
└── vite.svg
├── src
├── App.vue
├── assets
│ └── vue.svg
├── components
│ ├── Studio.vue
│ ├── maths
│ │ ├── CASettings.vue
│ │ ├── CellularAutomata.vue
│ │ ├── Graph.vue
│ │ └── MathsCanvas.vue
│ ├── piano
│ │ ├── Piano.vue
│ │ └── PianoKeys.vue
│ └── tracks
│ │ ├── TrackControl.vue
│ │ └── TrackView.vue
├── composables
│ ├── cellular-automata
│ │ ├── useAutomata.ts
│ │ └── useAutomataRenderer.ts
│ ├── useKeyboardGenerator.ts
│ ├── useMultiTransport.ts
│ ├── useP5Canvas.ts
│ ├── usePianoSampler.ts
│ ├── useTrackControl.ts
│ └── useTrackState.ts
├── main.ts
├── services
│ └── db
│ │ ├── indexedDB.ts
│ │ ├── trackDB.ts
│ │ └── types.ts
├── stores
│ └── midiStore.ts
├── style.css
└── vite-env.d.ts
├── tailwind.config.js
├── tsconfig.json
└── vite.config.ts
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 | New*
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | npx lint-staged
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["Vue.volar"]
3 | }
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AlgoMIDI 🎹
2 |
3 | 
4 |
5 | A musical studio to create music through cellular automata and graph traversal algorithms. Built as a spiritual successor to [Cellular Minimata](https://github.com/myanvoos/cellular-minimata) - now instead of simply visualising the automata, each "living" cell triggers a musical note.
6 |
7 | Tech stack: Vue 3, Vite, TypeScript, Web Audio API (via Tone.js), p5.js, Cytoscape.js. The piano sampler came from [this](https://github.com/nbrosowsky/tonejs-instruments).
8 |
9 | AlgoMIDI lets you create music through:
10 |
11 | - 🎲 Conway's Game of Life (and other cellular automata rules)
12 | - 🕸️ Graph traversal algorithms (BFS/DFS)
13 |
14 | A virtual piano represents the notes generated by both the cellular automata and the graph traversal algorithms.
15 |
16 | ## Features
17 |
18 | ### Cellular Automata
19 | - Classic Game of Life rules (B3/S23) and other presets
20 | - Custom rule input (format: B3/S2,3)
21 | - Adjustable playback speed (60-240 BPM)
22 | - Click cells to create initial patterns
23 |
24 | ### Graph Traversal
25 | - Visual representation of notes as nodes
26 | - BFS and DFS algorithms to create melodic sequences
27 | - Drag-and-drop edge creation
28 | - Multiple layout options (circle, grid, random etc.)
29 |
30 | ### Piano Interface
31 | - Visual feedback for played notes
32 | - Shows notes from both automata and graph
33 | - Basic playback controls
34 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | // babel.config.js
2 | module.exports = {
3 | presets: [
4 | ["@babel/preset-env", { targets: { node: "current" } }],
5 | "@babel/preset-typescript",
6 | ],
7 | }
8 |
--------------------------------------------------------------------------------
/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3 | "vcs": {
4 | "enabled": false,
5 | "clientKind": "git",
6 | "useIgnoreFile": false
7 | },
8 | "files": {
9 | "ignoreUnknown": false,
10 | "ignore": [
11 | "node_modules",
12 | "dist",
13 | "build",
14 | "public",
15 | "src/assets",
16 | "babel.config.js",
17 | "package.json",
18 | "tsconfig.json",
19 | "vite.config.js",
20 | "vue.config.js",
21 | "biome.json"
22 | ]
23 | },
24 | "formatter": {
25 | "enabled": true,
26 | "indentStyle": "tab",
27 | "attributePosition": "multiline"
28 | },
29 | "organizeImports": {
30 | "enabled": true
31 | },
32 | "linter": {
33 | "enabled": true,
34 | "rules": {
35 | "recommended": true,
36 | "style": {
37 | "noNonNullAssertion": "info"
38 | },
39 | "suspicious": {
40 | "noExplicitAny": "info"
41 | },
42 | "complexity": {
43 | "noForEach": "info"
44 | }
45 | }
46 | },
47 | "javascript": {
48 | "formatter": {
49 | "quoteStyle": "double",
50 | "semicolons": "asNeeded"
51 | }
52 | },
53 | "overrides": [
54 | {
55 | "include": ["*.vue"],
56 | "linter": {
57 | "rules": {
58 | "style": {
59 | "useConst": "info",
60 | "useImportType": "off"
61 | }
62 | }
63 | }
64 | }
65 | ]
66 | }
67 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | AlgoMIDI
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "algomidi",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview",
10 | "test": "jest",
11 | "prepare": "husky"
12 | },
13 | "dependencies": {
14 | "@primevue/themes": "^4.2.5",
15 | "@tonejs/midi": "^2.0.28",
16 | "@types/cytoscape": "^3.21.9",
17 | "@vercel/analytics": "^1.5.0",
18 | "@vueuse/core": "^12.7.0",
19 | "cytoscape": "^3.31.0",
20 | "cytoscape-edgehandles": "^4.0.1",
21 | "idb": "^8.0.1",
22 | "jest-environment-jsdom": "^29.7.0",
23 | "midi-writer-js": "^3.1.1",
24 | "p5": "^1.11.0",
25 | "p5vue": "^0.0.7",
26 | "pinia": "^2.3.1",
27 | "primeicons": "^7.0.0",
28 | "primevue": "^4.2.5",
29 | "tone": "^15.0.4",
30 | "vue": "^3.5.12"
31 | },
32 | "devDependencies": {
33 | "@babel/preset-env": "^7.26.0",
34 | "@babel/preset-typescript": "^7.26.0",
35 | "@biomejs/biome": "1.9.4",
36 | "@nuxtjs/tailwindcss": "^6.13.1",
37 | "@testing-library/jest-dom": "^6.6.3",
38 | "@testing-library/vue": "^8.1.0",
39 | "@types/jest": "^29.5.14",
40 | "@vitejs/plugin-vue": "^5.1.4",
41 | "@vue/vue3-jest": "^29.2.6",
42 | "autoprefixer": "^10.4.20",
43 | "babel-jest": "^29.7.0",
44 | "husky": "^9.1.7",
45 | "jest": "^29.7.0",
46 | "lint-staged": "^15.4.3",
47 | "postcss": "^8.4.47",
48 | "prettier": "^3.5.2",
49 | "tailwindcss": "^3.4.14",
50 | "ts-jest": "^29.2.5",
51 | "typescript": "~5.6.2",
52 | "vite": "^5.4.9",
53 | "vue-tsc": "^2.1.6"
54 | },
55 | "jest": {
56 | "preset": "ts-jest",
57 | "testEnvironment": "jsdom",
58 | "transform": {
59 | "^.+\\.vue$": "@vue/vue3-jest",
60 | "^.+\\.ts$": "ts-jest",
61 | "^.+\\.js$": "babel-jest"
62 | },
63 | "moduleFileExtensions": [
64 | "ts",
65 | "js",
66 | "vue",
67 | "json"
68 | ],
69 | "transformIgnorePatterns": [
70 | "/node_modules/"
71 | ],
72 | "setupFilesAfterEnv": [
73 | "@testing-library/jest-dom"
74 | ],
75 | "moduleNameMapper": {
76 | "^@/(.*)$": "/src/$1"
77 | }
78 | },
79 | "lint-staged": {
80 | "**/*": "biome check --write ."
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/public/algomidi.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/algomidi.gif
--------------------------------------------------------------------------------
/public/node.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/node.png
--------------------------------------------------------------------------------
/public/samples/piano/A1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/A1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/A1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A1.wav
--------------------------------------------------------------------------------
/public/samples/piano/A2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/A2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/A2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A2.wav
--------------------------------------------------------------------------------
/public/samples/piano/A3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/A3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/A3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A3.wav
--------------------------------------------------------------------------------
/public/samples/piano/A4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/A4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/A4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A4.wav
--------------------------------------------------------------------------------
/public/samples/piano/A5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/A5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/A5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A5.wav
--------------------------------------------------------------------------------
/public/samples/piano/A6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/A6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/A6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A6.wav
--------------------------------------------------------------------------------
/public/samples/piano/A7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/A7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/A7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/A7.wav
--------------------------------------------------------------------------------
/public/samples/piano/As1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/As1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/As1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As1.wav
--------------------------------------------------------------------------------
/public/samples/piano/As2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/As2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/As2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As2.wav
--------------------------------------------------------------------------------
/public/samples/piano/As3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/As3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/As3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As3.wav
--------------------------------------------------------------------------------
/public/samples/piano/As4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/As4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/As4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As4.wav
--------------------------------------------------------------------------------
/public/samples/piano/As5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/As5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/As5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As5.wav
--------------------------------------------------------------------------------
/public/samples/piano/As6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/As6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/As6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As6.wav
--------------------------------------------------------------------------------
/public/samples/piano/As7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/As7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/As7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/As7.wav
--------------------------------------------------------------------------------
/public/samples/piano/B1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/B1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/B1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B1.wav
--------------------------------------------------------------------------------
/public/samples/piano/B2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/B2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/B2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B2.wav
--------------------------------------------------------------------------------
/public/samples/piano/B3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/B3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/B3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B3.wav
--------------------------------------------------------------------------------
/public/samples/piano/B4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/B4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/B4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B4.wav
--------------------------------------------------------------------------------
/public/samples/piano/B5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/B5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/B5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B5.wav
--------------------------------------------------------------------------------
/public/samples/piano/B6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/B6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/B6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B6.wav
--------------------------------------------------------------------------------
/public/samples/piano/B7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/B7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/B7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/B7.wav
--------------------------------------------------------------------------------
/public/samples/piano/C1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/C1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/C1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C1.wav
--------------------------------------------------------------------------------
/public/samples/piano/C2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/C2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/C2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C2.wav
--------------------------------------------------------------------------------
/public/samples/piano/C3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/C3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/C3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C3.wav
--------------------------------------------------------------------------------
/public/samples/piano/C4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/C4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/C4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C4.wav
--------------------------------------------------------------------------------
/public/samples/piano/C5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/C5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/C5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C5.wav
--------------------------------------------------------------------------------
/public/samples/piano/C6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/C6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/C6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C6.wav
--------------------------------------------------------------------------------
/public/samples/piano/C7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/C7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/C7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C7.wav
--------------------------------------------------------------------------------
/public/samples/piano/C8.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C8.mp3
--------------------------------------------------------------------------------
/public/samples/piano/C8.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C8.ogg
--------------------------------------------------------------------------------
/public/samples/piano/C8.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/C8.wav
--------------------------------------------------------------------------------
/public/samples/piano/Cs1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Cs1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Cs1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs1.wav
--------------------------------------------------------------------------------
/public/samples/piano/Cs2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Cs2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Cs2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs2.wav
--------------------------------------------------------------------------------
/public/samples/piano/Cs3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Cs3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Cs3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs3.wav
--------------------------------------------------------------------------------
/public/samples/piano/Cs4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Cs4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Cs4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs4.wav
--------------------------------------------------------------------------------
/public/samples/piano/Cs5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Cs5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Cs5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs5.wav
--------------------------------------------------------------------------------
/public/samples/piano/Cs6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Cs6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Cs6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs6.wav
--------------------------------------------------------------------------------
/public/samples/piano/Cs7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Cs7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Cs7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Cs7.wav
--------------------------------------------------------------------------------
/public/samples/piano/D1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/D1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/D1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D1.wav
--------------------------------------------------------------------------------
/public/samples/piano/D2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/D2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/D2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D2.wav
--------------------------------------------------------------------------------
/public/samples/piano/D3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/D3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/D3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D3.wav
--------------------------------------------------------------------------------
/public/samples/piano/D4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/D4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/D4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D4.wav
--------------------------------------------------------------------------------
/public/samples/piano/D5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/D5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/D5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D5.wav
--------------------------------------------------------------------------------
/public/samples/piano/D6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/D6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/D6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D6.wav
--------------------------------------------------------------------------------
/public/samples/piano/D7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/D7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/D7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/D7.wav
--------------------------------------------------------------------------------
/public/samples/piano/Ds1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Ds1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Ds1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds1.wav
--------------------------------------------------------------------------------
/public/samples/piano/Ds2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Ds2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Ds2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds2.wav
--------------------------------------------------------------------------------
/public/samples/piano/Ds3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Ds3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Ds3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds3.wav
--------------------------------------------------------------------------------
/public/samples/piano/Ds4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Ds4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Ds4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds4.wav
--------------------------------------------------------------------------------
/public/samples/piano/Ds5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Ds5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Ds5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds5.wav
--------------------------------------------------------------------------------
/public/samples/piano/Ds6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Ds6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Ds6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds6.wav
--------------------------------------------------------------------------------
/public/samples/piano/Ds7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Ds7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Ds7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Ds7.wav
--------------------------------------------------------------------------------
/public/samples/piano/E1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/E1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/E1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E1.wav
--------------------------------------------------------------------------------
/public/samples/piano/E2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/E2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/E2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E2.wav
--------------------------------------------------------------------------------
/public/samples/piano/E3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/E3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/E3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E3.wav
--------------------------------------------------------------------------------
/public/samples/piano/E4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/E4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/E4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E4.wav
--------------------------------------------------------------------------------
/public/samples/piano/E5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/E5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/E5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E5.wav
--------------------------------------------------------------------------------
/public/samples/piano/E6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/E6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/E6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E6.wav
--------------------------------------------------------------------------------
/public/samples/piano/E7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/E7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/E7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/E7.wav
--------------------------------------------------------------------------------
/public/samples/piano/F1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/F1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/F1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F1.wav
--------------------------------------------------------------------------------
/public/samples/piano/F2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/F2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/F2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F2.wav
--------------------------------------------------------------------------------
/public/samples/piano/F3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/F3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/F3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F3.wav
--------------------------------------------------------------------------------
/public/samples/piano/F4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/F4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/F4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F4.wav
--------------------------------------------------------------------------------
/public/samples/piano/F5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/F5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/F5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F5.wav
--------------------------------------------------------------------------------
/public/samples/piano/F6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/F6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/F6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F6.wav
--------------------------------------------------------------------------------
/public/samples/piano/F7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/F7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/F7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/F7.wav
--------------------------------------------------------------------------------
/public/samples/piano/Fs1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Fs1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Fs1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs1.wav
--------------------------------------------------------------------------------
/public/samples/piano/Fs2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Fs2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Fs2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs2.wav
--------------------------------------------------------------------------------
/public/samples/piano/Fs3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Fs3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Fs3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs3.wav
--------------------------------------------------------------------------------
/public/samples/piano/Fs4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Fs4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Fs4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs4.wav
--------------------------------------------------------------------------------
/public/samples/piano/Fs5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Fs5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Fs5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs5.wav
--------------------------------------------------------------------------------
/public/samples/piano/Fs6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Fs6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Fs6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs6.wav
--------------------------------------------------------------------------------
/public/samples/piano/Fs7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Fs7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Fs7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Fs7.wav
--------------------------------------------------------------------------------
/public/samples/piano/G1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/G1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/G1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G1.wav
--------------------------------------------------------------------------------
/public/samples/piano/G2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/G2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/G2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G2.wav
--------------------------------------------------------------------------------
/public/samples/piano/G3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/G3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/G3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G3.wav
--------------------------------------------------------------------------------
/public/samples/piano/G4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/G4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/G4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G4.wav
--------------------------------------------------------------------------------
/public/samples/piano/G5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/G5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/G5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G5.wav
--------------------------------------------------------------------------------
/public/samples/piano/G6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/G6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/G6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G6.wav
--------------------------------------------------------------------------------
/public/samples/piano/G7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/G7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/G7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/G7.wav
--------------------------------------------------------------------------------
/public/samples/piano/Gs1.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs1.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Gs1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs1.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Gs1.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs1.wav
--------------------------------------------------------------------------------
/public/samples/piano/Gs2.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs2.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Gs2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs2.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Gs2.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs2.wav
--------------------------------------------------------------------------------
/public/samples/piano/Gs3.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs3.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Gs3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs3.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Gs3.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs3.wav
--------------------------------------------------------------------------------
/public/samples/piano/Gs4.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs4.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Gs4.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs4.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Gs4.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs4.wav
--------------------------------------------------------------------------------
/public/samples/piano/Gs5.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs5.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Gs5.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs5.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Gs5.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs5.wav
--------------------------------------------------------------------------------
/public/samples/piano/Gs6.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs6.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Gs6.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs6.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Gs6.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs6.wav
--------------------------------------------------------------------------------
/public/samples/piano/Gs7.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs7.mp3
--------------------------------------------------------------------------------
/public/samples/piano/Gs7.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs7.ogg
--------------------------------------------------------------------------------
/public/samples/piano/Gs7.wav:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myanvoos/algoMIDI/5f05684219829b74236a36d6c40b83edaa7e3189/public/samples/piano/Gs7.wav
--------------------------------------------------------------------------------
/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
26 |
--------------------------------------------------------------------------------
/src/assets/vue.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/Studio.vue:
--------------------------------------------------------------------------------
1 |
130 |
131 |
132 |
133 |
136 |
137 | Loading sound samples...
138 |
139 |
147 |
148 |
149 |
150 |
160 |
161 |
Note: Since you're on a mobile device, you can only play the cellular automata. If you want to try out the graph BFS/DFS, please revisit this site on a desktop device!
162 |
163 |
164 |
165 |
173 |
174 |
175 |
176 |
177 |
178 |
212 |
--------------------------------------------------------------------------------
/src/components/maths/CASettings.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
13 |
14 |
15 |
16 |
Tempo
17 |
18 | updatePlaybackTempo(Number((e.target as HTMLSelectElement).value))"
21 | class="tempo-select"
22 | >
23 | 60 BPM
24 | 120 BPM
25 | 180 BPM
26 | 240 BPM
27 |
28 |
29 |
30 |
31 |
32 |
Preset Layouts
33 |
34 |
41 | {{ preset.name }}
42 |
43 |
44 |
45 |
46 |
47 |
Custom Rules
48 |
55 |
56 | Format: B3/S2,3 (Born with 3 neighbors, Survives with 2 or 3 neighbors)
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
108 |
109 |
169 |
--------------------------------------------------------------------------------
/src/components/maths/CellularAutomata.vue:
--------------------------------------------------------------------------------
1 |
163 |
164 |
165 |
166 |
167 |
--------------------------------------------------------------------------------
/src/components/maths/Graph.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Layout:
6 | layout = (e.target as HTMLSelectElement).value"
9 | class="p-2 rounded-md bg-transparent text-white"
10 | >
11 | {{ opt }}
12 |
13 | updateSearchStrategy((e.target as HTMLSelectElement).value)"
16 | class="p-2 rounded-md bg-transparent text-white"
17 | >
18 | {{ strat.name }}
19 |
20 |
21 |
22 |
29 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
509 |
510 |
--------------------------------------------------------------------------------
/src/components/maths/MathsCanvas.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
24 | ({{ cellularAutomataRules }})
25 |
26 |
27 |
33 | ({{ cellularAutomataRules }})
34 |
35 |
38 |
39 |
48 |
49 |
50 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
129 |
130 |
131 |
--------------------------------------------------------------------------------
/src/components/piano/Piano.vue:
--------------------------------------------------------------------------------
1 |
35 |
36 |
37 |
38 |
39 |
42 |
43 |
49 |
57 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
101 |
--------------------------------------------------------------------------------
/src/components/piano/PianoKeys.vue:
--------------------------------------------------------------------------------
1 |
76 |
77 |
78 |
110 |
111 |
112 |
--------------------------------------------------------------------------------
/src/components/tracks/TrackControl.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 | handleEditTrackName(e.target as HTMLInputElement)"
14 | class="bg-transparent"
15 | />
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/components/tracks/TrackView.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Tracks
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | Loading tracks...
13 |
14 |
15 |
16 | {{ error }}
17 |
18 |
19 |
20 | No tracks available.
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/src/composables/cellular-automata/useAutomata.ts:
--------------------------------------------------------------------------------
1 | import { Header } from "@tonejs/midi"
2 | import { Note } from "@tonejs/midi/dist/Note"
3 | import * as Tone from "tone"
4 | import { computed, ref, watch } from "vue"
5 |
6 | export interface AutomataConfig {
7 | gridSize: number
8 | scale: "major" | "minor" | "chromatic"
9 | rootNote: string
10 | rules: string
11 | }
12 |
13 | export interface Cell {
14 | note: Note
15 | isOn: boolean
16 | isRightmostChild: boolean
17 | }
18 |
19 | export const useAutomata = (config: AutomataConfig) => {
20 | const baseNotes = [
21 | "C",
22 | "C#",
23 | "D",
24 | "D#",
25 | "E",
26 | "F",
27 | "F#",
28 | "G",
29 | "G#",
30 | "A",
31 | "A#",
32 | "B",
33 | ]
34 |
35 | const SCALE_INTERVALS = {
36 | major: [0, 2, 4, 5, 7, 9, 11], // Major scale (Ionian mode)
37 | minor: [0, 2, 3, 5, 7, 8, 10], // Natural minor scale (Aeolian mode)
38 | chromatic: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
39 | }
40 |
41 | const createNoteGrid = (config: AutomataConfig): Cell[][] => {
42 | const grid: Cell[][] = []
43 |
44 | const rootIndex = baseNotes.findIndex((note) => note === config.rootNote)
45 | if (rootIndex === -1) throw new Error("Invalid root note")
46 |
47 | const intervals = SCALE_INTERVALS[config.scale]
48 | const scaleNotes = intervals.map(
49 | (interval) => baseNotes[(rootIndex + interval) % 12],
50 | )
51 |
52 | for (let row = 0; row < config.gridSize; row++) {
53 | const gridRow: Cell[] = []
54 |
55 | for (let col = 0; col < config.gridSize; col++) {
56 | const noteName = scaleNotes[(row + col) % scaleNotes.length]
57 | const baseOctave = row % 2 === 0 ? 2 : 3
58 | const octaveOffset = Math.min(
59 | 2,
60 | Math.floor((row + col) / scaleNotes.length),
61 | )
62 | const octave = baseOctave + octaveOffset
63 | const noteId = `${noteName}${octave}`
64 |
65 | // velocity between 0.3 and 0.8 for more musical dynamics
66 | const velocity = 0.3 + Math.random() * 0.8
67 |
68 | const note = new Note(
69 | {
70 | midi: Tone.Frequency(noteId).toMidi(),
71 | velocity: velocity,
72 | ticks: 0,
73 | },
74 | {
75 | ticks: Tone.Time("4n").toTicks(),
76 | velocity: velocity * 0.8, // release velocity slightly lower for softer release
77 | },
78 | new Header(),
79 | )
80 |
81 | gridRow.push({
82 | note,
83 | isOn: false,
84 | isRightmostChild: false,
85 | })
86 | }
87 | grid.push(gridRow)
88 | }
89 | return grid
90 | }
91 |
92 | const currentCells = ref(createNoteGrid(config))
93 | const nextCells = ref([])
94 |
95 | const rowCount = computed(() => currentCells.value.length)
96 | const columnCount = computed(() => currentCells.value[0].length)
97 |
98 | const parseRules = (rules: string): { born: number[]; survive: number[] } => {
99 | const [born, survive] = rules.split("/")
100 | return {
101 | born: born.slice(1).split(",").map(Number),
102 | survive: survive.slice(1).split(",").map(Number),
103 | }
104 | }
105 |
106 | const rules = ref(config.rules)
107 | const parsedRules = ref(parseRules(rules.value))
108 |
109 | watch(config, (newConfig) => {
110 | parsedRules.value = parseRules(newConfig.rules)
111 | })
112 |
113 | const deepCloneCells = (cells: Cell[][]): Cell[][] => {
114 | return cells.map((row) => row.map((cell) => ({ ...cell })))
115 | }
116 |
117 | const clearRightmostFlags = (grid: Cell[][]): void => {
118 | for (let row = 0; row < rowCount.value; row++) {
119 | for (let column = 0; column < columnCount.value; column++) {
120 | grid[row][column].isRightmostChild = false
121 | }
122 | }
123 | }
124 |
125 | const countNeighbours = (row: number, column: number): number => {
126 | let count = 0
127 | for (let i = -1; i <= 1; i++) {
128 | const neighborRow = (row + i + rowCount.value) % rowCount.value
129 | for (let j = -1; j <= 1; j++) {
130 | if (i === 0 && j === 0) continue
131 | const neighborCol = (column + j + columnCount.value) % columnCount.value
132 | if (currentCells.value[neighborRow][neighborCol].isOn) {
133 | count++
134 | }
135 | }
136 | }
137 | return count
138 | }
139 |
140 | const markRightmostCells = (
141 | rightmostNewAliveNotes: Map,
142 | ): void => {
143 | for (const [row, { column }] of rightmostNewAliveNotes.entries()) {
144 | nextCells.value[row][column].isRightmostChild = true
145 | }
146 | }
147 |
148 | const getActiveNotes = (
149 | rightmostNewAliveNotes: Map,
150 | ): Set => {
151 | const activeNotes: Set = new Set()
152 | for (const { note } of rightmostNewAliveNotes.values()) {
153 | activeNotes.add(note)
154 | }
155 | return activeNotes
156 | }
157 |
158 | const clearGrid = () => {
159 | for (let row = 0; row < rowCount.value; row++) {
160 | for (let column = 0; column < columnCount.value; column++) {
161 | currentCells.value[row][column].isOn = false
162 | }
163 | }
164 | currentCells.value = deepCloneCells(currentCells.value)
165 | }
166 |
167 | const updateAutomata = () => {
168 | nextCells.value = deepCloneCells(currentCells.value)
169 | clearRightmostFlags(nextCells.value)
170 |
171 | const rightmostNewAliveNotes = new Map<
172 | number,
173 | { column: number; note: Note }
174 | >()
175 |
176 | for (let row = 0; row < rowCount.value; row++) {
177 | for (let column = 0; column < columnCount.value; column++) {
178 | const neighbours = countNeighbours(row, column)
179 | const cellIsOn = currentCells.value[row][column].isOn
180 | let newCellState = cellIsOn
181 |
182 | if (cellIsOn) {
183 | newCellState = parsedRules.value.survive.includes(neighbours)
184 | } else {
185 | newCellState = parsedRules.value.born.includes(neighbours)
186 | }
187 |
188 | nextCells.value[row][column].isOn = newCellState
189 |
190 | if (!cellIsOn && newCellState) {
191 | if (
192 | !rightmostNewAliveNotes.has(row) ||
193 | column > rightmostNewAliveNotes.get(row)!.column
194 | ) {
195 | rightmostNewAliveNotes.set(row, {
196 | column,
197 | note: nextCells.value[row][column].note,
198 | })
199 | }
200 | }
201 | }
202 | }
203 | markRightmostCells(rightmostNewAliveNotes)
204 | currentCells.value = deepCloneCells(nextCells.value)
205 | return getActiveNotes(rightmostNewAliveNotes)
206 | }
207 | return {
208 | currentCells,
209 | rowCount,
210 | columnCount,
211 | updateAutomata,
212 | clearGrid,
213 | countNeighbours, // for testing
214 | }
215 | }
216 |
--------------------------------------------------------------------------------
/src/composables/cellular-automata/useAutomataRenderer.ts:
--------------------------------------------------------------------------------
1 | import type { Note } from "@tonejs/midi/dist/Note"
2 | import type p5 from "p5"
3 | import { type Ref, computed, watch } from "vue"
4 | import type { AutomataConfig, Cell } from "./useAutomata"
5 |
6 | export interface AutomataState {
7 | cellSize: number
8 | currentCells: Cell[][]
9 | rowCount: number
10 | columnCount: number
11 | isPlaying: boolean
12 | }
13 |
14 | interface AutomataRendererConfig {
15 | automataConfig: Ref
16 | automataState: Ref
17 | callbacks: {
18 | onCellToggled: (payload: {
19 | note: Note
20 | isOn: boolean
21 | source: string
22 | }) => void
23 | onGridUpdated: () => void
24 | onGridIsClear: () => void
25 | }
26 | }
27 |
28 | export const useAutomataRenderer = (config: AutomataRendererConfig) => {
29 | const calculateCellSize = (p5: p5) => {
30 | const smallestDimension = Math.min(p5.width, p5.height)
31 | config.automataState.value.cellSize = Math.floor(
32 | smallestDimension / config.automataConfig.value.gridSize,
33 | )
34 | }
35 |
36 | const drawGrid = (p5: p5) => {
37 | if (config.automataState.value.cellSize === 0) {
38 | calculateCellSize(p5)
39 | }
40 |
41 | p5.stroke("slategray")
42 | p5.textAlign(p5.CENTER, p5.CENTER)
43 | p5.textSize(config.automataState.value.cellSize / 3)
44 |
45 | config.automataState.value.currentCells.forEach((row, rowIndex) => {
46 | row.forEach((cell, colIndex) => {
47 | const currentColumn = colIndex % config.automataState.value.columnCount
48 |
49 | if (cell.isOn)
50 | p5.fill(cell.isRightmostChild ? "lightskyblue" : "#213547")
51 | else p5.fill(255)
52 |
53 | p5.square(
54 | currentColumn * config.automataState.value.cellSize,
55 | rowIndex * config.automataState.value.cellSize,
56 | config.automataState.value.cellSize,
57 | )
58 |
59 | if (cell.isOn) {
60 | if (cell.isRightmostChild) p5.fill("#213547")
61 | else p5.fill(255)
62 | p5.text(
63 | `${cell.note.name}`,
64 | currentColumn * config.automataState.value.cellSize +
65 | config.automataState.value.cellSize / 2,
66 | rowIndex * config.automataState.value.cellSize +
67 | config.automataState.value.cellSize / 2,
68 | )
69 | }
70 | })
71 | })
72 | }
73 |
74 | const handleMouseClick = (p5: p5) => {
75 | if (!config.automataState.value.isPlaying) {
76 | const row = Math.floor(p5.mouseY / config.automataState.value.cellSize)
77 | if (row < 0 || row >= config.automataState.value.rowCount) return
78 |
79 | let adjustedMouseX = p5.mouseX
80 | if (adjustedMouseX < 0)
81 | adjustedMouseX +=
82 | config.automataState.value.columnCount *
83 | config.automataState.value.cellSize
84 | const column =
85 | Math.floor(adjustedMouseX / config.automataState.value.cellSize) %
86 | config.automataState.value.columnCount
87 |
88 | if (column < 0 || column >= config.automataState.value.columnCount) return
89 | const cell = config.automataState.value.currentCells[row][column]
90 | cell.isOn = !cell.isOn
91 | config.callbacks.onCellToggled({
92 | note: cell.note,
93 | isOn: cell.isOn,
94 | source: "ca",
95 | })
96 | p5.redraw()
97 | }
98 | }
99 |
100 | const updateGrid = () => {
101 | if (config.automataState.value.isPlaying) {
102 | config.callbacks.onGridUpdated()
103 | }
104 | }
105 |
106 | const clearGridDisplay = (p5: p5) => {
107 | p5.background(255)
108 | drawGrid(p5)
109 | }
110 |
111 | return {
112 | drawGrid,
113 | handleMouseClick,
114 | updateGrid,
115 | clearGridDisplay,
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/src/composables/useKeyboardGenerator.ts:
--------------------------------------------------------------------------------
1 | import { Header } from "@tonejs/midi"
2 | import { Note } from "@tonejs/midi/dist/Note"
3 | import * as Tone from "tone"
4 | import { ref } from "vue"
5 |
6 | export const baseNotes = [
7 | "C",
8 | "C#",
9 | "D",
10 | "D#",
11 | "E",
12 | "F",
13 | "F#",
14 | "G",
15 | "G#",
16 | "A",
17 | "A#",
18 | "B",
19 | ]
20 |
21 | export const generateFullKeyboard = (): Note[] => {
22 | const keys: Note[] = []
23 | const startOctave = 0
24 | const endOctave = 8
25 |
26 | for (let octave = startOctave; octave <= endOctave; octave++) {
27 | baseNotes.forEach((noteName) => {
28 | // Skip notes below A0 (first note on a piano)
29 | if (
30 | octave === 0 &&
31 | ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"].includes(noteName)
32 | ) {
33 | return
34 | }
35 |
36 | // Only include C8 (last note on a piano)
37 | if (octave === endOctave && noteName !== "C") {
38 | return
39 | }
40 |
41 | const noteId = `${noteName}${octave}`
42 |
43 | const note = new Note(
44 | {
45 | midi: Tone.Frequency(noteId).toMidi(),
46 | velocity: 0.7,
47 | ticks: 0,
48 | },
49 | {
50 | ticks: Tone.Time("4n").toTicks(),
51 | velocity: 0.5,
52 | },
53 | new Header(),
54 | )
55 |
56 | keys.push(note)
57 | })
58 | }
59 |
60 | return keys
61 | }
62 |
63 | export function useKeyboardGenerator() {
64 | const keyboard = ref(generateFullKeyboard())
65 |
66 | const regenerateKeyboard = () => {
67 | keyboard.value = generateFullKeyboard()
68 | }
69 |
70 | return {
71 | keyboard,
72 | regenerateKeyboard,
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/src/composables/useMultiTransport.ts:
--------------------------------------------------------------------------------
1 | import * as Tone from "tone"
2 | import { onUnmounted, ref } from "vue"
3 |
4 | interface TransportConfig {
5 | playbackTempo?: number
6 | onStop?: () => void
7 | }
8 |
9 | export function useMultiTransport(id: string, config: TransportConfig = {}) {
10 | const isPlaying = ref(false)
11 | const transportError = ref(null)
12 | // Create a dedicated transport instance
13 | const transport = Tone.getTransport()
14 |
15 | const togglePlayPause = async () => {
16 | try {
17 | if (isPlaying.value) {
18 | transport.pause()
19 | isPlaying.value = false
20 | } else {
21 | await Tone.start()
22 | transport.start()
23 | isPlaying.value = true
24 | }
25 | } catch (err) {
26 | transportError.value =
27 | err instanceof Error ? err : new Error("Unknown error occurred")
28 | console.error(`Transport ${id} error:`, transportError.value)
29 | }
30 | }
31 |
32 | const initialiseTransport = () => {
33 | console.log(`Initialising transport ${id}`)
34 | transport.stop()
35 | transport.bpm.value = config.playbackTempo ?? 120
36 | }
37 |
38 | const cleanup = () => {
39 | console.log(`Cleaning up transport ${id}`)
40 | transport.stop()
41 | transport.cancel()
42 | transport.dispose()
43 | }
44 |
45 | const handleStop = () => {
46 | console.log(`Handling stop for transport ${id}`)
47 | config.onStop?.()
48 | transport.stop()
49 | isPlaying.value = false
50 | }
51 |
52 | onUnmounted(cleanup)
53 |
54 | return {
55 | transport, // transport instance
56 | isPlaying,
57 | transportError,
58 | togglePlayPause,
59 | initialiseTransport,
60 | handleStop,
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/src/composables/useP5Canvas.ts:
--------------------------------------------------------------------------------
1 | import p5 from "p5"
2 | import { type Ref, onUnmounted, ref } from "vue"
3 |
4 | export interface P5CanvasConfig {
5 | width: number
6 | height: number
7 | frameRate: number
8 | backgroundColour: string
9 | canvasContainer: HTMLElement | null
10 | }
11 |
12 | interface RenderCallbacks {
13 | onSetup?: (p5: p5) => void
14 | onDraw?: (p5: p5) => void
15 | onMouseClicked?: (p5: p5) => void
16 | beforeLoop?: () => void
17 | afterLoop?: () => void
18 | }
19 |
20 | export function useP5Canvas() {
21 | const p5Instance = ref(null)
22 |
23 | const createSketch = (
24 | config: Ref,
25 | callbacks: RenderCallbacks,
26 | ) => {
27 | return (p5: p5) => {
28 | p5.setup = () => {
29 | console.log("Setup running with config:", {
30 | width: config.value.width,
31 | height: config.value.height,
32 | container: config.value.canvasContainer,
33 | })
34 |
35 | const canvas = p5.createCanvas(config.value.width, config.value.height)
36 | canvas.parent(config.value.canvasContainer!)
37 | canvas.mouseClicked(callbacks.onMouseClicked || (() => {}))
38 |
39 | p5.frameRate(config.value.frameRate)
40 | p5.background(config.value.backgroundColour)
41 | p5.noLoop()
42 |
43 | callbacks.onSetup?.(p5)
44 | }
45 |
46 | p5.draw = () => {
47 | p5.background(config.value.backgroundColour)
48 | callbacks.beforeLoop?.()
49 | callbacks.onDraw?.(p5)
50 | callbacks.afterLoop?.()
51 | }
52 | }
53 | }
54 |
55 | const cleanup = () => {
56 | if (p5Instance.value) {
57 | p5Instance.value.remove()
58 | p5Instance.value = null
59 | }
60 | }
61 | const initCanvas = (
62 | sketch: (p: p5) => void,
63 | container: HTMLElement | null,
64 | ) => {
65 | cleanup()
66 | if (container) {
67 | try {
68 | p5Instance.value = new p5(sketch, container)
69 | } catch (error) {
70 | console.error("Failed to initialize p5 canvas:", error)
71 | }
72 | } else {
73 | console.error("Canvas container element is null.")
74 | }
75 | }
76 |
77 | const redraw = () => {
78 | if (p5Instance.value) {
79 | p5Instance.value.redraw()
80 | }
81 | }
82 |
83 | onUnmounted(cleanup)
84 |
85 | return {
86 | p5Instance,
87 | initCanvas,
88 | createSketch,
89 | redraw,
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/src/composables/usePianoSampler.ts:
--------------------------------------------------------------------------------
1 | import * as Tone from "tone"
2 | import type { Sampler } from "tone"
3 | import { onUnmounted, ref } from "vue"
4 |
5 | interface SamplerConfig {
6 | urls: Record
7 | release: number
8 | baseUrl: string
9 | }
10 |
11 | const DEFAULT_SAMPLER_CONFIG: SamplerConfig = {
12 | urls: {
13 | C4: "C4.mp3", // Tone.js will interpolate the rest of the notes
14 | G4: "G4.mp3",
15 | C5: "C5.mp3",
16 | },
17 | release: 1,
18 | baseUrl: "/samples/piano/", // Using base grand piano sampler for now
19 | }
20 |
21 | // global singleton instance
22 | let globalSampler: Sampler | null = null
23 |
24 | export function usePianoSampler(
25 | config: SamplerConfig = DEFAULT_SAMPLER_CONFIG,
26 | ) {
27 | const samplerLoaded = ref(false)
28 | const samplerError = ref(null)
29 |
30 | // Only create a new sampler if one doesn't exist
31 | if (!globalSampler) {
32 | globalSampler = new Tone.Sampler({
33 | ...config,
34 | onload: () => {
35 | console.log("Sampler loaded successfully")
36 | samplerLoaded.value = true
37 | },
38 | onerror: (err) => {
39 | console.error("Error loading sampler:", err)
40 | samplerError.value = err
41 | },
42 | attack: 0,
43 | curve: "exponential",
44 | }).toDestination()
45 | }
46 |
47 | const cleanup = () => {
48 | if (globalSampler) {
49 | globalSampler.dispose()
50 | globalSampler = null
51 | }
52 | }
53 |
54 | onUnmounted(cleanup)
55 |
56 | return {
57 | sampler: globalSampler,
58 | samplerLoaded,
59 | samplerError,
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/src/composables/useTrackControl.ts:
--------------------------------------------------------------------------------
1 | import { Header, Track } from "@tonejs/midi"
2 | import { Note } from "@tonejs/midi/dist/Note"
3 | import * as Tone from "tone"
4 | import type { TransportClass } from "tone/build/esm/core/clock/Transport"
5 | import { nextTick, ref, watch } from "vue"
6 | import { useMultiTransport } from "./useMultiTransport"
7 | import { useTrackState } from "./useTrackState"
8 |
9 | interface TrackControlConfig {
10 | sampler: Tone.Sampler | null
11 | onStop: () => void
12 | transport?: TransportClass
13 | }
14 |
15 | export function useTrackControl(id: string, config: TrackControlConfig) {
16 | const { currentTrack } = useTrackState()
17 | const { isPlaying } = useMultiTransport(id)
18 | const pressedKeys = ref>(new Set())
19 |
20 | watch(
21 | pressedKeys,
22 | (newPressedKeys) => {
23 | if (newPressedKeys.size === 0) {
24 | return
25 | }
26 |
27 | const transport = config.transport || Tone.getTransport()
28 | const currentTicks = transport.ticks
29 |
30 | currentTrack.value.track.notes = currentTrack.value.track.notes.filter(
31 | (note) => note.ticks !== currentTicks,
32 | )
33 |
34 | const notesToAdd: Note[] = Array.from(newPressedKeys).map((note) => {
35 | const newNote = new Note(
36 | {
37 | midi: Tone.Frequency(note.name).toMidi(),
38 | velocity: note.velocity,
39 | ticks: currentTicks,
40 | },
41 | {
42 | ticks: currentTicks + Tone.Time("4n").toTicks(),
43 | velocity: note.velocity * 0.8,
44 | },
45 | new Header(),
46 | )
47 | newNote.durationTicks = Tone.Time("4n").toTicks()
48 | return newNote
49 | })
50 |
51 | currentTrack.value.track.notes.push(...notesToAdd)
52 | currentTrack.value.track.notes.sort((a, b) => a.ticks - b.ticks)
53 | },
54 | { deep: true },
55 | )
56 |
57 | const handleCellToggled = (payload: { note: Note; isOn: boolean }) => {
58 | if (payload.isOn) {
59 | pressedKeys.value.add(payload.note)
60 | } else {
61 | pressedKeys.value.delete(payload.note)
62 | }
63 | // reassign to make sure pressedKeys is a new object
64 | pressedKeys.value = new Set(pressedKeys.value)
65 | }
66 |
67 | const handleClearGrid = () => {
68 | console.log("Clearing grid")
69 | pressedKeys.value.clear()
70 | pressedKeys.value = new Set(pressedKeys.value)
71 | }
72 |
73 | const handleGridUpdated = (activeNotes: Set) => {
74 | if (!config.sampler) return
75 |
76 | const currentNotes = new Set(pressedKeys.value)
77 | const hasChanged =
78 | activeNotes.size !== currentNotes.size ||
79 | Array.from(activeNotes).some((note) => !currentNotes.has(note))
80 |
81 | if (!hasChanged) return
82 |
83 | try {
84 | activeNotes.forEach((note) => {
85 | if (!config.sampler) return
86 | config.sampler.triggerAttackRelease(
87 | note.name,
88 | "4n",
89 | undefined,
90 | note.velocity,
91 | )
92 | })
93 | pressedKeys.value = activeNotes
94 | } catch (err) {
95 | console.error("Error playing notes:", err)
96 | }
97 | }
98 |
99 | const handleGridIsClear = async () => {
100 | config.onStop()
101 | isPlaying.value = false
102 | pressedKeys.value.clear()
103 | Tone.getTransport().stop()
104 | }
105 |
106 | const recordNote = (note: Note) => {
107 | const currentTicks = Tone.getTransport().ticks
108 | return {
109 | ...note,
110 | ticks: currentTicks,
111 | durationTicks: Tone.Time("4n").toTicks(),
112 | }
113 | }
114 |
115 | const playNote = (note: Note) => {
116 | if (!config.sampler) return
117 | config.sampler.triggerAttackRelease(
118 | note.name,
119 | "4n",
120 | undefined,
121 | note.velocity,
122 | )
123 | }
124 |
125 | return {
126 | pressedKeys,
127 | handleCellToggled,
128 | handleGridUpdated,
129 | handleGridIsClear,
130 | handleClearGrid,
131 | recordNote,
132 | playNote,
133 | updatePressedKeys: (keys: Set) => {
134 | pressedKeys.value = keys
135 | },
136 | }
137 | }
138 |
--------------------------------------------------------------------------------
/src/composables/useTrackState.ts:
--------------------------------------------------------------------------------
1 | import { Header, Track } from "@tonejs/midi"
2 | import { ref } from "vue"
3 | import type { TrackData } from "../services/db/types"
4 |
5 | // Make it a singleton to share state across composables
6 | const currentTrack = ref({
7 | id: crypto.randomUUID(),
8 | track: new Track([], new Header()),
9 | })
10 |
11 | export function useTrackState() {
12 | const updateCurrentTrack = (track: TrackData) => {
13 | currentTrack.value = track
14 | }
15 |
16 | return {
17 | currentTrack,
18 | updateCurrentTrack,
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import { createApp } from "vue"
2 | import "./style.css"
3 | import "primeicons/primeicons.css"
4 | import { inject } from "@vercel/analytics"
5 | import { createPinia } from "pinia"
6 | import PrimeVue from "primevue/config"
7 | import App from "./App.vue"
8 |
9 | // @ts-ignore
10 | import p5vue from "p5vue"
11 |
12 | const pinia = createPinia()
13 | const app = createApp(App)
14 | app.use(p5vue)
15 | app.use(pinia)
16 | app.use(PrimeVue)
17 | app.use(inject)
18 | app.mount("#app")
19 |
--------------------------------------------------------------------------------
/src/services/db/indexedDB.ts:
--------------------------------------------------------------------------------
1 | import { type IDBPDatabase, openDB } from "idb"
2 | import type { DBConfig } from "./types"
3 |
4 | export class IndexedDBService {
5 | private config: DBConfig
6 |
7 | constructor(config: DBConfig) {
8 | this.config = config
9 | }
10 |
11 | async initDB(): Promise {
12 | try {
13 | const db = await openDB(this.config.name, this.config.version, {
14 | upgrade: (db, oldVersion, newVersion, transaction) => {
15 | console.log("Upgrading db:", oldVersion, newVersion, transaction)
16 | if (!db.objectStoreNames.contains(this.config.storeName)) {
17 | db.createObjectStore(this.config.storeName, {
18 | keyPath: "id",
19 | autoIncrement: true,
20 | })
21 | }
22 | },
23 | })
24 | return db
25 | } catch (error) {
26 | console.error("Error opening database:", error)
27 | throw error
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/services/db/trackDB.ts:
--------------------------------------------------------------------------------
1 | import type { Track } from "@tonejs/midi"
2 | import { toRaw } from "vue"
3 | import { IndexedDBService } from "./indexedDB"
4 | import type { DBConfig, TrackData } from "./types"
5 |
6 | const DB_CONFIG: DBConfig = {
7 | name: "trackDB",
8 | version: 1,
9 | storeName: "tracks",
10 | } as const
11 |
12 | class TrackDBService extends IndexedDBService {
13 | constructor() {
14 | super(DB_CONFIG)
15 | }
16 |
17 | async addTrack(track: Track): Promise {
18 | const db = await this.initDB()
19 | const id = crypto.randomUUID()
20 |
21 | const plainTrack = JSON.parse(JSON.stringify(toRaw(track)))
22 | const trackData: TrackData = { track: plainTrack, id }
23 |
24 | const tx = db.transaction(DB_CONFIG.storeName, "readwrite")
25 | await tx.store.add(trackData)
26 | await tx.done
27 |
28 | return trackData
29 | }
30 |
31 | async getTrack(id: string) {
32 | const db = await this.initDB()
33 | return await db.get(DB_CONFIG.storeName, id)
34 | }
35 |
36 | async editTrack(id: string, track: Track) {
37 | try {
38 | const db = await this.initDB()
39 | const tx = db.transaction(DB_CONFIG.storeName, "readwrite")
40 | const store = tx.objectStore(DB_CONFIG.storeName)
41 | await store.put(track, id)
42 | await tx.done
43 | } catch (error) {
44 | console.error("Database operation failed:", error)
45 | throw error
46 | }
47 | }
48 |
49 | async getTracks() {
50 | try {
51 | const db = await this.initDB()
52 | const tx = db.transaction(DB_CONFIG.storeName, "readonly")
53 | const tracks = await tx.store.getAll()
54 | await tx.done
55 |
56 | return tracks
57 | } catch (error) {
58 | console.error("Failed to get tracks:", error)
59 | throw error
60 | }
61 | }
62 |
63 | async deleteTrack(id: string) {
64 | try {
65 | const db = await this.initDB()
66 | await db.delete(DB_CONFIG.storeName, id)
67 | } catch (error) {
68 | console.error("Failed to delete track:", error)
69 | throw error
70 | }
71 | }
72 |
73 | async clearAll() {
74 | console.log("Clearing all tracks")
75 | try {
76 | const db = await this.initDB()
77 | await db.clear(DB_CONFIG.storeName)
78 | } catch (error) {
79 | console.error("Failed to clear all tracks:", error)
80 | throw error
81 | }
82 | }
83 |
84 | async getTrackById(id: string) {
85 | const db = await this.initDB()
86 | return await db.get(DB_CONFIG.storeName, id)
87 | }
88 | }
89 |
90 | export const trackDB = new TrackDBService()
91 |
--------------------------------------------------------------------------------
/src/services/db/types.ts:
--------------------------------------------------------------------------------
1 | import type { Track } from "@tonejs/midi"
2 |
3 | export interface TrackData {
4 | id: string
5 | track: Track
6 | }
7 |
8 | export interface DBConfig {
9 | name: string
10 | version: number
11 | storeName: string
12 | }
13 |
--------------------------------------------------------------------------------
/src/stores/midiStore.ts:
--------------------------------------------------------------------------------
1 | import type { Track } from "@tonejs/midi"
2 | import { defineStore } from "pinia"
3 | import { trackDB } from "../services/db/trackDB"
4 |
5 | export const useMIDIStore = defineStore("midi", {
6 | state: () => ({
7 | tracks: [] as Array<{ id: string; track: Track }>,
8 | loading: false,
9 | error: null as string | null,
10 | }),
11 |
12 | actions: {
13 | async addTrack(track: Track) {
14 | this.loading = true
15 | try {
16 | const trackData = await trackDB.addTrack(track)
17 | this.tracks.push(trackData)
18 | } catch (error) {
19 | console.error("Error adding track:", error)
20 | this.error = error as string
21 | throw error
22 | } finally {
23 | this.loading = false
24 | console.log("DB state: ", this.tracks)
25 | }
26 | },
27 |
28 | async getTrack(id: string) {
29 | this.loading = true
30 | try {
31 | const trackData = await trackDB.getTrack(id)
32 | return trackData
33 | } catch (error) {
34 | console.error("Error getting track:", error)
35 | this.error = error as string
36 | throw error
37 | } finally {
38 | this.loading = false
39 | }
40 | },
41 |
42 | async getAllTracks() {
43 | this.loading = true
44 | try {
45 | const tracks = await trackDB.getTracks()
46 | return tracks
47 | } catch (error) {
48 | console.error("Error getting all tracks:", error)
49 | this.error = error as string
50 | throw error
51 | } finally {
52 | this.loading = false
53 | }
54 | },
55 |
56 | async deleteTrack(id: string) {
57 | this.loading = true
58 | try {
59 | await trackDB.deleteTrack(id)
60 | this.tracks = this.tracks.filter((track) => track.id !== id)
61 | } catch (error) {
62 | console.error("Error deleting track:", error)
63 | this.error = error as string
64 | throw error
65 | } finally {
66 | this.loading = false
67 | }
68 | },
69 |
70 | async clearAllTracks() {
71 | this.loading = true
72 | try {
73 | await trackDB.clearAll()
74 | this.tracks = []
75 | } catch (error) {
76 | console.error("Error deleting all tracks:", error)
77 | this.error = error as string
78 | throw error
79 | } finally {
80 | this.loading = false
81 | }
82 | },
83 | },
84 | })
85 |
--------------------------------------------------------------------------------
/src/style.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | :root {
6 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
7 | line-height: 1.5;
8 | font-weight: 400;
9 |
10 | color-scheme: light dark;
11 | color: rgba(255, 255, 255, 0.87);
12 | background-color: #233140;
13 |
14 | font-synthesis: none;
15 | text-rendering: optimizeLegibility;
16 | -webkit-font-smoothing: antialiased;
17 | -moz-osx-font-smoothing: grayscale;
18 | }
19 |
20 | a {
21 | font-weight: 500;
22 | color: #646cff;
23 | text-decoration: inherit;
24 | }
25 | a:hover {
26 | color: #535bf2;
27 | }
28 |
29 | body {
30 | margin: 0;
31 | display: flex;
32 | place-items: center;
33 | min-height: 100vh;
34 | width: 100%;
35 | overflow-x: hidden;
36 | }
37 |
38 | h1 {
39 | font-size: 3.2em;
40 | line-height: 1.1;
41 | }
42 |
43 | button {
44 | border-radius: 8px;
45 | border: 1px solid transparent;
46 | padding: 0.6em 1.2em;
47 | font-size: 1em;
48 | font-weight: 500;
49 | font-family: inherit;
50 | background-color: #1a1a1a;
51 | cursor: pointer;
52 | transition: border-color 0.25s;
53 | }
54 | button:hover {
55 | border-color: #646cff;
56 | }
57 | button:focus,
58 | button:focus-visible {
59 | outline: 4px auto -webkit-focus-ring-color;
60 | }
61 |
62 | .card {
63 | padding: 2em;
64 | }
65 |
66 | #app {
67 | text-align: center;
68 | width: 100%;
69 | height: 100vh;
70 | display: flex;
71 | justify-content: center;
72 | align-items: center;
73 | }
74 |
75 | @media (prefers-color-scheme: light) {
76 | :root {
77 | color: #213547;
78 | background-color: #ffffff;
79 | }
80 | a:hover {
81 | color: lightskyblue;
82 | }
83 | button {
84 | background-color: #f9f9f9;
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"],
3 | theme: {
4 | extend: {},
5 | },
6 | plugins: [],
7 | }
8 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "esnext",
4 | "module": "esnext",
5 | "moduleResolution": "node",
6 | "strict": true,
7 | "esModuleInterop": true,
8 | "jsx": "preserve",
9 | "lib": ["dom", "esnext"],
10 | "types": ["jest", "node"]
11 | },
12 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
13 | "exclude": ["node_modules"]
14 | }
15 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import vue from "@vitejs/plugin-vue"
2 | import { defineConfig } from "vite"
3 |
4 | // https://vite.dev/config/
5 | export default defineConfig({
6 | plugins: [vue()],
7 | build: {
8 | outDir: "dist",
9 | assetsDir: "assets",
10 | copyPublicDir: true,
11 | emptyOutDir: true,
12 | },
13 | })
14 |
--------------------------------------------------------------------------------
| |