예제 #1
0
        public void SplitByGrid_ArbitraryGrid_DontSplitNotes_DontPreserveTimes()
        {
            var timedEvents = new[]
            {
                new TimedEvent(new SetTempoEvent(100000), 0),
                new TimedEvent(new InstrumentNameEvent("Test instrument"), 10),
                new TimedEvent(new SetTempoEvent(200000), 90),
                new TimedEvent(new NoteOnEvent((SevenBitNumber)50, (SevenBitNumber)100), 90),
                new TimedEvent(new NoteOnEvent((SevenBitNumber)20, (SevenBitNumber)100), 150),
                new TimedEvent(new NoteOffEvent((SevenBitNumber)50, (SevenBitNumber)100), 190),
                new TimedEvent(new NoteOffEvent((SevenBitNumber)20, (SevenBitNumber)100), 200),
                new TimedEvent(new TextEvent("Test"), 200)
            };

            var midiFile = timedEvents.ToFile();
            var grid     = new ArbitraryGrid((MidiTimeSpan)100, (MidiTimeSpan)200);
            var settings = new SliceMidiFileSettings
            {
                SplitNotes    = false,
                PreserveTimes = false
            };

            var newFiles = midiFile.SplitByGrid(grid, settings).ToList();

            Assert.AreEqual(3, newFiles.Count, "New files count is invalid.");

            CompareTimedEvents(
                newFiles[0].GetTimedEvents(),
                new[]
            {
                new TimedEvent(new SetTempoEvent(100000), 0),
                new TimedEvent(new InstrumentNameEvent("Test instrument"), 10),
                new TimedEvent(new SetTempoEvent(200000), 90),
                new TimedEvent(new NoteOnEvent((SevenBitNumber)50, (SevenBitNumber)100), 90)
            },
                "First file contains invalid events.");

            CompareTimedEvents(
                newFiles[1].GetTimedEvents(),
                new[]
            {
                new TimedEvent(new SetTempoEvent(200000), 0),
                new TimedEvent(new InstrumentNameEvent("Test instrument"), 0),
                new TimedEvent(new NoteOnEvent((SevenBitNumber)20, (SevenBitNumber)100), 50),
                new TimedEvent(new NoteOffEvent((SevenBitNumber)50, (SevenBitNumber)100), 90),
                new TimedEvent(new NoteOffEvent((SevenBitNumber)20, (SevenBitNumber)100), 100),
            },
                "Second file contains invalid events.");

            CompareTimedEvents(
                newFiles[2].GetTimedEvents(),
                new[]
            {
                new TimedEvent(new SetTempoEvent(200000), 0),
                new TimedEvent(new InstrumentNameEvent("Test instrument"), 0),
                new TimedEvent(new TextEvent("Test"), 0)
            },
                "Third file contains invalid events.");
        }
예제 #2
0
        static void Main(string[] args)
        {
            IEnumerable <string> globFiles = GlobClass.Glob("D:\\data\\folkdataset\\*.mid");

            Console.Write(globFiles.LongCount());
            var count = 0;

            foreach (string filename in globFiles)
            {
                var split_filename = filename.Split('\\');
                var id_filename    = split_filename[split_filename.Count() - 1];
                var midiFile       = MidiFile.Read(filename);
                var result         = new List <MidiFile>();
                var windowSize     = 4;

                for (var i = 0; ; i++)
                {
                    var startTime = new BarBeatTimeSpan(i, 0);
                    var endTime   = new BarBeatTimeSpan(i + windowSize, 0);

                    var grid     = new ArbitraryGrid(new[] { startTime, endTime });
                    var newFiles = midiFile.SplitByGrid(grid).ToList();

                    if (!newFiles.Any())
                    {
                        break;
                    }
                    else if (newFiles.Count == 1)
                    {
                        result.Add(newFiles[0]);
                    }
                    else
                    {
                        var secondNewFile = newFiles[1];
                        var tempoMap      = secondNewFile.GetTempoMap();
                        var length        = secondNewFile.GetTimedEvents().LastOrDefault()?.TimeAs <BarBeatTimeSpan>(tempoMap);

                        if (length.Bars == windowSize || (length.Bars == windowSize - 1 && length.Beats > 0 && length.Ticks > 0))
                        {
                            result.Add(secondNewFile);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                int j = 0;
                foreach (MidiFile res in result)
                {
                    res.Write("D:\\data\\folkdataset_split_4\\" + id_filename + "_" + j + ".mid");
                    j += 1;
                    count++;
                }

                //   TODO
                if (count >= 10000)
                {
                    Console.WriteLine("Reached the alloted size");
                    return;
                }
            }
        }