Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | 21x 21x 21x 21x 21x 21x | /* eslint-disable camelcase */ import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import editorActions from "store/features/editor/editorActions"; export type PianoRollToolType = "pencil" | "eraser" | "selection" | null; export interface TrackerState { // status: "loading" | "error" | "loaded" | null, // error?: string; playing: boolean; playerReady: boolean; // song?: Song; octaveOffset: number; editStep: number; // modified: boolean; view: "tracker" | "roll"; tool: PianoRollToolType; defaultInstruments: [number, number, number, number]; selectedChannel: number; visibleChannels: number[]; hoverNote: number | null; hoverColumn: number | null; startPlaybackPosition: [number, number]; defaultStartPlaybackPosition: [number, number]; selectedPatternCells: number[]; selection: [number, number, number, number]; selectedEffectCell: number | null; subpatternEditorFocus: boolean; } export const initialState: TrackerState = { // status: null, // error: "", playing: false, playerReady: false, // song: null, octaveOffset: 0, editStep: 1, // modified: false, view: "roll", tool: "pencil", defaultInstruments: [0, 0, 0, 0], selectedChannel: 0, visibleChannels: [0, 1, 2, 3], hoverNote: null, hoverColumn: null, startPlaybackPosition: [0, 0], defaultStartPlaybackPosition: [0, 0], selectedPatternCells: [], selection: [-1, -1, -1, -1], selectedEffectCell: null, subpatternEditorFocus: false, }; const trackerSlice = createSlice({ name: "tracker", initialState, reducers: { init: (state) => ({ ...initialState, view: state.view }), playTracker: (state, _action: PayloadAction<void>) => { state.playing = true; }, pauseTracker: (state, _action: PayloadAction<void>) => { state.playing = false; }, stopTracker: (state, _action: PayloadAction<void>) => { state.playing = false; state.startPlaybackPosition = [...state.defaultStartPlaybackPosition]; }, playerReady: (state, _action: PayloadAction<boolean>) => { state.playerReady = _action.payload; }, toggleView: (state, _action: PayloadAction<"tracker" | "roll">) => { state.view = _action.payload; }, setHoverNote: (state, action: PayloadAction<number | null>) => { state.hoverNote = action.payload; }, setHoverColumn: (state, action: PayloadAction<number | null>) => { state.hoverColumn = action.payload; }, setTool: (state, _action: PayloadAction<PianoRollToolType>) => { state.tool = _action.payload; }, setDefaultInstruments: ( state, _action: PayloadAction<[number, number, number, number]> ) => { state.defaultInstruments = _action.payload; }, setSelectedChannel: (state, _action: PayloadAction<number>) => { state.selectedPatternCells = []; state.selectedEffectCell = null; state.selectedChannel = _action.payload; }, setVisibleChannels: (state, _action: PayloadAction<number[]>) => { state.visibleChannels = _action.payload; }, setOctaveOffset: (state, _action: PayloadAction<number>) => { state.octaveOffset = _action.payload; }, setEditStep: (state, _action: PayloadAction<number>) => { state.editStep = _action.payload; }, setDefaultStartPlaybackPosition: ( state, _action: PayloadAction<[number, number]> ) => { state.startPlaybackPosition = _action.payload; state.defaultStartPlaybackPosition = _action.payload; }, setSelectedPatternCells: (state, _action: PayloadAction<number[]>) => { state.selectedEffectCell = null; state.selectedPatternCells = _action.payload; }, setSelectedEffectCell: (state, _action: PayloadAction<number | null>) => { state.selectedPatternCells = []; state.selectedEffectCell = _action.payload; }, setSubpatternEditorFocus: (state, _action: PayloadAction<boolean>) => { console.log("FOCUS:", _action.payload); state.subpatternEditorFocus = _action.payload; }, }, extraReducers: (builder) => builder.addCase(editorActions.setSelectedSongId, (state, _action) => { state.playing = false; state.playerReady = false; }), }); export const { actions, reducer } = trackerSlice; export default reducer; |