Pyo features market: You want to support pyo's future developments?

195 views
Skip to first unread message

Olivier Bélanger

unread,
Nov 5, 2016, 9:39:13 AM11/5/16
to pyo-discuss
Hello everyone,

As you may know, keeping pyo up-to-date, efficient and bug free, testing on the three major platforms (Windows, OSX, Linux) and packaging it for Windows and OSX takes already a huge amount of time. With the family growing and the teaching activities, it is harder than before to find the time to extend the library. I'm very proud of what pyo is becoming and totally dedicated to its maintenance, to bug fixing and, to improving the core code.

I'm now asking the community to help me making pyo an even better dsp module!

If you want to support the development of new features in the pyo module, you can make a donation and leave a message to tell me which feature you want to promote. As soon as a feature has reaches its target, I will work on it for its inclusion in the next release.

I've already set up a list of features that I've been asked for in the past.

https://github.com/belangeo/pyo/wiki/Pyo-features-market

If you have other ideas of (big enough) features to add the market, start a discussion about it on this list...

Thank you for your understanding,

Olivier

p.s...@outlook.com

unread,
Nov 5, 2016, 10:35:24 AM11/5/16
to pyo-discuss
Thank you so much for the time you put into this, Olivier. I know it must seem like we're just bugging you with questions but this really is a valuable product, and I plan to donate at some point, as what I've just managed to create with pyo is more flexible than the most expensive looper on the market, one that I could never afford ... albeit controlled with a pair of ripped apart keyboards. Plus this experience has taught me the basics of Python.

Migration to Python 3 is probably the one I'd use. I was thinking I would like expanded 'Special Effects', but actually what you have already across the board can do everything I can think of.

Best,
Paul

Olivier Bélanger

unread,
Nov 6, 2016, 9:20:58 PM11/6/16
to pyo-discuss
Hi,

Just to be sure there is no confusion here... I really love to see pyo
used more and more. The more activities in this list, the happier I
am. So, don stop asking question or challenging my app, I need it! I'm
just trying to balance work and family!

BTW, thanks to Aron Granberg, pyo now compiles and runs on both python
2 and 3. The only problem for now with python 3 is that the version of
wxpython (Phoenix) that runs on it is incompatible with the (more
recent) libraries that I have here on Debian stretch, so I can't try
the wx GUIs of pyo. The server's window written with Tkinter works
and, surely, the easygui stuff will work too!

Cheers,

Olivier
> --
> You received this message because you are subscribed to the Google Groups
> "pyo-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to pyo-discuss...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

barmin

unread,
Nov 7, 2016, 11:23:37 AM11/7/16
to pyo-d...@googlegroups.com
Hi Olivier,

Great idea, I hope it helps you to partially fund the enormous amount of work you put into pyo.

I might contribute to fund Jack MIDI support if there seems to be interest from others.

Also, that's great news that pyo works with python 3. I must say python 2 is no problem for me, but python 3 compatibility might contribute to give a more dynamic idea of the module outside our (small) community!

Right now I can think of two things I'd like to see in pyo one day. Maybe they are not "big enough" to reach the market alone, but you could possibly make a package of several smaller features...

Anyway, here they are:

1) A trigger that would trig if a condition holds for a certain amount of time. Something like

i = Input(0)
f = Follower(i)
h = Holds(f < .01, time=2)

def f():
print "Congratulations! you've been silent during 2 seconds ;-)"

tf = TrigFunc(h, f)

2) For function like PyoObject.set or InputFader.setInput, the possibility to add a callback when the target is reached. In trying to optimize my scripts, I often write things like

a = Sine(440).out()
# later...
a.set('mul', 0, 1)
c = CallAfter(a.stop, 1)

If I try to avoid creating/garbage collecting objects at perf time, I rather write

a = Sine(440).out()
c = CallAfter(a.stop, 1).stop()
# later...
a.set('mul', 0, 1)
c.play()

It would be nice if I could write

a = Sine(440)
# later
a.set('mul', 0, 1, a.stop)




This is all I've got in mind right now, but trust me, I'll come with other ideas some day ;-)

Cheers,

Matthieu

Sean Wayland

unread,
Nov 7, 2016, 12:08:00 PM11/7/16
to pyo-d...@googlegroups.com

In the future I was thinking of trying to build a dx7 emulator with a good Modulation matrix.

I am also interested in trying to emulate filter fm digitally and put together the oscillator and filter architecture of a Rhodes chroma synthesizer.

Perhaps it's all possible with the tools already available..

A good way to port pyo programs to vst would be a help to me also


--
You received this message because you are subscribed to the Google Groups "pyo-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pyo-discuss+unsubscribe@googlegroups.com.

Olivier Bélanger

unread,
Nov 7, 2016, 9:09:22 PM11/7/16
to pyo-discuss
Hi Matthieu,

1) This class Silent seems to work (still need to be tested in a real context):

from pyo import *

class Silent:
def __init__(self, input, threshold, duration, callback):
self.follow = Follower(input)
self.trig = Select(self.follow < threshold, 1)
self.timer = TrigLinseg(self.trig, [(0, 0), (duration, 0)])
self.end = TrigFunc(self.timer["trig"], function=callback)

s = Server().boot()

f = Fader(fadein=0.005, fadeout=0.1, dur=2, mul=0.2).play()
n = Noise(f)

def ended():
print "yoyo"

sil = Silent(n, 0.01, 2, ended)

s.gui(locals())


2) Done in git! New PyoObject.set signature and doc:

def set(self, attr, value, port=0.025, callback=None):
"""
Replace any attribute with portamento.

This method is intended to be applied on attributes that are not
already assigned to PyoObjects. It will work only with floats or
list of floats.

:Args:

attr : string
Name of the attribute as a string.
value : float
New value.
port : float, optional
Time, in seconds, to reach the new value.
callback : callable, optional
A python function to be called at the end of the ramp.

"""

Cheers,

Olivier
> --
> You received this message because you are subscribed to the Google Groups
> "pyo-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to pyo-discuss...@googlegroups.com.

barmin

unread,
Nov 8, 2016, 4:23:33 AM11/8/16
to pyo-d...@googlegroups.com
Hi Olivier,

Thanks once more for your incredibly quick reactions to my requests!

> 1) This class Silent seems to work (still need to be tested in a real context):

I don't think it works as expected.

The code

n = Noise(.2).out()

c1 = CallAfter(lambda: n.setMul(0),2 )
c2 = CallAfter(lambda: n.setMul(.2), 2.1)

def ended():
print s.getCurrentTime()

sil = Silent(n, 0.01, 2, ended)


should generate no output (the Noise object is never silent for 2 seconds) but it does:

00 : 00 : 01 : 996
00 : 00 : 04 : 017

AFAICT the Silent class just acts as a delay: it triggers the callback `duration` after silence is detected, whatever the real duration of the silence (and I'm not sure why the first trigger is there at all...)

But I found a (slightly convoluted, but working) solution in a previous thread:
https://groups.google.com/d/msg/pyo-discuss/m7oprOLAzTY/T2sCwjQVPjsJ

I should have searched the archive (or my memory, really ;-) ) before I asked.

I'll try to adapt this class to my real task (or make a generic one) and I'll come back to you if I encounter a problem.



I'll test your commits ASAP, but that will probably be tomorrow.

Cheers,

Matthieu

barmin

unread,
Nov 9, 2016, 6:05:51 AM11/9/16
to pyo-d...@googlegroups.com
> But I found a (slightly convoluted, but working) solution in a previous thread:
> https://groups.google.com/d/msg/pyo-discuss/m7oprOLAzTY/T2sCwjQVPjsJ

I adapted the class to be of more general use:

class During:
def __init__(self, condition, time, callback):
self.input = input
self.condition = condition
self.callback = callback
sr = s.getSamplingRate() # s is the server!!!
# waiting time in samples
timeInSamps = int(time * sr)
# send a trigger to reset the counter on both threshold crossing
self.reset = Select(self.condition, value=[0,1]).mix(1)
self.count = Count(self.reset)
# if the count reach timeInSamps while the gate holds 1 (below
# threshold), send a trigger to call self.detected method
self.trig = Select(self.count, value=timeInSamps, mul=self.condition)
self.func = TrigFunc(self.trig, self.callback)


This class seems to work and can be used like this:

silence = During(Follower(src)<.001, time=2, callback=cb)

However, what does happen if the server runs for a loooooong time? any risk of integer overflow?
Or does the Count objet wrap to 0? Or...


I also tried another one, without the Count:

class During:
def __init__(self, condition, time=0.1, callback=None):
self.input = input
self.condition = condition
self.callback = callback
self.ca = CallAfter(callback, time).stop()
self.start = Select(self.condition, value=1)
self.tf1 = TrigFunc(self.start, self.ca.play)
self.stop = Select(self.condition, value=0)
self.tf2 = TrigFunc(self.stop, self.ca.stop)

This one is not sample-accurate (I don't really mind), but I find it more readable...
No idea if it's more or less efficient than the first one, though...
Also, I wanted to group [start, stop] and [tf1,tf2] using multi-channel expansion, but I did not manage. Is it possible?


What do you think, which one is better?

Matthieu

barmin

unread,
Nov 9, 2016, 6:23:31 AM11/9/16
to pyo-d...@googlegroups.com
> 2) Done in git! New PyoObject.set signature and doc:

Seems to work great, thanks!

Maybe you should add in the doc that if the value is not reached (e.g., another set command issued in the meantime) the callback will not be called. IMHO that's how it should be, but I tested to be sure... maybe adding it in the doc will spare some testing to others!

Cheers,

Matthieu

Olivier Bélanger

unread,
Nov 12, 2016, 9:10:17 PM11/12/16
to pyo-discuss
Hi Sean,

On Mon, Nov 7, 2016 at 12:07 PM, Sean Wayland <seanw...@gmail.com> wrote:
> In the future I was thinking of trying to build a dx7 emulator with a good
> Modulation matrix.

I remember a Csound set of instruments (somewhere on the web)
emulating the dx7. Probably not to hard to port to pyo!

>
> I am also interested in trying to emulate filter fm digitally and put
> together the oscillator and filter architecture of a Rhodes chroma
> synthesizer.

Because almost every parameter can be controlled with audio signal, it
is actually very easy to do fm with everything. Ex.:

#########################
#!/usr/bin/env python
# encoding: utf-8
from pyo import *

s = Server().boot()

sf = SfPlayer(SNDS_PATH+"/transparent.aif", loop=True)

filtfreq = Sine(freq=100, mul=200)
filter = MoogLP(sf, freq=1000+filtfreq, res=0.9, mul=0.5).out()

s.gui(locals())
#########################

Or I just completely misunderstood your idea..!


>
> Perhaps it's all possible with the tools already available..
>
> A good way to port pyo programs to vst would be a help to me also

I have already something on the way (sources are in
pyo/embedded/juceplugin). You're not the first one who ask this...
Maybe I should at it to the market?

Olivier
>> email to pyo-discuss...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google Groups
> "pyo-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to pyo-discuss...@googlegroups.com.

Olivier Bélanger

unread,
Nov 13, 2016, 10:29:24 AM11/13/16
to pyo-discuss
Hi,
With an unsigned long containing at least 32 bits, it will take ~27
hours (@ 44.1kHz) before wrapping to 0.

>
>
> I also tried another one, without the Count:
>
> class During:
> def __init__(self, condition, time=0.1, callback=None):
> self.input = input
> self.condition = condition
> self.callback = callback
> self.ca = CallAfter(callback, time).stop()
> self.start = Select(self.condition, value=1)
> self.tf1 = TrigFunc(self.start, self.ca.play)
> self.stop = Select(self.condition, value=0)
> self.tf2 = TrigFunc(self.stop, self.ca.stop)
>
> This one is not sample-accurate (I don't really mind), but I find it more
> readable...
> No idea if it's more or less efficient than the first one, though...
> Also, I wanted to group [start, stop] and [tf1,tf2] using multi-channel
> expansion, but I did not manage. Is it possible?

This seems to work:

class During:
def __init__(self, condition, time=0.1, callback=None):
self.input = input
self.condition = condition
self.callback = callback
self.ca = CallAfter(callback, time).stop()
self.select = Select(self.condition, value=[1,0])
self.tf1 = TrigFunc(self.select, [self.ca.play, self.ca.stop])

>
>
> What do you think, which one is better?

CallAfter uses double to keep track of the time, probably a little bit
heavier than Count but safer in the long run!

Cheers,

Olivier

Olivier Bélanger

unread,
Nov 13, 2016, 10:33:20 AM11/13/16
to pyo-discuss
Done!

barmin

unread,
Nov 14, 2016, 5:10:48 AM11/14/16
to pyo-d...@googlegroups.com
Thanks!

Le 13. 11. 16 à 16:33, Olivier Bélanger a écrit :

Sean Wayland

unread,
Nov 26, 2016, 8:49:24 PM11/26/16
to pyo-discuss
Thanks for these replies,

I would like PYO to have a setup window with drop down menus for the audio and midi interfaces it sees added to the basic gui. 
At some point I will work on that. 
A simple way to make a VST plugin for mac would be a great help too. Next year I am studying C++ so I will try and figure out how to build it myself eventually. 
Sean

Aaron Krister Johnson

unread,
Dec 5, 2016, 11:05:25 PM12/5/16
to pyo-discuss
My wishlist would be:

* A ctrl() method on MidiAdsr (and Adsr in general) that would bring up sliders.
* A ctrl()/SLMap method on HarmTable that would allow sliders to control amplitude of harmonic partials? And maybe a graph method as well to see the
summary shape that the sinusoidals create in the table?

To that end, I would love to contribute some small amount of money to development costs.

Olivier Bélanger

unread,
Dec 6, 2016, 11:32:14 AM12/6/16
to pyo-discuss
Hi Sean,

On Sat, Nov 26, 2016 at 8:49 PM, Sean Wayland <seanw...@gmail.com> wrote:
> Thanks for these replies,
>
> I would like PYO to have a setup window with drop down menus for the audio
> and midi interfaces it sees added to the basic gui.
> At some point I will work on that.

That is a good idea! Maybe that could be incorporated to the server window...

> A simple way to make a VST plugin for mac would be a great help too. Next
> year I am studying C++ so I will try and figure out how to build it myself
> eventually.

Take a lot in the pyo's source, pyo/embedded/juceplugin/, it's a work
in progress but a good starting point!

Olivier

Olivier Bélanger

unread,
Dec 6, 2016, 11:38:39 AM12/6/16
to pyo-discuss
Hi Aaron,

Last week, I've added a ctrl() method to every midi-related objects
(also to Adsr), so the first is already done!

And I just push a commit with a graph() method added to HarmTable and
ChebyTable. When used with the view() method, you can change the
waveform and visualize the result live. I've also added a
autoNormalize() method to force the waveform between -1 and 1. Not
hard to do but it is a very cool feature! I attached a little video
showing this in action!

Olivier

p.s.: I also wanted to thank you, it's not the first time you say good
things about pyo on the csound mailing list!
live_harmtable.mkv

Aaron Krister Johnson

unread,
Dec 6, 2016, 1:35:50 PM12/6/16
to pyo-discuss
As has been said before, you are *fast*!

And -- it's not hard to praise Pyo on the Csound-list or anywhere else. It's a pretty impressive achievement to have a powerful DSP library that covers much of the ground of Csound -- and what it may lack in some of Csound's exhaustive list of opcodes and utilities (for instance, countless filters, etc., which is understandable given Csound's age and number of developers), it makes up for in ease-of-use, clean installing, and code expressiveness. I think b/c it has a built in GUI, and is not so dependent on OSC, it already surpasses SuperCollider in some ways. :D

When I want quick results, I'm finding I'm turning to Pyo more and more over Csound....*especially* when I want a quick GUI (that's the power of wxWindows/Python -- much better looking and functioning than FLTK, in my opinion). I find Csound-QT and Cabbage hopelessly difficult to install and use -- in the case of Csound-QT, bloated and frankly, broken; and Cabbage's compilation is hit-or-miss. Pyo, by comparison, compiles and installs cleanly, and the GUI stuff is trivially easy to pull off (and, very clean and attractive to look at as well).

Bravo!

aj sier Noem

unread,
Dec 6, 2016, 7:18:34 PM12/6/16
to pyo-discuss
Hi, 

Is it possible for Iter to receive PyoObjs in choice? This would be interesting and quite useful. Also.. sending a trig at the end of an Iter sequence? I would gladly contribute to see this a reality. Thanks for the awesome work!

Aaron Krister Johnson

unread,
Dec 6, 2016, 8:25:58 PM12/6/16
to pyo-discuss
Wow...the video is cool...can't wait to dive in and explore these features.

I downloaded and built the latest from github, but when I try to use MidiAdsr's .ctrl() method, I get this message:

akj@akj-MacBookPro ~/Dropbox/pyo_stuff $ ./addsynth.py
pyo version 0.8.0 (uses single precision)
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
>> There is no controls for MidiAdsr object. <<

BTW, that's a typo, should read "there *are* no controls for the MidiAdsr object. :)

Here's my instrument:

#!/usr/bin/env python
from pyo import *
## my own library fro importing scala file scales and converting to frequency lists.
from microtonal import scl2freqs

s = Server(sr=44100, nchnls=2, buffersize=128, duplex=0).boot()
s.setMidiInputDevice(10)

### load your scale here        
my_hz = scl2freqs('carlos_harm.scl')
###
note_table = DataTable(size=len(my_hz), init=my_hz)
mid = Notein(poly=32, scale=0)
adsr = MidiAdsr(mid['velocity'], decay=5.3, sustain=0.1, release=0.2)
adsr.setExp(3)
leftamp = adsr  * 0.1 
rightamp = adsr *  0.1
sine1 = SineLoop(freq=TableIndex(note_table,mid['pitch']),
                 feedback=.3, mul=leftamp)
sine2 = SineLoop(freq=TableIndex(note_table,mid['pitch']),
                 feedback=.3, mul=leftamp)
mix = Mix([sine1, sine2], voices=1)
pan = Pan(mix, outs=2)
verb = Freeverb(pan).out()
sine1.ctrl()
sine2.ctrl()
verb.ctrl() 
adsr.ctrl() 
s.gui(locals())

I can confirm that the following lines are now in my /usr/lib/python2.7/dist-packages/pyolib/midi.py file:

   def ctrl(self, map_list=None, title=None, wxnoserver=False):
        self._map_list = [SLMap(0.0, 1.0, 'lin', 'attack', self._attack, dataOnly=True),
                          SLMap(0.0, 1.0, 'lin', 'decay', self._decay, dataOnly=True),
                          SLMap(0.0, 1.0, 'lin', 'sustain', self._sustain, dataOnly=True),
                          SLMap(0.0, 1.0, 'lin', 'release', self._release, dataOnly=True),
                          SLMap(0.1, 10.0, 'log', 'exp', self._exp, dataOnly=True)
                         ]
        PyoObject.ctrl(self, map_list, title, wxnoserver)

So .... what am I doing wrong.


P.S.: you ought consider wrapping your source code at 80 (79) characters per PEP-8..makes it much easy to read, as well as easier to cut and paste from terminals! :) I write Python for a living, and before I did it for a living, I never used to do that...but trust me, life gets better when you do!


On Tuesday, December 6, 2016 at 10:38:39 AM UTC-6, bela...@gmail.com wrote:

Aaron Krister Johnson

unread,
Dec 6, 2016, 8:44:08 PM12/6/16
to pyo-discuss
Hi Olivier, never mind, it seems that re-running "python setup.py install" refreshed the libraries enough for me to get the new features....odd, b/c I know it ran already. Oh well.

barmin

unread,
Dec 8, 2016, 8:35:05 AM12/8/16
to pyo-d...@googlegroups.com
> I've also added a
> autoNormalize() method to force the waveform between -1 and 1. Not
> hard to do but it is a very cool feature! I attached a little video
> showing this in action!

This is really cool! :-)

Matthieu

Olivier Bélanger

unread,
Dec 8, 2016, 10:15:16 AM12/8/16
to pyo-discuss
Hi,

Done in git. Iter now sends a trigger when it reaches the last value
in the list. It also accepts PyoObjects in the `choice` list. If a
PyoObject with more than one audio streams is given, the streams will
be flattened and inserted in the main list. For example, the choices:

[100, Randi(100,200,4), 200, Sig(250, mul=[1, 2])]

will expand to:

[100, rand_val, 200, 250, 500] # the last two are audio streams.

Olivier

Olivier Bélanger

unread,
Dec 8, 2016, 10:25:00 AM12/8/16
to pyo-discuss
Hi Aaron,

> BTW, that's a typo, should read "there *are* no controls for the MidiAdsr object. :)

Corrected!

> P.S.: you ought consider wrapping your source code at 80 (79) characters per PEP-8..

Yes, I would really like to follow the PEP-8 guidelines, but, ouch,
such a huge job! There is around 200000 lines of code in pyo sources!
One day...!

Olivier



On Tue, Dec 6, 2016 at 8:25 PM, Aaron Krister Johnson

aj sier Noem

unread,
Dec 8, 2016, 3:59:14 PM12/8/16
to pyo-discuss
Olivier,

I'm speechless. Thank you so much.

Aaron Krister Johnson

unread,
Dec 9, 2016, 2:46:57 PM12/9/16
to pyo-discuss
BTW, typo: "There is around 200000 lines of code in pyo sources! " should read: "There *are* around 200000 lines of code in Pyo"

:P

Sorry, couldn't resist making the joke!

Cheers, Olivier!  Vous faites un travail magnifique!

Olivier Bélanger

unread,
Dec 9, 2016, 3:05:52 PM12/9/16
to pyo-discuss
Haha! Nice one! One day someone with a better English than me should
review the whole manual, it would be really good!

Olivier


On Fri, Dec 9, 2016 at 2:46 PM, Aaron Krister Johnson

Darren Sholes

unread,
Sep 28, 2021, 6:19:33 PM9/28/21
to pyo-discuss
I have a feature request to add to the market, but I'm curious what Olivier and others think about it's technical feasibility.

I want to try to use ReaStream on Windows (or AUNetSend on macOS) to send real-time audio from a DAW to a local port (58710 is default for ReaStream), and then use that real-time audio stream as a PYO input. It looks like someone was able to accomplish that with pyaudio (which is basically just a python wrapper for portaudio). This would make it easier (than PyoPlug) to work with any DAW audio in PYO. Specifically, it would allow us to use any VST instrument that can be used in a normal DAW with PYO.

Regarding technical feasibility, can you think of any reason this would add significant latency to input monitoring? Right now, with the ASIO host on Windows or CoreAudio on macOS, I don't have any noticeable input latency in PYO, which is great! 

But if I play through a DAW (also using ASIO), and then send the audio to a local socket port using ReaStream, I wonder if the input latency would render the real-time stream unusable. Note that I'm not trying to route audio between two different machines. I'm just trying to route audio from my DAW into PYO on the same machine.

BlackHole and SoundFlower can accomplish this on macOS, but there isn't an easy equivalent on Windows. I'm a bit worried that there would be some issues with ASIO exclusive mode on a single machine: since the DAW will be using the ASIO + my audio interface, would PYO be able to route low-latency audio to my audio interface still?

Cheers,
Darren

Olivier Bélanger

unread,
Oct 17, 2021, 9:47:45 PM10/17/21
to pyo-d...@googlegroups.com
Hi Darren,

The only latency you'll add to the real-time stream is two audio buffer, one sending the samples, and one for getting the new ones back. The size of buffer mostly depends on your processor...

It seems that what you are looking for is ReaRoute (ReaStream is part of ReaPlugs plug-ins bungle):

https://www.soundonsound.com/techniques/route-master

Never tried, but I don't think there is nothing to do in pyo to get it working!

Olivier


Darren Sholes

unread,
Oct 19, 2021, 2:11:48 PM10/19/21
to pyo-d...@googlegroups.com
Hi Olivier,

Thanks for the response! Makes sense that it would add two audio buffers.

ReaRoute seems like an interesting option, my only concern is I believe it only works with Reaper (i.e. Reaper must be running or involved in the chain somehow). The reason I like the ReaStream idea (or similar) is because ReaStream is offered as a standalone plugin. So someone using FL Studio could also use it to route audio to `pyo`.

For now I'll test out ReaRoute and see if it fits the bill.

Thank you!
Darren

You received this message because you are subscribed to a topic in the Google Groups "pyo-discuss" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/pyo-discuss/pQo5xL2NIO4/unsubscribe.
To unsubscribe from this group and all its topics, send an email to pyo-discuss...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pyo-discuss/CAMXBGhRcO_e0zL3SdPUtTUfOzCcOuf7cdp3UW1%2B5X8zVS2Da%3Dg%40mail.gmail.com.
Reply all
Reply to author
Forward
0 new messages