Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* problems howto send simple 'noteon' event with pyalsa...
@ 2008-03-13 11:58 ki.ber.kom.uni.st
  2008-03-13 12:34 ` Jaroslav Kysela
  0 siblings, 1 reply; 4+ messages in thread
From: ki.ber.kom.uni.st @ 2008-03-13 11:58 UTC (permalink / raw)
  To: alsa-devel

e,
i was happy user of PySeq [1] and it was easy to send directly
'noteon' event.. more or less in python interactoin session:
import pyseq

seq = pyseq.PySeq()
seq.createOutPort()
event = snd_seq_event()
event.setSource(0)
event.setSubscribers()
event.setNoteOn(ch, note, velocity)
event.sendAsIs(seq)

it seems that pyalsa will go along alsa development so i tried pyalsa.. but....

i tried this:

from pyalsa import alsaseq

seq = alsaseq.Sequencer()
seq.create_simple_port("myPort", alsaseq.SEQ_PORT_TYPE_APPLICATION,
alsaseq.SEQ_PORT_CAP_SUBS_READ | alsaseq.SEQ_PORT_CAP_READ |
alsaseq.SEQ_PORT_CAP_WRITE | alsaseq.SEQ_PORT_CAP_SUBS_WRITE)

event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_NOTE)
event.set_data({'note.note' : 0x40, 'note.velocity' : 127,
'note.duration' : 1, 'note.off_velocity' : 0})
event.dest = (20, 0)
seq.output_event(event)
seq.drain_output()

after drain it says:
"SequencerError: Failed to drain output: Invalid argument"
i can connect and disconnect ports around and (20,0) is functional
port where i send events with no problems from PySeq...

any ideas? do i have to use queues to be able to send 'noteon'.. for
my purposes it seems to me that that's overkill....

thanx..

[1] http://www.sci.ccny.cuny.edu/~brinkman/software/pyseq/

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: problems howto send simple 'noteon' event with pyalsa...
  2008-03-13 11:58 problems howto send simple 'noteon' event with pyalsa ki.ber.kom.uni.st
@ 2008-03-13 12:34 ` Jaroslav Kysela
  2008-03-13 18:07   ` Aldrin Martoq
  0 siblings, 1 reply; 4+ messages in thread
From: Jaroslav Kysela @ 2008-03-13 12:34 UTC (permalink / raw)
  To: ki.ber.kom.uni.st; +Cc: ALSA development

On Thu, 13 Mar 2008, ki.ber.kom.uni.st wrote:

> e,
> i was happy user of PySeq [1] and it was easy to send directly
> 'noteon' event.. more or less in python interactoin session:
> import pyseq
> 
> seq = pyseq.PySeq()
> seq.createOutPort()
> event = snd_seq_event()
> event.setSource(0)
> event.setSubscribers()
> event.setNoteOn(ch, note, velocity)
> event.sendAsIs(seq)
> 
> it seems that pyalsa will go along alsa development so i tried pyalsa.. but....
> 
> i tried this:
> 
> from pyalsa import alsaseq
> 
> seq = alsaseq.Sequencer()
> seq.create_simple_port("myPort", alsaseq.SEQ_PORT_TYPE_APPLICATION,
> alsaseq.SEQ_PORT_CAP_SUBS_READ | alsaseq.SEQ_PORT_CAP_READ |
> alsaseq.SEQ_PORT_CAP_WRITE | alsaseq.SEQ_PORT_CAP_SUBS_WRITE)
> 
> event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_NOTE)
> event.set_data({'note.note' : 0x40, 'note.velocity' : 127,
> 'note.duration' : 1, 'note.off_velocity' : 0})
> event.dest = (20, 0)
> seq.output_event(event)
> seq.drain_output()
> 
> after drain it says:
> "SequencerError: Failed to drain output: Invalid argument"
> i can connect and disconnect ports around and (20,0) is functional
> port where i send events with no problems from PySeq...
> 
> any ideas? do i have to use queues to be able to send 'noteon'.. for
> my purposes it seems to me that that's overkill....

I think that you need to create also queue. Look to pyalsa source code to 
test/seqtest3.py .

					Jaroslav

-----
Jaroslav Kysela <perex@perex.cz>
Linux Kernel Sound Maintainer
ALSA Project, Red Hat, Inc.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: problems howto send simple 'noteon' event with pyalsa...
  2008-03-13 12:34 ` Jaroslav Kysela
@ 2008-03-13 18:07   ` Aldrin Martoq
  2008-03-13 23:24     ` ki.ber.kom.uni.st
  0 siblings, 1 reply; 4+ messages in thread
From: Aldrin Martoq @ 2008-03-13 18:07 UTC (permalink / raw)
  To: Jaroslav Kysela; +Cc: ALSA development, ki.ber.kom.uni.st

Hello,

On Thu, Mar 13, 2008 at 9:34 AM, Jaroslav Kysela <perex@perex.cz> wrote:
> On Thu, 13 Mar 2008, ki.ber.kom.uni.st wrote:
>  > i was happy user of PySeq [1] and it was easy to send directly
>  > 'noteon' event.. more or less in python interactoin session:
>  > import pyseq
>  >
>  > seq = pyseq.PySeq()
>  > seq.createOutPort()
>  > event = snd_seq_event()
>  > event.setSource(0)
>  > event.setSubscribers()
>  > event.setNoteOn(ch, note, velocity)
>  > event.sendAsIs(seq)
>  >
>  > it seems that pyalsa will go along alsa development so i tried pyalsa.. but....

You can send NOTEON events without a queue, but you cannot send NOTE
events without a queue. (subtle difference: note_ON_)

The following code will work; 14:0 is "midi-through" in my system... I
run aseqdump -p 14:0 on another window:

seq = alsaseq.Sequencer()
event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_NOTEON)
event.set_data({'note.note' : 0x40, 'note.velocity' : 64})
event.dest = (14, 0)
seq.output_event(event)
seq.drain_output()


>  > i tried this:
>  > from pyalsa import alsaseq
>  > seq = alsaseq.Sequencer()
>  > seq.create_simple_port("myPort", alsaseq.SEQ_PORT_TYPE_APPLICATION,
>  > alsaseq.SEQ_PORT_CAP_SUBS_READ | alsaseq.SEQ_PORT_CAP_READ |
>  > alsaseq.SEQ_PORT_CAP_WRITE | alsaseq.SEQ_PORT_CAP_SUBS_WRITE)

AFAIK, You don't need a port if you are sending events directly.
Now, if you subscribe and connect ports, you don't need to assign them
into the event, because a new event is created with
snd_seq_ev_set_subs called..

You can check this and other stuff with the following code:

-ini-------------
def _find_attributes(typelist):
        l = []
        for t in typelist:
                d = t.__dict__.items()
                for k, v in d:
                        v = "%s" % v
                        if v.startswith("<attribute"):
                                l.append(k)
        l.sort()
        return l

def dump_event(port, name = 'seqevent'):
        print "Dumping Event ---------->"
        print "%s" % port
        l = _find_attributes([alsaseq.SeqEvent])
        for k in l:
                print "%-30.30s %s" % (name + "." + k, port.__getattribute__(k))
        return

seq = alsaseq.Sequencer()
event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_NOTEON)
event.set_data({'note.note' : 0x40, 'note.velocity' : 64})
dump_event(event)
seq.output_event(event)
seq.drain_output()
-------------end--


>  > event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_NOTE)
>  > event.set_data({'note.note' : 0x40, 'note.velocity' : 127,
>  > 'note.duration' : 1, 'note.off_velocity' : 0})

note.duration and note.off_velocity make sense only for
SEQ_EVENT_NOTE, but you need a queue... so, use SEQ_EVENT_NOTEON and
SEQ_EVENT_NOTEOFF instead....

I'm planning to move event.set_data() to attributes, like
event.note_note, event.note_velocity ... Tell me what you think!

>  > event.dest = (20, 0)
>  > seq.output_event(event)
>  > seq.drain_output()
>  >
>  > after drain it says:
>  > "SequencerError: Failed to drain output: Invalid argument"

Well, that's what asoundlib says... weird, don't you think?

Alsa hackers: This is a good proof that alsa-lib message errors
really, really sucks... Is there any chance to change this? I mean, if
I volunteer to improve this could be accepted? Any hints for doing
this?

[...]
>  > any ideas? do i have to use queues to be able to send 'noteon'.. for
>  > my purposes it seems to me that that's overkill....

Remember: python is far away of real-time so if you get weirds timings
you may reconsider using a queue anyway!


HTH,

-- 
Aldrin Martoq
http://aldrinvideopodcast.podshow.com/

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: problems howto send simple 'noteon' event with pyalsa...
  2008-03-13 18:07   ` Aldrin Martoq
@ 2008-03-13 23:24     ` ki.ber.kom.uni.st
  0 siblings, 0 replies; 4+ messages in thread
From: ki.ber.kom.uni.st @ 2008-03-13 23:24 UTC (permalink / raw)
  To: ALSA development

i'm happy that gnu world exists ;) aldrin thanx to remind me on that
once again...

On 3/13/08, Aldrin Martoq <amartoq@dcc.uchile.cl> wrote:
> You can send NOTEON events without a queue, but you cannot send NOTE
>  events without a queue. (subtle difference: note_ON_)

clear enough...

>  The following code will work;

worked as charm... many thanx...

> AFAIK, You don't need a port if you are sending events directly.

you are right.. i can send events directly... in my particular case i
like to have ports so i can connect them with other midi ports through
qjackctl or some other graphical app...

>  Now, if you subscribe and connect ports, you don't need to assign them
>  into the event, because a new event is created with
>  snd_seq_ev_set_subs called..

i don't get this one.. what i tried till know is to create in/out
ports (it works...) and then connect them with some existing ones
using seq.connect_ports.. then if i use seq.output_event(event)
drain_output() works fine... i don't get what 'ports assigning into
the event' would be?

>  You can check this and other stuff with the following code:

once more many thanx.. this was very helpful for me.. i'll keep using
pyalsa and i start to call myself happy user of pyalsa from now on ;)

>  I'm planning to move event.set_data() to attributes, like
>  event.note_note, event.note_velocity ... Tell me what you think!

that seems to me more clear and more consistent with event.dest and
probably some other stuff... also it looks more pythonic i would
say... even set_data() is easy to use too..

i use a lot ipython interactive shell so attributes are shown as
result of auto completion + if you would put """documentation
strings""" it will also come out with basic documentation of what is
it for and how to use it...

> Well, that's what asoundlib says... weird, don't you think?

i was pissed but as usually being the lamest in programming i had no
one but myself to blame ;)

> Remember: python is far away of real-time so if you get weirds timings
>  you may reconsider using a queue anyway!

my pyalsa piece of code is part of handling gamepad events in pyqt4
loop so i thought to send events as soon as i get them from
/dev/input/js0 should be handled without any queue and trying to send
them directly.. am i right in this particular set up?

i'll try to get into queues in the later phase of my development...

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-03-13 23:24 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-13 11:58 problems howto send simple 'noteon' event with pyalsa ki.ber.kom.uni.st
2008-03-13 12:34 ` Jaroslav Kysela
2008-03-13 18:07   ` Aldrin Martoq
2008-03-13 23:24     ` ki.ber.kom.uni.st

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox