private void FinishBeam() { var popedBeam = _beamStack.Pop(); _currentBeam = _beamStack.Count > 0 ? _beamStack.Peek() : null; if (popedBeam.Elements.Count == 0) { _rootBeats.Remove(popedBeam); return; } var rearrangedElements = BeatArranger.RearrangeBeam(popedBeam); // the rearrangement didn't change the beam if (rearrangedElements.Count == 1 && rearrangedElements.First() == popedBeam) { return; } if (_currentBeam == null) // root { _rootBeats.RemoveAt(_rootBeats.Count - 1); _rootBeats.AddRange(rearrangedElements); } else { _currentBeam.Elements.RemoveAt(_currentBeam.Elements.Count - 1); _currentBeam.Elements.AddRange(rearrangedElements); foreach (var beat in rearrangedElements.OfType <Beat>()) { ((IInternalBeatElement)beat).SetOwner(_currentBeam); } } }
private void AppendAndArrangeVoice(RhythmSegmentVoice voice, BeatArranger beatArranger) { if (voice == null) { return; } foreach (var beat in voice.Beats) { beatArranger.AddBeat(beat); } var barVoice = _bar.GetVoice(voice.Part); voice.LastNoteOnStrings.CopyTo(barVoice.LastNoteOnStrings, 0); barVoice.IsTerminatedWithRest = voice.IsTerminatedWithRest; }
private void ArrangeVoices() { _bar.BassVoice = new Voice(_bar, VoicePart.Bass); _bar.TrebleVoice = new Voice(_bar, VoicePart.Treble); var bassBeatArranger = new BeatArranger(_context.DocumentState.Time.NoteValue, _bar.BassVoice); var trebleBeatArranger = new BeatArranger(_context.DocumentState.Time.NoteValue, _bar.TrebleVoice); foreach (var segment in _bar.Rhythm.Segments) { if (segment.IsOmittedByTemplate) { continue; } this.AppendAndArrangeVoice(segment.BassVoice, bassBeatArranger); this.AppendAndArrangeVoice(segment.TrebleVoice, trebleBeatArranger); } bassBeatArranger.Finish(); trebleBeatArranger.Finish(); }