/// <summary> /// Load the specified midiFile with tempo (bpm). /// </summary> public void Load(TextAsset midiFile, float bpm = -1) { if (_isPlaying) { _multiSequencer = null; _isPlaying = false; } if (bpm != -1) { _midiFileTempo = bpm; } _midiFile = midiFile; MidiFileContainer song = MidiFileLoader.Load(_midiFile.bytes); _multiSequencer = new MidiMultiTrackSequencer(song, _midiFileTempo); _isLoaded = true; MidiFileInfo info = _multiSequencer.info; _onLoadedEvent.Invoke(midiFile, info); }
static void Main(string[] args) { //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new ColourForm()); var midiout = new StreamWriter(@"E:\test.mid"); var midiin = new StreamReader(@"E:\Midi\Pi.mid"); MidiWriter writer = new MidiWriter(midiout.BaseStream); writer.Init(); var filter = new TrackFilter(); MidiFileInfo info = MidiFileInfo.Parse(midiin.BaseStream); writer.WriteDivision(info.Division); writer.WriteNtrks((ushort)Math.Min(info.TrackCount, 65535)); writer.WriteFormat(info.Format); for (int i = 0; i < info.TrackCount; i++) { Console.WriteLine("Priocessing track: " + i); byte[] trackbytes = new byte[info.Tracks[i].Length]; midiin.BaseStream.Position = info.Tracks[i].Start; midiin.BaseStream.Read(trackbytes, 0, (int)info.Tracks[i].Length); writer.InitTrack(); long prevtime = 0; double hue = i * 60; int d = 3; filter.MidiEventFilter = (byte[] dtimeb, int dtime, byte[] data, long time) => { byte[] e = new byte[] { 0xFF, 0x0A, 0x08, 0x00, 0x0F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF }; //byte[] e = new byte[] { 0xFF, 0x0A, 0x0C, 0x00, 0x0F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF }; if (time - prevtime > d) { List <byte> o = new List <byte>(); long start = time - dtime; while (prevtime + d < time) { prevtime += d; int delta = (int)(prevtime - start); int r, g, b; HsvToRgb(hue, 1, 1, out r, out g, out b); hue += 1; hue = hue % 360; e[7] = (byte)r; e[8] = (byte)g; e[9] = (byte)b; //HsvToRgb(hue + 60, 1, 1, out r, out g, out b); //hue += 1; //hue = hue % 360; //e[11] = (byte)r; //e[12] = (byte)g; //e[13] = (byte)b; o.AddRange(filter.MakeVariableLen(delta)); o.AddRange(e); start += delta; } o.AddRange(filter.MakeVariableLen((int)(time - start))); o.AddRange(data); return(o.ToArray()); } return(dtimeb.Concat(data).ToArray()); }; var newtrackbytes = filter.FilterTrack(new MemoryByteReader(trackbytes)); writer.Write(newtrackbytes); writer.EndTrack(); } writer.Close(); }