From: owner-sc-users-digest@lists.io.com (sc-users-digest) To: sc-users-digest@lists.io.com Subject: sc-users-digest V1 #54 Reply-To: sc-users Sender: owner-sc-users-digest@lists.io.com Errors-To: owner-sc-users-digest@lists.io.com Precedence: bulk sc-users-digest Thursday, August 12 1999 Volume 01 : Number 054 ---------------------------------------------------------------------- Date: Wed, 4 Aug 1999 03:25:06 -0500 From: Kenneth N Babb <---@---.---> Subject: Re: Prime Numbers >>>> Man that was hard to read...! (tiny font) <<<<<<<< Sorry. >>>> How many primes do you need? If less that 256 you can generate them directly : Routine.new({ 256.do({ arg i; i.nthPrime.yield; }); }); nthPrime uses a look up table for the first 256 primes. <<<<<<<< Cool...! This will do fine. All sorts of niffty things in SC. Thanks, Kenneth >>>> If you still need a filter you could add this method to class Integer : isPrime { // this method fails for numbers greater // than (1619 * 1619) == 2621161 var sqrtThis; if ( this <<= 2, { if (this == 2, { ^true }, { ^false }); }); sqrtThis = this.sqrt.asInteger; 256.do({ arg i; var p; p = i.nthPrime; if (this % p == 0, { ^false }); if (p >= sqrtThis, { ^true }); }); ^nil // failure } <<<<<<<< >>>> ------------------------------ Date: Wed, 04 Aug 1999 12:28:57 +0100 From: "simon" <---@---.---> Subject: I like supercollider Hello,JM Can you tell me my serial No. if it still exists as I can't get 2.1.9 to work I've been playing with other software for some time but I'm back to SC!!! .;-/=oCC&CCo=/-;. +=&AB@@@@@@@@@@@@@@@@@XA&=+ X@@@@@@X8&=>//"""//>=&%B@@@@@@$ /%@@@@BA= oAB@@@@A+ &$@@@Ao" -=%@@@$& -%@@@B= >B@@@A- "CB@@&> >&@@@C" @@@X- -X@@@C C@@@& &@@@& B@@X> >X@@B B@@8 CB@@@@@@@@@@@@@@@@@@@@@@@@@@X& 0@@B $@@B; B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B+ ;B@@B C@@8 &@@@@@@@@@@@@@@@@@B@@@@@@@@@@@@@@@% ;0@@& "@@X C@@@@@@@@@@@@@@@%: /@@@@@@@@@@@@@@@ X@@" :X@@= B@@@@@@@@@@@@@& -@@@@@@@@@@@@@@@A o@@A. C@@B; CC&&&&&&&C> %@@@@@@@@@@@@@@@@= ;@@@C @@@o :8@@@@@@@@@@@@@@@@@@/ o@@@ @@B: B@@@@@XCC8@@@@@@@@@@B -@@@ o@@X X@@@@@& =@@@@@@@@@@& X@@= C@@A ;A@@@@@@0 0@@@@@@@@@$ %@@o &@@8 B@@@@@@@@C C@@@@@@@@@C 8@@o C@@% $@@@@@@@@@= &@@@@@@@@@ %@@o o@@X ;%@@@@@@@@B> o@@@@@@@@C X@@= @@B. B@@@@@Xo o@@@@@@@B- ;@@@ @@@/ A@@@@@C o@@@@@@@A >@@@ A@@A. X@@@@8/ "B@@@@@@0 :$@@0 "@@@+ %@@@@= /@@@@@@@ =@@B; o@@8 B@@B> >@@@@@@& A@@> %@@o => -X@@@@@" 0@@0 @@@% -@@@@@B- :$@@B +@@@o "@@@@@= &@@B >@@@&- /&%&/ +%@@B X@@@> o@@@0 %@@@C: ;%@@@C =A@@$= /CB@@0/ +B@@@8 X@@@B/ >A@@@B&+ >0@@@B% :oB@@@@AC &$@@@@B=. 0@@@@@@B%o=/";::..:;"+==0B@@@@@@& =C%$@@@@@@@@@@@@@@@@@@@B%C= .;">o&0888800&o+";. > > > ------------------------------ Date: Wed, 04 Aug 1999 16:43:29 +0100 From: Martin Robinson <---@---.---> Subject: Ambisonic manipulations and decoder (Thanks James for the ZeroCrossing-filter-blowing tip.) I've just finished the first bit of an Ambisonic decoder and processor that I've been working on. Once you've added the following methods to the Array Class you can do send the 'decodeB' method to the output of PanB. i.e. PanB.ar(in, az, el, gain).decodeB By default this outputs eight channels and assumes that the speakers are located at the corners of a cube. However, you can supply an array as an argument to 'decodeB' telling it where your speakers are located (at the moment they all have to be on the surface of an imaginary sphere - until I compensate for timing delays between speakers at different distances). e.g. PanB.ar(in, az, el, gain).decodeB( [[pi/2, 0],[pi, 0],[-pi/2, 0],[0, 0],[0, pi/2],[0, -pi/2]]) Would output six channels where speakers are placed directly infront, hard right, directly behind, hard left, directly above, and directly below(!!) (in that order). I've also added methods to perform soundfield manipulations on a B format signal. rotateB(ang) rotates the image around the vertical axis by the angle ang, tiltB(ang) rotates the image around the front-back axis and tumbleB(ang) rotates the image around the left-right axis. PanB.ar(in, az, el, gain).rotateB(pi/4).decode Rotates and decodes the b format signal. manipulateB(rotA, tilA, tumA) does all three of these manipulations. These processes will probably work best if you have a number of PanB's mixed. My maths may be a bit dodgy, any help would be appreciated. It's mostly taken from a paper by Dave Malham at: http://www.york.ac.uk/inst/mustech/3d_audio/ambis2.htm I bodged around with figures until they fit to work out the algorithm to allow speakers at any position (rather than at the corners of a cube) so that bit may be sketchy. The methods..... // decode B Format decodeB { arg posArray; // posArray should be an array or nil (default) // each element is also an array // [ // [azimuth, elevation], // [], ... [] // ] // azimuth == 0 -> left // azimuth == pi -> right // azimuth == pi/2 -> front // azimuth == -pi/2 -> back etc.. // elevation == 0 -> ear-level front // elevation == pi -> ear-level back // elevation == pi/2 -> directly above // elevation == -pi/2 -> directly below // NOTE: if elevation is pi/2 or -pi/2 // azimuth is irrelevant so use 0 var aw, ax, ay, az, spkrPos; if(posArray.isNil, { spkrPos = [ [pi/4, pi/4], // left-front-upper [3pi/4, pi/4], // right-front-upper [-3pi/4, 3pi/4], // right-rear-upper [-pi/4, 3pi/4], // left-rear-upper [pi/4, -pi/4], // left-front-lower [3pi/4, -pi/4], // right-front-lower [-3pi/4, -3pi/4],// right-rear-lower [-pi/4, -3pi/4] // left-rear-lower ]; }, { spkrPos = posArray } ); ^spkrPos.collect({ arg item, i; var xc, yc, zc; xc = (item.at(0).sin*(item.at(1)).cos.abs); yc = (item.at(0).cos*(item.at(1)).cos.abs); zc = item.at(1).sin; Mix.ar([ 1, xc.abs.sqrt*xc.sign, yc.abs.sqrt*yc.sign, zc ]*this) }); } // Soundfield Manipulations rotateB { arg ang; var aw, ax, ay, az; aw = this.at(0); ax = this.at(1); ay = this.at(2); az = this.at(3); ^[ aw, (ax*ang.cos)-(ay*ang.sin), (ax*ang.sin)+(ay*ang.cos), az ] } tiltB { arg ang; var aw, ax, ay, az; aw = this.at(0); ax = this.at(1); ay = this.at(2); az = this.at(3); ^[ aw, ax, (ay*ang.cos)-(az*ang.sin), (ay*ang.sin)+(az*ang.cos) ] } tumbleB { arg ang; var aw, ax, ay, az; aw = this.at(0); ax = this.at(1); ay = this.at(2); az = this.at(3); ^[ aw, (ax*ang.cos)-(az*ang.sin), ay, (ax*ang.sin)+(az*ang.cos) ] } manipulateB { arg rotA, tilA, tumA; ^this.rotateB(rotA).tiltB(tilA).tumbleB(tumA) } >>>>>>Martin Robinson :: (Ex)tractor :: && ________ >>><<<_sonicArts.at(middlesexUniversity.london.uk); ______ <><><>__this.liveElectronics.interFaces.diffusion ____ >><<>>___Extractor.at(bigChill_(enchantedGarden).6-8.aug.99) ___ || ------------------------------ Date: Fri, 6 Aug 1999 16:19:10 +0100 From: Arie van Schutterhoef <---@---.---> Subject: Re:Thanks for the help with Tspawn-DelayWr-TapL. James and Alberto, On behalve of Pieter and Hans thanks for your responses; Coming Sunday we'll be scratching our heads again over this problem and things become clearer... We'll keep you posted AvS >Hi all, dear Pieter, >I have been working on something similar that may solve >your problem. > >If it does not let me know. >Best wishes, >Alberto de Campo >>Or: is it maybe possible when we force the sub-synths to >>have the same block sizes? > >This is the default case anyway, but it doesn't help here. >The main problem is that the spawned synth starts at a later >time than the delaywr and doesn't know its current state. >Also the spawned synth starts at some sample offset to the >parent. For the next release I have added a flag to turn the >sample accurate scheduling off and make the buffers align, >but that still doesn't help the tap know where the delaywr is. <<<<<<<<<<<<<<<<<<<<<<<<<-////||\\\\->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Arie van Schutterhoef artistic director Schreck Ensemble # -laboratory for live electro-acoustic music- # The Netherlands e-mail:arsche@stad.dsl.nl http://www.xs4all.nl/~schreck/ Tel: 00-31-71-5612287 Fax: 00-31-70-3859268 <<<<<<<<<<<<<<<<<<<<<<<<<-////||\\\\->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ------------------------------ Date: Fri, 6 Aug 1999 22:13:09 -0500 From: Kenneth N Babb <---@---.---> Subject: In C pattern programing exercise Hello All, I'm working on a couple of pattern programing exercises, as in this "In C" example. Before I move on with it, are there any suggestions to make coding this any more efficient, or perhaps offer a better approach. I'm is the intial stage of this project and I'm focused at the moment on getting the pattern material programed. I will then turn some attention to other issues such as instruments, nuance in rhythmic pattern, additional voices, etc. Thanks. ( BBBB,0000,0000/* In C Parallel Patterns */ var instr1, instr2, instr3; instr1 = Pseq( [ Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 1.0, 0.3, 1.0, 0.3, 1.0 ], 1 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1, 0.1, 0.1 ], 1 ), 0000,7777,0000\midinote, Pseq(#[60, 64 ], 3) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 0.5, 0.5, 1.0 ], 2 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[60, 64, 65, 64 ], 2) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 64, 65, 64 ], 2)); Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 64, 65, 67 ], 2)); Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5], 2 ), 0000,7777,0000\legato, Pseq([ 0.1, 0.1, 0.1, \rest ], 2 ), 0000,7777,0000\midinote, Pseq(#[ 64, 65, 67, \rest ], 2)) ]); instr2 = Pseq( [ Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 1.0, 0.3, 1.0, 0.3, 1.0 ], 1 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1, 0.1, 0.1 ], 1 ), 0000,7777,0000\midinote, Pseq(#[48, 52 ], 3) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 0.5, 0.5, 1.0 ], 2 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[48, 52, 53, 52 ], 2) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 52, 53, 52 ], 2)); Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 52, 53, 55 ], 2)); Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5], 2 ), 0000,7777,0000\legato, Pseq([ 0.1, 0.1, 0.1, \rest ], 2 ), 0000,7777,0000\midinote, Pseq(#[ 52, 53, 55, \rest ], 2)) ]); instr3 = Pseq( [ Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 1.0, 0.3, 1.0, 0.3, 1.0 ], 1 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1, 0.1, 0.1 ], 1 ), 0000,7777,0000\midinote, Pseq(#[72, 76 ], 3) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 0.5, 0.5, 1.0 ], 2 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[72, 76, 77, 76 ], 2) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 76, 77, 76 ], 2)); Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 76, 77, 79 ], 2)); Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5], 2 ), 0000,7777,0000\legato, Pseq([ 0.1, 0.1, 0.1, \rest ], 2 ), 0000,7777,0000\midinote, Pseq(#[ 76, 77, 79, \rest ], 2)) ]); Ptpar([ 0.0, instr1, 4.0, instr2, 8.0, instr3 ] ).play(Event.protoEvent); ) Regards, Kennth Babb ------------------------------ Date: Fri, 6 Aug 1999 22:44:54 -0500 From: Kenneth N Babb <---@---.---> Subject: Re: In C pattern corrections Sorry, There were a couple of misplaced semicolons in previous example. ( BBBB,0000,0000/* In C Parallel Patterns */ var instr1, instr2, instr3; instr1 = Pseq( [ Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 1.0, 0.3, 1.0, 0.3, 1.0 ], 1 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1, 0.1, 0.1 ], 1 ), 0000,7777,0000\midinote, Pseq(#[60, 64 ], 3) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 0.5, 0.5, 1.0 ], 2 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[60, 64, 65, 64 ], 2) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 64, 65, 64 ], 2)), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 64, 65, 67 ], 2)), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5], 2 ), 0000,7777,0000\legato, Pseq([ 0.1, 0.1, 0.1, \rest ], 2 ), 0000,7777,0000\midinote, Pseq(#[ 64, 65, 67, \rest ], 2)) ]); instr2 = Pseq( [ Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 1.0, 0.3, 1.0, 0.3, 1.0 ], 1 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1, 0.1, 0.1 ], 1 ), 0000,7777,0000\midinote, Pseq(#[48, 52 ], 3) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 0.5, 0.5, 1.0 ], 2 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[48, 52, 53, 52 ], 2) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 52, 53, 52 ], 2)), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 52, 53, 55 ], 2)), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5], 2 ), 0000,7777,0000\legato, Pseq([ 0.1, 0.1, 0.1, \rest ], 2 ), 0000,7777,0000\midinote, Pseq(#[ 52, 53, 55, \rest ], 2)) ]); instr3 = Pseq( [ Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 1.0, 0.3, 1.0, 0.3, 1.0 ], 1 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1, 0.1, 0.1 ], 1 ), 0000,7777,0000\midinote, Pseq(#[72, 76 ], 3) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.3, 0.5, 0.5, 1.0 ], 2 ), 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[72, 76, 77, 76 ], 2) ), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 76, 77, 76 ], 2)), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5 ], 2 ), 0000,7777,0000\legato, Pseq([\rest, 0.1, 0.1, 0.1 ], 2 ), 0000,7777,0000\midinote, Pseq(#[\rest, 76, 77, 79 ], 2)), Pbind( 0000,7777,0000\tempo, 2.7, 0000,7777,0000\dur, Pseq([ 0.5, 0.5, 0.5, 0.5], 2 ), 0000,7777,0000\legato, Pseq([ 0.1, 0.1, 0.1, \rest ], 2 ), 0000,7777,0000\midinote, Pseq(#[ 76, 77, 79, \rest ], 2)) ]); Ptpar([ 0.0, instr1, 4.0, instr2, 8.0, instr3 ] ).play(Event.protoEvent); ) ------------------------------ Date: Sat, 7 Aug 1999 13:22:23 +1000 From: Garth Paine <---@---.---> Subject: Addressing OMS ports I have noticed the following in the start-up routine for SC in the last couple of versions, but I can't find a variable for OMS port in any of the MIDI controller objects - am I missing something obvious or are they not their yet? I had assumed the index number would be a way of addressing a particular OMS port? OMS Port ioRefNums: 'A/S3000' index: 0 refnum: 676 uniqueid: 30137 'A/S3000' index: 1 refnum: 52 uniqueid: 21945 'B/Proteus/1 XR' index: 2 refnum: 104 uniqueid: 23289 'B/Proteus/1 XR' index: 3 refnum: 728 uniqueid: 31481 'C/M3R' index: 4 refnum: 156 uniqueid: 19395 'C/M3R' index: 5 refnum: 780 uniqueid: 27587 'D/TX81Z' index: 6 refnum: 208 uniqueid: 16790 'D/TX81Z' index: 7 refnum: 832 uniqueid: 24982 'E/QuadraVerb' index: 8 refnum: 260 uniqueid: 24551 'E/QuadraVerb' index: 9 refnum: 884 uniqueid: 32743 'F/O3D' index: 10 refnum: 936 uniqueid: 26723 'F/O3D' index: 11 refnum: 312 uniqueid: 18531 'G/A-50' index: 12 refnum: 416 uniqueid: 20834 'G/A-50' index: 13 refnum: 1040 uniqueid: 29026 'H/DA38' index: 14 refnum: 364 uniqueid: 24461 'H/DA38' index: 15 refnum: 988 uniqueid: 32653 'MIDI Time Piece-Modem' index: 16 refnum: 0 uniqueid: 19513 'MIDI Time Piece-Modem' index: 17 refnum: 624 uniqueid: 27705 'QuickTime Music' index: 18 refnum: 1248 uniqueid: 24722 'Studio Patches pgm chg' index: 19 refnum: 1196 uniqueid: 29112 'ƒ IAC Bus #1' index: 20 refnum: 1144 uniqueid: 28159 'ƒ IAC Bus #1' index: 21 refnum: 468 uniqueid: 19967 OMS init Cheers, Garth Check out some of the tracks off my new CD at http://www.activatedspace.com.au ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. Activated Space . Composer, Sound Designer, Installation Artist .. Interactives Designer, Exhibition Consultant ........ph. 61 3 95720133 garth@activatedspace.com.au .,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,. ------------------------------ Date: Sat, 07 Aug 1999 09:09:58 -0600 From: "David Cottle" <---@---.---> Subject: SCPlay Hi, This might be a small detail, but every time I download the most recent version, which includes SCPlay, the OS always wants to open files as SCPlay rather than SC. According to Mac Secrets (page 594) the solutions include moving SCPlay to another partition of the hard drive, or opening SC first, then the document, or installing SC again either by duplicating it or moving to one drive then back (so that the desktop-file entry for SC is newer than Player, though I can't get this to work). Is there a better way around this? Is there a way you can put together the .sea file so that it installs SC last? Just wondering. - -- ><><><><><><><><><><><> David Cottle composition, notation, contra lime@uiuc.edu ------------------------------ Date: Sat, 7 Aug 1999 10:34:12 -0600 From: James McCartney <---@---.---> Subject: Re: Addressing OMS ports At 9:22 PM -0600 8/6/99, Garth Paine wrote: >I have noticed the following in the start-up routine for SC in the >last couple of versions, but I can't find a variable for OMS port in >any of the MIDI controller objects - am I missing something obvious >or are they not their yet? I had assumed the index number would be a >way of addressing a particular OMS port? No there is not currently. The reason is that SC has to store an entire set of data for any port it is listening to because you could create a listener on any control on any channel of any port at any time and SC has to know the most recent value that was received for that control. This would be a lot of space. I have not decided on the best plan yet, but there may be a small limit on the number of input ports listened to. --- james mccartney james@audiosynth.com http://www.audiosynth.com If you have a PowerMac check out SuperCollider2, a real time synth program: ------------------------------ Date: Sat, 7 Aug 1999 10:49:13 -0600 From: James McCartney <---@---.---> Subject: [none] >I'm working on a couple of pattern programing exercises, as in this "In C" example. Before I move on with it, >are there any suggestions to make coding this any more efficient, or perhaps offer a better approach. I'm is the intial >stage of this project and I'm focused at the moment on getting the pattern material programed. I will then turn some attention to other >issues such as instruments, nuance in rhythmic pattern, additional voices, etc. > If something is going to remain the same for the entire piece then you can put it in the protoEvent. Then it doesn't have to get copied into each new event in a Pbind. For example you could write: ... ).play(Event.protoEvent.make({ ~tempo = 2.7; }) ); The 'make' method allows you to make the event the currentEnvironment and change variables. It then returns the event. The following is another way to do the same thing: ... ).play(Event.protoEvent.put(\tempo, 2.7)); - ---- The following: 0000,7777,0000\legato, Pseq([0.1, 0.1, 0.1, 0.1 ], 2 ), can be replaced simply by: \legato, 0.1, Because a constant is a infinite pattern of itself. - --- Another thing you could do if all of your patterns are similar is to define a function to help define the patterns like I did in the Slonimsky and Cope examples motif = { arg midinote, dur, legato = 0.1; Pbind(\midinote, midinote, \dur, dur, \legato, legato); }; Then instead of this: Pbind( 0000,7777,0000\dur, Pseq([ 0.3, 1.0, 0.3, 1.0, 0.3, 1.0 ], 1 ), 0000,7777,0000\legato, 0.1, 0000,7777,0000\midinote, Pseq(#[60, 64 ], 3) ), You could write: motif.value( Pseq(#[60, 64 ], 3), Pseq([ 0.3, 1.0, 0.3, 1.0, 0.3, 1.0 ], 1 ) ), - ---- \rest is only a legal value for pitch arguments, not duration. 0000,7777,0000\legato, Pseq([ 0.1, 0.1, 0.1, \rest ], 2 ) // this is wrong. - ---- --- james mccartney james@audiosynth.com http://www.audiosynth.com If you have a PowerMac check out SuperCollider2, a real time synth program: < ------------------------------ Date: Sat, 7 Aug 1999 11:01:52 -0600 From: James McCartney <---@---.---> Subject: Re: In C pattern corrections It looks to me like the only difference between your instruments is the octave. Rather than writing the whole thing out each time, you should use transformation to get what you want. That is sort of the point of patterns: that you can instantiate multiple copies from a single pattern and that you can alter a pattern by applying filters to it. If you use \note instead of \midinote then you have more control. \note is a gamut tuning system with any number of notes per octave, but the default is 12. Another difference is that \note is relative to the value of \octave and \root, whereas \midinote is absolute. The default value for \octave is 5 and \root is 0. So rather than write Pbind(\midinote, Pseq(#[60, 64 ], 3), ... You can write: Pbind(\note, Pseq(#[0, 4], 3), ... Then you can write: instr1 = Pseq([ .... ]); instr2 = Padd(\octave, -1, instr1); instr3 = Padd(\octave, 1, instr1); Or if you want to leave it in \midinote's you can write: instr1 = Pseq([ .... ]); instr2 = Padd(\ctranspose, -12, instr1); instr3 = Padd(\ctranspose, 12, instr1); --- james mccartney james@audiosynth.com http://www.audiosynth.com If you have a PowerMac check out SuperCollider2, a real time synth program: ------------------------------ Date: Sat, 7 Aug 1999 11:04:04 -0600 From: James McCartney <---@---.---> Subject: should have been "In C pattern..." Oops. The previous message should have been "In C pattern..." --- james mccartney james@audiosynth.com http://www.audiosynth.com If you have a PowerMac check out SuperCollider2, a real time synth program: ------------------------------ Date: Mon, 09 Aug 1999 10:51:25 -0600 From: "David Cottle" <---@---.---> Subject: Array doc Hi, In Array.help there is no documentation for lace, permute, wrapExtend, or foldExtend ------------------------------ Date: Mon, 9 Aug 1999 11:09:10 -0700 From: csz@wco.com (Carter Scholz) Subject: Re: SCPlay David Cottle wrote: >This might be a small detail, but every time I download the most recent >version, which includes SCPlay, the OS always wants to open files as SCPlay >rather than SC. > This happens because SCPlay (2.1.8) has a more recent creation date than SC. Use Norton or a similar utility to change SCPlay's creation date, then rebuild the desktop. ------------------------------ Date: Mon, 09 Aug 1999 14:12:07 -0600 From: "David Cottle" <---@---.---> Subject: Re: SCPlay Hi, >>This might be a small detail, but every time I download the most recent >>version, which includes SCPlay, the OS always wants to open files as SCPlay >>rather than SC. >> > > This happens because SCPlay (2.1.8) has a more recent creation > date than SC. Use Norton or a similar utility to change SCPlay's > creation date, then rebuild the desktop. > Right. But isn't it also the installation date? For example, can't I install SC regular after Play and it should select the regular? Or are they seen as two different versions of the same program? Either way, my suggestion stands. Maybe James can compile the Play version before the regular version. ------------------------------ Date: Mon, 09 Aug 1999 15:25:03 -0600 From: "David Cottle" <---@---.---> Subject: SCPlayer Hi, I've been working on compiling some examples to distribute and I have two questions: Where would I put a message that would only come up once, at the end of the compile? I want the user to stop and start the run several times to see that different pitches are being chosen each time. Every time they start the process they get the message, since it is in the run function. I would like them to just see it once. The Library menu apparently has some restrictions on what you can and can't put in there. I tried one of my markov chains (and the BYU demo) and it gave an error and every time I tried to close the Mix window I got an error. (Had to quit and relaunch.) What are the limitations? Is there a way to work around it? Or is this a bug? ------------------------------ Date: Mon, 09 Aug 1999 17:40:27 -0400 From: "N. Kent" <---@---.---> Subject: Re: SCPlay David Cottle wrote: > > Hi, > > >>This might be a small detail, but every time I download the most recent > >>version, which includes SCPlay, the OS always wants to open files as SCPlay > >>rather than SC. > >> > > > > This happens because SCPlay (2.1.8) has a more recent creation > > date than SC. Use Norton or a similar utility to change SCPlay's > > creation date, then rebuild the desktop. > > > > Right. But isn't it also the installation date? For example, can't I install > SC regular after Play and it should select the regular? Or are they seen as > two different versions of the same program? > > Either way, my suggestion stands. Maybe James can compile the Play version > before the regular version. I've found a simple workaround. Since I don't need SCPlay on a day to day basis, I just stuffed it and left it there until I need it. nick kent ------------------------------ Date: Tue, 10 Aug 1999 02:19:34 +0200 From: Martin Stepanek <---@---.---> Subject: GUI-Dialog to Load Samples & Save Audio tried to figure out how to implement this but wasnt able to find any hints in the examples, tutorials, etc.... how is it possible to let the user decide which Sample is loaded into RAM for processing in a supercollider-patch? and: how is it possible to let the user decide when he wants to record audio into a file, how he wants to name that file and in which folder to put that file? thanx in advance, martin ------------------------------ Date: Mon, 09 Aug 1999 19:44:37 -0600 From: "David Cottle" <---@---.---> Subject: Re: SCPlay Hi, > I've found a simple workaround. Since I don't need SCPlay on a day to > day basis, I just stuffed it and left it there until I need it. I put it on another partition. ------------------------------ Date: Thu, 12 Aug 1999 00:51:51 -0600 From: "David Cottle" <---@---.---> Subject: File read and write Hi, I've been trying to get file read and write to work. The help doesn't make sense: "r" - read only text "w" - read and write text "a" - read and append text "rb" - read only binary "wb" - read and write binary "ab" - read and append binary "r+" - read only text "w+" - read and write text "a+" - read and append text "rb+" - read only binary "wb+" - read and write binary "ab+" - read and append binary What is the difference between r and r+? I could get the "r" to work, but not the "w". Could you show me a simple example? There are no examples in the help file. ------------------------------ Date: Thu, 12 Aug 1999 03:06:42 -0600 From: James McCartney <---@---.---> Subject: Re: File read and write At 12:51 AM -0600 8/12/99, David Cottle wrote: I could get the "r" to work, but not the "w". Could you show me a simple >example? There are no examples in the help file. f = File("test","w"); f.write("Does this work?\nuh huh\n"); f.close; g = File("test","r"); g.readAllString.postln; g.close; h = File("test2", "wb"); h.write( FloatArray[1.1, 2.2, 3.3, pi, 3.sqrt] ); h.close; k = File("test2", "rb"); (k.length div: 4).do({ k.getFloat.postln; }); k.close; --- james mccartney james@audiosynth.com http://www.audiosynth.com If you have a PowerMac check out SuperCollider2, a real time synth program: < ------------------------------ Date: Thu, 12 Aug 1999 03:12:23 -0600 From: James McCartney <---@---.---> Subject: Re: File read and write At 12:51 AM -0600 8/12/99, David Cottle wrote: >What is the difference between r and r+? Well for now since there is no fflush equivalent, don't use the "+" versions. The codes parallel the codes for fopen which can be found explained better here: http://www.unix-systems.org/onlinepubs/7908799/xsh/fopen.html --- james mccartney james@audiosynth.com http://www.audiosynth.com If you have a PowerMac check out SuperCollider2, a real time synth program: ------------------------------ Date: Thu, 12 Aug 1999 09:01:55 -0600 From: James McCartney <---@---.---> Subject: Re: GUI-Dialog to Load Samples & Save Audio At 6:19 PM -0600 8/9/99, Martin Stepanek wrote: >tried to figure out how to implement this but wasnt able to find any hints >in the examples, tutorials, etc.... > >how is it possible to let the user decide which Sample is loaded into RAM >for processing in a supercollider-patch? > >and: >how is it possible to let the user decide when he wants to record audio >into a file, how he wants to name that file and in which folder to put that >file? > >thanx in advance, >martin The calls to XXXDialog.new return immediately, *before* the dialog has been dismissed. Because the dialog calls are asynchronous, any reaction to the dialog must be in the action function. ( // get a file var filename, sound, signal; GetFileDialog.new({ arg ok, path; if (ok, { sound = SoundFile.new; if (sound.read(path), { signal = sound.data.at(0); Synth.play({ PlayBuf.ar(signal, sound.sampleRate, 1, 0, 0, signal.size-2) }); },{ (path ++ " not found.\n").post }); }); }); ) ( // put a file var filename, sound, signal; PutFileDialog.new("Record:", "PinkNoise.aiff", { arg ok, path; if (ok, { Synth.record({ PinkNoise.ar(0.2) }, 4, path); }); }); ) ( // get and put a file var filename, sound, signal; GetFileDialog.new({ arg ok, getpath; if (ok, { sound = SoundFile.new; if (sound.read(getpath), { PutFileDialog.new("Record:", "Test_99.aiff", { arg ok, putpath; if (ok, { signal = sound.data.at(0); Synth.record({ PlayBuf.ar(signal, sound.sampleRate, 1, 0, 0, signal.size-2) }, 4, putpath); }) }); },{ (getpath ++ " not found.\n").post }); }); }); ) --- james mccartney james@audiosynth.com http://www.audiosynth.com If you have a PowerMac check out SuperCollider2, a real time synth program: < ------------------------------ Date: Thu, 12 Aug 1999 08:31:37 -0600 From: "David Cottle" <---@---.---> Subject: Re: File read and write Hi, >>example? There are no examples in the help file. > > f = File("test","w"); > f.write("Does this work?\nuh huh\n"); > f.close; > > g = File("test","r"); > g.readAllString.postln; > g.close; I thought I had tried it this way but I guess not. How about putChar. I've tried g.putChar("w"); and g.putChar('w'); ------------------------------ End of sc-users-digest V1 #54 *****************************