ym2149_common/
lib.rs

1//! Common traits and types for YM2149 chiptune replayers.
2//!
3//! This crate provides shared abstractions used across multiple replayer
4//! implementations (YM, AKS, AY formats).
5//!
6//! # Traits
7//!
8//! - [`ChiptunePlayer`] - Unified player interface for any chiptune format
9//! - [`PlaybackMetadata`] - Metadata access (title, author, duration, etc.)
10//!
11//! # Example
12//!
13//! ```ignore
14//! use ym2149_common::{ChiptunePlayer, PlaybackMetadata, PlaybackState};
15//!
16//! fn play_any_format<P: ChiptunePlayer>(player: &mut P) {
17//!     println!("Playing: {}", player.metadata().title());
18//!     player.play();
19//!
20//!     let mut buffer = vec![0.0; 4096];
21//!     while player.state() == PlaybackState::Playing {
22//!         player.generate_samples_into(&mut buffer);
23//!         // ... send buffer to audio device
24//!     }
25//! }
26//! ```
27
28#![warn(missing_docs)]
29
30mod backend;
31mod cached_player;
32pub mod channel_state;
33mod metadata;
34mod player;
35pub mod util;
36pub mod visualization;
37
38pub use backend::Ym2149Backend;
39pub use cached_player::{CacheablePlayer, CachedPlayer, DEFAULT_CACHE_SIZE, SampleCache};
40pub use channel_state::{ChannelState, ChannelStates, EnvelopeState, NoiseState};
41pub use metadata::{BasicMetadata, MetadataFields, PlaybackMetadata};
42pub use player::{ChiptunePlayer, ChiptunePlayerBase, PlaybackState};
43pub use util::{
44    channel_frequencies, channel_frequencies_with_clock, channel_period, period_to_frequency,
45    period_to_frequency_with_clock,
46};
47pub use visualization::{
48    MAX_CHANNEL_COUNT, MAX_PSG_COUNT, SPECTRUM_BINS, SPECTRUM_DECAY, SpectrumAnalyzer,
49    WaveformSynthesizer, freq_to_bin,
50};
51
52// ============================================================================
53// Common Constants
54// ============================================================================
55
56/// Standard audio sample rate (44.1 kHz CD quality).
57pub const DEFAULT_SAMPLE_RATE: u32 = 44_100;
58
59/// PAL frame rate (50 Hz) - used by Atari ST, Amiga, and most European systems.
60pub const FRAME_RATE_PAL: u32 = 50;
61
62/// NTSC frame rate (60 Hz) - used by some American systems.
63pub const FRAME_RATE_NTSC: u32 = 60;
64
65/// Standard YM2149 PSG master clock frequency (2 MHz).
66///
67/// This is the clock rate used on Atari ST, Amstrad CPC, ZX Spectrum 128, etc.
68pub const PSG_MASTER_CLOCK_HZ: u32 = 2_000_000;
69
70/// Alias for backwards compatibility.
71#[deprecated(since = "0.8.0", note = "Use PSG_MASTER_CLOCK_HZ instead")]
72pub const ATARI_ST_CLOCK: u32 = PSG_MASTER_CLOCK_HZ;
73
74/// Atari ST MFP (MC68901) clock frequency (2.4576 MHz).
75///
76/// Used for timer-based effects like SID voice emulation and sample playback.
77pub const ATARI_MFP_CLOCK_HZ: u32 = 2_457_600;
78
79/// Number of audio channels per YM2149 PSG chip.
80pub const CHANNELS_PER_PSG: usize = 3;