Sign-Up for electrotap.com
  or Login if you have already registered

Once upon a time...

Timothy Place 2007-02-20 01:33:00 UTC

Jade
0 Comments

Once upon a time, there was a project called Jade. There were a lot of good things about Jade, and of course there were some bad things. Out of Jade came Jamoma. Jamoma has been torn apart and put back together a number of times, and Jade (which was difficult to maintain anyway) became harder to maintain and fell way behind.

Eventually Jade was open sourced. The hope was that Jade, like Jamoma, would pick up some interest and some dedicated developers and it could get up to speed. Jade would still make the idea reference environment for hosting Jamoma modules. However, in the time since Jade has been open sourced (about 18 months ago) I have not received a single email about it. I tell people about it and they say “oh”. Which seems odd because it seems like a lot of people know about Jade.

What does this mean? No one has the time to even think about it? That seems plausible, as it has been one of my problems. The project seems overwhelming? That seems plausible too, though if the person was just using Jamoma instead of developing it as well it shouldn’t be to bad.

Personally, I have a lot of baggage associated with Jade too – good and bad. When I think ‘Jade’ I think of specific ways of doing things in Max patches and such. Even to re-write Jade from scratch, I get stuck in the same routines and the same ruts — and caught thinking about all of these various unresolved issues in Jade, which has nothing to do with anything.

If I were really interested in a clean start on a Jamoma host application, I think it would need to called something else — even if it ended up being called Jade again at some point in the future. Of course, perhaps the whole world (or that extremely small slice that would care at all about Jade) would need a similar fresh start. Especially given how different such a host might be.

So I’m going to call this new application, whatever it might be, something new. In the case of Jade, it had several names before it was Jade. It entered beta testing with the name Silicon Performer. At some point I grew to be disgusted by the number of syllables in the name and the lack of imagery invoked by the name — so I started looking at various rocks, minerals, and stones for names.

The current working name of this new entity is ‘Cog’. The pronunciation according to the Oxford dictionary is Käg, and I like umlauts, so I could use that. The word is believed to be of Scandinavian origin: Kug, or Kugge. I think I just like Cog though. It seems clear.

Cog is a carpentry term, which seems apropos. It gives a sense of gears and wheels and motion and machines and energy. It isn’t the most important dominating force in what is going on – that would be the art work or musical performance or interaction or underlying philosophies. Rather, it is simply a gear in the larger system of the artwork “that transfers motion by engaging with projections on another wheel or bar” [from the Oxford dictionary].

Jade released as Open Source

Timothy Place 2006-10-11 05:30:00 UTC

Jade
0 Comments

Jade has now been released as open source software under the GNU LGPL. This has a been a while in coming, and I think it will make a lot of people very happy. To be fair, anyone who purchased Jade in the last 6 months will be receiving a full refund.

More details will be coming in the future. For now you can know that Jade and all of its source patches are now accessible to all for free. Enjoy!

What will it be?

Timothy Place 2006-09-07 13:46:00 UTC

Jade
0 Comments

Something is shakin’ in Jade land. Are you ready?

Before there was Jade, part 5

Timothy Place 2005-06-12 08:22:00 UTC

Jade
0 Comments

Following the KromoZone performance in England, I returned to Kansas City to master a recording of Dandelions for release on the CDCM series on Centaur Records. The problem was, my crazy hack for managing the performance no longer worked (see the first post in this thread). So faced with the need to redesign the patch (again), I took the various things that I had learned with Dark Forest and KromoZone into the processes of rebuilding the patch. The rebuilt patch is pictured above.

At this point, I was still building patches for specific pieces. I was beginning to think modularly in that I was able to re-use certain bpatchers, but I still modified them a fair amount for each piece. As an example, the color scheme of the screenshot above reflects the piece it was made for – Dandelions – with the green base and yellow top and bit of sky showing through in between. The modules are not a standard size, and so are really not all that interchangeable.

However, this is the patch where things will look very familiar to users of Jade 1.×. The input module in the upper left, the output module in the upper right, some analysis thing in the upper center, a control-type thing in the middle with display messages, and the matrix on the right, are all conventions that began with this patch. The initialization was done by a coll object with it’s text file saved on disk. The event script was done using a qlist object with it’s file saved on disk.

Before there was Jade, part 4

Timothy Place 2005-06-09 08:16:00 UTC

Jade
0 Comments

The patch pictured above was my performance patch for the Music Without Walls conference at DeMontfort University in the U.K. The conference occurred within a month of the release of Max 4.0 in the Spring of 2001, and I zealously dug deep into Max 4.0 to exploit some of its features. The conference paper, demo, and performance was another KromoZone performance – this time with Stephan Moore, Scott Smallwood, and myself making the lineup.

The patch was developed during a week of preparation with Stephan and Skot in Troy, NY (RPI). During the time I was there, Curtis Bahn basically got me hooked on the bpatcher object. I had previously known about it, but never quite trusted it for whatever reason. I quickly became addicted to it as it made the structure of my patch much cleaner and easier to conceptualize.

In this patch I used a coll object for all initialization, an idea taken from Todd Winkler’s book about Max. There was no event script or qlist because all parameters were controlled in real time by a Peavey fader box, foot pedals, and a fiddle~ object. The paradigm was that the patch was to extend my trombone into a sort of meta-trombone. The catch was all three of our computers were also controlling each other’s computers in a wierd interconnected way over a local network.

Our best performance was not actually at the conference, but in the studios of WRPI – the radio station at which Stephan worked in Troy. A photo from that performance, showing the patch, is below. Scott Smallwood is also in the picture.

This was the first patch where I was clearly separating the interface from the dsp algorithm. Inside any of the modules was a separate abstraction with the actual dsp processor. This could be turned on and off with the big toggle that you see in the interface for each module. At the time this still used the same pcontrol method that I had developed for Dark Forest.

Before there was Jade, part 3

Timothy Place 2005-06-08 08:09:00 UTC

Jade
0 Comments

In the Winter of 2000-2001 I further refined the structural formula I had used for the KromoZone performance in Seoul for my the piece that would serve as my Master’s thesis: Dark Forest. A quick glance at the screenshot does indeed bear a strong resemblance to the patches for The Nature of Contigency.

What was a significant improvement, however, was how I was forced to deal with CPU management. I did this by encapsulating each section of the piece into a subpatch. Then that subpatch had it’s processing turned on and off with the pcontrol object, which was controlled by the qlist. I also incorporated a display so that the qlist could show messages that would help cue the computer operator and give a status of what the system was doing.

The way the piece worked was that many aspects of the performance were controlled by doing color-tracking of a video source, which allowed me to get gestural information from the mallets of the performer. Each “section” of the piece could actually consist of several components. As an example, the screenshot below shows the multiple elements involved in the transition from section 1 to section 2 of the piece.

The qlist looked like this:


—————————————————————————————————— 1: Initialize;
0 1 overdrive 0;
event_description set Initializing: Please Wait…;
50 adc_fader 0 250;
50 dac_fader 0 250;
50 marimba_fader 0 250;
400 dac 0;
50 noise_gate 0.01;
50 ball_sense 9;
50 section1_sfplay 0;
50 transition1_Ctrigger 90;
50 transition1B_init 0;
50 transition1_Agate 0;
50 transition1_Bgate 0;
50 transition1_Cgate 0;
50 transition1_Alevel 0;
50 transition1_Blevel 0;
50 transition1_Clevel 0;
50 1C_init 150 150;
50 1C_init 150 150;
50 transition1_master 0;
50 section1_master 0;
50 section2_master 0;
50 section2_reverb 1;
50 reverb_delay 100;
50 reverb_decay 3.5;
50 reverb_mix 15;
50 section3_sustainVolume 0;
50 section3_master 0;
50 section3_crossFader 0;
50 section3A_crossfader 0;
50 section3B_crossfader 0;
50 section3_bow-master 0;
50 section4_BPM 120;
50 section4_master 0;
50 section4_Alevel 0;
50 section4_sfplay 0;
section4_malletGate 0;
50 section5_reverbInput 0;
50 section5_crossFader 0;
50 section5_sfplay 0;
50 section5_sfplay open ending.aiff;
50 section1_sfplay open DarkForest_intro.aiff;
50 transition1_sfplay1 open DarkForest_transition1A.aiff;
50 transition1_sfplay2 open DarkForest_transition1B.aiff;
50 section4_sfplay open DarkForest_transition1B.aiff;
500 section1_pcontrol enable 0 1;
50 transition1_pcontrol enable 0 1;
50 section2_pcontrol enable 0 1;
50 section3_pcontrol enable 0 1;
50 section4_pcontrol enable 0 1;
50 video_preset 1;
50 vdig_messages offscreen.resize 320 240;
500 event_description set Patch Initialized;
—————————————————————————————————— 2: Set Up & Turn On;
0 2 event_description set Activating: Please Wait…;
50 dac start;
50 adc_fader 127 500;
50 dac_fader 127 2000;
50 marimba_fader 110 1500;
2000 event_description set Patch set up and ready;
—————————————————————————————————— 3: Section 1: sfplay;
0 3 event_description set Section 1: Sound-File Playing…;
section1_pcontrol enable 1 1;
section1_sfplay 1;
section1_master 0;
section1_master 0.25 500;
5000 section1_master 1. 120000;
—————————————————————————————————— 4: Transition1: air marimba;
0 4 event_description set Transition 1: Playing with Air;
marimba_fader 0 5000;
reverb_decay 4;
reverb_delay 100;
reverb_mix 60;
transition1_pcontrol enable 1 1;
transition1_Agate 1;
section1_master 0 500;
transition1_master 1 50;
transition1_Alevel 0.5 50;
500 section1_sfplay 0;
section1_pcontrol enable 0 1;
5000 reverb_delay 10 10000;
reverb_decay 90;
500 reverb_decay 90;
500 reverb_decay 80;
500 reverb_decay 70;
500 reverb_decay 60;
500 reverb_decay 50;
500 reverb_decay 40;
500 reverb_decay 30;
500 reverb_decay 20;
500 reverb_decay 10;
—————————————————————————————————— 5: Transition1: Swells;
0 5 event_description set Transition 1: Swells with blue mallet;
transition1_sfplay1 1;
transition1_Agate2 0;
transition1_Bgate 1;
transition1_Cgate 1;
transition1_Blevel 1 100;
transition1_Clevel 1 500;
transition1_Alevel 0 10000;
—————————————————————————————————— 6: Transition1: Crash;
0 6 event_description set Transition 1: Crash Sound-File Playing…;
transition1_Cgate 0;
transition1_sfplay2 1;
transition1_Agate 0;
transition1_Blevel 0 20;
100 transition1_Bgate 0;
6000 advance_to_next_event bang;
—————————————————————————————————— 7: Section2: Triggering;
0 7 event_description set Section 2: Red(4) Mallet Triggering [no note];
transition1_Clevel 0 30000;
reverb_delay 100;
reverb_decay 40;
reverb_mix 100;
section2_pcontrol enable 1 1;
20 section2_master 1 100;
100 section2_chime_switch 1;
section2_chimes_autoOff 1;
—————————————————————————————————— 8: Section2;
0 8 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
—————————————————————————————————— 9: Section2;
0 9 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
reverb_decay 40 120000;
reverb_mix 100 90000;
transition1_master 0 12000;
—————————————————————————————————— 10: Section2;
0 10 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
transition1_pcontrol enable 0 1;
—————————————————————————————————— 11: Section2;
0 11 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
—————————————————————————————————— 12: Section2;
0 12 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
—————————————————————————————————— 13: Section2;
0 13 event_description set Section 2: Red(4) Mallet Triggering;
section2_chimes_autoOff 0;
section2_play_gate 1;
750 section2_play_gate 0;
section2_chimes_autoOff 1;
section2_smash bang;
—————————————————————————————————— 14: Section2;
0 14 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
—————————————————————————————————— 15: Section2;
0 15 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
—————————————————————————————————— 16: Section2;
0 16 event_description set Section 2: Red(4) Mallet Triggering;
section2_chimes_autoOff 0;
section2_play_gate 1;
2000 section2_play_gate 0;
section2_chimes_autoOff 1;
—————————————————————————————————— 17: Section2;
0 17 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
—————————————————————————————————— 18: Section2;
0 18 event_description set Section 2: Red(4) Mallet Triggering;
section2_chimes_autoOff 0;
section2_play_gate 1;
10000 section2_play_gate 0;
section2_chimes_autoOff 1;
—————————————————————————————————— 19: Section2;
0 19 event_description set Section 2: Red(4) Mallet Triggering;
section2_chimes_autoOff 0;
section2_play_gate 1;
4000 section2_play_gate 0;
section2_chimes_autoOff 1;
—————————————————————————————————— 20: Section2;
0 20 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
—————————————————————————————————— 21: Section2;
0 21 event_description set Section 2: Red(4) Mallet Triggering;
section2_play_gate 1;
reverb_decay 60 10000;
—————————————————————————————————— 22: Section2;
0 22 event_description set Section 2: Blue(2) Mallet Triggering;
section2_chime_switch 2;
section2_play_gate 1;
—————————————————————————————————— 23: Section2;
0 23 event_description set Section 2: Blue(2) Mallet Triggering;
section2_play_gate 1;
section3_pcontrol enable 1 1;
50 granular_bang bang;
50 section3_master 0.125 10000;
10000 section3_sustainVolume 1 20000;
20000 section3A_crossfader 127 15000;
—————————————————————————————————— 24: Section3 – Punch the reverb sustainer;
0 24 event_description set Section 3: Transition;
section3_sustainPunch bang;
6500 section3B_crossfader 127 25000;
—————————————————————————————————— 25: Section3 – Bowing the Body;
0 25 event_description set Section 3: Bowing Body Begins;
section3_sustainVolume 0 20000;
section3_sustainBow bang;
section3_bow-master 1 6000;
10000 section2_master 0 20000;
advance_to_next_event bang;
—————————————————————————————————— 26: Section3 – Granular Manipulations;
0 26 event_description set Section 3: Granular Manipulations;
—————————————————————————————————— 27: Section4 – Turn grains into pulse;
0 27 event_description set Section 4: Transition to section 4;
overdrive 1;
section3_pulse bang;
section3_crossFader 127 30000;
—————————————————————————————————— 28: Section4 – Silence!!!;
0 28 event_description set Section 4: Silence!!!;
section3_master 0 20;
50 overdrive 0;
section2_pcontrol enable 0 1;
section3_pcontrol enable 0 1;
section4_pcontrol enable 1 1;
section4_master 1 1000;
section5_reverbInput 0.5 100;
—————————————————————————————————— 29: Section4 – sf-event & air marimba;
0 29 event_description set Section 4: SoundFile Event;
reverb_decay 3;
reverb_delay 100;
section4_sfplay 1;
section4_Alevel 0.5 8000;
section4_malletGate 1;
—————————————————————————————————— 30: Section4-5 transition;
0 30 event_description set Section 4-5: Reverb Builds up…;
reverb_decay 10;
section5_reverbInput 1 40000;
—————————————————————————————————— 31: Crossfade to sf;
0 31 event_description set Section 5: crossfade to soundfile;
reverb_decay 40;
section5_sfplay 1;
6000 section5_crossFader 127 60000;
—————————————————————————————————— 32:kill sampler;
0 32 event_description set Section 5: kill the sampler;
50 section4_Alevel 0 50;
section4_master 1.5 10000;
—————————————————————————————————— 33:reverb on resons;
0 33 event_description set Section 5: reverb on resonators;
reverb_delay 100;
reverb_decay 6;
section5_reverbInput 2 100;
—————————————————————————————————— 34 (required: ending dummy byte);
0 34;

Before there was Jade, part 2

Timothy Place 2005-06-07 08:01:00 UTC

Jade
0 Comments

In the Autumn of 2000, I had a performance at the Seoul International Electronic Music Festival. The performance was by the group KromoZone, which I had founded with Stephan Moore while living in Baltimore back in 1998-1999. The performance in Seoul featured both of us, together with Seongah Shin (wacom-controlled powerbook) and Paul Rudy (amplified cactus) on stage and Rich Jaime (video production) back in Kansas City.

The plan was to collaborate on the performance across the network. Unfortunately, the organizers of the festival did not provide us with the promised network connection. They instead showed a network cable that we could use – which was a bunch of bare wires with no connector (the mixer also went up in smoke at the intermission prior to our performance – so we had a variety of challenges). Fortunately, we had a backup plan in place, and the performance came off successfully.

The reason that this particular performance comes up in the context of Jade, is that it was the first performance I did using the qlist object. At the top of the patch, clicking the “event button” would open up an interface for the qlist, copied from the qlist help patch by Richard Dudas. This was used for automating the processes in the patch. It worked the same way as the qlist example in Jamoma. The contents of this qlist can be found if you click below.

This particular patch (there were 7 computers with patches) was for the video projection. It used Nato for the movie playback, pre-performed rendering, live video processing, and the combination of these elements. It also used Trond Lossius’s lut-level object for controlling the look-up table attached to the 242.lut object. The patch is structured as a series of sections (with a set of video processes) and transitions between these sections.

We agreed on a structure prior to the performance. A score was created on graph paper, then scanned, and included in each performer’s patch. Multislider objects on the top and bottom then scrolled across indicating the current position in the score as the clock advanced. This allowed us to all follow the score. The clock was generated over the local network (which did work for the performance), so we were all synchronized.

The seven machines were in the following roles:

  1. KromoZone network server
  2. Seongah’s Powerbook and Wacom tablet
  3. Stephan’s Powerbook / Peavey Sliders
  4. Nato video processing patch (live input was the cactus)
  5. Video analysis machine (nato-based, watching the cactus video feed)
  6. 4-channel spatializer, driven over the network by the video analysis machine.
  7. (unused in the actual performance) Video control machine back in Kansas City.

The video processing patch could be controlled over the network by Rich Jaime, or the qlist could be triggered by the performance clock, which is what we did in the non-internet performance situation.

The contents of the qlist looked like this:


———————————— 1: BURST (0:01);
0 1 cross-fade1 65535;
cross-fade2 65535;
the_pic off;
displace off;
jj_films off;
hj_films off;
live-toggle 0;
input_gate 0;
t4-toggle 1;
switch1 0;
switch2 0;
circadian 0;
gamma 100;
gamma_bypass 1;
collage2_bypass 1;
t4-fade 0;
t4-bypass 1;
burst-film on;
burst-film start;
practice_k bang;
preset 1;
———————————— 30: STOP (0:30);
0 30 burst-film stop;
———————————— 31: (0:31);
0 31 burst-film off;
the_pic on;
———————————— 32: (0:32);
0 32 the_pic start;
———————————— 165: (2:45);
0 165 input_gate 1;
———————————— 181: (3:01);
0 181 displace on;
displace start;
cross-fade1 0 30000;
———————————— 210: (3:30);
0 210 the_pic off;
———————————— 280: (4:40);
0 280 jj_films on;
collage2_bypass 0;
———————————— 285: (4:45);
0 285 gamma_bypass 0;
gamma 0 15000;
jj_films start;
———————————— 315: (5:15);
0 315 jj_clearmode 0;
displace off;
preset 1;
———————————— 350: (5:50);
0 350 live-toggle 1;
———————————— 360: (6:00);
0 360 switch1 1;
———————————— 370: (6:10);
0 370 switch2 1;
———————————— 375: (6:15);
0 375 cross-fade2 0 15000;
———————————— 400: (6:40);
0 400 jj_films off;
———————————— 420: (7:00);
0 420 t4-bypass 0;
t4-fade 100 51000;
-
——————————— 475: (7:55);
0 475 hj_films on;
———————————— 480: (8:00);
0 480 hj_films start;
t4-toggle 0;
live-toggle 0;
input_gate 0;
———————————— 485: (8:05);
0 485 circadian 40 75000;
———————————— 510: (8:30);
0 510 hj_clearmode 0;
———————————— 575: (9:53);
0 575 cut bang;
circadian 0 20000 -——————————- 600: THE END!!!;
0 600;