Код IT
← Каталог

Python — диаблоид — Этап 22 (бонус) — процедурный звук

Фрагмент из «Python — диаблоид»: Этап 22 (бонус) — процедурный звук.

python spinoffencyclopedia9-04-razrabotka-igr-praktikum-razrabotki-igr-6 embed URL статья в энциклопедии
Python main.py
import array
import math
import pygame


def _sine_wave(freq: float, duration: float, volume: float = 0.25) -> pygame.mixer.Sound:
    rate = 22050
    n = int(rate * duration)
    buf = array.array("h")
    for i in range(n):
        t = i / rate
        fade = min(1.0, i / (rate * 0.01), (n - i) / (rate * 0.04))
        val = int(32767 * volume * fade * math.sin(2 * math.pi * freq * t))
        buf.append(val)
    return pygame.mixer.Sound(buffer=buf)


class AudioSystem:
    def __init__(self) -> None:
        self.enabled = False
        try:
            if not pygame.mixer.get_init():
                pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=512)
            self._sfx = {
                "swing": _sine_wave(180, 0.07, 0.12),
                "kill": _sine_wave(90, 0.15, 0.2),
                "level_up": _sine_wave(440, 0.25, 0.25),
            }
            self.enabled = True
        except Exception:
            pass

    def play(self, name: str) -> None:
        if self.enabled and name in self._sfx:
            self._sfx[name].play()
import array
import math
import pygame


def _sine_wave(freq: float, duration: float, volume: float = 0.25) -> pygame.mixer.Sound:
    rate = 22050
    n = int(rate * duration)
    buf = array.array("h")
    for i in range(n):
        t = i / rate
        fade = min(1.0, i / (rate * 0.01), (n - i) / (rate * 0.04))
        val = int(32767 * volume * fade * math.sin(2 * math.pi * freq * t))
        buf.append(val)
    return pygame.mixer.Sound(buffer=buf)


class AudioSystem:
    def __init__(self) -> None:
        self.enabled = False
        try:
            if not pygame.mixer.get_init():
                pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=512)
            self._sfx = {
                "swing": _sine_wave(180, 0.07, 0.12),
                "kill": _sine_wave(90, 0.15, 0.2),
                "level_up": _sine_wave(440, 0.25, 0.25),
            }
            self.enabled = True
        except Exception:
            pass

    def play(self, name: str) -> None:
        if self.enabled and name in self._sfx:
            self._sfx[name].play()