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); }
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); }
/// <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); }