private void OnTouch(object sender, SKTouchEventArgs e)
        {
            switch (e.ActionType)
            {
            case SKTouchAction.Pressed:
                On = true;
                volume.SetFloatData(1, 1f);
                touch     = e.Location;
                e.Handled = true;
                break;

            case SKTouchAction.Moved:
                touch = e.Location;
                if (size.X == 0f || size.Y == 0f)
                {
                    return;
                }

                mtof.SetFloatData(0, 60 + (int)(touch.Y / size.Y * 40f));
                lfo.SetFloatData(0, touch.X / size.X * 10f);

                e.Handled = true;
                break;

            case SKTouchAction.Released:
                On = false;
                volume.SetFloatData(1, 0f);
                touch     = e.Location;
                e.Handled = true;
                break;
            }

            canvasView.InvalidateSurface();
        }
        public DSPSimplePatcher()
        {
            InitializeComponent();

            sound   = Global.Yse.NewSound();
            patcher = Global.Yse.NewPatcher();
            patcher.Create(1);

            mtof   = patcher.CreateObject(".mtof");
            sine   = patcher.CreateObject("~sine");
            lfo    = patcher.CreateObject("~sine");
            volume = patcher.CreateObject("~*");
            dac    = patcher.CreateObject("~dac");

            IHandle multiplier = patcher.CreateObject("~*");

            patcher.Connect(mtof, 0, sine, 0); // pass frequency to sine
            patcher.Connect(sine, 0, multiplier, 0);
            patcher.Connect(lfo, 0, multiplier, 1);
            patcher.Connect(multiplier, 0, volume, 0);
            patcher.Connect(volume, 0, dac, 0);

            mtof.SetFloatData(0, 60f);
            lfo.SetFloatData(0, 4f);
            volume.SetFloatData(1, 0f);

            sound.Create(patcher);
            sound.Play();
        }