An open API service indexing awesome lists of open source software.

https://github.com/ain1084/rust_psg_lite

Generates PCM waveforms similar to those of the AY-3-8910 and its compatible chips.
https://github.com/ain1084/rust_psg_lite

audio ay-3-8910 chiptune rust

Last synced: 6 months ago
JSON representation

Generates PCM waveforms similar to those of the AY-3-8910 and its compatible chips.

Awesome Lists containing this project

README

          

# PSG Lite

[![Crates.io](https://img.shields.io/crates/v/psg_lite.svg)](https://crates.io/crates/psg_lite)
[![Documentation](https://docs.rs/psg_lite/badge.svg)](https://docs.rs/psg_lite)
[![Build Status](https://github.com/ain1084/rust_psg_lite/workflows/Rust/badge.svg)](https://github.com/ain1084/rust_psg_lite/actions?query=workflow%3ARust)
![Crates.io License](https://img.shields.io/crates/l/psg_lite)

This crate generates PCM waveforms similar to those of the AY-3-8910 and its
compatible chips. This crate is not intended for high-quality audio applications.
The main use case is generating simple sound effects and tones in resource-
constrained environments. It is designed with a focus on speed to be usable
on 8-bit CPUs (such as AVR[^1]). Emulating the chip is not the goal. As such,
there are significant differences from the AY-3-8910 in terms of functionality.

* **Hardware Envelope:** Not implemented. Channel volume ranges from 0 to 15.
* **Noise Generator:** The number of bits in the shift register differs. Specifically,
it is 16 bits instead of 17 bits.
* **Tone Period:** 0 cannot be set. The minimum value is constrained by the clock rate
and sample rate.

[^1]: Although the C++ implementation (same structure) worked on ATTiny, it has not
been confirmed with Rust.

## Sample Rate

PSG has an extremely simple structure, but the upper limit of the frequency that can
be generated is 125KHz at a clock rate of 2MHz. This crate reduces processing load
by simply thinning out waveforms without performing downsampling. Therefore, at low
sample rates, especially in the high-frequency range, the sound quality deteriorates
significantly. At a sample rate of around 48000Hz, the sound quality is generally
acceptable. If a sample rate of 250KHz is specified, waveforms are generated with
almost no degradation.

In a PC environment, most audio frameworks automatically perform sample rate
conversion before outputting to the device. Therefore, it is often possible to play
back a sample rate of 250KHz without any issues.

## Features

This crate has the following `features` flags:

`float`: Enables generating samples in `f32` format. Enabled by default. If this flag
is not set, floating-point operations are not performed.

## Usage

To use this crate, create a `SoundGenerator` instance, configure the tone period and
mode for the channels, and then generate samples. The interface is simple and
designed for use in embedded systems. Below is a basic example.

```rust
use psg_lite::{SoundGenerator, Output};

fn main() {
const CLOCK_RATE: u32 = 2_000_000;
const SAMPLE_RATE: u32 = 48_000;

let mut generator = SoundGenerator::new(CLOCK_RATE, SAMPLE_RATE);

generator.set_mode(0, Output::TONE);
generator.set_volume(0, 15);
generator.set_period(0, 123);

for _ in 0..SAMPLE_RATE {
let sample: i16 = generator.next_sample();
// Process the sample (e.g., send to DAC or audio buffer)
}
}
```

## License

Licensed under either of
- Apache License, Version 2.0
([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.

## Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.