コード例 #1
0
        public void Send(byte[] msg, int offset, int length, long timestamp)
        {
            if (synth == null)
            {
                throw new InvalidOperationException("The MIDI output is not open.");
            }

            int ch = msg[offset] & 0x0F;

            switch (msg [offset] & 0xF0)
            {
            case 0x80:
                synth.NoteOff(ch, msg [offset + 1]);
                break;

            case 0x90:
                if (msg [offset + 2] == 0)
                {
                    synth.NoteOff(ch, msg [offset + 1]);
                }
                else
                {
                    synth.NoteOn(ch, msg [offset + 1], msg [offset + 2]);
                }
                break;

            case 0xA0:
                synth.KeyPressure(ch, msg [offset + 1], msg [offset + 2]);
                break;

            case 0xB0:
                synth.CC(ch, msg [offset + 1], msg [offset + 2]);
                break;

            case 0xC0:
                synth.ProgramChange(ch, msg [offset + 1]);
                break;

            case 0xD0:
                synth.ChannelPressure(ch, msg [offset + 1]);
                break;

            case 0xE0:
                synth.PitchBend(ch, msg [offset + 1] + msg [offset + 2] * 0x80);
                break;

            case 0xF0:
#if NET472 || NETCOREAPP
                synth.Sysex(new ArraySegment <byte> (msg, offset, length), null);
#else
                unsafe {
                    fixed(byte *ptr = msg)
                    synth.Sysex((IntPtr)(ptr + offset), length, IntPtr.Zero, 0);
                }
                    #endif
                break;
            }
        }
コード例 #2
0
        public void Send(byte [] msg, int offset, int length, long timestamp)
        {
            if (synth == null)
            {
                throw new InvalidOperationException("The MIDI output is not open.");
            }

            int ch = msg [offset] & 0x0F;

            switch (msg [offset] & 0xF0)
            {
            case 0x80:
                synth.NoteOff(ch, msg [offset + 1]);
                break;

            case 0x90:
                if (msg [offset + 2] == 0)
                {
                    synth.NoteOff(ch, msg [offset + 1]);
                }
                else
                {
                    synth.NoteOn(ch, msg [offset + 1], msg [offset + 2]);
                }
                break;

            case 0xA0:
                synth.KeyPressure(ch, msg [offset + 1], msg [offset + 2]);
                break;

            case 0xB0:
                synth.CC(ch, msg [offset + 1], msg [offset + 2]);
                break;

            case 0xC0:
                synth.ProgramChange(ch, msg [offset + 1]);
                break;

            case 0xD0:
                synth.ChannelPressure(ch, msg [offset + 1]);
                break;

            case 0xE0:
                synth.PitchBend(ch, msg [offset + 1] + msg [offset + 2] * 0x80);
                break;

            case 0xF0:
                synth.Sysex(new ArraySegment <byte> (msg, offset, length).ToArray(), null);
                break;
            }
        }
コード例 #3
0
        void DoSend(byte[] msg, int offset, int count, long timestamp)
        {
#if MIDI_MANAGER
            output.Send(msg, offset, count, timestamp);
#else
            // FIXME: consider timestamp.

            int ch = msg [offset] & 0x0F;
            switch (msg [offset] & 0xF0)
            {
            case 0x80:
                syn.NoteOff(ch, msg [offset + 1]);
                break;

            case 0x90:
                if (msg [offset + 2] == 0)
                {
                    syn.NoteOff(ch, msg [offset + 1]);
                }
                else
                {
                    syn.NoteOn(ch, msg [offset + 1], msg [offset + 2]);
                }
                break;

            case 0xA0:
                // No PAf in fluidsynth?
                break;

            case 0xB0:
                syn.CC(ch, msg [offset + 1], msg [offset + 2]);
                break;

            case 0xC0:
                syn.ProgramChange(ch, msg [offset + 1]);
                break;

            case 0xD0:
                syn.ChannelPressure(ch, msg [offset + 1]);
                break;

            case 0xE0:
                syn.PitchBend(ch, msg [offset + 1] + msg [offset + 2] * 0x80);
                break;

            case 0xF0:
                syn.Sysex(new ArraySegment <byte> (msg, offset, count).ToArray(), null);
                break;
            }
#endif
        }