From cd2b29a1ca12817fb8bb43e7b05445302d1ff9e9 Mon Sep 17 00:00:00 2001 From: EliteAsian Date: Tue, 4 Apr 2023 15:30:28 -0400 Subject: [PATCH] Added support for `hopo_frequency` --- Assets/Script/Data/SongInfo.cs | 6 ++++++ Assets/Script/PlayMode/Play.cs | 2 +- .../Serialization/Parser/MidiParser.Drums.cs | 2 +- .../Serialization/Parser/MidiParser.FiveFret.cs | 9 +++------ .../Serialization/Parser/MidiParser.GHDrums.cs | 2 +- .../Serialization/Parser/MidiParser.Vocals.cs | 2 +- Assets/Script/Serialization/SongIni.cs | 14 ++++++++++++++ Assets/Script/SongLibrary.cs | 2 +- 8 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Assets/Script/Data/SongInfo.cs b/Assets/Script/Data/SongInfo.cs index 73fceadce..c6554c7de 100644 --- a/Assets/Script/Data/SongInfo.cs +++ b/Assets/Script/Data/SongInfo.cs @@ -99,6 +99,12 @@ public Dictionary JsonDiffs { public float delay; [JsonProperty] public DrumType drumType; + /// + /// The hopo frequency in ticks.
+ /// Standardized here: https://github.com/TheNathannator/GuitarGame_ChartFormats/blob/main/doc/FileFormats/.mid/Standard/5-Fret%20Guitar.md#note-mechanics + ///
+ [JsonProperty] + public int hopoFreq = 170; [JsonProperty] public string artistName; diff --git a/Assets/Script/PlayMode/Play.cs b/Assets/Script/PlayMode/Play.cs index 39af65df8..206bff86c 100644 --- a/Assets/Script/PlayMode/Play.cs +++ b/Assets/Script/PlayMode/Play.cs @@ -126,7 +126,7 @@ private IEnumerator StartSong() { // Check for single guitar audio if (audioSources.Count == 1 && audioSources.ContainsKey("guitar")) { // If so, replace it as the song audio - // Standardized in [Audio Files / File Names] + // Standardized here: https://github.com/TheNathannator/GuitarGame_ChartFormats/blob/main/doc/FileFormats/Audio%20Files.md#file-names audioSources.Add("song", audioSources["guitar"]); // Remove old audio diff --git a/Assets/Script/Serialization/Parser/MidiParser.Drums.cs b/Assets/Script/Serialization/Parser/MidiParser.Drums.cs index 208959378..e69085abe 100644 --- a/Assets/Script/Serialization/Parser/MidiParser.Drums.cs +++ b/Assets/Script/Serialization/Parser/MidiParser.Drums.cs @@ -199,7 +199,7 @@ private void DrumNoteStatePass(List noteIR, List cymbal } private List DrumFromGH(List ghNotes) { - // Standardized in [.mid / Standard / Drums / Track Type Conversions] + // Standardized here: https://github.com/TheNathannator/GuitarGame_ChartFormats/blob/main/doc/FileFormats/.mid/Standard/Drums.md#track-type-conversions var noteOutput = new List(); diff --git a/Assets/Script/Serialization/Parser/MidiParser.FiveFret.cs b/Assets/Script/Serialization/Parser/MidiParser.FiveFret.cs index 1c1cdbdcc..933483f57 100644 --- a/Assets/Script/Serialization/Parser/MidiParser.FiveFret.cs +++ b/Assets/Script/Serialization/Parser/MidiParser.FiveFret.cs @@ -276,12 +276,9 @@ private void FiveFretNoteStatePass(List noteIR, List f var lastNoteBeat = TimeConverter.ConvertTo(lastTime, tempo); var distance = noteBeat - lastNoteBeat; - // Thanks?? https://tcrf.net/Proto:Guitar_Hero - // According to this, auto-HOPO threshold is 170 ticks. - // "But a tick is different in every midi file!" - // It also mentions that 160 is a twelth note. - // 160 * 12 = 1920 - if (distance <= new MusicalTimeSpan(170, 1920)) { + // Use HOPO frequency value from song info. + // Convert the ticks to a musical time span. + if (distance <= new MusicalTimeSpan(songInfo.hopoFreq, 480 * 4)) { note.hopo = true; note.autoHopo = true; } diff --git a/Assets/Script/Serialization/Parser/MidiParser.GHDrums.cs b/Assets/Script/Serialization/Parser/MidiParser.GHDrums.cs index a410c8700..147bbe615 100644 --- a/Assets/Script/Serialization/Parser/MidiParser.GHDrums.cs +++ b/Assets/Script/Serialization/Parser/MidiParser.GHDrums.cs @@ -85,7 +85,7 @@ private List GHDrumNotePass(TrackChunk trackChunk, int difficulty, Tem } private List DrumFromStandard(List stdNotes) { - // Standardized in [.mid / Standard / Drums / Track Type Conversions] + // Standardized here: https://github.com/TheNathannator/GuitarGame_ChartFormats/blob/main/doc/FileFormats/.mid/Standard/Drums.md#track-type-conversions var noteOutput = new List(); diff --git a/Assets/Script/Serialization/Parser/MidiParser.Vocals.cs b/Assets/Script/Serialization/Parser/MidiParser.Vocals.cs index f65f23446..9f6bc98dd 100644 --- a/Assets/Script/Serialization/Parser/MidiParser.Vocals.cs +++ b/Assets/Script/Serialization/Parser/MidiParser.Vocals.cs @@ -84,7 +84,7 @@ private List ParseRealLyrics(List eventIR, TrackChunk trackC } private List ParseRealLyrics(List eventIR, TrackChunk trackChunk, TrackChunk phraseTimingTrack, TempoMap tempo, int harmonyIndex) { - // Standardized in [.mid / Standard / Vocals] + // Standardized here: https://github.com/TheNathannator/GuitarGame_ChartFormats/blob/main/doc/FileFormats/.mid/Standard/Vocals.md var lyrics = new List(); diff --git a/Assets/Script/Serialization/SongIni.cs b/Assets/Script/Serialization/SongIni.cs index a5870aad8..6528c1a06 100644 --- a/Assets/Script/Serialization/SongIni.cs +++ b/Assets/Script/Serialization/SongIni.cs @@ -99,6 +99,20 @@ public static SongInfo CompleteSongInfo(SongInfo song) { song.delay = 0f; } + // Get hopo frequency + // Standardized here: https://github.com/TheNathannator/GuitarGame_ChartFormats/blob/main/doc/FileFormats/.mid/Standard/5-Fret%20Guitar.md#note-mechanics + if (section.ContainsKey("hopo_frequency")) { + song.hopoFreq = int.Parse(section["hopo_frequency"]); + } else if (section.ContainsKey("hopofreq")) { + song.hopoFreq = int.Parse(section["hopofreq"]); + } else if (section.ContainsKey("eighthnote_hopo")) { + if (section["eighthnote_hopo"].ToLowerInvariant() == "true" || + section["eighthnote_hopo"] == "1") { + + song.hopoFreq = 240; + } + } + // Get difficulties bool noneFound = true; foreach (var kvp in new Dictionary(song.partDifficulties)) { diff --git a/Assets/Script/SongLibrary.cs b/Assets/Script/SongLibrary.cs index d10d54f7d..a69774237 100644 --- a/Assets/Script/SongLibrary.cs +++ b/Assets/Script/SongLibrary.cs @@ -8,7 +8,7 @@ namespace YARG { public static class SongLibrary { - private const int CACHE_VERSION = 2; + private const int CACHE_VERSION = 3; private class SongCacheJson { public int version = CACHE_VERSION; public List songs;