Skip to main content

PyAYay is a Python extension wrapper for AY-3-8910 sound chip emulator

Project description

GitHub Actions Workflow Status GitHub Actions Workflow Status PyPI - License
PyPI Python Version from PEP 621 TOML PyPI - Wheel

PyAYay

PyAYay is a Python wrapper for the AY/YM sound chip emulator. Currently it supports only the Ayumi emulator by Peter Sovietov.

Installation

From PyPI

You can install the package from PyPI:

pip install pyayay

Yep, that's it!

From source

git clone https://github.com/ruguevara/pyayay.git
cd pyayay
pip install .

Or install in development mode:

git clone https://github.com/ruguevara/pyayay.git
cd pyayay
pip install -e .

Usage

from pyayay import Ayumi, ChipType, EnvShape

ay = Ayumi(sample_rate=44100, clock=1773400, type=ChipType.AY)
# or just Ayumi() for default values

Set panning for channels, for example in ACB order, and the master volume:

ay.set_pan(0, 0.25)  # A left
ay.set_pan(1, 0.75)  # B right
ay.set_pan(2, 0.5)   # C center

ay.set_master_volume(0.75)

Use setters to set the channel parameters. Do not forget to call set_mixer to enable the channel.

ay.set_mixer(0, True, False, False)  # Tone, Noise and Envelope for A channel
ay.set_tone_period(0, 100)
ay.set_volume(0, 15)

You can set the envelope shape and period, for example:

ay.set_mixer(0, True, False, True)  # Turn on envelope modulation for A channel
ay.set_envelope_shape(EnvShape.UP_DOWN_E)
ay.set_envelope_period(1024)

To generate sound use process_block method:

samples = 44100 * 2  # 2 seconds
outLeft  = np.zeros(samples, dtype=np.float32)
outRight = np.zeros(samples, dtype=np.float32)

ay.process_block(outLeft, outRight, samples)

Examples of using the R0-R13 registers and PSG rendering

You can use AY/YM registers R0-R13 directly:

ay.R[1] = 100
ay.R[0] = 0
ay.R[7] = 0b00111110
ay.R[8] = 15

or, to set number of register at once:

ay.set_registers(
    [1, 0, 7, 8],
    [100, 0, 0b00111110, 15]
)

or, to set some of the registers with the 'mask' array. NOTE that mask is inverted, so 1 means "do not change". This is useful for PSG frame playing.

# R           0  1    2  3  4  5  6  7   8   9  10 11 12 13
R = np.array([0, 100, 0, 0, 0, 0, 0, 62, 15, 0, 0, 0, 0, 0], dtype=np.uint8)
M = np.array([0, 0,   1, 1, 1, 1, 1, 0,  0,  1, 1, 1, 1, 1], dtype=bool)

ay.set_registers_masked(R, M)

And render PSG data from Numpy arrays in one call:

data = np.array([
    [249,   0, 148,   0,  40,   1,   3,  40,  13,  29,  13,  74,   0, 12],
    [249,   0, 158,   4,  40,   1,   3,  56,  13,  15,  13,  74,   0, 12]], dtype=np.uint8)
mask = np.array([
    [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
    [1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1]], dtype=bool)
fps = 50
ay.render_psg(data, mask, outLeft, outRight, fps)

For more usage examples see tests.

License

We use MIT license, see LICENSE file.

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

pyayay-0.1.1.tar.gz (19.7 kB view hashes)

Uploaded Source

Built Distributions

pyayay-0.1.1-pp310-pypy310_pp73-win_amd64.whl (107.3 kB view hashes)

Uploaded PyPy Windows x86-64

pyayay-0.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (165.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

pyayay-0.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (174.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

pyayay-0.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl (126.9 kB view hashes)

Uploaded PyPy macOS 11.0+ ARM64

pyayay-0.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl (134.5 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

pyayay-0.1.1-pp39-pypy39_pp73-win_amd64.whl (107.3 kB view hashes)

Uploaded PyPy Windows x86-64

pyayay-0.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (165.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

pyayay-0.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (174.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

pyayay-0.1.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl (126.9 kB view hashes)

Uploaded PyPy macOS 11.0+ ARM64

pyayay-0.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (134.5 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

pyayay-0.1.1-pp38-pypy38_pp73-win_amd64.whl (107.3 kB view hashes)

Uploaded PyPy Windows x86-64

pyayay-0.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (166.5 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

pyayay-0.1.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (175.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686

pyayay-0.1.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl (127.0 kB view hashes)

Uploaded PyPy macOS 11.0+ ARM64

pyayay-0.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (134.6 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

pyayay-0.1.1-cp312-cp312-win_amd64.whl (108.7 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

pyayay-0.1.1-cp312-cp312-win32.whl (92.8 kB view hashes)

Uploaded CPython 3.12 Windows x86

pyayay-0.1.1-cp312-cp312-musllinux_1_1_x86_64.whl (687.0 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

pyayay-0.1.1-cp312-cp312-musllinux_1_1_i686.whl (747.2 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ i686

pyayay-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172.3 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

pyayay-0.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (179.8 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686

pyayay-0.1.1-cp312-cp312-macosx_11_0_arm64.whl (130.5 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

pyayay-0.1.1-cp312-cp312-macosx_10_9_x86_64.whl (136.3 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ x86-64

pyayay-0.1.1-cp311-cp311-win_amd64.whl (108.3 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

pyayay-0.1.1-cp311-cp311-win32.whl (93.0 kB view hashes)

Uploaded CPython 3.11 Windows x86

pyayay-0.1.1-cp311-cp311-musllinux_1_1_x86_64.whl (688.5 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

pyayay-0.1.1-cp311-cp311-musllinux_1_1_i686.whl (749.8 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

pyayay-0.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172.8 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

pyayay-0.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (180.0 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686

pyayay-0.1.1-cp311-cp311-macosx_11_0_arm64.whl (131.1 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

pyayay-0.1.1-cp311-cp311-macosx_10_9_x86_64.whl (136.1 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

pyayay-0.1.1-cp310-cp310-win_amd64.whl (107.6 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

pyayay-0.1.1-cp310-cp310-win32.whl (91.9 kB view hashes)

Uploaded CPython 3.10 Windows x86

pyayay-0.1.1-cp310-cp310-musllinux_1_1_x86_64.whl (687.3 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

pyayay-0.1.1-cp310-cp310-musllinux_1_1_i686.whl (748.5 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

pyayay-0.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172.2 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pyayay-0.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (179.4 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686

pyayay-0.1.1-cp310-cp310-macosx_11_0_arm64.whl (129.7 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

pyayay-0.1.1-cp310-cp310-macosx_10_9_x86_64.whl (134.4 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

pyayay-0.1.1-cp39-cp39-win_amd64.whl (104.9 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

pyayay-0.1.1-cp39-cp39-win32.whl (92.1 kB view hashes)

Uploaded CPython 3.9 Windows x86

pyayay-0.1.1-cp39-cp39-musllinux_1_1_x86_64.whl (687.8 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

pyayay-0.1.1-cp39-cp39-musllinux_1_1_i686.whl (748.7 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

pyayay-0.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172.5 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pyayay-0.1.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (179.5 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686

pyayay-0.1.1-cp39-cp39-macosx_11_0_arm64.whl (129.9 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

pyayay-0.1.1-cp39-cp39-macosx_10_9_x86_64.whl (134.6 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

pyayay-0.1.1-cp38-cp38-win_amd64.whl (107.5 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

pyayay-0.1.1-cp38-cp38-win32.whl (92.0 kB view hashes)

Uploaded CPython 3.8 Windows x86

pyayay-0.1.1-cp38-cp38-musllinux_1_1_x86_64.whl (687.3 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

pyayay-0.1.1-cp38-cp38-musllinux_1_1_i686.whl (748.2 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

pyayay-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (172.0 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pyayay-0.1.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (179.0 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686

pyayay-0.1.1-cp38-cp38-macosx_11_0_arm64.whl (129.5 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

pyayay-0.1.1-cp38-cp38-macosx_10_9_x86_64.whl (134.2 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

Supported by

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