public void Execute(
        VstBuffer <T> source,
        PcmBuffer <T> dest
        )
    {
        ArgumentNullException.ThrowIfNull(source);
        ArgumentNullException.ThrowIfNull(dest);

        dest.Log.Marge(source.Log);

        var targetIdx = 0;
        var target    = new Span <T>(dest.Buffer.Target);
        var left      = new ReadOnlySpan <T>(source.GetChannelBuffer(0));
        var right     = new ReadOnlySpan <T>(source.GetChannelBuffer(1));

        dest.Log.Add("[to pcm] start", _counter.NowTicks);
        for (var idx = 0; idx < left.Length; idx++)
        {
            target[targetIdx++] = left[idx];
            target[targetIdx++] = right[idx];
        }
        dest.Log.Add("[to pcm] end", _counter.NowTicks);
    }
        public void Test1()
        {
            var configuration =
                new ConfigurationBuilder()
                .AddJsonFile("appsettings.json")
                .Build();

            using var loggerFactory = LoggerFactory.Create(builder =>
            {
                builder.AddFilter("Momiji", LogLevel.Debug);
                builder.AddFilter("Microsoft", LogLevel.Warning);
                builder.AddFilter("System", LogLevel.Warning);
                builder.AddConsole();
                builder.AddDebug();
            });
            var logger = loggerFactory.CreateLogger <VstUnitTest>();

            using var dllManager = new DllManager(configuration, loggerFactory);
            var counter = new ElapsedTimeCounter();

            var blockSize = 2880;

            var midiEventInput = new BufferBlock <MIDIMessageEvent2>();

            using var buffer = new VstBuffer <double>(blockSize, 2);

            using var vst = new AudioMaster <double>(48000, blockSize, loggerFactory, counter, dllManager);
            var effect  = vst.AddEffect("Dexed.dll");
            var effect2 = vst.AddEffect("Synth1 VST.dll");

            //var aeffect = effect.GetAEffect();
            //for (int i = 0; i < 1/*aeffect.numParams*/; i++)
            //{
            //    var label = effect.GetParameterLabel(i);
            //    var name = effect.GetParameterName(i);
            //    var display = effect.GetParameterDisplay(i);
            //    var value = effect.GetParameter(i);
            //    logger.LogInformation($"VST Parameter {i}:{label}:{name}:{display}:{value}");
            //}

            {
                var nowTime = counter.NowTicks / 10;
                midiEventInput.Post(new MIDIMessageEvent2()
                {
                    midiMessageEvent =
                    {
                        receivedTime = nowTime,
                        data0        =    0x90,
                        data1        =    0x20,
                        data2        =    0x40,
                        data3        = 0
                    },
                    receivedTimeUSec = nowTime
                });
                midiEventInput.Post(new MIDIMessageEvent2()
                {
                    midiMessageEvent =
                    {
                        receivedTime = nowTime,
                        data0        =    0x90,
                        data1        =    0x21,
                        data2        =    0x40,
                        data3        = 0
                    },
                    receivedTimeUSec = nowTime
                });
                effect.ProcessEvent(nowTime, midiEventInput);
                effect.ProcessReplacing(nowTime, buffer);
            }

            {
                var nowTime = counter.NowTicks / 10;
                midiEventInput.Post(new MIDIMessageEvent2()
                {
                    midiMessageEvent =
                    {
                        receivedTime = nowTime,
                        data0        =    0x90,
                        data1        =    0x30,
                        data2        =    0x40,
                        data3        = 0
                    },
                    receivedTimeUSec = nowTime
                });
                effect.ProcessEvent(nowTime, midiEventInput);
                effect.ProcessReplacing(nowTime, buffer);
            }
            {
                var nowTime = counter.NowTicks / 10;
                midiEventInput.Post(new MIDIMessageEvent2()
                {
                    midiMessageEvent =
                    {
                        receivedTime = nowTime,
                        data0        =    0x90,
                        data1        =    0x40,
                        data2        =    0x40,
                        data3        = 0
                    },
                    receivedTimeUSec = nowTime
                });
                effect.ProcessEvent(nowTime, midiEventInput);
                effect.ProcessReplacing(nowTime, buffer);
            }
            {
                var nowTime = counter.NowTicks / 10;
                midiEventInput.Post(new MIDIMessageEvent2()
                {
                    midiMessageEvent =
                    {
                        receivedTime = nowTime,
                        data0        =    0x90,
                        data1        =    0x50,
                        data2        =    0x40,
                        data3        = 0
                    },
                    receivedTimeUSec = nowTime
                });
                effect.ProcessEvent(nowTime, midiEventInput);
                effect.ProcessReplacing(nowTime, buffer);
            }
        }