public void AddWhammyBarPoint(BendPoint point) { WhammyBarPoints.Add(point); if (MaxWhammyPoint == null || point.Value > MaxWhammyPoint.Value) { MaxWhammyPoint = point; } }
public void AddBendPoint(BendPoint point) { BendPoints.Add(point); if (MaxBendPoint == null || point.Value > MaxBendPoint.Value) { MaxBendPoint = point; } }
internal void AddBendPoint(BendPoint point) { BendPoints.Add(point); if (MaxBendPoint == null || point.Value > MaxBendPoint.Value) { MaxBendPoint = point; } if (BendType == BendType.None) { BendType = BendType.Custom; } }
internal void AddWhammyBarPoint(BendPoint point) { WhammyBarPoints.Add(point); if (MaxWhammyPoint == null || point.Value > MaxWhammyPoint.Value) { MaxWhammyPoint = point; } if (MinWhammyPoint == null || point.Value < MinWhammyPoint.Value) { MinWhammyPoint = point; } if (WhammyBarType == WhammyType.None) { WhammyBarType = WhammyType.Custom; } }
private void ParseNoteProperties(IXmlNode node, Note note, string noteId) { bool isBended = false; BendPoint bendOrigin = null; int? bendMiddleValue = null; int? bendMiddleOffset1 = null; int? bendMiddleOffset2 = null; BendPoint bendDestination = null; node.IterateChildren(c => { if (c.NodeType == XmlNodeType.Element) { switch (c.LocalName) { case "Property": var name = c.Attributes.Get("name").Value; switch (name) { case "String": note.String = Std.ParseInt(GetValue(FindChildElement(c, "String"))) + 1; break; case "Fret": note.Fret = Std.ParseInt(GetValue(FindChildElement(c, "Fret"))); break; case "Tapped": _tappedNotes[noteId] = true; break; case "HarmonicType": var htype = FindChildElement(c, "HType"); if (htype != null) { switch (GetValue(htype)) { case "NoHarmonic": note.HarmonicType = HarmonicType.None; break; case "Natural": note.HarmonicType = HarmonicType.Natural; break; case "Artificial": note.HarmonicType = HarmonicType.Artificial; break; case "Pinch": note.HarmonicType = HarmonicType.Pinch; break; case "Tap": note.HarmonicType = HarmonicType.Tap; break; case "Semi": note.HarmonicType = HarmonicType.Semi; break; case "Feedback": note.HarmonicType = HarmonicType.Feedback; break; } } break; case "HarmonicFret": var hfret = FindChildElement(c, "HFret"); if (hfret != null) { note.HarmonicValue = Std.ParseFloat(GetValue(hfret)); } break; case "Muted": if (FindChildElement(c, "Enable") != null) note.IsDead = true; break; case "PalmMuted": if (FindChildElement(c, "Enable") != null) note.IsPalmMute = true; break; // case "Element": // case "Variation": // case "Tone": case "Octave": note.Octave = Std.ParseInt(GetValue(FindChildElement(c, "Number"))) - 1; break; case "Tone": note.Tone = Std.ParseInt(GetValue(FindChildElement(c, "Step"))); break; case "Bended": isBended = true; break; case "BendOriginValue": if (bendOrigin == null) bendOrigin = new BendPoint(); bendOrigin.Value = ToBendValue(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "BendOriginOffset": if (bendOrigin == null) bendOrigin = new BendPoint(); bendOrigin.Offset = ToBendOffset(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "BendMiddleValue": bendMiddleValue = ToBendValue(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "BendMiddleOffset1": bendMiddleOffset1 = ToBendOffset(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "BendMiddleOffset2": bendMiddleOffset2 = ToBendOffset(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "BendDestinationValue": if (bendDestination == null) bendDestination = new BendPoint(BendPoint.MaxPosition); // NOTE: If we directly cast the expression of value to (int) it is 3 instead of 4, strange compiler // optimizations happening here: // (int)(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))* BendPointValueFactor) => (int)(100f * 0.04f) => 3 // (Std.ParseFloat(GetValue(FindChildElement(c, "Float")))* BendPointValueFactor) => (100f * 0.04f) => 4.0 bendDestination.Value = ToBendValue(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "BendDestinationOffset": if (bendDestination == null) bendDestination = new BendPoint(); bendDestination.Offset = ToBendOffset(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "HopoOrigin": if (FindChildElement(c, "Enable") != null) note.IsHammerPullOrigin = true; break; case "HopoDestination": // NOTE: gets automatically calculated // if (FindChildElement(node, "Enable") != null) // note.isHammerPullDestination = true; break; case "Slide": var slideFlags = Std.ParseInt(GetValue(FindChildElement(c, "Flags"))); if ((slideFlags & 0x01) != 0) note.SlideType = SlideType.Shift; if ((slideFlags & 0x02) != 0) note.SlideType = SlideType.Legato; if ((slideFlags & 0x04) != 0) note.SlideType = SlideType.OutDown; if ((slideFlags & 0x08) != 0) note.SlideType = SlideType.OutUp; if ((slideFlags & 0x10) != 0) note.SlideType = SlideType.IntoFromBelow; if ((slideFlags & 0x20) != 0) note.SlideType = SlideType.IntoFromAbove; break; } break; } } }); if (isBended) { if (bendOrigin == null) bendOrigin = new BendPoint(); if (bendDestination == null) bendDestination = new BendPoint(BendPoint.MaxPosition); var bend = new FastList<BendPoint>(); bend.Add(bendOrigin); if (bendMiddleOffset1 != null && bendMiddleValue != null) { bend.Add(new BendPoint(bendMiddleOffset1.Value, bendMiddleValue.Value)); } if (bendMiddleOffset2 != null && bendMiddleValue != null) { bend.Add(new BendPoint(bendMiddleOffset2.Value, bendMiddleValue.Value)); } if (bendMiddleOffset1 == null && bendMiddleOffset2 == null && bendMiddleValue != null) { bend.Add(new BendPoint(BendPoint.MaxPosition / 2, bendMiddleValue.Value)); } bend.Add(bendDestination); note.BendPoints = bend; } }
private void ParseBeatProperties(IXmlNode node, Beat beat) { bool isWhammy = false; BendPoint whammyOrigin = null; int? whammyMiddleValue = null; int? whammyMiddleOffset1 = null; int? whammyMiddleOffset2 = null; BendPoint whammyDestination = null; node.IterateChildren(c => { if (c.NodeType == XmlNodeType.Element) { switch (c.LocalName) { case "Property": var name = c.Attributes.Get("name").Value; switch (name) { case "Brush": if (GetValue(FindChildElement(c, "Direction")) == "Up") { beat.BrushType = BrushType.BrushUp; } else { beat.BrushType = BrushType.BrushDown; } break; // TODO: brush duration case "PickStroke": if (GetValue(FindChildElement(c, "Direction")) == "Up") { beat.PickStroke = PickStrokeType.Up; } else { beat.PickStroke = PickStrokeType.Down; } break; // TODO: brush duration case "Slapped": if (FindChildElement(c, "Enable") != null) beat.Slap = true; break; case "Popped": if (FindChildElement(c, "Enable") != null) beat.Pop = true; break; case "VibratoWTremBar": switch (GetValue(FindChildElement(c, "Strength"))) { case "Wide": beat.Vibrato = VibratoType.Wide; break; case "Slight": beat.Vibrato = VibratoType.Slight; break; } break; case "WhammyBar": isWhammy = true; break; case "WhammyBarExtend": case "WhammyBarOriginValue": if (whammyOrigin == null) whammyOrigin = new BendPoint(); whammyOrigin.Value = ToBendValue(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "WhammyBarOriginOffset": if (whammyOrigin == null) whammyOrigin = new BendPoint(); whammyOrigin.Offset = ToBendOffset(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "WhammyBarMiddleValue": whammyMiddleValue = ToBendValue(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "WhammyBarMiddleOffset1": whammyMiddleOffset1 = ToBendOffset(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "WhammyBarMiddleOffset2": whammyMiddleOffset2 = ToBendOffset(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "WhammyBarDestinationValue": if (whammyDestination == null) whammyDestination = new BendPoint(BendPoint.MaxPosition); whammyDestination.Value = ToBendValue(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; case "WhammyBarDestinationOffset": if (whammyDestination == null) whammyDestination = new BendPoint(); whammyDestination.Offset = ToBendOffset(Std.ParseFloat(GetValue(FindChildElement(c, "Float")))); break; } break; } } }); if (isWhammy) { if (whammyOrigin == null) whammyOrigin = new BendPoint(); if (whammyDestination == null) whammyDestination = new BendPoint(BendPoint.MaxPosition); var whammy = new FastList<BendPoint>(); whammy.Add(whammyOrigin); if (whammyMiddleOffset1 != null && whammyMiddleValue != null) { whammy.Add(new BendPoint(whammyMiddleOffset1.Value, whammyMiddleValue.Value)); } if (whammyMiddleOffset2 != null && whammyMiddleValue != null) { whammy.Add(new BendPoint(whammyMiddleOffset2.Value, whammyMiddleValue.Value)); } if (whammyMiddleOffset1 == null && whammyMiddleOffset2 == null && whammyMiddleValue != null) { whammy.Add(new BendPoint(BendPoint.MaxPosition / 2, whammyMiddleValue.Value)); } whammy.Add(whammyDestination); beat.WhammyBarPoints = whammy; } }
public Score JsObjectToScore(Score score) { var score2 = new Score(); Score.CopyTo(score, score2); #region MasterBars for (var i = 0; i < score.MasterBars.Count; i++) { var masterBar = score.MasterBars[i]; var masterBar2 = new MasterBar(); MasterBar.CopyTo(masterBar, masterBar2); if (masterBar.TempoAutomation != null) { masterBar2.TempoAutomation = new Automation(); Automation.CopyTo(masterBar.TempoAutomation, masterBar2.TempoAutomation); } if (masterBar.VolumeAutomation != null) { masterBar2.VolumeAutomation = new Automation(); Automation.CopyTo(masterBar.VolumeAutomation, masterBar2.VolumeAutomation); } if (masterBar.Section != null) { masterBar2.Section = new Section(); Section.CopyTo(masterBar.Section, masterBar2.Section); } score2.AddMasterBar(masterBar2); } #endregion #region Tracks for (int t = 0; t < score.Tracks.Count; t++) { var track = score.Tracks[t]; var track2 = new Track(track.Staves.Count); Track.CopyTo(track, track2); score2.AddTrack(track2); PlaybackInformation.CopyTo(track.PlaybackInfo, track2.PlaybackInfo); foreach (var key in track.Chords.Keys) { var chord = track.Chords[key]; var chord2 = new Chord(); Chord.CopyTo(chord, chord2); track2.Chords[key] = chord2; } #region Staves for (var s = 0; s < track.Staves.Count; s++) { var staff = track.Staves[s]; #region Bars for (int b = 0; b < staff.Bars.Count; b++) { var bar = staff.Bars[b]; var bar2 = new Bar(); Bar.CopyTo(bar, bar2); track2.AddBarToStaff(s, bar2); #region Voices for (int v = 0; v < bar.Voices.Count; v++) { var voice = bar.Voices[v]; var voice2 = new Voice(); Voice.CopyTo(voice, voice2); bar2.AddVoice(voice2); #region Beats for (int bb = 0; bb < voice.Beats.Count; bb++) { var beat = voice.Beats[bb]; var beat2 = new Beat(); Beat.CopyTo(beat, beat2); voice2.AddBeat(beat2); for (int a = 0; a < beat.Automations.Count; a++) { var automation = new Automation(); Automation.CopyTo(beat.Automations[a], automation); beat2.Automations.Add(automation); } for (int i = 0; i < beat.WhammyBarPoints.Count; i++) { var point = new BendPoint(); BendPoint.CopyTo(beat.WhammyBarPoints[i], point); beat2.WhammyBarPoints.Add(point); } #region Notes for (int n = 0; n < beat.Notes.Count; n++) { var note = beat.Notes[n]; var note2 = new Note(); Note.CopyTo(note, note2); beat2.AddNote(note2); for (int i = 0; i < note.BendPoints.Count; i++) { var point = new BendPoint(); BendPoint.CopyTo(note.BendPoints[i], point); note2.AddBendPoint(point); } } #endregion } #endregion } #endregion } #endregion } #endregion } #endregion score2.Finish(); return(score2); }
public Score ScoreToJsObject(Score score) { Score score2 = Std.NewObject(); Score.CopyTo(score, score2); score2.MasterBars = new FastList <MasterBar>(); score2.Tracks = new FastList <Track>(); #region MasterBars for (var i = 0; i < score.MasterBars.Count; i++) { MasterBar masterBar = score.MasterBars[i]; MasterBar masterBar2 = Std.NewObject(); MasterBar.CopyTo(masterBar, masterBar2); if (masterBar.TempoAutomation != null) { masterBar2.TempoAutomation = Std.NewObject(); Automation.CopyTo(masterBar.TempoAutomation, masterBar2.TempoAutomation); } if (masterBar.VolumeAutomation != null) { masterBar2.VolumeAutomation = Std.NewObject(); Automation.CopyTo(masterBar.VolumeAutomation, masterBar2.VolumeAutomation); } if (masterBar.Section != null) { masterBar2.Section = Std.NewObject(); Section.CopyTo(masterBar.Section, masterBar2.Section); } score2.MasterBars.Add(masterBar2); } #endregion #region Tracks for (int t = 0; t < score.Tracks.Count; t++) { var track = score.Tracks[t]; Track track2 = Std.NewObject(); track2.Color = Std.NewObject(); Track.CopyTo(track, track2); track2.PlaybackInfo = Std.NewObject(); PlaybackInformation.CopyTo(track.PlaybackInfo, track2.PlaybackInfo); track2.Chords = new FastDictionary <string, Chord>(); foreach (var key in track.Chords.Keys) { var chord = track.Chords[key]; Chord chord2 = Std.NewObject(); Chord.CopyTo(chord, chord2); track2.Chords[key] = chord; } #region Staves track2.Staves = new FastList <Staff>(); for (int s = 0; s < track.Staves.Count; s++) { var staff = track.Staves[s]; Staff staff2 = Std.NewObject(); #region Bars staff2.Bars = new FastList <Bar>(); for (int b = 0; b < staff.Bars.Count; b++) { var bar = staff.Bars[b]; Bar bar2 = Std.NewObject(); Bar.CopyTo(bar, bar2); #region Voices bar2.Voices = new FastList <Voice>(); for (int v = 0; v < bar.Voices.Count; v++) { var voice = bar.Voices[v]; Voice voice2 = Std.NewObject(); Voice.CopyTo(voice, voice2); #region Beats voice2.Beats = new FastList <Beat>(); for (int bb = 0; bb < voice.Beats.Count; bb++) { var beat = voice.Beats[bb]; Beat beat2 = Std.NewObject(); Beat.CopyTo(beat, beat2); beat2.Automations = new FastList <Automation>(); for (int a = 0; a < beat.Automations.Count; a++) { Automation automation = Std.NewObject(); Automation.CopyTo(beat.Automations[a], automation); beat2.Automations.Add(automation); } beat2.WhammyBarPoints = new FastList <BendPoint>(); for (int i = 0; i < beat.WhammyBarPoints.Count; i++) { BendPoint point = Std.NewObject(); BendPoint.CopyTo(beat.WhammyBarPoints[i], point); beat2.WhammyBarPoints.Add(point); } #region Notes beat2.Notes = new FastList <Note>(); for (int n = 0; n < beat.Notes.Count; n++) { var note = beat.Notes[n]; Note note2 = Std.NewObject(); Note.CopyTo(note, note2); note2.BendPoints = new FastList <BendPoint>(); for (int i = 0; i < note.BendPoints.Count; i++) { BendPoint point = Std.NewObject(); BendPoint.CopyTo(note.BendPoints[i], point); note2.BendPoints.Add(point); } beat2.Notes.Add(note2); } #endregion voice2.Beats.Add(beat2); } #endregion bar2.Voices.Add(voice2); } #endregion staff2.Bars.Add(bar2); } #endregion track2.Staves.Add(staff); } #endregion score2.Tracks.Add(track2); } #endregion return(score2); }
public void ReadBend(Note note) { Data.ReadByte(); // type ReadInt32(); // value var pointCount = ReadInt32(); if (pointCount > 0) { for (int i = 0; i < pointCount; i++) { var point = new BendPoint(); point.Offset = ReadInt32(); // 0...60 point.Value = ReadInt32() / BendStep; // 0..12 (amount of quarters) ReadBool(); // vibrato note.AddBendPoint(point); } } }
public void ReadTremoloBarEffect(Beat beat) { Data.ReadByte(); // type ReadInt32(); // value var pointCount = ReadInt32(); if (pointCount > 0) { for (int i = 0; i < pointCount; i++) { var point = new BendPoint(); point.Offset = ReadInt32(); // 0...60 point.Value = ReadInt32() / BendStep; // 0..12 (amount of quarters) ReadBool(); // vibrato beat.AddWhammyBarPoint(point); } } }
public Score JsObjectToScore(Score score) { var score2 = new Score(); Score.CopyTo(score, score2); #region MasterBars for (var i = 0;i < score.MasterBars.Count; i++) { var masterBar = score.MasterBars[i]; var masterBar2 = new MasterBar(); MasterBar.CopyTo(masterBar, masterBar2); if (masterBar.TempoAutomation != null) { masterBar2.TempoAutomation = new Automation(); Automation.CopyTo(masterBar.TempoAutomation, masterBar2.TempoAutomation); } if (masterBar.VolumeAutomation != null) { masterBar2.VolumeAutomation = new Automation(); Automation.CopyTo(masterBar.VolumeAutomation, masterBar2.VolumeAutomation); } if (masterBar.Section != null) { masterBar2.Section = new Section(); Section.CopyTo(masterBar.Section, masterBar2.Section); } score2.AddMasterBar(masterBar2); } #endregion #region Tracks for (int t = 0; t < score.Tracks.Count; t++) { var track = score.Tracks[t]; var track2 = new Track(); Track.CopyTo(track, track2); score2.AddTrack(track2); PlaybackInformation.CopyTo(track.PlaybackInfo, track2.PlaybackInfo); foreach (var key in track.Chords.Keys) { var chord = track.Chords[key]; var chord2 = new Chord(); Chord.CopyTo(chord, chord2); track2.Chords[key] = chord2; } #region Bars for (int b = 0; b < track.Bars.Count; b++) { var bar = track.Bars[b]; var bar2 = new Bar(); Bar.CopyTo(bar, bar2); track2.AddBar(bar2); #region Voices for (int v = 0; v < bar.Voices.Count; v++) { var voice = bar.Voices[v]; var voice2 = new Voice(); Voice.CopyTo(voice, voice2); bar2.AddVoice(voice2); #region Beats for (int bb = 0; bb < voice.Beats.Count; bb++) { var beat = voice.Beats[bb]; var beat2 = new Beat(); Beat.CopyTo(beat, beat2); voice2.AddBeat(beat2); for (int a = 0; a < beat.Automations.Count; a++) { var automation = new Automation(); Automation.CopyTo(beat.Automations[a], automation); beat2.Automations.Add(automation); } for (int i = 0; i < beat.WhammyBarPoints.Count; i++) { var point = new BendPoint(); BendPoint.CopyTo(beat.WhammyBarPoints[i], point); beat2.WhammyBarPoints.Add(point); } #region Notes for (int n = 0; n < beat.Notes.Count; n++) { var note = beat.Notes[n]; var note2 = new Note(); Note.CopyTo(note, note2); beat2.AddNote(note2); for (int i = 0; i < note.BendPoints.Count; i++) { var point = new BendPoint(); BendPoint.CopyTo(note.BendPoints[i], point); note2.AddBendPoint(point); } } #endregion } #endregion } #endregion } #endregion } #endregion score2.Finish(); return score2; }
private static Note NoteFromNote(SongNote2014 srcNote, Single durationTime) { //DbgAssert(srcNote.LinkNext == 0); //DbgAssert(srcNote.Bend == 0); //DbgAssert(srcNote.HammerOn == 0); //DbgAssert(srcNote.Harmonic == 0); //DbgAssert(srcNote.Hopo == 0); //DbgAssert(srcNote.Ignore == 0); //DbgAssert(srcNote.Mute == 0); //DbgAssert(srcNote.PalmMute == 0); //DbgAssert(srcNote.Pluck == -1); //DbgAssert(srcNote.PullOff == 0); //DbgAssert(srcNote.Slap == -1); //DbgAssert(srcNote.Tremolo == 0); //DbgAssert(srcNote.HarmonicPinch == 0); //DbgAssert(srcNote.PickDirection == 0); //DbgAssert(srcNote.Tap == 0); //DbgAssert(srcNote.Vibrato == 0); var note1 = new Note(); note1.Fret = srcNote.Fret; note1.String = srcNote.String + 1; note1.Accentuated = srcNote.Accent == 1 ? AccentuationType.Normal : AccentuationType.None; if (srcNote.BendValues != null ) { foreach(var srcBend in srcNote.BendValues) { var bp = new BendPoint(); var srcBendOffset = srcBend.Time - srcNote.Time; bp.Offset = (int)Math.Round((srcBendOffset / durationTime) * 60); bp.Value = (int)(srcBend.Step * 4); note1.BendPoints.Insert(note1.BendPoints.Count, bp); //note1.bendPoints.insert } if (note1.BendPoints.Count > 0) { var lastbp = note1.BendPoints[note1.BendPoints.Count-1] as BendPoint; if (lastbp.Offset < 60) { var bp = new BendPoint(); bp.Offset = 60; bp.Value = lastbp.Value; note1.BendPoints.Insert(note1.BendPoints.Count, bp); } var firstBp = note1.BendPoints[0] as BendPoint; if (firstBp.Offset > 0) { var bp = new BendPoint(); bp.Offset = 0; bp.Value = 0; note1.BendPoints.Insert(0, bp); } } } if (srcNote.SlideTo > -1) note1.SlideType = SlideType.Shift; if (srcNote.SlideUnpitchTo > -1) { if (srcNote.SlideUnpitchTo > srcNote.Fret) note1.SlideType = SlideType.OutUp; else note1.SlideType = SlideType.OutDown; } //note1.bendPoints //src.bend //note1.durationPercent //note1.hammerPullOrigin //note1.harmonicType=HarmonicType.Natural //note1.harmonicValue //note1.isDead //note1.isFingering //note1.isGhost //note1.isHammerPullDestination //note1.isHammerPullOrigin //note1.isLetRing //note1.isPalmMute //note1.isStaccato //note1.isTieDestination //note1.isTieOrigin //note1.leftHandFinger //note1.octave //note1.slideTarget //note1.slideType=SlideType.IntoFromAbove //note1.tieOrigin //note1.trillSpeed //note1.trillValue //note1.vibrato return note1; }
/// <summary> /// Converts the given JavaScript object into a score object. /// </summary> /// <param name="jsObject">The javascript object created via <see cref="ScoreToJsObject"/></param> /// <param name="settings">The settings to use during conversion.</param> /// <returns>The converted score object.</returns> public static Score JsObjectToScore(object jsObject, Settings settings = null) { Score score = jsObject.As <Score>(); var score2 = new Score(); Score.CopyTo(score, score2); RenderStylesheet.CopyTo(score.Stylesheet, score2.Stylesheet); #region MasterBars for (var i = 0; i < score.MasterBars.Count; i++) { var masterBar = score.MasterBars[i]; var masterBar2 = new MasterBar(); MasterBar.CopyTo(masterBar, masterBar2); if (masterBar.TempoAutomation != null) { masterBar2.TempoAutomation = new Automation(); Automation.CopyTo(masterBar.TempoAutomation, masterBar2.TempoAutomation); } if (masterBar.Section != null) { masterBar2.Section = new Section(); Section.CopyTo(masterBar.Section, masterBar2.Section); } foreach (var offset in masterBar.Fermata) { var fermata = masterBar.Fermata[offset]; var fermata2 = new Fermata(); Fermata.CopyTo(fermata, fermata2); masterBar2.AddFermata(offset, fermata2); } score2.AddMasterBar(masterBar2); } #endregion #region Tracks for (int t = 0; t < score.Tracks.Count; t++) { var track = score.Tracks[t]; var track2 = new Track(track.Staves.Count); Track.CopyTo(track, track2); score2.AddTrack(track2); PlaybackInformation.CopyTo(track.PlaybackInfo, track2.PlaybackInfo); #region Staves for (var s = 0; s < track.Staves.Count; s++) { var staff = track.Staves[s]; var staff2 = track2.Staves[s]; Staff.CopyTo(staff, staff2); foreach (var key in staff.Chords) { var chord = staff.Chords[key]; var chord2 = new Chord(); Chord.CopyTo(chord, chord2); staff2.Chords[key] = chord2; } #region Bars for (int b = 0; b < staff.Bars.Count; b++) { var bar = staff.Bars[b]; var bar2 = new Bar(); Bar.CopyTo(bar, bar2); staff2.AddBar(bar2); #region Voices for (int v = 0; v < bar.Voices.Count; v++) { var voice = bar.Voices[v]; var voice2 = new Voice(); Voice.CopyTo(voice, voice2); bar2.AddVoice(voice2); #region Beats for (int bb = 0; bb < voice.Beats.Count; bb++) { var beat = voice.Beats[bb]; var beat2 = new Beat(); Beat.CopyTo(beat, beat2); voice2.AddBeat(beat2); for (int a = 0; a < beat.Automations.Count; a++) { var automation = new Automation(); Automation.CopyTo(beat.Automations[a], automation); beat2.Automations.Add(automation); } for (int i = 0; i < beat.WhammyBarPoints.Count; i++) { var point = new BendPoint(); BendPoint.CopyTo(beat.WhammyBarPoints[i], point); beat2.AddWhammyBarPoint(point); } #region Notes for (int n = 0; n < beat.Notes.Count; n++) { var note = beat.Notes[n]; var note2 = new Note(); Note.CopyTo(note, note2); beat2.AddNote(note2); for (int i = 0; i < note.BendPoints.Count; i++) { var point = new BendPoint(); BendPoint.CopyTo(note.BendPoints[i], point); note2.AddBendPoint(point); } } #endregion } #endregion } #endregion } #endregion } #endregion } #endregion score2.Finish(settings); return(score2); }
private void PaintBend(BendPoint firstPt, BendPoint secondPt, float cx, float cy, float dX, ICanvas canvas) { var r = (TabBarRenderer)Renderer; var res = Renderer.Resources; var overflowOffset = r.LineOffset / 2; var x1 = cx + (dX * firstPt.Offset); var y1 = cy - (_bendValueHeight * firstPt.Value); if (firstPt.Value == 0) { y1 += r.GetNoteY(_note); } else { y1 += overflowOffset; } var x2 = cx + (dX * secondPt.Offset); var y2 = cy - (_bendValueHeight * secondPt.Value); if (secondPt.Value == 0) { y2 += r.GetNoteY(_note); } else { y2 += overflowOffset; } // what type of arrow? (up/down) var arrowOffset = 0f; var arrowSize = 6 * Scale; if (secondPt.Value > firstPt.Value) { canvas.BeginPath(); canvas.MoveTo(x2, y2); canvas.LineTo(x2 - arrowSize * 0.5f, y2 + arrowSize); canvas.LineTo(x2 + arrowSize * 0.5f, y2 + arrowSize); canvas.ClosePath(); canvas.Fill(); arrowOffset = arrowSize; } else if (secondPt.Value != firstPt.Value) { canvas.BeginPath(); canvas.MoveTo(x2, y2); canvas.LineTo(x2 - arrowSize * 0.5f, y2 - arrowSize); canvas.LineTo(x2 + arrowSize * 0.5f, y2 - arrowSize); canvas.ClosePath(); canvas.Fill(); arrowOffset = -arrowSize; } canvas.Stroke(); if (firstPt.Value == secondPt.Value) { // draw horizontal line canvas.MoveTo(x1, y1); canvas.LineTo(x2, y2); canvas.Stroke(); } else { if (x2 > x1) { // draw bezier lien from first to second point canvas.MoveTo(x1, y1); canvas.BezierCurveTo(x2, y1, x2, y2 + arrowOffset, x2, y2 + arrowOffset); canvas.Stroke(); } else { canvas.MoveTo(x1, y1); canvas.LineTo(x2, y2); canvas.Stroke(); } } if (secondPt.Value != 0) { var dV = secondPt.Value; var up = secondPt.Value > firstPt.Value; dV = Math.Abs(dV); // calculate label var s = ""; // Full Steps if (dV == 4 && up) { s = "full"; dV -= 4; } else if (dV >= 4) { int steps = dV / 4; s += steps; // Quaters dV -= steps * 4; } if (dV > 0) { s += GetFractionSign(dV); } if (s != "") { if (!up) { s = "-" + s; } // draw label canvas.Font = res.TablatureFont; var size = canvas.MeasureText(s); var y = up ? y2 - res.TablatureFont.Size - (2 * Scale) : y2 + (2 * Scale); var x = x2 - size / 2; canvas.FillText(s, x, y); } } }