diff --git a/Project.xml b/Project.xml
index b39618908..6df879583 100644
--- a/Project.xml
+++ b/Project.xml
@@ -213,7 +213,7 @@
- -->
+ -->
-->
diff --git a/source/funkin/ui/debug/charting/toolboxes/ChartEditorFreeplayToolbox.hx b/source/funkin/ui/debug/charting/toolboxes/ChartEditorFreeplayToolbox.hx
index 8d3554a08..c384e7a6d 100644
--- a/source/funkin/ui/debug/charting/toolboxes/ChartEditorFreeplayToolbox.hx
+++ b/source/funkin/ui/debug/charting/toolboxes/ChartEditorFreeplayToolbox.hx
@@ -290,7 +290,7 @@ class ChartEditorFreeplayToolbox extends ChartEditorBaseToolbox
// waveformMusic.waveform.forceUpdate = true;
var perfStart = haxe.Timer.stamp();
var waveformData1 = playerVoice.waveformData;
- var waveformData2 = opponentVoice.waveformData;
+ var waveformData2 = opponentVoice?.waveformData ?? playerVoice.waveformData; // this null check is for songs that only have 1 vocals file!
var waveformData3 = chartEditorState.audioInstTrack.waveformData;
var waveformData = waveformData1.merge(waveformData2).merge(waveformData3);
trace('Waveform data merging took: ${haxe.Timer.stamp() - perfStart} seconds');
diff --git a/source/funkin/ui/debug/charting/toolboxes/ChartEditorOffsetsToolbox.hx b/source/funkin/ui/debug/charting/toolboxes/ChartEditorOffsetsToolbox.hx
index 67ca82b1b..fd9209294 100644
--- a/source/funkin/ui/debug/charting/toolboxes/ChartEditorOffsetsToolbox.hx
+++ b/source/funkin/ui/debug/charting/toolboxes/ChartEditorOffsetsToolbox.hx
@@ -276,8 +276,13 @@ class ChartEditorOffsetsToolbox extends ChartEditorBaseToolbox
// Build opponent waveform.
// waveformOpponent.waveform.forceUpdate = true;
- waveformOpponent.waveform.waveformData = opponentVoice.waveformData;
- waveformOpponent.waveform.duration = opponentVoice.length / Constants.MS_PER_SEC;
+ // note: if song only has one set of vocals (Vocals.ogg/mp3) then this is null and crashes charting editor
+ // so we null check
+ if (opponentVoice != null)
+ {
+ waveformOpponent.waveform.waveformData = opponentVoice.waveformData;
+ waveformOpponent.waveform.duration = opponentVoice.length / Constants.MS_PER_SEC;
+ }
// Build instrumental waveform.
// waveformInstrumental.waveform.forceUpdate = true;