예제 #1
0
        public static uint midiOutShortMsg(IntPtr hMidiOut, uint dwMsg)
        {
            MemoryStream outputStream = new MemoryStream();

            byte[] bytes = BitConverter.GetBytes(dwMsg);
            // Array.Reverse
            outputStream.Write(bytes, 0, bytes.Length);
            s_midiOutPort.SendBuffer(outputStream.GetWindowsRuntimeBuffer());
            return(MidiWinApi.MMSYSERR_NOERROR);
        }
예제 #2
0
        public void SendSystemExclusive(byte[] bytes)
        {
            IBuffer buffer = bytes.AsBuffer();

            midiOutPort.SendBuffer(buffer);
            //MidiSystemExclusiveMessage midiMessageToSend = new MidiSystemExclusiveMessage(buffer);
            //midiOutPort.SendMessage(midiMessageToSend);
            //Task task = Task.Run(() =>
            //{
            //    midiOutPort.SendMessage(midiMessageToSend);
            //});
            //task = null;
            //GC.Collect();
        }
        public static IAsyncOperationWithProgress <int, MidiSysExStatusReport> SendSysExStreamAsyncWithProgress(
            IRandomAccessStream inputStream,
            IMidiOutPort outputPort,
            uint bufferSize,
            uint sendDelayMilliseconds = DefaultDelayBetweenBuffers)
        {
            return(AsyncInfo.Run <int, MidiSysExStatusReport>((token, progress) =>
                                                              Task.Run(async() =>
            {
                using (var dataReader = new DataReader(inputStream))
                {
                    uint bytesRead = 0;

                    // allocate our message buffer
                    var buffer = new byte[bufferSize];

                    System.Diagnostics.Debug.WriteLine("Using transfer buffer size " + bufferSize + " bytes.");

                    progress.Report(new MidiSysExStatusReport()
                    {
                        Stage = MidiSysExStatusStages.SendingData, BytesRead = 0
                    });


                    // reset/reload the input stream
                    inputStream.Seek(0);
                    await dataReader.LoadAsync((uint)inputStream.Size);
                    bytesRead = 0;


                    // start actually sending data

                    uint buffIndex = 0;

                    while (dataReader.UnconsumedBufferLength > 0)
                    {
                        byte b = 0;
                        buffIndex = 0;

                        // This loop builds up one complete sysex message from f0 to f7
                        while (b != SysexEndMessageByte && dataReader.UnconsumedBufferLength > 0)
                        {
                            // if the user canceled, throw, so we get ejected from this
                            token.ThrowIfCancellationRequested();

                            // read next character
                            b = dataReader.ReadByte();

                            // append to buffer

                            buffer[buffIndex] = b;

                            buffIndex += 1;
                            bytesRead += 1;
                        }

                        progress.Report(new MidiSysExStatusReport()
                        {
                            Stage = MidiSysExStatusStages.SendingData, BytesRead = bytesRead
                        });

                        uint length = buffIndex;
                        var messageBuffer = new Windows.Storage.Streams.Buffer(length);
                        buffer.CopyTo(0, messageBuffer, 0, (int)length);
                        messageBuffer.Length = length;

                        //foreach (byte db in messageBuffer.ToArray())
                        //{
                        //    System.Diagnostics.Debug.Write(string.Format("{0:X2} ", db));
                        //}
                        //System.Diagnostics.Debug.WriteLine("");

                        outputPort.SendBuffer(messageBuffer);

                        if (sendDelayMilliseconds > 0)
                        {
                            await Task.Delay((int)sendDelayMilliseconds);
                        }
                    }

                    progress.Report(new MidiSysExStatusReport()
                    {
                        Stage = MidiSysExStatusStages.Complete, BytesRead = bytesRead
                    });

                    return 0;
                }
            })));
        }