Пример #1
0
        private static GloCommandContainer SamplesToCommands(Sample[] samples)
        {
            GloCommandContainer container = new GloCommandContainer(null, "END");
            GloColor            lastColor = GloColor.Black;
            int lastTick = 0;

            for (int i = 0; i < samples.Length; i++)
            {
                int delay = samples[i].ticks - lastTick;
                if (delay > 0)
                {
                    if (samples[i].colBefore == lastColor)
                    {
                        container.Commands.Add(new GloDelayCommand(delay));
                    }
                    else
                    {
                        container.Commands.Add(new GloRampCommand(samples[i].colBefore, delay));
                        lastColor = samples[i].colBefore;
                    }
                }

                if (samples[i].colAfter != lastColor)
                {
                    container.Commands.Add(new GloColorCommand(samples[i].colAfter));
                    lastColor = samples[i].colAfter;
                }

                lastTick = samples[i].ticks;
            }

            return(container);
        }
Пример #2
0
 public PrimitiveBlock(float tStart, float tEnd, GloColor colStart, GloColor colEnd)
 {
     startTime  = ToTicks(tStart);
     endTime    = ToTicks(tEnd);
     startColor = colStart;
     endColor   = colEnd;
 }
 public static System.Windows.Media.Color ToViewColor(this GloColor c)
 {
     return(System.Windows.Media.Color.FromRgb(
                (byte)c.r,
                (byte)c.g,
                (byte)c.b
                ));
 }
Пример #4
0
            public GloColor ColorAt(int tick)
            {
                if (startColor == endColor)
                {
                    return(startColor);
                }

                return(GloColor.Blend(startColor, endColor, (tick - startTime) / (double)(endTime - startTime)));
            }
        public void SplitBlocksAtCursor()
        {
            var blocksUnderCursor = SelectedBlocks
                                    .AsEnumerable()
                                    .Where(bvm => bvm.StartTime <CursorPosition && bvm.EndTime> CursorPosition)
                                    .Select(bvm => bvm.GetModel())
                                    .ToList();

            using (ActionManager.CreateTransaction(false))
            {
                foreach (var block in blocksUnderCursor)
                {
                    // Generate 2 exact copies of the block.
                    XElement serializedBlock = block.ToXML();
                    var      newBlockLeft    = Block.FromXML(model, serializedBlock);
                    var      newBlockRight   = Block.FromXML(model, serializedBlock);

                    // Adjust ramps if necessary.
                    if (block is RampBlock ramp)
                    {
                        GloColor splitColor = ramp.GetColorAtTime(CursorPosition, ramp.Tracks[0]);
                        ((RampBlock)newBlockLeft).EndColor    = splitColor;
                        ((RampBlock)newBlockRight).StartColor = splitColor;
                    }
                    else if (block is LoopBlock)
                    {
                        // TODO: Loops are unsupported when splitting.
                        continue;
                    }

                    // Generically adjust times.
                    newBlockLeft.Duration   = CursorPosition - block.StartTime;
                    newBlockRight.StartTime = CursorPosition;
                    newBlockRight.Duration  = block.Duration - (CursorPosition - block.StartTime);

                    // Replace in collections.
                    int index = model.Blocks.IndexOf(block);
                    ActionManager.RecordReplace(model.Blocks, index, newBlockLeft);
                    ActionManager.RecordInsert(model.Blocks, index + 1, newBlockRight);

                    SelectBlock(BlockViewModel.FromModel(this, block), CompositionMode.Subtractive);
                    SelectBlock(BlockViewModel.FromModel(this, newBlockLeft), CompositionMode.Additive);
                    SelectBlock(BlockViewModel.FromModel(this, newBlockRight), CompositionMode.Additive);
                }
            }
        }
Пример #6
0
        private Color BrightenColor(Color color)
        {
            int brightestValue = Math.Max(color.R, Math.Max(color.G, color.B));

            // Do not modify black or colors that are already bright enough.
            if (brightestValue == 0 || brightestValue >= BRIGHTNESS_THRESHOLD)
            {
                return(color);
            }

            float factor = (float)BRIGHTNESS_THRESHOLD / brightestValue;

            return(GloColor.FromRGB(
                       (int)Math.Round(color.R * factor),
                       (int)Math.Round(color.G * factor),
                       (int)Math.Round(color.B * factor)
                       ).ToViewColor());
        }
        public void InsertBlock(string type)
        {
            // inherit color and tracks from previous block, if applicable
            GloColor prevColor = GloColor.White;

            Track[] prevTracks = { _selectedTrack.GetModel() };

            if (EnableSmartInsert)
            {
                Func <BlockViewModel, bool> fnIsBlockApplicable =
                    (bl => bl.StartTime < CursorPosition && (bl is ColorBlockViewModel || bl is RampBlockViewModel));

                var prevBlocks = ((IEnumerable <BlockViewModel>)_selectedTrack.Blocks).Where(fnIsBlockApplicable);
                if (prevBlocks.Any())
                {
                    BlockViewModel prevBlock = prevBlocks.MaxBy(bl => bl.EndTimeOccupied);

                    // inherit color
                    if (prevBlock is ColorBlockViewModel)
                    {
                        prevColor = ((ColorBlockViewModel)prevBlock).GetModel().Color;
                    }
                    else
                    {
                        prevColor = ((RampBlockViewModel)prevBlock).GetModel().EndColor;
                    }

                    // inherit tracks, but only if the last block on the selected track is also the last block on all other tracks of the block
                    bool lastOfAllTracks = prevBlock.GetModel().Tracks.All(t => t.Blocks
                                                                           .Select(bl => BlockViewModel.FromModel(this, bl))
                                                                           .Where(fnIsBlockApplicable)
                                                                           .MaxBy(bl => bl.EndTimeOccupied)
                                                                           == prevBlock);
                    if (lastOfAllTracks)
                    {
                        prevTracks = prevBlock.GetModel().Tracks.ToArray();
                    }
                }
            }

            Block b;

            switch (type)
            {
            case "color":
                b = new ColorBlock(model, prevTracks)
                {
                    Color = prevColor
                };
                break;

            case "ramp":
                b = new RampBlock(model, prevTracks)
                {
                    StartColor = prevColor,
                    EndColor   = (prevColor == GloColor.White ? GloColor.Black : GloColor.White)
                };
                break;

            default:
                throw new ArgumentException("unsupported block type " + type);
            }

            b.SegmentContext = ActiveMusicSegment.GetModel();
            b.StartTime      = CursorPosition;
            b.Duration       = GridInterval;

            ActionManager.RecordAdd(model.Blocks, b);
        }
 public static GloColor ToGloColor(this System.Windows.Media.Color c)
 {
     return(GloColor.FromRGB(c.R, c.G, c.B));
 }