Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        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();
        }