Beispiel #1
0
        public Halloween2017(IEnumerable <string> args)
        {
            mainSchedule.AddRange("5:00 pm", "9:00 pm",
                                  DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Sunday);
            mainSchedule.AddRange("5:00 pm", "9:00 pm",
                                  DayOfWeek.Friday, DayOfWeek.Saturday);

            string expFilesParam = args.FirstOrDefault(x => x.StartsWith("EXPFILES"));

            if (!string.IsNullOrEmpty(expFilesParam))
            {
                string[] parts = expFilesParam.Split('=');
                if (parts.Length == 2)
                {
                    Exec.ExpanderSharedFiles = parts[1];
                }
            }

            //expanderServer.AddInstance("4ea781ef257442edb524493da8f52220", expanderAudio2);     // rpi-eba6cbc7
            expanderServer.AddInstance("ed86c3dc166f41ee86626897ba039ed2", expanderLedmx);      // rpi-eb0092ca
            expanderServer.AddInstance("1583f686014345888c15d7fc9c55ca3c", expanderCat);        // rpi-eb81c94e
            expanderServer.AddInstance("d6fc4e752af04022bf3c1a1166a557bb", expanderHifi);       // rpi-eb428ef1
            expanderServer.AddInstance("60023fcde5b549b89fa828d31741dd0c", expanderPicture);    // rpi-eb91bc26
            expanderServer.AddInstance("e41d2977931d4887a9417e8adcd87306", expanderGhost);      // rpi-eb6a047c
            expanderServer.AddInstance("999861affa294fd7bbf0601505e9ae09", expanderMrPumpkin);  // rpi-ebd43a38
            expanderServer.AddInstance("992f8db68e874248b5ee667d23d74ac3", expanderSpider);     // rpi-eb9b3145
            expanderServer.AddInstance("db9b41a596cb4ed28e91f11a59afb95a", expanderRocking);    // rpi-eb32e5f9
            expanderServer.AddInstance("acbfada45c674077b9154f6a0e0df359", expanderFlying);     // rpi-eb35666e
            expanderServer.AddInstance("2e105175a66549d4a0ab7f8d446c2e29", expanderPopper);     // rpi-eb997095

            masterVolume.ConnectTo(Exec.MasterVolume);


            grumpyCat = new Modules.HalloweenGrumpyCat(
                air: catAir,
                light: catLights,
                audioPlayer: audioCat,
                name: nameof(grumpyCat));
            stateMachine.WhenStates(States.BackgroundFull, States.BackgroundSmall).Controls(grumpyCat.InputPower);

            pictureFrame = new Modules.HalloweenPictureFrame(
                medeaWizPlayer: pictureFrame1,
                name: nameof(pictureFrame));
            stateMachine.WhenStates(States.BackgroundFull).Controls(pictureFrame.InputPower);

            flyingSkeleton = new Modules.HalloweenFlying(
                eyes: flyingSkeletonEyes,
                fogStairsLight1: fogStairsLight1,
                fogStairsLight2: fogStairsLight2,
                fogStairsPump1: fogStairsPump1,
                fogStairsPump2: fogStairsPump2,
                audioPlayer: audioFlying,
                name: nameof(flyingSkeleton));
            stateMachine.WhenStates(States.BackgroundFull).Controls(flyingSkeleton.InputPower);

            firstBeam.Output.Controls(flyingSkeleton.InputTrigger);

            rockingChair = new Modules.HalloweenRocker(
                rockingMotor: rockingChairMotor,
                ladyEyes: ladyMovingEyes,
                strobeLight: rockingChairLight,
                audioPlayer: audioRocking,
                name: nameof(pictureFrame));
            stateMachine.WhenStates(States.BackgroundFull).Controls(rockingChair.InputPower);

            rockingMotion.Output.Controls(rockingChair.InputTrigger);

            mrPumpkin = new Modules.HalloweenMrPumpkin(
                air: mrPumpkinAir,
                light: pumpkinLights,
                audioPlayer: audioPumpkin,
                name: nameof(mrPumpkin));
            stateMachine.WhenStates(States.BackgroundFull, States.BackgroundSmall).Controls(mrPumpkin.InputPower);

            frankGhost = new Modules.HalloweenFrankGhost(
                air: frankGhostAir,
                light: pixelsFrankGhost,
                audioPlayer: audioFrankGhost,
                name: nameof(frankGhost));
            stateMachine.WhenStates(States.BackgroundFull, States.BackgroundSmall).Controls(frankGhost.InputPower);

            spiderDrop = new Modules.HalloweenSpiderDrop(
                smallSpiderEyes: smallSpiderEyes,
                eyesLight: spiderEyes,
                drop: spiderDropRelease,
                venom: spiderVenom,
                strobeLight: flashUnderSpider,
                audioPlayer: audioSpider,
                name: nameof(spiderDrop));
            stateMachine.WhenStates(States.BackgroundFull).Controls(spiderDrop.InputPower);

            fireProjector = new Modules.FireProjector(
                fire: fire,
                name: nameof(fireProjector));
            stateMachine.WhenStates(States.BackgroundFull, States.Setup).Controls(fireProjector.InputPower);

            buttonOverrideHours.Output.Subscribe(x =>
            {
                if (x)
                {
                    mainSchedule.SetForced(true);
                }
                else
                {
                    mainSchedule.SetForced(null);
                }
            });


            flashBaby.Output.Subscribe(x =>
            {
                // Flash
                if (x)
                {
                    allLights.TakeAndHoldControl(100, "FlashBaby");
                    allLights.SetData(null, Utils.Data(1.0), Utils.Data(Color.White));
                }
                else
                {
                    allLights.ReleaseControl();
                }
            });

            testButton1.Output.Subscribe(x =>
            {
            });

            testButton2.Output.Subscribe(x =>
            {
            });

            testButton3.Output.Subscribe(x =>
            {
            });

            testButton4.Output.Subscribe(x =>
            {
            });

            setupMode.Output.Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.GoToState(States.Setup);
                }
                else
                {
                    stateMachine.GoToDefaultState();
                }
            });

            fullOn.Output.Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.GoToState(States.BackgroundFull);
                }
                else
                {
                    stateMachine.GoToDefaultState();
                }
            });

            floodLights.Output.Subscribe(x =>
            {
                // Flash
                if (x)
                {
                    allLights.TakeAndHoldControl(200, "FlashBaby");
                    allLights.SetData(null, Utils.Data(Color.White, 1.0));
                }
                else
                {
                    allLights.ReleaseControl();
                }
            });

            emergencyStop.Output.Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.GoToState(States.EmergencyStop);
                }
                else
                {
                    if (mainSchedule.IsOpen)
                    {
                        stateMachine.GoToDefaultState();
                    }
                    else
                    {
                        stateMachine.GoToIdle();
                    }
                }
            });

            mainSchedule.Output.Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.SetDefaultState(States.BackgroundSmall);
                    stateMachine.GoToDefaultState();
                }
                else
                {
                    stateMachine.GoToIdle();
                    stateMachine.SetDefaultState(null);
                }
                SetManualColor();
            });

            popOut1.ConnectTo(wall1Light);
            popOut1.ConnectTo(wall4Light);
            popOut1.ConnectTo(wall6Light);
            popOut1.ConnectTo(flashTree);
            popOut2.ConnectTo(wall2Light);
            //popOut2.ConnectTo(wall7Light);
            //popOut2.ConnectTo(flashUnderSpider);
            popOutAll.ConnectTo(wall1Light);
            popOutAll.ConnectTo(wall2Light);
            popOutAll.ConnectTo(wall3Light);
            popOutAll.ConnectTo(wall4Light);
            popOutAll.ConnectTo(wall5Light);
            popOutAll.ConnectTo(wall6Light);
            //popOutAll.ConnectTo(wall7Light);
            //popOutAll.ConnectTo(wall8Light);
            //popOutAll.ConnectTo(wall9Light);
            popOutAll.ConnectTo(flashTree);
            //popOutAll.ConnectTo(flashUnderSpider);
            popOutAll.ConnectTo(pixelsRoofEdge);
            popOutAll.ConnectTo(pixelsFrankGhost);
            //            popOutAll.ConnectTo(pinSpot);

            allLights.Add(
                wall1Light,
                wall2Light,
                wall3Light,
                wall4Light,
                wall5Light,
                wall6Light,
                rockingChairLight,
                //wall7Light,
                //wall8Light,
                //wall9Light,
                flashTree,
                flashUnderSpider,
                pixelsRoofEdge,
                pixelsFrankGhost,
                //                pinSpot,
                spiderLight,
                fogStairsLight1,
                fogStairsLight2,
                spiderWebLights,
                pumpkinLights);

            purpleLights.Add(
                wall1Light,
                wall2Light,
                wall3Light,
                wall4Light,
                wall5Light,
                wall6Light,
                //wall7Light,
                //wall8Light,
                //wall9Light,
                pixelsRoofEdge);

            flickerEffect.ConnectTo(stairs1Light);
            flickerEffect.ConnectTo(stairs2Light);
            flickerEffect.ConnectTo(gargoyleLightsEyes);
            //flickerEffect.ConnectTo(flyingSkeletonEyes);
            flickerEffect.ConnectTo(streetNumberEyes);
            flickerEffect.ConnectTo(bigSpiderEyes);
            pulsatingGargoyle.ConnectTo(gargoyleLightsCrystal);
            pulsatingGargoyle.ConnectTo(treeSkulls);
            //pulsatingGargoyle.ConnectTo(spiderEyes);
            //pulsatingEffect1.ConnectTo(pinSpot, Tuple.Create<DataElements, object>(DataElements.Color, Color.FromArgb(0, 255, 0)));
            //pulsatingEffect2.ConnectTo(pinSpot, Tuple.Create<DataElements, object>(DataElements.Color, Color.FromArgb(255, 0, 0)));

            pulsatingGargoyle.ConnectTo(spiderWebLights);

            stateMachine.For(States.Setup)
            .Controls(1, flickerEffect, pulsatingGargoyle)
            .Execute(ins =>
            {
                ins.WaitUntilCancel();
            });

            stateMachine.For(States.BackgroundSmall)
            .Controls(1, flickerEffect, pulsatingGargoyle)
            .Execute(i =>
            {
                treeGhosts.SetBrightness(1.0);
                treeSkulls.SetBrightness(1.0);
                audioHifi.SetBackgroundVolume(0.5);
                audioHifi.PlayBackground();
                ladyMovingEyes.SetValue(true);

                var purpleColor = new ColorBrightness(HSV.ColorFromRGB(0.73333333333333328, 0, 1),
                                                      0.16470588235294117);

                purpleLights.SetData(null,
                                     Utils.Data(purpleColor.Brightness),
                                     Utils.Data(purpleColor.Color),
                                     Utils.Data(DataElements.ColorUltraViolet, 1.0));

                i.WaitUntilCancel();
            })
            .TearDown(instance =>
            {
                ladyMovingEyes.SetValue(false);
                Exec.Cancel(sub3dfxLady);
                audioHifi.PauseBackground();
                purpleLights.SetBrightness(0.0);
                treeGhosts.SetBrightness(0.0);
                treeSkulls.SetBrightness(0.0);
            });

            stateMachine.For(States.BackgroundFull)
            .Controls(1, flickerEffect, pulsatingGargoyle)
            .Execute(i =>
            {
                treeGhosts.SetBrightness(1.0);
                treeSkulls.SetBrightness(1.0);
                audioHifi.PlayBackground();
                audioHifi.SetBackgroundVolume(0.7);
                //Exec.Execute(sub3dfxLady);

                var purpleColor = new ColorBrightness(HSV.ColorFromRGB(0.73333333333333328, 0, 1),
                                                      0.16470588235294117);

                purpleLights.SetData(null, Utils.Data(purpleColor.Color, purpleColor.Brightness));

                while (!i.IsCancellationRequested && stateMachine.CurrentState == States.BackgroundFull)
                {
                    i.WaitFor(S(0.5));
                    if (!this.lastFogRun.HasValue || (DateTime.Now - this.lastFogRun.Value).TotalMinutes > 5)
                    {
                        // Run the fog for a little while
                        lastFog.SetValue(true);
                        i.WaitFor(S(4));
                        lastFog.SetValue(false);
                        this.lastFogRun = DateTime.Now;
                    }
                }
            })
            .TearDown(instance =>
            {
                purpleLights.SetBrightness(0.0);
                treeGhosts.SetBrightness(0.0);
                treeSkulls.SetBrightness(0.0);

                audioHifi.PauseBackground();

                timelineThunder1.Stop();
                timelineThunder2.Stop();
                timelineThunder3.Stop();
                timelineThunder4.Stop();
                timelineThunder5.Stop();
                timelineThunder6.Stop();
                timelineThunder7.Stop();
                timelineThunder8.Stop();

                flickerEffect.Stop();
                treeGhosts.SetBrightness(0.0);
                treeSkulls.SetBrightness(0.0);
            });

            stateMachine.For(States.EmergencyStop)
            .Execute(i =>
            {
                // Do nothing
                i.WaitUntilCancel();
            });

            stateMachine.For(States.Special1)
            .Execute(i =>
            {
                //audio2.PlayNewEffect("640 The Demon Exorcised.wav");

                i.WaitUntilCancel();
            });

            inputBrightness.Output.Subscribe(x =>
            {
                //                testLight1.SetBrightness(x);
            });

            inputH.WhenOutputChanges(x =>
            {
                //                testLight1.SetColor(HSV.ColorFromHSV(x.GetByteScale(), inputS.Value, 1.0));
            });

            inputS.Output.Subscribe(x =>
            {
                //                testLight1.SetColor(HSV.ColorFromHSV(inputH.Value.GetByteScale(), x, 1.0));
            });


            expanderHifi.AudioTrackStart.Subscribe(x =>
            {
                // Next track
                switch (x.Item2)
                {
                case "Thunder1.wav":
                    timelineThunder1.Start();
                    audioHifi.PlayEffect("scream.wav");
                    break;

                case "Thunder2.wav":
                    timelineThunder2.Start();
                    break;

                case "Thunder3.wav":
                    timelineThunder3.Start();
                    break;

                case "Thunder4.wav":
                    timelineThunder4.Start();
                    audioHifi.PlayEffect("424 Coyote Howling.wav");
                    break;

                case "Thunder5.wav":
                    timelineThunder5.Start();
                    //                        audioEeebox.PlayEffect("sixthsense-deadpeople.wav");
                    break;

                case "Thunder6.wav":
                    timelineThunder6.Start();
                    break;

                case "Thunder7.wav":
                    timelineThunder7.Start();
                    break;

                case "Thunder8.wav":
                    timelineThunder8.Start();
                    break;

                default:
                    log.Debug("Unknown track {0}", x);
                    break;
                }
            });

            timelineThunder1.AddMs(500, "A");
            timelineThunder1.AddMs(3500, "B");
            timelineThunder1.AddMs(4500, "C");
            timelineThunder1.TimelineTrigger += TriggerThunderTimeline;

            timelineThunder2.AddMs(500, "A");
            timelineThunder2.AddMs(1500, "B");
            timelineThunder2.AddMs(1600, "C");
            timelineThunder2.AddMs(3700, "C");
            timelineThunder2.TimelineTrigger += TriggerThunderTimeline;

            timelineThunder3.AddMs(100, "A");
            timelineThunder3.AddMs(200, "B");
            timelineThunder3.AddMs(300, "C");
            timelineThunder3.TimelineTrigger += TriggerThunderTimeline;

            timelineThunder4.AddMs(0, "A");
            timelineThunder4.AddMs(3500, "B");
            timelineThunder4.AddMs(4500, "C");
            timelineThunder4.TimelineTrigger += TriggerThunderTimeline;

            timelineThunder5.AddMs(1100, "A");
            timelineThunder5.AddMs(3500, "B");
            timelineThunder5.AddMs(4700, "C");
            timelineThunder5.TimelineTrigger += TriggerThunderTimeline;

            timelineThunder6.AddMs(1000, "A");
            timelineThunder6.AddMs(1800, "B");
            timelineThunder6.AddMs(6200, "C");
            timelineThunder6.TimelineTrigger += TriggerThunderTimeline;

            timelineThunder7.AddMs(0, "A");
            timelineThunder7.AddMs(200, "B");
            timelineThunder7.AddMs(300, "C");
            timelineThunder7.TimelineTrigger += TriggerThunderTimeline;

            timelineThunder8.AddMs(500, "A");
            timelineThunder8.AddMs(4000, "B");
            timelineThunder8.AddMs(4200, "C");
            timelineThunder8.TimelineTrigger += TriggerThunderTimeline;

            acnOutput.Connect(new Physical.Pixel1D(pixelsRoofEdge, 0, 50, true), SacnUniversePixel50, 1);
            acnOutput.Connect(new Physical.Pixel1D(pixelsRoofEdge, 50, 100), SacnUniversePixel100, 1);
            acnOutput.Connect(new Physical.Pixel1D(pixelsFrankGhost, 0, 5), SacnUniverseFrankGhost, 1);

            acnOutput.Connect(new Physical.FogMachineA(fogStairsPump1, fogStairsLight1, 1), SacnUniverseDMXFogA);
            acnOutput.Connect(new Physical.FogMachineA(fogStairsPump2, fogStairsLight2, 10), SacnUniverseDMXFogA);

            //acnOutput.Connect(new Physical.SmallRGBStrobe(spiderLight, 1), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.RGBStrobe(wall6Light, 60), SacnUniverseEdmx4A);
            //acnOutput.Connect(new Physical.RGBStrobe(wall9Light, 70), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.RGBStrobe(rockingChairLight, 40), SacnUniverseEdmx4A);
            //acnOutput.Connect(new Physical.RGBStrobe(wall7Light, 80), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.DMXCommandOutput(pictureFrame1, 1, TimeSpan.FromMilliseconds(500), 0), SacnUniverseEdmx4B);
            acnOutput.Connect(new Physical.DMXCommandOutput(lady3dfx, 1, TimeSpan.FromMilliseconds(500), 0), SacnUniverseEdmx4A);
            acnOutput.Connect(new Physical.MarcGamutParH7(wall1Light, 340, 8), SacnUniverseEdmx4A);
            acnOutput.Connect(new Physical.RGBStrobe(wall2Light, 80), SacnUniverseEdmx4A);
            acnOutput.Connect(new Physical.MarcGamutParH7(wall3Light, 330, 8), SacnUniverseEdmx4A);
            acnOutput.Connect(new Physical.MarcGamutParH7(wall4Light, 310, 8), SacnUniverseEdmx4A);
            acnOutput.Connect(new Physical.MarcGamutParH7(wall5Light, 300, 8), SacnUniverseEdmx4A);
            //            acnOutput.Connect(new Physical.MarcGamutParH7(wall6Light, 350, 8), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(stairs1Light, 66), SacnUniverseDMXCat);
            acnOutput.Connect(new Physical.GenericDimmer(stairs2Light, 51), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(treeGhosts, 67), SacnUniverseDMXCat);
            acnOutput.Connect(new Physical.GenericDimmer(treeSkulls, 131), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(spiderEyes, 128), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(popperEyes, 132), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(popper, 133), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.AmericanDJStrobe(flashTree, 100), SacnUniverseEdmx4A);
            acnOutput.Connect(new Physical.EliminatorFlash192(flashUnderSpider, 110), SacnUniverseDMXFogA);
            //            acnOutput.Connect(new Physical.MonopriceRGBWPinSpot(pinSpot, 20), 1);

            acnOutput.Connect(new Physical.GenericDimmer(fire, 1), SacnUniverseFire);

            acnOutput.Connect(new Physical.GenericDimmer(frankGhostAir, 10), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(mrPumpkinAir, 11), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(spiderWebLights, 99), SacnUniverseDMXCat);
            acnOutput.Connect(new Physical.GenericDimmer(catAir, 64), SacnUniverseDMXCat);
            acnOutput.Connect(new Physical.GenericDimmer(catLights, 65), SacnUniverseDMXCat);
            acnOutput.Connect(new Physical.GenericDimmer(pumpkinLights, 50), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(gargoyleLightsCrystal, 128), SacnUniverseDMXCat);
            acnOutput.Connect(new Physical.GenericDimmer(gargoyleLightsEyes, 129), SacnUniverseDMXCat);
            acnOutput.Connect(new Physical.GenericDimmer(flyingSkeletonEyes, 134), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(smallSpiderEyes, 135), SacnUniverseDMXLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(streetNumberEyes, 131), SacnUniverseDMXCat);
            acnOutput.Connect(new Physical.GenericDimmer(bigSpiderEyes, 132), SacnUniverseDMXCat);
            acnOutput.Connect(new Physical.GenericDimmer(hazerFanSpeed, 500), SacnUniverseDMXFogA);
            acnOutput.Connect(new Physical.GenericDimmer(hazerHazeOutput, 501), SacnUniverseDMXFogA);
            //            acnOutput.Connect(new Physical.RGBIS(testLight1, 260), 1);


            expanderLedmx.DigitalInputs[4].Connect(frankGhostMotion, false);
            expanderLedmx.DigitalInputs[5].Connect(mrPumpkinMotion, false);
            expanderLedmx.DigitalInputs[6].Connect(rockingMotion, false);
            expanderCat.DigitalInputs[7].Connect(catMotion);
            expanderCat.DigitalInputs[6].Connect(secondBeam);
            expanderCat.DigitalInputs[5].Connect(spiderDropTrigger, inverted: true);
            expanderCat.DigitalInputs[4].Connect(firstBeam);
            expanderLedmx.DigitalInputs[7].Connect(lastBeam);
            //expanderMrPumpkin.DigitalOutputs[7].Connect(popper);
            expanderLedmx.DigitalOutputs[2].Connect(lastFog, inverted: true);
            expanderMrPumpkin.DigitalOutputs[7].Connect(rockingChairMotor);
            expanderMrPumpkin.DigitalOutputs[4].Connect(ladyMovingEyes);
            expanderLedmx.DigitalOutputs[0].Connect(spiderDropRelease);
            expanderLedmx.DigitalOutputs[1].Connect(spiderVenom);
            expanderCat.DigitalOutputs[6].Connect(spiderJump2);
            expanderLedmx.Connect(audioFrankGhost);
            expanderCat.Connect(audioCat);
            expanderHifi.Connect(audioHifi);
            expanderMrPumpkin.Connect(audioPumpkin);
            //expanderAudio2.Connect(audio2);
            expanderFlying.Connect(audioFlying);
            expanderSpider.Connect(audioSpider);
            expanderRocking.Connect(audioRocking);
            expanderPopper.Connect(audioPopper);

            expanderHifi.BackgroundAudioFiles = new string[]
            {
                "Thunder1.wav",
                "Thunder2.wav",
                "Thunder3.wav",
                "Thunder4.wav",
                "Thunder5.wav",
                "Thunder6.wav",
                "Thunder7.wav",
                "Thunder8.wav"
            };
            expanderRocking.BackgroundAudioFiles = new string[]
            {
                "68 Creaky Wooden Floorboards.wav"
            };

            blockMaster.WhenOutputChanges(x => UpdateOSC());
            blockCat.WhenOutputChanges(x => UpdateOSC());
            blockFirst.WhenOutputChanges(x => UpdateOSC());
            blockPicture.WhenOutputChanges(x => UpdateOSC());
            blockGhost.WhenOutputChanges(x => UpdateOSC());
            blockLast.WhenOutputChanges(x => UpdateOSC());
            blockPumpkin.WhenOutputChanges(x => UpdateOSC());

            Utils.ReactiveOr(blockCat, blockMaster).Controls(grumpyCat.InputTriggerBlock);
            Utils.ReactiveOr(blockPumpkin, blockMaster).Controls(mrPumpkin.InputTriggerBlock);
            Utils.ReactiveOr(blockFrankGhost, blockMaster).Controls(frankGhost.InputTriggerBlock);
            Utils.ReactiveOr(blockSpiderDrop, blockMaster).Controls(spiderDrop.InputTriggerBlock);
            Utils.ReactiveOr(blockFire, blockMaster).Controls(fireProjector.InputTriggerBlock);
            Utils.ReactiveOr(blockPicture, blockMaster).Controls(pictureFrame.InputTriggerBlock);
            Utils.ReactiveOr(blockRocking, blockMaster).Controls(rockingChair.InputTriggerBlock);
            Utils.ReactiveOr(blockFirst, blockMaster).Controls(flyingSkeleton.InputTriggerBlock);

            catMotion.Controls(grumpyCat.InputTrigger);
            secondBeam.Controls(pictureFrame.InputTrigger);
            mrPumpkinMotion.Controls(mrPumpkin.InputTrigger);
            frankGhostMotion.Controls(frankGhost.InputTrigger);
            spiderDropTrigger.Controls(spiderDrop.InputTrigger);

            spiderDropTrigger.Output.Subscribe(x =>
            {
                if (x)
                {
                    Exec.Execute(sub3dfxLady);
                }
            });

            lastBeam.Output.Subscribe(x =>
            {
                UpdateOSC();

                if (x && (stateMachine.CurrentState == States.BackgroundFull || stateMachine.CurrentState == States.Setup) && !emergencyStop.Value && !blockMaster.Value && !blockLast.Value)
                {
                    subLast.Run();
                }
            });

            subFog
            .RunAction(i =>
            {
                lastFog.SetValue(true);
                lastFogRun = DateTime.Now;
                i.WaitFor(S(4));
                lastFog.SetValue(false);
            });

            sub3dfxLady
            .RunAction(i =>
            {
                i.WaitFor(S(1));

                if (random.Next(2) == 0)
                {
                    lady3dfx.SendCommand(null, 99);
                    i.WaitFor(S(30));
                }
                else
                {
                    lady3dfx.SendCommand(null, (byte)(random.Next(4) + 1));
                    i.WaitFor(S(60 * 2.0));
                }
            })
            .TearDown(i =>
            {
                lady3dfx.SendCommand(null, 255);
            });

            subLast
            .RunAction(ins =>
            {
                popperEyes.SetBrightness(1.0);
                lastFog.SetValue(true);
                lastFogRun = DateTime.Now;
                audioPopper.PlayEffect("Short Laugh.wav");
                ins.WaitFor(S(1.0));
                popper.SetValue(true);
                ins.WaitFor(S(2.0));
                audioPopper.PlayEffect("Leave Now.wav");
                ins.WaitFor(S(3.0));
                var tsk = Exec.MasterEffect.Fade(popperEyes, 1.0, 0.0, 2000, token: ins.Token);
                popper.SetValue(false);
                tsk.Wait();
            })
            .TearDown(ins =>
            {
                lastFog.SetValue(false);
                ins.WaitFor(S(1.0));
            });

            motionSeq.WhenExecuted
            .Execute(instance =>
            {
                //video2.PlayVideo("DancingDead_Wall_HD.mp4");

                //                    instance.WaitFor(S(10));
            })
            .TearDown(instance =>
            {
            });

            faderR.WhenOutputChanges(v => { SetManualColor(); });
            faderG.WhenOutputChanges(v => { SetManualColor(); });
            faderB.WhenOutputChanges(v => { SetManualColor(); });
            faderBright.WhenOutputChanges(v => { SetManualColor(); });

            manualFader.WhenOutputChanges(v =>
            {
                if (v)
                {
                    this.manualFaderToken = pixelsRoofEdge.TakeControl(200);
                }
                else
                {
                    this.manualFaderToken?.Dispose();
                    this.manualFaderToken = null;
                }

                oscServer.SendAllClients("/ManualFader/x", v ? 1 : 0);

                SetManualColor();
            });

            ConfigureOSC();
            ConfigureMIDI();
        }