Esempio n. 1
0
 // 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);
         }
     }
 }
Esempio n. 2
0
        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);
        }