Beispiel #1
0
    /// <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);
    }
Beispiel #2
0
        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();
        }