[alsa-devel] problems howto send simple 'noteon' event with pyalsa...
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..
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.
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,
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...
participants (3)
-
Aldrin Martoq
-
Jaroslav Kysela
-
ki.ber.kom.uni.st