# Sync with other threads

``

    sync  cue_id (symbol)

Pause/block the current thread until a `cue` heartbeat with a matching `cue_id` is received. When a matching `cue` message is received, unblock the current thread, and continue execution with the virtual time set to match the thread that sent the `cue` heartbeat. The current thread is therefore synced to the `cue` thread. If multiple cue ids are passed as arguments, it will `sync` on the first matching `cue_id`. By default the BPM of the cueing thread is inherited. This can be disabled using the bpm_sync: opt.

Introduced in v2.0

## Options

bpm_sync: | Inherit the BPM of the cueing thread. Default is false

## Examples

# Example 1
``
    in_thread do
        sync :foo
        sample :ambi_lunar_land
      end

      sleep 5

      cue :foo
| ``
    # this parks the current thread waiting for a foo sync message to be received.

    # We send a sync message from the main thread.
    # This then unblocks the thread above and we then hear the sample
# Example 2
``
    in_thread do
        loop do
          cue :tick
          sleep 0.5
        end
      end

      loop do
        sync :tick
        sample :drum_heavy_kick
      end
| ``
    # Start a metronome thread
    # Loop forever:
    # sending tick heartbeat messages
    # and sleeping for 0.5 beats between ticks

    # We can now play sounds using the metronome.
    # In the main thread, just loop
    # waiting for :tick sync messages
    # after which play the drum kick sample
# Example 3
``
    sync :foo, :bar
| ``
    # Wait for either a :foo or :bar cue
# Example 4
``
    in_thread do
        loop do
          cue [:foo, :bar, :baz].choose
          sleep 0.5
        end
      end

      in_thread do
        loop do
          sync :foo
          sample :elec_beep
        end
      end

      in_thread do
        loop do
          sync :bar
          sample :elec_flip
        end
      end

      in_thread do
        loop do
          sync :baz
          sample :elec_blup
        end
      end
| ``
    # Start a metronome thread
    # Loop forever:
    # sending one of three tick heartbeat messages randomly
    # and sleeping for 0.5 beats between ticks

    # We can now play sounds using the metronome:

    # In the main thread, just loop
    # waiting for :foo sync messages
    # after which play the elec beep sample

    # In the main thread, just loop
    # waiting for :bar sync messages
    # after which play the elec flip sample

    # In the main thread, just loop
    # waiting for :baz sync messages
    # after which play the elec blup sample