Ejemplo n.º 1
0
        /// <summary>
        /// バリエーションエフェクトを送る
        /// </summary>
        /// <param name="Type">種別コード</param>
        /// <param name="Depth">強さ</param>
        public void VariationEffect(byte[] Type, short Depth)
        {
            if (!IsActive)
            {
                return;
            }

            var SystemEffectEx = new SysExMessage(new byte[] { 0xf0, 0x43, 0x10, 0x4c, 0x02, 0x01, 0x5a, 0x01, 0xf7 });

            MikuOutDev.Send(SystemEffectEx);


            var VariationEx = new List <byte>();

            VariationEx.AddRange(new byte[] { 0xf0, 0x43, 0x10, 0x4c, 0x02, 0x01, 0x40 });
            VariationEx.AddRange(Type);
            VariationEx.Add(0xf7);

            var ExMsg = new SysExMessage(VariationEx.ToArray());

            MikuOutDev.Send(ExMsg);

            EnableChannels.ForEach((Channel) =>
            {
                var DepthMsg = new ChannelMessage(ChannelCommand.Controller, Channel, 94, Depth);

                MikuOutDev.Send(DepthMsg);
            });
        }
Ejemplo n.º 2
0
    public override bool Equals(object obj)
    {
        #region Guard

        if (!(obj is SysExMessage))
        {
            return(false);
        }

        #endregion

        SysExMessage message = (SysExMessage)obj;

        bool equals = true;

        if (this.Length != message.Length)
        {
            equals = false;
        }

        for (int i = 0; i < this.Length && equals; i++)
        {
            if (this[i] != message[i])
            {
                equals = false;
            }
        }

        return(equals);
    }
        /// <summary>
        ///     Callback called when data dump is received from device
        /// </summary>
        private void OnSysExMessageReceived(object sender, SysExMessageEventArgs e)
        {
            switch (e.Message.Length)
            {
            case ExpectedCommonDumpLength + SysExUtils.DumpPaddingSize:
                _logger.Receive("Received Patch.Common");
                _commonDump = e.Message;
                break;

            case ExpectedVfxDumpLength + SysExUtils.DumpPaddingSize:
                _vfxDump = e.Message;
                _logger.Receive("Received Patch.VocalEffect");
                break;
            }

            _dumpCount++;

            if (_dumpCount == 2)
            {
                _timer.Stop();

                _device.StopRecording();
                _device.Dispose();

                DataDumpReceived?.Invoke(this,
                                         new CommonAndVocalFxDumpReceivedEventArgs(new CommonAndVocalEffectPatch(_commonDump, _vfxDump)));
            }
        }
Ejemplo n.º 4
0
    /// <summary>
    /// Initializes the MidiHeaderBuilder with the specified SysExMessage.
    /// </summary>
    /// <param name="message">
    /// The SysExMessage to use for initializing the MidiHeaderBuilder.
    /// </param>
    public void InitializeBuffer(SysExMessage message)
    {
        // If this is a start system exclusive message.
        if (message.SysExType == SysExType.Start)
        {
            BufferLength = message.Length;

            // Copy entire message.
            for (int i = 0; i < BufferLength; i++)
            {
                data[i] = message[i];
            }
        }
        // Else this is a continuation message.
        else
        {
            BufferLength = message.Length - 1;

            // Copy all but the first byte of message.
            for (int i = 0; i < BufferLength; i++)
            {
                data[i] = message[i + 1];
            }
        }
    }
Ejemplo n.º 5
0
 internal void SendMessages(OutputMidi[] om, SysExMessage CommonMessage)
 {
     foreach (int i in outMidiList)
     {
         om[i].outMIDI.Send(CommonMessage);
     }
 }
Ejemplo n.º 6
0
 public void Record(SysExMessage message)
 {
     if (clock.IsRunning)
     {
         buffer.Add(new TimestampedMessage(clock.Ticks, message));
     }
 }
Ejemplo n.º 7
0
        /// <summary>
        ///     Copy data from sysex dump
        /// </summary>
        public void CopyFrom(SysExMessage message)
        {
            /**
             * 12   -> SysEx header & address offset
             * 13   -> Tone Name(12) + Reserve(1)
             * 9    -> LFO
             * 10   -> Oscillator
             * 10   -> Filter
             * 7    -> Amplifier
             * 7    -> Common(6) + Reserve(1)
             * 8    -> LFO Mod Control(4) + Reserve(4)
             * 1    -> Checksum
             * 1    -> Footer (0xF7)
             */

            var data = message.GetBytes().Skip(12).ToArray();

            if (data.Length - 2 != DumpLength)
            {
                throw new InvalidDumpSizeException(DumpLength, data.Length);
            }

            Name = Encoding.ASCII.GetString(data.Take(12).ToArray());

            Lfo.CopyFrom(data.Skip(13).Take(9).ToArray());
            Oscillator.CopyFrom(data.Skip(22).Take(10).ToArray());
            Filter.CopyFrom(data.Skip(32).Take(10).ToArray());
            Amplifier.CopyFrom(data.Skip(42).Take(7).ToArray());
            Common.CopyFrom(data.Skip(49).Take(7).ToArray());
            LfoModControl.CopyFrom(data.Skip(56).Take(8).ToArray());
        }
Ejemplo n.º 8
0
        /// <summary>
        ///     Callback called when data dump is received from device
        /// </summary>
        private void OnSysExMessageReceived(object sender, SysExMessageEventArgs e)
        {
            switch (e.Message.Length)
            {
            case ExpectedCommonDumpLength + SysExUtils.DumpPaddingSize:
                _commonDump = e.Message;
                _logger.Receive("Received Patch.Common");
                break;

            case ExpectedPartialDumpLength + SysExUtils.DumpPaddingSize:
            {
                // At 11 byte we have partial identifier, so we check value at that byte
                var key = (DrumKey)e.Message[10];
                _partialsDump[key] = e.Message;
                _logger.Receive($"Received Patch.Partials[{key}]");
                break;
            }
            }

            _dumpCount++;

            if (_dumpCount == 39)
            {
                _timer.Stop();

                _device.StopRecording();
                _device.Dispose();

                DataDumpReceived?.Invoke(this,
                                         new DrumKitPatchDumpReceivedEventArgs(new Patch(_commonDump, _partialsDump)));
            }
        }
Ejemplo n.º 9
0
 private void HandleSysex(SysExMessage msg)
 {
     if (SysexCallback != null)
     {
         SysexCallback.Invoke(msg.Data);
     }
 }
Ejemplo n.º 10
0
        void onSysExMessageReceived(object obj, SysExMessageEventArgs e)
        {
            SysExMessage m = e.Message;

            if (debugPrintMIDI)
            {
                Console.WriteLine("SysEx Message: " + m.ToString());
            }
        }
Ejemplo n.º 11
0
        private void HandleMidiInMessage(Sanford.Multimedia.Midi.SysExMessage msg)
        {
            var data = msg.GetBytes();
            var kmsg = SysExMessage.Parse(data);

            if (kmsg != null)
            {
                lock (MessageQueue)
                    MessageQueue.Enqueue(kmsg);
            }
        }
        /// <summary>
        ///     Copy data from sysex dumps
        /// </summary>
        /// <param name="common">Common sysex message</param>
        /// <param name="vfx">VFX sysex message</param>
        public void CopyFrom(SysExMessage common, SysExMessage vfx)
        {
            // Skipping 12 bytes from front because it's header and address offset
            // Skipping 2 bytes from end because it's checksum and sysex footer

            var commonBytes = common.GetBytes().Skip(12).ToArray();
            var vfxBytes    = vfx.GetBytes().Skip(12).ToArray();

            Common.CopyFrom(commonBytes.Take(commonBytes.Length - 2).ToArray());
            VocalEffect.CopyFrom(vfxBytes.Take(vfxBytes.Length - 2).ToArray());
        }
Ejemplo n.º 13
0
        public void SendSysExMessage(SysExMessage msg)
        {
            var sem = new Sanford.Multimedia.Midi.SysExMessage(
                new[] { (byte)SysExType.Start }
                .Concat(SysExMessage.ManufacturerId)
                .Concat(SysExMessage.ProductType)
                .Concat(SysExMessage.DeviceId)
                .Concat(msg.GetMessageContent())
                .Concat(new byte[] { 247 })
                .ToArray());

            OutputMidiDevice.Send(sem);
        }
Ejemplo n.º 14
0
    private void Write(SysExMessage message)
    {
        // System exclusive message cancel running status.
        runningStatus = 0;

        trackData.Add((byte)message.Status);

        WriteVariableLengthValue(message.Length - 1);

        for (int i = 1; i < message.Length; i++)
        {
            trackData.Add(message[i]);
        }
    }
Ejemplo n.º 15
0
    public virtual void Send(SysExMessage message)
    {
        #region Require

        if (IsDisposed)
        {
            throw new ObjectDisposedException(this.GetType().Name);
        }

        #endregion

        lock (lockObject)
        {
            headerBuilder.InitializeBuffer(message);
            headerBuilder.Build();

            // Prepare system exclusive buffer.
            int result = midiOutPrepareHeader(Handle, headerBuilder.Result, SizeOfMidiHeader);

            // If the system exclusive buffer was prepared successfully.
            if (result == MidiDeviceException.MMSYSERR_NOERROR)
            {
                bufferCount++;

                // Send system exclusive message.
                result = midiOutLongMsg(Handle, headerBuilder.Result, SizeOfMidiHeader);

                // If the system exclusive message could not be sent.
                if (result != MidiDeviceException.MMSYSERR_NOERROR)
                {
                    midiOutUnprepareHeader(Handle, headerBuilder.Result, SizeOfMidiHeader);
                    bufferCount--;
                    headerBuilder.Destroy();

                    // Throw an exception.
                    throw new OutputDeviceException(result);
                }
            }
            // Else the system exclusive buffer could not be prepared.
            else
            {
                // Destroy system exclusive buffer.
                headerBuilder.Destroy();

                // Throw an exception.
                throw new OutputDeviceException(result);
            }
        }
    }
Ejemplo n.º 16
0
        public void SendMMCCommand(byte command)
        {
            byte[] MMC = new byte[6];

            MMC[0] = 0xF0;
            MMC[1] = 0x7F;
            MMC[2] = 0x7F;
            MMC[3] = 0x06;
            MMC[4] = command;
            MMC[5] = 0xF7;

            SysExMessage sysex = new SysExMessage(MMC);

            outDevice.Send(sysex);
        }
Ejemplo n.º 17
0
        /// <summary>
        ///     Copy data from sysex dumps
        /// </summary>
        /// <param name="common"></param>
        /// <param name="partials"></param>
        public void CopyFrom(SysExMessage common, Dictionary <DrumKey, SysExMessage> partials)
        {
            // Skipping 12 bytes from front because it's header and address offset
            // Skipping 2 bytes from end because it's checksum and sysex footer

            var commonBytes = common.GetBytes().Skip(12).ToArray();

            Common.CopyFrom(commonBytes.Take(commonBytes.Length - 2).ToArray());

            foreach (var partial in partials)
            {
                var bytes = partial.Value.GetBytes().Skip(12).ToArray();
                Partials[partial.Key].CopyFrom(bytes.Take(bytes.Length - 2).ToArray());
            }
        }
Ejemplo n.º 18
0
        /// <inheritdoc />
        public void Read(int inputDeviceId, int outputDeviceId)
        {
            // Reset dump count counter
            _dumpCount = 0;

            // Initialize input device
            _device = new InputDevice(inputDeviceId);

            // Clear previous sysex dumps
            _commonDump = null;
            _partialsDump.Clear();

            // Setup event handler for receiving SysEx messages
            _device.SysExMessageReceived += OnSysExMessageReceived;

            // Start recording input from device
            _device.StartRecording();

            // Start timer before running task, so we have timer on the same thread
            // as the callbacks for timer and input device
            _timer.Start();

            // Request data dump from device on separate thread
            Task.Run(() =>
            {
                // Need to make 50ms delay between requests to ensure
                // that device will not hung up

                using (var output = new OutputDevice(outputDeviceId))
                {
                    _logger.Send("Request Patch.Common");
                    output.Send(SysExUtils.GetRequestDumpMessage(_commonAddressOffset, _commonDumpRequest));

                    Thread.Sleep(50);

                    foreach (var vdPair in EnumHelper.GetAllValuesAndDescriptions(typeof(DrumKey)))
                    {
                        var key = (DrumKey)vdPair.Value;

                        _logger.Send($"Request Patch.Partial[{key}]");
                        output.Send(SysExUtils.GetRequestDumpMessage(PartialAddressOffset(key), _partialDumpRequest));

                        Thread.Sleep(50);
                    }
                }
            });
        }
Ejemplo n.º 19
0
        /// <summary>
        /// 歌詞を送信する
        /// </summary>
        /// <param name="Lyrics">歌詞コードの配列</param>
        public void Lyrics(byte[] Lyrics)
        {
            if (!IsActive)
            {
                return;
            }

            var LyricEx = new List <byte>();

            LyricEx.AddRange(new byte[] { 0xf0, 0x43, 0x79, 0x09, 0x11, 0x0a, 0x00 });
            LyricEx.AddRange(Lyrics);
            LyricEx.Add(0xf7);

            var ExMsg = new SysExMessage(LyricEx.ToArray());

            MikuOutDev.Send(ExMsg);
        }
Ejemplo n.º 20
0
        /// <summary>
        /// ポケミクをリセットする
        /// </summary>
        public void Reset()
        {
            if (!IsActive)
            {
                return;
            }

            /* All Parameter Reset */
            var AllParamReset = new SysExMessage(new byte[] { 0xf0, 0x43, 0x10, 0x4c, 0x00, 0x00, 0x7f, 0x00, 0xf7 });

            MikuOutDev.Send(AllParamReset);


            /* XG System ON */
            var XGOn = new SysExMessage(new byte[] { 0xf0, 0x43, 0x10, 0x4c, 0x00, 0x00, 0x7e, 0x00, 0xf7 });

            MikuOutDev.Send(XGOn);
        }
Ejemplo n.º 21
0
        /// <summary>
        ///     Copy data from sysex dumps
        /// </summary>
        /// <param name="common">Common sysex message</param>
        /// <param name="partials">SysEx messages </param>
        /// <param name="modifiers"></param>
        public void CopyFrom(SysExMessage common, SysExMessage[] partials, SysExMessage modifiers)
        {
            // Skipping 12 bytes from front because it's header and address offset
            // Skipping 2 bytes from end because it's checksum and sysex footer

            var commonBytes    = common.GetBytes().Skip(12).ToArray();
            var partialsBytes  = partials.Select(partial => partial.GetBytes().Skip(12).ToArray()).ToArray();
            var modifiersBytes = modifiers.GetBytes().Skip(12).ToArray();

            Common.CopyFrom(commonBytes.Take(commonBytes.Length - 2).ToArray());

            for (var i = 0; i < _partials.Length; i++)
            {
                _partials[i].CopyFrom(partialsBytes[i].Take(partialsBytes[i].Length - 2).ToArray());
            }

            Modifiers.CopyFrom(modifiersBytes.Take(modifiersBytes.Length - 2).ToArray());
        }
Ejemplo n.º 22
0
        /// <summary>
        /// Sysex messages received
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void HandleSysExMessageReceived(object sender, SysExMessageEventArgs e)
        {
            context.Post(delegate(object dummy)
            {
                int ticks = GetTicks();

                string result = "\n\n";;
                foreach (byte b in e.Message)
                {
                    result += string.Format("{0:X2} ", b);
                }

                sysExRichTextBox.Text += result;

                // insert event
                SysExMessage SMsg = new SysExMessage(e.Message.GetBytes());
                track1.Insert(ticks, SMsg);
            }, null);
        }
Ejemplo n.º 23
0
        public static void Send(int displayNumber, string txt1, string txt2)
        {
            var model = DisplayList.Where(x => x.Number == displayNumber).FirstOrDefault();


            string source = "F0 00 00 66 14 12";

            byte[] resultTxt  = Encoding.ASCII.GetBytes(txt1);
            byte[] resultTxt2 = Encoding.ASCII.GetBytes(txt2);


            byte[] result = source.Split(' ').Select(item => Convert.ToByte(item, 16)).ToArray();

            byte[] resultPageFirstLine  = model.FirstLine.Split(' ').Select(item => Convert.ToByte(item, 16)).ToArray();
            byte[] resultPageSecondLine = model.SecondLine.Split(' ').Select(item => Convert.ToByte(item, 16)).ToArray();


            int lenght  = result.Length + resultTxt.Length + 2;
            int lenght2 = result.Length + resultTxt2.Length + 2;


            byte[] sum  = new byte[lenght];
            byte[] sum2 = new byte[lenght2];


            result.CopyTo(sum, 0);
            resultPageFirstLine.CopyTo(sum, result.Length);
            resultTxt.CopyTo(sum, result.Length + 1);
            sum[lenght - 1] = 247;

            result.CopyTo(sum2, 0);
            resultPageSecondLine.CopyTo(sum2, result.Length);
            resultTxt2.CopyTo(sum2, result.Length + 1);
            sum2[lenght - 1] = 247;

            SysExMessage sysEx  = new SysExMessage(sum);
            SysExMessage sysEx2 = new SysExMessage(sum2);


            SendToMidiDevice.SysExSend(sysEx);
            SendToMidiDevice.SysExSend(sysEx2);
        }
Ejemplo n.º 24
0
        private static void InputDevice_SysEx(SysExMessage msg)
        {
            Application.Current.Dispatcher.Invoke(new Action(() =>
            {
                MscCommand mscCommand = MscCommand.getMscCommand(msg.Data);

                if (mscCommand != null)
                {
                    if (!mscMute)
                    {
                        for (int i = 0; i < CuelistCtrl.cues.Count; ++i)
                        {
                            Cue cue = CuelistCtrl.cues[i];

                            if (cue.trigger != null && cue.trigger.type == TriggerType.MSC && MscCommand.Compare(mscCommand, cue.trigger.mscCmd))
                            {
                                if (Core.win.saveTriggerCheckbox.IsChecked && Core.win.cueTable.SelectedIndex != i)
                                {
                                    LogCtrl.Error("In: " + mscCommand.message);
                                }
                                else
                                {
                                    LogCtrl.Success("In: " + mscCommand.message);
                                    GoCtrl.Go(i);
                                }
                                return;
                            }
                        }
                        LogCtrl.Status("In: " + mscCommand.message);
                    }
                    else
                    {
                        LogCtrl.Warning("In: " + mscCommand.message);
                    }
                }
            }));
        }
Ejemplo n.º 25
0
    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);
        }
    }
Ejemplo n.º 26
0
        private bool WriteResult(string valReq, XElement addrElement, SysExMessage msg, TimeSpan to)
        {
            var r = Driver.Device.SendWithResult(msg, to);

            object result = null;

            if (r is WriteValueMessage wvm)
            {
                result = wvm.Value;
            }

            if (r is WriteStringValueMessage wsm)
            {
                result = wsm.Value;
            }

            if (String.IsNullOrEmpty(valReq) || result == null)
            {
                return(false);
            }

            addrElement.Add(new XAttribute($"{valReq}Value", result));
            return(true);
        }
Ejemplo n.º 27
0
        /// <summary>
        /// コーラスを送る
        /// </summary>
        /// <param name="Type">種別コード</param>
        /// <param name="Depth">強さ</param>
        public void Chorus(byte[] Type, short Depth)
        {
            if (!IsActive)
            {
                return;
            }

            var ChorusEx = new List <byte>();

            ChorusEx.AddRange(new byte[] { 0xf0, 0x43, 0x10, 0x4c, 0x02, 0x01, 0x20 });
            ChorusEx.AddRange(Type);
            ChorusEx.Add(0xf7);

            var ExMsg = new SysExMessage(ChorusEx.ToArray());

            MikuOutDev.Send(ExMsg);

            EnableChannels.ForEach((Channel) =>
            {
                var DepthMsg = new ChannelMessage(ChannelCommand.Controller, Channel, 93, Depth);

                MikuOutDev.Send(DepthMsg);
            });
        }
Ejemplo n.º 28
0
 public virtual void Send(SysExMessage message)
 {
 }
Ejemplo n.º 29
0
 private void sysExAnswer(SysExMessage m)
 {
     byte[] msg       = m.Data;
     byte[] stopBytes = { 240, 0, 32, 41, 2, 24, 21, 247 };
 }
Ejemplo n.º 30
0
 private void sysExAnswer(SysExMessage m)
 {
     byte[] msg       = m.Data;
     byte[] stopBytes = sysexHeader.Concat(new byte[] { 21, 247 }).ToArray();
 }
Ejemplo n.º 31
0
 /// <inheritdoc />
 /// <summary>
 ///     Creates new instance of AnalogPatch using sysex dump
 /// </summary>
 public Patch(SysExMessage message) : this()
 {
     CopyFrom(message);
 }