// Insert beat reset after 1 measure of time signature change event according to BMS specifications. private static void BeatResetFix(ExtendedSortedSet <BMSEvent> bmev) { BMSEvent[] beatResetEvents = bmev.Where(ev => ev.type == BMSEventType.BeatReset).ToArray(); for (int i = 0, l = beatResetEvents.Length; i < l; i++) { BMSEvent currentEv = beatResetEvents[i]; int meas = currentEv.measure; if (i == l - 1 || (beatResetEvents[i + 1].measure - meas > 1 && currentEv.Data2F != 1)) { bmev.Add(new BMSEvent { measure = meas + 1, beat = 0, Data2F = 1, type = BMSEventType.BeatReset }, InsertMode.OldFirst); } } }
private static bool ParseContentLine(string command2, string strParam1, string strParam2, ExtendedSortedSet <BMSEvent> bmev) { if (!int.TryParse(command2, out int verse)) { return(false); } int channel = GetChannelNumberById(strParam2); if (channel < 0) { return(false); } strParam1 = spaceMatcher.Replace(strParam1, string.Empty); int length = strParam1.Length / 2; BMSEventType evType; switch (channel) { case 1: evType = BMSEventType.WAV; break; case 2: bmev.Add(new BMSEvent { measure = verse, beat = 0, Data2F = double.Parse(strParam1), type = BMSEventType.BeatReset }, InsertMode.OldFirst); return(true); case 3: evType = BMSEventType.BPM; break; case 4: case 6: case 7: evType = BMSEventType.BMP; break; case 8: evType = BMSEventType.BPM; break; case 9: evType = BMSEventType.STOP; break; default: if (channel > 10 && channel < 30) { evType = BMSEventType.Note; } else if (channel > 50 && channel < 70) { evType = BMSEventType.LongNoteStart; } else { evType = BMSEventType.Unknown; } break; } for (int i = 0; i < length; i++) { int value = Base36.Decode(strParam1.Substring(i * 2, 2)); if (value > 0) { bmev.Add(new BMSEvent { measure = verse, beat = (float)i / length, type = evType, data1 = channel, data2 = value }, InsertMode.OldFirst); } } return(true); }