muses72323 0.1.0

A Rust driver library for the MUSES72323 electronic volume controller IC
Documentation
muses72323-0.1.0 has been yanked.

muses72323

Crates.io Documentation License

A Rust driver library for the MUSES72323 electronic volume controller IC.

Overview

The MUSES72323 is a high-quality 2-channel electronic volume controller IC manufactured by New Japan Radio Co., Ltd. This crate provides type-safe, zero-cost abstractions for controlling the MUSES72323 via its serial interface.

Key Features

  • Volume Control: 0dB to -111.75dB in 0.25dB steps (512 steps)
  • Gain Control: 0dB to +21dB in +3dB steps (8 levels)
  • Soft Step Function: Reduces zipper noise during volume changes
  • Zero-Cross Detection: Minimizes pop noise when changing volume
  • Independent or Linked L/R Control: Control channels separately or together
  • Type-Safe API: Compile-time guarantees for valid configurations
  • No-std Compatible: Works in embedded environments

Installation

Add this to your Cargo.toml:

[dependencies]
muses72323 = "0.1.0"

Usage

Basic Volume Control

use muses72323::commands::{SetVolume, Channel};

// Set volume to -20dB (80 steps of 0.25dB)
let volume_cmd = SetVolume::new()
    .with_chip_addr(0b00)           // Chip address (ADR0, ADR1 pins)
    .with_channel(Channel::LorBoth) // Control left or both channels
    .with_is_soft_step(true)        // Enable soft step to reduce zipper noise
    .with_volume(80);               // 80 * 0.25dB = -20dB

// Convert to u16 for transmission
let data: u16 = volume_cmd.into();
// Send `data` to MUSES72323 via your serial interface

Gain Control

use muses72323::commands::{SetGain, Gain};

// Set gain to +12dB for both channels
let gain_cmd = SetGain::new()
    .with_chip_addr(0b00)
    .with_l_gain(Gain::Gain12db)    // Left channel: +12dB
    .with_r_gain(Gain::Gain12db)    // Right channel: +12dB
    .with_l_r_cont(true)            // Link L/R channels
    .with_zero_cross_off(false);    // Enable zero-cross detection

let data: u16 = gain_cmd.into();

Clock Configuration

use muses72323::commands::{SoftClock, ClockDiv, ZeroWindowVolt};

// Configure soft clock with internal clock and 1/32 division
let clock_cmd = SoftClock::new()
    .with_chip_addr(0b00)
    .with_internal_clock(true)              // Use internal clock
    .with_clock_div(ClockDiv::Div32)        // 1/32 clock division
    .with_zero_window_volt(ZeroWindowVolt::Mul4); // Zero-cross detection window

let data: u16 = clock_cmd.into();

Command Reference

SetVolume

Controls the volume level for each channel.

  • Volume Range: 0 to 511 (0dB to -111.75dB in 0.25dB steps)
    • 0 = 0dB (maximum volume)
    • 80 = -20dB
    • 511 = -111.75dB (minimum volume)
  • Soft Step: Gradually changes volume to reduce zipper noise
  • Channel: Control left, right, or both channels (when L/R linked)

SetGain

Controls the gain level for each channel.

Available gain levels:

  • Gain0 = 0dB
  • Gain3db = +3dB
  • Gain6db = +6dB
  • Gain9db = +9dB
  • Gain12db = +12dB
  • Gain15db = +15dB
  • Gain18db = +18dB
  • Gain21db = +21dB

Options:

  • L/R Control: Link channels for synchronized control
  • Zero-Cross Detection: Enable/disable pop noise reduction

SoftClock

Configures the soft step clock and zero-cross detection.

  • Clock Source: Internal or external clock
  • Clock Division: 1/1, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, 1/256
  • Zero-Cross Window: Sensitivity of zero-cross detection (1x, 2x, 4x, 8x)

Hardware Interface

The MUSES72323 uses a 3-wire serial interface:

  • DATA: Serial data input
  • CLOCK: Serial clock input
  • LATCH: Data latch signal

Typical transmission sequence:

  1. Set LATCH low
  2. Send 16-bit command data (MSB first) on DATA line, clocked by CLOCK
  3. Set LATCH high to latch the data

Examples

Complete Volume Control System

use muses72323::commands::{SetVolume, SetGain, SoftClock, Channel, Gain, ClockDiv, ZeroWindowVolt};

// Initialize with soft clock configuration
let clock_cmd = SoftClock::new()
    .with_chip_addr(0b00)
    .with_internal_clock(true)
    .with_clock_div(ClockDiv::Div32)
    .with_zero_window_volt(ZeroWindowVolt::Mul4);
send_to_muses(clock_cmd.into());

// Set initial gain
let gain_cmd = SetGain::new()
    .with_chip_addr(0b00)
    .with_l_gain(Gain::Gain0)
    .with_r_gain(Gain::Gain0)
    .with_l_r_cont(true)
    .with_zero_cross_off(false);
send_to_muses(gain_cmd.into());

// Set volume with soft step
let volume_cmd = SetVolume::new()
    .with_chip_addr(0b00)
    .with_channel(Channel::LorBoth)
    .with_is_soft_step(true)
    .with_volume(100); // -25dB
send_to_muses(volume_cmd.into());

fn send_to_muses(data: u16) {
    // Implement your serial transmission here
    // Example for embedded systems:
    // - Set LATCH low
    // - Send 16 bits MSB first
    // - Set LATCH high
}

Volume Fade

use muses72323::commands::{SetVolume, Channel};

fn fade_volume(from: u16, to: u16, chip_addr: u8) {
    let step = if from < to { 1 } else { -1 };
    let mut current = from as i16;
    let target = to as i16;
    
    while current != target {
        let cmd = SetVolume::new()
            .with_chip_addr(chip_addr)
            .with_channel(Channel::LorBoth)
            .with_is_soft_step(true)
            .with_volume(current as u16);
        
        send_to_muses(cmd.into());
        current += step;
        
        // Add delay between steps if needed
        delay_ms(10);
    }
}

Technical Details

Bit Field Layout

All commands are 16-bit values with specific bit layouts:

SetVolume (Command ID: 0b00):

[15:7] Volume (9 bits)
[6:5]  Reserved (0b00)
[4]    Soft Step Enable
[3:2]  Channel Select
[1:0]  Chip Address

SetGain (Command ID: 0b000010):

[15]   L/R Control
[14:12] L Gain (3 bits)
[11:9]  R Gain (3 bits)
[8]    Zero-Cross Off
[7:2]  Command ID (0b000010)
[1:0]  Chip Address

SoftClock (Command ID: 0b0000011):

[15]   Reserved (0)
[14:13] Zero Window Voltage (2 bits)
[12:10] Clock Division (3 bits)
[9]    Internal Clock Enable
[8:2]  Command ID (0b0000011)
[1:0]  Chip Address

License

Licensed under the Apache License, Version 2.0. See LICENSE for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

References

Author

Shisei Hanai ruimo.uno@gmail.com