简体   繁体   中英

Unable to open any sound file in pygame.mixer

I've been working on a sound-related Pygame project using pygame.mixer , and I've come across a problem I can't seem to solve. I'm unable to open any sound file that I've tried (.mp3 and .midi).

I'm using Python 3 on PyCharm 2018.3. My Pygame is mostly up-to-date (version 1.9.3). I've tried using the full path, I've done pygame.init() , mixer.init() , and I'm completely stuck.

This is my code:

import pygame
from pygame import mixer

pygame.init()
mixer.init(44100, 16, 2, 4096)

f = mixer.Sound("output.midi")
f.play()

print(bool(mixer.get_busy()))
while mixer.get_busy():
    pass

This is the error (the ... in the file cover the actual traceback):

Traceback (most recent call last):
  File "/home/.../note.py", line 27, in <module>
    f = mixer.Sound("output.midi")
pygame.error: Unable to open file 'output.midi'

The program is supposed to open a .midi file created in another part of the program (which I've commented out) and play it until it is finished. Instead, I just get the error and no sound plays.

A MIDI file is not "a sound file"; it is basically digital sheet music. You'd need a MIDI synthesiser to generate sound from it.

And a MP3 is compressed with an algorithm; it's not a sequence of sound samples.

From the PyGame.Mixer documentation :

The Sound can be loaded from an OGG audio file or from an uncompressed WAV.

In short, you're using the wrong tool for the job.

O course, you can play MIDI files with pygame. The extension of a MIdI-file is .mid (not .midi as in your code). This works for me:

import pygame

def play_MIDI_pygame(midi_file):
    freq = 44100                               # audio CD quality
    bitsize = -16                              # unsigned 16 bit
    channels = 2                               # 1 is mono, 2 is stereo
    buffer = 1024                              # number of samples
    clock = pygame.time.Clock()
    pygame.mixer.init(freq, bitsize, channels, buffer)
    pygame.mixer.music.set_volume(0.8)         # volume 0 to 1.0

    pygame.mixer.music.load(midi_file)         # read the midi file
    pygame.mixer.music.play()                  # play the music
    while pygame.mixer.music.get_busy():       # check if playback has finished
        clock.tick(30)

midi_file = 'myMidi.mid'
play_MIDI_pygame(midi_file)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM