Animatroller.Scenes.Xmas2016.Xmas2016 C# (CSharp) Метод

Xmas2016() публичный Метод

public Xmas2016 ( IEnumerable args ) : System
args IEnumerable
Результат System
        public Xmas2016(IEnumerable<string> args)
        {
            hours.AddRange("4:00 pm", "10:00 pm");

            hours.Output.Log("Hours");

            string expanderFilesFolder = string.Empty;
            string expFilesParam = args.FirstOrDefault(x => x.StartsWith("EXPFILES"));
            if (!string.IsNullOrEmpty(expFilesParam))
            {
                string[] parts = expFilesParam.Split('=');
                if (parts.Length == 2)
                {
                    expanderFilesFolder =
                    expanderServer.ExpanderSharedFiles = parts[1];
                }
            }

            pulsatingStar.ConnectTo(lightHangingStar);
            pulsatingEffectOlaf.ConnectTo(lightOlaf);
            pulsatingEffectPoppy.ConnectTo(lightPoppy);
            pulsatingEffectR2D2.ConnectTo(lightR2D2);
            pulsatingEffectGeneral.ConnectTo(lightHangingStar);
            pulsatingEffectGeneral.ConnectTo(lightOlaf);
            pulsatingEffectGeneral.ConnectTo(lightR2D2);
            pulsatingEffectGeneral.ConnectTo(lightPoppy);
            pulsatingEffectGeneral.ConnectTo(lightTreeStars);
            pulsatingEffectGeneral.ConnectTo(lightVader, Utils.AdditionalData(Color.Red));
            pulsatingPinSpot.ConnectTo(lightPinSpot, Utils.AdditionalData(Color.Red));
            pulsatingEffectTree.ConnectTo(pixelsTree, Utils.AdditionalData(treeColors[0]));
            pulsatingEffectTree.ConnectTo(pixelsBetweenTrees, Utils.AdditionalData(treeColors[0]));
            pulsatingEffectTree.NewIterationAction = i =>
                {
                    Color newColor = treeColors[i % treeColors.Length];
                    pulsatingEffectTree.SetAdditionalData(pixelsTree, Utils.AdditionalData(newColor));
                    pulsatingEffectTree.SetAdditionalData(pixelsBetweenTrees, Utils.AdditionalData(newColor));
                };

            expanderServer.AddInstance("ec30b8eda95b4c5cab46bf630d74810e", expanderLocal);
            expanderServer.AddInstance("ed86c3dc166f41ee86626897ba039ed2", expanderLedmx);          // rpi-eb0092ca
            expanderServer.AddInstance("76d09e6032d54e77aafec90e1fc4b35b", expanderHiFi);           // rpi-eb428ef1
            expanderServer.AddInstance("4ea781ef257442edb524493da8f52220", expanderVideo1);         // rpi-eba6cbc7
            expanderServer.AddInstance("999861affa294fd7bbf0601505e9ae09", expanderSnow);           // rpi-ebd43a38
            expanderServer.AddInstance("e41d2977931d4887a9417e8adcd87306", expanderControlPanel);   // rpi-eb6a047c

            expanderLedmx.DigitalInputs[6].Connect(inPoppy);
            expanderLedmx.DigitalInputs[5].Connect(inR2D2);
            expanderLedmx.DigitalInputs[4].Connect(inOlaf);
            expanderSnow.DigitalOutputs[6].Connect(snowMachine);

            expanderControlPanel.DigitalInputs[0].Connect(controlButtonWhite, true);
            expanderControlPanel.DigitalInputs[1].Connect(controlButtonYellow, true);
            expanderControlPanel.DigitalInputs[2].Connect(controlButtonBlue, true);
            expanderControlPanel.DigitalInputs[3].Connect(controlButtonGreen, true);
            expanderControlPanel.DigitalInputs[4].Connect(controlButtonBlack, true);
            expanderControlPanel.DigitalInputs[5].Connect(controlButtonRed, true);

            expanderLedmx.Connect(audioLedmx);
            expanderHiFi.Connect(audioHiFi);
            expanderSnow.Connect(audioDarthVader);
            expanderVideo1.Connect(audioVideo1);

            blackOut.ConnectTo(Exec.Blackout);
            whiteOut.ConnectTo(Exec.Whiteout);

            dmxPlayback.Load(Path.Combine(expanderFilesFolder, "Seq", "XmasLoop.bin"), 15);
            dmxPlayback.Loop = true;

            var pixelMapping = Framework.Utility.PixelMapping.GeneratePixelMappingFromGlediatorPatch(
                Path.Combine(expanderFilesFolder, "Glediator", "ArtNet 14-15 20x10.patch.glediator"));
            dmxPlayback.SetOutput(pixelsMatrix, pixelMapping);

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

            inflatablesRunning.Subscribe(x =>
            {
                airReindeerBig.SetValue(x);
            });

            stateMachine.ForFromSubroutine(States.Background, subBackground);
            stateMachine.ForFromSubroutine(States.MusicChristmasCanon, subMusicChristmasCanon);
            stateMachine.ForFromSubroutine(States.MusicBelieve, subMusicBelieve);
            stateMachine.ForFromSubroutine(States.MusicSarajevo, subMusicSarajevo);
            stateMachine.ForFromSubroutine(States.MusicHolyNight, subMusicHolyNight);
            stateMachine.ForFromSubroutine(States.MusicCarol, subMusicCarol);
            stateMachine.ForFromSubroutine(States.SantaVideo, subSantaVideo);
            stateMachine.ForFromSubroutine(States.DarthVader, subStarWars);

            hours
                .ControlsMasterPower(laser)
                .ControlsMasterPower(airR2D2Olaf)
                .ControlsMasterPower(airSantaPoppy1)
                .ControlsMasterPower(airSnowman)
                .ControlsMasterPower(airTree)
                .ControlsMasterPower(airSantaPopup);

            buttonStartInflatables.Output.Subscribe(x =>
            {
                if (x && hours.IsOpen)
                {
                    inflatablesRunning.OnNext(true);
                    Exec.SetKey("InflatablesRunning", "True");
                }
            });

            laserActivated.WhenOutputChanges(x =>
            {
                laser.SetValue(x);
            });

            buttonTest.WhenOutputChanges(x =>
            {
            });

            buttonReset.WhenOutputChanges(x =>
            {
                if (x)
                    stateMachine.GoToDefaultState();
            });

            acnOutput.Connect(new Physical.Pixel1D(pixelsRoofEdge, 0, 50, reverse: true), SacnUniverseLED50, 1);
            acnOutput.Connect(new Physical.Pixel1D(pixelsRoofEdge, 50, 100), SacnUniverseLED100, 1);

            acnOutput.Connect(new Physical.Pixel1D(pixelsTree, 0, 50), SacnUniverseLEDTree50, 1);
            acnOutput.Connect(new Physical.Pixel1D(pixelsBetweenTrees, 0, 50), SacnUniversePixelString1, 1);
            //acnOutput.Connect(new Physical.Pixel1D(pixelsTree, 0, 50), SacnUniversePixelString2, 1);
            acnOutput.Connect(new Physical.Pixel1D(pixelsGround, 0, 50), SacnUniversePixelGround, 1);
            acnOutput.Connect(new Physical.Pixel1D(pixelsHeart, 0, 50), SacnUniversePixelString4, 1);

            var pixelMapping2D = Framework.Utility.PixelMapping.GeneratePixelMapping(20, 10, pixelOrder: Framework.Utility.PixelOrder.HorizontalSnakeBottomLeft);
            acnOutput.Connect(new Physical.Pixel2D(pixelsMatrix, pixelMapping2D), SacnUniversePixelMatrix, 1);

            acnOutput.Connect(new Physical.Pixel1D(saberPixels), SacnUniversePixelSaber, 1);
            acnOutput.Connect(new Physical.Pixel1D(haloPixels), SacnUniversePixelSaber, 100);

            acnOutput.Connect(new Physical.GenericDimmer(airReindeerBig, 10), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(airR2D2Olaf, 33), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightHat1, 21), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightHat2, 22), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightHat3, 23), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightHat4, 24), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightStairRail1, 19), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightStairRail2, 38), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightRail1, 20), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightRail2, 28), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightRail3, 29), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightRail4, 66), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.MarcGamutParH7(lightVader, 310), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.RGBStrobe(lightFlood1, 60), SacnUniverseEdmx4);
            acnOutput.Connect(new Physical.MarcGamutParH7(lightFlood2, 330), SacnUniverseEdmx4);
            acnOutput.Connect(new Physical.RGBStrobe(lightFlood3, 70), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.RGBStrobe(lightFlood4, 40), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.MarcGamutParH7(lightFlood5, 340), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.RGBStrobe(lightFlood4, 40), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.MarcGamutParH7(lightFlood5, 340), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.RGBStrobe(lightFlood6, 80), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.MarcGamutParH7(lightFlood7, 300), SacnUniverseLedmx);

            acnOutput.Connect(new Physical.GenericDimmer(laser, 1), SacnUniverseRenard18);

            acnOutput.Connect(new Physical.GenericDimmer(lightOlaf, 128), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(airSnowman, 133), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(airTree, 9), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightInflatableTree, 10), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightSnowman, 131), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(lightSanta, 132), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(lightPoppy, 134), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(lightSantaPopup, 263), SacnUniverseEdmx4);
            acnOutput.Connect(new Physical.MonopriceMovingHeadLight12chn(movingHead, 200), SacnUniverseEdmx4);

            acnOutput.Connect(new Physical.GenericDimmer(lightReindeerBig, 65), SacnUniverseLedmx);

            acnOutput.Connect(new Physical.GenericDimmer(lightStairs1, 64), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(lightStairs2, 25), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightStairs3, 2), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.MonopriceRGBWPinSpot(lightPinSpot, 20), SacnUniverseEdmx4);
            acnOutput.Connect(new Physical.GenericDimmer(lightTreeStars, 39), SacnUniverseRenard18);

            acnOutput.Connect(new Physical.GenericDimmer(lightR2D2, 37), SacnUniverseRenard18);
            //acnOutput.Connect(new Physical.GenericDimmer(lightNet5, 11), SacnUniverseRenardBig);
            //acnOutput.Connect(new Physical.GenericDimmer(lightNet6, 19), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(airSantaPopup, 15), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(airSantaPoppy1, 30), SacnUniverseRenard18);
            //acnOutput.Connect(new Physical.GenericDimmer(lightNet7, 22), SacnUniverseRenardBig);

            acnOutput.Connect(new Physical.GenericDimmer(hazerFanSpeed, 500), SacnUniverseEdmx4);
            acnOutput.Connect(new Physical.GenericDimmer(hazerHazeOutput, 501), SacnUniverseEdmx4);
            //            acnOutput.Connect(new Physical.GenericDimmer(lightStairs2, 25), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(lightXmasTree, 11), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(lightReindeers, 40), SacnUniverseRenard18);

            //            acnOutput.Connect(new Physical.GenericDimmer(lightStairs1, 1), SacnUniverseRenardSmall);
            //acnOutput.Connect(new Physical.GenericDimmer(lightNet2, 2), SacnUniverseRenardSmall);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet1, 5), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet2, 6), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet3, 7), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightTopper1, 3), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightTopper2, 4), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightHangingStar, 8), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet4, 26), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet5, 27), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet6, 34), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet7, 35), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet8, 36), SacnUniverseRenard18);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet9, 50), SacnUniverseLedmx);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet10, 51), SacnUniverseLedmx);

            //acnOutput.Connect(new Physical.GenericDimmer(lightNet3, 4), SacnUniverseRenardSmall);
            //acnOutput.Connect(new Physical.GenericDimmer(lightNet4, 5), SacnUniverseRenardSmall);
            //acnOutput.Connect(new Physical.GenericDimmer(lightTopper1, 7), SacnUniverseRenardSmall);
            //acnOutput.Connect(new Physical.GenericDimmer(lightTopper2, 8), SacnUniverseRenardSmall);

            faderR.WhenOutputChanges(v => { SetManualColor(); });
            faderG.WhenOutputChanges(v => { SetManualColor(); });
            faderB.WhenOutputChanges(v => { SetManualColor(); });
            faderBright.WhenOutputChanges(v => { SetManualColor(); });
            faderPan.Output.Subscribe(p =>
            {
                movingHead.SetPan(p * 540, null);
            });
            faderTilt.Output.Subscribe(t =>
            {
                movingHead.SetTilt(t * 270, null);
            });

            hours.Output.Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.SetDefaultState(States.Background);
                    stateMachine.GoToDefaultState();
                }
                else
                {
                    //if (buttonOverrideHours.Active)
                    //    return;

                    stateMachine.SetDefaultState(null);
                    stateMachine.GoToIdle();

                    // Needed?
                    System.Threading.Thread.Sleep(200);

                    if (Initialized)
                    {
                        inflatablesRunning.OnNext(false);
                        Exec.SetKey("InflatablesRunning", "False");
                    }
                }
            });

            subBackground
                .AutoAddDevices(lockPriority: 100)
                .RunAction(i =>
                {
                    lightStairs1.SetBrightness(1);
                    lightStairs2.SetBrightness(1);
                    lightStairs3.SetBrightness(1);
                    lightReindeerBig.SetBrightness(1);
                    pulsatingEffectGeneral.Start();
                    pulsatingEffectTree.Start();
                    pulsatingPinSpot.Start();
                    lightNet1.SetBrightness(1);
                    lightNet2.SetBrightness(1);
                    lightNet3.SetBrightness(1);
                    lightNet4.SetBrightness(1);
                    lightNet5.SetBrightness(1);
                    lightNet6.SetBrightness(1);
                    lightNet7.SetBrightness(1);
                    lightNet8.SetBrightness(1);
                    lightNet9.SetBrightness(1);
                    lightNet10.SetBrightness(1);
                    lightTopper1.SetBrightness(1);
                    lightTopper2.SetBrightness(1);
                    lightInflatableTree.SetBrightness(1);
                    lightXmasTree.SetValue(true);
                    lightStairRail1.SetBrightness(1);
                    lightStairRail2.SetBrightness(1);
                    lightRail1.SetBrightness(1);
                    lightRail2.SetBrightness(1);
                    lightRail3.SetBrightness(1);
                    lightRail4.SetBrightness(1);
                    lightSanta.SetBrightness(1);
                    lightSantaPopup.SetBrightness(1);
                    lightSnowman.SetBrightness(1);
                    lightHat1.SetBrightness(1);
                    lightHat2.SetBrightness(1);
                    lightHat3.SetBrightness(1);
                    lightHat4.SetBrightness(1);
                    lightReindeers.SetBrightness(1);
                    //lightVader.SetColor(Color.Red, 1);
                    lightFlood1.SetColor(Color.Red, 1);
                    lightFlood2.SetColor(Color.Red, 1);
                    lightFlood3.SetColor(Color.Red, 1);
                    lightFlood4.SetColor(Color.Red, 1);
                    lightFlood5.SetColor(Color.Red, 1);
                    lightFlood6.SetColor(Color.Red, 1);
                    lightFlood7.SetColor(Color.Red, 1);

                    saberPixels.SetColor(Color.Red, 0.4, i.Token);

                    subRandomSantaVideo.Run();
                    subCandyCane.Run();
                    subHeart.Run();
                    dmxPlayback.Run();

                    i.WaitUntilCancel();
                })
                .TearDown(i =>
                {
                    dmxPlayback.Stop();
                    Exec.Cancel(subHeart);
                    Exec.Cancel(subCandyCane);
                    Exec.Cancel(subRandomSantaVideo);
                    pulsatingEffectGeneral.Stop();
                    pulsatingPinSpot.Stop();
                    pulsatingEffectTree.Stop();
                });

            subCandyCane
                .LockWhenRunning(pixelsRoofEdge)
                .LockWhenRunning(pixelsGround)
                .RunAction(i =>
                {
                    const int spacing = 4;

                    while (true)
                    {
                        for (int x = 0; x < spacing; x++)
                        {
                            pixelsRoofEdge.Inject((x % spacing) == 0 ? Color.Red : Color.White, 0.5, i.Token);
                            pixelsGround.Inject((x % spacing) == 0 ? Color.Red : Color.White, 0.5, i.Token);

                            i.WaitFor(S(0.30), true);
                        }
                    }
                });

            subHeart
                .LockWhenRunning(pixelsHeart)
                .RunAction(i =>
                {
                    var levels = new double[]
                    {
                        0.1,
                        0.2,
                        0.3,
                        0.4,
                        0.6,
                        0.8,
                        0.9,
                        1.0,
                        0.9,
                        0.8,
                        0.6,
                        0.4,
                        0.3,
                        0.2,
                    };

                    while (true)
                    {
                        for (int x = 0; x < levels.Length; x++)
                        {
                            double brightness = levels[x];
                            pixelsHeart.Inject(Color.Red, brightness, i.Token);

                            i.WaitFor(S(0.50), true);
                        }
                    }
                });

            subSnow
                .RunAction(ins =>
                {
                    pulsatingPinSpot.SetAdditionalData(lightPinSpot, Utils.AdditionalData(Color.White));
                    snowMachine.SetValue(true);

                    ins.WaitFor(S(15));
                })
                .TearDown(i =>
                {
                    pulsatingPinSpot.SetAdditionalData(lightPinSpot, Utils.AdditionalData(Color.Red));
                    snowMachine.SetValue(false);
                });

            subStarWarsCane
                .LockWhenRunning(
                    pixelsRoofEdge,
                    pixelsGround,
                    pixelsBetweenTrees,
                    pixelsMatrix)
                .RunAction(instance =>
                {
                    const int spacing = 4;

                    while (!instance.CancelToken.IsCancellationRequested)
                    {
                        for (int i = 0; i < spacing; i++)
                        {
                            switch (i % spacing)
                            {
                                case 0:
                                case 1:
                                    pixelsRoofEdge.InjectRev(Color.Yellow, 1.0, instance.Token);
                                    pixelsGround.Inject(Color.Yellow, 1.0, instance.Token);
                                    pixelsBetweenTrees.Inject(Color.Yellow, 1.0, instance.Token);
                                    pixelsMatrix.InjectRow(Color.Yellow, 1.0, instance.Token);
                                    break;
                                case 2:
                                case 3:
                                    pixelsRoofEdge.InjectRev(Color.Orange, 0.2, instance.Token);
                                    pixelsGround.Inject(Color.Orange, 0.2, instance.Token);
                                    pixelsBetweenTrees.Inject(Color.Orange, 0.2, instance.Token);
                                    pixelsMatrix.InjectRow(Color.Orange, 0.2, instance.Token);
                                    break;
                            }

                            instance.WaitFor(S(0.1));

                            if (instance.IsCancellationRequested)
                                break;
                        }
                    }
                });

            subMovingHead
                .RunAction(ins =>
                    {
                        while (!ins.IsCancellationRequested)
                        {
                            ins.WaitFor(S(0.1));
                        }
                    });

            subMusicChristmasCanon
                .LockWhenRunning(lightSantaPopup, movingHead, lightXmasTree)
                .RunAction(ins =>
                    {
                        lightSantaPopup.SetBrightness(1);
                        movingHead.SetColor(Color.Red, 1);
                        lightXmasTree.SetValue(true);
                        audioHiFi.PlayTrack("21. Christmas Canon Rock.wav");
                        ins.WaitFor(S(300));
                    }).TearDown(i =>
                    {
                        lorChristmasCanon.Stop();
                        audioHiFi.PauseTrack();
                    });

            subMusicBelieve
                .LockWhenRunning(lightSantaPopup, movingHead, lightXmasTree, hazerFanSpeed, hazerHazeOutput)
                .RunAction(ins =>
                {
                    lightSantaPopup.SetBrightness(1);
                    movingHead.SetColor(Color.Red, 1);
                    lightXmasTree.SetValue(true);
                    hazerFanSpeed.SetBrightness(0.3);
                    hazerHazeOutput.SetBrightness(0.1);
                    audioHiFi.PlayTrack("T.P.E. - 04 - Josh Groban - Believe.flac");
                    ins.WaitFor(S(260));
                }).TearDown(i =>
                {
                    lorBelieve.Stop();
                    audioHiFi.PauseTrack();
                });

            subMusicSarajevo
                .LockWhenRunning(lightSantaPopup, movingHead, lightXmasTree)
                .RunAction(ins =>
                {
                    lightSantaPopup.SetBrightness(1);
                    movingHead.SetColor(Color.Red, 1);
                    lightXmasTree.SetValue(true);
                    audioHiFi.PlayTrack("04 Christmas Eve _ Sarajevo (Instrum.wav");
                    ins.WaitFor(S(200));
                }).TearDown(i =>
                {
                    lorSarajevo.Stop();
                    audioHiFi.PauseTrack();
                });

            subMusicHolyNight
                .LockWhenRunning(lightSantaPopup, movingHead, lightXmasTree)
                .RunAction(ins =>
                {
                    lightSantaPopup.SetBrightness(1);
                    movingHead.SetColor(Color.Red, 1);
                    lightXmasTree.SetValue(true);
                    audioHiFi.PlayTrack("01 O Come All Ye Faithful _ O Holy N.wav");
                    ins.WaitFor(S(260));
                }).TearDown(i =>
                {
                    lorHolyNight.Stop();
                    audioHiFi.PauseTrack();
                });

            subMusicCarol
                .LockWhenRunning(lightSantaPopup, movingHead, lightXmasTree)
                .RunAction(ins =>
                {
                    lightSantaPopup.SetBrightness(1);
                    movingHead.SetColor(Color.Red, 1);
                    lightXmasTree.SetValue(true);
                    audioHiFi.PlayTrack("09 Carol of the Bells (Instrumental).wav");
                    ins.WaitFor(S(160));
                }).TearDown(i =>
                {
                    lorCarol.Stop();
                    audioHiFi.PauseTrack();
                });

            subSantaVideo
                .LockWhenRunning(laser, lightSantaPopup, movingHead, lightXmasTree)
                .RunAction(i =>
                {
                    laser.SetValue(false);
                    lightSantaPopup.SetBrightness(1);
                    movingHead.SetColor(Color.Red, 1);
                    lightXmasTree.SetValue(true);

                    switch (random.Next(3))
                    {
                        case 0:
                            // NBC_WeWishYou_Holl_H 1:22
                            expanderVideo1.SendSerial(0, new byte[] { 4 });
                            Task.Delay(5000).ContinueWith(t => lorJingleBells.Start(duration: S(68)));
                            i.WaitFor(S(80));
                            break;

                        case 1:
                            // NBC_DeckTheHalls_Holl_H 1:31
                            expanderVideo1.SendSerial(0, new byte[] { 5 });
                            Task.Delay(5000).ContinueWith(t => lorJingleBells.Start(duration: S(78)));
                            i.WaitFor(S(90));
                            break;

                        case 2:
                            // NBC_JingleBells_Holl_H 1:31
                            expanderVideo1.SendSerial(0, new byte[] { 6 });
                            Task.Delay(5000).ContinueWith(t => lorJingleBells.Start(duration: S(83)));
                            i.WaitFor(S(90));
                            break;
                    }
                })
                .TearDown(i =>
                {
                    laser.SetValue(true);
                    lorJingleBells.Stop();
                    expanderVideo1.SendSerial(0, new byte[] { 100 });
                });

            subRandomSantaVideo
                .RunAction(i =>
                {
                    while (!i.IsCancellationRequested)
                    {
                        switch (random.Next(4))
                        {
                            case 0:
                                // Nothing
                                i.WaitFor(S(60));
                                break;

                            case 1:
                                expanderVideo1.SendSerial(0, new byte[] { 1 });
                                i.WaitFor(S(70));
                                break;

                            case 2:
                                expanderVideo1.SendSerial(0, new byte[] { 2 });
                                i.WaitFor(S(100));
                                break;

                            case 3:
                                expanderVideo1.SendSerial(0, new byte[] { 3 });
                                i.WaitFor(S(60));
                                break;
                        }
                    }
                }).TearDown(i =>
                {
                    expanderVideo1.SendSerial(0, new byte[] { 100 });
                });

            subPoppy
                .RunAction(i =>
                {
                    pulsatingEffectPoppy.Start(100);
                    audioVideo1.PlayNewEffect("Trolls Sounds of Silence.wav");
                    i.WaitFor(S(46));
                    pulsatingEffectPoppy.Stop();
                });

            subOlaf
                .RunAction(i =>
                {
                    pulsatingEffectOlaf.Start(100);
                    audioLedmx.PlayNewEffect("WarmHugs.wav", 0.0, 1.0);
                    i.WaitFor(S(10));
                    pulsatingEffectOlaf.Stop();
                });

            subR2D2
                .RunAction(i =>
                {
                    pulsatingEffectR2D2.Start(100);
                    audioLedmx.PlayNewEffect("Im C3PO.wav", 1.0, 0.0);
                    i.WaitFor(S(4));
                    audioLedmx.PlayNewEffect("Processing R2D2.wav", 0.5, 0.0);
                    i.WaitFor(S(5));
                    pulsatingEffectR2D2.Stop();
                });

            subStarWars
                .LockWhenRunning(
                    saberPixels,
                    haloPixels,
                    lightVader,
                    lightR2D2,
                    lightHangingStar,
                    laser)
                .RunAction(instance =>
                {
                    laser.SetValue(false);
                    //Exec.Cancel(subCandyCane);
                    subStarWarsCane.Run();
                    lightR2D2.SetBrightness(1.0, instance.Token);

                    audioHiFi.PlayTrack("01. Star Wars - Main Title.wav");

                    instance.WaitFor(S(16));

                    var haloJob = haloPixels.Chaser(new IData[] {
                        Utils.Data(Color.White, 1.0),
                        Utils.Data(Color.White, 0.7),
                        Utils.Data(Color.White, 0.5),
                        Utils.Data(Color.White, 0.3)
                    }, 4, token: instance.Token);

                    pulsatingStar.Start();

                    Exec.MasterEffect.Fade(lightVader, 0.0, 1.0, 1000, token: instance.Token, additionalData: Utils.AdditionalData(Color.Red));
                    instance.WaitFor(S(2.5));

                    Exec.Cancel(subStarWarsCane);
                    instance.WaitFor(S(0.5));

                    audioDarthVader.PlayEffect("saberon.wav");
                    for (int sab = 0; sab < 33; sab++)
                    {
                        saberPixels.Inject(Color.Red, 0.5, instance.Token);
                        instance.WaitFor(S(0.01));
                    }
                    instance.WaitFor(S(1));
                    audioHiFi.PauseTrack();

                    lightVader.SetColor(Color.Red, 1.0, instance.Token);
                    audioDarthVader.PlayEffect("father.wav");
                    instance.WaitFor(S(5));

                    audioDarthVader.PlayEffect("force1.wav");
                    instance.WaitFor(S(4));

                    lightVader.SetBrightness(0.0, instance.Token);

                    audioDarthVader.PlayEffect("saberoff.wav");
                    instance.WaitFor(S(0.7));
                    for (int sab = 0; sab < 17; sab++)
                    {
                        saberPixels.InjectRev(Color.Black, 0, instance.Token);
                        saberPixels.InjectRev(Color.Black, 0, instance.Token);
                        instance.WaitFor(S(0.01));
                    }
                    Exec.StopManagedTask(haloJob);
                    pulsatingStar.Stop();

                    instance.WaitFor(S(2));
                })
                .TearDown(i =>
                {
                    laser.SetValue(true);
                    audioHiFi.PauseTrack();
                });

            inOlaf.Output.Subscribe(x =>
            {
                if (x && hours.IsOpen && stateMachine.CurrentState == States.Background)
                    subOlaf.Run();
            });

            inR2D2.Output.Subscribe(x =>
            {
                if (x && hours.IsOpen && stateMachine.CurrentState == States.Background)
                    subR2D2.Run();
            });

            inPoppy.Output.Subscribe(x =>
            {
                if (x && hours.IsOpen && stateMachine.CurrentState == States.Background)
                    subPoppy.Run();
            });

            controlButtonWhite.WhenOutputChanges(x =>
            {
                if (x && hours.IsOpen && stateMachine.CurrentState != States.DarthVader)
                    subSnow.Run();
            });

            controlButtonYellow.WhenOutputChanges(x =>
            {
                if (x && hours.IsOpen && stateMachine.CurrentState == States.Background)
                    stateMachine.GoToState(States.DarthVader);
            });

            controlButtonBlue.WhenOutputChanges(x =>
            {
                if (x && hours.IsOpen && stateMachine.CurrentState == States.Background)
                    stateMachine.GoToState(States.MusicBelieve);
            });

            controlButtonGreen.WhenOutputChanges(x =>
            {
                if (x && hours.IsOpen && stateMachine.CurrentState == States.Background)
                    stateMachine.GoToState(States.MusicHolyNight);
            });

            controlButtonBlack.WhenOutputChanges(x =>
            {
                if (x)
                {
                    if (hours.IsOpen)
                    {
                        if (stateMachine.CurrentState == States.Background)
                            stateMachine.GoToState(States.MusicSarajevo);
                    }
                    else
                    {
                        audioDarthVader.PlayEffect("force1.wav");
                    }
                }
            });

            controlButtonRed.WhenOutputChanges(x =>
            {
                if (x)
                {
                    if (hours.IsOpen)
                    {
                        if (stateMachine.CurrentState == States.Background)
                            stateMachine.GoToState(States.SantaVideo);
                    }
                    else
                    {
                        audioDarthVader.PlayEffect("darthvader_powerofthedarkside.wav");
                    }
                }
            });

            controlButtonRed.IsHeld.Subscribe(x =>
            {
                if (x)
                    this.stateMachine.GoToDefaultState();
            });

            audioHiFi.AudioTrackStart += (o, e) =>
            {
                switch (e.FileName)
                {
                    case "21. Christmas Canon Rock.wav":
                        lorChristmasCanon.Start();
                        break;

                    case "T.P.E. - 04 - Josh Groban - Believe.flac":
                        lorBelieve.Start();
                        break;

                    case "04 Christmas Eve _ Sarajevo (Instrum.wav":
                        lorSarajevo.Start();
                        break;

                    case "01 O Come All Ye Faithful _ O Holy N.wav":
                        lorHolyNight.Start();
                        break;

                    case "09 Carol of the Bells (Instrumental).wav":
                        lorCarol.Start();
                        break;
                }
            };

            inShowMachine.Output.Subscribe(x =>
            {
                snowMachine.SetValue(x);
            });

            ImportAndMapChristmasCanon();
            ImportAndMapBelieve();
            ImportAndMapJingleBells();
            ImportAndMapSarajevo();
            ImportAndMapHolyNight();
            ImportAndMapCarol();

            ConfigureMIDI();
            ConfigureOSC();
        }