Skip to content

Commit 9ab5889

Browse files
0.20.13 (#107)
* added doubling and halving bpm * changed version
1 parent af00c6e commit 9ab5889

15 files changed

+366
-87
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>log.program</groupId>
66
<artifactId>Charter</artifactId>
7-
<version>0.20.12</version>
7+
<version>0.20.13</version>
88
<packaging>jar</packaging>
99
<name>Charter</name>
1010
<description>Charting program for guitar</description>

src/main/java/log/charter/CharterMain.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import log.charter.services.mouseAndKeyboard.ShortcutConfig;
1010

1111
public class CharterMain {
12-
public static final String VERSION = "0.20.12";
13-
public static final String VERSION_DATE = "2025.03.08 19:00";
12+
public static final String VERSION = "0.20.13";
13+
public static final String VERSION_DATE = "2025.03.09 13:00";
1414
public static final String TITLE = "Charter " + VERSION;
1515

1616
public static void main(final String[] args) throws InterruptedException, IOException {

src/main/java/log/charter/data/config/Localization.java

+4
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public enum Label {
5959
BEAT_ADD("Add beat"), //
6060
BEAT_REMOVE("Remove beat"), //
6161
BOOKMARKS_MENU("Bookmarks"), //
62+
BPM_DOUBLE("Double BPM"), //
63+
BPM_HALVE("Halve BPM"), //
6264
BUFFER_SIZE_MS("Audio buffer size to fill (ms)"), //
6365
BUTTON_CANCEL("Cancel"), //
6466
BUTTON_SAVE("Save"), //
@@ -132,6 +134,8 @@ public enum Label {
132134
FRETS("Frets"), //
133135
GO_PLAY_ALONG("GoPlayAlong file"), //
134136
GUITAR_ARRANGEMENT("Guitar arrangement"), //
137+
HALVING_BPM_MUST_START_ON_MEASURE_BEGINNING("You can only halve BPM from the beginning of a measure"), //
138+
HALVING_BPM_UNEVEN_BEATS_IN_MEASURE("Uneven beats count, can't halve BPM"), //
135139
HAMMER_ON_ON_FRET_ZERO("Hammer on on fret zero"), //
136140
HIGH_PASS("High"), //
137141
HIGH_PASS_SETTINGS("High pass settings"), //

src/main/java/log/charter/data/song/BeatsMap.java

+2-13
Original file line numberDiff line numberDiff line change
@@ -537,19 +537,8 @@ public double findBPM(final Beat beat) {
537537
}
538538

539539
public double findBPM(final Beat beat, final int beatId) {
540-
int nextAnchorId = beats.size() - 1;
541-
542-
for (int i = beatId + 1; i < beats.size(); i++) {
543-
if (beats.get(i).anchor) {
544-
nextAnchorId = i;
545-
break;
546-
}
547-
}
548-
549-
final Beat nextAnchor = beats.get(nextAnchorId);
550-
final double distancePassed = nextAnchor.position() - beat.position();
551-
final int beatsPassed = nextAnchorId - beatId;
552-
return 60_000.0 / distancePassed * beatsPassed;
540+
final double distance = beats.get(beatId + 1).position() - beat.position();
541+
return 60_000.0 / distance;
553542
}
554543

555544
public Beat getBeatSafe(final int beatId) {

src/main/java/log/charter/data/undoSystem/TempoMapUndoState.java

+12-8
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,39 @@
22

33
import static log.charter.util.CollectionUtils.map;
44

5+
import java.util.ArrayList;
56
import java.util.List;
67

78
import log.charter.data.ChartData;
89
import log.charter.data.song.Arrangement;
910
import log.charter.data.song.Beat;
1011
import log.charter.services.data.ChartTimeHandler;
11-
import log.charter.util.collections.ArrayList2;
1212

1313
public class TempoMapUndoState extends UndoState {
1414
private final List<GuitarUndoState> guitarUndoStates;
15-
private final VocalUndoState vocalUndoState;
15+
private final List<VocalUndoState> vocalUndoStates;
1616
private final List<Beat> beats;
1717

18-
private TempoMapUndoState(final List<GuitarUndoState> guitarUndoStates, final VocalUndoState vocalUndoState,
18+
private TempoMapUndoState(final List<GuitarUndoState> guitarUndoStates, final List<VocalUndoState> vocalUndoStates,
1919
final List<Beat> beats) {
2020
this.guitarUndoStates = guitarUndoStates;
21-
this.vocalUndoState = vocalUndoState;
21+
this.vocalUndoStates = vocalUndoStates;
2222
this.beats = beats;
2323
}
2424

2525
public TempoMapUndoState(final ChartData data) {
26-
guitarUndoStates = new ArrayList2<>();
26+
guitarUndoStates = new ArrayList<>();
2727
for (int arrangementId = 0; arrangementId < data.songChart.arrangements.size(); arrangementId++) {
2828
final Arrangement arrangement = data.songChart.arrangements.get(arrangementId);
2929
for (int level = 0; level < arrangement.levels.size(); level++) {
3030
guitarUndoStates.add(new GuitarUndoState(data, arrangementId, level));
3131
}
3232
}
3333

34-
vocalUndoState = new VocalUndoState(data);
34+
vocalUndoStates = new ArrayList<>();
35+
for (int vocalPathId = 0; vocalPathId < data.songChart.vocalPaths.size(); vocalPathId++) {
36+
vocalUndoStates.add(new VocalUndoState(vocalPathId, data.songChart.vocalPaths.get(vocalPathId)));
37+
}
3538

3639
beats = map(data.beats(), Beat::new);
3740
}
@@ -40,10 +43,11 @@ public TempoMapUndoState(final ChartData data) {
4043
public TempoMapUndoState undo(final ChartData chartData, final ChartTimeHandler chartTimeHandler) {
4144
final List<GuitarUndoState> guitarRedoStates = map(guitarUndoStates,
4245
state -> state.undo(chartData, chartTimeHandler));
43-
final VocalUndoState vocalRedoState = vocalUndoState.undo(chartData, chartTimeHandler);
46+
final List<VocalUndoState> vocalRedoStates = map(vocalUndoStates,
47+
state -> state.undo(chartData, chartTimeHandler));
4448
final List<Beat> beatsRedo = map(chartData.beats(), Beat::new);
4549
chartData.songChart.beatsMap.beats = beats;
4650

47-
return new TempoMapUndoState(guitarRedoStates, vocalRedoState, beatsRedo);
51+
return new TempoMapUndoState(guitarRedoStates, vocalRedoStates, beatsRedo);
4852
}
4953
}

src/main/java/log/charter/data/undoSystem/VocalUndoState.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,30 @@
55
import log.charter.services.data.ChartTimeHandler;
66

77
public class VocalUndoState extends UndoState {
8-
private final int pathId;
8+
private final int vocalPathId;
99
private final VocalPath vocals;
1010

1111
private VocalUndoState(final ChartData data, final boolean fromUndo) {
1212
final VocalPath tmpVocals = data.currentVocals();
13-
pathId = data.currentVocals;
13+
vocalPathId = data.currentVocals;
1414
vocals = fromUndo ? tmpVocals : new VocalPath(tmpVocals);
1515
}
1616

17+
public VocalUndoState(final int vocalPathId, final VocalPath vocalPath) {
18+
this.vocalPathId = vocalPathId;
19+
vocals = new VocalPath(vocalPath);
20+
}
21+
1722
public VocalUndoState(final ChartData data) {
1823
this(data, false);
19-
2024
}
2125

2226
@Override
2327
public VocalUndoState undo(final ChartData data, final ChartTimeHandler chartTimeHandler) {
2428
final VocalUndoState redo = new VocalUndoState(data, true);
2529

26-
if (data.songChart.vocalPaths.size() > pathId) {
27-
data.songChart.vocalPaths.set(pathId, vocals);
30+
if (data.songChart.vocalPaths.size() > vocalPathId) {
31+
data.songChart.vocalPaths.set(vocalPathId, vocals);
2832
}
2933

3034
return redo;

src/main/java/log/charter/gui/menuHandlers/EditMenuHandler.java

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ JMenu prepareMenu() {
8282
menu.add(createDisabledItem(Action.TOGGLE_ANCHOR));
8383
menu.add(createDisabledItem(Action.BEAT_ADD));
8484
menu.add(createDisabledItem(Action.BEAT_REMOVE));
85+
menu.add(createDisabledItem(Action.BPM_DOUBLE));
86+
menu.add(createDisabledItem(Action.BPM_HALVE));
8587
}
8688

8789
return menu;

src/main/java/log/charter/services/Action.java

+60-58
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public enum Action {
1717
ARRANGEMENT_PREVIOUS(TEMPO_MAP, VOCALS, GUITAR), //
1818
BEAT_ADD(TEMPO_MAP), //
1919
BEAT_REMOVE(TEMPO_MAP), //
20+
BPM_DOUBLE(TEMPO_MAP), //
21+
BPM_HALVE(TEMPO_MAP), //
2022
COPY(TEMPO_MAP, VOCALS, GUITAR), //
2123
DELETE(VOCALS, GUITAR), //
2224
DOUBLE_GRID(VOCALS, GUITAR), //
@@ -68,69 +70,69 @@ public enum Action {
6870
MOVE_TO_BOOKMARK_7(TEMPO_MAP, VOCALS, GUITAR), //
6971
MOVE_TO_BOOKMARK_8(TEMPO_MAP, VOCALS, GUITAR), //
7072
MOVE_TO_BOOKMARK_9(TEMPO_MAP, VOCALS, GUITAR), //
71-
MOVE_TO_END(Label.MOVE_TO_END, TEMPO_MAP, VOCALS, GUITAR), //
72-
MOVE_TO_FIRST_ITEM(Label.MOVE_TO_FIRST_ITEM, TEMPO_MAP, VOCALS, GUITAR), //
73-
MOVE_TO_LAST_ITEM(Label.MOVE_TO_LAST_ITEM, TEMPO_MAP, VOCALS, GUITAR), //
74-
MOVE_TO_START(Label.MOVE_TO_START, TEMPO_MAP, VOCALS, GUITAR), //
75-
NEW_PROJECT(Label.NEW_PROJECT, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
76-
NEXT_BEAT(Label.NEXT_BEAT, VOCALS, GUITAR), //
73+
MOVE_TO_END(TEMPO_MAP, VOCALS, GUITAR), //
74+
MOVE_TO_FIRST_ITEM(TEMPO_MAP, VOCALS, GUITAR), //
75+
MOVE_TO_LAST_ITEM(TEMPO_MAP, VOCALS, GUITAR), //
76+
MOVE_TO_START(TEMPO_MAP, VOCALS, GUITAR), //
77+
NEW_PROJECT(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
78+
NEXT_BEAT(VOCALS, GUITAR), //
7779
NEXT_GRID(Label.NEXT_GRID_POSITION, VOCALS, GUITAR), //
78-
NEXT_ITEM(Label.NEXT_ITEM, TEMPO_MAP, VOCALS, GUITAR), //
79-
NEXT_ITEM_WITH_SELECT(Label.NEXT_ITEM_WITH_SELECT, VOCALS, GUITAR), //
80-
OPEN_PROJECT(Label.OPEN_PROJECT, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
81-
PASTE(Label.PASTE, VOCALS, GUITAR), //
82-
PLACE_LYRIC_FROM_TEXT(Label.PLACE_LYRIC_FROM_TEXT, VOCALS), //
83-
PLAY_AUDIO(Label.PLAY_AUDIO, TEMPO_MAP, VOCALS, GUITAR), //
84-
PREVIOUS_BEAT(Label.PREVIOUS_BEAT, VOCALS, GUITAR), //
80+
NEXT_ITEM(TEMPO_MAP, VOCALS, GUITAR), //
81+
NEXT_ITEM_WITH_SELECT(VOCALS, GUITAR), //
82+
OPEN_PROJECT(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
83+
PASTE(VOCALS, GUITAR), //
84+
PLACE_LYRIC_FROM_TEXT(VOCALS), //
85+
PLAY_AUDIO(TEMPO_MAP, VOCALS, GUITAR), //
86+
PREVIOUS_BEAT(VOCALS, GUITAR), //
8587
PREVIOUS_GRID(Label.PREVIOUS_GRID_POSITION, VOCALS, GUITAR), //
86-
PREVIOUS_ITEM(Label.PREVIOUS_ITEM, TEMPO_MAP, VOCALS, GUITAR), //
87-
PREVIOUS_ITEM_WITH_SELECT(Label.PREVIOUS_ITEM_WITH_SELECT, VOCALS, GUITAR), //
88-
REDO(Label.REDO, TEMPO_MAP, VOCALS, GUITAR), //
88+
PREVIOUS_ITEM(TEMPO_MAP, VOCALS, GUITAR), //
89+
PREVIOUS_ITEM_WITH_SELECT(VOCALS, GUITAR), //
90+
REDO(TEMPO_MAP, VOCALS, GUITAR), //
8991
SAVE(Label.SAVE_PROJECT, TEMPO_MAP, VOCALS, GUITAR), //
9092
SAVE_AS(Label.SAVE_PROJECT_AS, TEMPO_MAP, VOCALS, GUITAR), //
91-
SELECT_ALL(Label.SELECT_ALL, VOCALS, GUITAR), //
92-
SLOW_BACKWARD(Label.SLOW_BACKWARD, TEMPO_MAP, VOCALS, GUITAR), //
93-
SLOW_FORWARD(Label.SLOW_FORWARD, TEMPO_MAP, VOCALS, GUITAR), //
94-
SNAP_ALL(Label.SNAP_ALL, VOCALS, GUITAR), //
95-
SNAP_SELECTED(Label.SNAP_SELECTED, VOCALS, GUITAR), //
96-
SPECIAL_PASTE(Label.SPECIAL_PASTE, GUITAR), //
97-
SPEED_DECREASE(Label.SPEED_DECREASE, TEMPO_MAP, VOCALS, GUITAR), //
98-
SPEED_DECREASE_FAST(Label.SPEED_DECREASE_FAST, TEMPO_MAP, VOCALS, GUITAR), //
99-
SPEED_DECREASE_PRECISE(Label.SPEED_DECREASE_PRECISE, TEMPO_MAP, VOCALS, GUITAR), //
100-
SPEED_INCREASE(Label.SPEED_INCREASE, TEMPO_MAP, VOCALS, GUITAR), //
101-
SPEED_INCREASE_FAST(Label.SPEED_INCREASE_FAST, TEMPO_MAP, VOCALS, GUITAR), //
102-
SPEED_INCREASE_PRECISE(Label.SPEED_INCREASE_PRECISE, TEMPO_MAP, VOCALS, GUITAR), //
93+
SELECT_ALL(VOCALS, GUITAR), //
94+
SLOW_BACKWARD(TEMPO_MAP, VOCALS, GUITAR), //
95+
SLOW_FORWARD(TEMPO_MAP, VOCALS, GUITAR), //
96+
SNAP_ALL(VOCALS, GUITAR), //
97+
SNAP_SELECTED(VOCALS, GUITAR), //
98+
SPECIAL_PASTE(GUITAR), //
99+
SPEED_DECREASE(TEMPO_MAP, VOCALS, GUITAR), //
100+
SPEED_DECREASE_FAST(TEMPO_MAP, VOCALS, GUITAR), //
101+
SPEED_DECREASE_PRECISE(TEMPO_MAP, VOCALS, GUITAR), //
102+
SPEED_INCREASE(TEMPO_MAP, VOCALS, GUITAR), //
103+
SPEED_INCREASE_FAST(TEMPO_MAP, VOCALS, GUITAR), //
104+
SPEED_INCREASE_PRECISE(TEMPO_MAP, VOCALS, GUITAR), //
103105
SWITCH_TS_TYPING_PART(TEMPO_MAP), //
104-
TOGGLE_ACCENT(Label.TOGGLE_ACCENT, GUITAR), //
105-
TOGGLE_ACCENT_INDEPENDENTLY(Label.TOGGLE_ACCENT_INDEPENDENTLY, GUITAR), //
106-
TOGGLE_ANCHOR(Label.TOGGLE_ANCHOR, TEMPO_MAP), //
107-
TOGGLE_BAND_PASS_FILTER(Label.TOGGLE_BAND_PASS_FILTER, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
108-
TOGGLE_BORDERLESS_PREVIEW_WINDOW(Label.TOGGLE_BORDERLESS_PREVIEW_WINDOW, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
109-
TOGGLE_CLAPS(Label.TOGGLE_CLAPS, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
110-
TOGGLE_HARMONIC(Label.TOGGLE_HARMONIC, GUITAR), //
111-
TOGGLE_HARMONIC_INDEPENDENTLY(Label.TOGGLE_HARMONIC_INDEPENDENTLY, GUITAR), //
112-
TOGGLE_HIGH_PASS_FILTER(Label.TOGGLE_HIGH_PASS_FILTER, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
113-
TOGGLE_HOPO(Label.TOGGLE_HOPO, GUITAR), //
114-
TOGGLE_HOPO_INDEPENDENTLY(Label.TOGGLE_HOPO_INDEPENDENTLY, GUITAR), //
115-
TOGGLE_LINK_NEXT(Label.TOGGLE_LINK_NEXT, GUITAR), //
116-
TOGGLE_LINK_NEXT_INDEPENDENTLY(Label.TOGGLE_LINK_NEXT_INDEPENDENTLY, GUITAR), //
117-
TOGGLE_LOW_PASS_FILTER(Label.TOGGLE_LOW_PASS_FILTER, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
118-
TOGGLE_METRONOME(Label.TOGGLE_METRONOME, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
119-
TOGGLE_MIDI(Label.TOGGLE_MIDI, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
120-
TOGGLE_MUTE(Label.TOGGLE_MUTE, GUITAR), //
121-
TOGGLE_MUTE_INDEPENDENTLY(Label.TOGGLE_MUTE_INDEPENDENTLY, GUITAR), //
122-
TOGGLE_PHRASE_END(Label.TOGGLE_PHRASE_END, VOCALS), //
123-
TOGGLE_PREVIEW_WINDOW(Label.TOGGLE_PREVIEW_WINDOW, EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
124-
TOGGLE_REPEAT_END(Label.TOGGLE_REPEAT_END, GUITAR), //
125-
TOGGLE_REPEAT_START(Label.TOGGLE_REPEAT_START, GUITAR), //
126-
TOGGLE_REPEATER(Label.TOGGLE_REPEATER, GUITAR), //
127-
TOGGLE_TREMOLO(Label.TOGGLE_TREMOLO, GUITAR), //
128-
TOGGLE_TREMOLO_INDEPENDENTLY(Label.TOGGLE_TREMOLO_INDEPENDENTLY, GUITAR), //
129-
TOGGLE_VIBRATO(Label.TOGGLE_VIBRATO, GUITAR), //
130-
TOGGLE_VIBRATO_INDEPENDENTLY(Label.TOGGLE_VIBRATO_INDEPENDENTLY, GUITAR), //
131-
TOGGLE_WAVEFORM_GRAPH(Label.TOGGLE_WAVEFORM_GRAPH, VOCALS, GUITAR), //
132-
TOGGLE_WORD_PART(Label.TOGGLE_WORD_PART, VOCALS), //
133-
UNDO(Label.UNDO, TEMPO_MAP, VOCALS, GUITAR),//
106+
TOGGLE_ACCENT(GUITAR), //
107+
TOGGLE_ACCENT_INDEPENDENTLY(GUITAR), //
108+
TOGGLE_ANCHOR(TEMPO_MAP), //
109+
TOGGLE_BAND_PASS_FILTER(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
110+
TOGGLE_BORDERLESS_PREVIEW_WINDOW(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
111+
TOGGLE_CLAPS(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
112+
TOGGLE_HARMONIC(GUITAR), //
113+
TOGGLE_HARMONIC_INDEPENDENTLY(GUITAR), //
114+
TOGGLE_HIGH_PASS_FILTER(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
115+
TOGGLE_HOPO(GUITAR), //
116+
TOGGLE_HOPO_INDEPENDENTLY(GUITAR), //
117+
TOGGLE_LINK_NEXT(GUITAR), //
118+
TOGGLE_LINK_NEXT_INDEPENDENTLY(GUITAR), //
119+
TOGGLE_LOW_PASS_FILTER(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
120+
TOGGLE_METRONOME(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
121+
TOGGLE_MIDI(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
122+
TOGGLE_MUTE(GUITAR), //
123+
TOGGLE_MUTE_INDEPENDENTLY(GUITAR), //
124+
TOGGLE_PHRASE_END(VOCALS), //
125+
TOGGLE_PREVIEW_WINDOW(EMPTY, TEMPO_MAP, VOCALS, GUITAR), //
126+
TOGGLE_REPEAT_END(GUITAR), //
127+
TOGGLE_REPEAT_START(GUITAR), //
128+
TOGGLE_REPEATER(GUITAR), //
129+
TOGGLE_TREMOLO(GUITAR), //
130+
TOGGLE_TREMOLO_INDEPENDENTLY(GUITAR), //
131+
TOGGLE_VIBRATO(GUITAR), //
132+
TOGGLE_VIBRATO_INDEPENDENTLY(GUITAR), //
133+
TOGGLE_WAVEFORM_GRAPH(VOCALS, GUITAR), //
134+
TOGGLE_WORD_PART(VOCALS), //
135+
UNDO(TEMPO_MAP, VOCALS, GUITAR),//
134136

135137
;
136138

src/main/java/log/charter/services/ActionHandler.java

+6
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import log.charter.services.data.GuitarSoundsStatusesHandler;
2727
import log.charter.services.data.HandShapesHandler;
2828
import log.charter.services.data.VocalsHandler;
29+
import log.charter.services.data.beats.BPMDoubler;
30+
import log.charter.services.data.beats.BPMHalver;
2931
import log.charter.services.data.copy.CopyManager;
3032
import log.charter.services.data.files.NewProjectCreator;
3133
import log.charter.services.data.files.SongFileHandler;
@@ -37,6 +39,8 @@
3739
public class ActionHandler implements Initiable {
3840
private AudioHandler audioHandler;
3941
private BeatsService beatsService;
42+
private BPMDoubler bpmDoubler;
43+
private BPMHalver bpmHalver;
4044
private ChartData chartData;
4145
private ChartItemsHandler chartItemsHandler;
4246
private ChartTimeHandler chartTimeHandler;
@@ -231,6 +235,8 @@ public void init() {
231235
actionHandlers.put(Action.ARRANGEMENT_PREVIOUS, this::previousArrangement);
232236
actionHandlers.put(Action.BEAT_ADD, beatsService::addBeat);
233237
actionHandlers.put(Action.BEAT_REMOVE, beatsService::removeBeat);
238+
actionHandlers.put(Action.BPM_DOUBLE, bpmDoubler::doubleBPM);
239+
actionHandlers.put(Action.BPM_HALVE, bpmHalver::halveBPM);
234240
actionHandlers.put(Action.COPY, copyManager::copy);
235241
actionHandlers.put(Action.DELETE, chartItemsHandler::delete);
236242
actionHandlers.put(Action.DOUBLE_GRID, this::doubleGridSize);

src/main/java/log/charter/services/CharterContext.java

+4
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import log.charter.services.data.HandShapesHandler;
4141
import log.charter.services.data.ProjectAudioHandler;
4242
import log.charter.services.data.VocalsHandler;
43+
import log.charter.services.data.beats.BPMDoubler;
44+
import log.charter.services.data.beats.BPMHalver;
4345
import log.charter.services.data.copy.CopyManager;
4446
import log.charter.services.data.files.ExistingProjectImporter;
4547
import log.charter.services.data.files.FileDropHandler;
@@ -75,6 +77,8 @@ public interface Initiable {
7577
private final ActionHandler actionHandler = new ActionHandler();
7678
private final ArrangementFixer arrangementFixer = new ArrangementFixer();
7779
private final BeatsService beatsService = new BeatsService();
80+
private final BPMDoubler bpmDoubler = new BPMDoubler();
81+
private final BPMHalver bpmHalver = new BPMHalver();
7882
private final ChartValidator chartValidator = new ChartValidator();
7983
private final AudioHandler audioHandler = new AudioHandler();
8084
private final BeatsDrawer beatsDrawer = new BeatsDrawer();

0 commit comments

Comments
 (0)