Skip to content

Releases: Abjad/abjad

Abjad 3.0.0rc1

29 Jul 03:22
010b1ff
Compare
Choose a tag to compare
Abjad 3.0.0rc1 Pre-release
Pre-release
3.0.0rc1 (#1003)

* Preparing 3.0.0rc1 release

* Tidying-up documentation

* Purging ancient documentation

* More cleanup

* More cleanup

* Consolidate tests

* Add packaging instructions

* Don't clean-out docs on make release

* Fix tests

* Update pytest paths

* Bump uqbar requirement

* Cleanup

* Add subpackage summaries.

* Update README and setup.py

Abjad 2.21

04 Aug 00:41
Compare
Choose a tag to compare

Abjad 2.21

Abjad 2.21 provides composers a simpler way of working with Abjad
objects. Previously you had to remember the tools package in which many Abjad
classes were housed. Now you can refer to Abjad classes directly with
abjad-namespacing:

  • Abjad 2.20:

    inspect(staff).get_indicator(instrumenttools.Instrument)
    datastructuretools.CyclicTuple(items)
    stringtools.to_snake_case('Allergo ma non troppo')
    attach(indicatortools.BendAfter(), staff[-1])
    attach(indicatortools.BreathMark(), staff[-1])
    attach(indicatortools.LaissezVibrer(), staff[-1])
    patterntools.Pattern([0, 1], period=8)
    
  • Abjad 2.21:

    abjad.inspect(staff).get_indicator(abjad.Instrument)
    abjad.CyclicTuple(items)
    abjad.String('Allegro ma non troppo').to_snake_case()
    abjad.attach(abjad.BendAfter(), staff[-1])
    abjad.attach(abjad.BreathMark(), staff[-1])
    abjad.attach(abjad.LaissezVibrer(), staff[-1])
    abjad.Pattern([0, 1], period=8)
    

Abjad 2.21 renames two very important functions that are used by all composers:

  • Abjad 2.20:

    abjad.inspect_()
    abjad.set_()
    
  • Abjad 2.21:

    abjad.inspect()
    abjad.setting()
    

Note too that the old abjad.Tempo has been renamed to abjad.MetronomeMark.

Abjad 2.21 includes solutions for 62 different issues:

  • [#846] Refactored __init__(*arguments) signatures.
  • [#843] Removed FixedDurationContainer.
  • [#842] Added SilenceMask.silence*() methods.
  • [#841] Changed abjad.set_() to abjad.setting().
  • [#839] Removed is_semantic, is_nonsemantic properties.
  • [#838] Shortened three private selection methods.
  • [#837] Distinguished Enumeration from Enumerator.
  • [#835] Added abjad.index() functions.
  • [#834] Added abjad.analyze().
  • [#833] Added SelectorLibrary.
  • [#832] [#452] Added abjad.NoteMaker, abjad.LeafMaker.
  • [#831] Add abjad.SpacingVector class.
  • [#830] Reimplemented pitchtools functions as methods.
  • [#829] Removed unused mathtools functions.
  • [#828] Added LilyPondFile.floating().
  • [#827] Reimplemented instrumenttools functions as methods.
  • [#826] Added abjad.String class.
  • [#825] Changed abjad.inspect_() to abjad.inspect().
  • [#805] Removed rhythm-maker gallery.
  • [#799] Moved all docstrings to abjad-qualified pathing.
  • [#795] Finalized expression protocol (EP).
  • [#731] Wrote bald-format parameterized test.
  • [#708] Removed Duration.yield_equivalent_durations().
  • [#706] Made SetClass._yield_all_pitch_class_sets() private.
  • [#704] Removed abjad.Annotation.
  • [#678] Refactored Ferneyhough demo as a class.
  • [#653] Removed tab completion.
  • [#641] Removed _repr_specification.
  • [#636] Removed unused Leaf._get_leaf_index().
  • [#554] Changed doctest:: to docs::.
  • [#546] Merged CompoundPattern into Pattern.
  • [#514] Removed TestManager.clean_string().
  • [#459] Integrated collections.Iterable testing.
  • [#454] Killed implicit container slip.
  • [#453] Finalized piecewise definition protocol (PDP).
  • [#438] Taught Tie to forbid multiply-tied notes.
  • [#433] Wrote abjad.new(instrument) regression tests.
  • [#403] Added all missing __slots__.
  • [#398] Added _get_lilypond_format_bundle() to indicators.
  • [#396] Changed Tempo to MetronomeMark.
  • [#393] Added elementary support for arrowed accidentals.
  • [#392] Changed NumberedPitchClassColorMap to ColorMap.
  • [#362] Removed all hasattr(argument, property) calls.
  • [#311] Regularized __hash__() definitions.
  • [#272] Fixed abjad.mutate(leaf).split() bug.
  • [#296] Implemented _item_coercer on TimespanList.
  • [#259] Changed spanner \revert from "after" to "before".
  • [#250] Reimplented functions as methods.
  • [#216] Added Ratio.__rtruediv__().
  • [#170] Removed FixedDurationTuplet.
  • [#168] Added duration coercion tests.
  • [#153] Integrated explicit left / right indicators.
  • [#152] Remodeled grace containers.
  • [#134] LilyPondFile blocks preserve assignment order.
  • [#115] Implemented split() against parallel containers.

See https://github.com/Abjad/abjad/issues for information by issue number.

OTHER NEW FUNCTIONALITY:

  • The piecewise definition protocol (PDP) has been activated on a number of
    Abjad spanners. The piecewise definition protocol allows for enchained
    output. Here's an example of enchained hairpins:

      staff = abjad.Staff("c'8 d' e' f' c' d' e' f' c'")
      hairpin = abjad.Hairpin()
      abjad.attach(hairpin, staff[:])
      hairpin.attach(abjad.Dynamic('p'), hairpin[0])
      hairpin.attach(abjad.Dynamic('f'), hairpin[2])
      hairpin.attach(abjad.Dynamic('p'), hairpin[4])
      hairpin.attach(abjad.Dynamic('f'), hairpin[6])
      hairpin.attach(abjad.Dynamic('p'), hairpin[8])
    
      f(staff) 
      \new Staff {
          c'8 \< \p
          d'8
          e'8 \f \>
          f'8
          c'8 \p \<
          d'8
          e'8 \f \>
          f'8
          c'8 \p
      }
    

    Because of these extensions abjad.Hairpin now generalizes all hairpin
    usage in the system and the old abjad.Crescendo and abjad.Decrescendo
    spanners have been removed.

  • New abjad.AcciaccaturaContainer, abjad.AfterGraceContainer and
    abjad.AppoggiaturaContainer classes have been added to complement the
    abjad.GraceContainer. The old abjad.GraceContainer.kind property has
    been removed.

  • The old abjad.FixedDurationTuplet class has been removed. Use
    abjad.Tuplet instead.

  • A new abjad.String class is included in Abjad 2.21. (This replaces the
    old stringtools package):

    abjad.String('Allegro ma non troppo').to_snake_case()
    
  • New abjad.Staccato, abjad.Staccatissimo, abjad.PageBreak and
    abjad.SystemBreak indicators have been added.

  • Major cleanup was done to abjad.NamedPitch, abjad.NumberedPitch and a
    couple of other atomic classes hosued in the pitchtools package. Abjad
    2.21 makes initializers more explicit; harmonizes definitions of equality;
    harmonizes the storage format of these classes; and cleans up the API
    entries of these classes considerably.

  • Initializers of classes housed in the schemetools package have all been
    cleaned up. See the various schemetools API entries for changes.
    Specifically:

    Abjad 2.20:

    abjad.Scheme(*arguments, **keywords)
    abjad.SchemeAssociativeList(*arguments, **keywords)
    abjad.SchemePair(x, y)
    abjad.SchemeVector(*arguments, **keywords)
    abjad.SchemeVectorConstant(*arguments, **keywords)
    

    Abjad 2.21:

    abjad.Scheme(value, force_quotes=None, quoting=None, verbatim=None)
    abjad.SchemeAssociativeList(value)
    abjad.SchemePair((x, y))
    abjad.SchemeVector(value)
    abjad.SchemeVectorConstant(value)
    
  • A new abjad.SpacingVector class is available. This replaces the old
    schemetools.make_spacing_vector() function.

  • Three new makers are available in scoretools package:

    abjad.LeafMaker
    abjad.MeasureMaker
    abjad.NoteMaker
    

    These replace the old scoretools.make_notes(),
    scoretools.make_leaves(), scoretools.make_rests() and
    scoretools.make_spacer_skip_measures() functions.

  • A new abjad.Score.make_piano_score() constructor is available. This
    replaces the old scoretools.make_empty_piano_score(),
    scoretools.make_piano_score_from_leaves() and
    scoretools.make_piano_sketch_score_from_leaves() functions.

  • Two new abjad.LilyPondFile constructors are available:

    abjad.LilyPondFile.floating()
    abjad.LilyPondFile.rhythm()
    

    These replace the old
    lilypondfiletools.make_floating_time_signature_lilypond_file() and
    rhythmmakertools.make_lilypond_file() functions.

  • abjad.LilyPondFile blocks now preserve the assignment order of
    attributes. Consider the following input:

    staff = abjad.Staff("c'8 d'8 e'8 f'8")
    lilypond_file = abjad.LilyPondFile.new(staff)
    lilypond_file.header_block.title = abjad.Markup('Missa sexti tonus')
    lilypond_file.header_block.composer = abjad.Markup('Josquin')
    

    Abjad 2.20 (where composer appears before title):

    f(lilypond_file.header_block)
    \header {
        composer = \markup { Josquin }
        title = \markup { "Missa sexti tonus" }
    }
    

    Abjad 2.21 (where title appears before composer):

    f(lilypond_file.header_block)
    \header {
        title = \markup { "Missa sexti tonus" }
        composer = \markup { Josquin }
    }
    
  • New silence mask and sustain mask factory functions are available:

    abjad.silence()
    abjad.silence_all()
    abjad.silence_every()
    abjad.silence_except()
    abjad.silence_first()
    abjad.silence_last()
    
    abjad.sustain()
    abjad.sustain_all()
    abjad.sustain_every()
    abjad.sustain_except()
    abjad.sustain_first()
    abjad.sustain_last()
    

    These replace the old rhythmmakertools functions of the same name.

  • New pattern factory functions are available:

    abjad.index()
    abjad.index_all()
    abjad.index_every()
    abjad.index_first()
    abjad.index_last()
    

    These replace the old patterntools.select*() functions.

  • A new abjad.mutate().wrap() method is available. See the API entry for
    examples.

  • A new abjad.analyze() function is available. This replaces the old
    tonalanalysistools.select() function.

  • Removed abjad.Annotation. Use the new `abjad.annot...

Read more

Abjad 2.20

04 May 04:00
Compare
Choose a tag to compare

Abjad 2.20

Improvements (global)

  • Greatly expanded Abjad global namespace:
    ['Accelerando', 'Annotation', 'Arpeggio', 'Arrow', 'Articulation',
    'BarLine', 'Beam', 'BendAfter', 'BowContactPoint', 'BowContactSpanner',
    'BowMotionTechnique', 'BowPressure', 'BreathMark', 'Chord', 'Clef',
    'ClefSpanner', 'Cluster', 'ColorFingering', 'ComplexBeam',
    'ComplexTrillSpanner', 'Component', 'Container', 'Context', 'Crescendo',
    'CyclicTuple', 'Decrescendo', 'DuratedComplexBeam', 'Duration', 'Dynamic',
    'Expression', 'Fermata', 'FixedDurationTuplet', 'Fraction',
    'GeneralizedBeam', 'Glissando', 'GraceContainer', 'Hairpin',
    'HiddenStaffSpanner', 'HorizontalBracketSpanner', 'Infinity', 'Inversion',
    'KeyCluster', 'KeySignature', 'LaissezVibrer', 'Leaf', 'LilyPondCommand',
    'LilyPondComment', 'LilyPondFile', 'LilyPondLiteral', 'LineSegment',
    'Markup', 'MarkupList', 'Measure', 'MeasuredComplexBeam', 'Meter',
    'MetricModulation', 'MultimeasureRest', 'MultipartBeam', 'Multiplication',
    'Multiplier', 'NamedInterval', 'NamedIntervalClass', 'NamedPitch',
    'NamedPitchClass', 'NonreducedFraction', 'NonreducedRatio', 'Note',
    'NumberedInterval', 'NumberedIntervalClass', 'NumberedPitch',
    'NumberedPitchClass', 'OctavationSpanner', 'Offset', 'PageBreak',
    'Pattern', 'PhrasingSlur', 'PianoPedalSpanner', 'PitchClassSegment',
    'PitchClassSet', 'PitchRange', 'PitchSegment', 'PitchSet', 'Ratio',
    'Registration', 'RehearsalMark', 'Repeat', 'Rest', 'Retrograde',
    'Ritardando', 'Rotation', 'Scheme', 'SchemeMoment', 'SchemePair',
    'SchemeSymbol', 'SchemeVector', 'Score', 'Selection', 'Selector',
    'Sequence', 'SetClass', 'Skip', 'Slur', 'Spanner', 'Staff', 'StaffChange',
    'StaffGroup', 'StaffLinesSpanner', 'StemTremolo', 'StemTremoloSpanner',
    'StringContactPoint', 'StringNumber', 'SystemBreak', 'Tempo',
    'TempoSpanner', 'TextSpanner', 'Tie', 'TimeSignature', 'Timespan',
    'Transposition', 'Tremolo', 'TrillSpanner', 'Tuning', 'Tuplet',
    'TwelveToneRow', 'TypedOrderedDict', 'Voice', 'abctools',
    'abjad_configuration', 'agenttools', 'attach', 'commandlinetools',
    'datastructuretools', 'demos', 'detach', 'documentationtools',
    'durationtools', 'exceptiontools', 'expressiontools', 'ext', 'f', 'graph',
    'indicatortools', 'inspect_', 'instrumenttools', 'ipythontools', 'iterate',
    'label', 'lilypondfiletools', 'lilypondnametools', 'lilypondparsertools',
    'ly', 'markuptools', 'mathtools', 'metertools', 'mutate', 'new',
    'override', 'parse', 'patterntools', 'persist', 'pitchtools', 'play',
    'print_function', 'quantizationtools', 'rhythmmakertools',
    'rhythmtreetools', 'schemetools', 'scoretools', 'select', 'select_all',
    'select_every', 'select_first', 'select_last', 'selectiontools',
    'selectortools', 'sequence', 'sequencetools', 'set_', 'show', 'silence',
    'silence_all', 'silence_every', 'silence_except', 'silence_first',
    'silence_last', 'spannertools', 'stringtools', 'sustain', 'sustain_all',
    'sustain_every', 'sustain_first', 'sustain_last', 'systemtools',
    'templatetools', 'timespantools', 'tonalanalysistools', 'topleveltools',
    'tweak']
    
  • Integrated quicktions library for optional C-accelerated calculations with
    rational numbers. Install via pip install abjad[accelerated].
  • Taught systemtools.ImportManager about Cython .pyx files.
  • Extended scripts:
    • Added ajv doctest --abjad-only option to suppress implicit from abjad import * imports at the beginning of each doctest.
    • Taught ajk script to ignore EPS files and private _doc directories.
    • Taught ajk script to ignore private _doc directories.

Improvements (by package):

  • expressiontools:

    • Collapsed expressiontools.Callback, expressiontools.LabelExpression,
      and expressiontools.SequenceExpression into
      expressiontools.Expression.
    • Added expressiontools.Expression.__eq__().
    • Added expressiontools.Signature decorator.
  • indicatortools:

    • Added indicatortools.LilyPondLiteral.
    • Added sfffz to known dynamic names.
  • lilypondfiletools:

    • Added lilypondfiletools.LilyPondFile anonymous context retrieval.
    • Added lilypondfiletools.LilyPondFile custom context retrieval.
  • markuptools:

    • Added markuptools.MarkupInventory.center_column().
    • Added markuptools.MarkupInventory.combine().
    • Added markuptools.MarkupInventory.concat().
    • Added markuptools.MarkupInventory.__illustrate__().
    • Added markuptools.MarkupInventory.__lt__().
  • mathtools:

    • Added Infinity.__float__().
  • patterntools:

    • Added patterntools.CompoundPattern.get_matching_items().
    • Added patterntools.Pattern.get_matching_items().
  • pitchtools:

    • Added NumberedPitch.from_pitch_class_octave().
    • Added Pitch.pitch_class.
    • Added Pitch.name.
    • Added Pitch.number.
    • Added PitchClassSet.__illustrate__().
    • Added PitchClassSegment.permute(row=None).
    • Added PitchClassSegment.to_pitch_classes().
    • Added PitchClassSegment.to_pitches().
    • Added PitchSegment.to_pitch_classes().
    • Added PitchSegment.to_pitches().
    • Added PitchSet.__illustrate__().
    • Added SetClass.
  • scoretools:

    • Added scoretools.make_leaves(skips_instead_of_rests=False) keyword.
    • Taught scoretools.Container to initialize mixed selection / component
      input.
  • selectortools:

    • Added Selector.group_by_pitch().
    • Added Selector.by_leaf(head=None) keyword.
    • Added Selector.by_leaf(pitched=True) keyword.
    • Added Selector.by_leaf(prototype=None) keyword.
    • Added Selector.by_leaf(tail=None) keyword.
    • Added Selector.by_leaf(trim=None) keyword.
    • Added Selector.select().
  • sequencetools:

    • Added sequencetools.Enumeration class:
      • Enumeration.yield_combinations()
      • Enumeration.yield_outer_product()
      • Enumeration.yield_pairs()
      • Enumeration.yield_partitions()
      • Enumeration.yield_permutations()
      • Enumeration.yield_subsequences()
    • Added Sequence.reverse(recurse=False) keyword.
    • Added Sequence.sort() method.
  • systemtools:

    • Taught systemtools.StorageFormatAgent about keyword-only parameters.
  • timespantools:

    • Added timespantools.Timespan.__illustrate__(scale=None) keyword.
    • Added timespantools.TimespanInventory.__invert__().
  • topleveltools:

    • Added topleveltools.tweak() function.

Changes (global)

  • Changed _lilypond_format property to _get_lilypond_format() method.
  • Changed args to arguments in most places in the codebase.
  • Changed expr to argument in most places in the codebase.
  • Changed kwargs to keywords in most places in the codebase.
  • Changed note head to note-head globally.
  • Taught LilyPondOutputProxy to omit empty layout and paper blocks.

Changes (by package)

  • datastructuretools:

    • Removed datastructuretools.Matrix.
    • Removed datastructuretools.CyclicMatrix.
    • Replaced TypedTuple.__getslice__() with __getitem__().
    • Rewired CyclicTuple to remove multiple inheritance.
  • documentationtools:

    • All Graphviz* classes have been moved into a new graphtools
      subpackage.
  • durationtools:

    • Removed durationtools.Division.
  • indicatortools:

    • Changed ClefInventory to ClefList.
    • Moved ClefInventory from indicatortools to instrumenttools.
    • Removed IsAtSoundingPitch.
    • Removed IsUnpitched.
    • Removed SpacingIndication.
  • lilypondfiletools:

    • Removed lilypondfiletools.make_basic_lilypond_file().
      Use lilypondfiletools.LilyPondFile.new() instead.
  • markuptools:

    • Removed Markup.make_*() methods.
    • Changed Markup.super_() to Markup.super().
    • Changed Markup.line() to static method.
    • Changed MarkupInventory to MarkupList.
    • Changed the following methods to accept markup list:
      • Markup.center_column(markup_list)
      • Markup.column(markup_list)
      • Markup.concat(markup_list)
      • Markup.left_column(markup_list)
      • Markup.line(markup_list)
      • Markup.overlay(markup_list)
      • Markup.right_column(markup_list)
    • Changed Markup interpreter representation
      • OLD: Markup(contents=('Allegro assai',))
      • NEW: Markup(contents=['Allegro assai'])
    • Changed Markup.combine() signature:
      • OLD: Markup.combine(markup_1, markup_2)
      • NEW: Markup.combine([markup_1, markup_2])
    • Reimplemented all markuptools pytests as doctests.
  • pitchtools:

    • Removed PitchArray* classes.
    • Changed Rotation.transpose default from True to None.
    • Changed has_duplicates property to method:
      • IntervalClassSegment.has_duplicates()
      • IntervalSegment.has_duplicates()
      • PitchClassSegment.has_duplicates()
      • PitchSegment.has_duplicates()
      • Segment.has_duplicates()
      • TwelveToneRow.has_duplicates()
    • Renamed Octave.octave_number to Octave.number.
    • Renamed Octave.octave_tick_string to Octave.tick_string.
    • Renamed Pitch.octave_number to Pitch.octave.number.
    • Renamed .index to .n:
      • Multiplication.index to Multiplication.n
      • Rotation.index to Rotation.n
      • Transposition.index to Transposition.n
    • Renamed PitchOperation to CompoundOperator.
    • Renamed Retrogression to Retrograde.
    • Named Stravinsky-style rotation explicitly:
      ...
Read more

2.19

23 Oct 01:44
Compare
Choose a tag to compare

Abjad 2.19

Improvements

  • [#740] Proofread ‘For beginners’ section of docs. Thanks @delucis!
  • [#741] LilyPond's log is displayed on LilyPond compilation error.
  • [#749] Added LilyPondCommand to Abjad's global namespace.
  • [#752] Taught detach() about different types of grace container.
  • [#753] Taught Dynamics about sforzando dynamic names.
  • [#744] Refactoring and cleanup in schemetools. Thanks @ajyoon!
  • [#745] Reimplemented Abjad's repr, storage format and object templating system.
  • [#755, #760, #761, #763] Cleaned-up class member ordering via a new command-line script. Thanks @ajyoon!
  • [#766] Abjad's ajv looks for .ajv config files in $HOME, the current directory and any parent directory thereof. A [doctest] section can specify imports to be run at the beginning of each doctest in ajv doctest via an imports key.

Changes

  • [#745] AbjadObject's _storage_format_specification and _repr_specification properties are deprecated in favor of a new unified _get_format_specification() method. The old properties will no longer be supported in the next Abjad release: 2.20.

Bugfixes

  • [#762] Improved interaction between chords and ties. Thanks @quesebifurcan!
  • [#764] IOManager.open_file() respects Abjad's config when opening MIDI files. Thanks @quesebifurcan!
  • [#767] Fixed edge-cases in Graphviz attribute-handling and append/extend behavior.
  • [#774] NamedPitch.invert() guards against errors from multiply-augmented or diminished intervals.

2.18

08 Jul 06:11
Compare
Choose a tag to compare

Abjad 2.18

Improvements

  • [#715] Grace notes are now aware of their parentage above and beyond their enclosing GraceContainer.
  • [#703] Added a synthetic_offset keyword to attach() and IndicatorExpression.
    • This allows composers to attach effective indicators which start before the score starts, allowing composers to model how various indicators hold over from a previous section.
    • For example: attach(Dynamic('f'), voice, synthetic_offset=-1)
  • [#640] Many optimizations:
    • Optimized hot code paths in Duration and Offset instantiation.
    • Optimized timespan comparison.
    • Optimized parser instantiation.
  • [#626, #726] Dynamic now recognizes sffp, sffz and niente as valid dynamic names.
  • [#726] Hairpin is now niente-aware.
  • [#628] Implemented a collection of command-line tools for working with score packages.
    • ajv score, ajv material, ajv segment, ajv target.
    • These tools are provisional pending more extensive use.
  • [#719] Implemented TupletSpellingSpecifier.preferred_denominator.
    • This mirrors Tuplet.preferred_denominator.
  • [#666] Abjad now formats LilyPond properties using the newer dot-chained syntax, not the old #'... syntax.
    • As always, Abjad targets the development version of LilyPond, currently the 2.19 series.
  • [#720] Non-reduced fractions can be attached to leaves just like Multiplier objects.
  • [#724] Equipped Sequence.partition_by_counts() with a reverse keyword.
  • [#725] Equipped Markup with .sub() and .super() markup command methods.

Changes

  • [#709] Spanners now attach only to leaves, never to containers.
    • This represents a significant simplification in Abjad's score model.
    • This change should generally be transparent to users, as attach() does the work of iterating leaves in its component expression.
  • [#709] Many spanners now attach only to 2 or more leaves at once, including Slur and Tie.
  • [#709] Removed Container.select_leaves().
    • To select a container's leaves, use list(iterate(container).by_leaf()).
    • To select the first leaf of a container, use next(iterate(container).by_leaf()).
    • To select the last leaf of a container, use next(iterate(container).by_leaf(reverse=True)).
  • [#628, #644, #643, #702] Tool-chain clean-up and refactoring
    • developerscripttools was renamed commandlinetools.
    • DeveloperScript was renamed CommandlineScript.
    • Unused and obsolete scripts have been removed.
  • [#717] Out-ported various classes to https://github.com/trevorbaca/baca:
    • Cursor, PitchClassTree, PayloadTree, CyclicPayloadTree.
  • [#714] Selector.by_leaves() is now Selector.by_leaf(). This harmonizes with IterationAgent.by_leaf().
  • [#721] Added a new LilyPondCommand.prefix property.
    • This makes it easy to position arbitrary strings relative to components.

Bugfixes

  • [#655] Tuplet._simplify_redundant_tuplet() takes logical ties into account.
  • [#680] Abjad's docs post-process SVG images under Python 2.7 properly.
  • [#736] Registration now takes quarter tones into account.

2.17

25 Apr 20:46
Compare
Choose a tag to compare

Abjad 2.17

Improvements:

  • Abjad's documentation has seen extensive work, including:
    • a new theme based off of https://github.com/snide/sphinx_rtd_theme
    • crisp SVG Graphviz output for all class lineage graphs
    • expandable image thumbnails
    • a score gallery page showing notation examples from many scores created with Abjad
    • revised installation instructions
    • virtually all code examples in the docs are now interpreted via the abjad-book Sphinx extension, guaranteeing correctness
    • many enhancements to Abjad's Sphinx extension
  • A new PackageGitCommitToken class for embedding Python package version information in LilyPond files.
  • A new IterationAgent.by_timeline_and_logical_tie() method.
  • A provisional collection of new classes in lilypondnametools for object-modeling various LilyPond entities: LilyPondGrob, LilyPondGrobInterface, LilyPondContext and LilyPondEngraver.
  • Abjad now supports PyPy.

Changes:

  • Abjad's dependencies have been separated into standard, development and ipython. See our installation docs for details.
  • Abjad's IPython extension now uses timidity instead of ffmpeg and fluidsynth to embed audio output from calls to play(). OSX users can install timidity via HomeBrew.
  • GraphvizEdge.__call__() has been removed in favor of explicit .attach(node_one, node_two) and .detach() methods.
  • sievetools functionality has been merged into the classes housed in patterntools.
  • All labeltools functionality has been migrated into the agentools.LabelAgent class.
  • LilyPondFile properties such as paper_size, includes, etc. are now immutable. Set them during instantiation. See the API example for details.
  • TimeSignature can now only be instantiated from a pair, such as (3, 4): TimeSignature((3, 4)).

Bugfixes:

  • GraphvizGraph instances can now be copied with edges intact.
  • Markup now properly quotes strings containing # symbols.

2.16

25 Apr 02:00
Compare
Choose a tag to compare

Abjad 2.16

2.15

08 Aug 14:34
Compare
Choose a tag to compare

Abjad 2.15

2.14

27 Dec 07:01
Compare
Choose a tag to compare

Abjad 2.14