:orphan: Save and Load a Performance =========================== *Example directory* (scamp): `examples/Playback/Other/save_and_load_performance `__ *Download:* :download:`save_and_load_performance.zip ` Contains two scripts: One that plays some music and records a portion of that music to a JSON file, and a second that reads the JSON file and plays the recorded performance repeatedly while accelerating. *Topics:* :doc:`Playback › Other ` .. code-block:: python :caption: save_performance.py: Saves an Ensemble and a recorded Performance to JSON, for the load_and_play_performance example. from scamp import * import random import math s = Session() shaku = s.new_part("shakuhachi") oboe = s.new_part("oboe") def oboe_part(): while True: oboe.play_note(75 + random.random() * 7 + 15 * math.sin(get_beat() / 10), 0.4, 0.25) def shaku_part(): pentatonic = [0, 2, 4, 7, 9] while True: if random.random() < 0.5: shaku.play_note(66 + random.choice(pentatonic) + 12*random.randint(0, 2), Envelope([1.0, 0.2, 1.0, 1.0], [0.15, 0.85, 0.15], [0, 2, 0]), 2.5, blocking=True) wait(0.5 + random.choice([0, 0.5])) else: shaku.play_note(66 + random.choice(pentatonic) + 12*random.randint(0, 2), 1.0, 0.2*(1+random.random()*0.3)) wait(random.choice([1, 2, 3])) s.fork(oboe_part) s.fork(shaku_part) s.set_tempo_target(300, Moment.after_time(30)) s.wait(15) s.start_transcribing() print("Starting transcription...") s.wait(15) performance = s.stop_transcribing() print("Stopped transcribing. Saving transcription.") performance.save_to_json("perfShakoboe.json") s.wait_forever() .. raw:: html
.. code-block:: python :caption: load_and_play_performance.py: Loads the Ensemble and Performance saved by save_performance.py and plays the performance back under a gradually accelerating tempo. from scamp import * s = Session() shaku = s.new_part("shakuhachi") oboe = s.new_part("oboe") recorded_performance = Performance.load_from_json("perfShakoboe.json") s.tempo = 60 s.set_tempo_target(300, Moment.after_time(40)) while True: print("(Re)starting performance.") # by default, the performance plays on the currently active clock, forking all parts according to # the tempo envelope at recording time. So the acceleration inside the recording is compounded with # the gradual session-wide acceleration here. # also, by default, we use the currently active session for the instruments. recorded_performance.play() .. raw:: html