Metric Phase
Example script (scamp): examples/Time & clocks/Advanced/metric_phase.py
Download: metric_phase.py
Rate targets aligned to metric phase, so accelerations and decelerations land on downbeats.
Topics: Time & clocks › Advanced
from scamp import *
s = Session(tempo=120)
piano = s.new_part("piano")
metronome = s.new_part("woodblock")
def metro():
while True:
metronome.play_note(90, 1.0, 1)
metronome.play_note(85, 1.0, 1)
metronome.play_note(85, 1.0, 1)
def chromatic_accel():
set_rate_target(2, Moment.after_beats(8), align_to=Moment.after_time(6))
for p in range(48, 80):
piano.play_note(p, 1, 0.25)
print(current_clock().beat, current_clock().time)
for _ in range(12):
piano.play_note(80, 1, 0.5)
piano.play_note(75, 1, 0.5)
set_rate_target(1, Moment.after_beats(8), align_to=Moment.after_time(6))
for p in range(80, 48, -1):
piano.play_note(p, 1, 0.25)
for _ in range(6):
piano.play_note(48, 1, 0.5)
piano.play_note(43, 1, 0.5)
set_rate_targets([3, 0.5, 2, 1], [Moment.after_beats(8), Moment.after_beats(15), Moment.after_beats(18), Moment.after_beats(21)], align_to=MetricPhaseTarget(0, 3))
print(current_clock().beat)
for _ in range(7):
for i in range(12):
piano.play_note(60 + i, 1, 0.25)
print(current_clock().beat)
for _ in range(10):
piano.play_note(72, 1, 0.5)
s.start_transcribing()
accel_clock = fork(chromatic_accel)
metro_clock = fork(metro)
# Let the metronome run until the chromatic accel line is done, then cut it off.
wait_for_clock_to_finish(accel_clock)
metro_clock.kill()
s.stop_transcribing().to_score(time_signature="3/4").show()