public void BuildTracks() { var result = from fileEvent in this.events group fileEvent by(((MidiShortMessage)fileEvent.Message).Status& 0x0F) into trackGroups orderby trackGroups.Key select new MTrkChunk { Events = trackGroups }; // fix the delta times foreach (var track in result) { MidiFileEvent lastEvent = null; foreach (var fileEvent in track.Events) { if (lastEvent != null) { fileEvent.DeltaTime = fileEvent.AbsoluteTime - lastEvent.AbsoluteTime; } else { fileEvent.DeltaTime = 0; } lastEvent = fileEvent; } } this.Tracks = result.ToList(); }
public MidiNote(long deltaTime, long absoluteTime, int data) { midiEvent = new MidiFileEvent(); midiEvent.DeltaTime = deltaTime; midiEvent.AbsoluteTime = absoluteTime; midiEvent.Message = new MidiChannelMessage(data); }
public void ShortData(int data, long timestamp) { var evnt = new MidiFileEvent(); evnt.Message = this.factory.CreateShortMessage(data); evnt.AbsoluteTime = timestamp; this.appData.Events.Add(evnt); }
public void ShortData(int data, long timestamp) { var evnt = new MidiFileEvent { Message = _factory.CreateShortMessage(data), AbsoluteTime = timestamp }; _appData.Events.Add(evnt); }
public void AddEndOfTrackMarkers() { if (this.Tracks != null) { foreach (var track in this.Tracks) { var eof = new MidiFileEvent(); eof.Message = new MidiMetaMessage(MidiMetaType.EndOfTrack, new byte[] { }); var list = new List <MidiFileEvent>(track.Events); var lastEvent = list[list.Count - 1]; eof.AbsoluteTime = lastEvent.AbsoluteTime + 1; eof.DeltaTime = 1; list.Add(eof); track.Events = list; } } }
internal MidiNote(MidiFileEvent midiEvent) { this.midiEvent = midiEvent; }
private static MidiOutPortBase ProcessStreaming(int outPortId, MidiFileData fileData, IEnumerable <MidiFileEvent> notes, MidiOutPortCaps caps) { var outPort = new MidiOutStreamPort(); outPort.Open(outPortId); outPort.BufferManager.Initialize(10, 1024); outPort.TimeDivision = fileData.Header.TimeDivision; // TODO: extract Tempo from meta messages from the file. // 120 bpm (uSec/QuarterNote). outPort.Tempo = 500000; Console.WriteLine(String.Format("Midi Out Stream Port '{0}' is now open.", caps.Name)); MidiMessageOutStreamWriter writer = null; MidiBufferStream buffer = null; MidiFileEvent lastNote = null; foreach (var note in notes) { if (writer == null) { // brute force buffer aqcuirement. // when callbacks are implemented this will be more elegant. do { buffer = outPort.BufferManager.RetrieveBuffer(); if (buffer != null) { break; } Thread.Sleep(50); } while (buffer == null); writer = new MidiMessageOutStreamWriter(buffer); } if (writer.CanWrite(note.Message)) { if (lastNote != null) { // fixup delta time artifically... writer.Write(note.Message, (int)(note.AbsoluteTime - lastNote.AbsoluteTime)); } else { writer.Write(note.Message, (int)note.DeltaTime); } } else { outPort.LongData(buffer); writer = null; Console.WriteLine("Buffer sent..."); if (!outPort.HasStatus(MidiPortStatus.Started)) { outPort.Restart(); } } lastNote = note; } return(outPort); }