Esempio n. 1
0
def test_scoretools_Leaf__split_by_durations_04():
    r'''Splits note into assignable notes.

    Fractures spanners. Ties split notes.
    '''

    staff = abjad.Staff("c'8 [ d'8 e'8 ]")

    halves = staff[1]._split_by_durations(
        [abjad.Duration(1, 32)],
        fracture_spanners=True,
        tie_split_notes=True,
    )

    assert format(staff) == abjad.String.normalize(r'''
        \new Staff
        {
            c'8
            [
            d'32
            ~
            ]
            d'16.
            [
            e'8
            ]
        }
        ''')

    assert abjad.inspect(staff).is_well_formed()
Esempio n. 2
0
    def t_DURATION(self, t):
        r"-?[1-9]\d*(/[1-9]\d*)?"
        import abjad

        parts = t.value.partition("/")
        if not parts[2]:
            t.value = abjad.Duration(int(parts[0]))
        else:
            numerator, denominator = int(parts[0]), int(parts[2])
            fraction = abjad.NonreducedFraction(numerator, denominator)
            preprolated_duration = abjad.Duration(fraction)
            if fraction.numerator == preprolated_duration.numerator:
                t.value = preprolated_duration
            else:
                t.value = fraction
        return t
Esempio n. 3
0
def test_LilyPondGrobNameManager___setattr___13():
    """
    Override LilyPond abjad.MetronomeMark grob.
    """

    staff = abjad.Staff("c'8 d'8 e'8 f'8")
    score = abjad.Score([staff])
    tempo = abjad.MetronomeMark(abjad.Duration(1, 4), 58)
    abjad.attach(tempo, staff[0])
    abjad.override(score).metronome_mark.color = "red"

    assert format(score) == abjad.String.normalize(r"""
        \new Score
        \with
        {
            \override MetronomeMark.color = #red
        }
        <<
            \new Staff
            {
                \tempo 4=58
                c'8
                d'8
                e'8
                f'8
            }
        >>
        """)

    assert abjad.inspect(score).wellformed()
Esempio n. 4
0
def edit_second_violin_voice(score, durated_reservoir):
    """
    Edits second violin voice.
    """
    voice = score["Second Violin Voice"]
    descents = durated_reservoir["Second Violin"]
    last_descent = abjad.Selection(descents[-1])
    copied_descent = abjad.mutate(last_descent).copy()
    copied_descent = list(copied_descent)
    copied_descent[-1].written_duration = abjad.Duration(1, 1)
    copied_descent.append(abjad.Note("a2"))
    for leaf in copied_descent:
        articulation = abjad.Articulation("accent")
        abjad.attach(articulation, leaf)
        articulation = abjad.Articulation("tenuto")
        abjad.attach(articulation, leaf)
    voice.extend(copied_descent)
    final_sustain = []
    for _ in range(32):
        final_sustain.append(abjad.Note("a1."))
    final_sustain.append(abjad.Note("a2"))
    final_sustain = abjad.Selection(final_sustain)
    articulation = abjad.Articulation("accent")
    abjad.attach(articulation, final_sustain[0])
    articulation = abjad.Articulation("tenuto")
    abjad.attach(articulation, final_sustain[0])
    voice.extend(final_sustain)
    abjad.tie(final_sustain)
    voice.extend("r4 r2.")
Esempio n. 5
0
 def __init__(
     self,
     kernel_denominator=32,
     maximum_run_length=None,
     meters=None,
     offset_counter=None,
 ):
     import abjad
     self._cached_offset_counters = {}
     if maximum_run_length is not None:
         maximum_run_length = int(maximum_run_length)
         assert 0 < maximum_run_length
     self._maximum_run_length = maximum_run_length
     if offset_counter:
         self._offset_counter = abjad.MetricAccentKernel.count_offsets(
             offset_counter)
     else:
         self._offset_counter = {}
     self._ordered_offsets = tuple(sorted(self.offset_counter))
     meters = meters or ()
     self._meters = tuple(abjad.Meter(_) for _ in meters)
     self._kernel_denominator = abjad.Duration(kernel_denominator)
     self._kernels = {}
     for meter in self._meters:
         kernel = meter.generate_offset_kernel_to_denominator(
             self._kernel_denominator)
         self._kernels[kernel] = meter
     if self.kernels:
         self._longest_kernel = sorted(
             self._kernels,
             key=lambda x: x.duration,
         )[-1]
     else:
         self._longest_kernel = None
Esempio n. 6
0
 def _duration_to_time_signature(
     duration,
     denominators=None,
     factor=None,
 ):
     import abjad
     duration = abjad.Duration(duration)
     if denominators is not None:
         if factor is not None:
             denominators = [
                 d for d in denominators
                 if factor in abjad.mathtools.factors(d)
             ]
         for desired_denominator in sorted(denominators):
             nonreduced_fraction = abjad.NonreducedFraction(duration)
             candidate_pair = \
                 nonreduced_fraction.with_denominator(desired_denominator)
             if candidate_pair.denominator == desired_denominator:
                 return abjad.TimeSignature(candidate_pair)
     if factor is not None:
         if factor in abjad.mathtools.factors(duration.denominator):
             return abjad.TimeSignature(duration)
         else:
             time_signature_numerator = factor * duration.numerator
             time_signature_denominator = factor * duration.denominator
             return abjad.TimeSignature(
                 (time_signature_numerator, time_signature_denominator))
     else:
         return abjad.TimeSignature(duration)
def test_contract_notes_05():
    staff = abjad.Staff(r"\time 3/4 c'4 r2 "
                        r"\time 2/4 d'2 "
                        r"\time 3/4 e'2. "
                        r"\time 4/4 f'1")
    auxjad.mutate.contract_notes(staff, abjad.Duration((1, 8)))
    assert abjad.lilypond(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            \time 3/4
            c'8
            r8
            r2
            \time 2/4
            d'4.
            r8
            \time 3/4
            e'2
            ~
            e'8
            r8
            \time 4/4
            f'2..
            r8
        }
        """)
Esempio n. 8
0
def test_Mutation_split_10():
    """
    Splits voice at negative index.
    """

    staff = abjad.Staff([abjad.Voice("c'8 d'8 e'8 f'8")])
    voice = staff[0]

    result = abjad.mutate([voice]).split([abjad.Duration(1, 4)])

    left = result[0][0]
    right = result[1][0]

    assert format(left) == abjad.String.normalize(
        r"""
        \new Voice
        {
            c'8
            d'8
        }
        """
    ), print(format(left))

    assert format(right) == abjad.String.normalize(
        r"""
        \new Voice
        {
            e'8
            f'8
        }
        """
    ), print(format(right))

    assert format(voice) == abjad.String.normalize(
        r"""
        \new Voice
        {
        }
        """
    ), print(format(voice))

    assert format(staff) == abjad.String.normalize(
        r"""
        \new Staff
        {
            \new Voice
            {
                c'8
                d'8
            }
            \new Voice
            {
                e'8
                f'8
            }
        }
        """
    ), print(format(staff))

    assert abjad.inspect(staff).wellformed()
Esempio n. 9
0
def test_Mutation_split_15():
    """
    Splits leaf at non-assignable, non-power-of-two offset.
    """

    staff = abjad.Staff("c'4")

    notes = staff[:1]
    abjad.mutate(notes).split([abjad.Duration(5, 24)])

    assert format(staff) == abjad.String.normalize(
        r"""
        \new Staff
        {
            \times 2/3 {
                c'4
                ~
                c'16
                ~
                c'16
            }
        }
        """
    ), print(format(staff))

    assert abjad.inspect(staff).wellformed()
Esempio n. 10
0
def test_scoretools_Inspection_get_timespan_26():
    r'''Offset seconds work with explicit metronome mark.
    '''

    staff = abjad.Staff("c'8 d'8 e'8 f'8")
    mark = abjad.MetronomeMark(abjad.Duration(1, 8), 48)
    abjad.attach(mark, staff[0], context='Staff')

    assert format(staff) == abjad.String.normalize(r'''
        \new Staff
        {
            \tempo 8=48
            c'8
            d'8
            e'8
            f'8
        }
        ''')

    start_offset = abjad.inspect(
        staff[0]).get_timespan(in_seconds=True).start_offset
    assert start_offset == abjad.Offset(0)
    start_offset = abjad.inspect(
        staff[1]).get_timespan(in_seconds=True).start_offset
    assert start_offset == abjad.Offset(5, 4)
def test_remove_repeated_dynamics_08():
    staff = abjad.Staff(r"c'4\pp r2. | R1 | c'1\pp")
    auxjad.mutate.remove_repeated_dynamics(
        staff[:],
        reset_after_rests=True,
        reset_after_duration=abjad.Duration(4, 4),
    )
    assert abjad.lilypond(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            c'4
            \pp
            r2.
            R1
            c'1
            \pp
        }
        """)
    staff = abjad.Staff(r"c'4\pp r2. | R1 | c'1\pp")
    auxjad.mutate.remove_repeated_dynamics(
        staff[:],
        reset_after_rests=True,
        reset_after_duration=2,
    )
    assert abjad.lilypond(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            c'4
            \pp
            r2.
            R1
            c'1
        }
        """)
Esempio n. 12
0
def make_single_attack(duration,
                       *,
                       measures: typings.SliceTyping = None) -> RhythmCommand:
    """
    Makes single attacks with ``duration``.
    """
    duration = abjad.Duration(duration)
    numerator, denominator = duration.pair
    return RhythmCommand(
        rmakers.stack(
            rmakers.incised(
                fill_with_rests=True,
                outer_divisions_only=True,
                prefix_talea=[numerator],
                prefix_counts=[1],
                talea_denominator=denominator,
            ),
            rmakers.beam(),
            rmakers.extract_trivial(),
            tag=_site(inspect.currentframe()),
        ),
        annotation_spanner_color="#darkcyan",
        frame=inspect.currentframe(),
        measures=measures,
    )
Esempio n. 13
0
def test_scoretools_Leaf__split_by_durations_06():
    r'''REGRESSION.
    
    Splits note into tuplet monads and then fuses monads.

    Does not fracture spanners. Ties split notes.

    This test comes from #272 in GitHub.
    '''

    staff = abjad.Staff(r"\times 2/3 { c'8 [ d'8 e'8 ] }")
    leaf = abjad.inspect(staff).get_leaf(0)
    halves = leaf._split_by_durations([abjad.Duration(1, 20)])

    assert format(staff) == abjad.String.normalize(r'''
        \new Staff
        {
            \times 2/3 {
                \times 4/5 {
                    c'16.
                    ~
                    [
                    c'16
                }
                d'8
                e'8
                ]
            }
        }
        ''')

    assert abjad.inspect(staff).is_well_formed()
Esempio n. 14
0
def test_scoretools_Leaf__split_by_durations_05():
    r'''Adds tuplet.

    Does not fracture spanners. Does not tie split notes.
    '''

    staff = abjad.Staff("c'8 [ d'8 e'8 ]")

    halves = staff[1]._split_by_durations(
        [abjad.Duration(1, 24)],
        tie_split_notes=False,
    )

    assert format(staff) == abjad.String.normalize(r'''
        \new Staff
        {
            c'8
            [
            \times 2/3 {
                d'16
                d'8
            }
            e'8
            ]
        }
        ''')

    assert abjad.inspect(staff).is_well_formed()
Esempio n. 15
0
def test_scoretools_Rest___init___01():
    r'''Initialize rest from LilyPond input string.
    '''

    rest = abjad.Rest('r8.')

    assert rest.written_duration == abjad.Duration(3, 16)
def test_Inspection_bar_line_crossing_01():
    """
    Works with partial.
    """

    staff = abjad.Staff("c'8 d'8 e'4 f'8")
    time_signature = abjad.TimeSignature((2, 8), partial=abjad.Duration(1, 8))
    abjad.attach(time_signature, staff[0])

    assert format(staff) == abjad.String.normalize(
        r"""
        \new Staff
        {
            \partial 8
            \time 2/8
            c'8
            d'8
            e'4
            f'8
        }
        """
    )

    assert not abjad.inspect(staff[0]).bar_line_crossing()
    assert not abjad.inspect(staff[1]).bar_line_crossing()
    assert abjad.inspect(staff[2]).bar_line_crossing()
    assert not abjad.inspect(staff[3]).bar_line_crossing()
def edit_second_violin_voice(score, durated_reservoir):
    r'''Edits second violin voice.
    '''

    voice = score['Second Violin Voice']
    descents = durated_reservoir['Second Violin']

    last_descent = abjad.Selection(descents[-1])
    copied_descent = abjad.mutate(last_descent).copy()
    copied_descent = list(copied_descent)
    copied_descent[-1].written_duration = abjad.Duration(1, 1)
    copied_descent.append(abjad.Note('a2'))
    for leaf in copied_descent:
        articulation = abjad.Articulation('accent')
        abjad.attach(articulation, leaf)
        articulation = abjad.Articulation('tenuto')
        abjad.attach(articulation, leaf)
    voice.extend(copied_descent)

    final_sustain = []
    for _ in range(32):
        final_sustain.append(abjad.Note('a1.'))
    final_sustain.append(abjad.Note('a2'))
    final_sustain = abjad.Selection(final_sustain)
    articulation = abjad.Articulation('accent')
    abjad.attach(articulation, final_sustain[0])
    articulation = abjad.Articulation('tenuto')
    abjad.attach(articulation, final_sustain[0])

    voice.extend(final_sustain)
    tie = abjad.Tie()
    abjad.attach(tie, final_sustain)
    voice.extend('r4 r2.')
Esempio n. 18
0
 def __call__(self, durations):
     if abjad.get.duration(self.selections) == abjad.Duration(
             sum(durations)):
         if self.rewrite is True:
             for i, shard in enumerate(
                     abjad.Selection(
                         self.selections).partition_by_durations(
                             durations)):
                 time_signature = durations[i]
                 inventories = [
                     x for x in enumerate(
                         abjad.Meter(time_signature.pair).
                         depthwise_offset_inventory)
                 ]
                 if time_signature.denominator == 4:
                     abjad.Meter.rewrite_meter(
                         shard,
                         time_signature,
                         boundary_depth=inventories[-1][0],
                         rewrite_tuplets=False,
                     )
                 else:
                     abjad.Meter.rewrite_meter(
                         shard,
                         time_signature,
                         boundary_depth=inventories[-2][0],
                         rewrite_tuplets=False,
                     )
         return self.selections
     else:
         message = (
             f"sel: {abjad.get.duration(self.selections)}, dur: {sum(durations)}"
         )
         raise Exception(message)
def test_Leaf__split_by_durations_04():
    """
    REGRESSION.
    
    Splits note into tuplet monads and then fuses monads.

    Ties split notes.

    This test comes from #272 in GitHub.
    """

    staff = abjad.Staff(r"\times 2/3 { c'8 [ d'8 e'8 ] }")
    leaf = abjad.inspect(staff).leaf(0)
    new_leaves = leaf._split_by_durations([abjad.Duration(1, 20)])

    assert format(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            \times 2/3 {
                \times 4/5 {
                    c'16.
                    [
                    ~
                    c'16
                }
                d'8
                e'8
                ]
            }
        }
        """), print(format(staff))

    assert abjad.inspect(staff).wellformed()
Esempio n. 20
0
 def __init__(self, grace_duration=None):
     import abjad
     if grace_duration is None:
         grace_duration = (1, 16)
     grace_duration = abjad.Duration(grace_duration)
     assert grace_duration.has_power_of_two_denominator
     self._grace_duration = grace_duration
Esempio n. 21
0
def change_octave(
    nth_event: int,
    n_octaves: int,
    novent_line: lily.NOventLine,
    change_main_pitches: bool = True,
    change_acciaccatura_pitches: bool = True,
) -> None:
    if change_main_pitches:
        novent_line[nth_event].pitch = [
            p + ji.JIPitch([n_octaves]) for p in novent_line[nth_event].pitch
        ]

    if novent_line[nth_event].acciaccatura and change_acciaccatura_pitches:
        novent_line[nth_event].acciaccatura.mu_pitches = tuple(
            p + ji.JIPitch([n_octaves])
            for p in novent_line[nth_event].acciaccatura.mu_pitches)
        previous_abjad_note = novent_line[nth_event].acciaccatura.abjad
        novent_line[nth_event].acciaccatura.abjad = abjad.Note(
            abjad.NamedPitch(
                name=previous_abjad_note.written_pitch.pitch_class.name,
                octave=previous_abjad_note.written_pitch.octave.number +
                n_octaves,
            ),
            abjad.Duration(previous_abjad_note.written_duration),
        )
def test_Leaf__split_by_durations_03():
    """
    Adds tuplet.

    Does not tie split notes.
    """

    staff = abjad.Staff("c'8 [ d'8 e'8 ]")

    new_leaves = staff[1]._split_by_durations(
        [abjad.Duration(1, 24)],
        tie_split_notes=False,
    )

    assert format(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            c'8
            [
            \times 2/3 {
                d'16
                d'8
            }
            e'8
            ]
        }
        """), print(format(staff))

    assert abjad.inspect(staff).wellformed()
def test_Leaf__split_by_durations_15():
    """
    Grace notes are removed from second split leaf.
    """

    note = abjad.Note("c'4")
    grace = abjad.GraceContainer([abjad.Note(0, (1, 32))])
    abjad.attach(grace, note)

    new_leaves = note._split_by_durations([abjad.Duration(1, 16)])
    staff = abjad.Staff(new_leaves)

    assert format(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            \grace {
                c'32
            }
            c'16
            ~
            c'8.
        }
        """), print(format(staff))

    abjad.inspect(staff).wellformed()
def test_Leaf__split_by_durations_14():
    """
    After grace notes are removed from first split leaf.
    """

    note = abjad.Note("c'4")
    grace = abjad.AfterGraceContainer([abjad.Note(0, (1, 32))])
    abjad.attach(grace, note)

    new_leaves = note._split_by_durations([abjad.Duration(5, 32)])
    staff = abjad.Staff(new_leaves)

    assert format(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            c'8
            ~
            c'32
            ~
            \afterGrace
            c'16.
            {
                c'32
            }
        }
        """), print(format(staff))

    abjad.inspect(staff).wellformed()
def test_Leaf__split_by_durations_13():
    """
    After grace notes are removed from first split leaf.
    """

    note = abjad.Note("c'4")
    after_grace = abjad.AfterGraceContainer([abjad.Note(0, (1, 32))])
    abjad.attach(after_grace, note)

    new_leaves = note._split_by_durations([abjad.Duration(1, 8)])
    staff = abjad.Staff(new_leaves)

    assert format(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            c'8
            ~
            \afterGrace
            c'8
            {
                c'32
            }
        }
        """), print(format(staff))

    assert abjad.inspect(new_leaves[0]).after_grace_container() is None
    assert len(abjad.inspect(new_leaves[1]).after_grace_container()) == 1
    abjad.inspect(staff).wellformed()
Esempio n. 26
0
def test_LeafDynMaker_08():
    pitches = [
        0,
        "d'",
        'E4',
        abjad.NumberedPitch(5),
        abjad.NamedPitch("g'"),
        abjad.NamedPitch('A4'),
    ]
    durations = [
        (1, 32),
        '2/32',
        abjad.Duration('3/32'),
        abjad.Duration(0.125),
        abjad.Duration(5, 32),
        abjad.Duration(6 / 32),
    ]
    dynamics = [
        'p',
        abjad.Dynamic('f'),
    ]
    articulations = [
        '>',
        abjad.Articulation('-'),
        abjad.Staccato(),
    ]
    leaf_dyn_maker = auxjad.LeafDynMaker()
    notes = leaf_dyn_maker(pitches, durations, dynamics, articulations)
    staff = abjad.Staff(notes)
    assert format(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            c'32
            \p
            - \accent
            d'16
            \f
            - \tenuto
            e'16.
            \staccato
            f'8
            g'8
            ~
            g'32
            a'8.
        }
        """)
def test_mutate__split_leaf_by_durations_10():
    """
    Split one leaf in score.
    Ties after split.
    """

    staff = abjad.Staff()
    staff.append(abjad.Container("c'8 d'8"))
    staff.append(abjad.Container("e'8 f'8"))
    leaves = abjad.select(staff).leaves()
    abjad.beam(leaves[:2])
    abjad.beam(leaves[-2:])
    abjad.slur(leaves)

    assert abjad.lilypond(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            {
                c'8
                [
                (
                d'8
                ]
            }
            {
                e'8
                [
                f'8
                )
                ]
            }
        }
        """), print(abjad.lilypond(staff))

    abjad.mutate._split_leaf_by_durations(leaves[0], [abjad.Duration(1, 32)])

    assert abjad.lilypond(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            {
                c'32
                [
                (
                ~
                c'16.
                d'8
                ]
            }
            {
                e'8
                [
                f'8
                )
                ]
            }
        }
        """), print(abjad.lilypond(staff))

    assert abjad.wf.wellformed(staff)
Esempio n. 28
0
def test_Container__split_by_duration_01():

    staff = abjad.Staff()
    staff.append(abjad.Container("c'8 d'8"))
    staff.append(abjad.Container("e'8 f'8"))
    leaves = abjad.select(staff).leaves()
    abjad.beam(leaves[:2])
    abjad.beam(leaves[-2:])
    abjad.slur(leaves)

    assert format(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            {
                c'8
                [
                (
                d'8
                ]
            }
            {
                e'8
                [
                f'8
                )
                ]
            }
        }
        """), print(format(staff))

    halves = staff[0]._split_by_duration(
        abjad.Duration(1, 32),
        tie_split_notes=False,
    )

    assert format(staff) == abjad.String.normalize(r"""
        \new Staff
        {
            {
                c'32
                [
                (
            }
            {
                c'16.
                d'8
                ]
            }
            {
                e'8
                [
                f'8
                )
                ]
            }
        }
        """), print(format(staff))

    assert abjad.inspect(staff).wellformed()
Esempio n. 29
0
    def from_tempo_scaled_durations(class_, durations, tempo=None):
        r"""
        Convert ``durations``, scaled by ``tempo``
        into a ``QEventSequence``:

        >>> tempo = abjad.MetronomeMark((1, 4), 174)
        >>> durations = [(1, 4), (-3, 16), (1, 16), (-1, 2)]
        >>> sequence = \
        ...     abjadext.nauert.QEventSequence.from_tempo_scaled_durations(
        ...     durations, tempo=tempo)

        >>> for q_event in sequence:
        ...     print(format(q_event, 'storage'))
        ...
        abjadext.nauert.PitchedQEvent(
            offset=abjad.Offset((0, 1)),
            pitches=(
                abjad.NamedPitch("c'"),
                ),
            )
        abjadext.nauert.SilentQEvent(
            offset=abjad.Offset((10000, 29)),
            )
        abjadext.nauert.PitchedQEvent(
            offset=abjad.Offset((17500, 29)),
            pitches=(
                abjad.NamedPitch("c'"),
                ),
            )
        abjadext.nauert.SilentQEvent(
            offset=abjad.Offset((20000, 29)),
            )
        abjadext.nauert.TerminalQEvent(
            offset=abjad.Offset((40000, 29)),
            )

        Returns ``QEventSequence`` instance.
        """
        durations = [abjad.Duration(x) for x in durations]
        assert isinstance(tempo, abjad.MetronomeMark)
        durations = [
            x for x in abjad.sequence(durations).sum_by_sign(sign=[-1]) if x
        ]
        durations = [tempo.duration_to_milliseconds(_) for _ in durations]
        offsets = abjad.mathx.cumulative_sums([abs(_) for _ in durations])
        q_events = []
        for pair in zip(offsets, durations):
            offset = abjad.Offset(pair[0])
            duration = pair[1]
            # negative duration indicates silence
            if duration < 0:
                q_event = SilentQEvent(offset)
            # otherwise use middle C
            else:
                q_event = PitchedQEvent(offset, [0])
            q_events.append(q_event)
        # insert terminating silence QEvent
        q_events.append(TerminalQEvent(offsets[-1]))
        return class_(q_events)
Esempio n. 30
0
File: Rest.py Progetto: gsy/gmajor
 def __init__(self, written_duration=None):
     import abjad
     original_input = written_duration
     if isinstance(written_duration, str):
         string = f'{{ {written_duration} }}'
         parsed = abjad.parse(string)
         assert len(parsed) == 1 and isinstance(parsed[0], Leaf)
         written_duration = parsed[0]
     if isinstance(written_duration, Leaf):
         written_duration = written_duration.written_duration
     elif written_duration is None:
         written_duration = abjad.Duration(1, 4)
     else:
         written_duration = abjad.Duration(written_duration)
     Leaf.__init__(self, written_duration)
     if isinstance(original_input, Leaf):
         self._copy_override_and_set_from_leaf(original_input)