################################################################################################### # A Pygame BUG Report: (Bug found about May 2009) # # To Pygame People: # # (Best when viewed with a monospaced font.) # # I think I found a glitch/bug . . . # # pygame.sndarray.make_sound() sometimes returns a "channel"? # # Below is a program that can possibley re-do the glitch. # ################################################################################################### # # requirements to run: # (python 2.5 or higher)? # and: (pygame 2.8.0 or pygame 2.8.1)? # and: (numpy)? # ################################################################################################### # # On my computer: # # The glitch was found with: (python 2.5.2 + pygame 2.8.0 + numpy 1.2.1) and: (python 2.6.2 + pygame 2.8.1 + numpy 1.3.0 ). # # # after a while of running (About 2 to 10 minutes), this program closes and give one of these errors?: # # This one: TypeError: argument 1 must be pygame.mixer.Sound, not Channel <--(common) # # Or this one: Fatal Python error: (pygame parachute) Segmentation Fault <--(rare) # This application has requested the Runtime to terminate in an unusual way. # . . . # # (I did a google search to see if anybody else had discovered this glitch-- # But-- I didn't find any pages about it . . . ) # ################################################################################################### # My computer stats: # # Windows Vista Home Premium # Service Pack 1 # win32/32-bit Operating System # Processor: Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz 2.00 GHz # RAM/memmory: 3.00 GB # ################################################################################################### # # Here's the program: #
def HE_HE_init(): global screen global screen_x_size global screen_y_size global channel_max if sys.platform == 'win32' or sys.platform == 'win64': os.environ['SDL_VIDEO_CENTERED'] = '1' # init the pygame.mixer according to the pygame version number: versiony_numbery = pygame.version.vernum numby = int(str(versiony_numbery[0]) + str(versiony_numbery[1]) + str(versiony_numbery[2])) if numby >= 181: pygame.mixer.init(44100, -16, 1) else: pygame.mixer.init(22050, -16, 2) pygame.init() random.seed() channel_max = 5 pygame.mixer.set_num_channels(channel_max) screen_x_size = 640 screen_y_size = 480 screen = pygame.display.set_mode((screen_x_size, screen_y_size)) pygame.mouse.set_visible(1) pygame.display.set_caption('BUG? --> pygame.sndarray.make_sound() <-- BUG?') pygame.display.flip() def Lets_ROLL(): previous_channel = None # Some frequencies/Hz/Cycles-per-second: (ABCDEFGs) noteyish = (440, 493.883, 261.626, 293.665, 329.628, 349.228, 391.995, 440*2.0, 493.883*2.0, 261.626*2.0, 293.665*2.0, 329.628*2.0, 349.228*2.0, 391.995*2.0, 440/2.0, 493.883/2.0, 261.626/2.0, 293.665/2.0, 329.628/2.0, 349.228/2.0, 391.995/2.0 ) t = time.time() while True: # <-- Main loop # Keep program from running/executing "too fast": while t > time.time(): pass t = time.time() + 0.10 screen.fill((0, 0, 0)) # Close the window/program if: [Esc is pressed] or: [The X button is pressed] key = pygame.key.get_pressed() if key[K_ESCAPE]: END() for event in pygame.event.get(): if event.type == QUIT: END() ##### generate/create and display/draw numpy_sound_data: ##### total_duration_in_seconds = .25 samples_per_second = 22050 total_amount_of_samples = total_duration_in_seconds * samples_per_second cicles_per_every_second = noteyish[int(random.random() * ((7 * 3) - 1) )] #440.0 numpy_sound_data = array([0] * int(total_amount_of_samples)) # setup some variables for drawing/displaying numpy_sound_data x = 0 y = 200 x_dividey = 10 y_dividey = 1000 y_addy = 200 x2 = 0 y2 = 400 x2_dividey = 2 y2_addy_addy = 200 # yyygr should cause a "slight" "waver" in the frequencies/Hz/Cycles-per-second yyygr = 0.00001 yyygr_speed = 0.0 #yyygr_speed = (0.0005 / 2.0) - random.random() * 0.0005 specialy = len(numpy_sound_data) - 1 specialyy2 = specialy - 1000 specialyy3 = 0 + 300 if specialy > 2000: specialy -= 2000 for n in range(0, len(numpy_sound_data)): if yyygr < 0: yyygr_speed -= 0.0000005 elif yyygr > 0: yyygr_speed += 0.0000005 yyygr += yyygr_speed wavey_gurgy = ( float(n) * float(cicles_per_every_second + yyygr) / float(samples_per_second) ) numpy_sound_data[n] = int( math.sin( wavey_gurgy * radians(360) ) * 20000.0 ) # This "pinches" the ends of the "numpy_sound_data": if n >= specialyy2: numpy_sound_data[n] *= (1.0 - (n - specialyy2) / 1000.0) if n <= specialyy3: numpy_sound_data[n] *= (n / 300.0) # Draw/plot two stretched versions of the "numpy_sound_data": xa = x ya = y x = n / x_dividey y = numpy_sound_data[n] / y_dividey + y_addy xa2 = x2 ya2 = y2 x2 = n / x2_dividey y2 = y + y2_addy_addy pygame.draw.line(screen, (200, 200, 200), (x, y), (xa, ya)) pygame.draw.line(screen, (200, 200, 200), (x2, y2), (xa2, ya2)) pygame.display.flip() ###### convert "numpy_sound_data" to pygame.mixer.Sound and play it: ####### sound_thing = pygame.sndarray.make_sound( numpy_sound_data ) # <-- This should always return a sound, right? if previous_channel != None: previous_channel.fadeout(300) # <-- Fade out previous sound. (if any) print type(sound_thing) # <-- Should print: <type 'pygame.mixer.Sound'> previous_channel = pygame.mixer.find_channel(True).play(sound_thing, 0) # <-- This line is where the program "should" give an error. def END(): print '' print 'Program ended?' print "###############################################################################" print "###############################################################################" print '' pygame.quit() raise SystemExit, '' import os import sys import math import random import time #import gc #import copy as pythoncopy #import string #import struct #from time import strftime, localtime #import wave print "" print "###############################################################################" print "###############################################################################" print "Program started? " print "" print "" print "" print "" print "" try: import pygame from pygame.locals import * if not pygame.font: print '?? "pygame.font" not "found" ??' if not pygame.mixer: print '?? "pygame.mixer" not "found" ??' from pygame import scrap except: print '"pygame" not "found"???' try: import numpy; from numpy import * except: print '"numpy" not "found"??? (Oh well! Who cares!)' #try: # import numarray; from numarray import * #except: print '"numarray" not "found"??? (Oh well! Who cares!)' #try: # import Numeric; from Numeric import * #except: print '"numeric" not "found"??? (Oh well! Who cares!)' HE_HE_init() Lets_ROLL() END() # Thanks for your effort! I hope the bug will be fixed!