Example #1
0
        public MidiMusic DemoPixelMidi()
        {
            MidiMusic result = new MidiMusic();

            short noteLen = 0x03C0;
            int   offset  = 4 * noteLen;

            result.DeltaTimeSpec = noteLen;
            result.Format        = 1;

            var track_sys = GetMetaTrack(FileName);

            result.AddTrack(track_sys);

            var track = new MidiTrack();

            track.AddMessage(new MidiMessage(0, new MidiEvent(MidiEvent.Meta, 3, 0, Encoding.Default.GetBytes("Demo"))));
            var delta = new int[128];

            for (int x = 0; x < 128; x++)
            {
                var noteOn  = new MidiEvent(MidiEvent.NoteOn, (byte)x, 0x64, Encoding.Default.GetBytes(""));
                var noteOff = new MidiEvent(MidiEvent.NoteOn, (byte)x, 0x00, Encoding.Default.GetBytes(""));
                track.AddMessage(new MidiMessage(0, noteOn));
                track.AddMessage(new MidiMessage(offset, noteOff));
            }
            track.AddMessage(new MidiMessage(0, new MidiEvent(MidiEvent.Meta, 0x2F, 0, Encoding.Default.GetBytes(""))));
            result.AddTrack(track);

            return(result);
        }
Example #2
0
        public MidiMusic GetHistogramMidi(Bitmap bitmap, bool singleTrack = true)
        {
            MidiMusic result = null;

            if (bitmap is Bitmap)
            {
                var lastNoteCenter = NoteCenter;
                NoteCenter = 63;

                int delta = (int)(noteLen * NoteType);

                result = new MidiMusic();
                result.DeltaTimeSpec = noteLen;
                result.Format        = 1;

                var track_sys = GetMetaTrack(FileName);
                result.AddTrack(track_sys);

                var histogram = GetHistogram(bitmap, true);

                if (singleTrack)
                {
                    var hist  = MakeHistogram(histogram);
                    var track = GetPixelTrack(hist, $"{FileName}_Histogram", false, false);
                    if (track is MidiTrack)
                    {
                        result.AddTrack(track);
                    }
                }
                else
                {
                    var hist_a = MakeHistogram(histogram.A, Color.White);
                    var hist_r = MakeHistogram(histogram.R, Color.Red);
                    var hist_g = MakeHistogram(histogram.G, Color.Green);
                    var hist_b = MakeHistogram(histogram.B, Color.Blue);

                    var track_a = GetPixelTrack(hist_a, $"{FileName}_Histogram_A", false, false);
                    var track_r = GetPixelTrack(hist_r, $"{FileName}_Histogram_R", false, false);
                    var track_g = GetPixelTrack(hist_g, $"{FileName}_Histogram_G", false, false);
                    var track_b = GetPixelTrack(hist_b, $"{FileName}_Histogram_B", false, false);

                    if (track_a is MidiTrack)
                    {
                        result.AddTrack(track_a);
                    }
                    if (track_r is MidiTrack)
                    {
                        result.AddTrack(track_r);
                    }
                    if (track_g is MidiTrack)
                    {
                        result.AddTrack(track_g);
                    }
                    if (track_b is MidiTrack)
                    {
                        result.AddTrack(track_b);
                    }
                }
                NoteCenter = lastNoteCenter;

                Music = result;
            }

            return(result);
        }
Example #3
0
        /// <summary>
        ///
        /// -----------------------
        /// Type    Event
        /// -----------------------
        /// 0x00    Sequence number
        /// 0x01    Text event
        /// 0x02    Copyright notice
        /// 0x03    Sequence or track name
        /// 0x04    Instrument name
        /// 0x05    Lyric text
        /// 0x06    Marker text
        /// 0x07    Cue point
        /// 0x20    MIDI channel prefix assignment
        /// 0x2F    End of track
        /// 0x51    Tempo setting
        /// 0x54    SMPTE offset
        /// 0x58    Time signature
        /// 0x59    Key signature
        /// 0x7F    Sequencer specific event
        /// -----------------------
        ///
        ///
        /// </summary>
        /// <param name="bitmap"></param>
        /// <param name="singleTrack"></param>
        /// <returns></returns>
        public MidiMusic GetPixelMidi(Bitmap bitmap, bool singleTrack = true)
        {
            MidiMusic result = null;

            if (bitmap is Bitmap)
            {
                int delta = (int)(noteLen * NoteType);

                result = new MidiMusic();
                result.DeltaTimeSpec = noteLen;
                result.Format        = 1;

                var track_sys = GetMetaTrack(FileName);
                result.AddTrack(track_sys);

                if (singleTrack)
                {
                    var track = GetPixelTrack(bitmap, FileName);
                    result.AddTrack(track);
                }
                else
                {
                    var gray = GrayScale(bitmap.Height > 128 ? Resize(bitmap, 0, 128): bitmap);
                    if (InvertSource)
                    {
                        gray = Invert(gray);
                    }

                    Color c;
                    Color co    = gray.GetPixel(0, 0);
                    int   count = 0;

                    for (int y = 0; y < gray.Height; y++)
                    {
                        count = 0;
                        var track = new MidiTrack();
                        track.AddMessage(new MidiMessage(0, new MidiEvent(MidiEvent.Meta, 0x00, 0, Encoding.Default.GetBytes($"{y}"))));
                        track.AddMessage(new MidiMessage(0, new MidiEvent(MidiEvent.Meta, 0x03, 0, Encoding.Default.GetBytes($"{FileName}_{y}"))));
                        for (int x = 0; x < gray.Width; x++)
                        {
                            c = gray.GetPixel(x, y);
                            byte velocity = 0x40;
                            var  alpha    = CalcAlpha(c, co, out velocity);
                            if (alpha > 0)
                            {
                                var noteOn  = new MidiEvent(MidiEvent.NoteOn, 0x40, velocity, Encoding.Default.GetBytes(""));
                                var noteOff = new MidiEvent(MidiEvent.NoteOn, 0x40, 0x00, Encoding.Default.GetBytes(""));
                                track.AddMessage(new MidiMessage(count * delta, noteOn));
                                track.AddMessage(new MidiMessage(delta, noteOff));
                                count = 0;
                            }
                            else
                            {
                                count++;
                            }
                        }
                        track.AddMessage(new MidiMessage(0, new MidiEvent(MidiEvent.Meta, 0x2F, 0, Encoding.Default.GetBytes(""))));
                        result.AddTrack(track);
                    }
                }
            }
            Music = result;

            return(result);
        }