使用Pygame开发Python合成器时正弦波输出随机噪音求助
Pygame合成器噪音问题修复方案
核心问题与修复点
波形计算时间参数错误
你在生成正弦波样本时,直接用循环索引代入公式,导致频率被错误放大了采样率倍数(比如44100倍),完全偏离目标频率,这是噪音的主要来源。正确做法是把循环索引转换成秒级时间戳再代入公式。变量与实例化遗漏
代码中未定义synth_type变量,也没有创建Note类的实例就直接使用note,会导致运行错误或异常行为。通道参数误用
mixer.Channel(frequency)是错误用法,Channel的参数是通道索引(比如0、1这类整数),不是频率值。建议使用find_channel()自动获取空闲通道。
修正后的完整代码
import key_manager as km from array import array import pygame from pygame import mixer from pygame.mixer import Sound, get_init, pre_init import time import math synth_type = "sine" # 补充定义合成器类型变量 class Note(pygame.mixer.Sound): def __init__(self, frequency, volume=.1): self.frequency = frequency if synth_type == "sine": Sound.__init__(self, self.build_samples_sine()) self.set_volume(volume) def build_samples_sine(self): sample_rate = get_init()[0] period = int(round(sample_rate / self.frequency)) samples = array("h", [0] * period * 2) amplitude = 2 ** (abs(get_init()[1]) - 1) - 1 for idx in range(period * 2): # 将循环索引转换为实际时间(秒) t = idx / sample_rate samples[idx] = int(round(amplitude * math.sin(2 * math.pi * self.frequency * t))) return samples pre_init(44100, -16, 1, 1024) pygame.init() frequency = 440 # 示例:A4标准音频率 note = Note(frequency) # 实例化Note对象 # 获取空闲通道并播放 channel = mixer.find_channel() if channel: channel.play(note, -1) # 保持程序运行,避免播放后立即退出 try: while True: time.sleep(1) except KeyboardInterrupt: pygame.quit()
内容的提问来源于stack exchange,提问作者James Gernuck
相关产品推荐
相关产品推荐

