mirror of
https://github.com/ninjamuffin99/Funkin.git
synced 2025-03-24 10:59:32 +00:00
input offset edits in progress
This commit is contained in:
parent
d903edcb59
commit
0145d7ed2d
|
@ -8,6 +8,7 @@ import funkin.data.song.SongData.SongTimeChange;
|
||||||
import funkin.data.song.SongDataUtils;
|
import funkin.data.song.SongDataUtils;
|
||||||
import funkin.save.Save;
|
import funkin.save.Save;
|
||||||
import haxe.Timer;
|
import haxe.Timer;
|
||||||
|
import flixel.sound.FlxSound;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A core class which handles musical timing throughout the game,
|
* A core class which handles musical timing throughout the game,
|
||||||
|
@ -290,6 +291,8 @@ class Conductor
|
||||||
// Take into account instrumental and file format song offsets.
|
// Take into account instrumental and file format song offsets.
|
||||||
songPos = (FlxG.sound.music != null) ? (FlxG.sound.music.time + instrumentalOffset + formatOffset) : 0.0;
|
songPos = (FlxG.sound.music != null) ? (FlxG.sound.music.time + instrumentalOffset + formatOffset) : 0.0;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
songPos += instrumentalOffset + formatOffset;
|
||||||
|
|
||||||
var oldMeasure = this.currentMeasure;
|
var oldMeasure = this.currentMeasure;
|
||||||
var oldBeat = this.currentBeat;
|
var oldBeat = this.currentBeat;
|
||||||
|
@ -369,14 +372,16 @@ class Conductor
|
||||||
* that can potentially get processed on exact milliseconds/timestmaps.
|
* that can potentially get processed on exact milliseconds/timestmaps.
|
||||||
* If you need song position, use `Conductor.instance.songPosition` instead
|
* If you need song position, use `Conductor.instance.songPosition` instead
|
||||||
* for use in update() related functions.
|
* for use in update() related functions.
|
||||||
|
* @param soundToCheck Which FlxSound object to check, defaults to FlxG.sound.music if no input
|
||||||
* @return Float
|
* @return Float
|
||||||
*/
|
*/
|
||||||
public function getTimeWithDiff():Float
|
public function getTimeWithDiff(?soundToCheck:FlxSound):Float
|
||||||
{
|
{
|
||||||
|
if (soundToCheck == null) soundToCheck = FlxG.sound.music;
|
||||||
// trace(this.songPosition);
|
// trace(this.songPosition);
|
||||||
|
|
||||||
@:privateAccess
|
@:privateAccess
|
||||||
this.songPosition = FlxG.sound.music._channel.position;
|
this.songPosition = soundToCheck._channel.position;
|
||||||
// return this.songPosition + (Std.int(Timer.stamp() * 1000) - prevTimestamp);
|
// return this.songPosition + (Std.int(Timer.stamp() * 1000) - prevTimestamp);
|
||||||
// trace("\t--> " + this.songPosition);
|
// trace("\t--> " + this.songPosition);
|
||||||
return this.songPosition;
|
return this.songPosition;
|
||||||
|
|
|
@ -5,6 +5,7 @@ import flixel.FlxSprite;
|
||||||
import flixel.addons.transition.FlxTransitionableState;
|
import flixel.addons.transition.FlxTransitionableState;
|
||||||
import flixel.group.FlxGroup.FlxTypedGroup;
|
import flixel.group.FlxGroup.FlxTypedGroup;
|
||||||
import funkin.ui.MusicBeatSubState;
|
import funkin.ui.MusicBeatSubState;
|
||||||
|
import funkin.ui.debug.latency.LatencyState;
|
||||||
import flixel.sound.FlxSound;
|
import flixel.sound.FlxSound;
|
||||||
import flixel.text.FlxText;
|
import flixel.text.FlxText;
|
||||||
import flixel.tweens.FlxEase;
|
import flixel.tweens.FlxEase;
|
||||||
|
@ -18,14 +19,16 @@ class PauseSubState extends MusicBeatSubState
|
||||||
{
|
{
|
||||||
var grpMenuShit:FlxTypedGroup<Alphabet>;
|
var grpMenuShit:FlxTypedGroup<Alphabet>;
|
||||||
|
|
||||||
|
// todo: maybe make these enums or somethin?
|
||||||
final pauseOptionsBase:Array<String> = [
|
final pauseOptionsBase:Array<String> = [
|
||||||
'Resume',
|
'Resume',
|
||||||
'Restart Song',
|
'Restart Song',
|
||||||
'Change Difficulty',
|
'Change Difficulty',
|
||||||
'Toggle Practice Mode',
|
'Toggle Practice Mode',
|
||||||
|
'Adjust Input Offsets',
|
||||||
'Exit to Menu'
|
'Exit to Menu'
|
||||||
];
|
];
|
||||||
final pauseOptionsCharting:Array<String> = ['Resume', 'Restart Song', 'Exit to Chart Editor'];
|
final pauseOptionsCharting:Array<String> = ['Resume', 'Restart Song', 'Adjust Input Offsets', 'Exit to Chart Editor'];
|
||||||
|
|
||||||
final pauseOptionsDifficultyBase:Array<String> = ['BACK'];
|
final pauseOptionsDifficultyBase:Array<String> = ['BACK'];
|
||||||
|
|
||||||
|
@ -240,7 +243,8 @@ class PauseSubState extends MusicBeatSubState
|
||||||
{
|
{
|
||||||
openSubState(new funkin.ui.transition.StickerSubState(null, FREEPLAY));
|
openSubState(new funkin.ui.transition.StickerSubState(null, FREEPLAY));
|
||||||
}
|
}
|
||||||
|
case 'Adjust Input Offsets':
|
||||||
|
openSubState(new LatencyState());
|
||||||
case 'Exit to Chart Editor':
|
case 'Exit to Chart Editor':
|
||||||
this.close();
|
this.close();
|
||||||
if (FlxG.sound.music != null) FlxG.sound.music.pause(); // Don't reset song position!
|
if (FlxG.sound.music != null) FlxG.sound.music.pause(); // Don't reset song position!
|
||||||
|
|
|
@ -95,7 +95,7 @@ class DebugMenuSubState extends MusicBeatSubState
|
||||||
|
|
||||||
function openInputOffsetTesting()
|
function openInputOffsetTesting()
|
||||||
{
|
{
|
||||||
FlxG.switchState(new funkin.ui.debug.latency.LatencyState());
|
openSubState(new funkin.ui.debug.latency.LatencyState());
|
||||||
trace('Input Offset Testing');
|
trace('Input Offset Testing');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ import funkin.data.notestyle.NoteStyleData;
|
||||||
import funkin.data.notestyle.NoteStyleRegistry;
|
import funkin.data.notestyle.NoteStyleRegistry;
|
||||||
import funkin.data.song.SongData.SongNoteData;
|
import funkin.data.song.SongData.SongNoteData;
|
||||||
import haxe.Timer;
|
import haxe.Timer;
|
||||||
|
import flixel.FlxCamera;
|
||||||
|
|
||||||
class LatencyState extends MusicBeatSubState
|
class LatencyState extends MusicBeatSubState
|
||||||
{
|
{
|
||||||
|
@ -38,30 +39,39 @@ class LatencyState extends MusicBeatSubState
|
||||||
var beatTrail:FlxSprite;
|
var beatTrail:FlxSprite;
|
||||||
var diffGrp:FlxTypedGroup<FlxText>;
|
var diffGrp:FlxTypedGroup<FlxText>;
|
||||||
var offsetsPerBeat:Array<Int> = [];
|
var offsetsPerBeat:Array<Int> = [];
|
||||||
var swagSong:HomemadeMusic;
|
var swagSong:FlxSound;
|
||||||
|
|
||||||
|
var previousVolume:Float;
|
||||||
|
|
||||||
|
var stateCamera:FlxCamera;
|
||||||
|
|
||||||
override function create()
|
override function create()
|
||||||
{
|
{
|
||||||
super.create();
|
super.create();
|
||||||
|
|
||||||
if (FlxG.sound.music != null) FlxG.sound.music.stop();
|
stateCamera = new FlxCamera(0, 0, FlxG.width, FlxG.height);
|
||||||
|
stateCamera.bgColor = FlxColor.BLACK;
|
||||||
|
FlxG.cameras.add(stateCamera);
|
||||||
|
|
||||||
swagSong = new HomemadeMusic();
|
var bg:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, FlxG.height, FlxColor.BLACK);
|
||||||
|
add(bg);
|
||||||
|
|
||||||
|
if (FlxG.sound.music != null)
|
||||||
|
{
|
||||||
|
previousVolume = FlxG.sound.music.volume;
|
||||||
|
FlxG.sound.music.volume = 0; // only want to mute the volume, incase we are coming from pause menu
|
||||||
|
}
|
||||||
|
else
|
||||||
|
previousVolume = 1; // defaults to 1 if no music is playing 🤔 also fuck it, emoji in code comment
|
||||||
|
|
||||||
|
swagSong = new FlxSound();
|
||||||
swagSong.loadEmbedded(Paths.sound('soundTest'), true);
|
swagSong.loadEmbedded(Paths.sound('soundTest'), true);
|
||||||
|
swagSong.looped = true;
|
||||||
|
swagSong.play();
|
||||||
|
|
||||||
FlxG.sound.music = swagSong;
|
PreciseInputManager.instance.onInputPressed.add(preciseInputPressed);
|
||||||
FlxG.sound.music.play();
|
|
||||||
|
|
||||||
PreciseInputManager.instance.onInputPressed.add(function(event:PreciseInputEvent) {
|
PreciseInputManager.instance.onInputReleased.add(preciseInputReleased);
|
||||||
generateBeatStuff(event);
|
|
||||||
strumLine.pressKey(event.noteDirection);
|
|
||||||
strumLine.playPress(event.noteDirection);
|
|
||||||
});
|
|
||||||
|
|
||||||
PreciseInputManager.instance.onInputReleased.add(function(event:PreciseInputEvent) {
|
|
||||||
strumLine.playStatic(event.noteDirection);
|
|
||||||
strumLine.releaseKey(event.noteDirection);
|
|
||||||
});
|
|
||||||
|
|
||||||
Conductor.instance.forceBPM(60);
|
Conductor.instance.forceBPM(60);
|
||||||
|
|
||||||
|
@ -70,7 +80,7 @@ class LatencyState extends MusicBeatSubState
|
||||||
diffGrp = new FlxTypedGroup<FlxText>();
|
diffGrp = new FlxTypedGroup<FlxText>();
|
||||||
add(diffGrp);
|
add(diffGrp);
|
||||||
|
|
||||||
for (beat in 0...Math.floor(FlxG.sound.music.length / (Conductor.instance.stepLengthMs * 2)))
|
for (beat in 0...Math.floor(swagSong.length / (Conductor.instance.stepLengthMs * 2)))
|
||||||
{
|
{
|
||||||
var beatTick:FlxSprite = new FlxSprite(songPosToX(beat * (Conductor.instance.stepLengthMs * 2)), FlxG.height - 15);
|
var beatTick:FlxSprite = new FlxSprite(songPosToX(beat * (Conductor.instance.stepLengthMs * 2)), FlxG.height - 15);
|
||||||
beatTick.makeGraphic(2, 15);
|
beatTick.makeGraphic(2, 15);
|
||||||
|
@ -132,9 +142,43 @@ class LatencyState extends MusicBeatSubState
|
||||||
offsetText.fieldWidth = FlxG.width - offsetText.x - 10;
|
offsetText.fieldWidth = FlxG.width - offsetText.x - 10;
|
||||||
add(offsetText);
|
add(offsetText);
|
||||||
|
|
||||||
|
var helpText:FlxText = new FlxText();
|
||||||
|
helpText.setFormat(Paths.font("vcr.ttf"), 20);
|
||||||
|
helpText.text = "Press ESC to return to main menu";
|
||||||
|
helpText.x = FlxG.width - helpText.width;
|
||||||
|
helpText.y = FlxG.height - helpText.height - 2;
|
||||||
|
add(helpText);
|
||||||
|
|
||||||
regenNoteData();
|
regenNoteData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function preciseInputPressed(event:PreciseInputEvent)
|
||||||
|
{
|
||||||
|
generateBeatStuff(event);
|
||||||
|
strumLine.pressKey(event.noteDirection);
|
||||||
|
strumLine.playPress(event.noteDirection);
|
||||||
|
}
|
||||||
|
|
||||||
|
function preciseInputReleased(event:PreciseInputEvent)
|
||||||
|
{
|
||||||
|
strumLine.playStatic(event.noteDirection);
|
||||||
|
strumLine.releaseKey(event.noteDirection);
|
||||||
|
}
|
||||||
|
|
||||||
|
override public function close():Void
|
||||||
|
{
|
||||||
|
PreciseInputManager.instance.onInputPressed.remove(preciseInputPressed);
|
||||||
|
|
||||||
|
PreciseInputManager.instance.onInputReleased.remove(preciseInputReleased);
|
||||||
|
|
||||||
|
FlxG.sound.music.volume = previousVolume;
|
||||||
|
swagSong.stop();
|
||||||
|
|
||||||
|
FlxG.cameras.remove(stateCamera);
|
||||||
|
|
||||||
|
super.close();
|
||||||
|
}
|
||||||
|
|
||||||
function regenNoteData()
|
function regenNoteData()
|
||||||
{
|
{
|
||||||
for (i in 0...32)
|
for (i in 0...32)
|
||||||
|
@ -175,7 +219,7 @@ class LatencyState extends MusicBeatSubState
|
||||||
trace(FlxG.sound.music._channel.position);
|
trace(FlxG.sound.music._channel.position);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Conductor.instance.update();
|
Conductor.instance.update(swagSong.position);
|
||||||
|
|
||||||
// Conductor.instance.songPosition += (Timer.stamp() * 1000) - FlxG.sound.music.prevTimestamp;
|
// Conductor.instance.songPosition += (Timer.stamp() * 1000) - FlxG.sound.music.prevTimestamp;
|
||||||
|
|
||||||
|
@ -226,6 +270,11 @@ class LatencyState extends MusicBeatSubState
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FlxG.keys.justPressed.ESCAPE)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
super.update(elapsed);
|
super.update(elapsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,15 +286,15 @@ class LatencyState extends MusicBeatSubState
|
||||||
trace("input latency: " + inputLatencyMs + "ms");
|
trace("input latency: " + inputLatencyMs + "ms");
|
||||||
trace("cur timestamp: " + PreciseInputManager.getCurrentTimestamp() + "ns");
|
trace("cur timestamp: " + PreciseInputManager.getCurrentTimestamp() + "ns");
|
||||||
trace("event timestamp: " + event.timestamp + "ns");
|
trace("event timestamp: " + event.timestamp + "ns");
|
||||||
trace("songtime: " + Conductor.instance.getTimeWithDiff() + "ms");
|
trace("songtime: " + Conductor.instance.getTimeWithDiff(swagSong) + "ms");
|
||||||
|
|
||||||
var closestBeat:Int = Math.round(Conductor.instance.getTimeWithDiff() / (Conductor.instance.stepLengthMs * 2)) % diffGrp.members.length;
|
var closestBeat:Int = Math.round(Conductor.instance.getTimeWithDiff(swagSong) / (Conductor.instance.stepLengthMs * 2)) % diffGrp.members.length;
|
||||||
var getDiff:Float = Conductor.instance.getTimeWithDiff() - (closestBeat * (Conductor.instance.stepLengthMs * 2));
|
var getDiff:Float = Conductor.instance.getTimeWithDiff(swagSong) - (closestBeat * (Conductor.instance.stepLengthMs * 2));
|
||||||
// getDiff -= Conductor.instance.inputOffset;
|
// getDiff -= Conductor.instance.inputOffset;
|
||||||
getDiff -= inputLatencyMs;
|
getDiff -= inputLatencyMs;
|
||||||
|
|
||||||
// lil fix for end of song
|
// lil fix for end of song
|
||||||
if (closestBeat == 0 && getDiff >= Conductor.instance.stepLengthMs * 2) getDiff -= FlxG.sound.music.length;
|
if (closestBeat == 0 && getDiff >= Conductor.instance.stepLengthMs * 2) getDiff -= swagSong.length;
|
||||||
|
|
||||||
beatTrail.x = songPosVis.x;
|
beatTrail.x = songPosVis.x;
|
||||||
|
|
||||||
|
@ -255,7 +304,7 @@ class LatencyState extends MusicBeatSubState
|
||||||
|
|
||||||
function songPosToX(pos:Float):Float
|
function songPosToX(pos:Float):Float
|
||||||
{
|
{
|
||||||
return FlxMath.remapToRange(pos, 0, FlxG.sound.music.length, 0, FlxG.width);
|
return FlxMath.remapToRange(pos, 0, swagSong.length, 0, FlxG.width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue