@@ -55,7 +55,7 @@ public abstract class OsuObj
5555
5656public class OsuTimingPoint : OsuObj
5757{
58- public float msPerBeat ;
58+ public int msPerBeat ;
5959 public int meter ;
6060 public int sampleSet ;
6161 public int sampleIndex ;
@@ -165,6 +165,213 @@ public override int GetTypeValue()
165165 }
166166}
167167
168+ public class Fraction
169+ {
170+ // https://gist.github.com/fidelsoto/b4c0f14b800c58e137ad5757f35cacd6
171+ public float numerator ;
172+ public float denominator ;
173+
174+ public Fraction ( float numerator , float denominator )
175+ {
176+ this . numerator = numerator ;
177+ this . denominator = denominator ;
178+ }
179+
180+ public Fraction ( Fraction fraction )
181+ {
182+ numerator = fraction . numerator ;
183+ denominator = fraction . denominator ;
184+ }
185+
186+ public override bool Equals ( object obj )
187+ {
188+ if ( obj == null ) return false ;
189+
190+ Fraction other = obj as Fraction ;
191+ return ( numerator == other . numerator && denominator == other . denominator ) ;
192+ }
193+
194+ public static bool operator == ( Fraction f1 , Fraction f2 )
195+ {
196+ return f1 . Equals ( f2 ) ;
197+ }
198+
199+ public static bool operator == ( Fraction f1 , int f2 )
200+ {
201+ return f1 . Equals ( new Fraction ( f2 , 1 ) ) ;
202+ }
203+
204+ public static bool operator != ( Fraction f1 , Fraction f2 )
205+ {
206+ return ! ( f1 == f2 ) ;
207+ }
208+
209+ public static bool operator != ( Fraction f1 , int f2 )
210+ {
211+ return ! ( f1 == f2 ) ;
212+ }
213+
214+ public static Fraction operator * ( Fraction f1 , float f2 )
215+ {
216+ var f3 = new Fraction ( f1 ) ;
217+ f3 . numerator *= f2 ;
218+ return f3 ;
219+ }
220+
221+ public static Fraction operator / ( Fraction f1 , float f2 )
222+ {
223+ var f3 = new Fraction ( f1 ) ;
224+ f3 . numerator /= f2 ;
225+ f3 . denominator /= f2 ;
226+ return f3 ;
227+ }
228+
229+ public static Fraction operator + ( Fraction f1 , float f2 )
230+ {
231+ var f3 = new Fraction ( f1 . numerator , f1 . denominator ) ;
232+ f3 . numerator += f2 * f3 . denominator ;
233+ return f3 ;
234+ }
235+
236+ public static Fraction operator - ( Fraction f1 , float f2 )
237+ {
238+ var f3 = new Fraction ( f1 . numerator , f1 . denominator ) ;
239+ f3 . numerator -= f2 * f3 . denominator ;
240+ return f3 ;
241+ }
242+
243+ public static float operator + ( float f1 , Fraction f2 )
244+ {
245+ return f1 + f2 . ToFloat ( ) ;
246+ }
247+
248+ public static float operator - ( float f1 , Fraction f2 )
249+ {
250+ return f1 - f2 . ToFloat ( ) ;
251+ }
252+
253+ public static float operator + ( int f1 , Fraction f2 )
254+ {
255+ return f1 + f2 . ToFloat ( ) ;
256+ }
257+
258+ public static float operator - ( int f1 , Fraction f2 )
259+ {
260+ return f1 - f2 . ToFloat ( ) ;
261+ }
262+
263+ public static Fraction operator + ( Fraction f1 , Fraction f2 )
264+ {
265+ var a = f1 . denominator > f2 . denominator ? f1 : f2 ;
266+ var b = f1 . denominator < f2 . denominator ? f1 : f2 ;
267+ var difference = a . denominator / b . denominator ;
268+
269+ return new Fraction ( a . numerator + ( b . numerator * difference ) , a . denominator ) ;
270+ }
271+
272+ public static Fraction operator - ( Fraction f1 , Fraction f2 )
273+ {
274+ var a = f1 . denominator > f2 . denominator ? f1 : f2 ;
275+ var b = f1 . denominator < f2 . denominator ? f1 : f2 ;
276+ var difference = a . denominator / b . denominator ;
277+
278+ return new Fraction ( a . numerator - ( b . numerator * difference ) , a . denominator ) ;
279+ }
280+
281+ public static bool operator > ( Fraction f1 , Fraction f2 )
282+ {
283+ return ( f1 . numerator / f1 . denominator ) > ( f2 . numerator / f2 . denominator ) ;
284+ }
285+
286+ public static bool operator < ( Fraction f1 , Fraction f2 )
287+ {
288+ return ( f1 . numerator / f1 . denominator ) < ( f2 . numerator / f2 . denominator ) ;
289+ }
290+
291+ public static bool operator <= ( Fraction f1 , Fraction f2 )
292+ {
293+ return ( f1 . numerator / f1 . denominator ) <= ( f2 . numerator / f2 . denominator ) ;
294+ }
295+
296+ public static bool operator >= ( Fraction f1 , Fraction f2 )
297+ {
298+ return ( f1 . numerator / f1 . denominator ) >= ( f2 . numerator / f2 . denominator ) ;
299+ }
300+
301+ public static bool operator > ( Fraction f1 , float f2 )
302+ {
303+ return ( f1 . numerator / f1 . denominator ) > f2 ;
304+ }
305+
306+ public static bool operator < ( Fraction f1 , float f2 )
307+ {
308+ return ( f1 . numerator / f1 . denominator ) < f2 ;
309+ }
310+
311+ public static bool operator <= ( Fraction f1 , float f2 )
312+ {
313+ return ( f1 . numerator / f1 . denominator ) <= f2 ;
314+ }
315+
316+ public static bool operator >= ( Fraction f1 , float f2 )
317+ {
318+ return ( f1 . numerator / f1 . denominator ) >= f2 ;
319+ }
320+
321+ public static bool operator > ( Fraction f1 , int f2 )
322+ {
323+ return ( f1 . numerator / f1 . denominator ) > f2 ;
324+ }
325+
326+ public static bool operator < ( Fraction f1 , int f2 )
327+ {
328+ return ( f1 . numerator / f1 . denominator ) < f2 ;
329+ }
330+
331+ public static bool operator <= ( Fraction f1 , int f2 )
332+ {
333+ return ( f1 . numerator / f1 . denominator ) <= f2 ;
334+ }
335+
336+ public static bool operator >= ( Fraction f1 , int f2 )
337+ {
338+ return ( f1 . numerator / f1 . denominator ) >= f2 ;
339+ }
340+
341+ public override int GetHashCode ( )
342+ {
343+ // i dunno, some weird stuff, its not like we care
344+ return ( int ) Math . Floor ( ( numerator * denominator ) + ( numerator - denominator ) ) ;
345+ }
346+
347+ public override string ToString ( )
348+ {
349+ return numerator + "/" + denominator ;
350+ }
351+
352+ public float ToFloat ( )
353+ {
354+ return numerator / denominator ;
355+ }
356+
357+ //Helper function, simplifies a fraction.
358+ public Fraction Simplify ( )
359+ {
360+ for ( float divideBy = denominator ; divideBy > 0 ; divideBy -- )
361+ {
362+ bool divisible = ( ( int ) ( numerator / divideBy ) * divideBy == numerator ) &&
363+ ( ( int ) ( denominator / divideBy ) * divideBy == denominator ) ;
364+
365+ if ( divisible )
366+ {
367+ numerator /= divideBy ;
368+ denominator /= divideBy ;
369+ }
370+ }
371+ return this ;
372+ }
373+ }
374+
168375public class BMSMeasure
169376{
170377 public string measureNumber ;
0 commit comments