oh, nice one :)


On Tue, Feb 22, 2011 at 4:48 AM, Brian Gryder <[email protected]>wrote:

> Thank you for the reply René,
>
> I think I fixed it. I found some terminal commands for resolving "Alsa with
> Pulseaudio" issues ( http://ubuntuforums.org/showthread.php?t=843012 ). If
> I add them to a simple Bash script to launch my pygame program like this,
> the sound lag disappears:
>
> ####### start mystartup.sh #######
> killall pulseaudio
> alsa force-reload
> pulseaudio -D
> python -u badpenni2.py
> ######### end mystartup.sh #######
>
> Here is the program. it reads midi events and plays sound loops, one shot
> sound files and/or gated (start/stop) sounds with no noticeable lag. :-)
>
>
> ######## start badpenni2.py ####################
>
> import sys
> import os
> import pygame
> import pygame.midi
> from pygame.locals import *
> pygame.mixer.pre_init(44100,-16,2,10)
> pygame.init()
> pygame.midi.init()
>
>
> sound1 = pygame.mixer.Sound("beat1.wav")
> sound2 = pygame.mixer.Sound("beat2.wav")
> sound5 = pygame.mixer.Sound("bassroll.wav")
> sound6 = pygame.mixer.Sound("snareroll.wav")
>
> nextsound = pygame.mixer.Sound("silence.wav")
>
> nextnotethatwillplay = ""
> notethatwasplayed = ""
>
> for i in range( pygame.midi.get_count() ):
>     r = pygame.midi.get_device_info(i)
>     (interf, name, input, output, opened) = r
>     in_out = ""
>     if input:
>         in_out = "(input)"
>     if output:
>         in_out = "(output)"
>
>     print ("%2i: interface :%s:, name :%s:, opened :%s:  %s" % (i, interf,
> name, opened, in_out))
>
> mydevicenumber=raw_input('See list above. Please enter the number for your
> midi input device: ')
>
> print "you chose " + mydevicenumber + ''
>
> reserved_channel_0 = pygame.mixer.Channel(0)
> my_font = pygame.font.SysFont("Arial",104)
> pygame.fastevent.init()
> event_get = pygame.fastevent.get
> event_post = pygame.fastevent.post
>
> input_id = int(mydevicenumber)
> i = pygame.midi.Input( input_id )
>
> TRACK_END = USEREVENT + 1
> reserved_channel_0.set_endevent(TRACK_END)
>
> pygame.display.set_caption("Revenge of BadPenni Loop Sequencer")
> screen = pygame.display.set_mode((800, 600), RESIZABLE, 32)
>
> going = True
> while going:
>     events = event_get()
>     for e in events:
>         if e.type in [QUIT]:
>             going = False
>         if e.type == TRACK_END:
>             print reserved_channel_0.get_queue()
>             if reserved_channel_0.get_queue() == None:
>                 reserved_channel_0.queue(nextsound)
>
>             reserved_channel_0.queue(nextsound)
>             notethatwasplayed = nextnotethatwillplay
>             screen.fill(Color("LawnGreen"))
>             screen.blit(my_font.render("Looping",True,Color("Black")),(0,0)
> )
>             pygame.display.update()
>
>     if i.poll():
>         midi_events = i.read(10)
>         print "full midi_events " + str(midi_events)
>         print "my midi note is " + str(midi_events[0][0][1])
>
>         if str(midi_events[0][0][2]) != "0":
>             mymidinote = str(midi_events[0][0][1])
>             print "on event"
>
>         if str(midi_events[0][0][2]) == "0":
>             mymidinote = str(midi_events[0][0][1]) + "off"
>             print "off event"
>
>         if mymidinote == "48":
>             reserved_channel_0.queue(sound1)
>             nextsound = sound1
>
>         if mymidinote == "49":
>             reserved_channel_0.queue(sound2)
>             nextsound = sound2
>
>         if mymidinote == "50":
>             sound6.play(-1)
>
>         if mymidinote == "50off":
>             sound6.stop()
>
>         if mymidinote == "51":
>             sound5.play(-1)
>
>         if mymidinote == "51off":
>             sound5.stop()
>
>         #convert them into pygame events.
>         midi_evs = pygame.midi.midis2events(midi_events, i.device_id)
>
>         for m_e in midi_evs:
>             event_post( m_e )
> del i
> exit()
>
> ######## end badpenni2.py ####################
>
>
>
>
>
> On Sun, Feb 20, 2011 at 4:47 AM, René Dudfield <[email protected]> wrote:
>
>> Unfortunately, that won't work.  I asked on the SDL mailing list about the
>> jack backend, but unfortunately the patch was never finished.  Here is the
>> old email thread where someone has their SDL+jack patch.
>> http://forums.libsdl.org/viewtopic.php?t=5682&sid=5f22dd6ed373f5d4ef4d11562553aad7
>> I'll ask more about jack with SDL again on the mailing list.
>>
>>
>>
>> I think the easiest way for the moment would be to route it through alsa.
>>   http://jackaudio.org/routing_alsa
>>
>>   Here is the jack plugin for alsa...
>>     http://alsa.opensrc.org/Jack_%28plugin%29
>>
>>
>>
>> Have you tried changing the to use key down event?  Since there is latency
>> from when you hit the key, and finally release it (when the key up event
>> appears).
>>
>>
>>
>>
>>
>> On Fri, Feb 18, 2011 at 10:51 PM, Brian Gryder <[email protected]>wrote:
>>
>>> Thank you all for the replies,
>>>
>>> I verified there was no empty space on the ends of the sound file and
>>> reduced the buffer size.  René, that is a great tutorial on midi and jack. I
>>> was able to get midi connectivity with the pygame.midi functions.
>>>
>>> i found this example of C code that uses jack:
>>> http://trac.jackaudio.org/browser/trunk/jack/example-clients/metro.c
>>>
>>> Is it possible to download the source files like  "jack.h" and
>>> "transport.h" in the pygame file's folder then somehow import it and call a
>>> function to make my program appear the in
>>>
>>> qjackctl dialog boxes? Thank you.
>>>
>>>
>>>
>>>
>>>
>>> On Wed, Feb 16, 2011 at 2:43 PM, Greg Ewing <[email protected]
>>> > wrote:
>>>
>>>> Brian Gryder wrote:
>>>>
>>>>> I wrote this simple drum pad program with pygame and the lag between
>>>>> key presses and the start of the sound bugs me.
>>>>>
>>>>
>>>> Have you tried reducing the size of the sound buffer?
>>>> Too large a buffer seems to be a known cause of latency
>>>> when using the pygame mixer.
>>>>
>>>> --
>>>> Greg
>>>>
>>>
>>>
>>
>

Reply via email to