Source code for mutwo.music_parameters.playing_indicators
"""Define playing indicators for simple events.This submodules provides several classes to add specific musicalplaying techniques to :class:`mutwo.events.basic.SimpleEvent` objects.They mostly derive from traditional Western playing techniques and theirnotation. Unlike indicators of the :mod:`mutwo.music_parameters.notation_indicators`module, playing indicators have an effect on the played music and aren'tmerely specifications of representation. The proper way to handleplaying indicators should be via a :class:`PlayingIndicatorCollection`object that should be attached to the respective :class:`SimpleEvent`.The collection contains all possible playing indicators which are definedin this module. :class:`mutwo.events.music.NoteLike` contain by defaulta playing indicator collection.There are basically two different types of playing indicators:1, Playing indicators which can only be on or off (for instance``bartok_pizzicato``, ``prall`` or ``laissez_vibrer``). They havea :attr:`is_active` attribute which can either be :obj:`True`or :obj:`False`.2. Playing indicators with one or more arguments (for instance:class:`Tremolo` with :attr:`n_flags` or :class:`Arpeggio` with:attr:`direction`). Their :attr:`is_active` attribute can't beset by the user and get automatically initialised depending onif all necessary attributes are defined (then active) orif any of the necessary attributes is set to :obj:`None` (thennot active).**Example:**Set playing indicators of :class:`NoteLike`:>>> from mutwo import music_events>>> my_note = music_events.NoteLike('c', 1 / 4, 'mf')>>> my_note.playing_indicator_collection.articulation.name = "." # add staccato>>> my_chord = music.NoteLike('c e g', 1 / 2, 'f')>>> my_chord.playing_indicator_collection.arpeggio.direction= "up" # add arpeggio>>> my_chord.playing_indicator_collection.laissez_vibrer = True # and laissez_vibrerAttach :class:`PlayingIndicatorCollection` to :class:`SimpleEvent`:>>> from mutwo import core_events>>> from mutwo import music_parameters>>> my_simple_event = core_events.SimpleEvent()>>> my_simple_event.playing_indicator_collection = music_parameters.PlayingIndicatorCollection()"""importdataclassesimportinspectimporttypingfrommutwoimportmusic_parameters
[docs]@dataclasses.dataclass()classCue(music_parameters.abc.ImplicitPlayingIndicator):"""Cue for electronics etc."""cue_count:typing.Optional[int]=None
[docs]@dataclasses.dataclassclassPlayingIndicatorCollection(music_parameters.abc.IndicatorCollection[music_parameters.abc.PlayingIndicator]):# this is kind of redundant, but perhaps still better than without using# the `dataclasses` modulearticulation:Articulation=dataclasses.field(default_factory=Articulation)artifical_harmonic:ArtificalHarmonic=dataclasses.field(default_factory=ArtificalHarmonic)arpeggio:Arpeggio=dataclasses.field(default_factory=Arpeggio)bartok_pizzicato:music_parameters.abc.PlayingIndicator=dataclasses.field(default_factory=music_parameters.abc.ExplicitPlayingIndicator)bend_after:BendAfter=dataclasses.field(default_factory=BendAfter)breath_mark:music_parameters.abc.PlayingIndicator=dataclasses.field(default_factory=music_parameters.abc.ExplicitPlayingIndicator)cue:Cue=dataclasses.field(default_factory=Cue)duration_line_dashed:music_parameters.abc.PlayingIndicator=dataclasses.field(default_factory=music_parameters.abc.ExplicitPlayingIndicator)duration_line_triller:music_parameters.abc.PlayingIndicator=dataclasses.field(default_factory=music_parameters.abc.ExplicitPlayingIndicator)fermata:Fermata=dataclasses.field(default_factory=Fermata)glissando:music_parameters.abc.PlayingIndicator=dataclasses.field(default_factory=music_parameters.abc.ExplicitPlayingIndicator)hairpin:Hairpin=dataclasses.field(default_factory=Hairpin)natural_harmonic:music_parameters.abc.PlayingIndicator=dataclasses.field(default_factory=music_parameters.abc.ExplicitPlayingIndicator)laissez_vibrer:music_parameters.abc.PlayingIndicator=dataclasses.field(default_factory=music_parameters.abc.ExplicitPlayingIndicator)ornamentation:Ornamentation=dataclasses.field(default_factory=Ornamentation)pedal:Pedal=dataclasses.field(default_factory=Pedal)prall:music_parameters.abc.PlayingIndicator=dataclasses.field(default_factory=music_parameters.abc.ExplicitPlayingIndicator)precise_natural_harmonic:PreciseNaturalHarmonic=dataclasses.field(default_factory=PreciseNaturalHarmonic)string_contact_point:StringContactPoint=dataclasses.field(default_factory=StringContactPoint)tie:music_parameters.abc.PlayingIndicator=dataclasses.field(default_factory=music_parameters.abc.ExplicitPlayingIndicator)tremolo:Tremolo=dataclasses.field(default_factory=Tremolo)trill:Trill=dataclasses.field(default_factory=Trill)woodwind_fingering:WoodwindFingering=dataclasses.field(default_factory=WoodwindFingering)def__setattr__(self,parameter_name:str,value:bool):"""Overriding default behaviour to allow syntactic sugar. This method allows syntax like: playing_indicator_collection.tie = True which is the same as playing_indicator_collection.tie.is_active = True Furthermore the methods makes sure that no property can actually be overridden. """try:playing_indicator=getattr(self,parameter_name)exceptAttributeError:playing_indicator=Noneifplaying_indicatorisnotNone:ifisinstance(playing_indicator,music_parameters.abc.ExplicitPlayingIndicator):playing_indicator.is_active=bool(value)else:raisedataclasses.FrozenInstanceError("Can't override frozen property (playing indicator)"f" '{playing_indicator}'!")else:super().__setattr__(parameter_name,value)
# Dynamically define __all__ in order to catch all PlayingIndicator classes__all__=tuple(nameforname,clsinglobals().items()ifinspect.isclass(cls)andmusic_parameters.abc.PlayingIndicatorininspect.getmro(cls))+("PlayingIndicatorCollection",)