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); }
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 )); }
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); } } }
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)); }