/// MESSAGE methods /// <inheritdoc/> public void OnMidiMessage( MidiMsgType msgType, int nTrackIndex, int nTrackOffset, int stat32, byte stat8, long pulse, int statR, bool isRunningStatus) { if (GenerateMessageList) { // we need to first clear the MidiMessageCollection! MidiMessages.AddV( nTrackIndex, new MidiMessage( (ushort)stat32, pulse, GetMessageBytes(nTrackIndex, isRunningStatus ? nTrackOffset - 1 : nTrackOffset, (ushort)stat32) )); } if (ProcessMidiMessage != null) { ProcessMidiMessage(this, new MidiMessageEvent(msgType, nTrackIndex, nTrackOffset, stat32, stat8, pulse, statR, isRunningStatus)); } if (MessageHandlers.Count > 0) { DispatchHandlers(msgType, nTrackIndex, nTrackOffset, stat32, stat8, pulse, statR, isRunningStatus); } }
/// <summary> /// </summary> /// <param name="delta"></param> /// <param name="msgType">Typically 8, 9, A, B and C</param> /// <param name="data">Must be a length of 4 bytes.</param> public MidiMessage(MidiMsgType t, ulong delta, int message, params byte[] data) { this.Data = data; this.DeltaTime = delta; this.Message = message; this.messageFlag = t; }
/// MESSAGE methods void DispatchHandlers(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { foreach (MidiEventDelegate method in MessageHandlers) { method(t, track, offset, imsg, bmsg, ppq, rse, isrse); } }
// // #endregion void GotMidiEventD(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { if (t == MidiMsgType.NoteOn || t == MidiMsgType.NoteOff) { UserInterface.MidiParser.CheckNote(t, ppq, Convert.ToByte((rse) & 0x0F), offset, bmsg, isrse); } }
/// <summary> /// </summary> /// <param name="pMsgType">Typically 8, 9, A, B and C</param> /// <param name="pPulse">Pulses (timing foundation)</param> /// <param name="pIntMessage">Must be a length of 4 bytes.</param> /// <param name="pMsgData">Must be a length of 4 bytes.</param> public MIDIMessageVST(MidiMsgType pMsgType, long pPulse, int pIntMessage, params byte[] pMsgData) { Pulse = pPulse; MessageFlag = pMsgType; Message = pIntMessage; Data = pMsgData; }
// ========================================================================== // // This is an example usage having added this to the MidiParser as follows // // ========================================================================== // // if (!SomeContainer.MidiParser.MessageHandlers.Contains(GotMidiEventD)) // SomeContainer.MidiParser.MessageHandlers.Add(GotMidiEventD); // // ========================================================================== // // The following method is triggered on channel-selection. // // - see MidiReader.OnMidiMessage() // - see MidiReader.DispatchHandlers() // // ========================================================================== // // static public void GotMidiEventD(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) // { // if ( t== MidiMsgType.NoteOn || t== MidiMsgType.NoteOff ) // { // UserInterface.MidiParser.CheckNote(t,ppq,Convert.ToByte((rse) & 0x0F),offset,bmsg,isrse); // } // } // // ========================================================================== /// <inheritdoc/> public void CheckNote(MidiMsgType type, long ppq, byte ch, int offset, byte b, bool rs) { byte n = 0, v = 0; switch (type) { case MidiMsgType.ControllerChange: n = this[ReaderIndex, offset + (rs ? 0 : 1)]; v = this[ReaderIndex, offset + (rs ? 0 : 1) + 1]; break; case MidiMsgType.NoteOn: n = this[ReaderIndex, offset + (rs ? 0 : 1)]; v = this[ReaderIndex, offset + (rs ? 0 : 1) + 1]; if (v == 0) { CloseNote(ppq, n, v); } else { Notes.Add(new MidiNote(ch, n, ppq, v)); } break; case MidiMsgType.NoteOff: n = this[ReaderIndex, offset + (rs ? 0 : 1)]; v = this[ReaderIndex, offset + (rs ? 0 : 1) + 1]; CloseNote(ppq, n, v); break; } }
/// <inheritdoc/> public void CheckNote(MidiMsgType type, ulong ppq, byte ch, int offset, byte b, bool rs) { byte n = 0, v = 0; switch (type) { case MidiMsgType.CC: n = this[SelectedTrackNumber, offset + (rs ? 0 : 1)]; v = this[SelectedTrackNumber, offset + (rs ? 0 : 1) + 1]; Debug.Print("Control Change : {0}{1} {2}", SmfStringFormatter.GetKeySharp(n), SmfStringFormatter.GetOctave(n), v); break; case MidiMsgType.NoteOn: n = this[SelectedTrackNumber, offset + (rs ? 0 : 1)]; v = this[SelectedTrackNumber, offset + (rs ? 0 : 1) + 1]; // Debug.Print("Note On : {0}{1} {2}",SmfStringFormatter.GetKeySharp(n),SmfStringFormatter.GetOctave(n),v); if (v == 0) CloseNote(ppq, n, v); else Notes.Add(new MidiNote(ch, n, ppq, v)); break; case MidiMsgType.NoteOff: n = this[SelectedTrackNumber, offset + (rs ? 0 : 1)]; v = this[SelectedTrackNumber, offset + (rs ? 0 : 1) + 1]; // Debug.Print("Note Off: {0}{1} {2}",SmfStringFormatter.GetKeySharp(n),SmfStringFormatter.GetOctave(n),v); CloseNote(ppq, n, v); break; } }
// ========================================================================== // // This is an example usage having added this to the MidiParser as follows // // ========================================================================== // // if (!SomeContainer.MidiParser.MessageHandlers.Contains(GotMidiEventD)) // SomeContainer.MidiParser.MessageHandlers.Add(GotMidiEventD); // // ========================================================================== // // The following method is triggered on channel-selection. // // - see MidiReader.OnMidiMessage() // - see MidiReader.DispatchHandlers() // // ========================================================================== // // static public void GotMidiEventD(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) // { // if ( t== MidiMsgType.NoteOn || t== MidiMsgType.NoteOff ) // { // UserInterface.MidiParser.CheckNote(t,ppq,Convert.ToByte((rse) & 0x0F),offset,bmsg,isrse); // } // } // // ========================================================================== /// <inheritdoc/> public void CheckNote(MidiMsgType type, ulong ppq, byte ch, int offset, byte b, bool rs) { byte n = 0, v = 0; switch (type) { case MidiMsgType.CC: n = this[SelectedTrackNumber, offset + (rs ? 0 : 1)]; v = this[SelectedTrackNumber, offset + (rs ? 0 : 1) + 1]; break; case MidiMsgType.NoteOn: n = this[SelectedTrackNumber, offset + (rs ? 0 : 1)]; v = this[SelectedTrackNumber, offset + (rs ? 0 : 1) + 1]; if (v == 0) { CloseNote(ppq, n, v); } else { Notes.Add(new MidiNote(ch, n, ppq, v)); } break; case MidiMsgType.NoteOff: n = this[SelectedTrackNumber, offset + (rs ? 0 : 1)]; v = this[SelectedTrackNumber, offset + (rs ? 0 : 1) + 1]; CloseNote(ppq, n, v); break; } }
/// MESSAGE methods void DispatchHandlers(MidiMsgType t, int nTrackIndex, int nTrackOffset, int stat32, byte stat8, long pulse, int statR, bool isRunningStatus) { foreach (MidiEventDelegate method in MessageHandlers) { method(t, nTrackIndex, nTrackOffset, stat32, stat8, pulse, statR, isRunningStatus); } }
/// MESSAGE methods /// <inheritdoc/> public void OnMidiMessage(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { if (ProcessMidiMessage != null) { ProcessMidiMessage(this, new MidiMessageEvent(t, track, offset, imsg, bmsg, ppq, rse, isrse)); } if (MessageHandlers.Count > 0) { DispatchHandlers(t, track, offset, imsg, bmsg, ppq, rse, isrse); } }
public MidiMessageEvent(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { this.MsgT = t; this.Track = track; this.Offset = offset; this.IntMsg = imsg; this.ByteMsg = bmsg; this.Ppq = ppq; this.Rse = rse; this.IsRse = isrse; }
public MidiMessageEvent(MidiMsgType msgType, int nTrackIndex, int nTrackOffset, int midiMsg32, byte midiMsg8, long pulse, int delta, bool isRunningStatus) { MessageType = msgType; NTrackIndex = nTrackIndex; NTrackOffset = nTrackOffset; MessageInt32 = midiMsg32; MessageByte = midiMsg8; Pulse = pulse; Delta = delta; IsRunningStatus = isRunningStatus; }
void VSTMessageListHandler(MidiMsgType msgType, int nTrackIndex, int nTrackOffset, int midiMsg32, byte midiMsg8, long pulse, int delta, bool isRunningStatus) { switch (msgType) { case MidiMsgType.MetaStr: MidiVSTMessageList.AddV(nTrackIndex, new MetaMessageVST(MidiMsgType.MetaStr, pulse, midiMsg32, GetMetadataBytes(nTrackIndex, nTrackOffset))); break; case MidiMsgType.MetaInf: byte[] bytes = GetMetadataBytes(nTrackIndex, nTrackOffset); var midiMsg = new MetaMessageVST(pulse, midiMsg32, bytes); MidiVSTMessageList.AddV(nTrackIndex, midiMsg); break; case MidiMsgType.SystemExclusive: Debug.WriteLine("Skip System Exclusive Message (for now)"); break; case MidiMsgType.ChannelVoice: case MidiMsgType.NoteOff: case MidiMsgType.NoteOn: MidiVSTMessageList.AddV(nTrackIndex, new ChannelMessageVST(pulse, midiMsg32, GetEventValue(nTrackIndex, nTrackOffset + 1))); break; case MidiMsgType.SequencerSpecific: MidiVSTMessageList.AddV(nTrackIndex, new SequencerSpecificVST(pulse, midiMsg32, GetEventValue(nTrackIndex, nTrackOffset + 1))); break; case MidiMsgType.SequencerSpecificUnknown: MidiVSTMessageList.AddV(nTrackIndex, new SequencerSpecificUnkn((ushort)midiMsg32, pulse, midiMsg32, GetEventValue(nTrackIndex, nTrackOffset + 1))); break; case MidiMsgType.EOT: MidiVSTMessageList.AddV(nTrackIndex, new MetaMessageVST(pulse, midiMsg32)); break; default: if (isRunningStatus) { MidiVSTMessageList.AddV(nTrackIndex, new ChannelMessageVST(pulse, delta, GetEventValue(nTrackIndex, nTrackOffset))); } else { MidiVSTMessageList.AddV(nTrackIndex, new ChannelMessageVST(pulse, delta, GetEventValue(nTrackIndex, nTrackOffset + 1))); } break; } }
internal static MidiMsgType GetMidiMessageType(int status, MidiMsgType def = MidiMsgType.ChannelVoice) { switch (status & 0xF0) { case 0x80: return(MidiMsgType.NoteOff); case 0x90: return(MidiMsgType.NoteOn); case 0xB0: return(MidiMsgType.ControllerChange); case 0xF0: return(MidiMsgType.SystemExclusive); case 0xF7: return(MidiMsgType.SequencerSpecific); // case 12: return MsgType.CC; default: return(def); } }
void PARSER_MidiDataList(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { switch (t) { case MidiMsgType.MetaStr: midiDataList.AddV(SelectedTrackNumber, new MidiMetaMessage(MidiMsgType.MetaStr, ppq, imsg, GetMetaBString(offset))); break; case MidiMsgType.MetaInf: midiDataList.AddV(SelectedTrackNumber, new MidiMetaMessage(ppq, imsg, GetMetaData(offset))); break; case MidiMsgType.System: case MidiMsgType.SysCommon: // MetaHelpers.MetaNameFF( imsg ) if (imsg == 0xFF7F) { // { // Debug.Print("rse? {0} -----------sys---------------\n{1}",isrse ? 0 :1, SmfStringFormatter.byteToString(GetEventValue(offset))); midiDataList.AddV(SelectedTrackNumber, new MidiSysexMessage(ppq, imsg, GetMetaValue(offset))); } // } else if (imsg == 0xF0) { Debug.Print("0xF0 {0} {1}", isrse, GetEventValue(offset).StringifyHex()); midiDataList.AddV(SelectedTrackNumber, new MidiSysexMessage(ppq, imsg, GetEventValue(offset))); } break; default: if (isrse) { MidiDataList.AddV(SelectedTrackNumber, new MidiChannelMessage(ppq, rse, GetRseEventValue(offset))); } else { MidiDataList.AddV(SelectedTrackNumber, new MidiChannelMessage(ppq, rse, GetEventValue(offset))); } break; } }
// ========================================================================== // // This is an example usage having added this to the MidiParser as follows // // ========================================================================== // // if (!SomeContainer.MidiParser.MessageHandlers.Contains(GotMidiEventD)) // SomeContainer.MidiParser.MessageHandlers.Add(GotMidiEventD); // // ========================================================================== // // The following method is triggered on channel-selection. // // - see MidiReader.OnMidiMessage() // - see MidiReader.DispatchHandlers() // // ========================================================================== // // static public void GotMidiEventD(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) // { // if ( t== MidiMsgType.NoteOn || t== MidiMsgType.NoteOff ) // { // UserInterface.MidiParser.CheckNote(t,ppq,Convert.ToByte((rse) & 0x0F),offset,bmsg,isrse); // } // } // // ========================================================================== /// <inheritdoc/> public void CheckNote(MidiMsgType type, ulong ppq, byte ch, int offset, byte b, bool rs) { byte n = 0, v = 0; switch (type) { case MidiMsgType.CC: n = this[SelectedTrackNumber, offset + (rs ? 0 : 1)]; v = this[SelectedTrackNumber, offset + (rs ? 0 : 1) + 1]; break; case MidiMsgType.NoteOn: n = this[SelectedTrackNumber, offset + (rs ? 0 : 1)]; v = this[SelectedTrackNumber, offset + (rs ? 0 : 1) + 1]; if (v == 0) CloseNote(ppq, n, v); else Notes.Add(new MidiNote(ch, n, ppq, v)); break; case MidiMsgType.NoteOff: n = this[SelectedTrackNumber, offset + (rs ? 0 : 1)]; v = this[SelectedTrackNumber, offset + (rs ? 0 : 1) + 1]; CloseNote(ppq, n, v); break; } }
void GotMidiEventD(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { timing.SolveSamples( ppq, UserInterface.VstContainer.VstPlayer.Settings.Rate, UserInterface.MidiParser.MidiTimeInfo.Tempo, UserInterface.MidiParser.SmfFileHandle.Division, true ); switch (t) { case MidiMsgType.MetaStr: lve.AddItem(MidiReader.c4, UserInterface.MidiParser.GetMbtString(ppq), string.Empty, string.Empty, MetaHelpers.MetaNameFF(imsg), UserInterface.MidiParser.GetMetaString(offset)); break; case MidiMsgType.MetaInf: lve.AddItem(UserInterface.MidiParser.GetEventColor(imsg, MidiReader.cR), UserInterface.MidiParser.GetMbtString(ppq), string.Empty, string.Empty, MetaHelpers.MetaNameFF(imsg), UserInterface.MidiParser.GetMetaSTR(offset)); break; case MidiMsgType.SysCommon: case MidiMsgType.System: lve.AddItem(UserInterface.MidiParser.GetEventColor(imsg, MidiReader.cR), UserInterface.MidiParser.GetMbtString(ppq), string.Empty, string.Empty, MetaHelpers.MetaNameFF(imsg), UserInterface.MidiParser.GetMetaSTR(offset)); break; default: // case MsgType.Channel: if (isrse) { lve.AddItem(UserInterface.MidiParser.GetRseEventColor(UserInterface.MidiParser.Colors["225"]), UserInterface.MidiParser.GetMbtString(ppq), timing.TimeString, bmsg == 0xF0?"":(rse & 0x0F).ToString(), UserInterface.MidiParser.GetRseEventString(offset), UserInterface.MidiParser.chRseV(offset)); } else { lve.AddItem(UserInterface.MidiParser.GetEventColor(UserInterface.MidiParser.Colors["225"]), UserInterface.MidiParser.GetMbtString(ppq), timing.TimeString, bmsg == 0xF0?"":(rse & 0x0F).ToString(), UserInterface.MidiParser.GetEventString(offset), UserInterface.MidiParser.chV(offset)); } // if (t== MsgType.NoteOn||t== MsgType.NoteOff) UserInterface.MidiParser.CheckNote(t,ppq,Convert.ToByte((rse) & 0x0F),offset,bmsg,isrse); break; } }
MidiMsgType GetMsgTyp(byte status, MidiMsgType def = MidiMsgType.Channel) { // Debug.Print("? {0:X}",status); switch (status & 0xf0) { case 0x80: return(MidiMsgType.NoteOff); case 0x90: return(MidiMsgType.NoteOn); case 0xb0: return(MidiMsgType.CC); case 0xF0: case 0xF7: return(MidiMsgType.System); default: // case 12: return MsgType.CC; return(def); } }
MidiMsgType GetMsgTyp(int status, MidiMsgType def = MidiMsgType.Channel) { return(GetMsgTyp(Convert.ToByte(status & 0xf0), def)); }
public MidiMessageEvent(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse) : this(t,track,offset,imsg,bmsg,ppq,rse,false) { }
public MidiMetaMessage(MidiMsgType t, ulong delta, int message, params byte[] data) : base(t, delta, message, data) { MessageLength = data.Length; }
void GotMidiEventD(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { timing.SolveSamples( ppq, UserInterface.VstContainer.VstPlayer.Settings.Rate, UserInterface.MidiParser.MidiTimeInfo.Tempo, UserInterface.MidiParser.SmfFileHandle.Division, true ); switch (t) { case MidiMsgType.MetaStr: lve.AddItem( MidiReader.c4, UserInterface.MidiParser.GetMbtString( ppq ), string.Empty, string.Empty, MetaHelpers.MetaNameFF( imsg ), UserInterface.MidiParser.GetMetaString( offset ) ); break; case MidiMsgType.MetaInf: lve.AddItem( UserInterface.MidiParser.GetEventColor(imsg,MidiReader.cR), UserInterface.MidiParser.GetMbtString( ppq ), string.Empty, string.Empty, MetaHelpers.MetaNameFF( imsg ), UserInterface.MidiParser.GetMetaSTR( offset ) ); break; case MidiMsgType.SysCommon: case MidiMsgType.System: lve.AddItem( UserInterface.MidiParser.GetEventColor(imsg,MidiReader.cR), UserInterface.MidiParser.GetMbtString( ppq ), string.Empty, string.Empty, MetaHelpers.MetaNameFF( imsg ), UserInterface.MidiParser.GetMetaSTR( offset ) ); break; default: // case MsgType.Channel: if (isrse) lve.AddItem( UserInterface.MidiParser.GetRseEventColor( UserInterface.MidiParser.Colors["225"] ), UserInterface.MidiParser.GetMbtString( ppq ), timing.TimeString, bmsg==0xF0?"":(rse & 0x0F).ToString(),UserInterface.MidiParser.GetRseEventString( offset ), UserInterface.MidiParser.chRseV( offset ) ); else lve.AddItem( UserInterface.MidiParser.GetEventColor ( UserInterface.MidiParser.Colors["225"] ), UserInterface.MidiParser.GetMbtString( ppq ), timing.TimeString, bmsg==0xF0?"":(rse & 0x0F).ToString(),UserInterface.MidiParser.GetEventString ( offset ), UserInterface.MidiParser.chV ( offset ) ); // if (t== MsgType.NoteOn||t== MsgType.NoteOff) UserInterface.MidiParser.CheckNote(t,ppq,Convert.ToByte((rse) & 0x0F),offset,bmsg,isrse); break; } }
/// MESSAGE methods /// <inheritdoc/> public void OnMidiMessage(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { if (ProcessMidiMessage != null) ProcessMidiMessage(this, new MidiMessageEvent(t, track, offset, imsg, bmsg, ppq, rse, isrse)); if (MessageHandlers.Count>0) DispatchHandlers(t, track, offset, imsg, bmsg, ppq, rse, isrse); }
void ShowProgress(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { try { this.toolStripProgressBar1.Value = (int)(((double)offset / trackLen) * 100f); cycles = (cycles++ % cycle); } catch { } }
/// MESSAGE methods void DispatchHandlers(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { foreach (MidiEventDelegate method in MessageHandlers) method(t, track, offset, imsg, bmsg, ppq, rse, isrse); }
MidiMsgType GetMsgTyp(int status, MidiMsgType def = MidiMsgType.Channel) { return GetMsgTyp(Convert.ToByte(status & 0xf0), def); }
public MidiMessageEvent(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse) : this(t, track, offset, imsg, bmsg, ppq, rse, false) { }
MidiMsgType GetMsgTyp(byte status, MidiMsgType def = MidiMsgType.Channel) { // Debug.Print("? {0:X}",status); switch (status & 0xf0) { case 0x80: return MidiMsgType.NoteOff; case 0x90: return MidiMsgType.NoteOn; case 0xb0: return MidiMsgType.CC; case 0xF0: case 0xF7: return MidiMsgType.System; default: // case 12: return MsgType.CC; return def; } }
public MidiMessageEvent(MidiMsgType msgType, int nTrackIndex, int nTrackOffset, int midiMsg32, byte midiMsg8, long pulse, int delta) : this(msgType, nTrackIndex, nTrackOffset, midiMsg32, midiMsg8, pulse, delta, false) { }
void PARSER_MidiDataList(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { switch (t) { case MidiMsgType.MetaStr: midiDataList.AddV(SelectedTrackNumber,new MidiMetaMessage(MidiMsgType.MetaStr,ppq,imsg,GetMetaBString(offset))); break; case MidiMsgType.MetaInf: midiDataList.AddV(SelectedTrackNumber,new MidiMetaMessage(ppq,imsg,GetMetaData(offset))); break; case MidiMsgType.System: case MidiMsgType.SysCommon: // MetaHelpers.MetaNameFF( imsg ) if (imsg==0xFF7F) // { // Debug.Print("rse? {0} -----------sys---------------\n{1}",isrse ? 0 :1, SmfStringFormatter.byteToString(GetEventValue(offset))); midiDataList.AddV(SelectedTrackNumber,new MidiSysexMessage(ppq,imsg,GetMetaValue(offset))); // } else if (imsg==0xF0) { Debug.Print("0xF0 {0} {1}",isrse, GetEventValue(offset).StringifyHex()); midiDataList.AddV(SelectedTrackNumber,new MidiSysexMessage(ppq,imsg,GetEventValue(offset))); } break; default: if (isrse) MidiDataList.AddV(SelectedTrackNumber,new MidiChannelMessage(ppq,rse,GetRseEventValue(offset))); else MidiDataList.AddV(SelectedTrackNumber,new MidiChannelMessage(ppq,rse,GetEventValue(offset))); break; } }
public MidiMetaMessage(MidiMsgType t, ulong delta, int message, params byte[] data) : base(t,delta,message,data) { MessageLength = data.Length; }
// #endregion void GotMidiEventD(MidiMsgType t, int track, int offset, int imsg, byte bmsg, ulong ppq, int rse, bool isrse) { if (t== MidiMsgType.NoteOn||t== MidiMsgType.NoteOff) { UserInterface.MidiParser.CheckNote(t,ppq,Convert.ToByte((rse) & 0x0F),offset,bmsg,isrse); } }