Inheritance: IDisposable
示例#1
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
 /// <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);
 }
示例#2
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
        /// <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);
        }
示例#3
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
        /// <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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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 + ")");
            }
        }
示例#6
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
        /// <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 + ")");
            }
        }
示例#7
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
        /// <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 + ")");
            }
        }
示例#8
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
        /// <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;
        }
示例#9
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
 /// <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);
 }
示例#10
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
 /// <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);
 }
示例#11
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
 /// <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);
 }
示例#12
0
文件: MidiIO.cs 项目: ttsuki/ttsuki
        /// <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);
        }