/// <summary> /// Send long midi message. /// 長いmidiデータを送ります。 /// </summary> /// <param name="buffer">メッセージが入ったバッファ</param> private void Write(MidiBuffer buffer) { EnsureOpened(); Interlocked.Add(ref enqueuedBufferSize, buffer.BufferLength); Win32.midiOutPrepareHeader(deviceHandle, buffer.pHeader, Win32.MidiHeader.SizeOfMidiHeader); Win32.midiOutLongMsg(deviceHandle, buffer.pHeader, Win32.MidiHeader.SizeOfMidiHeader); }
/// <summary> /// Send long midi message. /// 長いmidiデータを送ります。 /// </summary> /// <param name="src">データ</param> /// <param name="length">読み出すバイト数</param> public void Write(IntPtr src, int length) { EnsureOpened(); MidiBuffer buf = new MidiBuffer(length); buf.BufferLength = length; Marshal.Copy(src, buf.Data, 0, buf.BufferLength); Write(buf); }
/// <summary> /// Send long midi message. /// 長いmidiデータを送ります。 /// </summary> /// <param name="data">データ</param> /// <param name="offset">読み出す位置</param> /// <param name="count">読み出すバイト数</param> public void Write(byte[] data, int offset, int count) { EnsureOpened(); MidiBuffer buf = new MidiBuffer(count); buf.BufferLength = count; Array.Copy(data, offset, buf.Data, 0, buf.BufferLength); Write(buf); }
/// <summary> /// Send long midi message. /// 長いmidiデータを送ります /// </summary> /// <param name="data">データ</param> /// <param name="offset">読み出す位置</param> /// <param name="count">読み出すバイト数</param> public void Write(byte[] data, int offset, int count) { EnsureOpened(); MidiBuffer buf = new MidiBuffer(count); buf.BufferLength = count; Array.Copy(data, offset, buf.Data, 0, buf.BufferLength); System.Diagnostics.Trace.WriteLine("Sending message to DEVICE: " + BitConverter.ToString(data)); Write(buf); }
/// <summary> /// Open MidiIn. /// MidiInを開きます。 /// </summary> /// <param name="deviceId">index of GetDeviceNames(). GetDeviceNames()のindex</param> public MidiIn(int deviceId) { messageProc = new MessageThread(false, ThreadPriority.Normal, "MidiInProcThread"); messageProc.MessageHandlers[Win32.MM_MIM_LONGDATA] = delegate(Message m) { Win32.MidiHeader header = Win32.MidiHeader.FromIntPtr(m.LParam); MidiBuffer buf = MidiBuffer.FromMidiHeader(header); int bytesRecorded = (int)header.dwBytesRecorded; if (OnLongMsg != null && bytesRecorded != 0) { byte[] data = buf.Data; if (bytesRecorded != buf.Data.Length) { data = new byte[bytesRecorded]; Array.Copy(buf.Data, data, bytesRecorded); } System.Diagnostics.Trace.WriteLine("Recieved message from DEVICE: " + BitConverter.ToString(data)); try { OnLongMsg(data); } catch { } } if (recording) { Win32.midiInAddBuffer(deviceHandle, m.LParam, Win32.MidiHeader.SizeOfMidiHeader); } else { Win32.midiInUnprepareHeader(deviceHandle, m.LParam, Win32.MidiHeader.SizeOfMidiHeader); buf.Dispose(); Interlocked.Decrement(ref enqueuedBufferCount); } }; messageProc.MessageHandlers[Win32.MM_MIM_DATA] = delegate(Message m) { if (OnShortMsg != null) { OnShortMsg((uint)m.LParam); } }; int mmret = Win32.midiInOpen(out deviceHandle, (uint)deviceId, new IntPtr(messageProc.Win32ThreadID), IntPtr.Zero, Win32.CALLBACK_THREAD); if (mmret != Win32.MMSYSERR_NOERROR) { messageProc.Dispose(); throw new IOException("デバイスが開けませんでした。(" + mmret + ")"); } }
/// <summary> /// Open MidiIn. /// MidiInを開きます。 /// </summary> /// <param name="deviceId">index of GetDeviceNames(). GetDeviceNames()のindex</param> public MidiIn(uint deviceId) { eventHandler = new MessageThread(ThreadPriority.AboveNormal); eventHandler.MessageHandlers[Win32.MM_MIM_LONGDATA] = delegate(Message m) { Win32.MidiHeader header = Win32.MidiHeader.FromIntPtr(m.LParam); MidiBuffer buf = MidiBuffer.FromMidiHeader(header); int bytesRecorded = (int)header.dwBytesRecorded; if (OnLongMsg != null && bytesRecorded != 0) { byte[] data = buf.Data; if (bytesRecorded != buf.Data.Length) { data = new byte[bytesRecorded]; Array.Copy(buf.Data, data, bytesRecorded); } OnLongMsg(data); } if (recording) { Win32.midiInAddBuffer(deviceHandle, m.LParam, Win32.MidiHeader.SizeOfMidiHeader); } else { Win32.midiInUnprepareHeader(deviceHandle, m.LParam, Win32.MidiHeader.SizeOfMidiHeader); buf.Dispose(); Interlocked.Decrement(ref enqueuedBufferCount); } }; eventHandler.MessageHandlers[Win32.MM_MIM_DATA] = delegate(Message m) { if (OnShortMsg != null) { OnShortMsg((uint)m.LParam); } }; int mmret = Win32.midiInOpen(out deviceHandle, deviceId, new IntPtr(eventHandler.Win32ThreadID), IntPtr.Zero, Win32.CALLBACK_THREAD); if (mmret != Win32.MMSYSERR_NOERROR) { eventHandler.Dispose(); throw new Exception("Error on midiInOpen. (ret=" + mmret + ")"); } }
/// <summary> /// Open MidiOut. /// MidiOutを開きます。 /// </summary> /// <param name="deviceId">MidiOut.MidiMapper or index of GetDeviceNames(). MidiOut.MidiMapperか、GetDeviceNames()のindex</param> public MidiOut(int deviceId) { eventHandler = new MessageThread(ThreadPriority.AboveNormal); eventHandler.MessageHandlers[Win32.MM_MOM_DONE] = delegate(Message m) { Win32.MidiHeader hdr = Win32.MidiHeader.FromIntPtr(m.LParam); MidiBuffer buf = MidiBuffer.FromMidiHeader(hdr); Win32.midiOutUnprepareHeader(deviceHandle, buf.pHeader, Win32.MidiHeader.SizeOfMidiHeader); buf.Dispose(); Interlocked.Add(ref enqueuedBufferSize, -buf.BufferLength); if (OnDone != null) { OnDone(); } }; int mmret = Win32.midiOutOpen(out deviceHandle, (uint)deviceId, new IntPtr(eventHandler.Win32ThreadID), IntPtr.Zero, Win32.CALLBACK_THREAD); if (mmret != Win32.MMSYSERR_NOERROR) { eventHandler.Dispose(); throw new Exception("Error on midiOutOpen. (ret=" + mmret + ")"); } }
/// <summary> /// Start recording. 録音開始 /// </summary> /// <param name="bufferCount"> ex) 256 : バッファ数</param> /// <param name="bufferSize"> ex) 1024 : バッファサイズ</param> public void Start(int bufferCount, int bufferSize) { EnsureOpened(); if (recording) { throw new InvalidOperationException("Started already."); } for (int i = 0; i < bufferCount; i++) { MidiBuffer buf = new MidiBuffer(bufferSize); Win32.midiInPrepareHeader(deviceHandle, buf.pHeader, Win32.MidiHeader.SizeOfMidiHeader); Win32.midiInAddBuffer(deviceHandle, buf.pHeader, Win32.MidiHeader.SizeOfMidiHeader); Interlocked.Increment(ref enqueuedBufferCount); } int mmret = Win32.midiInStart(deviceHandle); if (mmret != Win32.MMSYSERR_NOERROR) { throw new Exception("Error on midiInStart. (ret = " + mmret + ")"); } recording = true; }
/// <summary> /// Send long midi message. /// ����midi�f�[�^�𑗂�܂��B /// </summary> /// <param name="buffer">���b�Z�[�W���������o�b�t�@</param> private void Write(MidiBuffer buffer) { EnsureOpened(); Interlocked.Add(ref enqueuedBufferSize, buffer.BufferLength); Win32.midiOutPrepareHeader(deviceHandle, buffer.pHeader, Win32.MidiHeader.SizeOfMidiHeader); Win32.midiOutLongMsg(deviceHandle, buffer.pHeader, Win32.MidiHeader.SizeOfMidiHeader); }
/// <summary> /// Send long midi message. /// ����midi�f�[�^�𑗂�܂��B /// </summary> /// <param name="src">�f�[�^</param> /// <param name="length">�ǂݏo���o�C�g��</param> public void Write(IntPtr src, int length) { EnsureOpened(); MidiBuffer buf = new MidiBuffer(length); buf.BufferLength = length; Marshal.Copy(src, buf.Data, 0, buf.BufferLength); Write(buf); }
/// <summary> /// Send long midi message. /// ����midi�f�[�^�𑗂�܂��B /// </summary> /// <param name="data">�f�[�^</param> /// <param name="offset">�ǂݏo���ʒu</param> /// <param name="count">�ǂݏo���o�C�g��</param> public void Write(byte[] data, int offset, int count) { EnsureOpened(); MidiBuffer buf = new MidiBuffer(count); buf.BufferLength = count; Array.Copy(data, offset, buf.Data, 0, buf.BufferLength); Write(buf); }
/// <summary> /// Start recording. �^���J�n /// </summary> /// <param name="bufferCount"> ex) 256 : �o�b�t�@��</param> /// <param name="bufferSize"> ex) 1024 : �o�b�t�@�T�C�Y</param> public void Start(int bufferCount, int bufferSize) { EnsureOpened(); if (recording) throw new InvalidOperationException("Started already."); for (int i = 0; i < bufferCount; i++) { MidiBuffer buf = new MidiBuffer(bufferSize); Win32.midiInPrepareHeader(deviceHandle, buf.pHeader, Win32.MidiHeader.SizeOfMidiHeader); Win32.midiInAddBuffer(deviceHandle, buf.pHeader, Win32.MidiHeader.SizeOfMidiHeader); Interlocked.Increment(ref enqueuedBufferCount); } int mmret = Win32.midiInStart(deviceHandle); if (mmret != Win32.MMSYSERR_NOERROR) { throw new Exception("Error on midiInStart. (ret = " + mmret + ")"); } recording = true; }
/// <summary> /// Send long midi message. /// ����midi�f�[�^�𑗂�܂� /// </summary> /// <param name="data">�f�[�^</param> /// <param name="offset">�ǂݏo���ʒu</param> /// <param name="count">�ǂݏo���o�C�g��</param> public void Write(byte[] data, int offset, int count) { EnsureOpened(); MidiBuffer buf = new MidiBuffer(count); buf.BufferLength = count; Array.Copy(data, offset, buf.Data, 0, buf.BufferLength); System.Diagnostics.Trace.WriteLine("Sending message to DEVICE: " + BitConverter.ToString(data)); Write(buf); }