private void CalculateOptWidth() { double restWidth = DrawingMethods.GetTextWidth(symbol, TypeFaces.GetMusicFont()); double dotWidth = DrawingMethods.GetTextWidth(MusicSymbols.Dot, TypeFaces.GetMusicFont()); double leftFreeSpace = restWidth * 0.1; double dotSpaces = dotWidth * 0.5; }
protected override void Update() { var staffLineCoords = ViewModel.ViewModelLocator.Instance.Main.CurrentPageLayout.AvaliableIndexLinePositions; DrawingVisualHost cl = new DrawingVisualHost(); if (fifts == 0) { itemWidth = 0; } else { int symbolsCount = Math.Abs(fifts); if (symbolsCount > 7) { symbolsCount = 0; } Point currentPosition = new Point(); double symbolWidth = DrawingMethods.GetTextWidth(keySymbol, TypeFaces.GetMusicFont()); double keySignatureWidth = symbolsCount * symbolWidth; for (int i = 0; i < symbolsCount; i++) { currentPosition = new Point(i * symbolWidth, staffLineCoords[8 - keyIndexes[i]]); cl.AddCharacterGlyph(currentPosition, keySymbol); } itemWidth = keySignatureWidth; } ItemCanvas.Children.Add(cl); }
private void Draw(bool measure) { staffLines = ViewModel.ViewModelLocator.Instance.Main.CurrentPageLayout.AvaliableIndexLinePositions; DrawingVisualHost rest = new DrawingVisualHost(); Brush color = ViewModel.ViewModelLocator.Instance.Main.CurrentLayout.LayoutStyle.Colors[int.Parse(noteItem.Voice)]; double positionY = 0.0; if (measure) { measureRest = true; GetSymbol(); positionY = SetPosition(CalculateRestPositionY()); rest.AddCharacterGlyph(new Point(0, positionY), symbol, color: color); } else { GetSymbol(); positionY = SetPosition(CalculateRestPositionY()); rest.AddCharacterGlyph(new Point(0, positionY), symbol, color: color); } if (dotCount != 0) { double shiftUp = (int)restType >= 6 ? SetPosition(1) : restType == NoteTypeValueMusicXML.Item32nd ? SetPosition(3) : restType == NoteTypeValueMusicXML.Item64th ? SetPosition(5) : SetPosition(5); Point dotPosition = new Point(DrawingMethods.GetTextWidth(symbol, TypeFaces.GetMusicFont()) + 4.0.TenthsToWPFUnit(), positionY - shiftUp); rest.AddCharacterGlyph(dotPosition, MusicSymbols.Dot, color: color); } ItemCanvas.Children.Add(rest); }
//todo if width changed update visual private void Draw() { GetVisualControl().Children.Clear(); var symbolWidth = DrawingHelpers.DrawingMethods.GetTextWidth(restSymbol, TypeFaces.GetMusicFont()); var visualHost = new DrawingVisualHost(); visualHost.AddCharacterGlyph(new Point(Width / 2 - (symbolWidth / 2), Staff[4, 1]), restSymbol); GetVisualControl().Children.Add(visualHost); }
private void CalculateMinWidth() { double restWidth = DrawingMethods.GetTextWidth(symbol, TypeFaces.GetMusicFont()); double dotWidth = DrawingMethods.GetTextWidth(MusicSymbols.Dot, TypeFaces.GetMusicFont()); double leftFreeSpace = restWidth * 0.05; double dotSpaces = dotWidth * 0.25; itemWidthMin = leftFreeSpace + restWidth + (dotWidth + dotSpaces) * dotCount; itemWidth = itemWidthMin; }
protected override void Update() { if (isSymbol) { itemWidth = DrawingMethods.GetTextWidth(symbol, TypeFaces.GetMusicFont()); DrawingVisualHost canvas = new DrawingVisualHost(); canvas.AddCharacterGlyph(new Point(0, staffLine[3]), symbol); ItemCanvas.Children.Add(canvas); } if (!isSymbol || symbolValue == TimeSymbolMusicXML.normal) { char[] beatChars = beatSymbol.ToCharArray(); double[] beatCharWidths = beatSymbol.ToCharArray().GetCharsVisualWidth(); double beatWidth = beatCharWidths.Sum(); DrawingVisualHost canvasBeat = new DrawingVisualHost(); double offset = 0; for (int i = 0; i < beatChars.Length; i++) { canvasBeat.AddCharacterGlyph(new Point(offset, 0), beatChars[i].ToString()); offset += beatCharWidths[i]; } //beatTime char[] beatTimeChars = beatTimeSymbol.ToCharArray(); double[] beatTimeCharWidths = beatTimeSymbol.ToCharArray().GetCharsVisualWidth(); double beatTimeWidth = beatTimeCharWidths.Sum(); DrawingVisualHost canvasBeatTime = new DrawingVisualHost(); offset = 0.0; for (int i = 0; i < beatTimeChars.Length; i++) { canvasBeatTime.AddCharacterGlyph(new Point(offset, 0), beatTimeChars[i].ToString()); offset += beatTimeCharWidths[i]; } //measure legth + align itemWidth = beatWidth > beatTimeWidth ? beatWidth : beatTimeWidth; ItemCanvas.Width = itemWidth; if (beatWidth > beatTimeWidth) { Canvas.SetLeft(canvasBeat, 0); double shift = (beatWidth - beatTimeWidth) / 2; Canvas.SetLeft(canvasBeatTime, shift); } else { Canvas.SetLeft(canvasBeatTime, 0); double shift = (beatTimeWidth - beatWidth) / 2; Canvas.SetLeft(canvasBeat, shift); } Canvas.SetTop(canvasBeat, staffLine[4]); Canvas.SetTop(canvasBeatTime, staffLine[2]); ItemCanvas.Children.Add(canvasBeat); ItemCanvas.Children.Add(canvasBeatTime); } }
private void DrawAccidental(NoteMusicXML note, int index, DrawingVisualHost noteVisualHost) { AccidentalMusicXML accidental = note.Accidental; string accidentalSymbol = GetAccidentalSymbolString(accidental.Value); double size = 1.0; double totalAccidentalSize = 0.0; bool hasBracket = accidental.BracketSpecified ? accidental.Bracket == YesNoMusicXML.yes: false; bool hasParentheses = accidental.ParenthesesSpecified ? accidental.Parentheses == YesNoMusicXML.yes: false; if (isSmall) { size = 0.7; } if (accidental.SizeSpecified) { size = accidental.Size == SymbolSizeMusicXML.cue ? 0.7 : accidental.Size == SymbolSizeMusicXML.large ? 1.2 : 1.0; } if (accidental.CautionarySpecified) { hasParentheses = accidental.Cautionary == YesNoMusicXML.yes; //! missing implementation if yes } //! accidental.Editiorial skipped... double accidentalWidth = DrawingMethods.GetTextWidth(accidentalSymbol, TypeFaces.GetMusicFont(), isSmall); double accidentalMargin = layoutStyle.NotesStyle.AccidentalToNoteSpace.TenthsToWPFUnit(); double noteHeadYPosition = pitchedValue[index]; if (hasBracket) { totalAccidentalSize += 2 * DrawingMethods.GetTextWidth(MusicSymbols.AccidentalBracketL, TypeFaces.GetMusicFont(), size); } if (hasParentheses) { totalAccidentalSize += 2 * DrawingMethods.GetTextWidth(MusicSymbols.AccidentalParenthesesL, TypeFaces.GetMusicFont(), size); } if (hasBracket || hasParentheses) { string left = hasBracket ? MusicSymbols.AccidentalBracketL : MusicSymbols.AccidentalParenthesesL; noteVisualHost.AddCharacterGlyph(new Point(0 - (totalAccidentalSize + accidentalWidth + accidentalMargin), noteHeadYPosition), left, isSmall, color); string rigth = hasBracket ? MusicSymbols.AccidentalBracketR : MusicSymbols.AccidentalParenthesesR; noteVisualHost.AddCharacterGlyph(new Point(0 - (totalAccidentalSize / 2 + accidentalWidth + accidentalMargin), noteHeadYPosition), accidentalSymbol, isSmall, color); noteVisualHost.AddCharacterGlyph(new Point(0 - (totalAccidentalSize / 2) - accidentalMargin, noteHeadYPosition), rigth, isSmall, color); SetLeftMargin(totalAccidentalSize + accidentalWidth + accidentalMargin); } else { noteVisualHost.AddCharacterGlyph(new Point(0 - accidentalWidth - accidentalMargin, noteHeadYPosition), accidentalSymbol, isSmall, color); SetLeftMargin(accidentalWidth + accidentalMargin); } }
private void DrawFlag() { bool isFlagDownwards = stem.IsDirectionDown(); string flagSymbol = MusicSymbols.GetFlag(noteType, isFlagDownwards); Point stemEnd = stem.GetStemEnd(); DrawingVisualHost flagHost = new DrawingVisualHost(); flagHost.AddCharacterGlyph(stemEnd, flagSymbol, isSmall, color); flagHost.Tag = "flag"; if (!isFlagDownwards) { itemRightMargin = DrawingMethods.GetTextWidth(flagSymbol, TypeFaces.GetMusicFont()); } AddFlag(flagHost); }
private void DrawDots(DrawingVisualHost noteVisualHost, int index) { double dotPositionY = pitchedValue[index]; if (pitchedPosition[index] % 2 == 0) { double sizeFactor = isSmall ? 0.8 : 1.0; double shiftUp = 5.0.TenthsToWPFUnit() * sizeFactor; dotPositionY -= shiftUp; } int dotCount = noteItem[index].Dot.Count; double noteWidth = DrawingMethods.GetTextWidth(symbol, TypeFaces.GetMusicFont(), isSmall); double dotWidth = DrawingMethods.GetTextWidth(MusicSymbols.Dot, TypeFaces.GetMusicFont(), isSmall); Point dotPosition = new Point(noteWidth + layoutStyle.NotesStyle.DotStandardOffset.TenthsToWPFUnit(), dotPositionY); for (int i = 0; i < dotCount; i++) { noteVisualHost.AddCharacterGlyph(dotPosition, MusicSymbols.Dot, isSmall, color); dotPosition.X += layoutStyle.NotesStyle.DotStandardOffset.TenthsToWPFUnit() + dotWidth; } }
protected override void Update() { GetSymbol(); GetLine(); if (IsVisible) { double tempLine = _staffLine; string tempSymbol = _symbol; if (_isEmpty) // used for proper layout spacing, invisible but taking space; //TODO_LATER more test/refactor { _itemWidth = DrawingMethods.GetTextWidth(MusicSymbols.GClef, TypeFaces.GetMusicFont(), _isAdditional); tempSymbol = ""; tempLine = 0.0; } else { _itemWidth = DrawingMethods.GetTextWidth(_symbol, TypeFaces.GetMusicFont(), _isAdditional); } DrawingVisualHost clefVisualsHost = new DrawingVisualHost(); clefVisualsHost.AddCharacterGlyph(new Point(0, tempLine), tempSymbol, _isAdditional, Color); ItemCanvas.Children.Clear(); ItemCanvas.Children.Add(clefVisualsHost); } }
private void Draw() { isSmall = noteVisualType == NoteChoiceTypeMusicXML.cue || noteVisualType == NoteChoiceTypeMusicXML.grace; DrawingVisualHost noteVisualHost = new DrawingVisualHost(); int index = 0; for (int i = 0; i < noteItem.Count; i++) { double noteHeadOffset = 0; if (i > 0) { int maxPitch = pitchedPosition.Values.Max(); int stemDir = maxPitch < 5 ? -1 : 1; if (Math.Abs(pitchedPosition[index - 1] - pitchedPosition[index]) == 1) { noteHeadOffset = DrawingHelpers.DrawingMethods.GetTextWidth(symbol, TypeFaces.GetMusicFont()) * stemDir; } } if (noteItem[i].Voice == null) { Log.LoggIt.Log($"Missing note voice element, setting to default", Log.LogType.Warning); noteItem[i].Voice = "1"; //! voice set to "1" if null- bugfix } color = ViewModel.ViewModelLocator.Instance.Main.CurrentLayout.LayoutStyle.Colors[int.Parse(noteItem[i].Voice)]; noteVisualHost.AddCharacterGlyph(new Point(noteHeadOffset, pitchedValue[index]), symbol, isSmall, color); if (noteItem[i].Accidental != null) { DrawAccidental(noteItem[i], noteItem.IndexOf(noteItem[i]), noteVisualHost); } if (hasDots) { DrawDots(noteVisualHost, index); } index++; } /*foreach (var note in noteItem) * { * if (note.Voice == null) * { * Log.LoggIt.Log($"Missing note voice element, setting to default", Log.LogType.Warning); * note.Voice = "1"; //! voice set to "1" if null- bugfix * } * color = ViewModel.ViewModelLocator.Instance.Main.CurrentLayout.LayoutStyle.Colors[int.Parse(note.Voice)]; * noteVisualHost.AddCharacterGlyph(new Point(0, pitchedValue[index]), symbol, isSmall, color); * if (note.Accidental != null) * { * DrawAccidental(note, noteItem.IndexOf(note), noteVisualHost); * } * if (hasDots) * { * DrawDots(noteVisualHost, index); * } * index++; * } */ itemWidthMin = DrawingMethods.GetTextWidth(symbol, TypeFaces.GetMusicFont(), isSmall); itemWidth = itemWidthMin; CheckForLedgerLines(); if (needLedgerLines) { Point position = new Point(); int indexLedgers = 0; foreach (var ledgerPosition in ledgerLinesPositions) { noteVisualHost.AddLedgerLine(new Point(position.X, ledgerLinesPositions[indexLedgers]), itemWidthMin); indexLedgers++; } } ItemCanvas.Children.Add(noteVisualHost); }
private static bool Is(this TypeFaces face, TypeFaces flag) => (face & flag) != 0;