pyxen.Sound

Entity에 컴포넌트로 첨부되는 짧은 오디오 클립입니다.

사운드는 메모리에 전체가 로드됩니다 — 점프, 타격, 아이템 획득 같은 짧은 효과에 사용하세요.

오디오 개념은 오디오를 참조하세요.


생성자

Sound(filename, *, volume=1.0, pan=0.0, loop=False, delay=0.0, pitch=1.0)

filename은 유일한 위치 인수로, 프로젝트에 있는 WAV 오디오 에셋의 이름입니다. 나머지 다섯 개는 키워드 전용이며 같은 이름의 속성의 시작 값을 설정합니다(컴포넌트 속성 참고).


매개변수

매개변수타입설명
filenamestrWAV 에셋 이름(확장자 없이). 사운드 뱅크 안의 사운드는 bank/sound
volumefloat시작 게인. 기본값 1.0
panfloat시작 스테레오 위치(-1.0에서 1.0). 기본값 0.0
loopbool끝나면 다시 재생. 기본값 False
delayfloat재생이 시작되기 전의 무음 시간(초). 기본값 0.0
pitchfloat재생 속도, 0.25에서 4.0. 기본값 1.0

예시

jump_sound = Sound("jump")
quiet_echo = Sound("jump", volume=0.3, delay=0.15)
high_jump = Sound("jump", pitch=2.0)

Sound 첨부

생성 시:

sfx = world.spawn(sound=Sound("jump"))

또는 나중에:

entity.sound = Sound("jump")

사운드를 할당하면 즉시 재생이 시작됩니다.


컴포넌트 속성

entity.sound를 통해 접근:

속성타입R/W설명
loopboolR/W반복 활성화
volumefloatR/W게인 (>= 0.0으로 클램프)
panfloatR/W스테레오 패닝 (-1.0에서 1.0)
timefloatR/W현재 재생 위치(초)
delayfloatR/W재생이 시작되기까지의 무음 시간(초)
pitchfloatR/W재생 속도 (0.25에서 4.0)
durationfloatR전체 길이 (초)
finishedboolR재생이 완료되면 True

loop

entity.sound.loop = True

활성화되면 사운드가 끝난 후 자동으로 다시 시작됩니다.


volume

entity.sound.volume = 0.5

0.0 미만의 값은 0.0으로 클램프됩니다.


pan

entity.sound.pan = -1.0  # 완전히 왼쪽
entity.sound.pan =  1.0  # 완전히 오른쪽
entity.sound.pan =  0.0  # 가운데

-1.0에서 1.0 범위로 클램프됩니다.


time

t = entity.sound.time
entity.sound.time = 0.25     # 처음 0.25초를 건너뜀

재생 위치(초)입니다. 값을 대입하면 그 위치로 탐색합니다. 끝을 넘는 값은 끝으로 제한되며, 이미 끝난 소리를 탐색하면 다시 재생됩니다.


delay

entity.sound.delay = 0.002   # 2밀리초 뒤에 시작

소리가 시작되기까지의 무음 시간(초)입니다. time 과 달리 아무것도 건너뛰지 않습니다. 소리는 여전히 첫 샘플부터 시작하며, 시작 시점만 늦어집니다.

같은 효과음이 한 프레임 안에서 여러 번 울릴 때 쓰는 것입니다. 같은 파형의 복사본이 같은 샘플에서 시작하면 위상이 맞아 더해집니다. 둘이면 1.4배가 아니라 두 배의 진폭이 되고, 열이 겹치면 각각을 아무리 신경 써서 맞춰도 믹스가 풀스케일을 넘습니다. 몇 밀리초만 어긋나도 상관 관계는 끊어지며, 그 정도는 빈틈으로 들리지 않습니다.

딜레이가 갈라놓는 것은 어택입니다. 짧은 타격음에는 잘 듣지만 지속음에는 아무 효과가 없습니다.


pitch

entity.sound.pitch = 2.0     # 한 옥타브 위
entity.sound.pitch = 0.5     # 한 옥타브 아래

사운드를 재생하는 빠르기입니다. 1.0은 녹음된 그대로, 2.0은 한 옥타브 높게 절반의 시간에, 0.5는 한 옥타브 낮게 두 배의 길이로 재생됩니다. 값은 0.25에서 4.0, 위아래로 두 옥타브로 제한됩니다. 같은 사운드를 점점 높은 피치로 재생하면 음계가 되므로, 연쇄나 연속 기록에는 음마다 사운드를 따로 두지 않고 사운드 하나면 됩니다:

def on_match(step):
    world.spawn(sound=Sound("match", pitch=1 + 0.12 * step))

time과 duration은 사운드 자체의 초 단위 그대로입니다. pitch가 2.0이면 1초짜리 사운드는 0.5초 동안 재생되고, 그동안 time은 0.0에서 1.0까지 갑니다.


duration

d = entity.sound.duration

읽기 전용. 녹음된 그대로의 사운드 전체 길이 (초). pitch와 상관없습니다.


finished

if entity.sound.finished:
    world.destroy(entity)

읽기 전용. 사운드 재생이 완료되면 (loop가 False일 때) True.


형식

사운드 에셋은 WAV 파일이어야 합니다.


일반적인 에러

파일 이름 누락

Sound()
ValueError: Sound must have a file

잘못된 에셋

Sound("nonexistent")
ValueError: Sound 'nonexistent' not found. For sounds inside a sound bank, use 'bank/sound'.

게임은 이 오류와 함께 멈춥니다. 에셋 이름은 확장자 .wav 없이 지정합니다. 사운드 뱅크 안의 사운드는 bank/sound라는 이름을 씁니다.