* Fixed cache misimplementation and reinstalled canvas package with correct node version (17) works on prod docker compose but not on dev so :) * Fixed type definition of SongCursorInfos fixed 'race conditions' in asset generation service removed hard coded cursor infos fixed tsc looking to build folders * Front: Basic Load of piano sounds * Front: Use store for piano notes * WIP * Front: Native Sound playing * Front: fix type * Front: Play all notes under cursor * Docker: Force running backend on amd64 * Front: Rebase, and add native metronome sound * Front: Metronome: Use icons from iconsax * Poof, it typechecks * Front: add missing ref * Now callback is called with the first note * Front: Fix Native build w/ requires * Front: Try bumping rn version * Front: CI: Attempt to make things work * Front: Pretty * Front: Make sounds sound better --------- Co-authored-by: Clément Le Bihan <clement.lebihan773@gmail.com>
121 lines
4.5 KiB
TypeScript
121 lines
4.5 KiB
TypeScript
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|
import { Audio } from 'expo-av';
|
|
|
|
type MidiNumber = number;
|
|
|
|
// Source: https://computermusicresource.com/midikeys.html
|
|
// Deserve an extra credit for doing this by hand
|
|
// The value is the value returned by `required`, needed by Expo to load/play the sound
|
|
export const PianoNotes = {
|
|
33: require('../assets/piano/a0.mp3'),
|
|
45: require('../assets/piano/a1.mp3'),
|
|
57: require('../assets/piano/a2.mp3'),
|
|
69: require('../assets/piano/a3.mp3'),
|
|
81: require('../assets/piano/a4.mp3'),
|
|
93: require('../assets/piano/a5.mp3'),
|
|
105: require('../assets/piano/a6.mp3'),
|
|
117: require('../assets/piano/a7.mp3'),
|
|
44: require('../assets/piano/ab1.mp3'),
|
|
56: require('../assets/piano/ab2.mp3'),
|
|
68: require('../assets/piano/ab3.mp3'),
|
|
80: require('../assets/piano/ab4.mp3'),
|
|
92: require('../assets/piano/ab5.mp3'),
|
|
104: require('../assets/piano/ab6.mp3'),
|
|
116: require('../assets/piano/ab7.mp3'),
|
|
35: require('../assets/piano/b0.mp3'),
|
|
47: require('../assets/piano/b1.mp3'),
|
|
59: require('../assets/piano/b2.mp3'),
|
|
71: require('../assets/piano/b3.mp3'),
|
|
83: require('../assets/piano/b4.mp3'),
|
|
95: require('../assets/piano/b5.mp3'),
|
|
107: require('../assets/piano/b6.mp3'),
|
|
119: require('../assets/piano/b7.mp3'),
|
|
34: require('../assets/piano/bb0.mp3'),
|
|
46: require('../assets/piano/bb1.mp3'),
|
|
58: require('../assets/piano/bb2.mp3'),
|
|
70: require('../assets/piano/bb3.mp3'),
|
|
82: require('../assets/piano/bb4.mp3'),
|
|
94: require('../assets/piano/bb5.mp3'),
|
|
106: require('../assets/piano/bb6.mp3'),
|
|
118: require('../assets/piano/bb7.mp3'),
|
|
36: require('../assets/piano/c1.mp3'),
|
|
48: require('../assets/piano/c2.mp3'),
|
|
60: require('../assets/piano/c3.mp3'),
|
|
72: require('../assets/piano/c4.mp3'),
|
|
84: require('../assets/piano/c5.mp3'),
|
|
96: require('../assets/piano/c6.mp3'),
|
|
108: require('../assets/piano/c7.mp3'),
|
|
120: require('../assets/piano/c8.mp3'),
|
|
38: require('../assets/piano/d1.mp3'),
|
|
50: require('../assets/piano/d2.mp3'),
|
|
62: require('../assets/piano/d3.mp3'),
|
|
74: require('../assets/piano/d4.mp3'),
|
|
86: require('../assets/piano/d5.mp3'),
|
|
98: require('../assets/piano/d6.mp3'),
|
|
110: require('../assets/piano/d7.mp3'),
|
|
37: require('../assets/piano/db1.mp3'),
|
|
49: require('../assets/piano/db2.mp3'),
|
|
61: require('../assets/piano/db3.mp3'),
|
|
73: require('../assets/piano/db4.mp3'),
|
|
85: require('../assets/piano/db5.mp3'),
|
|
97: require('../assets/piano/db6.mp3'),
|
|
109: require('../assets/piano/db7.mp3'),
|
|
40: require('../assets/piano/e1.mp3'),
|
|
52: require('../assets/piano/e2.mp3'),
|
|
64: require('../assets/piano/e3.mp3'),
|
|
76: require('../assets/piano/e4.mp3'),
|
|
88: require('../assets/piano/e5.mp3'),
|
|
100: require('../assets/piano/e6.mp3'),
|
|
112: require('../assets/piano/e7.mp3'),
|
|
39: require('../assets/piano/eb1.mp3'),
|
|
51: require('../assets/piano/eb2.mp3'),
|
|
63: require('../assets/piano/eb3.mp3'),
|
|
75: require('../assets/piano/eb4.mp3'),
|
|
87: require('../assets/piano/eb5.mp3'),
|
|
99: require('../assets/piano/eb6.mp3'),
|
|
111: require('../assets/piano/eb7.mp3'),
|
|
41: require('../assets/piano/f1.mp3'),
|
|
53: require('../assets/piano/f2.mp3'),
|
|
65: require('../assets/piano/f3.mp3'),
|
|
77: require('../assets/piano/f4.mp3'),
|
|
89: require('../assets/piano/f5.mp3'),
|
|
101: require('../assets/piano/f6.mp3'),
|
|
113: require('../assets/piano/f7.mp3'),
|
|
43: require('../assets/piano/g1.mp3'),
|
|
55: require('../assets/piano/g2.mp3'),
|
|
67: require('../assets/piano/g3.mp3'),
|
|
79: require('../assets/piano/g4.mp3'),
|
|
91: require('../assets/piano/g5.mp3'),
|
|
103: require('../assets/piano/g6.mp3'),
|
|
115: require('../assets/piano/g7.mp3'),
|
|
42: require('../assets/piano/gb1.mp3'),
|
|
54: require('../assets/piano/gb2.mp3'),
|
|
66: require('../assets/piano/gb3.mp3'),
|
|
78: require('../assets/piano/gb4.mp3'),
|
|
90: require('../assets/piano/gb5.mp3'),
|
|
102: require('../assets/piano/gb6.mp3'),
|
|
114: require('../assets/piano/gb7.mp3'),
|
|
} as const;
|
|
|
|
export type Sounds = Record<MidiNumber, Audio.Sound>;
|
|
|
|
export const soundPlayerSlice = createSlice({
|
|
name: 'soundPlayer',
|
|
initialState: {
|
|
sounds: undefined as Sounds | undefined,
|
|
},
|
|
reducers: {
|
|
setSounds: (state, action: PayloadAction<Sounds>) => {
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
//@ts-expect-error
|
|
state.sounds = action.payload;
|
|
},
|
|
unsetSounds: (state) => {
|
|
Object.entries(state.sounds ?? {}).map((sound) => sound[1].unloadAsync());
|
|
state.sounds = undefined;
|
|
},
|
|
},
|
|
});
|
|
export const { setSounds, unsetSounds } = soundPlayerSlice.actions;
|
|
export default soundPlayerSlice.reducer;
|