Esempio n. 1
0
        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();
        }
Esempio n. 2
0
 public MidiNote(long deltaTime, long absoluteTime, int data)
 {
     midiEvent              = new MidiFileEvent();
     midiEvent.DeltaTime    = deltaTime;
     midiEvent.AbsoluteTime = absoluteTime;
     midiEvent.Message      = new MidiChannelMessage(data);
 }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        public void ShortData(int data, long timestamp)
        {
            var evnt = new MidiFileEvent
            {
                Message      = _factory.CreateShortMessage(data),
                AbsoluteTime = timestamp
            };

            _appData.Events.Add(evnt);
        }
Esempio n. 5
0
        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;
                }
            }
        }
Esempio n. 6
0
 internal MidiNote(MidiFileEvent midiEvent)
 {
     this.midiEvent = midiEvent;
 }
Esempio n. 7
0
        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);
        }