Csound Csound-dev Csound-tekno Search About

how to pipe -L events in linux/unix

Date1998-06-15 18:43
FromPaul Winkler
Subjecthow to pipe -L events in linux/unix
I'm new to C programming. I'm trying to make a test program write a 
series of csound score events to somewhere csound can read them in 
realtime (by using the -L flag). So far the only thing that works is to 
do "foobar | csound -L etc..." which is not what I want, because 
eventually I want foobar to accept some user commands before starting 
csound itself via system(). I tried doing that and having my app just 
printf() the score events to standard output. Doesn't work: csound does 
in fact start, but it seems to ignore the score events even though I see 
them on stdout. Of course then I realized why -- the pipe's missing!

I know there's a way to do this, and I think it has to do with mkfifo or 
popen or something, but my limited C/unix knowledge is hampering me and 
I can't seem to figure it out from my big fat C book ("A Book on C" by 
Kelley & Pohl).

Can anyone sketch out a basic method to use for this? What device to I 
want to use with the -L flag, and how do I get my code to write to it? 

Point me to some tutorials, man pages, or anything else useful... or 
just send me a few lines of code and I'll figure it out from there...

thanks,

PW 

______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com

Date1998-06-16 07:49
FromJens Kilian
SubjectRe: how to pipe -L events in linux/unix
> I know there's a way to do this, and I think it has to do with mkfifo or 
> popen or something, but my limited C/unix knowledge is hampering me and 
> I can't seem to figure it out from my big fat C book ("A Book on C" by 
> Kelley & Pohl).

popen() is what you want.

popen() combines system() with fopen():

        FILE *fp = popen("csound -L ...", "w");

        fprintf(fp, "score event", ...);

        pclose(fp);

HTH,
        Jens.
--
mailto:jjk@acm.org                 phone:+49-7031-14-7698 (HP TELNET 778-7698)
  http://www.bawue.de/~jjk/          fax:+49-7031-14-7351
PGP:       06 04 1C 35 7B DC 1F 26 As the air to a bird, or the sea to a fish,
0x555DA8B5 BB A2 F0 66 77 75 E1 08 so is contempt to the contemptible. [Blake]

Date1998-06-16 07:58
FromNicola Bernardini
SubjectRe: how to pipe -L events in linux/unix
On Tue, 16 Jun 1998, Jens Kilian wrote:

> > I know there's a way to do this, and I think it has to do with mkfifo or 
> > popen or something, but my limited C/unix knowledge is hampering me and 
> > I can't seem to figure it out from my big fat C book ("A Book on C" by 
> > Kelley & Pohl).
> 
> popen() is what you want.
> 
> popen() combines system() with fopen():
> 
>         FILE *fp = popen("csound -L ...", "w");
                                      ^^^
				      ^^^
precisely, what name would you put there for a device? I tried making a
fifo queue with mkfifo, then piping data into it, then opening
csound -L fifo etc. etc. but it does'nt work. It says:

Csound Version 3.482
(Jun  5 1998)
orchname:  osc.orc
realtime performance using dummy numeric scorefile
orch compiler:
13 lines read
instr   1
MIT Csound: 3.482 (Jun  5 1998)
orch now loaded
displays suppressed
stdmode = 00000000 Linefd = 3
audio buffered in 1024 sample-frame blocks
WARNING: Sample rate set to 44194 (instead of 44100)
hardware buffers set to 2048 bytes
writing 2048-byte blks of shorts to devaudio (IRCAM)
cannot reopen (null)
stdmode = 00000000 Linefd = 3

and quits. Of course if we were to use real unix facilities, we should
be doing something like this:

echo "i1, f1, etc. blah blah" | csound -do devaudio -L - orc.orc

where the '-' after the -L, as in all unix utilities would be intended
to be 'stdin' because there is no name for stdin since it can be the
tty you're working on *OR* a redirected file *OR* a pipe etc. (everything
is automatically handled by your shell so there's no single stdin
device). Not yet implemented perhaps?

> 
>         fprintf(fp, "score event", ...);
> 
>         pclose(fp);

Yes and there would be no need for C programming at all, BTW.

Nicola

------------------------------------------------------------------------
Nicola Bernardini
E-mail: nicb@axnet.it
 
Re graphics: A picture is worth 10K words -- but only those to describe
the picture.  Hardly any sets of 10K words can be adequately described
with pictures.

Date1998-06-16 09:36
FromJens Kilian
SubjectRe: how to pipe -L events in linux/unix
> >         FILE *fp = popen("csound -L ...", "w");
>                                       ^^^
>                                     ^^^
> precisely, what name would you put there for a device? I tried making a
> fifo queue with mkfifo, then piping data into it, then opening
> csound -L fifo etc. etc. but it does'nt work.

It should be whatever causes Csound to read from stdin.  I don't recall
offhand if that's even possible.  Perhaps "stdin" or "console"?
(It *should* be "-", of course.)

> where the '-' after the -L, as in all unix utilities would be intended
> to be 'stdin' because there is no name for stdin since it can be the
> tty you're working on *OR* a redirected file *OR* a pipe etc. (everything
> is automatically handled by your shell so there's no single stdin
> device). Not yet implemented perhaps?

I think that at least some Csound versions can read from stdin, but don't call
it "-".

Bye,
        Jens.
--
mailto:jjk@acm.org                 phone:+49-7031-14-7698 (HP TELNET 778-7698)
  http://www.bawue.de/~jjk/          fax:+49-7031-14-7351
PGP:       06 04 1C 35 7B DC 1F 26 As the air to a bird, or the sea to a fish,
0x555DA8B5 BB A2 F0 66 77 75 E1 08 so is contempt to the contemptible. [Blake]