Releases: Abjad/abjad
Abjad 3.0.0rc1
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
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_()
toabjad.setting()
. - [#839] Removed
is_semantic
,is_nonsemantic
properties. - [#838] Shortened three private selection methods.
- [#837] Distinguished
Enumeration
fromEnumerator
. - [#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_()
toabjad.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::
todocs::
. - [#546] Merged
CompoundPattern
intoPattern
. - [#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
toMetronomeMark
. - [#393] Added elementary support for arrowed accidentals.
- [#392] Changed
NumberedPitchClassColorMap
toColorMap
. - [#362] Removed all
hasattr(argument, property)
calls. - [#311] Regularized
__hash__()
definitions. - [#272] Fixed
abjad.mutate(leaf).split()
bug. - [#296] Implemented
_item_coercer
onTimespanList
. - [#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 oldabjad.Crescendo
andabjad.Decrescendo
spanners have been removed. -
New
abjad.AcciaccaturaContainer
,abjad.AfterGraceContainer
and
abjad.AppoggiaturaContainer
classes have been added to complement the
abjad.GraceContainer
. The oldabjad.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
oldstringtools
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 thepitchtools
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 variousschemetools
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 oldscoretools.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...
Abjad 2.20
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 viapip install abjad[accelerated]
. - Taught
systemtools.ImportManager
about Cython.pyx
files. - Extended scripts:
- Added
ajv doctest
--abjad-only
option to suppress implicitfrom 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.
- Added
Improvements (by package):
-
expressiontools
:- Collapsed
expressiontools.Callback
,expressiontools.LabelExpression
,
andexpressiontools.SequenceExpression
into
expressiontools.Expression
. - Added
expressiontools.Expression.__eq__()
. - Added
expressiontools.Signature
decorator.
- Collapsed
-
indicatortools
:- Added
indicatortools.LilyPondLiteral
. - Added
sfffz
to known dynamic names.
- Added
-
lilypondfiletools
:- Added
lilypondfiletools.LilyPondFile
anonymous context retrieval. - Added
lilypondfiletools.LilyPondFile
custom context retrieval.
- Added
-
markuptools
:- Added
markuptools.MarkupInventory.center_column()
. - Added
markuptools.MarkupInventory.combine()
. - Added
markuptools.MarkupInventory.concat()
. - Added
markuptools.MarkupInventory.__illustrate__()
. - Added
markuptools.MarkupInventory.__lt__()
.
- Added
-
mathtools
:- Added
Infinity.__float__()
.
- Added
-
patterntools
:- Added
patterntools.CompoundPattern.get_matching_items()
. - Added
patterntools.Pattern.get_matching_items()
.
- Added
-
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
.
- Added
-
scoretools
:- Added
scoretools.make_leaves(skips_instead_of_rests=False)
keyword. - Taught
scoretools.Container
to initialize mixed selection / component
input.
- Added
-
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()
.
- Added
-
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.
- Added
-
systemtools
:- Taught
systemtools.StorageFormatAgent
about keyword-only parameters.
- Taught
-
timespantools
:- Added
timespantools.Timespan.__illustrate__(scale=None)
keyword. - Added
timespantools.TimespanInventory.__invert__()
.
- Added
-
topleveltools
:- Added
topleveltools.tweak()
function.
- Added
Changes (global)
- Changed
_lilypond_format property
to_get_lilypond_format()
method. - Changed
args
toarguments
in most places in the codebase. - Changed
expr
toargument
in most places in the codebase. - Changed
kwargs
tokeywords
in most places in the codebase. - Changed
note head
tonote-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.
- Removed
-
documentationtools
:- All
Graphviz*
classes have been moved into a newgraphtools
subpackage.
- All
-
durationtools
:- Removed
durationtools.Division
.
- Removed
-
indicatortools
:- Changed
ClefInventory
toClefList
. - Moved
ClefInventory
fromindicatortools
toinstrumenttools
. - Removed
IsAtSoundingPitch
. - Removed
IsUnpitched
. - Removed
SpacingIndication
.
- Changed
-
lilypondfiletools
:- Removed
lilypondfiletools.make_basic_lilypond_file()
.
Uselilypondfiletools.LilyPondFile.new()
instead.
- Removed
-
markuptools
:- Removed
Markup.make_*()
methods. - Changed
Markup.super_()
toMarkup.super()
. - Changed
Markup.line()
to static method. - Changed
MarkupInventory
toMarkupList
. - 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'])
- OLD:
- Changed Markup.combine() signature:
- OLD:
Markup.combine(markup_1, markup_2)
- NEW:
Markup.combine([markup_1, markup_2])
- OLD:
- Reimplemented all
markuptools
pytests as doctests.
- Removed
-
pitchtools
:- Removed
PitchArray*
classes. - Changed
Rotation.transpose
default fromTrue
toNone
. - 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
toOctave.number
. - Renamed
Octave.octave_tick_string
toOctave.tick_string
. - Renamed
Pitch.octave_number
toPitch.octave.number
. - Renamed
.index
to.n
:Multiplication.index
toMultiplication.n
Rotation.index
toRotation.n
Transposition.index
toTransposition.n
- Renamed
PitchOperation
toCompoundOperator
. - Renamed
Retrogression
toRetrograde
. - Named Stravinsky-style rotation explicitly:
...
- Removed
2.19
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 inajv doctest
via animports
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
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 toattach()
andIndicatorExpression
.- 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 recognizessffp
,sffz
andniente
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
.
- This mirrors
- [#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 areverse
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
andTie
. - [#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))
.
- To select a container's leaves, use
- [#628, #644, #643, #702] Tool-chain clean-up and refactoring
developerscripttools
was renamedcommandlinetools
.DeveloperScript
was renamedCommandlineScript
.- 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 nowSelector.by_leaf()
. This harmonizes withIterationAgent.by_leaf()
. - [#721] Added a new LilyPondCommand.prefix property.
- This makes it easy to position arbitrary strings relative to components.
Bugfixes
2.17
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
andLilyPondEngraver
. - Abjad now supports PyPy.
Changes:
- Abjad's dependencies have been separated into
standard
,development
andipython
. See our installation docs for details. - Abjad's IPython extension now uses
timidity
instead offfmpeg
andfluidsynth
to embed audio output from calls toplay()
. OSX users can installtimidity
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 inpatterntools
.- All
labeltools
functionality has been migrated into theagentools.LabelAgent
class. LilyPondFile
properties such aspaper_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
Abjad 2.16
2.15
Abjad 2.15
2.14
Abjad 2.14