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 | 25x 25x 25x 25x 25x 25x | /* eslint-disable camelcase */
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import editorActions from "store/features/editor/editorActions";
export type PianoRollToolType = "pencil" | "eraser" | "selection" | null;
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 } = trackerSlice;
export default trackerSlice.reducer;
|