private void HandleInvalidSysExMessage(object state) { lock (lockObject) { IntPtr headerPtr = (IntPtr)state; MidiHeader header = (MidiHeader)Marshal.PtrToStructure(headerPtr, typeof(MidiHeader)); if (!resetting) { byte[] data = new byte[header.bytesRecorded]; Marshal.Copy(header.data, data, 0, data.Length); OnInvalidSysExMessageReceived(new InvalidSysExMessageEventArgs(data)); int result = AddSysExBuffer(); if (result != MIDIExceptions.MMSYSERR_NOERROR) { Exception ex = new InputDeviceException(result); OnError(new ErrorEventArgs(ex)); } } ReleaseBuffer(headerPtr); } }
/// <summary> /// Releases the resources associated with the specified MidiHeader pointer. /// </summary> /// <param name="headerPtr"> /// The MidiHeader pointer. /// </param> public void Destroy(IntPtr headerPtr) { MidiHeader header = (MidiHeader)Marshal.PtrToStructure(headerPtr, typeof(MidiHeader)); Marshal.FreeHGlobal(header.data); Marshal.FreeHGlobal(headerPtr); }
/*private static HiPerfTimer t1 = new HiPerfTimer(); * private static double timer1_sum = 0.0; * private static int timer1_count = 0;*/ public static int SendLongMessage(int handle, byte[] data) { /*Debug.Write("Midi Out: "); * for(int i=0; i<data.Length; i++) * Debug.Write(data[i].ToString("X")+" "); * Debug.WriteLine("");*/ int result; IntPtr ptr; int size = Marshal.SizeOf(typeof(MidiHeader)); MidiHeader header = new MidiHeader(); header.data = Marshal.AllocHGlobal(data.Length); for (int i = 0; i < data.Length; i++) { Marshal.WriteByte(header.data, i, data[i]); } header.bufferLength = data.Length; header.bytesRecorded = data.Length; header.flags = 0; try { ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MidiHeader))); } catch (Exception) { Marshal.FreeHGlobal(header.data); throw; } try { Marshal.StructureToPtr(header, ptr, false); } catch (Exception) { Marshal.FreeHGlobal(header.data); Marshal.FreeHGlobal(ptr); throw; } result = MidiOutPrepareHeader(handle, ptr, size); if (result == 0) { result = MidiOutLongMessage(handle, ptr, size); } if (result == 0) { result = MidiOutUnprepareHeader(handle, ptr, size); } Marshal.FreeHGlobal(header.data); Marshal.FreeHGlobal(ptr); return(result); }
public static int AddSysExBuffer(int handle) { int result; IntPtr headerPtr; int size = Marshal.SizeOf(typeof(MidiHeader)); MidiHeader header = new MidiHeader(); header.bufferLength = 64; header.bytesRecorded = 0; header.data = Marshal.AllocHGlobal(64); header.flags = 0; try { headerPtr = Marshal.AllocHGlobal(size); } catch (Exception) { Marshal.FreeHGlobal(header.data); throw; } try { Marshal.StructureToPtr(header, headerPtr, false); } catch (Exception) { Marshal.FreeHGlobal(header.data); Marshal.FreeHGlobal(headerPtr); throw; } result = Midi.MidiInPrepareHeader(handle, headerPtr, size); if (result != 0) { return(result); } result = Midi.MidiInAddBuffer(handle, headerPtr, size); if (result != 0) { return(result); } return(result); }
public static void ReleaseBuffer(int handle, IntPtr headerPtr) { int result = MidiInUnprepareHeader(handle, headerPtr, Marshal.SizeOf(typeof(MidiHeader))); if (result != 0) { StringBuilder error_text = new StringBuilder(64); Midi.MidiInGetErrorText(result, error_text, 64); Debug.WriteLine("MidiInUnprepareHeader Error: " + error_text); return; } MidiHeader header = (MidiHeader)Marshal.PtrToStructure(headerPtr, typeof(MidiHeader)); Marshal.FreeHGlobal(header.data); Marshal.FreeHGlobal(headerPtr); }
public static int AddSysExBuffer(int handle) { int result; IntPtr headerPtr; int size = Marshal.SizeOf(typeof(MidiHeader)); MidiHeader header = new MidiHeader(); header.bufferLength = 64; header.bytesRecorded = 0; header.data = Marshal.AllocHGlobal(64); header.flags = 0; try { headerPtr = Marshal.AllocHGlobal(size); } catch(Exception) { Marshal.FreeHGlobal(header.data); throw; } try { Marshal.StructureToPtr(header, headerPtr, false); } catch(Exception) { Marshal.FreeHGlobal(header.data); Marshal.FreeHGlobal(headerPtr); throw; } result = Midi.MidiInPrepareHeader(handle, headerPtr, size); if(result != 0) return result; result = Midi.MidiInAddBuffer(handle, headerPtr, size); if(result != 0) return result; return result; }
/// <summary> /// Builds the pointer to the MidiHeader structure. /// </summary> public void Build() { MidiHeader header = new MidiHeader(); // Initialize the MidiHeader. header.bufferLength = BufferLength; header.bytesRecorded = 0; header.data = Marshal.AllocHGlobal(BufferLength); header.flags = 0; // Write data to the MidiHeader. for (int i = 0; i < BufferLength; i++) { Marshal.WriteByte(header.data, i, data[i]); } try { result = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MidiHeader))); } catch (Exception) { Marshal.FreeHGlobal(header.data); throw; } try { Marshal.StructureToPtr(header, result, false); } catch (Exception) { Marshal.FreeHGlobal(header.data); Marshal.FreeHGlobal(result); throw; } built = true; }
private void HandleSysExMessage(object state) { lock (lockObject) { IntPtr headerPtr = (IntPtr)state; MidiHeader header = (MidiHeader)Marshal.PtrToStructure(headerPtr, typeof(MidiHeader)); if (!resetting) { for (int i = 0; i < header.bytesRecorded; i++) { sysExData.Add(Marshal.ReadByte(header.data, i)); } if (sysExData[0] == 0xF0 && sysExData[sysExData.Count - 1] == 0xF7) { SysExMessage message = new SysExMessage(sysExData.ToArray()); sysExData.Clear(); OnSysExMessageReceived(new SysExMessageEventArgs(message)); } int result = AddSysExBuffer(); if (result != MIDIExceptions.MMSYSERR_NOERROR) { Exception ex = new InputDeviceException(result); OnError(new ErrorEventArgs(ex)); } } ReleaseBuffer(headerPtr); } }
public static extern int midiInAddBuffer(IntPtr hmi, ref MidiHeader lpMidiInHdr, int cbMidiInHdr);
public static extern int midiInUnprepareHeader(IntPtr hmi, ref MidiHeader lpMidiInHdr, int cbMidiInHdr);
public static extern int midiOutUnprepareHeader(int hMidiOut, ref MidiHeader lpMidiOutHdr, int uSize);
public static extern int midiOutLongMsg(int hMidiOut, ref MidiHeader lpMidiOutHdr, int uSize);
private void loadStream(Stream stream, bool reloading = false) { byte[] array = new byte[4]; stream.Read(array, 0, 4); if (Encoding.UTF8.GetString(array, 0, array.Length) != "MThd") { return; } midiHeader = new MidiHeader(); stream.Read(array, 0, 4); Array.Reverse(array); BitConverter.ToInt32(array, 0); array = new byte[2]; stream.Read(array, 0, 2); Array.Reverse(array); midiHeader.setMidiFormat(BitConverter.ToInt16(array, 0)); stream.Read(array, 0, 2); Array.Reverse(array); int num = BitConverter.ToInt16(array, 0); stream.Read(array, 0, 2); Array.Reverse(array); int num2 = BitConverter.ToInt16(array, 0); midiHeader.DeltaTiming = (num2 & 0x7FFF); midiHeader.TimeFormat = (((num2 & 0x8000) > 0) ? MidiHelper.MidiTimeFormat.FamesPerSecond : MidiHelper.MidiTimeFormat.TicksPerBeat); bool flag = (!reloading || tracks.Count != num) ? true : false; if (flag) { tracks.Clear(); seqEvt.Events.Clear(); } int num3 = 0; while (true) { if (num3 >= num) { return; } MidiTrack midiTrack = null; MidiSequencerEvent midiSequencerEvent = null; if (flag) { midiTrack = new MidiTrack(); tracks.Add(midiTrack); midiSequencerEvent = new MidiSequencerEvent(); seqEvt.Events.Add(midiSequencerEvent); } else { midiTrack = tracks[num3]; midiTrack.TotalTime = 0uL; midiSequencerEvent = seqEvt.Events[num3]; } List <byte> list = new List <byte>(); List <byte> list2 = new List <byte>(); List <MidiEvent> list3 = new List <MidiEvent>(); list.Add(0); list2.Add(0); array = new byte[4]; stream.Read(array, 0, 4); if (Encoding.UTF8.GetString(array, 0, array.Length) != "MTrk") { break; } stream.Read(array, 0, 4); Array.Reverse(array); int num4 = BitConverter.ToInt32(array, 0); array = new byte[num4]; stream.Read(array, 0, num4); int i = 0; byte b = 0; int num5 = 0; MidiEvent midiEvent; for (; i < array.Length; list3.Add(midiEvent), tracks[num3].TotalTime = tracks[num3].TotalTime + midiEvent.deltaTime) { ushort numOfBytes = 0; uint data = BitConverter.ToUInt32(array, i); midiEvent = new MidiEvent(); midiEvent.deltaTime = GetTime(data, ref numOfBytes); i += 4 - (4 - numOfBytes); byte b2 = array[i]; int num6 = GetChannel(b2); if (b2 < 128) { b2 = b; num6 = num5; i--; } if (b2 != byte.MaxValue) { b2 = (byte)(b2 & 0xF0); } b = b2; num5 = num6; switch (b2) { case 128: midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Note_Off; i++; midiEvent.channel = (byte)num6; midiEvent.Parameters[0] = midiEvent.channel; midiEvent.parameter1 = array[i++]; midiEvent.parameter2 = array[i++]; midiEvent.Parameters[1] = midiEvent.parameter1; midiEvent.Parameters[2] = midiEvent.parameter2; continue; case 144: midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Note_On; i++; midiEvent.channel = (byte)num6; midiEvent.Parameters[0] = midiEvent.channel; midiEvent.parameter1 = array[i++]; midiEvent.parameter2 = array[i++]; midiEvent.Parameters[1] = midiEvent.parameter1; midiEvent.Parameters[2] = midiEvent.parameter2; if (midiEvent.parameter2 == 0) { midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Note_Off; } tracks[num3].NotesPlayed++; continue; case 160: midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Note_Aftertouch; midiEvent.channel = (byte)num6; midiEvent.Parameters[0] = midiEvent.channel; i++; midiEvent.parameter1 = array[++i]; midiEvent.parameter2 = array[++i]; continue; case 176: midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Controller; midiEvent.channel = (byte)num6; midiEvent.Parameters[0] = midiEvent.channel; i++; midiEvent.parameter1 = array[i++]; midiEvent.parameter2 = array[i++]; midiEvent.Parameters[1] = midiEvent.parameter1; midiEvent.Parameters[2] = midiEvent.parameter2; continue; case 192: midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Program_Change; midiEvent.channel = (byte)num6; midiEvent.Parameters[0] = midiEvent.channel; i++; midiEvent.parameter1 = array[i++]; midiEvent.Parameters[1] = midiEvent.parameter1; if (midiEvent.channel != 9) { if (!list.Contains(midiEvent.parameter1)) { list.Add(midiEvent.parameter1); } } else if (!list2.Contains(midiEvent.parameter1)) { list2.Add(midiEvent.parameter1); } continue; case 208: midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Channel_Aftertouch; midiEvent.channel = (byte)num6; midiEvent.Parameters[0] = midiEvent.channel; i++; midiEvent.parameter1 = array[++i]; continue; case 224: { midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Pitch_Bend; midiEvent.channel = (byte)num6; midiEvent.Parameters[0] = midiEvent.channel; i++; midiEvent.parameter1 = array[++i]; midiEvent.parameter2 = array[++i]; ushort parameter = midiEvent.parameter1; parameter = (ushort)(parameter << 7); parameter = (ushort)(parameter | midiEvent.parameter2); midiEvent.Parameters[1] = ((double)(int)parameter - 8192.0) / 8192.0; continue; } case byte.MaxValue: switch (array[++i]) { case 0: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Sequence_Number; i++; break; case 1: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Text_Event; i++; midiEvent.parameter1 = array[i++]; midiEvent.Parameters[0] = midiEvent.parameter1; midiEvent.Parameters[1] = Encoding.UTF8.GetString(array, i, array[i - 1]); i += array[i - 1]; break; case 2: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Copyright_Notice; i++; midiEvent.parameter1 = array[i++]; midiEvent.Parameters[0] = midiEvent.parameter1; midiEvent.Parameters[1] = Encoding.UTF8.GetString(array, i, array[i - 1]); i += array[i - 1]; break; case 3: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Sequence_Or_Track_Name; i++; midiEvent.parameter1 = array[i++]; midiEvent.Parameters[0] = midiEvent.parameter1; midiEvent.Parameters[1] = Encoding.UTF8.GetString(array, i, array[i - 1]); i += array[i - 1]; break; case 4: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Instrument_Name; i++; midiEvent.Parameters[0] = Encoding.UTF8.GetString(array, i + 1, array[i]); i += array[i] + 1; break; case 5: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Lyric_Text; i++; midiEvent.Parameters[0] = Encoding.UTF8.GetString(array, i + 1, array[i]); i += array[i] + 1; break; case 6: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Marker_Text; i++; midiEvent.Parameters[0] = Encoding.UTF8.GetString(array, i + 1, array[i]); i += array[i] + 1; break; case 7: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Cue_Point; i++; midiEvent.Parameters[0] = Encoding.UTF8.GetString(array, i + 1, array[i]); i += array[i] + 1; break; case 32: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Midi_Channel_Prefix_Assignment; i++; midiEvent.parameter1 = array[i++]; midiEvent.Parameters[0] = midiEvent.parameter1; midiEvent.Parameters[1] = array[i++]; break; case 47: midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.End_of_Track; i += 2; break; case 81: { midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Tempo; i++; midiEvent.Parameters[4] = array[i++]; byte[] array3 = new byte[4]; for (int num29 = 0; num29 < 3; num29++) { array3[num29 + 1] = array[num29 + i]; } i += 3; byte[] array4 = new byte[4]; for (int num30 = 0; num30 < 4; num30++) { array4[3 - num30] = array3[num30]; } uint num31 = BitConverter.ToUInt32(array4, 0); midiEvent.Parameters[0] = num31; break; } case 84: { midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Smpte_Offset; i++; int num16 = array[i++]; if (num16 >= 4) { for (int n = 0; n < 4; n++) { midiEvent.Parameters[n] = array[i++]; } } else { for (int num18 = 0; num18 < num16; num18++) { midiEvent.Parameters[num18] = array[i++]; } } for (int num20 = 4; num20 < num16; num20++) { i++; } break; } case 88: { midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Time_Signature; i++; int num22 = array[i++]; if (num22 >= 4) { for (int num23 = 0; num23 < 4; num23++) { midiEvent.Parameters[num23] = array[i++]; } } else { for (int num25 = 0; num25 < num22; num25++) { midiEvent.Parameters[num25] = array[i++]; } } for (int num27 = 4; num27 < num22; num27++) { i++; } break; } case 89: { midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Key_Signature; i++; int num10 = array[i++]; if (num10 >= 4) { for (int k = 0; k < 4; k++) { midiEvent.Parameters[k] = array[i++]; } } else { for (int l = 0; l < num10; l++) { midiEvent.Parameters[l] = array[i++]; } } for (int m = 4; m < num10; m++) { i++; } break; } case 127: { midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Sequencer_Specific_Event; i++; midiEvent.Parameters[4] = array[i++]; byte[] array2 = new byte[(byte)midiEvent.Parameters[4]]; for (int j = 0; j < array2.Length; j++) { array2[j] = array[i++]; } midiEvent.Parameters[0] = array2; break; } } continue; case 240: break; default: continue; } for (; array[i] != 247; i++) { } i++; } tracks[num3].Programs = list.ToArray(); tracks[num3].DrumPrograms = list2.ToArray(); tracks[num3].MidiEvents = list3.ToArray(); num3++; } throw new Exception("Invalid track!"); }
public static extern int midiOutUnprepareHeader(IntPtr hmo, ref MidiHeader lpMidiOutHdr, int cbMidiOutHdr);
/*private static HiPerfTimer t1 = new HiPerfTimer(); private static double timer1_sum = 0.0; private static int timer1_count = 0;*/ public static int SendLongMessage(int handle, byte[] data) { /*Debug.Write("Midi Out: "); for(int i=0; i<data.Length; i++) Debug.Write(data[i].ToString("X")+" "); Debug.WriteLine("");*/ int result; IntPtr ptr; int size = Marshal.SizeOf(typeof(MidiHeader)); MidiHeader header = new MidiHeader(); header.data = Marshal.AllocHGlobal(data.Length); for(int i=0; i<data.Length; i++) Marshal.WriteByte(header.data, i, data[i]); header.bufferLength = data.Length; header.bytesRecorded = data.Length; header.flags = 0; try { ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MidiHeader))); } catch(Exception) { Marshal.FreeHGlobal(header.data); throw; } try { Marshal.StructureToPtr(header, ptr, false); } catch(Exception) { Marshal.FreeHGlobal(header.data); Marshal.FreeHGlobal(ptr); throw; } result = MidiOutPrepareHeader(handle, ptr, size); if(result == 0) result = MidiOutLongMessage(handle, ptr, size); if(result == 0) result = MidiOutUnprepareHeader(handle, ptr, size); Marshal.FreeHGlobal(header.data); Marshal.FreeHGlobal(ptr); return result; }
public static extern int midiOutLongMsg(IntPtr hmo, ref MidiHeader lpMidiOutHdr, int cbMidiOutHdr);
private int InCallback(int hMidiIn, int wMsg, int dwInstance, int dwParam1, int dwParam2) { lock (in_lock_obj) { switch (wMsg) { case MIM_OPEN: Debug.WriteLine("wMsg=MIM_OPEN"); break; case MIM_CLOSE: Debug.WriteLine("wMsg=MIM_CLOSE"); break; case MIM_DATA: Command cmd = (Command)((byte)dwParam1); byte byte1 = (byte)(dwParam1 >> 8); byte byte2 = (byte)(dwParam1 >> 16); inDevice_ChannelMessageReceived(byte1, byte2); // Debug.WriteLine("wMsg=MIM_DATA, dwInstance=%08x, dwParam1=%08x, dwParam2=%08x", dwInstance, dwParam1, dwParam2); /* switch(cmd) * { * case Command.NoteOn: * switch((Note)byte1) * { * case Note.Dot: * //console.Keyer.FWCDot = true; * //FWC.SetMOX(true); * break; * case Note.Dash: * //console.Keyer.FWCDash = true; * //FWC.SetMOX(true); * break; * case Note.MicDown: * console.MicDown = true; * break; * case Note.MicUp: * console.MicUp = true; * break; * case Note.MicFast: * console.MicFast = !console.MicFast; * break; * } * break; * case Command.NoteOff: * switch((Note)byte1) * { * case Note.Dot: * //console.Keyer.FWCDot = false; * //FWC.SetMOX(false); * break; * case Note.Dash: * //console.Keyer.FWCDash = false; * //FWC.SetMOX(false); * break; * case Note.MicDown: * console.MicDown = false; * break; * case Note.MicUp: * console.MicUp = false; * break; * case Note.MicFast: * break; * } * break; * case Command.Controller: * switch((Controller)byte1) * { * case Controller.HoldPedal1: * console.FWCMicPTT = (byte2 > 63); * break; * case Controller.HoldPedal2: * console.FWCRCAPTT = (byte2 > 63); * break; * } * break; * case Command.Aftertouch0: * case Command.Aftertouch1: * int id = (ushort)((((byte)cmd-(byte)Command.Aftertouch0)<<2)+(byte1>>5)); * int data = (int)(((byte1&0x1F)<<7)+byte2); * if(midi_in_table.ContainsKey(id)) * midi_in_table.Remove(id); * midi_in_table.Add(id, data); * break; * } */ break; case MIM_LONGDATA: if (!resetting && midi_in_handle != 0) // in case device closes, don't send anymore buffers { int result = AddSysExBuffer(midi_in_handle); if (result != 0) { StringBuilder error_text = new StringBuilder(64); MidiInGetErrorText(result, error_text, 64); Debug.WriteLine("AddSysExBuffer Error: " + error_text); } } IntPtr headerPtr = new IntPtr(dwParam1); MidiHeader header = (MidiHeader)Marshal.PtrToStructure(headerPtr, typeof(MidiHeader)); byte[] temp = new byte[header.bytesRecorded]; for (int i = 0; i < header.bytesRecorded; i++) { temp[i] = Marshal.ReadByte(header.data, i); } if (temp.Length > 5) { byte[] temp2 = new byte[temp.Length - 5]; for (int i = 0; i < temp.Length - 5; i++) { temp2[i] = temp[i + 4]; } byte[] buf = new byte[temp2.Length / 2]; DecodeBytes(buf, temp2); if (midi_in_table.ContainsKey(BitConverter.ToUInt16(buf, 0))) { midi_in_table.Remove(BitConverter.ToUInt16(buf, 0)); } midi_in_table.Add(BitConverter.ToUInt16(buf, 0), buf); } /*for(int i=0; i<header.bytesRecorded; i++) * Debug.Write(buf[i].ToString("X")+" "); * Debug.WriteLine("");*/ if (midi_in_handle != 0) { ReleaseBuffer(midi_in_handle, headerPtr); } Debug.WriteLine("wMsg=MIM_LONGDATA"); break; case MIM_ERROR: Debug.WriteLine("wMsg=MIM_ERROR"); break; case MIM_LONGERROR: Debug.WriteLine("wMsg=MIM_LONGERROR"); break; case MIM_MOREDATA: Debug.WriteLine("wMsg=MIM_MOREDATA"); break; } } return(0); }