public void SendMidiMessage(MidiMessage message, long timestamp) { sequenceNumber++; long currentTimeIn100Microseconds = RtpMidiSession.GetCurrentTimestamp(); int rtpTimestamp = ((int)currentTimeIn100Microseconds); RtpHeader rtpHeader = new RtpHeader((byte)2, false, false, (byte)0, false, (byte)97, sequenceNumber, rtpTimestamp, Ssrc); Log.Debug("RtpMidi", "Sending RTP-Header: {}", rtpHeader); bool b = message.Length > 15; MidiCommandHeader midiCommandHeader = new MidiCommandHeader(b, false, false, false, (short)message.Length, rtpHeader); var commandCol = new List <MidiTimestampPair>(); commandCol.Add(new MidiTimestampPair(0, message)); RtpMidiMessage rtpMidiMessage = new RtpMidiMessage(midiCommandHeader, commandCol); try { RtpMidiMessageSender.Send(rtpMidiMessage, RtpMidiServer); } catch (IOException e) { Log.Error("RtpMidi", "Error sending MidiMessage to {}", RtpMidiServer, e); } }
public void OnMidiMessage(MidiCommandHeader midiCommandHeader, MidiMessage message, int timestamp) { RtpMidiSessionConnection sessionTuple = currentSessions.GetValueOrDefault(midiCommandHeader.RtpHeader.Ssrc); if (sessionTuple != null) { sessionTuple.RtpMidiSession.OnMidiMessage(midiCommandHeader, message, timestamp); } else { Log.Debug("RtpMidi", "Could not find session for ssrc: {}", Ssrc); } }
public void OnMidiMessage(MidiCommandHeader midiCommandHeader, MidiMessage message, int timestamp) { Log.Debug("RtpMidi", "MIDI message: midiCommandHeader: {}, message: {}, timestamp: {}", midiCommandHeader, message, timestamp); }
private List <MidiTimestampPair> ReadMidiMessages(MidiCommandHeader midiCommandHeader, DataInputStream midiInputStream) { List <MidiTimestampPair> result = new List <MidiTimestampPair>(); int status = -1; ByteArrayOutputStream sysexDataStream = null; int deltaTimeSum = midiCommandHeader.RtpHeader.Timestamp; while (midiInputStream.Available() > 0) { int deltaTime; if (midiCommandHeader.Z) { deltaTime = ReadDeltaTime(midiInputStream); } else { deltaTime = 0; } deltaTimeSum += deltaTime; byte midiOctet1 = (byte)midiInputStream.ReadByte(); bool systemCommonMessage = (midiOctet1 & 0xF0) == 0xF0; int possibleStatus = midiOctet1 & 0xFF; if (systemCommonMessage) { if (midiOctet1 == (byte)SysexMessage.SYSTEM_EXCLUSIVE) { sysexDataStream = new ByteArrayOutputStream(); sysexDataStream.Write(midiOctet1); bool partial = ReadSysexData(midiInputStream, sysexDataStream); if (!partial) { result.Add(new MidiTimestampPair(deltaTimeSum, new SysexMessage(sysexDataStream.ToByteArray(), sysexDataStream.Size()))); } } else if (midiOctet1 == (byte)SysexMessage.SPECIAL_SYSTEM_EXCLUSIVE) { bool partial = ReadSysexData(midiInputStream, sysexDataStream); if (!partial) { result.Add(new MidiTimestampPair(deltaTimeSum, new SysexMessage(sysexDataStream.ToByteArray(), sysexDataStream.Size()))); } } else if (midiOctet1 == (byte)0xF4) { sysexDataStream.Reset(); } else { ShortMessage shortMessage = null; switch (possibleStatus) { case ShortMessage.TUNE_REQUEST: case ShortMessage.TIMING_CLOCK: case ShortMessage.START: case ShortMessage.STOP: case ShortMessage.ACTIVE_SENSING: case ShortMessage.SYSTEM_RESET: status = possibleStatus; shortMessage = new ShortMessage((byte)(status & 0xFF)); break; case ShortMessage.MIDI_TIME_CODE: case ShortMessage.SONG_SELECT: status = possibleStatus; shortMessage = new ShortMessage((byte)(status & 0xFF), (byte)midiInputStream.ReadByte()); break; case ShortMessage.SONG_POSITION_POINTER: status = possibleStatus; shortMessage = new ShortMessage((byte)(status & 0xFF), (byte)midiInputStream.ReadByte(), (byte)midiInputStream.ReadByte()); break; default: Log.Error("RtpMidi", "Invalid Message-status: {}", possibleStatus); break; } if (shortMessage != null) { result.Add(new MidiTimestampPair(deltaTimeSum, shortMessage)); } } } else { ShortMessage shortMessage = null; switch (midiOctet1 & 0xF0) { case ShortMessage.NOTE_OFF: case ShortMessage.NOTE_ON: case ShortMessage.POLY_PRESSURE: case ShortMessage.CONTROL_CHANGE: case ShortMessage.PITCH_BEND: status = possibleStatus; shortMessage = new ShortMessage((byte)(status & 0xFF), (byte)midiInputStream.ReadByte(), (byte)midiInputStream.ReadByte()); break; case ShortMessage.PROGRAM_CHANGE: case ShortMessage.CHANNEL_PRESSURE: status = possibleStatus; shortMessage = new ShortMessage((byte)(status & 0xFF), (byte)midiInputStream.ReadByte()); break; default: Log.Error("rtpMidi", "Invalid ShortMessage-status: {}", midiOctet1 & 0xF0); break; } if (shortMessage != null) { result.Add(new MidiTimestampPair(deltaTimeSum, shortMessage)); } } } return(result); }
public void Handle(byte[] data, RtpMidiServer rtpMidiServer) { DataInputStream dataInputStream = new DataInputStream(new MemoryStream(data)); byte header1 = (byte)dataInputStream.ReadByte(); byte version = (byte)((header1 >> 6) & 0x03); bool paddingFlag = ((header1 >> 5) & 0x01) == 1; bool extensionFlag = ((header1 >> 4) & 0x01) == 1; byte contributingSourceIdentifiersCount = (byte)(header1 & 0x0F); byte header2 = (byte)dataInputStream.ReadByte(); bool markerFlag = ((header2 >> 7) & 0x01) == 1; byte payloadType = (byte)(header2 & 0x7F); if (payloadType != RTP_MIDI) { return; } short sequenceNumber = dataInputStream.ReadShort(); int timestamp = dataInputStream.ReadInt(); int ssrc = dataInputStream.ReadInt(); RtpHeader rtpHeader = new RtpHeader(version, paddingFlag, extensionFlag, contributingSourceIdentifiersCount, markerFlag, payloadType, sequenceNumber, timestamp, ssrc); byte midiCommandHeader1 = (byte)dataInputStream.ReadByte(); bool b = ((midiCommandHeader1 >> 7) & 0x01) == 1; bool j = ((midiCommandHeader1 >> 6) & 0x01) == 1; bool z = ((midiCommandHeader1 >> 5) & 0x01) == 1; bool p = ((midiCommandHeader1 >> 4) & 0x01) == 1; // Header 2 octets short length; if (b) { byte midiCommandHeader2 = (byte)dataInputStream.ReadByte(); length = (short)((midiCommandHeader1 << 8 | midiCommandHeader2) & 0x0FFF); } else { length = (short)(midiCommandHeader1 & 0x0F); } MidiCommandHeader midiCommandHeader = new MidiCommandHeader(b, j, z, p, length, rtpHeader); byte[] midiCommandBuffer = new byte[length]; int midiCommandBytesRead = dataInputStream.Read(midiCommandBuffer); if (((short)midiCommandBytesRead) != length) { return; } List <MidiTimestampPair> messages = new List <MidiTimestampPair>(); try { DataInputStream midiInputStream = new DataInputStream(new MemoryStream(midiCommandBuffer)); messages.AddRange(ReadMidiMessages(midiCommandHeader, midiInputStream)); HandleMessage(new RtpMidiMessage(midiCommandHeader, messages)); } catch (System.IO.IOException e) { Log.Error("RtpMidi", "IOException while processing MIDI message", e); } }
public virtual void OnMidiMessage(MidiCommandHeader midiCommandHeader, MidiMessage message, int timestamp) { OnMidiMessage(message, timestamp + OffsetEstimate); }