Builtin procedures#
- class bmusic.proc.Intensity(**kwargs)#
Bases:
ForEachProcBase intensity procedure.
- Parameters:
animkey: Animation key with the following keys:basis: Resting (intensity 0) position.
on: Playing (intensity max) position.
Type: AnimKey
max_intensity(inherited)midi(inherited)min_intensity(inherited)
- class bmusic.proc.IntensityOnOff(**kwargs)#
Bases:
IntensityTurns on when a note starts and off when it ends.
- Keyframe types:
JITTER: Resting (intensity = 0).
BREAKDOWN: Playing.
- Parameters:
duration: Time, in seconds, to spend interpolating between states.Type: float
Default: 0.05
vector_handles: Whether to use vector handles (no easing in or out).Type: bool
Default: False
animkey(inherited)max_intensity(inherited)midi(inherited)min_intensity(inherited)
- animate()#
Do all animation.
- class bmusic.proc.IntensityFade(**kwargs)#
Bases:
IntensityTurns on when a note starts and fades away.
- Keyframe types:
JITTER: Resting (intensity = 0).
BREAKDOWN: Fading.
EXTREME: Max intensity.
- Parameters:
fade_func: Function that curves linear time to fade intensity. Takes parameters(t,)(time in seconds since note start) and returns between 0 and 1, where 0 is off and 1 is max intensity. There are a few predefined functionsbmusic.utilsType: Callable
Default: <staticmethod(<function IntensityFade._default_fade_func at 0x7fa5e9155f80>)>
key_interval: Interval in seconds for decay keyframes. Avoids unneccessary keyframing on every frame.Type: float
Default: 0.3
max_len: Maximum length of note, in seconds. Keyframing will stop after this time, even if the note is still playing.Type: float
Default: 60
note_end: Whether to cut intensity to 0 at end of note. If false, the note will keep fading until next play, even if the note was released.Type: bool
Default: True
off_thres: Threshold for intensity to be considered off. Keyframing will stop at this point. If using a customfade_functhat is NOT monotonically decreasing, set this to0(or negative).Type: float
Default: 0.001
start_time: Time, in seconds, from off to initial on.Type: float
Default: 0.05
animkey(inherited)max_intensity(inherited)midi(inherited)min_intensity(inherited)
- animate()#
Do all animation.
- class bmusic.proc.Hammer(**kwargs)#
Bases:
ForEachProcHammer movement: Resting, preparing, hitting, recoil, wobbling.
- Keyframe types:
JITTER: Resting.
BREAKDOWN: Preparing to hit.
EXTREME: Hitting.
KEYFRAME: Recoil and oscillating.
- Parameters:
animkey: Animation key:hit: Hitting.
prepare: Preparing to hit.
recoil: Bounce back after hit.
Type: AnimKey
hit_time: Duration (sec) of prepare to hit movement.Type: float
Default: 0.08
osc_count: Number of oscillations to perform.Type: int
Default: 4
osc_decay: Factor by which oscillation intensity decays each time.Type: float
Default: 0.5
osc_period: Duration (sec) of each oscillation after hit.Type: float
Default: 0.35
prepare_time: Duration (sec) of rest to prepare.Type: float
Default: 0.15
recoil_time: Duration (sec) of hit to recoil movement.Type: float
Default: 0.13
max_intensity(inherited)midi(inherited)min_intensity(inherited)
- animate()#
Do all animation.
- class bmusic.proc.Scheduling(**kwargs)#
Bases:
MusicProcSchedule limited number of agents (e.g. hammers) to switch between more notes to play.
This procedure only moves the agents, but does not play the notes. You may want to combine it with something else e.g. Hammer.
This is the base class; subclasses define the particular scheduling algorithm. Override the
schedulemethod to implement an algorithm.- Parameters:
animkeys: List of animation keys, each corresponding to an agent. Naturally,len(animkeys)is how many agents are available. Keys:note0,note1,note2, …: Move to note index i. i.e.Message(note=24, ...)corresponds to keynote24.
Type: list
cost_func: Function to get cost between two notes. Costs are additive, and path of least cost is chosen. Args:(self, i, j).iandjare notes (e.g. 21 = lowest A on piano).Type: Callable
Default: <staticmethod(<function Scheduling._default_cost_func at 0x7fa5e91562a0>)>
idle_time: Time (sec) of pause when playing a message before available to move to next message.Type: float
Default: 0.1
stay_to_end: If true, hold an agent to a message until it ends. Else, agent can move as soon as it plays (i.e. whenidle_timeelapses).Type: bool
Default: False
midi(inherited)
- animate() list[MessageList]#
Animates movement of each agent to their messages. Returns which messages were scheduled to each agent.
- Returns:
A list of :class:`bmusic.MessageList`s, each corresponding to which messages the agent was scheduled to play.
- compute_cost(msg1: Message, msg2: Message) float#
Compute cost of playing
msg1andmsg2.msg1.start < msg2.start.Uses velocity; i.e.
cost = velocity = distance / timedistance = self.cost_func(...)
- schedule() list[MessageList]#
Compute which messages were scheduled to each agent.
- class bmusic.proc.GreedyScheduling(**kwargs)#
Bases:
SchedulingGreedy algorithm: Select agent with lowest cost for each message.
- Parameters:
animkeys(inherited)cost_func(inherited)idle_time(inherited)midi(inherited)stay_to_end(inherited)
- schedule()#
Compute which messages were scheduled to each agent.
- class bmusic.proc.ChordScheduling(**kwargs)#
Bases:
SchedulingGreedy scheduling operating on chords instead of messages.
- Parameters:
chord_threshold: Passed tobmusic.midi.split_chords(). Units are seconds.Type: float
Default: 0.1
animkeys(inherited)cost_func(inherited)idle_time(inherited)midi(inherited)stay_to_end(inherited)
- schedule()#
Compute which messages were scheduled to each agent.
- class bmusic.proc.ToNote(**kwargs)#
Bases:
MusicProcTransition between notes (i.e. pitches).
- Parameters:
animkey: Keys:0,1, etc.: Key for that note.
Keys are strings, not ints.
Type: AnimKey
idle_time: For each message, amount of time (sec) to wait before transitioning to the next message.Type: float
Default: 0.1
midi(inherited)
- animate()#
Do all animation.