From:
                                                             8/11/97 3:35 PM
Subject: MAX Digest - 10 Aug 1997 to 11 Aug 1997 - Special
issueTo: Recipients of MAX digests 

There are 11 messages totalling 528 lines in this issue.

Topics in this special issue:

  1. Sub-patches/"stub"
  2. Subpatchers
  3. sequencing
  4. ___HELP: Easy way to filter a list into every other value??___
  5. How to have a menu object switch bet. 1 of 2 item lists???
  6. max to vision - trigger sequences?
  7. Maxplay again
  8. Laser disk/ DVD control
  9. MAC World Expo Report: BeOS DSP Audio
 10. panning function
 11. stubs

----------------------------------------------------------------------

Date:    Mon, 11 Aug 1997 00:58:30 -0400
From:    Tom Ritchford 
Subject: Sub-patches/"stub"

Peter Elsea wrote:
>Both subpatchers and subroutines are best managed by including them from
>the start.

I agree, but surely not every project you write has a complete
spec before you start!

Take a project I did for someone else.  A patch in it contained a coll
and had about a dozen objects.  Perfectly reasonable size for a patcher.

The client looked at the result and decided that elements should
be selected RANDOMLY from the coll.  That one word "randomly" added over
dozen more boxes to the patch so I split it into subpatchers.  But I
introduced a pernicious error that took me a while to track down,
because I flubbed the original abstraction to a subpatcher (one wire got
connected to the wrong inlet.)

>Perhaps there should be an object called "stub". It would take two
>arguments, a number and a symbol. The number would define the number of
>inlets and outlets, the symbol would be the name of the planned subpatcher.
>All the thing would do is pass messages directly from inlet to outlet.

Hmm... even better, why not a patcher called stub that has three
arguments, a symbol and 2 numbers... and does NOTHING.  I usually
would rather my stubs do nothing!  The 2 numbers would be for the
number of inlets and outlets.

This seems easy to write...

    /t

Tom Ritchford                        tomr@interport.net

    Verge's "Little Idiot" -- Music for the mentally peculiar.
1-800-WEIRDOS                       http://www.weirdos.com/verge

------------------------------

Date:    Mon, 11 Aug 1997 02:02:37 -0400
From:    Ed Hartley 
Subject: Subpatchers

In response to the proposed "stub" object that's been getting a lot of
attention:
Fairly soon after I started using MAX, I realized how important subpatchers
were for organizing my work. I usually start a new project by creating empty
subpatchers, naming them by function, assigning inlets and outlets, and
moving them around in the window to create an "outline." It helps me clarify
my thoughts and assess exactly how the final version will operate. From
there
it's just a matter of mechanically filling in the blanks inside the
subpatchers. The hard, conceptual stuff is already done.

But...

What annoys me is that I have to return to the top level patcher whenever I
want to save my work. On a big project, I can have a whole screenfull of
windows open at once and I'd rather not be bothered interrupting myself to
call up the parent patcher just to type  "command-S." (I programed one of my
trackball buttons to save because I've learned the hard way to save often.
Repeat after me... Save Often...) Does this annoy anyone else? The "stub"
object doesn't really excite me but I would love an option, say, in the
OPTIONS menu that would interpret save commands as referring to the
uppermost
parent of the active subpatcher. It seems to me that the current system that
calls up the "save as" dialog  box is counterintuitive. Why should it be
easier to save subpatchers than their parent patchers ? Thoughts? Comments?

Ed Hartley

------------------------------

Date:    Mon, 11 Aug 1997 09:07:49 +0200
From:    Oeyvind Brandtsegg 
Subject: sequencing

Hi dear max'ers

I'm currently in the process of learning what max is capable of doing,
and encountered the following problem:
I want to record a midi-sequence involving pitch-bend while holding a
note. I used the seq object for this. What should I use to be able to
record a sequence such as this, and be able to edit it after recording ?
I tried detonate too, but I couldn't find a way to record both notes and
pitchbend in detonate.

Is there a way around this problem, using max ?

Oeyvind Brandtsegg (Composer/Vibraphone)
Nedre Bakklandet 47 A
7014 Trondheim
Norway
mailto:obrandts@sn.no

------------------------------

Date:    Mon, 11 Aug 1997 12:02:23 +0200
From:    dudas 
Subject: ___HELP: Easy way to filter a list into every other value??___

>>Q1. Is there an 'easy' way to pass an n-long
>>    list L of ints (L[0], L[1], L[2], ..., L[n-1])
>>    through some simple object which in turn
>>    outputs a new list X, half the length of L
>>    and consisting of every other value of the
>>    input list L ?   (ie X[1], X[3], ..., X[n-1] )
>> ai@wco.com

>If it's not time critical (i.e. if you have 5 ms to spare) you can use
>"thresh" to recombine iterated items into lists fairly easily, without
>knowing the exact length.
>Stephen Kay

There's no really easy or intuitive way, and I don't think adding 5ms is an
acceptable solution.  Objects like 'thresh' or 'delay' should really only
be used when you want to deal with time, not for adding a "fudge factor".
There's _always_ a way to process the data you want without introducing any
kind of a delay (using wierd combinations of 'iter', 'trigger' and
'prepend', for example).

Here's a patch with two solutions to the problem - one that only uses
standard Max objects, the other that uses the 'position' object found in
the McCartney ListOps collection. There are probably a billion other
vartiations possible. The old 'prepend append' trick is a great way to
group numbers into a list as fast as possible without adding any timed
delay.

Have fun!

-R
(as usual, cut and paste the following into a text doc.)
-------------------------------------------------------------------
max v2;
#N vpatcher 398 66 940 635;
#N vpatcher 282 90 1013 548;
#P newex 306 156 75 196617 prepend append;
#P message 306 182 291 196617;
#P message 351 117 22 196617 set;
#P newex 259 42 40 196617 b 3;
#P message 230 200 291 196617;
#P newex 230 156 75 196617 prepend append;
#P outlet 131 374 15 0;
#P outlet 73 374 15 0;
#P inlet 73 38 15 0;
#P newex 73 352 43 196617 position;
#P newex 274 65 43 196617 Uzi 128;
#P newex 306 109 27 196617 * 2;
#P newex 306 87 27 196617 - 1;
#P newex 306 131 27 196617 + 1;
#P newex 131 352 43 196617 position;
#P newex 259 19 45 196617 loadbang;
#P comment 383 62 173 196617 this is the initialization part (which is
performed only once when you open the patch). to see what it does \, click
on the set message \, then double-click on the loadbang object...;
#P comment 206 349 273 196617 the position object only handles up to 256
element lists... (as is the case with the majority of list objects in Max);
#P connect 2 0 14 0;
#P connect 5 0 6 0;
#P connect 7 2 5 0;
#P connect 6 0 12 0;
#P connect 6 0 4 0;
#P connect 4 0 17 0;
#P connect 17 0 16 0;
#P connect 14 0 13 0;
#P connect 14 1 7 0;
#P connect 14 0 16 0;
#P connect 14 2 15 0;
#P connect 8 0 10 0;
#P connect 13 0 8 1;
#P connect 12 0 13 0;
#P connect 15 0 13 0;
#P connect 15 0 16 0;
#P connect 16 0 3 1;
#P connect 3 0 11 0;
#P connect 9 0 8 0;
#P connect 9 0 3 0;
#P pop;
#P newobj 65 397 102 196617 patcher everyother2;
#P message 65 353 254 196617 78 1655 64 4 66 564 150 54 31 61 2 68 65 4 7 6
89;
#P message 33 323 375 196617 335 33 754 153 3 64 750 309 154 589 61 7 42 5
54 78 87 80 83 35 95 67 69 214 93 44 430 732 898 219 885 24 334 314 559 52
23 424 523 16 705 30 98;
#P message 87 371 98 196617 56 329 484 494 51;
#P newex 157 424 60 196617 prepend set;
#P message 157 453 246 196617;
#P message 79 131 98 196617 56 329 484 494 51;
#P message 25 83 375 196617 335 33 754 153 3 64 750 309 154 589 61 7 42 5
54 78 87 80 83 35 95 67 69 214 93 44 430 732 898 219 885 24 334 314 559 52
23 424 523 16 705 30 98;
#P message 142 241 289 196617;
#P newex 142 187 60 196617 prepend set;
#P newex 57 187 60 196617 prepend set;
#P message 57 221 289 196617;
#N vpatcher 396 213 805 620;
#P message 189 135 22 196617 set;
#P inlet 58 45 15 0;
#P newex 103 91 25 196617 iter;
#P newex 120 134 66 196617 counter;
#P newex 58 68 100 196617 t b l b;
#P newex 103 112 27 196617 t i b;
#P newex 120 158 27 196617 % 2;
#P newex 78 212 35 196617 gate 2;
#P newex 120 181 27 196617 + 1;
#P newex 78 236 75 196617 prepend append;
#P message 38 280 232 196617;
#P message 103 300 232 196617;
#P newex 103 257 75 196617 prepend append;
#P outlet 38 357 15 0;
#P outlet 103 357 15 0;
#P comment 245 64 100 196617 this has to iterate each incoming list and
count its elements before splitting them up into two lists.;
#P comment 215 172 157 196617 maybe it's a a few nanoseconds slower than
the second example \, but it does not rely on "3rd party" objects.;
#P connect 5 0 2 0;
#P connect 7 0 6 0;
#P connect 4 0 5 0;
#P connect 8 0 9 0;
#P connect 9 0 7 0;
#P connect 9 1 4 0;
#P connect 10 0 8 0;
#P connect 11 0 9 1;
#P connect 11 1 13 0;
#P connect 12 0 6 0;
#P connect 12 1 14 0;
#P connect 12 0 5 0;
#P connect 12 2 13 2;
#P connect 12 2 16 0;
#P connect 13 0 10 0;
#P connect 14 0 11 0;
#P connect 6 0 3 0;
#P connect 16 0 6 0;
#P connect 16 0 5 0;
#P connect 15 0 12 0;
#P pop;
#P newobj 57 157 95 196617 patcher everyother;
#P message 57 113 254 196617 78 1655 64 4 66 564 150 54 31 61 2 68 65 4 7 6
89;
#P message 65 474 246 196617;
#P newex 65 424 60 196617 prepend set;
#P comment 155 159 295 196617 <- this version uses only objects that come
with max!;
#P comment 171 395 323 196617 <- this version uses the '3rd party' object
'position' found in James McCartney's ListOps&tc collection (on the Max 3.5
CD ROM);
#P comment 66 35 140 196617 look inside the sub-patchers!!;
#P connect 16 0 18 0;
#P connect 17 0 18 0;
#P connect 3 0 4 0;
#P connect 5 0 6 0;
#P connect 6 0 8 0;
#P connect 6 1 9 0;
#P connect 8 0 7 0;
#P connect 9 0 10 0;
#P connect 14 0 13 0;
#P connect 12 0 6 0;
#P connect 18 0 3 0;
#P connect 18 1 14 0;
#P connect 11 0 6 0;
#P connect 15 0 18 0;
#P pop;
-------------------------------------------------------------------

------------------------------

Date:    Mon, 11 Aug 1997 11:03:29 -0000
From:    Nick Rothwell 
Subject: Re: How to have a menu object switch bet. 1 of 2 item lists???

> The bpatcher was buggy in 2.5.2 and stable in 3.0.  I use it
> extensively = in 3.0 without any problems.

Curiously, I discovered a repeatable way to crash'n'burn it
yesterday. Create a bpatcher, set the "embed in patcher" flag (aside:
I have no idea what this actually means), then command-click the white
space of the bpatcher.

I don't know whether this is different in 3.5.

--
         Nick Rothwell, CASSIEL        contemporary dance projects
         http://www.cassiel.com        music synthesis and control

             years, passing by, VCO, VCF, and again, and again

------------------------------

Date:    Mon, 11 Aug 1997 08:35:11 -0400
From:    Jeremy Roberts 
Subject: Re: max to vision - trigger sequences?

>To prevent a loop disable IAC as a controller in MAX.

Aha! Thanks... that's where I didn't have it set right. Thanks, Terry.

JR

------------------------------

Date:    Mon, 11 Aug 1997 11:50:46 -0400
From:    muhenry 
Subject: Maxplay again

I know its an old subject, but is there anywhere on the web that  someone
can down load a copy of MAXplay?  Shouldn't Opcode do this or is there still
some kind of propiatary or copyright problems, (or does anyone actually
know?)? My interest is that my Max programs are getting past the 1 meg
mark with all the snd. files and graphics. Making an application adds
another half meg to what is there anyway, making  a down load a pretty
time and memory consuming ordeal for a lot of people . If there was just
one site where an interested party might download Maxplay , it would
increase the availability and popularity of Max programs IMHO. OK, I know
you can download for example, the Random application from Opcode and by
closing the patch you can open any  other MAX patch just like MAXplay.
However, this seems rather cumbersome, and roundabout and not exactly
upfront. Solutions, comments, info anybody?

Regards, Otto

------------------------------

Date:    Mon, 11 Aug 1997 12:20:49 -0400
From:    Dan Jamele 
Subject: Laser disk/ DVD control

In a message dated 8/11/97 2:20:54 AM, you wrote:

<>

Jeremy,

We use laser disk players all around the world for things like this, with
and
without MAX, which works great by the way.  Call me or email me directly and
I'll be glad to help you out.  We're also a Pioneer dealer so we can sell
you
the proper player also!

BTW, did anyone notice the Panasonic booth at SIGGRAPH last week?  A DVD
player with RS232 control and a rack mount kit.  List at about $750.00!
WOW.
 Anyone want to go in with me on the $100K+ DVD authoring system?

Dan Jamele
MediaMation(TM) Inc
2461 W, 205th St. # B-100
Torrance,
CA. 90501
USA
310-320-0696  Phone
310-320-0699  Fax
mediamat@aol.com  (email)
www.mediamat.com   (crummy old web page to be updated soon)

------------------------------

Date:    Sun, 10 Aug 1997 10:24:06 +0000
From:    Johnny DeKam 
Subject: MAC World Expo Report: BeOS DSP Audio

I've just returned from Mac World Expo in Boston this weekend and felt
the need to report to you all some very interesting developments on the
Macintosh platform.

You have no doubt heard about the BeOS - a new OS built from the ground
up for Power PC, which leaves MacOS in the dust in terms of
performance.  For those who don't know about it, heres a few tid-bits...

BeOS feels very much like a cross between MacOS and Xwindows (Motif) -
taking the best of both interfaces.

It is TRUE premptive mutli-tasking across the whole OS. (I gasped as I
watched no less than 12 applications run at the same time - including
audio, quicktime & even Mandelbrot fractal calculations/displays.

BeOS is TRUE object oriented programming.  My best example of this is
that the BeOS equivelant of extensions ("parts") - the bits of code
which give functionality to the OS, can be enabled or disabled without
rebooting the machine.  Just drag a part in to do something new.
Similiar to OpenDOC - except the whole OS works this way.

BeOS takes all of 15 seconds to boot on restart.

You can run both MacOS and BeOS on the same machine, and choose which
one to run at startup.

There is much more I could tell you, but your wondering what does this
have to do with us?
And by the way, the OS sounds great but there are no applications
right?  wrong!

The reason I write this report to you is because I saw an amazing
audio/DSP program written for the BeOS
called "Audio Elements" by Adamation Software.
 Audio Elements is an object-oriented, data processing framework
designed for
musicians, sound engineers, and others who work with sound synthesis and
special effects.
You can also use Audio Elements to teach digital signal processing
(DSP), develop new DSP
algorithms, create physical models, or design synthesizers or effects
processors.

It reminded very much of TurboSynth and MAX, but much nicer.  It now has
MIDI support for processing audio in realtime, but this needs further
development.  Currently Audio elements comes with about 50 or so objects
for manipulating sound in realtime.  You can take an AIFF file, build
your hierarchy of objects and end with the speaker object and Disk
object to process live to disk.

I don't want to get to much more into it, only to say that BeOS is free
right now, and audio elements costs only $60 (can you say 'early
adopter'?)  There are also alot of other MIDI and Sound apps being
developed for Be including Csound, some sequencing and algorythmic MIDI
apps.  Most of it is free.  Apparently writing apps for Be is a breeze
due to its open architecture.

By the way, BeOS has just been ported to the Intel Processor... these
guys are serious about their OS!

A quick visit to the BeOS Home page will tell you alot more.
http://www.be.com

My dream?  MAX ported to the BeOS.    Give it a whirl!

-- Johnny DeKam - iEAR Studios

PS You need a 603 or 604 family processor to run Be.  (That is the irony
- I'm talking this up, and I can't even run it at home on my 7200!)

------------------------------

Date:    Mon, 11 Aug 1997 22:23:05 +0200
From:    "Dr. K@rlheinz Essl" 
Subject: panning function

Dear MAXers!

I am currently working on a spatialisation patch for the "niche audio
control module" - a neat device which allows you to control the level of 8
audio inputs by MIDI control messages...

At the first step, I wanted to achieve a simple left-right panoramisation
of a mono signal according to the following patch:

max v2;
#N vpatcher 50 40 201 363;
#P comment 60 257 30 196617 level right;
#P comment 21 257 30 196617 level left;
#P user uslider 67 187 13 48 128 1 0 0;
#P user uslider 25 187 13 48 128 1 0 0;
#P newex 25 117 34 196617 - 127;
#P newex 25 140 29 196617 * -1;
#P number 25 164 35 9 0 0 1 3;
#P number 25 84 35 9 0 0 1 3;
#P user hslider 25 54 15 63 128 1 0 0;
#P comment 25 33 78 196617 L <<<<< >>>>> R;
#P connect 2 0 5 0;
#P fasten 2 0 7 0 30 108 72 108;
#P connect 1 0 2 0;
#P connect 5 0 4 0;
#P connect 4 0 3 0;
#P connect 3 0 6 0;
#P pop;

But now it appears that the overall energy of the source is not constant
when moving the panorama - i.e. in the absoulte middle the sound is softer
than if you push it towards the left or right.

I recall an old wisdom of sound engineers that in this case the linear
function has to be replaced by a - cosine? I don't remember...

As I know that there are people on this list who have gained more knowledge
in this field, could one nice soul out there help me with a little example
patch?

Cordially,

Dr. K@rlheinz Essl
SAMT - Studio for Advanced Music & Media Technology
Bruckner-Konservatorium Linz / Austria
www:   http://www.ping.at/users/essl/index.html

________________________________________________________________________
     Visit the MindShipMind - an interactive multimedial Web Oracle
          http://www.ping.at/users/essl/works/mindshipmind.html
________________________________________________________________________

------------------------------

Date:    Mon, 11 Aug 1997 13:35:37 -0700
From:    Peter Elsea 
Subject: stubs

Garth Paine asks:
>I don't quite follow this idea.  Where do the objects that make up the
>subpatch go?  How do you connect the output of the sub-patchto the output
>of your "stub" object?

The idea comes from a trick we use in C code- when we want to test code
that includes calls to a function we haven't gotten around to writing yet,
we write a dummy function or "stub" with nothing but the name and argument
list. It does nothing, but you can compile and run the rest of your code.

Stub would work this way- suppose I was trying to detect rhythm patterns by
taking the delta time output from Borax to a match. I know this would work
better with some kind of quantizing, but I don't want to fuss with that
now, so I  put a [stub 1 quantize] in. Stub just passes data through so I
can test the rest of the patch. The symbol quantize reminds me that a
quantize subpatcher should go there. After I write the subpatcher, I change
the name of the stub to [quantize] and the subpather is in place. Actually,
it doesn't really have to be an object. Make yourself a subpatcher called
stub with maybe 5 inlets and outlets and try it out.

Speaking of Borax, I'm writing another tutorial. Does anyone know how Borax
got its name?

Peter Elsea
Electronic Music Studios
University of California, Santa Cruz
http://arts.ucsc.edu/EMS/Music/index.html
 elsea@cats.ucsc.edu

------------------------------

End of MAX Digest - 10 Aug 1997 to 11 Aug 1997 - Special issue
**************************************************************