On Fri, Jan 01, 2021 at 03:20:09PM -0500, Vadim Belman wrote: > As it seems that Audio::PortMIDI lacks non-blocking interface, I think a > solution would be to read events in a dedicated thread and re-submit them > into a Supplier. Something like: > > my Supplier $midi-events; > > start { > loop { > my $ev = $midi.read; > $midi-events.emit: $ev; > } > } > > > $midi-events can then be used in your react block. BTW, I think calling > method 'poll' must not be needed because `read` should block until actual > event is available. At least this is how I understand the normal order of > things.
Vadim, Thank you for your reply. I tried out not calling $midi.poll, but found that $midi.read would return undef events (rather than blocking until it received an event). So I added it back in. Thank you for the example of how to set up a supply. On Fri, Jan 01, 2021 at 02:51:57PM -0600, Brad Gilbert wrote: > I think the simplest way to turn that into a Supply is to use the `supply` > keyword > > my $pm = Audio::PortMIDI.new; > > > my $input = supply { > my $stream = $pm.open-input($input-device-number, 32); > > DONE { > $stream.close; > } > > loop { > emit $stream.read(1); > } > } > > > react { > whenever key-pressed(:!echo) { > given .fc { > when 'q' { done } > default { .raku.say } > } > } > > my $voice = $pm.open-output($output-device-number, 32); > whenever $input { > $voice.write(|$_); > } > } Brad, Thank you for your reply. I was able to get my code working thanks to the examples from you and Vadim. Here is what I ended up with: my $pm = Audio::PortMIDI.new; # Set up supply to read MIDI events. my $input = supply { my $stream = $pm.open-input($input-device-number, 32); LAST { $stream.close; } loop { emit $stream.read(1) if $stream.poll; } } # Set up handle to send MIDI events to the synthesizer. my $voice = $pm.open-output($output-device-number, 32); react { # Read key presses from the computer keyboard. # TODO: change $voice as needed based on computer keyboard input. whenever key-pressed(:!echo) { given .fc { when 'q' { done } default { .raku.say } } } # Read MIDI events and send to the synthesizer. whenever $input { $voice.write(|$_); } } -kolibrie
signature.asc
Description: PGP signature