Skip to main content

Control your Biamp Tesira DSPs directly from Python!

Project description

PyTesira

Control your Biamp Tesira DSPs directly from Python!

work in progress! stuff might break, please don't rely on this for anything critical... yet

Obligatory disclaimer: this is an unofficial project which is not in any way affiliated with, or endorsed by, Biamp Systems

Architecture

PyTesira adopts a modular design where the DSP class (src/pytesira/dsp.py) acts as the hub for everything.

PyTesira architecture

A Transport channel (such as SSH) is used for connection to the Tesira DSP device (using the Tesira Text Protocol). Currently, SSH is the only supported transport (other transports are planned - feel free to submit a pull request also!).

Upon connection, PyTesira tries to create a block map of available DSP blocks. For each supported block type, it also attempts to query that block's attributes (e.g., number of channels and their labels). This can be exported and re-imported to shorten startup time (querying is slow - especially on a complex setup with many nodes).

A Block represents a type of DSP block available (e.g., LevelControl or SourceSelector). It handles everything that has to do with that specific DSP block - setting up subscriptions, updating state, handling update requests, and more.

Supported blocks and features

  • LevelControl : read/write mute status, read/write levels
  • MuteControl : read/write mute status
  • SourceSelector : read/write mute status (output), set source and output levels, read levels, read and select active source
  • DanteInput : read/write mute status, read/write levels, read/write invert setting, read/write fault-on-inactive setting
  • DanteOutput : read/write mute status, read/write levels, read/write invert setting, read/write fault-on-inactive setting
  • AudioOutput : read/write mute status, read/write levels, read/write invert setting
  • GraphicEqualizer : read/write global bypass, read/write band bypass, read/write band gain
  • Ducker : read/write most attributes (except logic configuration)
  • PassFilter : read all attributes, write cutoff frequency
  • UsbInput : read connected/streaming states, read/write DSP side level/mute, read host side mute/level
  • UsbOutput : read connected/streaming states, read/write DSP side level/mute, read host side mute/level

Supported device-level features

  • Start/stop system audio (dsp.start_system_audio() and dsp.stop_system_audio())
  • Reboot device (dsp.reboot())
  • Execute arbitrary commands (dsp.device_command(command : str))

Tested on

  • TesiraFORTÉ DAN (software version 4.11.1.2)

How to use

Install latest version from the PyPI release

pip3 install pytesira

Simple usage example:

from pytesira.dsp import DSP
from pytesira.transport.ssh import SSH
from pytesira.block.GraphicEqualizer import GraphicEqualizer

# Connect to the device, but skip initializing GraphicEqualizer blocks
# (as that's VERY slow - only enable if you really need that support!)
device = DSP()
device.connect(backend = SSH(
                        hostname = "tesira.device.lan",
                        username = "admin", 
                        password = "forgetme",
                        host_key_check = False # Bad option! Bad! Change this in production!
                ),
                skip_block_types = [
                    GraphicEqualizer
                ])

# Note: at this point, we need to wait for the DSP to be fully connected/ready. 
# To do so, we can simply check for the boolean flag `device.ready`
while not device.ready:
    pass

# Save block map, which can then be loaded by specifying `block_map`
# next time when we load the class like so: DSP(block_map = "dsp_test.bmap")
device.save_block_map(output = "dsp_test.bmap")

# Get system info
print(device.hostname)
print(device.serial_number)
print(device.software_version)

# Get faults and network status
print(device.faults)
print(device.network)

# Assuming a 2-channel level control block named `LevelTest`,
# we first look at its channel status
print(device.blocks["LevelTest"].channels)

# Get and change level state for channel 2
print(device.blocks["LevelTest"].channels[2].level)
device.blocks["LevelTest"].channels[2].level = -12.0

# Same thing with mute states
print(device.blocks["LevelTest"].channels[2].muted)
device.blocks["LevelTest"].channels[2].muted = True

# Get information on a source selector block named `SourceTest`
# (this includes all channels and their levels, as well as currently selected source)
print(device.blocks["SourceTest"].sources)

# Get currently selected source and select a new one
# (source 0 = unselect everything)
print(device.blocks["SourceTest"].selected_source)
device.blocks["SourceTest"].selected_source = 4

# Get and adjust cutoff frequency on a pass filter block
print(device.blocks["PassFilterTest"].cutoff_frequency)
device.blocks["PassFilterTest"].cutoff_frequency = 60.0

# We can also bypass pass filters as needed
device.blocks["PassFilterTest"].bypass = True

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytesira-0.6.0.tar.gz (54.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytesira-0.6.0-py3-none-any.whl (48.1 kB view details)

Uploaded Python 3

File details

Details for the file pytesira-0.6.0.tar.gz.

File metadata

  • Download URL: pytesira-0.6.0.tar.gz
  • Upload date:
  • Size: 54.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for pytesira-0.6.0.tar.gz
Algorithm Hash digest
SHA256 75ff9258628e6c7c5e758cb923fef24964df57a872b983280a344d6a056cf002
MD5 5c9f67c1cb51ae62aa48ef69ee65fe91
BLAKE2b-256 a1b0e35c75f5da690667ef37fe1c0d49fa3561f1b293a379af2e14dfb4851d13

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytesira-0.6.0.tar.gz:

Publisher: publish.yml on enp6s0/pytesira

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pytesira-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: pytesira-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 48.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for pytesira-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3bf414e0f283640bac09a7f123f71ab79149c864f85079f160e32185f56f555e
MD5 49ec4b694863f5d58636ba7ebca6b647
BLAKE2b-256 3f63383d9fc64e336292fab2bf266e94a871dbf248156e5a1a6cc69db852af31

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytesira-0.6.0-py3-none-any.whl:

Publisher: publish.yml on enp6s0/pytesira

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page