Kyma Forum
  Kyma Support
  Freezing hot parameters, and data-driven sequences

Post New Topic  Post A Reply
profile | register | preferences | faq | search

next newest topic | next oldest topic
Author Topic:   Freezing hot parameters, and data-driven sequences
Kelly Fitz
Member
posted 19 November 2001 16:08         Edit/Delete Message   Reply w/Quote
I hope it is not inappropriate to ask this kind of question here, please advise me if I should post this elsewhere.

I am trying to achieve the following:

I have a complex sound that evolves over time, say a sequence of notes, like maybe the MachautKyrie that I found in the MIDI scripting examples. I want this complex event to have some behavior specified parametrically, that is, I want to have a few sliders control parameters of the sound, but _not_ in real time. That is, I want to configure the sound, and then trigger it, but then I want to be able to move thhe sliders around _without_ affecting the sound that's playing.

I want to do this so that I can then move the sliders and trigger another one of those sounds, but with new and different parameters.

This seems like the sort of thing that I ought to be able to do with some combination of analog sequencers and MIDIVoices (although I don't want to trigger with MIDI, but rather with a hot parameter...don't know how to set that up either), but I cannot seem to find the right combination of those things.

Another way of describing what I want, I think, is to make a sound with a bunch of variable parameters (the kind like ?Var, instead of !Var, right?) but then instead of prescheduling them with a script (which I find cannot contain hot parameters), I want to trigger them in real time, from something like the VCS.

Can someone point me in the right direction? An example sound, a passage in the manual (yes, I'll even rtfm!), anything will help.

-kel

IP: Logged

pete
Member
posted 20 November 2001 04:58         Edit/Delete Message   Reply w/Quote
I'm not sure if I fully understand, but are you looking for the sample and hold module? Here you would have a sample and hold for each paramiter you want to give this action to. Then you could play with the parramitors and nothing would happen to the sound, but as soon as you pressed the trigger paramitor(which would be common to all sample and holds), the setting you have set would be passed to the sound in one go.

I don't know if I've understood what you want , so let me know.

IP: Logged

Kelly Fitz
Member
posted 20 November 2001 18:12         Edit/Delete Message   Reply w/Quote
quote:
Originally posted by pete:
I'm not sure if I fully understand, but are you looking for the sample and hold module? Here you would have a sample and hold for each paramiter you want to give this action to. Then you could play with the parramitors and nothing would happen to the sound, but as soon as you pressed the trigger paramitor(which would be common to all sample and holds), the setting you have set would be passed to the sound in one go.

This would work, in part. It would freeze the parameters until I triggered, but I am thinking in more "object-oriented" terms: I want to fiddle with controls, instantiate an object with those settings, then change the settings, and then instantiate _another_ object with the new settings, without stopping or changing the first object.

For example, I might want to trigger a series of temporally-overlapping melodies, and each new melody reflects the state of the parameters on the VCS at the time the melody started playing.

So I need something more, I think. The sample and hold seems like the wrong tool... or maybe not.

-kel

IP: Logged

photonal
Member
posted 21 November 2001 06:38         Edit/Delete Message   Reply w/Quote
My interpretation would be to use a multitrack timeline using the same sound in each track but using a combination of overlapping tracks and WaitUntil sounds to achieve your instantiations. I'm wondering if you could then 'fiddle' with a sound (in a particular track) and then trigger the WaitUntil to instantiate it.

Andrew

IP: Logged

pete
Member
posted 21 November 2001 07:18         Edit/Delete Message   Reply w/Quote
I could be wrong but I think that instanses cannot be produced on the fly (while the sound is playing) but are made during the compile and down load time.

If this is the case then you would have to choose the max number of instances to before hand but you could trigger them into action as and when you need them.

I'm sure there are some scripts that will do this more neatly than I'm about to describe, But I can't help you there.

Anyway. If you made one of your tune creating module clusters with sample and holds insterted in there parram paths and made sure that the S&H trigger parram was the same as the trigger that kicked off the tune. You could then feed that cluster into a mixer module and make copies (say 4 or 5) feeding into the same mixer. Then by renaming all the triggers in the second cluster to !trig2, and in the third cluster to !trig3 etc. Then as long as they where turned into buttons on the VCS ,you could start them in playing time when you wanted, and they would use the settings of the VCS at that time.

Also if tune one came to an end, you could retrigger it with new settings.

Is this closer to what you are trying to do?

IP: Logged

dennis
Member
posted 21 November 2001 08:19         Edit/Delete Message   Reply w/Quote
I believe Pete is correct, regarding object instantiation. Once the Sound structure is compiled, it is fixed. Using a Script to generate a maximum number of presetable Sounds should work, though that may not be what you want.

You might also be able to use the real-time expressions "gateWhen:" and "hasChangedReset:" instead of TriggeredSampleAndHold modules. TriggeredSampleAndHold operates with sample-rate input, which is not necessary if the input is from hot parameters (save that processor juice!). But I've experimented with "gateWhen:" and "hasChangedReset:" only a little so take this comment with a grain of salt.

IP: Logged

Kelly Fitz
Member
posted 21 November 2001 11:32         Edit/Delete Message   Reply w/Quote
quote:
Originally posted by dennis:
I believe Pete is correct, regarding object instantiation. Once the Sound structure is compiled, it is fixed. Using a Script to generate a maximum number of presetable Sounds should work, though that may not be what you want.

I was afraid he might be. I am okay with the idea of having to preschedule my polyphony, but I am trying to avoid having N copies of the full set of controllers, which would be a nuisance

quote:

You might also be able to use the real-time expressions "gateWhen:" and "hasChangedReset:" instead of TriggeredSampleAndHold modules. TriggeredSampleAndHold operates with sample-rate input, which is not necessary if the input is from hot parameters (save that processor juice!). But I've experimented with "gateWhen:" and "hasChangedReset:" only a little so take this comment with a grain of salt.

I've not seen these things before, can you refer me to some documentation about the real time expressions? I'll start digging around in the manual. Maybe this will serve my purposes.

Thanks,
-kel

p.s. after digging throug my manual, I still cannot find any reference to "gateWhen:" or "hasChangedReset:". Where do I learn about these realtime expressions, and others like them that aren't listed in the Kyma Reference?

[This message has been edited by Kelly Fitz (edited 21 November 2001).]

IP: Logged

pete
Member
posted 21 November 2001 11:55         Edit/Delete Message   Reply w/Quote
Kelly
You would only get one set of controls because the controler names are the same in all the clusters. You would get a different trigger button for each cluster because you would have named them differently.
I'm sure Dennis is right about the more eficiant coded alternative to S&H and there are also scripts that can make the multipul copies invisably and give the triggers a different random name. But this is all above me at the moment.

sorry.

IP: Logged

Kelly Fitz
Member
posted 21 November 2001 14:12         Edit/Delete Message   Reply w/Quote
quote:
Originally posted by pete:
Kelly
You would only get one set of controls because the controler names are the same in all the clusters. You would get a different trigger button for each cluster because you would have named them differently.

True.

I was hoping for something as easy as the MIDIVoice and MIDIMapper (is that what its called?) sounds, which schedule controller mapping and polyphony without any effort on my part. They schedule as many instances of my sound as the polyphony I specify, and then they handle passing controllers (!KeyVelocity, !KeyNumber, etc) to the individual instances as they are triggered (I think). And when you run out of polyphony, it automatically recycles and retriggers the first one (I think).

This is the sort of automation I was hoping for, but I don't want to use MIDI cables or messages for anything, I want instead to use hot parameters.

Maybe all I need to do is remap the MIDI messages? So that a hot parameter is mapped to !KeyDown and so on? I wonder if that'll work...I'll try...

-kel

IP: Logged

pete
Member
posted 21 November 2001 15:04         Edit/Delete Message   Reply w/Quote
If you used !KeyDown as your triggers for the S&Hs , you would only need one cluster, and it should work, just the same as the script.

IP: Logged

Kelly Fitz
Member
posted 21 November 2001 17:34         Edit/Delete Message   Reply w/Quote
I feel like I am really close to understanding how to do this, but something crucial is missing.

I have kludged up with MIDIMapper prototype so that I can start two versions of its subsounds (polyphony of 2, and subsounds triggered/gated by !KeyDown) with different parameter settings (like !Speed). I can do this _if_ I use the map:

!Speed is: (!Pitch inSOSPitch).

or something like that involving !Pitch, and converting the note number into a value between 0 and 1 with inSOSPitch.

Then I can trigger two versions with a script in the mapper like this:

self keyDownAt: 0s duration: 0.5 s frequency: 127 nn.
self keyDownAt: 0.25 s duration: 0.5 s frequency: 60 nn.

The critical part is that !Speed is expressed in terms of !Pitch which is set once for each MIDI event in the script. !Pitch is special that way. If I just let !Speed be a VCS controller, then it controls all active subsounds in real time, so they all have the same value of !Speed at all times.

Another way of saying it, I guess, is that hot parameters _other_ than !Pitch (and its bretheren) and !KeyVelocity (both of which are individual to each MIDI event) are shared by all active subsounds.

The other critical part is that I can use the script to make the polyphony happen (presumably I could also use a MIDI keyboard, but I don't have one). If I don't use the script then I get a number of instances of the subsound (2 in this case) playing simultaneously with the same parameters.

So the fundamental hang-ups I have are these:

1) How can I elevate other event values to the exhalted status of !Pitch, so that I can have them "frozen" at the time of triggering, instead of changing in real time? (Or is my only option to use the few special parameters, velocity and pitch, and are specific to each MIDI note?)

2) How can I generate MIDI events, or otherwise use the polyphony represented by the MIDImapper, from the VCS or from external event sources?

MIDI events appear to get special treatment, which is okay in a sound called MIDIMapper, as long as I have a sound like OtherKindsOfEventMapper that works more generally to schedule overlapping (i.e. with polyphony) events that aren't based on piano-like keyboard presses.

I must be missing something.


-kel

IP: Logged

pete
Member
posted 22 November 2001 09:40         Edit/Delete Message   Reply w/Quote
All the midi controlers are common to all the notes playing in the one midi channel. The only things that are pert to a single note are key down, key up ,key down velocity,key up velocity,the note number(key pitch) and poly aftertouch. And only four of them have values other than 0 and 1. It seems S&Hs or there counterparts are the easiest way.

IP: Logged

SSC
Administrator
posted 22 November 2001 15:09         Edit/Delete Message   Reply w/Quote
"1) How can I elevate other event values to the exhalted status of !Pitch, so that I can have them "frozen" at the time of triggering, instead of changing in real time? (Or is my only option to use the few special parameters, velocity and pitch, and are specific to each MIDI note?)"

What about the following:
1) Take a Constant, and set its Value parameter to your !Fader.
2) Feed the Constant into a TriggeredSampleAndHold, triggered by your KeyDown
3) Paste the TriggeredSampleAndHold into the parameter field you want to control

Now you have a !Fader whose value is frozen at the time of the KeyDown. Is that what you want?

IP: Logged

Kelly Fitz
Member
posted 26 November 2001 11:29         Edit/Delete Message   Reply w/Quote
quote:
Originally posted by SSC:
t the following:
1) Take a Constant, and set its Value parameter to your !Fader.
2) Feed the Constant into a TriggeredSampleAndHold, triggered by your KeyDown
3) Paste the TriggeredSampleAndHold into the parameter field you want to control

Now you have a !Fader whose value is frozen at the time of the KeyDown. Is that what you want?



That sound like the first part, then how can I generate things like KeyDown without using MIDI? I want to get the polyphony effect without using a keyboard, is there anything I can trick into performing that automation for me? I tried using the Analog Sequencer, but couldn't quite make it fit. I can't see how to trigger N different events without explicitly naming N different triggers, unless I use a MIDI controller with the MIDI sounds that do the polyphony magic. Is there a more generalized version of that magic that I can get my hands on?

-kel


IP: Logged

dennis
Member
posted 26 November 2001 14:30         Edit/Delete Message   Reply w/Quote
Hi Kelly!

I'm not sure if they'll do what you want, but take a look at Script and SoundToGlobalController.

I think you can set up a Script to generate a sound structure like you describe. I.e., a set of nearly identical Sounds all feeding into a Mixer. Like the MIDIVoice Sound, the number is fixed at compile time. Generally, I create one Sound, get it working, "parameterize" it, then put it into the Script. The script in the Script starts the appropriate number of Sounds via some kind of loop. Also, I've found the "Expand" menu command helps me confirm the Script is working the way I want (i.e., generating the appropriate Sound structure).

SoundToGlobalController used to be called SoundToEvent so look for it in the "sacred book" by that name. I use it many times for debugging purposes, too. Really handy!


IP: Logged

Bill Meadows
Member
posted 26 November 2001 14:55         Edit/Delete Message   Reply w/Quote
quote:
Originally posted by Kelly Fitz:
after digging throug my manual, I still cannot find any reference to "gateWhen:" or "hasChangedReset:". Where do I learn about these realtime expressions, and others like them that aren't listed in the Kyma Reference?

They are new since the printed manual. Try the "Quick Expressions Guide" in the CD-ROM documents. ("Documentation" under the File menu, I believe, if you loaded everything.)

IP: Logged

All times are CT (US)

next newest topic | next oldest topic

Administrative Options: Close Topic | Archive/Move | Delete Topic
Post New Topic  Post A Reply

Contact Us | Symbolic Sound Home

This forum is provided solely for the support and edification of the customers of Symbolic Sound Corporation.


Ultimate Bulletin Board 5.45c