Skip to content

Commit 4ec1608

Browse files
committed
Added TimeSignature calculation.
1 parent c4076cb commit 4ec1608

File tree

17 files changed

+166
-43
lines changed

17 files changed

+166
-43
lines changed

RhythmGameUtilities.Tests/ParsersTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void TestParseTimeSignaturesFromChartSection()
5454

5555
var timeSignatures = Parsers.ParseTimeSignaturesFromChartSection(sections[NamedSection.SyncTrack]);
5656

57-
Assert.That(timeSignatures.Count, Is.EqualTo(4));
57+
Assert.That(timeSignatures.Length, Is.EqualTo(4));
5858
}
5959

6060
[Test]

RhythmGameUtilities.Tests/UtilitiesTest.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ public void TestConvertSecondsToTicks()
3333
{ 42240, 111980 }
3434
};
3535

36+
var timeSignatureChanges = new[] { new TimeSignature { Position = 0, Numerator = 4, Denominator = 2 } };
37+
3638
Assert.That(
37-
Utilities.ConvertSecondsToTicks(seconds, resolution, bpmChanges), Is.EqualTo(1408));
39+
Utilities.ConvertSecondsToTicks(seconds, resolution, bpmChanges, timeSignatureChanges),
40+
Is.EqualTo(1408));
3841
}
3942

4043
[Test]

RhythmGameUtilities/Scripts/Parsers.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,17 @@ public static Dictionary<string, string> ParseMetaDataFromChartSection(
109109
return section.ToDictionary(item => item.Key, x => x.Value.First());
110110
}
111111

112-
public static Dictionary<int, int[]> ParseTimeSignaturesFromChartSection(
112+
public static TimeSignature[] ParseTimeSignaturesFromChartSection(
113113
KeyValuePair<string, string[]>[] section)
114114
{
115115
return section
116-
.Where(item => item.Value[0] == TypeCode.TimeSignatureMarker)
117-
.Select(item =>
118-
new KeyValuePair<int, int[]>(int.Parse(item.Key), item.Value.Skip(1).Select(int.Parse).ToArray()))
119-
.ToDictionary(item => item.Key, x => x.Value);
116+
.Where(item => item.Value.Length >= 2 && item.Value.First() == TypeCode.TimeSignatureMarker).Select(
117+
item => new TimeSignature
118+
{
119+
Position = int.Parse(item.Key),
120+
Numerator = int.Parse(item.Value.Skip(1).First()),
121+
Denominator = item.Value.Length > 2 ? int.Parse(item.Value.Skip(2).First()) : 2
122+
}).ToArray();
120123
}
121124

122125
public static Dictionary<int, int> ParseBpmFromChartSection(

RhythmGameUtilities/Scripts/Utilities.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal static class UtilitiesInternal
1414

1515
[DllImport("libRhythmGameUtilities", CallingConvention = CallingConvention.Cdecl)]
1616
public static extern int ConvertSecondsToTicksInternal(float seconds, int resolution, int[] bpmChangesKeys,
17-
int[] bpmChangesValues, int bpmChangesSize);
17+
int[] bpmChangesValues, int bpmChangesSize, TimeSignature[] timeSignatures, int timeSignaturesSize);
1818

1919
[DllImport("libRhythmGameUtilities", CallingConvention = CallingConvention.Cdecl)]
2020
public static extern bool IsOnTheBeat(int bpm, float currentTime, float delta);
@@ -55,10 +55,12 @@ public static float ConvertTickToPosition(int tick, int resolution)
5555
/// <param name="seconds">The seconds to generate ticks with.</param>
5656
/// <param name="resolution">The resolution of the song.</param>
5757
/// <param name="bpmChanges">All BPM changes within the song.</param>
58-
public static int ConvertSecondsToTicks(float seconds, int resolution, Dictionary<int, int> bpmChanges)
58+
/// <param name="timeSignatureChanges">All time signature changes within the song.</param>
59+
public static int ConvertSecondsToTicks(float seconds, int resolution, Dictionary<int, int> bpmChanges,
60+
TimeSignature[] timeSignatureChanges)
5961
{
6062
return UtilitiesInternal.ConvertSecondsToTicksInternal(seconds, resolution, bpmChanges.Keys.ToArray(),
61-
bpmChanges.Values.ToArray(), bpmChanges.Count);
63+
bpmChanges.Values.ToArray(), bpmChanges.Count, timeSignatureChanges, timeSignatureChanges.Length);
6264
}
6365

6466
/// <summary>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Runtime.InteropServices;
2+
3+
namespace RhythmGameUtilities
4+
{
5+
6+
[StructLayout(LayoutKind.Sequential)]
7+
public struct TimeSignature
8+
{
9+
10+
public int Position;
11+
12+
public int Numerator;
13+
14+
public int Denominator;
15+
16+
}
17+
18+
}

UnityPackage/Editor/Tests/ParsersTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void TestParseTimeSignaturesFromChartSection()
5454

5555
var timeSignatures = Parsers.ParseTimeSignaturesFromChartSection(sections[NamedSection.SyncTrack]);
5656

57-
Assert.That(timeSignatures.Count, Is.EqualTo(4));
57+
Assert.That(timeSignatures.Length, Is.EqualTo(4));
5858
}
5959

6060
[Test]

UnityPackage/Editor/Tests/UtilitiesTest.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ public void TestConvertSecondsToTicks()
3333
{ 42240, 111980 }
3434
};
3535

36+
var timeSignatureChanges = new[] { new TimeSignature { Position = 0, Numerator = 4, Denominator = 2 } };
37+
3638
Assert.That(
37-
Utilities.ConvertSecondsToTicks(seconds, resolution, bpmChanges), Is.EqualTo(1408));
39+
Utilities.ConvertSecondsToTicks(seconds, resolution, bpmChanges, timeSignatureChanges),
40+
Is.EqualTo(1408));
3841
}
3942

4043
[Test]

UnityPackage/Scripts/Parsers.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,17 @@ public static Dictionary<string, string> ParseMetaDataFromChartSection(
109109
return section.ToDictionary(item => item.Key, x => x.Value.First());
110110
}
111111

112-
public static Dictionary<int, int[]> ParseTimeSignaturesFromChartSection(
112+
public static TimeSignature[] ParseTimeSignaturesFromChartSection(
113113
KeyValuePair<string, string[]>[] section)
114114
{
115115
return section
116-
.Where(item => item.Value[0] == TypeCode.TimeSignatureMarker)
117-
.Select(item =>
118-
new KeyValuePair<int, int[]>(int.Parse(item.Key), item.Value.Skip(1).Select(int.Parse).ToArray()))
119-
.ToDictionary(item => item.Key, x => x.Value);
116+
.Where(item => item.Value.Length >= 2 && item.Value.First() == TypeCode.TimeSignatureMarker).Select(
117+
item => new TimeSignature
118+
{
119+
Position = int.Parse(item.Key),
120+
Numerator = int.Parse(item.Value.Skip(1).First()),
121+
Denominator = item.Value.Length > 2 ? int.Parse(item.Value.Skip(2).First()) : 2
122+
}).ToArray();
120123
}
121124

122125
public static Dictionary<int, int> ParseBpmFromChartSection(

UnityPackage/Scripts/Utilities.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal static class UtilitiesInternal
1414

1515
[DllImport("libRhythmGameUtilities", CallingConvention = CallingConvention.Cdecl)]
1616
public static extern int ConvertSecondsToTicksInternal(float seconds, int resolution, int[] bpmChangesKeys,
17-
int[] bpmChangesValues, int bpmChangesSize);
17+
int[] bpmChangesValues, int bpmChangesSize, TimeSignature[] timeSignatures, int timeSignaturesSize);
1818

1919
[DllImport("libRhythmGameUtilities", CallingConvention = CallingConvention.Cdecl)]
2020
public static extern bool IsOnTheBeat(int bpm, float currentTime, float delta);
@@ -55,10 +55,12 @@ public static float ConvertTickToPosition(int tick, int resolution)
5555
/// <param name="seconds">The seconds to generate ticks with.</param>
5656
/// <param name="resolution">The resolution of the song.</param>
5757
/// <param name="bpmChanges">All BPM changes within the song.</param>
58-
public static int ConvertSecondsToTicks(float seconds, int resolution, Dictionary<int, int> bpmChanges)
58+
/// <param name="timeSignatureChanges">All time signature changes within the song.</param>
59+
public static int ConvertSecondsToTicks(float seconds, int resolution, Dictionary<int, int> bpmChanges,
60+
TimeSignature[] timeSignatureChanges)
5961
{
6062
return UtilitiesInternal.ConvertSecondsToTicksInternal(seconds, resolution, bpmChanges.Keys.ToArray(),
61-
bpmChanges.Values.ToArray(), bpmChanges.Count);
63+
bpmChanges.Values.ToArray(), bpmChanges.Count, timeSignatureChanges, timeSignatureChanges.Length);
6264
}
6365

6466
/// <summary>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Runtime.InteropServices;
2+
3+
namespace RhythmGameUtilities
4+
{
5+
6+
[StructLayout(LayoutKind.Sequential)]
7+
public struct TimeSignature
8+
{
9+
10+
public int Position;
11+
12+
public int Numerator;
13+
14+
public int Denominator;
15+
16+
}
17+
18+
}

0 commit comments

Comments
 (0)